./PaxHeaders.4960/transmission-2.920000644000000000000000000000013212667111063013741 xustar0030 mtime=1457295923.730871348 30 atime=1457295916.968756358 30 ctime=1457295923.730871348 transmission-2.92/0000755000175000017500000000000012667111063015306 5ustar00mikedldmikedld00000000000000transmission-2.92/PaxHeaders.4960/utils0000644000000000000000000000013212667111060014741 xustar0030 mtime=1457295920.317813308 30 atime=1457295917.037757532 30 ctime=1457295920.317813308 transmission-2.92/utils/0000755000175000017500000000000012667111060016443 5ustar00mikedldmikedld00000000000000transmission-2.92/utils/PaxHeaders.4960/transmission-show.10000644000000000000000000000012712442116673020621 xustar0029 mtime=1418239419.37518986 29 atime=1418239419.37518986 29 ctime=1457295920.31381324 transmission-2.92/utils/transmission-show.10000644000175000017500000000142412442116673022243 0ustar00mikedldmikedld00000000000000.Dd June 9, 2010 .Dt TRANSMISSION-SHOW 1 .Os .Sh NAME .Nm transmission-show .Nd command-line utility to show .torrent file metadata .Sh SYNOPSIS .Bk -words .Nm .Op Fl h .Op Fl m .Op Fl s .Op Ar torrentfile .Ek .Sh DESCRIPTION .Nm shows BitTorrent .torrent file metadata .Sh OPTIONS .Bl -tag -width Ds .It Fl h Fl -help Show a short help page and exit. .It Fl m Fl -magnet Show a magnet link for the specified .torrent file .It Fl s Fl -scrape Ask the torrent's trackers how many peers are in the torrent's swarm .El .Sh AUTHORS .An -nosplit .An Jordan Lee .Sh SEE ALSO .Xr transmission-create 1 , .Xr transmission-daemon 1 , .Xr transmission-edit 1 , .Xr transmission-gtk 1 , .Xr transmission-qt 1 , .Xr transmission-remote 1 , .Xr transmission-show 1 .Pp http://www.transmissionbt.com/ transmission-2.92/utils/PaxHeaders.4960/Makefile.in0000644000000000000000000000013212667111011017057 xustar0030 mtime=1457295881.223148548 30 atime=1457295881.223148548 30 ctime=1457295920.314813257 transmission-2.92/utils/Makefile.in0000644000175000017500000006544612667111011020523 0ustar00mikedldmikedld00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = transmission-create$(EXEEXT) transmission-edit$(EXEEXT) \ transmission-show$(EXEEXT) subdir = utils ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx-pthread.m4 \ $(top_srcdir)/m4/glib-gettext.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am_transmission_create_OBJECTS = create.$(OBJEXT) transmission_create_OBJECTS = $(am_transmission_create_OBJECTS) am__DEPENDENCIES_1 = transmission_create_DEPENDENCIES = \ $(top_builddir)/libtransmission/libtransmission.a \ $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_transmission_edit_OBJECTS = edit.$(OBJEXT) transmission_edit_OBJECTS = $(am_transmission_edit_OBJECTS) am__DEPENDENCIES_2 = \ $(top_builddir)/libtransmission/libtransmission.a \ $(am__DEPENDENCIES_1) transmission_edit_DEPENDENCIES = $(am__DEPENDENCIES_2) am_transmission_show_OBJECTS = show.$(OBJEXT) transmission_show_OBJECTS = $(am_transmission_show_OBJECTS) transmission_show_DEPENDENCIES = $(am__DEPENDENCIES_2) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(transmission_create_SOURCES) $(transmission_edit_SOURCES) \ $(transmission_show_SOURCES) DIST_SOURCES = $(transmission_create_SOURCES) \ $(transmission_edit_SOURCES) $(transmission_show_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(dist_man_MANS) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTO_CFLAGS = @CRYPTO_CFLAGS@ CRYPTO_LIBS = @CRYPTO_LIBS@ CRYPTO_PKG = @CRYPTO_PKG@ CURL_MINIMUM = @CURL_MINIMUM@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYASSL_CFLAGS = @CYASSL_CFLAGS@ CYASSL_LIBS = @CYASSL_LIBS@ CYASSL_MINIMUM = @CYASSL_MINIMUM@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DHT_CFLAGS = @DHT_CFLAGS@ DHT_LIBS = @DHT_LIBS@ DHT_LIBS_QT = @DHT_LIBS_QT@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_MINIMUM = @GIO_MINIMUM@ GLIB_MINIMUM = @GLIB_MINIMUM@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MINIMUM = @GTK_MINIMUM@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAPPINDICATOR_CFLAGS = @LIBAPPINDICATOR_CFLAGS@ LIBAPPINDICATOR_LIBS = @LIBAPPINDICATOR_LIBS@ LIBAPPINDICATOR_MINIMUM = @LIBAPPINDICATOR_MINIMUM@ LIBB64_CFLAGS = @LIBB64_CFLAGS@ LIBB64_LIBS = @LIBB64_LIBS@ LIBB64_LIBS_QT = @LIBB64_LIBS_QT@ LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ LIBEVENT_CFLAGS = @LIBEVENT_CFLAGS@ LIBEVENT_LIBS = @LIBEVENT_LIBS@ LIBEVENT_MINIMUM = @LIBEVENT_MINIMUM@ LIBM = @LIBM@ LIBNATPMP_CFLAGS = @LIBNATPMP_CFLAGS@ LIBNATPMP_LIBS = @LIBNATPMP_LIBS@ LIBNATPMP_LIBS_QT = @LIBNATPMP_LIBS_QT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LIBUPNP_LIBS_QT = @LIBUPNP_LIBS_QT@ LIBUTP_CFLAGS = @LIBUTP_CFLAGS@ LIBUTP_LIBS = @LIBUTP_LIBS@ LIBUTP_LIBS_QT = @LIBUTP_LIBS_QT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENSSL_CFLAGS = @OPENSSL_CFLAGS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OPENSSL_MINIMUM = @OPENSSL_MINIMUM@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PEERID_PREFIX = @PEERID_PREFIX@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POLARSSL_MINIMUM = @POLARSSL_MINIMUM@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SYSTEMD_DAEMON_CFLAGS = @SYSTEMD_DAEMON_CFLAGS@ SYSTEMD_DAEMON_LIBS = @SYSTEMD_DAEMON_LIBS@ USERAGENT_PREFIX = @USERAGENT_PREFIX@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ WOLFSSL_CFLAGS = @WOLFSSL_CFLAGS@ WOLFSSL_LIBS = @WOLFSSL_LIBS@ XGETTEXT = @XGETTEXT@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ ZLIB_MINIMUM = @ZLIB_MINIMUM@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ transmissionlocaledir = @transmissionlocaledir@ AM_CPPFLAGS = -I@top_srcdir@ AM_CFLAGS = \ @LIBEVENT_CFLAGS@ \ @LIBCURL_CFLAGS@ \ @ZLIB_CFLAGS@ \ @PTHREAD_CFLAGS@ transmission_create_SOURCES = create.c transmission_edit_SOURCES = edit.c transmission_show_SOURCES = show.c noinst_HEADERS = \ units.h dist_man_MANS = \ transmission-create.1 \ transmission-edit.1 \ transmission-show.1 transmission_create_LDADD = \ $(top_builddir)/libtransmission/libtransmission.a \ @LIBUPNP_LIBS@ \ @LIBNATPMP_LIBS@ \ @INTLLIBS@ \ @DHT_LIBS@ \ @LIBB64_LIBS@ \ @LIBUTP_LIBS@ \ @LIBEVENT_LIBS@ \ @LIBCURL_LIBS@ \ @CRYPTO_LIBS@ \ @ZLIB_LIBS@ \ @PTHREAD_LIBS@ \ ${LIBM} transmission_edit_LDADD = $(transmission_create_LDADD) transmission_show_LDADD = $(transmission_create_LDADD) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu utils/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu utils/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list transmission-create$(EXEEXT): $(transmission_create_OBJECTS) $(transmission_create_DEPENDENCIES) $(EXTRA_transmission_create_DEPENDENCIES) @rm -f transmission-create$(EXEEXT) $(AM_V_CCLD)$(LINK) $(transmission_create_OBJECTS) $(transmission_create_LDADD) $(LIBS) transmission-edit$(EXEEXT): $(transmission_edit_OBJECTS) $(transmission_edit_DEPENDENCIES) $(EXTRA_transmission_edit_DEPENDENCIES) @rm -f transmission-edit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(transmission_edit_OBJECTS) $(transmission_edit_LDADD) $(LIBS) transmission-show$(EXEEXT): $(transmission_show_OBJECTS) $(transmission_show_DEPENDENCIES) $(EXTRA_transmission_show_DEPENDENCIES) @rm -f transmission-show$(EXEEXT) $(AM_V_CCLD)$(LINK) $(transmission_show_OBJECTS) $(transmission_show_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/create.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/show.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: transmission-2.92/utils/PaxHeaders.4960/transmission-edit.10000644000000000000000000000013212442116673020562 xustar0030 mtime=1418239419.377189894 30 atime=1418239419.377189894 30 ctime=1457295920.312813223 transmission-2.92/utils/transmission-edit.10000644000175000017500000000237312442116673022214 0ustar00mikedldmikedld00000000000000.Dd June 9, 2010 .Dt TRANSMISSION-EDIT 1 .Os .Sh NAME .Nm transmission-edit .Nd command-line utility to modify .torrent files' announce URLs .Sh SYNOPSIS .Bk -words .Nm .Op Fl h .Op Fl a Ar url .Op Fl d Ar url .Op Fl r Ar search Ar replace .Ar torrentfile(s) .Ek .Sh DESCRIPTION .Nm command-line utility to modify .torrent files' announce URLs .Sh OPTIONS .Bl -tag -width Ds .It Fl h Fl -help Show a short help page and exit. .It Fl a Fl -add Ar URL Add an announce URL to the torrent's announce-list if it's not already in the list .It Fl d Fl -delete Ar URL Remove an announce URL from the torrent's announce-list .It Fl r Fl -replace Ar search Ar replace Substring search-and-replace inside a torrent's announce URLs. This can be used to change an announce URL when the tracker moves or your passcode changes. .El .Sh EXAMPLES Update a tracker passcode in all your torrents: .Bd -literal -offset indent $ transmission-edit -r old-passcode new-passcode ~/.config/transmission/torrents/*\\.torrent .Ed .Sh AUTHORS .An -nosplit .An Jordan Lee .Sh SEE ALSO .Xr transmission-create 1 , .Xr transmission-daemon 1 , .Xr transmission-edit 1 , .Xr transmission-gtk 1 , .Xr transmission-qt 1 , .Xr transmission-remote 1 , .Xr transmission-show 1 .Pp http://www.transmissionbt.com/ transmission-2.92/utils/PaxHeaders.4960/units.h0000644000000000000000000000013212442116673016337 xustar0030 mtime=1418239419.376189877 30 atime=1418239419.376189877 30 ctime=1457295920.310813189 transmission-2.92/utils/units.h0000644000175000017500000000117012442116673017763 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id:$ */ #ifndef UNITS_H #define UNITS_H #define MEM_K 1024 #define MEM_K_STR "KiB" #define MEM_M_STR "MiB" #define MEM_G_STR "GiB" #define MEM_T_STR "TiB" #define DISK_K 1000 #define DISK_B_STR "B" #define DISK_K_STR "kB" #define DISK_M_STR "MB" #define DISK_G_STR "GB" #define DISK_T_STR "TB" #define SPEED_K 1000 #define SPEED_B_STR "B/s" #define SPEED_K_STR "kB/s" #define SPEED_M_STR "MB/s" #define SPEED_G_STR "GB/s" #define SPEED_T_STR "TB/s" #endif transmission-2.92/utils/PaxHeaders.4960/CMakeLists.txt0000644000000000000000000000013012513326245017557 xustar0030 mtime=1429056677.272414413 30 atime=1429056677.272414413 28 ctime=1457295917.4357643 transmission-2.92/utils/CMakeLists.txt0000644000175000017500000000123112513326245021203 0ustar00mikedldmikedld00000000000000project(trutils) include_directories(${CMAKE_SOURCE_DIR}) foreach(P create edit show) tr_win32_app_info(${PROJECT_NAME}_${P}_WIN32_RC_FILE "Transmission Utility ('${P}')" "${TR_NAME}-${P}" "${TR_NAME}-${P}.exe") add_executable(${TR_NAME}-${P} ${P}.c ${${PROJECT_NAME}_${P}_WIN32_RC_FILE}) include_directories(${TR_NAME}-${P} ${EVENT2_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS}) target_link_libraries(${TR_NAME}-${P} ${TR_NAME}) install(TARGETS ${TR_NAME}-${P} DESTINATION ${CMAKE_INSTALL_BINDIR}) if(INSTALL_DOC) install(FILES ${TR_NAME}-${P}.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) endif() endforeach() transmission-2.92/utils/PaxHeaders.4960/transmission-create.10000644000000000000000000000013212442116673021100 xustar0030 mtime=1418239419.376189877 30 atime=1418239419.376189877 30 ctime=1457295920.311813206 transmission-2.92/utils/transmission-create.10000644000175000017500000000227112442116673022527 0ustar00mikedldmikedld00000000000000.Dd June 9, 2010 .Dt TRANSMISSION-CREATE 1 .Os .Sh NAME .Nm transmission-create .Nd command-line utility to create .torrent files .Sh SYNOPSIS .Bk -words .Nm .Op Fl h .Op Fl p .Op Fl o Ar file .Op Fl c Ar comment .Op Fl t Ar tracker .Op Fl s Ar piece-size-KiB .Op Ar source file or directory .Ek .Sh DESCRIPTION .Nm creates BitTorrent .torrent files from the command line .Sh OPTIONS .Bl -tag -width Ds .It Fl h Fl -help Show a short help page and exit. .It Fl o Fl -outfile Save the generated .torrent to this filename. .It Fl p Fl -private Flag the torrent as intended for use on private trackers. .It Fl c Fl -comment Add a comment to the torrent file. .It Fl s Fl -piecesize Set how many KiB each piece should be, overriding the preferred default .It Fl t Fl -tracker Add a tracker's .Ar announce URL to the .torrent. Most torrents will have at least one .Ar announce URL. To add more than one, use this option multiple times. .El .Sh AUTHORS .An -nosplit .An Jordan Lee .Sh SEE ALSO .Xr transmission-create 1 , .Xr transmission-daemon 1 , .Xr transmission-edit 1 , .Xr transmission-gtk 1 , .Xr transmission-qt 1 , .Xr transmission-remote 1 , .Xr transmission-show 1 .Pp http://www.transmissionbt.com/ transmission-2.92/utils/PaxHeaders.4960/create.c0000644000000000000000000000013212634073127016432 xustar0030 mtime=1450210903.411465432 30 atime=1450210903.411465432 30 ctime=1457295920.315813275 transmission-2.92/utils/create.c0000644000175000017500000001273012634073127020062 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: create.c 14615 2015-12-06 22:39:14Z jordan $ */ #include /* fprintf() */ #include /* strtoul(), EXIT_FAILURE */ #include #include #include #include #include #include #include #include "units.h" #define MY_NAME "transmission-create" #define MAX_TRACKERS 128 static const uint32_t KiB = 1024; static tr_tracker_info trackers[MAX_TRACKERS]; static int trackerCount = 0; static bool isPrivate = false; static bool showVersion = false; static const char * comment = NULL; static const char * outfile = NULL; static const char * infile = NULL; static uint32_t piecesize_kib = 0; static tr_option options[] = { { 'p', "private", "Allow this torrent to only be used with the specified tracker(s)", "p", 0, NULL }, { 'o', "outfile", "Save the generated .torrent to this filename", "o", 1, "" }, { 's', "piecesize", "Set how many KiB each piece should be, overriding the preferred default", "s", 1, "" }, { 'c', "comment", "Add a comment", "c", 1, "" }, { 't', "tracker", "Add a tracker's announce URL", "t", 1, "" }, { 'V', "version", "Show version number and exit", "V", 0, NULL }, { 0, NULL, NULL, NULL, 0, NULL } }; static const char * getUsage (void) { return "Usage: " MY_NAME " [options] "; } static int parseCommandLine (int argc, const char * const * argv) { int c; const char * optarg; while ((c = tr_getopt (getUsage (), argc, argv, options, &optarg))) { switch (c) { case 'V': showVersion = true; break; case 'p': isPrivate = true; break; case 'o': outfile = optarg; break; case 'c': comment = optarg; break; case 't': if (trackerCount + 1 < MAX_TRACKERS) { trackers[trackerCount].tier = trackerCount; trackers[trackerCount].announce = (char*) optarg; ++trackerCount; } break; case 's': if (optarg) { char * endptr = NULL; piecesize_kib = strtoul (optarg, &endptr, 10); if (endptr && *endptr=='M') piecesize_kib *= KiB; } break; case TR_OPT_UNK: infile = optarg; break; default: return 1; } } return 0; } static char* tr_getcwd (void) { char * result; tr_error * error = NULL; result = tr_sys_dir_get_current (&error); if (result == NULL) { fprintf (stderr, "getcwd error: \"%s\"", error->message); tr_error_free (error); result = tr_strdup (""); } return result; } int tr_main (int argc, char * argv[]) { char * out2 = NULL; tr_metainfo_builder * b = NULL; tr_logSetLevel (TR_LOG_ERROR); tr_formatter_mem_init (MEM_K, MEM_K_STR, MEM_M_STR, MEM_G_STR, MEM_T_STR); tr_formatter_size_init (DISK_K, DISK_K_STR, DISK_M_STR, DISK_G_STR, DISK_T_STR); tr_formatter_speed_init (SPEED_K, SPEED_K_STR, SPEED_M_STR, SPEED_G_STR, SPEED_T_STR); if (parseCommandLine (argc, (const char* const *)argv)) return EXIT_FAILURE; if (showVersion) { fprintf (stderr, MY_NAME" "LONG_VERSION_STRING"\n"); return EXIT_SUCCESS; } if (!infile) { fprintf (stderr, "ERROR: No input file or directory specified.\n"); tr_getopt_usage (MY_NAME, getUsage (), options); fprintf (stderr, "\n"); return EXIT_FAILURE; } if (outfile == NULL) { char * base = tr_sys_path_basename (infile, NULL); char * end = tr_strdup_printf ("%s.torrent", base); char * cwd = tr_getcwd (); outfile = out2 = tr_buildPath (cwd, end, NULL); tr_free (cwd); tr_free (end); tr_free (base); } if (!trackerCount) { if (isPrivate) { fprintf (stderr, "ERROR: no trackers specified for a private torrent\n"); return EXIT_FAILURE; } else { printf ("WARNING: no trackers specified\n"); } } printf ("Creating torrent \"%s\" ...", outfile); fflush (stdout); b = tr_metaInfoBuilderCreate (infile); if (piecesize_kib != 0) tr_metaInfoBuilderSetPieceSize (b, piecesize_kib * KiB); tr_makeMetaInfo (b, outfile, trackers, trackerCount, comment, isPrivate); while (!b->isDone) { tr_wait_msec (500); putc ('.', stdout); fflush (stdout); } putc (' ', stdout); switch (b->result) { case TR_MAKEMETA_OK: printf ("done!"); break; case TR_MAKEMETA_URL: printf ("bad announce URL: \"%s\"", b->errfile); break; case TR_MAKEMETA_IO_READ: printf ("error reading \"%s\": %s", b->errfile, tr_strerror (b->my_errno)); break; case TR_MAKEMETA_IO_WRITE: printf ("error writing \"%s\": %s", b->errfile, tr_strerror (b->my_errno)); break; case TR_MAKEMETA_CANCELLED: printf ("cancelled"); break; } putc ('\n', stdout); tr_metaInfoBuilderFree (b); tr_free (out2); return EXIT_SUCCESS; } transmission-2.92/utils/PaxHeaders.4960/edit.c0000644000000000000000000000013212641272401016106 xustar0030 mtime=1451586817.589878747 30 atime=1451586817.589878747 30 ctime=1457295920.316813292 transmission-2.92/utils/edit.c0000644000175000017500000002336012641272401017537 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: edit.c 14644 2015-12-29 19:37:31Z mikedld $ */ #include /* fprintf () */ #include /* strlen (), strstr (), strcmp () */ #include /* EXIT_FAILURE */ #include #include #include #include #include #include #include #define MY_NAME "transmission-edit" static int fileCount = 0; static bool showVersion = false; static const char ** files = NULL; static const char * add = NULL; static const char * deleteme = NULL; static const char * replace[2] = { NULL, NULL }; static tr_option options[] = { { 'a', "add", "Add a tracker's announce URL", "a", 1, "" }, { 'd', "delete", "Delete a tracker's announce URL", "d", 1, "" }, { 'r', "replace", "Search and replace a substring in the announce URLs", "r", 1, " " }, { 'V', "version", "Show version number and exit", "V", 0, NULL }, { 0, NULL, NULL, NULL, 0, NULL } }; static const char * getUsage (void) { return "Usage: " MY_NAME " [options] torrent-file(s)"; } static int parseCommandLine (int argc, const char * const * argv) { int c; const char * optarg; while ((c = tr_getopt (getUsage (), argc, argv, options, &optarg))) { switch (c) { case 'a': add = optarg; break; case 'd': deleteme = optarg; break; case 'r': replace[0] = optarg; c = tr_getopt (getUsage (), argc, argv, options, &optarg); if (c != TR_OPT_UNK) return 1; replace[1] = optarg; break; case 'V': showVersion = true; break; case TR_OPT_UNK: files[fileCount++] = optarg; break; default: return 1; } } return 0; } static bool removeURL (tr_variant * metainfo, const char * url) { const char * str; tr_variant * announce_list; bool changed = false; if (tr_variantDictFindStr (metainfo, TR_KEY_announce, &str, NULL) && !strcmp (str, url)) { printf ("\tRemoved \"%s\" from \"announce\"\n", str); tr_variantDictRemove (metainfo, TR_KEY_announce); changed = true; } if (tr_variantDictFindList (metainfo, TR_KEY_announce_list, &announce_list)) { tr_variant * tier; int tierIndex = 0; while ((tier = tr_variantListChild (announce_list, tierIndex))) { tr_variant * node; int nodeIndex = 0; while ((node = tr_variantListChild (tier, nodeIndex))) { if (tr_variantGetStr (node, &str, NULL) && !strcmp (str, url)) { printf ("\tRemoved \"%s\" from \"announce-list\" tier #%d\n", str, (tierIndex+1)); tr_variantListRemove (tier, nodeIndex); changed = true; } else ++nodeIndex; } if (tr_variantListSize (tier) == 0) { printf ("\tNo URLs left in tier #%d... removing tier\n", (tierIndex+1)); tr_variantListRemove (announce_list, tierIndex); } else { ++tierIndex; } } if (tr_variantListSize (announce_list) == 0) { printf ("\tNo tiers left... removing announce-list\n"); tr_variantDictRemove (metainfo, TR_KEY_announce_list); } } /* if we removed the "announce" field and there's still another track left, * use it as the "announce" field */ if (changed && !tr_variantDictFindStr (metainfo, TR_KEY_announce, &str, NULL)) { tr_variant * tier; tr_variant * node; if ((tier = tr_variantListChild (announce_list, 0))) { if ((node = tr_variantListChild (tier, 0))) { if (tr_variantGetStr (node, &str, NULL)) { tr_variantDictAddStr (metainfo, TR_KEY_announce, str); printf ("\tAdded \"%s\" to announce\n", str); } } } } return changed; } static char* replaceSubstr (const char * str, const char * in, const char * out) { char * walk; struct evbuffer * buf = evbuffer_new (); const size_t inlen = strlen (in); const size_t outlen = strlen (out); while ((walk = strstr (str, in))) { evbuffer_add (buf, str, walk-str); evbuffer_add (buf, out, outlen); str = walk + inlen; } evbuffer_add (buf, str, strlen (str)); return evbuffer_free_to_str (buf, NULL); } static bool replaceURL (tr_variant * metainfo, const char * in, const char * out) { const char * str; tr_variant * announce_list; bool changed = false; if (tr_variantDictFindStr (metainfo, TR_KEY_announce, &str, NULL) && strstr (str, in)) { char * newstr = replaceSubstr (str, in, out); printf ("\tReplaced in \"announce\": \"%s\" --> \"%s\"\n", str, newstr); tr_variantDictAddStr (metainfo, TR_KEY_announce, newstr); tr_free (newstr); changed = true; } if (tr_variantDictFindList (metainfo, TR_KEY_announce_list, &announce_list)) { tr_variant * tier; int tierCount = 0; while ((tier = tr_variantListChild (announce_list, tierCount++))) { tr_variant * node; int nodeCount = 0; while ((node = tr_variantListChild (tier, nodeCount++))) { if (tr_variantGetStr (node, &str, NULL) && strstr (str, in)) { char * newstr = replaceSubstr (str, in, out); printf ("\tReplaced in \"announce-list\" tier %d: \"%s\" --> \"%s\"\n", tierCount, str, newstr); tr_variantFree (node); tr_variantInitStr (node, newstr, TR_BAD_SIZE); tr_free (newstr); changed = true; } } } } return changed; } static bool announce_list_has_url (tr_variant * announce_list, const char * url) { tr_variant * tier; int tierCount = 0; while ((tier = tr_variantListChild (announce_list, tierCount++))) { tr_variant * node; const char * str; int nodeCount = 0; while ((node = tr_variantListChild (tier, nodeCount++))) if (tr_variantGetStr (node, &str, NULL) && !strcmp (str, url)) return true; } return false; } static bool addURL (tr_variant * metainfo, const char * url) { const char * announce = NULL; tr_variant * announce_list = NULL; bool changed = false; const bool had_announce = tr_variantDictFindStr (metainfo, TR_KEY_announce, &announce, NULL); const bool had_announce_list = tr_variantDictFindList (metainfo, TR_KEY_announce_list, &announce_list); if (!had_announce && !had_announce_list) { /* this new tracker is the only one, so add it to "announce"... */ printf ("\tAdded \"%s\" in \"announce\"\n", url); tr_variantDictAddStr (metainfo, TR_KEY_announce, url); changed = true; } else { if (!had_announce_list) { announce_list = tr_variantDictAddList (metainfo, TR_KEY_announce_list, 2); if (had_announce) { /* we're moving from an 'announce' to an 'announce-list', * so copy the old announce URL to the list */ tr_variant * tier = tr_variantListAddList (announce_list, 1); tr_variantListAddStr (tier, announce); changed = true; } } /* If the user-specified URL isn't in the announce list yet, add it */ if (!announce_list_has_url (announce_list, url)) { tr_variant * tier = tr_variantListAddList (announce_list, 1); tr_variantListAddStr (tier, url); printf ("\tAdded \"%s\" to \"announce-list\" tier %zu\n", url, tr_variantListSize (announce_list)); changed = true; } } return changed; } int tr_main (int argc, char * argv[]) { int i; int changedCount = 0; files = tr_new0 (const char*, argc); tr_logSetLevel (TR_LOG_ERROR); if (parseCommandLine (argc, (const char* const *)argv)) return EXIT_FAILURE; if (showVersion) { fprintf (stderr, MY_NAME" "LONG_VERSION_STRING"\n"); return EXIT_SUCCESS; } if (fileCount < 1) { fprintf (stderr, "ERROR: No torrent files specified.\n"); tr_getopt_usage (MY_NAME, getUsage (), options); fprintf (stderr, "\n"); return EXIT_FAILURE; } if (!add && !deleteme && !replace[0]) { fprintf (stderr, "ERROR: Must specify -a, -d or -r\n"); tr_getopt_usage (MY_NAME, getUsage (), options); fprintf (stderr, "\n"); return EXIT_FAILURE; } for (i=0; imessage); tr_error_free (error); continue; } if (deleteme != NULL) changed |= removeURL (&top, deleteme); if (add != NULL) changed = addURL (&top, add); if (replace[0] && replace[1]) changed |= replaceURL (&top, replace[0], replace[1]); if (changed) { ++changedCount; tr_variantToFile (&top, TR_VARIANT_FMT_BENC, filename); } tr_variantFree (&top); } printf ("Changed %d files\n", changedCount); tr_free (files); return EXIT_SUCCESS; } transmission-2.92/utils/PaxHeaders.4960/show.c0000644000000000000000000000013212634073127016147 xustar0030 mtime=1450210903.411465432 30 atime=1450210903.411465432 30 ctime=1457295920.317813308 transmission-2.92/utils/show.c0000644000175000017500000002162112634073127017576 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: show.c 14615 2015-12-06 22:39:14Z jordan $ */ #include /* fprintf () */ #include /* strcmp (), strchr (), memcmp () */ #include /* qsort () */ #include #define CURL_DISABLE_TYPECHECK /* otherwise -Wunreachable-code goes insane */ #include #include #include #include #include #include /* tr_webGetResponseStr () */ #include #include #include "units.h" #define MY_NAME "transmission-show" #define TIMEOUT_SECS 30 static tr_option options[] = { { 'm', "magnet", "Give a magnet link for the specified torrent", "m", 0, NULL }, { 's', "scrape", "Ask the torrent's trackers how many peers are in the torrent's swarm", "s", 0, NULL }, { 'V', "version", "Show version number and exit", "V", 0, NULL }, { 0, NULL, NULL, NULL, 0, NULL } }; static const char * getUsage (void) { return "Usage: " MY_NAME " [options] <.torrent file>"; } static bool magnetFlag = false; static bool scrapeFlag = false; static bool showVersion = false; const char * filename = NULL; static int parseCommandLine (int argc, const char * const * argv) { int c; const char * optarg; while ((c = tr_getopt (getUsage (), argc, argv, options, &optarg))) { switch (c) { case 'm': magnetFlag = true; break; case 's': scrapeFlag = true; break; case 'V': showVersion = true; break; case TR_OPT_UNK: filename = optarg; break; default: return 1; } } return 0; } static void doShowMagnet (const tr_info * inf) { char * str = tr_torrentInfoGetMagnetLink (inf); printf ("%s", str); tr_free (str); } static int compare_files_by_name (const void * va, const void * vb) { const tr_file * a = * (const tr_file* const *)va; const tr_file * b = * (const tr_file* const *)vb; return strcmp (a->name, b->name); } static void showInfo (const tr_info * inf) { unsigned int i; char buf[128]; tr_file ** files; int prevTier = -1; /** *** General Info **/ printf ("GENERAL\n\n"); printf (" Name: %s\n", inf->name); printf (" Hash: %s\n", inf->hashString); printf (" Created by: %s\n", inf->creator ? inf->creator : "Unknown"); if (!inf->dateCreated) { printf (" Created on: Unknown\n"); } else { struct tm tm = *localtime (&inf->dateCreated); printf (" Created on: %s", asctime (&tm)); } if (inf->comment && *inf->comment) printf (" Comment: %s\n", inf->comment); printf (" Piece Count: %d\n", inf->pieceCount); printf (" Piece Size: %s\n", tr_formatter_mem_B (buf, inf->pieceSize, sizeof (buf))); printf (" Total Size: %s\n", tr_formatter_size_B (buf, inf->totalSize, sizeof (buf))); printf (" Privacy: %s\n", inf->isPrivate ? "Private torrent" : "Public torrent"); /** *** Trackers **/ printf ("\nTRACKERS\n"); for (i=0; itrackerCount; ++i) { if (prevTier != inf->trackers[i].tier) { prevTier = inf->trackers[i].tier; printf ("\n Tier #%d\n", prevTier + 1); } printf (" %s\n", inf->trackers[i].announce); } /** *** **/ if (inf->webseedCount > 0) { printf ("\nWEBSEEDS\n\n"); for (i=0; iwebseedCount; ++i) printf (" %s\n", inf->webseeds[i]); } /** *** Files **/ printf ("\nFILES\n\n"); files = tr_new (tr_file*, inf->fileCount); for (i=0; ifileCount; ++i) files[i] = &inf->files[i]; qsort (files, inf->fileCount, sizeof (tr_file*), compare_files_by_name); for (i=0; ifileCount; ++i) printf (" %s (%s)\n", files[i]->name, tr_formatter_size_B (buf, files[i]->length, sizeof (buf))); tr_free (files); } static size_t writeFunc (void * ptr, size_t size, size_t nmemb, void * buf) { const size_t byteCount = size * nmemb; evbuffer_add (buf, ptr, byteCount); return byteCount; } static CURL* tr_curl_easy_init (struct evbuffer * writebuf) { CURL * curl = curl_easy_init (); curl_easy_setopt (curl, CURLOPT_USERAGENT, MY_NAME "/" LONG_VERSION_STRING); curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, writeFunc); curl_easy_setopt (curl, CURLOPT_WRITEDATA, writebuf); curl_easy_setopt (curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_easy_setopt (curl, CURLOPT_VERBOSE, tr_env_key_exists ("TR_CURL_VERBOSE")); curl_easy_setopt (curl, CURLOPT_ENCODING, ""); return curl; } static void doScrape (const tr_info * inf) { unsigned int i; for (i=0; itrackerCount; ++i) { CURL * curl; CURLcode res; struct evbuffer * buf; const char * scrape = inf->trackers[i].scrape; char * url; char escaped[SHA_DIGEST_LENGTH*3 + 1]; if (scrape == NULL) continue; tr_http_escape_sha1 (escaped, inf->hash); url = tr_strdup_printf ("%s%cinfo_hash=%s", scrape, strchr (scrape, '?') ? '&' : '?', escaped); printf ("%s ... ", url); fflush (stdout); buf = evbuffer_new (); curl = tr_curl_easy_init (buf); curl_easy_setopt (curl, CURLOPT_URL, url); curl_easy_setopt (curl, CURLOPT_TIMEOUT, TIMEOUT_SECS); if ((res = curl_easy_perform (curl))) { printf ("error: %s\n", curl_easy_strerror (res)); } else { long response; curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &response); if (response != 200) { printf ("error: unexpected response %ld \"%s\"\n", response, tr_webGetResponseStr (response)); } else /* HTTP OK */ { tr_variant top; tr_variant * files; bool matched = false; const char * begin = (const char*) evbuffer_pullup (buf, -1); if (!tr_variantFromBenc (&top, begin, evbuffer_get_length(buf))) { if (tr_variantDictFindDict (&top, TR_KEY_files, &files)) { int i = 0; tr_quark key; tr_variant * val; while (tr_variantDictChild (files, i++, &key, &val)) { if (!memcmp (inf->hash, tr_quark_get_string(key,NULL), SHA_DIGEST_LENGTH)) { int64_t seeders = -1; int64_t leechers = -1; tr_variantDictFindInt (val, TR_KEY_complete, &seeders); tr_variantDictFindInt (val, TR_KEY_incomplete, &leechers); printf ("%d seeders, %d leechers\n", (int)seeders, (int)leechers); matched = true; } } } tr_variantFree (&top); } if (!matched) printf ("no match\n"); } } curl_easy_cleanup (curl); evbuffer_free (buf); tr_free (url); } } int tr_main (int argc, char * argv[]) { int err; tr_info inf; tr_ctor * ctor; tr_logSetLevel (TR_LOG_ERROR); tr_formatter_mem_init (MEM_K, MEM_K_STR, MEM_M_STR, MEM_G_STR, MEM_T_STR); tr_formatter_size_init (DISK_K, DISK_K_STR, DISK_M_STR, DISK_G_STR, DISK_T_STR); tr_formatter_speed_init (SPEED_K, SPEED_K_STR, SPEED_M_STR, SPEED_G_STR, SPEED_T_STR); if (parseCommandLine (argc, (const char* const *)argv)) return EXIT_FAILURE; if (showVersion) { fprintf (stderr, MY_NAME" "LONG_VERSION_STRING"\n"); return EXIT_SUCCESS; } /* make sure the user specified a filename */ if (!filename) { fprintf (stderr, "ERROR: No .torrent file specified.\n"); tr_getopt_usage (MY_NAME, getUsage (), options); fprintf (stderr, "\n"); return EXIT_FAILURE; } /* try to parse the .torrent file */ ctor = tr_ctorNew (NULL); tr_ctorSetMetainfoFromFile (ctor, filename); err = tr_torrentParse (ctor, &inf); tr_ctorFree (ctor); if (err) { fprintf (stderr, "Error parsing .torrent file \"%s\"\n", filename); return EXIT_FAILURE; } if (magnetFlag) { doShowMagnet (&inf); } else { printf ("Name: %s\n", inf.name); printf ("File: %s\n", filename); printf ("\n"); fflush (stdout); if (scrapeFlag) doScrape (&inf); else showInfo (&inf); } /* cleanup */ putc ('\n', stdout); tr_metainfoFree (&inf); return EXIT_SUCCESS; } transmission-2.92/utils/PaxHeaders.4960/Makefile.am0000644000000000000000000000013212617217202017052 xustar0030 mtime=1446846082.696734059 30 atime=1446846082.696734059 30 ctime=1457295920.309813172 transmission-2.92/utils/Makefile.am0000644000175000017500000000157212617217202020504 0ustar00mikedldmikedld00000000000000AM_CPPFLAGS = -I@top_srcdir@ AM_CFLAGS = \ @LIBEVENT_CFLAGS@ \ @LIBCURL_CFLAGS@ \ @ZLIB_CFLAGS@ \ @PTHREAD_CFLAGS@ bin_PROGRAMS = \ transmission-create \ transmission-edit \ transmission-show transmission_create_SOURCES = create.c transmission_edit_SOURCES = edit.c transmission_show_SOURCES = show.c noinst_HEADERS = \ units.h dist_man_MANS = \ transmission-create.1 \ transmission-edit.1 \ transmission-show.1 transmission_create_LDADD = \ $(top_builddir)/libtransmission/libtransmission.a \ @LIBUPNP_LIBS@ \ @LIBNATPMP_LIBS@ \ @INTLLIBS@ \ @DHT_LIBS@ \ @LIBB64_LIBS@ \ @LIBUTP_LIBS@ \ @LIBEVENT_LIBS@ \ @LIBCURL_LIBS@ \ @CRYPTO_LIBS@ \ @ZLIB_LIBS@ \ @PTHREAD_LIBS@ \ ${LIBM} transmission_edit_LDADD = $(transmission_create_LDADD) transmission_show_LDADD = $(transmission_create_LDADD) transmission-2.92/PaxHeaders.4960/README0000644000000000000000000000013212442116673014544 xustar0030 mtime=1418239419.374189843 30 atime=1418239419.374189843 30 ctime=1457295917.176759895 transmission-2.92/README0000644000175000017500000000303112442116673016166 0ustar00mikedldmikedld00000000000000ABOUT Transmission is a fast, easy, and free BitTorrent client. It comes in several flavors: * A native Mac OS X GUI application * GTK+ and Qt GUI applications for Linux, BSD, etc. * A headless daemon for servers and routers * A web UI for remote controlling any of the above Visit http://www.transmissionbt.com/ for more information. BUILDING Transmission has an Xcode project file (Transmission.xcodeproj) for building in Xcode. For a more detailed description, and dependancies, visit: http://trac.transmissionbt.com/wiki/ Building a Transmission release from the command line: $ xz -d -c transmission-2.11.tar.xz | tar xf - $ cd transmission-2.11 $ ./configure $ make $ sudo make install Building Transmission from the nightly builds: Download a tarball from http://build.transmissionbt.com/job/trunk-linux-inc/ and follow the steps from the previous section. If you're new to building programs from source code, this is typically easier than building from SVN. Building Transmission from SVN (First Time): $ svn co svn://svn.transmissionbt.com/Transmission/trunk Transmission $ cd Transmission $ ./autogen.sh $ make $ sudo make install Building Transmission from SVN (Updating): $ cd Transmission $ make clean $ svn up $ ./update-version-h.sh $ make $ sudo make install Notes for building on Solaris' C compiler: User av reports success with this invocation: ./configure CC=c99 CXX=CC CFLAGS='-D__EXTENSIONS__ -mt' transmission-2.92/PaxHeaders.4960/AUTHORS0000644000000000000000000000013012442116610014721 xustar0029 mtime=1418239368.75532239 29 atime=1418239368.75532239 30 ctime=1457295917.140759283 transmission-2.92/AUTHORS0000644000175000017500000000452112442116610016352 0ustar00mikedldmikedld00000000000000The Transmission Project http://www.transmissionbt.com/ Lead Developers Jordan Lee, Mnemosyne LLC (Daemon, Backend, GTK+ client) Mitchell Livingston, Digital Ignition LLC (Mac OS X client) Project Contributors John Clay (Website maintenance and troubleshooting, Mac OS X help documentation) Bruno Bierbaumer (Web client patches) Juliusz Chroboczek (DHT, network code, BitTorrent code improvements) Daniel Lee (Patches) Tomas Carnecky (Profiling, patches, and detection of sneaky bugs) Diego Jiménez (Patches) Kendall Hopkins (Web client) Malcolm Jarvis (Web client) Kevin Glowacz (Web client) Rashid Eissing (Mac OS X Transfers preferences icon) Hugo van Heuven, madebysofa (Main icon design) Andreas Nilsson (GNOME adaptation of main icon) Dean Ostetto (Mac OS X Turtle image) Rick Patrick (Mac OS X images) Jonas Rask (Mac OS X Globe icon) Erick Turnquist (IPv6 code, support) Maarten Van Coile (Wiki Wrangler, troubleshooting, support) James "Kibo" Parry (Updated Mac Retina images) Previous Developers Eric Petit (Project originator) Josh Elsasser (Daemon, Backend, GTK+ client) Bryan Varner (BeOS client) Mac OS X Translators, current release: Jorge Carrasco (Spanish) Etienne Samson (French) Marco Cavazzuti (Italian) Anton Sotkov (Russian) Alexander Bykov (Russian) Maarten Van Coile (Dutch) Guilherme Fernandes (Brazilian Portuguese) Sven-S. Porst (German) Tianhao He (Simplified Chinese) Sérgio Miranda (European Portuguese) Daniel ¯stergaard Nielsen (Danish) Emir SARI (Turkish) GTK+ Translators: Hundreds of people in an ever-changing list. See the po files for a full list. Third-Party Resources: Nick Mathewson and Niels Provos for libevent. Greg Hazel of BitTorrent Inc. for libutp. Thomas Bernard for MiniUPnP and libnatpmp. The Growl Development Team for Growl. Andy Matuschak for Sparkle. Bryan D K Jones for VDKQueue. transmission-2.92/PaxHeaders.4960/test-driver0000644000000000000000000000013212667111007016052 xustar0030 mtime=1457295879.943126784 30 atime=1457295879.943126784 30 ctime=1457295919.916806489 transmission-2.92/test-driver0000755000175000017500000001104012667111007017476 0ustar00mikedldmikedld00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2013-07-13.22; # UTC # Copyright (C) 2011-2014 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then tweaked_estatus=1 else tweaked_estatus=$estatus fi case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report the test outcome and exit status in the logs, so that one can # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). echo "$res $test_name (exit status: $estatus)" >>$log_file # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: transmission-2.92/PaxHeaders.4960/libtransmission0000644000000000000000000000013212667111060017021 xustar0030 mtime=1457295920.279812662 30 atime=1457295917.037757532 30 ctime=1457295920.279812662 transmission-2.92/libtransmission/0000755000175000017500000000000012667111060020523 5ustar00mikedldmikedld00000000000000transmission-2.92/libtransmission/PaxHeaders.4960/platform-quota.h0000644000000000000000000000013112442116602022217 xustar0030 mtime=1418239362.932222598 29 atime=1418239362.93122258 30 ctime=1457295919.755803752 transmission-2.92/libtransmission/platform-quota.h0000644000175000017500000000160512442116602023647 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: platform-quota.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_PLATFORM_QUOTA_H #define TR_PLATFORM_QUOTA_H /** * @addtogroup tr_session Session * @{ */ struct tr_device_info { char * path; char * device; char * fstype; }; struct tr_device_info * tr_device_info_create (const char * path); /** If the disk quota is enabled and readable, this returns how much is available in the quota. Otherwise, it returns how much is available on the disk, or -1 on error. */ int64_t tr_device_info_get_free_space (const struct tr_device_info * info); void tr_device_info_free (struct tr_device_info * info); /** @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/utils.h0000644000000000000000000000013212662757235020426 xustar0030 mtime=1456201373.068756639 30 atime=1456201373.068756639 30 ctime=1457295919.856805469 transmission-2.92/libtransmission/utils.h0000644000175000017500000004162312662757235022061 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: utils.h 14641 2015-12-29 00:42:40Z mikedld $ */ #ifndef TR_UTILS_H #define TR_UTILS_H 1 #include #include #include /* size_t */ #include /* time_t */ #ifdef __cplusplus extern "C" { #endif /*** **** ***/ struct evbuffer; struct event; struct timeval; struct tr_error; /** * @addtogroup utils Utilities * @{ */ #ifndef UNUSED #ifdef __GNUC__ #define UNUSED __attribute__ ((unused)) #else #define UNUSED #endif #endif #ifndef TR_GNUC_PRINTF #ifdef __GNUC__ #define TR_GNUC_PRINTF(fmt, args) __attribute__ ((format (printf, fmt, args))) #else #define TR_GNUC_PRINTF(fmt, args) #endif #endif #ifndef TR_GNUC_NONNULL #ifdef __GNUC__ #define TR_GNUC_NONNULL(...) __attribute__ ((nonnull (__VA_ARGS__))) #else #define TR_GNUC_NONNULL(...) #endif #endif #ifndef TR_GNUC_NULL_TERMINATED #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) #define TR_GNUC_NULL_TERMINATED __attribute__ ((__sentinel__)) #define TR_GNUC_HOT __attribute ((hot)) #else #define TR_GNUC_NULL_TERMINATED #define TR_GNUC_HOT #endif #endif #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) #define TR_GNUC_MALLOC __attribute__ ((__malloc__)) #else #define TR_GNUC_MALLOC #endif #ifndef __has_feature #define __has_feature(x) 0 #endif #ifndef __has_extension #define __has_extension __has_feature #endif #ifdef __UCLIBC__ #define TR_UCLIBC_CHECK_VERSION(major, minor, micro) \ (__UCLIBC_MAJOR__ > (major) || \ (__UCLIBC_MAJOR__ == (major) && __UCLIBC_MINOR__ > (minor)) || \ (__UCLIBC_MAJOR__ == (major) && __UCLIBC_MINOR__ == (minor) && \ __UCLIBC_SUBLEVEL__ >= (micro))) #else #define TR_UCLIBC_CHECK_VERSION(major, minor, micro) 0 #endif /** * @def TR_STATIC_ASSERT * @brief This helper allows to perform static checks at compile time */ #if defined (static_assert) #define TR_STATIC_ASSERT static_assert #elif __has_feature (c_static_assert) || __has_extension (c_static_assert) #define TR_STATIC_ASSERT _Static_assert #else #define TR_STATIC_ASSERT(x, msg) { typedef char __tr_static_check__[(x) ? 1 : -1] UNUSED; } #endif /*** **** ***/ const char * tr_strip_positional_args (const char * fmt); #if !defined (_) #if defined (HAVE_LIBINTL_H) && !defined (__APPLE__) #include #define _(a) gettext (a) #else #define _(a)(a) #endif #endif /* #define DISABLE_GETTEXT */ #ifndef DISABLE_GETTEXT #if defined (_WIN32) || defined (TR_LIGHTWEIGHT) #define DISABLE_GETTEXT #endif #endif #ifdef DISABLE_GETTEXT #undef _ #define _(a) tr_strip_positional_args (a) #endif /**** ***** ****/ /** * @brief Rich Salz's classic implementation of shell-style pattern matching for ?, \, [], and * characters. * @return 1 if the pattern matches, 0 if it doesn't, or -1 if an error occured */ bool tr_wildmat (const char * text, const char * pattern) TR_GNUC_NONNULL (1,2); /** * @brief Loads a file and returns its contents. * On failure, NULL is returned and errno is set. */ uint8_t * tr_loadFile (const char * filename, size_t * size, struct tr_error ** error) TR_GNUC_MALLOC TR_GNUC_NONNULL (1); /** @brief build a filename from a series of elements using the platform's correct directory separator. */ char* tr_buildPath (const char * first_element, ...) TR_GNUC_NULL_TERMINATED TR_GNUC_MALLOC; /** * @brief Get available disk space (in bytes) for the specified folder. * @return zero or positive integer on success, -1 in case of error. */ int64_t tr_getDirFreeSpace (const char * path); /** * @brief Convenience wrapper around timer_add () to have a timer wake up in a number of seconds and microseconds * @param timer * @param seconds * @param microseconds */ void tr_timerAdd (struct event * timer, int seconds, int microseconds) TR_GNUC_NONNULL (1); /** * @brief Convenience wrapper around timer_add () to have a timer wake up in a number of milliseconds * @param timer * @param milliseconds */ void tr_timerAddMsec (struct event * timer, int milliseconds) TR_GNUC_NONNULL (1); /** @brief return the current date in milliseconds */ uint64_t tr_time_msec (void); /** @brief sleep the specified number of milliseconds */ void tr_wait_msec (long int delay_milliseconds); /** * @brief make a copy of 'str' whose non-utf8 content has been corrected or stripped * @return a newly-allocated string that must be freed with tr_free () * @param str the string to make a clean copy of * @param len the length of the string to copy. If -1, the entire string is used. */ char* tr_utf8clean (const char * str, size_t len) TR_GNUC_MALLOC; #ifdef _WIN32 char * tr_win32_native_to_utf8 (const wchar_t * text, int text_size); wchar_t * tr_win32_utf8_to_native (const char * text, int text_size); wchar_t * tr_win32_utf8_to_native_ex (const char * text, int text_size, int extra_chars_before, int extra_chars_after, int * real_result_size); char * tr_win32_format_message (uint32_t code); void tr_win32_make_args_utf8 (int * argc, char *** argv); int tr_main_win32 (int argc, char ** argv, int (*real_main) (int, char **)); #define tr_main(...) \ main_impl (__VA_ARGS__); \ int \ main (int argc, \ char * argv[]) \ { \ return tr_main_win32 (argc, argv, &main_impl); \ } \ int \ main_impl (__VA_ARGS__) #else #define tr_main main #endif /*** **** ***/ /* Sometimes the system defines MAX/MIN, sometimes not. In the latter case, define those here since we will use them */ #ifndef MAX #define MAX(a, b)((a) > (b) ? (a) : (b)) #endif #ifndef MIN #define MIN(a, b)((a) > (b) ? (b) : (a)) #endif /*** **** ***/ /** @brief Portability wrapper around malloc () in which `0' is a safe argument */ void* tr_malloc (size_t size); /** @brief Portability wrapper around calloc () in which `0' is a safe argument */ void* tr_malloc0 (size_t size); /** @brief Portability wrapper around reallocf () in which `0' is a safe argument */ void * tr_realloc (void * p, size_t size); /** @brief Portability wrapper around free () in which `NULL' is a safe argument */ void tr_free (void * p); /** * @brief make a newly-allocated copy of a chunk of memory * @param src the memory to copy * @param byteCount the number of bytes to copy * @return a newly-allocated copy of `src' that can be freed with tr_free () */ void* tr_memdup (const void * src, size_t byteCount); #define tr_new(struct_type, n_structs) \ ((struct_type *) tr_malloc (sizeof (struct_type) * ((size_t)(n_structs)))) #define tr_new0(struct_type, n_structs) \ ((struct_type *) tr_malloc0 (sizeof (struct_type) * ((size_t)(n_structs)))) #define tr_renew(struct_type, mem, n_structs) \ ((struct_type *) tr_realloc ((mem), sizeof (struct_type) * ((size_t)(n_structs)))) void* tr_valloc (size_t bufLen); /** * @brief make a newly-allocated copy of a substring * @param in is a void* so that callers can pass in both signed & unsigned without a cast * @param len length of the substring to copy. if a length less than zero is passed in, strlen (len) is used * @return a newly-allocated copy of `in' that can be freed with tr_free () */ char* tr_strndup (const void * in, size_t len) TR_GNUC_MALLOC; /** * @brief make a newly-allocated copy of a string * @param in is a void* so that callers can pass in both signed & unsigned without a cast * @return a newly-allocated copy of `in' that can be freed with tr_free () */ char* tr_strdup (const void * in); /** * @brief like strcmp () but gracefully handles NULL strings */ int tr_strcmp0 (const char * str1, const char * str2); char* evbuffer_free_to_str (struct evbuffer * buf, size_t * result_len); /** @brief similar to bsearch () but returns the index of the lower bound */ int tr_lowerBound (const void * key, const void * base, size_t nmemb, size_t size, int (* compar)(const void* key, const void* arrayMember), bool * exact_match) TR_GNUC_HOT TR_GNUC_NONNULL (1,5,6); /** @brief moves the best k items to the first slots in the array. O(n) */ void tr_quickfindFirstK (void * base, size_t nmemb, size_t size, int (*compar)(const void *, const void *), size_t k); /** * @brief sprintf () a string into a newly-allocated buffer large enough to hold it * @return a newly-allocated string that can be freed with tr_free () */ char* tr_strdup_printf (const char * fmt, ...) TR_GNUC_PRINTF (1, 2) TR_GNUC_MALLOC; char * tr_strdup_vprintf (const char * fmt, va_list args) TR_GNUC_MALLOC; /** @brief Portability wrapper for strlcpy () that uses the system implementation if available */ size_t tr_strlcpy (char * dst, const void * src, size_t siz); /** @brief Portability wrapper for snprintf () that uses the system implementation if available */ int tr_snprintf (char * buf, size_t buflen, const char * fmt, ...) TR_GNUC_PRINTF (3, 4) TR_GNUC_NONNULL (1,3); /** @brief Convenience wrapper around strerorr () guaranteed to not return NULL @param errno */ const char* tr_strerror (int); /** @brief strips leading and trailing whitspace from a string @return the stripped string */ char* tr_strstrip (char * str); /** @brief Returns true if the string ends with the specified case-insensitive suffix */ bool tr_str_has_suffix (const char *str, const char *suffix); /** @brief Portability wrapper for memmem () that uses the system implementation if available */ const char* tr_memmem (const char * haystack, size_t haystack_len, const char * needle, size_t needle_len); /** @brief Portability wrapper for strsep () that uses the system implementation if available */ char* tr_strsep (char ** str, const char * delim); /*** **** ***/ int compareInt (const void * va, const void * vb); void tr_binary_to_hex (const void * input, char * output, size_t byte_length) TR_GNUC_NONNULL (1,2); void tr_hex_to_binary (const char * input, void * output, size_t byte_length) TR_GNUC_NONNULL (1,2); /** @brief convenience function to determine if an address is an IP address (IPv4 or IPv6) */ bool tr_addressIsIP (const char * address); /** @brief return true if the url is a http or https or UDP url that Transmission understands */ bool tr_urlIsValidTracker (const char * url); /** @brief return true if the url is a [ http, https, ftp, sftp ] url that Transmission understands */ bool tr_urlIsValid (const char * url, size_t url_len); /** @brief parse a URL into its component parts @return True on success or false if an error occurred */ bool tr_urlParse (const char * url, size_t url_len, char ** setme_scheme, char ** setme_host, int * setme_port, char ** setme_path) TR_GNUC_NONNULL (1); /** @brief return TR_RATIO_NA, TR_RATIO_INF, or a number in [0..1] @return TR_RATIO_NA, TR_RATIO_INF, or a number in [0..1] */ double tr_getRatio (uint64_t numerator, uint64_t denominator); /** * @brief Given a string like "1-4" or "1-4,6,9,14-51", this returns a * newly-allocated array of all the integers in the set. * @return a newly-allocated array of integers that must be freed with tr_free (), * or NULL if a fragment of the string can't be parsed. * * For example, "5-8" will return [ 5, 6, 7, 8 ] and setmeCount will be 4. */ int* tr_parseNumberRange (const char * str, size_t str_len, int * setmeCount) TR_GNUC_MALLOC TR_GNUC_NONNULL (1); /** * @brief truncate a double value at a given number of decimal places. * * this can be used to prevent a printf () call from rounding up: * call with the decimal_places argument equal to the number of * decimal places in the printf ()'s precision: * * - printf ("%.2f%%", 99.999 ) ==> "100.00%" * * - printf ("%.2f%%", tr_truncd (99.999, 2)) ==> "99.99%" * ^ ^ * | These should match | * +------------------------+ */ double tr_truncd (double x, int decimal_places); /* return a percent formatted string of either x.xx, xx.x or xxx */ char* tr_strpercent (char * buf, double x, size_t buflen); /** * @param buf the buffer to write the string to * @param buflef buf's size * @param ratio the ratio to convert to a string * @param the string represntation of "infinity" */ char* tr_strratio (char * buf, size_t buflen, double ratio, const char * infinity) TR_GNUC_NONNULL (1,4); /** @brief Portability wrapper for localtime_r () that uses the system implementation if available */ struct tm * tr_localtime_r (const time_t *_clock, struct tm *_result); /** @brief Portability wrapper for gettimeofday (), with tz argument dropped */ int tr_gettimeofday (struct timeval * tv); /** * @brief move a file * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_moveFile (const char * oldpath, const char * newpath, struct tr_error ** error) TR_GNUC_NONNULL (1,2); /** @brief convenience function to remove an item from an array */ void tr_removeElementFromArray (void * array, unsigned int index_to_remove, size_t sizeof_element, size_t nmemb); /*** **** ***/ /** @brief Private libtransmission variable that's visible only for inlining in tr_time () */ extern time_t __tr_current_time; /** * @brief very inexpensive form of time (NULL) * @return the current epoch time in seconds * * This function returns a second counter that is updated once per second. * If something blocks the libtransmission thread for more than a second, * that counter may be thrown off, so this function is not guaranteed * to always be accurate. However, it is *much* faster when 100% accuracy * isn't needed */ static inline time_t tr_time (void) { return __tr_current_time; } /** @brief Private libtransmission function to update tr_time ()'s counter */ static inline void tr_timeUpdate (time_t now) { __tr_current_time = now; } /** @brief Portability wrapper for htonll () that uses the system implementation if available */ uint64_t tr_htonll (uint64_t); /** @brief Portability wrapper for htonll () that uses the system implementation if available */ uint64_t tr_ntohll (uint64_t); /*** **** ***/ /* example: tr_formatter_size_init (1024, _ ("KiB"), _ ("MiB"), _ ("GiB"), _ ("TiB")); */ void tr_formatter_size_init (unsigned int kilo, const char * kb, const char * mb, const char * gb, const char * tb); void tr_formatter_speed_init (unsigned int kilo, const char * kb, const char * mb, const char * gb, const char * tb); void tr_formatter_mem_init (unsigned int kilo, const char * kb, const char * mb, const char * gb, const char * tb); extern unsigned int tr_speed_K; extern unsigned int tr_mem_K; extern unsigned int tr_size_K; /* format a speed from KBps into a user-readable string. */ char* tr_formatter_speed_KBps (char * buf, double KBps, size_t buflen); /* format a memory size from bytes into a user-readable string. */ char* tr_formatter_mem_B (char * buf, int64_t bytes, size_t buflen); /* format a memory size from MB into a user-readable string. */ static inline char* tr_formatter_mem_MB (char * buf, double MBps, size_t buflen) { return tr_formatter_mem_B (buf, MBps * tr_mem_K * tr_mem_K, buflen); } /* format a file size from bytes into a user-readable string. */ char* tr_formatter_size_B (char * buf, int64_t bytes, size_t buflen); void tr_formatter_get_units (void * dict); /*** **** ***/ /** @brief Check if environment variable exists. */ bool tr_env_key_exists (const char * key); /** @brief Get environment variable value as int. */ int tr_env_get_int (const char * key, int default_value); /** @brief Get environment variable value as string (should be freed afterwards). */ char * tr_env_get_string (const char * key, const char * default_value); /*** **** ***/ void tr_net_init (void); /*** **** ***/ #ifdef __cplusplus } #endif /** @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/utils.c0000644000000000000000000000013212663770133020412 xustar0030 mtime=1456468059.440635204 30 atime=1456468059.440635204 30 ctime=1457295920.207811438 transmission-2.92/libtransmission/utils.c0000644000175000017500000011751512663770133022051 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: utils.c 14682 2016-02-23 05:07:43Z mikedld $ */ #ifdef HAVE_MEMMEM #define _GNU_SOURCE /* glibc's string.h needs this to pick up memmem */ #endif #if defined (XCODE_BUILD) #define HAVE_GETPAGESIZE #define HAVE_VALLOC #endif #include #include /* isdigit (), tolower () */ #include #include /* DBL_EPSILON */ #include /* localeconv () */ #include /* pow (), fabs (), floor () */ #include #include /* getenv () */ #include /* strerror (), memset (), memmem () */ #include /* nanosleep () */ #ifdef _WIN32 #include /* WSAStartup () */ #include /* Sleep (), GetSystemTimeAsFileTime (), GetEnvironmentVariable () */ #include /* CommandLineToArgv () */ #else #include #include /* getpagesize () */ #endif #ifdef HAVE_ICONV #include #endif #include #include #include "transmission.h" #include "error.h" #include "error-types.h" #include "file.h" #include "ConvertUTF.h" #include "list.h" #include "log.h" #include "net.h" #include "utils.h" #include "platform.h" /* tr_lockLock () */ #include "platform-quota.h" /* tr_device_info_create(), tr_device_info_get_free_space(), tr_device_info_free() */ #include "variant.h" #include "version.h" time_t __tr_current_time = 0; /*** **** ***/ struct tm * tr_localtime_r (const time_t *_clock, struct tm *_result) { #ifdef HAVE_LOCALTIME_R return localtime_r (_clock, _result); #else struct tm *p = localtime (_clock); if (p) * (_result) = *p; return p; #endif } int tr_gettimeofday (struct timeval * tv) { #ifdef _WIN32 #define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL FILETIME ft; uint64_t tmp = 0; if (tv == NULL) { errno = EINVAL; return -1; } GetSystemTimeAsFileTime(&ft); tmp |= ft.dwHighDateTime; tmp <<= 32; tmp |= ft.dwLowDateTime; tmp /= 10; /* to microseconds */ tmp -= DELTA_EPOCH_IN_MICROSECS; tv->tv_sec = tmp / 1000000UL; tv->tv_usec = tmp % 1000000UL; return 0; #undef DELTA_EPOCH_IN_MICROSECS #else return gettimeofday (tv, NULL); #endif } /*** **** ***/ void* tr_malloc (size_t size) { return size ? malloc (size) : NULL; } void* tr_malloc0 (size_t size) { return size ? calloc (1, size) : NULL; } void * tr_realloc (void * p, size_t size) { void * result = size != 0 ? realloc (p, size) : NULL; if (result == NULL) tr_free (p); return result; } void tr_free (void * p) { if (p != NULL) free (p); } void* tr_memdup (const void * src, size_t byteCount) { return memcpy (tr_malloc (byteCount), src, byteCount); } /*** **** ***/ const char* tr_strip_positional_args (const char* str) { char * out; static size_t bufsize = 0; static char * buf = NULL; const char * in = str; const size_t len = str ? strlen (str) : 0; if (!buf || (bufsize < len)) { bufsize = len * 2 + 1; buf = tr_renew (char, buf, bufsize); } for (out = buf; str && *str; ++str) { *out++ = *str; if ((*str == '%') && isdigit (str[1])) { const char * tmp = str + 1; while (isdigit (*tmp)) ++tmp; if (*tmp == '$') str = tmp[1]=='\'' ? tmp+1 : tmp; } if ((*str == '%') && (str[1] == '\'')) str = str + 1; } *out = '\0'; return !in || strcmp (buf, in) ? buf : in; } /** *** **/ void tr_timerAdd (struct event * timer, int seconds, int microseconds) { struct timeval tv; tv.tv_sec = seconds; tv.tv_usec = microseconds; assert (tv.tv_sec >= 0); assert (tv.tv_usec >= 0); assert (tv.tv_usec < 1000000); evtimer_add (timer, &tv); } void tr_timerAddMsec (struct event * timer, int msec) { const int seconds = msec / 1000; const int usec = (msec%1000) * 1000; tr_timerAdd (timer, seconds, usec); } /** *** **/ uint8_t * tr_loadFile (const char * path, size_t * size, tr_error ** error) { uint8_t * buf; tr_sys_path_info info; tr_sys_file_t fd; tr_error * my_error = NULL; const char * const err_fmt = _("Couldn't read \"%1$s\": %2$s"); /* try to stat the file */ if (!tr_sys_path_get_info (path, 0, &info, &my_error)) { tr_logAddDebug (err_fmt, path, my_error->message); tr_error_propagate (error, &my_error); return NULL; } if (info.type != TR_SYS_PATH_IS_FILE) { tr_logAddError (err_fmt, path, _("Not a regular file")); tr_error_set_literal (error, TR_ERROR_EISDIR, _("Not a regular file")); return NULL; } /* file size should be able to fit into size_t */ if (sizeof(info.size) > sizeof(*size)) assert (info.size <= SIZE_MAX); /* Load the torrent file into our buffer */ fd = tr_sys_file_open (path, TR_SYS_FILE_READ | TR_SYS_FILE_SEQUENTIAL, 0, &my_error); if (fd == TR_BAD_SYS_FILE) { tr_logAddError (err_fmt, path, my_error->message); tr_error_propagate (error, &my_error); return NULL; } buf = tr_malloc (info.size + 1); if (!tr_sys_file_read (fd, buf, info.size, NULL, &my_error)) { tr_logAddError (err_fmt, path, my_error->message); tr_sys_file_close (fd, NULL); free (buf); tr_error_propagate (error, &my_error); return NULL; } tr_sys_file_close (fd, NULL); buf[info.size] = '\0'; *size = info.size; return buf; } char* tr_buildPath (const char *first_element, ...) { const char * element; char * buf; char * pch; va_list vl; size_t bufLen = 0; /* pass 1: allocate enough space for the string */ va_start (vl, first_element); element = first_element; while (element) { bufLen += strlen (element) + 1; element = va_arg (vl, const char*); } pch = buf = tr_new (char, bufLen); va_end (vl); if (buf == NULL) return NULL; /* pass 2: build the string piece by piece */ va_start (vl, first_element); element = first_element; while (element) { const size_t elementLen = strlen (element); memcpy (pch, element, elementLen); pch += elementLen; *pch++ = TR_PATH_DELIMITER; element = va_arg (vl, const char*); } va_end (vl); /* terminate the string. if nonempty, eat the unwanted trailing slash */ if (pch != buf) --pch; *pch++ = '\0'; /* sanity checks & return */ assert (pch - buf == (ptrdiff_t)bufLen); return buf; } int64_t tr_getDirFreeSpace (const char * dir) { int64_t free_space; if (!dir || !*dir) { errno = EINVAL; free_space = -1; } else { struct tr_device_info * info; info = tr_device_info_create (dir); free_space = tr_device_info_get_free_space (info); tr_device_info_free (info); } return free_space; } /**** ***** ****/ char* evbuffer_free_to_str (struct evbuffer * buf, size_t * result_len) { const size_t n = evbuffer_get_length (buf); char * ret = tr_new (char, n + 1); evbuffer_copyout (buf, ret, n); evbuffer_free (buf); ret[n] = '\0'; if (result_len != NULL) *result_len = n; return ret; } char* tr_strdup (const void * in) { return tr_strndup (in, in != NULL ? strlen (in) : 0); } char* tr_strndup (const void * in, size_t len) { char * out = NULL; if (len == TR_BAD_SIZE) { out = tr_strdup (in); } else if (in) { out = tr_malloc (len + 1); if (out != NULL) { memcpy (out, in, len); out[len] = '\0'; } } return out; } const char* tr_memmem (const char * haystack, size_t haystacklen, const char * needle, size_t needlelen) { #ifdef HAVE_MEMMEM return memmem (haystack, haystacklen, needle, needlelen); #else size_t i; if (!needlelen) return haystack; if (needlelen > haystacklen || !haystack || !needle) return NULL; for (i=0; i<=haystacklen-needlelen; ++i) if (!memcmp (haystack+i, needle, needlelen)) return haystack+i; return NULL; #endif } char* tr_strdup_printf (const char * fmt, ...) { va_list ap; char * ret; va_start (ap, fmt); ret = tr_strdup_vprintf (fmt, ap); va_end (ap); return ret; } char * tr_strdup_vprintf (const char * fmt, va_list args) { struct evbuffer * buf = evbuffer_new (); evbuffer_add_vprintf (buf, fmt, args); return evbuffer_free_to_str (buf, NULL); } const char* tr_strerror (int i) { const char * ret = strerror (i); if (ret == NULL) ret = "Unknown Error"; return ret; } int tr_strcmp0 (const char * str1, const char * str2) { if (str1 && str2) return strcmp (str1, str2); if (str1) return 1; if (str2) return -1; return 0; } /**** ***** ****/ /* https://bugs.launchpad.net/percona-patches/+bug/526863/+attachment/1160199/+files/solaris_10_fix.patch */ char* tr_strsep (char ** str, const char * delims) { #ifdef HAVE_STRSEP return strsep (str, delims); #else char *token; if (*str == NULL) /* no more tokens */ return NULL; token = *str; while (**str != '\0') { if (strchr (delims, **str) != NULL) { **str = '\0'; (*str)++; return token; } (*str)++; } /* there is not another token */ *str = NULL; return token; #endif } char* tr_strstrip (char * str) { if (str != NULL) { size_t pos; size_t len = strlen (str); while (len && isspace (str[len - 1])) --len; for (pos = 0; pos < len && isspace (str[pos]);) ++pos; len -= pos; memmove (str, str + pos, len); str[len] = '\0'; } return str; } bool tr_str_has_suffix (const char *str, const char *suffix) { size_t str_len; size_t suffix_len; if (!str) return false; if (!suffix) return true; str_len = strlen (str); suffix_len = strlen (suffix); if (str_len < suffix_len) return false; return !evutil_ascii_strncasecmp (str + str_len - suffix_len, suffix, suffix_len); } /**** ***** ****/ uint64_t tr_time_msec (void) { struct timeval tv; tr_gettimeofday (&tv); return (uint64_t) tv.tv_sec * 1000 + (tv.tv_usec / 1000); } void tr_wait_msec (long int msec) { #ifdef _WIN32 Sleep ((DWORD)msec); #else struct timespec ts; ts.tv_sec = msec / 1000; ts.tv_nsec = (msec % 1000) * 1000000; nanosleep (&ts, NULL); #endif } /*** **** ***/ int tr_snprintf (char * buf, size_t buflen, const char * fmt, ...) { int len; va_list args; va_start (args, fmt); len = evutil_vsnprintf (buf, buflen, fmt, args); va_end (args); return len; } /* * Copy src to string dst of size siz. At most siz-1 characters * will be copied. Always NUL terminates (unless siz == 0). * Returns strlen (src); if retval >= siz, truncation occurred. */ size_t tr_strlcpy (char * dst, const void * src, size_t siz) { #ifdef HAVE_STRLCPY return strlcpy (dst, src, siz); #else char * d = dst; const char *s = src; size_t n = siz; assert (s); assert (d); /* Copy as many bytes as will fit */ if (n != 0) { while (--n != 0) { if ((*d++ = *s++) == '\0') break; } } /* Not enough room in dst, add NUL and traverse rest of src */ if (n == 0) { if (siz != 0) *d = '\0'; /* NUL-terminate dst */ while (*s++) ; } return s - (const char*)src - 1; /* count does not include NUL */ #endif } /*** **** ***/ double tr_getRatio (uint64_t numerator, uint64_t denominator) { double ratio; if (denominator > 0) ratio = numerator / (double)denominator; else if (numerator > 0) ratio = TR_RATIO_INF; else ratio = TR_RATIO_NA; return ratio; } void tr_binary_to_hex (const void * input, char * output, size_t byte_length) { static const char hex[] = "0123456789abcdef"; const uint8_t * input_octets = input; size_t i; for (i = 0; i < byte_length; ++i) { const unsigned int val = *input_octets++; *output++ = hex[val >> 4]; *output++ = hex[val & 0xf]; } *output = '\0'; } void tr_hex_to_binary (const char * input, void * output, size_t byte_length) { static const char hex[] = "0123456789abcdef"; uint8_t * output_octets = output; size_t i; for (i = 0; i < byte_length; ++i) { const int hi = strchr (hex, tolower (*input++)) - hex; const int lo = strchr (hex, tolower (*input++)) - hex; *output_octets++ = (uint8_t) ((hi << 4) | lo); } } /*** **** ***/ static bool isValidURLChars (const char * url, size_t url_len) { static const char rfc2396_valid_chars[] = "abcdefghijklmnopqrstuvwxyz" /* lowalpha */ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" /* upalpha */ "0123456789" /* digit */ "-_.!~*'()" /* mark */ ";/?:@&=+$," /* reserved */ "<>#%<\"" /* delims */ "{}|\\^[]`"; /* unwise */ if (url == NULL) return false; for (const char * c = url, * end = url + url_len; c < end && *c != '\0'; ++c) if (memchr (rfc2396_valid_chars, *c, sizeof (rfc2396_valid_chars) - 1) == NULL) return false; return true; } bool tr_urlIsValidTracker (const char * url) { if (url == NULL) return false; const size_t url_len = strlen (url); return isValidURLChars (url, url_len) && tr_urlParse (url, url_len, NULL, NULL, NULL, NULL) && (memcmp (url, "http://", 7) == 0 || memcmp (url, "https://", 8) == 0 || memcmp (url, "udp://", 6) == 0); } bool tr_urlIsValid (const char * url, size_t url_len) { if (url == NULL) return false; if (url_len == TR_BAD_SIZE) url_len = strlen (url); return isValidURLChars (url, url_len) && tr_urlParse (url, url_len, NULL, NULL, NULL, NULL) && (memcmp (url, "http://", 7) == 0 || memcmp (url, "https://", 8) == 0 || memcmp (url, "ftp://", 6) == 0 || memcmp (url, "sftp://", 7) == 0); } bool tr_addressIsIP (const char * str) { tr_address tmp; return tr_address_from_string (&tmp, str); } static int parse_port (const char * port, size_t port_len) { char * tmp = tr_strndup (port, port_len); char * end; long port_num = strtol (tmp, &end, 10); if (*end != '\0' || port_num <= 0 || port_num >= 65536) port_num = -1; tr_free (tmp); return (int) port_num; } static int get_port_for_scheme (const char * scheme, size_t scheme_len) { struct known_scheme { const char * name; int port; }; static const struct known_scheme known_schemes[] = { { "udp", 80 }, { "ftp", 21 }, { "sftp", 22 }, { "http", 80 }, { "https", 443 }, { NULL, 0 } }; for (const struct known_scheme * s = known_schemes; s->name != NULL; ++s) { if (scheme_len == strlen (s->name) && memcmp (scheme, s->name, scheme_len) == 0) return s->port; } return -1; } bool tr_urlParse (const char * url, size_t url_len, char ** setme_scheme, char ** setme_host, int * setme_port, char ** setme_path) { if (url_len == TR_BAD_SIZE) url_len = strlen (url); const char * scheme = url; const char * scheme_end = tr_memmem (scheme, url_len, "://", 3); if (scheme_end == NULL) return false; const size_t scheme_len = scheme_end - scheme; if (scheme_len == 0) return false; url += scheme_len + 3; url_len -= scheme_len + 3; const char * authority = url; const char * authority_end = memchr (authority, '/', url_len); if (authority_end == NULL) authority_end = authority + url_len; const size_t authority_len = authority_end - authority; if (authority_len == 0) return false; url += authority_len; url_len -= authority_len; const char * host_end = memchr (authority, ':', authority_len); const size_t host_len = host_end != NULL ? (size_t) (host_end - authority) : authority_len; if (host_len == 0) return false; const size_t port_len = host_end != NULL ? authority_end - host_end - 1 : 0; if (setme_scheme != NULL) *setme_scheme = tr_strndup (scheme, scheme_len); if (setme_host != NULL) *setme_host = tr_strndup (authority, host_len); if (setme_port != NULL) *setme_port = port_len > 0 ? parse_port (host_end + 1, port_len) : get_port_for_scheme (scheme, scheme_len); if (setme_path != NULL) { if (url[0] == '\0') *setme_path = tr_strdup ("/"); else *setme_path = tr_strndup (url, url_len); } return true; } /*** **** ***/ void tr_removeElementFromArray (void * array, unsigned int index_to_remove, size_t sizeof_element, size_t nmemb) { char * a = array; memmove (a + sizeof_element * index_to_remove, a + sizeof_element * (index_to_remove + 1), sizeof_element * (--nmemb - index_to_remove)); } int tr_lowerBound (const void * key, const void * base, size_t nmemb, size_t size, int (* compar)(const void* key, const void* arrayMember), bool * exact_match) { size_t first = 0; const char * cbase = base; bool exact = false; while (nmemb != 0) { const size_t half = nmemb / 2; const size_t middle = first + half; const int c = compar (key, cbase + size*middle); if (c <= 0) { if (c == 0) exact = true; nmemb = half; } else { first = middle + 1; nmemb = nmemb - half - 1; } } *exact_match = exact; return first; } /*** **** **** ***/ /* Byte-wise swap two items of size SIZE. From glibc, written by Douglas C. Schmidt, LGPL 2.1 or higher */ #define SWAP(a, b, size) \ do { \ register size_t __size = (size); \ register char *__a = (a), *__b = (b); \ if (__a != __b) do { \ char __tmp = *__a; \ *__a++ = *__b; \ *__b++ = __tmp; \ } while (--__size > 0); \ } while (0) static size_t quickfindPartition (char * base, size_t left, size_t right, size_t size, int (*compar)(const void *, const void *), size_t pivotIndex) { size_t i; size_t storeIndex; /* move pivot to the end */ SWAP (base+(size*pivotIndex), base+(size*right), size); storeIndex = left; for (i=left; i<=right-1; ++i) { if (compar (base+(size*i), base+(size*right)) <= 0) { SWAP (base+(size*storeIndex), base+(size*i), size); ++storeIndex; } } /* move pivot to its final place */ SWAP (base+(size*right), base+(size*storeIndex), size); /* sanity check the partition */ #ifndef NDEBUG assert (storeIndex >= left); assert (storeIndex <= right); for (i=left; i= 0); #endif return storeIndex; } static void quickfindFirstK (char * base, size_t left, size_t right, size_t size, int (*compar)(const void *, const void *), size_t k) { if (right > left) { const size_t pivotIndex = left + (right-left)/2u; const size_t pivotNewIndex = quickfindPartition (base, left, right, size, compar, pivotIndex); if (pivotNewIndex > left + k) /* new condition */ quickfindFirstK (base, left, pivotNewIndex-1, size, compar, k); else if (pivotNewIndex < left + k) quickfindFirstK (base, pivotNewIndex+1, right, size, compar, k+left-pivotNewIndex-1); } } #ifndef NDEBUG static void checkBestScoresComeFirst (char * base, size_t nmemb, size_t size, int (*compar)(const void *, const void *), size_t k) { size_t i; size_t worstFirstPos = 0; for (i=1; i= 0); } #endif void tr_quickfindFirstK (void * base, size_t nmemb, size_t size, int (*compar)(const void *, const void *), size_t k) { if (k < nmemb) { quickfindFirstK (base, 0, nmemb-1, size, compar, k); #ifndef NDEBUG checkBestScoresComeFirst (base, nmemb, size, compar, k); #endif } } /*** **** ***/ static char* strip_non_utf8 (const char * in, size_t inlen) { const char * end; struct evbuffer * buf = evbuffer_new (); while (!tr_utf8_validate (in, inlen, &end)) { const int good_len = end - in; evbuffer_add (buf, in, good_len); inlen -= (good_len + 1); in += (good_len + 1); evbuffer_add (buf, "?", 1); } evbuffer_add (buf, in, inlen); return evbuffer_free_to_str (buf, NULL); } static char* to_utf8 (const char * in, size_t inlen) { char * ret = NULL; #ifdef HAVE_ICONV int i; const char * encodings[] = { "CURRENT", "ISO-8859-15" }; const int encoding_count = sizeof (encodings) / sizeof (encodings[1]); const size_t buflen = inlen*4 + 10; char * out = tr_new (char, buflen); for (i=0; !ret && i 0 && isspace ((uint8_t) text[text_size - 1])) text[--text_size] = '\0'; } return text; } void tr_win32_make_args_utf8 (int * argc, char *** argv) { int my_argc, i; char ** my_argv; wchar_t ** my_wide_argv; my_wide_argv = CommandLineToArgvW (GetCommandLineW (), &my_argc); if (my_wide_argv == NULL) return; assert (*argc == my_argc); my_argv = tr_new (char *, my_argc + 1); for (i = 0; i < my_argc; ++i) { my_argv[i] = tr_win32_native_to_utf8 (my_wide_argv[i], -1); if (my_argv[i] == NULL) break; } if (i < my_argc) { int j; for (j = 0; j < i; ++j) { tr_free (my_argv[j]); } tr_free (my_argv); } else { my_argv[my_argc] = NULL; *argc = my_argc; *argv = my_argv; /* TODO: Add atexit handler to cleanup? */ } LocalFree (my_wide_argv); } int tr_main_win32 (int argc, char ** argv, int (*real_main) (int, char **)) { tr_win32_make_args_utf8 (&argc, &argv); SetConsoleCP (CP_UTF8); SetConsoleOutputCP (CP_UTF8); return real_main (argc, argv); } #endif /*** **** ***/ struct number_range { int low; int high; }; /** * This should be a single number (ex. "6") or a range (ex. "6-9"). * Anything else is an error and will return failure. */ static bool parseNumberSection (const char * str, size_t len, struct number_range * setme) { long a, b; bool success; char * end; const int error = errno; char * tmp = tr_strndup (str, len); errno = 0; a = b = strtol (tmp, &end, 10); if (errno || (end == tmp)) { success = false; } else if (*end != '-') { success = true; } else { const char * pch = end + 1; b = strtol (pch, &end, 10); if (errno || (pch == end)) success = false; else if (*end) /* trailing data */ success = false; else success = true; } tr_free (tmp); setme->low = MIN (a, b); setme->high = MAX (a, b); errno = error; return success; } int compareInt (const void * va, const void * vb) { const int a = * (const int *)va; const int b = * (const int *)vb; return a - b; } /** * Given a string like "1-4" or "1-4,6,9,14-51", this allocates and returns an * array of setmeCount ints of all the values in the array. * For example, "5-8" will return [ 5, 6, 7, 8 ] and setmeCount will be 4. * It's the caller's responsibility to call tr_free () on the returned array. * If a fragment of the string can't be parsed, NULL is returned. */ int* tr_parseNumberRange (const char * str_in, size_t len, int * setmeCount) { int n = 0; int * uniq = NULL; char * str = tr_strndup (str_in, len); const char * walk; tr_list * ranges = NULL; bool success = true; walk = str; while (walk && *walk && success) { struct number_range range; const char * pch = strchr (walk, ','); if (pch) { success = parseNumberSection (walk, (size_t) (pch - walk), &range); walk = pch + 1; } else { success = parseNumberSection (walk, strlen (walk), &range); walk += strlen (walk); } if (success) tr_list_append (&ranges, tr_memdup (&range, sizeof (struct number_range))); } if (!success) { *setmeCount = 0; uniq = NULL; } else { int i; int n2; tr_list * l; int * sorted = NULL; /* build a sorted number array */ n = n2 = 0; for (l=ranges; l!=NULL; l=l->next) { const struct number_range * r = l->data; n += r->high + 1 - r->low; } sorted = tr_new (int, n); if (sorted == NULL) { n = 0; uniq = NULL; } else { for (l=ranges; l!=NULL; l=l->next) { int i; const struct number_range * r = l->data; for (i=r->low; i<=r->high; ++i) sorted[n2++] = i; } qsort (sorted, n, sizeof (int), compareInt); assert (n == n2); /* remove duplicates */ uniq = tr_new (int, n); if (uniq == NULL) { n = 0; } else { for (i=n=0; idecimal_point))) pt[precision ? precision+1 : 0] = '\0'; return atof (buf); } /* return a truncated double as a string */ static char* tr_strtruncd (char * buf, double x, int precision, size_t buflen) { tr_snprintf (buf, buflen, "%.*f", precision, tr_truncd (x, precision)); return buf; } char* tr_strpercent (char * buf, double x, size_t buflen) { if (x < 100.0) tr_strtruncd (buf, x, 1, buflen); else tr_strtruncd (buf, x, 0, buflen); return buf; } char* tr_strratio (char * buf, size_t buflen, double ratio, const char * infinity) { if ((int)ratio == TR_RATIO_NA) tr_strlcpy (buf, _("None"), buflen); else if ((int)ratio == TR_RATIO_INF) tr_strlcpy (buf, infinity, buflen); else tr_strpercent (buf, ratio, buflen); return buf; } /*** **** ***/ bool tr_moveFile (const char * oldpath, const char * newpath, tr_error ** error) { tr_sys_file_t in; tr_sys_file_t out; char * buf = NULL; tr_sys_path_info info; uint64_t bytesLeft; const size_t buflen = 1024 * 128; /* 128 KiB buffer */ /* make sure the old file exists */ if (!tr_sys_path_get_info (oldpath, 0, &info, error)) { tr_error_prefix (error, "Unable to get information on old file: "); return false; } if (info.type != TR_SYS_PATH_IS_FILE) { tr_error_set_literal (error, TR_ERROR_EINVAL, "Old path does not point to a file."); return false; } /* make sure the target directory exists */ { char * newdir = tr_sys_path_dirname (newpath, NULL); const bool i = tr_sys_dir_create (newdir, TR_SYS_DIR_CREATE_PARENTS, 0777, error); tr_free (newdir); if (!i) { tr_error_prefix (error, "Unable to create directory for new file: "); return false; } } /* they might be on the same filesystem... */ if (tr_sys_path_rename (oldpath, newpath, NULL)) return true; /* copy the file */ in = tr_sys_file_open (oldpath, TR_SYS_FILE_READ | TR_SYS_FILE_SEQUENTIAL, 0, error); if (in == TR_BAD_SYS_FILE) { tr_error_prefix (error, "Unable to open old file: "); return false; } out = tr_sys_file_open (newpath, TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE | TR_SYS_FILE_TRUNCATE, 0666, error); if (out == TR_BAD_SYS_FILE) { tr_error_prefix (error, "Unable to open new file: "); tr_sys_file_close (in, NULL); return false; } buf = tr_valloc (buflen); bytesLeft = info.size; while (bytesLeft > 0) { const uint64_t bytesThisPass = MIN (bytesLeft, buflen); uint64_t numRead, bytesWritten; if (!tr_sys_file_read (in, buf, bytesThisPass, &numRead, error)) break; if (!tr_sys_file_write (out, buf, numRead, &bytesWritten, error)) break; assert (numRead == bytesWritten); assert (bytesWritten <= bytesLeft); bytesLeft -= bytesWritten; } /* cleanup */ tr_free (buf); tr_sys_file_close (out, NULL); tr_sys_file_close (in, NULL); if (bytesLeft != 0) { tr_error_prefix (error, "Unable to read/write: "); return false; } { tr_error * my_error = NULL; if (!tr_sys_path_remove (oldpath, &my_error)) { tr_logAddError ("Unable to remove file at old path: %s", my_error->message); tr_error_free (my_error); } } return true; } /*** **** ***/ void* tr_valloc (size_t bufLen) { size_t allocLen; void * buf = NULL; static size_t pageSize = 0; if (!pageSize) { #if defined (HAVE_GETPAGESIZE) && !defined (_WIN32) pageSize = (size_t) getpagesize (); #else /* guess */ pageSize = 4096; #endif } allocLen = pageSize; while (allocLen < bufLen) allocLen += pageSize; #ifdef HAVE_POSIX_MEMALIGN if (!buf) if (posix_memalign (&buf, pageSize, allocLen)) buf = NULL; /* just retry with valloc/malloc */ #endif #ifdef HAVE_VALLOC if (!buf) buf = valloc (allocLen); #endif if (!buf) buf = tr_malloc (allocLen); return buf; } /*** **** ***/ uint64_t tr_htonll (uint64_t x) { #ifdef HAVE_HTONLL return htonll (x); #else /* fallback code by bdonlan at * http://stackoverflow.com/questions/809902/64-bit-ntohl-in-c/875505#875505 */ union { uint32_t lx[2]; uint64_t llx; } u; u.lx[0] = htonl (x >> 32); u.lx[1] = htonl (x & 0xFFFFFFFFULL); return u.llx; #endif } uint64_t tr_ntohll (uint64_t x) { #ifdef HAVE_NTOHLL return ntohll (x); #else /* fallback code by bdonlan at * http://stackoverflow.com/questions/809902/64-bit-ntohl-in-c/875505#875505 */ union { uint32_t lx[2]; uint64_t llx; } u; u.llx = x; return ((uint64_t)ntohl (u.lx[0]) << 32) | (uint64_t)ntohl (u.lx[1]); #endif } /*** **** **** **** ***/ struct formatter_unit { char * name; int64_t value; }; struct formatter_units { struct formatter_unit units[4]; }; enum { TR_FMT_KB, TR_FMT_MB, TR_FMT_GB, TR_FMT_TB }; static void formatter_init (struct formatter_units * units, unsigned int kilo, const char * kb, const char * mb, const char * gb, const char * tb) { uint64_t value; value = kilo; units->units[TR_FMT_KB].name = tr_strdup (kb); units->units[TR_FMT_KB].value = value; value *= kilo; units->units[TR_FMT_MB].name = tr_strdup (mb); units->units[TR_FMT_MB].value = value; value *= kilo; units->units[TR_FMT_GB].name = tr_strdup (gb); units->units[TR_FMT_GB].value = value; value *= kilo; units->units[TR_FMT_TB].name = tr_strdup (tb); units->units[TR_FMT_TB].value = value; } static char* formatter_get_size_str (const struct formatter_units * u, char * buf, int64_t bytes, size_t buflen) { int precision; double value; const char * units; const struct formatter_unit * unit; if (bytes < u->units[1].value) unit = &u->units[0]; else if (bytes < u->units[2].value) unit = &u->units[1]; else if (bytes < u->units[3].value) unit = &u->units[2]; else unit = &u->units[3]; value = (double)bytes / unit->value; units = unit->name; if (unit->value == 1) precision = 0; else if (value < 100) precision = 2; else precision = 1; tr_snprintf (buf, buflen, "%.*f %s", precision, value, units); return buf; } static struct formatter_units size_units; void tr_formatter_size_init (unsigned int kilo, const char * kb, const char * mb, const char * gb, const char * tb) { formatter_init (&size_units, kilo, kb, mb, gb, tb); } char* tr_formatter_size_B (char * buf, int64_t bytes, size_t buflen) { return formatter_get_size_str (&size_units, buf, bytes, buflen); } static struct formatter_units speed_units; unsigned int tr_speed_K = 0u; void tr_formatter_speed_init (unsigned int kilo, const char * kb, const char * mb, const char * gb, const char * tb) { tr_speed_K = kilo; formatter_init (&speed_units, kilo, kb, mb, gb, tb); } char* tr_formatter_speed_KBps (char * buf, double KBps, size_t buflen) { const double K = speed_units.units[TR_FMT_KB].value; double speed = KBps; if (speed <= 999.95) /* 0.0 KB to 999.9 KB */ { tr_snprintf (buf, buflen, "%d %s", (int)speed, speed_units.units[TR_FMT_KB].name); } else { speed /= K; if (speed <= 99.995) /* 0.98 MB to 99.99 MB */ tr_snprintf (buf, buflen, "%.2f %s", speed, speed_units.units[TR_FMT_MB].name); else if (speed <= 999.95) /* 100.0 MB to 999.9 MB */ tr_snprintf (buf, buflen, "%.1f %s", speed, speed_units.units[TR_FMT_MB].name); else tr_snprintf (buf, buflen, "%.1f %s", speed/K, speed_units.units[TR_FMT_GB].name); } return buf; } static struct formatter_units mem_units; unsigned int tr_mem_K = 0u; void tr_formatter_mem_init (unsigned int kilo, const char * kb, const char * mb, const char * gb, const char * tb) { tr_mem_K = kilo; formatter_init (&mem_units, kilo, kb, mb, gb, tb); } char* tr_formatter_mem_B (char * buf, int64_t bytes_per_second, size_t buflen) { return formatter_get_size_str (&mem_units, buf, bytes_per_second, buflen); } void tr_formatter_get_units (void * vdict) { int i; tr_variant * l; tr_variant * dict = vdict; tr_variantDictReserve (dict, 6); tr_variantDictAddInt (dict, TR_KEY_memory_bytes, mem_units.units[TR_FMT_KB].value); l = tr_variantDictAddList (dict, TR_KEY_memory_units, 4); for (i=0; i<4; i++) tr_variantListAddStr (l, mem_units.units[i].name); tr_variantDictAddInt (dict, TR_KEY_size_bytes, size_units.units[TR_FMT_KB].value); l = tr_variantDictAddList (dict, TR_KEY_size_units, 4); for (i=0; i<4; i++) tr_variantListAddStr (l, size_units.units[i].name); tr_variantDictAddInt (dict, TR_KEY_speed_bytes, speed_units.units[TR_FMT_KB].value); l = tr_variantDictAddList (dict, TR_KEY_speed_units, 4); for (i=0; i<4; i++) tr_variantListAddStr (l, speed_units.units[i].name); } /*** **** ENVIRONMENT ***/ bool tr_env_key_exists (const char * key) { assert (key != NULL); #ifdef _WIN32 return GetEnvironmentVariableA (key, NULL, 0) != 0; #else return getenv (key) != NULL; #endif } int tr_env_get_int (const char * key, int default_value) { #ifdef _WIN32 char value[16]; assert (key != NULL); if (GetEnvironmentVariableA (key, value, ARRAYSIZE (value)) > 1) return atoi (value); #else const char * value; assert (key != NULL); value = getenv (key); if (value != NULL && *value != '\0') return atoi (value); #endif return default_value; } char * tr_env_get_string (const char * key, const char * default_value) { #ifdef _WIN32 wchar_t * wide_key; char * value = NULL; wide_key = tr_win32_utf8_to_native (key, -1); if (wide_key != NULL) { const DWORD size = GetEnvironmentVariableW (wide_key, NULL, 0); if (size != 0) { wchar_t * const wide_value = tr_new (wchar_t, size); if (GetEnvironmentVariableW (wide_key, wide_value, size) == size - 1) value = tr_win32_native_to_utf8 (wide_value, size); tr_free (wide_value); } tr_free (wide_key); } if (value == NULL && default_value != NULL) value = tr_strdup (default_value); return value; #else char * value; assert (key != NULL); value = getenv (key); if (value == NULL) value = (char *) default_value; if (value != NULL) value = tr_strdup (value); return value; #endif } /*** **** ***/ void tr_net_init (void) { static bool initialized = false; if (!initialized) { #ifdef _WIN32 WSADATA wsaData; WSAStartup (MAKEWORD (2, 2), &wsaData); #endif initialized = true; } } transmission-2.92/libtransmission/PaxHeaders.4960/bitfield-test.c0000644000000000000000000000013212644245522022007 xustar0030 mtime=1452362578.742698871 30 atime=1452362578.742698871 30 ctime=1457295920.258812305 transmission-2.92/libtransmission/bitfield-test.c0000644000175000017500000001166612644245522023446 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: bitfield-test.c 14669 2016-01-08 11:12:22Z mikedld $ */ #include /* strlen () */ #include "transmission.h" #include "crypto-utils.h" #include "bitfield.h" #include "utils.h" /* tr_free */ #include "libtransmission-test.h" static int test_bitfield_count_range (void) { int i; int n; int begin; int end; int count1; int count2; const int bitCount = 100 + tr_rand_int_weak (1000); tr_bitfield bf; /* generate a random bitfield */ tr_bitfieldConstruct (&bf, bitCount); for (i=0, n=tr_rand_int_weak (bitCount); i= 21))); /* test tr_bitfieldRemRange on the boundaries */ tr_bitfieldAddRange (&field, 0, 64); tr_bitfieldRemRange (&field, 8, 24); for (i=0; i<64; i++) check (tr_bitfieldHas (&field, i) == ((i < 8) || (i >= 24))); /* test tr_bitfieldRemRange when begin & end is on the same word */ tr_bitfieldAddRange (&field, 0, 64); tr_bitfieldRemRange (&field, 4, 5); for (i=0; i<64; i++) check (tr_bitfieldHas (&field, i) == ((i < 4) || (i >= 5))); /* test tr_bitfieldAddRange */ tr_bitfieldRemRange (&field, 0, 64); tr_bitfieldAddRange (&field, 4, 21); for (i=0; i<64; i++) check (tr_bitfieldHas (&field, i) == ((4 <= i) && (i < 21))); /* test tr_bitfieldAddRange on the boundaries */ tr_bitfieldRemRange (&field, 0, 64); tr_bitfieldAddRange (&field, 8, 24); for (i=0; i<64; i++) check (tr_bitfieldHas (&field, i) == ((8 <= i) && (i < 24))); /* test tr_bitfieldAddRange when begin & end is on the same word */ tr_bitfieldRemRange (&field, 0, 64); tr_bitfieldAddRange (&field, 4, 5); for (i=0; i<64; i++) check (tr_bitfieldHas (&field, i) == ((4 <= i) && (i < 5))); tr_bitfieldDestruct (&field); return 0; } static int test_bitfield_has_all_none (void) { tr_bitfield field; tr_bitfieldConstruct (&field, 3); check (!tr_bitfieldHasAll (&field)); check (tr_bitfieldHasNone (&field)); tr_bitfieldAdd (&field, 0); check (!tr_bitfieldHasAll (&field)); check (!tr_bitfieldHasNone (&field)); tr_bitfieldRem (&field, 0); tr_bitfieldAdd (&field, 1); check (!tr_bitfieldHasAll (&field)); check (!tr_bitfieldHasNone (&field)); tr_bitfieldRem (&field, 1); tr_bitfieldAdd (&field, 2); check (!tr_bitfieldHasAll (&field)); check (!tr_bitfieldHasNone (&field)); tr_bitfieldAdd (&field, 0); tr_bitfieldAdd (&field, 1); check (tr_bitfieldHasAll (&field)); check (!tr_bitfieldHasNone (&field)); tr_bitfieldSetHasNone (&field); check (!tr_bitfieldHasAll (&field)); check (tr_bitfieldHasNone (&field)); tr_bitfieldSetHasAll (&field); check (tr_bitfieldHasAll (&field)); check (!tr_bitfieldHasNone (&field)); tr_bitfieldDestruct (&field); tr_bitfieldConstruct (&field, 0); check (!tr_bitfieldHasAll (&field)); check (!tr_bitfieldHasNone (&field)); tr_bitfieldSetHasNone (&field); check (!tr_bitfieldHasAll (&field)); check (tr_bitfieldHasNone (&field)); tr_bitfieldSetHasAll (&field); check (tr_bitfieldHasAll (&field)); check (!tr_bitfieldHasNone (&field)); tr_bitfieldDestruct (&field); return 0; } int main (void) { int l; int ret; const testFunc tests[] = { test_bitfields, test_bitfield_has_all_none }; if ((ret = runTests (tests, NUM_TESTS (tests)))) return ret; /* bitfield count range */ for (l=0; l<10000; ++l) if ((ret = test_bitfield_count_range ())) return ret; return 0; } transmission-2.92/libtransmission/PaxHeaders.4960/crypto-test.c0000644000000000000000000000013212505250244021536 xustar0030 mtime=1427460260.479244173 30 atime=1427460260.479244173 30 ctime=1457295920.262812373 transmission-2.92/libtransmission/crypto-test.c0000644000175000017500000001554312505250244023173 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: crypto-test.c 14429 2015-01-03 21:35:20Z mikedld $ */ #include #include "transmission.h" #include "crypto.h" #include "crypto-utils.h" #include "libtransmission-test.h" #include "crypto-test-ref.h" static int test_torrent_hash (void) { tr_crypto a; uint8_t hash[SHA_DIGEST_LENGTH]; int i; for (i = 0; i < SHA_DIGEST_LENGTH; ++i) hash[i] = i; tr_cryptoConstruct (&a, NULL, true); check (!tr_cryptoHasTorrentHash (&a)); check (tr_cryptoGetTorrentHash (&a) == NULL); tr_cryptoSetTorrentHash (&a, hash); check (tr_cryptoHasTorrentHash (&a)); check (tr_cryptoGetTorrentHash (&a) != NULL); check (memcmp (tr_cryptoGetTorrentHash (&a), hash, SHA_DIGEST_LENGTH) == 0); tr_cryptoDestruct (&a); for (i = 0; i < SHA_DIGEST_LENGTH; ++i) hash[i] = i + 1; tr_cryptoConstruct (&a, hash, false); check (tr_cryptoHasTorrentHash (&a)); check (tr_cryptoGetTorrentHash (&a) != NULL); check (memcmp (tr_cryptoGetTorrentHash (&a), hash, SHA_DIGEST_LENGTH) == 0); tr_cryptoSetTorrentHash (&a, NULL); check (!tr_cryptoHasTorrentHash (&a)); check (tr_cryptoGetTorrentHash (&a) == NULL); tr_cryptoDestruct (&a); return 0; } static int test_encrypt_decrypt (void) { tr_crypto a; tr_crypto_ b; uint8_t hash[SHA_DIGEST_LENGTH]; const char test1[] = { "test1" }; char buf11[sizeof (test1)], buf12[sizeof (test1)]; const char test2[] = { "@#)C$@)#(*%bvkdjfhwbc039bc4603756VB3)" }; char buf21[sizeof (test2)], buf22[sizeof (test2)]; int i; for (i = 0; i < SHA_DIGEST_LENGTH; ++i) hash[i] = i; tr_cryptoConstruct (&a, hash, false); tr_cryptoConstruct_ (&b, hash, true); check (tr_cryptoComputeSecret (&a, tr_cryptoGetMyPublicKey_ (&b, &i))); check (tr_cryptoComputeSecret_ (&b, tr_cryptoGetMyPublicKey (&a, &i))); tr_cryptoEncryptInit (&a); tr_cryptoEncrypt (&a, sizeof (test1), test1, buf11); tr_cryptoDecryptInit_ (&b); tr_cryptoDecrypt_ (&b, sizeof (test1), buf11, buf12); check_streq (test1, buf12); tr_cryptoEncryptInit_ (&b); tr_cryptoEncrypt_ (&b, sizeof (test2), test2, buf21); tr_cryptoDecryptInit (&a); tr_cryptoDecrypt (&a, sizeof (test2), buf21, buf22); check_streq (test2, buf22); tr_cryptoDestruct_ (&b); tr_cryptoDestruct (&a); return 0; } static int test_sha1 (void) { uint8_t hash[SHA_DIGEST_LENGTH]; uint8_t hash_[SHA_DIGEST_LENGTH]; check (tr_sha1 (hash, "test", 4, NULL)); check (tr_sha1_ (hash_, "test", 4, NULL)); check (memcmp (hash, "\xa9\x4a\x8f\xe5\xcc\xb1\x9b\xa6\x1c\x4c\x08\x73\xd3\x91\xe9\x87\x98\x2f\xbb\xd3", SHA_DIGEST_LENGTH) == 0); check (memcmp (hash, hash_, SHA_DIGEST_LENGTH) == 0); check (tr_sha1 (hash, "1", 1, "22", 2, "333", 3, NULL)); check (tr_sha1_ (hash_, "1", 1, "22", 2, "333", 3, NULL)); check (memcmp (hash, "\x1f\x74\x64\x8e\x50\xa6\xa6\x70\x8e\xc5\x4a\xb3\x27\xa1\x63\xd5\x53\x6b\x7c\xed", SHA_DIGEST_LENGTH) == 0); check (memcmp (hash, hash_, SHA_DIGEST_LENGTH) == 0); return 0; } static int test_ssha1 (void) { const char * const test_data[] = { "test", "QNY)(*#$B)!_X$B !_B#($^!)*&$%CV!#)&$C!@$(P*)" }; size_t i; #define HASH_COUNT (16 * 1024) for (i = 0; i < sizeof (test_data) / sizeof (*test_data); ++i) { char * const phrase = tr_strdup (test_data[i]); char ** hashes = tr_new (char *, HASH_COUNT); size_t j; for (j = 0; j < HASH_COUNT; ++j) { hashes[j] = j % 2 == 0 ? tr_ssha1 (phrase) : tr_ssha1_ (phrase); check (hashes[j] != NULL); /* phrase matches each of generated hashes */ check (tr_ssha1_matches (hashes[j], phrase)); check (tr_ssha1_matches_ (hashes[j], phrase)); } for (j = 0; j < HASH_COUNT; ++j) { size_t k; /* all hashes are different */ for (k = 0; k < HASH_COUNT; ++k) check (k == j || strcmp (hashes[j], hashes[k]) != 0); } /* exchange two first chars */ phrase[0] ^= phrase[1]; phrase[1] ^= phrase[0]; phrase[0] ^= phrase[1]; for (j = 0; j < HASH_COUNT; ++j) { /* changed phrase doesn't match the hashes */ check (!tr_ssha1_matches (hashes[j], phrase)); check (!tr_ssha1_matches_ (hashes[j], phrase)); } for (j = 0; j < HASH_COUNT; ++j) tr_free (hashes[j]); tr_free (hashes); tr_free (phrase); } #undef HASH_COUNT return 0; } static int test_random (void) { int i; /* test that tr_rand_int () stays in-bounds */ for (i = 0; i < 100000; ++i) { const int val = tr_rand_int (100); check (val >= 0); check (val < 100); } return 0; } static bool base64_eq (const char * a, const char * b) { for (; ; ++a, ++b) { while (*a == '\r' || *a == '\n') ++a; while (*b == '\r' || *b == '\n') ++b; if (*a == '\0' || *b == '\0' || *a != *b) break; } return *a == *b; } static int test_base64 (void) { size_t len; char * in, * out; int i; out = tr_base64_encode_str ("YOYO!", &len); check_int_eq (strlen (out), len); check (base64_eq ("WU9ZTyE=", out)); in = tr_base64_decode_str (out, &len); check_int_eq (5, len); check_streq ("YOYO!", in); tr_free (in); tr_free (out); out = tr_base64_encode ("", 0, &len); check_int_eq (0, len); check_streq ("", out); tr_free (out); out = tr_base64_decode ("", 0, &len); check_int_eq (0, len); check_streq ("", out); tr_free (out); out = tr_base64_encode (NULL, 0, &len); check_int_eq (0, len); check (out == NULL); out = tr_base64_decode (NULL, 0, &len); check_int_eq (0, len); check (out == NULL); #define MAX_BUF_SIZE 1024 for (i = 1; i <= MAX_BUF_SIZE; ++i) { int j; char buf[MAX_BUF_SIZE + 1]; for (j = 0; j < i; ++j) buf[j] = tr_rand_int_weak (256); out = tr_base64_encode (buf, j, &len); check_int_eq (strlen (out), len); in = tr_base64_decode (out, len, &len); check_int_eq (j, len); check (memcmp (in, buf, len) == 0); tr_free (in); tr_free (out); for (j = 0; j < i; ++j) buf[j] = 1 + tr_rand_int_weak (255); buf[j] = '\0'; out = tr_base64_encode_str (buf, &len); check_int_eq (strlen (out), len); in = tr_base64_decode_str (out, &len); check_int_eq (j, len); check_streq (in, buf); tr_free (in); tr_free (out); } #undef MAX_BUF_SIZE return 0; } int main (void) { const testFunc tests[] = { test_torrent_hash, test_encrypt_decrypt, test_sha1, test_ssha1, test_random, test_base64 }; return runTests (tests, NUM_TESTS (tests)); } transmission-2.92/libtransmission/PaxHeaders.4960/jsonsl.h0000644000000000000000000000013212442116602020555 xustar0030 mtime=1418239362.930222563 30 atime=1418239362.930222563 30 ctime=1457295919.668802272 transmission-2.92/libtransmission/jsonsl.h0000644000175000017500000006476412442116602022223 0ustar00mikedldmikedld00000000000000/* * jsonsl * https://github.com/mnunberg/jsonsl * * Copyright (c) 2012 M. Nunberg, mnunberg@haskalah.org * * 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. */ /** * JSON Simple/Stacked/Stateful Lexer. * - Does not buffer data * - Maintains state * - Callback oriented * - Lightweight and fast. One source file and one header file */ #ifndef JSONSL_H_ #define JSONSL_H_ #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #ifdef JSONSL_USE_WCHAR typedef jsonsl_char_t wchar_t; typedef jsonsl_uchar_t unsigned wchar_t; #else typedef char jsonsl_char_t; typedef unsigned char jsonsl_uchar_t; #endif /* JSONSL_USE_WCHAR */ /* Stolen from http-parser.h, and possibly others */ #if defined(_WIN32) && !defined(__MINGW32__) typedef __int8 int8_t; typedef unsigned __int8 uint8_t; typedef __int16 int16_t; typedef unsigned __int16 uint16_t; typedef __int32 int32_t; typedef unsigned __int32 uint32_t; typedef __int64 int64_t; typedef unsigned __int64 uint64_t; #if !defined(_MSC_VER) || _MSC_VER<1400 typedef unsigned int size_t; typedef int ssize_t; #endif #else #include #endif #if (!defined(JSONSL_STATE_GENERIC)) && (!defined(JSONSL_STATE_USER_FIELDS)) #warning "JSONSL_STATE_USER_FIELDS not defined. Define this for extra structure fields" #warning "or define JSONSL_STATE_GENERIC" #define JSONSL_STATE_GENERIC #endif /* !defined JSONSL_STATE_GENERIC */ #ifdef JSONSL_STATE_GENERIC #define JSONSL_STATE_USER_FIELDS #endif /* JSONSL_STATE_GENERIC */ #ifndef JSONSL_API #define JSONSL_API #endif /* JSONSL_API */ #define JSONSL_MAX_LEVELS 512 struct jsonsl_st; typedef struct jsonsl_st *jsonsl_t; typedef struct jsonsl_jpr_st* jsonsl_jpr_t; /** * This flag is true when AND'd against a type whose value * must be in "quoutes" i.e. T_HKEY and T_STRING */ #define JSONSL_Tf_STRINGY 0xffff00 /** * Constant representing the special JSON types. * The values are special and aid in speed (the OBJECT and LIST * values are the char literals of their openings). * * Their actual value is a character which attempts to resemble * some mnemonic reference to the actual type. * * If new types are added, they must fit into the ASCII printable * range (so they should be AND'd with 0x7f and yield something * meaningful) */ #define JSONSL_XTYPE \ X(STRING, '"'|JSONSL_Tf_STRINGY) \ X(HKEY, '#'|JSONSL_Tf_STRINGY) \ X(OBJECT, '{') \ X(LIST, '[') \ X(SPECIAL, '^') \ X(UESCAPE, 'u') typedef enum { #define X(o, c) \ JSONSL_T_##o = c, JSONSL_XTYPE JSONSL_T_UNKNOWN = '?', /* Abstract 'root' object */ JSONSL_T_ROOT = 0 #undef X } jsonsl_type_t; /** * Subtypes for T_SPECIAL. We define them as flags * because more than one type can be applied to a * given object. */ #define JSONSL_XSPECIAL \ X(NONE, 0) \ X(SIGNED, 1<<0) \ X(UNSIGNED, 1<<1) \ X(TRUE, 1<<2) \ X(FALSE, 1<<3) \ X(NULL, 1<<4) \ X(FLOAT, 1<<5) \ X(EXPONENT, 1<<6) \ X(NONASCII, 1<<7) typedef enum { #define X(o,b) \ JSONSL_SPECIALf_##o = b, JSONSL_XSPECIAL #undef X /* Handy flags for checking */ JSONSL_SPECIALf_UNKNOWN = 1 << 8, JSONSL_SPECIALf_NUMERIC = (JSONSL_SPECIALf_SIGNED|JSONSL_SPECIALf_UNSIGNED), JSONSL_SPECIALf_BOOLEAN = (JSONSL_SPECIALf_TRUE|JSONSL_SPECIALf_FALSE), /* For non-simple numeric types */ JSONSL_SPECIALf_NUMNOINT = (JSONSL_SPECIALf_FLOAT|JSONSL_SPECIALf_EXPONENT) } jsonsl_special_t; /** * These are the various types of stack (or other) events * which will trigger a callback. * Like the type constants, this are also mnemonic */ #define JSONSL_XACTION \ X(PUSH, '+') \ X(POP, '-') \ X(UESCAPE, 'U') \ X(ERROR, '!') typedef enum { #define X(a,c) \ JSONSL_ACTION_##a = c, JSONSL_XACTION JSONSL_ACTION_UNKNOWN = '?' #undef X } jsonsl_action_t; /** * Various errors which may be thrown while parsing JSON */ #define JSONSL_XERR \ X(SUCCESS) \ /* Trailing garbage characters */ \ X(GARBAGE_TRAILING) \ /* We were expecting a 'special' (numeric, true, false, null) */ \ X(SPECIAL_EXPECTED) \ /* Found a stray token */ \ X(STRAY_TOKEN) \ /* We were expecting a token before this one */ \ X(MISSING_TOKEN) \ /* Cannot insert because the container is not ready */ \ X(CANT_INSERT) \ /* Found a '\' outside a string */ \ X(ESCAPE_OUTSIDE_STRING) \ /* Found a ':' outside of a hash */ \ X(KEY_OUTSIDE_OBJECT) \ /* found a string outside of a container */ \ X(STRING_OUTSIDE_CONTAINER) \ /* Found a null byte in middle of string */ \ X(FOUND_NULL_BYTE) \ /* Current level exceeds limit specified in constructor */ \ X(LEVELS_EXCEEDED) \ /* Got a } as a result of an opening [ or vice versa */ \ X(BRACKET_MISMATCH) \ /* We expected a key, but got something else instead */ \ X(HKEY_EXPECTED) \ /* We got an illegal control character (bad whitespace or something) */ \ X(WEIRD_WHITESPACE) \ /* Found a \u-escape, but there were less than 4 following hex digits */ \ X(UESCAPE_TOOSHORT) \ /* Invalid two-character escape */ \ X(ESCAPE_INVALID) \ /* Trailing comma */ \ X(TRAILING_COMMA) \ /* An invalid number was passed in a numeric field */ \ X(INVALID_NUMBER) \ /* The following are for JPR Stuff */ \ \ /* Found a literal '%' but it was only followed by a single valid hex digit */ \ X(PERCENT_BADHEX) \ /* jsonpointer URI is malformed '/' */ \ X(JPR_BADPATH) \ /* Duplicate slash */ \ X(JPR_DUPSLASH) \ /* No leading root */ \ X(JPR_NOROOT) typedef enum { #define X(e) \ JSONSL_ERROR_##e, JSONSL_XERR #undef X JSONSL_ERROR_GENERIC } jsonsl_error_t; /** * A state is a single level of the stack. * Non-private data (i.e. the 'data' field, see the STATE_GENERIC section) * will remain in tact until the item is popped. * * As a result, it means a parent state object may be accessed from a child * object, (the parents fields will all be valid). This allows a user to create * an ad-hoc hierarchy on top of the JSON one. * */ struct jsonsl_state_st { /** * The JSON object type */ jsonsl_type_t type; /** If this element is special, then its extended type is here */ jsonsl_special_t special_flags; /** * Position offset variables. These are relative to jsn->pos. * pos_begin is the position at which this state was first pushed * to the stack. pos_cur is the position at which return last controlled * to this state (i.e. an immediate child state was popped from it). */ /** * The position at which this state was first PUSHed */ size_t pos_begin; /** * The position at which any immediate child was last POPped. * Note that this field is only set when the item is popped. */ size_t pos_cur; /** * Level of recursion into nesting. This is mainly a convenience * variable, as this can technically be deduced from the lexer's * level parameter (though the logic is not that simple) */ unsigned int level; /** * how many elements in the object/list. * For objects (hashes), an element is either * a key or a value. Thus for one complete pair, * nelem will be 2. * * For special types, this will hold the sum of the digits. * This only holds true for values which are simple signed/unsigned * numbers. Otherwise a special flag is set, and extra handling is not * performed. */ uint64_t nelem; /*TODO: merge this and special_flags into a union */ /** * Useful for an opening nest, this will prevent a callback from being * invoked on this item or any of its children */ int ignore_callback; /** * Counter which is incremented each time an escape ('\') is encountered. */ unsigned int nescapes; /** * Put anything you want here. if JSONSL_STATE_USER_FIELDS is here, then * the macro expansion happens here. * * You can use these fields to store hierarchical or 'tagging' information * for specific objects. * * See the documentation above for the lifetime of the state object (i.e. * if the private data points to allocated memory, it should be freed * when the object is popped, as the state object will be re-used) */ #ifndef JSONSL_STATE_GENERIC JSONSL_STATE_USER_FIELDS #else /** * Otherwise, this is a simple void * pointer for anything you want */ void *data; #endif /* JSONSL_STATE_USER_FIELDS */ }; /* * So now we need some special structure for keeping the * JPR info in sync. Preferrably all in a single block * of memory (there's no need for separate allocations. * So we will define a 'table' with the following layout * * Level nPosbl JPR1_last JPR2_last JPR3_last * * 0 1 NOMATCH POSSIBLE POSSIBLE * 1 0 NOMATCH NOMATCH COMPLETE * [ table ends here because no further path is possible] * * Where the JPR..n corresponds to the number of JPRs * requested, and nPosble is a quick flag to determine * * the number of possibilities. In the future this might * be made into a proper 'jump' table, * * Since we always mark JPRs from the higher levels descending * into the lower ones, a prospective child match would first * look at the parent table to check the possibilities, and then * see which ones were possible.. * * Thus, the size of this blob would be (and these are all ints here) * nLevels * nJPR * 2. * * the 'Width' of the table would be nJPR*2, and the 'height' would be * nlevels */ /** * This is called when a stack change ocurs. * * @param jsn The lexer * @param action The type of action, this can be PUSH or POP * @param state A pointer to the stack currently affected by the action * @param at A pointer to the position of the input buffer which triggered * this action. */ typedef void (*jsonsl_stack_callback)( jsonsl_t jsn, jsonsl_action_t action, struct jsonsl_state_st* state, const jsonsl_char_t *at); /** * This is called when an error is encountered. * Sometimes it's possible to 'erase' characters (by replacing them * with whitespace). If you think you have corrected the error, you * can return a true value, in which case the parser will backtrack * and try again. * * @param jsn The lexer * @param error The error which was thrown * @param state the current state * @param a pointer to the position of the input buffer which triggered * the error. Note that this is not const, this is because you have the * possibility of modifying the character in an attempt to correct the * error * * @return zero to bail, nonzero to try again (this only makes sense if * the input buffer has been modified by this callback) */ typedef int (*jsonsl_error_callback)( jsonsl_t jsn, jsonsl_error_t error, struct jsonsl_state_st* state, jsonsl_char_t *at); struct jsonsl_st { /** Public, read-only */ /** This is the current level of the stack */ unsigned int level; /** * This is the current position, relative to the beginning * of the stream. */ size_t pos; /** This is the 'bytes' variable passed to feed() */ const jsonsl_char_t *base; /** Callback invoked for PUSH actions */ jsonsl_stack_callback action_callback_PUSH; /** Callback invoked for POP actions */ jsonsl_stack_callback action_callback_POP; /** Default callback for any action, if neither PUSH or POP callbacks are defined */ jsonsl_stack_callback action_callback; /** Do not invoke callbacks for objects deeper than this level */ unsigned int max_callback_level; /** The error callback. Invoked when an error happens. Should not be NULL */ jsonsl_error_callback error_callback; /* these are boolean flags you can modify. You will be called * about notification for each of these types if the corresponding * variable is true. */ /** * @name Callback Booleans. * These determine whether a callback is to be invoked for certain types of objects * @{*/ /** Boolean flag to enable or disable the invokcation for events on this type*/ int call_SPECIAL; int call_OBJECT; int call_LIST; int call_STRING; int call_HKEY; /*@}*/ /** * @name u-Escape handling * Special handling for the \\u-f00d type sequences. These are meant * to be translated back into the corresponding octet(s). * A special callback (if set) is invoked with *at=='u'. An application * may wish to temporarily suspend parsing and handle the 'u-' sequence * internally (or not). */ /*@{*/ /** Callback to be invoked for a u-escape */ jsonsl_stack_callback action_callback_UESCAPE; /** Boolean flag, whether to invoke the callback */ int call_UESCAPE; /** Boolean flag, whether we should return after encountering a u-escape: * the callback is invoked and then we return if this is true */ int return_UESCAPE; /*@}*/ struct { int allow_trailing_comma; } options; /** Put anything here */ void *data; /*@{*/ /** Private */ int in_escape; char expecting; char tok_last; int can_insert; unsigned int levels_max; #ifndef JSONSL_NO_JPR size_t jpr_count; jsonsl_jpr_t *jprs; /* Root pointer for JPR matching information */ size_t *jpr_root; #endif /* JSONSL_NO_JPR */ /*@}*/ /** * This is the stack. Its upper bound is levels_max, or the * nlevels argument passed to jsonsl_new. If you modify this structure, * make sure that this member is last. */ struct jsonsl_state_st stack[1]; }; /** * Creates a new lexer object, with capacity for recursion up to nlevels * * @param nlevels maximum recursion depth */ JSONSL_API jsonsl_t jsonsl_new(int nlevels); /** * Feeds data into the lexer. * * @param jsn the lexer object * @param bytes new data to be fed * @param nbytes size of new data */ JSONSL_API void jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes); /** * Resets the internal parser state. This does not free the parser * but does clean it internally, so that the next time feed() is called, * it will be treated as a new stream * * @param jsn the lexer */ JSONSL_API void jsonsl_reset(jsonsl_t jsn); /** * Frees the lexer, cleaning any allocated memory taken * * @param jsn the lexer */ JSONSL_API void jsonsl_destroy(jsonsl_t jsn); /** * Gets the 'parent' element, given the current one * * @param jsn the lexer * @param cur the current nest, which should be a struct jsonsl_nest_st */ #define jsonsl_last_state(jsn, cur) \ (cur->level > 1 ) \ ? (jsn->stack + (cur->level-1)) \ : NULL /** * This enables receiving callbacks on all events. Doesn't do * anything special but helps avoid some boilerplate. * This does not touch the UESCAPE callbacks or flags. */ #define jsonsl_enable_all_callbacks(jsn) \ jsn->call_HKEY = 1; \ jsn->call_STRING = 1; \ jsn->call_OBJECT = 1; \ jsn->call_SPECIAL = 1; \ jsn->call_LIST = 1; /** * A macro which returns true if the current state object can * have children. This means a list type or an object type. */ #define JSONSL_STATE_IS_CONTAINER(state) \ (state->type == JSONSL_T_OBJECT || state->type == JSONSL_T_LIST) /** * These two functions, dump a string representation * of the error or type, respectively. They will never * return NULL */ JSONSL_API const char* jsonsl_strerror(jsonsl_error_t err); JSONSL_API const char* jsonsl_strtype(jsonsl_type_t jt); /** * Dumps global metrics to the screen. This is a noop unless * jsonsl was compiled with JSONSL_USE_METRICS */ JSONSL_API void jsonsl_dump_global_metrics(void); /* This macro just here for editors to do code folding */ #ifndef JSONSL_NO_JPR /** * @name JSON Pointer API * * JSONPointer API. This isn't really related to the lexer (at least not yet) * JSONPointer provides an extremely simple specification for providing * locations within JSON objects. We will extend it a bit and allow for * providing 'wildcard' characters by which to be able to 'query' the stream. * * See http://tools.ietf.org/html/draft-pbryan-zyp-json-pointer-00 * * Currently I'm implementing the 'single query' API which can only use a single * query component. In the future I will integrate my yet-to-be-published * Boyer-Moore-esque prefix searching implementation, in order to allow * multiple paths to be merged into one for quick and efficient searching. * * * JPR (as we'll refer to it within the source) can be used by splitting * the components into mutliple sections, and incrementally 'track' each * component. When JSONSL delivers a 'pop' callback for a string, or a 'push' * callback for an object, we will check to see whether the index matching * the component corresponding to the current level contains a match * for our path. * * In order to do this properly, a structure must be maintained within the * parent indicating whether its children are possible matches. This flag * will be 'inherited' by call children which may conform to the match * specification, and discarded by all which do not (thereby eliminating * their children from inheriting it). * * A successful match is a complete one. One can provide multiple paths with * multiple levels of matches e.g. * /foo/bar/baz/^/blah * * @{ */ /** The wildcard character */ #ifndef JSONSL_PATH_WILDCARD_CHAR #define JSONSL_PATH_WILDCARD_CHAR '^' #endif /* WILDCARD_CHAR */ #define JSONSL_XMATCH \ X(COMPLETE,1) \ X(POSSIBLE,0) \ X(NOMATCH,-1) typedef enum { #define X(T,v) \ JSONSL_MATCH_##T = v, JSONSL_XMATCH #undef X JSONSL_MATCH_UNKNOWN } jsonsl_jpr_match_t; typedef enum { JSONSL_PATH_STRING = 1, JSONSL_PATH_WILDCARD, JSONSL_PATH_NUMERIC, JSONSL_PATH_ROOT, /* Special */ JSONSL_PATH_INVALID = -1, JSONSL_PATH_NONE = 0 } jsonsl_jpr_type_t; struct jsonsl_jpr_component_st { char *pstr; /** if this is a numeric type, the number is 'cached' here */ unsigned long idx; size_t len; jsonsl_jpr_type_t ptype; }; struct jsonsl_jpr_st { /** Path components */ struct jsonsl_jpr_component_st *components; size_t ncomponents; /** Base of allocated string for components */ char *basestr; /** The original match string. Useful for returning to the user */ char *orig; size_t norig; }; /** * Create a new JPR object. * * @param path the JSONPointer path specification. * @param errp a pointer to a jsonsl_error_t. If this function returns NULL, * then more details will be in this variable. * * @return a new jsonsl_jpr_t object, or NULL on error. */ JSONSL_API jsonsl_jpr_t jsonsl_jpr_new(const char *path, jsonsl_error_t *errp); /** * Destroy a JPR object */ JSONSL_API void jsonsl_jpr_destroy(jsonsl_jpr_t jpr); /** * Match a JSON object against a type and specific level * * @param jpr the JPR object * @param parent_type the type of the parent (should be T_LIST or T_OBJECT) * @param parent_level the level of the parent * @param key the 'key' of the child. If the parent is an array, this should be * empty. * @param nkey - the length of the key. If the parent is an array (T_LIST), then * this should be the current index. * * NOTE: The key of the child means any kind of associative data related to the * element. Thus: <<< { "foo" : [ >>, * the opening array's key is "foo". * * @return a status constant. This indicates whether a match was excluded, possible, * or successful. */ JSONSL_API jsonsl_jpr_match_t jsonsl_jpr_match(jsonsl_jpr_t jpr, jsonsl_type_t parent_type, unsigned int parent_level, const char *key, size_t nkey); /** * Associate a set of JPR objects with a lexer instance. * This should be called before the lexer has been fed any data (and * behavior is undefined if you don't adhere to this). * * After using this function, you may subsequently call match_state() on * given states (presumably from within the callbacks). * * Note that currently the first JPR is the quickest and comes * pre-allocated with the state structure. Further JPR objects * are chained. * * @param jsn The lexer * @param jprs An array of jsonsl_jpr_t objects * @param njprs How many elements in the jprs array. */ JSONSL_API void jsonsl_jpr_match_state_init(jsonsl_t jsn, jsonsl_jpr_t *jprs, size_t njprs); /** * This follows the same semantics as the normal match, * except we infer parent and type information from the relevant state objects. * The match status (for all possible JPR objects) is set in the *out parameter. * * If a match has succeeded, then its JPR object will be returned. In all other * instances, NULL is returned; * * @param jpr The jsonsl_jpr_t handle * @param state The jsonsl_state_st which is a candidate * @param key The hash key (if applicable, can be NULL if parent is list) * @param nkey Length of hash key (if applicable, can be zero if parent is list) * @param out A pointer to a jsonsl_jpr_match_t. This will be populated with * the match result * * @return If a match was completed in full, then the JPR object containing * the matching path will be returned. Otherwise, the return is NULL (note, this * does not mean matching has failed, it can still be part of the match: check * the out parameter). */ JSONSL_API jsonsl_jpr_t jsonsl_jpr_match_state(jsonsl_t jsn, struct jsonsl_state_st *state, const char *key, size_t nkey, jsonsl_jpr_match_t *out); /** * Cleanup any memory allocated and any states set by * match_state_init() and match_state() * @param jsn The lexer */ JSONSL_API void jsonsl_jpr_match_state_cleanup(jsonsl_t jsn); /** * Return a string representation of the match result returned by match() */ JSONSL_API const char *jsonsl_strmatchtype(jsonsl_jpr_match_t match); /* @}*/ /** * Utility function to convert escape sequences into their original form. * * The decoders I've sampled do not seem to specify a standard behavior of what * to escape/unescape. * * RFC 4627 Mandates only that the quoute, backslash, and ASCII control * characters (0x00-0x1f) be escaped. It is often common for applications * to escape a '/' - however this may also be desired behavior. the JSON * spec is not clear on this, and therefore jsonsl leaves it up to you. * * @param in The input string. * @param out An allocated output (should be the same size as in) * @param len the size of the buffer * @param toEscape - A sparse array of characters to unescape. Characters * which are not present in this array, e.g. toEscape['c'] == 0 will be * ignored and passed to the output in their original form. * @param oflags If not null, and a \uXXXX escape expands to a non-ascii byte, * then this variable will have the SPECIALf_NONASCII flag on. * * @param err A pointer to an error variable. If an error ocurrs, it will be * set in this variable * @param errat If not null and an error occurs, this will be set to point * to the position within the string at which the offending character was * encountered. * * @return The effective size of the output buffer. */ JSONSL_API size_t jsonsl_util_unescape_ex(const char *in, char *out, size_t len, const int toEscape[128], jsonsl_special_t *oflags, jsonsl_error_t *err, const char **errat); /** * Convenience macro to avoid passing too many parameters */ #define jsonsl_util_unescape(in, out, len, toEscape, err) \ jsonsl_util_unescape_ex(in, out, len, toEscape, NULL, err, NULL) #endif /* JSONSL_NO_JPR */ /** * HERE BE CHARACTER TABLES! */ #define JSONSL_CHARTABLE_string_nopass \ /* 0x00 */ 1 /* */, /* 0x00 */ \ /* 0x01 */ 1 /* */, /* 0x01 */ \ /* 0x02 */ 1 /* */, /* 0x02 */ \ /* 0x03 */ 1 /* */, /* 0x03 */ \ /* 0x04 */ 1 /* */, /* 0x04 */ \ /* 0x05 */ 1 /* */, /* 0x05 */ \ /* 0x06 */ 1 /* */, /* 0x06 */ \ /* 0x07 */ 1 /* */, /* 0x07 */ \ /* 0x08 */ 1 /* */, /* 0x08 */ \ /* 0x09 */ 1 /* */, /* 0x09 */ \ /* 0x0a */ 1 /* */, /* 0x0a */ \ /* 0x0b */ 1 /* */, /* 0x0b */ \ /* 0x0c */ 1 /* */, /* 0x0c */ \ /* 0x0d */ 1 /* */, /* 0x0d */ \ /* 0x0e */ 1 /* */, /* 0x0e */ \ /* 0x0f */ 1 /* */, /* 0x0f */ \ /* 0x10 */ 1 /* */, /* 0x10 */ \ /* 0x11 */ 1 /* */, /* 0x11 */ \ /* 0x12 */ 1 /* */, /* 0x12 */ \ /* 0x13 */ 1 /* */, /* 0x13 */ \ /* 0x14 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x21 */ \ /* 0x22 */ 1 /* <"> */, /* 0x22 */ \ /* 0x23 */ 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, /* 0x42 */ \ /* 0x43 */ 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, /* 0x5b */ \ /* 0x5c */ 1 /* <\> */, /* 0x5c */ \ /* 0x5d */ 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, /* 0x7c */ \ /* 0x7d */ 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, /* 0x9c */ \ /* 0x9d */ 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, /* 0xbc */ \ /* 0xbd */ 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, /* 0xdc */ \ /* 0xdd */ 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, /* 0xfc */ \ /* 0xfd */ 0,0 /* 0xfe */ \ #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* JSONSL_H_ */ transmission-2.92/libtransmission/PaxHeaders.4960/crypto-utils-cyassl.c0000644000000000000000000000013212505250244023213 xustar0030 mtime=1427460260.454243727 30 atime=1427460260.454243727 30 ctime=1457295920.256812271 transmission-2.92/libtransmission/crypto-utils-cyassl.c0000644000175000017500000001452212505250244024644 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2014-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: crypto-utils-cyassl.c 14442 2015-01-07 13:20:56Z mikedld $ */ #include #include #include #include #include #include #include #include "transmission.h" #include "crypto-utils.h" #include "log.h" #include "platform.h" #include "utils.h" #define TR_CRYPTO_DH_SECRET_FALLBACK #include "crypto-utils-fallback.c" struct tr_dh_ctx { DhKey dh; word32 key_length; uint8_t * private_key; word32 private_key_length; }; /*** **** ***/ #define MY_NAME "tr_crypto_utils" static void log_cyassl_error (int error_code, const char * file, int line) { if (tr_logLevelIsActive (TR_LOG_ERROR)) { #if LIBCYASSL_VERSION_HEX >= 0x03000002 const char * error_message = CTaoCryptGetErrorString (error_code); #else char error_message[CYASSL_MAX_ERROR_SZ]; CTaoCryptErrorString (error_code, error_message); #endif tr_logAddMessage (file, line, TR_LOG_ERROR, MY_NAME, "CyaSSL error: %s", error_message); } } static bool check_cyassl_result (int result, const char * file, int line) { const bool ret = result == 0; if (!ret) log_cyassl_error (result, file, line); return ret; } #define check_result(result) check_cyassl_result ((result), __FILE__, __LINE__) /*** **** ***/ static RNG * get_rng (void) { static RNG rng; static bool rng_initialized = false; if (!rng_initialized) { if (!check_result (InitRng (&rng))) return NULL; rng_initialized = true; } return &rng; } static tr_lock * get_rng_lock (void) { static tr_lock * lock = NULL; if (lock == NULL) lock = tr_lockNew (); return lock; } /*** **** ***/ tr_sha1_ctx_t tr_sha1_init (void) { Sha * handle = tr_new (Sha, 1); if (check_result (InitSha (handle))) return handle; tr_free (handle); return NULL; } bool tr_sha1_update (tr_sha1_ctx_t handle, const void * data, size_t data_length) { assert (handle != NULL); if (data_length == 0) return true; assert (data != NULL); return check_result (ShaUpdate (handle, data, data_length)); } bool tr_sha1_final (tr_sha1_ctx_t handle, uint8_t * hash) { bool ret = true; if (hash != NULL) { assert (handle != NULL); ret = check_result (ShaFinal (handle, hash)); } tr_free (handle); return ret; } /*** **** ***/ tr_rc4_ctx_t tr_rc4_new (void) { return tr_new0 (Arc4, 1); } void tr_rc4_free (tr_rc4_ctx_t handle) { tr_free (handle); } void tr_rc4_set_key (tr_rc4_ctx_t handle, const uint8_t * key, size_t key_length) { assert (handle != NULL); assert (key != NULL); Arc4SetKey (handle, key, key_length); } void tr_rc4_process (tr_rc4_ctx_t handle, const void * input, void * output, size_t length) { assert (handle != NULL); if (length == 0) return; assert (input != NULL); assert (output != NULL); Arc4Process (handle, output, input, length); } /*** **** ***/ tr_dh_ctx_t tr_dh_new (const uint8_t * prime_num, size_t prime_num_length, const uint8_t * generator_num, size_t generator_num_length) { struct tr_dh_ctx * handle = tr_new0 (struct tr_dh_ctx, 1); assert (prime_num != NULL); assert (generator_num != NULL); InitDhKey (&handle->dh); if (!check_result (DhSetKey (&handle->dh, prime_num, prime_num_length, generator_num, generator_num_length))) { tr_free (handle); return NULL; } handle->key_length = prime_num_length; return handle; } void tr_dh_free (tr_dh_ctx_t raw_handle) { struct tr_dh_ctx * handle = raw_handle; if (handle == NULL) return; FreeDhKey (&handle->dh); tr_free (handle->private_key); tr_free (handle); } bool tr_dh_make_key (tr_dh_ctx_t raw_handle, size_t private_key_length UNUSED, uint8_t * public_key, size_t * public_key_length) { struct tr_dh_ctx * handle = raw_handle; word32 my_private_key_length, my_public_key_length; tr_lock * rng_lock = get_rng_lock (); assert (handle != NULL); assert (public_key != NULL); if (handle->private_key == NULL) handle->private_key = tr_malloc (handle->key_length); tr_lockLock (rng_lock); if (!check_result (DhGenerateKeyPair (&handle->dh, get_rng (), handle->private_key, &my_private_key_length, public_key, &my_public_key_length))) { tr_lockUnlock (rng_lock); return false; } tr_lockUnlock (rng_lock); tr_dh_align_key (public_key, my_public_key_length, handle->key_length); handle->private_key_length = my_private_key_length; if (public_key_length != NULL) *public_key_length = handle->key_length; return true; } tr_dh_secret_t tr_dh_agree (tr_dh_ctx_t raw_handle, const uint8_t * other_public_key, size_t other_public_key_length) { struct tr_dh_ctx * handle = raw_handle; struct tr_dh_secret * ret; word32 my_secret_key_length; assert (handle != NULL); assert (other_public_key != NULL); ret = tr_dh_secret_new (handle->key_length); if (check_result (DhAgree (&handle->dh, ret->key, &my_secret_key_length, handle->private_key, handle->private_key_length, other_public_key, other_public_key_length))) { tr_dh_secret_align (ret, my_secret_key_length); } else { tr_dh_secret_free (ret); ret = NULL; } return ret; } /*** **** ***/ bool tr_rand_buffer (void * buffer, size_t length) { bool ret; tr_lock * rng_lock = get_rng_lock (); assert (buffer != NULL); tr_lockLock (rng_lock); ret = check_result (RNG_GenerateBlock (get_rng (), buffer, length)); tr_lockUnlock (rng_lock); return ret; } transmission-2.92/libtransmission/PaxHeaders.4960/file-win32.c0000644000000000000000000000013112612560135021121 xustar0030 mtime=1445650525.023276315 30 atime=1445650525.022276298 29 ctime=1457295920.25381222 transmission-2.92/libtransmission/file-win32.c0000644000175000017500000007402512612560135022557 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: file-win32.c 14588 2015-10-23 05:29:47Z mikedld $ */ #include #include /* isalpha () */ #include /* SHCreateDirectoryEx () */ #include /* FSCTL_SET_SPARSE */ #include "transmission.h" #include "crypto-utils.h" /* tr_rand_int () */ #include "error.h" #include "file.h" #include "utils.h" #ifndef MAXSIZE_T #define MAXSIZE_T ((SIZE_T)~((SIZE_T)0)) #endif /* MSDN (http://msdn.microsoft.com/en-us/library/2k2xf226.aspx) only mentions "i64" suffix for C code, but no warning is issued */ #define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL struct tr_sys_dir_win32 { wchar_t * pattern; HANDLE find_handle; WIN32_FIND_DATAW find_data; char * utf8_name; }; static void set_system_error (tr_error ** error, DWORD code) { char * message; if (error == NULL) return; message = tr_win32_format_message (code); if (message != NULL) { tr_error_set_literal (error, code, message); tr_free (message); } else { tr_error_set (error, code, "Unknown error: 0x%08lx", code); } } static void set_system_error_if_file_found (tr_error ** error, DWORD code) { if (code != ERROR_FILE_NOT_FOUND && code != ERROR_PATH_NOT_FOUND && code != ERROR_NO_MORE_FILES) set_system_error (error, code); } static time_t filetime_to_unix_time (const FILETIME * t) { uint64_t tmp = 0; assert (t != NULL); tmp |= t->dwHighDateTime; tmp <<= 32; tmp |= t->dwLowDateTime; tmp /= 10; /* to microseconds */ tmp -= DELTA_EPOCH_IN_MICROSECS; return tmp / 1000000UL; } static void stat_to_sys_path_info (DWORD attributes, DWORD size_low, DWORD size_high, const FILETIME * mtime, tr_sys_path_info * info) { assert (mtime != NULL); assert (info != NULL); if (attributes & FILE_ATTRIBUTE_DIRECTORY) info->type = TR_SYS_PATH_IS_DIRECTORY; else if (!(attributes & (FILE_ATTRIBUTE_DEVICE | FILE_ATTRIBUTE_REPARSE_POINT | FILE_ATTRIBUTE_VIRTUAL))) info->type = TR_SYS_PATH_IS_FILE; else info->type = TR_SYS_PATH_IS_OTHER; info->size = size_high; info->size <<= 32; info->size |= size_low; info->last_modified_at = filetime_to_unix_time (mtime); } static inline bool is_slash (char c) { return c == '\\' || c == '/'; } static inline bool is_unc_path (const char * path) { return is_slash (path[0]) && path[1] == path[0]; } static bool is_valid_path (const char * path) { if (is_unc_path (path)) { if (path[2] != '\0' && !isalnum (path[2])) return false; } else { const char * colon_pos = strchr (path, ':'); if (colon_pos != NULL) { if (colon_pos != path + 1 || !isalpha (path[0])) return false; path += 2; } } return strpbrk (path, "<>:\"|?*") == NULL; } static wchar_t * path_to_native_path_ex (const char * path, int extra_chars_after, int * real_result_size) { /* Extending maximum path length limit up to ~32K. See "Naming Files, Paths, and Namespaces" (https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247.aspx) for more info */ const wchar_t local_prefix[] = { '\\', '\\', '?', '\\' }; const wchar_t unc_prefix[] = { '\\', '\\', '?', '\\', 'U', 'N', 'C', '\\' }; const bool is_relative = tr_sys_path_is_relative (path); const bool is_unc = is_unc_path (path); /* `-2` for UNC since we overwrite existing prefix slashes */ const int extra_chars_before = is_relative ? 0 : (is_unc ? ARRAYSIZE (unc_prefix) - 2 : ARRAYSIZE (local_prefix)); /* TODO (?): assert (!is_relative); */ wchar_t * const wide_path = tr_win32_utf8_to_native_ex (path, -1, extra_chars_before, extra_chars_after, real_result_size); if (wide_path == NULL) return NULL; /* Relative paths cannot be used with "\\?\" prefixes. This also means that relative paths are limited to ~260 chars... but we should rarely work with relative paths in the first place */ if (!is_relative) { if (is_unc) /* UNC path: "\\server\share" -> "\\?\UNC\server\share" */ memcpy (wide_path, unc_prefix, sizeof (unc_prefix)); else /* Local path: "C:" -> "\\?\C:" */ memcpy (wide_path, local_prefix, sizeof (local_prefix)); } /* Automatic '/' to '\' conversion is disabled for "\\?\"-prefixed paths */ wchar_t * p = wide_path + extra_chars_before; while ((p = wcschr (p, L'/')) != NULL) *p++ = L'\\'; if (real_result_size != NULL) *real_result_size += extra_chars_before; return wide_path; } static wchar_t * path_to_native_path (const char * path) { return path_to_native_path_ex (path, 0, NULL); } static tr_sys_file_t open_file (const char * path, DWORD access, DWORD disposition, DWORD flags, tr_error ** error) { tr_sys_file_t ret = TR_BAD_SYS_FILE; wchar_t * wide_path; assert (path != NULL); wide_path = path_to_native_path (path); if (wide_path != NULL) ret = CreateFileW (wide_path, access, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, disposition, flags, NULL); if (ret == TR_BAD_SYS_FILE) set_system_error (error, GetLastError ()); tr_free (wide_path); return ret; } static bool create_dir (const char * path, int flags, int permissions, bool okay_if_exists, tr_error ** error) { bool ret; wchar_t * wide_path; DWORD error_code = ERROR_SUCCESS; assert (path != NULL); (void) permissions; wide_path = path_to_native_path (path); if ((flags & TR_SYS_DIR_CREATE_PARENTS) != 0) { error_code = SHCreateDirectoryExW (NULL, wide_path, NULL); ret = error_code == ERROR_SUCCESS; } else { ret = CreateDirectoryW (wide_path, NULL); if (!ret) error_code = GetLastError (); } if (!ret && error_code == ERROR_ALREADY_EXISTS && okay_if_exists) { const DWORD attributes = GetFileAttributesW (wide_path); if (attributes != INVALID_FILE_ATTRIBUTES && (attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) ret = true; } if (!ret) set_system_error (error, error_code); tr_free (wide_path); return ret; } static void create_temp_path (char * path_template, void (* callback) (const char * path, void * param, tr_error ** error), void * callback_param, tr_error ** error) { char * path; size_t path_size; int attempt; tr_error * my_error = NULL; assert (path_template != NULL); assert (callback != NULL); path = tr_strdup (path_template); path_size = strlen (path); assert (path_size > 0); for (attempt = 0; attempt < 100; ++attempt) { size_t i = path_size; while (i > 0 && path_template[i - 1] == 'X') { const int c = tr_rand_int (26 + 26 + 10); path[i - 1] = c < 26 ? c + 'A' : (c < 26 + 26 ? (c - 26) + 'a' : (c - 26 - 26) + '0'); --i; } assert (path_size >= i + 6); tr_error_clear (&my_error); (*callback) (path, callback_param, &my_error); if (my_error == NULL) break; } if (my_error != NULL) tr_error_propagate(error, &my_error); else memcpy (path_template, path, path_size); tr_free (path); } bool tr_sys_path_exists (const char * path, tr_error ** error) { bool ret = false; wchar_t * wide_path; HANDLE handle = INVALID_HANDLE_VALUE; assert (path != NULL); wide_path = path_to_native_path (path); if (wide_path != NULL) { DWORD attributes = GetFileAttributesW (wide_path); if (attributes != INVALID_FILE_ATTRIBUTES) { if (attributes & FILE_ATTRIBUTE_REPARSE_POINT) { handle = CreateFileW (wide_path, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); ret = handle != INVALID_HANDLE_VALUE; } else { ret = true; } } } if (!ret) set_system_error_if_file_found (error, GetLastError ()); if (handle != INVALID_HANDLE_VALUE) CloseHandle (handle); tr_free (wide_path); return ret; } bool tr_sys_path_get_info (const char * path, int flags, tr_sys_path_info * info, tr_error ** error) { bool ret = false; wchar_t * wide_path; assert (path != NULL); assert (info != NULL); wide_path = path_to_native_path (path); if ((flags & TR_SYS_PATH_NO_FOLLOW) == 0) { HANDLE handle = INVALID_HANDLE_VALUE; if (wide_path != NULL) handle = CreateFileW (wide_path, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (handle != INVALID_HANDLE_VALUE) { tr_error * my_error = NULL; ret = tr_sys_file_get_info (handle, info, &my_error); if (!ret) tr_error_propagate (error, &my_error); CloseHandle (handle); } else { set_system_error (error, GetLastError ()); } } else { WIN32_FILE_ATTRIBUTE_DATA attributes; if (wide_path != NULL) ret = GetFileAttributesExW (wide_path, GetFileExInfoStandard, &attributes); if (ret) stat_to_sys_path_info (attributes.dwFileAttributes, attributes.nFileSizeLow, attributes.nFileSizeHigh, &attributes.ftLastWriteTime, info); else set_system_error (error, GetLastError ()); } tr_free (wide_path); return ret; } bool tr_sys_path_is_relative (const char * path) { assert (path != NULL); /* UNC path: `\\...`. */ if (is_unc_path (path)) return false; /* Local path: `X:` or `X:\...`. */ if (isalpha (path[0]) && path[1] == ':' && (path[2] == '\0' || is_slash (path[2]))) return false; return true; } bool tr_sys_path_is_same (const char * path1, const char * path2, tr_error ** error) { bool ret = false; wchar_t * wide_path1 = NULL; wchar_t * wide_path2 = NULL; HANDLE handle1 = INVALID_HANDLE_VALUE; HANDLE handle2 = INVALID_HANDLE_VALUE; BY_HANDLE_FILE_INFORMATION fi1, fi2; assert (path1 != NULL); assert (path2 != NULL); wide_path1 = path_to_native_path (path1); if (wide_path1 == NULL) goto fail; wide_path2 = path_to_native_path (path2); if (wide_path2 == NULL) goto fail; handle1 = CreateFileW (wide_path1, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (handle1 == INVALID_HANDLE_VALUE) goto fail; handle2 = CreateFileW (wide_path2, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (handle2 == INVALID_HANDLE_VALUE) goto fail; /* TODO: Use GetFileInformationByHandleEx on >= Server 2012 */ if (!GetFileInformationByHandle (handle1, &fi1) || !GetFileInformationByHandle (handle2, &fi2)) goto fail; ret = fi1.dwVolumeSerialNumber == fi2.dwVolumeSerialNumber && fi1.nFileIndexHigh == fi2.nFileIndexHigh && fi1.nFileIndexLow == fi2.nFileIndexLow; goto cleanup; fail: set_system_error_if_file_found (error, GetLastError ()); cleanup: CloseHandle (handle2); CloseHandle (handle1); tr_free (wide_path2); tr_free (wide_path1); return ret; } char * tr_sys_path_resolve (const char * path, tr_error ** error) { char * ret = NULL; wchar_t * wide_path; wchar_t * wide_ret = NULL; HANDLE handle = INVALID_HANDLE_VALUE; DWORD wide_ret_size; assert (path != NULL); wide_path = path_to_native_path (path); if (wide_path == NULL) goto fail; handle = CreateFileW (wide_path, FILE_READ_EA, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (handle == INVALID_HANDLE_VALUE) goto fail; wide_ret_size = GetFinalPathNameByHandleW (handle, NULL, 0, 0); if (wide_ret_size == 0) goto fail; wide_ret = tr_new (wchar_t, wide_ret_size); if (GetFinalPathNameByHandleW (handle, wide_ret, wide_ret_size, 0) != wide_ret_size - 1) goto fail; /* Resolved path always begins with "\\?\", so skip those first four chars. */ ret = tr_win32_native_to_utf8 (wide_ret + 4, -1); if (ret != NULL) goto cleanup; fail: set_system_error (error, GetLastError ()); tr_free (ret); ret = NULL; cleanup: tr_free (wide_ret); tr_free (wide_path); if (handle != INVALID_HANDLE_VALUE) CloseHandle (handle); return ret; } char * tr_sys_path_basename (const char * path, tr_error ** error) { if (path == NULL || path[0] == '\0') return tr_strdup ("."); if (!is_valid_path (path)) { set_system_error (error, ERROR_PATH_NOT_FOUND); return NULL; } const char * end = path + strlen (path); while (end > path && is_slash (*(end - 1))) --end; if (end == path) return tr_strdup ("/"); const char * name = end; while (name > path && *(name - 1) != ':' && !is_slash (*(name - 1))) --name; if (name == end) return tr_strdup ("/"); return tr_strndup (name, end - name); } char * tr_sys_path_dirname (const char * path, tr_error ** error) { if (path == NULL || path[0] == '\0') return tr_strdup ("."); if (!is_valid_path (path)) { set_system_error (error, ERROR_PATH_NOT_FOUND); return NULL; } const bool is_unc = is_unc_path (path); if (is_unc && path[2] == '\0') return tr_strdup (path); const char * end = path + strlen (path); while (end > path && is_slash (*(end - 1))) --end; if (end == path) return tr_strdup ("/"); const char * name = end; while (name > path && *(name - 1) != ':' && !is_slash (*(name - 1))) --name; while (name > path && is_slash (*(name - 1))) --name; if (name == path) return tr_strdup (is_unc ? "\\\\" : "."); if (name > path && *(name - 1) == ':' && *name != '\0' && !is_slash (*name)) return tr_strdup_printf ("%c:.", path[0]); return tr_strndup (path, name - path); } bool tr_sys_path_rename (const char * src_path, const char * dst_path, tr_error ** error) { bool ret = false; wchar_t * wide_src_path; wchar_t * wide_dst_path; assert (src_path != NULL); assert (dst_path != NULL); wide_src_path = path_to_native_path (src_path); wide_dst_path = path_to_native_path (dst_path); if (wide_src_path != NULL && wide_dst_path != NULL) { DWORD flags = MOVEFILE_REPLACE_EXISTING; DWORD attributes; attributes = GetFileAttributesW (wide_src_path); if (attributes != INVALID_FILE_ATTRIBUTES && (attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { flags = 0; } else { attributes = GetFileAttributesW (wide_dst_path); if (attributes != INVALID_FILE_ATTRIBUTES && (attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) flags = 0; } ret = MoveFileExW (wide_src_path, wide_dst_path, flags); } if (!ret) set_system_error (error, GetLastError ()); tr_free (wide_dst_path); tr_free (wide_src_path); return ret; } bool tr_sys_path_remove (const char * path, tr_error ** error) { bool ret = false; wchar_t * wide_path; assert (path != NULL); wide_path = path_to_native_path (path); if (wide_path != NULL) { const DWORD attributes = GetFileAttributesW (wide_path); if (attributes != INVALID_FILE_ATTRIBUTES) { if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) ret = RemoveDirectoryW (wide_path); else ret = DeleteFileW (wide_path); } } if (!ret) set_system_error (error, GetLastError ()); tr_free (wide_path); return ret; } tr_sys_file_t tr_sys_file_get_std (tr_std_sys_file_t std_file, tr_error ** error) { tr_sys_file_t ret = TR_BAD_SYS_FILE; switch (std_file) { case TR_STD_SYS_FILE_IN: ret = GetStdHandle (STD_INPUT_HANDLE); break; case TR_STD_SYS_FILE_OUT: ret = GetStdHandle (STD_OUTPUT_HANDLE); break; case TR_STD_SYS_FILE_ERR: ret = GetStdHandle (STD_ERROR_HANDLE); break; default: assert (0 && "Unknown standard file"); set_system_error (error, ERROR_INVALID_PARAMETER); return TR_BAD_SYS_FILE; } if (ret == TR_BAD_SYS_FILE) set_system_error (error, GetLastError ()); else if (ret == NULL) ret = TR_BAD_SYS_FILE; return ret; } tr_sys_file_t tr_sys_file_open (const char * path, int flags, int permissions, tr_error ** error) { tr_sys_file_t ret; DWORD native_access = 0; DWORD native_disposition = OPEN_EXISTING; DWORD native_flags = FILE_ATTRIBUTE_NORMAL; bool success; assert (path != NULL); assert ((flags & (TR_SYS_FILE_READ | TR_SYS_FILE_WRITE)) != 0); (void) permissions; if (flags & TR_SYS_FILE_READ) native_access |= GENERIC_READ; if (flags & TR_SYS_FILE_WRITE) native_access |= GENERIC_WRITE; if (flags & TR_SYS_FILE_CREATE_NEW) native_disposition = CREATE_NEW; else if (flags & TR_SYS_FILE_CREATE) native_disposition = flags & TR_SYS_FILE_TRUNCATE ? CREATE_ALWAYS : OPEN_ALWAYS; else if (flags & TR_SYS_FILE_TRUNCATE) native_disposition = TRUNCATE_EXISTING; if (flags & TR_SYS_FILE_SEQUENTIAL) native_flags |= FILE_FLAG_SEQUENTIAL_SCAN; ret = open_file (path, native_access, native_disposition, native_flags, error); success = ret != TR_BAD_SYS_FILE; if (success && (flags & TR_SYS_FILE_APPEND)) success = SetFilePointer (ret, 0, NULL, FILE_END) != INVALID_SET_FILE_POINTER; if (!success) { if (error == NULL) set_system_error (error, GetLastError ()); CloseHandle (ret); ret = TR_BAD_SYS_FILE; } return ret; } static void file_open_temp_callback (const char * path, void * param, tr_error ** error) { tr_sys_file_t * result = (tr_sys_file_t *) param; assert (result != NULL); *result = open_file (path, GENERIC_READ | GENERIC_WRITE, CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY, error); } tr_sys_file_t tr_sys_file_open_temp (char * path_template, tr_error ** error) { tr_sys_file_t ret = TR_BAD_SYS_FILE; assert (path_template != NULL); create_temp_path (path_template, file_open_temp_callback, &ret, error); return ret; } bool tr_sys_file_close (tr_sys_file_t handle, tr_error ** error) { bool ret; assert (handle != TR_BAD_SYS_FILE); ret = CloseHandle (handle); if (!ret) set_system_error (error, GetLastError ()); return ret; } bool tr_sys_file_get_info (tr_sys_file_t handle, tr_sys_path_info * info, tr_error ** error) { bool ret; BY_HANDLE_FILE_INFORMATION attributes; assert (handle != TR_BAD_SYS_FILE); assert (info != NULL); ret = GetFileInformationByHandle (handle, &attributes); if (ret) stat_to_sys_path_info (attributes.dwFileAttributes, attributes.nFileSizeLow, attributes.nFileSizeHigh, &attributes.ftLastWriteTime, info); else set_system_error (error, GetLastError ()); return ret; } bool tr_sys_file_seek (tr_sys_file_t handle, int64_t offset, tr_seek_origin_t origin, uint64_t * new_offset, tr_error ** error) { bool ret = false; LARGE_INTEGER native_offset, new_native_pointer; TR_STATIC_ASSERT (TR_SEEK_SET == FILE_BEGIN, "values should match"); TR_STATIC_ASSERT (TR_SEEK_CUR == FILE_CURRENT, "values should match"); TR_STATIC_ASSERT (TR_SEEK_END == FILE_END, "values should match"); assert (handle != TR_BAD_SYS_FILE); assert (origin == TR_SEEK_SET || origin == TR_SEEK_CUR || origin == TR_SEEK_END); native_offset.QuadPart = offset; if (SetFilePointerEx (handle, native_offset, &new_native_pointer, origin)) { if (new_offset != NULL) *new_offset = new_native_pointer.QuadPart; ret = true; } else { set_system_error (error, GetLastError ()); } return ret; } bool tr_sys_file_read (tr_sys_file_t handle, void * buffer, uint64_t size, uint64_t * bytes_read, tr_error ** error) { bool ret = false; DWORD my_bytes_read; assert (handle != TR_BAD_SYS_FILE); assert (buffer != NULL || size == 0); if (size > MAXDWORD) { set_system_error (error, ERROR_INVALID_PARAMETER); return false; } if (ReadFile (handle, buffer, (DWORD)size, &my_bytes_read, NULL)) { if (bytes_read != NULL) *bytes_read = my_bytes_read; ret = true; } else { set_system_error (error, GetLastError ()); } return ret; } bool tr_sys_file_read_at (tr_sys_file_t handle, void * buffer, uint64_t size, uint64_t offset, uint64_t * bytes_read, tr_error ** error) { bool ret = false; OVERLAPPED overlapped; DWORD my_bytes_read; assert (handle != TR_BAD_SYS_FILE); assert (buffer != NULL || size == 0); if (size > MAXDWORD) { set_system_error (error, ERROR_INVALID_PARAMETER); return false; } overlapped.Offset = (DWORD)offset; offset >>= 32; overlapped.OffsetHigh = (DWORD)offset; overlapped.hEvent = NULL; if (ReadFile (handle, buffer, (DWORD)size, &my_bytes_read, &overlapped)) { if (bytes_read != NULL) *bytes_read = my_bytes_read; ret = true; } else { set_system_error (error, GetLastError ()); } return ret; } bool tr_sys_file_write (tr_sys_file_t handle, const void * buffer, uint64_t size, uint64_t * bytes_written, tr_error ** error) { bool ret = false; DWORD my_bytes_written; assert (handle != TR_BAD_SYS_FILE); assert (buffer != NULL || size == 0); if (size > MAXDWORD) { set_system_error (error, ERROR_INVALID_PARAMETER); return false; } if (WriteFile (handle, buffer, (DWORD)size, &my_bytes_written, NULL)) { if (bytes_written != NULL) *bytes_written = my_bytes_written; ret = true; } else { set_system_error (error, GetLastError ()); } return ret; } bool tr_sys_file_write_at (tr_sys_file_t handle, const void * buffer, uint64_t size, uint64_t offset, uint64_t * bytes_written, tr_error ** error) { bool ret = false; OVERLAPPED overlapped; DWORD my_bytes_written; assert (handle != TR_BAD_SYS_FILE); assert (buffer != NULL || size == 0); if (size > MAXDWORD) { set_system_error (error, ERROR_INVALID_PARAMETER); return false; } overlapped.Offset = (DWORD)offset; offset >>= 32; overlapped.OffsetHigh = (DWORD)offset; overlapped.hEvent = NULL; if (WriteFile (handle, buffer, (DWORD)size, &my_bytes_written, &overlapped)) { if (bytes_written != NULL) *bytes_written = my_bytes_written; ret = true; } else { set_system_error (error, GetLastError ()); } return ret; } bool tr_sys_file_flush (tr_sys_file_t handle, tr_error ** error) { bool ret; assert (handle != TR_BAD_SYS_FILE); ret = FlushFileBuffers (handle); if (!ret) set_system_error (error, GetLastError ()); return ret; } bool tr_sys_file_truncate (tr_sys_file_t handle, uint64_t size, tr_error ** error) { bool ret = false; FILE_END_OF_FILE_INFO info; assert (handle != TR_BAD_SYS_FILE); info.EndOfFile.QuadPart = size; ret = SetFileInformationByHandle (handle, FileEndOfFileInfo, &info, sizeof (info)); if (!ret) set_system_error (error, GetLastError ()); return ret; } bool tr_sys_file_prefetch (tr_sys_file_t handle, uint64_t offset, uint64_t size, tr_error ** error) { bool ret = false; assert (handle != TR_BAD_SYS_FILE); assert (size > 0); (void) handle; (void) offset; (void) size; (void) error; /* ??? */ return ret; } bool tr_sys_file_preallocate (tr_sys_file_t handle, uint64_t size, int flags, tr_error ** error) { assert (handle != TR_BAD_SYS_FILE); if ((flags & TR_SYS_FILE_PREALLOC_SPARSE) != 0) { DWORD tmp; if (!DeviceIoControl (handle, FSCTL_SET_SPARSE, NULL, 0, NULL, 0, &tmp, NULL)) { set_system_error (error, GetLastError ()); return false; } } return tr_sys_file_truncate (handle, size, error); } void * tr_sys_file_map_for_reading (tr_sys_file_t handle, uint64_t offset, uint64_t size, tr_error ** error) { void * ret = NULL; HANDLE mappingHandle; assert (handle != TR_BAD_SYS_FILE); assert (size > 0); if (size > MAXSIZE_T) { set_system_error (error, ERROR_INVALID_PARAMETER); return false; } mappingHandle = CreateFileMappingW (handle, NULL, PAGE_READONLY, 0, 0, NULL); if (mappingHandle != NULL) { ULARGE_INTEGER native_offset; native_offset.QuadPart = offset; ret = MapViewOfFile (mappingHandle, FILE_MAP_READ, native_offset.u.HighPart, native_offset.u.LowPart, (SIZE_T)size); } if (ret == NULL) set_system_error (error, GetLastError ()); CloseHandle (mappingHandle); return ret; } bool tr_sys_file_unmap (const void * address, uint64_t size, tr_error ** error) { bool ret; assert (address != NULL); assert (size > 0); (void) size; ret = UnmapViewOfFile (address); if (!ret) set_system_error (error, GetLastError ()); return ret; } char * tr_sys_dir_get_current (tr_error ** error) { char * ret = NULL; wchar_t * wide_ret = NULL; DWORD size; size = GetCurrentDirectoryW (0, NULL); if (size != 0) { wide_ret = tr_new (wchar_t, size); if (GetCurrentDirectoryW (size, wide_ret) != 0) ret = tr_win32_native_to_utf8 (wide_ret, size); } if (ret == NULL) set_system_error (error, GetLastError ()); tr_free (wide_ret); return ret; } bool tr_sys_dir_create (const char * path, int flags, int permissions, tr_error ** error) { return create_dir (path, flags, permissions, true, error); } static void dir_create_temp_callback (const char * path, void * param, tr_error ** error) { bool * result = (bool *) param; assert (result != NULL); *result = create_dir (path, 0, 0, false, error); } bool tr_sys_dir_create_temp (char * path_template, tr_error ** error) { bool ret = false; assert (path_template != NULL); create_temp_path (path_template, dir_create_temp_callback, &ret, error); return ret; } tr_sys_dir_t tr_sys_dir_open (const char * path, tr_error ** error) { tr_sys_dir_t ret; int pattern_size; #ifndef __clang__ /* Clang gives "static_assert expression is not an integral constant expression" error */ TR_STATIC_ASSERT (TR_BAD_SYS_DIR == NULL, "values should match"); #endif assert (path != NULL); ret = tr_new (struct tr_sys_dir_win32, 1); ret->pattern = path_to_native_path_ex (path, 2, &pattern_size); if (ret->pattern != NULL) { ret->pattern[pattern_size + 0] = L'\\'; ret->pattern[pattern_size + 1] = L'*'; ret->find_handle = INVALID_HANDLE_VALUE; ret->utf8_name = NULL; } else { set_system_error (error, GetLastError ()); tr_free (ret->pattern); tr_free (ret); ret = NULL; } return ret; } const char * tr_sys_dir_read_name (tr_sys_dir_t handle, tr_error ** error) { char * ret; DWORD error_code = ERROR_SUCCESS; assert (handle != TR_BAD_SYS_DIR); if (handle->find_handle == INVALID_HANDLE_VALUE) { handle->find_handle = FindFirstFileW (handle->pattern, &handle->find_data); if (handle->find_handle == INVALID_HANDLE_VALUE) error_code = GetLastError (); } else { if (!FindNextFileW (handle->find_handle, &handle->find_data)) error_code = GetLastError (); } if (error_code != ERROR_SUCCESS) { set_system_error_if_file_found (error, error_code); return NULL; } ret = tr_win32_native_to_utf8 (handle->find_data.cFileName, -1); if (ret != NULL) { tr_free (handle->utf8_name); handle->utf8_name = ret; } else { set_system_error (error, GetLastError ()); } return ret; } bool tr_sys_dir_close (tr_sys_dir_t handle, tr_error ** error) { bool ret; assert (handle != TR_BAD_SYS_DIR); ret = FindClose (handle->find_handle); if (!ret) set_system_error (error, GetLastError ()); tr_free (handle->utf8_name); tr_free (handle->pattern); tr_free (handle); return ret; } transmission-2.92/libtransmission/PaxHeaders.4960/bitfield.c0000644000000000000000000000013212641272401021023 xustar0030 mtime=1451586817.578878551 30 atime=1451586817.578878551 30 ctime=1457295919.944806966 transmission-2.92/libtransmission/bitfield.c0000644000175000017500000002350112641272401022451 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: bitfield.c 14646 2015-12-31 05:22:42Z mikedld $ */ #include #include /* memset */ #include "transmission.h" #include "bitfield.h" #include "utils.h" /* tr_new0 () */ const tr_bitfield TR_BITFIELD_INIT = { NULL, 0, 0, 0, false, false }; /**** ***** ****/ static const int8_t trueBitCount[256] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 }; static size_t countArray (const tr_bitfield * b) { size_t ret = 0; size_t i = b->alloc_count; while (i > 0) ret += trueBitCount[b->bits[--i]]; return ret; } static size_t countRange (const tr_bitfield * b, size_t begin, size_t end) { size_t ret = 0; const size_t first_byte = begin >> 3u; const size_t last_byte = (end - 1) >> 3u; if (!b->bit_count) return 0; if (first_byte >= b->alloc_count) return 0; assert (begin < end); assert (b->bits != NULL); if (first_byte == last_byte) { int i; uint8_t val = b->bits[first_byte]; i = begin - (first_byte * 8); val <<= i; val >>= i; i = (last_byte+1)*8 - end; val >>= i; val <<= i; ret += trueBitCount[val]; } else { size_t i; uint8_t val; const size_t walk_end = MIN (b->alloc_count, last_byte); /* first byte */ i = begin - (first_byte * 8); val = b->bits[first_byte]; val <<= i; val >>= i; ret += trueBitCount[val]; /* middle bytes */ for (i=first_byte+1; ibits[i]]; /* last byte */ if (last_byte < b->alloc_count) { i = (last_byte+1)*8 - end; val = b->bits[last_byte]; val >>= i; val <<= i; ret += trueBitCount[val]; } } assert (ret <= (begin - end)); return ret; } size_t tr_bitfieldCountRange (const tr_bitfield * b, size_t begin, size_t end) { if (tr_bitfieldHasAll (b)) return end - begin; if (tr_bitfieldHasNone (b)) return 0; return countRange (b, begin, end); } bool tr_bitfieldHas (const tr_bitfield * b, size_t n) { if (tr_bitfieldHasAll (b)) return true; if (tr_bitfieldHasNone (b)) return false; if (n>>3u >= b->alloc_count) return false; return (b->bits[n>>3u] << (n & 7u) & 0x80) != 0; } /*** **** ***/ #ifndef NDEBUG static bool tr_bitfieldIsValid (const tr_bitfield * b) { assert (b != NULL); assert ((b->alloc_count == 0) == (b->bits == 0)); assert (!b->bits || (b->true_count == countArray (b))); return true; } #endif size_t tr_bitfieldCountTrueBits (const tr_bitfield * b) { assert (tr_bitfieldIsValid (b)); return b->true_count; } static size_t get_bytes_needed (size_t bit_count) { return (bit_count >> 3) + (bit_count & 7 ? 1 : 0); } static void set_all_true (uint8_t * array, size_t bit_count) { const uint8_t val = 0xFF; const size_t n = get_bytes_needed (bit_count); if (n > 0) { memset (array, val, n-1); array[n-1] = val << (n*8 - bit_count); } } void* tr_bitfieldGetRaw (const tr_bitfield * b, size_t * byte_count) { const size_t n = get_bytes_needed (b->bit_count); uint8_t * bits = tr_new0 (uint8_t, n); assert (b->bit_count > 0); if (b->alloc_count) { assert (b->alloc_count <= n); memcpy (bits, b->bits, b->alloc_count); } else if (tr_bitfieldHasAll (b)) { set_all_true (bits, b->bit_count); } *byte_count = n; return bits; } static void tr_bitfieldEnsureBitsAlloced (tr_bitfield * b, size_t n) { size_t bytes_needed; const bool has_all = tr_bitfieldHasAll (b); if (has_all) bytes_needed = get_bytes_needed (MAX (n, b->true_count)); else bytes_needed = get_bytes_needed (n); if (b->alloc_count < bytes_needed) { b->bits = tr_renew (uint8_t, b->bits, bytes_needed); memset (b->bits + b->alloc_count, 0, bytes_needed - b->alloc_count); b->alloc_count = bytes_needed; if (has_all) set_all_true (b->bits, b->true_count); } } static bool tr_bitfieldEnsureNthBitAlloced (tr_bitfield * b, size_t nth) { /* count is zero-based, so we need to allocate nth+1 bits before setting the nth */ if (nth == SIZE_MAX) return false; tr_bitfieldEnsureBitsAlloced (b, nth + 1); return true; } static void tr_bitfieldFreeArray (tr_bitfield * b) { tr_free (b->bits); b->bits = NULL; b->alloc_count = 0; } static void tr_bitfieldSetTrueCount (tr_bitfield * b, size_t n) { assert (b->bit_count == 0 || n <= b->bit_count); b->true_count = n; if (tr_bitfieldHasAll (b) || tr_bitfieldHasNone (b)) tr_bitfieldFreeArray (b); assert (tr_bitfieldIsValid (b)); } static void tr_bitfieldRebuildTrueCount (tr_bitfield * b) { tr_bitfieldSetTrueCount (b, countArray (b)); } static void tr_bitfieldIncTrueCount (tr_bitfield * b, size_t i) { assert (b->bit_count == 0 || i <= b->bit_count); assert (b->bit_count == 0 || b->true_count <= b->bit_count - i); tr_bitfieldSetTrueCount (b, b->true_count + i); } static void tr_bitfieldDecTrueCount (tr_bitfield * b, size_t i) { assert (b->bit_count == 0 || i <= b->bit_count); assert (b->bit_count == 0 || b->true_count >= i); tr_bitfieldSetTrueCount (b, b->true_count - i); } /**** ***** ****/ void tr_bitfieldConstruct (tr_bitfield * b, size_t bit_count) { b->bit_count = bit_count; b->true_count = 0; b->bits = NULL; b->alloc_count = 0; b->have_all_hint = false; b->have_none_hint = false; assert (tr_bitfieldIsValid (b)); } void tr_bitfieldSetHasNone (tr_bitfield * b) { tr_bitfieldFreeArray (b); b->true_count = 0; b->have_all_hint = false; b->have_none_hint = true; assert (tr_bitfieldIsValid (b)); } void tr_bitfieldSetHasAll (tr_bitfield * b) { tr_bitfieldFreeArray (b); b->true_count = b->bit_count; b->have_all_hint = true; b->have_none_hint = false; assert (tr_bitfieldIsValid (b)); } void tr_bitfieldSetFromBitfield (tr_bitfield * b, const tr_bitfield * src) { if (tr_bitfieldHasAll (src)) tr_bitfieldSetHasAll (b); else if (tr_bitfieldHasNone (src)) tr_bitfieldSetHasNone (b); else tr_bitfieldSetRaw (b, src->bits, src->alloc_count, true); } void tr_bitfieldSetRaw (tr_bitfield * b, const void * bits, size_t byte_count, bool bounded) { tr_bitfieldFreeArray (b); b->true_count = 0; if (bounded) byte_count = MIN (byte_count, get_bytes_needed (b->bit_count)); b->bits = tr_memdup (bits, byte_count); b->alloc_count = byte_count; if (bounded) { /* ensure the excess bits are set to '0' */ const int excess_bit_count = byte_count*8 - b->bit_count; assert (excess_bit_count >= 0); assert (excess_bit_count <= 7); if (excess_bit_count) b->bits[b->alloc_count-1] &= ((0xff) << excess_bit_count); } tr_bitfieldRebuildTrueCount (b); } void tr_bitfieldSetFromFlags (tr_bitfield * b, const bool * flags, size_t n) { size_t i; size_t trueCount = 0; tr_bitfieldFreeArray (b); tr_bitfieldEnsureBitsAlloced (b, n); for (i=0; ibits[i >> 3u] |= (0x80 >> (i & 7u)); } } tr_bitfieldSetTrueCount (b, trueCount); } void tr_bitfieldAdd (tr_bitfield * b, size_t nth) { if (!tr_bitfieldHas (b, nth) && tr_bitfieldEnsureNthBitAlloced (b, nth)) { b->bits[nth >> 3u] |= (0x80 >> (nth & 7u)); tr_bitfieldIncTrueCount (b, 1); } } /* Sets bit range [begin, end) to 1 */ void tr_bitfieldAddRange (tr_bitfield * b, size_t begin, size_t end) { size_t sb, eb; unsigned char sm, em; const size_t diff = (end-begin) - tr_bitfieldCountRange (b, begin, end); if (diff == 0) return; end--; if ((end >= b->bit_count) || (begin > end)) return; sb = begin >> 3; sm = ~ (0xff << (8 - (begin & 7))); eb = end >> 3; em = 0xff << (7 - (end & 7)); if (!tr_bitfieldEnsureNthBitAlloced (b, end)) return; if (sb == eb) { b->bits[sb] |= (sm & em); } else { b->bits[sb] |= sm; b->bits[eb] |= em; if (++sb < eb) memset (b->bits + sb, 0xff, eb - sb); } tr_bitfieldIncTrueCount (b, diff); } void tr_bitfieldRem (tr_bitfield * b, size_t nth) { assert (tr_bitfieldIsValid (b)); if (tr_bitfieldHas (b, nth) && tr_bitfieldEnsureNthBitAlloced (b, nth)) { b->bits[nth >> 3u] &= (0xff7f >> (nth & 7u)); tr_bitfieldDecTrueCount (b, 1); } } /* Clears bit range [begin, end) to 0 */ void tr_bitfieldRemRange (tr_bitfield * b, size_t begin, size_t end) { size_t sb, eb; unsigned char sm, em; const size_t diff = tr_bitfieldCountRange (b, begin, end); if (!diff) return; end--; if ((end >= b->bit_count) || (begin > end)) return; sb = begin >> 3; sm = 0xff << (8 - (begin & 7)); eb = end >> 3; em = ~ (0xff << (7 - (end & 7))); if (!tr_bitfieldEnsureNthBitAlloced (b, end)) return; if (sb == eb) { b->bits[sb] &= (sm | em); } else { b->bits[sb] &= sm; b->bits[eb] &= em; if (++sb < eb) memset (b->bits + sb, 0, eb - sb); } tr_bitfieldDecTrueCount (b, diff); } transmission-2.92/libtransmission/PaxHeaders.4960/ConvertUTF.h0000644000000000000000000000013212640354044021250 xustar0030 mtime=1451350052.455150475 30 atime=1451350052.455150475 30 ctime=1457295919.588800912 transmission-2.92/libtransmission/ConvertUTF.h0000644000175000017500000001414412640354044022701 0ustar00mikedldmikedld00000000000000#ifndef CONVERT_UNICODE_H #define CONVERT_UNICODE_H #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif /* * Copyright 2001-2004 Unicode, Inc. * * Disclaimer * * This source code is provided as is by Unicode, Inc. No claims are * made as to fitness for any particular purpose. No warranties of any * kind are expressed or implied. The recipient agrees to determine * applicability of information provided. If this file has been * purchased on magnetic or optical media from Unicode, Inc., the * sole remedy for any claim will be exchange of defective media * within 90 days of receipt. * * Limitations on Rights to Redistribute This Code * * Unicode, Inc. hereby grants the right to freely use the information * supplied in this file in the creation of products supporting the * Unicode Standard, and to make copies of this file in any form * for internal or external distribution as long as this notice * remains attached. */ /* --------------------------------------------------------------------- Conversions between UTF32, UTF-16, and UTF-8. Header file. Several funtions are included here, forming a complete set of conversions between the three formats. UTF-7 is not included here, but is handled in a separate source file. Each of these routines takes pointers to input buffers and output buffers. The input buffers are const. Each routine converts the text between *sourceStart and sourceEnd, putting the result into the buffer between *targetStart and targetEnd. Note: the end pointers are *after* the last item: e.g. * (sourceEnd - 1) is the last item. The return result indicates whether the conversion was successful, and if not, whether the problem was in the source or target buffers. (Only the first encountered problem is indicated.) After the conversion, *sourceStart and *targetStart are both updated to point to the end of last text successfully converted in the respective buffers. Input parameters: sourceStart - pointer to a pointer to the source buffer. The contents of this are modified on return so that it points at the next thing to be converted. targetStart - similarly, pointer to pointer to the target buffer. sourceEnd, targetEnd - respectively pointers to the ends of the two buffers, for overflow checking only. These conversion functions take a ConversionFlags argument. When this flag is set to strict, both irregular sequences and isolated surrogates will cause an error. When the flag is set to lenient, both irregular sequences and isolated surrogates are converted. Whether the flag is strict or lenient, all illegal sequences will cause an error return. This includes sequences such as: , , or in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code must check for illegal sequences. When the flag is set to lenient, characters over 0x10FFFF are converted to the replacement character; otherwise (when the flag is set to strict) they constitute an error. Output parameters: The value "sourceIllegal" is returned from some routines if the input sequence is malformed. When "sourceIllegal" is returned, the source value will point to the illegal value that caused the problem. E.g., in UTF-8 when a sequence is malformed, it points to the start of the malformed sequence. Author: Mark E. Davis, 1994. Rev History: Rick McGowan, fixes & updates May 2001. Fixes & updates, Sept 2001. ------------------------------------------------------------------------ */ /* --------------------------------------------------------------------- The following 4 definitions are compiler-specific. The C standard does not guarantee that wchar_t has at least 16 bits, so wchar_t is no less portable than unsigned short! All should be unsigned values to avoid sign extension during bit mask & shift operations. ------------------------------------------------------------------------ */ typedef unsigned long UTF32; /* at least 32 bits */ typedef unsigned short UTF16; /* at least 16 bits */ typedef unsigned char UTF8; /* typically 8 bits */ typedef unsigned char Boolean; /* 0 or 1 */ /* Some fundamental constants */ #define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD #define UNI_MAX_BMP (UTF32)0x0000FFFF #define UNI_MAX_UTF16 (UTF32)0x0010FFFF #define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF #define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF typedef enum { conversionOK, /* conversion successful */ sourceExhausted, /* partial character in source, but hit end */ targetExhausted, /* insuff. room in target for conversion */ sourceIllegal /* source sequence is illegal/malformed */ } ConversionResult; typedef enum { strictConversion = 0, lenientConversion } ConversionFlags; /* This is for C++ and does no harm in C */ #ifdef __cplusplus extern "C" { #endif ConversionResult ConvertUTF8toUTF16 ( const UTF8** sourceStart, const UTF8* sourceEnd, UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); ConversionResult ConvertUTF16toUTF8 ( const UTF16** sourceStart, const UTF16* sourceEnd, UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); ConversionResult ConvertUTF8toUTF32 ( const UTF8** sourceStart, const UTF8* sourceEnd, UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); ConversionResult ConvertUTF32toUTF8 ( const UTF32** sourceStart, const UTF32* sourceEnd, UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); ConversionResult ConvertUTF16toUTF32 ( const UTF16** sourceStart, const UTF16* sourceEnd, UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); ConversionResult ConvertUTF32toUTF16 ( const UTF32** sourceStart, const UTF32* sourceEnd, UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); Boolean isLegalUTF8Sequence (const UTF8 *source, const UTF8 *sourceEnd); /* intended to work the same as g_utf8_validate */ Boolean tr_utf8_validate (const char * str, size_t max_len, const char ** end); #ifdef __cplusplus } #endif /* --------------------------------------------------------------------- */ #endif /* CONVERT_UNICODE_H */ transmission-2.92/libtransmission/PaxHeaders.4960/stats.c0000644000000000000000000000013212512316670020403 xustar0030 mtime=1428790712.700181157 30 atime=1428790712.700181157 30 ctime=1457295920.141810316 transmission-2.92/libtransmission/stats.c0000644000175000017500000001353512512316670022037 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: stats.c 14491 2015-04-11 10:51:59Z mikedld $ */ #include "transmission.h" #include "session.h" #include "log.h" #include "platform.h" /* tr_sessionGetConfigDir () */ #include "stats.h" #include "utils.h" /* tr_buildPath */ #include "variant.h" /*** **** ***/ static const struct tr_session_stats STATS_INIT = { 0.0f, 0, 0, 0, 0, 0 }; /** @brief Opaque, per-session data structure for bandwidth use statistics */ struct tr_stats_handle { tr_session_stats single; tr_session_stats old; time_t startTime; bool isDirty; }; static char* getOldFilename (const tr_session * session) { return tr_buildPath (tr_sessionGetConfigDir (session), "stats.benc", NULL); } static char* getFilename (const tr_session * session) { return tr_buildPath (tr_sessionGetConfigDir (session), "stats.json", NULL); } static void loadCumulativeStats (const tr_session * session, tr_session_stats * setme) { tr_variant top; char * filename; bool loaded = false; filename = getFilename (session); loaded = tr_variantFromFile (&top, TR_VARIANT_FMT_JSON, filename, NULL); tr_free (filename); if (!loaded) { filename = getOldFilename (session); loaded = tr_variantFromFile (&top, TR_VARIANT_FMT_BENC, filename, NULL); tr_free (filename); } if (loaded) { int64_t i; if (tr_variantDictFindInt (&top, TR_KEY_downloaded_bytes, &i)) setme->downloadedBytes = (uint64_t) i; if (tr_variantDictFindInt (&top, TR_KEY_files_added, &i)) setme->filesAdded = (uint64_t) i; if (tr_variantDictFindInt (&top, TR_KEY_seconds_active, &i)) setme->secondsActive = (uint64_t) i; if (tr_variantDictFindInt (&top, TR_KEY_session_count, &i)) setme->sessionCount = (uint64_t) i; if (tr_variantDictFindInt (&top, TR_KEY_uploaded_bytes, &i)) setme->uploadedBytes = (uint64_t) i; tr_variantFree (&top); } } static void saveCumulativeStats (const tr_session * session, const tr_session_stats * s) { char * filename; tr_variant top; tr_variantInitDict (&top, 5); tr_variantDictAddInt (&top, TR_KEY_downloaded_bytes, s->downloadedBytes); tr_variantDictAddInt (&top, TR_KEY_files_added, s->filesAdded); tr_variantDictAddInt (&top, TR_KEY_seconds_active, s->secondsActive); tr_variantDictAddInt (&top, TR_KEY_session_count, s->sessionCount); tr_variantDictAddInt (&top, TR_KEY_uploaded_bytes, s->uploadedBytes); filename = getFilename (session); tr_logAddDeep (__FILE__, __LINE__, NULL, "Saving stats to \"%s\"", filename); tr_variantToFile (&top, TR_VARIANT_FMT_JSON, filename); tr_free (filename); tr_variantFree (&top); } /*** **** ***/ void tr_statsInit (tr_session * session) { struct tr_stats_handle * stats = tr_new0 (struct tr_stats_handle, 1); loadCumulativeStats (session, &stats->old); stats->single.sessionCount = 1; stats->startTime = tr_time (); session->sessionStats = stats; } static struct tr_stats_handle * getStats (const tr_session * session) { return session ? session->sessionStats : NULL; } void tr_statsSaveDirty (tr_session * session) { struct tr_stats_handle * h = getStats (session); if ((h != NULL) && h->isDirty) { tr_session_stats cumulative = STATS_INIT; tr_sessionGetCumulativeStats (session, &cumulative); saveCumulativeStats (session, &cumulative); h->isDirty = false; } } void tr_statsClose (tr_session * session) { tr_statsSaveDirty (session); tr_free (session->sessionStats); session->sessionStats = NULL; } /*** **** ***/ static void updateRatio (tr_session_stats * setme) { setme->ratio = tr_getRatio (setme->uploadedBytes, setme->downloadedBytes); } static void addStats (tr_session_stats * setme, const tr_session_stats * a, const tr_session_stats * b) { setme->uploadedBytes = a->uploadedBytes + b->uploadedBytes; setme->downloadedBytes = a->downloadedBytes + b->downloadedBytes; setme->filesAdded = a->filesAdded + b->filesAdded; setme->sessionCount = a->sessionCount + b->sessionCount; setme->secondsActive = a->secondsActive + b->secondsActive; updateRatio (setme); } void tr_sessionGetStats (const tr_session * session, tr_session_stats * setme) { const struct tr_stats_handle * stats = getStats (session); if (stats) { *setme = stats->single; setme->secondsActive = tr_time () - stats->startTime; updateRatio (setme); } } void tr_sessionGetCumulativeStats (const tr_session * session, tr_session_stats * setme) { const struct tr_stats_handle * stats = getStats (session); tr_session_stats current = STATS_INIT; if (stats) { tr_sessionGetStats (session, ¤t); addStats (setme, &stats->old, ¤t); } } void tr_sessionClearStats (tr_session * session) { tr_session_stats zero; zero.uploadedBytes = 0; zero.downloadedBytes = 0; zero.ratio = TR_RATIO_NA; zero.filesAdded = 0; zero.sessionCount = 0; zero.secondsActive = 0; session->sessionStats->isDirty = true; session->sessionStats->single = session->sessionStats->old = zero; session->sessionStats->startTime = tr_time (); } /** *** **/ void tr_statsAddUploaded (tr_session * session, uint32_t bytes) { struct tr_stats_handle * s; if ((s = getStats (session))) { s->single.uploadedBytes += bytes; s->isDirty = true; } } void tr_statsAddDownloaded (tr_session * session, uint32_t bytes) { struct tr_stats_handle * s; if ((s = getStats (session))) { s->single.downloadedBytes += bytes; s->isDirty = true; } } void tr_statsFileCreated (tr_session * session) { struct tr_stats_handle * s; if ((s = getStats (session))) s->single.filesAdded++; } transmission-2.92/libtransmission/PaxHeaders.4960/crypto-utils-fallback.c0000644000000000000000000000013212505250244023454 xustar0030 mtime=1427460260.475244102 30 atime=1427460260.475244102 30 ctime=1457295919.988807714 transmission-2.92/libtransmission/crypto-utils-fallback.c0000644000175000017500000000377612505250244025116 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: crypto-utils-fallback.c 14370 2014-12-11 05:11:02Z mikedld $ */ /* This file is designed specifically to be included by other source files to implement missing (or duplicate) functionality without exposing internal details in header files. */ #include #include "transmission.h" #include "crypto-utils.h" #include "utils.h" /*** **** ***/ #ifdef TR_CRYPTO_DH_SECRET_FALLBACK /* Most Diffie-Hellman backends handle secret key in the very same way: by manually allocating memory for it and storing the value in plain form. */ struct tr_dh_secret { size_t key_length; uint8_t key[]; }; static struct tr_dh_secret * tr_dh_secret_new (size_t key_length) { struct tr_dh_secret * handle = tr_malloc (sizeof (struct tr_dh_secret) + key_length); handle->key_length = key_length; return handle; } static void tr_dh_secret_align (struct tr_dh_secret * handle, size_t current_key_length) { tr_dh_align_key (handle->key, current_key_length, handle->key_length); } bool tr_dh_secret_derive (tr_dh_secret_t raw_handle, const void * prepend_data, size_t prepend_data_size, const void * append_data, size_t append_data_size, uint8_t * hash) { struct tr_dh_secret * handle = raw_handle; assert (handle != NULL); assert (hash != NULL); return tr_sha1 (hash, prepend_data == NULL ? "" : prepend_data, prepend_data == NULL ? 0 : (int) prepend_data_size, handle->key, (int) handle->key_length, append_data, append_data == NULL ? 0 : (int) append_data_size, NULL); } void tr_dh_secret_free (tr_dh_secret_t handle) { tr_free (handle); } #endif /* TR_CRYPTO_DH_SECRET_FALLBACK */ transmission-2.92/libtransmission/PaxHeaders.4960/blocklist.h0000644000000000000000000000013212442116602021233 xustar0030 mtime=1418239362.915222306 30 atime=1418239362.915222306 30 ctime=1457295919.575800691 transmission-2.92/libtransmission/blocklist.h0000644000175000017500000000274112442116602022664 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: blocklist.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_BLOCKLIST_H #define TR_BLOCKLIST_H struct tr_address; typedef struct tr_blocklistFile tr_blocklistFile; tr_blocklistFile * tr_blocklistFileNew (const char * filename, bool isEnabled); bool tr_blocklistFileExists (const tr_blocklistFile * b); const char * tr_blocklistFileGetFilename (const tr_blocklistFile * b); int tr_blocklistFileGetRuleCount (const tr_blocklistFile * b); void tr_blocklistFileFree (tr_blocklistFile * b); bool tr_blocklistFileIsEnabled (tr_blocklistFile * b); void tr_blocklistFileSetEnabled (tr_blocklistFile * b, bool isEnabled); bool tr_blocklistFileHasAddress (tr_blocklistFile * b, const struct tr_address * addr); int tr_blocklistFileSetContent (tr_blocklistFile * b, const char * filename); #endif transmission-2.92/libtransmission/PaxHeaders.4960/log.h0000644000000000000000000000013212662757235020047 xustar0030 mtime=1456201373.067756622 30 atime=1456201373.067756622 30 ctime=1457295919.684802544 transmission-2.92/libtransmission/log.h0000644000175000017500000000631712662757235021503 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: log.h 14476 2015-03-15 11:43:32Z mikedld $ */ #ifndef TR_LOG_H #define TR_LOG_H 1 #include /* size_t */ #include "file.h" /* tr_sys_file_t */ #include "utils.h" /* TR_GNUC_PRINTF, TR_GNUC_NONNULL */ #ifdef __cplusplus extern "C" { #endif #define TR_LOG_MAX_QUEUE_LENGTH 10000 tr_log_level tr_logGetLevel (void); static inline bool tr_logLevelIsActive (tr_log_level level) { return tr_logGetLevel () >= level; } void tr_logAddMessage (const char * file, int line, tr_log_level level, const char * torrent, const char * fmt, ...) TR_GNUC_PRINTF (5, 6); #define tr_logAddNamedError(n, ...) \ do\ { \ if (tr_logLevelIsActive (TR_LOG_ERROR)) \ tr_logAddMessage (__FILE__, __LINE__, TR_LOG_ERROR, n, __VA_ARGS__); \ } \ while (0) #define tr_logAddNamedInfo(n, ...) \ do \ { \ if (tr_logLevelIsActive (TR_LOG_INFO)) \ tr_logAddMessage (__FILE__, __LINE__, TR_LOG_INFO, n, __VA_ARGS__); \ } \ while (0) #define tr_logAddNamedDbg(n, ...) \ do \ { \ if (tr_logLevelIsActive (TR_LOG_DEBUG)) \ tr_logAddMessage (__FILE__, __LINE__, TR_LOG_DEBUG, n, __VA_ARGS__); \ } \ while (0) #define tr_logAddTorErr(tor, ...) \ do \ { \ if (tr_logLevelIsActive (TR_LOG_ERROR)) \ tr_logAddMessage (__FILE__, __LINE__, TR_LOG_ERROR, tr_torrentName (tor), __VA_ARGS__); \ } \ while (0) #define tr_logAddTorInfo(tor, ...) \ do \ { \ if (tr_logLevelIsActive (TR_LOG_INFO)) \ tr_logAddMessage (__FILE__, __LINE__, TR_LOG_INFO, tr_torrentName (tor), __VA_ARGS__); \ } \ while (0) #define tr_logAddTorDbg(tor, ...) \ do \ { \ if (tr_logLevelIsActive (TR_LOG_DEBUG)) \ tr_logAddMessage (__FILE__, __LINE__, TR_LOG_DEBUG, tr_torrentName (tor), __VA_ARGS__); \ } \ while (0) #define tr_logAddError(...) \ do \ { \ if (tr_logLevelIsActive (TR_LOG_ERROR)) \ tr_logAddMessage (__FILE__, __LINE__, TR_LOG_ERROR, NULL, __VA_ARGS__); \ } \ while (0) #define tr_logAddInfo(...) \ do \ { \ if (tr_logLevelIsActive (TR_LOG_INFO)) \ tr_logAddMessage (__FILE__, __LINE__, TR_LOG_INFO, NULL, __VA_ARGS__); \ } \ while (0) #define tr_logAddDebug(...) \ do \ { \ if (tr_logLevelIsActive (TR_LOG_DEBUG)) \ tr_logAddMessage (__FILE__, __LINE__, TR_LOG_DEBUG, NULL, __VA_ARGS__); \ } \ while (0) tr_sys_file_t tr_logGetFile (void); /** @brief return true if deep logging has been enabled by the user; false otherwise */ bool tr_logGetDeepEnabled (void); void tr_logAddDeep (const char * file, int line, const char * name, const char * fmt, ...) TR_GNUC_PRINTF (4, 5) TR_GNUC_NONNULL (1,4); /** @brief set the buffer with the current time formatted for deep logging. */ char* tr_logGetTimeStr (char * buf, size_t buflen) TR_GNUC_NONNULL (1); #ifdef __cplusplus } #endif /** @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/history-test.c0000644000000000000000000000013212442116602021716 xustar0030 mtime=1418239362.941222752 30 atime=1418239362.940222735 30 ctime=1457295920.266812441 transmission-2.92/libtransmission/history-test.c0000644000175000017500000000172612442116602023351 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: history-test.c 14241 2014-01-21 03:10:30Z jordan $ */ #include /* memset () */ #include "transmission.h" #include "history.h" #include "libtransmission-test.h" static int test1 (void) { tr_recentHistory h; memset (&h, 0, sizeof (tr_recentHistory)); tr_historyAdd (&h, 10000, 1); check_int_eq (0, (int)tr_historyGet (&h, 12000, 1000)); check_int_eq (1, (int)tr_historyGet (&h, 12000, 3000)); check_int_eq (1, (int)tr_historyGet (&h, 12000, 5000)); tr_historyAdd (&h, 20000, 1); check_int_eq (0, (int)tr_historyGet (&h, 22000, 1000)); check_int_eq (1, (int)tr_historyGet (&h, 22000, 3000)); check_int_eq (2, (int)tr_historyGet (&h, 22000, 15000)); check_int_eq (2, (int)tr_historyGet (&h, 22000, 20000)); return 0; } MAIN_SINGLE_TEST (test1) transmission-2.92/libtransmission/PaxHeaders.4960/inout.h0000644000000000000000000000013212442116602020403 xustar0030 mtime=1418239362.927222512 30 atime=1418239362.927222512 30 ctime=1457295919.654802034 transmission-2.92/libtransmission/inout.h0000644000175000017500000000351612442116602022035 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: inout.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_IO_H #define TR_IO_H 1 struct tr_torrent; /** * @addtogroup file_io File IO * @{ */ /** * Reads the block specified by the piece index, offset, and length. * @return 0 on success, or an errno value on failure. */ int tr_ioRead (struct tr_torrent * tor, tr_piece_index_t pieceIndex, uint32_t offset, uint32_t len, uint8_t * setme); int tr_ioPrefetch (tr_torrent * tor, tr_piece_index_t pieceIndex, uint32_t begin, uint32_t len); /** * Writes the block specified by the piece index, offset, and length. * @return 0 on success, or an errno value on failure. */ int tr_ioWrite (struct tr_torrent * tor, tr_piece_index_t pieceIndex, uint32_t offset, uint32_t len, const uint8_t * writeme); /** * @brief Test to see if the piece matches its metainfo's SHA1 checksum. */ bool tr_ioTestPiece (tr_torrent * tor, tr_piece_index_t piece); /** * Converts a piece index + offset into a file index + offset. */ void tr_ioFindFileLocation (const tr_torrent * tor, tr_piece_index_t pieceIndex, uint32_t pieceOffset, tr_file_index_t * fileIndex, uint64_t * fileOffset); /* @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/error.h0000644000000000000000000000013212505250244020377 xustar0030 mtime=1427460260.467243959 30 atime=1427460260.467243959 30 ctime=1457295919.610801286 transmission-2.92/libtransmission/error.h0000644000175000017500000001312312505250244022024 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: error.h 14369 2014-12-10 18:58:12Z mikedld $ */ #ifndef TR_ERROR_H #define TR_ERROR_H #include #ifdef __cplusplus extern "C" { #endif #ifndef TR_GNUC_PRINTF #ifdef __GNUC__ #define TR_GNUC_PRINTF(fmt, args) __attribute__ ((format (printf, fmt, args))) #else #define TR_GNUC_PRINTF(fmt, args) #endif #endif /** * @addtogroup error Error reporting * @{ */ /** @brief Structure holding error information. */ typedef struct tr_error { /** @brief Error code, platform-specific */ int code; /** @brief Error message */ char * message; } tr_error; /** * @brief Create new error object using `printf`-style formatting. * * @param[in] code Error code (platform-specific). * @param[in] message_format Error message format string. * @param[in] ... Format arguments. * * @return Newly allocated error object on success, `NULL` otherwise. */ tr_error * tr_error_new (int code, const char * message_format, ...) TR_GNUC_PRINTF (2, 3); /** * @brief Create new error object using literal error message. * * @param[in] code Error code (platform-specific). * @param[in] message Error message. * * @return Newly allocated error object on success, `NULL` otherwise. */ tr_error * tr_error_new_literal (int code, const char * message); /** * @brief Create new error object using `vprintf`-style formatting. * * @param[in] code Error code (platform-specific). * @param[in] message_format Error message format string. * @param[in] args Format arguments. * * @return Newly allocated error object on success, `NULL` otherwise. */ tr_error * tr_error_new_valist (int code, const char * message_format, va_list args); /** * @brief Free memory used by error object. * * @param[in] error Error object to be freed. */ void tr_error_free (tr_error * error); /** * @brief Create and set new error object using `printf`-style formatting. * * If passed pointer to error object is `NULL`, do nothing. * * @param[in,out] error Pointer to error object to be set. * @param[in] code Error code (platform-specific). * @param[in] message_format Error message format string. * @param[in] ... Format arguments. */ void tr_error_set (tr_error ** error, int code, const char * message_format, ...) TR_GNUC_PRINTF (3, 4); /** * @brief Create and set new error object using literal error message. * * If passed pointer to error object is `NULL`, do nothing. * * @param[in,out] error Pointer to error object to be set. * @param[in] code Error code (platform-specific). * @param[in] message Error message. */ void tr_error_set_literal (tr_error ** error, int code, const char * message); /** * @brief Propagate existing error object upwards. * * If passed pointer to new error object is not `NULL`, copy old error object to * new error object and free old error object. Otherwise, just free old error * object. * * @param[in,out] new_error Pointer to error object to be set. * @param[in,out] old_error Error object to be propagated. Cleared on return. */ void tr_error_propagate (tr_error ** new_error, tr_error ** old_error); /** * @brief Clear error object. * * Free error object being pointed and set pointer to `NULL`. If passed pointer * is `NULL`, do nothing. * * @param[in,out] error Pointer to error object to be cleared. */ void tr_error_clear (tr_error ** error); /** * @brief Prefix message of exising error object. * * If passed pointer to error object is not `NULL`, prefix its message with * `printf`-style formatted text. Otherwise, do nothing. * * @param[in,out] error Pointer to error object to be set. * @param[in] prefix_format Prefix format string. * @param[in] ... Format arguments. */ void tr_error_prefix (tr_error ** error, const char * prefix_format, ...) TR_GNUC_PRINTF (2, 3); /** * @brief Prefix message and propagate existing error object upwards. * * If passed pointer to new error object is not `NULL`, copy old error object to * new error object, prefix its message with `printf`-style formatted text, and * free old error object. Otherwise, just free old error object. * * @param[in,out] new_error Pointer to error object to be set. * @param[in,out] old_error Error object to be propagated. Cleared on return. * @param[in] prefix_format Prefix format string. * @param[in] ... Format arguments. */ void tr_error_propagate_prefixed (tr_error ** new_error, tr_error ** old_error, const char * prefix_format, ...) TR_GNUC_PRINTF (3, 4); /** @} */ #ifdef __cplusplus } #endif #endif transmission-2.92/libtransmission/PaxHeaders.4960/quark-test.c0000644000000000000000000000013212644245522021350 xustar0030 mtime=1452362578.741698854 30 atime=1452362578.741698854 30 ctime=1457295920.272812543 transmission-2.92/libtransmission/quark-test.c0000644000175000017500000000206512644245522023000 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: quark-test.c 14669 2016-01-08 11:12:22Z mikedld $ */ #include /* strlen() */ #include "transmission.h" #include "quark.h" #include "libtransmission-test.h" static int test_static_quarks (void) { int i; for (i=0; i #include #include #include #include #include #include #include "transmission.h" #include "crypto-utils.h" #include "log.h" #include "utils.h" #define TR_CRYPTO_DH_SECRET_FALLBACK #include "crypto-utils-fallback.c" /*** **** ***/ #define MY_NAME "tr_crypto_utils" static void log_openssl_error (const char * file, int line) { const unsigned long error_code = ERR_get_error (); if (tr_logLevelIsActive (TR_LOG_ERROR)) { char buf[512]; #ifndef TR_LIGHTWEIGHT static bool strings_loaded = false; if (!strings_loaded) { ERR_load_crypto_strings (); strings_loaded = true; } #endif ERR_error_string_n (error_code, buf, sizeof (buf)); tr_logAddMessage (file, line, TR_LOG_ERROR, MY_NAME, "OpenSSL error: %s", buf); } } #define log_error() log_openssl_error(__FILE__, __LINE__) static bool check_openssl_result (int result, int expected_result, bool expected_equal, const char * file, int line) { const bool ret = (result == expected_result) == expected_equal; if (!ret) log_openssl_error (file, line); return ret; } #define check_result(result) check_openssl_result ((result), 1, true, __FILE__, __LINE__) #define check_result_eq(result, x_result) check_openssl_result ((result), (x_result), true, __FILE__, __LINE__) #define check_result_neq(result, x_result) check_openssl_result ((result), (x_result), false, __FILE__, __LINE__) static bool check_openssl_pointer (void * pointer, const char * file, int line) { const bool ret = pointer != NULL; if (!ret) log_openssl_error (file, line); return ret; } #define check_pointer(pointer) check_openssl_pointer ((pointer), __FILE__, __LINE__) /*** **** ***/ tr_sha1_ctx_t tr_sha1_init (void) { EVP_MD_CTX * handle = EVP_MD_CTX_create (); if (check_result (EVP_DigestInit_ex (handle, EVP_sha1 (), NULL))) return handle; EVP_MD_CTX_destroy (handle); return NULL; } bool tr_sha1_update (tr_sha1_ctx_t handle, const void * data, size_t data_length) { assert (handle != NULL); if (data_length == 0) return true; assert (data != NULL); return check_result (EVP_DigestUpdate (handle, data, data_length)); } bool tr_sha1_final (tr_sha1_ctx_t handle, uint8_t * hash) { bool ret = true; if (hash != NULL) { unsigned int hash_length; assert (handle != NULL); ret = check_result (EVP_DigestFinal_ex (handle, hash, &hash_length)); assert (!ret || hash_length == SHA_DIGEST_LENGTH); } EVP_MD_CTX_destroy (handle); return ret; } /*** **** ***/ #if OPENSSL_VERSION_NUMBER < 0x0090802fL static EVP_CIPHER_CTX * openssl_evp_cipher_context_new (void) { EVP_CIPHER_CTX * handle = tr_new (EVP_CIPHER_CTX, 1); if (handle != NULL) EVP_CIPHER_CTX_init (handle); return handle; } static void openssl_evp_cipher_context_free (EVP_CIPHER_CTX * handle) { if (handle == NULL) return; EVP_CIPHER_CTX_cleanup (handle); tr_free (handle); } #define EVP_CIPHER_CTX_new() openssl_evp_cipher_context_new () #define EVP_CIPHER_CTX_free(x) openssl_evp_cipher_context_free ((x)) #endif tr_rc4_ctx_t tr_rc4_new (void) { EVP_CIPHER_CTX * handle = EVP_CIPHER_CTX_new (); if (check_result (EVP_CipherInit_ex (handle, EVP_rc4 (), NULL, NULL, NULL, -1))) return handle; EVP_CIPHER_CTX_free (handle); return NULL; } void tr_rc4_free (tr_rc4_ctx_t handle) { if (handle == NULL) return; EVP_CIPHER_CTX_free (handle); } void tr_rc4_set_key (tr_rc4_ctx_t handle, const uint8_t * key, size_t key_length) { assert (handle != NULL); assert (key != NULL); if (!check_result (EVP_CIPHER_CTX_set_key_length (handle, key_length))) return; check_result (EVP_CipherInit_ex (handle, NULL, NULL, key, NULL, -1)); } void tr_rc4_process (tr_rc4_ctx_t handle, const void * input, void * output, size_t length) { int output_length; assert (handle != NULL); if (length == 0) return; assert (input != NULL); assert (output != NULL); check_result (EVP_CipherUpdate (handle, output, &output_length, input, length)); } /*** **** ***/ tr_dh_ctx_t tr_dh_new (const uint8_t * prime_num, size_t prime_num_length, const uint8_t * generator_num, size_t generator_num_length) { DH * handle = DH_new (); assert (prime_num != NULL); assert (generator_num != NULL); if (!check_pointer (handle->p = BN_bin2bn (prime_num, prime_num_length, NULL)) || !check_pointer (handle->g = BN_bin2bn (generator_num, generator_num_length, NULL))) { DH_free (handle); handle = NULL; } return handle; } void tr_dh_free (tr_dh_ctx_t handle) { if (handle == NULL) return; DH_free (handle); } bool tr_dh_make_key (tr_dh_ctx_t raw_handle, size_t private_key_length, uint8_t * public_key, size_t * public_key_length) { DH * handle = raw_handle; int dh_size, my_public_key_length; assert (handle != NULL); assert (public_key != NULL); handle->length = private_key_length * 8; if (!check_result (DH_generate_key (handle))) return false; my_public_key_length = BN_bn2bin (handle->pub_key, public_key); dh_size = DH_size (handle); tr_dh_align_key (public_key, my_public_key_length, dh_size); if (public_key_length != NULL) *public_key_length = dh_size; return true; } tr_dh_secret_t tr_dh_agree (tr_dh_ctx_t handle, const uint8_t * other_public_key, size_t other_public_key_length) { struct tr_dh_secret * ret; int dh_size, secret_key_length; BIGNUM * other_key; assert (handle != NULL); assert (other_public_key != NULL); if (!check_pointer (other_key = BN_bin2bn (other_public_key, other_public_key_length, NULL))) return NULL; dh_size = DH_size (handle); ret = tr_dh_secret_new (dh_size); secret_key_length = DH_compute_key (ret->key, other_key, handle); if (check_result_neq (secret_key_length, -1)) { tr_dh_secret_align (ret, secret_key_length); } else { tr_dh_secret_free (ret); ret = NULL; } BN_free (other_key); return ret; } /*** **** ***/ bool tr_rand_buffer (void * buffer, size_t length) { assert (buffer != NULL); return check_result (RAND_bytes (buffer, (int) length)); } transmission-2.92/libtransmission/PaxHeaders.4960/magnet-test.c0000644000000000000000000000013212442116602021470 xustar0030 mtime=1418239362.936222666 30 atime=1418239362.936222666 30 ctime=1457295920.268812475 transmission-2.92/libtransmission/magnet-test.c0000644000175000017500000000447212442116602023124 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: magnet-test.c 14241 2014-01-21 03:10:30Z jordan $ */ #include "transmission.h" #include "magnet.h" #include "utils.h" #include "libtransmission-test.h" static int test1 (void) { int i; const char * uri; tr_magnet_info * info; const int dec[] = { 210, 53, 64, 16, 163, 202, 74, 222, 91, 116, 39, 187, 9, 58, 98, 163, 137, 159, 243, 129 }; uri = "magnet:?xt=urn:btih:" "d2354010a3ca4ade5b7427bb093a62a3899ff381" "&dn=Display%20Name" "&tr=http%3A%2F%2Ftracker.openbittorrent.com%2Fannounce" "&tr=http%3A%2F%2Ftracker.opentracker.org%2Fannounce" "&ws=http%3A%2F%2Fserver.webseed.org%2Fpath%2Fto%2Ffile"; info = tr_magnetParse (uri); check (info != NULL); check_int_eq (2, info->trackerCount); check_streq (info->trackers[0], "http://tracker.openbittorrent.com/announce"); check_streq (info->trackers[1], "http://tracker.opentracker.org/announce"); check_int_eq (1, info->webseedCount); check_streq ("http://server.webseed.org/path/to/file", info->webseeds[0]); check_streq ("Display Name", info->displayName); for (i=0; i<20; ++i) check (info->hash[i] == dec[i]); tr_magnetFree (info); info = NULL; /* same thing but in base32 encoding */ uri = "magnet:?xt=urn:btih:" "2I2UAEFDZJFN4W3UE65QSOTCUOEZ744B" "&dn=Display%20Name" "&tr=http%3A%2F%2Ftracker.openbittorrent.com%2Fannounce" "&ws=http%3A%2F%2Fserver.webseed.org%2Fpath%2Fto%2Ffile" "&tr=http%3A%2F%2Ftracker.opentracker.org%2Fannounce"; info = tr_magnetParse (uri); check (info != NULL); check_int_eq (2, info->trackerCount); check_streq ("http://tracker.openbittorrent.com/announce", info->trackers[0]); check_streq ("http://tracker.opentracker.org/announce", info->trackers[1]); check_int_eq (1, info->webseedCount); check_streq ("http://server.webseed.org/path/to/file", info->webseeds[0]); check_streq ("Display Name", info->displayName); for (i=0; i<20; ++i) check (info->hash[i] == dec[i]); tr_magnetFree (info); info = NULL; return 0; } MAIN_SINGLE_TEST (test1) transmission-2.92/libtransmission/PaxHeaders.4960/jsonsl.c0000644000000000000000000000013212442116602020550 xustar0030 mtime=1418239362.928222529 30 atime=1418239362.928222529 30 ctime=1457295919.661802153 transmission-2.92/libtransmission/jsonsl.c0000644000175000017500000011500312442116602022175 0ustar00mikedldmikedld00000000000000/* * jsonsl * https://github.com/mnunberg/jsonsl * * Copyright (c) 2012 M. Nunberg, mnunberg@haskalah.org * * 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. */ #include "jsonsl.h" #include #include #ifdef JSONSL_USE_METRICS #define XMETRICS \ X(STRINGY_INSIGNIFICANT) \ X(STRINGY_SLOWPATH) \ X(ALLOWED_WHITESPACE) \ X(QUOTE_FASTPATH) \ X(SPECIAL_FASTPATH) \ X(SPECIAL_WSPOP) \ X(SPECIAL_SLOWPATH) \ X(GENERIC) \ X(STRUCTURAL_TOKEN) \ X(SPECIAL_SWITCHFIRST) \ X(STRINGY_CATCH) \ X(ESCAPES) \ X(TOTAL) \ struct jsonsl_metrics_st { #define X(m) \ unsigned long metric_##m; XMETRICS #undef X }; static struct jsonsl_metrics_st GlobalMetrics = { 0 }; static unsigned long GenericCounter[0x100] = { 0 }; static unsigned long StringyCatchCounter[0x100] = { 0 }; #define INCR_METRIC(m) \ GlobalMetrics.metric_##m++; #define INCR_GENERIC(c) \ INCR_METRIC(GENERIC); \ GenericCounter[c]++; \ #define INCR_STRINGY_CATCH(c) \ INCR_METRIC(STRINGY_CATCH); \ StringyCatchCounter[c]++; JSONSL_API void jsonsl_dump_global_metrics(void) { int ii; printf("JSONSL Metrics:\n"); #define X(m) \ printf("\t%-30s %20lu (%0.2f%%)\n", #m, GlobalMetrics.metric_##m, \ (float)((float)(GlobalMetrics.metric_##m/(float)GlobalMetrics.metric_TOTAL)) * 100); XMETRICS #undef X printf("Generic Characters:\n"); for (ii = 0; ii < 0xff; ii++) { if (GenericCounter[ii]) { printf("\t[ %c ] %lu\n", ii, GenericCounter[ii]); } } printf("Weird string loop\n"); for (ii = 0; ii < 0xff; ii++) { if (StringyCatchCounter[ii]) { printf("\t[ %c ] %lu\n", ii, StringyCatchCounter[ii]); } } } #else #define INCR_METRIC(m) #define INCR_GENERIC(c) #define INCR_STRINGY_CATCH(c) JSONSL_API void jsonsl_dump_global_metrics(void) { } #endif /* JSONSL_USE_METRICS */ #define CASE_DIGITS \ case '1': \ case '2': \ case '3': \ case '4': \ case '5': \ case '6': \ case '7': \ case '8': \ case '9': \ case '0': /** * This table (predeclared) contains characters which are recognized * non-string values. */ static jsonsl_special_t *Special_table; #define extract_special(c) \ Special_table[(unsigned int)(c & 0xff)] /** * This table (predeclared) contains the tokens and other characters * which signal the termination of the non-string values. */ static int *Special_Endings; #define is_special_end(c) \ Special_Endings[(unsigned int)c & 0xff] /** * This table contains entries for the allowed whitespace * as per RFC 4627 */ static int *Allowed_Whitespace; #define is_allowed_whitespace(c) \ (c == ' ' || Allowed_Whitespace[(unsigned int)c & 0xff]) /** * This table contains allowed two-character escapes * as per the RFC */ static int *Allowed_Escapes; #define is_allowed_escape(c) \ Allowed_Escapes[(unsigned int)c & 0xff] JSONSL_API jsonsl_t jsonsl_new(int nlevels) { struct jsonsl_st *jsn = calloc(1, sizeof (*jsn) + ( (nlevels-1) * sizeof (struct jsonsl_state_st) ) ); jsn->levels_max = nlevels; jsn->max_callback_level = -1; jsonsl_reset(jsn); return jsn; } JSONSL_API void jsonsl_reset(jsonsl_t jsn) { unsigned int ii; jsn->tok_last = 0; jsn->can_insert = 1; jsn->pos = 0; jsn->level = 0; jsn->in_escape = 0; jsn->expecting = 0; memset(jsn->stack, 0, (jsn->levels_max * sizeof (struct jsonsl_state_st))); for (ii = 0; ii < jsn->levels_max; ii++) { jsn->stack[ii].level = ii; } } JSONSL_API void jsonsl_destroy(jsonsl_t jsn) { if (jsn) { free(jsn); } } JSONSL_API void jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes) { #define INVOKE_ERROR(eb) \ if (jsn->error_callback(jsn, JSONSL_ERROR_##eb, state, (char*)c)) { \ goto GT_AGAIN; \ } \ return; #define STACK_PUSH \ if (jsn->level >= (levels_max-1)) { \ jsn->error_callback(jsn, JSONSL_ERROR_LEVELS_EXCEEDED, state, (char*)c); \ return; \ } \ state = jsn->stack + (++jsn->level); \ state->ignore_callback = jsn->stack[jsn->level-1].ignore_callback; \ state->pos_begin = jsn->pos; #define STACK_POP_NOPOS \ state->pos_cur = jsn->pos; \ state = jsn->stack + (--jsn->level); #define STACK_POP \ STACK_POP_NOPOS; \ state->pos_cur = jsn->pos; #define CALLBACK_AND_POP_NOPOS(T) \ state->pos_cur = jsn->pos; \ DO_CALLBACK(T, POP); \ state->nescapes = 0; \ state = jsn->stack + (--jsn->level); #define CALLBACK_AND_POP(T) \ CALLBACK_AND_POP_NOPOS(T); \ state->pos_cur = jsn->pos; #define SPECIAL_POP \ CALLBACK_AND_POP(SPECIAL); \ jsn->expecting = 0; \ jsn->tok_last = 0; \ #define CUR_CHAR (*(jsonsl_uchar_t*)c) #define DO_CALLBACK(T, action) \ if (jsn->call_##T && \ jsn->max_callback_level > state->level && \ state->ignore_callback == 0) { \ \ if (jsn->action_callback_##action) { \ jsn->action_callback_##action(jsn, JSONSL_ACTION_##action, state, (jsonsl_char_t*)c); \ } else if (jsn->action_callback) { \ jsn->action_callback(jsn, JSONSL_ACTION_##action, state, (jsonsl_char_t*)c); \ } \ } /** * Verifies that we are able to insert the (non-string) item into a hash. */ #define ENSURE_HVAL \ if (state->nelem % 2 == 0 && state->type == JSONSL_T_OBJECT) { \ INVOKE_ERROR(HKEY_EXPECTED); \ } #define VERIFY_SPECIAL(lit) \ if (CUR_CHAR != (lit)[jsn->pos - state->pos_begin]) { \ INVOKE_ERROR(SPECIAL_EXPECTED); \ } const jsonsl_uchar_t *c = (jsonsl_uchar_t*)bytes; size_t levels_max = jsn->levels_max; struct jsonsl_state_st *state = jsn->stack + jsn->level; static int chrt_string_nopass[0x100] = { JSONSL_CHARTABLE_string_nopass }; jsn->base = bytes; for (; nbytes; nbytes--, jsn->pos++, c++) { register jsonsl_type_t state_type; INCR_METRIC(TOTAL); /* Special escape handling for some stuff */ if (jsn->in_escape) { jsn->in_escape = 0; if (!is_allowed_escape(CUR_CHAR)) { INVOKE_ERROR(ESCAPE_INVALID); } else if (CUR_CHAR == 'u') { DO_CALLBACK(UESCAPE, UESCAPE); if (jsn->return_UESCAPE) { return; } } goto GT_NEXT; } GT_AGAIN: /** * Several fast-tracks for common cases: */ state_type = state->type; if (state_type & JSONSL_Tf_STRINGY) { /* check if our character cannot ever change our current string state * or throw an error */ if ( #ifdef JSONSL_USE_WCHAR CUR_CHAR >= 0x100 || #endif /* JSONSL_USE_WCHAR */ (!chrt_string_nopass[CUR_CHAR & 0xff])) { INCR_METRIC(STRINGY_INSIGNIFICANT); goto GT_NEXT; } else if (CUR_CHAR == '"') { goto GT_QUOTE; } else if (CUR_CHAR == '\\') { goto GT_ESCAPE; } else { INVOKE_ERROR(WEIRD_WHITESPACE); } INCR_METRIC(STRINGY_SLOWPATH); } else if (state_type == JSONSL_T_SPECIAL) { if (state->special_flags & JSONSL_SPECIALf_NUMERIC) { switch (CUR_CHAR) { CASE_DIGITS state->nelem = (state->nelem*10) + (CUR_CHAR-0x30); goto GT_NEXT; case 'e': case 'E': case '-': case '+': state->special_flags |= JSONSL_SPECIALf_EXPONENT; goto GT_NEXT; case '.': state->special_flags |= JSONSL_SPECIALf_FLOAT; goto GT_NEXT; default: if (is_special_end(CUR_CHAR)) { goto GT_SPECIAL_POP; } INVOKE_ERROR(INVALID_NUMBER); break; } } /* else if (!NUMERIC) */ if (!is_special_end(CUR_CHAR)) { /* Verify TRUE, FALSE, NULL */ if (state->special_flags == JSONSL_SPECIALf_TRUE) { VERIFY_SPECIAL("true"); } else if (state->special_flags == JSONSL_SPECIALf_FALSE) { VERIFY_SPECIAL("false"); } else if (state->special_flags == JSONSL_SPECIALf_NULL) { VERIFY_SPECIAL("null"); } INCR_METRIC(SPECIAL_FASTPATH); goto GT_NEXT; } GT_SPECIAL_POP: SPECIAL_POP; jsn->expecting = ','; if (is_allowed_whitespace(CUR_CHAR)) { goto GT_NEXT; } /** * This works because we have a non-whitespace token * which is not a special token. If this is a structural * character then it will be gracefully handled by the * switch statement. Otherwise it will default to the 'special' * state again, */ goto GT_STRUCTURAL_TOKEN; } else if (is_allowed_whitespace(CUR_CHAR)) { INCR_METRIC(ALLOWED_WHITESPACE); /* So we're not special. Harmless insignificant whitespace * passthrough */ goto GT_NEXT; } else if (extract_special(CUR_CHAR)) { /* not a string, whitespace, or structural token. must be special */ goto GT_SPECIAL_BEGIN; } INCR_GENERIC(CUR_CHAR); if (CUR_CHAR == '"') { GT_QUOTE: jsn->can_insert = 0; switch (state_type) { /* the end of a string or hash key */ case JSONSL_T_STRING: CALLBACK_AND_POP(STRING); goto GT_NEXT; case JSONSL_T_HKEY: CALLBACK_AND_POP(HKEY); goto GT_NEXT; case JSONSL_T_OBJECT: state->nelem++; if ( (state->nelem-1) % 2 ) { /* Odd, this must be a hash value */ if (jsn->tok_last != ':') { INVOKE_ERROR(MISSING_TOKEN); } jsn->expecting = ','; /* Can't figure out what to expect next */ jsn->tok_last = 0; STACK_PUSH; state->type = JSONSL_T_STRING; DO_CALLBACK(STRING, PUSH); } else { /* hash key */ if (jsn->expecting != '"') { INVOKE_ERROR(STRAY_TOKEN); } jsn->tok_last = 0; jsn->expecting = ':'; STACK_PUSH; state->type = JSONSL_T_HKEY; DO_CALLBACK(HKEY, PUSH); } goto GT_NEXT; case JSONSL_T_LIST: state->nelem++; STACK_PUSH; state->type = JSONSL_T_STRING; jsn->expecting = ','; jsn->tok_last = 0; DO_CALLBACK(STRING, PUSH); goto GT_NEXT; case JSONSL_T_SPECIAL: INVOKE_ERROR(STRAY_TOKEN); break; default: INVOKE_ERROR(STRING_OUTSIDE_CONTAINER); break; } /* switch(state->type) */ } else if (CUR_CHAR == '\\') { GT_ESCAPE: INCR_METRIC(ESCAPES); /* Escape */ if ( (state->type & JSONSL_Tf_STRINGY) == 0 ) { INVOKE_ERROR(ESCAPE_OUTSIDE_STRING); } state->nescapes++; jsn->in_escape = 1; goto GT_NEXT; } /* " or \ */ GT_STRUCTURAL_TOKEN: switch (CUR_CHAR) { case ':': INCR_METRIC(STRUCTURAL_TOKEN); if (jsn->expecting != CUR_CHAR) { INVOKE_ERROR(STRAY_TOKEN); } jsn->tok_last = ':'; jsn->can_insert = 1; jsn->expecting = '"'; goto GT_NEXT; case ',': INCR_METRIC(STRUCTURAL_TOKEN); /** * The comma is one of the more generic tokens. * In the context of an OBJECT, the can_insert flag * should never be set, and no other action is * necessary. */ if (jsn->expecting != CUR_CHAR) { /* make this branch execute only when we haven't manually * just placed the ',' in the expecting register. */ INVOKE_ERROR(STRAY_TOKEN); } if (state->type == JSONSL_T_OBJECT) { /* end of hash value, expect a string as a hash key */ jsn->expecting = '"'; } else { jsn->can_insert = 1; } jsn->tok_last = ','; jsn->expecting = '"'; goto GT_NEXT; /* new list or object */ /* hashes are more common */ case '{': case '[': INCR_METRIC(STRUCTURAL_TOKEN); if (!jsn->can_insert) { INVOKE_ERROR(CANT_INSERT); } ENSURE_HVAL; state->nelem++; STACK_PUSH; /* because the constants match the opening delimiters, we can do this: */ state->type = CUR_CHAR; state->nelem = 0; jsn->can_insert = 1; if (CUR_CHAR == '{') { /* If we're a hash, we expect a key first, which is quouted */ jsn->expecting = '"'; } if (CUR_CHAR == JSONSL_T_OBJECT) { DO_CALLBACK(OBJECT, PUSH); } else { DO_CALLBACK(LIST, PUSH); } jsn->tok_last = 0; goto GT_NEXT; /* closing of list or object */ case '}': case ']': INCR_METRIC(STRUCTURAL_TOKEN); if (jsn->tok_last == ',' && jsn->options.allow_trailing_comma == 0) { INVOKE_ERROR(TRAILING_COMMA); } jsn->can_insert = 0; jsn->level--; jsn->expecting = ','; jsn->tok_last = 0; if (CUR_CHAR == ']') { if (state->type != '[') { INVOKE_ERROR(BRACKET_MISMATCH); } DO_CALLBACK(LIST, POP); } else { if (state->type != '{') { INVOKE_ERROR(BRACKET_MISMATCH); } DO_CALLBACK(OBJECT, POP); } state = jsn->stack + jsn->level; state->pos_cur = jsn->pos; goto GT_NEXT; default: GT_SPECIAL_BEGIN: /** * Not a string, not a structural token, and not benign whitespace. * Technically we should iterate over the character always, but since * we are not doing full numerical/value decoding anyway (but only hinting), * we only check upon entry. */ if (state->type != JSONSL_T_SPECIAL) { int special_flags = extract_special(CUR_CHAR); if (!special_flags) { /** * Try to do some heuristics here anyway to figure out what kind of * error this is. The 'special' case is a fallback scenario anyway. */ if (CUR_CHAR == '\0') { INVOKE_ERROR(FOUND_NULL_BYTE); } else if (CUR_CHAR < 0x20) { INVOKE_ERROR(WEIRD_WHITESPACE); } else { INVOKE_ERROR(SPECIAL_EXPECTED); } } ENSURE_HVAL; state->nelem++; if (!jsn->can_insert) { INVOKE_ERROR(CANT_INSERT); } STACK_PUSH; state->type = JSONSL_T_SPECIAL; state->special_flags = special_flags; if (special_flags == JSONSL_SPECIALf_UNSIGNED) { state->nelem = CUR_CHAR - 0x30; } else { state->nelem = 0; } DO_CALLBACK(SPECIAL, PUSH); } goto GT_NEXT; } GT_NEXT: continue; } } JSONSL_API const char* jsonsl_strerror(jsonsl_error_t err) { #define X(t) \ if (err == JSONSL_ERROR_##t) \ return #t; JSONSL_XERR; #undef X return ""; } JSONSL_API const char *jsonsl_strtype(jsonsl_type_t type) { #define X(o,c) \ if (type == JSONSL_T_##o) \ return #o; JSONSL_XTYPE #undef X return "UNKNOWN TYPE"; } /* * * JPR/JSONPointer functions * * */ #ifndef JSONSL_NO_JPR static jsonsl_jpr_type_t populate_component(char *in, struct jsonsl_jpr_component_st *component, char **next, jsonsl_error_t *errp) { unsigned long pctval; char *c = NULL, *outp = NULL, *end = NULL; size_t input_len; jsonsl_jpr_type_t ret = JSONSL_PATH_NONE; if (*next == NULL || *(*next) == '\0') { return JSONSL_PATH_NONE; } /* Replace the next / with a NULL */ *next = strstr(in, "/"); if (*next != NULL) { *(*next) = '\0'; /* drop the forward slash */ input_len = *next - in; end = *next; *next += 1; /* next character after the '/' */ } else { input_len = strlen(in); end = in + input_len + 1; } component->pstr = in; /* Check for special components of interest */ if (*in == JSONSL_PATH_WILDCARD_CHAR && input_len == 1) { /* Lone wildcard */ ret = JSONSL_PATH_WILDCARD; goto GT_RET; } else if (isdigit(*in)) { /* ASCII Numeric */ char *endptr; component->idx = strtoul(in, &endptr, 10); if (endptr && *endptr == '\0') { ret = JSONSL_PATH_NUMERIC; goto GT_RET; } } /* Default, it's a string */ ret = JSONSL_PATH_STRING; for (c = outp = in; c < end; c++, outp++) { char origc; if (*c != '%') { goto GT_ASSIGN; } /* * c = { [+0] = '%', [+1] = 'b', [+2] = 'e', [+3] = '\0' } */ /* Need %XX */ if (c+2 >= end) { *errp = JSONSL_ERROR_PERCENT_BADHEX; return JSONSL_PATH_INVALID; } if (! (isxdigit(*(c+1)) && isxdigit(*(c+2))) ) { *errp = JSONSL_ERROR_PERCENT_BADHEX; return JSONSL_PATH_INVALID; } /* Temporarily null-terminate the characters */ origc = *(c+3); *(c+3) = '\0'; pctval = strtoul(c+1, NULL, 16); *(c+3) = origc; *outp = (char) pctval; c += 2; continue; GT_ASSIGN: *outp = *c; } /* Null-terminate the string */ for (; outp < c; outp++) { *outp = '\0'; } GT_RET: component->ptype = ret; if (ret != JSONSL_PATH_WILDCARD) { component->len = strlen(component->pstr); } return ret; } JSONSL_API jsonsl_jpr_t jsonsl_jpr_new(const char *path, jsonsl_error_t *errp) { char *my_copy; int count, curidx; struct jsonsl_jpr_st *ret; struct jsonsl_jpr_component_st *components; size_t origlen; jsonsl_error_t errstacked; if (errp == NULL) { errp = &errstacked; } if (path == NULL || *path != '/') { *errp = JSONSL_ERROR_JPR_NOROOT; return NULL; } count = 1; path++; { const char *c = path; for (; *c; c++) { if (*c == '/') { count++; if (*(c+1) == '/') { *errp = JSONSL_ERROR_JPR_DUPSLASH; return NULL; } } } } if(*path) { count++; } components = malloc(sizeof(*components) * count); my_copy = malloc(strlen(path) + 1); strcpy(my_copy, path); components[0].ptype = JSONSL_PATH_ROOT; if (*my_copy) { char *cur = my_copy; int pathret = JSONSL_PATH_STRING; curidx = 1; while (pathret > 0 && curidx < count) { pathret = populate_component(cur, components + curidx, &cur, errp); if (pathret > 0) { curidx++; } else { break; } } if (pathret == JSONSL_PATH_INVALID) { free(components); free(my_copy); return NULL; } } else { curidx = 1; } path--; /*revert path to leading '/' */ origlen = strlen(path) + 1; ret = malloc(sizeof(*ret)); ret->components = components; ret->ncomponents = curidx; ret->basestr = my_copy; ret->orig = malloc(origlen); ret->norig = origlen-1; strcpy(ret->orig, path); return ret; } void jsonsl_jpr_destroy(jsonsl_jpr_t jpr) { free(jpr->components); free(jpr->basestr); free(jpr->orig); free(jpr); } JSONSL_API jsonsl_jpr_match_t jsonsl_jpr_match(jsonsl_jpr_t jpr, jsonsl_type_t parent_type, unsigned int parent_level, const char *key, size_t nkey) { /* find our current component. This is the child level */ int cmpret; struct jsonsl_jpr_component_st *p_component; p_component = jpr->components + parent_level; if (parent_level >= jpr->ncomponents) { return JSONSL_MATCH_NOMATCH; } /* Lone query for 'root' element. Always matches */ if (parent_level == 0) { if (jpr->ncomponents == 1) { return JSONSL_MATCH_COMPLETE; } else { return JSONSL_MATCH_POSSIBLE; } } /* Wildcard, always matches */ if (p_component->ptype == JSONSL_PATH_WILDCARD) { if (parent_level == jpr->ncomponents-1) { return JSONSL_MATCH_COMPLETE; } else { return JSONSL_MATCH_POSSIBLE; } } /* Check numeric array index */ if (p_component->ptype == JSONSL_PATH_NUMERIC && parent_type == JSONSL_T_LIST) { if (p_component->idx != nkey) { return JSONSL_MATCH_NOMATCH; } else { if (parent_level == jpr->ncomponents-1) { return JSONSL_MATCH_COMPLETE; } else { return JSONSL_MATCH_POSSIBLE; } } } /* Check lengths */ if (p_component->len != nkey) { return JSONSL_MATCH_NOMATCH; } /* Check string comparison */ cmpret = strncmp(p_component->pstr, key, nkey); if (cmpret != 0) { return JSONSL_MATCH_NOMATCH; } else { if (parent_level == jpr->ncomponents-1) { return JSONSL_MATCH_COMPLETE; } else { return JSONSL_MATCH_POSSIBLE; } } /* Never reached, but make the compiler happy */ abort(); return JSONSL_MATCH_NOMATCH; } JSONSL_API void jsonsl_jpr_match_state_init(jsonsl_t jsn, jsonsl_jpr_t *jprs, size_t njprs) { size_t ii, *firstjmp; if (njprs == 0) { return; } jsn->jprs = malloc(sizeof(jsonsl_jpr_t) * njprs); jsn->jpr_count = njprs; jsn->jpr_root = calloc(1, sizeof(size_t) * njprs * jsn->levels_max); memcpy(jsn->jprs, jprs, sizeof(jsonsl_jpr_t) * njprs); /* Set the initial jump table values */ firstjmp = jsn->jpr_root; for (ii = 0; ii < njprs; ii++) { firstjmp[ii] = ii+1; } } JSONSL_API void jsonsl_jpr_match_state_cleanup(jsonsl_t jsn) { if (jsn->jpr_count == 0) { return; } free(jsn->jpr_root); free(jsn->jprs); jsn->jprs = NULL; jsn->jpr_root = NULL; jsn->jpr_count = 0; } /** * This function should be called exactly once on each element... * This should also be called in recursive order, since we rely * on the parent having been initalized for a match. * * Since the parent is checked for a match as well, we maintain a 'serial' counter. * Whenever we traverse an element, we expect the serial to be the same as a global * integer. If they do not match, we re-initialize the context, and set the serial. * * This ensures a type of consistency without having a proactive reset by the * main lexer itself. * */ JSONSL_API jsonsl_jpr_t jsonsl_jpr_match_state(jsonsl_t jsn, struct jsonsl_state_st *state, const char *key, size_t nkey, jsonsl_jpr_match_t *out) { struct jsonsl_state_st *parent_state; jsonsl_jpr_t ret = NULL; /* Jump and JPR tables for our own state and the parent state */ size_t *jmptable, *pjmptable; size_t jmp_cur, ii, ourjmpidx; if (!jsn->jpr_root) { *out = JSONSL_MATCH_NOMATCH; return NULL; } pjmptable = jsn->jpr_root + (jsn->jpr_count * (state->level-1)); jmptable = pjmptable + jsn->jpr_count; /* If the parent cannot match, then invalidate it */ if (*pjmptable == 0) { *jmptable = 0; *out = JSONSL_MATCH_NOMATCH; return NULL; } parent_state = jsn->stack + state->level - 1; if (parent_state->type == JSONSL_T_LIST) { nkey = (size_t) parent_state->nelem; } *jmptable = 0; ourjmpidx = 0; memset(jmptable, 0, sizeof(int) * jsn->jpr_count); for (ii = 0; ii < jsn->jpr_count; ii++) { jmp_cur = pjmptable[ii]; if (jmp_cur) { jsonsl_jpr_t jpr = jsn->jprs[jmp_cur-1]; *out = jsonsl_jpr_match(jpr, parent_state->type, parent_state->level, key, nkey); if (*out == JSONSL_MATCH_COMPLETE) { ret = jpr; *jmptable = 0; return ret; } else if (*out == JSONSL_MATCH_POSSIBLE) { jmptable[ourjmpidx] = ii+1; ourjmpidx++; } } else { break; } } if (!*jmptable) { *out = JSONSL_MATCH_NOMATCH; } return NULL; } JSONSL_API const char *jsonsl_strmatchtype(jsonsl_jpr_match_t match) { #define X(T,v) \ if ( match == JSONSL_MATCH_##T ) \ return #T; JSONSL_XMATCH #undef X return ""; } #endif /* JSONSL_WITH_JPR */ /** * Maps literal escape sequences with special meaning to their * actual control codes (e.g.\n => 0x20) */ static unsigned char *Escape_Maps; /** * Utility function to convert escape sequences */ JSONSL_API size_t jsonsl_util_unescape_ex(const char *in, char *out, size_t len, const int toEscape[128], jsonsl_special_t *oflags, jsonsl_error_t *err, const char **errat) { const unsigned char *c = (const unsigned char*)in; int in_escape = 0; size_t origlen = len; /* difference between the length of the input buffer and the output buffer */ size_t ndiff = 0; if (oflags) { *oflags = 0; } #define UNESCAPE_BAIL(e,offset) \ *err = JSONSL_ERROR_##e; \ if (errat) { \ *errat = (const char*)(c+ (ptrdiff_t)(offset)); \ } \ return 0; for (; len; len--, c++, out++) { unsigned int uesc_val[2]; if (in_escape) { /* inside a previously ignored escape. Ignore */ in_escape = 0; goto GT_ASSIGN; } if (*c != '\\') { /* Not an escape, so we don't care about this */ goto GT_ASSIGN; } if (len < 2) { UNESCAPE_BAIL(ESCAPE_INVALID, 0); } if (!is_allowed_escape(c[1])) { UNESCAPE_BAIL(ESCAPE_INVALID, 1) } if ((toEscape[(unsigned char)c[1] & 0x7f] == 0 && c[1] != '\\' && c[1] != '"')) { /* if we don't want to unescape this string, just continue with * the escape flag set */ in_escape = 1; goto GT_ASSIGN; } if (c[1] != 'u') { /* simple skip-and-replace using pre-defined maps. * TODO: should the maps actually reflect the desired * replacement character in toEscape? */ if (Escape_Maps[c[1]]) { /* Check if there is a corresponding replacement */ *out = Escape_Maps[c[1]]; } else { /* Just gobble up the 'reverse-solidus' */ *out = c[1]; } len--; ndiff++; c++; /* do not assign, just continue */ continue; } /* next == 'u' */ if (len < 6) { /* Need at least six characters: * { [0] = '\\', [1] = 'u', [2] = 'f', [3] = 'f', [4] = 'f', [5] = 'f' } */ UNESCAPE_BAIL(UESCAPE_TOOSHORT, -1); } if (sscanf((const char*)(c+2), "%02x%02x", uesc_val, uesc_val+1) != 2) { /* We treat the sequence as two octets */ UNESCAPE_BAIL(UESCAPE_TOOSHORT, -1); } /* By now, we gobble up all the six bytes (current implied + 5 next * characters), and have at least four missing bytes from the output * buffer. */ len -= 5; c += 5; ndiff += 4; if (uesc_val[0] == 0) { /* only one byte is extracted from the two * possible octets. Increment the diff counter by one. */ *out = uesc_val[1]; if (oflags && *(unsigned char*)out > 0x7f) { *oflags |= JSONSL_SPECIALf_NONASCII; } ndiff++; } else { *(out++) = uesc_val[0]; *out = uesc_val[1]; if (oflags && (uesc_val[0] > 0x7f || uesc_val[1] > 0x7f)) { *oflags |= JSONSL_SPECIALf_NONASCII; } } continue; /* Only reached by previous branches */ GT_ASSIGN: *out = *c; } *err = JSONSL_ERROR_SUCCESS; return origlen - ndiff; } /** * Character Table definitions. * These were all generated via srcutil/genchartables.pl */ /** * This table contains the beginnings of non-string * allowable (bareword) values. */ static jsonsl_special_t _special_table[0x100] = { /* 0x00 */ 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, /* 0x1f */ /* 0x20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x2c */ /* 0x2d */ JSONSL_SPECIALf_SIGNED /* - */, /* 0x2d */ /* 0x2e */ 0,0, /* 0x2f */ /* 0x30 */ JSONSL_SPECIALf_UNSIGNED /* 0 */, /* 0x30 */ /* 0x31 */ JSONSL_SPECIALf_UNSIGNED /* 1 */, /* 0x31 */ /* 0x32 */ JSONSL_SPECIALf_UNSIGNED /* 2 */, /* 0x32 */ /* 0x33 */ JSONSL_SPECIALf_UNSIGNED /* 3 */, /* 0x33 */ /* 0x34 */ JSONSL_SPECIALf_UNSIGNED /* 4 */, /* 0x34 */ /* 0x35 */ JSONSL_SPECIALf_UNSIGNED /* 5 */, /* 0x35 */ /* 0x36 */ JSONSL_SPECIALf_UNSIGNED /* 6 */, /* 0x36 */ /* 0x37 */ JSONSL_SPECIALf_UNSIGNED /* 7 */, /* 0x37 */ /* 0x38 */ JSONSL_SPECIALf_UNSIGNED /* 8 */, /* 0x38 */ /* 0x39 */ JSONSL_SPECIALf_UNSIGNED /* 9 */, /* 0x39 */ /* 0x3a */ 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, /* 0x59 */ /* 0x5a */ 0,0,0,0,0,0,0,0,0,0,0,0, /* 0x65 */ /* 0x66 */ JSONSL_SPECIALf_FALSE /* f */, /* 0x66 */ /* 0x67 */ 0,0,0,0,0,0,0, /* 0x6d */ /* 0x6e */ JSONSL_SPECIALf_NULL /* n */, /* 0x6e */ /* 0x6f */ 0,0,0,0,0, /* 0x73 */ /* 0x74 */ JSONSL_SPECIALf_TRUE /* t */, /* 0x74 */ /* 0x75 */ 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, /* 0x94 */ /* 0x95 */ 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, /* 0xb4 */ /* 0xb5 */ 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, /* 0xd4 */ /* 0xd5 */ 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, /* 0xf4 */ /* 0xf5 */ 0,0,0,0,0,0,0,0,0,0 /* 0xfe */ }; static jsonsl_special_t *Special_table = _special_table; /** * Contains characters which signal the termination of any of the 'special' bareword * values. */ static int _special_endings[0x100] = { /* 0x00 */ 0,0,0,0,0,0,0,0,0, /* 0x08 */ /* 0x09 */ 1 /* */, /* 0x09 */ /* 0x0a */ 1 /* */, /* 0x0a */ /* 0x0b */ 0,0, /* 0x0c */ /* 0x0d */ 1 /* */, /* 0x0d */ /* 0x0e */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x1f */ /* 0x20 */ 1 /* */, /* 0x20 */ /* 0x21 */ 0, /* 0x21 */ /* 0x22 */ 1 /* " */, /* 0x22 */ /* 0x23 */ 0,0,0,0,0,0,0,0,0, /* 0x2b */ /* 0x2c */ 1 /* , */, /* 0x2c */ /* 0x2d */ 0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x39 */ /* 0x3a */ 1 /* : */, /* 0x3a */ /* 0x3b */ 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, /* 0x5a */ /* 0x5b */ 1 /* [ */, /* 0x5b */ /* 0x5c */ 1 /* \ */, /* 0x5c */ /* 0x5d */ 1 /* ] */, /* 0x5d */ /* 0x5e */ 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, /* 0x7a */ /* 0x7b */ 1 /* { */, /* 0x7b */ /* 0x7c */ 0, /* 0x7c */ /* 0x7d */ 1 /* } */, /* 0x7d */ /* 0x7e */ 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, /* 0x9d */ /* 0x9e */ 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, /* 0xbd */ /* 0xbe */ 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, /* 0xdd */ /* 0xde */ 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, /* 0xfd */ /* 0xfe */ 0 /* 0xfe */ }; static int *Special_Endings = _special_endings; /** * Contains allowable whitespace. */ static int _allowed_whitespace[0x100] = { /* 0x00 */ 0,0,0,0,0,0,0,0,0, /* 0x08 */ /* 0x09 */ 1 /* */, /* 0x09 */ /* 0x0a */ 1 /* */, /* 0x0a */ /* 0x0b */ 0,0, /* 0x0c */ /* 0x0d */ 1 /* */, /* 0x0d */ /* 0x0e */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x1f */ /* 0x20 */ 1 /* */, /* 0x20 */ /* 0x21 */ 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, /* 0x40 */ /* 0x41 */ 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, /* 0x60 */ /* 0x61 */ 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, /* 0x80 */ /* 0x81 */ 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, /* 0xa0 */ /* 0xa1 */ 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, /* 0xc0 */ /* 0xc1 */ 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, /* 0xe0 */ /* 0xe1 */ 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 /* 0xfe */ }; static int *Allowed_Whitespace = _allowed_whitespace; /** * Allowable two-character 'common' escapes: */ static int _allowed_escapes[0x100] = { /* 0x00 */ 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, /* 0x1f */ /* 0x20 */ 0,0, /* 0x21 */ /* 0x22 */ 1 /* <"> */, /* 0x22 */ /* 0x23 */ 0,0,0,0,0,0,0,0,0,0,0,0, /* 0x2e */ /* 0x2f */ 1 /* */, /* 0x2f */ /* 0x30 */ 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, /* 0x4f */ /* 0x50 */ 0,0,0,0,0,0,0,0,0,0,0,0, /* 0x5b */ /* 0x5c */ 1 /* <\> */, /* 0x5c */ /* 0x5d */ 0,0,0,0,0, /* 0x61 */ /* 0x62 */ 1 /* */, /* 0x62 */ /* 0x63 */ 0,0,0, /* 0x65 */ /* 0x66 */ 1 /* */, /* 0x66 */ /* 0x67 */ 0,0,0,0,0,0,0, /* 0x6d */ /* 0x6e */ 1 /* */, /* 0x6e */ /* 0x6f */ 0,0,0, /* 0x71 */ /* 0x72 */ 1 /* */, /* 0x72 */ /* 0x73 */ 0, /* 0x73 */ /* 0x74 */ 1 /* */, /* 0x74 */ /* 0x75 */ 1 /* */, /* 0x75 */ /* 0x76 */ 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, /* 0x95 */ /* 0x96 */ 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, /* 0xb5 */ /* 0xb6 */ 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, /* 0xd5 */ /* 0xd6 */ 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, /* 0xf5 */ /* 0xf6 */ 0,0,0,0,0,0,0,0,0, /* 0xfe */ }; static int *Allowed_Escapes = _allowed_escapes; static unsigned char _escape_maps[0x100] = { /* 0x00 */ 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, /* 0x1f */ /* 0x20 */ 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, /* 0x3f */ /* 0x40 */ 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, /* 0x5f */ /* 0x60 */ 0,0, /* 0x61 */ /* 0x62 */ 8 /* */, /* 0x62 */ /* 0x63 */ 0,0,0, /* 0x65 */ /* 0x66 */ 12 /* */, /* 0x66 */ /* 0x67 */ 0,0,0,0,0,0,0, /* 0x6d */ /* 0x6e */ 10 /* */, /* 0x6e */ /* 0x6f */ 0,0,0, /* 0x71 */ /* 0x72 */ 13 /* */, /* 0x72 */ /* 0x73 */ 0, /* 0x73 */ /* 0x74 */ 9 /* */, /* 0x74 */ /* 0x75 */ 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, /* 0x94 */ /* 0x95 */ 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, /* 0xb4 */ /* 0xb5 */ 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, /* 0xd4 */ /* 0xd5 */ 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, /* 0xf4 */ /* 0xf5 */ 0,0,0,0,0,0,0,0,0,0 /* 0xfe */ }; static unsigned char *Escape_Maps = _escape_maps; transmission-2.92/libtransmission/PaxHeaders.4960/clients-test.c0000644000000000000000000000013212442116602021656 xustar0030 mtime=1418239362.956223009 30 atime=1418239362.956223009 30 ctime=1457295920.261812356 transmission-2.92/libtransmission/clients-test.c0000644000175000017500000000257112442116602023310 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: clients-test.c 14286 2014-06-07 15:07:51Z jordan $ */ #include "transmission.h" #include "clients.h" #include "libtransmission-test.h" #define TEST_CLIENT(A, B) \ tr_clientForId (buf, sizeof (buf), A); \ check_streq (B, buf); int main (void) { char buf[128]; TEST_CLIENT ("-FC1013-", "FileCroc 1.0.1.3"); TEST_CLIENT ("-MR1100-", "Miro 1.1.0.0"); TEST_CLIENT ("-TR0006-", "Transmission 0.6"); TEST_CLIENT ("-TR0072-", "Transmission 0.72"); TEST_CLIENT ("-TR111Z-", "Transmission 1.11+"); TEST_CLIENT ("O1008132", "Osprey 1.0.0"); TEST_CLIENT ("TIX0193-", "Tixati 1.93"); TEST_CLIENT ("-UT341\0-", "\xc2\xb5Torrent 3.4.1"); TEST_CLIENT ("-BT791\0-", "BitTorrent 7.9.1"); TEST_CLIENT ("-BT791B-", "BitTorrent 7.9.1 (Beta)"); /* gobbledygook */ TEST_CLIENT ("-IIO\x10\x2D\x04-", "-IIO%10-%04-"); TEST_CLIENT ("-I\05O\x08\x03\x01-", "-I%05O%08%03%01-"); TEST_CLIENT ( "\x65\x78\x62\x63\x00\x38\x7A\x44\x63\x10\x2D\x6E\x9A\xD6\x72\x3B\x33\x9F\x35\xA9", "BitComet 0.56"); TEST_CLIENT ( "\x65\x78\x62\x63\x00\x38\x4C\x4F\x52\x44\x32\x00\x04\x8E\xCE\xD5\x7B\xD7\x10\x28", "BitLord 0.56"); /* cleanup */ return 0; } transmission-2.92/libtransmission/PaxHeaders.4960/torrent-ctor.c0000644000000000000000000000013112640354044021705 xustar0030 mtime=1451350052.450150388 30 atime=1451350052.450150388 29 ctime=1457295920.15381052 transmission-2.92/libtransmission/torrent-ctor.c0000644000175000017500000002646612640354044023351 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: torrent-ctor.c 14634 2015-12-25 11:34:35Z mikedld $ */ #include /* EINVAL */ #include "transmission.h" #include "file.h" #include "magnet.h" #include "session.h" /* tr_sessionFindTorrentFile () */ #include "torrent.h" /* tr_ctorGetSave () */ #include "utils.h" /* tr_new0 */ #include "variant.h" struct optional_args { bool isSet_paused; bool isSet_connected; bool isSet_downloadDir; bool isPaused; uint16_t peerLimit; char * downloadDir; }; /** Opaque class used when instantiating torrents. * @ingroup tr_ctor */ struct tr_ctor { const tr_session * session; bool saveInOurTorrentsDir; bool doDelete; tr_priority_t bandwidthPriority; bool isSet_metainfo; bool isSet_delete; tr_variant metainfo; char * sourceFile; struct optional_args optionalArgs[2]; char * cookies; char * incompleteDir; tr_file_index_t * want; tr_file_index_t wantSize; tr_file_index_t * notWant; tr_file_index_t notWantSize; tr_file_index_t * low; tr_file_index_t lowSize; tr_file_index_t * normal; tr_file_index_t normalSize; tr_file_index_t * high; tr_file_index_t highSize; }; /*** **** ***/ static void setSourceFile (tr_ctor * ctor, const char * sourceFile) { tr_free (ctor->sourceFile); ctor->sourceFile = tr_strdup (sourceFile); } static void clearMetainfo (tr_ctor * ctor) { if (ctor->isSet_metainfo) { ctor->isSet_metainfo = false; tr_variantFree (&ctor->metainfo); } setSourceFile (ctor, NULL); } int tr_ctorSetMetainfo (tr_ctor * ctor, const uint8_t * metainfo, size_t len) { int err; clearMetainfo (ctor); err = tr_variantFromBenc (&ctor->metainfo, metainfo, len); ctor->isSet_metainfo = !err; return err; } const char* tr_ctorGetSourceFile (const tr_ctor * ctor) { return ctor->sourceFile; } int tr_ctorSetMetainfoFromMagnetLink (tr_ctor * ctor, const char * magnet_link) { int err; tr_magnet_info * magnet_info = tr_magnetParse (magnet_link); if (magnet_info == NULL) err = -1; else { size_t len; tr_variant tmp; char * str; tr_magnetCreateMetainfo (magnet_info, &tmp); str = tr_variantToStr (&tmp, TR_VARIANT_FMT_BENC, &len); err = tr_ctorSetMetainfo (ctor, (const uint8_t*)str, len); tr_free (str); tr_variantFree (&tmp); tr_magnetFree (magnet_info); } return err; } int tr_ctorSetMetainfoFromFile (tr_ctor * ctor, const char * filename) { uint8_t * metainfo; size_t len; int err; metainfo = tr_loadFile (filename, &len, NULL); if (metainfo && len) err = tr_ctorSetMetainfo (ctor, metainfo, len); else { clearMetainfo (ctor); err = 1; } setSourceFile (ctor, filename); /* if no `name' field was set, then set it from the filename */ if (ctor->isSet_metainfo) { tr_variant * info; if (tr_variantDictFindDict (&ctor->metainfo, TR_KEY_info, &info)) { const char * name; if (!tr_variantDictFindStr (info, TR_KEY_name_utf_8, &name, NULL)) if (!tr_variantDictFindStr (info, TR_KEY_name, &name, NULL)) name = NULL; if (!name || !*name) { char * base = tr_sys_path_basename (filename, NULL); tr_variantDictAddStr (info, TR_KEY_name, base); tr_free (base); } } } tr_free (metainfo); return err; } int tr_ctorSetMetainfoFromHash (tr_ctor * ctor, const char * hashString) { int err; const char * filename; filename = tr_sessionFindTorrentFile (ctor->session, hashString); if (!filename) err = EINVAL; else err = tr_ctorSetMetainfoFromFile (ctor, filename); return err; } /*** **** ***/ void tr_ctorSetFilePriorities (tr_ctor * ctor, const tr_file_index_t * files, tr_file_index_t fileCount, tr_priority_t priority) { tr_file_index_t ** myfiles; tr_file_index_t * mycount; switch (priority) { case TR_PRI_LOW: myfiles = &ctor->low; mycount = &ctor->lowSize; break; case TR_PRI_HIGH: myfiles = &ctor->high; mycount = &ctor->highSize; break; default /*TR_PRI_NORMAL*/: myfiles = &ctor->normal; mycount = &ctor->normalSize; break; } tr_free (*myfiles); *myfiles = tr_memdup (files, sizeof (tr_file_index_t)*fileCount); *mycount = fileCount; } void tr_ctorInitTorrentPriorities (const tr_ctor * ctor, tr_torrent * tor) { tr_file_index_t i; for (i=0; ilowSize; ++i) tr_torrentInitFilePriority (tor, ctor->low[i], TR_PRI_LOW); for (i=0; inormalSize; ++i) tr_torrentInitFilePriority (tor, ctor->normal[i], TR_PRI_NORMAL); for (i=0; ihighSize; ++i) tr_torrentInitFilePriority (tor, ctor->high[i], TR_PRI_HIGH); } void tr_ctorSetFilesWanted (tr_ctor * ctor, const tr_file_index_t * files, tr_file_index_t fileCount, bool wanted) { tr_file_index_t ** myfiles = wanted ? &ctor->want : &ctor->notWant; tr_file_index_t * mycount = wanted ? &ctor->wantSize : &ctor->notWantSize; tr_free (*myfiles); *myfiles = tr_memdup (files, sizeof (tr_file_index_t)*fileCount); *mycount = fileCount; } void tr_ctorInitTorrentWanted (const tr_ctor * ctor, tr_torrent * tor) { if (ctor->notWantSize) tr_torrentInitFileDLs (tor, ctor->notWant, ctor->notWantSize, false); if (ctor->wantSize) tr_torrentInitFileDLs (tor, ctor->want, ctor->wantSize, true); } /*** **** ***/ void tr_ctorSetDeleteSource (tr_ctor * ctor, bool deleteSource) { assert (tr_isBool (deleteSource)); ctor->doDelete = deleteSource; ctor->isSet_delete = true; } bool tr_ctorGetDeleteSource (const tr_ctor * ctor, bool * setme) { bool ret = true; if (!ctor->isSet_delete) ret = false; else if (setme) *setme = ctor->doDelete; return ret; } /*** **** ***/ void tr_ctorSetSave (tr_ctor * ctor, bool saveInOurTorrentsDir) { assert (tr_isBool (saveInOurTorrentsDir)); ctor->saveInOurTorrentsDir = saveInOurTorrentsDir; } bool tr_ctorGetSave (const tr_ctor * ctor) { return ctor && ctor->saveInOurTorrentsDir; } void tr_ctorSetPaused (tr_ctor * ctor, tr_ctorMode mode, bool isPaused) { struct optional_args * args; assert (ctor != NULL); assert ((mode == TR_FALLBACK) || (mode == TR_FORCE)); assert (tr_isBool (isPaused)); args = &ctor->optionalArgs[mode]; args->isSet_paused = true; args->isPaused = isPaused; } void tr_ctorSetPeerLimit (tr_ctor * ctor, tr_ctorMode mode, uint16_t peerLimit) { struct optional_args * args; assert (ctor != NULL); assert ((mode == TR_FALLBACK) || (mode == TR_FORCE)); args = &ctor->optionalArgs[mode]; args->isSet_connected = true; args->peerLimit = peerLimit; } void tr_ctorSetDownloadDir (tr_ctor * ctor, tr_ctorMode mode, const char * directory) { struct optional_args * args; assert (ctor != NULL); assert ((mode == TR_FALLBACK) || (mode == TR_FORCE)); args = &ctor->optionalArgs[mode]; tr_free (args->downloadDir); args->downloadDir = NULL; args->isSet_downloadDir = false; if (directory && *directory) { args->isSet_downloadDir = true; args->downloadDir = tr_strdup (directory); } } void tr_ctorSetIncompleteDir (tr_ctor * ctor, const char * directory) { tr_free (ctor->incompleteDir); ctor->incompleteDir = tr_strdup (directory); } bool tr_ctorGetPeerLimit (const tr_ctor * ctor, tr_ctorMode mode, uint16_t * setmeCount) { bool ret = true; const struct optional_args * args = &ctor->optionalArgs[mode]; if (!args->isSet_connected) ret = false; else if (setmeCount) *setmeCount = args->peerLimit; return ret; } bool tr_ctorGetPaused (const tr_ctor * ctor, tr_ctorMode mode, bool * setmeIsPaused) { bool ret = true; const struct optional_args * args = &ctor->optionalArgs[mode]; if (!args->isSet_paused) ret = false; else if (setmeIsPaused) *setmeIsPaused = args->isPaused; return ret; } bool tr_ctorGetDownloadDir (const tr_ctor * ctor, tr_ctorMode mode, const char ** setmeDownloadDir) { bool ret = true; const struct optional_args * args = &ctor->optionalArgs[mode]; if (!args->isSet_downloadDir) ret = false; else if (setmeDownloadDir) *setmeDownloadDir = args->downloadDir; return ret; } bool tr_ctorGetIncompleteDir (const tr_ctor * ctor, const char ** setmeIncompleteDir) { bool ret = true; if (ctor->incompleteDir == NULL) ret = false; else *setmeIncompleteDir = ctor->incompleteDir; return ret; } bool tr_ctorGetMetainfo (const tr_ctor * ctor, const tr_variant ** setme) { bool ret = true; if (!ctor->isSet_metainfo) ret = false; else if (setme) *setme = &ctor->metainfo; return ret; } tr_session* tr_ctorGetSession (const tr_ctor * ctor) { return (tr_session*) ctor->session; } /*** **** ***/ static bool isPriority (int i) { return (i==TR_PRI_LOW) || (i==TR_PRI_NORMAL) || (i==TR_PRI_HIGH); } void tr_ctorSetBandwidthPriority (tr_ctor * ctor, tr_priority_t priority) { if (isPriority (priority)) ctor->bandwidthPriority = priority; } tr_priority_t tr_ctorGetBandwidthPriority (const tr_ctor * ctor) { return ctor->bandwidthPriority; } /*** **** ***/ tr_ctor* tr_ctorNew (const tr_session * session) { tr_ctor * ctor = tr_new0 (struct tr_ctor, 1); ctor->session = session; ctor->bandwidthPriority = TR_PRI_NORMAL; if (session != NULL) { tr_ctorSetDeleteSource (ctor, tr_sessionGetDeleteSource (session)); tr_ctorSetPaused (ctor, TR_FALLBACK, tr_sessionGetPaused (session)); tr_ctorSetPeerLimit (ctor, TR_FALLBACK, session->peerLimitPerTorrent); tr_ctorSetDownloadDir (ctor, TR_FALLBACK, tr_sessionGetDownloadDir(session)); } tr_ctorSetSave (ctor, true); return ctor; } void tr_ctorFree (tr_ctor * ctor) { clearMetainfo (ctor); tr_free (ctor->optionalArgs[1].downloadDir); tr_free (ctor->optionalArgs[0].downloadDir); tr_free (ctor->incompleteDir); tr_free (ctor->want); tr_free (ctor->notWant); tr_free (ctor->low); tr_free (ctor->high); tr_free (ctor->normal); tr_free (ctor); } transmission-2.92/libtransmission/PaxHeaders.4960/tr-utp.c0000644000000000000000000000013112641272401020473 xustar0030 mtime=1451586817.570878409 30 atime=1451586817.570878409 29 ctime=1457295920.18381103 transmission-2.92/libtransmission/tr-utp.c0000644000175000017500000001340112641272401022120 0ustar00mikedldmikedld00000000000000/* Copyright (c) 2010 by Juliusz Chroboczek 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. */ #include #include #include #include "transmission.h" #include "log.h" #include "net.h" #include "session.h" #include "crypto-utils.h" /* tr_rand_int_weak () */ #include "peer-mgr.h" #include "tr-utp.h" #include "utils.h" #define MY_NAME "UTP" #define dbgmsg(...) \ do { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, MY_NAME, __VA_ARGS__); \ } while (0) #ifndef WITH_UTP void UTP_Close (struct UTPSocket * socket) { tr_logAddNamedError (MY_NAME, "UTP_Close (%p) was called.", socket); dbgmsg ("UTP_Close (%p) was called.", socket); assert (0); /* FIXME: this is too much for the long term, but probably needed in the short term */ } void UTP_RBDrained (struct UTPSocket *socket) { tr_logAddNamedError (MY_NAME, "UTP_RBDrained (%p) was called.", socket); dbgmsg ("UTP_RBDrained (%p) was called.", socket); assert (0); /* FIXME: this is too much for the long term, but probably needed in the short term */ } bool UTP_Write (struct UTPSocket *socket, size_t count) { tr_logAddNamedError (MY_NAME, "UTP_RBDrained (%p, %zu) was called.", socket, count); dbgmsg ("UTP_RBDrained (%p, %zu) was called.", socket, count); assert (0); /* FIXME: this is too much for the long term, but probably needed in the short term */ return false; } int tr_utpPacket (const unsigned char *buf UNUSED, size_t buflen UNUSED, const struct sockaddr *from UNUSED, socklen_t fromlen UNUSED, tr_session *ss UNUSED) { return -1; } struct UTPSocket *UTP_Create (SendToProc *send_to_proc UNUSED, void *send_to_userdata UNUSED, const struct sockaddr *addr UNUSED, socklen_t addrlen UNUSED) { errno = ENOSYS; return NULL; } void tr_utpClose (tr_session * ss UNUSED) { } void tr_utpSendTo (void *closure UNUSED, const unsigned char *buf UNUSED, size_t buflen UNUSED, const struct sockaddr *to UNUSED, socklen_t tolen UNUSED) { } #else /* Greg says 50ms works for them. */ #define UTP_INTERVAL_US 50000 static struct event *utp_timer = NULL; static void incoming (void *closure, struct UTPSocket *s) { tr_session *ss = closure; struct sockaddr_storage from_storage; struct sockaddr *from = (struct sockaddr*)&from_storage; socklen_t fromlen = sizeof (from_storage); tr_address addr; tr_port port; if (!tr_sessionIsUTPEnabled (ss)) { UTP_Close (s); return; } UTP_GetPeerName (s, from, &fromlen); if (!tr_address_from_sockaddr_storage (&addr, &port, &from_storage)) { tr_logAddNamedError ("UTP", "Unknown socket family"); UTP_Close (s); return; } tr_peerMgrAddIncoming (ss->peerMgr, &addr, port, TR_BAD_SOCKET, s); } void tr_utpSendTo (void *closure, const unsigned char *buf, size_t buflen, const struct sockaddr *to, socklen_t tolen) { tr_session *ss = closure; if (to->sa_family == AF_INET && ss->udp_socket != TR_BAD_SOCKET) sendto (ss->udp_socket, (const void *) buf, buflen, 0, to, tolen); else if (to->sa_family == AF_INET6 && ss->udp6_socket != TR_BAD_SOCKET) sendto (ss->udp6_socket, (const void *) buf, buflen, 0, to, tolen); } static void reset_timer (tr_session *ss) { int sec; int usec; if (tr_sessionIsUTPEnabled (ss)) { sec = 0; usec = UTP_INTERVAL_US / 2 + tr_rand_int_weak (UTP_INTERVAL_US); } else { /* If somebody has disabled uTP, then we still want to run UTP_CheckTimeouts, in order to let closed sockets finish gracefully and so on. However, since we're not particularly interested in that happening in a timely manner, we might as well use a large timeout. */ sec = 2; usec = tr_rand_int_weak (1000000); } tr_timerAdd (utp_timer, sec, usec); } static void timer_callback (evutil_socket_t s UNUSED, short type UNUSED, void *closure) { tr_session *ss = closure; UTP_CheckTimeouts (); reset_timer (ss); } int tr_utpPacket (const unsigned char *buf, size_t buflen, const struct sockaddr *from, socklen_t fromlen, tr_session *ss) { if (!ss->isClosed && !utp_timer) { utp_timer = evtimer_new (ss->event_base, timer_callback, ss); if (utp_timer == NULL) return -1; reset_timer (ss); } return UTP_IsIncomingUTP (incoming, tr_utpSendTo, ss, buf, buflen, from, fromlen); } void tr_utpClose (tr_session * session UNUSED) { if (utp_timer) { evtimer_del (utp_timer); utp_timer = NULL; } } #endif /* #ifndef WITH_UTP ... else */ transmission-2.92/libtransmission/PaxHeaders.4960/cache.c0000644000000000000000000000013212641272401020304 xustar0030 mtime=1451586817.575878498 30 atime=1451586817.575878498 30 ctime=1457295919.955807153 transmission-2.92/libtransmission/cache.c0000644000175000017500000002606512641272401021742 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: cache.c 14644 2015-12-29 19:37:31Z mikedld $ */ #include /* qsort () */ #include #include "transmission.h" #include "cache.h" #include "inout.h" #include "log.h" #include "peer-common.h" /* MAX_BLOCK_SIZE */ #include "ptrarray.h" #include "torrent.h" #include "trevent.h" #include "utils.h" #define MY_NAME "Cache" #define dbgmsg(...) \ do \ { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, MY_NAME, __VA_ARGS__); \ } \ while (0) /**** ***** ****/ struct cache_block { tr_torrent * tor; tr_piece_index_t piece; uint32_t offset; uint32_t length; time_t time; tr_block_index_t block; struct evbuffer * evbuf; }; struct tr_cache { tr_ptrArray blocks; int max_blocks; size_t max_bytes; size_t disk_writes; size_t disk_write_bytes; size_t cache_writes; size_t cache_write_bytes; }; /**** ***** ****/ struct run_info { int pos; int rank; time_t last_block_time; bool is_multi_piece; bool is_piece_done; unsigned int len; }; /* return a count of how many contiguous blocks there are starting at this pos */ static int getBlockRun (const tr_cache * cache, int pos, struct run_info * info) { int i; const int n = tr_ptrArraySize (&cache->blocks); const struct cache_block * const * blocks = (const struct cache_block* const *) tr_ptrArrayBase (&cache->blocks); const struct cache_block * ref = blocks[pos]; tr_block_index_t block = ref->block; for (i=pos; iblock != block) break; if (b->tor != ref->tor) break; //fprintf (stderr, "pos %d tor %d block %zu time %zu\n", i, b->tor->uniqueId, (size_t)b->block, (size_t)b->time); } //fprintf (stderr, "run is %d long from [%d to %d)\n", (int)(i-pos), i, (int)pos); if (info != NULL) { const struct cache_block * b = blocks[i-1]; info->last_block_time = b->time; info->is_piece_done = tr_torrentPieceIsComplete (b->tor, b->piece); info->is_multi_piece = b->piece != blocks[pos]->piece; info->len = i - pos; info->pos = pos; } return i-pos; } /* higher rank comes before lower rank */ static int compareRuns (const void * va, const void * vb) { const struct run_info * a = va; const struct run_info * b = vb; return b->rank - a->rank; } enum { MULTIFLAG = 0x1000, DONEFLAG = 0x2000, SESSIONFLAG = 0x4000 }; /* Calculte runs * - Stale runs, runs sitting in cache for a long time or runs not growing, get priority. * Returns number of runs. */ static int calcRuns (tr_cache * cache, struct run_info * runs) { const int n = tr_ptrArraySize (&cache->blocks); int i = 0, pos; const time_t now = tr_time (); for (pos = 0; pos < n; pos += runs[i++].len) { int rank = getBlockRun (cache, pos, &runs[i]); /* This adds ~2 to the relative length of a run for every minute it has * languished in the cache. */ rank += (now - runs[i].last_block_time) / 32; /* Flushing stale blocks should be a top priority as the probability of them * growing is very small, for blocks on piece boundaries, and nonexistant for * blocks inside pieces. */ rank |= runs[i].is_piece_done ? DONEFLAG : 0; /* Move the multi piece runs higher */ rank |= runs[i].is_multi_piece ? MULTIFLAG : 0; runs[i].rank = rank; //fprintf (stderr,"block run at pos %d of length %d and age %ld adjusted +%d\n",runs[i].pos,runs[i].len,now-runs[i].last_block_time,rank-runs[i].len); } //fprintf (stderr, "%d block runs\n", i); qsort (runs, i, sizeof (struct run_info), compareRuns); return i; } static int flushContiguous (tr_cache * cache, int pos, int n) { int i; int err = 0; uint8_t * buf = tr_new (uint8_t, n * MAX_BLOCK_SIZE); uint8_t * walk = buf; struct cache_block ** blocks = (struct cache_block**) tr_ptrArrayBase (&cache->blocks); struct cache_block * b = blocks[pos]; tr_torrent * tor = b->tor; const tr_piece_index_t piece = b->piece; const uint32_t offset = b->offset; for (i=pos; ievbuf, walk, b->length); walk += b->length; evbuffer_free (b->evbuf); tr_free (b); } tr_ptrArrayErase (&cache->blocks, pos, pos+n); err = tr_ioWrite (tor, piece, offset, walk-buf, buf); tr_free (buf); ++cache->disk_writes; cache->disk_write_bytes += walk-buf; return err; } static int flushRuns (tr_cache * cache, struct run_info * runs, int n) { int i; int err = 0; for (i=0; !err && i runs[i].pos) runs[j].pos -= runs[i].len; } return err; } static int cacheTrim (tr_cache * cache) { int err = 0; if (tr_ptrArraySize (&cache->blocks) > cache->max_blocks) { /* Amount of cache that should be removed by the flush. This influences how large * runs can grow as well as how often flushes will happen. */ const int cacheCutoff = 1 + cache->max_blocks / 4; struct run_info * runs = tr_new (struct run_info, tr_ptrArraySize (&cache->blocks)); int i=0, j=0; calcRuns (cache, runs); while (j < cacheCutoff) j += runs[i++].len; err = flushRuns (cache, runs, i); tr_free (runs); } return err; } /*** **** ***/ static int getMaxBlocks (int64_t max_bytes) { return max_bytes / (double)MAX_BLOCK_SIZE; } int tr_cacheSetLimit (tr_cache * cache, int64_t max_bytes) { char buf[128]; cache->max_bytes = max_bytes; cache->max_blocks = getMaxBlocks (max_bytes); tr_formatter_mem_B (buf, cache->max_bytes, sizeof (buf)); tr_logAddNamedDbg (MY_NAME, "Maximum cache size set to %s (%d blocks)", buf, cache->max_blocks); return cacheTrim (cache); } int64_t tr_cacheGetLimit (const tr_cache * cache) { return cache->max_bytes; } tr_cache * tr_cacheNew (int64_t max_bytes) { tr_cache * cache = tr_new0 (tr_cache, 1); cache->blocks = TR_PTR_ARRAY_INIT; cache->max_bytes = max_bytes; cache->max_blocks = getMaxBlocks (max_bytes); return cache; } void tr_cacheFree (tr_cache * cache) { assert (tr_ptrArrayEmpty (&cache->blocks)); tr_ptrArrayDestruct (&cache->blocks, NULL); tr_free (cache); } /*** **** ***/ static int cache_block_compare (const void * va, const void * vb) { const struct cache_block * a = va; const struct cache_block * b = vb; /* primary key: torrent id */ if (a->tor->uniqueId != b->tor->uniqueId) return a->tor->uniqueId < b->tor->uniqueId ? -1 : 1; /* secondary key: block # */ if (a->block != b->block) return a->block < b->block ? -1 : 1; /* they're equal */ return 0; } static struct cache_block * findBlock (tr_cache * cache, tr_torrent * torrent, tr_piece_index_t piece, uint32_t offset) { struct cache_block key; key.tor = torrent; key.block = _tr_block (torrent, piece, offset); return tr_ptrArrayFindSorted (&cache->blocks, &key, cache_block_compare); } int tr_cacheWriteBlock (tr_cache * cache, tr_torrent * torrent, tr_piece_index_t piece, uint32_t offset, uint32_t length, struct evbuffer * writeme) { struct cache_block * cb = findBlock (cache, torrent, piece, offset); assert (tr_amInEventThread (torrent->session)); if (cb == NULL) { cb = tr_new (struct cache_block, 1); cb->tor = torrent; cb->piece = piece; cb->offset = offset; cb->length = length; cb->block = _tr_block (torrent, piece, offset); cb->evbuf = evbuffer_new (); tr_ptrArrayInsertSorted (&cache->blocks, cb, cache_block_compare); } cb->time = tr_time (); assert (cb->length == length); evbuffer_drain (cb->evbuf, evbuffer_get_length (cb->evbuf)); evbuffer_remove_buffer (writeme, cb->evbuf, cb->length); cache->cache_writes++; cache->cache_write_bytes += cb->length; return cacheTrim (cache); } int tr_cacheReadBlock (tr_cache * cache, tr_torrent * torrent, tr_piece_index_t piece, uint32_t offset, uint32_t len, uint8_t * setme) { int err = 0; struct cache_block * cb = findBlock (cache, torrent, piece, offset); if (cb) evbuffer_copyout (cb->evbuf, setme, len); else err = tr_ioRead (torrent, piece, offset, len, setme); return err; } int tr_cachePrefetchBlock (tr_cache * cache, tr_torrent * torrent, tr_piece_index_t piece, uint32_t offset, uint32_t len) { int err = 0; struct cache_block * cb = findBlock (cache, torrent, piece, offset); if (cb == NULL) err = tr_ioPrefetch (torrent, piece, offset, len); return err; } /*** **** ***/ static int findBlockPos (tr_cache * cache, tr_torrent * torrent, tr_piece_index_t block) { struct cache_block key; key.tor = torrent; key.block = block; return tr_ptrArrayLowerBound (&cache->blocks, &key, cache_block_compare, NULL); } int tr_cacheFlushDone (tr_cache * cache) { int err = 0; if (tr_ptrArraySize (&cache->blocks) > 0) { int i, n; struct run_info * runs; runs = tr_new (struct run_info, tr_ptrArraySize (&cache->blocks)); i = 0; n = calcRuns (cache, runs); while (i < n && (runs[i].is_piece_done || runs[i].is_multi_piece)) runs[i++].rank |= SESSIONFLAG; err = flushRuns (cache, runs, i); tr_free (runs); } return err; } int tr_cacheFlushFile (tr_cache * cache, tr_torrent * torrent, tr_file_index_t i) { int pos; int err = 0; tr_block_index_t first; tr_block_index_t last; tr_torGetFileBlockRange (torrent, i, &first, &last); pos = findBlockPos (cache, torrent, first); dbgmsg ("flushing file %d from cache to disk: blocks [%zu...%zu]", (int)i, (size_t)first, (size_t)last); /* flush out all the blocks in that file */ while (!err && (pos < tr_ptrArraySize (&cache->blocks))) { const struct cache_block * b = tr_ptrArrayNth (&cache->blocks, pos); if (b->tor != torrent) break; if ((b->block < first) || (b->block > last)) break; err = flushContiguous (cache, pos, getBlockRun (cache, pos, NULL)); } return err; } int tr_cacheFlushTorrent (tr_cache * cache, tr_torrent * torrent) { int err = 0; const int pos = findBlockPos (cache, torrent, 0); /* flush out all the blocks in that torrent */ while (!err && (pos < tr_ptrArraySize (&cache->blocks))) { const struct cache_block * b = tr_ptrArrayNth (&cache->blocks, pos); if (b->tor != torrent) break; err = flushContiguous (cache, pos, getBlockRun (cache, pos, NULL)); } return err; } transmission-2.92/libtransmission/PaxHeaders.4960/webseed.h0000644000000000000000000000013212604343570020671 xustar0030 mtime=1444005752.186339076 30 atime=1444005752.186339076 30 ctime=1457295919.903806268 transmission-2.92/libtransmission/webseed.h0000644000175000017500000000122112604343570022312 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: webseed.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_WEBSEED_H #define TR_WEBSEED_H typedef struct tr_webseed tr_webseed; #include "peer-common.h" tr_webseed* tr_webseedNew (struct tr_torrent * torrent, const char * url, tr_peer_callback callback, void * callback_data); #endif transmission-2.92/libtransmission/PaxHeaders.4960/metainfo.c0000644000000000000000000000013212640354044021046 xustar0030 mtime=1451350052.446150319 30 atime=1451350052.446150319 30 ctime=1457295920.048808734 transmission-2.92/libtransmission/metainfo.c0000644000175000017500000004067312640354044022505 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: metainfo.c 14634 2015-12-25 11:34:35Z mikedld $ */ #include #include /* strlen () */ #include #include "transmission.h" #include "crypto-utils.h" /* tr_sha1 */ #include "file.h" #include "log.h" #include "metainfo.h" #include "platform.h" /* tr_getTorrentDir () */ #include "session.h" #include "utils.h" #include "variant.h" /*** **** ***/ #ifdef _WIN32 #define PATH_DELIMITER_CHARS "/\\" #else #define PATH_DELIMITER_CHARS "/" #endif static inline bool char_is_path_separator (char c) { return strchr(PATH_DELIMITER_CHARS, c) != NULL; } char* tr_metainfoGetBasename (const tr_info * inf) { size_t i; const char * name = inf->originalName; const size_t name_len = strlen (name); char * ret = tr_strdup_printf ("%s.%16.16s", name, inf->hashString); for (i=0; itotalSize = 0; if (tr_variantIsList (files)) /* multi-file mode */ { tr_file_index_t i; struct evbuffer * buf; const char * result; if (path_component_is_suspicious (inf->name)) return "path"; buf = evbuffer_new (); result = NULL; inf->isFolder = true; inf->fileCount = tr_variantListSize (files); inf->files = tr_new0 (tr_file, inf->fileCount); for (i=0; ifileCount; i++) { tr_variant * file; tr_variant * path; file = tr_variantListChild (files, i); if (!tr_variantIsDict (file)) { result = "files"; break; } if (!tr_variantDictFindList (file, TR_KEY_path_utf_8, &path)) if (!tr_variantDictFindList (file, TR_KEY_path, &path)) { result = "path"; break; } if (!getfile (&inf->files[i].name, inf->name, path, buf)) { result = "path"; break; } if (!tr_variantDictFindInt (file, TR_KEY_length, &len)) { result = "length"; break; } inf->files[i].length = len; inf->totalSize += len; } evbuffer_free (buf); return result; } else if (tr_variantGetInt (length, &len)) /* single-file mode */ { if (path_component_is_suspicious (inf->name)) return "path"; inf->isFolder = false; inf->fileCount = 1; inf->files = tr_new0 (tr_file, 1); inf->files[0].name = tr_strdup (inf->name); inf->files[0].length = len; inf->totalSize += len; } else { return "length"; } return NULL; } static char * tr_convertAnnounceToScrape (const char * announce) { char * scrape = NULL; const char * s; /* To derive the scrape URL use the following steps: * Begin with the announce URL. Find the last '/' in it. * If the text immediately following that '/' isn't 'announce' * it will be taken as a sign that that tracker doesn't support * the scrape convention. If it does, substitute 'scrape' for * 'announce' to find the scrape page. */ if (((s = strrchr (announce, '/'))) && !strncmp (++s, "announce", 8)) { const char * prefix = announce; const size_t prefix_len = s - announce; const char * suffix = s + 8; const size_t suffix_len = strlen (suffix); const size_t alloc_len = prefix_len + 6 + suffix_len + 1; char * walk = scrape = tr_new (char, alloc_len); memcpy (walk, prefix, prefix_len); walk += prefix_len; memcpy (walk, "scrape", 6); walk += 6; memcpy (walk, suffix, suffix_len); walk += suffix_len; *walk++ = '\0'; assert (walk - scrape == (int)alloc_len); } /* Some torrents with UDP annouce URLs don't have /announce. */ else if (!strncmp (announce, "udp:", 4)) { scrape = tr_strdup (announce); } return scrape; } static const char* getannounce (tr_info * inf, tr_variant * meta) { size_t len; const char * str; tr_tracker_info * trackers = NULL; int trackerCount = 0; tr_variant * tiers; /* Announce-list */ if (tr_variantDictFindList (meta, TR_KEY_announce_list, &tiers)) { int n; int i, j, validTiers; const int numTiers = tr_variantListSize (tiers); n = 0; for (i=0; itier = validTiers; t->announce = url; t->scrape = tr_convertAnnounceToScrape (url); t->id = trackerCount; anyAdded = true; ++trackerCount; } } } if (anyAdded) ++validTiers; } /* did we use any of the tiers? */ if (!trackerCount) { tr_free (trackers); trackers = NULL; } } /* Regular announce value */ if (!trackerCount && tr_variantDictFindStr (meta, TR_KEY_announce, &str, &len)) { char * url = tr_strstrip (tr_strndup (str, len)); if (!tr_urlIsValidTracker (url)) { tr_free (url); } else { trackers = tr_new0 (tr_tracker_info, 1); trackers[trackerCount].tier = 0; trackers[trackerCount].announce = url; trackers[trackerCount].scrape = tr_convertAnnounceToScrape (url); trackers[trackerCount].id = 0; trackerCount++; /*fprintf (stderr, "single announce: [%s]\n", url);*/ } } inf->trackers = trackers; inf->trackerCount = trackerCount; return NULL; } /** * @brief Ensure that the URLs for multfile torrents end in a slash. * * See http://bittorrent.org/beps/bep_0019.html#metadata-extension * for background on how the trailing slash is used for "url-list" * fields. * * This function is to workaround some .torrent generators, such as * mktorrent and very old versions of utorrent, that don't add the * trailing slash for multifile torrents if omitted by the end user. */ static char* fix_webseed_url (const tr_info * inf, const char * url_in) { size_t len; char * url; char * ret = NULL; url = tr_strdup (url_in); tr_strstrip (url); len = strlen (url); if (tr_urlIsValid (url, len)) { if ((inf->fileCount > 1) && (len > 0) && (url[len-1] != '/')) ret = tr_strdup_printf ("%*.*s/", (int)len, (int)len, url); else ret = tr_strndup (url, len); } tr_free (url); return ret; } static void geturllist (tr_info * inf, tr_variant * meta) { tr_variant * urls; const char * url; if (tr_variantDictFindList (meta, TR_KEY_url_list, &urls)) { int i; const int n = tr_variantListSize (urls); inf->webseedCount = 0; inf->webseeds = tr_new0 (char*, n); for (i=0; iwebseeds[inf->webseedCount++] = fixed_url; } } } else if (tr_variantDictFindStr (meta, TR_KEY_url_list, &url, NULL)) /* handle single items in webseeds */ { char * fixed_url = fix_webseed_url (inf, url); if (fixed_url != NULL) { inf->webseedCount = 1; inf->webseeds = tr_new0 (char*, 1); inf->webseeds[0] = fixed_url; } } } static const char* tr_metainfoParseImpl (const tr_session * session, tr_info * inf, bool * hasInfoDict, size_t * infoDictLength, const tr_variant * meta_in) { int64_t i; size_t len; const char * str; const uint8_t * raw; tr_variant * d; tr_variant * infoDict = NULL; tr_variant * meta = (tr_variant *) meta_in; bool b; bool isMagnet = false; /* info_hash: urlencoded 20-byte SHA1 hash of the value of the info key * from the Metainfo file. Note that the value will be a bencoded * dictionary, given the definition of the info key above. */ b = tr_variantDictFindDict (meta, TR_KEY_info, &infoDict); if (hasInfoDict != NULL) *hasInfoDict = b; if (!b) { /* no info dictionary... is this a magnet link? */ if (tr_variantDictFindDict (meta, TR_KEY_magnet_info, &d)) { isMagnet = true; /* get the info-hash */ if (!tr_variantDictFindRaw (d, TR_KEY_info_hash, &raw, &len)) return "info_hash"; if (len != SHA_DIGEST_LENGTH) return "info_hash"; memcpy (inf->hash, raw, len); tr_sha1_to_hex (inf->hashString, inf->hash); /* maybe get the display name */ if (tr_variantDictFindStr (d, TR_KEY_display_name, &str, &len)) { tr_free (inf->name); tr_free (inf->originalName); inf->name = tr_strndup (str, len); inf->originalName = tr_strndup (str, len); } if (!inf->name) inf->name = tr_strdup (inf->hashString); if (!inf->originalName) inf->originalName = tr_strdup (inf->hashString); } else /* not a magnet link and has no info dict... */ { return "info"; } } else { size_t len; char * bstr = tr_variantToStr (infoDict, TR_VARIANT_FMT_BENC, &len); tr_sha1 (inf->hash, bstr, len, NULL); tr_sha1_to_hex (inf->hashString, inf->hash); if (infoDictLength != NULL) *infoDictLength = len; tr_free (bstr); } /* name */ if (!isMagnet) { len = 0; if (!tr_variantDictFindStr (infoDict, TR_KEY_name_utf_8, &str, &len)) if (!tr_variantDictFindStr (infoDict, TR_KEY_name, &str, &len)) str = ""; if (!str || !*str) return "name"; tr_free (inf->name); tr_free (inf->originalName); inf->name = tr_utf8clean (str, len); inf->originalName = tr_strdup (inf->name); } /* comment */ len = 0; if (!tr_variantDictFindStr (meta, TR_KEY_comment_utf_8, &str, &len)) if (!tr_variantDictFindStr (meta, TR_KEY_comment, &str, &len)) str = ""; tr_free (inf->comment); inf->comment = tr_utf8clean (str, len); /* created by */ len = 0; if (!tr_variantDictFindStr (meta, TR_KEY_created_by_utf_8, &str, &len)) if (!tr_variantDictFindStr (meta, TR_KEY_created_by, &str, &len)) str = ""; tr_free (inf->creator); inf->creator = tr_utf8clean (str, len); /* creation date */ if (!tr_variantDictFindInt (meta, TR_KEY_creation_date, &i)) i = 0; inf->dateCreated = i; /* private */ if (!tr_variantDictFindInt (infoDict, TR_KEY_private, &i)) if (!tr_variantDictFindInt (meta, TR_KEY_private, &i)) i = 0; inf->isPrivate = i != 0; /* piece length */ if (!isMagnet) { if (!tr_variantDictFindInt (infoDict, TR_KEY_piece_length, &i) || (i < 1)) return "piece length"; inf->pieceSize = i; } /* pieces */ if (!isMagnet) { if (!tr_variantDictFindRaw (infoDict, TR_KEY_pieces, &raw, &len)) return "pieces"; if (len % SHA_DIGEST_LENGTH) return "pieces"; inf->pieceCount = len / SHA_DIGEST_LENGTH; inf->pieces = tr_new0 (tr_piece, inf->pieceCount); for (i=0; ipieceCount; i++) memcpy (inf->pieces[i].hash, &raw[i * SHA_DIGEST_LENGTH], SHA_DIGEST_LENGTH); } /* files */ if (!isMagnet) { if ((str = parseFiles (inf, tr_variantDictFind (infoDict, TR_KEY_files), tr_variantDictFind (infoDict, TR_KEY_length)))) return str; if (!inf->fileCount || !inf->totalSize) return "files"; if ((uint64_t) inf->pieceCount != (inf->totalSize + inf->pieceSize - 1) / inf->pieceSize) return "files"; } /* get announce or announce-list */ if ((str = getannounce (inf, meta))) return str; /* get the url-list */ geturllist (inf, meta); /* filename of Transmission's copy */ tr_free (inf->torrent); inf->torrent = session ? getTorrentFilename (session, inf) : NULL; return NULL; } bool tr_metainfoParse (const tr_session * session, const tr_variant * meta_in, tr_info * inf, bool * hasInfoDict, size_t * infoDictLength) { const char * badTag = tr_metainfoParseImpl (session, inf, hasInfoDict, infoDictLength, meta_in); const bool success = badTag == NULL; if (badTag) { tr_logAddNamedError (inf->name, _("Invalid metadata entry \"%s\""), badTag); tr_metainfoFree (inf); } return success; } void tr_metainfoFree (tr_info * inf) { unsigned int i; tr_file_index_t ff; for (i=0; iwebseedCount; i++) tr_free (inf->webseeds[i]); for (ff=0; fffileCount; ff++) tr_free (inf->files[ff].name); tr_free (inf->webseeds); tr_free (inf->pieces); tr_free (inf->files); tr_free (inf->comment); tr_free (inf->creator); tr_free (inf->torrent); tr_free (inf->originalName); tr_free (inf->name); for (i=0; itrackerCount; i++) { tr_free (inf->trackers[i].announce); tr_free (inf->trackers[i].scrape); } tr_free (inf->trackers); memset (inf, '\0', sizeof (tr_info)); } void tr_metainfoRemoveSaved (const tr_session * session, const tr_info * inf) { char * filename; filename = getTorrentFilename (session, inf); tr_sys_path_remove (filename, NULL); tr_free (filename); } transmission-2.92/libtransmission/PaxHeaders.4960/completion.h0000644000000000000000000000013012442116602021414 xustar0029 mtime=1418239362.93122258 29 atime=1418239362.93122258 30 ctime=1457295919.609801269 transmission-2.92/libtransmission/completion.h0000644000175000017500000000654412442116602023054 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: completion.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_COMPLETION_H #define TR_COMPLETION_H #include "transmission.h" #include "bitfield.h" #include "utils.h" /* tr_getRatio () */ typedef struct tr_completion { tr_torrent * tor; tr_bitfield blockBitfield; /* number of bytes we'll have when done downloading. [0..info.totalSize] DON'T access this directly; it's a lazy field. use tr_cpSizeWhenDone () instead! */ uint64_t sizeWhenDoneLazy; /* whether or not sizeWhenDone needs to be recalculated */ bool sizeWhenDoneIsDirty; /* number of bytes we'll have when done downloading. [0..info.totalSize] DON'T access this directly; it's a lazy field. use tr_cpHaveValid () instead! */ uint64_t haveValidLazy; /* whether or not haveValidLazy needs to be recalculated */ bool haveValidIsDirty; /* number of bytes we want or have now. [0..sizeWhenDone] */ uint64_t sizeNow; } tr_completion; /** *** Life Cycle **/ void tr_cpConstruct (tr_completion *, tr_torrent *); void tr_cpBlockInit (tr_completion * cp, const tr_bitfield * blocks); static inline void tr_cpDestruct (tr_completion * cp) { tr_bitfieldDestruct (&cp->blockBitfield); } /** *** General **/ double tr_cpPercentComplete (const tr_completion * cp); double tr_cpPercentDone (const tr_completion * cp); tr_completeness tr_cpGetStatus (const tr_completion *); uint64_t tr_cpHaveValid (const tr_completion *); uint64_t tr_cpSizeWhenDone (const tr_completion *); uint64_t tr_cpLeftUntilDone (const tr_completion *); void tr_cpGetAmountDone (const tr_completion * completion, float * tab, int tabCount); static inline uint64_t tr_cpHaveTotal (const tr_completion * cp) { return cp->sizeNow; } static inline bool tr_cpHasAll (const tr_completion * cp) { return tr_torrentHasMetadata (cp->tor) && tr_bitfieldHasAll (&cp->blockBitfield); } static inline bool tr_cpHasNone (const tr_completion * cp) { return !tr_torrentHasMetadata (cp->tor) || tr_bitfieldHasNone (&cp->blockBitfield); } /** *** Pieces **/ void tr_cpPieceAdd (tr_completion * cp, tr_piece_index_t i); void tr_cpPieceRem (tr_completion * cp, tr_piece_index_t i); size_t tr_cpMissingBlocksInPiece (const tr_completion *, tr_piece_index_t); size_t tr_cpMissingBytesInPiece (const tr_completion *, tr_piece_index_t); static inline bool tr_cpPieceIsComplete (const tr_completion * cp, tr_piece_index_t i) { return tr_cpMissingBlocksInPiece (cp, i) == 0; } /** *** Blocks **/ void tr_cpBlockAdd (tr_completion * cp, tr_block_index_t i); static inline bool tr_cpBlockIsComplete (const tr_completion * cp, tr_block_index_t i) { return tr_bitfieldHas (&cp->blockBitfield, i); } /*** **** Misc ***/ bool tr_cpFileIsComplete (const tr_completion * cp, tr_file_index_t); void* tr_cpCreatePieceBitfield (const tr_completion * cp, size_t * byte_count); static inline void tr_cpInvalidateDND (tr_completion * cp) { cp->sizeWhenDoneIsDirty = true; } #endif transmission-2.92/libtransmission/PaxHeaders.4960/variant.h0000644000000000000000000000013212640354044020715 xustar0030 mtime=1451350052.454150458 30 atime=1451350052.454150458 30 ctime=1457295919.862805571 transmission-2.92/libtransmission/variant.h0000644000175000017500000003371612640354044022354 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: variant.h 14634 2015-12-25 11:34:35Z mikedld $ */ #ifndef TR_VARIANT_H #define TR_VARIANT_H 1 #ifdef __cplusplus extern "C" { #endif #include /* for int64_t */ #include "quark.h" struct evbuffer; struct tr_error; /** * @addtogroup tr_variant Variant * * An object that acts like a union for * integers, strings, lists, dictionaries, booleans, and floating-point numbers. * The structure is named tr_variant due to the historical reason that it was * originally tightly coupled with bencoded data. It currently supports * being parsed from, and serialized to, both bencoded notation and json notation. * * @{ */ typedef enum { TR_STRING_TYPE_QUARK, TR_STRING_TYPE_HEAP, TR_STRING_TYPE_BUF } tr_string_type; /* these are PRIVATE IMPLEMENTATION details that should not be touched. * I'll probably change them just to break your code! HA HA HA! * it's included in the header for inlining and composition */ struct tr_variant_string { tr_string_type type; tr_quark quark; size_t len; union { char buf[16]; const char * str; } str; }; /* these are PRIVATE IMPLEMENTATION details that should not be touched. * I'll probably change them just to break your code! HA HA HA! * it's included in the header for inlining and composition */ enum { TR_VARIANT_TYPE_INT = 1, TR_VARIANT_TYPE_STR = 2, TR_VARIANT_TYPE_LIST = 4, TR_VARIANT_TYPE_DICT = 8, TR_VARIANT_TYPE_BOOL = 16, TR_VARIANT_TYPE_REAL = 32 }; /* These are PRIVATE IMPLEMENTATION details that should not be touched. * I'll probably change them just to break your code! HA HA HA! * it's included in the header for inlining and composition */ typedef struct tr_variant { char type; tr_quark key; union { bool b; double d; int64_t i; struct tr_variant_string s; struct { size_t alloc; size_t count; struct tr_variant * vals; } l; } val; } tr_variant; void tr_variantFree (tr_variant *); /*** **** Serialization / Deserialization ***/ typedef enum { TR_VARIANT_FMT_BENC, TR_VARIANT_FMT_JSON, TR_VARIANT_FMT_JSON_LEAN /* saves bandwidth by omitting all whitespace. */ } tr_variant_fmt; int tr_variantToFile (const tr_variant * variant, tr_variant_fmt fmt, const char * filename); char* tr_variantToStr (const tr_variant * variant, tr_variant_fmt fmt, size_t * len); struct evbuffer * tr_variantToBuf (const tr_variant * variant, tr_variant_fmt fmt); /* TR_VARIANT_FMT_JSON_LEAN and TR_VARIANT_FMT_JSON are equivalent here. */ bool tr_variantFromFile (tr_variant * setme, tr_variant_fmt fmt, const char * filename, struct tr_error ** error); /* TR_VARIANT_FMT_JSON_LEAN and TR_VARIANT_FMT_JSON are equivalent here. */ int tr_variantFromBuf (tr_variant * setme, tr_variant_fmt fmt, const void * buf, size_t buflen, const char * optional_source, const char ** setme_end); static inline int tr_variantFromBenc (tr_variant * setme, const void * buf, size_t buflen) { return tr_variantFromBuf (setme, TR_VARIANT_FMT_BENC, buf, buflen, NULL, NULL); } static inline int tr_variantFromBencFull (tr_variant * setme, const void * buf, size_t buflen, const char * source, const char ** setme_end) { return tr_variantFromBuf (setme, TR_VARIANT_FMT_BENC, buf, buflen, source, setme_end); } static inline int tr_variantFromJsonFull (tr_variant * setme, const void * buf, size_t buflen, const char * source, const char ** setme_end) { return tr_variantFromBuf (setme, TR_VARIANT_FMT_JSON, buf, buflen, source, setme_end); } static inline int tr_variantFromJson (tr_variant * setme, const void * buf, size_t buflen) { return tr_variantFromBuf (setme, TR_VARIANT_FMT_JSON, buf, buflen, NULL, NULL); } static inline bool tr_variantIsType (const tr_variant * b, int type) { return (b != NULL) && (b->type == type); } /*** **** Strings ***/ static inline bool tr_variantIsString (const tr_variant * b) { return (b != NULL) && (b->type == TR_VARIANT_TYPE_STR); } bool tr_variantGetStr (const tr_variant * variant, const char ** setme_str, size_t * setme_len); void tr_variantInitStr (tr_variant * initme, const void * str, size_t str_len); void tr_variantInitQuark (tr_variant * initme, const tr_quark quark); void tr_variantInitRaw (tr_variant * initme, const void * raw, size_t raw_len); bool tr_variantGetRaw (const tr_variant * variant, const uint8_t ** raw_setme, size_t * len_setme); /*** **** Real Numbers ***/ static inline bool tr_variantIsReal (const tr_variant * v) { return (v != NULL) && (v->type == TR_VARIANT_TYPE_REAL); } void tr_variantInitReal (tr_variant * initme, double value); bool tr_variantGetReal (const tr_variant * variant, double * value_setme); /*** **** Booleans ***/ static inline bool tr_variantIsBool (const tr_variant * v) { return (v != NULL) && (v->type == TR_VARIANT_TYPE_BOOL); } void tr_variantInitBool (tr_variant * initme, bool value); bool tr_variantGetBool (const tr_variant * variant, bool * setme); /*** **** Ints ***/ static inline bool tr_variantIsInt (const tr_variant * v) { return (v != NULL) && (v->type == TR_VARIANT_TYPE_INT); } void tr_variantInitInt (tr_variant * variant, int64_t value); bool tr_variantGetInt (const tr_variant * val, int64_t * setme); /*** **** Lists ***/ static inline bool tr_variantIsList (const tr_variant * v) { return (v != NULL) && (v->type == TR_VARIANT_TYPE_LIST); } void tr_variantInitList (tr_variant * list, size_t reserve_count); void tr_variantListReserve (tr_variant * list, size_t reserve_count); tr_variant * tr_variantListAdd (tr_variant * list); tr_variant * tr_variantListAddBool (tr_variant * list, bool addme); tr_variant * tr_variantListAddInt (tr_variant * list, int64_t addme); tr_variant * tr_variantListAddReal (tr_variant * list, double addme); tr_variant * tr_variantListAddStr (tr_variant * list, const char * addme); tr_variant * tr_variantListAddQuark (tr_variant * list, const tr_quark addme); tr_variant * tr_variantListAddRaw (tr_variant * list, const void * addme_value, size_t addme_len); tr_variant * tr_variantListAddList (tr_variant * list, size_t reserve_count); tr_variant * tr_variantListAddDict (tr_variant * list, size_t reserve_count); tr_variant * tr_variantListChild (tr_variant * list, size_t pos); bool tr_variantListRemove (tr_variant * list, size_t pos); size_t tr_variantListSize (const tr_variant * list); /*** **** Dictionaries ***/ static inline bool tr_variantIsDict (const tr_variant * v) { return (v != NULL) && (v->type == TR_VARIANT_TYPE_DICT); } void tr_variantInitDict (tr_variant * initme, size_t reserve_count); void tr_variantDictReserve (tr_variant * dict, size_t reserve_count); bool tr_variantDictRemove (tr_variant * dict, const tr_quark key); tr_variant * tr_variantDictAdd (tr_variant * dict, const tr_quark key); tr_variant * tr_variantDictAddReal (tr_variant * dict, const tr_quark key, double value); tr_variant * tr_variantDictAddInt (tr_variant * dict, const tr_quark key, int64_t value); tr_variant * tr_variantDictAddBool (tr_variant * dict, const tr_quark key, bool value); tr_variant * tr_variantDictAddStr (tr_variant * dict, const tr_quark key, const char * value); tr_variant * tr_variantDictAddQuark (tr_variant * dict, const tr_quark key, const tr_quark val); tr_variant * tr_variantDictAddList (tr_variant * dict, const tr_quark key, size_t reserve_count); tr_variant * tr_variantDictAddDict (tr_variant * dict, const tr_quark key, size_t reserve_count); tr_variant * tr_variantDictSteal (tr_variant * dict, const tr_quark key, tr_variant * value); tr_variant * tr_variantDictAddRaw (tr_variant * dict, const tr_quark key, const void * value, size_t len); bool tr_variantDictChild (tr_variant * dict, size_t pos, tr_quark * setme_key, tr_variant ** setme_value); tr_variant * tr_variantDictFind (tr_variant * dict, const tr_quark key); bool tr_variantDictFindList (tr_variant * dict, const tr_quark key, tr_variant ** setme); bool tr_variantDictFindDict (tr_variant * dict, const tr_quark key, tr_variant ** setme_value); bool tr_variantDictFindInt (tr_variant * dict, const tr_quark key, int64_t * setme); bool tr_variantDictFindReal (tr_variant * dict, const tr_quark key, double * setme); bool tr_variantDictFindBool (tr_variant * dict, const tr_quark key, bool * setme); bool tr_variantDictFindStr (tr_variant * dict, const tr_quark key, const char ** setme, size_t * len); bool tr_variantDictFindRaw (tr_variant * dict, const tr_quark key, const uint8_t ** setme_raw, size_t * setme_len); /* this is only quasi-supported. don't rely on it too heavily outside of libT */ void tr_variantMergeDicts (tr_variant * dict_target, const tr_variant * dict_source); /*** **** **** ***/ /** *** **/ /* @} */ #ifdef __cplusplus } #endif #endif transmission-2.92/libtransmission/PaxHeaders.4960/rpc-server.c0000644000000000000000000000013212644245522021340 xustar0030 mtime=1452362578.740698836 30 atime=1452362578.740698836 30 ctime=1457295920.128810095 transmission-2.92/libtransmission/rpc-server.c0000644000175000017500000007563312644245522023003 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: rpc-server.c 14663 2016-01-07 15:28:58Z mikedld $ */ #include #include #include /* memcpy */ #include #include #include #include #include /* TODO: eventually remove this */ #include "transmission.h" #include "crypto.h" /* tr_ssha1_matches () */ #include "crypto-utils.h" /* tr_rand_buffer () */ #include "error.h" #include "fdlimit.h" #include "list.h" #include "log.h" #include "net.h" #include "platform.h" /* tr_getWebClientDir () */ #include "ptrarray.h" #include "rpcimpl.h" #include "rpc-server.h" #include "session.h" #include "trevent.h" #include "utils.h" #include "variant.h" #include "web.h" /* session-id is used to make cross-site request forgery attacks difficult. * Don't disable this feature unless you really know what you're doing! * http://en.wikipedia.org/wiki/Cross-site_request_forgery * http://shiflett.org/articles/cross-site-request-forgeries * http://www.webappsec.org/lists/websecurity/archive/2008-04/msg00037.html */ #define REQUIRE_SESSION_ID #define MY_NAME "RPC Server" #define MY_REALM "Transmission" #define TR_N_ELEMENTS(ary) (sizeof (ary) / sizeof (*ary)) struct tr_rpc_server { bool isEnabled; bool isPasswordEnabled; bool isWhitelistEnabled; tr_port port; char * url; struct in_addr bindAddress; struct evhttp * httpd; struct event * start_retry_timer; int start_retry_counter; tr_session * session; char * username; char * password; char * whitelistStr; tr_list * whitelist; char * sessionId; time_t sessionIdExpiresAt; bool isStreamInitialized; z_stream stream; }; #define dbgmsg(...) \ do { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, MY_NAME, __VA_ARGS__); \ } while (0) /*** **** ***/ static char* get_current_session_id (struct tr_rpc_server * server) { const time_t now = tr_time (); if (!server->sessionId || (now >= server->sessionIdExpiresAt)) { int i; const int n = 48; const char * pool = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; const size_t pool_size = strlen (pool); unsigned char * buf = tr_new (unsigned char, n+1); tr_rand_buffer (buf, n); for (i=0; isessionId); server->sessionId = (char*) buf; server->sessionIdExpiresAt = now + (60*60); /* expire in an hour */ } return server->sessionId; } /** *** **/ static void send_simple_response (struct evhttp_request * req, int code, const char * text) { const char * code_text = tr_webGetResponseStr (code); struct evbuffer * body = evbuffer_new (); evbuffer_add_printf (body, "

%d: %s

", code, code_text); if (text) evbuffer_add_printf (body, "%s", text); evhttp_send_reply (req, code, code_text, body); evbuffer_free (body); } struct tr_mimepart { char * headers; size_t headers_len; char * body; size_t body_len; }; static void tr_mimepart_free (struct tr_mimepart * p) { tr_free (p->body); tr_free (p->headers); tr_free (p); } static void extract_parts_from_multipart (const struct evkeyvalq * headers, struct evbuffer * body, tr_ptrArray * setme_parts) { const char * content_type = evhttp_find_header (headers, "Content-Type"); const char * in = (const char*) evbuffer_pullup (body, -1); size_t inlen = evbuffer_get_length (body); const char * boundary_key = "boundary="; const char * boundary_key_begin = content_type ? strstr (content_type, boundary_key) : NULL; const char * boundary_val = boundary_key_begin ? boundary_key_begin + strlen (boundary_key) : "arglebargle"; char * boundary = tr_strdup_printf ("--%s", boundary_val); const size_t boundary_len = strlen (boundary); const char * delim = tr_memmem (in, inlen, boundary, boundary_len); while (delim) { size_t part_len; const char * part = delim + boundary_len; inlen -= (part - in); in = part; delim = tr_memmem (in, inlen, boundary, boundary_len); part_len = delim ? (size_t)(delim - part) : inlen; if (part_len) { const char * rnrn = tr_memmem (part, part_len, "\r\n\r\n", 4); if (rnrn) { struct tr_mimepart * p = tr_new (struct tr_mimepart, 1); p->headers_len = (size_t) (rnrn - part); p->headers = tr_strndup (part, p->headers_len); p->body_len = (size_t) ((part + part_len) - (rnrn + 4)); p->body = tr_strndup (rnrn+4, p->body_len); tr_ptrArrayAppend (setme_parts, p); } } } tr_free (boundary); } static void handle_upload (struct evhttp_request * req, struct tr_rpc_server * server) { if (req->type != EVHTTP_REQ_POST) { send_simple_response (req, 405, NULL); } else { int i; int n; bool hasSessionId = false; tr_ptrArray parts = TR_PTR_ARRAY_INIT; const char * query = strchr (req->uri, '?'); const bool paused = query && strstr (query + 1, "paused=true"); extract_parts_from_multipart (req->input_headers, req->input_buffer, &parts); n = tr_ptrArraySize (&parts); /* first look for the session id */ for (i=0; iheaders, p->headers_len, TR_RPC_SESSION_ID_HEADER, strlen (TR_RPC_SESSION_ID_HEADER))) break; } if (ibody_len && !memcmp (p->body, ours, ourlen); } if (!hasSessionId) { int code = 409; const char * codetext = tr_webGetResponseStr (code); struct evbuffer * body = evbuffer_new (); evbuffer_add_printf (body, "%s", "{ \"success\": false, \"msg\": \"Bad Session-Id\" }");; evhttp_send_reply (req, code, codetext, body); evbuffer_free (body); } else for (i=0; ibody_len; tr_variant top, *args; tr_variant test; bool have_source = false; char * body = p->body; if (body_len >= 2 && !memcmp (&body[body_len - 2], "\r\n", 2)) body_len -= 2; tr_variantInitDict (&top, 2); tr_variantDictAddStr (&top, TR_KEY_method, "torrent-add"); args = tr_variantDictAddDict (&top, TR_KEY_arguments, 2); tr_variantDictAddBool (args, TR_KEY_paused, paused); if (tr_urlIsValid (body, body_len)) { tr_variantDictAddRaw (args, TR_KEY_filename, body, body_len); have_source = true; } else if (!tr_variantFromBenc (&test, body, body_len)) { char * b64 = tr_base64_encode (body, body_len, NULL); tr_variantDictAddStr (args, TR_KEY_metainfo, b64); tr_free (b64); have_source = true; } if (have_source) tr_rpc_request_exec_json (server->session, &top, NULL, NULL); tr_variantFree (&top); } tr_ptrArrayDestruct (&parts, (PtrArrayForeachFunc)tr_mimepart_free); /* send "success" response */ { int code = HTTP_OK; const char * codetext = tr_webGetResponseStr (code); struct evbuffer * body = evbuffer_new (); evbuffer_add_printf (body, "%s", "{ \"success\": true, \"msg\": \"Torrent Added\" }");; evhttp_send_reply (req, code, codetext, body); evbuffer_free (body); } } } /*** **** ***/ static const char* mimetype_guess (const char * path) { unsigned int i; const struct { const char * suffix; const char * mime_type; } types[] = { /* these are the ones we need for serving the web client's files... */ { "css", "text/css" }, { "gif", "image/gif" }, { "html", "text/html" }, { "ico", "image/vnd.microsoft.icon" }, { "js", "application/javascript" }, { "png", "image/png" } }; const char * dot = strrchr (path, '.'); for (i = 0; dot && i < TR_N_ELEMENTS (types); ++i) if (!strcmp (dot + 1, types[i].suffix)) return types[i].mime_type; return "application/octet-stream"; } static void add_response (struct evhttp_request * req, struct tr_rpc_server * server, struct evbuffer * out, struct evbuffer * content) { const char * key = "Accept-Encoding"; const char * encoding = evhttp_find_header (req->input_headers, key); const int do_compress = encoding && strstr (encoding, "gzip"); if (!do_compress) { evbuffer_add_buffer (out, content); } else { int state; struct evbuffer_iovec iovec[1]; void * content_ptr = evbuffer_pullup (content, -1); const size_t content_len = evbuffer_get_length (content); if (!server->isStreamInitialized) { int compressionLevel; server->isStreamInitialized = true; server->stream.zalloc = (alloc_func) Z_NULL; server->stream.zfree = (free_func) Z_NULL; server->stream.opaque = (voidpf) Z_NULL; /* zlib's manual says: "Add 16 to windowBits to write a simple gzip header * and trailer around the compressed data instead of a zlib wrapper." */ #ifdef TR_LIGHTWEIGHT compressionLevel = Z_DEFAULT_COMPRESSION; #else compressionLevel = Z_BEST_COMPRESSION; #endif deflateInit2 (&server->stream, compressionLevel, Z_DEFLATED, 15+16, 8, Z_DEFAULT_STRATEGY); } server->stream.next_in = content_ptr; server->stream.avail_in = content_len; /* allocate space for the raw data and call deflate () just once -- * we won't use the deflated data if it's longer than the raw data, * so it's okay to let deflate () run out of output buffer space */ evbuffer_reserve_space (out, content_len, iovec, 1); server->stream.next_out = iovec[0].iov_base; server->stream.avail_out = iovec[0].iov_len; state = deflate (&server->stream, Z_FINISH); if (state == Z_STREAM_END) { iovec[0].iov_len -= server->stream.avail_out; #if 0 fprintf (stderr, "compressed response is %.2f of original (raw==%zu bytes; compressed==%zu)\n", (double)evbuffer_get_length (out)/content_len, content_len, evbuffer_get_length (out)); #endif evhttp_add_header (req->output_headers, "Content-Encoding", "gzip"); } else { memcpy (iovec[0].iov_base, content_ptr, content_len); iovec[0].iov_len = content_len; } evbuffer_commit_space (out, iovec, 1); deflateReset (&server->stream); } } static void add_time_header (struct evkeyvalq * headers, const char * key, time_t value) { /* According to RFC 2616 this must follow RFC 1123's date format, so use gmtime instead of localtime... */ char buf[128]; struct tm tm = *gmtime (&value); strftime (buf, sizeof (buf), "%a, %d %b %Y %H:%M:%S GMT", &tm); evhttp_add_header (headers, key, buf); } static void evbuffer_ref_cleanup_tr_free (const void * data UNUSED, size_t datalen UNUSED, void * extra) { tr_free (extra); } static void serve_file (struct evhttp_request * req, struct tr_rpc_server * server, const char * filename) { if (req->type != EVHTTP_REQ_GET) { evhttp_add_header (req->output_headers, "Allow", "GET"); send_simple_response (req, 405, NULL); } else { void * file; size_t file_len; tr_error * error = NULL; file_len = 0; file = tr_loadFile (filename, &file_len, &error); if (file == NULL) { char * tmp = tr_strdup_printf ("%s (%s)", filename, error->message); send_simple_response (req, HTTP_NOTFOUND, tmp); tr_free (tmp); tr_error_free (error); } else { struct evbuffer * content; struct evbuffer * out; const time_t now = tr_time (); content = evbuffer_new (); evbuffer_add_reference (content, file, file_len, evbuffer_ref_cleanup_tr_free, file); out = evbuffer_new (); evhttp_add_header (req->output_headers, "Content-Type", mimetype_guess (filename)); add_time_header (req->output_headers, "Date", now); add_time_header (req->output_headers, "Expires", now+ (24*60*60)); add_response (req, server, out, content); evhttp_send_reply (req, HTTP_OK, "OK", out); evbuffer_free (out); evbuffer_free (content); } } } static void handle_web_client (struct evhttp_request * req, struct tr_rpc_server * server) { const char * webClientDir = tr_getWebClientDir (server->session); if (!webClientDir || !*webClientDir) { send_simple_response (req, HTTP_NOTFOUND, "

Couldn't find Transmission's web interface files!

" "

Users: to tell Transmission where to look, " "set the TRANSMISSION_WEB_HOME environment " "variable to the folder where the web interface's " "index.html is located.

" "

Package Builders: to set a custom default at compile time, " "#define PACKAGE_DATA_DIR in libtransmission/platform.c " "or tweak tr_getClutchDir () by hand.

"); } else { char * pch; char * subpath; subpath = tr_strdup (req->uri + strlen (server->url) + 4); if ((pch = strchr (subpath, '?'))) *pch = '\0'; if (strstr (subpath, "..")) { send_simple_response (req, HTTP_NOTFOUND, "

Tsk, tsk.

"); } else { char * filename = tr_strdup_printf ("%s%s%s", webClientDir, TR_PATH_DELIMITER_STR, *subpath != '\0' ? subpath : "index.html"); serve_file (req, server, filename); tr_free (filename); } tr_free (subpath); } } struct rpc_response_data { struct evhttp_request * req; struct tr_rpc_server * server; }; static void rpc_response_func (tr_session * session UNUSED, tr_variant * response, void * user_data) { struct rpc_response_data * data = user_data; struct evbuffer * response_buf = tr_variantToBuf (response, TR_VARIANT_FMT_JSON_LEAN); struct evbuffer * buf = evbuffer_new (); add_response (data->req, data->server, buf, response_buf); evhttp_add_header (data->req->output_headers, "Content-Type", "application/json; charset=UTF-8"); evhttp_send_reply (data->req, HTTP_OK, "OK", buf); evbuffer_free (buf); evbuffer_free (response_buf); tr_free (data); } static void handle_rpc_from_json (struct evhttp_request * req, struct tr_rpc_server * server, const char * json, size_t json_len) { tr_variant top; bool have_content = tr_variantFromJson (&top, json, json_len) == 0; struct rpc_response_data * data; data = tr_new0 (struct rpc_response_data, 1); data->req = req; data->server = server; tr_rpc_request_exec_json (server->session, have_content ? &top : NULL, rpc_response_func, data); if (have_content) tr_variantFree (&top); } static void handle_rpc (struct evhttp_request * req, struct tr_rpc_server * server) { const char * q; if (req->type == EVHTTP_REQ_POST) { handle_rpc_from_json (req, server, (const char *) evbuffer_pullup (req->input_buffer, -1), evbuffer_get_length (req->input_buffer)); } else if ((req->type == EVHTTP_REQ_GET) && ((q = strchr (req->uri, '?')))) { struct rpc_response_data * data = tr_new0 (struct rpc_response_data, 1); data->req = req; data->server = server; tr_rpc_request_exec_uri (server->session, q + 1, TR_BAD_SIZE, rpc_response_func, data); } else { send_simple_response (req, 405, NULL); } } static bool isAddressAllowed (const tr_rpc_server * server, const char * address) { tr_list * l; if (!server->isWhitelistEnabled) return true; for (l=server->whitelist; l!=NULL; l=l->next) if (tr_wildmat (address, l->data)) return true; return false; } static bool test_session_id (struct tr_rpc_server * server, struct evhttp_request * req) { const char * ours = get_current_session_id (server); const char * theirs = evhttp_find_header (req->input_headers, TR_RPC_SESSION_ID_HEADER); const bool success = theirs && !strcmp (theirs, ours); return success; } static void handle_request (struct evhttp_request * req, void * arg) { struct tr_rpc_server * server = arg; if (req && req->evcon) { const char * auth; char * user = NULL; char * pass = NULL; evhttp_add_header (req->output_headers, "Server", MY_REALM); auth = evhttp_find_header (req->input_headers, "Authorization"); if (auth && !evutil_ascii_strncasecmp (auth, "basic ", 6)) { size_t plen; char * p = tr_base64_decode_str (auth + 6, &plen); if (p != NULL) { if (plen > 0 && (pass = strchr (p, ':')) != NULL) { user = p; *pass++ = '\0'; } else { tr_free (p); } } } if (!isAddressAllowed (server, req->remote_host)) { send_simple_response (req, 403, "

Unauthorized IP Address.

" "

Either disable the IP address whitelist or add your address to it.

" "

If you're editing settings.json, see the 'rpc-whitelist' and 'rpc-whitelist-enabled' entries.

" "

If you're still using ACLs, use a whitelist instead. See the transmission-daemon manpage for details.

"); } else if (server->isPasswordEnabled && (!pass || !user || strcmp (server->username, user) || !tr_ssha1_matches (server->password, pass))) { evhttp_add_header (req->output_headers, "WWW-Authenticate", "Basic realm=\"" MY_REALM "\""); send_simple_response (req, 401, "Unauthorized User"); } else if (strncmp (req->uri, server->url, strlen (server->url))) { char * location = tr_strdup_printf ("%sweb/", server->url); evhttp_add_header (req->output_headers, "Location", location); send_simple_response (req, HTTP_MOVEPERM, NULL); tr_free (location); } else if (!strncmp (req->uri + strlen (server->url), "web/", 4)) { handle_web_client (req, server); } else if (!strcmp (req->uri + strlen (server->url), "upload")) { handle_upload (req, server); } #ifdef REQUIRE_SESSION_ID else if (!test_session_id (server, req)) { const char * sessionId = get_current_session_id (server); char * tmp = tr_strdup_printf ( "

Your request had an invalid session-id header.

" "

To fix this, follow these steps:" "

  1. When reading a response, get its X-Transmission-Session-Id header and remember it" "
  2. Add the updated header to your outgoing requests" "
  3. When you get this 409 error message, resend your request with the updated header" "

" "

This requirement has been added to help prevent " "CSRF " "attacks.

" "

%s: %s

", TR_RPC_SESSION_ID_HEADER, sessionId); evhttp_add_header (req->output_headers, TR_RPC_SESSION_ID_HEADER, sessionId); send_simple_response (req, 409, tmp); tr_free (tmp); } #endif else if (!strncmp (req->uri + strlen (server->url), "rpc", 3)) { handle_rpc (req, server); } else { send_simple_response (req, HTTP_NOTFOUND, req->uri); } tr_free (user); } } enum { SERVER_START_RETRY_COUNT = 10, SERVER_START_RETRY_DELAY_STEP = 3, SERVER_START_RETRY_DELAY_INCREMENT = 5, SERVER_START_RETRY_MAX_DELAY = 60 }; static void startServer (void * vserver); static void rpc_server_on_start_retry (evutil_socket_t fd UNUSED, short type UNUSED, void * context) { startServer (context); } static int rpc_server_start_retry (tr_rpc_server * server) { int retry_delay = (server->start_retry_counter / SERVER_START_RETRY_DELAY_STEP + 1) * SERVER_START_RETRY_DELAY_INCREMENT; retry_delay = MIN (retry_delay, SERVER_START_RETRY_MAX_DELAY); if (server->start_retry_timer == NULL) server->start_retry_timer = evtimer_new (server->session->event_base, rpc_server_on_start_retry, server); tr_timerAdd (server->start_retry_timer, retry_delay, 0); ++server->start_retry_counter; return retry_delay; } static void rpc_server_start_retry_cancel (tr_rpc_server * server) { if (server->start_retry_timer != NULL) { event_free (server->start_retry_timer); server->start_retry_timer = NULL; } server->start_retry_counter = 0; } static void startServer (void * vserver) { tr_rpc_server * server = vserver; if (server->httpd != NULL) return; struct evhttp * httpd = evhttp_new (server->session->event_base); const char * address = tr_rpcGetBindAddress (server); const int port = server->port; if (evhttp_bind_socket (httpd, address, port) == -1) { evhttp_free (httpd); if (server->start_retry_counter < SERVER_START_RETRY_COUNT) { const int retry_delay = rpc_server_start_retry (server); tr_logAddNamedDbg (MY_NAME, "Unable to bind to %s:%d, retrying in %d seconds", address, port, retry_delay); return; } tr_logAddNamedError (MY_NAME, "Unable to bind to %s:%d after %d attempts, giving up", address, port, SERVER_START_RETRY_COUNT); } else { evhttp_set_gencb (httpd, handle_request, server); server->httpd = httpd; tr_logAddNamedDbg (MY_NAME, "Started listening on %s:%d", address, port); } rpc_server_start_retry_cancel (server); } static void stopServer (tr_rpc_server * server) { rpc_server_start_retry_cancel (server); struct evhttp * httpd = server->httpd; if (httpd == NULL) return; const char * address = tr_rpcGetBindAddress (server); const int port = server->port; server->httpd = NULL; evhttp_free (httpd); tr_logAddNamedDbg (MY_NAME, "Stopped listening on %s:%d", address, port); } static void onEnabledChanged (void * vserver) { tr_rpc_server * server = vserver; if (!server->isEnabled) stopServer (server); else startServer (server); } void tr_rpcSetEnabled (tr_rpc_server * server, bool isEnabled) { server->isEnabled = isEnabled; tr_runInEventThread (server->session, onEnabledChanged, server); } bool tr_rpcIsEnabled (const tr_rpc_server * server) { return server->isEnabled; } static void restartServer (void * vserver) { tr_rpc_server * server = vserver; if (server->isEnabled) { stopServer (server); startServer (server); } } void tr_rpcSetPort (tr_rpc_server * server, tr_port port) { assert (server != NULL); if (server->port != port) { server->port = port; if (server->isEnabled) tr_runInEventThread (server->session, restartServer, server); } } tr_port tr_rpcGetPort (const tr_rpc_server * server) { return server->port; } void tr_rpcSetUrl (tr_rpc_server * server, const char * url) { char * tmp = server->url; server->url = tr_strdup (url); dbgmsg ("setting our URL to [%s]", server->url); tr_free (tmp); } const char* tr_rpcGetUrl (const tr_rpc_server * server) { return server->url ? server->url : ""; } void tr_rpcSetWhitelist (tr_rpc_server * server, const char * whitelistStr) { void * tmp; const char * walk; /* keep the string */ tmp = server->whitelistStr; server->whitelistStr = tr_strdup (whitelistStr); tr_free (tmp); /* clear out the old whitelist entries */ while ((tmp = tr_list_pop_front (&server->whitelist))) tr_free (tmp); /* build the new whitelist entries */ for (walk=whitelistStr; walk && *walk;) { const char * delimiters = " ,;"; const size_t len = strcspn (walk, delimiters); char * token = tr_strndup (walk, len); tr_list_append (&server->whitelist, token); if (strcspn (token, "+-") < len) tr_logAddNamedInfo (MY_NAME, "Adding address to whitelist: %s (And it has a '+' or '-'! Are you using an old ACL by mistake?)", token); else tr_logAddNamedInfo (MY_NAME, "Adding address to whitelist: %s", token); if (walk[len]=='\0') break; walk += len + 1; } } const char* tr_rpcGetWhitelist (const tr_rpc_server * server) { return server->whitelistStr ? server->whitelistStr : ""; } void tr_rpcSetWhitelistEnabled (tr_rpc_server * server, bool isEnabled) { assert (tr_isBool (isEnabled)); server->isWhitelistEnabled = isEnabled; } bool tr_rpcGetWhitelistEnabled (const tr_rpc_server * server) { return server->isWhitelistEnabled; } /**** ***** PASSWORD ****/ void tr_rpcSetUsername (tr_rpc_server * server, const char * username) { char * tmp = server->username; server->username = tr_strdup (username); dbgmsg ("setting our Username to [%s]", server->username); tr_free (tmp); } const char* tr_rpcGetUsername (const tr_rpc_server * server) { return server->username ? server->username : ""; } void tr_rpcSetPassword (tr_rpc_server * server, const char * password) { tr_free (server->password); if (*password != '{') server->password = tr_ssha1 (password); else server->password = strdup (password); dbgmsg ("setting our Password to [%s]", server->password); } const char* tr_rpcGetPassword (const tr_rpc_server * server) { return server->password ? server->password : "" ; } void tr_rpcSetPasswordEnabled (tr_rpc_server * server, bool isEnabled) { server->isPasswordEnabled = isEnabled; dbgmsg ("setting 'password enabled' to %d", (int)isEnabled); } bool tr_rpcIsPasswordEnabled (const tr_rpc_server * server) { return server->isPasswordEnabled; } const char * tr_rpcGetBindAddress (const tr_rpc_server * server) { tr_address addr; addr.type = TR_AF_INET; addr.addr.addr4 = server->bindAddress; return tr_address_to_string (&addr); } /**** ***** LIFE CYCLE ****/ static void closeServer (void * vserver) { void * tmp; tr_rpc_server * s = vserver; stopServer (s); while ((tmp = tr_list_pop_front (&s->whitelist))) tr_free (tmp); if (s->isStreamInitialized) deflateEnd (&s->stream); tr_free (s->url); tr_free (s->sessionId); tr_free (s->whitelistStr); tr_free (s->username); tr_free (s->password); tr_free (s); } void tr_rpcClose (tr_rpc_server ** ps) { tr_runInEventThread ((*ps)->session, closeServer, *ps); *ps = NULL; } static void missing_settings_key (const tr_quark q) { const char * str = tr_quark_get_string (q, NULL); tr_logAddNamedError (MY_NAME, _("Couldn't find settings key \"%s\""), str); } tr_rpc_server * tr_rpcInit (tr_session * session, tr_variant * settings) { tr_rpc_server * s; bool boolVal; int64_t i; const char * str; tr_quark key; tr_address address; s = tr_new0 (tr_rpc_server, 1); s->session = session; key = TR_KEY_rpc_enabled; if (!tr_variantDictFindBool (settings, key, &boolVal)) missing_settings_key (key); else s->isEnabled = boolVal; key = TR_KEY_rpc_port; if (!tr_variantDictFindInt (settings, key, &i)) missing_settings_key (key); else s->port = i; key = TR_KEY_rpc_url; if (!tr_variantDictFindStr (settings, key, &str, NULL)) missing_settings_key (key); else s->url = tr_strdup (str); key = TR_KEY_rpc_whitelist_enabled; if (!tr_variantDictFindBool (settings, key, &boolVal)) missing_settings_key (key); else tr_rpcSetWhitelistEnabled (s, boolVal); key = TR_KEY_rpc_authentication_required; if (!tr_variantDictFindBool (settings, key, &boolVal)) missing_settings_key (key); else tr_rpcSetPasswordEnabled (s, boolVal); key = TR_KEY_rpc_whitelist; if (!tr_variantDictFindStr (settings, key, &str, NULL) && str) missing_settings_key (key); else tr_rpcSetWhitelist (s, str); key = TR_KEY_rpc_username; if (!tr_variantDictFindStr (settings, key, &str, NULL)) missing_settings_key (key); else tr_rpcSetUsername (s, str); key = TR_KEY_rpc_password; if (!tr_variantDictFindStr (settings, key, &str, NULL)) missing_settings_key (key); else tr_rpcSetPassword (s, str); key = TR_KEY_rpc_bind_address; if (!tr_variantDictFindStr (settings, key, &str, NULL)) { missing_settings_key (key); address = tr_inaddr_any; } else if (!tr_address_from_string (&address, str)) { tr_logAddNamedError (MY_NAME, _("%s is not a valid address"), str); address = tr_inaddr_any; } else if (address.type != TR_AF_INET) { tr_logAddNamedError (MY_NAME, _("%s is not an IPv4 address. RPC listeners must be IPv4"), str); address = tr_inaddr_any; } s->bindAddress = address.addr.addr4; if (s->isEnabled) { tr_logAddNamedInfo (MY_NAME, _("Serving RPC and Web requests on port 127.0.0.1:%d%s"), (int) s->port, s->url); tr_runInEventThread (session, startServer, s); if (s->isWhitelistEnabled) tr_logAddNamedInfo (MY_NAME, "%s", _("Whitelist enabled")); if (s->isPasswordEnabled) tr_logAddNamedInfo (MY_NAME, "%s", _("Password required")); } return s; } transmission-2.92/libtransmission/PaxHeaders.4960/watchdir-generic.c0000644000000000000000000000013212662757235022500 xustar0030 mtime=1456201373.068756639 30 atime=1456201373.068756639 30 ctime=1457295920.241812016 transmission-2.92/libtransmission/watchdir-generic.c0000644000175000017500000000516712662757235024136 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015-2016 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: watchdir-generic.c 14651 2016-01-02 14:28:59Z mikedld $ */ #include #include #include #define __LIBTRANSMISSION_WATCHDIR_MODULE__ #include "transmission.h" #include "log.h" #include "ptrarray.h" #include "utils.h" #include "watchdir.h" #include "watchdir-common.h" /*** **** ***/ #define log_error(...) (!tr_logLevelIsActive (TR_LOG_ERROR) ? (void) 0 : \ tr_logAddMessage (__FILE__, __LINE__, TR_LOG_ERROR, "watchdir:generic", __VA_ARGS__)) /*** **** ***/ typedef struct tr_watchdir_generic { tr_watchdir_backend base; struct event * event; tr_ptrArray dir_entries; } tr_watchdir_generic; #define BACKEND_UPCAST(b) ((tr_watchdir_generic *) (b)) /* Non-static and mutable for unit tests */ struct timeval tr_watchdir_generic_interval = { 10, 0 }; /*** **** ***/ static void tr_watchdir_generic_on_event (evutil_socket_t fd UNUSED, short type UNUSED, void * context) { const tr_watchdir_t handle = context; tr_watchdir_generic * const backend = BACKEND_UPCAST (tr_watchdir_get_backend (handle)); tr_watchdir_scan (handle, &backend->dir_entries); } static void tr_watchdir_generic_free (tr_watchdir_backend * backend_base) { tr_watchdir_generic * const backend = BACKEND_UPCAST (backend_base); if (backend == NULL) return; assert (backend->base.free_func == &tr_watchdir_generic_free); if (backend->event != NULL) { event_del (backend->event); event_free (backend->event); } tr_ptrArrayDestruct (&backend->dir_entries, &tr_free); tr_free (backend); } tr_watchdir_backend * tr_watchdir_generic_new (tr_watchdir_t handle) { tr_watchdir_generic * backend; backend = tr_new0 (tr_watchdir_generic, 1); backend->base.free_func = &tr_watchdir_generic_free; if ((backend->event = event_new (tr_watchdir_get_event_base (handle), -1, EV_PERSIST, &tr_watchdir_generic_on_event, handle)) == NULL) { log_error ("Failed to create event: %s", tr_strerror (errno)); goto fail; } if (event_add (backend->event, &tr_watchdir_generic_interval) == -1) { log_error ("Failed to add event: %s", tr_strerror (errno)); goto fail; } /* Run initial scan on startup */ event_active (backend->event, EV_READ, 0); return BACKEND_DOWNCAST (backend); fail: tr_watchdir_generic_free (BACKEND_DOWNCAST (backend)); return NULL; } transmission-2.92/libtransmission/PaxHeaders.4960/watchdir-win32.c0000644000000000000000000000013212642003321022000 xustar0030 mtime=1451755217.136472649 30 atime=1451755217.136472649 30 ctime=1457295920.254812237 transmission-2.92/libtransmission/watchdir-win32.c0000644000175000017500000002304112642003321023425 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015-2016 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: watchdir-win32.c 14653 2016-01-02 15:26:23Z mikedld $ */ #include #include #include /* offsetof */ #include /* realloc () */ #include /* _beginthreadex () */ #include #include #include #include #define __LIBTRANSMISSION_WATCHDIR_MODULE__ #include "transmission.h" #include "log.h" #include "net.h" #include "utils.h" #include "watchdir.h" #include "watchdir-common.h" /*** **** ***/ #define log_error(...) (!tr_logLevelIsActive (TR_LOG_ERROR) ? (void) 0 : \ tr_logAddMessage (__FILE__, __LINE__, TR_LOG_ERROR, "watchdir:win32", __VA_ARGS__)) /*** **** ***/ typedef struct tr_watchdir_win32 { tr_watchdir_backend base; HANDLE fd; OVERLAPPED overlapped; DWORD buffer[8 * 1024 / sizeof (DWORD)]; evutil_socket_t notify_pipe[2]; struct bufferevent * event; HANDLE thread; } tr_watchdir_win32; #define BACKEND_UPCAST(b) ((tr_watchdir_win32 *) (b)) #define WIN32_WATCH_MASK (FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE) /*** **** ***/ static BOOL tr_get_overlapped_result_ex (HANDLE handle, LPOVERLAPPED overlapped, LPDWORD bytes_transferred, DWORD timeout, BOOL alertable) { typedef BOOL (WINAPI * impl_t) (HANDLE, LPOVERLAPPED, LPDWORD, DWORD, BOOL); static impl_t real_impl = NULL; static bool is_real_impl_valid = false; if (!is_real_impl_valid) { real_impl = (impl_t) GetProcAddress (GetModuleHandleW (L"kernel32.dll"), "GetOverlappedResultEx"); is_real_impl_valid = true; } if (real_impl != NULL) return real_impl (handle, overlapped, bytes_transferred, timeout, alertable); const DWORD wait_result = WaitForSingleObjectEx (handle, timeout, alertable); if (wait_result == WAIT_FAILED) return FALSE; if (wait_result == WAIT_IO_COMPLETION || wait_result == WAIT_TIMEOUT) { SetLastError (wait_result); return FALSE; } assert (wait_result == WAIT_OBJECT_0); return GetOverlappedResult (handle, overlapped, bytes_transferred, FALSE); } static unsigned int __stdcall tr_watchdir_win32_thread (void * context) { const tr_watchdir_t handle = context; tr_watchdir_win32 * const backend = BACKEND_UPCAST (tr_watchdir_get_backend (handle)); DWORD bytes_transferred; while (tr_get_overlapped_result_ex (backend->fd, &backend->overlapped, &bytes_transferred, INFINITE, FALSE)) { PFILE_NOTIFY_INFORMATION info = (PFILE_NOTIFY_INFORMATION) backend->buffer; while (info->NextEntryOffset != 0) *((BYTE **) &info) += info->NextEntryOffset; info->NextEntryOffset = bytes_transferred - ((BYTE *) info - (BYTE *) backend->buffer); send (backend->notify_pipe[1], (const char *) backend->buffer, bytes_transferred, 0); if (!ReadDirectoryChangesW (backend->fd, backend->buffer, sizeof (backend->buffer), FALSE, WIN32_WATCH_MASK, NULL, &backend->overlapped, NULL)) { log_error ("Failed to read directory changes"); return 0; } } if (GetLastError () != ERROR_OPERATION_ABORTED) log_error ("Failed to wait for directory changes"); return 0; } static void tr_watchdir_win32_on_first_scan (evutil_socket_t fd UNUSED, short type UNUSED, void * context) { const tr_watchdir_t handle = context; tr_watchdir_scan (handle, NULL); } static void tr_watchdir_win32_on_event (struct bufferevent * event, void * context) { const tr_watchdir_t handle = context; size_t nread; size_t name_size = MAX_PATH * sizeof (WCHAR); char * buffer = tr_malloc (sizeof (FILE_NOTIFY_INFORMATION) + name_size); PFILE_NOTIFY_INFORMATION ev = (PFILE_NOTIFY_INFORMATION) buffer; const size_t header_size = offsetof (FILE_NOTIFY_INFORMATION, FileName); /* Read the size of the struct excluding name into buf. Guaranteed to have at least sizeof (*ev) available */ while ((nread = bufferevent_read (event, ev, header_size)) != 0) { if (nread == (size_t) -1) { log_error ("Failed to read event: %s", tr_strerror (errno)); break; } if (nread != header_size) { log_error ("Failed to read event: expected %zu, got %zu bytes.", header_size, nread); break; } const size_t nleft = ev->NextEntryOffset - nread; assert (ev->FileNameLength % sizeof (WCHAR) == 0); assert (ev->FileNameLength > 0); assert (ev->FileNameLength <= nleft); if (nleft > name_size) { name_size = nleft; buffer = tr_realloc (buffer, sizeof (FILE_NOTIFY_INFORMATION) + name_size); ev = (PFILE_NOTIFY_INFORMATION) buffer; } /* Consume entire name into buffer */ if ((nread = bufferevent_read (event, buffer + header_size, nleft)) == (size_t) -1) { log_error ("Failed to read name: %s", tr_strerror (errno)); break; } if (nread != nleft) { log_error ("Failed to read name: expected %zu, got %zu bytes.", nleft, nread); break; } if (ev->Action == FILE_ACTION_ADDED || ev->Action == FILE_ACTION_MODIFIED || ev->Action == FILE_ACTION_RENAMED_NEW_NAME) { char * name = tr_win32_native_to_utf8 (ev->FileName, ev->FileNameLength / sizeof (WCHAR)); if (name != NULL) { tr_watchdir_process (handle, name); tr_free (name); } } } tr_free (buffer); } static void tr_watchdir_win32_free (tr_watchdir_backend * backend_base) { tr_watchdir_win32 * const backend = BACKEND_UPCAST (backend_base); if (backend == NULL) return; assert (backend->base.free_func == &tr_watchdir_win32_free); if (backend->fd != INVALID_HANDLE_VALUE) CancelIoEx (backend->fd, &backend->overlapped); if (backend->thread != NULL) { WaitForSingleObject (backend->thread, INFINITE); CloseHandle (backend->thread); } if (backend->event != NULL) bufferevent_free (backend->event); if (backend->notify_pipe[0] != TR_BAD_SOCKET) evutil_closesocket (backend->notify_pipe[0]); if (backend->notify_pipe[1] != TR_BAD_SOCKET) evutil_closesocket (backend->notify_pipe[1]); if (backend->fd != INVALID_HANDLE_VALUE) CloseHandle (backend->fd); tr_free (backend); } tr_watchdir_backend * tr_watchdir_win32_new (tr_watchdir_t handle) { const char * const path = tr_watchdir_get_path (handle); wchar_t * wide_path; tr_watchdir_win32 * backend; backend = tr_new0 (tr_watchdir_win32, 1); backend->base.free_func = &tr_watchdir_win32_free; backend->fd = INVALID_HANDLE_VALUE; backend->notify_pipe[0] = backend->notify_pipe[1] = TR_BAD_SOCKET; if ((wide_path = tr_win32_utf8_to_native (path, -1)) == NULL) { log_error ("Failed to convert \"%s\" to native path", path); goto fail; } if ((backend->fd = CreateFileW (wide_path, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL)) == INVALID_HANDLE_VALUE) { log_error ("Failed to open directory \"%s\"", path); goto fail; } tr_free (wide_path); wide_path = NULL; backend->overlapped.Pointer = handle; if (!ReadDirectoryChangesW (backend->fd, backend->buffer, sizeof (backend->buffer), FALSE, WIN32_WATCH_MASK, NULL, &backend->overlapped, NULL)) { log_error ("Failed to read directory changes"); goto fail; } if (evutil_socketpair (AF_INET, SOCK_STREAM, 0, backend->notify_pipe) == -1) { log_error ("Failed to create notify pipe: %s", tr_strerror (errno)); goto fail; } if ((backend->event = bufferevent_socket_new (tr_watchdir_get_event_base (handle), backend->notify_pipe[0], 0)) == NULL) { log_error ("Failed to create event buffer: %s", tr_strerror (errno)); goto fail; } bufferevent_setwatermark (backend->event, EV_READ, sizeof (FILE_NOTIFY_INFORMATION), 0); bufferevent_setcb (backend->event, &tr_watchdir_win32_on_event, NULL, NULL, handle); bufferevent_enable (backend->event, EV_READ); if ((backend->thread = (HANDLE) _beginthreadex (NULL, 0, &tr_watchdir_win32_thread, handle, 0, NULL)) == NULL) { log_error ("Failed to create thread"); goto fail; } /* Perform an initial scan on the directory */ if (event_base_once (tr_watchdir_get_event_base (handle), -1, EV_TIMEOUT, &tr_watchdir_win32_on_first_scan, handle, NULL) == -1) log_error ("Failed to perform initial scan: %s", tr_strerror (errno)); return BACKEND_DOWNCAST (backend); fail: tr_watchdir_win32_free (BACKEND_DOWNCAST (backend)); tr_free (wide_path); return NULL; } transmission-2.92/libtransmission/PaxHeaders.4960/tr-getopt.c0000644000000000000000000000013212634073127021174 xustar0030 mtime=1450210903.501467033 30 atime=1450210903.501467033 30 ctime=1457295920.188811115 transmission-2.92/libtransmission/tr-getopt.c0000644000175000017500000001443112634073127022624 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: tr-getopt.c 14615 2015-12-06 22:39:14Z jordan $ */ #include /* isspace () */ #include #include /* exit () */ #include #include "tr-getopt.h" #ifndef MAX #define MAX(a, b)(((a) > (b)) ? (a) : (b)) #endif int tr_optind = 1; static const char* getArgName (const tr_option * opt) { const char * arg; if (!opt->has_arg) arg = ""; else if (opt->argName) arg = opt->argName; else arg = ""; return arg; } static int get_next_line_len (const char * description, int maxlen) { int end; int len = strlen (description); if (len < maxlen) return len; end = maxlen < len ? maxlen : len; while ((end > 0) && !isspace (description[end])) --end; return end ? end : len; } static void getopts_usage_line (const tr_option * opt, int longWidth, int shortWidth, int argWidth) { int len; const char * longName = opt->longName ? opt->longName : ""; const char * shortName = opt->shortName ? opt->shortName : ""; const char * arg = getArgName (opt); const int d_indent = shortWidth + longWidth + argWidth + 7; const int d_width = 80 - d_indent; const char * d = opt->description; printf (" %s%-*s %s%-*s %-*s ", (shortName && *shortName ? "-" : " "), shortWidth, shortName, (longName && *longName ? "--" : " "), longWidth, longName, argWidth, arg); len = get_next_line_len (d, d_width); printf ("%*.*s\n", len, len, d); d += len; while (isspace (*d)) ++d; while ((len = get_next_line_len (d, d_width))) { printf ("%*.*s%*.*s\n", d_indent, d_indent, "", len, len, d); d += len; while (isspace (*d)) ++d; } } static void maxWidth (const struct tr_option * o, int * longWidth, int * shortWidth, int * argWidth) { const char * arg; if (o->longName) *longWidth = MAX (*longWidth, (int)strlen (o->longName)); if (o->shortName) *shortWidth = MAX (*shortWidth, (int)strlen (o->shortName)); if ((arg = getArgName (o))) *argWidth = MAX (*argWidth, (int)strlen (arg)); } void tr_getopt_usage (const char * progName, const char * description, const struct tr_option opts[]) { int longWidth = 0; int shortWidth = 0; int argWidth = 0; struct tr_option help; const struct tr_option * o; for (o = opts; o->val; ++o) maxWidth (o, &longWidth, &shortWidth, &argWidth); help.val = -1; help.longName = "help"; help.description = "Display this help page and exit"; help.shortName = "h"; help.has_arg = 0; maxWidth (&help, &longWidth, &shortWidth, &argWidth); if (description == NULL) description = "Usage: %s [options]"; printf (description, progName); printf ("\n\nOptions:\n"); getopts_usage_line (&help, longWidth, shortWidth, argWidth); for (o = opts; o->val; ++o) getopts_usage_line (o, longWidth, shortWidth, argWidth); } static const tr_option * findOption (const tr_option * opts, const char * str, const char ** setme_arg) { size_t matchlen = 0; const char * arg = NULL; const tr_option * o; const tr_option * match = NULL; /* find the longest matching option */ for (o = opts; o->val; ++o) { size_t len = o->longName ? strlen (o->longName) : 0; if ((matchlen < len) && (str[0] == '-') && (str[1] == '-') && !strncmp (str+2, o->longName, len) && (str[len + 2] == '\0' || (o->has_arg && str[len + 2] == '='))) { matchlen = len; match = o; arg = str[len + 2] == '=' ? str + len + 3 : NULL; } len = o->shortName ? strlen (o->shortName) : 0; if ((matchlen < len) && (str[0] == '-') && !strncmp (str+1, o->shortName, len) && (str[len + 1] == '\0' || o->has_arg)) { matchlen = len; match = o; switch (str[len + 1]) { case '\0': arg = NULL; break; case '=': arg = str + len + 2; break; default: arg = str + len + 1; break; } } } if (setme_arg) *setme_arg = arg; return match; } int tr_getopt (const char * usage, int argc, const char * const * argv, const tr_option * opts, const char ** setme_optarg) { int i; const char * arg = NULL; const tr_option * o = NULL; *setme_optarg = NULL; /* handle the builtin 'help' option */ for (i = 1; i < argc; ++i) { if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "--help")) { tr_getopt_usage (argv[0], usage, opts); exit (0); } } /* out of options? */ if (argc == 1 || tr_optind >= argc) return TR_OPT_DONE; o = findOption (opts, argv[tr_optind], &arg); if (!o) { /* let the user know we got an unknown option... */ *setme_optarg = argv[tr_optind++]; return TR_OPT_UNK; } if (!o->has_arg) { /* no argument needed for this option, so we're done */ if (arg) return TR_OPT_ERR; *setme_optarg = NULL; ++tr_optind; return o->val; } /* option needed an argument, and it was embedded in this string */ if (arg) { *setme_optarg = arg; ++tr_optind; return o->val; } /* throw an error if the option needed an argument but didn't get one */ if (++tr_optind >= argc) return TR_OPT_ERR; if (findOption (opts, argv[tr_optind], NULL)) return TR_OPT_ERR; *setme_optarg = argv[tr_optind++]; return o->val; } transmission-2.92/libtransmission/PaxHeaders.4960/magnet.h0000644000000000000000000000013212442116602020520 xustar0030 mtime=1418239362.919222375 30 atime=1418239362.919222375 30 ctime=1457295919.688802612 transmission-2.92/libtransmission/magnet.h0000644000175000017500000000140712442116602022147 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: magnet.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_MAGNET_H #define TR_MAGNET_H 1 #include "transmission.h" #include "variant.h" typedef struct tr_magnet_info { uint8_t hash[20]; char * displayName; int trackerCount; char ** trackers; int webseedCount; char ** webseeds; } tr_magnet_info; tr_magnet_info * tr_magnetParse (const char * uri); struct tr_variant; void tr_magnetCreateMetainfo (const tr_magnet_info *, tr_variant *); void tr_magnetFree (tr_magnet_info * info); #endif transmission-2.92/libtransmission/PaxHeaders.4960/port-forwarding.h0000644000000000000000000000013212442116602022371 xustar0030 mtime=1418239362.946222837 30 atime=1418239362.946222837 30 ctime=1457295919.756803769 transmission-2.92/libtransmission/port-forwarding.h0000644000175000017500000000160712442116602024022 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: port-forwarding.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef SHARED_H #define SHARED_H 1 #include "transmission.h" /** * @addtogroup port_forwarding Port Forwarding * @{ */ struct tr_bindsockets; typedef struct tr_shared tr_shared; tr_shared* tr_sharedInit (tr_session*); void tr_sharedClose (tr_session *); void tr_sharedPortChanged (tr_session *); void tr_sharedTraversalEnable (tr_shared *, bool isEnabled); tr_port tr_sharedGetPeerPort (const tr_shared * s); bool tr_sharedTraversalIsEnabled (const tr_shared * s); int tr_sharedTraversalStatus (const tr_shared *); /** @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/libtransmission-test.h0000644000000000000000000000013212505250244023443 xustar0030 mtime=1427460260.468243976 30 atime=1427460260.468243976 30 ctime=1457295919.676802408 transmission-2.92/libtransmission/libtransmission-test.h0000644000175000017500000000535112505250244025074 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: libtransmission-test.h 14382 2014-12-13 15:22:39Z mikedld $ */ /* Note VERBOSE needs to be (un)defined before including this file */ #ifndef LIBTRANSMISSION_TEST_H #define LIBTRANSMISSION_TEST_H 1 #include #include /* strlen() */ #include "transmission.h" #include "utils.h" /* tr_strcmp0 () */ extern int current_test; extern bool verbose; bool should_print (bool pass); bool check_condition_impl (const char * file, int line, bool condition); bool check_int_eq_impl (const char * file, int line, int64_t expected, int64_t actual); bool check_ptr_eq_impl (const char * file, int line, const void * expected, const void * actual); bool check_streq_impl (const char * file, int line, const char * expected, const char * actual); /*** **** ***/ #define check(condition) \ do { \ ++current_test; \ if (!check_condition_impl (__FILE__, __LINE__, (condition))) \ return current_test; \ } while (0) #define check_streq(expected, actual) \ do { \ ++current_test; \ if (!check_streq_impl (__FILE__, __LINE__, (expected), (actual))) \ return current_test; \ } while (0) #define check_int_eq(expected, actual) \ do { \ ++current_test; \ if (!check_int_eq_impl (__FILE__, __LINE__, (expected), (actual))) \ return current_test; \ } while (0) #define check_ptr_eq(expected, actual) \ do { \ ++current_test; \ if (!check_ptr_eq_impl (__FILE__, __LINE__, (expected), (actual))) \ return current_test; \ } while (0) /*** **** ***/ typedef int (*testFunc)(void); #define NUM_TESTS(tarray)((int)(sizeof (tarray)/sizeof (tarray[0]))) int runTests (const testFunc * const tests, int numTests); #define MAIN_SINGLE_TEST(test) \ int main (void) { \ const testFunc tests[] = { test }; \ return runTests (tests, 1); \ } tr_session * libttest_session_init (struct tr_variant * settings); void libttest_session_close (tr_session * session); void libttest_zero_torrent_populate (tr_torrent * tor, bool complete); tr_torrent * libttest_zero_torrent_init (tr_session * session); void libttest_blockingTorrentVerify (tr_torrent * tor); void libtest_create_file_with_contents (const char * path, const void* contents, size_t n); void libtest_create_tmpfile_with_contents (char* tmpl, const void* payload, size_t n); void libtest_create_file_with_string_contents (const char * path, const char* str); char* libtest_sandbox_create (void); void libtest_sandbox_destroy (const char * sandbox); void libttest_sync (void); #endif /* !LIBTRANSMISSION_TEST_H */ transmission-2.92/libtransmission/PaxHeaders.4960/crypto-utils.h0000644000000000000000000000013012505250244021722 xustar0029 mtime=1427460260.44824362 30 atime=1427460260.447243602 29 ctime=1457295919.60280115 transmission-2.92/libtransmission/crypto-utils.h0000644000175000017500000001650712505250244023362 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: crypto-utils.h 14422 2015-01-01 21:16:36Z mikedld $ */ #ifndef TR_CRYPTO_UTILS_H #define TR_CRYPTO_UTILS_H #include #include #include "transmission.h" /* SHA_DIGEST_LENGTH */ #include "utils.h" /* TR_GNUC_MALLOC, TR_GNUC_NULL_TERMINATED */ #ifdef __cplusplus extern "C" { #endif /** *** @addtogroup utils Utilities *** @{ **/ /** @brief Opaque SHA1 context type. */ typedef void * tr_sha1_ctx_t; /** @brief Opaque RC4 context type. */ typedef void * tr_rc4_ctx_t; /** @brief Opaque DH context type. */ typedef void * tr_dh_ctx_t; /** @brief Opaque DH secret key type. */ typedef void * tr_dh_secret_t; /** * @brief Generate a SHA1 hash from one or more chunks of memory. */ bool tr_sha1 (uint8_t * hash, const void * data1, int data1_length, ...) TR_GNUC_NULL_TERMINATED; /** * @brief Allocate and initialize new SHA1 hasher context. */ tr_sha1_ctx_t tr_sha1_init (void); /** * @brief Update SHA1 hash. */ bool tr_sha1_update (tr_sha1_ctx_t handle, const void * data, size_t data_length); /** * @brief Finalize and export SHA1 hash, free hasher context. */ bool tr_sha1_final (tr_sha1_ctx_t handle, uint8_t * hash); /** * @brief Allocate and initialize new RC4 cipher context. */ tr_rc4_ctx_t tr_rc4_new (void); /** * @brief Free RC4 cipher context. */ void tr_rc4_free (tr_rc4_ctx_t handle); /** * @brief Set RC4 cipher key. */ void tr_rc4_set_key (tr_rc4_ctx_t handle, const uint8_t * key, size_t key_length); /** * @brief Process memory block with RC4 cipher. */ void tr_rc4_process (tr_rc4_ctx_t handle, const void * input, void * output, size_t length); /** * @brief Allocate and initialize new Diffie-Hellman (DH) key exchange context. */ tr_dh_ctx_t tr_dh_new (const uint8_t * prime_num, size_t prime_num_length, const uint8_t * generator_num, size_t generator_num_length); /** * @brief Free DH key exchange context. */ void tr_dh_free (tr_dh_ctx_t handle); /** * @brief Generate private and public DH keys, export public key. */ bool tr_dh_make_key (tr_dh_ctx_t handle, size_t private_key_length, uint8_t * public_key, size_t * public_key_length); /** * @brief Perform DH key exchange, generate secret key. */ tr_dh_secret_t tr_dh_agree (tr_dh_ctx_t handle, const uint8_t * other_public_key, size_t other_public_key_length); /** * @brief Calculate SHA1 hash of DH secret key, prepending and/or appending * given data to the key during calculation. */ bool tr_dh_secret_derive (tr_dh_secret_t handle, const void * prepend_data, size_t prepend_data_size, const void * append_data, size_t append_data_size, uint8_t * hash); /** * @brief Free DH secret key returned by @ref tr_dh_agree. */ void tr_dh_secret_free (tr_dh_secret_t handle); /** * @brief Align DH key (big-endian number) to required length (internal, do not use). */ void tr_dh_align_key (uint8_t * key_buffer, size_t key_size, size_t buffer_size); /** * @brief Returns a random number in the range of [0...upper_bound). */ int tr_rand_int (int upper_bound); /** * @brief Returns a pseudorandom number in the range of [0...upper_bound). * * This is faster, BUT WEAKER, than tr_rand_int () and never be used in sensitive cases. * @see tr_rand_int () */ int tr_rand_int_weak (int upper_bound); /** * @brief Fill a buffer with random bytes. */ bool tr_rand_buffer (void * buffer, size_t length); /** * @brief Generate a SSHA password from its plaintext source. */ char * tr_ssha1 (const char * plain_text) TR_GNUC_MALLOC; /** * @brief Validate a test password against the a ssha1 password. */ bool tr_ssha1_matches (const char * ssha1, const char * plain_text); /** * @brief Translate a block of bytes into base64. * @return a newly-allocated null-terminated string that can be freed with tr_free () */ void * tr_base64_encode (const void * input, size_t input_length, size_t * output_length) TR_GNUC_MALLOC; /** * @brief Translate null-terminated string into base64. * @return a newly-allocated null-terminated string that can be freed with tr_free () */ void * tr_base64_encode_str (const char * input, size_t * output_length) TR_GNUC_MALLOC; /** * @brief Translate a block of bytes from base64 into raw form. * @return a newly-allocated null-terminated string that can be freed with tr_free () */ void * tr_base64_decode (const void * input, size_t input_length, size_t * output_length) TR_GNUC_MALLOC; /** * @brief Translate null-terminated string from base64 into raw form. * @return a newly-allocated null-terminated string that can be freed with tr_free () */ void * tr_base64_decode_str (const char * input, size_t * output_length) TR_GNUC_MALLOC; /** * @brief Wrapper around tr_binary_to_hex () for SHA_DIGEST_LENGTH. */ static inline void tr_sha1_to_hex (char * hex, const uint8_t * sha1) { tr_binary_to_hex (sha1, hex, SHA_DIGEST_LENGTH); } /** * @brief Wrapper around tr_hex_to_binary () for SHA_DIGEST_LENGTH. */ static inline void tr_hex_to_sha1 (uint8_t * sha1, const char * hex) { tr_hex_to_binary (hex, sha1, SHA_DIGEST_LENGTH); } /** @} */ #ifdef __cplusplus } #endif #endif /* TR_CRYPTO_UTILS_H */ transmission-2.92/libtransmission/PaxHeaders.4960/libtransmission-test.c0000644000000000000000000000013212612560132023435 xustar0030 mtime=1445650522.645235092 30 atime=1445650522.645235092 30 ctime=1457295920.259812322 transmission-2.92/libtransmission/libtransmission-test.c0000644000175000017500000003006612612560132025067 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: libtransmission-test.c 14581 2015-10-18 18:39:14Z mikedld $ */ #include #include #include #include /* mkstemp() */ #include /* strcmp() */ #ifndef _WIN32 #include /* sync() */ #endif #include "transmission.h" #include "crypto-utils.h" #include "error.h" #include "file.h" #include "platform.h" /* TR_PATH_DELIMETER */ #include "torrent.h" #include "trevent.h" #include "variant.h" #include "libtransmission-test.h" bool verbose = false; int current_test = 0; bool should_print (bool pass) { if (!pass) return true; if (verbose) return true; return false; #ifdef VERBOSE return true; #else return false; #endif } bool check_condition_impl (const char * file, int line, bool condition) { const bool pass = condition; if (should_print (pass)) fprintf (stderr, "%s %s:%d\n", pass?"PASS":"FAIL", file, line); return pass; } bool check_streq_impl (const char * file, int line, const char * expected, const char * actual) { const bool pass = !tr_strcmp0 (expected, actual); if (should_print (pass)) { if (pass) fprintf (stderr, "PASS %s:%d\n", file, line); else fprintf (stderr, "FAIL %s:%d, expected \"%s\", got \"%s\"\n", file, line, expected?expected:" (null)", actual?actual:" (null)"); } return pass; } bool check_int_eq_impl (const char * file, int line, int64_t expected, int64_t actual) { const bool pass = expected == actual; if (should_print (pass)) { if (pass) fprintf (stderr, "PASS %s:%d\n", file, line); else fprintf (stderr, "FAIL %s:%d, expected \"%"PRId64"\", got \"%"PRId64"\"\n", file, line, expected, actual); } return pass; } bool check_ptr_eq_impl (const char * file, int line, const void * expected, const void * actual) { const bool pass = expected == actual; if (should_print (pass)) { if (pass) fprintf (stderr, "PASS %s:%d\n", file, line); else fprintf (stderr, "FAIL %s:%d, expected \"%p\", got \"%p\"\n", file, line, expected, actual); } return pass; } int runTests (const testFunc * const tests, int numTests) { int i; int ret; (void) current_test; /* Use test even if we don't have any tests to run */ for (i=0; imessage); tr_error_free (error); result = tr_strdup (""); } return result; } char * libtest_sandbox_create (void) { char * path = tr_getcwd (); char * sandbox = tr_buildPath (path, "sandbox-XXXXXX", NULL); tr_free (path); tr_sys_dir_create_temp (sandbox, NULL); return sandbox; } static void rm_rf (const char * killme) { tr_sys_path_info info; if (tr_sys_path_get_info (killme, 0, &info, NULL)) { tr_sys_dir_t odir; if (info.type == TR_SYS_PATH_IS_DIRECTORY && (odir = tr_sys_dir_open (killme, NULL)) != TR_BAD_SYS_DIR) { const char * name; while ((name = tr_sys_dir_read_name (odir, NULL)) != NULL) { if (strcmp (name, ".") != 0 && strcmp (name, "..") != 0) { char * tmp = tr_buildPath (killme, name, NULL); rm_rf (tmp); tr_free (tmp); } } tr_sys_dir_close (odir, NULL); } if (verbose) fprintf (stderr, "cleanup: removing %s\n", killme); tr_sys_path_remove (killme, NULL); } } void libtest_sandbox_destroy (const char * sandbox) { rm_rf (sandbox); } /*** **** ***/ #define MEM_K 1024 #define MEM_B_STR "B" #define MEM_K_STR "KiB" #define MEM_M_STR "MiB" #define MEM_G_STR "GiB" #define MEM_T_STR "TiB" #define DISK_K 1000 #define DISK_B_STR "B" #define DISK_K_STR "kB" #define DISK_M_STR "MB" #define DISK_G_STR "GB" #define DISK_T_STR "TB" #define SPEED_K 1000 #define SPEED_B_STR "B/s" #define SPEED_K_STR "kB/s" #define SPEED_M_STR "MB/s" #define SPEED_G_STR "GB/s" #define SPEED_T_STR "TB/s" tr_session * libttest_session_init (tr_variant * settings) { size_t len; const char * str; char * sandbox; char * path; tr_quark q; static bool formatters_inited = false; tr_session * session; tr_variant local_settings; tr_variantInitDict (&local_settings, 10); if (settings == NULL) settings = &local_settings; sandbox = libtest_sandbox_create (); if (!formatters_inited) { formatters_inited = true; tr_formatter_mem_init (MEM_K, MEM_K_STR, MEM_M_STR, MEM_G_STR, MEM_T_STR); tr_formatter_size_init (DISK_K,DISK_K_STR, DISK_M_STR, DISK_G_STR, DISK_T_STR); tr_formatter_speed_init (SPEED_K, SPEED_K_STR, SPEED_M_STR, SPEED_G_STR, SPEED_T_STR); } /* download dir */ q = TR_KEY_download_dir; if (tr_variantDictFindStr (settings, q, &str, &len)) path = tr_strdup_printf ("%s/%*.*s", sandbox, (int)len, (int)len, str); else path = tr_buildPath (sandbox, "Downloads", NULL); tr_sys_dir_create (path, TR_SYS_DIR_CREATE_PARENTS, 0700, NULL); tr_variantDictAddStr (settings, q, path); tr_free (path); /* incomplete dir */ q = TR_KEY_incomplete_dir; if (tr_variantDictFindStr (settings, q, &str, &len)) path = tr_strdup_printf ("%s/%*.*s", sandbox, (int)len, (int)len, str); else path = tr_buildPath (sandbox, "Incomplete", NULL); tr_variantDictAddStr (settings, q, path); tr_free (path); path = tr_buildPath (sandbox, "blocklists", NULL); tr_sys_dir_create (path, TR_SYS_DIR_CREATE_PARENTS, 0700, NULL); tr_free (path); q = TR_KEY_port_forwarding_enabled; if (!tr_variantDictFind (settings, q)) tr_variantDictAddBool (settings, q, false); q = TR_KEY_dht_enabled; if (!tr_variantDictFind (settings, q)) tr_variantDictAddBool (settings, q, false); q = TR_KEY_message_level; if (!tr_variantDictFind (settings, q)) tr_variantDictAddInt (settings, q, verbose ? TR_LOG_DEBUG : TR_LOG_ERROR); session = tr_sessionInit (sandbox, !verbose, settings); tr_free (sandbox); tr_variantFree (&local_settings); return session; } void libttest_session_close (tr_session * session) { char * sandbox; sandbox = tr_strdup (tr_sessionGetConfigDir (session)); tr_sessionClose (session); tr_logFreeQueue (tr_logGetQueue ()); session = NULL; libtest_sandbox_destroy (sandbox); tr_free (sandbox); } /*** **** ***/ tr_torrent * libttest_zero_torrent_init (tr_session * session) { int err; size_t metainfo_len; char * metainfo; const char * metainfo_base64; tr_torrent * tor; tr_ctor * ctor; /* 1048576 files-filled-with-zeroes/1048576 4096 files-filled-with-zeroes/4096 512 files-filled-with-zeroes/512 */ metainfo_base64 = "ZDg6YW5ub3VuY2UzMTpodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Fubm91bmNlMTA6Y3JlYXRlZCBi" "eTI1OlRyYW5zbWlzc2lvbi8yLjYxICgxMzQwNykxMzpjcmVhdGlvbiBkYXRlaTEzNTg3MDQwNzVl" "ODplbmNvZGluZzU6VVRGLTg0OmluZm9kNTpmaWxlc2xkNjpsZW5ndGhpMTA0ODU3NmU0OnBhdGhs" "NzoxMDQ4NTc2ZWVkNjpsZW5ndGhpNDA5NmU0OnBhdGhsNDo0MDk2ZWVkNjpsZW5ndGhpNTEyZTQ6" "cGF0aGwzOjUxMmVlZTQ6bmFtZTI0OmZpbGVzLWZpbGxlZC13aXRoLXplcm9lczEyOnBpZWNlIGxl" "bmd0aGkzMjc2OGU2OnBpZWNlczY2MDpRiEMYSbRhMVL9e9umo/8KT9ZCS1GIQxhJtGExUv1726aj" "/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9e9umo/8KT9ZCS1GIQxhJtGExUv17" "26aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9e9umo/8KT9ZCS1GIQxhJtGEx" "Uv1726aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9e9umo/8KT9ZCS1GIQxhJ" "tGExUv1726aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9e9umo/8KT9ZCS1GI" "QxhJtGExUv1726aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9e9umo/8KT9ZC" "S1GIQxhJtGExUv1726aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9e9umo/8K" "T9ZCS1GIQxhJtGExUv1726aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9e9um" "o/8KT9ZCS1GIQxhJtGExUv1726aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRhMVL9" "e9umo/8KT9ZCS1GIQxhJtGExUv1726aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMYSbRh" "MVL9e9umo/8KT9ZCS1GIQxhJtGExUv1726aj/wpP1kJLUYhDGEm0YTFS/XvbpqP/Ck/WQktRiEMY" "SbRhMVL9e9umo/8KT9ZCS1GIQxhJtGExUv1726aj/wpP1kJLOlf5A+Tz30nMBVuNM2hpV3wg/103" "OnByaXZhdGVpMGVlZQ=="; /* create the torrent ctor */ metainfo = tr_base64_decode_str (metainfo_base64, &metainfo_len); assert (metainfo != NULL); assert (metainfo_len > 0); assert (session != NULL); ctor = tr_ctorNew (session); tr_ctorSetMetainfo (ctor, (uint8_t*)metainfo, metainfo_len); tr_ctorSetPaused (ctor, TR_FORCE, true); /* create the torrent */ err = 0; tor = tr_torrentNew (ctor, &err, NULL); assert (!err); /* cleanup */ tr_free (metainfo); tr_ctorFree (ctor); return tor; } void libttest_zero_torrent_populate (tr_torrent * tor, bool complete) { tr_file_index_t i; for (i=0; iinfo.fileCount; ++i) { int err; uint64_t j; tr_sys_file_t fd; char * path; char * dirname; const tr_file * file = &tor->info.files[i]; if (!complete && (i==0)) path = tr_strdup_printf ("%s%c%s.part", tor->currentDir, TR_PATH_DELIMITER, file->name); else path = tr_strdup_printf ("%s%c%s", tor->currentDir, TR_PATH_DELIMITER, file->name); dirname = tr_sys_path_dirname (path, NULL); tr_sys_dir_create (dirname, TR_SYS_DIR_CREATE_PARENTS, 0700, NULL); fd = tr_sys_file_open (path, TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE | TR_SYS_FILE_TRUNCATE, 0600, NULL); for (j=0; jlength; ++j) tr_sys_file_write (fd, ((!complete) && (i==0) && (jinfo.pieceSize)) ? "\1" : "\0", 1, NULL, NULL); tr_sys_file_close (fd, NULL); tr_free (dirname); tr_free (path); path = tr_torrentFindFile (tor, i); assert (path != NULL); err = errno; assert (tr_sys_path_exists (path, NULL)); errno = err; tr_free (path); } libttest_sync (); libttest_blockingTorrentVerify (tor); if (complete) assert (tr_torrentStat(tor)->leftUntilDone == 0); else assert (tr_torrentStat(tor)->leftUntilDone == tor->info.pieceSize); } /*** **** ***/ static void onVerifyDone (tr_torrent * tor UNUSED, bool aborted UNUSED, void * done) { *(bool*)done = true; } void libttest_blockingTorrentVerify (tr_torrent * tor) { bool done = false; assert (tor->session != NULL); assert (!tr_amInEventThread (tor->session)); tr_torrentVerify (tor, onVerifyDone, &done); while (!done) tr_wait_msec (10); } static void build_parent_dir (const char* path) { char * dir; tr_error * error = NULL; const int tmperr = errno; dir = tr_sys_path_dirname (path, NULL); tr_sys_dir_create (dir, TR_SYS_DIR_CREATE_PARENTS, 0700, &error); assert (error == NULL); tr_free (dir); errno = tmperr; } void libtest_create_file_with_contents (const char* path, const void* payload, size_t n) { tr_sys_file_t fd; const int tmperr = errno; build_parent_dir (path); fd = tr_sys_file_open (path, TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE | TR_SYS_FILE_TRUNCATE, 0600, NULL); tr_sys_file_write (fd, payload, n, NULL, NULL); tr_sys_file_close (fd, NULL); libttest_sync (); errno = tmperr; } void libtest_create_file_with_string_contents (const char * path, const char* str) { libtest_create_file_with_contents (path, str, strlen(str)); } void libtest_create_tmpfile_with_contents (char* tmpl, const void* payload, size_t n) { tr_sys_file_t fd; const int tmperr = errno; uint64_t n_left = n; tr_error * error = NULL; build_parent_dir (tmpl); fd = tr_sys_file_open_temp (tmpl, NULL); while (n_left > 0) { uint64_t n; if (!tr_sys_file_write (fd, payload, n_left, &n, &error)) { fprintf (stderr, "Error writing '%s': %s\n", tmpl, error->message); tr_error_free (error); break; } n_left -= n; } tr_sys_file_close (fd, NULL); libttest_sync (); errno = tmperr; } void libttest_sync (void) { #ifndef _WIN32 sync (); #endif } transmission-2.92/libtransmission/PaxHeaders.4960/file-posix.c0000644000000000000000000000013012640354044021321 xustar0029 mtime=1451350052.45715051 29 atime=1451350052.45715051 30 ctime=1457295920.255812254 transmission-2.92/libtransmission/file-posix.c0000644000175000017500000005260512640354044022760 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: file-posix.c 14640 2015-12-28 23:53:55Z mikedld $ */ #if defined (HAVE_MKDTEMP) && (!defined (_XOPEN_SOURCE) || _XOPEN_SOURCE < 700) #undef _XOPEN_SOURCE #define _XOPEN_SOURCE 700 #elif (defined (HAVE_POSIX_FADVISE) || defined (HAVE_POSIX_FALLOCATE)) && (!defined (_XOPEN_SOURCE) || _XOPEN_SOURCE < 600) #undef _XOPEN_SOURCE #define _XOPEN_SOURCE 600 #endif #if (defined (HAVE_FALLOCATE64) || defined (HAVE_CANONICALIZE_FILE_NAME)) && !defined (_GNU_SOURCE) #define _GNU_SOURCE #endif #if defined (__APPLE__) && !defined (_DARWIN_C_SOURCE) #define _DARWIN_C_SOURCE #endif #include #include #include #include /* O_LARGEFILE, posix_fadvise (), [posix_]fallocate () */ #include /* basename (), dirname () */ #include /* PATH_MAX */ #include #include #include #include /* mmap (), munmap () */ #include #include #include /* lseek (), write (), ftruncate (), pread (), pwrite (), pathconf (), etc */ #ifdef HAVE_XFS_XFS_H #include #endif #include "transmission.h" #include "error.h" #include "file.h" #include "log.h" #include "platform.h" #include "utils.h" #ifndef O_LARGEFILE #define O_LARGEFILE 0 #endif #ifndef O_BINARY #define O_BINARY 0 #endif #ifndef O_SEQUENTIAL #define O_SEQUENTIAL 0 #endif #ifndef O_CLOEXEC #define O_CLOEXEC 0 #endif #ifndef PATH_MAX #define PATH_MAX 4096 #endif /* don't use pread/pwrite on old versions of uClibc because they're buggy. * https://trac.transmissionbt.com/ticket/3826 */ #if defined (__UCLIBC__) && !TR_UCLIBC_CHECK_VERSION (0, 9, 28) #undef HAVE_PREAD #undef HAVE_PWRITE #endif #ifdef __APPLE__ #ifndef HAVE_PREAD #define HAVE_PREAD #endif #ifndef HAVE_PWRITE #define HAVE_PWRITE #endif #ifndef HAVE_MKDTEMP #define HAVE_MKDTEMP #endif #endif static void set_system_error (tr_error ** error, int code) { if (error == NULL) return; tr_error_set_literal (error, code, tr_strerror (code)); } static void set_system_error_if_file_found (tr_error ** error, int code) { if (code != ENOENT) set_system_error (error, code); } static void stat_to_sys_path_info (const struct stat * sb, tr_sys_path_info * info) { if (S_ISREG (sb->st_mode)) info->type = TR_SYS_PATH_IS_FILE; else if (S_ISDIR (sb->st_mode)) info->type = TR_SYS_PATH_IS_DIRECTORY; else info->type = TR_SYS_PATH_IS_OTHER; info->size = (uint64_t) sb->st_size; info->last_modified_at = sb->st_mtime; } static void set_file_for_single_pass (tr_sys_file_t handle) { /* Set hints about the lookahead buffer and caching. It's okay for these to fail silently, so don't let them affect errno */ const int err = errno; if (handle == TR_BAD_SYS_FILE) return; #ifdef HAVE_POSIX_FADVISE (void) posix_fadvise (handle, 0, 0, POSIX_FADV_SEQUENTIAL); #endif #ifdef __APPLE__ (void) fcntl (handle, F_RDAHEAD, 1); (void) fcntl (handle, F_NOCACHE, 1); #endif errno = err; } #ifndef HAVE_MKDIRP static bool create_path (const char * path_in, int permissions, tr_error ** error) { char * p; char * pp; bool done; int tmperr; int rv; struct stat sb; char * path; /* make a temporary copy of path */ path = tr_strdup (path_in); /* walk past the root */ p = path; while (*p == TR_PATH_DELIMITER) ++p; pp = p; done = false; while ((p = strchr (pp, TR_PATH_DELIMITER)) || (p = strchr (pp, '\0'))) { if (!*p) done = true; else *p = '\0'; tmperr = errno; rv = stat (path, &sb); errno = tmperr; if (rv) { tr_error * my_error = NULL; /* Folder doesn't exist yet */ if (!tr_sys_dir_create (path, 0, permissions, &my_error)) { tr_logAddError (_ ("Couldn't create \"%1$s\": %2$s"), path, my_error->message); tr_free (path); tr_error_propagate (error, &my_error); return false; } } else if ((sb.st_mode & S_IFMT) != S_IFDIR) { /* Node exists but isn't a folder */ char * const buf = tr_strdup_printf (_ ("File \"%s\" is in the way"), path); tr_logAddError (_ ("Couldn't create \"%1$s\": %2$s"), path_in, buf); tr_free (buf); tr_free (path); set_system_error (error, ENOTDIR); return false; } if (done) break; *p = TR_PATH_DELIMITER; p++; pp = p; } tr_free (path); return true; } #endif bool tr_sys_path_exists (const char * path, tr_error ** error) { bool ret; assert (path != NULL); ret = access (path, F_OK) != -1; if (!ret) set_system_error_if_file_found (error, errno); return ret; } bool tr_sys_path_get_info (const char * path, int flags, tr_sys_path_info * info, tr_error ** error) { bool ret; struct stat sb; assert (path != NULL); assert (info != NULL); if ((flags & TR_SYS_PATH_NO_FOLLOW) == 0) ret = stat (path, &sb) != -1; else ret = lstat (path, &sb) != -1; if (ret) stat_to_sys_path_info (&sb, info); else set_system_error (error, errno); return ret; } bool tr_sys_path_is_relative (const char * path) { assert (path != NULL); return path[0] != '/'; } bool tr_sys_path_is_same (const char * path1, const char * path2, tr_error ** error) { bool ret = false; struct stat sb1, sb2; assert (path1 != NULL); assert (path2 != NULL); if (stat (path1, &sb1) != -1 && stat (path2, &sb2) != -1) ret = sb1.st_dev == sb2.st_dev && sb1.st_ino == sb2.st_ino; else set_system_error_if_file_found (error, errno); return ret; } char * tr_sys_path_resolve (const char * path, tr_error ** error) { char * ret = NULL; char * tmp = NULL; assert (path != NULL); #if defined (HAVE_CANONICALIZE_FILE_NAME) ret = canonicalize_file_name (path); #endif #if defined (_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200809L /* Better safe than sorry: realpath () officially supports NULL as destination starting off POSIX.1-2008. */ if (ret == NULL) ret = realpath (path, NULL); #endif if (ret == NULL) { tmp = tr_new (char, PATH_MAX); ret = realpath (path, tmp); if (ret != NULL) ret = tr_strdup (ret); } if (ret == NULL) set_system_error (error, errno); tr_free (tmp); return ret; } char * tr_sys_path_basename (const char * path, tr_error ** error) { char * ret = NULL; char * tmp; assert (path != NULL); tmp = tr_strdup (path); ret = basename (tmp); if (ret != NULL) ret = tr_strdup (ret); else set_system_error (error, errno); tr_free (tmp); return ret; } char * tr_sys_path_dirname (const char * path, tr_error ** error) { char * ret = NULL; char * tmp; assert (path != NULL); tmp = tr_strdup (path); ret = dirname (tmp); if (ret != NULL) ret = tr_strdup (ret); else set_system_error (error, errno); tr_free (tmp); return ret; } bool tr_sys_path_rename (const char * src_path, const char * dst_path, tr_error ** error) { bool ret; assert (src_path != NULL); assert (dst_path != NULL); ret = rename (src_path, dst_path) != -1; if (!ret) set_system_error (error, errno); return ret; } bool tr_sys_path_remove (const char * path, tr_error ** error) { bool ret; assert (path != NULL); ret = remove (path) != -1; if (!ret) set_system_error (error, errno); return ret; } tr_sys_file_t tr_sys_file_get_std (tr_std_sys_file_t std_file, tr_error ** error) { tr_sys_file_t ret = TR_BAD_SYS_FILE; switch (std_file) { case TR_STD_SYS_FILE_IN: ret = STDIN_FILENO; break; case TR_STD_SYS_FILE_OUT: ret = STDOUT_FILENO; break; case TR_STD_SYS_FILE_ERR: ret = STDERR_FILENO; break; default: assert (0 && "Unknown standard file"); set_system_error (error, EINVAL); } return ret; } tr_sys_file_t tr_sys_file_open (const char * path, int flags, int permissions, tr_error ** error) { tr_sys_file_t ret; int native_flags = 0; assert (path != NULL); assert ((flags & (TR_SYS_FILE_READ | TR_SYS_FILE_WRITE)) != 0); if ((flags & (TR_SYS_FILE_READ | TR_SYS_FILE_WRITE)) == (TR_SYS_FILE_READ | TR_SYS_FILE_WRITE)) native_flags |= O_RDWR; else if (flags & TR_SYS_FILE_READ) native_flags |= O_RDONLY; else if (flags & TR_SYS_FILE_WRITE) native_flags |= O_WRONLY; native_flags |= (flags & TR_SYS_FILE_CREATE ? O_CREAT : 0) | (flags & TR_SYS_FILE_CREATE_NEW ? O_CREAT | O_EXCL : 0) | (flags & TR_SYS_FILE_APPEND ? O_APPEND : 0) | (flags & TR_SYS_FILE_TRUNCATE ? O_TRUNC : 0) | (flags & TR_SYS_FILE_SEQUENTIAL ? O_SEQUENTIAL : 0) | O_BINARY | O_LARGEFILE | O_CLOEXEC; ret = open (path, native_flags, permissions); if (ret != TR_BAD_SYS_FILE) { if (flags & TR_SYS_FILE_SEQUENTIAL) set_file_for_single_pass (ret); } else { set_system_error (error, errno); } return ret; } tr_sys_file_t tr_sys_file_open_temp (char * path_template, tr_error ** error) { tr_sys_file_t ret; assert (path_template != NULL); ret = mkstemp (path_template); if (ret == TR_BAD_SYS_FILE) set_system_error (error, errno); set_file_for_single_pass (ret); return ret; } bool tr_sys_file_close (tr_sys_file_t handle, tr_error ** error) { bool ret; assert (handle != TR_BAD_SYS_FILE); ret = close (handle) != -1; if (!ret) set_system_error (error, errno); return ret; } bool tr_sys_file_get_info (tr_sys_file_t handle, tr_sys_path_info * info, tr_error ** error) { bool ret; struct stat sb; assert (handle != TR_BAD_SYS_FILE); assert (info != NULL); ret = fstat (handle, &sb) != -1; if (ret) stat_to_sys_path_info (&sb, info); else set_system_error (error, errno); return ret; } bool tr_sys_file_seek (tr_sys_file_t handle, int64_t offset, tr_seek_origin_t origin, uint64_t * new_offset, tr_error ** error) { bool ret = false; off_t my_new_offset; TR_STATIC_ASSERT (TR_SEEK_SET == SEEK_SET, "values should match"); TR_STATIC_ASSERT (TR_SEEK_CUR == SEEK_CUR, "values should match"); TR_STATIC_ASSERT (TR_SEEK_END == SEEK_END, "values should match"); TR_STATIC_ASSERT (sizeof (*new_offset) >= sizeof (my_new_offset), ""); assert (handle != TR_BAD_SYS_FILE); assert (origin == TR_SEEK_SET || origin == TR_SEEK_CUR || origin == TR_SEEK_END); my_new_offset = lseek (handle, offset, origin); if (my_new_offset != -1) { if (new_offset != NULL) *new_offset = my_new_offset; ret = true; } else { set_system_error (error, errno); } return ret; } bool tr_sys_file_read (tr_sys_file_t handle, void * buffer, uint64_t size, uint64_t * bytes_read, tr_error ** error) { bool ret = false; ssize_t my_bytes_read; TR_STATIC_ASSERT (sizeof (*bytes_read) >= sizeof (my_bytes_read), ""); assert (handle != TR_BAD_SYS_FILE); assert (buffer != NULL || size == 0); my_bytes_read = read (handle, buffer, size); if (my_bytes_read != -1) { if (bytes_read != NULL) *bytes_read = my_bytes_read; ret = true; } else { set_system_error (error, errno); } return ret; } bool tr_sys_file_read_at (tr_sys_file_t handle, void * buffer, uint64_t size, uint64_t offset, uint64_t * bytes_read, tr_error ** error) { bool ret = false; ssize_t my_bytes_read; TR_STATIC_ASSERT (sizeof (*bytes_read) >= sizeof (my_bytes_read), ""); assert (handle != TR_BAD_SYS_FILE); assert (buffer != NULL || size == 0); /* seek requires signed offset, so it should be in mod range */ assert (offset < UINT64_MAX / 2); #ifdef HAVE_PREAD my_bytes_read = pread (handle, buffer, size, offset); #else if (lseek (handle, offset, SEEK_SET) != -1) my_bytes_read = read (handle, buffer, size); else my_bytes_read = -1; #endif if (my_bytes_read != -1) { if (bytes_read != NULL) *bytes_read = my_bytes_read; ret = true; } else { set_system_error (error, errno); } return ret; } bool tr_sys_file_write (tr_sys_file_t handle, const void * buffer, uint64_t size, uint64_t * bytes_written, tr_error ** error) { bool ret = false; ssize_t my_bytes_written; TR_STATIC_ASSERT (sizeof (*bytes_written) >= sizeof (my_bytes_written), ""); assert (handle != TR_BAD_SYS_FILE); assert (buffer != NULL || size == 0); my_bytes_written = write (handle, buffer, size); if (my_bytes_written != -1) { if (bytes_written != NULL) *bytes_written = my_bytes_written; ret = true; } else { set_system_error (error, errno); } return ret; } bool tr_sys_file_write_at (tr_sys_file_t handle, const void * buffer, uint64_t size, uint64_t offset, uint64_t * bytes_written, tr_error ** error) { bool ret = false; ssize_t my_bytes_written; TR_STATIC_ASSERT (sizeof (*bytes_written) >= sizeof (my_bytes_written), ""); assert (handle != TR_BAD_SYS_FILE); assert (buffer != NULL || size == 0); /* seek requires signed offset, so it should be in mod range */ assert (offset < UINT64_MAX / 2); #ifdef HAVE_PWRITE my_bytes_written = pwrite (handle, buffer, size, offset); #else if (lseek (handle, offset, SEEK_SET) != -1) my_bytes_written = write (handle, buffer, size); else my_bytes_written = -1; #endif if (my_bytes_written != -1) { if (bytes_written != NULL) *bytes_written = my_bytes_written; ret = true; } else { set_system_error (error, errno); } return ret; } bool tr_sys_file_flush (tr_sys_file_t handle, tr_error ** error) { bool ret; assert (handle != TR_BAD_SYS_FILE); ret = fsync (handle) != -1; if (!ret) set_system_error (error, errno); return ret; } bool tr_sys_file_truncate (tr_sys_file_t handle, uint64_t size, tr_error ** error) { bool ret; assert (handle != TR_BAD_SYS_FILE); ret = ftruncate (handle, size) != -1; if (!ret) set_system_error (error, errno); return ret; } bool tr_sys_file_prefetch (tr_sys_file_t handle, uint64_t offset, uint64_t size, tr_error ** error) { bool ret = false; #if defined (HAVE_POSIX_FADVISE) int code; assert (handle != TR_BAD_SYS_FILE); assert (size > 0); code = posix_fadvise (handle, offset, size, POSIX_FADV_WILLNEED); if (code == 0) ret = true; else set_system_error (error, code); #elif defined (__APPLE__) struct radvisory radv; assert (handle != TR_BAD_SYS_FILE); assert (size > 0); radv.ra_offset = offset; radv.ra_count = size; ret = fcntl (handle, F_RDADVISE, &radv) != -1; if (!ret) set_system_error (error, errno); #endif return ret; } bool tr_sys_file_preallocate (tr_sys_file_t handle, uint64_t size, int flags, tr_error ** error) { bool ret = false; assert (handle != TR_BAD_SYS_FILE); errno = 0; #ifdef HAVE_FALLOCATE64 /* fallocate64 is always preferred, so try it first */ ret = fallocate64 (handle, 0, 0, size) != -1; if (ret || errno == ENOSPC) goto out; #endif if ((flags & TR_SYS_FILE_PREALLOC_SPARSE) == 0) { int code = errno; #ifdef HAVE_XFS_XFS_H if (platform_test_xfs_fd (handle)) { xfs_flock64_t fl; fl.l_whence = 0; fl.l_start = 0; fl.l_len = size; ret = xfsctl (NULL, handle, XFS_IOC_RESVSP64, &fl) != -1; if (ret) ret = ftruncate (handle, size) != -1; code = errno; if (ret || code == ENOSPC) goto non_sparse_out; } #endif #ifdef __APPLE__ { fstore_t fst; fst.fst_flags = F_ALLOCATEALL; fst.fst_posmode = F_PEOFPOSMODE; fst.fst_offset = 0; fst.fst_length = size; fst.fst_bytesalloc = 0; ret = fcntl (handle, F_PREALLOCATE, &fst) != -1; if (ret) ret = ftruncate (handle, size) != -1; code = errno; if (ret || code == ENOSPC) goto non_sparse_out; } #endif #ifdef HAVE_POSIX_FALLOCATE code = posix_fallocate (handle, 0, size); ret = code == 0; #endif #if defined(HAVE_XFS_XFS_H) || defined(__APPLE__) non_sparse_out: #endif errno = code; } #ifdef HAVE_FALLOCATE64 out: #endif if (!ret) set_system_error (error, errno); return ret; } void * tr_sys_file_map_for_reading (tr_sys_file_t handle, uint64_t offset, uint64_t size, tr_error ** error) { void * ret; assert (handle != TR_BAD_SYS_FILE); assert (size > 0); ret = mmap (NULL, size, PROT_READ, MAP_SHARED, handle, offset); if (ret == MAP_FAILED) { set_system_error (error, errno); ret = NULL; } return ret; } bool tr_sys_file_unmap (const void * address, uint64_t size, tr_error ** error) { bool ret; assert (address != NULL); assert (size > 0); ret = munmap ((void *) address, size) != -1; if (!ret) set_system_error (error, errno); return ret; } char * tr_sys_dir_get_current (tr_error ** error) { char * ret; ret = getcwd (NULL, 0); if (ret == NULL && (errno == EINVAL || errno == ERANGE)) { size_t size = PATH_MAX; char * tmp = NULL; do { tmp = tr_renew (char, tmp, size); if (tmp == NULL) break; ret = getcwd (tmp, size); size += 2048; } while (ret == NULL && errno == ERANGE); if (ret == NULL) { const int err = errno; tr_free (tmp); errno = err; } } if (ret == NULL) set_system_error (error, errno); return ret; } bool tr_sys_dir_create (const char * path, int flags, int permissions, tr_error ** error) { bool ret; tr_error * my_error = NULL; assert (path != NULL); if ((flags & TR_SYS_DIR_CREATE_PARENTS) != 0) #ifdef HAVE_MKDIRP ret = mkdirp (path, permissions) != -1; #else ret = create_path (path, permissions, &my_error); #endif else ret = mkdir (path, permissions) != -1; if (!ret && errno == EEXIST) { struct stat sb; if (stat (path, &sb) != -1 && S_ISDIR (sb.st_mode)) { tr_error_clear (&my_error); ret = true; } else { errno = EEXIST; } } if (!ret) { if (my_error != NULL) tr_error_propagate (error, &my_error); else set_system_error (error, errno); } return ret; } bool tr_sys_dir_create_temp (char * path_template, tr_error ** error) { bool ret; assert (path_template != NULL); #ifdef HAVE_MKDTEMP ret = mkdtemp (path_template) != NULL; #else ret = mktemp (path_template) != NULL && mkdir (path_template, 0700) != -1; #endif if (!ret) set_system_error (error, errno); return ret; } tr_sys_dir_t tr_sys_dir_open (const char * path, tr_error ** error) { tr_sys_dir_t ret; #ifndef __clang__ /* Clang gives "static_assert expression is not an integral constant expression" error */ TR_STATIC_ASSERT (TR_BAD_SYS_DIR == NULL, "values should match"); #endif assert (path != NULL); ret = opendir (path); if (ret == TR_BAD_SYS_DIR) set_system_error (error, errno); return ret; } const char * tr_sys_dir_read_name (tr_sys_dir_t handle, tr_error ** error) { const char * ret = NULL; struct dirent * entry; assert (handle != TR_BAD_SYS_DIR); errno = 0; entry = readdir (handle); if (entry != NULL) ret = entry->d_name; else if (errno != 0) set_system_error (error, errno); return ret; } bool tr_sys_dir_close (tr_sys_dir_t handle, tr_error ** error) { bool ret; assert (handle != TR_BAD_SYS_DIR); ret = closedir (handle) != -1; if (!ret) set_system_error (error, errno); return ret; } transmission-2.92/libtransmission/PaxHeaders.4960/announcer-http.c0000644000000000000000000000013112641272401022205 xustar0029 mtime=1451586817.58387864 30 atime=1451586817.582878622 30 ctime=1457295919.924806625 transmission-2.92/libtransmission/announcer-http.c0000644000175000017500000003661012641272401023641 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: announcer-http.c 14644 2015-12-29 19:37:31Z mikedld $ */ #include /* USHRT_MAX */ #include /* fprintf () */ #include /* strchr (), memcmp (), memcpy () */ #include #include /* for HTTP_OK */ #define __LIBTRANSMISSION_ANNOUNCER_MODULE__ #include "transmission.h" #include "announcer-common.h" #include "log.h" #include "net.h" /* tr_globalIPv6 () */ #include "peer-mgr.h" /* pex */ #include "torrent.h" #include "trevent.h" /* tr_runInEventThread () */ #include "utils.h" #include "variant.h" #include "web.h" /* tr_http_escape () */ #define dbgmsg(name, ...) \ do \ { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, name, __VA_ARGS__); \ } \ while (0) /**** ***** ***** ANNOUNCE ***** ****/ static const char* get_event_string (const tr_announce_request * req) { if (req->partial_seed) if (req->event != TR_ANNOUNCE_EVENT_STOPPED) return "paused"; return tr_announce_event_get_string (req->event); } static char* announce_url_new (const tr_session * session, const tr_announce_request * req) { const char * str; const unsigned char * ipv6; struct evbuffer * buf = evbuffer_new (); char escaped_info_hash[SHA_DIGEST_LENGTH*3 + 1]; tr_http_escape_sha1 (escaped_info_hash, req->info_hash); evbuffer_expand (buf, 1024); evbuffer_add_printf (buf, "%s" "%c" "info_hash=%s" "&peer_id=%*.*s" "&port=%d" "&uploaded=%" PRIu64 "&downloaded=%" PRIu64 "&left=%" PRIu64 "&numwant=%d" "&key=%x" "&compact=1" "&supportcrypto=1", req->url, strchr (req->url, '?') ? '&' : '?', escaped_info_hash, PEER_ID_LEN, PEER_ID_LEN, req->peer_id, req->port, req->up, req->down, req->leftUntilComplete, req->numwant, req->key); if (session->encryptionMode == TR_ENCRYPTION_REQUIRED) evbuffer_add_printf (buf, "&requirecrypto=1"); if (req->corrupt) evbuffer_add_printf (buf, "&corrupt=%" PRIu64, req->corrupt); str = get_event_string (req); if (str && *str) evbuffer_add_printf (buf, "&event=%s", str); str = req->tracker_id_str; if (str && *str) evbuffer_add_printf (buf, "&trackerid=%s", str); /* There are two incompatible techniques for announcing an IPv6 address. BEP-7 suggests adding an "ipv6=" parameter to the announce URL, while OpenTracker requires that peers announce twice, once over IPv4 and once over IPv6. To be safe, we should do both: add the "ipv6=" parameter and announce twice. At any rate, we're already computing our IPv6 address (for the LTEP handshake), so this comes for free. */ ipv6 = tr_globalIPv6 (); if (ipv6) { char ipv6_readable[INET6_ADDRSTRLEN]; evutil_inet_ntop (AF_INET6, ipv6, ipv6_readable, INET6_ADDRSTRLEN); evbuffer_add_printf (buf, "&ipv6="); tr_http_escape (buf, ipv6_readable, TR_BAD_SIZE, true); } return evbuffer_free_to_str (buf, NULL); } static tr_pex* listToPex (tr_variant * peerList, size_t * setme_len) { size_t i; size_t n; const size_t len = tr_variantListSize (peerList); tr_pex * pex = tr_new0 (tr_pex, len); for (i=n=0; i USHRT_MAX)) continue; if (!tr_address_is_valid_for_peers (&addr, port)) continue; pex[n].addr = addr; pex[n].port = htons ((uint16_t)port); ++n; } *setme_len = n; return pex; } struct announce_data { tr_announce_response response; tr_announce_response_func response_func; void * response_func_user_data; char log_name[128]; }; static void on_announce_done_eventthread (void * vdata) { struct announce_data * data = vdata; if (data->response_func != NULL) data->response_func (&data->response, data->response_func_user_data); tr_free (data->response.pex6); tr_free (data->response.pex); tr_free (data->response.tracker_id_str); tr_free (data->response.warning); tr_free (data->response.errmsg); tr_free (data); } static void on_announce_done (tr_session * session, bool did_connect, bool did_timeout, long response_code, const void * msg, size_t msglen, void * vdata) { tr_announce_response * response; struct announce_data * data = vdata; response = &data->response; response->did_connect = did_connect; response->did_timeout = did_timeout; dbgmsg (data->log_name, "Got announce response"); if (response_code != HTTP_OK) { const char * fmt = _("Tracker gave HTTP response code %1$ld (%2$s)"); const char * response_str = tr_webGetResponseStr (response_code); response->errmsg = tr_strdup_printf (fmt, response_code, response_str); } else { tr_variant benc; const bool variant_loaded = !tr_variantFromBenc (&benc, msg, msglen); if (tr_env_key_exists ("TR_CURL_VERBOSE")) { if (!variant_loaded) fprintf (stderr, "%s", "Announce response was not in benc format\n"); else { size_t i, len; char * str = tr_variantToStr (&benc, TR_VARIANT_FMT_JSON, &len); fprintf (stderr, "%s", "Announce response:\n< "); for (i=0; ierrmsg = tr_strndup (str, len); if (tr_variantDictFindStr (&benc, TR_KEY_warning_message, &str, &len)) response->warning = tr_strndup (str, len); if (tr_variantDictFindInt (&benc, TR_KEY_interval, &i)) response->interval = i; if (tr_variantDictFindInt (&benc, TR_KEY_min_interval, &i)) response->min_interval = i; if (tr_variantDictFindStr (&benc, TR_KEY_tracker_id, &str, &len)) response->tracker_id_str = tr_strndup (str, len); if (tr_variantDictFindInt (&benc, TR_KEY_complete, &i)) response->seeders = i; if (tr_variantDictFindInt (&benc, TR_KEY_incomplete, &i)) response->leechers = i; if (tr_variantDictFindInt (&benc, TR_KEY_downloaded, &i)) response->downloads = i; if (tr_variantDictFindRaw (&benc, TR_KEY_peers6, &raw, &len)) { dbgmsg (data->log_name, "got a peers6 length of %zu", len); response->pex6 = tr_peerMgrCompact6ToPex (raw, len, NULL, 0, &response->pex6_count); } if (tr_variantDictFindRaw (&benc, TR_KEY_peers, &raw, &len)) { dbgmsg (data->log_name, "got a compact peers length of %zu", len); response->pex = tr_peerMgrCompactToPex (raw, len, NULL, 0, &response->pex_count); } else if (tr_variantDictFindList (&benc, TR_KEY_peers, &tmp)) { response->pex = listToPex (tmp, &response->pex_count); dbgmsg (data->log_name, "got a peers list with %zu entries", response->pex_count); } } if (variant_loaded) tr_variantFree (&benc); } tr_runInEventThread (session, on_announce_done_eventthread, data); } void tr_tracker_http_announce (tr_session * session, const tr_announce_request * request, tr_announce_response_func response_func, void * response_func_user_data) { struct announce_data * d; char * url = announce_url_new (session, request); d = tr_new0 (struct announce_data, 1); d->response.seeders = -1; d->response.leechers = -1; d->response.downloads = -1; d->response_func = response_func; d->response_func_user_data = response_func_user_data; memcpy (d->response.info_hash, request->info_hash, SHA_DIGEST_LENGTH); tr_strlcpy (d->log_name, request->log_name, sizeof (d->log_name)); dbgmsg (request->log_name, "Sending announce to libcurl: \"%s\"", url); tr_webRun (session, url, on_announce_done, d); tr_free (url); } /**** ***** ***** SCRAPE ***** ****/ struct scrape_data { tr_scrape_response response; tr_scrape_response_func response_func; void * response_func_user_data; char log_name[128]; }; static void on_scrape_done_eventthread (void * vdata) { struct scrape_data * data = vdata; if (data->response_func != NULL) data->response_func (&data->response, data->response_func_user_data); tr_free (data->response.errmsg); tr_free (data->response.url); tr_free (data); } static void on_scrape_done (tr_session * session, bool did_connect, bool did_timeout, long response_code, const void * msg, size_t msglen, void * vdata) { tr_scrape_response * response; struct scrape_data * data = vdata; response = &data->response; response->did_connect = did_connect; response->did_timeout = did_timeout; dbgmsg (data->log_name, "Got scrape response for \"%s\"", response->url); if (response_code != HTTP_OK) { const char * fmt = _("Tracker gave HTTP response code %1$ld (%2$s)"); const char * response_str = tr_webGetResponseStr (response_code); response->errmsg = tr_strdup_printf (fmt, response_code, response_str); } else { tr_variant top; int64_t intVal; tr_variant * files; tr_variant * flags; size_t len; const char * str; const bool variant_loaded = !tr_variantFromBenc (&top, msg, msglen); if (tr_env_key_exists ("TR_CURL_VERBOSE")) { if (!variant_loaded) fprintf (stderr, "%s", "Scrape response was not in benc format\n"); else { size_t i, len; char * str = tr_variantToStr (&top, TR_VARIANT_FMT_JSON, &len); fprintf (stderr, "%s", "Scrape response:\n< "); for (i=0; ierrmsg = tr_strndup (str, len); if (tr_variantDictFindDict (&top, TR_KEY_flags, &flags)) if (tr_variantDictFindInt (flags, TR_KEY_min_request_interval, &intVal)) response->min_request_interval = intVal; if (tr_variantDictFindDict (&top, TR_KEY_files, &files)) { int i = 0; for (;;) { int j; tr_quark key; tr_variant * val; /* get the next "file" */ if (!tr_variantDictChild (files, i++, &key, &val)) break; /* populate the corresponding row in our response array */ for (j=0; jrow_count; ++j) { struct tr_scrape_response_row * row = &response->rows[j]; if (!memcmp (tr_quark_get_string(key,NULL), row->info_hash, SHA_DIGEST_LENGTH)) { if (tr_variantDictFindInt (val, TR_KEY_complete, &intVal)) row->seeders = intVal; if (tr_variantDictFindInt (val, TR_KEY_incomplete, &intVal)) row->leechers = intVal; if (tr_variantDictFindInt (val, TR_KEY_downloaded, &intVal)) row->downloads = intVal; if (tr_variantDictFindInt (val, TR_KEY_downloaders, &intVal)) row->downloaders = intVal; break; } } } } tr_variantFree (&top); } } tr_runInEventThread (session, on_scrape_done_eventthread, data); } static char * scrape_url_new (const tr_scrape_request * req) { int i; char delimiter; struct evbuffer * buf = evbuffer_new (); evbuffer_add_printf (buf, "%s", req->url); delimiter = strchr (req->url, '?') ? '&' : '?'; for (i=0; iinfo_hash_count; ++i) { char str[SHA_DIGEST_LENGTH*3 + 1]; tr_http_escape_sha1 (str, req->info_hash[i]); evbuffer_add_printf (buf, "%cinfo_hash=%s", delimiter, str); delimiter = '&'; } return evbuffer_free_to_str (buf, NULL); } void tr_tracker_http_scrape (tr_session * session, const tr_scrape_request * request, tr_scrape_response_func response_func, void * response_func_user_data) { int i; struct scrape_data * d; char * url = scrape_url_new (request); d = tr_new0 (struct scrape_data, 1); d->response.url = tr_strdup (request->url); d->response_func = response_func; d->response_func_user_data = response_func_user_data; d->response.row_count = request->info_hash_count; for (i=0; iresponse.row_count; ++i) { memcpy (d->response.rows[i].info_hash, request->info_hash[i], SHA_DIGEST_LENGTH); d->response.rows[i].seeders = -1; d->response.rows[i].leechers = -1; d->response.rows[i].downloads = -1; } tr_strlcpy (d->log_name, request->log_name, sizeof (d->log_name)); dbgmsg (request->log_name, "Sending scrape to libcurl: \"%s\"", url); tr_webRun (session, url, on_scrape_done, d); tr_free (url); } transmission-2.92/libtransmission/PaxHeaders.4960/crypto-utils-polarssl.c0000644000000000000000000000013212505250244023554 xustar0030 mtime=1427460260.449243637 30 atime=1427460260.449243637 30 ctime=1457295920.257812288 transmission-2.92/libtransmission/crypto-utils-polarssl.c0000644000175000017500000001501012505250244025176 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2014-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: crypto-utils-polarssl.c 14444 2015-01-07 14:05:58Z mikedld $ */ #include #include #include #include #include #include #include #include #include "transmission.h" #include "crypto-utils.h" #include "log.h" #include "platform.h" #include "utils.h" #define TR_CRYPTO_DH_SECRET_FALLBACK #include "crypto-utils-fallback.c" /*** **** ***/ #define MY_NAME "tr_crypto_utils" static void log_polarssl_error (int error_code, const char * file, int line) { if (tr_logLevelIsActive (TR_LOG_ERROR)) { char error_message[256]; #if POLARSSL_VERSION_NUMBER >= 0x01030000 polarssl_strerror (error_code, error_message, sizeof (error_message)); #else error_strerror (error_code, error_message, sizeof (error_message)); #endif tr_logAddMessage (file, line, TR_LOG_ERROR, MY_NAME, "PolarSSL error: %s", error_message); } } #define log_error(error_code) log_polarssl_error(error_code, __FILE__, __LINE__) static bool check_polarssl_result (int result, int expected_result, const char * file, int line) { const bool ret = result == expected_result; if (!ret) log_polarssl_error (result, file, line); return ret; } #define check_result(result) check_polarssl_result ((result), 0, __FILE__, __LINE__) #define check_result_eq(result, x_result) check_polarssl_result ((result), (x_result), __FILE__, __LINE__) /*** **** ***/ static int my_rand (void * context UNUSED, unsigned char * buffer, size_t buffer_size) { size_t i; for (i = 0; i < buffer_size; ++i) buffer[i] = tr_rand_int_weak (256); return 0; } static ctr_drbg_context * get_rng (void) { static ctr_drbg_context rng; static bool rng_initialized = false; if (!rng_initialized) { if (!check_result (ctr_drbg_init (&rng, &my_rand, NULL, NULL, 0))) return NULL; rng_initialized = true; } return &rng; } static tr_lock * get_rng_lock (void) { static tr_lock * lock = NULL; if (lock == NULL) lock = tr_lockNew (); return lock; } /*** **** ***/ tr_sha1_ctx_t tr_sha1_init (void) { sha1_context * handle = tr_new0 (sha1_context, 1); #if POLARSSL_VERSION_NUMBER >= 0x01030800 sha1_init (handle); #endif sha1_starts (handle); return handle; } bool tr_sha1_update (tr_sha1_ctx_t handle, const void * data, size_t data_length) { assert (handle != NULL); if (data_length == 0) return true; assert (data != NULL); sha1_update (handle, data, data_length); return true; } bool tr_sha1_final (tr_sha1_ctx_t handle, uint8_t * hash) { if (hash != NULL) { assert (handle != NULL); sha1_finish (handle, hash); } #if POLARSSL_VERSION_NUMBER >= 0x01030800 sha1_free (handle); #endif tr_free (handle); return true; } /*** **** ***/ tr_rc4_ctx_t tr_rc4_new (void) { arc4_context * handle = tr_new0 (arc4_context, 1); #if POLARSSL_VERSION_NUMBER >= 0x01030800 arc4_init (handle); #endif return handle; } void tr_rc4_free (tr_rc4_ctx_t handle) { #if POLARSSL_VERSION_NUMBER >= 0x01030800 arc4_free (handle); #endif tr_free (handle); } void tr_rc4_set_key (tr_rc4_ctx_t handle, const uint8_t * key, size_t key_length) { assert (handle != NULL); assert (key != NULL); arc4_setup (handle, key, key_length); } void tr_rc4_process (tr_rc4_ctx_t handle, const void * input, void * output, size_t length) { assert (handle != NULL); if (length == 0) return; assert (input != NULL); assert (output != NULL); arc4_crypt (handle, length, input, output); } /*** **** ***/ tr_dh_ctx_t tr_dh_new (const uint8_t * prime_num, size_t prime_num_length, const uint8_t * generator_num, size_t generator_num_length) { dhm_context * handle = tr_new0 (dhm_context, 1); assert (prime_num != NULL); assert (generator_num != NULL); #if POLARSSL_VERSION_NUMBER >= 0x01030800 dhm_init (handle); #endif if (!check_result (mpi_read_binary (&handle->P, prime_num, prime_num_length)) || !check_result (mpi_read_binary (&handle->G, generator_num, generator_num_length))) { dhm_free (handle); return NULL; } handle->len = prime_num_length; return handle; } void tr_dh_free (tr_dh_ctx_t handle) { if (handle == NULL) return; dhm_free (handle); } bool tr_dh_make_key (tr_dh_ctx_t raw_handle, size_t private_key_length, uint8_t * public_key, size_t * public_key_length) { dhm_context * handle = raw_handle; assert (handle != NULL); assert (public_key != NULL); if (public_key_length != NULL) *public_key_length = handle->len; return check_result (dhm_make_public (handle, private_key_length, public_key, handle->len, my_rand, NULL)); } tr_dh_secret_t tr_dh_agree (tr_dh_ctx_t raw_handle, const uint8_t * other_public_key, size_t other_public_key_length) { dhm_context * handle = raw_handle; struct tr_dh_secret * ret; size_t secret_key_length; assert (handle != NULL); assert (other_public_key != NULL); if (!check_result (dhm_read_public (handle, other_public_key, other_public_key_length))) return NULL; ret = tr_dh_secret_new (handle->len); secret_key_length = handle->len; #if POLARSSL_VERSION_NUMBER >= 0x01030000 if (!check_result (dhm_calc_secret (handle, ret->key, &secret_key_length, my_rand, NULL))) #else if (!check_result (dhm_calc_secret (handle, ret->key, &secret_key_length))) #endif { tr_dh_secret_free (ret); return NULL; } tr_dh_secret_align (ret, secret_key_length); return ret; } /*** **** ***/ bool tr_rand_buffer (void * buffer, size_t length) { bool ret; tr_lock * rng_lock = get_rng_lock (); assert (buffer != NULL); tr_lockLock (rng_lock); ret = check_result (ctr_drbg_random (get_rng (), buffer, length)); tr_lockUnlock (rng_lock); return ret; } transmission-2.92/libtransmission/PaxHeaders.4960/completion.c0000644000000000000000000000013212442116602021411 xustar0030 mtime=1418239362.929222546 30 atime=1418239362.929222546 30 ctime=1457295919.968807374 transmission-2.92/libtransmission/completion.c0000644000175000017500000001757212442116602023052 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: completion.c 14241 2014-01-21 03:10:30Z jordan $ */ #include #include "transmission.h" #include "completion.h" #include "torrent.h" #include "utils.h" /*** **** ***/ static void tr_cpReset (tr_completion * cp) { cp->sizeNow = 0; cp->sizeWhenDoneIsDirty = true; cp->haveValidIsDirty = true; tr_bitfieldSetHasNone (&cp->blockBitfield); } void tr_cpConstruct (tr_completion * cp, tr_torrent * tor) { cp->tor = tor; tr_bitfieldConstruct (&cp->blockBitfield, tor->blockCount); tr_cpReset (cp); } void tr_cpBlockInit (tr_completion * cp, const tr_bitfield * b) { tr_cpReset (cp); /* set blockBitfield */ tr_bitfieldSetFromBitfield (&cp->blockBitfield, b); /* set sizeNow */ cp->sizeNow = tr_bitfieldCountTrueBits (&cp->blockBitfield); assert (cp->sizeNow <= cp->tor->blockCount); cp->sizeNow *= cp->tor->blockSize; if (tr_bitfieldHas (b, cp->tor->blockCount-1)) cp->sizeNow -= (cp->tor->blockSize - cp->tor->lastBlockSize); assert (cp->sizeNow <= cp->tor->info.totalSize); } /*** **** ***/ tr_completeness tr_cpGetStatus (const tr_completion * cp) { if (tr_cpHasAll (cp)) return TR_SEED; if (!tr_torrentHasMetadata (cp->tor)) return TR_LEECH; if (cp->sizeNow == tr_cpSizeWhenDone (cp)) return TR_PARTIAL_SEED; return TR_LEECH; } void tr_cpPieceRem (tr_completion * cp, tr_piece_index_t piece) { tr_block_index_t i, f, l; const tr_torrent * tor = cp->tor; tr_torGetPieceBlockRange (cp->tor, piece, &f, &l); for (i=f; i<=l; ++i) if (tr_cpBlockIsComplete (cp, i)) cp->sizeNow -= tr_torBlockCountBytes (tor, i); cp->haveValidIsDirty = true; cp->sizeWhenDoneIsDirty = true; tr_bitfieldRemRange (&cp->blockBitfield, f, l+1); } void tr_cpPieceAdd (tr_completion * cp, tr_piece_index_t piece) { tr_block_index_t i, f, l; tr_torGetPieceBlockRange (cp->tor, piece, &f, &l); for (i=f; i<=l; ++i) tr_cpBlockAdd (cp, i); } void tr_cpBlockAdd (tr_completion * cp, tr_block_index_t block) { const tr_torrent * tor = cp->tor; if (!tr_cpBlockIsComplete (cp, block)) { const tr_piece_index_t piece = tr_torBlockPiece (cp->tor, block); tr_bitfieldAdd (&cp->blockBitfield, block); cp->sizeNow += tr_torBlockCountBytes (tor, block); cp->haveValidIsDirty = true; cp->sizeWhenDoneIsDirty |= tor->info.pieces[piece].dnd; } } /*** **** ***/ uint64_t tr_cpHaveValid (const tr_completion * ccp) { if (ccp->haveValidIsDirty) { tr_piece_index_t i; uint64_t size = 0; tr_completion * cp = (tr_completion *) ccp; /* mutable */ const tr_torrent * tor = ccp->tor; const tr_info * info = &tor->info; for (i=0; ipieceCount; ++i) if (tr_cpPieceIsComplete (ccp, i)) size += tr_torPieceCountBytes (tor, i); cp->haveValidLazy = size; cp->haveValidIsDirty = false; } return ccp->haveValidLazy; } uint64_t tr_cpSizeWhenDone (const tr_completion * ccp) { if (ccp->sizeWhenDoneIsDirty) { uint64_t size = 0; const tr_torrent * tor = ccp->tor; const tr_info * inf = tr_torrentInfo (tor); tr_completion * cp = (tr_completion *) ccp; /* mutable */ if (tr_cpHasAll (ccp)) { size = inf->totalSize; } else { tr_piece_index_t p; for (p=0; ppieceCount; ++p) { uint64_t n = 0; const uint64_t pieceSize = tr_torPieceCountBytes (tor, p); if (!inf->pieces[p].dnd) { n = pieceSize; } else { tr_block_index_t f, l; tr_torGetPieceBlockRange (cp->tor, p, &f, &l); n = tr_bitfieldCountRange (&cp->blockBitfield, f, l+1); n *= cp->tor->blockSize; if (l == (cp->tor->blockCount-1) && tr_bitfieldHas (&cp->blockBitfield, l)) n -= (cp->tor->blockSize - cp->tor->lastBlockSize); } assert (n <= tr_torPieceCountBytes (tor, p)); size += n; } } assert (size <= inf->totalSize); assert (size >= cp->sizeNow); cp->sizeWhenDoneLazy = size; cp->sizeWhenDoneIsDirty = false; } return ccp->sizeWhenDoneLazy; } uint64_t tr_cpLeftUntilDone (const tr_completion * cp) { const uint64_t sizeWhenDone = tr_cpSizeWhenDone (cp); assert (sizeWhenDone >= cp->sizeNow); return sizeWhenDone - cp->sizeNow; } void tr_cpGetAmountDone (const tr_completion * cp, float * tab, int tabCount) { int i; const bool seed = tr_cpHasAll (cp); const float interval = cp->tor->info.pieceCount / (float)tabCount; for (i=0; itor, piece, &f, &l); tab[i] = tr_bitfieldCountRange (&cp->blockBitfield, f, l+1) / (float)(l+1-f); } } } size_t tr_cpMissingBlocksInPiece (const tr_completion * cp, tr_piece_index_t piece) { if (tr_cpHasAll (cp)) { return 0; } else { tr_block_index_t f, l; tr_torGetPieceBlockRange (cp->tor, piece, &f, &l); return (l+1-f) - tr_bitfieldCountRange (&cp->blockBitfield, f, l+1); } } size_t tr_cpMissingBytesInPiece (const tr_completion * cp, tr_piece_index_t piece) { if (tr_cpHasAll (cp)) { return 0; } else { size_t haveBytes = 0; tr_block_index_t f, l; const size_t pieceByteSize = tr_torPieceCountBytes (cp->tor, piece); tr_torGetPieceBlockRange (cp->tor, piece, &f, &l); if (f != l) { /* nb: we don't pass the usual l+1 here to tr_bitfieldCountRange (). It's faster to handle the last block separately because its size needs to be checked separately. */ haveBytes = tr_bitfieldCountRange (&cp->blockBitfield, f, l); haveBytes *= cp->tor->blockSize; } if (tr_bitfieldHas (&cp->blockBitfield, l)) /* handle the last block */ haveBytes += tr_torBlockCountBytes (cp->tor, l); assert (haveBytes <= pieceByteSize); return pieceByteSize - haveBytes; } } bool tr_cpFileIsComplete (const tr_completion * cp, tr_file_index_t i) { if (cp->tor->info.files[i].length == 0) { return true; } else { tr_block_index_t f, l; tr_torGetFileBlockRange (cp->tor, i, &f, &l); return tr_bitfieldCountRange (&cp->blockBitfield, f, l+1) == (l+1-f); } } void * tr_cpCreatePieceBitfield (const tr_completion * cp, size_t * byte_count) { void * ret; tr_piece_index_t n; tr_bitfield pieces; assert (tr_torrentHasMetadata (cp->tor)); n = cp->tor->info.pieceCount; tr_bitfieldConstruct (&pieces, n); if (tr_cpHasAll (cp)) { tr_bitfieldSetHasAll (&pieces); } else if (!tr_cpHasNone (cp)) { tr_piece_index_t i; bool * flags = tr_new (bool, n); for (i=0; isizeNow, cp->tor->info.totalSize); if ((int)ratio == TR_RATIO_NA) return 0.0; else if ((int)ratio == TR_RATIO_INF) return 1.0; else return ratio; } double tr_cpPercentDone (const tr_completion * cp) { const double ratio = tr_getRatio (cp->sizeNow, tr_cpSizeWhenDone (cp)); const int iratio = (int)ratio; return ((iratio == TR_RATIO_NA) || (iratio == TR_RATIO_INF)) ? 0.0 : ratio; } transmission-2.92/libtransmission/PaxHeaders.4960/verify.h0000644000000000000000000000013212442116602020551 xustar0030 mtime=1418239362.918222358 30 atime=1418239362.918222358 30 ctime=1457295919.874805775 transmission-2.92/libtransmission/verify.h0000644000175000017500000000123112442116602022173 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: verify.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_VERIFY_H #define TR_VERIFY_H 1 /** * @addtogroup file_io File IO * @{ */ void tr_verifyAdd (tr_torrent * tor, tr_verify_done_func callback_func, void * callback_user_data); void tr_verifyRemove (tr_torrent * tor); void tr_verifyClose (tr_session *); /* @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/watchdir-test.c0000644000000000000000000000013212662757243022042 xustar0030 mtime=1456201379.238861599 30 atime=1456201379.238861599 30 ctime=1457295920.279812662 transmission-2.92/libtransmission/watchdir-test.c0000644000175000017500000002342412662757243023474 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015-2016 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: watchdir-test.c 14675 2016-01-25 22:09:49Z mikedld $ */ #include #include "transmission.h" #include "file.h" #include "net.h" #include "utils.h" #include "watchdir.h" #include "libtransmission-test.h" /*** **** ***/ typedef struct callback_data { tr_watchdir_t dir; char * name; tr_watchdir_status result; } callback_data; #define CB_DATA_STATIC_INIT { NULL, NULL, 0 } struct event_base * ev_base = NULL; extern struct timeval tr_watchdir_generic_interval; extern unsigned int tr_watchdir_retry_limit; extern struct timeval tr_watchdir_retry_start_interval; extern struct timeval tr_watchdir_retry_max_interval; const struct timeval FIFTY_MSEC = { 0, 50000 }; const struct timeval ONE_HUNDRED_MSEC = { 0, 100000 }; const struct timeval TWO_HUNDRED_MSEC = { 0, 200000 }; static void process_events (void) { event_base_loopexit (ev_base, &TWO_HUNDRED_MSEC); event_base_dispatch (ev_base); } static tr_watchdir_status callback (tr_watchdir_t dir, const char * name, void * context) { callback_data * const data = context; if (data->result != TR_WATCHDIR_RETRY) { data->dir = dir; if (data->name != NULL) tr_free (data->name); data->name = tr_strdup (name); } return data->result; } static void reset_callback_data (callback_data * data, tr_watchdir_status result) { tr_free (data->name); data->dir = NULL; data->name = NULL; data->result = result; } static void create_file (const char * parent_dir, const char * name) { char * const path = tr_buildPath (parent_dir, name, NULL); libtest_create_file_with_string_contents (path, ""); tr_free (path); } static void create_dir (const char * parent_dir, const char * name) { char * const path = tr_buildPath (parent_dir, name, NULL); tr_sys_dir_create (path, 0, 0700, NULL); tr_free (path); } static tr_watchdir_t create_watchdir (const char * path, tr_watchdir_cb callback, void * callback_user_data, struct event_base * event_base) { #ifdef WATCHDIR_TEST_FORCE_GENERIC const bool force_generic = true; #else const bool force_generic = false; #endif return tr_watchdir_new (path, callback, callback_user_data, event_base, force_generic); } /*** **** ***/ static int test_construct (void) { char * const test_dir = libtest_sandbox_create (); tr_watchdir_t wd; ev_base = event_base_new(); wd = create_watchdir (test_dir, &callback, NULL, ev_base); check (wd != NULL); check (tr_sys_path_is_same (test_dir, tr_watchdir_get_path (wd), NULL)); tr_watchdir_free (wd); event_base_free (ev_base); libtest_sandbox_destroy (test_dir); tr_free (test_dir); return 0; } static int test_initial_scan (void) { char * const test_dir = libtest_sandbox_create (); ev_base = event_base_new(); /* Speed up generic implementation */ tr_watchdir_generic_interval = ONE_HUNDRED_MSEC; { callback_data wd_data = CB_DATA_STATIC_INIT; reset_callback_data (&wd_data, TR_WATCHDIR_ACCEPT); tr_watchdir_t wd = create_watchdir (test_dir, &callback, &wd_data, ev_base); check (wd != NULL); process_events (); check_ptr_eq (NULL, wd_data.dir); check_ptr_eq (NULL, wd_data.name); tr_watchdir_free (wd); reset_callback_data (&wd_data, TR_WATCHDIR_ACCEPT); } create_file (test_dir, "test"); { callback_data wd_data = CB_DATA_STATIC_INIT; reset_callback_data (&wd_data, TR_WATCHDIR_ACCEPT); tr_watchdir_t wd = create_watchdir (test_dir, &callback, &wd_data, ev_base); check (wd != NULL); process_events (); check_ptr_eq (wd, wd_data.dir); check_streq ("test", wd_data.name); tr_watchdir_free (wd); reset_callback_data (&wd_data, TR_WATCHDIR_ACCEPT); } event_base_free (ev_base); libtest_sandbox_destroy (test_dir); tr_free (test_dir); return 0; } static int test_watch (void) { char * const test_dir = libtest_sandbox_create (); callback_data wd_data = CB_DATA_STATIC_INIT; tr_watchdir_t wd; ev_base = event_base_new(); /* Speed up generic implementation */ tr_watchdir_generic_interval = ONE_HUNDRED_MSEC; reset_callback_data (&wd_data, TR_WATCHDIR_ACCEPT); wd = create_watchdir (test_dir, &callback, &wd_data, ev_base); check (wd != NULL); process_events (); check_ptr_eq (NULL, wd_data.dir); check_ptr_eq (NULL, wd_data.name); create_file (test_dir, "test"); process_events (); check_ptr_eq (wd, wd_data.dir); check_streq ("test", wd_data.name); reset_callback_data (&wd_data, TR_WATCHDIR_IGNORE); create_file (test_dir, "test2"); process_events (); check_ptr_eq (wd, wd_data.dir); check_streq ("test2", wd_data.name); reset_callback_data (&wd_data, TR_WATCHDIR_IGNORE); create_dir (test_dir, "test3"); process_events (); check_ptr_eq (NULL, wd_data.dir); check_ptr_eq (NULL, wd_data.name); tr_watchdir_free (wd); reset_callback_data (&wd_data, TR_WATCHDIR_ACCEPT); event_base_free (ev_base); libtest_sandbox_destroy (test_dir); tr_free (test_dir); return 0; } static int test_watch_two_dirs (void) { char * const test_dir = libtest_sandbox_create (); char * const dir1 = tr_buildPath (test_dir, "a", NULL); char * const dir2 = tr_buildPath (test_dir, "b", NULL); callback_data wd1_data = CB_DATA_STATIC_INIT, wd2_data = CB_DATA_STATIC_INIT; tr_watchdir_t wd1, wd2; ev_base = event_base_new(); /* Speed up generic implementation */ tr_watchdir_generic_interval = ONE_HUNDRED_MSEC; create_dir (dir1, NULL); create_dir (dir2, NULL); reset_callback_data (&wd1_data, TR_WATCHDIR_ACCEPT); wd1 = create_watchdir (dir1, &callback, &wd1_data, ev_base); check (wd1 != NULL); reset_callback_data (&wd2_data, TR_WATCHDIR_ACCEPT); wd2 = create_watchdir (dir2, &callback, &wd2_data, ev_base); check (wd2 != NULL); process_events (); check_ptr_eq (NULL, wd1_data.dir); check_ptr_eq (NULL, wd1_data.name); check_ptr_eq (NULL, wd2_data.dir); check_ptr_eq (NULL, wd2_data.name); create_file (dir1, "test"); process_events (); check_ptr_eq (wd1, wd1_data.dir); check_streq ("test", wd1_data.name); check_ptr_eq (NULL, wd2_data.dir); check_ptr_eq (NULL, wd2_data.name); reset_callback_data (&wd1_data, TR_WATCHDIR_ACCEPT); reset_callback_data (&wd2_data, TR_WATCHDIR_ACCEPT); create_file (dir2, "test2"); process_events (); check_ptr_eq (NULL, wd1_data.dir); check_ptr_eq (NULL, wd1_data.name); check_ptr_eq (wd2, wd2_data.dir); check_streq ("test2", wd2_data.name); reset_callback_data (&wd1_data, TR_WATCHDIR_IGNORE); reset_callback_data (&wd2_data, TR_WATCHDIR_IGNORE); create_file (dir1, "test3"); create_file (dir2, "test4"); process_events (); check_ptr_eq (wd1, wd1_data.dir); check_streq ("test3", wd1_data.name); check_ptr_eq (wd2, wd2_data.dir); check_streq ("test4", wd2_data.name); reset_callback_data (&wd1_data, TR_WATCHDIR_ACCEPT); reset_callback_data (&wd2_data, TR_WATCHDIR_ACCEPT); create_file (dir1, "test5"); create_dir (dir2, "test5"); process_events (); check_ptr_eq (wd1, wd1_data.dir); check_streq ("test5", wd1_data.name); check_ptr_eq (NULL, wd2_data.dir); check_ptr_eq (NULL, wd2_data.name); reset_callback_data (&wd1_data, TR_WATCHDIR_ACCEPT); reset_callback_data (&wd2_data, TR_WATCHDIR_ACCEPT); create_dir (dir1, "test6"); create_file (dir2, "test6"); process_events (); check_ptr_eq (NULL, wd1_data.dir); check_ptr_eq (NULL, wd1_data.name); check_ptr_eq (wd2, wd2_data.dir); check_streq ("test6", wd2_data.name); reset_callback_data (&wd1_data, TR_WATCHDIR_ACCEPT); reset_callback_data (&wd2_data, TR_WATCHDIR_ACCEPT); create_dir (dir1, "test7"); create_dir (dir2, "test7"); process_events (); check_ptr_eq (NULL, wd1_data.dir); check_ptr_eq (NULL, wd1_data.name); check_ptr_eq (NULL, wd2_data.dir); check_ptr_eq (NULL, wd2_data.name); tr_watchdir_free (wd2); reset_callback_data (&wd2_data, TR_WATCHDIR_ACCEPT); tr_watchdir_free (wd1); reset_callback_data (&wd1_data, TR_WATCHDIR_ACCEPT); event_base_free (ev_base); tr_free (dir2); tr_free (dir1); libtest_sandbox_destroy (test_dir); tr_free (test_dir); return 0; } static int test_retry (void) { char * const test_dir = libtest_sandbox_create (); callback_data wd_data = CB_DATA_STATIC_INIT; tr_watchdir_t wd; ev_base = event_base_new(); /* Speed up generic implementation */ tr_watchdir_generic_interval = ONE_HUNDRED_MSEC; /* Tune retry logic */ tr_watchdir_retry_limit = 10; tr_watchdir_retry_start_interval = FIFTY_MSEC; tr_watchdir_retry_max_interval = tr_watchdir_retry_start_interval; reset_callback_data (&wd_data, TR_WATCHDIR_RETRY); wd = create_watchdir (test_dir, &callback, &wd_data, ev_base); check (wd != NULL); process_events (); check_ptr_eq (NULL, wd_data.dir); check_ptr_eq (NULL, wd_data.name); create_file (test_dir, "test"); process_events (); check_ptr_eq (NULL, wd_data.dir); check_ptr_eq (NULL, wd_data.name); reset_callback_data (&wd_data, TR_WATCHDIR_ACCEPT); process_events (); check_ptr_eq (wd, wd_data.dir); check_streq ("test", wd_data.name); tr_watchdir_free (wd); reset_callback_data (&wd_data, TR_WATCHDIR_ACCEPT); event_base_free (ev_base); libtest_sandbox_destroy (test_dir); tr_free (test_dir); return 0; } /*** **** ***/ int main (void) { const testFunc tests[] = { test_construct, test_initial_scan, test_watch, test_watch_two_dirs, test_retry }; tr_net_init (); return runTests (tests, NUM_TESTS (tests)); } transmission-2.92/libtransmission/PaxHeaders.4960/trevent.c0000644000000000000000000000013212641272401020730 xustar0030 mtime=1451586817.579878569 30 atime=1451586817.579878569 30 ctime=1457295920.195811234 transmission-2.92/libtransmission/trevent.c0000644000175000017500000002016312641272401022357 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: trevent.c 14648 2015-12-31 14:17:37Z mikedld $ */ #include #include #include #include #ifdef _WIN32 #include #else #include /* read (), write (), pipe () */ #endif #include #include #include "transmission.h" #include "log.h" #include "net.h" #include "session.h" #include "transmission.h" #include "platform.h" /* tr_lockLock () */ #include "trevent.h" #include "utils.h" #ifdef _WIN32 typedef SOCKET tr_pipe_end_t; static int pgpipe (tr_pipe_end_t handles[2]) { SOCKET s; struct sockaddr_in serv_addr; int len = sizeof (serv_addr); handles[0] = handles[1] = INVALID_SOCKET; if ((s = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { tr_logAddDebug ("pgpipe failed to create socket: %ui", WSAGetLastError ()); return -1; } memset (&serv_addr, 0, sizeof (serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons (0); serv_addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); if (bind (s, (SOCKADDR *) & serv_addr, len) == SOCKET_ERROR) { tr_logAddDebug ("pgpipe failed to bind: %ui", WSAGetLastError ()); closesocket (s); return -1; } if (listen (s, 1) == SOCKET_ERROR) { tr_logAddNamedDbg ("event","pgpipe failed to listen: %ui", WSAGetLastError ()); closesocket (s); return -1; } if (getsockname (s, (SOCKADDR *) & serv_addr, &len) == SOCKET_ERROR) { tr_logAddDebug ("pgpipe failed to getsockname: %ui", WSAGetLastError ()); closesocket (s); return -1; } if ((handles[1] = socket (PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { tr_logAddDebug ("pgpipe failed to create socket 2: %ui", WSAGetLastError ()); closesocket (s); return -1; } if (connect (handles[1], (SOCKADDR *) & serv_addr, len) == SOCKET_ERROR) { tr_logAddDebug ("pgpipe failed to connect socket: %ui", WSAGetLastError ()); closesocket (s); return -1; } if ((handles[0] = accept (s, (SOCKADDR *) & serv_addr, &len)) == INVALID_SOCKET) { tr_logAddDebug ("pgpipe failed to accept socket: %ui", WSAGetLastError ()); closesocket (handles[1]); handles[1] = INVALID_SOCKET; closesocket (s); return -1; } closesocket (s); return 0; } static int piperead (tr_pipe_end_t s, void * buf, int len) { int ret = recv (s, buf, len, 0); if (ret < 0) { const int werror= WSAGetLastError (); switch (werror) { /* simplified error mapping (not valid for connect) */ case WSAEWOULDBLOCK: errno = EAGAIN; break; case WSAECONNRESET: /* EOF on the pipe! (win32 socket based implementation) */ ret = 0; /* fall through */ default: errno = werror; break; } } else errno = 0; return ret; } #define pipe(a) pgpipe (a) #define pipewrite(a,b,c) send (a, (char*)b,c,0) #else typedef int tr_pipe_end_t; #define piperead(a,b,c) read (a,b,c) #define pipewrite(a,b,c) write (a,b,c) #endif /*** **** ***/ typedef struct tr_event_handle { uint8_t die; tr_pipe_end_t fds[2]; tr_lock * lock; tr_session * session; tr_thread * thread; struct event_base * base; struct event * pipeEvent; } tr_event_handle; struct tr_run_data { void (*func)(void *); void * user_data; }; #define dbgmsg(...) \ do { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, "event", __VA_ARGS__); \ } while (0) static void readFromPipe (evutil_socket_t fd, short eventType, void * veh) { char ch; int ret; tr_event_handle * eh = veh; dbgmsg ("readFromPipe: eventType is %hd", eventType); /* read the command type */ ch = '\0'; do { ret = piperead (fd, &ch, 1); } while (!eh->die && ret < 0 && errno == EAGAIN); dbgmsg ("command is [%c], ret is %d, errno is %d", ch, ret, (int)errno); switch (ch) { case 'r': /* run in libevent thread */ { struct tr_run_data data; const size_t nwant = sizeof (data); const ev_ssize_t ngot = piperead (fd, &data, nwant); if (!eh->die && (ngot == (ev_ssize_t) nwant)) { dbgmsg ("invoking function in libevent thread"); (data.func)(data.user_data); } break; } case '\0': /* eof */ { dbgmsg ("pipe eof reached... removing event listener"); event_free (eh->pipeEvent); tr_netCloseSocket (eh->fds[0]); event_base_loopexit (eh->base, NULL); break; } default: { assert (0 && "unhandled command type!"); break; } } } static void logFunc (int severity, const char * message) { if (severity >= _EVENT_LOG_ERR) tr_logAddError ("%s", message); else tr_logAddDebug ("%s", message); } static void libeventThreadFunc (void * veh) { struct event_base * base; tr_event_handle * eh = veh; #ifndef _WIN32 /* Don't exit when writing on a broken socket */ signal (SIGPIPE, SIG_IGN); #endif /* create the libevent bases */ base = event_base_new (); /* set the struct's fields */ eh->base = base; eh->session->event_base = base; eh->session->evdns_base = evdns_base_new (base, true); eh->session->events = eh; /* listen to the pipe's read fd */ eh->pipeEvent = event_new (base, eh->fds[0], EV_READ | EV_PERSIST, readFromPipe, veh); event_add (eh->pipeEvent, NULL); event_set_log_callback (logFunc); /* loop until all the events are done */ while (!eh->die) event_base_dispatch (base); /* shut down the thread */ tr_lockFree (eh->lock); event_base_free (base); eh->session->events = NULL; tr_free (eh); tr_logAddDebug ("Closing libevent thread"); } void tr_eventInit (tr_session * session) { tr_event_handle * eh; session->events = NULL; eh = tr_new0 (tr_event_handle, 1); eh->lock = tr_lockNew (); if (pipe (eh->fds) == -1) tr_logAddError ("Unable to write to pipe() in libtransmission: %s", tr_strerror(errno)); eh->session = session; eh->thread = tr_threadNew (libeventThreadFunc, eh); /* wait until the libevent thread is running */ while (session->events == NULL) tr_wait_msec (100); } void tr_eventClose (tr_session * session) { assert (tr_isSession (session)); if (session->events == NULL) return; session->events->die = true; tr_logAddDeep (__FILE__, __LINE__, NULL, "closing trevent pipe"); tr_netCloseSocket (session->events->fds[1]); } /** *** **/ bool tr_amInEventThread (const tr_session * session) { assert (tr_isSession (session)); assert (session->events != NULL); return tr_amInThread (session->events->thread); } /** *** **/ void tr_runInEventThread (tr_session * session, void func (void*), void * user_data) { assert (tr_isSession (session)); assert (session->events != NULL); if (tr_amInThread (session->events->thread)) { (func)(user_data); } else { tr_pipe_end_t fd; char ch; ev_ssize_t res_1; ev_ssize_t res_2; tr_event_handle * e = session->events; struct tr_run_data data; tr_lockLock (e->lock); fd = e->fds[1]; ch = 'r'; res_1 = pipewrite (fd, &ch, 1); data.func = func; data.user_data = user_data; res_2 = pipewrite (fd, &data, sizeof (data)); tr_lockUnlock (e->lock); if ((res_1 == -1) || (res_2 == -1)) tr_logAddError ("Unable to write to libtransmisison event queue: %s", tr_strerror(errno)); } } transmission-2.92/libtransmission/PaxHeaders.4960/transmission.h0000644000000000000000000000013212641272401021777 xustar0030 mtime=1451586817.576878516 30 atime=1451586817.576878516 30 ctime=1457295919.817804806 transmission-2.92/libtransmission/transmission.h0000644000175000017500000021131412641272401023426 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) Transmission authors and contributors * * It may be used under the 3-Clause BSD License, the GNU Public License v2, * or v3, or any future license endorsed by Mnemosyne LLC. * * $Id: transmission.h 14645 2015-12-29 19:44:50Z mikedld $ */ /* * This file defines the public API for the libtransmission library. * The other public API headers are variant.h and utils.h; * most of the remaining headers in libtransmission are private. */ #ifndef TR_TRANSMISSION_H #define TR_TRANSMISSION_H 1 #ifdef __cplusplus extern "C" { #endif /*** **** **** Basic Types **** ***/ #include /* uintN_t */ #include /* time_t */ #if !defined (__cplusplus) #ifdef HAVE_STDBOOL_H #include #elif !defined (__bool_true_false_are_defined) #define bool uint8_t #define true 1 #define false 0 #endif #endif #define SHA_DIGEST_LENGTH 20 #define TR_INET6_ADDRSTRLEN 46 #define TR_BAD_SIZE ((size_t) -1) typedef uint32_t tr_file_index_t; typedef uint32_t tr_piece_index_t; /* assuming a 16 KiB block, a 32-bit block index gives us a maximum torrent size of 63 TiB. * if we ever need to grow past that, change this to uint64_t ;) */ typedef uint32_t tr_block_index_t; typedef uint16_t tr_port; typedef struct tr_ctor tr_ctor; typedef struct tr_info tr_info; typedef struct tr_torrent tr_torrent; typedef struct tr_session tr_session; struct tr_error; struct tr_variant; typedef int8_t tr_priority_t; #define TR_RPC_SESSION_ID_HEADER "X-Transmission-Session-Id" typedef enum { TR_PREALLOCATE_NONE = 0, TR_PREALLOCATE_SPARSE = 1, TR_PREALLOCATE_FULL = 2 } tr_preallocation_mode; typedef enum { TR_CLEAR_PREFERRED, TR_ENCRYPTION_PREFERRED, TR_ENCRYPTION_REQUIRED } tr_encryption_mode; /*** **** **** Startup & Shutdown **** ***/ /** * @addtogroup tr_session Session * * A libtransmission session is created by calling tr_sessionInit (). * libtransmission creates a thread for itself so that it can operate * independently of the caller's event loop. The session will continue * until tr_sessionClose () is called. * * @{ */ /** * @brief returns Transmission's default configuration file directory. * * The default configuration directory is determined this way: * -# If the TRANSMISSION_HOME environment variable is set, its value is used. * -# On Darwin, "${HOME}/Library/Application Support/${appname}" is used. * -# On Windows, "${CSIDL_APPDATA}/${appname}" is used. * -# If XDG_CONFIG_HOME is set, "${XDG_CONFIG_HOME}/${appname}" is used. * -# ${HOME}/.config/${appname}" is used as a last resort. */ const char* tr_getDefaultConfigDir (const char * appname); /** * @brief returns Transmisson's default download directory. * * The default download directory is determined this way: * -# If the HOME environment variable is set, "${HOME}/Downloads" is used. * -# On Windows, "${CSIDL_MYDOCUMENTS}/Downloads" is used. * -# Otherwise, getpwuid (getuid ())->pw_dir + "/Downloads" is used. */ const char* tr_getDefaultDownloadDir (void); #define TR_DEFAULT_BIND_ADDRESS_IPV4 "0.0.0.0" #define TR_DEFAULT_BIND_ADDRESS_IPV6 "::" #define TR_DEFAULT_RPC_WHITELIST "127.0.0.1" #define TR_DEFAULT_RPC_PORT_STR "9091" #define TR_DEFAULT_RPC_URL_STR "/transmission/" #define TR_DEFAULT_PEER_PORT_STR "51413" #define TR_DEFAULT_PEER_SOCKET_TOS_STR "default" #define TR_DEFAULT_PEER_LIMIT_GLOBAL_STR "200" #define TR_DEFAULT_PEER_LIMIT_TORRENT_STR "50" /** * Add libtransmission's default settings to the benc dictionary. * * Example: * @code * tr_variant settings; * int64_t i; * * tr_variantInitDict (&settings, 0); * tr_sessionGetDefaultSettings (&settings); * if (tr_variantDictFindInt (&settings, TR_PREFS_KEY_PEER_PORT, &i)) * fprintf (stderr, "the default peer port is %d\n", (int)i); * tr_variantFree (&settings); * @endcode * * @param initme pointer to a tr_variant dictionary * @see tr_sessionLoadSettings () * @see tr_sessionInit () * @see tr_getDefaultConfigDir () */ void tr_sessionGetDefaultSettings (struct tr_variant * dictionary); /** * Add the session's current configuration settings to the benc dictionary. * * FIXME: this probably belongs in libtransmissionapp * * @param session * @param dictionary * @see tr_sessionGetDefaultSettings () */ void tr_sessionGetSettings (tr_session *, struct tr_variant * dictionary); /** * Load settings from the configuration directory's settings.json file, * using libtransmission's default settings as fallbacks for missing keys. * * FIXME: this belongs in libtransmissionapp * * @param dictionary pointer to an uninitialized tr_variant * @param configDir the configuration directory to find settings.json * @param appName if configDir is empty, appName is used to find the default dir. * @return success true if the settings were loaded, false otherwise * @see tr_sessionGetDefaultSettings () * @see tr_sessionInit () * @see tr_sessionSaveSettings () */ bool tr_sessionLoadSettings (struct tr_variant * dictionary, const char * configDir, const char * appName); /** * Add the session's configuration settings to the benc dictionary * and save it to the configuration directory's settings.json file. * * FIXME: this belongs in libtransmissionapp * * @param session * @param dictionary * @see tr_sessionLoadSettings () */ void tr_sessionSaveSettings (tr_session * session, const char * configDir, const struct tr_variant * dictonary); /** * @brief Initialize a libtransmission session. * * For example, this will instantiate a session with all the default values: * @code * tr_variant settings; * tr_session * session; * const char * configDir; * * tr_variantInitDict (&settings, 0); * tr_sessionGetDefaultSettings (&settings); * configDir = tr_getDefaultConfigDir ("Transmission"); * session = tr_sessionInit (configDir, true, &settings); * * tr_variantFree (&settings); * @endcode * * @param configDir where Transmission will look for resume files, blocklists, etc. * @param messageQueueingEnabled if false, messages will be dumped to stderr * @param settings libtransmission settings * @see tr_sessionGetDefaultSettings () * @see tr_sessionLoadSettings () * @see tr_getDefaultConfigDir () */ tr_session * tr_sessionInit (const char * configDir, bool messageQueueingEnabled, struct tr_variant * settings); /** @brief Update a session's settings from a benc dictionary like to the one used in tr_sessionInit () */ void tr_sessionSet (tr_session * session, struct tr_variant * settings); /** @brief Rescan the blocklists directory and reload whatever blocklist files are found there */ void tr_sessionReloadBlocklists (tr_session * session); /** @brief End a libtransmission session @see tr_sessionInit () */ void tr_sessionClose (tr_session *); /** * @brief Return the session's configuration directory. * * This is where transmission stores its .torrent files, .resume files, * blocklists, etc. It's set in tr_transmissionInit () and is immutable * during the session. */ const char * tr_sessionGetConfigDir (const tr_session *); /** * @brief Set the per-session default download folder for new torrents. * @see tr_sessionInit () * @see tr_sessionGetDownloadDir () * @see tr_ctorSetDownloadDir () */ void tr_sessionSetDownloadDir (tr_session * session, const char * downloadDir); /** * @brief Get the default download folder for new torrents. * * This is set by tr_sessionInit () or tr_sessionSetDownloadDir (), * and can be overridden on a per-torrent basis by tr_ctorSetDownloadDir (). */ const char * tr_sessionGetDownloadDir (const tr_session * session); /** * @brief Get available disk space (in bytes) for the specified directory. * @return zero or positive integer on success, -1 in case of error. */ int64_t tr_sessionGetDirFreeSpace (tr_session * session, const char * dir); /** * @brief Set the torrent's bandwidth priority. */ void tr_ctorSetBandwidthPriority (tr_ctor * ctor, tr_priority_t priority); /** * @brief Get the torrent's bandwidth priority. */ tr_priority_t tr_ctorGetBandwidthPriority (const tr_ctor * ctor); /** * @brief set the per-session incomplete download folder. * * When you add a new torrent and the session's incomplete directory is enabled, * the new torrent will start downloading into that directory, and then be moved * to tr_torrent.downloadDir when the torrent is finished downloading. * * Torrents aren't moved as a result of changing the session's incomplete dir -- * it's applied to new torrents, not existing ones. * * tr_torrentSetLocation () overrules the incomplete dir: when a user specifies * a new location, that becomes the torrent's new downloadDir and the torrent * is moved there immediately regardless of whether or not it's complete. * * @see tr_sessionInit () * @see tr_sessionGetIncompleteDir () * @see tr_sessionSetIncompleteDirEnabled () * @see tr_sessionGetIncompleteDirEnabled () */ void tr_sessionSetIncompleteDir (tr_session * session, const char * dir); /** @brief get the per-session incomplete download folder */ const char* tr_sessionGetIncompleteDir (const tr_session * session); /** @brief enable or disable use of the incomplete download folder */ void tr_sessionSetIncompleteDirEnabled (tr_session * session, bool); /** @brief get whether or not the incomplete download folder is enabled */ bool tr_sessionIsIncompleteDirEnabled (const tr_session * session); /** * @brief When enabled, newly-created files will have ".part" appended * to their filename until the file is fully downloaded * * This is not retroactive -- toggling this will not rename existing files. * It only applies to new files created by Transmission after this API call. * * @see tr_sessionIsIncompleteFileNamingEnabled () */ void tr_sessionSetIncompleteFileNamingEnabled (tr_session * session, bool); /** @brief return true if files will end in ".part" until they're complete */ bool tr_sessionIsIncompleteFileNamingEnabled (const tr_session * session); /** * @brief Set whether or not RPC calls are allowed in this session. * * @details If true, libtransmission will open a server socket to listen * for incoming http RPC requests as described in docs/rpc-spec.txt. * * This is intially set by tr_sessionInit () and can be * queried by tr_sessionIsRPCEnabled (). */ void tr_sessionSetRPCEnabled (tr_session * session, bool isEnabled); /** @brief Get whether or not RPC calls are allowed in this session. @see tr_sessionInit () @see tr_sessionSetRPCEnabled () */ bool tr_sessionIsRPCEnabled (const tr_session * session); /** @brief Specify which port to listen for RPC requests on. @see tr_sessionInit () @see tr_sessionGetRPCPort */ void tr_sessionSetRPCPort (tr_session * session, tr_port port); /** @brief Get which port to listen for RPC requests on. @see tr_sessionInit () @see tr_sessionSetRPCPort */ tr_port tr_sessionGetRPCPort (const tr_session * session); /** * @brief Specify which base URL to use. * * @detail The RPC API is accessible under /rpc, the web interface under * /web. * * @see tr_sessionGetRPCUrl */ void tr_sessionSetRPCUrl (tr_session * session, const char * url); /** * @brief Get the base URL. * @see tr_sessionInit () * @see tr_sessionSetRPCUrl */ const char* tr_sessionGetRPCUrl (const tr_session * session); /** * @brief Specify a whitelist for remote RPC access * * The whitelist is a comma-separated list of dotted-quad IP addresses * to be allowed. Wildmat notation is supported, meaning that * '?' is interpreted as a single-character wildcard and * '*' is interprted as a multi-character wildcard. */ void tr_sessionSetRPCWhitelist (tr_session * session, const char * whitelist); /** @brief get the Access Control List for allowing/denying RPC requests. @return a comma-separated string of whitelist domains. @see tr_sessionInit @see tr_sessionSetRPCWhitelist */ const char* tr_sessionGetRPCWhitelist (const tr_session *); void tr_sessionSetRPCWhitelistEnabled (tr_session * session, bool isEnabled); bool tr_sessionGetRPCWhitelistEnabled (const tr_session * session); void tr_sessionSetRPCPassword (tr_session * session, const char * password); void tr_sessionSetRPCUsername (tr_session * session, const char * username); /** @brief get the password used to restrict RPC requests. @return the password string. @see tr_sessionInit () @see tr_sessionSetRPCPassword () */ const char* tr_sessionGetRPCPassword (const tr_session * session); const char* tr_sessionGetRPCUsername (const tr_session * session); void tr_sessionSetRPCPasswordEnabled (tr_session * session, bool isEnabled); bool tr_sessionIsRPCPasswordEnabled (const tr_session * session); const char* tr_sessionGetRPCBindAddress (const tr_session * session); typedef enum { TR_RPC_TORRENT_ADDED, TR_RPC_TORRENT_STARTED, TR_RPC_TORRENT_STOPPED, TR_RPC_TORRENT_REMOVING, TR_RPC_TORRENT_TRASHING, /* _REMOVING + delete local data */ TR_RPC_TORRENT_CHANGED, /* catch-all for the "torrent-set" rpc method */ TR_RPC_TORRENT_MOVED, TR_RPC_SESSION_CHANGED, TR_RPC_SESSION_QUEUE_POSITIONS_CHANGED, /* catch potentially multiple torrents being moved in the queue */ TR_RPC_SESSION_CLOSE } tr_rpc_callback_type; typedef enum { /* no special handling is needed by the caller */ TR_RPC_OK = 0, /* indicates to the caller that the client will take care of * removing the torrent itself. For example the client may * need to keep the torrent alive long enough to cleanly close * some resources in another thread. */ TR_RPC_NOREMOVE = (1 << 1) } tr_rpc_callback_status; typedef tr_rpc_callback_status (*tr_rpc_func)(tr_session * session, tr_rpc_callback_type type, struct tr_torrent * tor_or_null, void * user_data); /** * Register to be notified whenever something is changed via RPC, * such as a torrent being added, removed, started, stopped, etc. * * func is invoked FROM LIBTRANSMISSION'S THREAD! * This means func must be fast (to avoid blocking peers), * shouldn't call libtransmission functions (to avoid deadlock), * and shouldn't modify client-level memory without using a mutex! */ void tr_sessionSetRPCCallback (tr_session * session, tr_rpc_func func, void * user_data); /** *** **/ /** @brief Used by tr_sessionGetStats () and tr_sessionGetCumulativeStats () */ typedef struct tr_session_stats { float ratio; /* TR_RATIO_INF, TR_RATIO_NA, or total up/down */ uint64_t uploadedBytes; /* total up */ uint64_t downloadedBytes; /* total down */ uint64_t filesAdded; /* number of files added */ uint64_t sessionCount; /* program started N times */ uint64_t secondsActive; /* how long Transmisson's been running */ } tr_session_stats; /** @brief Get bandwidth use statistics for the current session */ void tr_sessionGetStats (const tr_session * session, tr_session_stats * setme); /** @brief Get cumulative bandwidth statistics for current and past sessions */ void tr_sessionGetCumulativeStats (const tr_session * session, tr_session_stats * setme); void tr_sessionClearStats (tr_session * session); /** * @brief Set whether or not torrents are allowed to do peer exchanges. * * PEX is always disabled in private torrents regardless of this. * In public torrents, PEX is enabled by default. */ void tr_sessionSetPexEnabled (tr_session * session, bool isEnabled); bool tr_sessionIsPexEnabled (const tr_session * session); bool tr_sessionIsDHTEnabled (const tr_session * session); void tr_sessionSetDHTEnabled (tr_session * session, bool); bool tr_sessionIsUTPEnabled (const tr_session * session); void tr_sessionSetUTPEnabled (tr_session * session, bool); bool tr_sessionIsLPDEnabled (const tr_session * session); void tr_sessionSetLPDEnabled (tr_session * session, bool enabled); void tr_sessionSetCacheLimit_MB (tr_session * session, int mb); int tr_sessionGetCacheLimit_MB (const tr_session * session); tr_encryption_mode tr_sessionGetEncryption (tr_session * session); void tr_sessionSetEncryption (tr_session * session, tr_encryption_mode mode); /*********************************************************************** ** Incoming Peer Connections Port */ void tr_sessionSetPortForwardingEnabled (tr_session * session, bool enabled); bool tr_sessionIsPortForwardingEnabled (const tr_session * session); void tr_sessionSetPeerPort (tr_session * session, tr_port port); tr_port tr_sessionGetPeerPort (const tr_session * session); tr_port tr_sessionSetPeerPortRandom (tr_session * session); void tr_sessionSetPeerPortRandomOnStart (tr_session * session, bool random); bool tr_sessionGetPeerPortRandomOnStart (tr_session * session); typedef enum { TR_PORT_ERROR, TR_PORT_UNMAPPED, TR_PORT_UNMAPPING, TR_PORT_MAPPING, TR_PORT_MAPPED } tr_port_forwarding; tr_port_forwarding tr_sessionGetPortForwarding (const tr_session * session); typedef enum { TR_CLIENT_TO_PEER = 0, TR_UP = 0, TR_PEER_TO_CLIENT = 1, TR_DOWN = 1 } tr_direction; /*** **** ***/ /*** **** Primary session speed limits ***/ void tr_sessionSetSpeedLimit_KBps (tr_session *, tr_direction, unsigned int KBps); unsigned int tr_sessionGetSpeedLimit_KBps (const tr_session *, tr_direction); void tr_sessionLimitSpeed (tr_session *, tr_direction, bool); bool tr_sessionIsSpeedLimited (const tr_session *, tr_direction); /*** **** Alternative speed limits that are used during scheduled times ***/ void tr_sessionSetAltSpeed_KBps (tr_session *, tr_direction, unsigned int Bps); unsigned int tr_sessionGetAltSpeed_KBps (const tr_session *, tr_direction); void tr_sessionUseAltSpeed (tr_session *, bool); bool tr_sessionUsesAltSpeed (const tr_session *); void tr_sessionUseAltSpeedTime (tr_session *, bool); bool tr_sessionUsesAltSpeedTime (const tr_session *); void tr_sessionSetAltSpeedBegin (tr_session *, int minsSinceMidnight); int tr_sessionGetAltSpeedBegin (const tr_session *); void tr_sessionSetAltSpeedEnd (tr_session *, int minsSinceMidnight); int tr_sessionGetAltSpeedEnd (const tr_session *); typedef enum { TR_SCHED_SUN = (1<<0), TR_SCHED_MON = (1<<1), TR_SCHED_TUES = (1<<2), TR_SCHED_WED = (1<<3), TR_SCHED_THURS = (1<<4), TR_SCHED_FRI = (1<<5), TR_SCHED_SAT = (1<<6), TR_SCHED_WEEKDAY = (TR_SCHED_MON|TR_SCHED_TUES|TR_SCHED_WED| TR_SCHED_THURS|TR_SCHED_FRI), TR_SCHED_WEEKEND = (TR_SCHED_SUN|TR_SCHED_SAT), TR_SCHED_ALL = (TR_SCHED_WEEKDAY|TR_SCHED_WEEKEND) } tr_sched_day; void tr_sessionSetAltSpeedDay (tr_session *, tr_sched_day day); tr_sched_day tr_sessionGetAltSpeedDay (const tr_session *); typedef void (*tr_altSpeedFunc)(tr_session *, bool active, bool userDriven, void *); void tr_sessionClearAltSpeedFunc (tr_session *); void tr_sessionSetAltSpeedFunc (tr_session *, tr_altSpeedFunc, void *); bool tr_sessionGetActiveSpeedLimit_KBps (const tr_session * session, tr_direction dir, double * setme); /*** **** ***/ double tr_sessionGetRawSpeed_KBps (const tr_session *, tr_direction); void tr_sessionSetRatioLimited (tr_session *, bool isLimited); bool tr_sessionIsRatioLimited (const tr_session *); void tr_sessionSetRatioLimit (tr_session *, double desiredRatio); double tr_sessionGetRatioLimit (const tr_session *); void tr_sessionSetIdleLimited (tr_session *, bool isLimited); bool tr_sessionIsIdleLimited (const tr_session *); void tr_sessionSetIdleLimit (tr_session *, uint16_t idleMinutes); uint16_t tr_sessionGetIdleLimit (const tr_session *); void tr_sessionSetPeerLimit (tr_session *, uint16_t maxGlobalPeers); uint16_t tr_sessionGetPeerLimit (const tr_session *); void tr_sessionSetPeerLimitPerTorrent (tr_session *, uint16_t maxPeers); uint16_t tr_sessionGetPeerLimitPerTorrent (const tr_session *); void tr_sessionSetPaused (tr_session *, bool isPaused); bool tr_sessionGetPaused (const tr_session *); void tr_sessionSetDeleteSource (tr_session *, bool deleteSource); bool tr_sessionGetDeleteSource (const tr_session *); tr_priority_t tr_torrentGetPriority (const tr_torrent *); void tr_torrentSetPriority (tr_torrent *, tr_priority_t); /*** **** **** Torrent Queueing **** **** There are independent queues for seeding (TR_UP) and leeching (TR_DOWN). **** **** If the session already has enough non-stalled seeds/leeches when **** tr_torrentStart () is called, the torrent will be moved into the **** appropriate queue and its state will be TR_STATUS_{DOWNLOAD,SEED}_WAIT. **** **** To bypass the queue and unconditionally start the torrent use **** tr_torrentStartNow (). **** **** Torrents can be moved in the queue using the simple functions **** tr_torrentQueueMove{Top,Up,Down,Bottom}. They can be moved to **** arbitrary points in the queue with tr_torrentSetQueuePosition (). **** ***/ /** @brief Like tr_torrentStart (), but resumes right away regardless of the queues. */ void tr_torrentStartNow (tr_torrent *); /** @brief Return the queued torrent's position in the queue it's in. [0...n) */ int tr_torrentGetQueuePosition (const tr_torrent *); /** @brief Set the queued torrent's position in the queue it's in. * Special cases: pos <= 0 moves to the front; pos >= queue length moves to the back */ void tr_torrentSetQueuePosition (tr_torrent *, int queuePosition); /** **/ /** @brief Convenience function for moving a batch of torrents to the front of their queue (s) */ void tr_torrentsQueueMoveTop (tr_torrent ** torrents, int torrentCount); /** @brief Convenience function for moving a batch of torrents ahead one step in their queue (s) */ void tr_torrentsQueueMoveUp (tr_torrent ** torrents, int torrentCount); /** @brief Convenience function for moving a batch of torrents back one step in their queue (s) */ void tr_torrentsQueueMoveDown (tr_torrent ** torrents, int torrentCount); /** @brief Convenience function for moving a batch of torrents to the back of their queue (s) */ void tr_torrentsQueueMoveBottom (tr_torrent ** torrents, int torrentCount); /** **/ /** @brief Set the number of torrents allowed to download (if direction is TR_DOWN) or seed (if direction is TR_UP) at the same time */ void tr_sessionSetQueueSize (tr_session *, tr_direction, int max_simultaneous_seed_torrents); /** @brief Return the number of torrents allowed to download (if direction is TR_DOWN) or seed (if direction is TR_UP) at the same time */ int tr_sessionGetQueueSize (const tr_session *, tr_direction); /** @brief Set whether or not to limit how many torrents can download (TR_DOWN) or seed (TR_UP) at the same time */ void tr_sessionSetQueueEnabled (tr_session *, tr_direction, bool do_limit_simultaneous_seed_torrents); /** @brief Return true if we're limiting how many torrents can concurrently download (TR_DOWN) or seed (TR_UP) at the same time */ bool tr_sessionGetQueueEnabled (const tr_session *, tr_direction); /** **/ /** @brief Consider torrent as 'stalled' when it's been inactive for N minutes. Stalled torrents are left running but are not counted by tr_sessionGetQueueSize (). */ void tr_sessionSetQueueStalledMinutes (tr_session *, int minutes); /** @return the number of minutes a torrent can be idle before being considered as stalled */ int tr_sessionGetQueueStalledMinutes (const tr_session *); /** @brief Set whether or not to count torrents idle for over N minutes as 'stalled' */ void tr_sessionSetQueueStalledEnabled (tr_session *, bool); /** @return true if we're torrents idle for over N minutes will be flagged as 'stalled' */ bool tr_sessionGetQueueStalledEnabled (const tr_session *); /** **/ /** @brief Set a callback that is invoked when the queue starts a torrent */ void tr_torrentSetQueueStartCallback (tr_torrent * torrent, void (*callback)(tr_torrent *, void *), void * user_data); /*** **** **** ***/ /** * Load all the torrents in tr_getTorrentDir (). * This can be used at startup to kickstart all the torrents * from the previous session. */ tr_torrent ** tr_sessionLoadTorrents (tr_session * session, tr_ctor * ctor, int * setmeCount); /** *** **/ bool tr_sessionIsTorrentDoneScriptEnabled (const tr_session *); void tr_sessionSetTorrentDoneScriptEnabled (tr_session *, bool isEnabled); const char * tr_sessionGetTorrentDoneScript (const tr_session *); void tr_sessionSetTorrentDoneScript (tr_session *, const char * scriptFilename); /** @} */ /** *** **/ /*********************************************************************** ** Message Logging */ typedef enum { TR_LOG_ERROR = 1, TR_LOG_INFO = 2, TR_LOG_DEBUG = 3, TR_LOG_FIREHOSE = 4 } tr_log_level; void tr_logSetLevel (tr_log_level); typedef struct tr_log_message { /* TR_LOG_ERROR, TR_LOG_INFO, or TR_LOG_DEBUG */ tr_log_level level; /* The line number in the source file where this message originated */ int line; /* Time the message was generated */ time_t when; /* The torrent associated with this message, * or a module name such as "Port Forwarding" for non-torrent messages, * or NULL. */ char * name; /* The message */ char * message; /* The source file where this message originated */ const char * file; /* linked list of messages */ struct tr_log_message * next; } tr_log_message; tr_log_message * tr_logGetQueue (void); bool tr_logGetQueueEnabled (void); void tr_logSetQueueEnabled (bool isEnabled); void tr_logFreeQueue (tr_log_message * freeme); /** @addtogroup Blocklists @{ */ /** * Specify a range of IPs for Transmission to block. * * Filename must be an uncompressed ascii file. * * libtransmission does not keep a handle to `filename' * after this call returns, so the caller is free to * keep or delete `filename' as it wishes. * libtransmission makes its own copy of the file * massaged into a binary format easier to search. * * The caller only needs to invoke this when the blocklist * has changed. * * Passing NULL for a filename will clear the blocklist. */ int tr_blocklistSetContent (tr_session * session, const char * filename); int tr_blocklistGetRuleCount (const tr_session * session); bool tr_blocklistExists (const tr_session * session); bool tr_blocklistIsEnabled (const tr_session * session); void tr_blocklistSetEnabled (tr_session * session, bool isEnabled); /** @brief The blocklist that ges updated when an RPC client invokes the "blocklist-update" method */ void tr_blocklistSetURL (tr_session *, const char * url); const char * tr_blocklistGetURL (const tr_session *); /** @brief the file in the $config/blocklists/ directory that's used by tr_blocklistSetContent () and "blocklist-update" */ #define DEFAULT_BLOCKLIST_FILENAME "blocklist.bin" /** @} */ /** @addtogroup tr_ctor Torrent Constructors @{ Instantiating a tr_torrent had gotten more complicated as features were added. At one point there were four functions to check metainfo and five to create a tr_torrent object. To remedy this, a Torrent Constructor (struct tr_ctor) has been introduced: - Simplifies the API to two functions: tr_torrentParse () and tr_torrentNew () - You can set the fields you want; the system sets defaults for the rest. - You can specify whether or not your fields should supercede resume's. - We can add new features to tr_ctor without breaking tr_torrentNew ()'s API. All the tr_ctor{Get,Set}* () functions with a return value return an error number, or zero if no error occurred. You must call one of the SetMetainfo () functions before creating a torrent with a tr_ctor. The other functions are optional. You can reuse a single tr_ctor to create a batch of torrents -- just call one of the SetMetainfo () functions between each tr_torrentNew () call. Every call to tr_ctorSetMetainfo* () frees the previous metainfo. */ typedef enum { TR_FALLBACK, /* indicates the ctor value should be used only in case of missing resume settings */ TR_FORCE /* indicates the ctor value should be used regardless of what's in the resume settings */ } tr_ctorMode; /** @brief Create a torrent constructor object used to instantiate a tr_torrent @param session the tr_session. This is required if you're going to call tr_torrentNew (), but you can use NULL for tr_torrentParse (). @see tr_torrentNew (), tr_torrentParse () */ tr_ctor* tr_ctorNew (const tr_session * session_or_NULL); /** @brief Free a torrent constructor object */ void tr_ctorFree (tr_ctor * ctor); /** @brief Set whether or not to delete the source .torrent file when the torrent is added. (Default: False) */ void tr_ctorSetDeleteSource (tr_ctor * ctor, bool doDelete); /** @brief Set the constructor's metainfo from a magnet link */ int tr_ctorSetMetainfoFromMagnetLink (tr_ctor * ctor, const char * magnet); /** @brief Set the constructor's metainfo from a raw benc already in memory */ int tr_ctorSetMetainfo (tr_ctor * ctor, const uint8_t * metainfo, size_t len); /** @brief Set the constructor's metainfo from a local .torrent file */ int tr_ctorSetMetainfoFromFile (tr_ctor * ctor, const char * filename); /** * @brief Set the metainfo from an existing file in tr_getTorrentDir (). * * This is used by the Mac client on startup to pick and choose which * torrents to load */ int tr_ctorSetMetainfoFromHash (tr_ctor * ctor, const char * hashString); /** @brief Set how many peers this torrent can connect to. (Default: 50) */ void tr_ctorSetPeerLimit (tr_ctor * ctor, tr_ctorMode mode, uint16_t limit); /** @brief Set the download folder for the torrent being added with this ctor. @see tr_ctorSetDownloadDir () @see tr_sessionInit () */ void tr_ctorSetDownloadDir (tr_ctor * ctor, tr_ctorMode mode, const char * directory); /** * @brief Set the incompleteDir for this torrent. * * This is not a supported API call. * It only exists so the mac client can migrate * its older incompleteDir settings, and that's * the only place where it should be used. */ void tr_ctorSetIncompleteDir (tr_ctor * ctor, const char * directory); /** Set whether or not the torrent begins downloading/seeding when created. (Default: not paused) */ void tr_ctorSetPaused (tr_ctor * ctor, tr_ctorMode mode, bool isPaused); /** @brief Set the priorities for files in a torrent */ void tr_ctorSetFilePriorities (tr_ctor * ctor, const tr_file_index_t * files, tr_file_index_t fileCount, tr_priority_t priority); /** @brief Set the download flag for files in a torrent */ void tr_ctorSetFilesWanted (tr_ctor * ctor, const tr_file_index_t * fileIndices, tr_file_index_t fileCount, bool wanted); /** @brief Get this peer constructor's peer limit */ bool tr_ctorGetPeerLimit (const tr_ctor * ctor, tr_ctorMode mode, uint16_t * setmeCount); /** @brief Get the "isPaused" flag from this peer constructor */ bool tr_ctorGetPaused (const tr_ctor * ctor, tr_ctorMode mode, bool * setmeIsPaused); /** @brief Get the download path from this peer constructor */ bool tr_ctorGetDownloadDir (const tr_ctor * ctor, tr_ctorMode mode, const char ** setmeDownloadDir); /** @brief Get the incomplete directory from this peer constructor */ bool tr_ctorGetIncompleteDir (const tr_ctor * ctor, const char ** setmeIncompleteDir); /** @brief Get the metainfo from this peer constructor */ bool tr_ctorGetMetainfo (const tr_ctor * ctor, const struct tr_variant ** setme); /** @brief Get the "delete .torrent file" flag from this peer constructor */ bool tr_ctorGetDeleteSource (const tr_ctor * ctor, bool * setmeDoDelete); /** @brief Get the tr_session poiner from this peer constructor */ tr_session* tr_ctorGetSession (const tr_ctor * ctor); /** @brief Get the .torrent file that this ctor's metainfo came from, or NULL if tr_ctorSetMetainfoFromFile () wasn't used */ const char* tr_ctorGetSourceFile (const tr_ctor * ctor); typedef enum { TR_PARSE_OK, TR_PARSE_ERR, TR_PARSE_DUPLICATE } tr_parse_result; /** * @brief Parses the specified metainfo * * @return TR_PARSE_ERR if parsing failed; * TR_PARSE_OK if parsing succeeded and it's not a duplicate; * TR_PARSE_DUPLICATE if parsing succeeded but it's a duplicate. * * @param setme_info If parsing is successful and setme_info is non-NULL, * the parsed metainfo is stored there and sould be freed * by calling tr_metainfoFree () when no longer needed. * * Notes: * * 1. tr_torrentParse () won't be able to check for duplicates -- and therefore * won't return TR_PARSE_DUPLICATE -- unless ctor's "download-dir" and * session variable is set. * * 2. setme_info->torrent's value can't be set unless ctor's session variable * is set. */ tr_parse_result tr_torrentParse (const tr_ctor * ctor, tr_info * setme_info_or_NULL); /** @brief free a metainfo @see tr_torrentParse */ void tr_metainfoFree (tr_info * inf); /** * Instantiate a single torrent. * * Returns a pointer to the torrent on success, or NULL on failure. * * @param setme_error: TR_PARSE_ERR if the parsing failed; * TR_PARSE_OK if parsing succeeded and it's not a duplicate; * TR_PARSE_DUPLICATE if parsing succeeded but it's a duplicate. * * @param setme_duplicate_id: when setmeError is TR_PARSE_DUPLICATE, * this field is set to the duplicate torrent's id. */ tr_torrent * tr_torrentNew (const tr_ctor * ctor, int * setme_error, int * setme_duplicate_id); /** @} */ /*********************************************************************** *** *** TORRENTS **/ /** @addtogroup tr_torrent Torrents @{ */ typedef bool (*tr_fileFunc) (const char * filename, struct tr_error ** error); /** @brief Removes our .torrent and .resume files for this torrent */ void tr_torrentRemove (tr_torrent * torrent, bool removeLocalData, tr_fileFunc removeFunc); /** @brief Start a torrent */ void tr_torrentStart (tr_torrent * torrent); /** @brief Stop (pause) a torrent */ void tr_torrentStop (tr_torrent * torrent); typedef void (*tr_torrent_rename_done_func)(tr_torrent * torrent, const char * oldpath, const char * newname, int error, void * user_data); /** * @brief Rename a file or directory in a torrent. * * @tor: the torrent whose path will be renamed. * @oldpath: the path to the file or folder that will be renamed * @newname: the file or folder's new name * @callback: the callback invoked when the renaming finishes, or NULL * @callback_data: the pointer to pass in the callback's user_data arg * * As a special case, renaming the root file in a torrent will also * update tr_info.name. * * EXAMPLES * * Consider a tr_torrent where its * info.files[0].name is "frobnitz-linux/checksum" and * info.files[1].name is "frobnitz-linux/frobnitz.iso". * * 1. tr_torrentRenamePath (tor, "frobnitz-linux", "foo") will rename * the "frotbnitz-linux" folder as "foo", and update both info.name * and info.files[*].name. * * 2. tr_torrentRenamePath (tor, "frobnitz-linux/checksum", "foo") will * rename the "frobnitz-linux/checksum" file as "foo" and update * files[0].name to "frobnitz-linux/foo". * * RETURN * * Changing tr_info's contents requires a session lock, so this function * returns asynchronously to avoid blocking. If you don't want to be notified * when the function has finished, you can pass NULL as the callback arg. * * On success, the callback's error argument will be 0. * * If oldpath can't be found in files[*].name, or if newname is already * in files[*].name, or contains a directory separator, or is NULL, "", * ".", or "..", the error argument will be EINVAL. * * If the path exists on disk but can't be renamed, the error argument * will be the errno set by rename(). */ void tr_torrentRenamePath (tr_torrent * tor, const char * oldpath, const char * newname, tr_torrent_rename_done_func callback, void * callback_user_data); enum { TR_LOC_MOVING, TR_LOC_DONE, TR_LOC_ERROR }; /** * @brief Tell transmsision where to find this torrent's local data. * * if move_from_previous_location is `true', the torrent's incompleteDir * will be clobberred s.t. additional files being added will be saved * to the torrent's downloadDir. */ void tr_torrentSetLocation (tr_torrent * torrent, const char * location, bool move_from_previous_location, volatile double * setme_progress, volatile int * setme_state); uint64_t tr_torrentGetBytesLeftToAllocate (const tr_torrent * torrent); /** * @brief Returns this torrent's unique ID. * * IDs are good as simple lookup keys, but are not persistent * between sessions. If you need that, use tr_info.hash or * tr_info.hashString. */ int tr_torrentId (const tr_torrent * torrent); tr_torrent* tr_torrentFindFromId (tr_session * session, int id); tr_torrent* tr_torrentFindFromHash (tr_session * session, const uint8_t * hash); /** @brief Convenience function similar to tr_torrentFindFromHash () */ tr_torrent* tr_torrentFindFromMagnetLink (tr_session * session, const char * link); /** * @return this torrent's name. */ const char* tr_torrentName (const tr_torrent *); /** * @brief find the location of a torrent's file by looking with and without * the ".part" suffix, looking in downloadDir and incompleteDir, etc. * @return a newly-allocated string (that must be tr_freed () by the caller * when done) that gives the location of this file on disk, * or NULL if no file exists yet. * @param tor the torrent whose file we're looking for * @param fileNum the fileIndex, in [0...tr_info.fileCount) */ char* tr_torrentFindFile (const tr_torrent * tor, tr_file_index_t fileNo); /*** **** Torrent speed limits **** ***/ void tr_torrentSetSpeedLimit_KBps (tr_torrent *, tr_direction, unsigned int KBps); unsigned int tr_torrentGetSpeedLimit_KBps (const tr_torrent *, tr_direction); void tr_torrentUseSpeedLimit (tr_torrent *, tr_direction, bool); bool tr_torrentUsesSpeedLimit (const tr_torrent *, tr_direction); void tr_torrentUseSessionLimits (tr_torrent *, bool); bool tr_torrentUsesSessionLimits (const tr_torrent *); /**** ***** Ratio Limits ****/ typedef enum { /* follow the global settings */ TR_RATIOLIMIT_GLOBAL = 0, /* override the global settings, seeding until a certain ratio */ TR_RATIOLIMIT_SINGLE = 1, /* override the global settings, seeding regardless of ratio */ TR_RATIOLIMIT_UNLIMITED = 2 } tr_ratiolimit; void tr_torrentSetRatioMode (tr_torrent * tor, tr_ratiolimit mode); tr_ratiolimit tr_torrentGetRatioMode (const tr_torrent * tor); void tr_torrentSetRatioLimit (tr_torrent * tor, double ratio); double tr_torrentGetRatioLimit (const tr_torrent * tor); bool tr_torrentGetSeedRatio (const tr_torrent *, double * ratio); /**** ***** Idle Time Limits ****/ typedef enum { /* follow the global settings */ TR_IDLELIMIT_GLOBAL = 0, /* override the global settings, seeding until a certain idle time */ TR_IDLELIMIT_SINGLE = 1, /* override the global settings, seeding regardless of activity */ TR_IDLELIMIT_UNLIMITED = 2 } tr_idlelimit; void tr_torrentSetIdleMode (tr_torrent * tor, tr_idlelimit mode); tr_idlelimit tr_torrentGetIdleMode (const tr_torrent * tor); void tr_torrentSetIdleLimit (tr_torrent * tor, uint16_t idleMinutes); uint16_t tr_torrentGetIdleLimit (const tr_torrent * tor); bool tr_torrentGetSeedIdle (const tr_torrent *, uint16_t * minutes); /**** ***** Peer Limits ****/ void tr_torrentSetPeerLimit (tr_torrent * tor, uint16_t peerLimit); uint16_t tr_torrentGetPeerLimit (const tr_torrent * tor); /**** ***** File Priorities ****/ enum { TR_PRI_LOW = -1, TR_PRI_NORMAL = 0, /* since NORMAL is 0, memset initializes nicely */ TR_PRI_HIGH = 1 }; /** * @brief Set a batch of files to a particular priority. * * @param priority must be one of TR_PRI_NORMAL, _HIGH, or _LOW */ void tr_torrentSetFilePriorities (tr_torrent * torrent, const tr_file_index_t * files, tr_file_index_t fileCount, tr_priority_t priority); /** * @brief Get this torrent's file priorities. * * @return A malloc ()ed array of tor->info.fileCount items, * each holding a TR_PRI_NORMAL, TR_PRI_HIGH, or TR_PRI_LOW. * It's the caller's responsibility to free () this. */ tr_priority_t* tr_torrentGetFilePriorities (const tr_torrent * torrent); /** @brief Set a batch of files to be downloaded or not. */ void tr_torrentSetFileDLs (tr_torrent * torrent, const tr_file_index_t * files, tr_file_index_t fileCount, bool do_download); const tr_info * tr_torrentInfo (const tr_torrent * torrent); /* Raw function to change the torrent's downloadDir field. This should only be used by libtransmission or to bootstrap a newly-instantiated tr_torrent object. */ void tr_torrentSetDownloadDir (tr_torrent * torrent, const char * path); const char * tr_torrentGetDownloadDir (const tr_torrent * torrent); /** * Returns the root directory of where the torrent is. * * This will usually be the downloadDir. However if the torrent * has an incompleteDir enabled and hasn't finished downloading * yet, that will be returned instead. */ const char * tr_torrentGetCurrentDir (const tr_torrent * tor); char* tr_torrentInfoGetMagnetLink (const tr_info * inf); /** * Returns a newly-allocated string with a magnet link of the torrent. * Use tr_free () to free the string when done. */ static inline char* tr_torrentGetMagnetLink (const tr_torrent * tor) { return tr_torrentInfoGetMagnetLink (tr_torrentInfo (tor)); } /** *** **/ /** @brief a part of tr_info that represents a single tracker */ typedef struct tr_tracker_info { int tier; char * announce; char * scrape; uint32_t id; /* unique identifier used to match to a tr_tracker_stat */ } tr_tracker_info; /** * @brief Modify a torrent's tracker list. * * This updates both the `torrent' object's tracker list * and the metainfo file in tr_sessionGetConfigDir ()'s torrent subdirectory. * * @param torrent The torrent whose tracker list is to be modified * @param trackers An array of trackers, sorted by tier from first to last. * NOTE: only the `tier' and `announce' fields are used. * libtransmission derives `scrape' from `announce' * and reassigns 'id'. * @param trackerCount size of the `trackers' array */ bool tr_torrentSetAnnounceList (tr_torrent * torrent, const tr_tracker_info * trackers, int trackerCount); /** *** **/ typedef enum { TR_LEECH, /* doesn't have all the desired pieces */ TR_SEED, /* has the entire torrent */ TR_PARTIAL_SEED /* has the desired pieces, but not the entire torrent */ } tr_completeness; /** * @param wasRunning whether or not the torrent was running when * it changed its completeness state */ typedef void (*tr_torrent_completeness_func)(tr_torrent * torrent, tr_completeness completeness, bool wasRunning, void * user_data); typedef void (*tr_torrent_ratio_limit_hit_func)(tr_torrent * torrent, void * user_data); typedef void (*tr_torrent_idle_limit_hit_func)(tr_torrent * torrent, void * user_data); /** * Register to be notified whenever a torrent's "completeness" * changes. This will be called, for example, when a torrent * finishes downloading and changes from TR_LEECH to * either TR_SEED or TR_PARTIAL_SEED. * * func is invoked FROM LIBTRANSMISSION'S THREAD! * This means func must be fast (to avoid blocking peers), * shouldn't call libtransmission functions (to avoid deadlock), * and shouldn't modify client-level memory without using a mutex! * * @see tr_completeness */ void tr_torrentSetCompletenessCallback ( tr_torrent * torrent, tr_torrent_completeness_func func, void * user_data); void tr_torrentClearCompletenessCallback (tr_torrent * torrent); typedef void (*tr_torrent_metadata_func)(tr_torrent * torrent, void * user_data); /** * Register to be notified whenever a torrent changes from * having incomplete metadata to having complete metadata. * This happens when a magnet link finishes downloading * metadata from its peers. */ void tr_torrentSetMetadataCallback ( tr_torrent * tor, tr_torrent_metadata_func func, void * user_data); /** * Register to be notified whenever a torrent's ratio limit * has been hit. This will be called when the torrent's * ul/dl ratio has met or exceeded the designated ratio limit. * * Has the same restrictions as tr_torrentSetCompletenessCallback */ void tr_torrentSetRatioLimitHitCallback ( tr_torrent * torrent, tr_torrent_ratio_limit_hit_func func, void * user_data); void tr_torrentClearRatioLimitHitCallback (tr_torrent * torrent); /** * Register to be notified whenever a torrent's idle limit * has been hit. This will be called when the seeding torrent's * idle time has met or exceeded the designated idle limit. * * Has the same restrictions as tr_torrentSetCompletenessCallback */ void tr_torrentSetIdleLimitHitCallback ( tr_torrent * torrent, tr_torrent_idle_limit_hit_func func, void * user_data); void tr_torrentClearIdleLimitHitCallback (tr_torrent * torrent); /** * MANUAL ANNOUNCE * * Trackers usually set an announce interval of 15 or 30 minutes. * Users can send one-time announce requests that override this * interval by calling tr_torrentManualUpdate (). * * The wait interval for tr_torrentManualUpdate () is much smaller. * You can test whether or not a manual update is possible * (for example, to desensitize the button) by calling * tr_torrentCanManualUpdate (). */ void tr_torrentManualUpdate (tr_torrent * torrent); bool tr_torrentCanManualUpdate (const tr_torrent * torrent); /*** **** tr_peer_stat ***/ typedef struct tr_peer_stat { bool isUTP; bool isEncrypted; bool isDownloadingFrom; bool isUploadingTo; bool isSeed; bool peerIsChoked; bool peerIsInterested; bool clientIsChoked; bool clientIsInterested; bool isIncoming; uint8_t from; tr_port port; char addr[TR_INET6_ADDRSTRLEN]; char client[80]; char flagStr[32]; float progress; double rateToPeer_KBps; double rateToClient_KBps; /*** **** THESE NEXT FOUR FIELDS ARE EXPERIMENTAL. **** Don't rely on them; they'll probably go away ***/ /* how many blocks we've sent to this peer in the last 120 seconds */ uint32_t blocksToPeer; /* how many blocks this client's sent to us in the last 120 seconds */ uint32_t blocksToClient; /* how many requests to this peer that we've cancelled in the last 120 seconds */ uint32_t cancelsToPeer; /* how many requests this peer made of us, then cancelled, in the last 120 seconds */ uint32_t cancelsToClient; /* how many requests the peer has made that we haven't responded to yet */ int pendingReqsToClient; /* how many requests we've made and are currently awaiting a response for */ int pendingReqsToPeer; } tr_peer_stat; tr_peer_stat * tr_torrentPeers (const tr_torrent * torrent, int * peerCount); void tr_torrentPeersFree (tr_peer_stat * peerStats, int peerCount); /*** **** tr_tracker_stat ***/ typedef enum { /* we won't (announce,scrape) this torrent to this tracker because * the torrent is stopped, or because of an error, or whatever */ TR_TRACKER_INACTIVE = 0, /* we will (announce,scrape) this torrent to this tracker, and are * waiting for enough time to pass to satisfy the tracker's interval */ TR_TRACKER_WAITING = 1, /* it's time to (announce,scrape) this torrent, and we're waiting on a * a free slot to open up in the announce manager */ TR_TRACKER_QUEUED = 2, /* we're (announcing,scraping) this torrent right now */ TR_TRACKER_ACTIVE = 3 } tr_tracker_state; typedef struct { /* how many downloads this tracker knows of (-1 means it does not know) */ int downloadCount; /* whether or not we've ever sent this tracker an announcement */ bool hasAnnounced; /* whether or not we've ever scraped to this tracker */ bool hasScraped; /* human-readable string identifying the tracker */ char host[1024]; /* the full announce URL */ char announce[1024]; /* the full scrape URL */ char scrape[1024]; /* Transmission uses one tracker per tier, * and the others are kept as backups */ bool isBackup; /* is the tracker announcing, waiting, queued, etc */ tr_tracker_state announceState; /* is the tracker scraping, waiting, queued, etc */ tr_tracker_state scrapeState; /* number of peers the tracker told us about last time. * if "lastAnnounceSucceeded" is false, this field is undefined */ int lastAnnouncePeerCount; /* human-readable string with the result of the last announce. if "hasAnnounced" is false, this field is undefined */ char lastAnnounceResult[128]; /* when the last announce was sent to the tracker. * if "hasAnnounced" is false, this field is undefined */ time_t lastAnnounceStartTime; /* whether or not the last announce was a success. if "hasAnnounced" is false, this field is undefined */ bool lastAnnounceSucceeded; /* whether or not the last announce timed out. */ bool lastAnnounceTimedOut; /* when the last announce was completed. if "hasAnnounced" is false, this field is undefined */ time_t lastAnnounceTime; /* human-readable string with the result of the last scrape. * if "hasScraped" is false, this field is undefined */ char lastScrapeResult[128]; /* when the last scrape was sent to the tracker. * if "hasScraped" is false, this field is undefined */ time_t lastScrapeStartTime; /* whether or not the last scrape was a success. if "hasAnnounced" is false, this field is undefined */ bool lastScrapeSucceeded; /* whether or not the last scrape timed out. */ bool lastScrapeTimedOut; /* when the last scrape was completed. if "hasScraped" is false, this field is undefined */ time_t lastScrapeTime; /* number of leechers this tracker knows of (-1 means it does not know) */ int leecherCount; /* when the next periodic announce message will be sent out. if announceState isn't TR_TRACKER_WAITING, this field is undefined */ time_t nextAnnounceTime; /* when the next periodic scrape message will be sent out. if scrapeState isn't TR_TRACKER_WAITING, this field is undefined */ time_t nextScrapeTime; /* number of seeders this tracker knows of (-1 means it does not know) */ int seederCount; /* which tier this tracker is in */ int tier; /* used to match to a tr_tracker_info */ uint32_t id; } tr_tracker_stat; tr_tracker_stat * tr_torrentTrackers (const tr_torrent * torrent, int * setmeTrackerCount); void tr_torrentTrackersFree (tr_tracker_stat * trackerStats, int trackerCount); /** * @brief get the download speeds for each of this torrent's webseed sources. * * @return an array of tor->info.webseedCount floats giving download speeds. * Each speed in the array corresponds to the webseed at the same * array index in tor->info.webseeds. * To differentiate "idle" and "stalled" status, idle webseeds will * return -1 instead of 0 KiB/s. * NOTE: always free this array with tr_free () when you're done with it. */ double* tr_torrentWebSpeeds_KBps (const tr_torrent * torrent); typedef struct tr_file_stat { uint64_t bytesCompleted; float progress; } tr_file_stat; tr_file_stat * tr_torrentFiles (const tr_torrent * torrent, tr_file_index_t * fileCount); void tr_torrentFilesFree (tr_file_stat * files, tr_file_index_t fileCount); /*********************************************************************** * tr_torrentAvailability *********************************************************************** * Use this to draw an advanced progress bar which is 'size' pixels * wide. Fills 'tab' which you must have allocated: each byte is set * to either -1 if we have the piece, otherwise it is set to the number * of connected peers who have the piece. **********************************************************************/ void tr_torrentAvailability (const tr_torrent * torrent, int8_t * tab, int size); void tr_torrentAmountFinished (const tr_torrent * torrent, float * tab, int size); /** * Callback function invoked when a torrent finishes being verified. * * @param torrent the torrent that was verified * @param aborted true if the verify ended prematurely for some reason, * such as tr_torrentStop() or tr_torrentSetLocation() * being called during verification. * @param callback_data the user-defined pointer from tr_torrentVerify() */ typedef void (*tr_verify_done_func)(tr_torrent * torrent, bool aborted, void * user_data); /** * Queue a torrent for verification. * * If callback_func is non-NULL, it will be called from the libtransmission * thread after the torrent's completness state is updated after the * file verification pass. */ void tr_torrentVerify (tr_torrent * torrent, tr_verify_done_func callback_func_or_NULL, void * callback_data_or_NULL); /*********************************************************************** * tr_info **********************************************************************/ /** @brief a part of tr_info that represents a single file of the torrent's content */ typedef struct tr_file { uint64_t length; /* Length of the file, in bytes */ char * name; /* Path to the file */ int8_t priority; /* TR_PRI_HIGH, _NORMAL, or _LOW */ int8_t dnd; /* "do not download" flag */ int8_t is_renamed; /* true if we're using a different path from the one in the metainfo; ie, if the user has renamed it */ tr_piece_index_t firstPiece; /* We need pieces [firstPiece... */ tr_piece_index_t lastPiece; /* ...lastPiece] to dl this file */ uint64_t offset; /* file begins at the torrent's nth byte */ } tr_file; /** @brief a part of tr_info that represents a single piece of the torrent's content */ typedef struct tr_piece { time_t timeChecked; /* the last time we tested this piece */ uint8_t hash[SHA_DIGEST_LENGTH]; /* pieces hash */ int8_t priority; /* TR_PRI_HIGH, _NORMAL, or _LOW */ int8_t dnd; /* "do not download" flag */ } tr_piece; /** @brief information about a torrent that comes from its metainfo file */ struct tr_info { /* total size of the torrent, in bytes */ uint64_t totalSize; /* The original name that came in this torrent's metainfo. * CLIENT CODE: NOT USE THIS FIELD. */ char * originalName; /* The torrent's name. */ char * name; /* Path to torrent Transmission's internal copy of the .torrent file. */ char * torrent; char ** webseeds; char * comment; char * creator; tr_file * files; tr_piece * pieces; /* these trackers are sorted by tier */ tr_tracker_info * trackers; /* Torrent info */ time_t dateCreated; unsigned int trackerCount; unsigned int webseedCount; tr_file_index_t fileCount; uint32_t pieceSize; tr_piece_index_t pieceCount; /* General info */ uint8_t hash[SHA_DIGEST_LENGTH]; char hashString[2 * SHA_DIGEST_LENGTH + 1]; /* Flags */ bool isPrivate; bool isFolder; }; static inline bool tr_torrentHasMetadata (const tr_torrent * tor) { return tr_torrentInfo (tor)->fileCount > 0; } /** * What the torrent is doing right now. * * Note: these values will become a straight enum at some point in the future. * Do not rely on their current `bitfield' implementation */ typedef enum { TR_STATUS_STOPPED = 0, /* Torrent is stopped */ TR_STATUS_CHECK_WAIT = 1, /* Queued to check files */ TR_STATUS_CHECK = 2, /* Checking files */ TR_STATUS_DOWNLOAD_WAIT = 3, /* Queued to download */ TR_STATUS_DOWNLOAD = 4, /* Downloading */ TR_STATUS_SEED_WAIT = 5, /* Queued to seed */ TR_STATUS_SEED = 6 /* Seeding */ } tr_torrent_activity; enum { TR_PEER_FROM_INCOMING = 0, /* connections made to the listening port */ TR_PEER_FROM_LPD, /* peers found by local announcements */ TR_PEER_FROM_TRACKER, /* peers found from a tracker */ TR_PEER_FROM_DHT, /* peers found from the DHT */ TR_PEER_FROM_PEX, /* peers found from PEX */ TR_PEER_FROM_RESUME, /* peers found in the .resume file */ TR_PEER_FROM_LTEP, /* peer address provided in an LTEP handshake */ TR_PEER_FROM__MAX }; typedef enum { /* everything's fine */ TR_STAT_OK = 0, /* when we anounced to the tracker, we got a warning in the response */ TR_STAT_TRACKER_WARNING = 1, /* when we anounced to the tracker, we got an error in the response */ TR_STAT_TRACKER_ERROR = 2, /* local trouble, such as disk full or permissions error */ TR_STAT_LOCAL_ERROR = 3 } tr_stat_errtype; /** @brief Used by tr_torrentStat () to tell clients about a torrent's state and statistics */ typedef struct tr_stat { /** The torrent's unique Id. @see tr_torrentId () */ int id; /** What is this torrent doing right now? */ tr_torrent_activity activity; /** Defines what kind of text is in errorString. @see errorString */ tr_stat_errtype error; /** A warning or error message regarding the torrent. @see error */ char errorString[512]; /** When tr_stat.activity is TR_STATUS_CHECK or TR_STATUS_CHECK_WAIT, this is the percentage of how much of the files has been verified. When it gets to 1, the verify process is done. Range is [0..1] @see tr_stat.activity */ float recheckProgress; /** How much has been downloaded of the entire torrent. Range is [0..1] */ float percentComplete; /** How much of the metadata the torrent has. For torrents added from a .torrent this will always be 1. For magnet links, this number will from from 0 to 1 as the metadata is downloaded. Range is [0..1] */ float metadataPercentComplete; /** How much has been downloaded of the files the user wants. This differs from percentComplete if the user wants only some of the torrent's files. Range is [0..1] @see tr_stat.leftUntilDone */ float percentDone; /** How much has been uploaded to satisfy the seed ratio. This is 1 if the ratio is reached or the torrent is set to seed forever. Range is [0..1] */ float seedRatioPercentDone; /** Speed all data being sent for this torrent. This includes piece data, protocol messages, and TCP overhead */ float rawUploadSpeed_KBps; /** Speed all data being received for this torrent. This includes piece data, protocol messages, and TCP overhead */ float rawDownloadSpeed_KBps; /** Speed all piece being sent for this torrent. This ONLY counts piece data. */ float pieceUploadSpeed_KBps; /** Speed all piece being received for this torrent. This ONLY counts piece data. */ float pieceDownloadSpeed_KBps; #define TR_ETA_NOT_AVAIL -1 #define TR_ETA_UNKNOWN -2 /** If downloading, estimated number of seconds left until the torrent is done. If seeding, estimated number of seconds left until seed ratio is reached. */ int eta; /** If seeding, number of seconds left until the idle time limit is reached. */ int etaIdle; /** Number of peers that we're connected to */ int peersConnected; /** How many peers we found out about from the tracker, or from pex, or from incoming connections, or from our resume file. */ int peersFrom[TR_PEER_FROM__MAX]; /** Number of peers that are sending data to us. */ int peersSendingToUs; /** Number of peers that we're sending data to */ int peersGettingFromUs; /** Number of webseeds that are sending data to us. */ int webseedsSendingToUs; /** Byte count of all the piece data we'll have downloaded when we're done, whether or not we have it yet. This may be less than tr_info.totalSize if only some of the torrent's files are wanted. [0...tr_info.totalSize] */ uint64_t sizeWhenDone; /** Byte count of how much data is left to be downloaded until we've got all the pieces that we want. [0...tr_info.sizeWhenDone] */ uint64_t leftUntilDone; /** Byte count of all the piece data we want and don't have yet, but that a connected peer does have. [0...leftUntilDone] */ uint64_t desiredAvailable; /** Byte count of all the corrupt data you've ever downloaded for this torrent. If you're on a poisoned torrent, this number can grow very large. */ uint64_t corruptEver; /** Byte count of all data you've ever uploaded for this torrent. */ uint64_t uploadedEver; /** Byte count of all the non-corrupt data you've ever downloaded for this torrent. If you deleted the files and downloaded a second time, this will be 2*totalSize.. */ uint64_t downloadedEver; /** Byte count of all the checksum-verified data we have for this torrent. */ uint64_t haveValid; /** Byte count of all the partial piece data we have for this torrent. As pieces become complete, this value may decrease as portions of it are moved to `corrupt' or `haveValid'. */ uint64_t haveUnchecked; /** time when one or more of the torrent's trackers will allow you to manually ask for more peers, or 0 if you can't */ time_t manualAnnounceTime; #define TR_RATIO_NA -1 #define TR_RATIO_INF -2 /** TR_RATIO_INF, TR_RATIO_NA, or a regular ratio */ float ratio; /** When the torrent was first added. */ time_t addedDate; /** When the torrent finished downloading. */ time_t doneDate; /** When the torrent was last started. */ time_t startDate; /** The last time we uploaded or downloaded piece data on this torrent. */ time_t activityDate; /** Number of seconds since the last activity (or since started). -1 if activity is not seeding or downloading. */ int idleSecs; /** Cumulative seconds the torrent's ever spent downloading */ int secondsDownloading; /** Cumulative seconds the torrent's ever spent seeding */ int secondsSeeding; /** A torrent is considered finished if it has met its seed ratio. As a result, only paused torrents can be finished. */ bool finished; /** This torrent's queue position. All torrents have a queue position, even if it's not queued. */ int queuePosition; /** True if the torrent is running, but has been idle for long enough to be considered stalled. @see tr_sessionGetQueueStalledMinutes () */ bool isStalled; } tr_stat; /** Return a pointer to an tr_stat structure with updated information on the torrent. This is typically called by the GUI clients every second or so to get a new snapshot of the torrent's status. */ const tr_stat * tr_torrentStat (tr_torrent * torrent); /** Like tr_torrentStat (), but only recalculates the statistics if it's been longer than a second since they were last calculated. This can reduce the CPU load if you're calling tr_torrentStat () frequently. */ const tr_stat * tr_torrentStatCached (tr_torrent * torrent); /** @deprecated */ void tr_torrentSetAddedDate (tr_torrent * torrent, time_t addedDate); /** @deprecated */ void tr_torrentSetActivityDate (tr_torrent * torrent, time_t activityDate); /** @deprecated */ void tr_torrentSetDoneDate (tr_torrent * torrent, time_t doneDate); /** @} */ /** @brief Sanity checker to test that the direction is TR_UP or TR_DOWN */ static inline bool tr_isDirection (tr_direction d) { return d==TR_UP || d==TR_DOWN; } /** @brief Sanity checker to test that a bool is true or false */ static inline bool tr_isBool (bool b) { return b==1 || b==0; } #ifdef __cplusplus } #endif #endif transmission-2.92/libtransmission/PaxHeaders.4960/error-types.h0000644000000000000000000000013012512316670021543 xustar0029 mtime=1428790712.69918114 29 atime=1428790712.69918114 30 ctime=1457295919.617801405 transmission-2.92/libtransmission/error-types.h0000644000175000017500000000171712512316670023200 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: error-types.h 14492 2015-04-11 10:58:08Z mikedld $ */ #ifndef TR_ERROR_TYPES_H #define TR_ERROR_TYPES_H #ifdef _WIN32 #include /* MinGW :( */ #ifndef ERROR_DIRECTORY_NOT_SUPPORTED #define ERROR_DIRECTORY_NOT_SUPPORTED 336 #endif #define TR_ERROR_IS_ENOENT(code) ((code) == ERROR_FILE_NOT_FOUND || \ (code) == ERROR_PATH_NOT_FOUND) #define TR_ERROR_IS_ENOSPC(code) ((code) == ERROR_DISK_FULL) #define TR_ERROR_EINVAL ERROR_INVALID_PARAMETER #define TR_ERROR_EISDIR ERROR_DIRECTORY_NOT_SUPPORTED #else /* _WIN32 */ #include #define TR_ERROR_IS_ENOENT(code) ((code) == ENOENT) #define TR_ERROR_IS_ENOSPC(code) ((code) == ENOSPC) #define TR_ERROR_EINVAL EINVAL #define TR_ERROR_EISDIR EISDIR #endif /* _WIN32 */ #endif /* TR_ERROR_TYPES_H */ transmission-2.92/libtransmission/PaxHeaders.4960/net.h0000644000000000000000000000013212610005047020030 xustar0030 mtime=1444940327.312292629 30 atime=1444940327.312292629 30 ctime=1457295919.715803071 transmission-2.92/libtransmission/net.h0000644000175000017500000001330112610005047021453 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: net.h 14574 2015-10-11 16:35:51Z mikedld $ * * Copyright (c) Transmission authors and contributors * * 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. *****************************************************************************/ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef _TR_NET_H_ #define _TR_NET_H_ #ifdef _WIN32 #include #include #else #include #include #include #endif #ifdef _WIN32 typedef SOCKET tr_socket_t; #define TR_BAD_SOCKET INVALID_SOCKET #define TR_PRI_SOCK "Id" /* intentionally signed to print -1 nicely. */ #undef EADDRINUSE #define EADDRINUSE WSAEADDRINUSE #undef ECONNREFUSED #define ECONNREFUSED WSAECONNREFUSED #undef ECONNRESET #define ECONNRESET WSAECONNRESET #undef EHOSTUNREACH #define EHOSTUNREACH WSAEHOSTUNREACH #undef EINPROGRESS #define EINPROGRESS WSAEINPROGRESS #undef ENOTCONN #define ENOTCONN WSAENOTCONN #undef EWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK #undef EAFNOSUPPORT #define EAFNOSUPPORT WSAEAFNOSUPPORT #undef ENETUNREACH #define ENETUNREACH WSAENETUNREACH #define sockerrno WSAGetLastError () #else /** @brief Platform-specific socket descriptor type. */ typedef int tr_socket_t; /** @brief Platform-specific invalid socket descriptor constant. */ #define TR_BAD_SOCKET (-1) #define TR_PRI_SOCK "d" #define sockerrno errno #endif /**** ***** ***** tr_address ***** ****/ typedef enum tr_address_type { TR_AF_INET, TR_AF_INET6, NUM_TR_AF_INET_TYPES } tr_address_type; typedef struct tr_address { tr_address_type type; union { /* The order here is important for tr_in{,6}addr_any initialization, * since we can't use C99 designated initializers */ struct in6_addr addr6; struct in_addr addr4; } addr; } tr_address; extern const tr_address tr_inaddr_any; extern const tr_address tr_in6addr_any; const char* tr_address_to_string (const tr_address * addr); const char* tr_address_to_string_with_buf (const tr_address * addr, char * buf, size_t buflen); bool tr_address_from_string (tr_address * setme, const char * string); bool tr_address_from_sockaddr_storage (tr_address * setme, tr_port * port, const struct sockaddr_storage * src); int tr_address_compare (const tr_address * a, const tr_address * b); bool tr_address_is_valid_for_peers (const tr_address * addr, tr_port port); static inline bool tr_address_is_valid (const tr_address * a) { return (a != NULL) && (a->type==TR_AF_INET || a->type==TR_AF_INET6); } /*********************************************************************** * Sockets **********************************************************************/ struct tr_session; tr_socket_t tr_netOpenPeerSocket (tr_session * session, const tr_address * addr, tr_port port, bool clientIsSeed); struct UTPSocket * tr_netOpenPeerUTPSocket (tr_session * session, const tr_address * addr, tr_port port, bool clientIsSeed); tr_socket_t tr_netBindTCP (const tr_address * addr, tr_port port, bool suppressMsgs); tr_socket_t tr_netAccept (tr_session * session, tr_socket_t bound, tr_address * setme_addr, tr_port * setme_port); void tr_netSetTOS (tr_socket_t s, int tos); void tr_netSetCongestionControl (tr_socket_t s, const char * algorithm); void tr_netClose (tr_session * session, tr_socket_t s); void tr_netCloseSocket (tr_socket_t fd); bool tr_net_hasIPv6 (tr_port); /** * @brief get a human-representable string representing the network error. * @param err an errno on Unix/Linux and an WSAError on win32) */ char* tr_net_strerror (char * buf, size_t buflen, int err); const unsigned char *tr_globalIPv6 (void); #endif /* _TR_NET_H_ */ transmission-2.92/libtransmission/PaxHeaders.4960/port-forwarding.c0000644000000000000000000000013112442116602022363 xustar0030 mtime=1418239362.946222837 30 atime=1418239362.946222837 29 ctime=1457295920.09680955 transmission-2.92/libtransmission/port-forwarding.c0000644000175000017500000001133412442116602024013 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: port-forwarding.c 14241 2014-01-21 03:10:30Z jordan $ */ #include #include #include #include #include "transmission.h" #include "natpmp_local.h" #include "log.h" #include "net.h" #include "peer-mgr.h" #include "port-forwarding.h" #include "session.h" #include "torrent.h" #include "upnp.h" #include "utils.h" static const char * getKey (void) { return _("Port Forwarding"); } struct tr_shared { bool isEnabled; bool isShuttingDown; bool doPortCheck; tr_port_forwarding natpmpStatus; tr_port_forwarding upnpStatus; tr_upnp * upnp; tr_natpmp * natpmp; tr_session * session; struct event * timer; }; /*** **** ***/ static const char* getNatStateStr (int state) { switch (state) { case TR_PORT_MAPPING: return _("Starting"); case TR_PORT_MAPPED: return _("Forwarded"); case TR_PORT_UNMAPPING: return _("Stopping"); case TR_PORT_UNMAPPED: return _("Not forwarded"); default: return "???"; } } static void natPulse (tr_shared * s, bool do_check) { int oldStatus; int newStatus; tr_port public_peer_port; const tr_port private_peer_port = s->session->private_peer_port; const int is_enabled = s->isEnabled && !s->isShuttingDown; if (s->natpmp == NULL) s->natpmp = tr_natpmpInit (); if (s->upnp == NULL) s->upnp = tr_upnpInit (); oldStatus = tr_sharedTraversalStatus (s); s->natpmpStatus = tr_natpmpPulse (s->natpmp, private_peer_port, is_enabled, &public_peer_port); if (s->natpmpStatus == TR_PORT_MAPPED) s->session->public_peer_port = public_peer_port; s->upnpStatus = tr_upnpPulse (s->upnp, private_peer_port, is_enabled, do_check); newStatus = tr_sharedTraversalStatus (s); if (newStatus != oldStatus) tr_logAddNamedInfo (getKey (), _("State changed from \"%1$s\" to \"%2$s\""), getNatStateStr (oldStatus), getNatStateStr (newStatus)); } static void set_evtimer_from_status (tr_shared * s) { int sec=0, msec=0; /* when to wake up again */ switch (tr_sharedTraversalStatus (s)) { case TR_PORT_MAPPED: /* if we're mapped, everything is fine... check back in 20 minutes * to renew the port forwarding if it's expired */ s->doPortCheck = true; sec = 60 * 20; break; case TR_PORT_ERROR: /* some kind of an error. wait 60 seconds and retry */ sec = 60; break; default: /* in progress. pulse frequently. */ msec = 333000; break; } if (s->timer != NULL) tr_timerAdd (s->timer, sec, msec); } static void onTimer (evutil_socket_t fd UNUSED, short what UNUSED, void * vshared) { tr_shared * s = vshared; assert (s); assert (s->timer); /* do something */ natPulse (s, s->doPortCheck); s->doPortCheck = false; /* set up the timer for the next pulse */ set_evtimer_from_status (s); } /*** **** ***/ tr_shared * tr_sharedInit (tr_session * session) { tr_shared * s = tr_new0 (tr_shared, 1); s->session = session; s->isEnabled = false; s->upnpStatus = TR_PORT_UNMAPPED; s->natpmpStatus = TR_PORT_UNMAPPED; #if 0 if (isEnabled) { s->timer = tr_new0 (struct event, 1); evtimer_set (s->timer, onTimer, s); tr_timerAdd (s->timer, 0, 333000); } #endif return s; } static void stop_timer (tr_shared * s) { if (s->timer != NULL) { event_free (s->timer); s->timer = NULL; } } static void stop_forwarding (tr_shared * s) { tr_logAddNamedInfo (getKey (), "%s", _("Stopped")); natPulse (s, false); tr_natpmpClose (s->natpmp); s->natpmp = NULL; s->natpmpStatus = TR_PORT_UNMAPPED; tr_upnpClose (s->upnp); s->upnp = NULL; s->upnpStatus = TR_PORT_UNMAPPED; stop_timer (s); } void tr_sharedClose (tr_session * session) { tr_shared * s = session->shared; s->isShuttingDown = true; stop_forwarding (s); s->session->shared = NULL; tr_free (s); } static void start_timer (tr_shared * s) { s->timer = evtimer_new (s->session->event_base, onTimer, s); set_evtimer_from_status (s); } void tr_sharedTraversalEnable (tr_shared * s, bool isEnabled) { if ((s->isEnabled = isEnabled)) start_timer (s); else stop_forwarding (s); } void tr_sharedPortChanged (tr_session * session) { tr_shared * s = session->shared; if (s->isEnabled) { stop_timer (s); natPulse (s, false); start_timer (s); } } bool tr_sharedTraversalIsEnabled (const tr_shared * s) { return s->isEnabled; } int tr_sharedTraversalStatus (const tr_shared * s) { return MAX (s->natpmpStatus, s->upnpStatus); } transmission-2.92/libtransmission/PaxHeaders.4960/list.c0000644000000000000000000000013212505250244020214 xustar0030 mtime=1427460260.481244209 30 atime=1427460260.481244209 30 ctime=1457295920.028808394 transmission-2.92/libtransmission/list.c0000644000175000017500000001011312505250244021635 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: list.c 14319 2014-07-06 20:06:45Z jordan $ */ #include "transmission.h" #include "list.h" #include "platform.h" #include "utils.h" static const tr_list TR_LIST_CLEAR = { NULL, NULL, NULL }; static tr_list * recycled_nodes = NULL; static tr_lock* getRecycledNodesLock (void) { static tr_lock * l = NULL; if (!l) l = tr_lockNew (); return l; } static tr_list* node_alloc (void) { tr_list * ret = NULL; tr_lock * lock = getRecycledNodesLock (); tr_lockLock (lock); if (recycled_nodes != NULL) { ret = recycled_nodes; recycled_nodes = recycled_nodes->next; } tr_lockUnlock (lock); if (ret == NULL) { ret = tr_new (tr_list, 1); } *ret = TR_LIST_CLEAR; return ret; } static void node_free (tr_list* node) { tr_lock * lock = getRecycledNodesLock (); if (node != NULL) { *node = TR_LIST_CLEAR; tr_lockLock (lock); node->next = recycled_nodes; recycled_nodes = node; tr_lockUnlock (lock); } } /*** **** ***/ void tr_list_free (tr_list** list, TrListForeachFunc data_free_func) { while (*list) { tr_list *node = *list; *list = (*list)->next; if (data_free_func) data_free_func (node->data); node_free (node); } } void tr_list_prepend (tr_list ** list, void * data) { tr_list * node = node_alloc (); node->data = data; node->next = *list; if (*list) (*list)->prev = node; *list = node; } void tr_list_append (tr_list ** list, void * data) { tr_list * node = node_alloc (); node->data = data; if (!*list) { *list = node; } else { tr_list * l = *list; while (l->next) l = l->next; l->next = node; node->prev = l; } } static tr_list* tr_list_find_data (tr_list * list, const void * data) { for (; list; list = list->next) if (list->data == data) return list; return NULL; } static void* tr_list_remove_node (tr_list ** list, tr_list * node) { void * data; tr_list * prev = node ? node->prev : NULL; tr_list * next = node ? node->next : NULL; if (prev) prev->next = next; if (next) next->prev = prev; if (*list == node) *list = next; data = node ? node->data : NULL; node_free (node); return data; } void* tr_list_pop_front (tr_list ** list) { void * ret = NULL; if (*list) { ret = (*list)->data; tr_list_remove_node (list, *list); } return ret; } void* tr_list_remove_data (tr_list ** list, const void * data) { return tr_list_remove_node (list, tr_list_find_data (*list, data)); } void* tr_list_remove (tr_list ** list, const void * b, TrListCompareFunc compare_func) { return tr_list_remove_node (list, tr_list_find (*list, b, compare_func)); } tr_list* tr_list_find (tr_list * list, const void * b, TrListCompareFunc func) { for (; list; list = list->next) if (!func (list->data, b)) return list; return NULL; } void tr_list_insert_sorted (tr_list ** list, void * data, TrListCompareFunc compare) { /* find l, the node that we'll insert this data before */ tr_list * l; for (l = *list; l != NULL; l = l->next) { const int c = (compare)(data, l->data); if (c <= 0) break; } if (l == NULL) { tr_list_append (list, data); } else if (l == *list) { tr_list_prepend (list, data); } else { tr_list * node = node_alloc (); node->data = data; node->prev = l->prev; node->next = l; node->prev->next = node; node->next->prev = node; } } int tr_list_size (const tr_list * list) { int size = 0; while (list) { ++size; list = list->next; } return size; } transmission-2.92/libtransmission/PaxHeaders.4960/rename-test.c0000644000000000000000000000013112612560132021463 xustar0030 mtime=1445650522.620234658 30 atime=1445650522.620234658 29 ctime=1457295920.27381256 transmission-2.92/libtransmission/rename-test.c0000644000175000017500000004535412612560132023124 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: rename-test.c 14491 2015-04-11 10:51:59Z mikedld $ */ #include #include #include /* fopen() */ #include /* strcmp() */ #include "transmission.h" #include "crypto-utils.h" #include "file.h" #include "resume.h" #include "torrent.h" /* tr_isTorrent() */ #include "variant.h" #include "libtransmission-test.h" /*** **** ***/ static tr_session * session = NULL; #define check_have_none(tor, totalSize) \ do { \ const tr_stat * st = tr_torrentStat(tor); \ check_int_eq (TR_STATUS_STOPPED, st->activity); \ check_int_eq (TR_STAT_OK, st->error); \ check_int_eq (totalSize, st->sizeWhenDone); \ check_int_eq (totalSize, st->leftUntilDone); \ check_int_eq (totalSize, tor->info.totalSize); \ check_int_eq (0, st->haveValid); \ } while (0) static bool testFileExistsAndConsistsOfThisString (const tr_torrent * tor, tr_file_index_t fileIndex, const char * str) { char * path; const size_t str_len = strlen (str); bool success = false; path = tr_torrentFindFile (tor, fileIndex); if (path != NULL) { uint8_t * contents; size_t contents_len; assert (tr_sys_path_exists (path, NULL)); contents = tr_loadFile (path, &contents_len, NULL); success = contents != NULL && (str_len == contents_len) && (!memcmp (contents, str, contents_len)); tr_free (contents); tr_free (path); } return success; } static void onRenameDone (tr_torrent * tor UNUSED, const char * oldpath UNUSED, const char * newname UNUSED, int error, void * user_data) { *(int*)user_data = error; } static int torrentRenameAndWait (tr_torrent * tor, const char * oldpath, const char * newname) { int error = -1; tr_torrentRenamePath (tor, oldpath, newname, onRenameDone, &error); do { tr_wait_msec (10); } while (error == -1); return error; } /*** **** ***/ static void create_single_file_torrent_contents (const char * top) { char * path = tr_buildPath (top, "hello-world.txt", NULL); libtest_create_file_with_string_contents (path, "hello, world!\n"); tr_free (path); } static tr_torrent * create_torrent_from_base64_metainfo (tr_ctor * ctor, const char * metainfo_base64) { int err; size_t metainfo_len; char * metainfo; tr_torrent * tor; /* create the torrent ctor */ metainfo = tr_base64_decode_str (metainfo_base64, &metainfo_len); assert (metainfo != NULL); assert (metainfo_len > 0); tr_ctorSetMetainfo (ctor, (uint8_t*)metainfo, metainfo_len); tr_ctorSetPaused (ctor, TR_FORCE, true); /* create the torrent */ err = 0; tor = tr_torrentNew (ctor, &err, NULL); assert (!err); /* cleanup */ tr_free (metainfo); return tor; } static int test_single_filename_torrent (void) { uint64_t loaded; tr_torrent * tor; char * tmpstr; const size_t totalSize = 14; tr_ctor * ctor; const tr_stat * st; /* this is a single-file torrent whose file is hello-world.txt, holding the string "hello, world!" */ ctor = tr_ctorNew (session); tor = create_torrent_from_base64_metainfo (ctor, "ZDEwOmNyZWF0ZWQgYnkyNTpUcmFuc21pc3Npb24vMi42MSAoMTM0MDcpMTM6Y3JlYXRpb24gZGF0" "ZWkxMzU4NTQ5MDk4ZTg6ZW5jb2Rpbmc1OlVURi04NDppbmZvZDY6bGVuZ3RoaTE0ZTQ6bmFtZTE1" "OmhlbGxvLXdvcmxkLnR4dDEyOnBpZWNlIGxlbmd0aGkzMjc2OGU2OnBpZWNlczIwOukboJcrkFUY" "f6LvqLXBVvSHqCk6Nzpwcml2YXRlaTBlZWU="); check (tr_isTorrent (tor)); /* sanity check the info */ check_int_eq (1, tor->info.fileCount); check_streq ("hello-world.txt", tor->info.files[0].name); check (!tor->info.files[0].is_renamed); /* sanity check the (empty) stats */ libttest_blockingTorrentVerify (tor); check_have_none (tor, totalSize); create_single_file_torrent_contents (tor->currentDir); /* sanity check the stats again, now that we've added the file */ libttest_blockingTorrentVerify (tor); st = tr_torrentStat (tor); check_int_eq (TR_STATUS_STOPPED, st->activity); check_int_eq (TR_STAT_OK, st->error); check_int_eq (0, st->leftUntilDone); check_int_eq (0, st->haveUnchecked); check_int_eq (0, st->desiredAvailable); check_int_eq (totalSize, st->sizeWhenDone); check_int_eq (totalSize, st->haveValid); /** *** okay! we've finally put together all the scaffolding to test *** renaming a single-file torrent **/ /* confirm that bad inputs get caught */ check_int_eq (EINVAL, torrentRenameAndWait (tor, "hello-world.txt", NULL)); check_int_eq (EINVAL, torrentRenameAndWait (tor, "hello-world.txt", "")); check_int_eq (EINVAL, torrentRenameAndWait (tor, "hello-world.txt", ".")); check_int_eq (EINVAL, torrentRenameAndWait (tor, "hello-world.txt", "..")); check_int_eq (0, torrentRenameAndWait (tor, "hello-world.txt", "hello-world.txt")); check_int_eq (EINVAL, torrentRenameAndWait (tor, "hello-world.txt", "hello/world.txt")); check (!tor->info.files[0].is_renamed); check_streq ("hello-world.txt", tor->info.files[0].name); /*** **** Now try a rename that should succeed ***/ tmpstr = tr_buildPath (tor->currentDir, "hello-world.txt", NULL); check (tr_sys_path_exists (tmpstr, NULL)); check_streq ("hello-world.txt", tr_torrentName(tor)); check_int_eq (0, torrentRenameAndWait (tor, tor->info.name, "foobar")); check (!tr_sys_path_exists (tmpstr, NULL)); /* confirm the old filename can't be found */ tr_free (tmpstr); check (tor->info.files[0].is_renamed); /* confirm the file's 'renamed' flag is set */ check_streq ("foobar", tr_torrentName(tor)); /* confirm the torrent's name is now 'foobar' */ check_streq ("foobar", tor->info.files[0].name); /* confirm the file's name is now 'foobar' in our struct */ check (strstr (tor->info.torrent, "foobar") == NULL); /* confirm the name in the .torrent file hasn't changed */ tmpstr = tr_buildPath (tor->currentDir, "foobar", NULL); check (tr_sys_path_exists (tmpstr, NULL)); /* confirm the file's name is now 'foobar' on the disk */ tr_free (tmpstr); check (testFileExistsAndConsistsOfThisString (tor, 0, "hello, world!\n")); /* confirm the contents are right */ /* (while it's renamed: confirm that the .resume file remembers the changes) */ tr_torrentSaveResume (tor); libttest_sync (); loaded = tr_torrentLoadResume (tor, ~0, ctor); check_streq ("foobar", tr_torrentName(tor)); check ((loaded & TR_FR_NAME) != 0); /*** **** ...and rename it back again ***/ tmpstr = tr_buildPath (tor->currentDir, "foobar", NULL); check (tr_sys_path_exists (tmpstr, NULL)); check_int_eq (0, torrentRenameAndWait (tor, "foobar", "hello-world.txt")); check (!tr_sys_path_exists (tmpstr, NULL)); check (tor->info.files[0].is_renamed); check_streq ("hello-world.txt", tor->info.files[0].name); check_streq ("hello-world.txt", tr_torrentName(tor)); tr_free (tmpstr); check (testFileExistsAndConsistsOfThisString (tor, 0, "hello, world!\n")); /* cleanup */ tr_ctorFree (ctor); tr_torrentRemove (tor, false, NULL); return 0; } /*** **** **** **** ***/ static void create_multifile_torrent_contents (const char * top) { char * path; path = tr_buildPath (top, "Felidae", "Felinae", "Acinonyx", "Cheetah", "Chester", NULL); libtest_create_file_with_string_contents (path, "It ain't easy bein' cheesy.\n"); tr_free (path); path = tr_buildPath (top, "Felidae", "Pantherinae", "Panthera", "Tiger", "Tony", NULL); libtest_create_file_with_string_contents (path, "They’re Grrrrreat!\n"); tr_free (path); path = tr_buildPath (top, "Felidae", "Felinae", "Felis", "catus", "Kyphi", NULL); libtest_create_file_with_string_contents (path, "Inquisitive\n"); tr_free (path); path = tr_buildPath (top, "Felidae", "Felinae", "Felis", "catus", "Saffron", NULL); libtest_create_file_with_string_contents (path, "Tough\n"); tr_free (path); libttest_sync (); } static int test_multifile_torrent (void) { tr_file_index_t i; uint64_t loaded; tr_torrent * tor; tr_ctor * ctor; char * str; char * tmp; static const size_t totalSize = 67; const tr_stat * st; const tr_file * files; const char * strings[4]; const char * expected_files[4] = { "Felidae/Felinae/Acinonyx/Cheetah/Chester", "Felidae/Felinae/Felis/catus/Kyphi", "Felidae/Felinae/Felis/catus/Saffron", "Felidae/Pantherinae/Panthera/Tiger/Tony" }; const char * expected_contents[4] = { "It ain't easy bein' cheesy.\n", "Inquisitive\n", "Tough\n", "They’re Grrrrreat!\n" }; ctor = tr_ctorNew (session); tor = create_torrent_from_base64_metainfo (ctor, "ZDEwOmNyZWF0ZWQgYnkyNTpUcmFuc21pc3Npb24vMi42MSAoMTM0MDcpMTM6Y3JlYXRpb24gZGF0" "ZWkxMzU4NTU1NDIwZTg6ZW5jb2Rpbmc1OlVURi04NDppbmZvZDU6ZmlsZXNsZDY6bGVuZ3RoaTI4" "ZTQ6cGF0aGw3OkZlbGluYWU4OkFjaW5vbnl4NzpDaGVldGFoNzpDaGVzdGVyZWVkNjpsZW5ndGhp" "MTJlNDpwYXRobDc6RmVsaW5hZTU6RmVsaXM1OmNhdHVzNTpLeXBoaWVlZDY6bGVuZ3RoaTZlNDpw" "YXRobDc6RmVsaW5hZTU6RmVsaXM1OmNhdHVzNzpTYWZmcm9uZWVkNjpsZW5ndGhpMjFlNDpwYXRo" "bDExOlBhbnRoZXJpbmFlODpQYW50aGVyYTU6VGlnZXI0OlRvbnllZWU0Om5hbWU3OkZlbGlkYWUx" "MjpwaWVjZSBsZW5ndGhpMzI3NjhlNjpwaWVjZXMyMDp27buFkmy8ICfNX4nsJmt0Ckm2Ljc6cHJp" "dmF0ZWkwZWVl"); check (tr_isTorrent (tor)); files = tor->info.files; /* sanity check the info */ check_streq (tor->info.name, "Felidae"); check_int_eq (totalSize, tor->info.totalSize); check_int_eq (4, tor->info.fileCount); for (i=0; i<4; ++i) check_streq (expected_files[i], files[i].name); /* sanity check the (empty) stats */ libttest_blockingTorrentVerify (tor); check_have_none (tor, totalSize); /* build the local data */ create_multifile_torrent_contents (tor->currentDir); /* sanity check the (full) stats */ libttest_blockingTorrentVerify (tor); st = tr_torrentStat (tor); check_int_eq (TR_STATUS_STOPPED, st->activity); check_int_eq (TR_STAT_OK, st->error); check_int_eq (0, st->leftUntilDone); check_int_eq (0, st->haveUnchecked); check_int_eq (0, st->desiredAvailable); check_int_eq (totalSize, st->sizeWhenDone); check_int_eq (totalSize, st->haveValid); /** *** okay! let's test renaming. **/ /* rename a leaf... */ check_int_eq (0, torrentRenameAndWait (tor, "Felidae/Felinae/Felis/catus/Kyphi", "placeholder")); check_streq (files[1].name, "Felidae/Felinae/Felis/catus/placeholder"); check (testFileExistsAndConsistsOfThisString (tor, 1, "Inquisitive\n")); /* ...and back again */ check_int_eq (0, torrentRenameAndWait (tor, "Felidae/Felinae/Felis/catus/placeholder", "Kyphi")); check_streq (files[1].name, "Felidae/Felinae/Felis/catus/Kyphi"); testFileExistsAndConsistsOfThisString (tor, 1, "Inquisitive\n"); /* rename a branch... */ check_int_eq (0, torrentRenameAndWait (tor, "Felidae/Felinae/Felis/catus", "placeholder")); check_streq (expected_files[0], files[0].name); check_streq ("Felidae/Felinae/Felis/placeholder/Kyphi", files[1].name); check_streq ("Felidae/Felinae/Felis/placeholder/Saffron", files[2].name); check_streq (expected_files[3], files[3].name); check (testFileExistsAndConsistsOfThisString (tor, 1, expected_contents[1])); check (testFileExistsAndConsistsOfThisString (tor, 2, expected_contents[2])); check (files[0].is_renamed == false); check (files[1].is_renamed == true); check (files[2].is_renamed == true); check (files[3].is_renamed == false); /* (while the branch is renamed: confirm that the .resume file remembers the changes) */ tr_torrentSaveResume (tor); /* this is a bit dodgy code-wise, but let's make sure the .resume file got the name */ tr_free (files[1].name); tor->info.files[1].name = tr_strdup ("gabba gabba hey"); loaded = tr_torrentLoadResume (tor, ~0, ctor); check ((loaded & TR_FR_FILENAMES) != 0); check_streq (expected_files[0], files[0].name); check_streq ("Felidae/Felinae/Felis/placeholder/Kyphi", files[1].name); check_streq ("Felidae/Felinae/Felis/placeholder/Saffron", files[2].name); check_streq (expected_files[3], files[3].name); /* ...and back again */ check_int_eq (0, torrentRenameAndWait (tor, "Felidae/Felinae/Felis/placeholder", "catus")); for (i=0; i<4; ++i) { check_streq (expected_files[i], files[i].name); check (testFileExistsAndConsistsOfThisString (tor, i, expected_contents[i])); } check (files[0].is_renamed == false); check (files[1].is_renamed == true); check (files[2].is_renamed == true); check (files[3].is_renamed == false); /*** **** Test it an incomplete torrent... ***/ /* remove the directory Felidae/Felinae/Felis/catus */ str = tr_torrentFindFile (tor, 1); check (str != NULL); tr_sys_path_remove (str, NULL); tr_free (str); str = tr_torrentFindFile (tor, 2); check (str != NULL); tr_sys_path_remove (str, NULL); tmp = tr_sys_path_dirname (str, NULL); tr_sys_path_remove (tmp, NULL); tr_free (tmp); tr_free (str); libttest_sync (); libttest_blockingTorrentVerify (tor); testFileExistsAndConsistsOfThisString (tor, 0, expected_contents[0]); for (i=1; i<=2; ++i) { str = tr_torrentFindFile (tor, i); check_streq (NULL, str); tr_free (str); } testFileExistsAndConsistsOfThisString (tor, 3, expected_contents[3]); /* rename a branch... */ check_int_eq (0, torrentRenameAndWait (tor, "Felidae/Felinae/Felis/catus", "foo")); check_streq (expected_files[0], files[0].name); check_streq ("Felidae/Felinae/Felis/foo/Kyphi", files[1].name); check_streq ("Felidae/Felinae/Felis/foo/Saffron", files[2].name); check_streq (expected_files[3], files[3].name); /* ...and back again */ check_int_eq (0, torrentRenameAndWait (tor, "Felidae/Felinae/Felis/foo", "catus")); for (i=0; i<4; ++i) check_streq (expected_files[i], files[i].name); check_int_eq (0, torrentRenameAndWait (tor, "Felidae", "gabba")); strings[0] = "gabba/Felinae/Acinonyx/Cheetah/Chester"; strings[1] = "gabba/Felinae/Felis/catus/Kyphi"; strings[2] = "gabba/Felinae/Felis/catus/Saffron"; strings[3] = "gabba/Pantherinae/Panthera/Tiger/Tony"; for (i=0; i<4; ++i) { check_streq (strings[i], files[i].name); testFileExistsAndConsistsOfThisString (tor, i, expected_contents[i]); } /* rename the root, then a branch, and then a leaf... */ check_int_eq (0, torrentRenameAndWait (tor, "gabba", "Felidae")); check_int_eq (0, torrentRenameAndWait (tor, "Felidae/Pantherinae/Panthera/Tiger", "Snow Leopard")); check_int_eq (0, torrentRenameAndWait (tor, "Felidae/Pantherinae/Panthera/Snow Leopard/Tony", "10.6")); strings[0] = "Felidae/Felinae/Acinonyx/Cheetah/Chester"; strings[1] = "Felidae/Felinae/Felis/catus/Kyphi"; strings[2] = "Felidae/Felinae/Felis/catus/Saffron"; strings[3] = "Felidae/Pantherinae/Panthera/Snow Leopard/10.6"; for (i=0; i<4; ++i) { check_streq (strings[i], files[i].name); testFileExistsAndConsistsOfThisString (tor, i, expected_contents[i]); } /** *** Test renaming prefixes (shouldn't work) **/ tr_ctorFree (ctor); tr_torrentRemove (tor, false, NULL); do { tr_wait_msec (10); } while (0); ctor = tr_ctorNew (session); tor = create_torrent_from_base64_metainfo (ctor, "ZDEwOmNyZWF0ZWQgYnkyNTpUcmFuc21pc3Npb24vMi42MSAoMTM0MDcpMTM6Y3JlYXRpb24gZGF0" "ZWkxMzU4NTU1NDIwZTg6ZW5jb2Rpbmc1OlVURi04NDppbmZvZDU6ZmlsZXNsZDY6bGVuZ3RoaTI4" "ZTQ6cGF0aGw3OkZlbGluYWU4OkFjaW5vbnl4NzpDaGVldGFoNzpDaGVzdGVyZWVkNjpsZW5ndGhp" "MTJlNDpwYXRobDc6RmVsaW5hZTU6RmVsaXM1OmNhdHVzNTpLeXBoaWVlZDY6bGVuZ3RoaTZlNDpw" "YXRobDc6RmVsaW5hZTU6RmVsaXM1OmNhdHVzNzpTYWZmcm9uZWVkNjpsZW5ndGhpMjFlNDpwYXRo" "bDExOlBhbnRoZXJpbmFlODpQYW50aGVyYTU6VGlnZXI0OlRvbnllZWU0Om5hbWU3OkZlbGlkYWUx" "MjpwaWVjZSBsZW5ndGhpMzI3NjhlNjpwaWVjZXMyMDp27buFkmy8ICfNX4nsJmt0Ckm2Ljc6cHJp" "dmF0ZWkwZWVl"); check (tr_isTorrent (tor)); files = tor->info.files; /* rename prefix of top */ check_int_eq (EINVAL, torrentRenameAndWait (tor, "Feli", "FelidaeX")); check_streq (tor->info.name, "Felidae"); check (files[0].is_renamed == false); check (files[1].is_renamed == false); check (files[2].is_renamed == false); check (files[3].is_renamed == false); /* rename false path */ check_int_eq (EINVAL, torrentRenameAndWait (tor, "Felidae/FelinaeX", "Genus Felinae")); check_streq (tor->info.name, "Felidae"); check (files[0].is_renamed == false); check (files[1].is_renamed == false); check (files[2].is_renamed == false); check (files[3].is_renamed == false); /*** **** ***/ /* cleanup */ tr_ctorFree (ctor); tr_torrentRemove (tor, false, NULL); return 0; } /*** **** ***/ static int test_partial_file (void) { tr_file_index_t i; tr_torrent * tor; const tr_stat * st; tr_file_stat * fst; const uint32_t pieceCount = 33; const uint32_t pieceSize = 32768; const uint32_t length[] = { 1048576, 4096, 512 }; const uint64_t totalSize = length[0] + length[1] + length[2]; const char * strings[3]; /*** **** create our test torrent with an incomplete .part file ***/ tor = libttest_zero_torrent_init (session); check_int_eq (totalSize, tor->info.totalSize); check_int_eq (pieceSize, tor->info.pieceSize); check_int_eq (pieceCount, tor->info.pieceCount); check_streq ("files-filled-with-zeroes/1048576", tor->info.files[0].name); check_streq ("files-filled-with-zeroes/4096", tor->info.files[1].name); check_streq ("files-filled-with-zeroes/512", tor->info.files[2].name); libttest_zero_torrent_populate (tor, false); fst = tr_torrentFiles (tor, NULL); check_int_eq (length[0] - pieceSize, fst[0].bytesCompleted); check_int_eq (length[1], fst[1].bytesCompleted); check_int_eq (length[2], fst[2].bytesCompleted); tr_torrentFilesFree (fst, tor->info.fileCount); st = tr_torrentStat (tor); check_int_eq (totalSize, st->sizeWhenDone); check_int_eq (pieceSize, st->leftUntilDone); /*** **** ***/ check_int_eq (0, torrentRenameAndWait (tor, "files-filled-with-zeroes", "foo")); check_int_eq (0, torrentRenameAndWait (tor, "foo/1048576", "bar")); strings[0] = "foo/bar"; strings[1] = "foo/4096"; strings[2] = "foo/512"; for (i=0; i<3; ++i) { check_streq (strings[i], tor->info.files[i].name); } strings[0] = "foo/bar.part"; for (i=0; i<3; ++i) { char * expected = tr_buildPath (tor->currentDir, strings[i], NULL); char * path = tr_torrentFindFile (tor, i); check_streq (expected, path); tr_free (path); tr_free (expected); } tr_torrentRemove (tor, false, NULL); return 0; } /*** **** ***/ int main (void) { int ret; const testFunc tests[] = { test_single_filename_torrent, test_multifile_torrent, test_partial_file }; session = libttest_session_init (NULL); ret = runTests (tests, NUM_TESTS (tests)); libttest_session_close (session); return ret; } transmission-2.92/libtransmission/PaxHeaders.4960/fdlimit.h0000644000000000000000000000013212505250244020676 xustar0030 mtime=1427460260.475244102 30 atime=1427460260.475244102 30 ctime=1457295919.625801541 transmission-2.92/libtransmission/fdlimit.h0000644000175000017500000000660512505250244022332 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2005-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: fdlimit.h 14479 2015-03-18 07:34:26Z mikedld $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #include "transmission.h" #include "file.h" #include "net.h" /** * @addtogroup file_io File IO * @{ */ /*** **** ***/ /** * Returns an fd to the specified filename. * * A small pool of open files is kept to avoid the overhead of * continually opening and closing the same files when downloading * piece data. * * - if do_write is true, subfolders in torrentFile are created if necessary. * - if do_write is true, the target file is created if necessary. * * on success, a file descriptor >= 0 is returned. * on failure, a TR_BAD_SYS_FILE is returned and errno is set. * * @see tr_fdFileClose */ tr_sys_file_t tr_fdFileCheckout (tr_session * session, int torrent_id, tr_file_index_t file_num, const char * filename, bool do_write, tr_preallocation_mode preallocation_mode, uint64_t preallocation_file_size); tr_sys_file_t tr_fdFileGetCached (tr_session * session, int torrent_id, tr_file_index_t file_num, bool doWrite); bool tr_fdFileGetCachedMTime (tr_session * session, int torrent_id, tr_file_index_t file_num, time_t * mtime); /** * Closes a file that's being held by our file repository. * * If the file isn't checked out, it's fsync ()ed and close ()d immediately. * If the file is currently checked out, it will be closed upon its return. * * @see tr_fdFileCheckout */ void tr_fdFileClose (tr_session * session, const tr_torrent * tor, tr_file_index_t file_num); /** * Closes all the files associated with a given torrent id */ void tr_fdTorrentClose (tr_session * session, int torrentId); /*********************************************************************** * Sockets **********************************************************************/ tr_socket_t tr_fdSocketCreate (tr_session * session, int domain, int type); tr_socket_t tr_fdSocketAccept (tr_session * session, tr_socket_t listening_sockfd, tr_address * addr, tr_port * port); void tr_fdSocketClose (tr_session * session, tr_socket_t s); /*********************************************************************** * tr_fdClose *********************************************************************** * Frees resources allocated by tr_fdInit. **********************************************************************/ void tr_fdClose (tr_session * session); /* @} */ transmission-2.92/libtransmission/PaxHeaders.4960/tr-getopt-test.c0000644000000000000000000000013212442116602022142 xustar0030 mtime=1418239362.943222786 30 atime=1418239362.943222786 30 ctime=1457295920.276812611 transmission-2.92/libtransmission/tr-getopt-test.c0000644000175000017500000001275312442116602023577 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: tr-getopt-test.c 14241 2014-01-21 03:10:30Z jordan $ */ #include "transmission.h" #include "tr-getopt.h" #include "libtransmission-test.h" static const struct tr_option options[] = { { 'p', "private", "Allow this torrent to only be used with the specified tracker(s)", "p", 0, NULL }, { 'o', "outfile", "Save the generated .torrent to this filename", "o", 1, "" }, { 's', "piecesize", "Set how many KiB each piece should be, overriding the preferred default", "s", 1, "" }, { 'c', "comment", "Add a comment", "c", 1, "" }, { 't', "tracker", "Add a tracker's announce URL", "t", 1, "" }, { 'q', "pooka", "Pooka", "pk", 0, NULL }, { 'V', "version", "Show version number and exit", "V", 0, NULL }, { 0, NULL, NULL, NULL, 0, NULL } }; static int run_test (int argc, const char ** argv, int expected_n, int * expected_c, const char ** expected_optarg) { int c; int n; const char * optarg; n = 0; tr_optind = 1; while ((c = tr_getopt ("summary", argc, argv, options, &optarg))) { check (n < expected_n); check_int_eq (expected_c[n], c); check_streq (optarg, expected_optarg[n]); ++n; } check_int_eq (expected_n, n); return 0; } /*** **** ***/ static int test_no_options (void) { int argc = 1; const char * argv[] = { "/some/path/tr-getopt-test" }; int expected_n = 0; int expected_c[] = { 0 }; const char * expected_optarg[] = { NULL }; return run_test (argc, argv, expected_n, expected_c, expected_optarg); } static int test_short_noarg (void) { int argc = 2; const char * argv[] = { "/some/path/tr-getopt-test", "-p" }; int expected_n = 1; int expected_c[] = { 'p' }; const char * expected_optarg[] = { NULL }; return run_test (argc, argv, expected_n, expected_c, expected_optarg); } static int test_long_noarg (void) { int argc = 2; const char * argv[] = { "/some/path/tr-getopt-test", "--private" }; int expected_n = 1; int expected_c[] = { 'p' }; const char * expected_optarg[] = { NULL }; return run_test (argc, argv, expected_n, expected_c, expected_optarg); } static int test_short_with_arg (void) { int argc = 3; const char * argv[] = { "/some/path/tr-getopt-test", "-o", "/tmp/outfile" }; int expected_n = 1; int expected_c[] = { 'o' }; const char * expected_optarg[] = { "/tmp/outfile" }; return run_test (argc, argv, expected_n, expected_c, expected_optarg); } static int test_long_with_arg (void) { int argc = 3; const char * argv[] = { "/some/path/tr-getopt-test", "--outfile", "/tmp/outfile" }; int expected_n = 1; int expected_c[] = { 'o' }; const char * expected_optarg[] = { "/tmp/outfile" }; return run_test (argc, argv, expected_n, expected_c, expected_optarg); } static int test_short_with_arg_after_eq (void) { int argc = 2; const char * argv[] = { "/some/path/tr-getopt-test", "-o=/tmp/outfile" }; int expected_n = 1; int expected_c[] = { 'o' }; const char * expected_optarg[] = { "/tmp/outfile" }; return run_test (argc, argv, expected_n, expected_c, expected_optarg); } static int test_long_with_arg_after_eq (void) { int argc = 2; const char * argv[] = { "/some/path/tr-getopt-test", "--outfile=/tmp/outfile" }; int expected_n = 1; int expected_c[] = { 'o' }; const char * expected_optarg[] = { "/tmp/outfile" }; return run_test (argc, argv, expected_n, expected_c, expected_optarg); } static int test_unknown_option (void) { int argc = 2; const char * argv[] = { "/some/path/tr-getopt-test", "-z" }; int expected_n = 1; int expected_c[] = { TR_OPT_UNK }; const char * expected_optarg[] = { "-z" }; return run_test (argc, argv, expected_n, expected_c, expected_optarg); } static int test_missing_arg (void) { int argc = 2; const char * argv[] = { "/some/path/tr-getopt-test", "-o" }; int expected_n = 1; int expected_c[] = { TR_OPT_ERR }; const char * expected_optarg[] = { NULL }; return run_test (argc, argv, expected_n, expected_c, expected_optarg); } static int test_lots_of_options (void) { int argc = 6; const char * argv[] = { "/some/path/tr-getopt-test", "--piecesize=4", "-c", "hello world", "-p", "--tracker=foo" }; int expected_n = 4; int expected_c[] = { 's', 'c', 'p', 't' }; const char * expected_optarg[] = { "4", "hello world", NULL, "foo" }; return run_test (argc, argv, expected_n, expected_c, expected_optarg); } static int test_match_longer_key (void) { /* confirm that this resolves to 'q' and not 'p' */ int argc = 2; const char * argv[] = { "/some/path/tr-getopt-test", "-pk" }; int expected_n = 1; int expected_c[] = { 'q' }; const char * expected_optarg[] = { NULL }; return run_test (argc, argv, expected_n, expected_c, expected_optarg); } /*** **** ***/ int main (void) { const testFunc tests[] = { test_no_options, test_short_noarg, test_long_noarg, test_short_with_arg, test_long_with_arg, test_short_with_arg_after_eq, test_long_with_arg_after_eq, test_unknown_option, test_missing_arg, test_match_longer_key, test_lots_of_options }; return runTests (tests, NUM_TESTS (tests)); } transmission-2.92/libtransmission/PaxHeaders.4960/peer-msgs-test.c0000644000000000000000000000013212442116602022117 xustar0030 mtime=1418239362.946222837 30 atime=1418239362.946222837 30 ctime=1457295920.272812543 transmission-2.92/libtransmission/peer-msgs-test.c0000644000175000017500000000233112442116602023543 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: peer-msgs-test.c 14241 2014-01-21 03:10:30Z jordan $ */ #include #include "transmission.h" #include "peer-msgs.h" #include "utils.h" #include "libtransmission-test.h" int main (void) { #if 0 uint32_t i; uint8_t infohash[SHA_DIGEST_LENGTH]; struct tr_address addr; tr_piece_index_t pieceCount = 1313; size_t numwant; size_t numgot; tr_piece_index_t pieces[] = { 1059, 431, 808, 1217, 287, 376, 1188, 353, 508 }; tr_piece_index_t buf[16]; for (i = 0; i < SHA_DIGEST_LENGTH; ++i) infohash[i] = 0xaa; tr_address_from_string (&addr, "80.4.4.200"); numwant = 7; numgot = tr_generateAllowedSet (buf, numwant, pieceCount, infohash, &addr); check (numgot == numwant); for (i=0; i #include /* memcpy (), memset (), memcmp () */ #include #include "transmission.h" #include "crypto-utils.h" /* tr_sha1 () */ #include "file.h" #include "log.h" #include "magnet.h" #include "metainfo.h" #include "resume.h" #include "torrent.h" #include "torrent-magnet.h" #include "utils.h" #include "variant.h" #include "web.h" #define dbgmsg(tor, ...) \ do \ { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, tr_torrentName (tor), __VA_ARGS__); \ } \ while (0) /*** **** ***/ enum { /* don't ask for the same metadata piece more than this often */ MIN_REPEAT_INTERVAL_SECS = 3 }; struct metadata_node { time_t requestedAt; int piece; }; struct tr_incomplete_metadata { uint8_t * metadata; int metadata_size; int pieceCount; /** sorted from least to most recently requested */ struct metadata_node * piecesNeeded; int piecesNeededCount; }; static void incompleteMetadataFree (struct tr_incomplete_metadata * m) { tr_free (m->metadata); tr_free (m->piecesNeeded); tr_free (m); } bool tr_torrentSetMetadataSizeHint (tr_torrent * tor, int64_t size) { if (tr_torrentHasMetadata (tor)) return false; if (tor->incompleteMetadata != NULL) return false; const int n = (size <= 0 || size > INT_MAX) ? -1 : size / METADATA_PIECE_SIZE + (size % METADATA_PIECE_SIZE != 0 ? 1 : 0); dbgmsg (tor, "metadata is %" PRId64 " bytes in %d pieces", size, n); if (n <= 0) return false; struct tr_incomplete_metadata * m = tr_new (struct tr_incomplete_metadata, 1); if (m == NULL) return false; m->pieceCount = n; m->metadata = tr_new (uint8_t, size); m->metadata_size = size; m->piecesNeededCount = n; m->piecesNeeded = tr_new (struct metadata_node, n); if (m->metadata == NULL || m->piecesNeeded == NULL) { incompleteMetadataFree (m); return false; } for (int i = 0; i < n; ++i) { m->piecesNeeded[i].piece = i; m->piecesNeeded[i].requestedAt = 0; } tor->incompleteMetadata = m; return true; } static size_t findInfoDictOffset (const tr_torrent * tor) { size_t fileLen; uint8_t * fileContents; size_t offset = 0; /* load the file, and find the info dict's offset inside the file */ if ((fileContents = tr_loadFile (tor->info.torrent, &fileLen, NULL))) { tr_variant top; if (!tr_variantFromBenc (&top, fileContents, fileLen)) { tr_variant * infoDict; if (tr_variantDictFindDict (&top, TR_KEY_info, &infoDict)) { size_t infoLen; char * infoContents = tr_variantToStr (infoDict, TR_VARIANT_FMT_BENC, &infoLen); const uint8_t * i = (const uint8_t*) tr_memmem ((char*)fileContents, fileLen, infoContents, infoLen); offset = i != NULL ? i - fileContents : 0; tr_free (infoContents); } tr_variantFree (&top); } tr_free (fileContents); } return offset; } static void ensureInfoDictOffsetIsCached (tr_torrent * tor) { assert (tr_torrentHasMetadata (tor)); if (!tor->infoDictOffsetIsCached) { tor->infoDictOffset = findInfoDictOffset (tor); tor->infoDictOffsetIsCached = true; } } void* tr_torrentGetMetadataPiece (tr_torrent * tor, int piece, size_t * len) { char * ret = NULL; assert (tr_isTorrent (tor)); assert (piece >= 0); assert (len != NULL); if (tr_torrentHasMetadata (tor)) { tr_sys_file_t fd; ensureInfoDictOffsetIsCached (tor); assert (tor->infoDictLength > 0); fd = tr_sys_file_open (tor->info.torrent, TR_SYS_FILE_READ, 0, NULL); if (fd != TR_BAD_SYS_FILE) { const size_t o = piece * METADATA_PIECE_SIZE; if (tr_sys_file_seek (fd, tor->infoDictOffset + o, TR_SEEK_SET, NULL, NULL)) { const size_t l = o + METADATA_PIECE_SIZE <= tor->infoDictLength ? METADATA_PIECE_SIZE : tor->infoDictLength - o; if (0 0); return ret; } void tr_torrentSetMetadataPiece (tr_torrent * tor, int piece, const void * data, int len) { int i; struct tr_incomplete_metadata * m; const int offset = piece * METADATA_PIECE_SIZE; assert (tr_isTorrent (tor)); assert (data != NULL); assert (len >= 0); dbgmsg (tor, "got metadata piece %d of %d bytes", piece, len); /* are we set up to download metadata? */ m = tor->incompleteMetadata; if (m == NULL) return; /* does this data pass the smell test? */ if (piece < 0 || piece >= m->pieceCount) return; if (piece < m->pieceCount - 1 ? len != METADATA_PIECE_SIZE : len > METADATA_PIECE_SIZE) return; assert (offset <= m->metadata_size); if (len == 0 || len > m->metadata_size - offset) return; /* do we need this piece? */ for (i=0; ipiecesNeededCount; ++i) if (m->piecesNeeded[i].piece == piece) break; if (i==m->piecesNeededCount) return; memcpy (m->metadata + offset, data, len); tr_removeElementFromArray (m->piecesNeeded, i, sizeof (struct metadata_node), m->piecesNeededCount--); dbgmsg (tor, "saving metainfo piece %d... %d remain", piece, m->piecesNeededCount); /* are we done? */ if (m->piecesNeededCount == 0) { bool success = false; bool checksumPassed = false; bool metainfoParsed = false; uint8_t sha1[SHA_DIGEST_LENGTH]; /* we've got a complete set of metainfo... see if it passes the checksum test */ dbgmsg (tor, "metainfo piece %d was the last one", piece); tr_sha1 (sha1, m->metadata, m->metadata_size, NULL); if ((checksumPassed = !memcmp (sha1, tor->info.hash, SHA_DIGEST_LENGTH))) { /* checksum passed; now try to parse it as benc */ tr_variant infoDict; const int err = tr_variantFromBenc (&infoDict, m->metadata, m->metadata_size); dbgmsg (tor, "err is %d", err); if ((metainfoParsed = !err)) { /* yay we have bencoded metainfo... merge it into our .torrent file */ tr_variant newMetainfo; char * path = tr_strdup (tor->info.torrent); if (tr_variantFromFile (&newMetainfo, TR_VARIANT_FMT_BENC, path, NULL)) { bool hasInfo; tr_info info; size_t infoDictLength; /* remove any old .torrent and .resume files */ tr_sys_path_remove (path, NULL); tr_torrentRemoveResume (tor); dbgmsg (tor, "Saving completed metadata to \"%s\"", path); tr_variantMergeDicts (tr_variantDictAddDict (&newMetainfo, TR_KEY_info, 0), &infoDict); memset (&info, 0, sizeof (tr_info)); success = tr_metainfoParse (tor->session, &newMetainfo, &info, &hasInfo, &infoDictLength); if (success && !tr_getBlockSize (info.pieceSize)) { tr_torrentSetLocalError (tor, "%s", _("Magnet torrent's metadata is not usable")); success = false; } if (success) { /* keep the new info */ tor->info = info; tor->infoDictLength = infoDictLength; /* save the new .torrent file */ tr_variantToFile (&newMetainfo, TR_VARIANT_FMT_BENC, tor->info.torrent); tr_sessionSetTorrentFile (tor->session, tor->info.hashString, tor->info.torrent); tr_torrentGotNewInfoDict (tor); tr_torrentSetDirty (tor); } tr_variantFree (&newMetainfo); } tr_variantFree (&infoDict); tr_free (path); } } if (success) { incompleteMetadataFree (tor->incompleteMetadata); tor->incompleteMetadata = NULL; tor->isStopping = true; tor->magnetVerify = true; tor->startAfterVerify = true; } else /* drat. */ { const int n = m->pieceCount; for (i=0; ipiecesNeeded[i].piece = i; m->piecesNeeded[i].requestedAt = 0; } m->piecesNeededCount = n; dbgmsg (tor, "metadata error; trying again. %d pieces left", n); tr_logAddError ("magnet status: checksum passed %d, metainfo parsed %d", (int)checksumPassed, (int)metainfoParsed); } } } bool tr_torrentGetNextMetadataRequest (tr_torrent * tor, time_t now, int * setme_piece) { bool have_request = false; struct tr_incomplete_metadata * m; assert (tr_isTorrent (tor)); m = tor->incompleteMetadata; if ((m != NULL) && (m->piecesNeededCount > 0) && (m->piecesNeeded[0].requestedAt + MIN_REPEAT_INTERVAL_SECS < now)) { int i; const int piece = m->piecesNeeded[0].piece; tr_removeElementFromArray (m->piecesNeeded, 0, sizeof (struct metadata_node), m->piecesNeededCount--); i = m->piecesNeededCount++; m->piecesNeeded[i].piece = piece; m->piecesNeeded[i].requestedAt = now; dbgmsg (tor, "next piece to request: %d", piece); *setme_piece = piece; have_request = true; } return have_request; } double tr_torrentGetMetadataPercent (const tr_torrent * tor) { double ret; if (tr_torrentHasMetadata (tor)) { ret = 1.0; } else { const struct tr_incomplete_metadata * m = tor->incompleteMetadata; if (!m || !m->pieceCount) ret = 0.0; else ret = (m->pieceCount - m->piecesNeededCount) / (double)m->pieceCount; } return ret; } /* FIXME: this should be renamed tr_metainfoGetMagnetLink() and moved to metainfo.c for consistency */ char * tr_torrentInfoGetMagnetLink (const tr_info * inf) { unsigned int i; const char * name; struct evbuffer * s = evbuffer_new (); evbuffer_add_printf (s, "magnet:?xt=urn:btih:%s", inf->hashString); name = inf->name; if (name && *name) { evbuffer_add_printf (s, "%s", "&dn="); tr_http_escape (s, name, TR_BAD_SIZE, true); } for (i=0; itrackerCount; ++i) { evbuffer_add_printf (s, "%s", "&tr="); tr_http_escape (s, inf->trackers[i].announce, TR_BAD_SIZE, true); } for (i=0; iwebseedCount; i++) { evbuffer_add_printf (s, "%s", "&ws="); tr_http_escape (s, inf->webseeds[i], TR_BAD_SIZE, true); } return evbuffer_free_to_str (s, NULL); } transmission-2.92/libtransmission/PaxHeaders.4960/crypto-utils.c0000644000000000000000000000013212634073127021725 xustar0030 mtime=1450210903.498466979 30 atime=1450210903.498466979 30 ctime=1457295919.983807629 transmission-2.92/libtransmission/crypto-utils.c0000644000175000017500000001461012634073127023354 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: crypto-utils.c 14618 2015-12-13 01:29:39Z mikedld $ */ #include #include #include /* abs (), srand (), rand () */ #include /* memcpy (), memmove (), memset (), strcmp (), strlen () */ #include #include #include "transmission.h" #include "crypto-utils.h" #include "utils.h" /*** **** ***/ void tr_dh_align_key (uint8_t * key_buffer, size_t key_size, size_t buffer_size) { assert (key_size <= buffer_size); /* DH can generate key sizes that are smaller than the size of key buffer with exponentially decreasing probability, in which case the msb's of key buffer need to be zeroed appropriately. */ if (key_size < buffer_size) { const size_t offset = buffer_size - key_size; memmove (key_buffer + offset, key_buffer, key_size); memset (key_buffer, 0, offset); } } /*** **** ***/ bool tr_sha1 (uint8_t * hash, const void * data1, int data1_length, ...) { tr_sha1_ctx_t sha; if ((sha = tr_sha1_init ()) == NULL) return false; if (tr_sha1_update (sha, data1, data1_length)) { va_list vl; const void * data; va_start (vl, data1_length); while ((data = va_arg (vl, const void *)) != NULL) { const int data_length = va_arg (vl, int); assert (data_length >= 0); if (!tr_sha1_update (sha, data, data_length)) break; } va_end (vl); /* did we reach the end of argument list? */ if (data == NULL) return tr_sha1_final (sha, hash); } tr_sha1_final (sha, NULL); return false; } /*** **** ***/ int tr_rand_int (int upper_bound) { int noise; assert (upper_bound > 0); while (tr_rand_buffer (&noise, sizeof (noise))) { noise = abs(noise) % upper_bound; /* abs(INT_MIN) is undefined and could return negative value */ if (noise >= 0) return noise; } /* fall back to a weaker implementation... */ return tr_rand_int_weak (upper_bound); } int tr_rand_int_weak (int upper_bound) { static bool init = false; assert (upper_bound > 0); if (!init) { srand (tr_time_msec ()); init = true; } return rand () % upper_bound; } /*** **** ***/ char * tr_ssha1 (const char * plain_text) { enum { saltval_len = 8, salter_len = 64 }; static const char * salter = "0123456789" "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "./"; size_t i; unsigned char salt[saltval_len]; uint8_t sha[SHA_DIGEST_LENGTH]; char buf[2 * SHA_DIGEST_LENGTH + saltval_len + 2]; tr_rand_buffer (salt, saltval_len); for (i = 0; i < saltval_len; ++i) salt[i] = salter[salt[i] % salter_len]; tr_sha1 (sha, plain_text, strlen (plain_text), salt, (size_t) saltval_len, NULL); tr_sha1_to_hex (&buf[1], sha); memcpy (&buf[1 + 2 * SHA_DIGEST_LENGTH], &salt, saltval_len); buf[1 + 2 * SHA_DIGEST_LENGTH + saltval_len] = '\0'; buf[0] = '{'; /* signal that this is a hash. this makes saving/restoring easier */ return tr_strdup (buf); } bool tr_ssha1_matches (const char * ssha1, const char * plain_text) { char * salt; size_t saltlen; char * my_ssha1; uint8_t buf[SHA_DIGEST_LENGTH]; bool result; const size_t sourcelen = strlen (ssha1); /* extract the salt */ if (sourcelen < 2 * SHA_DIGEST_LENGTH - 1) return false; saltlen = sourcelen - 2 * SHA_DIGEST_LENGTH - 1; salt = tr_malloc (saltlen); memcpy (salt, ssha1 + 2 * SHA_DIGEST_LENGTH + 1, saltlen); /* hash pass + salt */ my_ssha1 = tr_malloc (2 * SHA_DIGEST_LENGTH + saltlen + 2); tr_sha1 (buf, plain_text, strlen (plain_text), salt, saltlen, NULL); tr_sha1_to_hex (&my_ssha1[1], buf); memcpy (my_ssha1 + 1 + 2 * SHA_DIGEST_LENGTH, salt, saltlen); my_ssha1[1 + 2 * SHA_DIGEST_LENGTH + saltlen] = '\0'; my_ssha1[0] = '{'; result = strcmp (ssha1, my_ssha1) == 0; tr_free (my_ssha1); tr_free (salt); return result; } /*** **** ***/ void * tr_base64_encode (const void * input, size_t input_length, size_t * output_length) { char * ret; if (input != NULL) { if (input_length != 0) { size_t ret_length = 4 * ((input_length + 2) / 3); base64_encodestate state; #ifdef USE_SYSTEM_B64 /* Additional space is needed for newlines if we're using unpatched libb64 */ ret_length += ret_length / 72 + 1; #endif ret = tr_new (char, ret_length + 8); base64_init_encodestate (&state); ret_length = base64_encode_block (input, input_length, ret, &state); ret_length += base64_encode_blockend (ret + ret_length, &state); if (output_length != NULL) *output_length = ret_length; ret[ret_length] = '\0'; return ret; } else ret = tr_strdup (""); } else { ret = NULL; } if (output_length != NULL) *output_length = 0; return ret; } void * tr_base64_encode_str (const char * input, size_t * output_length) { return tr_base64_encode (input, input == NULL ? 0 : strlen (input), output_length); } void * tr_base64_decode (const void * input, size_t input_length, size_t * output_length) { char * ret; if (input != NULL) { if (input_length != 0) { size_t ret_length = input_length / 4 * 3; base64_decodestate state; ret = tr_new (char, ret_length + 8); base64_init_decodestate (&state); ret_length = base64_decode_block (input, input_length, ret, &state); if (output_length != NULL) *output_length = ret_length; ret[ret_length] = '\0'; return ret; } else ret = tr_strdup (""); } else { ret = NULL; } if (output_length != NULL) *output_length = 0; return ret; } void * tr_base64_decode_str (const char * input, size_t * output_length) { return tr_base64_decode (input, input == NULL ? 0 : strlen (input), output_length); } transmission-2.92/libtransmission/PaxHeaders.4960/file.h0000644000000000000000000000013112612560132020163 xustar0030 mtime=1445650522.619234641 30 atime=1445650522.619234641 29 ctime=1457295919.63280166 transmission-2.92/libtransmission/file.h0000644000175000017500000006716412612560132021627 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: file.h 14584 2015-10-20 21:22:19Z mikedld $ */ #ifndef TR_FILE_H #define TR_FILE_H #include #include #ifdef _WIN32 #include #endif #ifdef __cplusplus extern "C" { #endif struct tr_error; /** * @addtogroup file_io File IO * @{ */ #ifndef _WIN32 /** @brief Platform-specific file descriptor type. */ typedef int tr_sys_file_t; /** @brief Platform-specific invalid file descriptor constant. */ #define TR_BAD_SYS_FILE (-1) /** @brief Platform-specific directory descriptor type. */ typedef void * tr_sys_dir_t; /** @brief Platform-specific end-of-line sequence. */ #define TR_NATIVE_EOL_STR "\n" /** @brief Platform-specific end-of-line sequence length. */ #define TR_NATIVE_EOL_STR_SIZE 1 #else typedef HANDLE tr_sys_file_t; #define TR_BAD_SYS_FILE INVALID_HANDLE_VALUE typedef struct tr_sys_dir_win32 * tr_sys_dir_t; #define TR_NATIVE_EOL_STR "\r\n" #define TR_NATIVE_EOL_STR_SIZE 2 #endif /** @brief Platform-specific invalid directory descriptor constant. */ #define TR_BAD_SYS_DIR ((tr_sys_dir_t)NULL) typedef enum { TR_STD_SYS_FILE_IN, TR_STD_SYS_FILE_OUT, TR_STD_SYS_FILE_ERR } tr_std_sys_file_t; typedef enum { TR_SYS_FILE_READ = 1 << 0, TR_SYS_FILE_WRITE = 1 << 1, TR_SYS_FILE_CREATE = 1 << 2, TR_SYS_FILE_CREATE_NEW = 1 << 3, TR_SYS_FILE_APPEND = 1 << 4, TR_SYS_FILE_TRUNCATE = 1 << 5, TR_SYS_FILE_SEQUENTIAL = 1 << 6 } tr_sys_file_open_flags_t; typedef enum { TR_SEEK_SET, TR_SEEK_CUR, TR_SEEK_END } tr_seek_origin_t; typedef enum { TR_SYS_PATH_NO_FOLLOW = 1 << 0 } tr_sys_path_get_info_flags_t; typedef enum { TR_SYS_FILE_PREALLOC_SPARSE = 1 << 0 } tr_sys_file_preallocate_flags_t; typedef enum { TR_SYS_DIR_CREATE_PARENTS = 1 << 0 } tr_sys_dir_create_flags_t; typedef enum { TR_SYS_PATH_IS_FILE, TR_SYS_PATH_IS_DIRECTORY, TR_SYS_PATH_IS_OTHER } tr_sys_path_type_t; typedef struct tr_sys_path_info { tr_sys_path_type_t type; uint64_t size; time_t last_modified_at; } tr_sys_path_info; /** * @name Platform-specific wrapper functions * * Following functions accept paths in UTF-8 encoding and convert them to native * encoding internally if needed. * Descriptors returned (@ref tr_sys_file_t and @ref tr_sys_dir_t) may have * different type depending on platform and should generally not be passed to * native functions, but to wrapper functions instead. * * @{ */ /* Path-related wrappers */ /** * @brief Portability wrapper for `stat ()`. * * @param[in] path Path to file or directory. * @param[in] flags Combination of @ref tr_sys_path_get_info_flags_t values. * @param[out] info Result buffer. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_path_get_info (const char * path, int flags, tr_sys_path_info * info, struct tr_error ** error); /** * @brief Portability wrapper for `access ()`. * * @param[in] path Path to file or directory. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return `True` if path exists, `false` otherwise. Note that `false` will also * be returned in case of error; if you need to distinguish the two, * check if `error` is `NULL` afterwards. */ bool tr_sys_path_exists (const char * path, struct tr_error ** error); /** * @brief Check whether path is relative. * * This function only analyzes the string, so no error reporting is needed. * * @param[in] path Path to file or directory. * * @return `True` if path is relative, `false` otherwise */ bool tr_sys_path_is_relative (const char * path); /** * @brief Test to see if the two filenames point to the same file. * * @param[in] path1 Path to first file or directory. * @param[in] path2 Path to second file or directory. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return `True` if two paths point to the same file or directory, `false` * otherwise. Note that `false` will also be returned in case of error; * if you need to distinguish the two, check if `error` is `NULL` * afterwards. */ bool tr_sys_path_is_same (const char * path1, const char * path2, struct tr_error ** error); /** * @brief Portability wrapper for `realpath ()`. * * @param[in] path Path to file or directory. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return Pointer to newly allocated buffer containing full path (with symbolic * links, `.` and `..` resolved) on success (use @ref tr_free to free it * when no longer needed), `NULL` otherwise (with `error` set * accordingly). */ char * tr_sys_path_resolve (const char * path, struct tr_error ** error); /** * @brief Portability wrapper for `basename ()`. * * @param[in] path Path to file or directory. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return Pointer to newly allocated buffer containing base name (last path * component; parent path removed) on success (use @ref tr_free to free * it when no longer needed), `NULL` otherwise (with `error` set * accordingly). */ char * tr_sys_path_basename (const char * path, struct tr_error ** error); /** * @brief Portability wrapper for `dirname ()`. * * @param[in] path Path to file or directory. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return Pointer to newly allocated buffer containing directory (parent path; * last path component removed) on success (use @ref tr_free to free it * when no longer needed), `NULL` otherwise (with `error` set * accordingly). */ char * tr_sys_path_dirname (const char * path, struct tr_error ** error); /** * @brief Portability wrapper for `rename ()`. * * @param[in] src_path Path to source file or directory. * @param[in] dst_path Path to destination file or directory. * @param[out] error Pointer to error object. Optional, pass `NULL` if you * are not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). * Rename will generally only succeed if both source and destination are * on the same partition. */ bool tr_sys_path_rename (const char * src_path, const char * dst_path, struct tr_error ** error); /** * @brief Portability wrapper for `remove ()`. * * @param[in] path Path to file or directory. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). * Directory removal will only succeed if it is empty (contains no other * files and directories). */ bool tr_sys_path_remove (const char * path, struct tr_error ** error); /* File-related wrappers */ /** * @brief Get handle to one of standard I/O files. * * @param[in] std_file Standard file identifier. * @param[out] error Pointer to error object. Optional, pass `NULL` if you * are not interested in error details. * * @return Opened file descriptor on success, `TR_BAD_SYS_FILE` otherwise (with * `error` set accordingly). DO NOT pass this descriptor to * @ref tr_sys_file_close (unless you know what you are doing). */ tr_sys_file_t tr_sys_file_get_std (tr_std_sys_file_t std_file, struct tr_error ** error); /** * @brief Portability wrapper for `open ()`. * * @param[in] path Path to file. * @param[in] flags Combination of @ref tr_sys_file_open_flags_t values. * @param[in] permissions Permissions to create file with (in case @ref TR_SYS_FILE_CREATE is used). Not used on Windows. * @param[out] error Pointer to error object. Optional, pass `NULL` if you * are not interested in error details. * * @return Opened file descriptor on success, `TR_BAD_SYS_FILE` otherwise (with * `error` set accordingly). */ tr_sys_file_t tr_sys_file_open (const char * path, int flags, int permissions, struct tr_error ** error); /** * @brief Portability wrapper for `mkstemp ()`. * * @param[in,out] path_template Template path to file. Should end with at least * six 'X' characters. Upon success, trailing 'X' * characters are replaced with actual random * characters used to form a unique path to * temporary file. * @param[out] error Pointer to error object. Optional, pass `NULL` * if you are not interested in error details. * * @return Opened file descriptor on success, `TR_BAD_SYS_FILE` otherwise (with * `error` set accordingly). */ tr_sys_file_t tr_sys_file_open_temp (char * path_template, struct tr_error ** error); /** * @brief Portability wrapper for `close ()`. * * @param[in] handle Valid file descriptor. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_file_close (tr_sys_file_t handle, struct tr_error ** error); /** * @brief Portability wrapper for `fstat ()`. * * @param[in] handle Valid file descriptor. * @param[out] info Result buffer. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_file_get_info (tr_sys_file_t handle, tr_sys_path_info * info, struct tr_error ** error); /** * @brief Portability wrapper for `lseek ()`. * * @param[in] handle Valid file descriptor. * @param[in] offset Relative file offset in bytes to seek to. * @param[in] origin Offset origin. * @param[out] new_offset New offset in bytes from beginning of file. Optional, * pass `NULL` if you are not interested. * @param[out] error Pointer to error object. Optional, pass `NULL` if you * are not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_file_seek (tr_sys_file_t handle, int64_t offset, tr_seek_origin_t origin, uint64_t * new_offset, struct tr_error ** error); /** * @brief Portability wrapper for `read ()`. * * @param[in] handle Valid file descriptor. * @param[out] buffer Buffer to store read data to. * @param[in] size Number of bytes to read. * @param[out] bytes_read Number of bytes actually read. Optional, pass `NULL` * if you are not interested. * @param[out] error Pointer to error object. Optional, pass `NULL` if you * are not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_file_read (tr_sys_file_t handle, void * buffer, uint64_t size, uint64_t * bytes_read, struct tr_error ** error); /** * @brief Like `pread ()`, except that the position is undefined afterwards. * Not thread-safe. * * @param[in] handle Valid file descriptor. * @param[out] buffer Buffer to store read data to. * @param[in] size Number of bytes to read. * @param[in] offset File offset in bytes to start reading from. * @param[out] bytes_read Number of bytes actually read. Optional, pass `NULL` * if you are not interested. * @param[out] error Pointer to error object. Optional, pass `NULL` if you * are not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_file_read_at (tr_sys_file_t handle, void * buffer, uint64_t size, uint64_t offset, uint64_t * bytes_read, struct tr_error ** error); /** * @brief Portability wrapper for `write ()`. * * @param[in] handle Valid file descriptor. * @param[in] buffer Buffer to get data being written from. * @param[in] size Number of bytes to write. * @param[out] bytes_written Number of bytes actually written. Optional, pass * `NULL` if you are not interested. * @param[out] error Pointer to error object. Optional, pass `NULL` if * you are not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_file_write (tr_sys_file_t handle, const void * buffer, uint64_t size, uint64_t * bytes_written, struct tr_error ** error); /** * @brief Like `pwrite ()`, except that the position is undefined afterwards. * Not thread-safe. * * @param[in] handle Valid file descriptor. * @param[in] buffer Buffer to get data being written from. * @param[in] size Number of bytes to write. * @param[in] offset File offset in bytes to start writing from. * @param[out] bytes_written Number of bytes actually written. Optional, pass * `NULL` if you are not interested. * @param[out] error Pointer to error object. Optional, pass `NULL` if you * are not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_file_write_at (tr_sys_file_t handle, const void * buffer, uint64_t size, uint64_t offset, uint64_t * bytes_written, struct tr_error ** error); /** * @brief Portability wrapper for `fsync ()`. * * @param[in] handle Valid file descriptor. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_file_flush (tr_sys_file_t handle, struct tr_error ** error); /** * @brief Portability wrapper for `ftruncate ()`. * * @param[in] handle Valid file descriptor. * @param[in] size Number of bytes to truncate (or extend) file to. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_file_truncate (tr_sys_file_t handle, uint64_t size, struct tr_error ** error); /** * @brief Tell system to prefetch some part of file which is to be read soon. * * @param[in] handle Valid file descriptor. * @param[in] offset Offset in file to prefetch from. * @param[in] size Number of bytes to prefetch. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_file_prefetch (tr_sys_file_t handle, uint64_t offset, uint64_t size, struct tr_error ** error); /** * @brief Preallocate file to specified size in full or sparse mode. * * @param[in] handle Valid file descriptor. * @param[in] size Number of bytes to preallocate file to. * @param[in] flags Combination of @ref tr_sys_file_preallocate_flags_t values. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_file_preallocate (tr_sys_file_t handle, uint64_t size, int flags, struct tr_error ** error); /** * @brief Portability wrapper for `mmap ()` for files. * * @param[in] handle Valid file descriptor. * @param[in] offset Offset in file to map from. * @param[in] size Number of bytes to map. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return Pointer to mapped file data on success, `NULL` otherwise (with * `error` set accordingly). */ void * tr_sys_file_map_for_reading (tr_sys_file_t handle, uint64_t offset, uint64_t size, struct tr_error ** error); /** * @brief Portability wrapper for `munmap ()` for files. * * @param[in] address Pointer to mapped file data. * @param[in] size Size of mapped data in bytes. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_file_unmap (const void * address, uint64_t size, struct tr_error ** error); /* File-related wrappers (utility) */ /** * @brief Portability wrapper for `fgets ()`, removing EOL internally. * * Special care should be taken when reading from one of standard input streams * (@ref tr_std_sys_file_t) since no UTF-8 conversion is currently being made. * * Reading from other streams (files, pipes) also leaves data untouched, so it * should already be in UTF-8 encoding, or whichever else you expect. * * @param[in] handle Valid file descriptor. * @param[out] buffer Buffer to store read zero-terminated string to. * @param[in] buffer_size Buffer size in bytes, taking '\0' character into * account. * @param[out] error Pointer to error object. Optional, pass `NULL` if you * are not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). * Note that `false` will also be returned in case of end of file; if * you need to distinguish the two, check if `error` is `NULL` * afterwards. */ bool tr_sys_file_read_line (tr_sys_file_t handle, char * buffer, size_t buffer_size, struct tr_error ** error); /** * @brief Portability wrapper for `fputs ()`, appending EOL internally. * * Special care should be taken when writing to one of standard output streams * (@ref tr_std_sys_file_t) since no UTF-8 conversion is currently being made. * * Writing to other streams (files, pipes) also leaves data untouched, so it * should already be in UTF-8 encoding, or whichever else you expect. * * @param[in] handle Valid file descriptor. * @param[in] buffer Zero-terminated string to write. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_file_write_line (tr_sys_file_t handle, const char * buffer, struct tr_error ** error); /** * @brief Portability wrapper for `fprintf ()`. * * Special care should be taken when writing to one of standard output streams * (@ref tr_std_sys_file_t) since no UTF-8 conversion is currently being made. * * Writing to other streams (files, pipes) also leaves data untouched, so it * should already be in UTF-8 encoding, or whichever else you expect. * * @param[in] handle Valid file descriptor. * @param[in] format String format to write. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * @param[in] ... Format arguments. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_file_write_fmt (tr_sys_file_t handle, const char * format, struct tr_error ** error, ...); /* Directory-related wrappers */ /** * @brief Portability wrapper for `getcwd ()`. * * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return Pointer to newly allocated buffer containing path to current * directory (use @ref tr_free to free it when no longer needed) on * success, `NULL` otherwise (with `error` set accordingly). */ char * tr_sys_dir_get_current (struct tr_error ** error); /** * @brief Like `mkdir ()`, but makes parent directories if needed. * * @param[in] path Path to directory. * @param[in] flags Combination of @ref tr_sys_dir_create_flags_t values. * @param[in] permissions Permissions to create directory with. Not used on Windows. * @param[out] error Pointer to error object. Optional, pass `NULL` if you * are not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_dir_create (const char * path, int flags, int permissions, struct tr_error ** error); /** * @brief Portability wrapper for `mkdtemp ()`. * * @param[in,out] path_template Template path to directory. Should end with at * least six 'X' characters. Upon success, trailing * 'X' characters are replaced with actual random * characters used to form a unique path to * temporary directory. * @param[out] error Pointer to error object. Optional, pass `NULL` * if you are not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_dir_create_temp (char * path_template, struct tr_error ** error); /** * @brief Portability wrapper for `opendir ()`. * * @param[in] path Path to directory. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return Opened directory descriptor on success, `TR_BAD_SYS_DIR` otherwise * (with `error` set accordingly). */ tr_sys_dir_t tr_sys_dir_open (const char * path, struct tr_error ** error); /** * @brief Portability wrapper for `readdir ()`. * * @param[in] handle Valid directory descriptor. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return Pointer to next directory entry name (stored internally, DO NOT pass * it to @ref tr_free) on success, `NULL` otherwise (with `error` set * accordingly). Note that `NULL` will also be returned in case of end * of directory; if you need to distinguish the two, check if `error` * is `NULL` afterwards. */ const char * tr_sys_dir_read_name (tr_sys_dir_t handle, struct tr_error ** error); /** * @brief Portability wrapper for `closedir ()`. * * @param[in] handle Valid directory descriptor. * @param[out] error Pointer to error object. Optional, pass `NULL` if you are * not interested in error details. * * @return `True` on success, `false` otherwise (with `error` set accordingly). */ bool tr_sys_dir_close (tr_sys_dir_t handle, struct tr_error ** error); /** @} */ /** @} */ #ifdef __cplusplus } #endif #endif transmission-2.92/libtransmission/PaxHeaders.4960/peer-mgr.c0000644000000000000000000000013212644245522020766 xustar0030 mtime=1452362578.739698819 30 atime=1452362578.739698819 30 ctime=1457295920.073809159 transmission-2.92/libtransmission/peer-mgr.c0000644000175000017500000033125412644245522022423 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: peer-mgr.c 14666 2016-01-07 19:20:14Z mikedld $ */ #include #include /* error codes ERANGE, ... */ #include /* INT_MAX */ #include /* memcpy, memcmp, strstr */ #include /* qsort */ #include #include #include "transmission.h" #include "announcer.h" #include "bandwidth.h" #include "blocklist.h" #include "cache.h" #include "clients.h" #include "completion.h" #include "crypto-utils.h" #include "handshake.h" #include "log.h" #include "net.h" #include "peer-io.h" #include "peer-mgr.h" #include "peer-msgs.h" #include "ptrarray.h" #include "session.h" #include "stats.h" /* tr_statsAddUploaded, tr_statsAddDownloaded */ #include "torrent.h" #include "tr-utp.h" #include "utils.h" #include "webseed.h" enum { /* how frequently to cull old atoms */ ATOM_PERIOD_MSEC = (60 * 1000), /* how frequently to change which peers are choked */ RECHOKE_PERIOD_MSEC = (10 * 1000), /* an optimistically unchoked peer is immune from rechoking for this many calls to rechokeUploads (). */ OPTIMISTIC_UNCHOKE_MULTIPLIER = 4, /* how frequently to reallocate bandwidth */ BANDWIDTH_PERIOD_MSEC = 500, /* how frequently to age out old piece request lists */ REFILL_UPKEEP_PERIOD_MSEC = (10 * 1000), /* how frequently to decide which peers live and die */ RECONNECT_PERIOD_MSEC = 500, /* when many peers are available, keep idle ones this long */ MIN_UPLOAD_IDLE_SECS = (60), /* when few peers are available, keep idle ones this long */ MAX_UPLOAD_IDLE_SECS = (60 * 5), /* max number of peers to ask for per second overall. * this throttle is to avoid overloading the router */ MAX_CONNECTIONS_PER_SECOND = 12, MAX_CONNECTIONS_PER_PULSE = (int)(MAX_CONNECTIONS_PER_SECOND * (RECONNECT_PERIOD_MSEC/1000.0)), /* number of bad pieces a peer is allowed to send before we ban them */ MAX_BAD_PIECES_PER_PEER = 5, /* amount of time to keep a list of request pieces lying around before it's considered too old and needs to be rebuilt */ PIECE_LIST_SHELF_LIFE_SECS = 60, /* use for bitwise operations w/peer_atom.flags2 */ MYFLAG_BANNED = 1, /* use for bitwise operations w/peer_atom.flags2 */ /* unreachable for now... but not banned. * if they try to connect to us it's okay */ MYFLAG_UNREACHABLE = 2, /* the minimum we'll wait before attempting to reconnect to a peer */ MINIMUM_RECONNECT_INTERVAL_SECS = 5, /** how long we'll let requests we've made linger before we cancel them */ REQUEST_TTL_SECS = 90, NO_BLOCKS_CANCEL_HISTORY = 120, CANCEL_HISTORY_SEC = 60 }; const tr_peer_event TR_PEER_EVENT_INIT = { 0, 0, NULL, 0, 0, 0, 0 }; const tr_swarm_stats TR_SWARM_STATS_INIT = { { 0, 0 }, 0, 0, { 0, 0, 0, 0, 0, 0, 0 } }; /** *** **/ /** * Peer information that should be kept even before we've connected and * after we've disconnected. These are kept in a pool of peer_atoms to decide * which ones would make good candidates for connecting to, and to watch out * for banned peers. * * @see tr_peer * @see tr_peerMsgs */ struct peer_atom { uint8_t fromFirst; /* where the peer was first found */ uint8_t fromBest; /* the "best" value of where the peer has been found */ uint8_t flags; /* these match the added_f flags */ uint8_t flags2; /* flags that aren't defined in added_f */ int8_t seedProbability; /* how likely is this to be a seed... [0..100] or -1 for unknown */ int8_t blocklisted; /* -1 for unknown, true for blocklisted, false for not blocklisted */ tr_port port; bool utp_failed; /* We recently failed to connect over uTP */ uint16_t numFails; time_t time; /* when the peer's connection status last changed */ time_t piece_data_time; time_t lastConnectionAttemptAt; time_t lastConnectionAt; /* similar to a TTL field, but less rigid -- * if the swarm is small, the atom will be kept past this date. */ time_t shelf_date; tr_peer * peer; /* will be NULL if not connected */ tr_address addr; }; #ifdef NDEBUG #define tr_isAtom(a) (TRUE) #else static bool tr_isAtom (const struct peer_atom * atom) { return (atom != NULL) && (atom->fromFirst < TR_PEER_FROM__MAX) && (atom->fromBest < TR_PEER_FROM__MAX) && (tr_address_is_valid (&atom->addr)); } #endif static const char* tr_atomAddrStr (const struct peer_atom * atom) { return atom ? tr_peerIoAddrStr (&atom->addr, atom->port) : "[no atom]"; } struct block_request { tr_block_index_t block; tr_peer * peer; time_t sentAt; }; struct weighted_piece { tr_piece_index_t index; int16_t salt; int16_t requestCount; }; enum piece_sort_state { PIECES_UNSORTED, PIECES_SORTED_BY_INDEX, PIECES_SORTED_BY_WEIGHT }; /** @brief Opaque, per-torrent data structure for peer connection information */ typedef struct tr_swarm { tr_swarm_stats stats; tr_ptrArray outgoingHandshakes; /* tr_handshake */ tr_ptrArray pool; /* struct peer_atom */ tr_ptrArray peers; /* tr_peerMsgs */ tr_ptrArray webseeds; /* tr_webseed */ tr_torrent * tor; struct tr_peerMgr * manager; tr_peerMsgs * optimistic; /* the optimistic peer, or NULL if none */ int optimisticUnchokeTimeScaler; bool isRunning; bool needsCompletenessCheck; struct block_request * requests; int requestCount; int requestAlloc; struct weighted_piece * pieces; int pieceCount; enum piece_sort_state pieceSortState; /* An array of pieceCount items stating how many peers have each piece. This is used to help us for downloading pieces "rarest first." This may be NULL if we don't have metainfo yet, or if we're not downloading and don't care about rarity */ uint16_t * pieceReplication; size_t pieceReplicationSize; int interestedCount; int maxPeers; time_t lastCancel; /* Before the endgame this should be 0. In endgame, is contains the average * number of pending requests per peer. Only peers which have more pending * requests are considered 'fast' are allowed to request a block that's * already been requested from another (slower?) peer. */ int endgame; } tr_swarm; struct tr_peerMgr { tr_session * session; tr_ptrArray incomingHandshakes; /* tr_handshake */ struct event * bandwidthTimer; struct event * rechokeTimer; struct event * refillUpkeepTimer; struct event * atomTimer; }; #define tordbg(t, ...) \ do \ { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, tr_torrentName (t->tor), __VA_ARGS__); \ } \ while (0) #define dbgmsg(...) \ do \ { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, NULL, __VA_ARGS__); \ } \ while (0) /** *** tr_peer virtual functions **/ static bool tr_peerIsTransferringPieces (const tr_peer * peer, uint64_t now, tr_direction direction, unsigned int * Bps) { assert (peer != NULL); assert (peer->funcs != NULL); return (*peer->funcs->is_transferring_pieces)(peer, now, direction, Bps); } unsigned int tr_peerGetPieceSpeed_Bps (const tr_peer * peer, uint64_t now, tr_direction direction) { unsigned int Bps = 0; tr_peerIsTransferringPieces (peer, now, direction, &Bps); return Bps; } static void tr_peerFree (tr_peer * peer) { assert (peer != NULL); assert (peer->funcs != NULL); (*peer->funcs->destruct)(peer); tr_free (peer); } void tr_peerConstruct (tr_peer * peer, const tr_torrent * tor) { assert (peer != NULL); assert (tr_isTorrent (tor)); memset (peer, 0, sizeof (tr_peer)); peer->client = TR_KEY_NONE; peer->swarm = tor->swarm; tr_bitfieldConstruct (&peer->have, tor->info.pieceCount); tr_bitfieldConstruct (&peer->blame, tor->blockCount); } static void peerDeclinedAllRequests (tr_swarm *, const tr_peer *); void tr_peerDestruct (tr_peer * peer) { assert (peer != NULL); if (peer->swarm != NULL) peerDeclinedAllRequests (peer->swarm, peer); tr_bitfieldDestruct (&peer->have); tr_bitfieldDestruct (&peer->blame); if (peer->atom) peer->atom->peer = NULL; } /** *** **/ static inline void managerLock (const struct tr_peerMgr * manager) { tr_sessionLock (manager->session); } static inline void managerUnlock (const struct tr_peerMgr * manager) { tr_sessionUnlock (manager->session); } static inline void swarmLock (tr_swarm * swarm) { managerLock (swarm->manager); } static inline void swarmUnlock (tr_swarm * swarm) { managerUnlock (swarm->manager); } #ifndef NDEBUG static inline int swarmIsLocked (const tr_swarm * swarm) { return tr_sessionIsLocked (swarm->manager->session); } #endif /* NDEBUG */ /** *** **/ static int handshakeCompareToAddr (const void * va, const void * vb) { const tr_handshake * a = va; return tr_address_compare (tr_handshakeGetAddr (a, NULL), vb); } static int handshakeCompare (const void * a, const void * b) { return handshakeCompareToAddr (a, tr_handshakeGetAddr (b, NULL)); } static inline tr_handshake* getExistingHandshake (tr_ptrArray * handshakes, const tr_address * addr) { if (tr_ptrArrayEmpty (handshakes)) return NULL; return tr_ptrArrayFindSorted (handshakes, addr, handshakeCompareToAddr); } static int comparePeerAtomToAddress (const void * va, const void * vb) { const struct peer_atom * a = va; return tr_address_compare (&a->addr, vb); } static int compareAtomsByAddress (const void * va, const void * vb) { const struct peer_atom * b = vb; assert (tr_isAtom (b)); return comparePeerAtomToAddress (va, &b->addr); } /** *** **/ const tr_address * tr_peerAddress (const tr_peer * peer) { return &peer->atom->addr; } static tr_swarm * getExistingSwarm (tr_peerMgr * manager, const uint8_t * hash) { tr_torrent * tor = tr_torrentFindFromHash (manager->session, hash); return tor == NULL ? NULL : tor->swarm; } static int peerCompare (const void * a, const void * b) { return tr_address_compare (tr_peerAddress (a), tr_peerAddress (b)); } static struct peer_atom* getExistingAtom (const tr_swarm * cswarm, const tr_address * addr) { tr_swarm * swarm = (tr_swarm*) cswarm; return tr_ptrArrayFindSorted (&swarm->pool, addr, comparePeerAtomToAddress); } static bool peerIsInUse (const tr_swarm * cs, const struct peer_atom * atom) { tr_swarm * s = (tr_swarm*) cs; assert (swarmIsLocked (s)); return (atom->peer != NULL) || getExistingHandshake (&s->outgoingHandshakes, &atom->addr) || getExistingHandshake (&s->manager->incomingHandshakes, &atom->addr); } static inline bool replicationExists (const tr_swarm * s) { return s->pieceReplication != NULL; } static void replicationFree (tr_swarm * s) { tr_free (s->pieceReplication); s->pieceReplication = NULL; s->pieceReplicationSize = 0; } static void replicationNew (tr_swarm * s) { tr_piece_index_t piece_i; const tr_piece_index_t piece_count = s->tor->info.pieceCount; const int n = tr_ptrArraySize (&s->peers); assert (!replicationExists (s)); s->pieceReplicationSize = piece_count; s->pieceReplication = tr_new0 (uint16_t, piece_count); for (piece_i=0; piece_ipeers, peer_i); if (tr_bitfieldHas (&peer->have, piece_i)) ++r; } s->pieceReplication[piece_i] = r; } } static void swarmFree (void * vs) { tr_swarm * s = vs; assert (s); assert (!s->isRunning); assert (swarmIsLocked (s)); assert (tr_ptrArrayEmpty (&s->outgoingHandshakes)); assert (tr_ptrArrayEmpty (&s->peers)); tr_ptrArrayDestruct (&s->webseeds, (PtrArrayForeachFunc)tr_peerFree); tr_ptrArrayDestruct (&s->pool, (PtrArrayForeachFunc)tr_free); tr_ptrArrayDestruct (&s->outgoingHandshakes, NULL); tr_ptrArrayDestruct (&s->peers, NULL); s->stats = TR_SWARM_STATS_INIT; replicationFree (s); tr_free (s->requests); tr_free (s->pieces); tr_free (s); } static void peerCallbackFunc (tr_peer *, const tr_peer_event *, void *); static void rebuildWebseedArray (tr_swarm * s, tr_torrent * tor) { unsigned int i; const tr_info * inf = &tor->info; /* clear the array */ tr_ptrArrayDestruct (&s->webseeds, (PtrArrayForeachFunc)tr_peerFree); s->webseeds = TR_PTR_ARRAY_INIT; s->stats.activeWebseedCount = 0; /* repopulate it */ for (i=0; iwebseedCount; ++i) { tr_webseed * w = tr_webseedNew (tor, inf->webseeds[i], peerCallbackFunc, s); tr_ptrArrayAppend (&s->webseeds, w); } } static tr_swarm * swarmNew (tr_peerMgr * manager, tr_torrent * tor) { tr_swarm * s; s = tr_new0 (tr_swarm, 1); s->manager = manager; s->tor = tor; s->pool = TR_PTR_ARRAY_INIT; s->peers = TR_PTR_ARRAY_INIT; s->webseeds = TR_PTR_ARRAY_INIT; s->outgoingHandshakes = TR_PTR_ARRAY_INIT; rebuildWebseedArray (s, tor); return s; } static void ensureMgrTimersExist (struct tr_peerMgr * m); tr_peerMgr* tr_peerMgrNew (tr_session * session) { tr_peerMgr * m = tr_new0 (tr_peerMgr, 1); m->session = session; m->incomingHandshakes = TR_PTR_ARRAY_INIT; ensureMgrTimersExist (m); return m; } static void deleteTimer (struct event ** t) { if (*t != NULL) { event_free (*t); *t = NULL; } } static void deleteTimers (struct tr_peerMgr * m) { deleteTimer (&m->atomTimer); deleteTimer (&m->bandwidthTimer); deleteTimer (&m->rechokeTimer); deleteTimer (&m->refillUpkeepTimer); } void tr_peerMgrFree (tr_peerMgr * manager) { managerLock (manager); deleteTimers (manager); /* free the handshakes. Abort invokes handshakeDoneCB (), which removes * the item from manager->handshakes, so this is a little roundabout... */ while (!tr_ptrArrayEmpty (&manager->incomingHandshakes)) tr_handshakeAbort (tr_ptrArrayNth (&manager->incomingHandshakes, 0)); tr_ptrArrayDestruct (&manager->incomingHandshakes, NULL); managerUnlock (manager); tr_free (manager); } /*** **** ***/ void tr_peerMgrOnBlocklistChanged (tr_peerMgr * mgr) { tr_torrent * tor = NULL; tr_session * session = mgr->session; /* we cache whether or not a peer is blocklisted... since the blocklist has changed, erase that cached value */ while ((tor = tr_torrentNext (session, tor))) { int i; tr_swarm * s = tor->swarm; const int n = tr_ptrArraySize (&s->pool); for (i=0; ipool, i); atom->blocklisted = -1; } } } static bool isAtomBlocklisted (tr_session * session, struct peer_atom * atom) { if (atom->blocklisted < 0) atom->blocklisted = tr_sessionIsAddressBlocked (session, &atom->addr); assert (tr_isBool (atom->blocklisted)); return atom->blocklisted; } /*** **** ***/ static void atomSetSeedProbability (struct peer_atom * atom, int seedProbability) { assert (atom != NULL); assert (-1<=seedProbability && seedProbability<=100); atom->seedProbability = seedProbability; if (seedProbability == 100) atom->flags |= ADDED_F_SEED_FLAG; else if (seedProbability != -1) atom->flags &= ~ADDED_F_SEED_FLAG; } static inline bool atomIsSeed (const struct peer_atom * atom) { return atom->seedProbability == 100; } static void atomSetSeed (const tr_swarm * s, struct peer_atom * atom) { if (!atomIsSeed (atom)) { tordbg (s, "marking peer %s as a seed", tr_atomAddrStr (atom)); atomSetSeedProbability (atom, 100); } } bool tr_peerMgrPeerIsSeed (const tr_torrent * tor, const tr_address * addr) { bool isSeed = false; const tr_swarm * s = tor->swarm; const struct peer_atom * atom = getExistingAtom (s, addr); if (atom) isSeed = atomIsSeed (atom); return isSeed; } void tr_peerMgrSetUtpSupported (tr_torrent * tor, const tr_address * addr) { struct peer_atom * atom = getExistingAtom (tor->swarm, addr); if (atom) atom->flags |= ADDED_F_UTP_FLAGS; } void tr_peerMgrSetUtpFailed (tr_torrent *tor, const tr_address *addr, bool failed) { struct peer_atom * atom = getExistingAtom (tor->swarm, addr); if (atom) atom->utp_failed = failed; } /** *** REQUESTS *** *** There are two data structures associated with managing block requests: *** *** 1. tr_swarm::requests, an array of "struct block_request" which keeps *** track of which blocks have been requested, and when, and by which peers. *** This is list is used for (a) cancelling requests that have been pending *** for too long and (b) avoiding duplicate requests before endgame. *** *** 2. tr_swarm::pieces, an array of "struct weighted_piece" which lists the *** pieces that we want to request. It's used to decide which blocks to *** return next when tr_peerMgrGetBlockRequests () is called. **/ /** *** struct block_request **/ static int compareReqByBlock (const void * va, const void * vb) { const struct block_request * a = va; const struct block_request * b = vb; /* primary key: block */ if (a->block < b->block) return -1; if (a->block > b->block) return 1; /* secondary key: peer */ if (a->peer < b->peer) return -1; if (a->peer > b->peer) return 1; return 0; } static void requestListAdd (tr_swarm * s, tr_block_index_t block, tr_peer * peer) { struct block_request key; /* ensure enough room is available... */ if (s->requestCount + 1 >= s->requestAlloc) { const int CHUNK_SIZE = 128; s->requestAlloc += CHUNK_SIZE; s->requests = tr_renew (struct block_request, s->requests, s->requestAlloc); } /* populate the record we're inserting */ key.block = block; key.peer = peer; key.sentAt = tr_time (); /* insert the request to our array... */ { bool exact; const int pos = tr_lowerBound (&key, s->requests, s->requestCount, sizeof (struct block_request), compareReqByBlock, &exact); assert (!exact); memmove (s->requests + pos + 1, s->requests + pos, sizeof (struct block_request) * (s->requestCount++ - pos)); s->requests[pos] = key; } if (peer != NULL) { ++peer->pendingReqsToPeer; assert (peer->pendingReqsToPeer >= 0); } /*fprintf (stderr, "added request of block %lu from peer %s... " "there are now %d block\n", (unsigned long)block, tr_atomAddrStr (peer->atom), s->requestCount);*/ } static struct block_request * requestListLookup (tr_swarm * s, tr_block_index_t block, const tr_peer * peer) { struct block_request key; key.block = block; key.peer = (tr_peer*) peer; return bsearch (&key, s->requests, s->requestCount, sizeof (struct block_request), compareReqByBlock); } /** * Find the peers are we currently requesting the block * with index @a block from and append them to @a peerArr. */ static void getBlockRequestPeers (tr_swarm * s, tr_block_index_t block, tr_ptrArray * peerArr) { bool exact; int i, pos; struct block_request key; key.block = block; key.peer = NULL; pos = tr_lowerBound (&key, s->requests, s->requestCount, sizeof (struct block_request), compareReqByBlock, &exact); assert (!exact); /* shouldn't have a request with .peer == NULL */ for (i=pos; irequestCount; ++i) { if (s->requests[i].block != block) break; tr_ptrArrayAppend (peerArr, s->requests[i].peer); } } static void decrementPendingReqCount (const struct block_request * b) { if (b->peer != NULL) if (b->peer->pendingReqsToPeer > 0) --b->peer->pendingReqsToPeer; } static void requestListRemove (tr_swarm * s, tr_block_index_t block, const tr_peer * peer) { const struct block_request * b = requestListLookup (s, block, peer); if (b != NULL) { const int pos = b - s->requests; assert (pos < s->requestCount); decrementPendingReqCount (b); tr_removeElementFromArray (s->requests, pos, sizeof (struct block_request), s->requestCount--); /*fprintf (stderr, "removing request of block %lu from peer %s... " "there are now %d block requests left\n", (unsigned long)block, tr_atomAddrStr (peer->atom), t->requestCount);*/ } } static int countActiveWebseeds (tr_swarm * s) { int activeCount = 0; if (s->tor->isRunning && !tr_torrentIsSeed (s->tor)) { int i; const int n = tr_ptrArraySize (&s->webseeds); const uint64_t now = tr_time_msec (); for (i=0; iwebseeds,i), now, TR_DOWN, NULL)) ++activeCount; } return activeCount; } static bool testForEndgame (const tr_swarm * s) { /* we consider ourselves to be in endgame if the number of bytes we've got requested is >= the number of bytes left to download */ return ((uint64_t) s->requestCount * s->tor->blockSize) >= tr_torrentGetLeftUntilDone (s->tor); } static void updateEndgame (tr_swarm * s) { assert (s->requestCount >= 0); if (!testForEndgame (s)) { /* not in endgame */ s->endgame = 0; } else if (!s->endgame) /* only recalculate when endgame first begins */ { int i; int numDownloading = 0; const int n = tr_ptrArraySize (&s->peers); /* add the active bittorrent peers... */ for (i=0; ipeers, i); if (p->pendingReqsToPeer > 0) ++numDownloading; } /* add the active webseeds... */ numDownloading += countActiveWebseeds (s); /* average number of pending requests per downloading peer */ s->endgame = s->requestCount / MAX (numDownloading, 1); } } /**** ***** ***** Piece List Manipulation / Accessors ***** ****/ static inline void invalidatePieceSorting (tr_swarm * s) { s->pieceSortState = PIECES_UNSORTED; } static const tr_torrent * weightTorrent; static const uint16_t * weightReplication; static void setComparePieceByWeightTorrent (tr_swarm * s) { if (!replicationExists (s)) replicationNew (s); weightTorrent = s->tor; weightReplication = s->pieceReplication; } /* we try to create a "weight" s.t. high-priority pieces come before others, * and that partially-complete pieces come before empty ones. */ static int comparePieceByWeight (const void * va, const void * vb) { const struct weighted_piece * a = va; const struct weighted_piece * b = vb; int ia, ib, missing, pending; const tr_torrent * tor = weightTorrent; const uint16_t * rep = weightReplication; /* primary key: weight */ missing = tr_torrentMissingBlocksInPiece (tor, a->index); pending = a->requestCount; ia = missing > pending ? missing - pending : (tor->blockCountInPiece + pending); missing = tr_torrentMissingBlocksInPiece (tor, b->index); pending = b->requestCount; ib = missing > pending ? missing - pending : (tor->blockCountInPiece + pending); if (ia < ib) return -1; if (ia > ib) return 1; /* secondary key: higher priorities go first */ ia = tor->info.pieces[a->index].priority; ib = tor->info.pieces[b->index].priority; if (ia > ib) return -1; if (ia < ib) return 1; /* tertiary key: rarest first. */ ia = rep[a->index]; ib = rep[b->index]; if (ia < ib) return -1; if (ia > ib) return 1; /* quaternary key: random */ if (a->salt < b->salt) return -1; if (a->salt > b->salt) return 1; /* okay, they're equal */ return 0; } static int comparePieceByIndex (const void * va, const void * vb) { const struct weighted_piece * a = va; const struct weighted_piece * b = vb; if (a->index < b->index) return -1; if (a->index > b->index) return 1; return 0; } static void pieceListSort (tr_swarm * s, enum piece_sort_state state) { assert (state==PIECES_SORTED_BY_INDEX || state==PIECES_SORTED_BY_WEIGHT); if (state == PIECES_SORTED_BY_WEIGHT) { setComparePieceByWeightTorrent (s); qsort (s->pieces, s->pieceCount, sizeof (struct weighted_piece), comparePieceByWeight); } else { qsort (s->pieces, s->pieceCount, sizeof (struct weighted_piece), comparePieceByIndex); } s->pieceSortState = state; } /** * These functions are useful for testing, but too expensive for nightly builds. * let's leave it disabled but add an easy hook to compile it back in */ #if 1 #define assertWeightedPiecesAreSorted(t) #define assertReplicationCountIsExact(t) #else static void assertWeightedPiecesAreSorted (Torrent * t) { if (!t->endgame) { int i; setComparePieceByWeightTorrent (t); for (i=0; ipieceCount-1; ++i) assert (comparePieceByWeight (&t->pieces[i], &t->pieces[i+1]) <= 0); } } static void assertReplicationCountIsExact (Torrent * t) { /* This assert might fail due to errors of implementations in other * clients. It happens when receiving duplicate bitfields/HaveAll/HaveNone * from a client. If a such a behavior is noticed, * a bug report should be filled to the faulty client. */ size_t piece_i; const uint16_t * rep = t->pieceReplication; const size_t piece_count = t->pieceReplicationSize; const tr_peer ** peers = (const tr_peer**) tr_ptrArrayBase (&t->peers); const int peer_count = tr_ptrArraySize (&t->peers); assert (piece_count == t->tor->info.pieceCount); for (piece_i=0; piece_ihave, piece_i)) ++r; assert (rep[piece_i] == r); } } #endif static struct weighted_piece * pieceListLookup (tr_swarm * s, tr_piece_index_t index) { int i; for (i=0; ipieceCount; ++i) if (s->pieces[i].index == index) return &s->pieces[i]; return NULL; } static void pieceListRebuild (tr_swarm * s) { if (!tr_torrentIsSeed (s->tor)) { tr_piece_index_t i; tr_piece_index_t * pool; tr_piece_index_t poolCount = 0; const tr_torrent * tor = s->tor; const tr_info * inf = tr_torrentInfo (tor); struct weighted_piece * pieces; int pieceCount; /* build the new list */ pool = tr_new (tr_piece_index_t, inf->pieceCount); for (i=0; ipieceCount; ++i) if (!inf->pieces[i].dnd) if (!tr_torrentPieceIsComplete (tor, i)) pool[poolCount++] = i; pieceCount = poolCount; pieces = tr_new0 (struct weighted_piece, pieceCount); for (i=0; iindex = pool[i]; piece->requestCount = 0; piece->salt = tr_rand_int_weak (4096); } /* if we already had a list of pieces, merge it into * the new list so we don't lose its requestCounts */ if (s->pieces != NULL) { struct weighted_piece * o = s->pieces; struct weighted_piece * oend = o + s->pieceCount; struct weighted_piece * n = pieces; struct weighted_piece * nend = n + pieceCount; pieceListSort (s, PIECES_SORTED_BY_INDEX); while (o!=oend && n!=nend) { if (o->index < n->index) ++o; else if (o->index > n->index) ++n; else *n++ = *o++; } tr_free (s->pieces); } s->pieces = pieces; s->pieceCount = pieceCount; pieceListSort (s, PIECES_SORTED_BY_WEIGHT); /* cleanup */ tr_free (pool); } } static void pieceListRemovePiece (tr_swarm * s, tr_piece_index_t piece) { struct weighted_piece * p; if ((p = pieceListLookup (s, piece))) { const int pos = p - s->pieces; tr_removeElementFromArray (s->pieces, pos, sizeof (struct weighted_piece), s->pieceCount--); if (s->pieceCount == 0) { tr_free (s->pieces); s->pieces = NULL; } } } static void pieceListResortPiece (tr_swarm * s, struct weighted_piece * p) { int pos; bool isSorted = true; if (p == NULL) return; /* is the torrent already sorted? */ pos = p - s->pieces; setComparePieceByWeightTorrent (s); if (isSorted && (pos > 0) && (comparePieceByWeight (p-1, p) > 0)) isSorted = false; if (isSorted && (pos < s->pieceCount - 1) && (comparePieceByWeight (p, p+1) > 0)) isSorted = false; if (s->pieceSortState != PIECES_SORTED_BY_WEIGHT) { pieceListSort (s, PIECES_SORTED_BY_WEIGHT); isSorted = true; } /* if it's not sorted, move it around */ if (!isSorted) { bool exact; const struct weighted_piece tmp = *p; tr_removeElementFromArray (s->pieces, pos, sizeof (struct weighted_piece), s->pieceCount--); pos = tr_lowerBound (&tmp, s->pieces, s->pieceCount, sizeof (struct weighted_piece), comparePieceByWeight, &exact); memmove (&s->pieces[pos + 1], &s->pieces[pos], sizeof (struct weighted_piece) * (s->pieceCount++ - pos)); s->pieces[pos] = tmp; } assertWeightedPiecesAreSorted (s); } static void pieceListRemoveRequest (tr_swarm * s, tr_block_index_t block) { struct weighted_piece * p; const tr_piece_index_t index = tr_torBlockPiece (s->tor, block); if (((p = pieceListLookup (s, index))) && (p->requestCount > 0)) { --p->requestCount; pieceListResortPiece (s, p); } } /**** ***** ***** Replication count (for rarest first policy) ***** ****/ /** * Increase the replication count of this piece and sort it if the * piece list is already sorted */ static void tr_incrReplicationOfPiece (tr_swarm * s, const size_t index) { assert (replicationExists (s)); assert (s->pieceReplicationSize == s->tor->info.pieceCount); /* One more replication of this piece is present in the swarm */ ++s->pieceReplication[index]; /* we only resort the piece if the list is already sorted */ if (s->pieceSortState == PIECES_SORTED_BY_WEIGHT) pieceListResortPiece (s, pieceListLookup (s, index)); } /** * Increases the replication count of pieces present in the bitfield */ static void tr_incrReplicationFromBitfield (tr_swarm * s, const tr_bitfield * b) { size_t i; uint16_t * rep = s->pieceReplication; const size_t n = s->tor->info.pieceCount; assert (replicationExists (s)); for (i=0; ipieceSortState == PIECES_SORTED_BY_WEIGHT) invalidatePieceSorting (s); } /** * Increase the replication count of every piece */ static void tr_incrReplication (tr_swarm * s) { int i; const int n = s->pieceReplicationSize; assert (replicationExists (s)); assert (s->pieceReplicationSize == s->tor->info.pieceCount); for (i=0; ipieceReplication[i]; } /** * Decrease the replication count of pieces present in the bitset. */ static void tr_decrReplicationFromBitfield (tr_swarm * s, const tr_bitfield * b) { int i; const int n = s->pieceReplicationSize; assert (replicationExists (s)); assert (s->pieceReplicationSize == s->tor->info.pieceCount); if (tr_bitfieldHasAll (b)) { for (i=0; ipieceReplication[i]; } else if (!tr_bitfieldHasNone (b)) { for (i=0; ipieceReplication[i]; if (s->pieceSortState == PIECES_SORTED_BY_WEIGHT) invalidatePieceSorting (s); } } /** *** **/ void tr_peerMgrRebuildRequests (tr_torrent * tor) { assert (tr_isTorrent (tor)); pieceListRebuild (tor->swarm); } void tr_peerMgrGetNextRequests (tr_torrent * tor, tr_peer * peer, int numwant, tr_block_index_t * setme, int * numgot, bool get_intervals) { int i; int got; tr_swarm * s; struct weighted_piece * pieces; const tr_bitfield * const have = &peer->have; /* sanity clause */ assert (tr_isTorrent (tor)); assert (numwant > 0); /* walk through the pieces and find blocks that should be requested */ got = 0; s = tor->swarm; /* prep the pieces list */ if (s->pieces == NULL) pieceListRebuild (s); if (s->pieceSortState != PIECES_SORTED_BY_WEIGHT) pieceListSort (s, PIECES_SORTED_BY_WEIGHT); assertReplicationCountIsExact (s); assertWeightedPiecesAreSorted (s); updateEndgame (s); pieces = s->pieces; for (i=0; ipieceCount && gotindex)) { tr_block_index_t b; tr_block_index_t first; tr_block_index_t last; tr_ptrArray peerArr = TR_PTR_ARRAY_INIT; tr_torGetPieceBlockRange (tor, p->index, &first, &last); for (b=first; b<=last && (gotendgame) continue; /* don't have more than two peers requesting this block */ if (peerCount > 1) continue; /* don't send the same request to the same peer twice */ if (peer == peers[0]) continue; /* in the endgame allow an additional peer to download a block but only if the peer seems to be handling requests relatively fast */ if (peer->pendingReqsToPeer + numwant - got < s->endgame) continue; } /* update the caller's table */ if (!get_intervals) { setme[got++] = b; } /* if intervals are requested two array entries are necessarry: one for the interval's starting block and one for its end block */ else if (got && setme[2 * got - 1] == b - 1 && b != first) { /* expand the last interval */ ++setme[2 * got - 1]; } else { /* begin a new interval */ setme[2 * got] = setme[2 * got + 1] = b; ++got; } /* update our own tables */ requestListAdd (s, b, peer); ++p->requestCount; } tr_ptrArrayDestruct (&peerArr, NULL); } } /* In most cases we've just changed the weights of a small number of pieces. * So rather than qsort ()ing the entire array, it's faster to apply an * adaptive insertion sort algorithm. */ if (got > 0) { /* not enough requests || last piece modified */ if (i == s->pieceCount) --i; setComparePieceByWeightTorrent (s); while (--i >= 0) { bool exact; /* relative position! */ const int newpos = tr_lowerBound (&s->pieces[i], &s->pieces[i + 1], s->pieceCount - (i + 1), sizeof (struct weighted_piece), comparePieceByWeight, &exact); if (newpos > 0) { const struct weighted_piece piece = s->pieces[i]; memmove (&s->pieces[i], &s->pieces[i + 1], sizeof (struct weighted_piece) * (newpos)); s->pieces[i + newpos] = piece; } } } assertWeightedPiecesAreSorted (t); *numgot = got; } bool tr_peerMgrDidPeerRequest (const tr_torrent * tor, const tr_peer * peer, tr_block_index_t block) { return requestListLookup ((tr_swarm*)tor->swarm, block, peer) != NULL; } /* cancel requests that are too old */ static void refillUpkeep (evutil_socket_t foo UNUSED, short bar UNUSED, void * vmgr) { time_t now; time_t too_old; tr_torrent * tor; int cancel_buflen = 0; struct block_request * cancel = NULL; tr_peerMgr * mgr = vmgr; managerLock (mgr); now = tr_time (); too_old = now - REQUEST_TTL_SECS; /* alloc the temporary "cancel" buffer */ tor = NULL; while ((tor = tr_torrentNext (mgr->session, tor))) cancel_buflen = MAX (cancel_buflen, tor->swarm->requestCount); if (cancel_buflen > 0) cancel = tr_new (struct block_request, cancel_buflen); /* prune requests that are too old */ tor = NULL; while ((tor = tr_torrentNext (mgr->session, tor))) { tr_swarm * s = tor->swarm; const int n = s->requestCount; if (n > 0) { int keepCount = 0; int cancelCount = 0; const struct block_request * it; const struct block_request * end; for (it=s->requests, end=it+n; it!=end; ++it) { tr_peerMsgs * msgs = PEER_MSGS(it->peer); if ((msgs !=NULL) && (it->sentAt <= too_old) && !tr_peerMsgsIsReadingBlock (msgs, it->block)) cancel[cancelCount++] = *it; else { if (it != &s->requests[keepCount]) s->requests[keepCount] = *it; keepCount++; } } /* prune out the ones we aren't keeping */ s->requestCount = keepCount; /* send cancel messages for all the "cancel" ones */ for (it=cancel, end=it+cancelCount; it!=end; ++it) { tr_peerMsgs * msgs = PEER_MSGS(it->peer); if (msgs != NULL) { tr_historyAdd (&it->peer->cancelsSentToPeer, now, 1); tr_peerMsgsCancel (msgs, it->block); decrementPendingReqCount (it); } } /* decrement the pending request counts for the timed-out blocks */ for (it=cancel, end=it+cancelCount; it!=end; ++it) pieceListRemoveRequest (s, it->block); } } tr_free (cancel); tr_timerAddMsec (mgr->refillUpkeepTimer, REFILL_UPKEEP_PERIOD_MSEC); managerUnlock (mgr); } static void addStrike (tr_swarm * s, tr_peer * peer) { tordbg (s, "increasing peer %s strike count to %d", tr_atomAddrStr (peer->atom), peer->strikes + 1); if (++peer->strikes >= MAX_BAD_PIECES_PER_PEER) { struct peer_atom * atom = peer->atom; atom->flags2 |= MYFLAG_BANNED; peer->doPurge = true; tordbg (s, "banning peer %s", tr_atomAddrStr (atom)); } } static void peerSuggestedPiece (tr_swarm * s UNUSED, tr_peer * peer UNUSED, tr_piece_index_t pieceIndex UNUSED, int isFastAllowed UNUSED) { #if 0 assert (t); assert (peer); assert (peer->msgs); /* is this a valid piece? */ if (pieceIndex >= t->tor->info.pieceCount) return; /* don't ask for it if we've already got it */ if (tr_torrentPieceIsComplete (t->tor, pieceIndex)) return; /* don't ask for it if they don't have it */ if (!tr_bitfieldHas (peer->have, pieceIndex)) return; /* don't ask for it if we're choked and it's not fast */ if (!isFastAllowed && peer->clientIsChoked) return; /* request the blocks that we don't have in this piece */ { tr_block_index_t b; tr_block_index_t first; tr_block_index_t last; const tr_torrent * tor = t->tor; tr_torGetPieceBlockRange (t->tor, pieceIndex, &first, &last); for (b=first; b<=last; ++b) { if (tr_torrentBlockIsComplete (tor, b)) { const uint32_t offset = getBlockOffsetInPiece (tor, b); const uint32_t length = tr_torBlockCountBytes (tor, b); tr_peerMsgsAddRequest (peer->msgs, pieceIndex, offset, length); incrementPieceRequests (t, pieceIndex); } } } #endif } static void removeRequestFromTables (tr_swarm * s, tr_block_index_t block, const tr_peer * peer) { requestListRemove (s, block, peer); pieceListRemoveRequest (s, block); } /* peer choked us, or maybe it disconnected. either way we need to remove all its requests */ static void peerDeclinedAllRequests (tr_swarm * s, const tr_peer * peer) { int i, n; tr_block_index_t * blocks = tr_new (tr_block_index_t, s->requestCount); for (i=n=0; irequestCount; ++i) if (peer == s->requests[i].peer) blocks[n++] = s->requests[i].block; for (i=0; icancelsSentToPeer, tr_time (), 1); tr_peerMsgsCancel (PEER_MSGS(p), block); } removeRequestFromTables (s, block, p); } tr_ptrArrayDestruct (&peerArr, NULL); } void tr_peerMgrPieceCompleted (tr_torrent * tor, tr_piece_index_t p) { int i; bool pieceCameFromPeers = false; tr_swarm * const s = tor->swarm; const int n = tr_ptrArraySize (&s->peers); /* walk through our peers */ for (i=0; ipeers, i); /* notify the peer that we now have this piece */ tr_peerMsgsHave (PEER_MSGS(peer), p); if (!pieceCameFromPeers) pieceCameFromPeers = tr_bitfieldHas (&peer->blame, p); } if (pieceCameFromPeers) /* webseed downloads don't belong in announce totals */ tr_announcerAddBytes (tor, TR_ANN_DOWN, tr_torPieceCountBytes (tor, p)); /* bookkeeping */ pieceListRemovePiece (s, p); s->needsCompletenessCheck = true; } static void peerCallbackFunc (tr_peer * peer, const tr_peer_event * e, void * vs) { tr_swarm * s = vs; swarmLock (s); assert (peer != NULL); switch (e->eventType) { case TR_PEER_PEER_GOT_PIECE_DATA: { const time_t now = tr_time (); tr_torrent * tor = s->tor; tor->uploadedCur += e->length; tr_announcerAddBytes (tor, TR_ANN_UP, e->length); tr_torrentSetActivityDate (tor, now); tr_torrentSetDirty (tor); tr_statsAddUploaded (tor->session, e->length); if (peer->atom != NULL) peer->atom->piece_data_time = now; break; } case TR_PEER_CLIENT_GOT_PIECE_DATA: { const time_t now = tr_time (); tr_torrent * tor = s->tor; tor->downloadedCur += e->length; tr_torrentSetActivityDate (tor, now); tr_torrentSetDirty (tor); tr_statsAddDownloaded (tor->session, e->length); if (peer->atom != NULL) peer->atom->piece_data_time = now; break; } case TR_PEER_CLIENT_GOT_HAVE: if (replicationExists (s)) { tr_incrReplicationOfPiece (s, e->pieceIndex); assertReplicationCountIsExact (s); } break; case TR_PEER_CLIENT_GOT_HAVE_ALL: if (replicationExists (s)) { tr_incrReplication (s); assertReplicationCountIsExact (s); } break; case TR_PEER_CLIENT_GOT_HAVE_NONE: /* noop */ break; case TR_PEER_CLIENT_GOT_BITFIELD: assert (e->bitfield != NULL); if (replicationExists (s)) { tr_incrReplicationFromBitfield (s, e->bitfield); assertReplicationCountIsExact (s); } break; case TR_PEER_CLIENT_GOT_REJ: { tr_block_index_t b = _tr_block (s->tor, e->pieceIndex, e->offset); if (b < s->tor->blockCount) removeRequestFromTables (s, b, peer); else tordbg (s, "Peer %s sent an out-of-range reject message", tr_atomAddrStr (peer->atom)); break; } case TR_PEER_CLIENT_GOT_CHOKE: peerDeclinedAllRequests (s, peer); break; case TR_PEER_CLIENT_GOT_PORT: if (peer->atom) peer->atom->port = e->port; break; case TR_PEER_CLIENT_GOT_SUGGEST: peerSuggestedPiece (s, peer, e->pieceIndex, false); break; case TR_PEER_CLIENT_GOT_ALLOWED_FAST: peerSuggestedPiece (s, peer, e->pieceIndex, true); break; case TR_PEER_CLIENT_GOT_BLOCK: { tr_torrent * tor = s->tor; const tr_piece_index_t p = e->pieceIndex; const tr_block_index_t block = _tr_block (tor, p, e->offset); cancelAllRequestsForBlock (s, block, peer); tr_historyAdd (&peer->blocksSentToClient, tr_time(), 1); pieceListResortPiece (s, pieceListLookup (s, p)); tr_torrentGotBlock (tor, block); break; } case TR_PEER_ERROR: if ((e->err == ERANGE) || (e->err == EMSGSIZE) || (e->err == ENOTCONN)) { /* some protocol error from the peer */ peer->doPurge = true; tordbg (s, "setting %s doPurge flag because we got an ERANGE, EMSGSIZE, or ENOTCONN error", tr_atomAddrStr (peer->atom)); } else { tordbg (s, "unhandled error: %s", tr_strerror (e->err)); } break; default: assert (0); } swarmUnlock (s); } static int getDefaultShelfLife (uint8_t from) { /* in general, peers obtained from firsthand contact * are better than those from secondhand, etc etc */ switch (from) { case TR_PEER_FROM_INCOMING : return 60 * 60 * 6; case TR_PEER_FROM_LTEP : return 60 * 60 * 6; case TR_PEER_FROM_TRACKER : return 60 * 60 * 3; case TR_PEER_FROM_DHT : return 60 * 60 * 3; case TR_PEER_FROM_PEX : return 60 * 60 * 2; case TR_PEER_FROM_RESUME : return 60 * 60; case TR_PEER_FROM_LPD : return 10 * 60; default : return 60 * 60; } } static void ensureAtomExists (tr_swarm * s, const tr_address * addr, const tr_port port, const uint8_t flags, const int8_t seedProbability, const uint8_t from) { struct peer_atom * a; assert (tr_address_is_valid (addr)); assert (from < TR_PEER_FROM__MAX); a = getExistingAtom (s, addr); if (a == NULL) { const int jitter = tr_rand_int_weak (60*10); a = tr_new0 (struct peer_atom, 1); a->addr = *addr; a->port = port; a->flags = flags; a->fromFirst = from; a->fromBest = from; a->shelf_date = tr_time () + getDefaultShelfLife (from) + jitter; a->blocklisted = -1; atomSetSeedProbability (a, seedProbability); tr_ptrArrayInsertSorted (&s->pool, a, compareAtomsByAddress); tordbg (s, "got a new atom: %s", tr_atomAddrStr (a)); } else { if (from < a->fromBest) a->fromBest = from; if (a->seedProbability == -1) atomSetSeedProbability (a, seedProbability); a->flags |= flags; } } static int getMaxPeerCount (const tr_torrent * tor) { return tor->maxConnectedPeers; } static int getPeerCount (const tr_swarm * s) { return tr_ptrArraySize (&s->peers);/* + tr_ptrArraySize (&t->outgoingHandshakes); */ } static void createBitTorrentPeer (tr_torrent * tor, struct tr_peerIo * io, struct peer_atom * atom, tr_quark client) { tr_peer * peer; tr_peerMsgs * msgs; tr_swarm * swarm; assert (atom != NULL); assert (tr_isTorrent (tor)); assert (tor->swarm != NULL); swarm = tor->swarm; peer = (tr_peer*) tr_peerMsgsNew (tor, io, peerCallbackFunc, swarm); peer->atom = atom; peer->client = client; atom->peer = peer; tr_ptrArrayInsertSorted (&swarm->peers, peer, peerCompare); ++swarm->stats.peerCount; ++swarm->stats.peerFromCount[atom->fromFirst]; assert (swarm->stats.peerCount == tr_ptrArraySize (&swarm->peers)); assert (swarm->stats.peerFromCount[atom->fromFirst] <= swarm->stats.peerCount); msgs = PEER_MSGS (peer); tr_peerMsgsUpdateActive (msgs, TR_UP); tr_peerMsgsUpdateActive (msgs, TR_DOWN); } /* FIXME: this is kind of a mess. */ static bool myHandshakeDoneCB (tr_handshake * handshake, tr_peerIo * io, bool readAnythingFromPeer, bool isConnected, const uint8_t * peer_id, void * vmanager) { bool ok = isConnected; bool success = false; tr_port port; const tr_address * addr; tr_peerMgr * manager = vmanager; tr_swarm * s; assert (io); assert (tr_isBool (ok)); s = tr_peerIoHasTorrentHash (io) ? getExistingSwarm (manager, tr_peerIoGetTorrentHash (io)) : NULL; if (tr_peerIoIsIncoming (io)) tr_ptrArrayRemoveSortedPointer (&manager->incomingHandshakes, handshake, handshakeCompare); else if (s) tr_ptrArrayRemoveSortedPointer (&s->outgoingHandshakes, handshake, handshakeCompare); if (s) swarmLock (s); addr = tr_peerIoGetAddress (io, &port); if (!ok || !s || !s->isRunning) { if (s) { struct peer_atom * atom = getExistingAtom (s, addr); if (atom) { ++atom->numFails; if (!readAnythingFromPeer) { tordbg (s, "marking peer %s as unreachable... numFails is %d", tr_atomAddrStr (atom), (int)atom->numFails); atom->flags2 |= MYFLAG_UNREACHABLE; } } } } else /* looking good */ { struct peer_atom * atom; ensureAtomExists (s, addr, port, 0, -1, TR_PEER_FROM_INCOMING); atom = getExistingAtom (s, addr); assert (atom != NULL); atom->time = tr_time (); atom->piece_data_time = 0; atom->lastConnectionAt = tr_time (); if (!tr_peerIoIsIncoming (io)) { atom->flags |= ADDED_F_CONNECTABLE; atom->flags2 &= ~MYFLAG_UNREACHABLE; } /* In principle, this flag specifies whether the peer groks uTP, not whether it's currently connected over uTP. */ if (io->utp_socket) atom->flags |= ADDED_F_UTP_FLAGS; if (atom->flags2 & MYFLAG_BANNED) { tordbg (s, "banned peer %s tried to reconnect", tr_atomAddrStr (atom)); } else if (tr_peerIoIsIncoming (io) && (getPeerCount (s) >= getMaxPeerCount (s->tor))) { } else { tr_peer * peer = atom->peer; if (peer) /* we already have this peer */ { } else { tr_quark client; tr_peerIo * io; char buf[128]; if (peer_id != NULL) client = tr_quark_new (tr_clientForId (buf, sizeof (buf), peer_id), TR_BAD_SIZE); else client = TR_KEY_NONE; io = tr_handshakeStealIO (handshake); /* this steals its refcount too, which is balanced by our unref in peerDelete () */ tr_peerIoSetParent (io, &s->tor->bandwidth); createBitTorrentPeer (s->tor, io, atom, client); success = true; } } } if (s != NULL) swarmUnlock (s); return success; } void tr_peerMgrAddIncoming (tr_peerMgr * manager, tr_address * addr, tr_port port, tr_socket_t socket, struct UTPSocket * utp_socket) { tr_session * session; managerLock (manager); assert (tr_isSession (manager->session)); session = manager->session; if (tr_sessionIsAddressBlocked (session, addr)) { tr_logAddDebug ("Banned IP address \"%s\" tried to connect to us", tr_address_to_string (addr)); if (socket != TR_BAD_SOCKET) tr_netClose (session, socket); else UTP_Close (utp_socket); } else if (getExistingHandshake (&manager->incomingHandshakes, addr)) { if (socket != TR_BAD_SOCKET) tr_netClose (session, socket); else UTP_Close (utp_socket); } else /* we don't have a connection to them yet... */ { tr_peerIo * io; tr_handshake * handshake; io = tr_peerIoNewIncoming (session, &session->bandwidth, addr, port, socket, utp_socket); handshake = tr_handshakeNew (io, session->encryptionMode, myHandshakeDoneCB, manager); tr_peerIoUnref (io); /* balanced by the implicit ref in tr_peerIoNewIncoming () */ tr_ptrArrayInsertSorted (&manager->incomingHandshakes, handshake, handshakeCompare); } managerUnlock (manager); } void tr_peerMgrAddPex (tr_torrent * tor, uint8_t from, const tr_pex * pex, int8_t seedProbability) { if (tr_isPex (pex)) /* safeguard against corrupt data */ { tr_swarm * s = tor->swarm; managerLock (s->manager); if (!tr_sessionIsAddressBlocked (s->manager->session, &pex->addr)) if (tr_address_is_valid_for_peers (&pex->addr, pex->port)) ensureAtomExists (s, &pex->addr, pex->port, pex->flags, seedProbability, from); managerUnlock (s->manager); } } void tr_peerMgrMarkAllAsSeeds (tr_torrent * tor) { tr_swarm * s = tor->swarm; const int n = tr_ptrArraySize (&s->pool); struct peer_atom ** it = (struct peer_atom**) tr_ptrArrayBase (&s->pool); struct peer_atom ** end = it + n; while (it != end) atomSetSeed (s, *it++); } tr_pex * tr_peerMgrCompactToPex (const void * compact, size_t compactLen, const uint8_t * added_f, size_t added_f_len, size_t * pexCount) { size_t i; size_t n = compactLen / 6; const uint8_t * walk = compact; tr_pex * pex = tr_new0 (tr_pex, n); for (i=0; iswarm; const uint32_t byteCount = tr_torPieceCountBytes (tor, pieceIndex); for (i=0, n=tr_ptrArraySize(&s->peers); i!=n; ++i) { tr_peer * peer = tr_ptrArrayNth (&s->peers, i); if (tr_bitfieldHas (&peer->blame, pieceIndex)) { tordbg (s, "peer %s contributed to corrupt piece (%d); now has %d strikes", tr_atomAddrStr(peer->atom), pieceIndex, (int)peer->strikes + 1); addStrike (s, peer); } } tr_announcerAddBytes (tor, TR_ANN_CORRUPT, byteCount); } int tr_pexCompare (const void * va, const void * vb) { int i; const tr_pex * a = va; const tr_pex * b = vb; assert (tr_isPex (a)); assert (tr_isPex (b)); if ((i = tr_address_compare (&a->addr, &b->addr))) return i; if (a->port != b->port) return a->port < b->port ? -1 : 1; return 0; } /* better goes first */ static int compareAtomsByUsefulness (const void * va, const void *vb) { const struct peer_atom * a = * (const struct peer_atom* const *) va; const struct peer_atom * b = * (const struct peer_atom* const *) vb; assert (tr_isAtom (a)); assert (tr_isAtom (b)); if (a->piece_data_time != b->piece_data_time) return a->piece_data_time > b->piece_data_time ? -1 : 1; if (a->fromBest != b->fromBest) return a->fromBest < b->fromBest ? -1 : 1; if (a->numFails != b->numFails) return a->numFails < b->numFails ? -1 : 1; return 0; } static bool isAtomInteresting (const tr_torrent * tor, struct peer_atom * atom) { if (tr_torrentIsSeed (tor) && atomIsSeed (atom)) return false; if (peerIsInUse (tor->swarm, atom)) return true; if (isAtomBlocklisted (tor->session, atom)) return false; if (atom->flags2 & MYFLAG_BANNED) return false; return true; } int tr_peerMgrGetPeers (tr_torrent * tor, tr_pex ** setme_pex, uint8_t af, uint8_t list_mode, int maxCount) { int i; int n; int count = 0; int atomCount = 0; const tr_swarm * s = tor->swarm; struct peer_atom ** atoms = NULL; tr_pex * pex; tr_pex * walk; assert (tr_isTorrent (tor)); assert (setme_pex != NULL); assert (af==TR_AF_INET || af==TR_AF_INET6); assert (list_mode==TR_PEERS_CONNECTED || list_mode==TR_PEERS_INTERESTING); managerLock (s->manager); /** *** build a list of atoms **/ if (list_mode == TR_PEERS_CONNECTED) /* connected peers only */ { int i; const tr_peer ** peers = (const tr_peer **) tr_ptrArrayBase (&s->peers); atomCount = tr_ptrArraySize (&s->peers); atoms = tr_new (struct peer_atom *, atomCount); for (i=0; iatom; } else /* TR_PEERS_INTERESTING */ { int i; struct peer_atom ** atomBase = (struct peer_atom**) tr_ptrArrayBase (&s->pool); n = tr_ptrArraySize (&s->pool); atoms = tr_new (struct peer_atom *, n); for (i=0; iaddr.type == af) { assert (tr_address_is_valid (&atom->addr)); walk->addr = atom->addr; walk->port = atom->port; walk->flags = atom->flags; ++count; ++walk; } } qsort (pex, count, sizeof (tr_pex), tr_pexCompare); assert ((walk - pex) == count); *setme_pex = pex; /* cleanup */ tr_free (atoms); managerUnlock (s->manager); return count; } static void atomPulse (evutil_socket_t, short, void *); static void bandwidthPulse (evutil_socket_t, short, void *); static void rechokePulse (evutil_socket_t, short, void *); static void reconnectPulse (evutil_socket_t, short, void *); static struct event * createTimer (tr_session * session, int msec, event_callback_fn callback, void * cbdata) { struct event * timer = evtimer_new (session->event_base, callback, cbdata); tr_timerAddMsec (timer, msec); return timer; } static void ensureMgrTimersExist (struct tr_peerMgr * m) { if (m->atomTimer == NULL) m->atomTimer = createTimer (m->session, ATOM_PERIOD_MSEC, atomPulse, m); if (m->bandwidthTimer == NULL) m->bandwidthTimer = createTimer (m->session, BANDWIDTH_PERIOD_MSEC, bandwidthPulse, m); if (m->rechokeTimer == NULL) m->rechokeTimer = createTimer (m->session, RECHOKE_PERIOD_MSEC, rechokePulse, m); if (m->refillUpkeepTimer == NULL) m->refillUpkeepTimer = createTimer (m->session, REFILL_UPKEEP_PERIOD_MSEC, refillUpkeep, m); } void tr_peerMgrStartTorrent (tr_torrent * tor) { tr_swarm * s; assert (tr_isTorrent (tor)); assert (tr_torrentIsLocked (tor)); s = tor->swarm; ensureMgrTimersExist (s->manager); s->isRunning = true; s->maxPeers = tor->maxConnectedPeers; s->pieceSortState = PIECES_UNSORTED; rechokePulse (0, 0, s->manager); } static void removeAllPeers (tr_swarm *); static void stopSwarm (tr_swarm * swarm) { swarm->isRunning = false; replicationFree (swarm); invalidatePieceSorting (swarm); removeAllPeers (swarm); /* disconnect the handshakes. handshakeAbort calls handshakeDoneCB (), * which removes the handshake from t->outgoingHandshakes... */ while (!tr_ptrArrayEmpty (&swarm->outgoingHandshakes)) tr_handshakeAbort (tr_ptrArrayNth (&swarm->outgoingHandshakes, 0)); } void tr_peerMgrStopTorrent (tr_torrent * tor) { assert (tr_isTorrent (tor)); assert (tr_torrentIsLocked (tor)); stopSwarm (tor->swarm); } void tr_peerMgrAddTorrent (tr_peerMgr * manager, tr_torrent * tor) { assert (tr_isTorrent (tor)); assert (tr_torrentIsLocked (tor)); assert (tor->swarm == NULL); tor->swarm = swarmNew (manager, tor); } void tr_peerMgrRemoveTorrent (tr_torrent * tor) { assert (tr_isTorrent (tor)); assert (tr_torrentIsLocked (tor)); stopSwarm (tor->swarm); swarmFree (tor->swarm); } void tr_peerUpdateProgress (tr_torrent * tor, tr_peer * peer) { const tr_bitfield * have = &peer->have; if (tr_bitfieldHasAll (have)) { peer->progress = 1.0; } else if (tr_bitfieldHasNone (have)) { peer->progress = 0.0; } else { const float true_count = tr_bitfieldCountTrueBits (have); if (tr_torrentHasMetadata (tor)) { peer->progress = true_count / tor->info.pieceCount; } else /* without pieceCount, this result is only a best guess... */ { peer->progress = true_count / (have->bit_count + 1); } } /* clamp the progress range */ if (peer->progress < 0.0) peer->progress = 0.0; if (peer->progress > 1.0) peer->progress = 1.0; if (peer->atom && (peer->progress >= 1.0)) atomSetSeed (tor->swarm, peer->atom); } void tr_peerMgrOnTorrentGotMetainfo (tr_torrent * tor) { int i; int peerCount; tr_peer ** peers; /* the webseed list may have changed... */ rebuildWebseedArray (tor->swarm, tor); /* some peer_msgs' progress fields may not be accurate if we didn't have the metadata before now... so refresh them all... */ peerCount = tr_ptrArraySize (&tor->swarm->peers); peers = (tr_peer**) tr_ptrArrayBase (&tor->swarm->peers); for (i=0; i 0); memset (tab, 0, tabCount); if (tr_torrentHasMetadata (tor)) { tr_piece_index_t i; const int peerCount = tr_ptrArraySize (&tor->swarm->peers); const tr_peer ** peers = (const tr_peer**) tr_ptrArrayBase (&tor->swarm->peers); const float interval = tor->info.pieceCount / (float)tabCount; const bool isSeed = tr_torrentGetCompleteness (tor) == TR_SEED; for (i=0; ihave, piece)) ++tab[i]; } } } } void tr_swarmGetStats (const tr_swarm * swarm, tr_swarm_stats * setme) { assert (swarm != NULL); assert (setme != NULL); *setme = swarm->stats; } void tr_swarmIncrementActivePeers (tr_swarm * swarm, tr_direction direction, bool is_active) { int n = swarm->stats.activePeerCount[direction]; if (is_active) ++n; else --n; assert (0 <= n); assert (n <= swarm->stats.peerCount); swarm->stats.activePeerCount[direction] = n; } bool tr_peerIsSeed (const tr_peer * peer) { if (peer->progress >= 1.0) return true; if (peer->atom && atomIsSeed (peer->atom)) return true; return false; } /* count how many bytes we want that connected peers have */ uint64_t tr_peerMgrGetDesiredAvailable (const tr_torrent * tor) { size_t i; size_t n; uint64_t desiredAvailable; const tr_swarm * s; assert (tr_isTorrent (tor)); /* common shortcuts... */ if (!tor->isRunning || tor->isStopping || tr_torrentIsSeed (tor) || !tr_torrentHasMetadata (tor)) return 0; s = tor->swarm; if (s == NULL || !s->isRunning) return 0; n = tr_ptrArraySize (&s->peers); if (n == 0) { return 0; } else { const tr_peer ** peers = (const tr_peer**) tr_ptrArrayBase (&s->peers); for (i=0; iatom && atomIsSeed (peers[i]->atom)) return tr_torrentGetLeftUntilDone (tor); } if (!s->pieceReplication || !s->pieceReplicationSize) return 0; /* do it the hard way */ desiredAvailable = 0; for (i=0, n=MIN (tor->info.pieceCount, s->pieceReplicationSize); iinfo.pieces[i].dnd && (s->pieceReplication[i] > 0)) desiredAvailable += tr_torrentMissingBytesInPiece (tor, i); assert (desiredAvailable <= tor->info.totalSize); return desiredAvailable; } double* tr_peerMgrWebSpeeds_KBps (const tr_torrent * tor) { unsigned int i; tr_swarm * s; unsigned int n; double * ret = NULL; const uint64_t now = tr_time_msec (); assert (tr_isTorrent (tor)); s = tor->swarm; n = tr_ptrArraySize (&s->webseeds); ret = tr_new0 (double, n); assert (s->manager != NULL); assert (n == tor->info.webseedCount); for (i=0; iwebseeds,i), now, TR_DOWN, &Bps)) ret[i] = Bps / (double)tr_speed_K; else ret[i] = -1.0; } return ret; } struct tr_peer_stat * tr_peerMgrPeerStats (const tr_torrent * tor, int * setmeCount) { int i; int size = 0; tr_peer_stat * ret; const tr_swarm * s; tr_peer ** peers; const time_t now = tr_time (); const uint64_t now_msec = tr_time_msec (); assert (tr_isTorrent (tor)); assert (tor->swarm->manager != NULL); s = tor->swarm; peers = (tr_peer**) tr_ptrArrayBase (&s->peers); size = tr_ptrArraySize (&s->peers); ret = tr_new0 (tr_peer_stat, size); for (i=0; iatom; tr_peer_stat * stat = ret + i; tr_address_to_string_with_buf (&atom->addr, stat->addr, sizeof (stat->addr)); tr_strlcpy (stat->client, tr_quark_get_string(peer->client,NULL), sizeof (stat->client)); stat->port = ntohs (peer->atom->port); stat->from = atom->fromFirst; stat->progress = peer->progress; stat->isUTP = tr_peerMsgsIsUtpConnection (msgs); stat->isEncrypted = tr_peerMsgsIsEncrypted (msgs); stat->rateToPeer_KBps = toSpeedKBps (tr_peerGetPieceSpeed_Bps (peer, now_msec, TR_CLIENT_TO_PEER)); stat->rateToClient_KBps = toSpeedKBps (tr_peerGetPieceSpeed_Bps (peer, now_msec, TR_PEER_TO_CLIENT)); stat->peerIsChoked = tr_peerMsgsIsPeerChoked (msgs); stat->peerIsInterested = tr_peerMsgsIsPeerInterested (msgs); stat->clientIsChoked = tr_peerMsgsIsClientChoked (msgs); stat->clientIsInterested = tr_peerMsgsIsClientInterested (msgs); stat->isIncoming = tr_peerMsgsIsIncomingConnection (msgs); stat->isDownloadingFrom = tr_peerMsgsIsActive (msgs, TR_PEER_TO_CLIENT); stat->isUploadingTo = tr_peerMsgsIsActive (msgs, TR_CLIENT_TO_PEER); stat->isSeed = tr_peerIsSeed (peer); stat->blocksToPeer = tr_historyGet (&peer->blocksSentToPeer, now, CANCEL_HISTORY_SEC); stat->blocksToClient = tr_historyGet (&peer->blocksSentToClient, now, CANCEL_HISTORY_SEC); stat->cancelsToPeer = tr_historyGet (&peer->cancelsSentToPeer, now, CANCEL_HISTORY_SEC); stat->cancelsToClient = tr_historyGet (&peer->cancelsSentToClient, now, CANCEL_HISTORY_SEC); stat->pendingReqsToPeer = peer->pendingReqsToPeer; stat->pendingReqsToClient = peer->pendingReqsToClient; pch = stat->flagStr; if (stat->isUTP) *pch++ = 'T'; if (s->optimistic == msgs) *pch++ = 'O'; if (stat->isDownloadingFrom) *pch++ = 'D'; else if (stat->clientIsInterested) *pch++ = 'd'; if (stat->isUploadingTo) *pch++ = 'U'; else if (stat->peerIsInterested) *pch++ = 'u'; if (!stat->clientIsChoked && !stat->clientIsInterested) *pch++ = 'K'; if (!stat->peerIsChoked && !stat->peerIsInterested) *pch++ = '?'; if (stat->isEncrypted) *pch++ = 'E'; if (stat->from == TR_PEER_FROM_DHT) *pch++ = 'H'; else if (stat->from == TR_PEER_FROM_PEX) *pch++ = 'X'; if (stat->isIncoming) *pch++ = 'I'; *pch = '\0'; } *setmeCount = size; return ret; } /*** **** **** ***/ void tr_peerMgrClearInterest (tr_torrent * tor) { int i; tr_swarm * s = tor->swarm; const int peerCount = tr_ptrArraySize (&s->peers); assert (tr_isTorrent (tor)); assert (tr_torrentIsLocked (tor)); for (i=0; ipeers, i), false); } /* does this peer have any pieces that we want? */ static bool isPeerInteresting (tr_torrent * const tor, const bool * const piece_is_interesting, const tr_peer * const peer) { tr_piece_index_t i, n; /* these cases should have already been handled by the calling code... */ assert (!tr_torrentIsSeed (tor)); assert (tr_torrentIsPieceTransferAllowed (tor, TR_PEER_TO_CLIENT)); if (tr_peerIsSeed (peer)) return true; for (i=0, n=tor->info.pieceCount; ihave, i)) return true; return false; } typedef enum { RECHOKE_STATE_GOOD, RECHOKE_STATE_UNTESTED, RECHOKE_STATE_BAD } tr_rechoke_state; struct tr_rechoke_info { tr_peer * peer; int salt; int rechoke_state; }; static int compare_rechoke_info (const void * va, const void * vb) { const struct tr_rechoke_info * a = va; const struct tr_rechoke_info * b = vb; if (a->rechoke_state != b->rechoke_state) return a->rechoke_state - b->rechoke_state; return a->salt - b->salt; } /* determines who we send "interested" messages to */ static void rechokeDownloads (tr_swarm * s) { int i; int maxPeers = 0; int rechoke_count = 0; struct tr_rechoke_info * rechoke = NULL; const int MIN_INTERESTING_PEERS = 5; const int peerCount = tr_ptrArraySize (&s->peers); const time_t now = tr_time (); /* some cases where this function isn't necessary */ if (tr_torrentIsSeed (s->tor)) return; if (!tr_torrentIsPieceTransferAllowed (s->tor, TR_PEER_TO_CLIENT)) return; /* decide HOW MANY peers to be interested in */ { int blocks = 0; int cancels = 0; time_t timeSinceCancel; /* Count up how many blocks & cancels each peer has. * * There are two situations where we send out cancels -- * * 1. We've got unresponsive peers, which is handled by deciding * -which- peers to be interested in. * * 2. We've hit our bandwidth cap, which is handled by deciding * -how many- peers to be interested in. * * We're working on 2. here, so we need to ignore unresponsive * peers in our calculations lest they confuse Transmission into * thinking it's hit its bandwidth cap. */ for (i=0; ipeers, i); const int b = tr_historyGet (&peer->blocksSentToClient, now, CANCEL_HISTORY_SEC); const int c = tr_historyGet (&peer->cancelsSentToPeer, now, CANCEL_HISTORY_SEC); if (b == 0) /* ignore unresponsive peers, as described above */ continue; blocks += b; cancels += c; } if (cancels > 0) { /* cancelRate: of the block requests we've recently made, the percentage we cancelled. * higher values indicate more congestion. */ const double cancelRate = cancels / (double)(cancels + blocks); const double mult = 1 - MIN (cancelRate, 0.5); maxPeers = s->interestedCount * mult; tordbg (s, "cancel rate is %.3f -- reducing the " "number of peers we're interested in by %.0f percent", cancelRate, mult * 100); s->lastCancel = now; } timeSinceCancel = now - s->lastCancel; if (timeSinceCancel) { const int maxIncrease = 15; const time_t maxHistory = 2 * CANCEL_HISTORY_SEC; const double mult = MIN (timeSinceCancel, maxHistory) / (double) maxHistory; const int inc = maxIncrease * mult; maxPeers = s->maxPeers + inc; tordbg (s, "time since last cancel is %jd -- increasing the " "number of peers we're interested in by %d", (intmax_t)timeSinceCancel, inc); } } /* don't let the previous section's number tweaking go too far... */ if (maxPeers < MIN_INTERESTING_PEERS) maxPeers = MIN_INTERESTING_PEERS; if (maxPeers > s->tor->maxConnectedPeers) maxPeers = s->tor->maxConnectedPeers; s->maxPeers = maxPeers; if (peerCount > 0) { bool * piece_is_interesting; const tr_torrent * const tor = s->tor; const int n = tor->info.pieceCount; /* build a bitfield of interesting pieces... */ piece_is_interesting = tr_new (bool, n); for (i=0; iinfo.pieces[i].dnd && !tr_torrentPieceIsComplete (tor, i); /* decide WHICH peers to be interested in (based on their cancel-to-block ratio) */ for (i=0; ipeers, i); if (!isPeerInteresting (s->tor, piece_is_interesting, peer)) { tr_peerMsgsSetInterested (PEER_MSGS(peer), false); } else { tr_rechoke_state rechoke_state; const int blocks = tr_historyGet (&peer->blocksSentToClient, now, CANCEL_HISTORY_SEC); const int cancels = tr_historyGet (&peer->cancelsSentToPeer, now, CANCEL_HISTORY_SEC); if (!blocks && !cancels) rechoke_state = RECHOKE_STATE_UNTESTED; else if (!cancels) rechoke_state = RECHOKE_STATE_GOOD; else if (!blocks) rechoke_state = RECHOKE_STATE_BAD; else if ((cancels * 10) < blocks) rechoke_state = RECHOKE_STATE_GOOD; else rechoke_state = RECHOKE_STATE_BAD; if (rechoke == NULL) rechoke = tr_new (struct tr_rechoke_info, peerCount); rechoke[rechoke_count].peer = peer; rechoke[rechoke_count].rechoke_state = rechoke_state; rechoke[rechoke_count].salt = tr_rand_int_weak (INT_MAX); rechoke_count++; } } tr_free (piece_is_interesting); } /* now that we know which & how many peers to be interested in... update the peer interest */ qsort (rechoke, rechoke_count, sizeof (struct tr_rechoke_info), compare_rechoke_info); s->interestedCount = MIN (maxPeers, rechoke_count); for (i=0; iinterestedCount); /* cleanup */ tr_free (rechoke); } /** *** **/ struct ChokeData { bool isInterested; bool wasChoked; bool isChoked; int rate; int salt; tr_peerMsgs * msgs; }; static int compareChoke (const void * va, const void * vb) { const struct ChokeData * a = va; const struct ChokeData * b = vb; if (a->rate != b->rate) /* prefer higher overall speeds */ return a->rate > b->rate ? -1 : 1; if (a->wasChoked != b->wasChoked) /* prefer unchoked */ return a->wasChoked ? 1 : -1; if (a->salt != b->salt) /* random order */ return a->salt - b->salt; return 0; } /* is this a new connection? */ static bool isNew (const tr_peerMsgs * msgs) { return (msgs != NULL) && (tr_peerMsgsGetConnectionAge (msgs) < 45); } /* get a rate for deciding which peers to choke and unchoke. */ static int getRate (const tr_torrent * tor, struct peer_atom * atom, uint64_t now) { unsigned int Bps; if (tr_torrentIsSeed (tor)) Bps = tr_peerGetPieceSpeed_Bps (atom->peer, now, TR_CLIENT_TO_PEER); /* downloading a private torrent... take upload speed into account * because there may only be a small window of opportunity to share */ else if (tr_torrentIsPrivate (tor)) Bps = tr_peerGetPieceSpeed_Bps (atom->peer, now, TR_PEER_TO_CLIENT) + tr_peerGetPieceSpeed_Bps (atom->peer, now, TR_CLIENT_TO_PEER); /* downloading a public torrent */ else Bps = tr_peerGetPieceSpeed_Bps (atom->peer, now, TR_PEER_TO_CLIENT); /* convert it to bytes per second */ return Bps; } static inline bool isBandwidthMaxedOut (const tr_bandwidth * b, const uint64_t now_msec, tr_direction dir) { if (!tr_bandwidthIsLimited (b, dir)) { return false; } else { const unsigned int got = tr_bandwidthGetPieceSpeed_Bps (b, now_msec, dir); const unsigned int want = tr_bandwidthGetDesiredSpeed_Bps (b, dir); return got >= want; } } static void rechokeUploads (tr_swarm * s, const uint64_t now) { int i, size, unchokedInterested; const int peerCount = tr_ptrArraySize (&s->peers); tr_peer ** peers = (tr_peer**) tr_ptrArrayBase (&s->peers); struct ChokeData * choke = tr_new0 (struct ChokeData, peerCount); const tr_session * session = s->manager->session; const bool chokeAll = !tr_torrentIsPieceTransferAllowed (s->tor, TR_CLIENT_TO_PEER); const bool isMaxedOut = isBandwidthMaxedOut (&s->tor->bandwidth, now, TR_UP); assert (swarmIsLocked (s)); /* an optimistic unchoke peer's "optimistic" * state lasts for N calls to rechokeUploads (). */ if (s->optimisticUnchokeTimeScaler > 0) s->optimisticUnchokeTimeScaler--; else s->optimistic = NULL; /* sort the peers by preference and rate */ for (i=0, size=0; iatom; if (tr_peerIsSeed (peer)) /* choke seeds and partial seeds */ { tr_peerMsgsSetChoke (PEER_MSGS(peer), true); } else if (chokeAll) /* choke everyone if we're not uploading */ { tr_peerMsgsSetChoke (PEER_MSGS(peer), true); } else if (msgs != s->optimistic) { struct ChokeData * n = &choke[size++]; n->msgs = msgs; n->isInterested = tr_peerMsgsIsPeerInterested (msgs); n->wasChoked = tr_peerMsgsIsPeerChoked (msgs); n->rate = getRate (s->tor, atom, now); n->salt = tr_rand_int_weak (INT_MAX); n->isChoked = true; } } qsort (choke, size, sizeof (struct ChokeData), compareChoke); /** * Reciprocation and number of uploads capping is managed by unchoking * the N peers which have the best upload rate and are interested. * This maximizes the client's download rate. These N peers are * referred to as downloaders, because they are interested in downloading * from the client. * * Peers which have a better upload rate (as compared to the downloaders) * but aren't interested get unchoked. If they become interested, the * downloader with the worst upload rate gets choked. If a client has * a complete file, it uses its upload rate rather than its download * rate to decide which peers to unchoke. * * If our bandwidth is maxed out, don't unchoke any more peers. */ unchokedInterested = 0; for (i=0; iuploadSlotsPerTorrent; ++i) { choke[i].isChoked = isMaxedOut ? choke[i].wasChoked : false; if (choke[i].isInterested) ++unchokedInterested; } /* optimistic unchoke */ if (!s->optimistic && !isMaxedOut && (iisChoked = false; s->optimistic = c->msgs; s->optimisticUnchokeTimeScaler = OPTIMISTIC_UNCHOKE_MULTIPLIER; } tr_ptrArrayDestruct (&randPool, NULL); } for (i=0; isession, tor))) { if (tor->isRunning) { tr_swarm * s = tor->swarm; if (s->stats.peerCount > 0) { rechokeUploads (s, now); rechokeDownloads (s); } } } tr_timerAddMsec (mgr->rechokeTimer, RECHOKE_PERIOD_MSEC); managerUnlock (mgr); } /*** **** **** Life and Death **** ***/ static bool shouldPeerBeClosed (const tr_swarm * s, const tr_peer * peer, int peerCount, const time_t now) { const tr_torrent * tor = s->tor; const struct peer_atom * atom = peer->atom; /* if it's marked for purging, close it */ if (peer->doPurge) { tordbg (s, "purging peer %s because its doPurge flag is set", tr_atomAddrStr (atom)); return true; } /* disconnect if we're both seeds and enough time has passed for PEX */ if (tr_torrentIsSeed (tor) && tr_peerIsSeed (peer)) return !tr_torrentAllowsPex (tor) || (now-atom->time>=30); /* disconnect if it's been too long since piece data has been transferred. * this is on a sliding scale based on number of available peers... */ { const int relaxStrictnessIfFewerThanN = (int)((getMaxPeerCount (tor) * 0.9) + 0.5); /* if we have >= relaxIfFewerThan, strictness is 100%. * if we have zero connections, strictness is 0% */ const float strictness = peerCount >= relaxStrictnessIfFewerThanN ? 1.0 : peerCount / (float)relaxStrictnessIfFewerThanN; const int lo = MIN_UPLOAD_IDLE_SECS; const int hi = MAX_UPLOAD_IDLE_SECS; const int limit = hi - ((hi - lo) * strictness); const int idleTime = now - MAX (atom->time, atom->piece_data_time); /*fprintf (stderr, "strictness is %.3f, limit is %d seconds... time since connect is %d, time since piece is %d ... idleTime is %d, doPurge is %d\n", (double)strictness, limit, (int)(now - atom->time), (int)(now - atom->piece_data_time), idleTime, idleTime > limit);*/ if (idleTime > limit) { tordbg (s, "purging peer %s because it's been %d secs since we shared anything", tr_atomAddrStr (atom), idleTime); return true; } } return false; } static tr_peer ** getPeersToClose (tr_swarm * s, const time_t now_sec, int * setmeSize) { int i, peerCount, outsize; struct tr_peer ** ret = NULL; tr_peer ** peers = (tr_peer**) tr_ptrArrayPeek (&s->peers, &peerCount); assert (swarmIsLocked (s)); for (i=outsize=0; iflags2 & MYFLAG_UNREACHABLE) != 0; /* if we were recently connected to this peer and transferring piece * data, try to reconnect to them sooner rather that later -- we don't * want network troubles to get in the way of a good peer. */ if (!unreachable && ((now - atom->piece_data_time) <= (MINIMUM_RECONNECT_INTERVAL_SECS * 2))) sec = MINIMUM_RECONNECT_INTERVAL_SECS; /* otherwise, the interval depends on how many times we've tried * and failed to connect to the peer */ else { int step = atom->numFails; /* penalize peers that were unreachable the last time we tried */ if (unreachable) step += 2; switch (step) { case 0: sec = 0; break; case 1: sec = 10; break; case 2: sec = 60 * 2; break; case 3: sec = 60 * 15; break; case 4: sec = 60 * 30; break; case 5: sec = 60 * 60; break; default: sec = 60 * 120; break; } } dbgmsg ("reconnect interval for %s is %d seconds", tr_atomAddrStr (atom), sec); return sec; } static void removePeer (tr_swarm * s, tr_peer * peer) { struct peer_atom * atom = peer->atom; assert (swarmIsLocked (s)); assert (atom); atom->time = tr_time (); tr_ptrArrayRemoveSortedPointer (&s->peers, peer, peerCompare); --s->stats.peerCount; --s->stats.peerFromCount[atom->fromFirst]; if (replicationExists (s)) tr_decrReplicationFromBitfield (s, &peer->have); assert (s->stats.peerCount == tr_ptrArraySize (&s->peers)); assert (s->stats.peerFromCount[atom->fromFirst] >= 0); tr_peerFree (peer); } static void closePeer (tr_swarm * s, tr_peer * peer) { struct peer_atom * atom; assert (s != NULL); assert (peer != NULL); atom = peer->atom; /* if we transferred piece data, then they might be good peers, so reset their `numFails' weight to zero. otherwise we connected to them fruitlessly, so mark it as another fail */ if (atom->piece_data_time) { tordbg (s, "resetting atom %s numFails to 0", tr_atomAddrStr (atom)); atom->numFails = 0; } else { ++atom->numFails; tordbg (s, "incremented atom %s numFails to %d", tr_atomAddrStr (atom), (int)atom->numFails); } tordbg (s, "removing bad peer %s", tr_atomAddrStr (peer->atom)); removePeer (s, peer); } static void removeAllPeers (tr_swarm * s) { while (!tr_ptrArrayEmpty (&s->peers)) removePeer (s, tr_ptrArrayNth (&s->peers, 0)); assert (!s->stats.peerCount); } static void closeBadPeers (tr_swarm * s, const time_t now_sec) { if (!tr_ptrArrayEmpty (&s->peers)) { int i; int peerCount; struct tr_peer ** peers; peers = getPeersToClose (s, now_sec, &peerCount); for (i=0; idoPurge != b->doPurge) return a->doPurge ? 1 : -1; if (a->speed != b->speed) /* faster goes first */ return a->speed > b->speed ? -1 : 1; /* the one to give us data more recently goes first */ if (a->pieceDataTime != b->pieceDataTime) return a->pieceDataTime > b->pieceDataTime ? -1 : 1; /* the one we connected to most recently goes first */ if (a->time != b->time) return a->time > b->time ? -1 : 1; return 0; } static void sortPeersByLivelinessImpl (tr_peer ** peers, void ** clientData, int n, uint64_t now, int (*compare)(const void *va, const void *vb)) { int i; struct peer_liveliness *lives, *l; /* build a sortable array of peer + extra info */ lives = l = tr_new0 (struct peer_liveliness, n); for (i=0; ipeer = p; l->doPurge = p->doPurge; l->pieceDataTime = p->atom->piece_data_time; l->time = p->atom->time; l->speed = tr_peerGetPieceSpeed_Bps (p, now, TR_UP) + tr_peerGetPieceSpeed_Bps (p, now, TR_DOWN); if (clientData) l->clientData = clientData[i]; } /* sort 'em */ assert (n == (l - lives)); qsort (lives, n, sizeof (struct peer_liveliness), compare); /* build the peer array */ for (i=0, l=lives; ipeer; if (clientData) clientData[i] = l->clientData; } assert (n == (l - lives)); /* cleanup */ tr_free (lives); } static void sortPeersByLiveliness (tr_peer ** peers, void ** clientData, int n, uint64_t now) { sortPeersByLivelinessImpl (peers, clientData, n, now, comparePeerLiveliness); } static void enforceTorrentPeerLimit (tr_swarm * s, uint64_t now) { int n = tr_ptrArraySize (&s->peers); const int max = tr_torrentGetPeerLimit (s->tor); if (n > max) { void * base = tr_ptrArrayBase (&s->peers); tr_peer ** peers = tr_memdup (base, n*sizeof (tr_peer*)); sortPeersByLiveliness (peers, NULL, n, now); while (n > max) closePeer (s, peers[--n]); tr_free (peers); } } static void enforceSessionPeerLimit (tr_session * session, uint64_t now) { int n = 0; tr_torrent * tor = NULL; const int max = tr_sessionGetPeerLimit (session); /* count the total number of peers */ while ((tor = tr_torrentNext (session, tor))) n += tr_ptrArraySize (&tor->swarm->peers); /* if there are too many, prune out the worst */ if (n > max) { tr_peer ** peers = tr_new (tr_peer*, n); tr_swarm ** swarms = tr_new (tr_swarm*, n); /* populate the peer array */ n = 0; tor = NULL; while ((tor = tr_torrentNext (session, tor))) { int i; tr_swarm * s = tor->swarm; const int tn = tr_ptrArraySize (&s->peers); for (i=0; ipeers, i); swarms[n] = s; } } /* sort 'em */ sortPeersByLiveliness (peers, (void**)swarms, n, now); /* cull out the crappiest */ while (n-- > max) closePeer (swarms[n], peers[n]); /* cleanup */ tr_free (swarms); tr_free (peers); } } static void makeNewPeerConnections (tr_peerMgr * mgr, const int max); static void reconnectPulse (evutil_socket_t foo UNUSED, short bar UNUSED, void * vmgr) { tr_torrent * tor; tr_peerMgr * mgr = vmgr; const time_t now_sec = tr_time (); const uint64_t now_msec = tr_time_msec (); /** *** enforce the per-session and per-torrent peer limits **/ /* if we're over the per-torrent peer limits, cull some peers */ tor = NULL; while ((tor = tr_torrentNext (mgr->session, tor))) if (tor->isRunning) enforceTorrentPeerLimit (tor->swarm, now_msec); /* if we're over the per-session peer limits, cull some peers */ enforceSessionPeerLimit (mgr->session, now_msec); /* remove crappy peers */ tor = NULL; while ((tor = tr_torrentNext (mgr->session, tor))) if (!tor->swarm->isRunning) removeAllPeers (tor->swarm); else closeBadPeers (tor->swarm, now_sec); /* try to make new peer connections */ makeNewPeerConnections (mgr, MAX_CONNECTIONS_PER_PULSE); } /**** ***** ***** BANDWIDTH ALLOCATION ***** ****/ static void pumpAllPeers (tr_peerMgr * mgr) { tr_torrent * tor = NULL; while ((tor = tr_torrentNext (mgr->session, tor))) { int j; tr_swarm * s = tor->swarm; for (j=0; jpeers); ++j) tr_peerMsgsPulse (tr_ptrArrayNth (&s->peers, j)); } } static void queuePulseForeach (void * vtor) { tr_torrent * tor = vtor; tr_torrentStartNow (tor); if (tor->queue_started_callback != NULL) (*tor->queue_started_callback)(tor, tor->queue_started_user_data); } static void queuePulse (tr_session * session, tr_direction dir) { assert (tr_isSession (session)); assert (tr_isDirection (dir)); if (tr_sessionGetQueueEnabled (session, dir)) { tr_ptrArray torrents = TR_PTR_ARRAY_INIT; tr_sessionGetNextQueuedTorrents (session, dir, tr_sessionCountQueueFreeSlots (session, dir), &torrents); tr_ptrArrayForeach (&torrents, queuePulseForeach); tr_ptrArrayDestruct (&torrents, NULL); } } static void bandwidthPulse (evutil_socket_t foo UNUSED, short bar UNUSED, void * vmgr) { tr_torrent * tor; tr_peerMgr * mgr = vmgr; tr_session * session = mgr->session; managerLock (mgr); /* FIXME: this next line probably isn't necessary... */ pumpAllPeers (mgr); /* allocate bandwidth to the peers */ tr_bandwidthAllocate (&session->bandwidth, TR_UP, BANDWIDTH_PERIOD_MSEC); tr_bandwidthAllocate (&session->bandwidth, TR_DOWN, BANDWIDTH_PERIOD_MSEC); /* torrent upkeep */ tor = NULL; while ((tor = tr_torrentNext (session, tor))) { /* possibly stop torrents that have seeded enough */ tr_torrentCheckSeedLimit (tor); /* run the completeness check for any torrents that need it */ if (tor->swarm->needsCompletenessCheck) { tor->swarm->needsCompletenessCheck = false; tr_torrentRecheckCompleteness (tor); } /* stop torrents that are ready to stop, but couldn't be stopped earlier during the peer-io callback call chain */ if (tor->isStopping) tr_torrentStop (tor); /* update the torrent's stats */ tor->swarm->stats.activeWebseedCount = countActiveWebseeds (tor->swarm); } /* pump the queues */ queuePulse (session, TR_UP); queuePulse (session, TR_DOWN); reconnectPulse (0, 0, mgr); tr_timerAddMsec (mgr->bandwidthTimer, BANDWIDTH_PERIOD_MSEC); managerUnlock (mgr); } /*** **** ***/ static int compareAtomPtrsByAddress (const void * va, const void *vb) { const struct peer_atom * a = * (const struct peer_atom* const *) va; const struct peer_atom * b = * (const struct peer_atom* const *) vb; assert (tr_isAtom (a)); assert (tr_isAtom (b)); return tr_address_compare (&a->addr, &b->addr); } /* best come first, worst go last */ static int compareAtomPtrsByShelfDate (const void * va, const void *vb) { time_t atime; time_t btime; const struct peer_atom * a = * (const struct peer_atom* const *) va; const struct peer_atom * b = * (const struct peer_atom* const *) vb; const int data_time_cutoff_secs = 60 * 60; const time_t tr_now = tr_time (); assert (tr_isAtom (a)); assert (tr_isAtom (b)); /* primary key: the last piece data time *if* it was within the last hour */ atime = a->piece_data_time; if (atime + data_time_cutoff_secs < tr_now) atime = 0; btime = b->piece_data_time; if (btime + data_time_cutoff_secs < tr_now) btime = 0; if (atime != btime) return atime > btime ? -1 : 1; /* secondary key: shelf date. */ if (a->shelf_date != b->shelf_date) return a->shelf_date > b->shelf_date ? -1 : 1; return 0; } static int getMaxAtomCount (const tr_torrent * tor) { return MIN (50, tor->maxConnectedPeers * 3); } static void atomPulse (evutil_socket_t foo UNUSED, short bar UNUSED, void * vmgr) { tr_torrent * tor = NULL; tr_peerMgr * mgr = vmgr; managerLock (mgr); while ((tor = tr_torrentNext (mgr->session, tor))) { int atomCount; tr_swarm * s = tor->swarm; const int maxAtomCount = getMaxAtomCount (tor); struct peer_atom ** atoms = (struct peer_atom**) tr_ptrArrayPeek (&s->pool, &atomCount); if (atomCount > maxAtomCount) /* we've got too many atoms... time to prune */ { int i; int keepCount = 0; int testCount = 0; struct peer_atom ** keep = tr_new (struct peer_atom*, atomCount); struct peer_atom ** test = tr_new (struct peer_atom*, atomCount); /* keep the ones that are in use */ for (i=0; ipool, NULL); s->pool = TR_PTR_ARRAY_INIT; qsort (keep, keepCount, sizeof (struct peer_atom *), compareAtomPtrsByAddress); for (i=0; ipool, keep[i]); tordbg (s, "max atom count is %d... pruned from %d to %d\n", maxAtomCount, atomCount, keepCount); /* cleanup */ tr_free (test); tr_free (keep); } } tr_timerAddMsec (mgr->atomTimer, ATOM_PERIOD_MSEC); managerUnlock (mgr); } /*** **** **** **** ***/ /* is this atom someone that we'd want to initiate a connection to? */ static bool isPeerCandidate (const tr_torrent * tor, struct peer_atom * atom, const time_t now) { /* not if we're both seeds */ if (tr_torrentIsSeed (tor) && atomIsSeed (atom)) return false; /* not if we've already got a connection to them... */ if (peerIsInUse (tor->swarm, atom)) return false; /* not if we just tried them already */ if ((now - atom->time) < getReconnectIntervalSecs (atom, now)) return false; /* not if they're blocklisted */ if (isAtomBlocklisted (tor->session, atom)) return false; /* not if they're banned... */ if (atom->flags2 & MYFLAG_BANNED) return false; return true; } struct peer_candidate { uint64_t score; tr_torrent * tor; struct peer_atom * atom; }; static bool torrentWasRecentlyStarted (const tr_torrent * tor) { return difftime (tr_time (), tor->startDate) < 120; } static inline uint64_t addValToKey (uint64_t value, int width, uint64_t addme) { value = (value << (uint64_t)width); value |= addme; return value; } /* smaller value is better */ static uint64_t getPeerCandidateScore (const tr_torrent * tor, const struct peer_atom * atom, uint8_t salt) { uint64_t i; uint64_t score = 0; const bool failed = atom->lastConnectionAt < atom->lastConnectionAttemptAt; /* prefer peers we've connected to, or never tried, over peers we failed to connect to. */ i = failed ? 1 : 0; score = addValToKey (score, 1, i); /* prefer the one we attempted least recently (to cycle through all peers) */ i = atom->lastConnectionAttemptAt; score = addValToKey (score, 32, i); /* prefer peers belonging to a torrent of a higher priority */ switch (tr_torrentGetPriority (tor)) { case TR_PRI_HIGH: i = 0; break; case TR_PRI_NORMAL: i = 1; break; case TR_PRI_LOW: i = 2; break; } score = addValToKey (score, 4, i); /* prefer recently-started torrents */ i = torrentWasRecentlyStarted (tor) ? 0 : 1; score = addValToKey (score, 1, i); /* prefer torrents we're downloading with */ i = tr_torrentIsSeed (tor) ? 1 : 0; score = addValToKey (score, 1, i); /* prefer peers that are known to be connectible */ i = (atom->flags & ADDED_F_CONNECTABLE) ? 0 : 1; score = addValToKey (score, 1, i); /* prefer peers that we might have a chance of uploading to... so lower seed probability is better */ if (atom->seedProbability == 100) i = 101; else if (atom->seedProbability == -1) i = 100; else i = atom->seedProbability; score = addValToKey (score, 8, i); /* Prefer peers that we got from more trusted sources. * lower `fromBest' values indicate more trusted sources */ score = addValToKey (score, 4, atom->fromBest); /* salt */ score = addValToKey (score, 8, salt); return score; } static int comparePeerCandidates (const void * va, const void * vb) { int ret; const struct peer_candidate * a = va; const struct peer_candidate * b = vb; if (a->score < b->score) ret = -1; else if (a->score > b->score) ret = 1; else ret = 0; return ret; } /* Partial sorting -- selecting the k best candidates Adapted from http://en.wikipedia.org/wiki/Selection_algorithm */ static void selectPeerCandidates (struct peer_candidate * candidates, int candidate_count, int select_count) { tr_quickfindFirstK (candidates, candidate_count, sizeof(struct peer_candidate), comparePeerCandidates, select_count); } #ifndef NDEBUG static bool checkBestScoresComeFirst (const struct peer_candidate * candidates, int n, int k) { int i; uint64_t worstFirstScore = 0; const int x = MIN (n, k) - 1; for (i=0; i= worstFirstScore); return true; } #endif /* NDEBUG */ /** @return an array of all the atoms we might want to connect to */ static struct peer_candidate* getPeerCandidates (tr_session * session, int * candidateCount, int max) { int atomCount; int peerCount; tr_torrent * tor; struct peer_candidate * candidates; struct peer_candidate * walk; const time_t now = tr_time (); const uint64_t now_msec = tr_time_msec (); /* leave 5% of connection slots for incoming connections -- ticket #2609 */ const int maxCandidates = tr_sessionGetPeerLimit (session) * 0.95; /* count how many peers and atoms we've got */ tor= NULL; atomCount = 0; peerCount = 0; while ((tor = tr_torrentNext (session, tor))) { atomCount += tr_ptrArraySize (&tor->swarm->pool); peerCount += tr_ptrArraySize (&tor->swarm->peers); } /* don't start any new handshakes if we're full up */ if (maxCandidates <= peerCount) { *candidateCount = 0; return NULL; } /* allocate an array of candidates */ walk = candidates = tr_new (struct peer_candidate, atomCount); /* populate the candidate array */ tor = NULL; while ((tor = tr_torrentNext (session, tor))) { int i, nAtoms; struct peer_atom ** atoms; if (!tor->swarm->isRunning) continue; /* if we've already got enough peers in this torrent... */ if (tr_torrentGetPeerLimit (tor) <= tr_ptrArraySize (&tor->swarm->peers)) continue; /* if we've already got enough speed in this torrent... */ if (tr_torrentIsSeed (tor) && isBandwidthMaxedOut (&tor->bandwidth, now_msec, TR_UP)) continue; atoms = (struct peer_atom**) tr_ptrArrayPeek (&tor->swarm->pool, &nAtoms); for (i=0; itor = tor; walk->atom = atom; walk->score = getPeerCandidateScore (tor, atom, salt); ++walk; } } } *candidateCount = walk - candidates; if (walk != candidates) selectPeerCandidates (candidates, walk-candidates, max); assert (checkBestScoresComeFirst (candidates, *candidateCount, max)); return candidates; } static void initiateConnection (tr_peerMgr * mgr, tr_swarm * s, struct peer_atom * atom) { tr_peerIo * io; const time_t now = tr_time (); bool utp = tr_sessionIsUTPEnabled (mgr->session) && !atom->utp_failed; if (atom->fromFirst == TR_PEER_FROM_PEX) /* PEX has explicit signalling for uTP support. If an atom originally came from PEX and doesn't have the uTP flag, skip the uTP connection attempt. Are we being optimistic here? */ utp = utp && (atom->flags & ADDED_F_UTP_FLAGS); tordbg (s, "Starting an OUTGOING%s connection with %s", utp ? " µTP" : "", tr_atomAddrStr (atom)); io = tr_peerIoNewOutgoing (mgr->session, &mgr->session->bandwidth, &atom->addr, atom->port, s->tor->info.hash, s->tor->completeness == TR_SEED, utp); if (io == NULL) { tordbg (s, "peerIo not created; marking peer %s as unreachable", tr_atomAddrStr (atom)); atom->flags2 |= MYFLAG_UNREACHABLE; atom->numFails++; } else { tr_handshake * handshake = tr_handshakeNew (io, mgr->session->encryptionMode, myHandshakeDoneCB, mgr); assert (tr_peerIoGetTorrentHash (io)); tr_peerIoUnref (io); /* balanced by the initial ref in tr_peerIoNewOutgoing () */ tr_ptrArrayInsertSorted (&s->outgoingHandshakes, handshake, handshakeCompare); } atom->lastConnectionAttemptAt = now; atom->time = now; } static void initiateCandidateConnection (tr_peerMgr * mgr, struct peer_candidate * c) { #if 0 fprintf (stderr, "Starting an OUTGOING connection with %s - [%s] seedProbability==%d; %s, %s\n", tr_atomAddrStr (c->atom), tr_torrentName (c->tor), (int)c->atom->seedProbability, tr_torrentIsPrivate (c->tor) ? "private" : "public", tr_torrentIsSeed (c->tor) ? "seed" : "downloader"); #endif initiateConnection (mgr, c->tor->swarm, c->atom); } static void makeNewPeerConnections (struct tr_peerMgr * mgr, const int max) { int i, n; struct peer_candidate * candidates; candidates = getPeerCandidates (mgr->session, &n, max); for (i=0; i #include #include /* NAME_MAX */ #include /* realloc () */ #include /* close () */ #include #include #include #define __LIBTRANSMISSION_WATCHDIR_MODULE__ #include "transmission.h" #include "log.h" #include "utils.h" #include "watchdir.h" #include "watchdir-common.h" /*** **** ***/ #define log_error(...) (!tr_logLevelIsActive (TR_LOG_ERROR) ? (void) 0 : \ tr_logAddMessage (__FILE__, __LINE__, TR_LOG_ERROR, "watchdir:inotify", __VA_ARGS__)) /*** **** ***/ typedef struct tr_watchdir_inotify { tr_watchdir_backend base; int infd; int inwd; struct bufferevent * event; } tr_watchdir_inotify; #define BACKEND_UPCAST(b) ((tr_watchdir_inotify *) (b)) #define INOTIFY_WATCH_MASK (IN_CLOSE_WRITE | IN_MOVED_TO | IN_CREATE) /*** **** ***/ static void tr_watchdir_inotify_on_first_scan (evutil_socket_t fd UNUSED, short type UNUSED, void * context) { const tr_watchdir_t handle = context; tr_watchdir_scan (handle, NULL); } static void tr_watchdir_inotify_on_event (struct bufferevent * event, void * context) { assert (context != NULL); const tr_watchdir_t handle = context; tr_watchdir_inotify * const backend = BACKEND_UPCAST (tr_watchdir_get_backend (handle)); struct inotify_event ev; size_t nread; size_t name_size = NAME_MAX + 1; char * name = tr_new (char, name_size); /* Read the size of the struct excluding name into buf. Guaranteed to have at least sizeof (ev) available */ while ((nread = bufferevent_read (event, &ev, sizeof (ev))) != 0) { if (nread == (size_t) -1) { log_error ("Failed to read inotify event: %s", tr_strerror (errno)); break; } if (nread != sizeof (ev)) { log_error ("Failed to read inotify event: expected %zu, got %zu bytes.", sizeof (ev), nread); break; } assert (ev.wd == backend->inwd); assert ((ev.mask & INOTIFY_WATCH_MASK) != 0); assert (ev.len > 0); if (ev.len > name_size) { name_size = ev.len; name = tr_renew (char, name, name_size); } /* Consume entire name into buffer */ if ((nread = bufferevent_read (event, name, ev.len)) == (size_t) -1) { log_error ("Failed to read inotify name: %s", tr_strerror (errno)); break; } if (nread != ev.len) { log_error ("Failed to read inotify name: expected %" PRIu32 ", got %zu bytes.", ev.len, nread); break; } tr_watchdir_process (handle, name); } tr_free (name); } static void tr_watchdir_inotify_free (tr_watchdir_backend * backend_base) { tr_watchdir_inotify * const backend = BACKEND_UPCAST (backend_base); if (backend == NULL) return; assert (backend->base.free_func == &tr_watchdir_inotify_free); if (backend->event != NULL) { bufferevent_disable (backend->event, EV_READ); bufferevent_free (backend->event); } if (backend->infd != -1) { if (backend->inwd != -1) inotify_rm_watch (backend->infd, backend->inwd); close (backend->infd); } tr_free (backend); } tr_watchdir_backend * tr_watchdir_inotify_new (tr_watchdir_t handle) { const char * const path = tr_watchdir_get_path (handle); tr_watchdir_inotify * backend; backend = tr_new0 (tr_watchdir_inotify, 1); backend->base.free_func = &tr_watchdir_inotify_free; backend->infd = -1; backend->inwd = -1; if ((backend->infd = inotify_init ()) == -1) { log_error ("Unable to inotify_init: %s", tr_strerror (errno)); goto fail; } if ((backend->inwd = inotify_add_watch (backend->infd, path, INOTIFY_WATCH_MASK | IN_ONLYDIR)) == -1) { log_error ("Failed to setup watchdir \"%s\": %s (%d)", path, tr_strerror (errno), errno); goto fail; } if ((backend->event = bufferevent_socket_new (tr_watchdir_get_event_base (handle), backend->infd, 0)) == NULL) { log_error ("Failed to create event buffer: %s", tr_strerror (errno)); goto fail; } /* Guarantees at least the sizeof an inotify event will be available in the event buffer */ bufferevent_setwatermark (backend->event, EV_READ, sizeof (struct inotify_event), 0); bufferevent_setcb (backend->event, &tr_watchdir_inotify_on_event, NULL, NULL, handle); bufferevent_enable (backend->event, EV_READ); /* Perform an initial scan on the directory */ if (event_base_once (tr_watchdir_get_event_base (handle), -1, EV_TIMEOUT, &tr_watchdir_inotify_on_first_scan, handle, NULL) == -1) log_error ("Failed to perform initial scan: %s", tr_strerror (errno)); return BACKEND_DOWNCAST (backend); fail: tr_watchdir_inotify_free (BACKEND_DOWNCAST (backend)); return NULL; } transmission-2.92/libtransmission/PaxHeaders.4960/peer-msgs.h0000644000000000000000000000013212442116602021147 xustar0030 mtime=1418239362.911222238 30 atime=1418239362.911222238 30 ctime=1457295919.735803411 transmission-2.92/libtransmission/peer-msgs.h0000644000175000017500000000657612442116602022612 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: peer-msgs.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_PEER_MSGS_H #define TR_PEER_MSGS_H #include #include "peer-common.h" struct tr_address; struct tr_bitfield; struct tr_peer; struct tr_peerIo; struct tr_torrent; /** * @addtogroup peers Peers * @{ */ typedef struct tr_peerMsgs tr_peerMsgs; #define PEER_MSGS(o) (tr_peerMsgsCast(o)) bool tr_isPeerMsgs (const void * msgs); tr_peerMsgs* tr_peerMsgsCast (void * msgs); tr_peerMsgs* tr_peerMsgsNew (struct tr_torrent * torrent, struct tr_peerIo * io, tr_peer_callback callback, void * callback_data); bool tr_peerMsgsIsPeerChoked (const tr_peerMsgs * msgs); bool tr_peerMsgsIsPeerInterested (const tr_peerMsgs * msgs); bool tr_peerMsgsIsClientChoked (const tr_peerMsgs * msgs); bool tr_peerMsgsIsClientInterested (const tr_peerMsgs * msgs); bool tr_peerMsgsIsActive (const tr_peerMsgs * msgs, tr_direction direction); void tr_peerMsgsUpdateActive (tr_peerMsgs * msgs, tr_direction direction); time_t tr_peerMsgsGetConnectionAge (const tr_peerMsgs * msgs); bool tr_peerMsgsIsUtpConnection (const tr_peerMsgs * msgs); bool tr_peerMsgsIsEncrypted (const tr_peerMsgs * msgs); bool tr_peerMsgsIsIncomingConnection (const tr_peerMsgs * msgs); void tr_peerMsgsSetChoke (tr_peerMsgs * msgs, bool peerIsChoked); int tr_peerMsgsIsReadingBlock (const tr_peerMsgs * msgs, tr_block_index_t block); void tr_peerMsgsSetInterested (tr_peerMsgs * msgs, bool clientIsInterested); void tr_peerMsgsHave (tr_peerMsgs * msgs, uint32_t pieceIndex); void tr_peerMsgsPulse (tr_peerMsgs * msgs); void tr_peerMsgsCancel (tr_peerMsgs * msgs, tr_block_index_t block); size_t tr_generateAllowedSet (tr_piece_index_t * setmePieces, size_t desiredSetSize, size_t pieceCount, const uint8_t * infohash, const struct tr_address * addr); /* @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/file.c0000644000000000000000000000013212512316670020164 xustar0030 mtime=1428790712.698181122 30 atime=1428790712.698181122 30 ctime=1457295920.005808003 transmission-2.92/libtransmission/file.c0000644000175000017500000000550412512316670021615 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: file.c 14493 2015-04-11 14:54:01Z mikedld $ */ #include #include /* strlen () */ #include "transmission.h" #include "error.h" #include "file.h" #include "utils.h" bool tr_sys_file_read_line (tr_sys_file_t handle, char * buffer, size_t buffer_size, tr_error ** error) { bool ret = false; size_t offset = 0; uint64_t bytes_read; assert (handle != TR_BAD_SYS_FILE); assert (buffer != NULL); assert (buffer_size > 0); while (buffer_size > 0) { size_t i; bool found_eol = false; ret = tr_sys_file_read (handle, buffer + offset, MIN(buffer_size, 1024u), &bytes_read, error); if (!ret || (offset == 0 && bytes_read == 0)) { ret = false; break; } for (i = 0; i < bytes_read; ++i, ++offset, --buffer_size) { if (buffer[offset] == '\n') { found_eol = true; break; } } if (found_eol || buffer_size == 0 || bytes_read == 0) { const int64_t delta = -(int64_t) bytes_read + i + (found_eol ? 1 : 0); if (delta != 0) { ret = tr_sys_file_seek (handle, delta, TR_SEEK_CUR, NULL, error); if (!ret) break; } if (offset > 0 && buffer[offset - 1] == '\r') buffer[offset - 1] = '\0'; else buffer[offset] = '\0'; break; } } return ret; } bool tr_sys_file_write_line (tr_sys_file_t handle, const char * buffer, tr_error ** error) { bool ret; assert (handle != TR_BAD_SYS_FILE); assert (buffer != NULL); ret = tr_sys_file_write (handle, buffer, strlen (buffer), NULL, error); if (ret) ret = tr_sys_file_write (handle, TR_NATIVE_EOL_STR, TR_NATIVE_EOL_STR_SIZE, NULL, error); return ret; } bool tr_sys_file_write_fmt (tr_sys_file_t handle, const char * format, tr_error ** error, ...) { bool ret = false; char * buffer; va_list args; assert (handle != TR_BAD_SYS_FILE); assert (format != NULL); va_start (args, error); buffer = tr_strdup_vprintf (format, args); va_end (args); if (buffer != NULL) { ret = tr_sys_file_write (handle, buffer, strlen (buffer), NULL, error); tr_free (buffer); } else { tr_error_set_literal (error, 0, "Unable to format message."); } return ret; } transmission-2.92/libtransmission/PaxHeaders.4960/Makefile.in0000644000000000000000000000013212667111010021136 xustar0030 mtime=1457295880.044128501 30 atime=1457295880.044128501 30 ctime=1457295919.908806353 transmission-2.92/libtransmission/Makefile.in0000644000175000017500000022410312667111010022565 0ustar00mikedldmikedld00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @USE_INOTIFY_TRUE@am__append_1 = watchdir-inotify.c @USE_INOTIFY_TRUE@am__append_2 = -DWITH_INOTIFY @USE_KQUEUE_TRUE@am__append_3 = watchdir-kqueue.c @USE_KQUEUE_TRUE@am__append_4 = -DWITH_KQUEUE @WIN32_TRUE@am__append_5 = file-win32.c watchdir-win32.c @WIN32_FALSE@am__append_6 = file-posix.c @CRYPTO_USE_OPENSSL_TRUE@am__append_7 = crypto-utils-openssl.c @CRYPTO_USE_CYASSL_TRUE@am__append_8 = crypto-utils-cyassl.c @CRYPTO_USE_POLARSSL_TRUE@am__append_9 = crypto-utils-polarssl.c TESTS = bitfield-test$(EXEEXT) blocklist-test$(EXEEXT) \ clients-test$(EXEEXT) crypto-test$(EXEEXT) error-test$(EXEEXT) \ file-test$(EXEEXT) history-test$(EXEEXT) json-test$(EXEEXT) \ magnet-test$(EXEEXT) makemeta-test$(EXEEXT) \ metainfo-test$(EXEEXT) move-test$(EXEEXT) \ peer-msgs-test$(EXEEXT) quark-test$(EXEEXT) \ rename-test$(EXEEXT) rpc-test$(EXEEXT) session-test$(EXEEXT) \ tr-getopt-test$(EXEEXT) utils-test$(EXEEXT) \ variant-test$(EXEEXT) watchdir-test$(EXEEXT) \ watchdir-generic-test$(EXEEXT) noinst_PROGRAMS = $(am__EXEEXT_1) subdir = libtransmission ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx-pthread.m4 \ $(top_srcdir)/m4/glib-gettext.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libtransmission_a_AR = $(AR) $(ARFLAGS) libtransmission_a_LIBADD = am__libtransmission_a_SOURCES_DIST = announcer.c announcer-http.c \ announcer-udp.c bandwidth.c bitfield.c blocklist.c cache.c \ clients.c completion.c ConvertUTF.c crypto.c crypto-utils.c \ crypto-utils-fallback.c error.c fdlimit.c file.c handshake.c \ history.c inout.c list.c log.c magnet.c makemeta.c metainfo.c \ natpmp.c net.c peer-io.c peer-mgr.c peer-msgs.c platform.c \ platform-quota.c port-forwarding.c ptrarray.c quark.c resume.c \ rpcimpl.c rpc-server.c session.c stats.c torrent.c \ torrent-ctor.c torrent-magnet.c tr-dht.c tr-lpd.c tr-udp.c \ tr-utp.c tr-getopt.c trevent.c upnp.c utils.c variant.c \ variant-benc.c variant-json.c verify.c watchdir.c \ watchdir-generic.c web.c webseed.c wildmat.c \ watchdir-inotify.c watchdir-kqueue.c file-win32.c \ watchdir-win32.c file-posix.c crypto-utils-openssl.c \ crypto-utils-cyassl.c crypto-utils-polarssl.c @USE_INOTIFY_TRUE@am__objects_1 = watchdir-inotify.$(OBJEXT) @USE_KQUEUE_TRUE@am__objects_2 = watchdir-kqueue.$(OBJEXT) @WIN32_TRUE@am__objects_3 = file-win32.$(OBJEXT) \ @WIN32_TRUE@ watchdir-win32.$(OBJEXT) @WIN32_FALSE@am__objects_4 = file-posix.$(OBJEXT) @CRYPTO_USE_OPENSSL_TRUE@am__objects_5 = \ @CRYPTO_USE_OPENSSL_TRUE@ crypto-utils-openssl.$(OBJEXT) @CRYPTO_USE_CYASSL_TRUE@am__objects_6 = crypto-utils-cyassl.$(OBJEXT) @CRYPTO_USE_POLARSSL_TRUE@am__objects_7 = \ @CRYPTO_USE_POLARSSL_TRUE@ crypto-utils-polarssl.$(OBJEXT) am_libtransmission_a_OBJECTS = announcer.$(OBJEXT) \ announcer-http.$(OBJEXT) announcer-udp.$(OBJEXT) \ bandwidth.$(OBJEXT) bitfield.$(OBJEXT) blocklist.$(OBJEXT) \ cache.$(OBJEXT) clients.$(OBJEXT) completion.$(OBJEXT) \ ConvertUTF.$(OBJEXT) crypto.$(OBJEXT) crypto-utils.$(OBJEXT) \ crypto-utils-fallback.$(OBJEXT) error.$(OBJEXT) \ fdlimit.$(OBJEXT) file.$(OBJEXT) handshake.$(OBJEXT) \ history.$(OBJEXT) inout.$(OBJEXT) list.$(OBJEXT) log.$(OBJEXT) \ magnet.$(OBJEXT) makemeta.$(OBJEXT) metainfo.$(OBJEXT) \ natpmp.$(OBJEXT) net.$(OBJEXT) peer-io.$(OBJEXT) \ peer-mgr.$(OBJEXT) peer-msgs.$(OBJEXT) platform.$(OBJEXT) \ platform-quota.$(OBJEXT) port-forwarding.$(OBJEXT) \ ptrarray.$(OBJEXT) quark.$(OBJEXT) resume.$(OBJEXT) \ rpcimpl.$(OBJEXT) rpc-server.$(OBJEXT) session.$(OBJEXT) \ stats.$(OBJEXT) torrent.$(OBJEXT) torrent-ctor.$(OBJEXT) \ torrent-magnet.$(OBJEXT) tr-dht.$(OBJEXT) tr-lpd.$(OBJEXT) \ tr-udp.$(OBJEXT) tr-utp.$(OBJEXT) tr-getopt.$(OBJEXT) \ trevent.$(OBJEXT) upnp.$(OBJEXT) utils.$(OBJEXT) \ variant.$(OBJEXT) variant-benc.$(OBJEXT) \ variant-json.$(OBJEXT) verify.$(OBJEXT) watchdir.$(OBJEXT) \ watchdir-generic.$(OBJEXT) web.$(OBJEXT) webseed.$(OBJEXT) \ wildmat.$(OBJEXT) $(am__objects_1) $(am__objects_2) \ $(am__objects_3) $(am__objects_4) $(am__objects_5) \ $(am__objects_6) $(am__objects_7) libtransmission_a_OBJECTS = $(am_libtransmission_a_OBJECTS) am__EXEEXT_1 = bitfield-test$(EXEEXT) blocklist-test$(EXEEXT) \ clients-test$(EXEEXT) crypto-test$(EXEEXT) error-test$(EXEEXT) \ file-test$(EXEEXT) history-test$(EXEEXT) json-test$(EXEEXT) \ magnet-test$(EXEEXT) makemeta-test$(EXEEXT) \ metainfo-test$(EXEEXT) move-test$(EXEEXT) \ peer-msgs-test$(EXEEXT) quark-test$(EXEEXT) \ rename-test$(EXEEXT) rpc-test$(EXEEXT) session-test$(EXEEXT) \ tr-getopt-test$(EXEEXT) utils-test$(EXEEXT) \ variant-test$(EXEEXT) watchdir-test$(EXEEXT) \ watchdir-generic-test$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) am__objects_8 = libtransmission-test.$(OBJEXT) am_bitfield_test_OBJECTS = bitfield-test.$(OBJEXT) $(am__objects_8) bitfield_test_OBJECTS = $(am_bitfield_test_OBJECTS) am__DEPENDENCIES_1 = am__DEPENDENCIES_2 = ./libtransmission.a $(am__DEPENDENCIES_1) bitfield_test_DEPENDENCIES = $(am__DEPENDENCIES_2) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = bitfield_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(bitfield_test_LDFLAGS) $(LDFLAGS) -o $@ am_blocklist_test_OBJECTS = blocklist-test.$(OBJEXT) $(am__objects_8) blocklist_test_OBJECTS = $(am_blocklist_test_OBJECTS) blocklist_test_DEPENDENCIES = $(am__DEPENDENCIES_2) blocklist_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(blocklist_test_LDFLAGS) $(LDFLAGS) -o \ $@ am_clients_test_OBJECTS = clients-test.$(OBJEXT) $(am__objects_8) clients_test_OBJECTS = $(am_clients_test_OBJECTS) clients_test_DEPENDENCIES = $(am__DEPENDENCIES_2) clients_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(clients_test_LDFLAGS) $(LDFLAGS) -o $@ am_crypto_test_OBJECTS = crypto-test.$(OBJEXT) $(am__objects_8) crypto_test_OBJECTS = $(am_crypto_test_OBJECTS) crypto_test_DEPENDENCIES = $(am__DEPENDENCIES_2) crypto_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(crypto_test_LDFLAGS) $(LDFLAGS) -o $@ am_error_test_OBJECTS = error-test.$(OBJEXT) $(am__objects_8) error_test_OBJECTS = $(am_error_test_OBJECTS) error_test_DEPENDENCIES = $(am__DEPENDENCIES_2) error_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(error_test_LDFLAGS) $(LDFLAGS) -o $@ am_file_test_OBJECTS = file-test.$(OBJEXT) $(am__objects_8) file_test_OBJECTS = $(am_file_test_OBJECTS) file_test_DEPENDENCIES = $(am__DEPENDENCIES_2) file_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(file_test_LDFLAGS) $(LDFLAGS) -o $@ am_history_test_OBJECTS = history-test.$(OBJEXT) $(am__objects_8) history_test_OBJECTS = $(am_history_test_OBJECTS) history_test_DEPENDENCIES = $(am__DEPENDENCIES_2) history_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(history_test_LDFLAGS) $(LDFLAGS) -o $@ am_json_test_OBJECTS = json-test.$(OBJEXT) $(am__objects_8) json_test_OBJECTS = $(am_json_test_OBJECTS) json_test_DEPENDENCIES = $(am__DEPENDENCIES_2) json_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(json_test_LDFLAGS) $(LDFLAGS) -o $@ am_magnet_test_OBJECTS = magnet-test.$(OBJEXT) $(am__objects_8) magnet_test_OBJECTS = $(am_magnet_test_OBJECTS) magnet_test_DEPENDENCIES = $(am__DEPENDENCIES_2) magnet_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(magnet_test_LDFLAGS) $(LDFLAGS) -o $@ am_makemeta_test_OBJECTS = makemeta-test.$(OBJEXT) $(am__objects_8) makemeta_test_OBJECTS = $(am_makemeta_test_OBJECTS) makemeta_test_DEPENDENCIES = $(am__DEPENDENCIES_2) makemeta_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(makemeta_test_LDFLAGS) $(LDFLAGS) -o $@ am_metainfo_test_OBJECTS = metainfo-test.$(OBJEXT) $(am__objects_8) metainfo_test_OBJECTS = $(am_metainfo_test_OBJECTS) metainfo_test_DEPENDENCIES = $(am__DEPENDENCIES_2) metainfo_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(metainfo_test_LDFLAGS) $(LDFLAGS) -o $@ am_move_test_OBJECTS = move-test.$(OBJEXT) $(am__objects_8) move_test_OBJECTS = $(am_move_test_OBJECTS) move_test_DEPENDENCIES = $(am__DEPENDENCIES_2) move_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(move_test_LDFLAGS) $(LDFLAGS) -o $@ am_peer_msgs_test_OBJECTS = peer-msgs-test.$(OBJEXT) $(am__objects_8) peer_msgs_test_OBJECTS = $(am_peer_msgs_test_OBJECTS) peer_msgs_test_DEPENDENCIES = $(am__DEPENDENCIES_2) peer_msgs_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(peer_msgs_test_LDFLAGS) $(LDFLAGS) -o \ $@ am_quark_test_OBJECTS = quark-test.$(OBJEXT) $(am__objects_8) quark_test_OBJECTS = $(am_quark_test_OBJECTS) quark_test_DEPENDENCIES = $(am__DEPENDENCIES_2) quark_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(quark_test_LDFLAGS) $(LDFLAGS) -o $@ am_rename_test_OBJECTS = rename-test.$(OBJEXT) $(am__objects_8) rename_test_OBJECTS = $(am_rename_test_OBJECTS) rename_test_DEPENDENCIES = $(am__DEPENDENCIES_2) rename_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(rename_test_LDFLAGS) $(LDFLAGS) -o $@ am_rpc_test_OBJECTS = rpc-test.$(OBJEXT) $(am__objects_8) rpc_test_OBJECTS = $(am_rpc_test_OBJECTS) rpc_test_DEPENDENCIES = $(am__DEPENDENCIES_2) rpc_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(rpc_test_LDFLAGS) $(LDFLAGS) -o $@ am_session_test_OBJECTS = session-test.$(OBJEXT) $(am__objects_8) session_test_OBJECTS = $(am_session_test_OBJECTS) session_test_DEPENDENCIES = $(am__DEPENDENCIES_2) session_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(session_test_LDFLAGS) $(LDFLAGS) -o $@ am_tr_getopt_test_OBJECTS = tr-getopt-test.$(OBJEXT) $(am__objects_8) tr_getopt_test_OBJECTS = $(am_tr_getopt_test_OBJECTS) tr_getopt_test_DEPENDENCIES = $(am__DEPENDENCIES_2) tr_getopt_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(tr_getopt_test_LDFLAGS) $(LDFLAGS) -o \ $@ am_utils_test_OBJECTS = utils-test.$(OBJEXT) $(am__objects_8) utils_test_OBJECTS = $(am_utils_test_OBJECTS) utils_test_DEPENDENCIES = $(am__DEPENDENCIES_2) utils_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(utils_test_LDFLAGS) $(LDFLAGS) -o $@ am_variant_test_OBJECTS = variant-test.$(OBJEXT) $(am__objects_8) variant_test_OBJECTS = $(am_variant_test_OBJECTS) variant_test_DEPENDENCIES = $(am__DEPENDENCIES_2) variant_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(variant_test_LDFLAGS) $(LDFLAGS) -o $@ am__objects_9 = watchdir_generic_test-libtransmission-test.$(OBJEXT) am_watchdir_generic_test_OBJECTS = \ watchdir_generic_test-watchdir-test.$(OBJEXT) $(am__objects_9) watchdir_generic_test_OBJECTS = $(am_watchdir_generic_test_OBJECTS) watchdir_generic_test_DEPENDENCIES = $(am__DEPENDENCIES_2) watchdir_generic_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(watchdir_generic_test_LDFLAGS) \ $(LDFLAGS) -o $@ am_watchdir_test_OBJECTS = watchdir-test.$(OBJEXT) $(am__objects_8) watchdir_test_OBJECTS = $(am_watchdir_test_OBJECTS) watchdir_test_DEPENDENCIES = $(am__DEPENDENCIES_2) watchdir_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(watchdir_test_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libtransmission_a_SOURCES) $(bitfield_test_SOURCES) \ $(blocklist_test_SOURCES) $(clients_test_SOURCES) \ $(crypto_test_SOURCES) $(error_test_SOURCES) \ $(file_test_SOURCES) $(history_test_SOURCES) \ $(json_test_SOURCES) $(magnet_test_SOURCES) \ $(makemeta_test_SOURCES) $(metainfo_test_SOURCES) \ $(move_test_SOURCES) $(peer_msgs_test_SOURCES) \ $(quark_test_SOURCES) $(rename_test_SOURCES) \ $(rpc_test_SOURCES) $(session_test_SOURCES) \ $(tr_getopt_test_SOURCES) $(utils_test_SOURCES) \ $(variant_test_SOURCES) $(watchdir_generic_test_SOURCES) \ $(watchdir_test_SOURCES) DIST_SOURCES = $(am__libtransmission_a_SOURCES_DIST) \ $(bitfield_test_SOURCES) $(blocklist_test_SOURCES) \ $(clients_test_SOURCES) $(crypto_test_SOURCES) \ $(error_test_SOURCES) $(file_test_SOURCES) \ $(history_test_SOURCES) $(json_test_SOURCES) \ $(magnet_test_SOURCES) $(makemeta_test_SOURCES) \ $(metainfo_test_SOURCES) $(move_test_SOURCES) \ $(peer_msgs_test_SOURCES) $(quark_test_SOURCES) \ $(rename_test_SOURCES) $(rpc_test_SOURCES) \ $(session_test_SOURCES) $(tr_getopt_test_SOURCES) \ $(utils_test_SOURCES) $(variant_test_SOURCES) \ $(watchdir_generic_test_SOURCES) $(watchdir_test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTO_CFLAGS = @CRYPTO_CFLAGS@ CRYPTO_LIBS = @CRYPTO_LIBS@ CRYPTO_PKG = @CRYPTO_PKG@ CURL_MINIMUM = @CURL_MINIMUM@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYASSL_CFLAGS = @CYASSL_CFLAGS@ CYASSL_LIBS = @CYASSL_LIBS@ CYASSL_MINIMUM = @CYASSL_MINIMUM@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DHT_CFLAGS = @DHT_CFLAGS@ DHT_LIBS = @DHT_LIBS@ DHT_LIBS_QT = @DHT_LIBS_QT@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_MINIMUM = @GIO_MINIMUM@ GLIB_MINIMUM = @GLIB_MINIMUM@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MINIMUM = @GTK_MINIMUM@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAPPINDICATOR_CFLAGS = @LIBAPPINDICATOR_CFLAGS@ LIBAPPINDICATOR_LIBS = @LIBAPPINDICATOR_LIBS@ LIBAPPINDICATOR_MINIMUM = @LIBAPPINDICATOR_MINIMUM@ LIBB64_CFLAGS = @LIBB64_CFLAGS@ LIBB64_LIBS = @LIBB64_LIBS@ LIBB64_LIBS_QT = @LIBB64_LIBS_QT@ LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ LIBEVENT_CFLAGS = @LIBEVENT_CFLAGS@ LIBEVENT_LIBS = @LIBEVENT_LIBS@ LIBEVENT_MINIMUM = @LIBEVENT_MINIMUM@ LIBM = @LIBM@ LIBNATPMP_CFLAGS = @LIBNATPMP_CFLAGS@ LIBNATPMP_LIBS = @LIBNATPMP_LIBS@ LIBNATPMP_LIBS_QT = @LIBNATPMP_LIBS_QT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LIBUPNP_LIBS_QT = @LIBUPNP_LIBS_QT@ LIBUTP_CFLAGS = @LIBUTP_CFLAGS@ LIBUTP_LIBS = @LIBUTP_LIBS@ LIBUTP_LIBS_QT = @LIBUTP_LIBS_QT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENSSL_CFLAGS = @OPENSSL_CFLAGS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OPENSSL_MINIMUM = @OPENSSL_MINIMUM@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PEERID_PREFIX = @PEERID_PREFIX@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POLARSSL_MINIMUM = @POLARSSL_MINIMUM@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SYSTEMD_DAEMON_CFLAGS = @SYSTEMD_DAEMON_CFLAGS@ SYSTEMD_DAEMON_LIBS = @SYSTEMD_DAEMON_LIBS@ USERAGENT_PREFIX = @USERAGENT_PREFIX@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ WOLFSSL_CFLAGS = @WOLFSSL_CFLAGS@ WOLFSSL_LIBS = @WOLFSSL_LIBS@ XGETTEXT = @XGETTEXT@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ ZLIB_MINIMUM = @ZLIB_MINIMUM@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ transmissionlocaledir = @transmissionlocaledir@ AM_CPPFLAGS = -I$(top_srcdir) -D__TRANSMISSION__ \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" $(am__append_2) \ $(am__append_4) AM_CFLAGS = \ @DHT_CFLAGS@ \ @LIBB64_CFLAGS@ \ @LIBUTP_CFLAGS@ \ @LIBUPNP_CFLAGS@ \ @LIBNATPMP_CFLAGS@ \ @LIBEVENT_CFLAGS@ \ @LIBCURL_CFLAGS@ \ @CRYPTO_CFLAGS@ \ @PTHREAD_CFLAGS@ \ @ZLIB_CFLAGS@ noinst_LIBRARIES = libtransmission.a libtransmission_a_SOURCES = announcer.c announcer-http.c \ announcer-udp.c bandwidth.c bitfield.c blocklist.c cache.c \ clients.c completion.c ConvertUTF.c crypto.c crypto-utils.c \ crypto-utils-fallback.c error.c fdlimit.c file.c handshake.c \ history.c inout.c list.c log.c magnet.c makemeta.c metainfo.c \ natpmp.c net.c peer-io.c peer-mgr.c peer-msgs.c platform.c \ platform-quota.c port-forwarding.c ptrarray.c quark.c resume.c \ rpcimpl.c rpc-server.c session.c stats.c torrent.c \ torrent-ctor.c torrent-magnet.c tr-dht.c tr-lpd.c tr-udp.c \ tr-utp.c tr-getopt.c trevent.c upnp.c utils.c variant.c \ variant-benc.c variant-json.c verify.c watchdir.c \ watchdir-generic.c web.c webseed.c wildmat.c $(am__append_1) \ $(am__append_3) $(am__append_5) $(am__append_6) \ $(am__append_7) $(am__append_8) $(am__append_9) noinst_HEADERS = \ announcer.h \ announcer-common.h \ bandwidth.h \ bitfield.h \ blocklist.h \ cache.h \ clients.h \ ConvertUTF.h \ crypto.h \ crypto-utils.h \ completion.h \ error.h \ error-types.h \ fdlimit.h \ file.h \ handshake.h \ history.h \ inout.h \ jsonsl.c \ jsonsl.h \ libtransmission-test.h \ list.h \ log.h \ magnet.h \ makemeta.h \ metainfo.h \ natpmp_local.h \ net.h \ peer-common.h \ peer-io.h \ peer-mgr.h \ peer-msgs.h \ platform.h \ platform-quota.h \ port-forwarding.h \ ptrarray.h \ quark.h \ resume.h \ rpcimpl.h \ rpc-server.h \ session.h \ stats.h \ torrent.h \ torrent-magnet.h \ tr-getopt.h \ transmission.h \ tr-dht.h \ tr-udp.h \ tr-utp.h \ tr-lpd.h \ trevent.h \ upnp.h \ utils.h \ variant.h \ variant-common.h \ verify.h \ version.h \ watchdir.h \ watchdir-common.h \ web.h \ webseed.h apps_ldadd = \ ./libtransmission.a \ @LIBUPNP_LIBS@ \ @LIBNATPMP_LIBS@ \ @INTLLIBS@ \ @DHT_LIBS@ \ @LIBB64_LIBS@ \ @LIBUTP_LIBS@ \ @LIBCURL_LIBS@ \ @LIBEVENT_LIBS@ \ @CRYPTO_LIBS@ \ @PTHREAD_LIBS@ \ @ZLIB_LIBS@ \ ${LIBM} TEST_SOURCES = libtransmission-test.c bitfield_test_SOURCES = bitfield-test.c $(TEST_SOURCES) bitfield_test_LDADD = ${apps_ldadd} bitfield_test_LDFLAGS = ${apps_ldflags} blocklist_test_SOURCES = blocklist-test.c $(TEST_SOURCES) blocklist_test_LDADD = ${apps_ldadd} blocklist_test_LDFLAGS = ${apps_ldflags} clients_test_SOURCES = clients-test.c $(TEST_SOURCES) clients_test_LDADD = ${apps_ldadd} clients_test_LDFLAGS = ${apps_ldflags} crypto_test_SOURCES = crypto-test.c crypto-test-ref.h $(TEST_SOURCES) crypto_test_LDADD = ${apps_ldadd} crypto_test_LDFLAGS = ${apps_ldflags} error_test_SOURCES = error-test.c $(TEST_SOURCES) error_test_LDADD = ${apps_ldadd} error_test_LDFLAGS = ${apps_ldflags} file_test_SOURCES = file-test.c $(TEST_SOURCES) file_test_LDADD = ${apps_ldadd} file_test_LDFLAGS = ${apps_ldflags} history_test_SOURCES = history-test.c $(TEST_SOURCES) history_test_LDADD = ${apps_ldadd} history_test_LDFLAGS = ${apps_ldflags} json_test_SOURCES = json-test.c $(TEST_SOURCES) json_test_LDADD = ${apps_ldadd} json_test_LDFLAGS = ${apps_ldflags} quark_test_SOURCES = quark-test.c $(TEST_SOURCES) quark_test_LDADD = ${apps_ldadd} quark_test_LDFLAGS = ${apps_ldflags} magnet_test_SOURCES = magnet-test.c $(TEST_SOURCES) magnet_test_LDADD = ${apps_ldadd} magnet_test_LDFLAGS = ${apps_ldflags} metainfo_test_SOURCES = metainfo-test.c $(TEST_SOURCES) metainfo_test_LDADD = ${apps_ldadd} metainfo_test_LDFLAGS = ${apps_ldflags} makemeta_test_SOURCES = makemeta-test.c $(TEST_SOURCES) makemeta_test_LDADD = ${apps_ldadd} makemeta_test_LDFLAGS = ${apps_ldflags} move_test_SOURCES = move-test.c $(TEST_SOURCES) move_test_LDADD = ${apps_ldadd} move_test_LDFLAGS = ${apps_ldflags} peer_msgs_test_SOURCES = peer-msgs-test.c $(TEST_SOURCES) peer_msgs_test_LDADD = ${apps_ldadd} peer_msgs_test_LDFLAGS = ${apps_ldflags} rpc_test_SOURCES = rpc-test.c $(TEST_SOURCES) rpc_test_LDADD = ${apps_ldadd} rpc_test_LDFLAGS = ${apps_ldflags} session_test_SOURCES = session-test.c $(TEST_SOURCES) session_test_LDADD = ${apps_ldadd} session_test_LDFLAGS = ${apps_ldflags} tr_getopt_test_SOURCES = tr-getopt-test.c $(TEST_SOURCES) tr_getopt_test_LDADD = ${apps_ldadd} tr_getopt_test_LDFLAGS = ${apps_ldflags} utils_test_SOURCES = utils-test.c $(TEST_SOURCES) utils_test_LDADD = ${apps_ldadd} utils_test_LDFLAGS = ${apps_ldflags} variant_test_SOURCES = variant-test.c $(TEST_SOURCES) variant_test_LDADD = ${apps_ldadd} variant_test_LDFLAGS = ${apps_ldflags} watchdir_test_SOURCES = watchdir-test.c $(TEST_SOURCES) watchdir_test_LDADD = ${apps_ldadd} watchdir_test_LDFLAGS = ${apps_ldflags} watchdir_generic_test_SOURCES = watchdir-test.c $(TEST_SOURCES) watchdir_generic_test_LDADD = ${apps_ldadd} watchdir_generic_test_LDFLAGS = ${apps_ldflags} watchdir_generic_test_CPPFLAGS = -DWATCHDIR_TEST_FORCE_GENERIC $(AM_CPPFLAGS) rename_test_SOURCES = rename-test.c $(TEST_SOURCES) rename_test_LDADD = ${apps_ldadd} rename_test_LDFLAGS = ${apps_ldflags} all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libtransmission/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu libtransmission/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libtransmission.a: $(libtransmission_a_OBJECTS) $(libtransmission_a_DEPENDENCIES) $(EXTRA_libtransmission_a_DEPENDENCIES) $(AM_V_at)-rm -f libtransmission.a $(AM_V_AR)$(libtransmission_a_AR) libtransmission.a $(libtransmission_a_OBJECTS) $(libtransmission_a_LIBADD) $(AM_V_at)$(RANLIB) libtransmission.a clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list bitfield-test$(EXEEXT): $(bitfield_test_OBJECTS) $(bitfield_test_DEPENDENCIES) $(EXTRA_bitfield_test_DEPENDENCIES) @rm -f bitfield-test$(EXEEXT) $(AM_V_CCLD)$(bitfield_test_LINK) $(bitfield_test_OBJECTS) $(bitfield_test_LDADD) $(LIBS) blocklist-test$(EXEEXT): $(blocklist_test_OBJECTS) $(blocklist_test_DEPENDENCIES) $(EXTRA_blocklist_test_DEPENDENCIES) @rm -f blocklist-test$(EXEEXT) $(AM_V_CCLD)$(blocklist_test_LINK) $(blocklist_test_OBJECTS) $(blocklist_test_LDADD) $(LIBS) clients-test$(EXEEXT): $(clients_test_OBJECTS) $(clients_test_DEPENDENCIES) $(EXTRA_clients_test_DEPENDENCIES) @rm -f clients-test$(EXEEXT) $(AM_V_CCLD)$(clients_test_LINK) $(clients_test_OBJECTS) $(clients_test_LDADD) $(LIBS) crypto-test$(EXEEXT): $(crypto_test_OBJECTS) $(crypto_test_DEPENDENCIES) $(EXTRA_crypto_test_DEPENDENCIES) @rm -f crypto-test$(EXEEXT) $(AM_V_CCLD)$(crypto_test_LINK) $(crypto_test_OBJECTS) $(crypto_test_LDADD) $(LIBS) error-test$(EXEEXT): $(error_test_OBJECTS) $(error_test_DEPENDENCIES) $(EXTRA_error_test_DEPENDENCIES) @rm -f error-test$(EXEEXT) $(AM_V_CCLD)$(error_test_LINK) $(error_test_OBJECTS) $(error_test_LDADD) $(LIBS) file-test$(EXEEXT): $(file_test_OBJECTS) $(file_test_DEPENDENCIES) $(EXTRA_file_test_DEPENDENCIES) @rm -f file-test$(EXEEXT) $(AM_V_CCLD)$(file_test_LINK) $(file_test_OBJECTS) $(file_test_LDADD) $(LIBS) history-test$(EXEEXT): $(history_test_OBJECTS) $(history_test_DEPENDENCIES) $(EXTRA_history_test_DEPENDENCIES) @rm -f history-test$(EXEEXT) $(AM_V_CCLD)$(history_test_LINK) $(history_test_OBJECTS) $(history_test_LDADD) $(LIBS) json-test$(EXEEXT): $(json_test_OBJECTS) $(json_test_DEPENDENCIES) $(EXTRA_json_test_DEPENDENCIES) @rm -f json-test$(EXEEXT) $(AM_V_CCLD)$(json_test_LINK) $(json_test_OBJECTS) $(json_test_LDADD) $(LIBS) magnet-test$(EXEEXT): $(magnet_test_OBJECTS) $(magnet_test_DEPENDENCIES) $(EXTRA_magnet_test_DEPENDENCIES) @rm -f magnet-test$(EXEEXT) $(AM_V_CCLD)$(magnet_test_LINK) $(magnet_test_OBJECTS) $(magnet_test_LDADD) $(LIBS) makemeta-test$(EXEEXT): $(makemeta_test_OBJECTS) $(makemeta_test_DEPENDENCIES) $(EXTRA_makemeta_test_DEPENDENCIES) @rm -f makemeta-test$(EXEEXT) $(AM_V_CCLD)$(makemeta_test_LINK) $(makemeta_test_OBJECTS) $(makemeta_test_LDADD) $(LIBS) metainfo-test$(EXEEXT): $(metainfo_test_OBJECTS) $(metainfo_test_DEPENDENCIES) $(EXTRA_metainfo_test_DEPENDENCIES) @rm -f metainfo-test$(EXEEXT) $(AM_V_CCLD)$(metainfo_test_LINK) $(metainfo_test_OBJECTS) $(metainfo_test_LDADD) $(LIBS) move-test$(EXEEXT): $(move_test_OBJECTS) $(move_test_DEPENDENCIES) $(EXTRA_move_test_DEPENDENCIES) @rm -f move-test$(EXEEXT) $(AM_V_CCLD)$(move_test_LINK) $(move_test_OBJECTS) $(move_test_LDADD) $(LIBS) peer-msgs-test$(EXEEXT): $(peer_msgs_test_OBJECTS) $(peer_msgs_test_DEPENDENCIES) $(EXTRA_peer_msgs_test_DEPENDENCIES) @rm -f peer-msgs-test$(EXEEXT) $(AM_V_CCLD)$(peer_msgs_test_LINK) $(peer_msgs_test_OBJECTS) $(peer_msgs_test_LDADD) $(LIBS) quark-test$(EXEEXT): $(quark_test_OBJECTS) $(quark_test_DEPENDENCIES) $(EXTRA_quark_test_DEPENDENCIES) @rm -f quark-test$(EXEEXT) $(AM_V_CCLD)$(quark_test_LINK) $(quark_test_OBJECTS) $(quark_test_LDADD) $(LIBS) rename-test$(EXEEXT): $(rename_test_OBJECTS) $(rename_test_DEPENDENCIES) $(EXTRA_rename_test_DEPENDENCIES) @rm -f rename-test$(EXEEXT) $(AM_V_CCLD)$(rename_test_LINK) $(rename_test_OBJECTS) $(rename_test_LDADD) $(LIBS) rpc-test$(EXEEXT): $(rpc_test_OBJECTS) $(rpc_test_DEPENDENCIES) $(EXTRA_rpc_test_DEPENDENCIES) @rm -f rpc-test$(EXEEXT) $(AM_V_CCLD)$(rpc_test_LINK) $(rpc_test_OBJECTS) $(rpc_test_LDADD) $(LIBS) session-test$(EXEEXT): $(session_test_OBJECTS) $(session_test_DEPENDENCIES) $(EXTRA_session_test_DEPENDENCIES) @rm -f session-test$(EXEEXT) $(AM_V_CCLD)$(session_test_LINK) $(session_test_OBJECTS) $(session_test_LDADD) $(LIBS) tr-getopt-test$(EXEEXT): $(tr_getopt_test_OBJECTS) $(tr_getopt_test_DEPENDENCIES) $(EXTRA_tr_getopt_test_DEPENDENCIES) @rm -f tr-getopt-test$(EXEEXT) $(AM_V_CCLD)$(tr_getopt_test_LINK) $(tr_getopt_test_OBJECTS) $(tr_getopt_test_LDADD) $(LIBS) utils-test$(EXEEXT): $(utils_test_OBJECTS) $(utils_test_DEPENDENCIES) $(EXTRA_utils_test_DEPENDENCIES) @rm -f utils-test$(EXEEXT) $(AM_V_CCLD)$(utils_test_LINK) $(utils_test_OBJECTS) $(utils_test_LDADD) $(LIBS) variant-test$(EXEEXT): $(variant_test_OBJECTS) $(variant_test_DEPENDENCIES) $(EXTRA_variant_test_DEPENDENCIES) @rm -f variant-test$(EXEEXT) $(AM_V_CCLD)$(variant_test_LINK) $(variant_test_OBJECTS) $(variant_test_LDADD) $(LIBS) watchdir-generic-test$(EXEEXT): $(watchdir_generic_test_OBJECTS) $(watchdir_generic_test_DEPENDENCIES) $(EXTRA_watchdir_generic_test_DEPENDENCIES) @rm -f watchdir-generic-test$(EXEEXT) $(AM_V_CCLD)$(watchdir_generic_test_LINK) $(watchdir_generic_test_OBJECTS) $(watchdir_generic_test_LDADD) $(LIBS) watchdir-test$(EXEEXT): $(watchdir_test_OBJECTS) $(watchdir_test_DEPENDENCIES) $(EXTRA_watchdir_test_DEPENDENCIES) @rm -f watchdir-test$(EXEEXT) $(AM_V_CCLD)$(watchdir_test_LINK) $(watchdir_test_OBJECTS) $(watchdir_test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConvertUTF.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/announcer-http.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/announcer-udp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/announcer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bandwidth.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitfield-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitfield.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blocklist-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blocklist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clients-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clients.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/completion.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto-utils-cyassl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto-utils-fallback.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto-utils-openssl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto-utils-polarssl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto-utils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdlimit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file-posix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file-win32.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handshake.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/history-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/history.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inout.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtransmission-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/magnet-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/magnet.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/makemeta-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/makemeta.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metainfo-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metainfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/move-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/natpmp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/net.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/peer-io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/peer-mgr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/peer-msgs-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/peer-msgs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/platform-quota.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/platform.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/port-forwarding.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptrarray.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quark-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quark.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rename-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resume.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rpc-server.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rpc-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rpcimpl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/session-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/session.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stats.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/torrent-ctor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/torrent-magnet.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/torrent.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tr-dht.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tr-getopt-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tr-getopt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tr-lpd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tr-udp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tr-utp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trevent.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upnp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variant-benc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variant-json.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variant-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variant.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/verify.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/watchdir-generic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/watchdir-inotify.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/watchdir-kqueue.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/watchdir-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/watchdir-win32.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/watchdir.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/watchdir_generic_test-libtransmission-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/watchdir_generic_test-watchdir-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/web.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/webseed.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wildmat.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< watchdir_generic_test-watchdir-test.o: watchdir-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(watchdir_generic_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT watchdir_generic_test-watchdir-test.o -MD -MP -MF $(DEPDIR)/watchdir_generic_test-watchdir-test.Tpo -c -o watchdir_generic_test-watchdir-test.o `test -f 'watchdir-test.c' || echo '$(srcdir)/'`watchdir-test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/watchdir_generic_test-watchdir-test.Tpo $(DEPDIR)/watchdir_generic_test-watchdir-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='watchdir-test.c' object='watchdir_generic_test-watchdir-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(watchdir_generic_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o watchdir_generic_test-watchdir-test.o `test -f 'watchdir-test.c' || echo '$(srcdir)/'`watchdir-test.c watchdir_generic_test-watchdir-test.obj: watchdir-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(watchdir_generic_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT watchdir_generic_test-watchdir-test.obj -MD -MP -MF $(DEPDIR)/watchdir_generic_test-watchdir-test.Tpo -c -o watchdir_generic_test-watchdir-test.obj `if test -f 'watchdir-test.c'; then $(CYGPATH_W) 'watchdir-test.c'; else $(CYGPATH_W) '$(srcdir)/watchdir-test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/watchdir_generic_test-watchdir-test.Tpo $(DEPDIR)/watchdir_generic_test-watchdir-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='watchdir-test.c' object='watchdir_generic_test-watchdir-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(watchdir_generic_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o watchdir_generic_test-watchdir-test.obj `if test -f 'watchdir-test.c'; then $(CYGPATH_W) 'watchdir-test.c'; else $(CYGPATH_W) '$(srcdir)/watchdir-test.c'; fi` watchdir_generic_test-libtransmission-test.o: libtransmission-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(watchdir_generic_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT watchdir_generic_test-libtransmission-test.o -MD -MP -MF $(DEPDIR)/watchdir_generic_test-libtransmission-test.Tpo -c -o watchdir_generic_test-libtransmission-test.o `test -f 'libtransmission-test.c' || echo '$(srcdir)/'`libtransmission-test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/watchdir_generic_test-libtransmission-test.Tpo $(DEPDIR)/watchdir_generic_test-libtransmission-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtransmission-test.c' object='watchdir_generic_test-libtransmission-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(watchdir_generic_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o watchdir_generic_test-libtransmission-test.o `test -f 'libtransmission-test.c' || echo '$(srcdir)/'`libtransmission-test.c watchdir_generic_test-libtransmission-test.obj: libtransmission-test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(watchdir_generic_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT watchdir_generic_test-libtransmission-test.obj -MD -MP -MF $(DEPDIR)/watchdir_generic_test-libtransmission-test.Tpo -c -o watchdir_generic_test-libtransmission-test.obj `if test -f 'libtransmission-test.c'; then $(CYGPATH_W) 'libtransmission-test.c'; else $(CYGPATH_W) '$(srcdir)/libtransmission-test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/watchdir_generic_test-libtransmission-test.Tpo $(DEPDIR)/watchdir_generic_test-libtransmission-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtransmission-test.c' object='watchdir_generic_test-libtransmission-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(watchdir_generic_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o watchdir_generic_test-libtransmission-test.obj `if test -f 'libtransmission-test.c'; then $(CYGPATH_W) 'libtransmission-test.c'; else $(CYGPATH_W) '$(srcdir)/libtransmission-test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? bitfield-test.log: bitfield-test$(EXEEXT) @p='bitfield-test$(EXEEXT)'; \ b='bitfield-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) blocklist-test.log: blocklist-test$(EXEEXT) @p='blocklist-test$(EXEEXT)'; \ b='blocklist-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) clients-test.log: clients-test$(EXEEXT) @p='clients-test$(EXEEXT)'; \ b='clients-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) crypto-test.log: crypto-test$(EXEEXT) @p='crypto-test$(EXEEXT)'; \ b='crypto-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) error-test.log: error-test$(EXEEXT) @p='error-test$(EXEEXT)'; \ b='error-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) file-test.log: file-test$(EXEEXT) @p='file-test$(EXEEXT)'; \ b='file-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) history-test.log: history-test$(EXEEXT) @p='history-test$(EXEEXT)'; \ b='history-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) json-test.log: json-test$(EXEEXT) @p='json-test$(EXEEXT)'; \ b='json-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) magnet-test.log: magnet-test$(EXEEXT) @p='magnet-test$(EXEEXT)'; \ b='magnet-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) makemeta-test.log: makemeta-test$(EXEEXT) @p='makemeta-test$(EXEEXT)'; \ b='makemeta-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) metainfo-test.log: metainfo-test$(EXEEXT) @p='metainfo-test$(EXEEXT)'; \ b='metainfo-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) move-test.log: move-test$(EXEEXT) @p='move-test$(EXEEXT)'; \ b='move-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) peer-msgs-test.log: peer-msgs-test$(EXEEXT) @p='peer-msgs-test$(EXEEXT)'; \ b='peer-msgs-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) quark-test.log: quark-test$(EXEEXT) @p='quark-test$(EXEEXT)'; \ b='quark-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) rename-test.log: rename-test$(EXEEXT) @p='rename-test$(EXEEXT)'; \ b='rename-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) rpc-test.log: rpc-test$(EXEEXT) @p='rpc-test$(EXEEXT)'; \ b='rpc-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) session-test.log: session-test$(EXEEXT) @p='session-test$(EXEEXT)'; \ b='session-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tr-getopt-test.log: tr-getopt-test$(EXEEXT) @p='tr-getopt-test$(EXEEXT)'; \ b='tr-getopt-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) utils-test.log: utils-test$(EXEEXT) @p='utils-test$(EXEEXT)'; \ b='utils-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) variant-test.log: variant-test$(EXEEXT) @p='variant-test$(EXEEXT)'; \ b='variant-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) watchdir-test.log: watchdir-test$(EXEEXT) @p='watchdir-test$(EXEEXT)'; \ b='watchdir-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) watchdir-generic-test.log: watchdir-generic-test$(EXEEXT) @p='watchdir-generic-test$(EXEEXT)'; \ b='watchdir-generic-test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-generic clean-libtool clean-noinstLIBRARIES \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am recheck tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: transmission-2.92/libtransmission/PaxHeaders.4960/platform.h0000644000000000000000000000013212532765473021111 xustar0030 mtime=1433135931.839661354 30 atime=1433135931.839661354 30 ctime=1457295919.744803565 transmission-2.92/libtransmission/platform.h0000644000175000017500000000364712532765473022550 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: platform.h 14532 2015-05-31 22:13:31Z mikedld $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_PLATFORM_H #define TR_PLATFORM_H #define TR_PATH_DELIMITER '/' #define TR_PATH_DELIMITER_STR "/" /** * @addtogroup tr_session Session * @{ */ /** * @brief invoked by tr_sessionInit () to set up the locations of the resume, torrent, and clutch directories. * @see tr_getResumeDir () * @see tr_getTorrentDir () * @see tr_getWebClientDir () */ void tr_setConfigDir (tr_session * session, const char * configDir); /** @brief return the directory where .resume files are stored */ const char * tr_getResumeDir (const tr_session *); /** @brief return the directory where .torrent files are stored */ const char * tr_getTorrentDir (const tr_session *); /** @brief return the directory where the Web Client's web ui files are kept */ const char * tr_getWebClientDir (const tr_session *); /** @} */ /** * @addtogroup utils Utilities * @{ */ typedef struct tr_thread tr_thread; /** @brief Instantiate a new process thread */ tr_thread* tr_threadNew (void (*func)(void *), void * arg); /** @brief Return nonzero if this function is being called from `thread' @param thread the thread being tested */ bool tr_amInThread (const tr_thread *); /*** **** ***/ typedef struct tr_lock tr_lock; /** @brief Create a new thread mutex object */ tr_lock * tr_lockNew (void); /** @brief Destroy a thread mutex object */ void tr_lockFree (tr_lock *); /** @brief Attempt to lock a thread mutex object */ void tr_lockLock (tr_lock *); /** @brief Unlock a thread mutex object */ void tr_lockUnlock (tr_lock *); /** @brief return nonzero if the specified lock is locked */ bool tr_lockHave (const tr_lock *); /* @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/peer-io.c0000644000000000000000000000013212641272401020601 xustar0030 mtime=1451586817.572878445 30 atime=1451586817.572878445 30 ctime=1457295920.067809057 transmission-2.92/libtransmission/peer-io.c0000644000175000017500000010554312641272401022236 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: peer-io.c 14644 2015-12-29 19:37:31Z mikedld $ */ #include #include #include #include #include #include #include #include "transmission.h" #include "session.h" #include "bandwidth.h" #include "log.h" #include "net.h" #include "peer-common.h" /* MAX_BLOCK_SIZE */ #include "peer-io.h" #include "trevent.h" /* tr_runInEventThread () */ #include "tr-utp.h" #include "utils.h" #ifdef _WIN32 #undef EAGAIN #define EAGAIN WSAEWOULDBLOCK #undef EINTR #define EINTR WSAEINTR #undef EINPROGRESS #define EINPROGRESS WSAEINPROGRESS #undef EPIPE #define EPIPE WSAECONNRESET #endif /* The amount of read bufferring that we allow for uTP sockets. */ #define UTP_READ_BUFFER_SIZE (256 * 1024) static size_t guessPacketOverhead (size_t d) { /** * http://sd.wareonearth.com/~phil/net/overhead/ * * TCP over Ethernet: * Assuming no header compression (e.g. not PPP) * Add 20 IPv4 header or 40 IPv6 header (no options) * Add 20 TCP header * Add 12 bytes optional TCP timestamps * Max TCP Payload data rates over ethernet are thus: * (1500-40)/ (38+1500) = 94.9285 % IPv4, minimal headers * (1500-52)/ (38+1500) = 94.1482 % IPv4, TCP timestamps * (1500-52)/ (42+1500) = 93.9040 % 802.1q, IPv4, TCP timestamps * (1500-60)/ (38+1500) = 93.6281 % IPv6, minimal headers * (1500-72)/ (38+1500) = 92.8479 % IPv6, TCP timestamps * (1500-72)/ (42+1500) = 92.6070 % 802.1q, IPv6, ICP timestamps */ const double assumed_payload_data_rate = 94.0; return (unsigned int)(d * (100.0 / assumed_payload_data_rate) - d); } /** *** **/ #define dbgmsg(io, ...) \ do \ { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, tr_peerIoGetAddrStr (io), __VA_ARGS__); \ } \ while (0) /** *** **/ struct tr_datatype { struct tr_datatype * next; size_t length; bool isPieceData; }; static struct tr_datatype * datatype_pool = NULL; static const struct tr_datatype TR_DATATYPE_INIT = { NULL, 0, false }; static struct tr_datatype * datatype_new (void) { struct tr_datatype * ret; if (datatype_pool == NULL) ret = tr_new (struct tr_datatype, 1); else { ret = datatype_pool; datatype_pool = datatype_pool->next; } *ret = TR_DATATYPE_INIT; return ret; } static void datatype_free (struct tr_datatype * datatype) { datatype->next = datatype_pool; datatype_pool = datatype; } static void peer_io_pull_datatype (tr_peerIo * io) { struct tr_datatype * tmp; if ((tmp = io->outbuf_datatypes)) { io->outbuf_datatypes = tmp->next; datatype_free (tmp); } } static void peer_io_push_datatype (tr_peerIo * io, struct tr_datatype * datatype) { struct tr_datatype * tmp; if ((tmp = io->outbuf_datatypes)) { while (tmp->next != NULL) tmp = tmp->next; tmp->next = datatype; } else { io->outbuf_datatypes = datatype; } } /*** **** ***/ static void didWriteWrapper (tr_peerIo * io, unsigned int bytes_transferred) { while (bytes_transferred && tr_isPeerIo (io)) { struct tr_datatype * next = io->outbuf_datatypes; const unsigned int payload = MIN (next->length, bytes_transferred); /* For uTP sockets, the overhead is computed in utp_on_overhead. */ const unsigned int overhead = io->socket != TR_BAD_SOCKET ? guessPacketOverhead (payload) : 0; const uint64_t now = tr_time_msec (); tr_bandwidthUsed (&io->bandwidth, TR_UP, payload, next->isPieceData, now); if (overhead > 0) tr_bandwidthUsed (&io->bandwidth, TR_UP, overhead, false, now); if (io->didWrite) io->didWrite (io, payload, next->isPieceData, io->userData); if (tr_isPeerIo (io)) { bytes_transferred -= payload; next->length -= payload; if (!next->length) peer_io_pull_datatype (io); } } } static void canReadWrapper (tr_peerIo * io) { bool err = false; bool done = false; tr_session * session; dbgmsg (io, "canRead"); tr_peerIoRef (io); session = io->session; /* try to consume the input buffer */ if (io->canRead) { const uint64_t now = tr_time_msec (); tr_sessionLock (session); while (!done && !err) { size_t piece = 0; const size_t oldLen = evbuffer_get_length (io->inbuf); const int ret = io->canRead (io, io->userData, &piece); const size_t used = oldLen - evbuffer_get_length (io->inbuf); const unsigned int overhead = guessPacketOverhead (used); if (piece || (piece!=used)) { if (piece) tr_bandwidthUsed (&io->bandwidth, TR_DOWN, piece, true, now); if (used != piece) tr_bandwidthUsed (&io->bandwidth, TR_DOWN, used - piece, false, now); } if (overhead > 0) tr_bandwidthUsed (&io->bandwidth, TR_UP, overhead, false, now); switch (ret) { case READ_NOW: if (evbuffer_get_length (io->inbuf)) continue; done = true; break; case READ_LATER: done = true; break; case READ_ERR: err = true; break; } assert (tr_isPeerIo (io)); } tr_sessionUnlock (session); } tr_peerIoUnref (io); } static void event_read_cb (evutil_socket_t fd, short event UNUSED, void * vio) { int res; int e; tr_peerIo * io = vio; /* Limit the input buffer to 256K, so it doesn't grow too large */ unsigned int howmuch; unsigned int curlen; const tr_direction dir = TR_DOWN; const unsigned int max = 256 * 1024; assert (tr_isPeerIo (io)); assert (io->socket != TR_BAD_SOCKET); io->pendingEvents &= ~EV_READ; curlen = evbuffer_get_length (io->inbuf); howmuch = curlen >= max ? 0 : max - curlen; howmuch = tr_bandwidthClamp (&io->bandwidth, TR_DOWN, howmuch); dbgmsg (io, "libevent says this peer is ready to read"); /* if we don't have any bandwidth left, stop reading */ if (howmuch < 1) { tr_peerIoSetEnabled (io, dir, false); return; } EVUTIL_SET_SOCKET_ERROR (0); res = evbuffer_read (io->inbuf, fd, (int)howmuch); e = EVUTIL_SOCKET_ERROR (); if (res > 0) { tr_peerIoSetEnabled (io, dir, true); /* Invoke the user callback - must always be called last */ canReadWrapper (io); } else { char errstr[512]; short what = BEV_EVENT_READING; if (res == 0) /* EOF */ what |= BEV_EVENT_EOF; else if (res == -1) { if (e == EAGAIN || e == EINTR) { tr_peerIoSetEnabled (io, dir, true); return; } what |= BEV_EVENT_ERROR; } dbgmsg (io, "event_read_cb got an error. res is %d, what is %hd, errno is %d (%s)", res, what, e, tr_net_strerror (errstr, sizeof (errstr), e)); if (io->gotError != NULL) io->gotError (io, what, io->userData); } } static int tr_evbuffer_write (tr_peerIo * io, int fd, size_t howmuch) { int e; int n; char errstr[256]; EVUTIL_SET_SOCKET_ERROR (0); n = evbuffer_write_atmost (io->outbuf, fd, howmuch); e = EVUTIL_SOCKET_ERROR (); dbgmsg (io, "wrote %d to peer (%s)", n, (n==-1?tr_net_strerror (errstr,sizeof (errstr),e):"")); return n; } static void event_write_cb (evutil_socket_t fd, short event UNUSED, void * vio) { int res = 0; int e; short what = BEV_EVENT_WRITING; tr_peerIo * io = vio; size_t howmuch; const tr_direction dir = TR_UP; char errstr[1024]; assert (tr_isPeerIo (io)); assert (io->socket != TR_BAD_SOCKET); io->pendingEvents &= ~EV_WRITE; dbgmsg (io, "libevent says this peer is ready to write"); /* Write as much as possible, since the socket is non-blocking, write () will * return if it can't write any more data without blocking */ howmuch = tr_bandwidthClamp (&io->bandwidth, dir, evbuffer_get_length (io->outbuf)); /* if we don't have any bandwidth left, stop writing */ if (howmuch < 1) { tr_peerIoSetEnabled (io, dir, false); return; } EVUTIL_SET_SOCKET_ERROR (0); res = tr_evbuffer_write (io, fd, howmuch); e = EVUTIL_SOCKET_ERROR (); if (res == -1) { if (!e || e == EAGAIN || e == EINTR || e == EINPROGRESS) goto reschedule; /* error case */ what |= BEV_EVENT_ERROR; } else if (res == 0) { /* eof case */ what |= BEV_EVENT_EOF; } if (res <= 0) goto error; if (evbuffer_get_length (io->outbuf)) tr_peerIoSetEnabled (io, dir, true); didWriteWrapper (io, res); return; reschedule: if (evbuffer_get_length (io->outbuf)) tr_peerIoSetEnabled (io, dir, true); return; error: tr_net_strerror (errstr, sizeof (errstr), e); dbgmsg (io, "event_write_cb got an error. res is %d, what is %hd, errno is %d (%s)", res, what, e, errstr); if (io->gotError != NULL) io->gotError (io, what, io->userData); } /** *** **/ static void maybeSetCongestionAlgorithm (tr_socket_t socket, const char * algorithm) { if (algorithm && *algorithm) tr_netSetCongestionControl (socket, algorithm); } #ifdef WITH_UTP /* UTP callbacks */ static void utp_on_read (void *closure, const unsigned char *buf, size_t buflen) { int rc; tr_peerIo *io = closure; assert (tr_isPeerIo (io)); rc = evbuffer_add (io->inbuf, buf, buflen); dbgmsg (io, "utp_on_read got %zu bytes", buflen); if (rc < 0) { tr_logAddNamedError ("UTP", "On read evbuffer_add"); return; } tr_peerIoSetEnabled (io, TR_DOWN, true); canReadWrapper (io); } static void utp_on_write (void *closure, unsigned char *buf, size_t buflen) { int rc; tr_peerIo *io = closure; assert (tr_isPeerIo (io)); rc = evbuffer_remove (io->outbuf, buf, buflen); dbgmsg (io, "utp_on_write sending %zu bytes... evbuffer_remove returned %d", buflen, rc); assert (rc == (int)buflen); /* if this fails, we've corrupted our bookkeeping somewhere */ if (rc < (long)buflen) { tr_logAddNamedError ("UTP", "Short write: %d < %ld", rc, (long)buflen); } didWriteWrapper (io, buflen); } static size_t utp_get_rb_size (void *closure) { size_t bytes; tr_peerIo *io = closure; assert (tr_isPeerIo (io)); bytes = tr_bandwidthClamp (&io->bandwidth, TR_DOWN, UTP_READ_BUFFER_SIZE); dbgmsg (io, "utp_get_rb_size is saying it's ready to read %zu bytes", bytes); return UTP_READ_BUFFER_SIZE - bytes; } static int tr_peerIoTryWrite (tr_peerIo * io, size_t howmuch); static void utp_on_writable (tr_peerIo *io) { int n; dbgmsg (io, "libutp says this peer is ready to write"); n = tr_peerIoTryWrite (io, SIZE_MAX); tr_peerIoSetEnabled (io, TR_UP, n && evbuffer_get_length (io->outbuf)); } static void utp_on_state_change (void *closure, int state) { tr_peerIo *io = closure; assert (tr_isPeerIo (io)); if (state == UTP_STATE_CONNECT) { dbgmsg (io, "utp_on_state_change -- changed to connected"); io->utpSupported = true; } else if (state == UTP_STATE_WRITABLE) { dbgmsg (io, "utp_on_state_change -- changed to writable"); if (io->pendingEvents & EV_WRITE) utp_on_writable (io); } else if (state == UTP_STATE_EOF) { if (io->gotError) io->gotError (io, BEV_EVENT_EOF, io->userData); } else if (state == UTP_STATE_DESTROYING) { tr_logAddNamedError ("UTP", "Impossible state UTP_STATE_DESTROYING"); return; } else { tr_logAddNamedError ("UTP", "Unknown state %d", state); } } static void utp_on_error (void *closure, int errcode) { tr_peerIo *io = closure; assert (tr_isPeerIo (io)); dbgmsg (io, "utp_on_error -- errcode is %d", errcode); if (io->gotError) { errno = errcode; io->gotError (io, BEV_EVENT_ERROR, io->userData); } } static void utp_on_overhead (void *closure, uint8_t send, size_t count, int type UNUSED) { tr_peerIo *io = closure; assert (tr_isPeerIo (io)); dbgmsg (io, "utp_on_overhead -- count is %zu", count); tr_bandwidthUsed (&io->bandwidth, send ? TR_UP : TR_DOWN, count, false, tr_time_msec ()); } static struct UTPFunctionTable utp_function_table = { .on_read = utp_on_read, .on_write = utp_on_write, .get_rb_size = utp_get_rb_size, .on_state = utp_on_state_change, .on_error = utp_on_error, .on_overhead = utp_on_overhead }; /* Dummy UTP callbacks. */ /* We switch a UTP socket to use these after the associated peerIo has been destroyed -- see io_dtor. */ static void dummy_read (void * closure UNUSED, const unsigned char *buf UNUSED, size_t buflen UNUSED) { /* This cannot happen, as far as I'm aware. */ tr_logAddNamedError ("UTP", "On_read called on closed socket"); } static void dummy_write (void * closure UNUSED, unsigned char *buf, size_t buflen) { /* This can very well happen if we've shut down a peer connection that had unflushed buffers. Complain and send zeroes. */ tr_logAddNamedDbg ("UTP", "On_write called on closed socket"); memset (buf, 0, buflen); } static size_t dummy_get_rb_size (void * closure UNUSED) { return 0; } static void dummy_on_state_change (void * closure UNUSED, int state UNUSED) { return; } static void dummy_on_error (void * closure UNUSED, int errcode UNUSED) { return; } static void dummy_on_overhead (void *closure UNUSED, uint8_t send UNUSED, size_t count UNUSED, int type UNUSED) { return; } static struct UTPFunctionTable dummy_utp_function_table = { .on_read = dummy_read, .on_write = dummy_write, .get_rb_size = dummy_get_rb_size, .on_state = dummy_on_state_change, .on_error = dummy_on_error, .on_overhead = dummy_on_overhead }; #endif /* #ifdef WITH_UTP */ static tr_peerIo* tr_peerIoNew (tr_session * session, tr_bandwidth * parent, const tr_address * addr, tr_port port, const uint8_t * torrentHash, bool isIncoming, bool isSeed, tr_socket_t socket, struct UTPSocket * utp_socket) { tr_peerIo * io; assert (session != NULL); assert (session->events != NULL); assert (tr_isBool (isIncoming)); assert (tr_isBool (isSeed)); assert (tr_amInEventThread (session)); assert ((socket == TR_BAD_SOCKET) == (utp_socket != NULL)); #ifndef WITH_UTP assert (socket != TR_BAD_SOCKET); #endif if (socket != TR_BAD_SOCKET) { tr_netSetTOS (socket, session->peerSocketTOS); maybeSetCongestionAlgorithm (socket, session->peer_congestion_algorithm); } io = tr_new0 (tr_peerIo, 1); io->magicNumber = PEER_IO_MAGIC_NUMBER; io->refCount = 1; tr_cryptoConstruct (&io->crypto, torrentHash, isIncoming); io->session = session; io->addr = *addr; io->isSeed = isSeed; io->port = port; io->socket = socket; io->utp_socket = utp_socket; io->isIncoming = isIncoming; io->timeCreated = tr_time (); io->inbuf = evbuffer_new (); io->outbuf = evbuffer_new (); tr_bandwidthConstruct (&io->bandwidth, session, parent); tr_bandwidthSetPeer (&io->bandwidth, io); dbgmsg (io, "bandwidth is %p; its parent is %p", (void*)&io->bandwidth, (void*)parent); dbgmsg (io, "socket is %"TR_PRI_SOCK", utp_socket is %p", socket, (void*)utp_socket); if (io->socket != TR_BAD_SOCKET) { io->event_read = event_new (session->event_base, io->socket, EV_READ, event_read_cb, io); io->event_write = event_new (session->event_base, io->socket, EV_WRITE, event_write_cb, io); } #ifdef WITH_UTP else { UTP_SetSockopt (utp_socket, SO_RCVBUF, UTP_READ_BUFFER_SIZE); dbgmsg (io, "%s", "calling UTP_SetCallbacks &utp_function_table"); UTP_SetCallbacks (utp_socket, &utp_function_table, io); if (!isIncoming) { dbgmsg (io, "%s", "calling UTP_Connect"); UTP_Connect (utp_socket); } } #endif return io; } tr_peerIo* tr_peerIoNewIncoming (tr_session * session, tr_bandwidth * parent, const tr_address * addr, tr_port port, tr_socket_t fd, struct UTPSocket * utp_socket) { assert (session); assert (tr_address_is_valid (addr)); return tr_peerIoNew (session, parent, addr, port, NULL, true, false, fd, utp_socket); } tr_peerIo* tr_peerIoNewOutgoing (tr_session * session, tr_bandwidth * parent, const tr_address * addr, tr_port port, const uint8_t * torrentHash, bool isSeed, bool utp) { tr_socket_t fd = TR_BAD_SOCKET; struct UTPSocket * utp_socket = NULL; assert (session); assert (tr_address_is_valid (addr)); assert (torrentHash); if (utp) utp_socket = tr_netOpenPeerUTPSocket (session, addr, port, isSeed); if (!utp_socket) { fd = tr_netOpenPeerSocket (session, addr, port, isSeed); dbgmsg (NULL, "tr_netOpenPeerSocket returned fd %"TR_PRI_SOCK, fd); } if (fd == TR_BAD_SOCKET && utp_socket == NULL) return NULL; return tr_peerIoNew (session, parent, addr, port, torrentHash, false, isSeed, fd, utp_socket); } /*** **** ***/ static void event_enable (tr_peerIo * io, short event) { assert (tr_amInEventThread (io->session)); assert (io->session != NULL); assert (io->session->events != NULL); if (io->socket != TR_BAD_SOCKET) { assert (event_initialized (io->event_read)); assert (event_initialized (io->event_write)); } if ((event & EV_READ) && ! (io->pendingEvents & EV_READ)) { dbgmsg (io, "enabling ready-to-read polling"); if (io->socket != TR_BAD_SOCKET) event_add (io->event_read, NULL); io->pendingEvents |= EV_READ; } if ((event & EV_WRITE) && ! (io->pendingEvents & EV_WRITE)) { dbgmsg (io, "enabling ready-to-write polling"); if (io->socket != TR_BAD_SOCKET) event_add (io->event_write, NULL); io->pendingEvents |= EV_WRITE; } } static void event_disable (struct tr_peerIo * io, short event) { assert (tr_amInEventThread (io->session)); assert (io->session != NULL); assert (io->session->events != NULL); if (io->socket != TR_BAD_SOCKET) { assert (event_initialized (io->event_read)); assert (event_initialized (io->event_write)); } if ((event & EV_READ) && (io->pendingEvents & EV_READ)) { dbgmsg (io, "disabling ready-to-read polling"); if (io->socket != TR_BAD_SOCKET) event_del (io->event_read); io->pendingEvents &= ~EV_READ; } if ((event & EV_WRITE) && (io->pendingEvents & EV_WRITE)) { dbgmsg (io, "disabling ready-to-write polling"); if (io->socket != TR_BAD_SOCKET) event_del (io->event_write); io->pendingEvents &= ~EV_WRITE; } } void tr_peerIoSetEnabled (tr_peerIo * io, tr_direction dir, bool isEnabled) { const short event = dir == TR_UP ? EV_WRITE : EV_READ; assert (tr_isPeerIo (io)); assert (tr_isDirection (dir)); assert (tr_amInEventThread (io->session)); assert (io->session->events != NULL); if (isEnabled) event_enable (io, event); else event_disable (io, event); } /*** **** ***/ static void io_close_socket (tr_peerIo * io) { if (io->socket != TR_BAD_SOCKET) { tr_netClose (io->session, io->socket); io->socket = TR_BAD_SOCKET; } if (io->event_read != NULL) { event_free (io->event_read); io->event_read = NULL; } if (io->event_write != NULL) { event_free (io->event_write); io->event_write = NULL; } #ifdef WITH_UTP if (io->utp_socket) { UTP_SetCallbacks (io->utp_socket, &dummy_utp_function_table, NULL); UTP_Close (io->utp_socket); io->utp_socket = NULL; } #endif } static void io_dtor (void * vio) { tr_peerIo * io = vio; assert (tr_isPeerIo (io)); assert (tr_amInEventThread (io->session)); assert (io->session->events != NULL); dbgmsg (io, "in tr_peerIo destructor"); event_disable (io, EV_READ | EV_WRITE); tr_bandwidthDestruct (&io->bandwidth); evbuffer_free (io->outbuf); evbuffer_free (io->inbuf); io_close_socket (io); tr_cryptoDestruct (&io->crypto); while (io->outbuf_datatypes != NULL) peer_io_pull_datatype (io); memset (io, ~0, sizeof (tr_peerIo)); tr_free (io); } static void tr_peerIoFree (tr_peerIo * io) { if (io) { dbgmsg (io, "in tr_peerIoFree"); io->canRead = NULL; io->didWrite = NULL; io->gotError = NULL; tr_runInEventThread (io->session, io_dtor, io); } } void tr_peerIoRefImpl (const char * file, int line, tr_peerIo * io) { assert (tr_isPeerIo (io)); dbgmsg (io, "%s:%d is incrementing the IO's refcount from %d to %d", file, line, io->refCount, io->refCount+1); ++io->refCount; } void tr_peerIoUnrefImpl (const char * file, int line, tr_peerIo * io) { assert (tr_isPeerIo (io)); dbgmsg (io, "%s:%d is decrementing the IO's refcount from %d to %d", file, line, io->refCount, io->refCount-1); if (!--io->refCount) tr_peerIoFree (io); } const tr_address* tr_peerIoGetAddress (const tr_peerIo * io, tr_port * port) { assert (tr_isPeerIo (io)); if (port) *port = io->port; return &io->addr; } const char* tr_peerIoAddrStr (const tr_address * addr, tr_port port) { static char buf[512]; tr_snprintf (buf, sizeof (buf), "[%s]:%u", tr_address_to_string (addr), ntohs (port)); return buf; } const char* tr_peerIoGetAddrStr (const tr_peerIo * io) { return tr_isPeerIo (io) ? tr_peerIoAddrStr (&io->addr, io->port) : "error"; } void tr_peerIoSetIOFuncs (tr_peerIo * io, tr_can_read_cb readcb, tr_did_write_cb writecb, tr_net_error_cb errcb, void * userData) { io->canRead = readcb; io->didWrite = writecb; io->gotError = errcb; io->userData = userData; } void tr_peerIoClear (tr_peerIo * io) { tr_peerIoSetIOFuncs (io, NULL, NULL, NULL, NULL); tr_peerIoSetEnabled (io, TR_UP, false); tr_peerIoSetEnabled (io, TR_DOWN, false); } int tr_peerIoReconnect (tr_peerIo * io) { short int pendingEvents; tr_session * session; assert (tr_isPeerIo (io)); assert (!tr_peerIoIsIncoming (io)); session = tr_peerIoGetSession (io); pendingEvents = io->pendingEvents; event_disable (io, EV_READ | EV_WRITE); io_close_socket (io); io->socket = tr_netOpenPeerSocket (session, &io->addr, io->port, io->isSeed); io->event_read = event_new (session->event_base, io->socket, EV_READ, event_read_cb, io); io->event_write = event_new (session->event_base, io->socket, EV_WRITE, event_write_cb, io); if (io->socket != TR_BAD_SOCKET) { event_enable (io, pendingEvents); tr_netSetTOS (io->socket, session->peerSocketTOS); maybeSetCongestionAlgorithm (io->socket, session->peer_congestion_algorithm); return 0; } return -1; } /** *** **/ void tr_peerIoSetTorrentHash (tr_peerIo * io, const uint8_t * hash) { assert (tr_isPeerIo (io)); tr_cryptoSetTorrentHash (&io->crypto, hash); } const uint8_t* tr_peerIoGetTorrentHash (tr_peerIo * io) { assert (tr_isPeerIo (io)); return tr_cryptoGetTorrentHash (&io->crypto); } bool tr_peerIoHasTorrentHash (const tr_peerIo * io) { assert (tr_isPeerIo (io)); return tr_cryptoHasTorrentHash (&io->crypto); } /** *** **/ void tr_peerIoSetPeersId (tr_peerIo * io, const uint8_t * peer_id) { assert (tr_isPeerIo (io)); if ((io->peerIdIsSet = peer_id != NULL)) memcpy (io->peerId, peer_id, 20); else memset (io->peerId, 0, 20); } /** *** **/ static unsigned int getDesiredOutputBufferSize (const tr_peerIo * io, uint64_t now) { /* this is all kind of arbitrary, but what seems to work well is * being large enough to hold the next 20 seconds' worth of input, * or a few blocks, whichever is bigger. * It's okay to tweak this as needed */ const unsigned int currentSpeed_Bps = tr_bandwidthGetPieceSpeed_Bps (&io->bandwidth, now, TR_UP); const unsigned int period = 15u; /* arbitrary */ /* the 3 is arbitrary; the .5 is to leave room for messages */ static const unsigned int ceiling = (unsigned int)(MAX_BLOCK_SIZE * 3.5); return MAX (ceiling, currentSpeed_Bps*period); } size_t tr_peerIoGetWriteBufferSpace (const tr_peerIo * io, uint64_t now) { const size_t desiredLen = getDesiredOutputBufferSize (io, now); const size_t currentLen = evbuffer_get_length (io->outbuf); size_t freeSpace = 0; if (desiredLen > currentLen) freeSpace = desiredLen - currentLen; return freeSpace; } /** *** **/ void tr_peerIoSetEncryption (tr_peerIo * io, tr_encryption_type encryption_type) { assert (tr_isPeerIo (io)); assert (encryption_type == PEER_ENCRYPTION_NONE || encryption_type == PEER_ENCRYPTION_RC4); io->encryption_type = encryption_type; } /** *** **/ static inline void processBuffer (tr_crypto * crypto, struct evbuffer * buffer, size_t offset, size_t size, void (* callback) (tr_crypto *, size_t, const void *, void *)) { struct evbuffer_ptr pos; struct evbuffer_iovec iovec; evbuffer_ptr_set (buffer, &pos, offset, EVBUFFER_PTR_SET); do { if (evbuffer_peek (buffer, size, &pos, &iovec, 1) <= 0) break; callback (crypto, iovec.iov_len, iovec.iov_base, iovec.iov_base); assert (size >= iovec.iov_len); size -= iovec.iov_len; } while (!evbuffer_ptr_set (buffer, &pos, iovec.iov_len, EVBUFFER_PTR_ADD)); assert (size == 0); } static void addDatatype (tr_peerIo * io, size_t byteCount, bool isPieceData) { struct tr_datatype * d; d = datatype_new (); d->isPieceData = isPieceData; d->length = byteCount; peer_io_push_datatype (io, d); } static inline void maybeEncryptBuffer (tr_peerIo * io, struct evbuffer * buf, size_t offset, size_t size) { if (io->encryption_type == PEER_ENCRYPTION_RC4) processBuffer (&io->crypto, buf, offset, size, &tr_cryptoEncrypt); } void tr_peerIoWriteBuf (tr_peerIo * io, struct evbuffer * buf, bool isPieceData) { const size_t byteCount = evbuffer_get_length (buf); maybeEncryptBuffer (io, buf, 0, byteCount); evbuffer_add_buffer (io->outbuf, buf); addDatatype (io, byteCount, isPieceData); } void tr_peerIoWriteBytes (tr_peerIo * io, const void * bytes, size_t byteCount, bool isPieceData) { struct evbuffer_iovec iovec; evbuffer_reserve_space (io->outbuf, byteCount, &iovec, 1); iovec.iov_len = byteCount; if (io->encryption_type == PEER_ENCRYPTION_RC4) tr_cryptoEncrypt (&io->crypto, iovec.iov_len, bytes, iovec.iov_base); else memcpy (iovec.iov_base, bytes, iovec.iov_len); evbuffer_commit_space (io->outbuf, &iovec, 1); addDatatype (io, byteCount, isPieceData); } /*** **** ***/ void evbuffer_add_uint8 (struct evbuffer * outbuf, uint8_t byte) { evbuffer_add (outbuf, &byte, 1); } void evbuffer_add_uint16 (struct evbuffer * outbuf, uint16_t addme_hs) { const uint16_t ns = htons (addme_hs); evbuffer_add (outbuf, &ns, sizeof (ns)); } void evbuffer_add_uint32 (struct evbuffer * outbuf, uint32_t addme_hl) { const uint32_t nl = htonl (addme_hl); evbuffer_add (outbuf, &nl, sizeof (nl)); } void evbuffer_add_uint64 (struct evbuffer * outbuf, uint64_t addme_hll) { const uint64_t nll = tr_htonll (addme_hll); evbuffer_add (outbuf, &nll, sizeof (nll)); } /*** **** ***/ static inline void maybeDecryptBuffer (tr_peerIo * io, struct evbuffer * buf, size_t offset, size_t size) { if (io->encryption_type == PEER_ENCRYPTION_RC4) processBuffer (&io->crypto, buf, offset, size, &tr_cryptoDecrypt); } void tr_peerIoReadBytesToBuf (tr_peerIo * io, struct evbuffer * inbuf, struct evbuffer * outbuf, size_t byteCount) { struct evbuffer * tmp; const size_t old_length = evbuffer_get_length (outbuf); assert (tr_isPeerIo (io)); assert (evbuffer_get_length (inbuf) >= byteCount); /* append it to outbuf */ tmp = evbuffer_new (); evbuffer_remove_buffer (inbuf, tmp, byteCount); evbuffer_add_buffer (outbuf, tmp); evbuffer_free (tmp); maybeDecryptBuffer (io, outbuf, old_length, byteCount); } void tr_peerIoReadBytes (tr_peerIo * io, struct evbuffer * inbuf, void * bytes, size_t byteCount) { assert (tr_isPeerIo (io)); assert (evbuffer_get_length (inbuf) >= byteCount); switch (io->encryption_type) { case PEER_ENCRYPTION_NONE: evbuffer_remove (inbuf, bytes, byteCount); break; case PEER_ENCRYPTION_RC4: evbuffer_remove (inbuf, bytes, byteCount); tr_cryptoDecrypt (&io->crypto, byteCount, bytes, bytes); break; default: assert (false); } } void tr_peerIoReadUint16 (tr_peerIo * io, struct evbuffer * inbuf, uint16_t * setme) { uint16_t tmp; tr_peerIoReadBytes (io, inbuf, &tmp, sizeof (uint16_t)); *setme = ntohs (tmp); } void tr_peerIoReadUint32 (tr_peerIo * io, struct evbuffer * inbuf, uint32_t * setme) { uint32_t tmp; tr_peerIoReadBytes (io, inbuf, &tmp, sizeof (uint32_t)); *setme = ntohl (tmp); } void tr_peerIoDrain (tr_peerIo * io, struct evbuffer * inbuf, size_t byteCount) { char buf[4096]; const size_t buflen = sizeof (buf); while (byteCount > 0) { const size_t thisPass = MIN (byteCount, buflen); tr_peerIoReadBytes (io, inbuf, buf, thisPass); byteCount -= thisPass; } } /*** **** ***/ static int tr_peerIoTryRead (tr_peerIo * io, size_t howmuch) { int res = 0; if ((howmuch = tr_bandwidthClamp (&io->bandwidth, TR_DOWN, howmuch))) { if (io->utp_socket != NULL) /* utp peer connection */ { /* UTP_RBDrained notifies libutp that your read buffer is emtpy. * It opens up the congestion window by sending an ACK (soonish) * if one was not going to be sent. */ if (evbuffer_get_length (io->inbuf) == 0) UTP_RBDrained (io->utp_socket); } else /* tcp peer connection */ { int e; char err_buf[512]; EVUTIL_SET_SOCKET_ERROR (0); res = evbuffer_read (io->inbuf, io->socket, (int)howmuch); e = EVUTIL_SOCKET_ERROR (); dbgmsg (io, "read %d from peer (%s)", res, (res==-1?tr_net_strerror (err_buf, sizeof (err_buf), e):"")); if (evbuffer_get_length (io->inbuf)) canReadWrapper (io); if ((res <= 0) && (io->gotError) && (e != EAGAIN) && (e != EINTR) && (e != EINPROGRESS)) { short what = BEV_EVENT_READING | BEV_EVENT_ERROR; if (res == 0) what |= BEV_EVENT_EOF; dbgmsg (io, "tr_peerIoTryRead got an error. res is %d, what is %hd, errno is %d (%s)", res, what, e, tr_net_strerror (err_buf, sizeof (err_buf), e)); io->gotError (io, what, io->userData); } } } return res; } static int tr_peerIoTryWrite (tr_peerIo * io, size_t howmuch) { int n = 0; const size_t old_len = evbuffer_get_length (io->outbuf); dbgmsg (io, "in tr_peerIoTryWrite %zu", howmuch); if (howmuch > old_len) howmuch = old_len; if ((howmuch = tr_bandwidthClamp (&io->bandwidth, TR_UP, howmuch))) { if (io->utp_socket != NULL) /* utp peer connection */ { UTP_Write (io->utp_socket, howmuch); n = old_len - evbuffer_get_length (io->outbuf); } else { int e; EVUTIL_SET_SOCKET_ERROR (0); n = tr_evbuffer_write (io, io->socket, howmuch); e = EVUTIL_SOCKET_ERROR (); if (n > 0) didWriteWrapper (io, n); if ((n < 0) && (io->gotError) && e && (e != EPIPE) && (e != EAGAIN) && (e != EINTR) && (e != EINPROGRESS)) { char errstr[512]; const short what = BEV_EVENT_WRITING | BEV_EVENT_ERROR; dbgmsg (io, "tr_peerIoTryWrite got an error. res is %d, what is %hd, errno is %d (%s)", n, what, e, tr_net_strerror (errstr, sizeof (errstr), e)); if (io->gotError != NULL) io->gotError (io, what, io->userData); } } } return n; } int tr_peerIoFlush (tr_peerIo * io, tr_direction dir, size_t limit) { int bytesUsed = 0; assert (tr_isPeerIo (io)); assert (tr_isDirection (dir)); if (dir == TR_DOWN) bytesUsed = tr_peerIoTryRead (io, limit); else bytesUsed = tr_peerIoTryWrite (io, limit); dbgmsg (io, "flushing peer-io, direction %d, limit %zu, bytesUsed %d", (int)dir, limit, bytesUsed); return bytesUsed; } int tr_peerIoFlushOutgoingProtocolMsgs (tr_peerIo * io) { size_t byteCount = 0; const struct tr_datatype * it; /* count up how many bytes are used by non-piece-data messages at the front of our outbound queue */ for (it=io->outbuf_datatypes; it!=NULL; it=it->next) if (it->isPieceData) break; else byteCount += it->length; return tr_peerIoFlush (io, TR_UP, byteCount); } transmission-2.92/libtransmission/PaxHeaders.4960/verify.c0000644000000000000000000000013212542631607020554 xustar0030 mtime=1435186055.765184858 30 atime=1435186055.765184858 30 ctime=1457295920.228811795 transmission-2.92/libtransmission/verify.c0000644000175000017500000002116012542631607022201 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: verify.c 14543 2015-06-23 21:16:33Z mikedld $ */ #if defined (HAVE_POSIX_FADVISE) && (!defined (_XOPEN_SOURCE) || _XOPEN_SOURCE < 600) #undef _XOPEN_SOURCE #define _XOPEN_SOURCE 600 #endif #include /* memcmp () */ #include /* free () */ #ifdef HAVE_POSIX_FADVISE #include /* posix_fadvise () */ #endif #include "transmission.h" #include "completion.h" #include "crypto-utils.h" #include "file.h" #include "list.h" #include "log.h" #include "platform.h" /* tr_lock () */ #include "torrent.h" #include "utils.h" /* tr_valloc (), tr_free () */ #include "verify.h" /*** **** ***/ enum { MSEC_TO_SLEEP_PER_SECOND_DURING_VERIFY = 100 }; static bool verifyTorrent (tr_torrent * tor, bool * stopFlag) { time_t end; tr_sha1_ctx_t sha; tr_sys_file_t fd = TR_BAD_SYS_FILE; uint64_t filePos = 0; bool changed = false; bool hadPiece = false; time_t lastSleptAt = 0; uint32_t piecePos = 0; tr_file_index_t fileIndex = 0; tr_file_index_t prevFileIndex = !fileIndex; tr_piece_index_t pieceIndex = 0; const time_t begin = tr_time (); const size_t buflen = 1024 * 128; /* 128 KiB buffer */ uint8_t * buffer = tr_valloc (buflen); sha = tr_sha1_init (); tr_logAddTorDbg (tor, "%s", "verifying torrent..."); tr_torrentSetChecked (tor, 0); while (!*stopFlag && (pieceIndex < tor->info.pieceCount)) { uint64_t leftInPiece; uint64_t bytesThisPass; uint64_t leftInFile; const tr_file * file = &tor->info.files[fileIndex]; /* if we're starting a new piece... */ if (piecePos == 0) hadPiece = tr_torrentPieceIsComplete (tor, pieceIndex); /* if we're starting a new file... */ if (filePos == 0 && fd == TR_BAD_SYS_FILE && fileIndex != prevFileIndex) { char * filename = tr_torrentFindFile (tor, fileIndex); fd = filename == NULL ? TR_BAD_SYS_FILE : tr_sys_file_open (filename, TR_SYS_FILE_READ | TR_SYS_FILE_SEQUENTIAL, 0, NULL); tr_free (filename); prevFileIndex = fileIndex; } /* figure out how much we can read this pass */ leftInPiece = tr_torPieceCountBytes (tor, pieceIndex) - piecePos; leftInFile = file->length - filePos; bytesThisPass = MIN (leftInFile, leftInPiece); bytesThisPass = MIN (bytesThisPass, buflen); /* read a bit */ if (fd != TR_BAD_SYS_FILE) { uint64_t numRead; if (tr_sys_file_read_at (fd, buffer, bytesThisPass, filePos, &numRead, NULL) && numRead > 0) { bytesThisPass = numRead; tr_sha1_update (sha, buffer, bytesThisPass); #if defined HAVE_POSIX_FADVISE && defined POSIX_FADV_DONTNEED (void) posix_fadvise (fd, filePos, bytesThisPass, POSIX_FADV_DONTNEED); #endif } } /* move our offsets */ leftInPiece -= bytesThisPass; leftInFile -= bytesThisPass; piecePos += bytesThisPass; filePos += bytesThisPass; /* if we're finishing a piece... */ if (leftInPiece == 0) { time_t now; bool hasPiece; uint8_t hash[SHA_DIGEST_LENGTH]; tr_sha1_final (sha, hash); hasPiece = !memcmp (hash, tor->info.pieces[pieceIndex].hash, SHA_DIGEST_LENGTH); if (hasPiece || hadPiece) { tr_torrentSetHasPiece (tor, pieceIndex, hasPiece); changed |= hasPiece != hadPiece; } tr_torrentSetPieceChecked (tor, pieceIndex); now = tr_time (); tor->anyDate = now; /* sleeping even just a few msec per second goes a long * way towards reducing IO load... */ if (lastSleptAt != now) { lastSleptAt = now; tr_wait_msec (MSEC_TO_SLEEP_PER_SECOND_DURING_VERIFY); } sha = tr_sha1_init (); pieceIndex++; piecePos = 0; } /* if we're finishing a file... */ if (leftInFile == 0) { if (fd != TR_BAD_SYS_FILE) { tr_sys_file_close (fd, NULL); fd = TR_BAD_SYS_FILE; } fileIndex++; filePos = 0; } } /* cleanup */ if (fd != TR_BAD_SYS_FILE) tr_sys_file_close (fd, NULL); tr_sha1_final (sha, NULL); free (buffer); /* stopwatch */ end = tr_time (); tr_logAddTorDbg (tor, "Verification is done. It took %d seconds to verify %"PRIu64" bytes (%"PRIu64" bytes per second)", (int)(end-begin), tor->info.totalSize, (uint64_t)(tor->info.totalSize/ (1+ (end-begin)))); return changed; } /*** **** ***/ struct verify_node { tr_torrent * torrent; tr_verify_done_func callback_func; void * callback_data; uint64_t current_size; }; static struct verify_node currentNode; static tr_list * verifyList = NULL; static tr_thread * verifyThread = NULL; static bool stopCurrent = false; static tr_lock* getVerifyLock (void) { static tr_lock * lock = NULL; if (lock == NULL) lock = tr_lockNew (); return lock; } static void verifyThreadFunc (void * unused UNUSED) { for (;;) { int changed = 0; tr_torrent * tor; struct verify_node * node; tr_lockLock (getVerifyLock ()); stopCurrent = false; node = (struct verify_node*) verifyList ? verifyList->data : NULL; if (node == NULL) { currentNode.torrent = NULL; break; } currentNode = *node; tor = currentNode.torrent; tr_list_remove_data (&verifyList, node); tr_free (node); tr_lockUnlock (getVerifyLock ()); tr_logAddTorInfo (tor, "%s", _("Verifying torrent")); tr_torrentSetVerifyState (tor, TR_VERIFY_NOW); changed = verifyTorrent (tor, &stopCurrent); tr_torrentSetVerifyState (tor, TR_VERIFY_NONE); assert (tr_isTorrent (tor)); if (!stopCurrent && changed) tr_torrentSetDirty (tor); if (currentNode.callback_func) (*currentNode.callback_func)(tor, stopCurrent, currentNode.callback_data); } verifyThread = NULL; tr_lockUnlock (getVerifyLock ()); } static int compareVerifyByPriorityAndSize (const void * va, const void * vb) { const struct verify_node * a = va; const struct verify_node * b = vb; /* higher priority comes before lower priority */ const tr_priority_t pa = tr_torrentGetPriority (a->torrent); const tr_priority_t pb = tr_torrentGetPriority (b->torrent); if (pa != pb) return pa > pb ? -1 : 1; /* smaller torrents come before larger ones because they verify faster */ if (a->current_size < b->current_size) return -1; if (a->current_size > b->current_size) return 1; return 0; } void tr_verifyAdd (tr_torrent * tor, tr_verify_done_func callback_func, void * callback_data) { struct verify_node * node; assert (tr_isTorrent (tor)); tr_logAddTorInfo (tor, "%s", _("Queued for verification")); node = tr_new (struct verify_node, 1); node->torrent = tor; node->callback_func = callback_func; node->callback_data = callback_data; node->current_size = tr_torrentGetCurrentSizeOnDisk (tor); tr_lockLock (getVerifyLock ()); tr_torrentSetVerifyState (tor, TR_VERIFY_WAIT); tr_list_insert_sorted (&verifyList, node, compareVerifyByPriorityAndSize); if (verifyThread == NULL) verifyThread = tr_threadNew (verifyThreadFunc, NULL); tr_lockUnlock (getVerifyLock ()); } static int compareVerifyByTorrent (const void * va, const void * vb) { const struct verify_node * a = va; const tr_torrent * b = vb; return a->torrent - b; } void tr_verifyRemove (tr_torrent * tor) { tr_lock * lock = getVerifyLock (); tr_lockLock (lock); assert (tr_isTorrent (tor)); if (tor == currentNode.torrent) { stopCurrent = true; while (stopCurrent) { tr_lockUnlock (lock); tr_wait_msec (100); tr_lockLock (lock); } } else { struct verify_node * node = tr_list_remove (&verifyList, tor, compareVerifyByTorrent); tr_torrentSetVerifyState (tor, TR_VERIFY_NONE); if (node != NULL) { if (node->callback_func != NULL) (*node->callback_func)(tor, true, node->callback_data); tr_free (node); } } tr_lockUnlock (lock); } void tr_verifyClose (tr_session * session UNUSED) { tr_lockLock (getVerifyLock ()); stopCurrent = true; tr_list_free (&verifyList, tr_free); tr_lockUnlock (getVerifyLock ()); } transmission-2.92/libtransmission/PaxHeaders.4960/tr-lpd.c0000644000000000000000000000013212640354044020446 xustar0030 mtime=1451350052.455150475 30 atime=1451350052.455150475 30 ctime=1457295920.175810894 transmission-2.92/libtransmission/tr-lpd.c0000644000175000017500000005151112640354044022076 0ustar00mikedldmikedld00000000000000/* Copyright (c) 2010 by Johannes Lieder 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. */ /* ansi */ #include #include #include /* strlen (), strncpy (), strstr (), memset () */ /* posix */ #include /* sig_atomic_t */ #include /* toupper () */ #ifdef _WIN32 #include #include typedef uint16_t in_port_t; /* all missing */ #else #include #include /* close () */ #include #include /* socket (), bind () */ #include /* sockaddr_in */ #endif /* third party */ #include #include /* libT */ #include "transmission.h" #include "log.h" #include "net.h" #include "peer-mgr.h" /* tr_peerMgrAddPex () */ #include "session.h" #include "torrent.h" /* tr_torrentFindFromHash () */ #include "tr-lpd.h" #include "utils.h" #include "version.h" /** * @brief Local Peer Discovery * @file tr-lpd.c * * This module implements the Local Peer Discovery (LPD) protocol as supported by the * uTorrent client application. A typical LPD datagram is 119 bytes long. * * $Id: tr-lpd.c 14641 2015-12-29 00:42:40Z mikedld $ */ static void event_callback (evutil_socket_t, short, void*); enum { UPKEEP_INTERVAL_SECS = 5 }; static struct event * upkeep_timer = NULL; static tr_socket_t lpd_socket; /** lpd_maxDatagramLength) return NULL; /* now we can attempt to look up the BT-SEARCH header */ if (sscanf (s, "BT-SEARCH * HTTP/%d.%d" CRLF, &major, &minor) != 2) return NULL; if (major < 0 || minor < 0) return NULL; { /* a pair of blank lines at the end of the string, no place else */ const char* const two_blank = CRLF CRLF CRLF; const char* const end = strstr (s, two_blank); if (end == NULL || strlen (end) > strlen (two_blank)) return NULL; } if (ver != NULL) { ver->major = major; ver->minor = minor; } /* separate the header, begins with CRLF */ return strstr (s, CRLF); } /** * @brief Return the value of a named parameter * * @param[in] str Input string of "\r\nName: Value" pairs without HTTP-style method part * @param[in] name Name of parameter to extract * @param[in] n Maximum available storage for value to return * @param[out] val Output parameter for the actual value * @return Returns 1 if value could be copied successfully * * Extracts the associated value of a named parameter from a HTTP-style header by * performing the following steps: * - assemble search string "\r\nName: " and locate position * - copy back value from end to next "\r\n" */ static bool lpd_extractParam (const char* const str, const char* const name, int n, char* const val) { /* configure maximum length of search string here */ enum { maxLength = 30 }; char sstr[maxLength] = { 0 }; const char* pos; assert (str != NULL && name != NULL); assert (val != NULL); if (strlen (name) > maxLength - strlen (CRLF ": ")) return false; /* compose the string token to search for */ tr_snprintf (sstr, maxLength, CRLF "%s: ", name); pos = strstr (str, sstr); if (pos == NULL) return false; /* search was not successful */ { const char* const beg = pos + strlen (sstr); const char* const new_line = strstr (beg, CRLF); /* the value is delimited by the next CRLF */ int len = new_line - beg; /* if value string hits the length limit n, * leave space for a trailing '\0' character */ if (len < n--) n = len; strncpy (val, beg, n); val[n] = 0; } /* we successfully returned the value string */ return true; } /** * @} */ static void on_upkeep_timer (evutil_socket_t, short, void *); /** * @brief Initializes Local Peer Discovery for this node * * For the most part, this means setting up an appropriately configured multicast socket * and event-based message handling. * * @remark Since the LPD service does not use another protocol family yet, this code is * IPv4 only for the time being. */ int tr_lpdInit (tr_session* ss, tr_address* tr_addr UNUSED) { struct ip_mreq mcastReq; const int opt_on = 1, opt_off = 0; if (session) /* already initialized */ return -1; assert (lpd_announceInterval > 0); assert (lpd_announceScope > 0); lpd_port = tr_sessionGetPeerPort (ss); if (lpd_port <= 0) return -1; tr_logAddNamedDbg ("LPD", "Initialising Local Peer Discovery"); /* setup datagram socket (receive) */ { lpd_socket = socket (PF_INET, SOCK_DGRAM, 0); if (lpd_socket == TR_BAD_SOCKET) goto fail; if (evutil_make_socket_nonblocking (lpd_socket) < 0) goto fail; if (setsockopt (lpd_socket, SOL_SOCKET, SO_REUSEADDR, (const void *) &opt_on, sizeof opt_on) < 0) goto fail; memset (&lpd_mcastAddr, 0, sizeof lpd_mcastAddr); lpd_mcastAddr.sin_family = AF_INET; lpd_mcastAddr.sin_port = htons (lpd_mcastPort); if (evutil_inet_pton (lpd_mcastAddr.sin_family, lpd_mcastGroup, &lpd_mcastAddr.sin_addr) < 0) goto fail; if (bind (lpd_socket, (struct sockaddr*) &lpd_mcastAddr, sizeof lpd_mcastAddr) < 0) goto fail; /* we want to join that LPD multicast group */ memset (&mcastReq, 0, sizeof mcastReq); mcastReq.imr_multiaddr = lpd_mcastAddr.sin_addr; mcastReq.imr_interface.s_addr = htonl (INADDR_ANY); if (setsockopt (lpd_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const void *) &mcastReq, sizeof mcastReq) < 0) goto fail; if (setsockopt (lpd_socket, IPPROTO_IP, IP_MULTICAST_LOOP, (const void *) &opt_off, sizeof opt_off) < 0) goto fail; } /* setup datagram socket (send) */ { const unsigned char scope = lpd_announceScope; lpd_socket2 = socket (PF_INET, SOCK_DGRAM, 0); if (lpd_socket2 == TR_BAD_SOCKET) goto fail; if (evutil_make_socket_nonblocking (lpd_socket2) < 0) goto fail; /* configure outbound multicast TTL */ if (setsockopt (lpd_socket2, IPPROTO_IP, IP_MULTICAST_TTL, (const void *) &scope, sizeof scope) < 0) goto fail; if (setsockopt (lpd_socket2, IPPROTO_IP, IP_MULTICAST_LOOP, (const void *) &opt_off, sizeof opt_off) < 0) goto fail; } session = ss; /* Note: lpd_unsolicitedMsgCounter remains 0 until the first timeout event, thus * any announcement received during the initial interval will be discarded. */ lpd_event = event_new (ss->event_base, lpd_socket, EV_READ | EV_PERSIST, event_callback, NULL); event_add (lpd_event, NULL); upkeep_timer = evtimer_new (ss->event_base, on_upkeep_timer, ss); tr_timerAdd (upkeep_timer, UPKEEP_INTERVAL_SECS, 0); tr_logAddNamedDbg ("LPD", "Local Peer Discovery initialised"); return 1; fail: { const int save = errno; evutil_closesocket (lpd_socket); evutil_closesocket (lpd_socket2); lpd_socket = lpd_socket2 = TR_BAD_SOCKET; session = NULL; tr_logAddNamedDbg ("LPD", "LPD initialisation failed (errno = %d)", save); errno = save; } return -1; } void tr_lpdUninit (tr_session* ss) { if (session != ss) return; tr_logAddNamedDbg ("LPD", "Uninitialising Local Peer Discovery"); event_free (lpd_event); lpd_event = NULL; evtimer_del (upkeep_timer); upkeep_timer = NULL; /* just shut down, we won't remember any former nodes */ evutil_closesocket (lpd_socket); evutil_closesocket (lpd_socket2); tr_logAddNamedDbg ("LPD", "Done uninitialising Local Peer Discovery"); session = NULL; } bool tr_lpdEnabled (const tr_session* ss) { return ss && (ss == session); } /** * @cond * @brief Performs some (internal) software consistency checks at compile time. * @remark Declared inline for the compiler not to allege us of feeding unused * functions. In any other respect, lpd_consistencyCheck is an orphaned function. */ UNUSED static inline void lpd_consistencyCheck (void) { /* if the following check fails, the definition of a hash string has changed * without our knowledge; revise string handling in functions tr_lpdSendAnnounce * and tr_lpdConsiderAnnounce. However, the code is designed to function as long * as interfaces to the rest of the lib remain compatible with char* strings. */ TR_STATIC_ASSERT (sizeof (lpd_torStaticType->info.hashString[0]) == sizeof (char), ""); } /** * @endcond */ /** * @defgroup LdsProto LPD announcement processing * @{ */ /** * @brief Announce the given torrent on the local network * * @param[in] t Torrent to announce * @return Returns true on success * * Send a query for torrent t out to the LPD multicast group (or the LAN, for that * matter). A listening client on the same network might react by adding us to his * peer pool for torrent t. */ bool tr_lpdSendAnnounce (const tr_torrent* t) { size_t i; const char fmt[] = "BT-SEARCH * HTTP/%u.%u" CRLF "Host: %s:%u" CRLF "Port: %u" CRLF "Infohash: %s" CRLF CRLF CRLF; char hashString[lengthof (t->info.hashString)]; char query[lpd_maxDatagramLength + 1] = { 0 }; if (t == NULL) return false; /* make sure the hash string is normalized, just in case */ for (i = 0; i < sizeof hashString; i++) hashString[i] = toupper (t->info.hashString[i]); /* prepare a zero-terminated announce message */ tr_snprintf (query, lpd_maxDatagramLength + 1, fmt, 1, 1, lpd_mcastGroup, lpd_mcastPort, lpd_port, hashString); /* actually send the query out using [lpd_socket2] */ { const int len = strlen (query); /* destination address info has already been set up in tr_lpdInit (), * so we refrain from preparing another sockaddr_in here */ int res = sendto (lpd_socket2, (const void *) query, len, 0, (const struct sockaddr*) &lpd_mcastAddr, sizeof lpd_mcastAddr); if (res != len) return false; } tr_logAddTorDbg (t, "LPD announce message away"); return true; } /** * @brief Process incoming unsolicited messages and add the peer to the announced * torrent if all checks are passed. * * @param[in,out] peer Adress information of the peer to add * @param[in] msg The announcement message to consider * @return Returns 0 if any input parameter or the announce was invalid, 1 if the peer * was successfully added, -1 if not; a non-null return value indicates a side-effect to * the peer in/out parameter. * * @note The port information gets added to the peer structure if tr_lpdConsiderAnnounce * is able to extract the necessary information from the announce message. That is, if * return != 0, the caller may retrieve the value from the passed structure. */ static int tr_lpdConsiderAnnounce (tr_pex* peer, const char* const msg) { enum { maxValueLen = 25, maxHashLen = lengthof (lpd_torStaticType->info.hashString) }; struct lpd_protocolVersion ver = { -1, -1 }; char value[maxValueLen] = { 0 }; char hashString[maxHashLen] = { 0 }; int res = 0, peerPort = 0; if (peer != NULL && msg != NULL) { tr_torrent* tor = NULL; const char* params = lpd_extractHeader (msg, &ver); if (params == NULL || ver.major != 1) /* allow messages of protocol v1 */ return 0; /* save the effort to check Host, which seems to be optional anyway */ if (!lpd_extractParam (params, "Port", maxValueLen, value)) return 0; /* determine announced peer port, refuse if value too large */ if (sscanf (value, "%d", &peerPort) != 1 || peerPort > (in_port_t)-1) return 0; peer->port = htons (peerPort); res = -1; /* signal caller side-effect to peer->port via return != 0 */ if (!lpd_extractParam (params, "Infohash", maxHashLen, hashString)) return res; tor = tr_torrentFindFromHashString (session, hashString); if (tr_isTorrent (tor) && tr_torrentAllowsLPD (tor)) { /* we found a suitable peer, add it to the torrent */ tr_peerMgrAddPex (tor, TR_PEER_FROM_LPD, peer, -1); tr_logAddTorDbg (tor, "Learned %d local peer from LPD (%s:%u)", 1, tr_address_to_string (&peer->addr), peerPort); /* periodic reconnectPulse () deals with the rest... */ return 1; } else tr_logAddNamedDbg ("LPD", "Cannot serve torrent #%s", hashString); } return res; } /** * @} */ /** * @note Since it possible for tr_lpdAnnounceMore to get called from outside the LPD module, * the function needs to be informed of the externally employed housekeeping interval. * Further, by setting interval to zero (or negative) the caller may actually disable LPD * announces on a per-interval basis. * * FIXME: since this function's been made private and is called by a periodic timer, * most of the previous paragraph isn't true anymore... we weren't using that functionality * before. are there cases where we should? if not, should we remove the bells & whistles? */ static int tr_lpdAnnounceMore (const time_t now, const int interval) { tr_torrent* tor = NULL; int announcesSent = 0; if (!tr_isSession (session)) return -1; while ((tor = tr_torrentNext (session, tor)) && tr_sessionAllowsLPD (session)) { if (tr_isTorrent (tor)) { int announcePrio = 0; if (!tr_torrentAllowsLPD (tor)) continue; /* issue #3208: prioritize downloads before seeds */ switch (tr_torrentGetActivity (tor)) { case TR_STATUS_DOWNLOAD: announcePrio = 1; break; case TR_STATUS_SEED: announcePrio = 2; break; default: /* fall through */ break; } if (announcePrio > 0 && tor->lpdAnnounceAt <= now) { if (tr_lpdSendAnnounce (tor)) announcesSent++; tor->lpdAnnounceAt = now + lpd_announceInterval * announcePrio; break; /* that's enough; for this interval */ } } } /* perform housekeeping for the flood protection mechanism */ { const int maxAnnounceCap = interval * lpd_announceCapFactor; if (lpd_unsolicitedMsgCounter < 0) tr_logAddNamedInfo ("LPD", "Dropped %d announces in the last interval (max. %d " "allowed)", -lpd_unsolicitedMsgCounter, maxAnnounceCap); lpd_unsolicitedMsgCounter = maxAnnounceCap; } return announcesSent; } static void on_upkeep_timer (evutil_socket_t foo UNUSED, short bar UNUSED, void * vsession UNUSED) { const time_t now = tr_time (); tr_lpdAnnounceMore (now, UPKEEP_INTERVAL_SECS); tr_timerAdd (upkeep_timer, UPKEEP_INTERVAL_SECS, 0); } /** * @brief Processing of timeout notifications and incoming data on the socket * @note maximum rate of read events is limited according to @a lpd_maxAnnounceCap * @see DoS */ static void event_callback (evutil_socket_t s UNUSED, short type, void* ignore UNUSED) { assert (tr_isSession (session)); /* do not allow announces to be processed if LPD is disabled */ if (!tr_sessionAllowsLPD (session)) return; if ((type & EV_READ) != 0) { struct sockaddr_in foreignAddr; int addrLen = sizeof foreignAddr; char foreignMsg[lpd_maxDatagramLength + 1]; /* process local announcement from foreign peer */ int res = recvfrom (lpd_socket, (void *) foreignMsg, lpd_maxDatagramLength, 0, (struct sockaddr*) &foreignAddr, (socklen_t*) &addrLen); /* besides, do we get flooded? then bail out! */ if (--lpd_unsolicitedMsgCounter < 0) return; if (res > 0 && res <= lpd_maxDatagramLength) { struct tr_pex foreignPeer = { .port = 0, /* the peer-to-peer port is yet unknown */ .flags = 0 }; /* be paranoid enough about zero terminating the foreign string */ foreignMsg[res] = '\0'; foreignPeer.addr.addr.addr4 = foreignAddr.sin_addr; if (tr_lpdConsiderAnnounce (&foreignPeer, foreignMsg) != 0) return; /* OK so far, no log message */ } tr_logAddNamedDbg ("LPD", "Discarded invalid multicast message"); } } transmission-2.92/libtransmission/PaxHeaders.4960/tr-udp.h0000644000000000000000000000013212442116602020460 xustar0030 mtime=1418239362.950222906 30 atime=1418239362.950222906 30 ctime=1457295919.828804993 transmission-2.92/libtransmission/tr-udp.h0000644000175000017500000000265412442116602022114 0ustar00mikedldmikedld00000000000000/* Copyright (c) 2010 by Juliusz Chroboczek 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. */ #ifndef TR_UDP_H #define TR_UDP_H #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif void tr_udpInit (tr_session *); void tr_udpUninit (tr_session *); void tr_udpSetSocketBuffers (tr_session *); bool tau_handle_message (tr_session * session, const uint8_t * msg, size_t msglen); #endif /* #ifndef TR_UDP_H */ transmission-2.92/libtransmission/PaxHeaders.4960/bandwidth.h0000644000000000000000000000013212442116602021211 xustar0030 mtime=1418239362.940222735 30 atime=1418239362.940222735 30 ctime=1457295919.561800453 transmission-2.92/libtransmission/bandwidth.h0000644000175000017500000002024712442116602022643 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: bandwidth.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_BANDWIDTH_H #define TR_BANDWIDTH_H #include #include "transmission.h" #include "ptrarray.h" #include "utils.h" /* tr_new (), tr_free () */ struct tr_peerIo; /** * @addtogroup networked_io Networked IO * @{ */ /* these are PRIVATE IMPLEMENTATION details that should not be touched. * it's included in the header for inlining and composition. */ enum { HISTORY_MSEC = 2000u, INTERVAL_MSEC = HISTORY_MSEC, GRANULARITY_MSEC = 200, HISTORY_SIZE = (INTERVAL_MSEC / GRANULARITY_MSEC), BANDWIDTH_MAGIC_NUMBER = 43143 }; /* these are PRIVATE IMPLEMENTATION details that should not be touched. * it's included in the header for inlining and composition. */ struct bratecontrol { int newest; struct { uint64_t date, size; } transfers[HISTORY_SIZE]; uint64_t cache_time; unsigned int cache_val; }; /* these are PRIVATE IMPLEMENTATION details that should not be touched. * it's included in the header for inlining and composition. */ struct tr_band { bool isLimited; bool honorParentLimits; unsigned int bytesLeft; unsigned int desiredSpeed_Bps; struct bratecontrol raw; struct bratecontrol piece; }; /** * Bandwidth is an object for measuring and constraining bandwidth speeds. * * Bandwidth objects can be "stacked" so that a peer can be made to obey * multiple constraints (for example, obeying the global speed limit and a * per-torrent speed limit). * * HIERARCHY * * Transmission's bandwidth hierarchy is a tree. * At the top is the global bandwidth object owned by tr_session. * Its children are per-torrent bandwidth objects owned by tr_torrent. * Underneath those are per-peer bandwidth objects owned by tr_peer. * * tr_session also owns a tr_handshake's bandwidths, so that the handshake * I/O can be counted in the global raw totals. When the handshake is done, * the bandwidth's ownership passes to a tr_peer. * * MEASURING * * When you ask a bandwidth object for its speed, it gives the speed of the * subtree underneath it as well. So you can get Transmission's overall * speed by quering tr_session's bandwidth, per-torrent speeds by asking * tr_torrent's bandwidth, and per-peer speeds by asking tr_peer's bandwidth. * * CONSTRAINING * * Call tr_bandwidthAllocate () periodically. tr_bandwidth knows its current * speed and will decide how many bytes to make available over the * user-specified period to reach the user-specified desired speed. * If appropriate, it notifies its peer-ios that new bandwidth is available. * * tr_bandwidthAllocate () operates on the tr_bandwidth subtree, so usually * you'll only need to invoke it for the top-level tr_session bandwidth. * * The peer-ios all have a pointer to their associated tr_bandwidth object, * and call tr_bandwidthClamp () before performing I/O to see how much * bandwidth they can safely use. */ typedef struct tr_bandwidth { /* these are PRIVATE IMPLEMENTATION details that should not be touched. * it's included in the header for inlining and composition. */ struct tr_band band[2]; struct tr_bandwidth * parent; tr_priority_t priority; int magicNumber; unsigned int uniqueKey; tr_session * session; tr_ptrArray children; /* struct tr_bandwidth */ struct tr_peerIo * peer; } tr_bandwidth; /** *** **/ void tr_bandwidthConstruct (tr_bandwidth * bandwidth, tr_session * session, tr_bandwidth * parent); void tr_bandwidthDestruct (tr_bandwidth * bandwidth); /** @brief test to see if the pointer refers to a live bandwidth object */ static inline bool tr_isBandwidth (const tr_bandwidth * b) { return (b != NULL) && (b->magicNumber == BANDWIDTH_MAGIC_NUMBER); } /****** ******* ******/ /** * @brief Set the desired speed for this bandwidth subtree. * @see tr_bandwidthAllocate * @see tr_bandwidthGetDesiredSpeed */ static inline bool tr_bandwidthSetDesiredSpeed_Bps (tr_bandwidth * bandwidth, tr_direction dir, unsigned int desiredSpeed) { unsigned int * value = &bandwidth->band[dir].desiredSpeed_Bps; const bool didChange = desiredSpeed != *value; *value = desiredSpeed; return didChange; } /** * @brief Get the desired speed for the bandwidth subtree. * @see tr_bandwidthSetDesiredSpeed */ static inline double tr_bandwidthGetDesiredSpeed_Bps (const tr_bandwidth * bandwidth, tr_direction dir) { return bandwidth->band[dir].desiredSpeed_Bps; } /** * @brief Set whether or not this bandwidth should throttle its peer-io's speeds */ static inline bool tr_bandwidthSetLimited (tr_bandwidth * bandwidth, tr_direction dir, bool isLimited) { bool * value = &bandwidth->band[dir].isLimited; const bool didChange = isLimited != *value; *value = isLimited; return didChange; } /** * @return nonzero if this bandwidth throttles its peer-ios speeds */ static inline bool tr_bandwidthIsLimited (const tr_bandwidth * bandwidth, tr_direction dir) { return bandwidth->band[dir].isLimited; } /** * @brief allocate the next period_msec's worth of bandwidth for the peer-ios to consume */ void tr_bandwidthAllocate (tr_bandwidth * bandwidth, tr_direction direction, unsigned int period_msec); /** * @brief clamps byteCount down to a number that this bandwidth will allow to be consumed */ unsigned int tr_bandwidthClamp (const tr_bandwidth * bandwidth, tr_direction direction, unsigned int byteCount); /****** ******* ******/ /** @brief Get the raw total of bytes read or sent by this bandwidth subtree. */ unsigned int tr_bandwidthGetRawSpeed_Bps (const tr_bandwidth * bandwidth, const uint64_t now, const tr_direction direction); /** @brief Get the number of piece data bytes read or sent by this bandwidth subtree. */ unsigned int tr_bandwidthGetPieceSpeed_Bps (const tr_bandwidth * bandwidth, const uint64_t now, const tr_direction direction); /** * @brief Notify the bandwidth object that some of its allocated bandwidth has been consumed. * This is is usually invoked by the peer-io after a read or write. */ void tr_bandwidthUsed (tr_bandwidth * bandwidth, tr_direction direction, size_t byteCount, bool isPieceData, uint64_t now); /****** ******* ******/ void tr_bandwidthSetParent (tr_bandwidth * bandwidth, tr_bandwidth * parent); /** * Almost all the time we do want to honor a parents' bandwidth cap, so that * (for example) a peer is constrained by a per-torrent cap and the global cap. * But when we set a torrent's speed mode to TR_SPEEDLIMIT_UNLIMITED, then * in that particular case we want to ignore the global speed limit... */ static inline bool tr_bandwidthHonorParentLimits (tr_bandwidth * bandwidth, tr_direction direction, bool isEnabled) { bool * value = &bandwidth->band[direction].honorParentLimits; const bool didChange = isEnabled != *value; *value = isEnabled; return didChange; } static inline bool tr_bandwidthAreParentLimitsHonored (const tr_bandwidth * bandwidth, tr_direction direction) { assert (tr_isBandwidth (bandwidth)); assert (tr_isDirection (direction)); return bandwidth->band[direction].honorParentLimits; } /****** ******* ******/ void tr_bandwidthSetPeer (tr_bandwidth * bandwidth, struct tr_peerIo * peerIo); /* @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/web.c0000644000000000000000000000013212641272401020016 xustar0030 mtime=1451586817.567878356 30 atime=1451586817.567878356 30 ctime=1457295920.248812135 transmission-2.92/libtransmission/web.c0000644000175000017500000004540612641272401021454 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: web.c 14644 2015-12-29 19:37:31Z mikedld $ */ #include #include /* strlen (), strstr () */ #ifdef _WIN32 #include #else #include #endif #include #include #include "transmission.h" #include "file.h" #include "list.h" #include "log.h" #include "net.h" /* tr_address */ #include "torrent.h" #include "platform.h" /* mutex */ #include "session.h" #include "trevent.h" /* tr_runInEventThread () */ #include "utils.h" #include "version.h" /* User-Agent */ #include "web.h" #if LIBCURL_VERSION_NUM >= 0x070F06 /* CURLOPT_SOCKOPT* was added in 7.15.6 */ #define USE_LIBCURL_SOCKOPT #endif enum { THREADFUNC_MAX_SLEEP_MSEC = 200, }; #if 0 #define dbgmsg(...) \ do { \ fprintf (stderr, __VA_ARGS__); \ fprintf (stderr, "\n"); \ } while (0) #else #define dbgmsg(...) \ do { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, "web", __VA_ARGS__); \ } while (0) #endif /*** **** ***/ struct tr_web_task { int torrentId; long code; long timeout_secs; bool did_connect; bool did_timeout; struct evbuffer * response; struct evbuffer * freebuf; char * url; char * range; char * cookies; tr_session * session; tr_web_done_func done_func; void * done_func_user_data; CURL * curl_easy; struct tr_web_task * next; }; static void task_free (struct tr_web_task * task) { if (task->freebuf) evbuffer_free (task->freebuf); tr_free (task->cookies); tr_free (task->range); tr_free (task->url); tr_free (task); } /*** **** ***/ static tr_list * paused_easy_handles = NULL; struct tr_web { bool curl_verbose; bool curl_ssl_verify; char * curl_ca_bundle; int close_mode; struct tr_web_task * tasks; tr_lock * taskLock; char * cookie_filename; }; /*** **** ***/ static size_t writeFunc (void * ptr, size_t size, size_t nmemb, void * vtask) { const size_t byteCount = size * nmemb; struct tr_web_task * task = vtask; /* webseed downloads should be speed limited */ if (task->torrentId != -1) { tr_torrent * tor = tr_torrentFindFromId (task->session, task->torrentId); if (tor && !tr_bandwidthClamp (&tor->bandwidth, TR_DOWN, nmemb)) { tr_list_append (&paused_easy_handles, task->curl_easy); return CURL_WRITEFUNC_PAUSE; } } evbuffer_add (task->response, ptr, byteCount); dbgmsg ("wrote %zu bytes to task %p's buffer", byteCount, (void*)task); return byteCount; } #ifdef USE_LIBCURL_SOCKOPT static int sockoptfunction (void * vtask, curl_socket_t fd, curlsocktype purpose UNUSED) { struct tr_web_task * task = vtask; const bool isScrape = strstr (task->url, "scrape") != NULL; const bool isAnnounce = strstr (task->url, "announce") != NULL; /* announce and scrape requests have tiny payloads. */ if (isScrape || isAnnounce) { const int sndbuf = isScrape ? 4096 : 1024; const int rcvbuf = isScrape ? 4096 : 3072; setsockopt (fd, SOL_SOCKET, SO_SNDBUF, (const void *) &sndbuf, sizeof (sndbuf)); setsockopt (fd, SOL_SOCKET, SO_RCVBUF, (const void *) &rcvbuf, sizeof (rcvbuf)); } /* return nonzero if this function encountered an error */ return 0; } #endif static long getTimeoutFromURL (const struct tr_web_task * task) { long timeout; const tr_session * session = task->session; if (!session || session->isClosed) timeout = 20L; else if (strstr (task->url, "scrape") != NULL) timeout = 30L; else if (strstr (task->url, "announce") != NULL) timeout = 90L; else timeout = 240L; return timeout; } static CURL * createEasy (tr_session * s, struct tr_web * web, struct tr_web_task * task) { bool is_default_value; const tr_address * addr; CURL * e = task->curl_easy = curl_easy_init (); task->timeout_secs = getTimeoutFromURL (task); curl_easy_setopt (e, CURLOPT_AUTOREFERER, 1L); curl_easy_setopt (e, CURLOPT_ENCODING, "gzip;q=1.0, deflate, identity"); curl_easy_setopt (e, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt (e, CURLOPT_MAXREDIRS, -1L); curl_easy_setopt (e, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt (e, CURLOPT_PRIVATE, task); #ifdef USE_LIBCURL_SOCKOPT curl_easy_setopt (e, CURLOPT_SOCKOPTFUNCTION, sockoptfunction); curl_easy_setopt (e, CURLOPT_SOCKOPTDATA, task); #endif if (web->curl_ssl_verify) { curl_easy_setopt (e, CURLOPT_CAINFO, web->curl_ca_bundle); } else { curl_easy_setopt (e, CURLOPT_SSL_VERIFYHOST, 0L); curl_easy_setopt (e, CURLOPT_SSL_VERIFYPEER, 0L); } curl_easy_setopt (e, CURLOPT_TIMEOUT, task->timeout_secs); curl_easy_setopt (e, CURLOPT_URL, task->url); curl_easy_setopt (e, CURLOPT_USERAGENT, TR_NAME "/" SHORT_VERSION_STRING); curl_easy_setopt (e, CURLOPT_VERBOSE, (long)(web->curl_verbose?1:0)); curl_easy_setopt (e, CURLOPT_WRITEDATA, task); curl_easy_setopt (e, CURLOPT_WRITEFUNCTION, writeFunc); if (((addr = tr_sessionGetPublicAddress (s, TR_AF_INET, &is_default_value))) && !is_default_value) curl_easy_setopt (e, CURLOPT_INTERFACE, tr_address_to_string (addr)); else if (((addr = tr_sessionGetPublicAddress (s, TR_AF_INET6, &is_default_value))) && !is_default_value) curl_easy_setopt (e, CURLOPT_INTERFACE, tr_address_to_string (addr)); if (task->cookies != NULL) curl_easy_setopt (e, CURLOPT_COOKIE, task->cookies); if (web->cookie_filename != NULL) curl_easy_setopt (e, CURLOPT_COOKIEFILE, web->cookie_filename); if (task->range != NULL) { curl_easy_setopt (e, CURLOPT_RANGE, task->range); /* don't bother asking the server to compress webseed fragments */ curl_easy_setopt (e, CURLOPT_ENCODING, "identity"); } return e; } /*** **** ***/ static void task_finish_func (void * vtask) { struct tr_web_task * task = vtask; dbgmsg ("finished web task %p; got %ld", (void*)task, task->code); if (task->done_func != NULL) task->done_func (task->session, task->did_connect, task->did_timeout, task->code, evbuffer_pullup (task->response, -1), evbuffer_get_length (task->response), task->done_func_user_data); task_free (task); } /**** ***** ****/ static void tr_webThreadFunc (void * vsession); static struct tr_web_task * tr_webRunImpl (tr_session * session, int torrentId, const char * url, const char * range, const char * cookies, tr_web_done_func done_func, void * done_func_user_data, struct evbuffer * buffer) { struct tr_web_task * task = NULL; if (!session->isClosing) { if (session->web == NULL) { tr_threadNew (tr_webThreadFunc, session); while (session->web == NULL) tr_wait_msec (20); } task = tr_new0 (struct tr_web_task, 1); task->session = session; task->torrentId = torrentId; task->url = tr_strdup (url); task->range = tr_strdup (range); task->cookies = tr_strdup (cookies); task->done_func = done_func; task->done_func_user_data = done_func_user_data; task->response = buffer ? buffer : evbuffer_new (); task->freebuf = buffer ? NULL : task->response; tr_lockLock (session->web->taskLock); task->next = session->web->tasks; session->web->tasks = task; tr_lockUnlock (session->web->taskLock); } return task; } struct tr_web_task * tr_webRunWithCookies (tr_session * session, const char * url, const char * cookies, tr_web_done_func done_func, void * done_func_user_data) { return tr_webRunImpl (session, -1, url, NULL, cookies, done_func, done_func_user_data, NULL); } struct tr_web_task * tr_webRun (tr_session * session, const char * url, tr_web_done_func done_func, void * done_func_user_data) { return tr_webRunWithCookies (session, url, NULL, done_func, done_func_user_data); } struct tr_web_task * tr_webRunWebseed (tr_torrent * tor, const char * url, const char * range, tr_web_done_func done_func, void * done_func_user_data, struct evbuffer * buffer) { return tr_webRunImpl (tor->session, tr_torrentId (tor), url, range, NULL, done_func, done_func_user_data, buffer); } /** * Portability wrapper for select (). * * http://msdn.microsoft.com/en-us/library/ms740141%28VS.85%29.aspx * On win32, any two of the parameters, readfds, writefds, or exceptfds, * can be given as null. At least one must be non-null, and any non-null * descriptor set must contain at least one handle to a socket. */ static void tr_select (int nfds, fd_set * r_fd_set, fd_set * w_fd_set, fd_set * c_fd_set, struct timeval * t) { #ifdef _WIN32 (void) nfds; if (!r_fd_set->fd_count && !w_fd_set->fd_count && !c_fd_set->fd_count) { const long int msec = t->tv_sec*1000 + t->tv_usec/1000; tr_wait_msec (msec); } else if (select (0, r_fd_set->fd_count ? r_fd_set : NULL, w_fd_set->fd_count ? w_fd_set : NULL, c_fd_set->fd_count ? c_fd_set : NULL, t) < 0) { char errstr[512]; const int e = EVUTIL_SOCKET_ERROR (); tr_net_strerror (errstr, sizeof (errstr), e); dbgmsg ("Error: select (%d) %s", e, errstr); } #else select (nfds, r_fd_set, w_fd_set, c_fd_set, t); #endif } static void tr_webThreadFunc (void * vsession) { char * str; CURLM * multi; struct tr_web * web; int taskCount = 0; struct tr_web_task * task; tr_session * session = vsession; /* try to enable ssl for https support; but if that fails, * try a plain vanilla init */ if (curl_global_init (CURL_GLOBAL_SSL)) curl_global_init (0); web = tr_new0 (struct tr_web, 1); web->close_mode = ~0; web->taskLock = tr_lockNew (); web->tasks = NULL; web->curl_verbose = tr_env_key_exists ("TR_CURL_VERBOSE"); web->curl_ssl_verify = tr_env_key_exists ("TR_CURL_SSL_VERIFY"); web->curl_ca_bundle = tr_env_get_string ("CURL_CA_BUNDLE", NULL); if (web->curl_ssl_verify) { tr_logAddNamedInfo ("web", "will verify tracker certs using envvar CURL_CA_BUNDLE: %s", web->curl_ca_bundle == NULL ? "none" : web->curl_ca_bundle); tr_logAddNamedInfo ("web", "NB: this only works if you built against libcurl with openssl or gnutls, NOT nss"); tr_logAddNamedInfo ("web", "NB: invalid certs will show up as 'Could not connect to tracker' like many other errors"); } str = tr_buildPath (session->configDir, "cookies.txt", NULL); if (tr_sys_path_exists (str, NULL)) web->cookie_filename = tr_strdup (str); tr_free (str); multi = curl_multi_init (); session->web = web; for (;;) { long msec; int unused; CURLMsg * msg; CURLMcode mcode; if (web->close_mode == TR_WEB_CLOSE_NOW) break; if ((web->close_mode == TR_WEB_CLOSE_WHEN_IDLE) && (web->tasks == NULL)) break; /* add tasks from the queue */ tr_lockLock (web->taskLock); while (web->tasks != NULL) { /* pop the task */ task = web->tasks; web->tasks = task->next; task->next = NULL; dbgmsg ("adding task to curl: [%s]", task->url); curl_multi_add_handle (multi, createEasy (session, web, task)); /*fprintf (stderr, "adding a task.. taskCount is now %d\n", taskCount);*/ ++taskCount; } tr_lockUnlock (web->taskLock); /* unpause any paused curl handles */ if (paused_easy_handles != NULL) { CURL * handle; tr_list * tmp; /* swap paused_easy_handles to prevent oscillation between writeFunc this while loop */ tmp = paused_easy_handles; paused_easy_handles = NULL; while ((handle = tr_list_pop_front (&tmp))) curl_easy_pause (handle, CURLPAUSE_CONT); } /* maybe wait a little while before calling curl_multi_perform () */ msec = 0; curl_multi_timeout (multi, &msec); if (msec < 0) msec = THREADFUNC_MAX_SLEEP_MSEC; if (session->isClosed) msec = 100; /* on shutdown, call perform () more frequently */ if (msec > 0) { int usec; int max_fd; struct timeval t; fd_set r_fd_set, w_fd_set, c_fd_set; max_fd = 0; FD_ZERO (&r_fd_set); FD_ZERO (&w_fd_set); FD_ZERO (&c_fd_set); curl_multi_fdset (multi, &r_fd_set, &w_fd_set, &c_fd_set, &max_fd); if (msec > THREADFUNC_MAX_SLEEP_MSEC) msec = THREADFUNC_MAX_SLEEP_MSEC; usec = msec * 1000; t.tv_sec = usec / 1000000; t.tv_usec = usec % 1000000; tr_select (max_fd+1, &r_fd_set, &w_fd_set, &c_fd_set, &t); } /* call curl_multi_perform () */ do mcode = curl_multi_perform (multi, &unused); while (mcode == CURLM_CALL_MULTI_PERFORM); /* pump completed tasks from the multi */ while ((msg = curl_multi_info_read (multi, &unused))) { if ((msg->msg == CURLMSG_DONE) && (msg->easy_handle != NULL)) { double total_time; struct tr_web_task * task; long req_bytes_sent; CURL * e = msg->easy_handle; curl_easy_getinfo (e, CURLINFO_PRIVATE, (void*)&task); assert (e == task->curl_easy); curl_easy_getinfo (e, CURLINFO_RESPONSE_CODE, &task->code); curl_easy_getinfo (e, CURLINFO_REQUEST_SIZE, &req_bytes_sent); curl_easy_getinfo (e, CURLINFO_TOTAL_TIME, &total_time); task->did_connect = task->code>0 || req_bytes_sent>0; task->did_timeout = !task->code && (total_time >= task->timeout_secs); curl_multi_remove_handle (multi, e); tr_list_remove_data (&paused_easy_handles, e); curl_easy_cleanup (e); tr_runInEventThread (task->session, task_finish_func, task); --taskCount; } } } /* Discard any remaining tasks. * This is rare, but can happen on shutdown with unresponsive trackers. */ while (web->tasks != NULL) { task = web->tasks; web->tasks = task->next; dbgmsg ("Discarding task \"%s\"", task->url); task_free (task); } /* cleanup */ tr_list_free (&paused_easy_handles, NULL); curl_multi_cleanup (multi); tr_lockFree (web->taskLock); tr_free (web->curl_ca_bundle); tr_free (web->cookie_filename); tr_free (web); session->web = NULL; } void tr_webClose (tr_session * session, tr_web_close_mode close_mode) { if (session->web != NULL) { session->web->close_mode = close_mode; if (close_mode == TR_WEB_CLOSE_NOW) while (session->web != NULL) tr_wait_msec (100); } } void tr_webGetTaskInfo (struct tr_web_task * task, tr_web_task_info info, void * dst) { curl_easy_getinfo (task->curl_easy, (CURLINFO) info, dst); } /***** ****** ****** *****/ const char * tr_webGetResponseStr (long code) { switch (code) { case 0: return "No Response"; case 101: return "Switching Protocols"; case 200: return "OK"; case 201: return "Created"; case 202: return "Accepted"; case 203: return "Non-Authoritative Information"; case 204: return "No Content"; case 205: return "Reset Content"; case 206: return "Partial Content"; case 300: return "Multiple Choices"; case 301: return "Moved Permanently"; case 302: return "Found"; case 303: return "See Other"; case 304: return "Not Modified"; case 305: return "Use Proxy"; case 306: return " (Unused)"; case 307: return "Temporary Redirect"; case 400: return "Bad Request"; case 401: return "Unauthorized"; case 402: return "Payment Required"; case 403: return "Forbidden"; case 404: return "Not Found"; case 405: return "Method Not Allowed"; case 406: return "Not Acceptable"; case 407: return "Proxy Authentication Required"; case 408: return "Request Timeout"; case 409: return "Conflict"; case 410: return "Gone"; case 411: return "Length Required"; case 412: return "Precondition Failed"; case 413: return "Request Entity Too Large"; case 414: return "Request-URI Too Long"; case 415: return "Unsupported Media Type"; case 416: return "Requested Range Not Satisfiable"; case 417: return "Expectation Failed"; case 500: return "Internal Server Error"; case 501: return "Not Implemented"; case 502: return "Bad Gateway"; case 503: return "Service Unavailable"; case 504: return "Gateway Timeout"; case 505: return "HTTP Version Not Supported"; default: return "Unknown Error"; } } void tr_http_escape (struct evbuffer * out, const char * str, size_t len, bool escape_slashes) { if (str == NULL) return; if (len == TR_BAD_SIZE) len = strlen (str); for (const char * end = str + len; str != end; ++str) { if ((*str == ',') || (*str == '-') || (*str == '.') || (('0' <= *str) && (*str <= '9')) || (('A' <= *str) && (*str <= 'Z')) || (('a' <= *str) && (*str <= 'z')) || ((*str == '/') && (!escape_slashes))) evbuffer_add_printf (out, "%c", *str); else evbuffer_add_printf (out, "%%%02X", (unsigned)(*str&0xFF)); } } char * tr_http_unescape (const char * str, size_t len) { char * tmp = curl_unescape (str, len); char * ret = tr_strdup (tmp); curl_free (tmp); return ret; } static bool is_rfc2396_alnum (uint8_t ch) { return ('0' <= ch && ch <= '9') || ('A' <= ch && ch <= 'Z') || ('a' <= ch && ch <= 'z') || ch == '.' || ch == '-' || ch == '_' || ch == '~'; } void tr_http_escape_sha1 (char * out, const uint8_t * sha1_digest) { const uint8_t * in = sha1_digest; const uint8_t * end = in + SHA_DIGEST_LENGTH; while (in != end) if (is_rfc2396_alnum (*in)) *out++ = (char) *in++; else out += tr_snprintf (out, 4, "%%%02x", (unsigned int)*in++); *out = '\0'; } transmission-2.92/libtransmission/PaxHeaders.4960/torrent.c0000644000000000000000000000013212641272401020736 xustar0030 mtime=1451586817.571878427 30 atime=1451586817.571878427 30 ctime=1457295920.148810435 transmission-2.92/libtransmission/torrent.c0000644000175000017500000027554312641272401022403 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: torrent.c 14644 2015-12-29 19:37:31Z mikedld $ */ #include /* EINVAL */ #include /* signal () */ #ifndef _WIN32 #include /* wait () */ #include /* fork (), execvp (), _exit () */ #else #include /* CreateProcess (), GetLastError () */ #endif #include #include #include #include /* memcmp */ #include /* qsort */ #include /* INT_MAX */ #include /* evutil_vsnprintf () */ #include "transmission.h" #include "announcer.h" #include "bandwidth.h" #include "cache.h" #include "completion.h" #include "crypto-utils.h" /* for tr_sha1 */ #include "error.h" #include "fdlimit.h" /* tr_fdTorrentClose */ #include "file.h" #include "inout.h" /* tr_ioTestPiece () */ #include "log.h" #include "magnet.h" #include "metainfo.h" #include "peer-common.h" /* MAX_BLOCK_SIZE */ #include "peer-mgr.h" #include "platform.h" /* TR_PATH_DELIMITER_STR */ #include "ptrarray.h" #include "resume.h" #include "session.h" #include "torrent.h" #include "torrent-magnet.h" #include "trevent.h" /* tr_runInEventThread () */ #include "utils.h" #include "variant.h" #include "verify.h" #include "version.h" /*** **** ***/ #define tr_deeplog_tor(tor, ...) \ do \ { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, tr_torrentName (tor), __VA_ARGS__); \ } \ while (0) /*** **** ***/ const char * tr_torrentName (const tr_torrent * tor) { return tor ? tor->info.name : ""; } int tr_torrentId (const tr_torrent * tor) { return tor ? tor->uniqueId : -1; } tr_torrent* tr_torrentFindFromId (tr_session * session, int id) { tr_torrent * tor = NULL; while ((tor = tr_torrentNext (session, tor))) if (tor->uniqueId == id) return tor; return NULL; } tr_torrent* tr_torrentFindFromHashString (tr_session * session, const char * str) { tr_torrent * tor = NULL; while ((tor = tr_torrentNext (session, tor))) if (!evutil_ascii_strcasecmp (str, tor->info.hashString)) return tor; return NULL; } tr_torrent* tr_torrentFindFromHash (tr_session * session, const uint8_t * torrentHash) { tr_torrent * tor = NULL; while ((tor = tr_torrentNext (session, tor))) if (*tor->info.hash == *torrentHash) if (!memcmp (tor->info.hash, torrentHash, SHA_DIGEST_LENGTH)) return tor; return NULL; } tr_torrent* tr_torrentFindFromMagnetLink (tr_session * session, const char * magnet) { tr_magnet_info * info; tr_torrent * tor = NULL; if ((info = tr_magnetParse (magnet))) { tor = tr_torrentFindFromHash (session, info->hash); tr_magnetFree (info); } return tor; } tr_torrent* tr_torrentFindFromObfuscatedHash (tr_session * session, const uint8_t * obfuscatedTorrentHash) { tr_torrent * tor = NULL; while ((tor = tr_torrentNext (session, tor))) if (!memcmp (tor->obfuscatedHash, obfuscatedTorrentHash, SHA_DIGEST_LENGTH)) return tor; return NULL; } bool tr_torrentIsPieceTransferAllowed (const tr_torrent * tor, tr_direction direction) { bool allowed = true; unsigned int limit; assert (tr_isTorrent (tor)); assert (tr_isDirection (direction)); if (tr_torrentUsesSpeedLimit (tor, direction)) if (tr_torrentGetSpeedLimit_Bps (tor, direction) <= 0) allowed = false; if (tr_torrentUsesSessionLimits (tor)) if (tr_sessionGetActiveSpeedLimit_Bps (tor->session, direction, &limit)) if (limit <= 0) allowed = false; return allowed; } /*** **** ***/ static void tr_torrentUnsetPeerId (tr_torrent * tor) { /* triggers a rebuild next time tr_torrentGetPeerId() is called */ *tor->peer_id = '\0'; } static int peerIdTTL (const tr_torrent * tor) { int ttl; if (!tor->peer_id_creation_time) ttl = 0; else ttl = (int)difftime(tor->peer_id_creation_time+(tor->session->peer_id_ttl_hours*3600), tr_time()); return ttl; } const unsigned char * tr_torrentGetPeerId (tr_torrent * tor) { bool needs_new_peer_id = false; if (!*tor->peer_id) needs_new_peer_id = true; if (!needs_new_peer_id) if (!tr_torrentIsPrivate (tor)) if (peerIdTTL (tor) <= 0) needs_new_peer_id = true; if (needs_new_peer_id) { tr_peerIdInit (tor->peer_id); tor->peer_id_creation_time = tr_time (); } return tor->peer_id; } /*** **** PER-TORRENT UL / DL SPEEDS ***/ void tr_torrentSetSpeedLimit_Bps (tr_torrent * tor, tr_direction dir, unsigned int Bps) { assert (tr_isTorrent (tor)); assert (tr_isDirection (dir)); if (tr_bandwidthSetDesiredSpeed_Bps (&tor->bandwidth, dir, Bps)) tr_torrentSetDirty (tor); } void tr_torrentSetSpeedLimit_KBps (tr_torrent * tor, tr_direction dir, unsigned int KBps) { tr_torrentSetSpeedLimit_Bps (tor, dir, toSpeedBytes (KBps)); } unsigned int tr_torrentGetSpeedLimit_Bps (const tr_torrent * tor, tr_direction dir) { assert (tr_isTorrent (tor)); assert (tr_isDirection (dir)); return tr_bandwidthGetDesiredSpeed_Bps (&tor->bandwidth, dir); } unsigned int tr_torrentGetSpeedLimit_KBps (const tr_torrent * tor, tr_direction dir) { assert (tr_isTorrent (tor)); assert (tr_isDirection (dir)); return toSpeedKBps (tr_torrentGetSpeedLimit_Bps (tor, dir)); } void tr_torrentUseSpeedLimit (tr_torrent * tor, tr_direction dir, bool do_use) { assert (tr_isTorrent (tor)); assert (tr_isDirection (dir)); if (tr_bandwidthSetLimited (&tor->bandwidth, dir, do_use)) tr_torrentSetDirty (tor); } bool tr_torrentUsesSpeedLimit (const tr_torrent * tor, tr_direction dir) { assert (tr_isTorrent (tor)); return tr_bandwidthIsLimited (&tor->bandwidth, dir); } void tr_torrentUseSessionLimits (tr_torrent * tor, bool doUse) { bool changed; assert (tr_isTorrent (tor)); changed = tr_bandwidthHonorParentLimits (&tor->bandwidth, TR_UP, doUse); changed |= tr_bandwidthHonorParentLimits (&tor->bandwidth, TR_DOWN, doUse); if (changed) tr_torrentSetDirty (tor); } bool tr_torrentUsesSessionLimits (const tr_torrent * tor) { assert (tr_isTorrent (tor)); return tr_bandwidthAreParentLimitsHonored (&tor->bandwidth, TR_UP); } /*** **** ***/ void tr_torrentSetRatioMode (tr_torrent * tor, tr_ratiolimit mode) { assert (tr_isTorrent (tor)); assert (mode==TR_RATIOLIMIT_GLOBAL || mode==TR_RATIOLIMIT_SINGLE || mode==TR_RATIOLIMIT_UNLIMITED); if (mode != tor->ratioLimitMode) { tor->ratioLimitMode = mode; tr_torrentSetDirty (tor); } } tr_ratiolimit tr_torrentGetRatioMode (const tr_torrent * tor) { assert (tr_isTorrent (tor)); return tor->ratioLimitMode; } void tr_torrentSetRatioLimit (tr_torrent * tor, double desiredRatio) { assert (tr_isTorrent (tor)); if ((int)(desiredRatio*100.0) != (int)(tor->desiredRatio*100.0)) { tor->desiredRatio = desiredRatio; tr_torrentSetDirty (tor); } } double tr_torrentGetRatioLimit (const tr_torrent * tor) { assert (tr_isTorrent (tor)); return tor->desiredRatio; } bool tr_torrentGetSeedRatio (const tr_torrent * tor, double * ratio) { bool isLimited; assert (tr_isTorrent (tor)); switch (tr_torrentGetRatioMode (tor)) { case TR_RATIOLIMIT_SINGLE: isLimited = true; if (ratio) *ratio = tr_torrentGetRatioLimit (tor); break; case TR_RATIOLIMIT_GLOBAL: isLimited = tr_sessionIsRatioLimited (tor->session); if (isLimited && ratio) *ratio = tr_sessionGetRatioLimit (tor->session); break; default: /* TR_RATIOLIMIT_UNLIMITED */ isLimited = false; break; } return isLimited; } /* returns true if the seed ratio applies -- * it applies if the torrent's a seed AND it has a seed ratio set */ static bool tr_torrentGetSeedRatioBytes (const tr_torrent * tor, uint64_t * setmeLeft, uint64_t * setmeGoal) { double seedRatio; bool seedRatioApplies = false; assert (tr_isTorrent (tor)); if (tr_torrentGetSeedRatio (tor, &seedRatio)) { const uint64_t u = tor->uploadedCur + tor->uploadedPrev; const uint64_t d = tor->downloadedCur + tor->downloadedPrev; const uint64_t baseline = d ? d : tr_cpSizeWhenDone (&tor->completion); const uint64_t goal = baseline * seedRatio; if (setmeLeft) *setmeLeft = goal > u ? goal - u : 0; if (setmeGoal) *setmeGoal = goal; seedRatioApplies = tr_torrentIsSeed (tor); } return seedRatioApplies; } static bool tr_torrentIsSeedRatioDone (const tr_torrent * tor) { uint64_t bytesLeft; return tr_torrentGetSeedRatioBytes (tor, &bytesLeft, NULL) && !bytesLeft; } /*** **** ***/ void tr_torrentSetIdleMode (tr_torrent * tor, tr_idlelimit mode) { assert (tr_isTorrent (tor)); assert (mode==TR_IDLELIMIT_GLOBAL || mode==TR_IDLELIMIT_SINGLE || mode==TR_IDLELIMIT_UNLIMITED); if (mode != tor->idleLimitMode) { tor->idleLimitMode = mode; tr_torrentSetDirty (tor); } } tr_idlelimit tr_torrentGetIdleMode (const tr_torrent * tor) { assert (tr_isTorrent (tor)); return tor->idleLimitMode; } void tr_torrentSetIdleLimit (tr_torrent * tor, uint16_t idleMinutes) { assert (tr_isTorrent (tor)); if (idleMinutes > 0) { tor->idleLimitMinutes = idleMinutes; tr_torrentSetDirty (tor); } } uint16_t tr_torrentGetIdleLimit (const tr_torrent * tor) { assert (tr_isTorrent (tor)); return tor->idleLimitMinutes; } bool tr_torrentGetSeedIdle (const tr_torrent * tor, uint16_t * idleMinutes) { bool isLimited; switch (tr_torrentGetIdleMode (tor)) { case TR_IDLELIMIT_SINGLE: isLimited = true; if (idleMinutes != NULL) *idleMinutes = tr_torrentGetIdleLimit (tor); break; case TR_IDLELIMIT_GLOBAL: isLimited = tr_sessionIsIdleLimited (tor->session); if (isLimited && idleMinutes) *idleMinutes = tr_sessionGetIdleLimit (tor->session); break; default: /* TR_IDLELIMIT_UNLIMITED */ isLimited = false; break; } return isLimited; } static bool tr_torrentIsSeedIdleLimitDone (tr_torrent * tor) { uint16_t idleMinutes; return tr_torrentGetSeedIdle (tor, &idleMinutes) && difftime (tr_time (), MAX (tor->startDate, tor->activityDate)) >= idleMinutes * 60u; } /*** **** ***/ void tr_torrentCheckSeedLimit (tr_torrent * tor) { assert (tr_isTorrent (tor)); if (!tor->isRunning || tor->isStopping || !tr_torrentIsSeed (tor)) return; /* if we're seeding and reach our seed ratio limit, stop the torrent */ if (tr_torrentIsSeedRatioDone (tor)) { tr_logAddTorInfo (tor, "%s", "Seed ratio reached; pausing torrent"); tor->isStopping = true; /* maybe notify the client */ if (tor->ratio_limit_hit_func != NULL) tor->ratio_limit_hit_func (tor, tor->ratio_limit_hit_func_user_data); } /* if we're seeding and reach our inactiviy limit, stop the torrent */ else if (tr_torrentIsSeedIdleLimitDone (tor)) { tr_logAddTorInfo (tor, "%s", "Seeding idle limit reached; pausing torrent"); tor->isStopping = true; tor->finishedSeedingByIdle = true; /* maybe notify the client */ if (tor->idle_limit_hit_func != NULL) tor->idle_limit_hit_func (tor, tor->idle_limit_hit_func_user_data); } } /*** **** ***/ void tr_torrentSetLocalError (tr_torrent * tor, const char * fmt, ...) { va_list ap; assert (tr_isTorrent (tor)); va_start (ap, fmt); tor->error = TR_STAT_LOCAL_ERROR; tor->errorTracker[0] = '\0'; evutil_vsnprintf (tor->errorString, sizeof (tor->errorString), fmt, ap); va_end (ap); tr_logAddTorErr (tor, "%s", tor->errorString); if (tor->isRunning) tor->isStopping = true; } static void tr_torrentClearError (tr_torrent * tor) { tor->error = TR_STAT_OK; tor->errorString[0] = '\0'; tor->errorTracker[0] = '\0'; } static void onTrackerResponse (tr_torrent * tor, const tr_tracker_event * event, void * unused UNUSED) { switch (event->messageType) { case TR_TRACKER_PEERS: { size_t i; const int8_t seedProbability = event->seedProbability; const bool allAreSeeds = seedProbability == 100; if (allAreSeeds) tr_logAddTorDbg (tor, "Got %zu seeds from tracker", event->pexCount); else tr_logAddTorDbg (tor, "Got %zu peers from tracker", event->pexCount); for (i = 0; i < event->pexCount; ++i) tr_peerMgrAddPex (tor, TR_PEER_FROM_TRACKER, &event->pex[i], seedProbability); break; } case TR_TRACKER_WARNING: tr_logAddTorErr (tor, _("Tracker warning: \"%s\""), event->text); tor->error = TR_STAT_TRACKER_WARNING; tr_strlcpy (tor->errorTracker, event->tracker, sizeof (tor->errorTracker)); tr_strlcpy (tor->errorString, event->text, sizeof (tor->errorString)); break; case TR_TRACKER_ERROR: tr_logAddTorErr (tor, _("Tracker error: \"%s\""), event->text); tor->error = TR_STAT_TRACKER_ERROR; tr_strlcpy (tor->errorTracker, event->tracker, sizeof (tor->errorTracker)); tr_strlcpy (tor->errorString, event->text, sizeof (tor->errorString)); break; case TR_TRACKER_ERROR_CLEAR: if (tor->error != TR_STAT_LOCAL_ERROR) tr_torrentClearError (tor); break; } } /*** **** **** TORRENT INSTANTIATION **** ***/ static tr_piece_index_t getBytePiece (const tr_info * info, uint64_t byteOffset) { tr_piece_index_t piece; assert (info); assert (info->pieceSize != 0); piece = byteOffset / info->pieceSize; /* handle 0-byte files at the end of a torrent */ if (byteOffset == info->totalSize) piece = info->pieceCount - 1; return piece; } static void initFilePieces (tr_info * info, tr_file_index_t fileIndex) { tr_file * file; uint64_t firstByte, lastByte; assert (info); assert (fileIndex < info->fileCount); file = &info->files[fileIndex]; firstByte = file->offset; lastByte = firstByte + (file->length ? file->length - 1 : 0); file->firstPiece = getBytePiece (info, firstByte); file->lastPiece = getBytePiece (info, lastByte); } static bool pieceHasFile (tr_piece_index_t piece, const tr_file * file) { return (file->firstPiece <= piece) && (piece <= file->lastPiece); } static tr_priority_t calculatePiecePriority (const tr_torrent * tor, tr_piece_index_t piece, int fileHint) { tr_file_index_t i; tr_priority_t priority = TR_PRI_LOW; /* find the first file that has data in this piece */ if (fileHint >= 0) { i = fileHint; while (i > 0 && pieceHasFile (piece, &tor->info.files[i - 1])) --i; } else { for (i=0; iinfo.fileCount; ++i) if (pieceHasFile (piece, &tor->info.files[i])) break; } /* the piece's priority is the max of the priorities * of all the files in that piece */ for (; iinfo.fileCount; ++i) { const tr_file * file = &tor->info.files[i]; if (!pieceHasFile (piece, file)) break; priority = MAX (priority, file->priority); /* when dealing with multimedia files, getting the first and last pieces can sometimes allow you to preview it a bit before it's fully downloaded... */ if (file->priority >= TR_PRI_NORMAL) if (file->firstPiece == piece || file->lastPiece == piece) priority = TR_PRI_HIGH; } return priority; } static void tr_torrentInitFilePieces (tr_torrent * tor) { int * firstFiles; tr_file_index_t f; tr_piece_index_t p; uint64_t offset = 0; tr_info * inf = &tor->info; /* assign the file offsets */ for (f=0; ffileCount; ++f) { inf->files[f].offset = offset; offset += inf->files[f].length; initFilePieces (inf, f); } /* build the array of first-file hints to give calculatePiecePriority */ firstFiles = tr_new (int, inf->pieceCount); for (p=f=0; ppieceCount; ++p) { while (inf->files[f].lastPiece < p) ++f; firstFiles[p] = f; } #if 0 /* test to confirm the first-file hints are correct */ for (p=0; ppieceCount; ++p) { f = firstFiles[p]; assert (inf->files[f].firstPiece <= p); assert (inf->files[f].lastPiece >= p); if (f > 0) assert (inf->files[f-1].lastPiece < p); for (f=0; ffileCount; ++f) if (pieceHasFile (p, &inf->files[f])) break; assert ((int)f == firstFiles[p]); } #endif for (p=0; ppieceCount; ++p) inf->pieces[p].priority = calculatePiecePriority (tor, p, firstFiles[p]); tr_free (firstFiles); } static void torrentStart (tr_torrent * tor, bool bypass_queue); /** * Decide on a block size. Constraints: * (1) most clients decline requests over 16 KiB * (2) pieceSize must be a multiple of block size */ uint32_t tr_getBlockSize (uint32_t pieceSize) { uint32_t b = pieceSize; while (b > MAX_BLOCK_SIZE) b /= 2u; if (!b || (pieceSize % b)) /* not cleanly divisible */ return 0; return b; } static void refreshCurrentDir (tr_torrent * tor); static void torrentInitFromInfo (tr_torrent * tor) { uint64_t t; tr_info * info = &tor->info; tor->blockSize = tr_getBlockSize (info->pieceSize); if (info->pieceSize) tor->lastPieceSize = (uint32_t)(info->totalSize % info->pieceSize); if (!tor->lastPieceSize) tor->lastPieceSize = info->pieceSize; if (tor->blockSize) tor->lastBlockSize = info->totalSize % tor->blockSize; if (!tor->lastBlockSize) tor->lastBlockSize = tor->blockSize; tor->blockCount = tor->blockSize ? (info->totalSize + tor->blockSize - 1) / tor->blockSize : 0; tor->blockCountInPiece = tor->blockSize ? info->pieceSize / tor->blockSize : 0; tor->blockCountInLastPiece = tor->blockSize ? (tor->lastPieceSize + tor->blockSize - 1) / tor->blockSize : 0; /* check our work */ if (tor->blockSize != 0) assert ((info->pieceSize % tor->blockSize) == 0); t = info->pieceCount - 1; t *= info->pieceSize; t += tor->lastPieceSize; assert (t == info->totalSize); t = tor->blockCount - 1; t *= tor->blockSize; t += tor->lastBlockSize; assert (t == info->totalSize); t = info->pieceCount - 1; t *= tor->blockCountInPiece; t += tor->blockCountInLastPiece; assert (t == (uint64_t)tor->blockCount); tr_cpConstruct (&tor->completion, tor); tr_torrentInitFilePieces (tor); tor->completeness = tr_cpGetStatus (&tor->completion); } static void tr_torrentFireMetadataCompleted (tr_torrent * tor); void tr_torrentGotNewInfoDict (tr_torrent * tor) { torrentInitFromInfo (tor); tr_peerMgrOnTorrentGotMetainfo (tor); tr_torrentFireMetadataCompleted (tor); } static bool hasAnyLocalData (const tr_torrent * tor) { tr_file_index_t i; for (i=0; iinfo.fileCount; ++i) if (tr_torrentFindFile2 (tor, i, NULL, NULL, NULL)) return true; return false; } static bool setLocalErrorIfFilesDisappeared (tr_torrent * tor) { const bool disappeared = (tr_torrentHaveTotal (tor) > 0) && !hasAnyLocalData (tor); if (disappeared) { tr_deeplog_tor (tor, "%s", "[LAZY] uh oh, the files disappeared"); tr_torrentSetLocalError (tor, "%s", _("No data found! Ensure your drives are connected or use \"Set Location\". To re-download, remove the torrent and re-add it.")); } return disappeared; } static void torrentInit (tr_torrent * tor, const tr_ctor * ctor) { bool doStart; uint64_t loaded; const char * dir; bool isNewTorrent; tr_session * session = tr_ctorGetSession (ctor); static int nextUniqueId = 1; assert (session != NULL); tr_sessionLock (session); tor->session = session; tor->uniqueId = nextUniqueId++; tor->magicNumber = TORRENT_MAGIC_NUMBER; tor->queuePosition = session->torrentCount; tr_sha1 (tor->obfuscatedHash, "req2", 4, tor->info.hash, SHA_DIGEST_LENGTH, NULL); if (tr_ctorGetDownloadDir (ctor, TR_FORCE, &dir) || tr_ctorGetDownloadDir (ctor, TR_FALLBACK, &dir)) tor->downloadDir = tr_strdup (dir); if (!tr_ctorGetIncompleteDir (ctor, &dir)) dir = tr_sessionGetIncompleteDir (session); if (tr_sessionIsIncompleteDirEnabled (session)) tor->incompleteDir = tr_strdup (dir); tr_bandwidthConstruct (&tor->bandwidth, session, &session->bandwidth); tor->bandwidth.priority = tr_ctorGetBandwidthPriority (ctor); tor->error = TR_STAT_OK; tor->finishedSeedingByIdle = false; tr_peerMgrAddTorrent (session->peerMgr, tor); assert (!tor->downloadedCur); assert (!tor->uploadedCur); tr_torrentSetAddedDate (tor, tr_time ()); /* this is a default value to be overwritten by the resume file */ torrentInitFromInfo (tor); loaded = tr_torrentLoadResume (tor, ~0, ctor); tor->completeness = tr_cpGetStatus (&tor->completion); setLocalErrorIfFilesDisappeared (tor); tr_ctorInitTorrentPriorities (ctor, tor); tr_ctorInitTorrentWanted (ctor, tor); refreshCurrentDir (tor); doStart = tor->isRunning; tor->isRunning = false; if (!(loaded & TR_FR_SPEEDLIMIT)) { tr_torrentUseSpeedLimit (tor, TR_UP, false); tr_torrentSetSpeedLimit_Bps (tor, TR_UP, tr_sessionGetSpeedLimit_Bps (tor->session, TR_UP)); tr_torrentUseSpeedLimit (tor, TR_DOWN, false); tr_torrentSetSpeedLimit_Bps (tor, TR_DOWN, tr_sessionGetSpeedLimit_Bps (tor->session, TR_DOWN)); tr_torrentUseSessionLimits (tor, true); } if (!(loaded & TR_FR_RATIOLIMIT)) { tr_torrentSetRatioMode (tor, TR_RATIOLIMIT_GLOBAL); tr_torrentSetRatioLimit (tor, tr_sessionGetRatioLimit (tor->session)); } if (!(loaded & TR_FR_IDLELIMIT)) { tr_torrentSetIdleMode (tor, TR_IDLELIMIT_GLOBAL); tr_torrentSetIdleLimit (tor, tr_sessionGetIdleLimit (tor->session)); } /* add the torrent to tr_session.torrentList */ session->torrentCount++; if (session->torrentList == NULL) { session->torrentList = tor; } else { tr_torrent * it = session->torrentList; while (it->next != NULL) it = it->next; it->next = tor; } /* if we don't have a local .torrent file already, assume the torrent is new */ isNewTorrent = !tr_sys_path_exists (tor->info.torrent, NULL); /* maybe save our own copy of the metainfo */ if (tr_ctorGetSave (ctor)) { const tr_variant * val; if (tr_ctorGetMetainfo (ctor, &val)) { const char * path = tor->info.torrent; const int err = tr_variantToFile (val, TR_VARIANT_FMT_BENC, path); if (err) tr_torrentSetLocalError (tor, "Unable to save torrent file: %s", tr_strerror (err)); tr_sessionSetTorrentFile (tor->session, tor->info.hashString, path); } } tor->tiers = tr_announcerAddTorrent (tor, onTrackerResponse, NULL); if (isNewTorrent) { tor->startAfterVerify = doStart; tr_torrentVerify (tor, NULL, NULL); } else if (doStart) { tr_torrentStart (tor); } tr_sessionUnlock (session); } static tr_parse_result torrentParseImpl (const tr_ctor * ctor, tr_info * setmeInfo, bool * setmeHasInfo, size_t * dictLength, int * setme_duplicate_id) { bool doFree; bool didParse; bool hasInfo = false; tr_info tmp; const tr_variant * metainfo; tr_session * session = tr_ctorGetSession (ctor); tr_parse_result result = TR_PARSE_OK; if (setmeInfo == NULL) setmeInfo = &tmp; memset (setmeInfo, 0, sizeof (tr_info)); if (!tr_ctorGetMetainfo (ctor, &metainfo)) return TR_PARSE_ERR; didParse = tr_metainfoParse (session, metainfo, setmeInfo, &hasInfo, dictLength); doFree = didParse && (setmeInfo == &tmp); if (!didParse) result = TR_PARSE_ERR; if (didParse && hasInfo && !tr_getBlockSize (setmeInfo->pieceSize)) result = TR_PARSE_ERR; if (didParse && session && (result == TR_PARSE_OK)) { const tr_torrent * const tor = tr_torrentFindFromHash (session, setmeInfo->hash); if (tor != NULL) { result = TR_PARSE_DUPLICATE; if (setme_duplicate_id != NULL) *setme_duplicate_id = tr_torrentId (tor); } } if (doFree) tr_metainfoFree (setmeInfo); if (setmeHasInfo != NULL) *setmeHasInfo = hasInfo; return result; } tr_parse_result tr_torrentParse (const tr_ctor * ctor, tr_info * setmeInfo) { return torrentParseImpl (ctor, setmeInfo, NULL, NULL, NULL); } tr_torrent * tr_torrentNew (const tr_ctor * ctor, int * setme_error, int * setme_duplicate_id) { size_t len; bool hasInfo; tr_info tmpInfo; tr_parse_result r; tr_torrent * tor = NULL; assert (ctor != NULL); assert (tr_isSession (tr_ctorGetSession (ctor))); r = torrentParseImpl (ctor, &tmpInfo, &hasInfo, &len, setme_duplicate_id); if (r == TR_PARSE_OK) { tor = tr_new0 (tr_torrent, 1); tor->info = tmpInfo; if (hasInfo) tor->infoDictLength = len; torrentInit (tor, ctor); } else { if (r == TR_PARSE_DUPLICATE) tr_metainfoFree (&tmpInfo); if (setme_error != NULL) *setme_error = r; } return tor; } /** *** **/ void tr_torrentSetDownloadDir (tr_torrent * tor, const char * path) { assert (tr_isTorrent (tor)); if (!path || !tor->downloadDir || strcmp (path, tor->downloadDir)) { tr_free (tor->downloadDir); tor->downloadDir = tr_strdup (path); tr_torrentSetDirty (tor); } refreshCurrentDir (tor); } const char* tr_torrentGetDownloadDir (const tr_torrent * tor) { assert (tr_isTorrent (tor)); return tor->downloadDir; } const char * tr_torrentGetCurrentDir (const tr_torrent * tor) { assert (tr_isTorrent (tor)); return tor->currentDir; } void tr_torrentChangeMyPort (tr_torrent * tor) { assert (tr_isTorrent (tor)); if (tor->isRunning) tr_announcerChangeMyPort (tor); } static inline void tr_torrentManualUpdateImpl (void * vtor) { tr_torrent * tor = vtor; assert (tr_isTorrent (tor)); if (tor->isRunning) tr_announcerManualAnnounce (tor); } void tr_torrentManualUpdate (tr_torrent * tor) { assert (tr_isTorrent (tor)); tr_runInEventThread (tor->session, tr_torrentManualUpdateImpl, tor); } bool tr_torrentCanManualUpdate (const tr_torrent * tor) { return (tr_isTorrent (tor)) && (tor->isRunning) && (tr_announcerCanManualAnnounce (tor)); } const tr_info * tr_torrentInfo (const tr_torrent * tor) { return tr_isTorrent (tor) ? &tor->info : NULL; } const tr_stat * tr_torrentStatCached (tr_torrent * tor) { const time_t now = tr_time (); return tr_isTorrent (tor) && (now == tor->lastStatTime) ? &tor->stats : tr_torrentStat (tor); } void tr_torrentSetVerifyState (tr_torrent * tor, tr_verify_state state) { assert (tr_isTorrent (tor)); assert (state==TR_VERIFY_NONE || state==TR_VERIFY_WAIT || state==TR_VERIFY_NOW); tor->verifyState = state; tor->anyDate = tr_time (); } tr_torrent_activity tr_torrentGetActivity (const tr_torrent * tor) { tr_torrent_activity ret = TR_STATUS_STOPPED; const bool is_seed = tr_torrentIsSeed (tor); if (tor->verifyState == TR_VERIFY_NOW) { ret = TR_STATUS_CHECK; } else if (tor->verifyState == TR_VERIFY_WAIT) { ret = TR_STATUS_CHECK_WAIT; } else if (tor->isRunning) { ret = is_seed ? TR_STATUS_SEED : TR_STATUS_DOWNLOAD; } else if (tr_torrentIsQueued (tor)) { if (is_seed && tr_sessionGetQueueEnabled (tor->session, TR_UP)) ret = TR_STATUS_SEED_WAIT; else if (!is_seed && tr_sessionGetQueueEnabled (tor->session, TR_DOWN)) ret = TR_STATUS_DOWNLOAD_WAIT; } return ret; } static time_t torrentGetIdleSecs (const tr_torrent * tor) { int idle_secs; const tr_torrent_activity activity = tr_torrentGetActivity (tor); if ((activity == TR_STATUS_DOWNLOAD || activity == TR_STATUS_SEED) && tor->startDate != 0) idle_secs = difftime (tr_time (), MAX (tor->startDate, tor->activityDate)); else idle_secs = -1; return idle_secs; } bool tr_torrentIsStalled (const tr_torrent * tor) { return tr_sessionGetQueueStalledEnabled (tor->session) && (torrentGetIdleSecs (tor) > (tr_sessionGetQueueStalledMinutes (tor->session) * 60)); } static double getVerifyProgress (const tr_torrent * tor) { double d = 0; if (tr_torrentHasMetadata (tor)) { tr_piece_index_t i, n; tr_piece_index_t checked = 0; for (i=0, n=tor->info.pieceCount; i!=n; ++i) if (tor->info.pieces[i].timeChecked) ++checked; d = checked / (double)tor->info.pieceCount; } return d; } const tr_stat * tr_torrentStat (tr_torrent * tor) { tr_stat * s; uint64_t seedRatioBytesLeft; uint64_t seedRatioBytesGoal; bool seedRatioApplies; uint16_t seedIdleMinutes; const uint64_t now = tr_time_msec (); unsigned int pieceUploadSpeed_Bps; unsigned int pieceDownloadSpeed_Bps; struct tr_swarm_stats swarm_stats; int i; assert (tr_isTorrent (tor)); tor->lastStatTime = tr_time (); if (tor->swarm != NULL) tr_swarmGetStats (tor->swarm, &swarm_stats); else swarm_stats = TR_SWARM_STATS_INIT; s = &tor->stats; s->id = tor->uniqueId; s->activity = tr_torrentGetActivity (tor); s->error = tor->error; s->queuePosition = tor->queuePosition; s->isStalled = tr_torrentIsStalled (tor); tr_strlcpy (s->errorString, tor->errorString, sizeof (s->errorString)); s->manualAnnounceTime = tr_announcerNextManualAnnounce (tor); s->peersConnected = swarm_stats.peerCount; s->peersSendingToUs = swarm_stats.activePeerCount[TR_DOWN]; s->peersGettingFromUs = swarm_stats.activePeerCount[TR_UP]; s->webseedsSendingToUs = swarm_stats.activeWebseedCount; for (i=0; ipeersFrom[i] = swarm_stats.peerFromCount[i]; s->rawUploadSpeed_KBps = toSpeedKBps (tr_bandwidthGetRawSpeed_Bps (&tor->bandwidth, now, TR_UP)); s->rawDownloadSpeed_KBps = toSpeedKBps (tr_bandwidthGetRawSpeed_Bps (&tor->bandwidth, now, TR_DOWN)); pieceUploadSpeed_Bps = tr_bandwidthGetPieceSpeed_Bps (&tor->bandwidth, now, TR_UP); pieceDownloadSpeed_Bps = tr_bandwidthGetPieceSpeed_Bps (&tor->bandwidth, now, TR_DOWN); s->pieceUploadSpeed_KBps = toSpeedKBps (pieceUploadSpeed_Bps); s->pieceDownloadSpeed_KBps = toSpeedKBps (pieceDownloadSpeed_Bps); s->percentComplete = tr_cpPercentComplete (&tor->completion); s->metadataPercentComplete = tr_torrentGetMetadataPercent (tor); s->percentDone = tr_cpPercentDone (&tor->completion); s->leftUntilDone = tr_torrentGetLeftUntilDone (tor); s->sizeWhenDone = tr_cpSizeWhenDone (&tor->completion); s->recheckProgress = s->activity == TR_STATUS_CHECK ? getVerifyProgress (tor) : 0; s->activityDate = tor->activityDate; s->addedDate = tor->addedDate; s->doneDate = tor->doneDate; s->startDate = tor->startDate; s->secondsSeeding = tor->secondsSeeding; s->secondsDownloading = tor->secondsDownloading; s->idleSecs = torrentGetIdleSecs (tor); s->corruptEver = tor->corruptCur + tor->corruptPrev; s->downloadedEver = tor->downloadedCur + tor->downloadedPrev; s->uploadedEver = tor->uploadedCur + tor->uploadedPrev; s->haveValid = tr_cpHaveValid (&tor->completion); s->haveUnchecked = tr_torrentHaveTotal (tor) - s->haveValid; s->desiredAvailable = tr_peerMgrGetDesiredAvailable (tor); s->ratio = tr_getRatio (s->uploadedEver, s->downloadedEver ? s->downloadedEver : s->haveValid); seedRatioApplies = tr_torrentGetSeedRatioBytes (tor, &seedRatioBytesLeft, &seedRatioBytesGoal); switch (s->activity) { /* etaXLSpeed exists because if we use the piece speed directly, * brief fluctuations cause the ETA to jump all over the place. * so, etaXLSpeed is a smoothed-out version of the piece speed * to dampen the effect of fluctuations */ case TR_STATUS_DOWNLOAD: if ((tor->etaDLSpeedCalculatedAt + 800) < now) { tor->etaDLSpeedCalculatedAt = now; tor->etaDLSpeed_Bps = ((tor->etaDLSpeedCalculatedAt + 4000) < now) ? pieceDownloadSpeed_Bps /* if no recent previous speed, no need to smooth */ : ((tor->etaDLSpeed_Bps*4.0) + pieceDownloadSpeed_Bps)/5.0; /* smooth across 5 readings */ } if ((s->leftUntilDone > s->desiredAvailable) && (tor->info.webseedCount < 1)) s->eta = TR_ETA_NOT_AVAIL; else if (tor->etaDLSpeed_Bps == 0) s->eta = TR_ETA_UNKNOWN; else s->eta = s->leftUntilDone / tor->etaDLSpeed_Bps; s->etaIdle = TR_ETA_NOT_AVAIL; break; case TR_STATUS_SEED: if (!seedRatioApplies) { s->eta = TR_ETA_NOT_AVAIL; } else { if ((tor->etaULSpeedCalculatedAt + 800) < now) { tor->etaULSpeedCalculatedAt = now; tor->etaULSpeed_Bps = ((tor->etaULSpeedCalculatedAt + 4000) < now) ? pieceUploadSpeed_Bps /* if no recent previous speed, no need to smooth */ : ((tor->etaULSpeed_Bps*4.0) + pieceUploadSpeed_Bps)/5.0; /* smooth across 5 readings */ } if (tor->etaULSpeed_Bps == 0) s->eta = TR_ETA_UNKNOWN; else s->eta = seedRatioBytesLeft / tor->etaULSpeed_Bps; } if (tor->etaULSpeed_Bps < 1 && tr_torrentGetSeedIdle (tor, &seedIdleMinutes)) s->etaIdle = seedIdleMinutes * 60 - s->idleSecs; else s->etaIdle = TR_ETA_NOT_AVAIL; break; default: s->eta = TR_ETA_NOT_AVAIL; s->etaIdle = TR_ETA_NOT_AVAIL; break; } /* s->haveValid is here to make sure a torrent isn't marked 'finished' * when the user hits "uncheck all" prior to starting the torrent... */ s->finished = tor->finishedSeedingByIdle || (seedRatioApplies && !seedRatioBytesLeft && s->haveValid); if (!seedRatioApplies || s->finished) s->seedRatioPercentDone = 1; else if (!seedRatioBytesGoal) /* impossible? safeguard for div by zero */ s->seedRatioPercentDone = 0; else s->seedRatioPercentDone = (double)(seedRatioBytesGoal - seedRatioBytesLeft) / seedRatioBytesGoal; /* test some of the constraints */ assert (s->sizeWhenDone <= tor->info.totalSize); assert (s->leftUntilDone <= s->sizeWhenDone); assert (s->desiredAvailable <= s->leftUntilDone); return s; } /*** **** ***/ static uint64_t countFileBytesCompleted (const tr_torrent * tor, tr_file_index_t index) { uint64_t total = 0; const tr_file * f = &tor->info.files[index]; if (f->length) { tr_block_index_t first; tr_block_index_t last; tr_torGetFileBlockRange (tor, index, &first, &last); if (first == last) { if (tr_torrentBlockIsComplete (tor, first)) total = f->length; } else { /* the first block */ if (tr_torrentBlockIsComplete (tor, first)) total += tor->blockSize - (f->offset % tor->blockSize); /* the middle blocks */ if (first + 1 < last) { uint64_t u = tr_bitfieldCountRange (&tor->completion.blockBitfield, first+1, last); u *= tor->blockSize; total += u; } /* the last block */ if (tr_torrentBlockIsComplete (tor, last)) total += (f->offset + f->length) - ((uint64_t)tor->blockSize * last); } } return total; } tr_file_stat * tr_torrentFiles (const tr_torrent * tor, tr_file_index_t * fileCount) { tr_file_index_t i; const tr_file_index_t n = tor->info.fileCount; tr_file_stat * files = tr_new0 (tr_file_stat, n); tr_file_stat * walk = files; const bool isSeed = tor->completeness == TR_SEED; assert (tr_isTorrent (tor)); for (i=0; iinfo.files[i].length : countFileBytesCompleted (tor, i); walk->bytesCompleted = b; walk->progress = tor->info.files[i].length > 0 ? ((float)b / tor->info.files[i].length) : 1.0f; } if (fileCount != NULL) *fileCount = n; return files; } void tr_torrentFilesFree (tr_file_stat * files, tr_file_index_t fileCount UNUSED) { tr_free (files); } /*** **** ***/ double* tr_torrentWebSpeeds_KBps (const tr_torrent * tor) { assert (tr_isTorrent (tor)); return tr_peerMgrWebSpeeds_KBps (tor); } tr_peer_stat * tr_torrentPeers (const tr_torrent * tor, int * peerCount) { assert (tr_isTorrent (tor)); return tr_peerMgrPeerStats (tor, peerCount); } void tr_torrentPeersFree (tr_peer_stat * peers, int peerCount UNUSED) { tr_free (peers); } tr_tracker_stat * tr_torrentTrackers (const tr_torrent * tor, int * setmeTrackerCount) { assert (tr_isTorrent (tor)); return tr_announcerStats (tor, setmeTrackerCount); } void tr_torrentTrackersFree (tr_tracker_stat * trackers, int trackerCount) { tr_announcerStatsFree (trackers, trackerCount); } void tr_torrentAvailability (const tr_torrent * tor, int8_t * tab, int size) { assert (tr_isTorrent (tor)); if ((tab != NULL) && (size > 0)) tr_peerMgrTorrentAvailability (tor, tab, size); } void tr_torrentAmountFinished (const tr_torrent * tor, float * tab, int size) { tr_cpGetAmountDone (&tor->completion, tab, size); } static void tr_torrentResetTransferStats (tr_torrent * tor) { tr_torrentLock (tor); tor->downloadedPrev += tor->downloadedCur; tor->downloadedCur = 0; tor->uploadedPrev += tor->uploadedCur; tor->uploadedCur = 0; tor->corruptPrev += tor->corruptCur; tor->corruptCur = 0; tr_torrentSetDirty (tor); tr_torrentUnlock (tor); } void tr_torrentSetHasPiece (tr_torrent * tor, tr_piece_index_t pieceIndex, bool has) { assert (tr_isTorrent (tor)); assert (pieceIndex < tor->info.pieceCount); if (has) tr_cpPieceAdd (&tor->completion, pieceIndex); else tr_cpPieceRem (&tor->completion, pieceIndex); } /*** **** ***/ #ifndef NDEBUG static bool queueIsSequenced (tr_session *); #endif static void freeTorrent (tr_torrent * tor) { tr_torrent * t; tr_session * session = tor->session; tr_info * inf = &tor->info; const time_t now = tr_time (); assert (!tor->isRunning); tr_sessionLock (session); tr_peerMgrRemoveTorrent (tor); tr_announcerRemoveTorrent (session->announcer, tor); tr_cpDestruct (&tor->completion); tr_free (tor->downloadDir); tr_free (tor->incompleteDir); if (tor == session->torrentList) { session->torrentList = tor->next; } else for (t = session->torrentList; t != NULL; t = t->next) { if (t->next == tor) { t->next = tor->next; break; } } /* decrement the torrent count */ assert (session->torrentCount >= 1); session->torrentCount--; /* resequence the queue positions */ t = NULL; while ((t = tr_torrentNext (session, t))) { if (t->queuePosition > tor->queuePosition) { t->queuePosition--; t->anyDate = now; } } assert (queueIsSequenced (session)); tr_bandwidthDestruct (&tor->bandwidth); tr_metainfoFree (inf); memset (tor, ~0, sizeof (tr_torrent)); tr_free (tor); tr_sessionUnlock (session); } /** *** Start/Stop Callback **/ static void torrentSetQueued (tr_torrent * tor, bool queued); static void torrentStartImpl (void * vtor) { time_t now; tr_torrent * tor = vtor; assert (tr_isTorrent (tor)); tr_sessionLock (tor->session); tr_torrentRecheckCompleteness (tor); torrentSetQueued (tor, false); now = tr_time (); tor->isRunning = true; tor->completeness = tr_cpGetStatus (&tor->completion); tor->startDate = tor->anyDate = now; tr_torrentClearError (tor); tor->finishedSeedingByIdle = false; tr_torrentResetTransferStats (tor); tr_announcerTorrentStarted (tor); tor->dhtAnnounceAt = now + tr_rand_int_weak (20); tor->dhtAnnounce6At = now + tr_rand_int_weak (20); tor->lpdAnnounceAt = now; tr_peerMgrStartTorrent (tor); tr_sessionUnlock (tor->session); } uint64_t tr_torrentGetCurrentSizeOnDisk (const tr_torrent * tor) { tr_file_index_t i; uint64_t byte_count = 0; const tr_file_index_t n = tor->info.fileCount; for (i=0; isession, dir) == 0; } static void torrentStart (tr_torrent * tor, bool bypass_queue) { switch (tr_torrentGetActivity (tor)) { case TR_STATUS_SEED: case TR_STATUS_DOWNLOAD: return; /* already started */ break; case TR_STATUS_SEED_WAIT: case TR_STATUS_DOWNLOAD_WAIT: if (!bypass_queue) return; /* already queued */ break; case TR_STATUS_CHECK: case TR_STATUS_CHECK_WAIT: /* verifying right now... wait until that's done so * we'll know what completeness to use/announce */ tor->startAfterVerify = true; return; break; case TR_STATUS_STOPPED: if (!bypass_queue && torrentShouldQueue (tor)) { torrentSetQueued (tor, true); return; } break; } /* don't allow the torrent to be started if the files disappeared */ if (setLocalErrorIfFilesDisappeared (tor)) return; /* otherwise, start it now... */ tr_sessionLock (tor->session); /* allow finished torrents to be resumed */ if (tr_torrentIsSeedRatioDone (tor)) { tr_logAddTorInfo (tor, "%s", _("Restarted manually -- disabling its seed ratio")); tr_torrentSetRatioMode (tor, TR_RATIOLIMIT_UNLIMITED); } /* corresponds to the peer_id sent as a tracker request parameter. * one tracker admin says: "When the same torrent is opened and * closed and opened again without quitting Transmission ... * change the peerid. It would help sometimes if a stopped event * was missed to ensure that we didn't think someone was cheating. */ tr_torrentUnsetPeerId (tor); tor->isRunning = true; tr_torrentSetDirty (tor); tr_runInEventThread (tor->session, torrentStartImpl, tor); tr_sessionUnlock (tor->session); } void tr_torrentStart (tr_torrent * tor) { if (tr_isTorrent (tor)) torrentStart (tor, false); } void tr_torrentStartNow (tr_torrent * tor) { if (tr_isTorrent (tor)) torrentStart (tor, true); } struct verify_data { bool aborted; tr_torrent * tor; tr_verify_done_func callback_func; void * callback_data; }; static void onVerifyDoneThreadFunc (void * vdata) { struct verify_data * data = vdata; tr_torrent * tor = data->tor; if (!data->aborted) tr_torrentRecheckCompleteness (tor); if (data->callback_func != NULL) (*data->callback_func)(tor, data->aborted, data->callback_data); if (!data->aborted && tor->startAfterVerify) { tor->startAfterVerify = false; torrentStart (tor, false); } tr_free (data); } static void onVerifyDone (tr_torrent * tor, bool aborted, void * vdata) { struct verify_data * data = vdata; assert (data->tor == tor); data->aborted = aborted; tr_runInEventThread (tor->session, onVerifyDoneThreadFunc, data); } static void verifyTorrent (void * vdata) { bool startAfter; struct verify_data * data = vdata; tr_torrent * tor = data->tor; tr_sessionLock (tor->session); /* if the torrent's already being verified, stop it */ tr_verifyRemove (tor); startAfter = (tor->isRunning || tor->startAfterVerify) && !tor->isStopping; if (tor->isRunning) tr_torrentStop (tor); tor->startAfterVerify = startAfter; if (setLocalErrorIfFilesDisappeared (tor)) tor->startAfterVerify = false; else tr_verifyAdd (tor, onVerifyDone, data); tr_sessionUnlock (tor->session); } void tr_torrentVerify (tr_torrent * tor, tr_verify_done_func callback_func, void * callback_data) { struct verify_data * data; data = tr_new (struct verify_data, 1); data->tor = tor; data->aborted = false; data->callback_func = callback_func; data->callback_data = callback_data; tr_runInEventThread (tor->session, verifyTorrent, data); } void tr_torrentSave (tr_torrent * tor) { assert (tr_isTorrent (tor)); if (tor->isDirty) { tor->isDirty = false; tr_torrentSaveResume (tor); } } static void stopTorrent (void * vtor) { tr_torrent * tor = vtor; tr_logAddTorInfo (tor, "%s", "Pausing"); assert (tr_isTorrent (tor)); tr_torrentLock (tor); tr_verifyRemove (tor); tr_peerMgrStopTorrent (tor); tr_announcerTorrentStopped (tor); tr_cacheFlushTorrent (tor->session->cache, tor); tr_fdTorrentClose (tor->session, tor->uniqueId); if (!tor->isDeleting) tr_torrentSave (tor); torrentSetQueued (tor, false); tr_torrentUnlock (tor); if (tor->magnetVerify) { tor->magnetVerify = false; tr_logAddTorInfo (tor, "%s", "Magnet Verify"); refreshCurrentDir (tor); tr_torrentVerify (tor, NULL, NULL); } } void tr_torrentStop (tr_torrent * tor) { assert (tr_isTorrent (tor)); if (tr_isTorrent (tor)) { tr_sessionLock (tor->session); tor->isRunning = false; tor->isStopping = false; tr_torrentSetDirty (tor); tr_runInEventThread (tor->session, stopTorrent, tor); tr_sessionUnlock (tor->session); } } static void closeTorrent (void * vtor) { tr_variant * d; tr_torrent * tor = vtor; assert (tr_isTorrent (tor)); d = tr_variantListAddDict (&tor->session->removedTorrents, 2); tr_variantDictAddInt (d, TR_KEY_id, tor->uniqueId); tr_variantDictAddInt (d, TR_KEY_date, tr_time ()); tr_logAddTorInfo (tor, "%s", _("Removing torrent")); tor->magnetVerify = false; stopTorrent (tor); if (tor->isDeleting) { tr_metainfoRemoveSaved (tor->session, &tor->info); tr_torrentRemoveResume (tor); } tor->isRunning = false; freeTorrent (tor); } void tr_torrentFree (tr_torrent * tor) { if (tr_isTorrent (tor)) { tr_session * session = tor->session; assert (tr_isSession (session)); tr_sessionLock (session); tr_torrentClearCompletenessCallback (tor); tr_runInEventThread (session, closeTorrent, tor); tr_sessionUnlock (session); } } struct remove_data { tr_torrent * tor; bool deleteFlag; tr_fileFunc deleteFunc; }; static void tr_torrentDeleteLocalData (tr_torrent *, tr_fileFunc); static void removeTorrent (void * vdata) { struct remove_data * data = vdata; tr_session * session = data->tor->session; tr_sessionLock (session); if (data->deleteFlag) tr_torrentDeleteLocalData (data->tor, data->deleteFunc); tr_torrentClearCompletenessCallback (data->tor); closeTorrent (data->tor); tr_free (data); tr_sessionUnlock (session); } void tr_torrentRemove (tr_torrent * tor, bool deleteFlag, tr_fileFunc deleteFunc) { struct remove_data * data; assert (tr_isTorrent (tor)); tor->isDeleting = true; data = tr_new0 (struct remove_data, 1); data->tor = tor; data->deleteFlag = deleteFlag; data->deleteFunc = deleteFunc; tr_runInEventThread (tor->session, removeTorrent, data); } /** *** Completeness **/ static const char * getCompletionString (int type) { switch (type) { /* Translators: this is a minor point that's safe to skip over, but FYI: "Complete" and "Done" are specific, different terms in Transmission: "Complete" means we've downloaded every file in the torrent. "Done" means we're done downloading the files we wanted, but NOT all that exist */ case TR_PARTIAL_SEED: return _("Done"); case TR_SEED: return _("Complete"); default: return _("Incomplete"); } } static void fireCompletenessChange (tr_torrent * tor, tr_completeness status, bool wasRunning) { assert ((status == TR_LEECH) || (status == TR_SEED) || (status == TR_PARTIAL_SEED)); if (tor->completeness_func) tor->completeness_func (tor, status, wasRunning, tor->completeness_func_user_data); } void tr_torrentSetCompletenessCallback (tr_torrent * tor, tr_torrent_completeness_func func, void * user_data) { assert (tr_isTorrent (tor)); tor->completeness_func = func; tor->completeness_func_user_data = user_data; } void tr_torrentClearCompletenessCallback (tr_torrent * torrent) { tr_torrentSetCompletenessCallback (torrent, NULL, NULL); } void tr_torrentSetRatioLimitHitCallback (tr_torrent * tor, tr_torrent_ratio_limit_hit_func func, void * user_data) { assert (tr_isTorrent (tor)); tor->ratio_limit_hit_func = func; tor->ratio_limit_hit_func_user_data = user_data; } void tr_torrentClearRatioLimitHitCallback (tr_torrent * torrent) { tr_torrentSetRatioLimitHitCallback (torrent, NULL, NULL); } void tr_torrentSetIdleLimitHitCallback (tr_torrent * tor, tr_torrent_idle_limit_hit_func func, void * user_data) { assert (tr_isTorrent (tor)); tor->idle_limit_hit_func = func; tor->idle_limit_hit_func_user_data = user_data; } void tr_torrentClearIdleLimitHitCallback (tr_torrent * torrent) { tr_torrentSetIdleLimitHitCallback (torrent, NULL, NULL); } #ifndef _WIN32 static void onSigCHLD (int i UNUSED) { int rc; do rc = waitpid (-1, NULL, WNOHANG); while (rc>0 || (rc==-1 && errno==EINTR)); } #endif static void torrentCallScript (const tr_torrent * tor, const char * script) { char timeStr[128], * newlinePos; const time_t now = tr_time (); tr_strlcpy (timeStr, ctime (&now), sizeof (timeStr)); /* ctime () includes '\n', but it's better to be safe */ newlinePos = strchr (timeStr, '\n'); if (newlinePos != NULL) *newlinePos = '\0'; if (script && *script) { size_t i; char * cmd[] = { tr_strdup (script), NULL }; char * env[] = { tr_strdup_printf ("TR_APP_VERSION=%s", SHORT_VERSION_STRING), tr_strdup_printf ("TR_TIME_LOCALTIME=%s", timeStr), tr_strdup_printf ("TR_TORRENT_DIR=%s", tor->currentDir), tr_strdup_printf ("TR_TORRENT_HASH=%s", tor->info.hashString), tr_strdup_printf ("TR_TORRENT_ID=%d", tr_torrentId (tor)), tr_strdup_printf ("TR_TORRENT_NAME=%s", tr_torrentName (tor)), NULL }; tr_logAddTorInfo (tor, "Calling script \"%s\"", script); #ifndef NDEBUG /* Win32 environment block strings should be sorted alphabetically */ for (i = 1; env[i] != NULL; ++i) assert (strcmp (env[i - 1], env[i]) < 0); #endif #ifdef _WIN32 wchar_t * wide_script = tr_win32_utf8_to_native (script, -1); size_t env_block_size = 0; char * env_block = NULL; for (i = 0; env[i] != NULL; ++i) { const size_t len = strlen (env[i]) + 1; env_block = tr_renew (char, env_block, env_block_size + len + 1); memcpy (env_block + env_block_size, env[i], len + 1); env_block_size += len; } wchar_t * wide_env_block = NULL; if (env_block != NULL) { env_block[env_block_size] = '\0'; wide_env_block = tr_win32_utf8_to_native (env_block, env_block_size + 1); tr_free (env_block); } STARTUPINFOW si = { 0, }; si.cb = sizeof (si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; PROCESS_INFORMATION pi; if (CreateProcessW (wide_script, NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT | CREATE_NO_WINDOW | CREATE_DEFAULT_ERROR_MODE | DETACHED_PROCESS, wide_env_block, L"\\", &si, &pi)) { CloseHandle (pi.hThread); CloseHandle (pi.hProcess); } else { char * const message = tr_win32_format_message (GetLastError ()); tr_logAddTorErr (tor, "error executing script \"%s\": %s", script, message); tr_free (message); } tr_free (wide_env_block); tr_free (wide_script); #else /* _WIN32 */ signal (SIGCHLD, onSigCHLD); if (!fork ()) { for (i = 0; env[i] != NULL; ++i) putenv (env[i]); if (chdir ("/") == -1) { /* ignore (nice to have but not that critical) */ } if (execvp (script, cmd) == -1) tr_logAddTorErr (tor, "error executing script \"%s\": %s", script, tr_strerror (errno)); _exit (0); } #endif /* _WIN32 */ for (i = 0; cmd[i] != NULL; ++i) tr_free (cmd[i]); for (i = 0; env[i] != NULL; ++i) tr_free (env[i]); } } void tr_torrentRecheckCompleteness (tr_torrent * tor) { tr_completeness completeness; tr_torrentLock (tor); completeness = tr_cpGetStatus (&tor->completion); if (completeness != tor->completeness) { const bool recentChange = tor->downloadedCur != 0; const bool wasLeeching = !tr_torrentIsSeed (tor); const bool wasRunning = tor->isRunning; if (recentChange) tr_logAddTorInfo (tor, _("State changed from \"%1$s\" to \"%2$s\""), getCompletionString (tor->completeness), getCompletionString (completeness)); tor->completeness = completeness; tr_fdTorrentClose (tor->session, tor->uniqueId); if (tr_torrentIsSeed (tor)) { if (recentChange) { tr_announcerTorrentCompleted (tor); tor->doneDate = tor->anyDate = tr_time (); } if (wasLeeching && wasRunning) { /* clear interested flag on all peers */ tr_peerMgrClearInterest (tor); } if (tor->currentDir == tor->incompleteDir) tr_torrentSetLocation (tor, tor->downloadDir, true, NULL, NULL); } fireCompletenessChange (tor, completeness, wasRunning); if (tr_torrentIsSeed (tor)) { if (wasLeeching && wasRunning) { /* if completeness was TR_LEECH then the seed limit check will have been skipped in bandwidthPulse */ tr_torrentCheckSeedLimit (tor); } if (tr_sessionIsTorrentDoneScriptEnabled (tor->session)) torrentCallScript (tor, tr_sessionGetTorrentDoneScript (tor->session)); } tr_torrentSetDirty (tor); } tr_torrentUnlock (tor); } /*** **** ***/ static void tr_torrentFireMetadataCompleted (tr_torrent * tor) { assert (tr_isTorrent (tor)); if (tor->metadata_func != NULL) tor->metadata_func (tor, tor->metadata_func_user_data); } void tr_torrentSetMetadataCallback (tr_torrent * tor, tr_torrent_metadata_func func, void * user_data) { assert (tr_isTorrent (tor)); tor->metadata_func = func; tor->metadata_func_user_data = user_data; } /** *** File priorities **/ void tr_torrentInitFilePriority (tr_torrent * tor, tr_file_index_t fileIndex, tr_priority_t priority) { tr_file * file; tr_piece_index_t i; assert (tr_isTorrent (tor)); assert (fileIndex < tor->info.fileCount); assert (tr_isPriority (priority)); file = &tor->info.files[fileIndex]; file->priority = priority; for (i=file->firstPiece; i<=file->lastPiece; ++i) tor->info.pieces[i].priority = calculatePiecePriority (tor, i, fileIndex); } void tr_torrentSetFilePriorities (tr_torrent * tor, const tr_file_index_t * files, tr_file_index_t fileCount, tr_priority_t priority) { tr_file_index_t i; assert (tr_isTorrent (tor)); tr_torrentLock (tor); for (i=0; iinfo.fileCount) tr_torrentInitFilePriority (tor, files[i], priority); tr_torrentSetDirty (tor); tr_peerMgrRebuildRequests (tor); tr_torrentUnlock (tor); } tr_priority_t* tr_torrentGetFilePriorities (const tr_torrent * tor) { tr_file_index_t i; tr_priority_t * p; assert (tr_isTorrent (tor)); p = tr_new0 (tr_priority_t, tor->info.fileCount); for (i=0; iinfo.fileCount; ++i) p[i] = tor->info.files[i].priority; return p; } /** *** File DND **/ static void setFileDND (tr_torrent * tor, tr_file_index_t fileIndex, int doDownload) { const int8_t dnd = !doDownload; tr_piece_index_t firstPiece; int8_t firstPieceDND; tr_piece_index_t lastPiece; int8_t lastPieceDND; tr_file_index_t i; tr_file * file = &tor->info.files[fileIndex]; file->dnd = dnd; firstPiece = file->firstPiece; lastPiece = file->lastPiece; /* can't set the first piece to DND unless every file using that piece is DND */ firstPieceDND = dnd; if (fileIndex > 0) { for (i=fileIndex-1; firstPieceDND; --i) { if (tor->info.files[i].lastPiece != firstPiece) break; firstPieceDND = tor->info.files[i].dnd; if (!i) break; } } /* can't set the last piece to DND unless every file using that piece is DND */ lastPieceDND = dnd; for (i=fileIndex+1; lastPieceDND && iinfo.fileCount; ++i) { if (tor->info.files[i].firstPiece != lastPiece) break; lastPieceDND = tor->info.files[i].dnd; } if (firstPiece == lastPiece) { tor->info.pieces[firstPiece].dnd = firstPieceDND && lastPieceDND; } else { tr_piece_index_t pp; tor->info.pieces[firstPiece].dnd = firstPieceDND; tor->info.pieces[lastPiece].dnd = lastPieceDND; for (pp=firstPiece+1; ppinfo.pieces[pp].dnd = dnd; } } void tr_torrentInitFileDLs (tr_torrent * tor, const tr_file_index_t * files, tr_file_index_t fileCount, bool doDownload) { tr_file_index_t i; assert (tr_isTorrent (tor)); tr_torrentLock (tor); for (i=0; iinfo.fileCount) setFileDND (tor, files[i], doDownload); tr_cpInvalidateDND (&tor->completion); tr_torrentUnlock (tor); } void tr_torrentSetFileDLs (tr_torrent * tor, const tr_file_index_t * files, tr_file_index_t fileCount, bool doDownload) { assert (tr_isTorrent (tor)); tr_torrentLock (tor); tr_torrentInitFileDLs (tor, files, fileCount, doDownload); tr_torrentSetDirty (tor); tr_torrentRecheckCompleteness (tor); tr_peerMgrRebuildRequests (tor); tr_torrentUnlock (tor); } /*** **** ***/ tr_priority_t tr_torrentGetPriority (const tr_torrent * tor) { assert (tr_isTorrent (tor)); return tor->bandwidth.priority; } void tr_torrentSetPriority (tr_torrent * tor, tr_priority_t priority) { assert (tr_isTorrent (tor)); assert (tr_isPriority (priority)); if (tor->bandwidth.priority != priority) { tor->bandwidth.priority = priority; tr_torrentSetDirty (tor); } } /*** **** ***/ void tr_torrentSetPeerLimit (tr_torrent * tor, uint16_t maxConnectedPeers) { assert (tr_isTorrent (tor)); if (tor->maxConnectedPeers != maxConnectedPeers) { tor->maxConnectedPeers = maxConnectedPeers; tr_torrentSetDirty (tor); } } uint16_t tr_torrentGetPeerLimit (const tr_torrent * tor) { assert (tr_isTorrent (tor)); return tor->maxConnectedPeers; } /*** **** ***/ void tr_torrentGetBlockLocation (const tr_torrent * tor, tr_block_index_t block, tr_piece_index_t * piece, uint32_t * offset, uint32_t * length) { uint64_t pos = block; pos *= tor->blockSize; *piece = pos / tor->info.pieceSize; *offset = pos - (*piece * tor->info.pieceSize); *length = tr_torBlockCountBytes (tor, block); } tr_block_index_t _tr_block (const tr_torrent * tor, tr_piece_index_t index, uint32_t offset) { tr_block_index_t ret; assert (tr_isTorrent (tor)); ret = index; ret *= (tor->info.pieceSize / tor->blockSize); ret += offset / tor->blockSize; return ret; } bool tr_torrentReqIsValid (const tr_torrent * tor, tr_piece_index_t index, uint32_t offset, uint32_t length) { int err = 0; assert (tr_isTorrent (tor)); if (index >= tor->info.pieceCount) err = 1; else if (length < 1) err = 2; else if ((offset + length) > tr_torPieceCountBytes (tor, index)) err = 3; else if (length > MAX_BLOCK_SIZE) err = 4; else if (tr_pieceOffset (tor, index, offset, length) > tor->info.totalSize) err = 5; if (err) tr_logAddTorDbg (tor, "index %lu offset %lu length %lu err %d\n", (unsigned long)index, (unsigned long)offset, (unsigned long)length, err); return !err; } uint64_t tr_pieceOffset (const tr_torrent * tor, tr_piece_index_t index, uint32_t offset, uint32_t length) { uint64_t ret; assert (tr_isTorrent (tor)); ret = tor->info.pieceSize; ret *= index; ret += offset; ret += length; return ret; } void tr_torGetFileBlockRange (const tr_torrent * tor, const tr_file_index_t file, tr_block_index_t * first, tr_block_index_t * last) { const tr_file * f = &tor->info.files[file]; uint64_t offset = f->offset; *first = offset / tor->blockSize; if (!f->length) { *last = *first; } else { offset += f->length - 1; *last = offset / tor->blockSize; } } void tr_torGetPieceBlockRange (const tr_torrent * tor, const tr_piece_index_t piece, tr_block_index_t * first, tr_block_index_t * last) { uint64_t offset = tor->info.pieceSize; offset *= piece; *first = offset / tor->blockSize; offset += (tr_torPieceCountBytes (tor, piece) - 1); *last = offset / tor->blockSize; } /*** **** ***/ void tr_torrentSetPieceChecked (tr_torrent * tor, tr_piece_index_t pieceIndex) { assert (tr_isTorrent (tor)); assert (pieceIndex < tor->info.pieceCount); tor->info.pieces[pieceIndex].timeChecked = tr_time (); } void tr_torrentSetChecked (tr_torrent * tor, time_t when) { tr_piece_index_t i, n; assert (tr_isTorrent (tor)); for (i=0, n=tor->info.pieceCount; i!=n; ++i) tor->info.pieces[i].timeChecked = when; } bool tr_torrentCheckPiece (tr_torrent * tor, tr_piece_index_t pieceIndex) { const bool pass = tr_ioTestPiece (tor, pieceIndex); tr_deeplog_tor (tor, "[LAZY] tr_torrentCheckPiece tested piece %zu, pass==%d", (size_t)pieceIndex, (int)pass); tr_torrentSetHasPiece (tor, pieceIndex, pass); tr_torrentSetPieceChecked (tor, pieceIndex); tor->anyDate = tr_time (); tr_torrentSetDirty (tor); return pass; } time_t tr_torrentGetFileMTime (const tr_torrent * tor, tr_file_index_t i) { time_t mtime = 0; if (!tr_fdFileGetCachedMTime (tor->session, tor->uniqueId, i, &mtime)) tr_torrentFindFile2 (tor, i, NULL, NULL, &mtime); return mtime; } bool tr_torrentPieceNeedsCheck (const tr_torrent * tor, tr_piece_index_t p) { uint64_t unused; tr_file_index_t f; const tr_info * inf = tr_torrentInfo (tor); /* if we've never checked this piece, then it needs to be checked */ if (!inf->pieces[p].timeChecked) return true; /* If we think we've completed one of the files in this piece, * but it's been modified since we last checked it, * then it needs to be rechecked */ tr_ioFindFileLocation (tor, p, 0, &f, &unused); for (; f < inf->fileCount && pieceHasFile (p, &inf->files[f]); ++f) if (tr_cpFileIsComplete (&tor->completion, f)) if (tr_torrentGetFileMTime (tor, f) > inf->pieces[p].timeChecked) return true; return false; } /*** **** ***/ static int compareTrackerByTier (const void * va, const void * vb) { const tr_tracker_info * a = va; const tr_tracker_info * b = vb; /* sort by tier */ if (a->tier != b->tier) return a->tier - b->tier; /* get the effects of a stable sort by comparing the two elements' addresses */ return a - b; } bool tr_torrentSetAnnounceList (tr_torrent * tor, const tr_tracker_info * trackers_in, int trackerCount) { int i; tr_variant metainfo; bool ok = true; tr_tracker_info * trackers; tr_torrentLock (tor); assert (tr_isTorrent (tor)); /* ensure the trackers' tiers are in ascending order */ trackers = tr_memdup (trackers_in, sizeof (tr_tracker_info) * trackerCount); qsort (trackers, trackerCount, sizeof (tr_tracker_info), compareTrackerByTier); /* look for bad URLs */ for (i=0; ok && iinfo.torrent, NULL)) { bool hasInfo; tr_info tmpInfo; /* remove the old fields */ tr_variantDictRemove (&metainfo, TR_KEY_announce); tr_variantDictRemove (&metainfo, TR_KEY_announce_list); /* add the new fields */ if (trackerCount > 0) { tr_variantDictAddStr (&metainfo, TR_KEY_announce, trackers[0].announce); } if (trackerCount > 1) { int i; int prevTier = -1; tr_variant * tier = NULL; tr_variant * announceList = tr_variantDictAddList (&metainfo, TR_KEY_announce_list, 0); for (i=0; isession, &metainfo, &tmpInfo, &hasInfo, &tor->infoDictLength)) { /* it's good, so keep these new trackers and free the old ones */ tr_info swap; swap.trackers = tor->info.trackers; swap.trackerCount = tor->info.trackerCount; tor->info.trackers = tmpInfo.trackers; tor->info.trackerCount = tmpInfo.trackerCount; tmpInfo.trackers = swap.trackers; tmpInfo.trackerCount = swap.trackerCount; tr_metainfoFree (&tmpInfo); tr_variantToFile (&metainfo, TR_VARIANT_FMT_BENC, tor->info.torrent); } /* cleanup */ tr_variantFree (&metainfo); /* if we had a tracker-related error on this torrent, * and that tracker's been removed, * then clear the error */ if ((tor->error == TR_STAT_TRACKER_WARNING) || (tor->error == TR_STAT_TRACKER_ERROR)) { bool clear = true; for (i=0; clear && ierrorTracker)) clear = false; if (clear) tr_torrentClearError (tor); } /* tell the announcer to reload this torrent's tracker list */ tr_announcerResetTorrent (tor->session->announcer, tor); } tr_torrentUnlock (tor); tr_free (trackers); return ok; } /** *** **/ void tr_torrentSetAddedDate (tr_torrent * tor, time_t t) { assert (tr_isTorrent (tor)); tor->addedDate = t; tor->anyDate = MAX (tor->anyDate, tor->addedDate); } void tr_torrentSetActivityDate (tr_torrent * tor, time_t t) { assert (tr_isTorrent (tor)); tor->activityDate = t; tor->anyDate = MAX (tor->anyDate, tor->activityDate); } void tr_torrentSetDoneDate (tr_torrent * tor, time_t t) { assert (tr_isTorrent (tor)); tor->doneDate = t; tor->anyDate = MAX (tor->anyDate, tor->doneDate); } /** *** **/ uint64_t tr_torrentGetBytesLeftToAllocate (const tr_torrent * tor) { tr_file_index_t i; uint64_t bytesLeft = 0; assert (tr_isTorrent (tor)); for (i=0; iinfo.fileCount; ++i) { if (!tor->info.files[i].dnd) { tr_sys_path_info info; const uint64_t length = tor->info.files[i].length; char * path = tr_torrentFindFile (tor, i); bytesLeft += length; if (path != NULL && tr_sys_path_get_info (path, 0, &info, NULL) && info.type == TR_SYS_PATH_IS_FILE && info.size <= length) bytesLeft -= info.size; tr_free (path); } } return bytesLeft; } /**** ***** Removing the torrent's local data ****/ static bool isJunkFile (const char * base) { int i; static const char * files[] = { ".DS_Store", "desktop.ini", "Thumbs.db" }; static const int file_count = sizeof (files) / sizeof (files[0]); for (i=0; i */ if (!memcmp (base, "._", 2)) return true; #endif return false; } static void removeEmptyFoldersAndJunkFiles (const char * folder) { tr_sys_dir_t odir; if ((odir = tr_sys_dir_open (folder, NULL)) != TR_BAD_SYS_DIR) { const char * name; while ((name = tr_sys_dir_read_name (odir, NULL)) != NULL) { if (strcmp (name, ".") != 0 && strcmp (name, "..") != 0) { tr_sys_path_info info; char * filename = tr_buildPath (folder, name, NULL); if (tr_sys_path_get_info (filename, 0, &info, NULL) && info.type == TR_SYS_PATH_IS_DIRECTORY) removeEmptyFoldersAndJunkFiles (filename); else if (isJunkFile (name)) tr_sys_path_remove (filename, NULL); tr_free (filename); } } tr_sys_path_remove (folder, NULL); tr_sys_dir_close (odir, NULL); } } /** * This convoluted code does something (seemingly) simple: * remove the torrent's local files. * * Fun complications: * 1. Try to preserve the directory hierarchy in the recycle bin. * 2. If there are nontorrent files, don't delete them... * 3. ...unless the other files are "junk", such as .DS_Store */ static void deleteLocalData (tr_torrent * tor, tr_fileFunc func) { int i, n; tr_file_index_t f; char * base; tr_sys_dir_t odir; char * tmpdir = NULL; tr_ptrArray files = TR_PTR_ARRAY_INIT; tr_ptrArray folders = TR_PTR_ARRAY_INIT; PtrArrayCompareFunc vstrcmp = (PtrArrayCompareFunc)strcmp; const char * const top = tor->currentDir; /* don't try to delete local data if the directory's gone missing */ if (!tr_sys_path_exists (top, NULL)) return; /* if it's a magnet link, there's nothing to move... */ if (!tr_torrentHasMetadata (tor)) return; /*** **** Move the local data to a new tmpdir ***/ base = tr_strdup_printf ("%s__XXXXXX", tr_torrentName (tor)); tmpdir = tr_buildPath (top, base, NULL); tr_sys_dir_create_temp (tmpdir, NULL); tr_free (base); for (f=0; finfo.fileCount; ++f) { char * filename; /* try to find the file, looking in the partial and download dirs */ filename = tr_buildPath (top, tor->info.files[f].name, NULL); if (!tr_sys_path_exists (filename, NULL)) { char * partial = tr_torrentBuildPartial (tor, f); tr_free (filename); filename = tr_buildPath (top, partial, NULL); tr_free (partial); if (!tr_sys_path_exists (filename, NULL)) { tr_free (filename); filename = NULL; } } /* if we found the file, move it */ if (filename != NULL) { char * target = tr_buildPath (tmpdir, tor->info.files[f].name, NULL); tr_moveFile (filename, target, NULL); tr_ptrArrayAppend (&files, target); tr_free (filename); } } /*** **** Remove tmpdir. **** **** Try deleting the top-level files & folders to preserve **** the directory hierarchy in the recycle bin. **** If case that fails -- for example, rmdir () doesn't **** delete nonempty folders -- go from the bottom up too. ***/ /* try deleting the local data's top-level files & folders */ if ((odir = tr_sys_dir_open (tmpdir, NULL)) != TR_BAD_SYS_DIR) { const char * name; while ((name = tr_sys_dir_read_name (odir, NULL)) != NULL) { if (strcmp (name, ".") != 0 && strcmp (name, "..") != 0) { char * file = tr_buildPath (tmpdir, name, NULL); func (file, NULL); tr_free (file); } } tr_sys_dir_close (odir, NULL); } /* go from the bottom up */ for (i=0, n=tr_ptrArraySize (&files); iinfo.fileCount; ++f) { char * dir; char * filename; /* get the directory that this file goes in... */ filename = tr_buildPath (top, tor->info.files[f].name, NULL); dir = tr_sys_path_dirname (filename, NULL); tr_free (filename); /* walk up the directory tree until we reach 'top' */ if (!tr_sys_path_is_same (top, dir, NULL) && strcmp (top, dir) != 0) { for (;;) { char * parent = tr_sys_path_dirname (dir, NULL); if (tr_sys_path_is_same (top, parent, NULL) || strcmp (top, parent) == 0) { if (tr_ptrArrayFindSorted (&folders, dir, vstrcmp) == NULL) tr_ptrArrayInsertSorted (&folders, tr_strdup(dir), vstrcmp); tr_free (parent); break; } /* walk upwards to parent */ tr_free (dir); dir = parent; } } tr_free (dir); } for (i=0, n=tr_ptrArraySize (&folders); isession->cache, tor); tr_fdTorrentClose (tor->session, tor->uniqueId); deleteLocalData (tor, func); } /*** **** ***/ struct LocationData { bool move_from_old_location; volatile int * setme_state; volatile double * setme_progress; char * location; tr_torrent * tor; }; static void setLocation (void * vdata) { bool err = false; struct LocationData * data = vdata; tr_torrent * tor = data->tor; const bool do_move = data->move_from_old_location; const char * location = data->location; double bytesHandled = 0; tr_torrentLock (tor); assert (tr_isTorrent (tor)); tr_logAddDebug ("Moving \"%s\" location from currentDir \"%s\" to \"%s\"", tr_torrentName (tor), tor->currentDir, location); tr_sys_dir_create (location, TR_SYS_DIR_CREATE_PARENTS, 0777, NULL); if (!tr_sys_path_is_same (location, tor->currentDir, NULL)) { tr_file_index_t i; /* bad idea to move files while they're being verified... */ tr_verifyRemove (tor); /* try to move the files. * FIXME: there are still all kinds of nasty cases, like what * if the target directory runs out of space halfway through... */ for (i=0; !err && iinfo.fileCount; ++i) { char * sub; const char * oldbase; const tr_file * f = &tor->info.files[i]; if (tr_torrentFindFile2 (tor, i, &oldbase, &sub, NULL)) { char * oldpath = tr_buildPath (oldbase, sub, NULL); char * newpath = tr_buildPath (location, sub, NULL); tr_logAddDebug ("Found file #%d: %s", (int)i, oldpath); if (do_move && !tr_sys_path_is_same (oldpath, newpath, NULL)) { tr_error * error = NULL; tr_logAddTorInfo (tor, "moving \"%s\" to \"%s\"", oldpath, newpath); if (!tr_moveFile (oldpath, newpath, &error)) { err = true; tr_logAddTorErr (tor, "error moving \"%s\" to \"%s\": %s", oldpath, newpath, error->message); tr_error_free (error); } } tr_free (newpath); tr_free (oldpath); tr_free (sub); } if (data->setme_progress != NULL) { bytesHandled += f->length; *data->setme_progress = bytesHandled / tor->info.totalSize; } } if (!err) { /* blow away the leftover subdirectories in the old location */ if (do_move) tr_torrentDeleteLocalData (tor, tr_sys_path_remove); /* set the new location and reverify */ tr_torrentSetDownloadDir (tor, location); } } if (!err && do_move) { tr_free (tor->incompleteDir); tor->incompleteDir = NULL; tor->currentDir = tor->downloadDir; } if (data->setme_state != NULL) *data->setme_state = err ? TR_LOC_ERROR : TR_LOC_DONE; /* cleanup */ tr_torrentUnlock (tor); tr_free (data->location); tr_free (data); } void tr_torrentSetLocation (tr_torrent * tor, const char * location, bool move_from_old_location, volatile double * setme_progress, volatile int * setme_state) { struct LocationData * data; assert (tr_isTorrent (tor)); if (setme_state != NULL) *setme_state = TR_LOC_MOVING; if (setme_progress != NULL) *setme_progress = 0; /* run this in the libtransmission thread */ data = tr_new (struct LocationData, 1); data->tor = tor; data->location = tr_strdup (location); data->move_from_old_location = move_from_old_location; data->setme_state = setme_state; data->setme_progress = setme_progress; tr_runInEventThread (tor->session, setLocation, data); } /*** **** ***/ static void tr_torrentFileCompleted (tr_torrent * tor, tr_file_index_t fileIndex) { char * sub; const char * base; const tr_info * inf = &tor->info; const tr_file * f = &inf->files[fileIndex]; tr_piece * p; const tr_piece * pend; const time_t now = tr_time (); /* close the file so that we can reopen in read-only mode as needed */ tr_cacheFlushFile (tor->session->cache, tor, fileIndex); tr_fdFileClose (tor->session, tor, fileIndex); /* now that the file is complete and closed, we can start watching its * mtime timestamp for changes to know if we need to reverify pieces */ for (p=&inf->pieces[f->firstPiece], pend=&inf->pieces[f->lastPiece]; p!=pend; ++p) p->timeChecked = now; /* if the torrent's current filename isn't the same as the one in the * metadata -- for example, if it had the ".part" suffix appended to * it until now -- then rename it to match the one in the metadata */ if (tr_torrentFindFile2 (tor, fileIndex, &base, &sub, NULL)) { if (strcmp (sub, f->name)) { char * oldpath = tr_buildPath (base, sub, NULL); char * newpath = tr_buildPath (base, f->name, NULL); tr_error * error = NULL; if (!tr_sys_path_rename (oldpath, newpath, &error)) { tr_logAddTorErr (tor, "Error moving \"%s\" to \"%s\": %s", oldpath, newpath, error->message); tr_error_free (error); } tr_free (newpath); tr_free (oldpath); } tr_free (sub); } } static void tr_torrentPieceCompleted (tr_torrent * tor, tr_piece_index_t pieceIndex) { tr_file_index_t i; tr_peerMgrPieceCompleted (tor, pieceIndex); /* if this piece completes any file, invoke the fileCompleted func for it */ for (i=0; iinfo.fileCount; ++i) { const tr_file * file = &tor->info.files[i]; if ((file->firstPiece <= pieceIndex) && (pieceIndex <= file->lastPiece)) if (tr_cpFileIsComplete (&tor->completion, i)) tr_torrentFileCompleted (tor, i); } } void tr_torrentGotBlock (tr_torrent * tor, tr_block_index_t block) { const bool block_is_new = !tr_torrentBlockIsComplete (tor, block); assert (tr_isTorrent (tor)); assert (tr_amInEventThread (tor->session)); if (block_is_new) { tr_piece_index_t p; tr_cpBlockAdd (&tor->completion, block); tr_torrentSetDirty (tor); p = tr_torBlockPiece (tor, block); if (tr_torrentPieceIsComplete (tor, p)) { tr_logAddTorDbg (tor, "[LAZY] checking just-completed piece %zu", (size_t)p); if (tr_torrentCheckPiece (tor, p)) { tr_torrentPieceCompleted (tor, p); } else { const uint32_t n = tr_torPieceCountBytes (tor, p); tr_logAddTorErr (tor, _("Piece %"PRIu32", which was just downloaded, failed its checksum test"), p); tor->corruptCur += n; tor->downloadedCur -= MIN (tor->downloadedCur, n); tr_peerMgrGotBadPiece (tor, p); } } } else { const uint32_t n = tr_torBlockCountBytes (tor, block); tor->downloadedCur -= MIN (tor->downloadedCur, n); tr_logAddTorDbg (tor, "we have this block already..."); } } /*** **** ***/ bool tr_torrentFindFile2 (const tr_torrent * tor, tr_file_index_t fileNum, const char ** base, char ** subpath, time_t * mtime) { char * part = NULL; const tr_file * file; const char * b = NULL; const char * s = NULL; tr_sys_path_info file_info; assert (tr_isTorrent (tor)); assert (fileNum < tor->info.fileCount); file = &tor->info.files[fileNum]; /* look in the download dir... */ if (b == NULL) { char * filename = tr_buildPath (tor->downloadDir, file->name, NULL); if (tr_sys_path_get_info (filename, 0, &file_info, NULL)) { b = tor->downloadDir; s = file->name; } tr_free (filename); } /* look in the incomplete dir... */ if ((b == NULL) && (tor->incompleteDir != NULL)) { char * filename = tr_buildPath (tor->incompleteDir, file->name, NULL); if (tr_sys_path_get_info (filename, 0, &file_info, NULL)) { b = tor->incompleteDir; s = file->name; } tr_free (filename); } if (b == NULL) part = tr_torrentBuildPartial (tor, fileNum); /* look for a .part file in the incomplete dir... */ if ((b == NULL) && (tor->incompleteDir != NULL)) { char * filename = tr_buildPath (tor->incompleteDir, part, NULL); if (tr_sys_path_get_info (filename, 0, &file_info, NULL)) { b = tor->incompleteDir; s = part; } tr_free (filename); } /* look for a .part file in the download dir... */ if (b == NULL) { char * filename = tr_buildPath (tor->downloadDir, part, NULL); if (tr_sys_path_get_info (filename, 0, &file_info, NULL)) { b = tor->downloadDir; s = part; } tr_free (filename); } /* return the results */ if (base != NULL) *base = b; if (subpath != NULL) *subpath = tr_strdup (s); if (mtime != NULL) *mtime = file_info.last_modified_at; /* cleanup */ tr_free (part); return b != NULL; } char* tr_torrentFindFile (const tr_torrent * tor, tr_file_index_t fileNum) { char * subpath; char * ret = NULL; const char * base; if (tr_torrentFindFile2 (tor, fileNum, &base, &subpath, NULL)) { ret = tr_buildPath (base, subpath, NULL); tr_free (subpath); } return ret; } /* Decide whether we should be looking for files in downloadDir or incompleteDir. */ static void refreshCurrentDir (tr_torrent * tor) { const char * dir = NULL; if (tor->incompleteDir == NULL) dir = tor->downloadDir; else if (!tr_torrentHasMetadata (tor)) /* no files to find */ dir = tor->incompleteDir; else if (!tr_torrentFindFile2 (tor, 0, &dir, NULL, NULL)) dir = tor->incompleteDir; assert (dir != NULL); assert ((dir == tor->downloadDir) || (dir == tor->incompleteDir)); tor->currentDir = dir; } char* tr_torrentBuildPartial (const tr_torrent * tor, tr_file_index_t fileNum) { return tr_strdup_printf ("%s.part", tor->info.files[fileNum].name); } /*** **** ***/ static int compareTorrentByQueuePosition (const void * va, const void * vb) { const tr_torrent * a = * (const tr_torrent * const *) va; const tr_torrent * b = * (const tr_torrent * const *) vb; return a->queuePosition - b->queuePosition; } #ifndef NDEBUG static bool queueIsSequenced (tr_session * session) { int i; int n; bool is_sequenced; tr_torrent ** torrents; n = 0; torrents = tr_sessionGetTorrents (session, &n); qsort (torrents, n, sizeof (tr_torrent *), compareTorrentByQueuePosition); #if 0 fprintf (stderr, "%s", "queue: "); for (i=0; iqueuePosition); fputc ('\n', stderr); #endif /* test them */ is_sequenced = true; for (i=0; is_sequenced && iqueuePosition != i) is_sequenced = false; tr_free (torrents); return is_sequenced; } #endif int tr_torrentGetQueuePosition (const tr_torrent * tor) { return tor->queuePosition; } void tr_torrentSetQueuePosition (tr_torrent * tor, int pos) { int back = -1; tr_torrent * walk; const int old_pos = tor->queuePosition; const time_t now = tr_time (); if (pos < 0) pos = 0; tor->queuePosition = -1; walk = NULL; while ((walk = tr_torrentNext (tor->session, walk))) { if (old_pos < pos) { if ((old_pos <= walk->queuePosition) && (walk->queuePosition <= pos)) { walk->queuePosition--; walk->anyDate = now; } } if (old_pos > pos) { if ((pos <= walk->queuePosition) && (walk->queuePosition < old_pos)) { walk->queuePosition++; walk->anyDate = now; } } if (back < walk->queuePosition) { back = walk->queuePosition; } } tor->queuePosition = MIN (pos, (back+1)); tor->anyDate = now; assert (queueIsSequenced (tor->session)); } void tr_torrentsQueueMoveTop (tr_torrent ** torrents_in, int n) { int i; tr_torrent ** torrents = tr_memdup (torrents_in, sizeof (tr_torrent *) * n); qsort (torrents, n, sizeof (tr_torrent *), compareTorrentByQueuePosition); for (i=n-1; i>=0; --i) tr_torrentSetQueuePosition (torrents[i], 0); tr_free (torrents); } void tr_torrentsQueueMoveUp (tr_torrent ** torrents_in, int n) { int i; tr_torrent ** torrents; torrents = tr_memdup (torrents_in, sizeof (tr_torrent *) * n); qsort (torrents, n, sizeof (tr_torrent *), compareTorrentByQueuePosition); for (i=0; iqueuePosition - 1); tr_free (torrents); } void tr_torrentsQueueMoveDown (tr_torrent ** torrents_in, int n) { int i; tr_torrent ** torrents; torrents = tr_memdup (torrents_in, sizeof (tr_torrent *) * n); qsort (torrents, n, sizeof (tr_torrent *), compareTorrentByQueuePosition); for (i=n-1; i>=0; --i) tr_torrentSetQueuePosition (torrents[i], torrents[i]->queuePosition + 1); tr_free (torrents); } void tr_torrentsQueueMoveBottom (tr_torrent ** torrents_in, int n) { int i; tr_torrent ** torrents; torrents = tr_memdup (torrents_in, sizeof (tr_torrent *) * n); qsort (torrents, n, sizeof (tr_torrent *), compareTorrentByQueuePosition); for (i=0; iisQueued = queued; tor->anyDate = tr_time (); tr_torrentSetDirty (tor); } } void tr_torrentSetQueueStartCallback (tr_torrent * torrent, void (*callback)(tr_torrent *, void *), void * user_data) { torrent->queue_started_callback = callback; torrent->queue_started_user_data = user_data; } /*** **** **** RENAME **** ***/ static bool renameArgsAreValid (const char * oldpath, const char * newname) { return (oldpath && *oldpath) && (newname && *newname) && (strcmp (newname, ".")) && (strcmp (newname, "..")) && (strchr (newname, TR_PATH_DELIMITER) == NULL); } static tr_file_index_t * renameFindAffectedFiles (tr_torrent * tor, const char * oldpath, size_t * setme_n) { size_t n; size_t oldpath_len; tr_file_index_t i; tr_file_index_t * indices = tr_new0 (tr_file_index_t, tor->info.fileCount); n = 0; oldpath_len = strlen (oldpath); for (i=0; i!=tor->info.fileCount; ++i) { const char * name = tor->info.files[i].name; const size_t len = strlen (name); if ((len == oldpath_len || (len > oldpath_len && name[oldpath_len] == '/')) && !memcmp (oldpath, name, oldpath_len)) indices[n++] = i; } *setme_n = n; return indices; } static int renamePath (tr_torrent * tor, const char * oldpath, const char * newname) { char * src; const char * base; int err = 0; if (!tr_torrentIsSeed(tor) && (tor->incompleteDir != NULL)) base = tor->incompleteDir; else base = tor->downloadDir; src = tr_buildPath (base, oldpath, NULL); if (!tr_sys_path_exists (src, NULL)) /* check for it as a partial */ { char * tmp = tr_strdup_printf ("%s.part", src); tr_free (src); src = tmp; } if (tr_sys_path_exists (src, NULL)) { int tmp; bool tgt_exists; char * parent = tr_sys_path_dirname (src, NULL); char * tgt; if (tr_str_has_suffix (src, ".part")) tgt = tr_strdup_printf ("%s" TR_PATH_DELIMITER_STR "%s.part", parent, newname); else tgt = tr_buildPath (parent, newname, NULL); tmp = errno; tgt_exists = tr_sys_path_exists (tgt, NULL); errno = tmp; if (!tgt_exists) { tr_error * error = NULL; tmp = errno; if (!tr_sys_path_rename (src, tgt, &error)) { err = error->code; tr_error_free (error); } errno = tmp; } tr_free (tgt); tr_free (parent); } tr_free (src); return err; } static void renameTorrentFileString (tr_torrent * tor, const char * oldpath, const char * newname, tr_file_index_t fileIndex) { char * name; tr_file * file = &tor->info.files[fileIndex]; const size_t oldpath_len = strlen (oldpath); if (strchr (oldpath, TR_PATH_DELIMITER) == NULL) { if (oldpath_len >= strlen(file->name)) name = tr_buildPath (newname, NULL); else name = tr_buildPath (newname, file->name + oldpath_len + 1, NULL); } else { char * tmp = tr_sys_path_dirname (oldpath, NULL); if (oldpath_len >= strlen(file->name)) name = tr_buildPath (tmp, newname, NULL); else name = tr_buildPath (tmp, newname, file->name + oldpath_len + 1, NULL); tr_free (tmp); } if (!strcmp (file->name, name)) { tr_free (name); } else { tr_free (file->name); file->name = name; file->is_renamed = true; } } struct rename_data { tr_torrent * tor; char * oldpath; char * newname; tr_torrent_rename_done_func callback; void * callback_user_data; }; static void torrentRenamePath (void * vdata) { int error = 0; struct rename_data * data = vdata; tr_torrent * const tor = data->tor; const char * const oldpath = data->oldpath; const char * const newname = data->newname; /*** **** ***/ assert (tr_isTorrent (tor)); if (!renameArgsAreValid (oldpath, newname)) { error = EINVAL; } else { size_t n; tr_file_index_t * file_indices; file_indices = renameFindAffectedFiles (tor, oldpath, &n); if (n == 0) { error = EINVAL; } else { size_t i; error = renamePath (tor, oldpath, newname); if (!error) { /* update tr_info.files */ for (i=0; iinfo.fileCount) && (strchr(oldpath,'/')==NULL)) { tr_free (tor->info.name); tor->info.name = tr_strdup (newname); } tr_torrentSetDirty (tor); } } tr_free (file_indices); } /*** **** ***/ tor->anyDate = tr_time (); /* callback */ if (data->callback != NULL) (*data->callback)(tor, data->oldpath, data->newname, error, data->callback_user_data); /* cleanup */ tr_free (data->oldpath); tr_free (data->newname); tr_free (data); } void tr_torrentRenamePath (tr_torrent * tor, const char * oldpath, const char * newname, tr_torrent_rename_done_func callback, void * callback_user_data) { struct rename_data * data; data = tr_new0 (struct rename_data, 1); data->tor = tor; data->oldpath = tr_strdup (oldpath); data->newname = tr_strdup (newname); data->callback = callback; data->callback_user_data = callback_user_data; tr_runInEventThread (tor->session, torrentRenamePath, data); } transmission-2.92/libtransmission/PaxHeaders.4960/resume.c0000644000000000000000000000013212641272401020541 xustar0030 mtime=1451586817.573878462 30 atime=1451586817.573878462 30 ctime=1457295920.115809873 transmission-2.92/libtransmission/resume.c0000644000175000017500000006262212641272401022176 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: resume.c 14644 2015-12-29 19:37:31Z mikedld $ */ #include #include "transmission.h" #include "completion.h" #include "error.h" #include "file.h" #include "log.h" #include "metainfo.h" /* tr_metainfoGetBasename () */ #include "peer-mgr.h" /* pex */ #include "platform.h" /* tr_getResumeDir () */ #include "resume.h" #include "session.h" #include "torrent.h" #include "utils.h" /* tr_buildPath */ #include "variant.h" enum { MAX_REMEMBERED_PEERS = 200 }; static char* getResumeFilename (const tr_torrent * tor) { char * base = tr_metainfoGetBasename (tr_torrentInfo (tor)); char * filename = tr_strdup_printf ("%s" TR_PATH_DELIMITER_STR "%s.resume", tr_getResumeDir (tor->session), base); tr_free (base); return filename; } /*** **** ***/ static void savePeers (tr_variant * dict, const tr_torrent * tor) { int count; tr_pex * pex; count = tr_peerMgrGetPeers ((tr_torrent*) tor, &pex, TR_AF_INET, TR_PEERS_INTERESTING, MAX_REMEMBERED_PEERS); if (count > 0) tr_variantDictAddRaw (dict, TR_KEY_peers2, pex, sizeof (tr_pex) * count); tr_free (pex); count = tr_peerMgrGetPeers ((tr_torrent*) tor, &pex, TR_AF_INET6, TR_PEERS_INTERESTING, MAX_REMEMBERED_PEERS); if (count > 0) tr_variantDictAddRaw (dict, TR_KEY_peers2_6, pex, sizeof (tr_pex) * count); tr_free (pex); } static int addPeers (tr_torrent * tor, const uint8_t * buf, int buflen) { int i; int numAdded = 0; const int count = buflen / sizeof (tr_pex); for (i=0; ifileCount; list = tr_variantDictAddList (dict, TR_KEY_dnd, n); for (i=0; ifiles[i].dnd ? 1 : 0); } static uint64_t loadDND (tr_variant * dict, tr_torrent * tor) { uint64_t ret = 0; tr_variant * list = NULL; const tr_file_index_t n = tor->info.fileCount; if (tr_variantDictFindList (dict, TR_KEY_dnd, &list) && (tr_variantListSize (list) == n)) { int64_t tmp; tr_file_index_t * dl = tr_new (tr_file_index_t, n); tr_file_index_t * dnd = tr_new (tr_file_index_t, n); tr_file_index_t i, dlCount = 0, dndCount = 0; for (i=0; ifileCount; list = tr_variantDictAddList (dict, TR_KEY_priority, n); for (i=0; ifiles[i].priority); } static uint64_t loadFilePriorities (tr_variant * dict, tr_torrent * tor) { tr_variant * list; uint64_t ret = 0; const tr_file_index_t n = tor->info.fileCount; if (tr_variantDictFindList (dict, TR_KEY_priority, &list) && (tr_variantListSize (list) == n)) { int64_t priority; tr_file_index_t i; for (i=0; iinfo.name); tor->info.name = tr_strdup (name); } } return ret; } /*** **** ***/ static void saveFilenames (tr_variant * dict, const tr_torrent * tor) { tr_file_index_t i; bool any_renamed; const tr_file_index_t n = tor->info.fileCount; const tr_file * files = tor->info.files; any_renamed = false; for (i=0; !any_renamed && iinfo.files; for (i=0; iinfo.fileCount && ifileCount); for (fi=0; fifileCount; ++fi) { const tr_piece * p; const tr_piece * pend; time_t oldest_nonzero = now; time_t newest = 0; bool has_zero = false; const time_t mtime = tr_torrentGetFileMTime (tor, fi); const tr_file * f = &inf->files[fi]; /* get the oldest and newest nonzero timestamps for pieces in this file */ for (p=&inf->pieces[f->firstPiece], pend=&inf->pieces[f->lastPiece]; p!=pend; ++p) { if (!p->timeChecked) has_zero = true; else if (oldest_nonzero > p->timeChecked) oldest_nonzero = p->timeChecked; if (newest < p->timeChecked) newest = p->timeChecked; } /* If some of a file's pieces have been checked more recently than the file's mtime, and some less recently, then that file will have a list containing timestamps for each piece. However, the most common use case is that the file doesn't change after it's downloaded. To reduce overhead in the .resume file, only a single timestamp is saved for the file if *all* or *none* of the pieces were tested more recently than the file's mtime. */ if (!has_zero && (mtime <= oldest_nonzero)) /* all checked */ { tr_variantListAddInt (l, oldest_nonzero); } else if (newest < mtime) /* none checked */ { tr_variantListAddInt (l, newest); } else /* some are checked, some aren't... so list piece by piece */ { const int offset = oldest_nonzero - 1; tr_variant * ll = tr_variantListAddList (l, 2 + f->lastPiece - f->firstPiece); tr_variantListAddInt (ll, offset); for (p=&inf->pieces[f->firstPiece], pend=&inf->pieces[f->lastPiece]+1; p!=pend; ++p) tr_variantListAddInt (ll, p->timeChecked ? p->timeChecked - offset : 0); } } /* add the progress */ if (tor->completeness == TR_SEED) tr_variantDictAddStr (prog, TR_KEY_have, "all"); /* add the blocks bitfield */ bitfieldToBenc (&tor->completion.blockBitfield, tr_variantDictAdd (prog, TR_KEY_blocks)); } static uint64_t loadProgress (tr_variant * dict, tr_torrent * tor) { size_t i, n; uint64_t ret = 0; tr_variant * prog; const tr_info * inf = tr_torrentInfo (tor); for (i=0, n=inf->pieceCount; ipieces[i].timeChecked = 0; if (tr_variantDictFindDict (dict, TR_KEY_progress, &prog)) { const char * err; const char * str; const uint8_t * raw; size_t rawlen; tr_variant * l; tr_variant * b; struct tr_bitfield blocks = TR_BITFIELD_INIT; if (tr_variantDictFindList (prog, TR_KEY_time_checked, &l)) { /* per-piece timestamps were added in 2.20. If some of a file's pieces have been checked more recently than the file's mtime, and some lest recently, then that file will have a list containing timestamps for each piece. However, the most common use case is that the file doesn't change after it's downloaded. To reduce overhead in the .resume file, only a single timestamp is saved for the file if *all* or *none* of the pieces were tested more recently than the file's mtime. */ tr_file_index_t fi; for (fi=0; fifileCount; ++fi) { tr_variant * b = tr_variantListChild (l, fi); const tr_file * f = &inf->files[fi]; tr_piece * p = &inf->pieces[f->firstPiece]; const tr_piece * pend = &inf->pieces[f->lastPiece]+1; if (tr_variantIsInt (b)) { int64_t t; tr_variantGetInt (b, &t); for (; p!=pend; ++p) p->timeChecked = (time_t)t; } else if (tr_variantIsList (b)) { int i = 0; int64_t offset = 0; const int pieces = f->lastPiece + 1 - f->firstPiece; tr_variantGetInt (tr_variantListChild (b, 0), &offset); for (i=0; ipieces[f->firstPiece+i].timeChecked = (time_t)(t ? t + offset : 0); } } } } else if (tr_variantDictFindList (prog, TR_KEY_mtimes, &l)) { tr_file_index_t fi; /* Before 2.20, we stored the files' mtimes in the .resume file. When loading the .resume file, a torrent's file would be flagged as untested if its stored mtime didn't match its real mtime. */ for (fi=0; fifileCount; ++fi) { int64_t t; if (tr_variantGetInt (tr_variantListChild (l, fi), &t)) { const tr_file * f = &inf->files[fi]; tr_piece * p = &inf->pieces[f->firstPiece]; const tr_piece * pend = &inf->pieces[f->lastPiece]; const time_t mtime = tr_torrentGetFileMTime (tor, fi); const time_t timeChecked = mtime==t ? mtime : 0; for (; p!=pend; ++p) p->timeChecked = timeChecked; } } } err = NULL; tr_bitfieldConstruct (&blocks, tor->blockCount); if ((b = tr_variantDictFind (prog, TR_KEY_blocks))) { size_t buflen; const uint8_t * buf; if (!tr_variantGetRaw (b, &buf, &buflen)) err = "Invalid value for \"blocks\""; else if ((buflen == 3) && !memcmp (buf, "all", 3)) tr_bitfieldSetHasAll (&blocks); else if ((buflen == 4) && !memcmp (buf, "none", 4)) tr_bitfieldSetHasNone (&blocks); else tr_bitfieldSetRaw (&blocks, buf, buflen, true); } else if (tr_variantDictFindStr (prog, TR_KEY_have, &str, NULL)) { if (!strcmp (str, "all")) tr_bitfieldSetHasAll (&blocks); else err = "Invalid value for HAVE"; } else if (tr_variantDictFindRaw (prog, TR_KEY_bitfield, &raw, &rawlen)) { tr_bitfieldSetRaw (&blocks, raw, rawlen, true); } else err = "Couldn't find 'pieces' or 'have' or 'bitfield'"; if (err != NULL) tr_logAddTorDbg (tor, "Torrent needs to be verified - %s", err); else tr_cpBlockInit (&tor->completion, &blocks); tr_bitfieldDestruct (&blocks); ret = TR_FR_PROGRESS; } return ret; } /*** **** ***/ void tr_torrentSaveResume (tr_torrent * tor) { int err; tr_variant top; char * filename; if (!tr_isTorrent (tor)) return; tr_variantInitDict (&top, 50); /* arbitrary "big enough" number */ tr_variantDictAddInt (&top, TR_KEY_seeding_time_seconds, tor->secondsSeeding); tr_variantDictAddInt (&top, TR_KEY_downloading_time_seconds, tor->secondsDownloading); tr_variantDictAddInt (&top, TR_KEY_activity_date, tor->activityDate); tr_variantDictAddInt (&top, TR_KEY_added_date, tor->addedDate); tr_variantDictAddInt (&top, TR_KEY_corrupt, tor->corruptPrev + tor->corruptCur); tr_variantDictAddInt (&top, TR_KEY_done_date, tor->doneDate); tr_variantDictAddStr (&top, TR_KEY_destination, tor->downloadDir); if (tor->incompleteDir != NULL) tr_variantDictAddStr (&top, TR_KEY_incomplete_dir, tor->incompleteDir); tr_variantDictAddInt (&top, TR_KEY_downloaded, tor->downloadedPrev + tor->downloadedCur); tr_variantDictAddInt (&top, TR_KEY_uploaded, tor->uploadedPrev + tor->uploadedCur); tr_variantDictAddInt (&top, TR_KEY_max_peers, tor->maxConnectedPeers); tr_variantDictAddInt (&top, TR_KEY_bandwidth_priority, tr_torrentGetPriority (tor)); tr_variantDictAddBool (&top, TR_KEY_paused, !tor->isRunning && !tor->isQueued); savePeers (&top, tor); if (tr_torrentHasMetadata (tor)) { saveFilePriorities (&top, tor); saveDND (&top, tor); saveProgress (&top, tor); } saveSpeedLimits (&top, tor); saveRatioLimits (&top, tor); saveIdleLimits (&top, tor); saveFilenames (&top, tor); saveName (&top, tor); filename = getResumeFilename (tor); if ((err = tr_variantToFile (&top, TR_VARIANT_FMT_BENC, filename))) tr_torrentSetLocalError (tor, "Unable to save resume file: %s", tr_strerror (err)); tr_free (filename); tr_variantFree (&top); } static uint64_t loadFromFile (tr_torrent * tor, uint64_t fieldsToLoad) { size_t len; int64_t i; const char * str; char * filename; tr_variant top; bool boolVal; uint64_t fieldsLoaded = 0; const bool wasDirty = tor->isDirty; tr_error * error = NULL; assert (tr_isTorrent (tor)); filename = getResumeFilename (tor); if (!tr_variantFromFile (&top, TR_VARIANT_FMT_BENC, filename, &error)) { tr_logAddTorDbg (tor, "Couldn't read \"%s\": %s", filename, error->message); tr_error_free (error); tr_free (filename); return fieldsLoaded; } tr_logAddTorDbg (tor, "Read resume file \"%s\"", filename); if ((fieldsToLoad & TR_FR_CORRUPT) && tr_variantDictFindInt (&top, TR_KEY_corrupt, &i)) { tor->corruptPrev = i; fieldsLoaded |= TR_FR_CORRUPT; } if ((fieldsToLoad & (TR_FR_PROGRESS | TR_FR_DOWNLOAD_DIR)) && (tr_variantDictFindStr (&top, TR_KEY_destination, &str, &len)) && (str && *str)) { const bool is_current_dir = tor->currentDir == tor->downloadDir; tr_free (tor->downloadDir); tor->downloadDir = tr_strndup (str, len); if (is_current_dir) tor->currentDir = tor->downloadDir; fieldsLoaded |= TR_FR_DOWNLOAD_DIR; } if ((fieldsToLoad & (TR_FR_PROGRESS | TR_FR_INCOMPLETE_DIR)) && (tr_variantDictFindStr (&top, TR_KEY_incomplete_dir, &str, &len)) && (str && *str)) { const bool is_current_dir = tor->currentDir == tor->incompleteDir; tr_free (tor->incompleteDir); tor->incompleteDir = tr_strndup (str, len); if (is_current_dir) tor->currentDir = tor->incompleteDir; fieldsLoaded |= TR_FR_INCOMPLETE_DIR; } if ((fieldsToLoad & TR_FR_DOWNLOADED) && tr_variantDictFindInt (&top, TR_KEY_downloaded, &i)) { tor->downloadedPrev = i; fieldsLoaded |= TR_FR_DOWNLOADED; } if ((fieldsToLoad & TR_FR_UPLOADED) && tr_variantDictFindInt (&top, TR_KEY_uploaded, &i)) { tor->uploadedPrev = i; fieldsLoaded |= TR_FR_UPLOADED; } if ((fieldsToLoad & TR_FR_MAX_PEERS) && tr_variantDictFindInt (&top, TR_KEY_max_peers, &i)) { tor->maxConnectedPeers = i; fieldsLoaded |= TR_FR_MAX_PEERS; } if ((fieldsToLoad & TR_FR_RUN) && tr_variantDictFindBool (&top, TR_KEY_paused, &boolVal)) { tor->isRunning = !boolVal; fieldsLoaded |= TR_FR_RUN; } if ((fieldsToLoad & TR_FR_ADDED_DATE) && tr_variantDictFindInt (&top, TR_KEY_added_date, &i)) { tor->addedDate = i; fieldsLoaded |= TR_FR_ADDED_DATE; } if ((fieldsToLoad & TR_FR_DONE_DATE) && tr_variantDictFindInt (&top, TR_KEY_done_date, &i)) { tor->doneDate = i; fieldsLoaded |= TR_FR_DONE_DATE; } if ((fieldsToLoad & TR_FR_ACTIVITY_DATE) && tr_variantDictFindInt (&top, TR_KEY_activity_date, &i)) { tr_torrentSetActivityDate (tor, i); fieldsLoaded |= TR_FR_ACTIVITY_DATE; } if ((fieldsToLoad & TR_FR_TIME_SEEDING) && tr_variantDictFindInt (&top, TR_KEY_seeding_time_seconds, &i)) { tor->secondsSeeding = i; fieldsLoaded |= TR_FR_TIME_SEEDING; } if ((fieldsToLoad & TR_FR_TIME_DOWNLOADING) && tr_variantDictFindInt (&top, TR_KEY_downloading_time_seconds, &i)) { tor->secondsDownloading = i; fieldsLoaded |= TR_FR_TIME_DOWNLOADING; } if ((fieldsToLoad & TR_FR_BANDWIDTH_PRIORITY) && tr_variantDictFindInt (&top, TR_KEY_bandwidth_priority, &i) && tr_isPriority (i)) { tr_torrentSetPriority (tor, i); fieldsLoaded |= TR_FR_BANDWIDTH_PRIORITY; } if (fieldsToLoad & TR_FR_PEERS) fieldsLoaded |= loadPeers (&top, tor); if (fieldsToLoad & TR_FR_FILE_PRIORITIES) fieldsLoaded |= loadFilePriorities (&top, tor); if (fieldsToLoad & TR_FR_PROGRESS) fieldsLoaded |= loadProgress (&top, tor); if (fieldsToLoad & TR_FR_DND) fieldsLoaded |= loadDND (&top, tor); if (fieldsToLoad & TR_FR_SPEEDLIMIT) fieldsLoaded |= loadSpeedLimits (&top, tor); if (fieldsToLoad & TR_FR_RATIOLIMIT) fieldsLoaded |= loadRatioLimits (&top, tor); if (fieldsToLoad & TR_FR_IDLELIMIT) fieldsLoaded |= loadIdleLimits (&top, tor); if (fieldsToLoad & TR_FR_FILENAMES) fieldsLoaded |= loadFilenames (&top, tor); if (fieldsToLoad & TR_FR_NAME) fieldsLoaded |= loadName (&top, tor); /* loading the resume file triggers of a lot of changes, * but none of them needs to trigger a re-saving of the * same resume information... */ tor->isDirty = wasDirty; tr_variantFree (&top); tr_free (filename); return fieldsLoaded; } static uint64_t setFromCtor (tr_torrent * tor, uint64_t fields, const tr_ctor * ctor, int mode) { uint64_t ret = 0; if (fields & TR_FR_RUN) { bool isPaused; if (tr_ctorGetPaused (ctor, mode, &isPaused)) { tor->isRunning = !isPaused; ret |= TR_FR_RUN; } } if (fields & TR_FR_MAX_PEERS) if (tr_ctorGetPeerLimit (ctor, mode, &tor->maxConnectedPeers)) ret |= TR_FR_MAX_PEERS; if (fields & TR_FR_DOWNLOAD_DIR) { const char * path; if (tr_ctorGetDownloadDir (ctor, mode, &path) && path && *path) { ret |= TR_FR_DOWNLOAD_DIR; tr_free (tor->downloadDir); tor->downloadDir = tr_strdup (path); } } return ret; } static uint64_t useManditoryFields (tr_torrent * tor, uint64_t fields, const tr_ctor * ctor) { return setFromCtor (tor, fields, ctor, TR_FORCE); } static uint64_t useFallbackFields (tr_torrent * tor, uint64_t fields, const tr_ctor * ctor) { return setFromCtor (tor, fields, ctor, TR_FALLBACK); } uint64_t tr_torrentLoadResume (tr_torrent * tor, uint64_t fieldsToLoad, const tr_ctor * ctor) { uint64_t ret = 0; assert (tr_isTorrent (tor)); ret |= useManditoryFields (tor, fieldsToLoad, ctor); fieldsToLoad &= ~ret; ret |= loadFromFile (tor, fieldsToLoad); fieldsToLoad &= ~ret; ret |= useFallbackFields (tor, fieldsToLoad, ctor); return ret; } void tr_torrentRemoveResume (const tr_torrent * tor) { char * filename = getResumeFilename (tor); tr_sys_path_remove (filename, NULL); tr_free (filename); } transmission-2.92/libtransmission/PaxHeaders.4960/file-test.c0000644000000000000000000000013212642376667021161 xustar0030 mtime=1451883959.357755341 30 atime=1451883959.356755323 30 ctime=1457295920.265812424 transmission-2.92/libtransmission/file-test.c0000644000175000017500000012226312642376667022614 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: file-test.c 14658 2016-01-04 05:04:55Z mikedld $ */ #include #ifndef _WIN32 #include #include #include #else #include #endif #include "transmission.h" #include "error.h" #include "file.h" #include "libtransmission-test.h" #ifndef _WIN32 #define NATIVE_PATH_SEP "/" #else #define NATIVE_PATH_SEP "\\" #endif static tr_session * session; static char * create_test_dir (const char * name) { char * const test_dir = tr_buildPath (tr_sessionGetConfigDir (session), name, NULL); tr_sys_dir_create (test_dir, 0, 0777, NULL); return test_dir; } static bool create_symlink (const char * dst_path, const char * src_path, bool dst_is_dir) { #ifndef _WIN32 (void) dst_is_dir; return symlink (src_path, dst_path) != -1; #else wchar_t * wide_src_path; wchar_t * wide_dst_path; bool ret = false; wide_src_path = tr_win32_utf8_to_native (src_path, -1); wide_dst_path = tr_win32_utf8_to_native (dst_path, -1); ret = CreateSymbolicLinkW (wide_dst_path, wide_src_path, dst_is_dir ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0); tr_free (wide_dst_path); tr_free (wide_src_path); return ret; #endif } static bool create_hardlink (const char * dst_path, const char * src_path) { #ifndef _WIN32 return link (src_path, dst_path) != -1; #else wchar_t * wide_src_path = tr_win32_utf8_to_native (src_path, -1); wchar_t * wide_dst_path = tr_win32_utf8_to_native (dst_path, -1); bool ret = CreateHardLinkW (wide_dst_path, wide_src_path, NULL); tr_free (wide_dst_path); tr_free (wide_src_path); return ret; #endif } static void clear_path_info (tr_sys_path_info * info) { info->type = (tr_sys_path_type_t) -1; info->size = (uint64_t) -1; info->last_modified_at = (time_t) -1; } static bool path_contains_no_symlinks (const char * path) { const char * p = path; while (*p != '\0') { tr_sys_path_info info; char * pathPart; const char * slashPos = strchr (p, '/'); #ifdef _WIN32 const char * backslashPos = strchr (p, '\\'); if (slashPos == NULL || (backslashPos != NULL && backslashPos < slashPos)) slashPos = backslashPos; #endif if (slashPos == NULL) slashPos = p + strlen (p) - 1; pathPart = tr_strndup (path, slashPos - path + 1); if (!tr_sys_path_get_info (pathPart, TR_SYS_PATH_NO_FOLLOW, &info, NULL) || (info.type != TR_SYS_PATH_IS_FILE && info.type != TR_SYS_PATH_IS_DIRECTORY)) { tr_free (pathPart); return false; } tr_free (pathPart); p = slashPos + 1; } return true; } static bool validate_permissions (const char * path, unsigned int permissions) { #ifndef _WIN32 struct stat sb; return stat (path, &sb) != -1 && (sb.st_mode & 0777) == permissions; #else (void) path; (void) permissions; /* No UNIX permissions on Windows */ return true; #endif } static int test_get_info (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_sys_path_info info; tr_sys_file_t fd; tr_error * err = NULL; char * path1, * path2; time_t t; path1 = tr_buildPath (test_dir, "a", NULL); path2 = tr_buildPath (test_dir, "b", NULL); /* Can't get info of non-existent file/directory */ check (!tr_sys_path_get_info (path1, 0, &info, &err)); check (err != NULL); tr_error_clear (&err); t = time (NULL); libtest_create_file_with_string_contents (path1, "test"); /* Good file info */ clear_path_info (&info); check (tr_sys_path_get_info (path1, 0, &info, &err)); check (err == NULL); check_int_eq (TR_SYS_PATH_IS_FILE, info.type); check_int_eq (4, info.size); check (info.last_modified_at >= t && info.last_modified_at <= time (NULL)); /* Good file info (by handle) */ fd = tr_sys_file_open (path1, TR_SYS_FILE_READ, 0, NULL); clear_path_info (&info); check (tr_sys_file_get_info (fd, &info, &err)); check (err == NULL); check_int_eq (TR_SYS_PATH_IS_FILE, info.type); check_int_eq (4, info.size); check (info.last_modified_at >= t && info.last_modified_at <= time (NULL)); tr_sys_file_close (fd, NULL); tr_sys_path_remove (path1, NULL); /* Good directory info */ t = time (NULL); tr_sys_dir_create (path1, 0, 0777, NULL); clear_path_info (&info); check (tr_sys_path_get_info (path1, 0, &info, &err)); check (err == NULL); check_int_eq (TR_SYS_PATH_IS_DIRECTORY, info.type); check (info.size != (uint64_t) -1); check (info.last_modified_at >= t && info.last_modified_at <= time (NULL)); tr_sys_path_remove (path1, NULL); if (create_symlink (path1, path2, false)) { /* Can't get info of non-existent file/directory */ check (!tr_sys_path_get_info (path1, 0, &info, &err)); check (err != NULL); tr_error_clear (&err); t = time (NULL); libtest_create_file_with_string_contents (path2, "test"); /* Good file info */ clear_path_info (&info); check (tr_sys_path_get_info (path1, 0, &info, &err)); check (err == NULL); check_int_eq (TR_SYS_PATH_IS_FILE, info.type); check_int_eq (4, info.size); check (info.last_modified_at >= t && info.last_modified_at <= time (NULL)); /* Good file info (by handle) */ fd = tr_sys_file_open (path1, TR_SYS_FILE_READ, 0, NULL); clear_path_info (&info); check (tr_sys_file_get_info (fd, &info, &err)); check (err == NULL); check_int_eq (TR_SYS_PATH_IS_FILE, info.type); check_int_eq (4, info.size); check (info.last_modified_at >= t && info.last_modified_at <= time (NULL)); tr_sys_file_close (fd, NULL); tr_sys_path_remove (path2, NULL); /* Good directory info */ t = time (NULL); tr_sys_dir_create (path2, 0, 0777, NULL); clear_path_info (&info); check (tr_sys_path_get_info (path1, 0, &info, &err)); check (err == NULL); check_int_eq (TR_SYS_PATH_IS_DIRECTORY, info.type); check (info.size != (uint64_t) -1); check (info.last_modified_at >= t && info.last_modified_at <= time (NULL)); tr_sys_path_remove (path2, NULL); tr_sys_path_remove (path1, NULL); } else { fprintf (stderr, "WARNING: [%s] unable to run symlink tests\n", __FUNCTION__); } tr_free (path2); tr_free (path1); tr_free (test_dir); return 0; } static int test_path_exists (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_error * err = NULL; char * path1, * path2; path1 = tr_buildPath (test_dir, "a", NULL); path2 = tr_buildPath (test_dir, "b", NULL); /* Non-existent file does not exist */ check (!tr_sys_path_exists (path1, &err)); check (err == NULL); /* Create file and see that it exists */ libtest_create_file_with_string_contents (path1, "test"); check (tr_sys_path_exists (path1, &err)); check (err == NULL); tr_sys_path_remove (path1, NULL); /* Create directory and see that it exists */ tr_sys_dir_create (path1, 0, 0777, NULL); check (tr_sys_path_exists (path1, &err)); check (err == NULL); tr_sys_path_remove (path1, NULL); if (create_symlink (path1, path2, false)) { /* Non-existent file does not exist (via symlink) */ check (!tr_sys_path_exists (path1, &err)); check (err == NULL); /* Create file and see that it exists (via symlink) */ libtest_create_file_with_string_contents (path2, "test"); check (tr_sys_path_exists (path1, &err)); check (err == NULL); tr_sys_path_remove (path2, NULL); /* Create directory and see that it exists (via symlink) */ tr_sys_dir_create (path2, 0, 0777, NULL); check (tr_sys_path_exists (path1, &err)); check (err == NULL); tr_sys_path_remove (path2, NULL); tr_sys_path_remove (path1, NULL); } else { fprintf (stderr, "WARNING: [%s] unable to run symlink tests\n", __FUNCTION__); } tr_free (path2); tr_free (path1); tr_free (test_dir); return 0; } static int test_path_is_relative (void) { check (tr_sys_path_is_relative ("")); check (tr_sys_path_is_relative (".")); check (tr_sys_path_is_relative ("..")); check (tr_sys_path_is_relative ("x")); check (tr_sys_path_is_relative ("\\")); check (tr_sys_path_is_relative (":")); #ifdef _WIN32 check (tr_sys_path_is_relative ("/")); check (tr_sys_path_is_relative ("\\x")); check (tr_sys_path_is_relative ("/x")); check (tr_sys_path_is_relative ("\\x\\y")); check (tr_sys_path_is_relative ("/x/y")); check (tr_sys_path_is_relative ("C:x")); check (tr_sys_path_is_relative ("C:x\\y")); check (tr_sys_path_is_relative ("C:x/y")); check (!tr_sys_path_is_relative ("\\\\")); check (!tr_sys_path_is_relative ("//")); check (!tr_sys_path_is_relative ("\\\\x")); check (!tr_sys_path_is_relative ("//x")); check (!tr_sys_path_is_relative ("\\\\x\\y")); check (!tr_sys_path_is_relative ("//x/y")); check (!tr_sys_path_is_relative ("\\\\.\\x")); check (!tr_sys_path_is_relative ("//./x")); check (!tr_sys_path_is_relative ("a:")); check (!tr_sys_path_is_relative ("a:\\")); check (!tr_sys_path_is_relative ("a:/")); check (!tr_sys_path_is_relative ("Z:")); check (!tr_sys_path_is_relative ("Z:\\")); check (!tr_sys_path_is_relative ("Z:/")); #else /* _WIN32 */ check (!tr_sys_path_is_relative ("/")); check (!tr_sys_path_is_relative ("/x")); check (!tr_sys_path_is_relative ("/x/y")); check (!tr_sys_path_is_relative ("//x")); #endif /* _WIN32 */ return 0; } static int test_path_is_same (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_error * err = NULL; char * path1, * path2, * path3; path1 = tr_buildPath (test_dir, "a", NULL); path2 = tr_buildPath (test_dir, "b", NULL); path3 = tr_buildPath (path2, "c", NULL); /* Two non-existent files are not the same */ check (!tr_sys_path_is_same (path1, path1, &err)); check (err == NULL); check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); /* Two same files are the same */ libtest_create_file_with_string_contents (path1, "test"); check (tr_sys_path_is_same (path1, path1, &err)); check (err == NULL); /* Existent and non-existent files are not the same */ check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); check (!tr_sys_path_is_same (path2, path1, &err)); check (err == NULL); /* Two separate files (even with same content) are not the same */ libtest_create_file_with_string_contents (path2, "test"); check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); tr_sys_path_remove (path1, NULL); /* Two same directories are the same */ tr_sys_dir_create (path1, 0, 0777, NULL); check (tr_sys_path_is_same (path1, path1, &err)); check (err == NULL); /* File and directory are not the same */ check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); check (!tr_sys_path_is_same (path2, path1, &err)); check (err == NULL); tr_sys_path_remove (path2, NULL); /* Two separate directories are not the same */ tr_sys_dir_create (path2, 0, 0777, NULL); check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); tr_sys_path_remove (path1, NULL); tr_sys_path_remove (path2, NULL); if (create_symlink (path1, ".", true)) { /* Directory and symlink pointing to it are the same */ check (tr_sys_path_is_same (path1, test_dir, &err)); check (err == NULL); check (tr_sys_path_is_same (test_dir, path1, &err)); check (err == NULL); /* Non-existent file and symlink are not the same */ check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); check (!tr_sys_path_is_same (path2, path1, &err)); check (err == NULL); /* Symlinks pointing to different directories are not the same */ create_symlink (path2, "..", true); check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); check (!tr_sys_path_is_same (path2, path1, &err)); check (err == NULL); tr_sys_path_remove (path2, NULL); /* Symlinks pointing to same directory are the same */ create_symlink (path2, ".", true); check (tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); tr_sys_path_remove (path2, NULL); /* Directory and symlink pointing to another directory are not the same */ tr_sys_dir_create (path2, 0, 0777, NULL); check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); check (!tr_sys_path_is_same (path2, path1, &err)); check (err == NULL); /* Symlinks pointing to same directory are the same */ create_symlink (path3, "..", true); check (tr_sys_path_is_same (path1, path3, &err)); check (err == NULL); tr_sys_path_remove (path1, NULL); /* File and symlink pointing to directory are not the same */ libtest_create_file_with_string_contents (path1, "test"); check (!tr_sys_path_is_same (path1, path3, &err)); check (err == NULL); check (!tr_sys_path_is_same (path3, path1, &err)); check (err == NULL); tr_sys_path_remove (path3, NULL); /* File and symlink pointing to same file are the same */ create_symlink (path3, path1, false); check (tr_sys_path_is_same (path1, path3, &err)); check (err == NULL); check (tr_sys_path_is_same (path3, path1, &err)); check (err == NULL); /* Symlinks pointing to non-existent files are not the same */ tr_sys_path_remove (path1, NULL); create_symlink (path1, "missing", false); tr_sys_path_remove (path3, NULL); create_symlink (path3, "missing", false); check (!tr_sys_path_is_same (path1, path3, &err)); check (err == NULL); check (!tr_sys_path_is_same (path3, path1, &err)); check (err == NULL); tr_sys_path_remove (path3, NULL); /* Symlinks pointing to same non-existent file are not the same */ create_symlink (path3, ".." NATIVE_PATH_SEP "missing", false); check (!tr_sys_path_is_same (path1, path3, &err)); check (err == NULL); check (!tr_sys_path_is_same (path3, path1, &err)); check (err == NULL); /* Non-existent file and symlink pointing to non-existent file are not the same */ tr_sys_path_remove (path3, NULL); check (!tr_sys_path_is_same (path1, path3, &err)); check (err == NULL); check (!tr_sys_path_is_same (path3, path1, &err)); check (err == NULL); tr_sys_path_remove (path2, NULL); tr_sys_path_remove (path1, NULL); } else { fprintf (stderr, "WARNING: [%s] unable to run symlink tests\n", __FUNCTION__); } tr_free (path3); path3 = tr_buildPath (test_dir, "c", NULL); libtest_create_file_with_string_contents (path1, "test"); if (create_hardlink (path2, path1)) { /* File and hardlink to it are the same */ check (tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); /* Two hardlinks to the same file are the same */ create_hardlink (path3, path2); check (tr_sys_path_is_same (path2, path3, &err)); check (err == NULL); check (tr_sys_path_is_same (path1, path3, &err)); check (err == NULL); tr_sys_path_remove (path2, NULL); check (tr_sys_path_is_same (path1, path3, &err)); check (err == NULL); tr_sys_path_remove (path3, NULL); /* File and hardlink to another file are not the same */ libtest_create_file_with_string_contents (path3, "test"); create_hardlink (path2, path3); check (!tr_sys_path_is_same (path1, path2, &err)); check (err == NULL); check (!tr_sys_path_is_same (path2, path1, &err)); check (err == NULL); tr_sys_path_remove (path3, NULL); tr_sys_path_remove (path2, NULL); } else { fprintf (stderr, "WARNING: [%s] unable to run hardlink tests\n", __FUNCTION__); } if (create_symlink (path2, path1, false) && create_hardlink (path3, path1)) { check (tr_sys_path_is_same (path2, path3, &err)); check (err == NULL); } else { fprintf (stderr, "WARNING: [%s] unable to run combined symlink and hardlink tests\n", __FUNCTION__); } tr_sys_path_remove (path3, NULL); tr_sys_path_remove (path2, NULL); tr_sys_path_remove (path1, NULL); tr_free (path3); tr_free (path2); tr_free (path1); tr_free (test_dir); return 0; } static int test_path_resolve (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_error * err = NULL; char * path1, * path2; path1 = tr_buildPath (test_dir, "a", NULL); path2 = tr_buildPath (test_dir, "b", NULL); libtest_create_file_with_string_contents (path1, "test"); if (create_symlink (path2, path1, false)) { char * tmp; tmp = tr_sys_path_resolve (path2, &err); check (tmp != NULL); check (err == NULL); check (path_contains_no_symlinks (tmp)); tr_free (tmp); tr_sys_path_remove (path1, NULL); tr_sys_dir_create (path1, 0, 0755, NULL); tmp = tr_sys_path_resolve (path2, &err); check (tmp != NULL); check (err == NULL); check (path_contains_no_symlinks (tmp)); tr_free (tmp); } else { fprintf (stderr, "WARNING: [%s] unable to run symlink tests\n", __FUNCTION__); } tr_sys_path_remove (path2, NULL); tr_sys_path_remove (path1, NULL); tr_free (path2); tr_free (path1); tr_free (test_dir); return 0; } struct xname_test_data { const char * input; const char * output; }; static int test_path_xname (const struct xname_test_data * data, size_t data_size, char * (* func) (const char *, tr_error **)) { for (size_t i = 0; i < data_size; ++i) { tr_error * err = NULL; char * name = func (data[i].input, &err); if (data[i].output != NULL) { check (name != NULL); check (err == NULL); check_streq (data[i].output, name); tr_free (name); } else { check (name == NULL); check (err != NULL); tr_error_clear (&err); } } return 0; } static int test_path_basename_dirname (void) { const struct xname_test_data basename_tests[] = { { "a", "a" }, { "aa", "aa" }, { "/aa", "aa" }, { "/a/b/c", "c" }, { "/a/b/c/", "c" }, { "/", "/" }, { "", "." }, #ifdef _WIN32 { "c:\\a\\b\\c", "c" }, { "c:", "/" }, { "c:/", "/" }, { "c:\\", "/" }, { "c:a/b", "b" }, { "c:a", "a" }, { "\\\\a\\b\\c", "c" }, { "//a/b", "b" }, { "//1.2.3.4/b", "b" }, { "\\\\a", "a" }, { "\\\\1.2.3.4", "1.2.3.4" }, { "\\\\", "/" }, { "\\", "/" }, { "\\a", "a" }, { "\\\\\\", NULL }, { "123:" , NULL } #else { "////", "/" } #endif }; if (test_path_xname (basename_tests, sizeof (basename_tests) / sizeof (*basename_tests), tr_sys_path_basename) != 0) return 1; const struct xname_test_data dirname_tests[] = { { "/a/b/c", "/a/b" }, { "a/b/c", "a/b" }, { "a/b/c/", "a/b" }, { "a", "." }, { "a/", "." }, { "/", "/" }, { "", "." }, #ifdef _WIN32 { "C:\\a/b\\c", "C:\\a/b" }, { "C:\\a/b\\c\\", "C:\\a/b" }, { "C:\\a/b", "C:\\a" }, { "C:/a", "C:" }, { "C:", "C:" }, { "C:/", "C:" }, { "C:\\", "C:" }, { "c:a/b", "c:a" }, { "c:a", "c:." }, { "c:.", "c:." }, { "\\\\a\\b\\c", "\\\\a\\b" }, { "\\\\a\\b\\c/", "\\\\a\\b" }, { "//a/b", "//a" }, { "//1.2.3.4/b", "//1.2.3.4" }, { "\\\\a", "\\\\" }, { "\\\\1.2.3.4", "\\\\" }, { "\\\\", "\\\\" }, { "\\", "/" }, { "a/b\\c", "a/b" }, { "\\\\\\" , NULL }, { "123:" , NULL } #else { "////", "/" } #endif }; if (test_path_xname (dirname_tests, sizeof (dirname_tests) / sizeof (*dirname_tests), tr_sys_path_dirname) != 0) return 1; /* TODO: is_same (dirname (x) + '/' + basename (x), x) */ return 0; } static int test_path_rename (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_error * err = NULL; char * path1, * path2, * path3; path1 = tr_buildPath (test_dir, "a", NULL); path2 = tr_buildPath (test_dir, "b", NULL); path3 = tr_buildPath (path2, "c", NULL); libtest_create_file_with_string_contents (path1, "test"); /* Preconditions */ check (tr_sys_path_exists (path1, NULL)); check (!tr_sys_path_exists (path2, NULL)); /* Forward rename works */ check (tr_sys_path_rename (path1, path2, &err)); check (!tr_sys_path_exists (path1, NULL)); check (tr_sys_path_exists (path2, NULL)); check (err == NULL); /* Backward rename works */ check (tr_sys_path_rename (path2, path1, &err)); check (tr_sys_path_exists (path1, NULL)); check (!tr_sys_path_exists (path2, NULL)); check (err == NULL); /* Another backward rename [of non-existent file] does not work */ check (!tr_sys_path_rename (path2, path1, &err)); check (err != NULL); tr_error_clear (&err); /* Rename to file which couldn't be created does not work */ check (!tr_sys_path_rename (path1, path3, &err)); check (err != NULL); tr_error_clear (&err); /* Rename of non-existent file does not work */ check (!tr_sys_path_rename (path3, path2, &err)); check (err != NULL); tr_error_clear (&err); libtest_create_file_with_string_contents (path2, "test"); /* Renaming file does overwrite existing file */ check (tr_sys_path_rename (path2, path1, &err)); check (err == NULL); tr_sys_dir_create (path2, 0, 0777, NULL); /* Renaming file does not overwrite existing directory, and vice versa */ check (!tr_sys_path_rename (path1, path2, &err)); check (err != NULL); tr_error_clear (&err); check (!tr_sys_path_rename (path2, path1, &err)); check (err != NULL); tr_error_clear (&err); tr_sys_path_remove (path2, NULL); tr_free (path3); path3 = tr_buildPath (test_dir, "c", NULL); if (create_symlink (path2, path1, false)) { /* Preconditions */ check (tr_sys_path_exists (path2, NULL)); check (!tr_sys_path_exists (path3, NULL)); check (tr_sys_path_is_same (path1, path2, NULL)); /* Rename of symlink works, files stay the same */ check (tr_sys_path_rename (path2, path3, &err)); check (err == NULL); check (!tr_sys_path_exists (path2, NULL)); check (tr_sys_path_exists (path3, NULL)); check (tr_sys_path_is_same (path1, path3, NULL)); tr_sys_path_remove (path3, NULL); } else { fprintf (stderr, "WARNING: [%s] unable to run symlink tests\n", __FUNCTION__); } if (create_hardlink (path2, path1)) { /* Preconditions */ check (tr_sys_path_exists (path2, NULL)); check (!tr_sys_path_exists (path3, NULL)); check (tr_sys_path_is_same (path1, path2, NULL)); /* Rename of hardlink works, files stay the same */ check (tr_sys_path_rename (path2, path3, &err)); check (err == NULL); check (!tr_sys_path_exists (path2, NULL)); check (tr_sys_path_exists (path3, NULL)); check (tr_sys_path_is_same (path1, path3, NULL)); tr_sys_path_remove (path3, NULL); } else { fprintf (stderr, "WARNING: [%s] unable to run hardlink tests\n", __FUNCTION__); } tr_sys_path_remove (path1, NULL); tr_free (path3); tr_free (path2); tr_free (path1); tr_free (test_dir); return 0; } static int test_path_remove (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_error * err = NULL; char * path1, * path2, * path3; path1 = tr_buildPath (test_dir, "a", NULL); path2 = tr_buildPath (test_dir, "b", NULL); path3 = tr_buildPath (path2, "c", NULL); /* Can't remove non-existent file/directory */ check (!tr_sys_path_exists (path1, NULL)); check (!tr_sys_path_remove (path1, &err)); check (err != NULL); check (!tr_sys_path_exists (path1, NULL)); tr_error_clear (&err); /* Removing file works */ libtest_create_file_with_string_contents (path1, "test"); check (tr_sys_path_exists (path1, NULL)); check (tr_sys_path_remove (path1, &err)); check (err == NULL); check (!tr_sys_path_exists (path1, NULL)); /* Removing empty directory works */ tr_sys_dir_create (path1, 0, 0777, NULL); check (tr_sys_path_exists (path1, NULL)); check (tr_sys_path_remove (path1, &err)); check (err == NULL); check (!tr_sys_path_exists (path1, NULL)); /* Removing non-empty directory fails */ tr_sys_dir_create (path2, 0, 0777, NULL); libtest_create_file_with_string_contents (path3, "test"); check (tr_sys_path_exists (path2, NULL)); check (tr_sys_path_exists (path3, NULL)); check (!tr_sys_path_remove (path2, &err)); check (err != NULL); check (tr_sys_path_exists (path2, NULL)); check (tr_sys_path_exists (path3, NULL)); tr_error_clear (&err); tr_sys_path_remove (path3, NULL); tr_sys_path_remove (path2, NULL); tr_free (path3); tr_free (path2); tr_free (path1); tr_free (test_dir); return 0; } static int test_file_open (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_error * err = NULL; char * path1; tr_sys_file_t fd; uint64_t n; tr_sys_path_info info; path1 = tr_buildPath (test_dir, "a", NULL); /* Can't open non-existent file */ check (!tr_sys_path_exists (path1, NULL)); check (tr_sys_file_open (path1, TR_SYS_FILE_READ, 0600, &err) == TR_BAD_SYS_FILE); check (err != NULL); check (!tr_sys_path_exists (path1, NULL)); tr_error_clear (&err); check (tr_sys_file_open (path1, TR_SYS_FILE_WRITE, 0600, &err) == TR_BAD_SYS_FILE); check (err != NULL); check (!tr_sys_path_exists (path1, NULL)); tr_error_clear (&err); /* Can't open directory */ tr_sys_dir_create (path1, 0, 0777, NULL); #ifdef _WIN32 /* This works on *NIX */ check (tr_sys_file_open (path1, TR_SYS_FILE_READ, 0600, &err) == TR_BAD_SYS_FILE); check (err != NULL); tr_error_clear (&err); #endif check (tr_sys_file_open (path1, TR_SYS_FILE_WRITE, 0600, &err) == TR_BAD_SYS_FILE); check (err != NULL); tr_error_clear (&err); tr_sys_path_remove (path1, NULL); /* Can create non-existent file */ fd = tr_sys_file_open (path1, TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE, 0640, &err); check (fd != TR_BAD_SYS_FILE); check (err == NULL); tr_sys_file_close (fd, NULL); check (tr_sys_path_exists (path1, NULL)); check (validate_permissions (path1, 0640)); /* Can open existing file */ check (tr_sys_path_exists (path1, NULL)); fd = tr_sys_file_open (path1, TR_SYS_FILE_READ, 0600, &err); check (fd != TR_BAD_SYS_FILE); check (err == NULL); tr_sys_file_close (fd, NULL); fd = tr_sys_file_open (path1, TR_SYS_FILE_WRITE, 0600, &err); check (fd != TR_BAD_SYS_FILE); check (err == NULL); tr_sys_file_close (fd, NULL); tr_sys_path_remove (path1, NULL); libtest_create_file_with_string_contents (path1, "test"); /* Can't create new file if it already exists */ fd = tr_sys_file_open (path1, TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE_NEW, 0640, &err); check (fd == TR_BAD_SYS_FILE); check (err != NULL); tr_error_clear (&err); tr_sys_path_get_info (path1, TR_SYS_PATH_NO_FOLLOW, &info, NULL); check_int_eq (4, info.size); /* Pointer is at the end of file */ tr_sys_path_get_info (path1, TR_SYS_PATH_NO_FOLLOW, &info, NULL); check_int_eq (4, info.size); fd = tr_sys_file_open (path1, TR_SYS_FILE_WRITE | TR_SYS_FILE_APPEND, 0600, &err); check (fd != TR_BAD_SYS_FILE); check (err == NULL); tr_sys_file_write (fd, "s", 1, NULL, NULL); /* On *NIX, pointer is positioned on each write but not initially */ tr_sys_file_seek (fd, 0, TR_SEEK_CUR, &n, NULL); check_int_eq (5, n); tr_sys_file_close (fd, NULL); /* File gets truncated */ tr_sys_path_get_info (path1, TR_SYS_PATH_NO_FOLLOW, &info, NULL); check_int_eq (5, info.size); fd = tr_sys_file_open (path1, TR_SYS_FILE_WRITE | TR_SYS_FILE_TRUNCATE, 0600, &err); check (fd != TR_BAD_SYS_FILE); check (err == NULL); tr_sys_file_get_info (fd, &info, NULL); check_int_eq (0, info.size); tr_sys_file_close (fd, NULL); tr_sys_path_get_info (path1, TR_SYS_PATH_NO_FOLLOW, &info, NULL); check_int_eq (0, info.size); /* TODO: symlink and hardlink tests */ tr_sys_path_remove (path1, NULL); tr_free (path1); tr_free (test_dir); return 0; } static int test_file_read_write_seek (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_error * err = NULL; char * path1; tr_sys_file_t fd; uint64_t n; char buf[100]; path1 = tr_buildPath (test_dir, "a", NULL); fd = tr_sys_file_open (path1, TR_SYS_FILE_READ | TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE, 0600, NULL); check (tr_sys_file_seek (fd, 0, TR_SEEK_CUR, &n, &err)); check (err == NULL); check_int_eq (0, n); check (tr_sys_file_write (fd, "test", 4, &n, &err)); check (err == NULL); check_int_eq (4, n); check (tr_sys_file_seek (fd, 0, TR_SEEK_CUR, &n, &err)); check (err == NULL); check_int_eq (4, n); check (tr_sys_file_seek (fd, 0, TR_SEEK_SET, &n, &err)); check (err == NULL); check_int_eq (0, n); check (tr_sys_file_read (fd, buf, sizeof (buf), &n, &err)); check (err == NULL); check_int_eq (4, n); check_int_eq (0, memcmp (buf, "test", 4)); check (tr_sys_file_seek (fd, -3, TR_SEEK_CUR, &n, &err)); check (err == NULL); check_int_eq (1, n); check (tr_sys_file_write (fd, "E", 1, &n, &err)); check (err == NULL); check_int_eq (1, n); check (tr_sys_file_seek (fd, -2, TR_SEEK_CUR, &n, &err)); check (err == NULL); check_int_eq (0, n); check (tr_sys_file_read (fd, buf, sizeof (buf), &n, &err)); check (err == NULL); check_int_eq (4, n); check_int_eq (0, memcmp (buf, "tEst", 4)); check (tr_sys_file_seek (fd, 0, TR_SEEK_END, &n, &err)); check (err == NULL); check_int_eq (4, n); check (tr_sys_file_write (fd, " ok", 3, &n, &err)); check (err == NULL); check_int_eq (3, n); check (tr_sys_file_seek (fd, 0, TR_SEEK_SET, &n, &err)); check (err == NULL); check_int_eq (0, n); check (tr_sys_file_read (fd, buf, sizeof (buf), &n, &err)); check (err == NULL); check_int_eq (7, n); check_int_eq (0, memcmp (buf, "tEst ok", 7)); check (tr_sys_file_write_at (fd, "-", 1, 4, &n, &err)); check (err == NULL); check_int_eq (1, n); check (tr_sys_file_read_at (fd, buf, 5, 2, &n, &err)); check (err == NULL); check_int_eq (5, n); check_int_eq (0, memcmp (buf, "st-ok", 5)); tr_sys_file_close (fd, NULL); tr_sys_path_remove (path1, NULL); tr_free (path1); tr_free (test_dir); return 0; } static int test_file_truncate (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_error * err = NULL; char * path1; tr_sys_file_t fd; tr_sys_path_info info; path1 = tr_buildPath (test_dir, "a", NULL); fd = tr_sys_file_open (path1, TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE, 0600, NULL); check (tr_sys_file_truncate (fd, 10, &err)); check (err == NULL); tr_sys_file_get_info (fd, &info, NULL); check_int_eq (10, info.size); check (tr_sys_file_truncate (fd, 20, &err)); check (err == NULL); tr_sys_file_get_info (fd, &info, NULL); check_int_eq (20, info.size); check (tr_sys_file_truncate (fd, 0, &err)); check (err == NULL); tr_sys_file_get_info (fd, &info, NULL); check_int_eq (0, info.size); check (tr_sys_file_truncate (fd, 50, &err)); check (err == NULL); tr_sys_file_close (fd, NULL); tr_sys_path_get_info (path1, 0, &info, NULL); check_int_eq (50, info.size); fd = tr_sys_file_open (path1, TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE, 0600, NULL); check (tr_sys_file_truncate (fd, 25, &err)); check (err == NULL); tr_sys_file_close (fd, NULL); tr_sys_path_get_info (path1, 0, &info, NULL); check_int_eq (25, info.size); tr_sys_path_remove (path1, NULL); tr_free (path1); tr_free (test_dir); return 0; } static int test_file_preallocate (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_error * err = NULL; char * path1; tr_sys_file_t fd; tr_sys_path_info info; path1 = tr_buildPath (test_dir, "a", NULL); fd = tr_sys_file_open (path1, TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE, 0600, NULL); if (tr_sys_file_preallocate (fd, 50, 0, &err)) { check (err == NULL); tr_sys_file_get_info (fd, &info, NULL); check_int_eq (50, info.size); } else { check (err != NULL); fprintf (stderr, "WARNING: [%s] unable to preallocate file (full): %s (%d)\n", __FUNCTION__, err->message, err->code); tr_error_clear (&err); } tr_sys_file_close (fd, NULL); tr_sys_path_remove (path1, NULL); fd = tr_sys_file_open (path1, TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE, 0600, NULL); if (tr_sys_file_preallocate (fd, 500 * 1024 * 1024, TR_SYS_FILE_PREALLOC_SPARSE, &err)) { check (err == NULL); tr_sys_file_get_info (fd, &info, NULL); check_int_eq (500 * 1024 * 1024, info.size); } else { check (err != NULL); fprintf (stderr, "WARNING: [%s] unable to preallocate file (sparse): %s (%d)\n", __FUNCTION__, err->message, err->code); tr_error_clear (&err); } tr_sys_file_close (fd, NULL); tr_sys_path_remove (path1, NULL); tr_free (path1); tr_free (test_dir); return 0; } static int test_file_map (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_error * err = NULL; char * path1; tr_sys_file_t fd; char * view; path1 = tr_buildPath (test_dir, "a", NULL); libtest_create_file_with_string_contents (path1, "test"); fd = tr_sys_file_open (path1, TR_SYS_FILE_READ | TR_SYS_FILE_WRITE, 0600, NULL); view = tr_sys_file_map_for_reading (fd, 0, 4, &err); check (view != NULL); check (err == NULL); check_int_eq (0, memcmp (view, "test", 4)); tr_sys_file_write_at (fd, "E", 1, 1, NULL, NULL); check_int_eq (0, memcmp (view, "tEst", 4)); check (tr_sys_file_unmap (view, 4, &err)); check (err == NULL); tr_sys_file_close (fd, NULL); tr_sys_path_remove (path1, NULL); tr_free (path1); tr_free (test_dir); return 0; } static int test_file_utilities (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_error * err = NULL; char * path1; tr_sys_file_t fd; char buffer[16]; path1 = tr_buildPath (test_dir, "a", NULL); libtest_create_file_with_string_contents (path1, "a\nbc\r\ndef\nghij\r\n\n\nklmno\r"); fd = tr_sys_file_open (path1, TR_SYS_FILE_READ, 0, NULL); check (tr_sys_file_read_line (fd, buffer, sizeof (buffer) / sizeof (*buffer), &err)); check (err == NULL); check_streq ("a", buffer); check (tr_sys_file_read_line (fd, buffer, sizeof (buffer) / sizeof (*buffer), &err)); check (err == NULL); check_streq ("bc", buffer); check (tr_sys_file_read_line (fd, buffer, sizeof (buffer) / sizeof (*buffer), &err)); check (err == NULL); check_streq ("def", buffer); check (tr_sys_file_read_line (fd, buffer, sizeof (buffer) / sizeof (*buffer), &err)); check (err == NULL); check_streq ("ghij", buffer); check (tr_sys_file_read_line (fd, buffer, sizeof (buffer) / sizeof (*buffer), &err)); check (err == NULL); check_streq ("", buffer); check (tr_sys_file_read_line (fd, buffer, sizeof (buffer) / sizeof (*buffer), &err)); check (err == NULL); check_streq ("", buffer); check (tr_sys_file_read_line (fd, buffer, 4, &err)); check (err == NULL); check_streq ("klmn", buffer); check (tr_sys_file_read_line (fd, buffer, sizeof (buffer) / sizeof (*buffer), &err)); check (err == NULL); check_streq ("o", buffer); check (!tr_sys_file_read_line (fd, buffer, sizeof (buffer) / sizeof (*buffer), &err)); check (err == NULL); check_streq ("o", buffer); /* on EOF, buffer stays unchanged */ tr_sys_file_close (fd, NULL); fd = tr_sys_file_open (path1, TR_SYS_FILE_READ | TR_SYS_FILE_WRITE | TR_SYS_FILE_TRUNCATE, 0, NULL); check (tr_sys_file_write_line (fd, "p", &err)); check (err == NULL); check (tr_sys_file_write_line (fd, "", &err)); check (err == NULL); check (tr_sys_file_write_line (fd, "qr", &err)); check (err == NULL); check (tr_sys_file_write_fmt (fd, "s%cu\r\n", &err, 't')); check (err == NULL); check (tr_sys_file_write_line (fd, "", &err)); check (err == NULL); check (tr_sys_file_write_line (fd, "", &err)); check (err == NULL); check (tr_sys_file_write_fmt (fd, "v%sy%d", &err, "wx", 2)); check (err == NULL); tr_sys_file_seek (fd, 0, TR_SEEK_SET, NULL, NULL); check (tr_sys_file_read_line (fd, buffer, sizeof (buffer) / sizeof (*buffer), &err)); check (err == NULL); check_streq ("p", buffer); check (tr_sys_file_read_line (fd, buffer, sizeof (buffer) / sizeof (*buffer), &err)); check (err == NULL); check_streq ("", buffer); check (tr_sys_file_read_line (fd, buffer, sizeof (buffer) / sizeof (*buffer), &err)); check (err == NULL); check_streq ("qr", buffer); check (tr_sys_file_read_line (fd, buffer, sizeof (buffer) / sizeof (*buffer), &err)); check (err == NULL); check_streq ("stu", buffer); check (tr_sys_file_read_line (fd, buffer, sizeof (buffer) / sizeof (*buffer), &err)); check (err == NULL); check_streq ("", buffer); check (tr_sys_file_read_line (fd, buffer, sizeof (buffer) / sizeof (*buffer), &err)); check (err == NULL); check_streq ("", buffer); check (tr_sys_file_read_line (fd, buffer, sizeof (buffer) / sizeof (*buffer), &err)); check (err == NULL); check_streq ("vwxy2", buffer); check (!tr_sys_file_read_line (fd, buffer, sizeof (buffer) / sizeof (*buffer), &err)); check (err == NULL); check_streq ("vwxy2", buffer); /* on EOF, buffer stays unchanged */ tr_sys_file_close (fd, NULL); tr_sys_path_remove (path1, NULL); tr_free (path1); tr_free (test_dir); return 0; } static int test_dir_create (void) { char * const test_dir = create_test_dir (__FUNCTION__); tr_error * err = NULL; char * path1, * path2; path1 = tr_buildPath (test_dir, "a", NULL); path2 = tr_buildPath (path1, "b", NULL); /* Can create directory which has parent */ check (tr_sys_dir_create (path1, 0, 0700, &err)); check (err == NULL); check (tr_sys_path_exists (path1, NULL)); check (validate_permissions (path1, 0700)); tr_sys_path_remove (path1, NULL); libtest_create_file_with_string_contents (path1, "test"); /* Can't create directory where file already exists */ check (!tr_sys_dir_create (path1, 0, 0700, &err)); check (err != NULL); tr_error_clear (&err); check (!tr_sys_dir_create (path1, TR_SYS_DIR_CREATE_PARENTS, 0700, &err)); check (err != NULL); tr_error_clear (&err); tr_sys_path_remove (path1, NULL); /* Can't create directory which has no parent */ check (!tr_sys_dir_create (path2, 0, 0700, &err)); check (err != NULL); check (!tr_sys_path_exists (path2, NULL)); tr_error_clear (&err); /* Can create directory with parent directories */ check (tr_sys_dir_create (path2, TR_SYS_DIR_CREATE_PARENTS, 0751, &err)); check (err == NULL); check (tr_sys_path_exists (path1, NULL)); check (tr_sys_path_exists (path2, NULL)); check (validate_permissions (path1, 0751)); check (validate_permissions (path2, 0751)); /* Can create existing directory (no-op) */ check (tr_sys_dir_create (path1, 0, 0700, &err)); check (err == NULL); check (tr_sys_dir_create (path1, TR_SYS_DIR_CREATE_PARENTS, 0700, &err)); check (err == NULL); tr_sys_path_remove (path2, NULL); tr_sys_path_remove (path1, NULL); tr_free (path2); tr_free (path1); tr_free (test_dir); return 0; } static int test_dir_read_impl (const char * path, bool * have1, bool * have2) { tr_error * err = NULL; tr_sys_dir_t dd; const char * name; *have1 = *have2 = false; dd = tr_sys_dir_open (path, &err); check (dd != TR_BAD_SYS_DIR); check (err == NULL); while ((name = tr_sys_dir_read_name (dd, &err)) != NULL) { check (err == NULL); if (strcmp (name, ".") == 0 || strcmp (name, "..") == 0) continue; if (strcmp (name, "a") == 0) *have1 = true; else if (strcmp (name, "b") == 0) *have2 = true; else check (false); } check (err == NULL); check (tr_sys_dir_close (dd, &err)); check (err == NULL); return 0; } static int test_dir_read (void) { char * const test_dir = create_test_dir (__FUNCTION__); char * path1, * path2; bool have1, have2; path1 = tr_buildPath (test_dir, "a", NULL); path2 = tr_buildPath (test_dir, "b", NULL); if (test_dir_read_impl (test_dir, &have1, &have2) != 0) return 1; check (!have1); check (!have2); libtest_create_file_with_string_contents (path1, "test"); if (test_dir_read_impl (test_dir, &have1, &have2) != 0) return 1; check (have1); check (!have2); libtest_create_file_with_string_contents (path2, "test"); if (test_dir_read_impl (test_dir, &have1, &have2) != 0) return 1; check (have1); check (have2); tr_sys_path_remove (path1, NULL); if (test_dir_read_impl (test_dir, &have1, &have2) != 0) return 1; check (!have1); check (have2); tr_free (path2); tr_free (path1); tr_free (test_dir); return 0; } int main (void) { const testFunc tests[] = { test_get_info, test_path_exists, test_path_is_relative, test_path_is_same, test_path_resolve, test_path_basename_dirname, test_path_rename, test_path_remove, test_file_open, test_file_read_write_seek, test_file_truncate, test_file_preallocate, test_file_map, test_file_utilities, test_dir_create, test_dir_read }; int ret; /* init the session */ session = libttest_session_init (NULL); ret = runTests (tests, NUM_TESTS (tests)); if (ret == 0) libttest_session_close (session); return ret; } transmission-2.92/libtransmission/PaxHeaders.4960/crypto.h0000644000000000000000000000013012505250244020564 xustar0029 mtime=1427460260.44824362 29 atime=1427460260.44824362 30 ctime=1457295919.595801031 transmission-2.92/libtransmission/crypto.h0000644000175000017500000000510312505250244022212 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: crypto.h 14360 2014-12-04 20:45:18Z mikedld $ */ #ifndef TR_ENCRYPTION_H #define TR_ENCRYPTION_H #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #include #include "crypto-utils.h" #include "utils.h" /* TR_GNUC_NULL_TERMINATED */ /** *** @addtogroup peers *** @{ **/ enum { KEY_LEN = 96 }; /** @brief Holds state information for encrypted peer communications */ typedef struct { tr_rc4_ctx_t dec_key; tr_rc4_ctx_t enc_key; tr_dh_ctx_t dh; uint8_t myPublicKey[KEY_LEN]; tr_dh_secret_t mySecret; uint8_t torrentHash[SHA_DIGEST_LENGTH]; bool isIncoming; bool torrentHashIsSet; } tr_crypto; /** @brief construct a new tr_crypto object */ void tr_cryptoConstruct (tr_crypto * crypto, const uint8_t * torrentHash, bool isIncoming); /** @brief destruct an existing tr_crypto object */ void tr_cryptoDestruct (tr_crypto * crypto); void tr_cryptoSetTorrentHash (tr_crypto * crypto, const uint8_t * torrentHash); const uint8_t* tr_cryptoGetTorrentHash (const tr_crypto * crypto); bool tr_cryptoHasTorrentHash (const tr_crypto * crypto); bool tr_cryptoComputeSecret (tr_crypto * crypto, const uint8_t * peerPublicKey); const uint8_t* tr_cryptoGetMyPublicKey (const tr_crypto * crypto, int * setme_len); void tr_cryptoDecryptInit (tr_crypto * crypto); void tr_cryptoDecrypt (tr_crypto * crypto, size_t buflen, const void * buf_in, void * buf_out); void tr_cryptoEncryptInit (tr_crypto * crypto); void tr_cryptoEncrypt (tr_crypto * crypto, size_t buflen, const void * buf_in, void * buf_out); bool tr_cryptoSecretKeySha1 (const tr_crypto * crypto, const void * prepend_data, size_t prepend_data_size, const void * append_data, size_t append_data_size, uint8_t * hash); /* @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/list.h0000644000000000000000000000013212442116602020220 xustar0030 mtime=1418239362.920222392 30 atime=1418239362.920222392 30 ctime=1457295919.677802425 transmission-2.92/libtransmission/list.h0000644000175000017500000000643512442116602021655 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: list.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_LIST_H #define TR_LIST_H /** * @addtogroup utils Utilities * @{ */ #include "transmission.h" /* inline */ /** @brief simple list structure similar to glib's GList */ typedef struct tr_list { void * data; struct tr_list * next; struct tr_list * prev; } tr_list; typedef int (*TrListCompareFunc)(const void * a, const void * b); typedef void (*TrListForeachFunc)(void *); /** * @brief return the number of items in the list * @return the number of items in the list */ int tr_list_size (const tr_list * list); /** * @brief free the specified list and set its pointer to NULL * @param list pointer to the list to be freed * @param func optional function to invoke on each item in the list */ void tr_list_free (tr_list ** list, TrListForeachFunc data_free_func); /** * @brief append an item to the specified list * @param list pointer to the list * @param item the item to append */ void tr_list_append (tr_list ** list, void * data); /** * @brief prepend an item to the specified list * @param list pointer to the list * @param item the item to prepend */ void tr_list_prepend (tr_list ** list, void * data); /** * @brief remove the next item in the list * @return the next item in the list, or NULL if the list is empty * @param list pointer to the list */ void* tr_list_pop_front (tr_list ** list); /** * @brief remove the list's node that contains the specified data pointer * @param list pointer to the list * @param data data to remove * @return the removed data pointer, or NULL if no match was found */ void* tr_list_remove_data (tr_list ** list, const void * data); /** * @brief remove the list's node that compares equal to "b" when compared with "compare_func" * @param list pointer to the list * @param b the comparison key * @param compare_func the comparison function. The arguments passed to it will be the list's pointers and the comparison key "b" * @return the removed data pointer, or NULL if no match was found */ void* tr_list_remove (tr_list ** list, const void * b, TrListCompareFunc compare_func); /** * @brief find the list node whose data that compares equal to "b" when compared with "compare_func" * @param list pointer to the list * @param b the comparison key * @param compare_func the comparison function. The arguments passed to it will be the list's pointers and the comparison key "b" * @return the matching list node, or NULL if not match was found */ tr_list* tr_list_find (tr_list * list, const void * b, TrListCompareFunc compare_func); /** * @brief Insert in an ordered list * @param list pointer to the list * @param item the item to be inserted * @param compare the comparison function. */ void tr_list_insert_sorted (tr_list ** list, void * data, TrListCompareFunc compare); /* @} */ #endif /* TR_LIST_H */ transmission-2.92/libtransmission/PaxHeaders.4960/resume.h0000644000000000000000000000013212442116602020545 xustar0030 mtime=1418239362.955222992 30 atime=1418239362.954222974 30 ctime=1457295919.775804092 transmission-2.92/libtransmission/resume.h0000644000175000017500000000333412442116602022175 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: resume.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_RESUME_H #define TR_RESUME_H enum { TR_FR_DOWNLOADED = (1 << 0), TR_FR_UPLOADED = (1 << 1), TR_FR_CORRUPT = (1 << 2), TR_FR_PEERS = (1 << 3), TR_FR_PROGRESS = (1 << 4), TR_FR_DND = (1 << 5), TR_FR_FILE_PRIORITIES = (1 << 6), TR_FR_BANDWIDTH_PRIORITY = (1 << 7), TR_FR_SPEEDLIMIT = (1 << 8), TR_FR_RUN = (1 << 9), TR_FR_DOWNLOAD_DIR = (1 << 10), TR_FR_INCOMPLETE_DIR = (1 << 11), TR_FR_MAX_PEERS = (1 << 12), TR_FR_ADDED_DATE = (1 << 13), TR_FR_DONE_DATE = (1 << 14), TR_FR_ACTIVITY_DATE = (1 << 15), TR_FR_RATIOLIMIT = (1 << 16), TR_FR_IDLELIMIT = (1 << 17), TR_FR_TIME_SEEDING = (1 << 18), TR_FR_TIME_DOWNLOADING = (1 << 19), TR_FR_FILENAMES = (1 << 20), TR_FR_NAME = (1 << 21), }; /** * Returns a bitwise-or'ed set of the loaded resume data */ uint64_t tr_torrentLoadResume (tr_torrent * tor, uint64_t fieldsToLoad, const tr_ctor * ctor); void tr_torrentSaveResume (tr_torrent * tor); void tr_torrentRemoveResume (const tr_torrent * tor); int tr_torrentRenameResume (const tr_torrent * tor, const char * newname); #endif transmission-2.92/libtransmission/PaxHeaders.4960/watchdir.c0000644000000000000000000000013112662757243021064 xustar0030 mtime=1456201379.236861566 30 atime=1456201379.236861566 29 ctime=1457295920.23381188 transmission-2.92/libtransmission/watchdir.c0000644000175000017500000002260312662757243022515 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015-2016 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: watchdir.c 14674 2016-01-25 21:48:58Z mikedld $ */ #include #include /* strcmp () */ #include #include #define __LIBTRANSMISSION_WATCHDIR_MODULE__ #include "transmission.h" #include "error.h" #include "error-types.h" #include "file.h" #include "log.h" #include "ptrarray.h" #include "utils.h" #include "watchdir.h" #include "watchdir-common.h" /*** **** ***/ #define log_debug(...) (!tr_logLevelIsActive (TR_LOG_DEBUG) ? (void) 0 : \ tr_logAddMessage (__FILE__, __LINE__, TR_LOG_DEBUG, "watchdir", __VA_ARGS__)) #define log_error(...) (!tr_logLevelIsActive (TR_LOG_ERROR) ? (void) 0 : \ tr_logAddMessage (__FILE__, __LINE__, TR_LOG_ERROR, "watchdir", __VA_ARGS__)) /*** **** ***/ struct tr_watchdir { char * path; tr_watchdir_cb callback; void * callback_user_data; struct event_base * event_base; tr_watchdir_backend * backend; tr_ptrArray active_retries; }; /*** **** ***/ static bool is_regular_file (const char * dir, const char * name) { char * const path = tr_buildPath (dir, name, NULL); tr_sys_path_info path_info; tr_error * error = NULL; bool ret; if ((ret = tr_sys_path_get_info (path, 0, &path_info, &error))) { ret = path_info.type == TR_SYS_PATH_IS_FILE; } else { if (!TR_ERROR_IS_ENOENT (error->code)) log_error ("Failed to get type of \"%s\" (%d): %s", path, error->code, error->message); tr_error_free (error); } tr_free (path); return ret; } static const char * watchdir_status_to_string (tr_watchdir_status status) { switch (status) { case TR_WATCHDIR_ACCEPT: return "accept"; case TR_WATCHDIR_IGNORE: return "ignore"; case TR_WATCHDIR_RETRY: return "retry"; default: return "???"; } } static tr_watchdir_status tr_watchdir_process_impl (tr_watchdir_t handle, const char * name) { /* File may be gone while we're retrying */ if (!is_regular_file (tr_watchdir_get_path (handle), name)) return TR_WATCHDIR_IGNORE; const tr_watchdir_status ret = handle->callback (handle, name, handle->callback_user_data); assert (ret == TR_WATCHDIR_ACCEPT || ret == TR_WATCHDIR_IGNORE || ret == TR_WATCHDIR_RETRY); log_debug ("Callback decided to %s file \"%s\"", watchdir_status_to_string (ret), name); return ret; } /*** **** ***/ typedef struct tr_watchdir_retry { tr_watchdir_t handle; char * name; unsigned int counter; struct event * timer; struct timeval interval; } tr_watchdir_retry; /* Non-static and mutable for unit tests */ unsigned int tr_watchdir_retry_limit = 3; struct timeval tr_watchdir_retry_start_interval = { 1, 0 }; struct timeval tr_watchdir_retry_max_interval = { 10, 0 }; #define tr_watchdir_retries_init(r) (void) 0 #define tr_watchdir_retries_destroy(r) tr_ptrArrayDestruct ((r), (PtrArrayForeachFunc) &tr_watchdir_retry_free) #define tr_watchdir_retries_insert(r, v) tr_ptrArrayInsertSorted ((r), (v), &compare_retry_names) #define tr_watchdir_retries_remove(r, v) tr_ptrArrayRemoveSortedPointer ((r), (v), &compare_retry_names) #define tr_watchdir_retries_find(r, v) tr_ptrArrayFindSorted ((r), (v), &compare_retry_names) static int compare_retry_names (const void * a, const void * b) { return strcmp (((tr_watchdir_retry *) a)->name, ((tr_watchdir_retry *) b)->name); } static void tr_watchdir_retry_free (tr_watchdir_retry * retry); static void tr_watchdir_on_retry_timer (evutil_socket_t fd UNUSED, short type UNUSED, void * context) { assert (context != NULL); tr_watchdir_retry * const retry = context; const tr_watchdir_t handle = retry->handle; if (tr_watchdir_process_impl (handle, retry->name) == TR_WATCHDIR_RETRY) { if (++retry->counter < tr_watchdir_retry_limit) { evutil_timeradd (&retry->interval, &retry->interval, &retry->interval); if (evutil_timercmp (&retry->interval, &tr_watchdir_retry_max_interval, >)) retry->interval = tr_watchdir_retry_max_interval; evtimer_del (retry->timer); evtimer_add (retry->timer, &retry->interval); return; } log_error ("Failed to add (corrupted?) torrent file: %s", retry->name); } tr_watchdir_retries_remove (&handle->active_retries, retry); tr_watchdir_retry_free (retry); } static tr_watchdir_retry * tr_watchdir_retry_new (tr_watchdir_t handle, const char * name) { tr_watchdir_retry * retry; retry = tr_new0 (tr_watchdir_retry, 1); retry->handle = handle; retry->name = tr_strdup (name); retry->timer = evtimer_new (handle->event_base, &tr_watchdir_on_retry_timer, retry); retry->interval = tr_watchdir_retry_start_interval; evtimer_add (retry->timer, &retry->interval); return retry; } static void tr_watchdir_retry_free (tr_watchdir_retry * retry) { if (retry == NULL) return; if (retry->timer != NULL) { evtimer_del (retry->timer); event_free (retry->timer); } tr_free (retry->name); tr_free (retry); } static void tr_watchdir_retry_restart (tr_watchdir_retry * retry) { assert (retry != NULL); evtimer_del (retry->timer); retry->counter = 0; retry->interval = tr_watchdir_retry_start_interval; evtimer_add (retry->timer, &retry->interval); } /*** **** ***/ tr_watchdir_t tr_watchdir_new (const char * path, tr_watchdir_cb callback, void * callback_user_data, struct event_base * event_base, bool force_generic) { tr_watchdir_t handle; handle = tr_new0 (struct tr_watchdir, 1); handle->path = tr_strdup (path); handle->callback = callback; handle->callback_user_data = callback_user_data; handle->event_base = event_base; tr_watchdir_retries_init (&handle->active_retries); if (!force_generic) { #ifdef WITH_INOTIFY if (handle->backend == NULL) handle->backend = tr_watchdir_inotify_new (handle); #endif #ifdef WITH_KQUEUE if (handle->backend == NULL) handle->backend = tr_watchdir_kqueue_new (handle); #endif #ifdef _WIN32 if (handle->backend == NULL) handle->backend = tr_watchdir_win32_new (handle); #endif } if (handle->backend == NULL) handle->backend = tr_watchdir_generic_new (handle); if (handle->backend == NULL) { tr_watchdir_free (handle); handle = NULL; } else { assert (handle->backend->free_func != NULL); } return handle; } void tr_watchdir_free (tr_watchdir_t handle) { if (handle == NULL) return; tr_watchdir_retries_destroy (&handle->active_retries); if (handle->backend != NULL) handle->backend->free_func (handle->backend); tr_free (handle->path); tr_free (handle); } const char * tr_watchdir_get_path (tr_watchdir_t handle) { assert (handle != NULL); return handle->path; } tr_watchdir_backend * tr_watchdir_get_backend (tr_watchdir_t handle) { assert (handle != NULL); return handle->backend; } struct event_base * tr_watchdir_get_event_base (tr_watchdir_t handle) { assert (handle != NULL); return handle->event_base; } /*** **** ***/ void tr_watchdir_process (tr_watchdir_t handle, const char * name) { const tr_watchdir_retry search_key = { .name = (char *) name }; tr_watchdir_retry * existing_retry; assert (handle != NULL); if ((existing_retry = tr_watchdir_retries_find (&handle->active_retries, &search_key)) != NULL) { tr_watchdir_retry_restart (existing_retry); return; } if (tr_watchdir_process_impl (handle, name) == TR_WATCHDIR_RETRY) { tr_watchdir_retry * retry = tr_watchdir_retry_new (handle, name); tr_watchdir_retries_insert (&handle->active_retries, retry); } } void tr_watchdir_scan (tr_watchdir_t handle, tr_ptrArray * dir_entries) { tr_sys_dir_t dir; const char * name; tr_ptrArray new_dir_entries = TR_PTR_ARRAY_INIT_STATIC; const PtrArrayCompareFunc name_compare_func = (PtrArrayCompareFunc) &strcmp; tr_error * error = NULL; if ((dir = tr_sys_dir_open (handle->path, &error)) == TR_BAD_SYS_DIR) { log_error ("Failed to open directory \"%s\" (%d): %s", handle->path, error->code, error->message); tr_error_free (error); return; } while ((name = tr_sys_dir_read_name (dir, &error)) != NULL) { if (strcmp (name, ".") == 0 || strcmp (name, "..") == 0) continue; if (dir_entries != NULL) { tr_ptrArrayInsertSorted (&new_dir_entries, tr_strdup (name), name_compare_func); if (tr_ptrArrayFindSorted (dir_entries, name, name_compare_func) != NULL) continue; } tr_watchdir_process (handle, name); } if (error != NULL) { log_error ("Failed to read directory \"%s\" (%d): %s", handle->path, error->code, error->message); tr_error_free (error); } tr_sys_dir_close (dir, NULL); if (dir_entries != NULL) { tr_ptrArrayDestruct (dir_entries, &tr_free); *dir_entries = new_dir_entries; } } transmission-2.92/libtransmission/PaxHeaders.4960/metainfo-test.c0000644000000000000000000000013212505250244022020 xustar0030 mtime=1427460260.478244155 30 atime=1427460260.478244155 30 ctime=1457295920.270812509 transmission-2.92/libtransmission/metainfo-test.c0000644000175000017500000000663312505250244023455 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: metainfo-test.c 14428 2015-01-02 11:15:31Z mikedld $ */ #include "libtransmission-test.h" #include "transmission.h" #include static int test_magnet_link (void) { tr_info inf; tr_ctor * ctor; const char * magnet_link; tr_parse_result parse_result; /* background info @ http://wiki.theory.org/BitTorrent_Magnet-URI_Webseeding */ magnet_link = "magnet:?" "xt=urn:btih:14FFE5DD23188FD5CB53A1D47F1289DB70ABF31E" "&dn=ubuntu+12+04+1+desktop+32+bit" "&tr=http%3A%2F%2Ftracker.publicbt.com%2Fannounce" "&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80" "&ws=http://transmissionbt.com "; ctor = tr_ctorNew (NULL); tr_ctorSetMetainfoFromMagnetLink (ctor, magnet_link); parse_result = tr_torrentParse (ctor, &inf); check_int_eq (inf.fileCount, 0); /* cos it's a magnet link */ check_int_eq (parse_result, TR_PARSE_OK); check_int_eq (inf.trackerCount, 2); check_streq ("http://tracker.publicbt.com/announce", inf.trackers[0].announce); check_streq ("udp://tracker.publicbt.com:80", inf.trackers[1].announce); check_int_eq (inf.webseedCount, 1); check_streq ("http://transmissionbt.com", inf.webseeds[0]); /* cleanup */ tr_metainfoFree (&inf); tr_ctorFree (ctor); return 0; } #define BEFORE_PATH "d10:created by25:Transmission/2.82 (14160)13:creation datei1402280218e8:encoding5:UTF-84:infod5:filesld6:lengthi2e4:pathl" #define AFTER_PATH "eed6:lengthi2e4:pathl5:b.txteee4:name3:foo12:piece lengthi32768e6:pieces20:ÞÉ`âM‘‹Šs¡Å;˺¬.åÂà7:privatei0eee" static int test_metainfo (void) { size_t i; const struct { int expected_benc_err; int expected_parse_result; const void * benc; } metainfo[] = { { 0, TR_PARSE_OK, BEFORE_PATH "5:a.txt" AFTER_PATH }, /* allow empty components, but not =all= empty components, see bug #5517 */ { 0, TR_PARSE_OK, BEFORE_PATH "0:5:a.txt" AFTER_PATH }, { 0, TR_PARSE_ERR, BEFORE_PATH "0:0:" AFTER_PATH }, /* don't allow path components in a filename */ { 0, TR_PARSE_ERR, BEFORE_PATH "7:a/a.txt" AFTER_PATH }, /* fail on "." components */ { 0, TR_PARSE_ERR, BEFORE_PATH "1:.5:a.txt" AFTER_PATH }, { 0, TR_PARSE_ERR, BEFORE_PATH "5:a.txt1:." AFTER_PATH }, /* fail on ".." components */ { 0, TR_PARSE_ERR, BEFORE_PATH "2:..5:a.txt" AFTER_PATH }, { 0, TR_PARSE_ERR, BEFORE_PATH "5:a.txt2:.." AFTER_PATH }, /* fail on empty string */ { EILSEQ, TR_PARSE_ERR, "" } }; tr_logSetLevel(0); /* yes, we already know these will generate errors, thank you... */ for (i=0; i<(sizeof(metainfo) / sizeof(metainfo[0])); i++) { tr_ctor * ctor = tr_ctorNew (NULL); const int err = tr_ctorSetMetainfo (ctor, metainfo[i].benc, strlen(metainfo[i].benc)); check_int_eq (metainfo[i].expected_benc_err, err); if (!err) { const tr_parse_result parse_result = tr_torrentParse (ctor, NULL); check_int_eq (metainfo[i].expected_parse_result, parse_result); } tr_ctorFree (ctor); } return 0; } int main (void) { const testFunc tests[] = { test_magnet_link, test_metainfo }; return runTests (tests, NUM_TESTS (tests)); } transmission-2.92/libtransmission/PaxHeaders.4960/watchdir-kqueue.c0000644000000000000000000000013212662757235022363 xustar0030 mtime=1456201373.069756656 30 atime=1456201373.069756656 30 ctime=1457295920.252812203 transmission-2.92/libtransmission/watchdir-kqueue.c0000644000175000017500000001013312662757235024006 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015-2016 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: watchdir-kqueue.c 14651 2016-01-02 14:28:59Z mikedld $ */ #include #include #include /* strcmp () */ #include /* open () */ #include /* close () */ #include #include #ifndef O_EVTONLY #define O_EVTONLY O_RDONLY #endif #include #define __LIBTRANSMISSION_WATCHDIR_MODULE__ #include "transmission.h" #include "log.h" #include "ptrarray.h" #include "utils.h" #include "watchdir.h" #include "watchdir-common.h" /*** **** ***/ #define log_error(...) (!tr_logLevelIsActive (TR_LOG_ERROR) ? (void) 0 : \ tr_logAddMessage (__FILE__, __LINE__, TR_LOG_ERROR, "watchdir:kqueue", __VA_ARGS__)) /*** **** ***/ typedef struct tr_watchdir_kqueue { tr_watchdir_backend base; int kq; int dirfd; struct event * event; tr_ptrArray dir_entries; } tr_watchdir_kqueue; #define BACKEND_UPCAST(b) ((tr_watchdir_kqueue *) (b)) #define KQUEUE_WATCH_MASK (NOTE_WRITE | NOTE_EXTEND) /*** **** ***/ static void tr_watchdir_kqueue_on_event (evutil_socket_t fd UNUSED, short type UNUSED, void * context) { const tr_watchdir_t handle = context; tr_watchdir_kqueue * const backend = BACKEND_UPCAST (tr_watchdir_get_backend (handle)); struct kevent ke; const struct timespec ts = { 0, 0 }; if (kevent (backend->kq, NULL, 0, &ke, 1, &ts) == -1) { log_error ("Failed to fetch kevent: %s", tr_strerror (errno)); return; } /* Read directory with generic scan */ tr_watchdir_scan (handle, &backend->dir_entries); } static void tr_watchdir_kqueue_free (tr_watchdir_backend * backend_base) { tr_watchdir_kqueue * const backend = BACKEND_UPCAST (backend_base); if (backend == NULL) return; assert (backend->base.free_func == &tr_watchdir_kqueue_free); if (backend->event != NULL) { event_del (backend->event); event_free (backend->event); } if (backend->kq != -1) close (backend->kq); if (backend->dirfd != -1) close (backend->dirfd); tr_ptrArrayDestruct (&backend->dir_entries, &tr_free); tr_free (backend); } tr_watchdir_backend * tr_watchdir_kqueue_new (tr_watchdir_t handle) { const char * const path = tr_watchdir_get_path (handle); struct kevent ke; tr_watchdir_kqueue * backend; backend = tr_new0 (tr_watchdir_kqueue, 1); backend->base.free_func = &tr_watchdir_kqueue_free; backend->kq = -1; backend->dirfd = -1; if ((backend->kq = kqueue ()) == -1) { log_error ("Failed to start kqueue"); goto fail; } /* Open fd for watching */ if ((backend->dirfd = open (path, O_RDONLY | O_EVTONLY)) == -1) { log_error ("Failed to passively watch directory \"%s\": %s", path, tr_strerror (errno)); goto fail; } /* Register kevent filter with kqueue descriptor */ EV_SET (&ke, backend->dirfd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, KQUEUE_WATCH_MASK, 0, NULL); if (kevent (backend->kq, &ke, 1, NULL, 0, NULL) == -1) { log_error ("Failed to set directory event filter with fd %d: %s", backend->kq, tr_strerror (errno)); goto fail; } /* Create libevent task for event descriptor */ if ((backend->event = event_new (tr_watchdir_get_event_base (handle), backend->kq, EV_READ | EV_ET | EV_PERSIST, &tr_watchdir_kqueue_on_event, handle)) == NULL) { log_error ("Failed to create event: %s", tr_strerror (errno)); goto fail; } if (event_add (backend->event, NULL) == -1) { log_error ("Failed to add event: %s", tr_strerror (errno)); goto fail; } /* Trigger one event for the initial scan */ event_active (backend->event, EV_READ, 0); return BACKEND_DOWNCAST (backend); fail: tr_watchdir_kqueue_free (BACKEND_DOWNCAST (backend)); return NULL; } transmission-2.92/libtransmission/PaxHeaders.4960/platform-quota.c0000644000000000000000000000013212505250244022214 xustar0030 mtime=1427460260.469243994 30 atime=1427460260.469243994 30 ctime=1457295920.088809414 transmission-2.92/libtransmission/platform-quota.c0000644000175000017500000002103412505250244023641 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: platform-quota.c 14480 2015-03-19 06:08:06Z mikedld $ */ #include #include #include #include /* evutil_ascii_strcasecmp () */ #ifndef _WIN32 #include /* getuid() */ #include /* types needed by quota.h */ #if defined(__FreeBSD__) || defined(__OpenBSD__) #include /* quotactl() */ #elif defined (__NetBSD__) #include #ifndef statfs #define statfs statvfs #endif #elif defined (__sun) #include /* quotactl */ #else #include /* quotactl() */ #endif #ifdef HAVE_GETMNTENT #ifdef __sun #include #include #include #include #define _PATH_MOUNTED MNTTAB #else #include #include /* _PATH_MOUNTED */ #endif #else /* BSD derived systems */ #include #include #include #endif #endif #ifdef __APPLE__ #ifndef HAVE_SYS_STATVFS_H #define HAVE_SYS_STATVFS_H #endif #ifndef HAVE_STATVFS #define HAVE_STATVFS #endif #endif #ifdef HAVE_SYS_STATVFS_H #include #endif #ifdef HAVE_XFS_XFS_H #define HAVE_XQM #include #endif #include "transmission.h" #include "utils.h" #include "platform-quota.h" /*** **** ***/ #ifndef _WIN32 static const char * getdev (const char * path) { #ifdef HAVE_GETMNTENT FILE * fp; #ifdef __sun struct mnttab mnt; fp = fopen(_PATH_MOUNTED, "r"); if (fp == NULL) return NULL; while (getmntent(fp, &mnt)) if (!tr_strcmp0 (path, mnt.mnt_mountp)) break; fclose(fp); return mnt.mnt_special; #else struct mntent * mnt; fp = setmntent(_PATH_MOUNTED, "r"); if (fp == NULL) return NULL; while ((mnt = getmntent(fp)) != NULL) if (!tr_strcmp0 (path, mnt->mnt_dir)) break; endmntent(fp); return mnt ? mnt->mnt_fsname : NULL; #endif #else /* BSD derived systems */ int i; int n; struct statfs * mnt; n = getmntinfo(&mnt, MNT_WAIT); if (!n) return NULL; for (i=0; imnt_fsname)) break; endmntent(fp); return mnt ? mnt->mnt_type : NULL; #endif #else /* BSD derived systems */ int i; int n; struct statfs *mnt; n = getmntinfo(&mnt, MNT_WAIT); if (!n) return NULL; for (i=0; i= 600000000) #include static int64_t getquota (const char * device) { struct quotahandle *qh; struct quotakey qk; struct quotaval qv; int64_t limit; int64_t freespace; int64_t spaceused; qh = quota_open(device); if (qh == NULL) { return -1; } qk.qk_idtype = QUOTA_IDTYPE_USER; qk.qk_id = getuid(); qk.qk_objtype = QUOTA_OBJTYPE_BLOCKS; if (quota_get(qh, &qk, &qv) == -1) { quota_close(qh); return -1; } if (qv.qv_softlimit > 0) { limit = qv.qv_softlimit; } else if (qv.qv_hardlimit > 0) { limit = qv.qv_hardlimit; } else { quota_close(qh); return -1; } spaceused = qv.qv_usage; quota_close(qh); freespace = limit - spaceused; return (freespace < 0) ? 0 : freespace; } #else static int64_t getquota (const char * device) { struct dqblk dq; int64_t limit; int64_t freespace; int64_t spaceused; #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__APPLE__) if (quotactl(device, QCMD(Q_GETQUOTA, USRQUOTA), getuid(), (caddr_t) &dq) == 0) { #elif defined(__sun) struct quotctl op; int fd = open(device, O_RDONLY); if (fd < 0) return -1; op.op = Q_GETQUOTA; op.uid = getuid(); op.addr = (caddr_t) &dq; if (ioctl(fd, Q_QUOTACTL, &op) == 0) { close(fd); #else if (quotactl(QCMD(Q_GETQUOTA, USRQUOTA), device, getuid(), (caddr_t) &dq) == 0) { #endif if (dq.dqb_bsoftlimit > 0) { /* Use soft limit first */ limit = dq.dqb_bsoftlimit; } else if (dq.dqb_bhardlimit > 0) { limit = dq.dqb_bhardlimit; } else { /* No quota enabled for this user */ return -1; } #if defined(__FreeBSD__) || defined(__OpenBSD__) spaceused = (int64_t) dq.dqb_curblocks >> 1; #elif defined(__APPLE__) spaceused = (int64_t) dq.dqb_curbytes; #elif defined(__UCLIBC__) spaceused = (int64_t) btodb(dq.dqb_curblocks); #elif defined(__sun) || (defined(_LINUX_QUOTA_VERSION) && _LINUX_QUOTA_VERSION < 2) spaceused = (int64_t) dq.dqb_curblocks >> 1; #else spaceused = btodb(dq.dqb_curspace); #endif freespace = limit - spaceused; #ifdef __APPLE__ return (freespace < 0) ? 0 : freespace; #else return (freespace < 0) ? 0 : freespace * 1024; #endif } #if defined(__sun) close(fd); #endif /* something went wrong */ return -1; } #endif #ifdef HAVE_XQM static int64_t getxfsquota (char * device) { int64_t limit; int64_t freespace; struct fs_disk_quota dq; if (quotactl(QCMD(Q_XGETQUOTA, USRQUOTA), device, getuid(), (caddr_t) &dq) == 0) { if (dq.d_blk_softlimit > 0) { /* Use soft limit first */ limit = dq.d_blk_softlimit >> 1; } else if (dq.d_blk_hardlimit > 0) { limit = dq.d_blk_hardlimit >> 1; } else { /* No quota enabled for this user */ return -1; } freespace = limit - (dq.d_bcount >> 1); return (freespace < 0) ? 0 : freespace * 1024; } /* something went wrong */ return -1; } #endif /* HAVE_XQM */ #endif /* _WIN32 */ static int64_t tr_getQuotaFreeSpace (const struct tr_device_info * info) { int64_t ret = -1; #ifndef _WIN32 if (info->fstype && !evutil_ascii_strcasecmp(info->fstype, "xfs")) { #ifdef HAVE_XQM ret = getxfsquota (info->device); #endif } else { ret = getquota (info->device); } #else /* _WIN32 */ (void) info; #endif /* _WIN32 */ return ret; } static int64_t tr_getDiskFreeSpace (const char * path) { #ifdef _WIN32 int64_t ret = -1; wchar_t * wide_path; wide_path = tr_win32_utf8_to_native (path, -1); if (wide_path != NULL) { ULARGE_INTEGER freeBytesAvailable; if (GetDiskFreeSpaceExW (wide_path, &freeBytesAvailable, NULL, NULL)) ret = freeBytesAvailable.QuadPart; tr_free (wide_path); } return ret; #elif defined(HAVE_STATVFS) struct statvfs buf; return statvfs(path, &buf) ? -1 : (int64_t)buf.f_bavail * (int64_t)buf.f_frsize; #else #warning FIXME: not implemented return -1; #endif } struct tr_device_info * tr_device_info_create (const char * path) { struct tr_device_info * info; info = tr_new0 (struct tr_device_info, 1); info->path = tr_strdup (path); #ifndef _WIN32 info->device = tr_strdup (getblkdev (path)); info->fstype = tr_strdup (getfstype (path)); #endif return info; } void tr_device_info_free (struct tr_device_info * info) { if (info != NULL) { tr_free (info->fstype); tr_free (info->device); tr_free (info->path); tr_free (info); } } int64_t tr_device_info_get_free_space (const struct tr_device_info * info) { int64_t free_space; if ((info == NULL) || (info->path == NULL)) { errno = EINVAL; free_space = -1; } else { free_space = tr_getQuotaFreeSpace (info); if (free_space < 0) free_space = tr_getDiskFreeSpace (info->path); } return free_space; } /*** **** ***/ transmission-2.92/libtransmission/PaxHeaders.4960/torrent.h0000644000000000000000000000013012640354044020744 xustar0029 mtime=1451350052.45315044 29 atime=1451350052.45315044 30 ctime=1457295919.801804534 transmission-2.92/libtransmission/torrent.h0000644000175000017500000003720112640354044022376 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: torrent.h 14634 2015-12-25 11:34:35Z mikedld $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_TORRENT_H #define TR_TORRENT_H 1 #include "bandwidth.h" /* tr_bandwidth */ #include "completion.h" /* tr_completion */ #include "session.h" /* tr_sessionLock (), tr_sessionUnlock () */ #include "utils.h" /* TR_GNUC_PRINTF */ struct tr_torrent_tiers; struct tr_magnet_info; /** *** Package-visible ctor API **/ void tr_torrentFree (tr_torrent * tor); void tr_ctorSetSave (tr_ctor * ctor, bool saveMetadataInOurTorrentsDir); bool tr_ctorGetSave (const tr_ctor * ctor); void tr_ctorInitTorrentPriorities (const tr_ctor * ctor, tr_torrent * tor); void tr_ctorInitTorrentWanted (const tr_ctor * ctor, tr_torrent * tor); /** *** **/ /* just like tr_torrentSetFileDLs but doesn't trigger a fastresume save */ void tr_torrentInitFileDLs (tr_torrent * tor, const tr_file_index_t * files, tr_file_index_t fileCount, bool do_download); void tr_torrentRecheckCompleteness (tr_torrent *); void tr_torrentSetHasPiece (tr_torrent * tor, tr_piece_index_t pieceIndex, bool has); void tr_torrentChangeMyPort (tr_torrent * session); tr_torrent* tr_torrentFindFromHashString (tr_session * session, const char * hashString); tr_torrent* tr_torrentFindFromObfuscatedHash (tr_session * session, const uint8_t * hash); bool tr_torrentIsPieceTransferAllowed (const tr_torrent * torrent, tr_direction direction); #define tr_block(a, b) _tr_block (tor, a, b) tr_block_index_t _tr_block (const tr_torrent * tor, tr_piece_index_t index, uint32_t offset); bool tr_torrentReqIsValid (const tr_torrent * tor, tr_piece_index_t index, uint32_t offset, uint32_t length); uint64_t tr_pieceOffset (const tr_torrent * tor, tr_piece_index_t index, uint32_t offset, uint32_t length); void tr_torrentGetBlockLocation (const tr_torrent * tor, tr_block_index_t block, tr_piece_index_t * piece, uint32_t * offset, uint32_t * length); void tr_torGetFileBlockRange (const tr_torrent * tor, const tr_file_index_t file, tr_block_index_t * first, tr_block_index_t * last); void tr_torGetPieceBlockRange (const tr_torrent * tor, const tr_piece_index_t piece, tr_block_index_t * first, tr_block_index_t * last); void tr_torrentInitFilePriority (tr_torrent * tor, tr_file_index_t fileIndex, tr_priority_t priority); void tr_torrentSetPieceChecked (tr_torrent * tor, tr_piece_index_t piece); void tr_torrentSetChecked (tr_torrent * tor, time_t when); void tr_torrentCheckSeedLimit (tr_torrent * tor); /** save a torrent's .resume file if it's changed since the last time it was saved */ void tr_torrentSave (tr_torrent * tor); void tr_torrentSetLocalError (tr_torrent * tor, const char * fmt, ...) TR_GNUC_PRINTF (2, 3); typedef enum { TR_VERIFY_NONE, TR_VERIFY_WAIT, TR_VERIFY_NOW } tr_verify_state; void tr_torrentSetVerifyState (tr_torrent * tor, tr_verify_state state); tr_torrent_activity tr_torrentGetActivity (const tr_torrent * tor); struct tr_incomplete_metadata; /** @brief Torrent object */ struct tr_torrent { tr_session * session; tr_info info; int magicNumber; tr_stat_errtype error; char errorString[128]; char errorTracker[128]; uint8_t obfuscatedHash[SHA_DIGEST_LENGTH]; /* Used when the torrent has been created with a magnet link * and we're in the process of downloading the metainfo from * other peers */ struct tr_incomplete_metadata * incompleteMetadata; /* If the initiator of the connection receives a handshake in which the * peer_id does not match the expected peerid, then the initiator is * expected to drop the connection. Note that the initiator presumably * received the peer information from the tracker, which includes the * peer_id that was registered by the peer. The peer_id from the tracker * and in the handshake are expected to match. */ unsigned char peer_id[PEER_ID_LEN+1]; time_t peer_id_creation_time; /* Where the files will be when it's complete */ char * downloadDir; /* Where the files are when the torrent is incomplete */ char * incompleteDir; /* Length, in bytes, of the "info" dict in the .torrent file. */ size_t infoDictLength; /* Offset, in bytes, of the beginning of the "info" dict in the .torrent file. * * Used by the torrent-magnet code for serving metainfo to peers. * This field is lazy-generated and might not be initialized yet. */ size_t infoDictOffset; /* Where the files are now. * This pointer will be equal to downloadDir or incompleteDir */ const char * currentDir; /* How many bytes we ask for per request */ uint32_t blockSize; tr_block_index_t blockCount; uint32_t lastBlockSize; uint32_t lastPieceSize; uint16_t blockCountInPiece; uint16_t blockCountInLastPiece; struct tr_completion completion; tr_completeness completeness; struct tr_torrent_tiers * tiers; time_t dhtAnnounceAt; time_t dhtAnnounce6At; bool dhtAnnounceInProgress; bool dhtAnnounce6InProgress; time_t lpdAnnounceAt; uint64_t downloadedCur; uint64_t downloadedPrev; uint64_t uploadedCur; uint64_t uploadedPrev; uint64_t corruptCur; uint64_t corruptPrev; uint64_t etaDLSpeedCalculatedAt; unsigned int etaDLSpeed_Bps; uint64_t etaULSpeedCalculatedAt; unsigned int etaULSpeed_Bps; time_t addedDate; time_t activityDate; time_t doneDate; time_t startDate; time_t anyDate; int secondsDownloading; int secondsSeeding; int queuePosition; tr_torrent_metadata_func metadata_func; void * metadata_func_user_data; tr_torrent_completeness_func completeness_func; void * completeness_func_user_data; tr_torrent_ratio_limit_hit_func ratio_limit_hit_func; void * ratio_limit_hit_func_user_data; tr_torrent_idle_limit_hit_func idle_limit_hit_func; void * idle_limit_hit_func_user_data; void * queue_started_user_data; void (* queue_started_callback)(tr_torrent *, void * queue_started_user_data); bool isRunning; bool isStopping; bool isDeleting; bool startAfterVerify; bool isDirty; bool isQueued; bool magnetVerify; bool infoDictOffsetIsCached; uint16_t maxConnectedPeers; tr_verify_state verifyState; time_t lastStatTime; tr_stat stats; tr_torrent * next; int uniqueId; struct tr_bandwidth bandwidth; struct tr_swarm * swarm; float desiredRatio; tr_ratiolimit ratioLimitMode; uint16_t idleLimitMinutes; tr_idlelimit idleLimitMode; bool finishedSeedingByIdle; }; static inline tr_torrent* tr_torrentNext (tr_session * session, tr_torrent * current) { return current ? current->next : session->torrentList; } /* what piece index is this block in? */ static inline tr_piece_index_t tr_torBlockPiece (const tr_torrent * tor, const tr_block_index_t block) { return block / tor->blockCountInPiece; } /* how many bytes are in this piece? */ static inline uint32_t tr_torPieceCountBytes (const tr_torrent * tor, const tr_piece_index_t piece) { return piece + 1 == tor->info.pieceCount ? tor->lastPieceSize : tor->info.pieceSize; } /* how many bytes are in this block? */ static inline uint32_t tr_torBlockCountBytes (const tr_torrent * tor, const tr_block_index_t block) { return block + 1 == tor->blockCount ? tor->lastBlockSize : tor->blockSize; } static inline void tr_torrentLock (const tr_torrent * tor) { tr_sessionLock (tor->session); } static inline bool tr_torrentIsLocked (const tr_torrent * tor) { return tr_sessionIsLocked (tor->session); } static inline void tr_torrentUnlock (const tr_torrent * tor) { tr_sessionUnlock (tor->session); } static inline bool tr_torrentExists (const tr_session * session, const uint8_t * torrentHash) { return tr_torrentFindFromHash ((tr_session*)session, torrentHash) != NULL; } static inline tr_completeness tr_torrentGetCompleteness (const tr_torrent * tor) { return tor->completeness; } static inline bool tr_torrentIsSeed (const tr_torrent * tor) { return tr_torrentGetCompleteness(tor) != TR_LEECH; } static inline bool tr_torrentIsPrivate (const tr_torrent * tor) { return (tor != NULL) && tor->info.isPrivate; } static inline bool tr_torrentAllowsPex (const tr_torrent * tor) { return (tor != NULL) && (tor->session->isPexEnabled) && (!tr_torrentIsPrivate (tor)); } static inline bool tr_torrentAllowsDHT (const tr_torrent * tor) { return (tor != NULL) && (tr_sessionAllowsDHT (tor->session)) && (!tr_torrentIsPrivate (tor)); } static inline bool tr_torrentAllowsLPD (const tr_torrent * tor) { return (tor != NULL) && (tr_sessionAllowsLPD (tor->session)) && (!tr_torrentIsPrivate (tor)); } /*** **** ***/ enum { TORRENT_MAGIC_NUMBER = 95549 }; static inline bool tr_isTorrent (const tr_torrent * tor) { return (tor != NULL) && (tor->magicNumber == TORRENT_MAGIC_NUMBER) && (tr_isSession (tor->session)); } /* set a flag indicating that the torrent's .resume file * needs to be saved when the torrent is closed */ static inline void tr_torrentSetDirty (tr_torrent * tor) { assert (tr_isTorrent (tor)); tor->isDirty = true; } uint32_t tr_getBlockSize (uint32_t pieceSize); /** * Tell the tr_torrent that it's gotten a block */ void tr_torrentGotBlock (tr_torrent * tor, tr_block_index_t blockIndex); /** * @brief Like tr_torrentFindFile (), but splits the filename into base and subpath; * * If the file is found, "tr_buildPath (base, subpath, NULL)" * will generate the complete filename. * * @return true if the file is found, false otherwise. * * @param base if the torrent is found, this will be either * tor->downloadDir or tor->incompleteDir * @param subpath on success, this pointer is assigned a newly-allocated * string holding the second half of the filename. */ bool tr_torrentFindFile2 (const tr_torrent *, tr_file_index_t fileNo, const char ** base, char ** subpath, time_t * mtime); /* Returns a newly-allocated version of the tr_file.name string * that's been modified to denote that it's not a complete file yet. * In the current implementation this is done by appending ".part" * a la Firefox. */ char* tr_torrentBuildPartial (const tr_torrent *, tr_file_index_t fileNo); /* for when the info dict has been fundamentally changed wrt files, * piece size, etc. such as in BEP 9 where peers exchange metadata */ void tr_torrentGotNewInfoDict (tr_torrent * tor); void tr_torrentSetSpeedLimit_Bps (tr_torrent *, tr_direction, unsigned int Bps); unsigned int tr_torrentGetSpeedLimit_Bps (const tr_torrent *, tr_direction); /** * @return true if this piece needs to be tested */ bool tr_torrentPieceNeedsCheck (const tr_torrent * tor, tr_piece_index_t pieceIndex); /** * @brief Test a piece against its info dict checksum * @return true if the piece's passes the checksum test */ bool tr_torrentCheckPiece (tr_torrent * tor, tr_piece_index_t pieceIndex); time_t tr_torrentGetFileMTime (const tr_torrent * tor, tr_file_index_t i); uint64_t tr_torrentGetCurrentSizeOnDisk (const tr_torrent * tor); bool tr_torrentIsStalled (const tr_torrent * tor); const unsigned char * tr_torrentGetPeerId (tr_torrent * tor); static inline uint64_t tr_torrentGetLeftUntilDone (const tr_torrent * tor) { return tr_cpLeftUntilDone (&tor->completion); } static inline bool tr_torrentHasAll (const tr_torrent * tor) { return tr_cpHasAll (&tor->completion); } static inline bool tr_torrentHasNone (const tr_torrent * tor) { return tr_cpHasNone (&tor->completion); } static inline bool tr_torrentPieceIsComplete (const tr_torrent * tor, tr_piece_index_t i) { return tr_cpPieceIsComplete (&tor->completion, i); } static inline bool tr_torrentBlockIsComplete (const tr_torrent * tor, tr_block_index_t i) { return tr_cpBlockIsComplete (&tor->completion, i); } static inline size_t tr_torrentMissingBlocksInPiece (const tr_torrent * tor, tr_piece_index_t i) { return tr_cpMissingBlocksInPiece (&tor->completion, i); } static inline size_t tr_torrentMissingBytesInPiece (const tr_torrent * tor, tr_piece_index_t i) { return tr_cpMissingBytesInPiece (&tor->completion, i); } static inline void * tr_torrentCreatePieceBitfield (const tr_torrent * tor, size_t * byte_count) { return tr_cpCreatePieceBitfield (&tor->completion, byte_count); } static inline uint64_t tr_torrentHaveTotal (const tr_torrent * tor) { return tr_cpHaveTotal (&tor->completion); } static inline bool tr_torrentIsQueued (const tr_torrent * tor) { return tor->isQueued; } static inline tr_direction tr_torrentGetQueueDirection (const tr_torrent * tor) { return tr_torrentIsSeed (tor) ? TR_UP : TR_DOWN; } #endif transmission-2.92/libtransmission/PaxHeaders.4960/quark.c0000644000000000000000000000013212644245522020373 xustar0030 mtime=1452362578.738698801 30 atime=1452362578.737698784 30 ctime=1457295920.108809754 transmission-2.92/libtransmission/quark.c0000644000175000017500000003114212644245522022021 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: quark.c 14666 2016-01-07 19:20:14Z mikedld $ */ #include #include /* bsearch() */ #include /* memcmp() */ #include "transmission.h" #include "ptrarray.h" #include "quark.h" #include "utils.h" /* tr_memdup(), tr_strndup() */ struct tr_key_struct { const char * str; size_t len; }; static const struct tr_key_struct my_static[] = { { "", 0 }, { "activeTorrentCount", 18 }, { "activity-date", 13 }, { "activityDate", 12 }, { "added", 5 }, { "added-date", 10 }, { "added.f", 7 }, { "added6", 6 }, { "added6.f", 8 }, { "addedDate", 9 }, { "address", 7 }, { "alt-speed-down", 14 }, { "alt-speed-enabled", 17 }, { "alt-speed-time-begin", 20 }, { "alt-speed-time-day", 18 }, { "alt-speed-time-enabled", 22 }, { "alt-speed-time-end", 18 }, { "alt-speed-up", 12 }, { "announce", 8 }, { "announce-list", 13 }, { "announceState", 13 }, { "arguments", 9 }, { "bandwidth-priority", 18 }, { "bandwidthPriority", 17 }, { "bind-address-ipv4", 17 }, { "bind-address-ipv6", 17 }, { "bitfield", 8 }, { "blocklist-date", 14 }, { "blocklist-enabled", 17 }, { "blocklist-size", 14 }, { "blocklist-updates-enabled", 25 }, { "blocklist-url", 13 }, { "blocks", 6 }, { "bytesCompleted", 14 }, { "cache-size-mb", 13 }, { "clientIsChoked", 14 }, { "clientIsInterested", 18 }, { "clientName", 10 }, { "comment", 7 }, { "comment_utf_8", 13 }, { "compact-view", 12 }, { "complete", 8 }, { "config-dir", 10 }, { "cookies", 7 }, { "corrupt", 7 }, { "corruptEver", 11 }, { "created by", 10 }, { "created by.utf-8", 16 }, { "creation date", 13 }, { "creator", 7 }, { "cumulative-stats", 16 }, { "current-stats", 13 }, { "date", 4 }, { "dateCreated", 11 }, { "delete-local-data", 17 }, { "desiredAvailable", 16 }, { "destination", 11 }, { "dht-enabled", 11 }, { "display-name", 12 }, { "dnd", 3 }, { "done-date", 9 }, { "doneDate", 8 }, { "download-dir", 12 }, { "download-dir-free-space", 23 }, { "download-queue-enabled", 22 }, { "download-queue-size", 19 }, { "downloadCount", 13 }, { "downloadDir", 11 }, { "downloadLimit", 13 }, { "downloadLimited", 15 }, { "downloadSpeed", 13 }, { "downloaded", 10 }, { "downloaded-bytes", 16 }, { "downloadedBytes", 15 }, { "downloadedEver", 14 }, { "downloaders", 11 }, { "downloading-time-seconds", 24 }, { "dropped", 7 }, { "dropped6", 8 }, { "e", 1 }, { "encoding", 8 }, { "encryption", 10 }, { "error", 5 }, { "errorString", 11 }, { "eta", 3 }, { "etaIdle", 7 }, { "failure reason", 14 }, { "fields", 6 }, { "fileStats", 9 }, { "filename", 8 }, { "files", 5 }, { "files-added", 11 }, { "files-unwanted", 14 }, { "files-wanted", 12 }, { "filesAdded", 10 }, { "filter-mode", 11 }, { "filter-text", 11 }, { "filter-trackers", 15 }, { "flagStr", 7 }, { "flags", 5 }, { "fromCache", 9 }, { "fromDht", 7 }, { "fromIncoming", 12 }, { "fromLpd", 7 }, { "fromLtep", 8 }, { "fromPex", 7 }, { "fromTracker", 11 }, { "hasAnnounced", 12 }, { "hasScraped", 10 }, { "hashString", 10 }, { "have", 4 }, { "haveUnchecked", 13 }, { "haveValid", 9 }, { "honorsSessionLimits", 19 }, { "host", 4 }, { "id", 2 }, { "idle-limit", 10 }, { "idle-mode", 9 }, { "idle-seeding-limit", 18 }, { "idle-seeding-limit-enabled", 26 }, { "ids", 3 }, { "incomplete", 10 }, { "incomplete-dir", 14 }, { "incomplete-dir-enabled", 22 }, { "info", 4 }, { "info_hash", 9 }, { "inhibit-desktop-hibernation", 27 }, { "interval", 8 }, { "ip", 2 }, { "ipv4", 4 }, { "ipv6", 4 }, { "isBackup", 8 }, { "isDownloadingFrom", 17 }, { "isEncrypted", 11 }, { "isFinished", 10 }, { "isIncoming", 10 }, { "isPrivate", 9 }, { "isStalled", 9 }, { "isUTP", 5 }, { "isUploadingTo", 13 }, { "lastAnnouncePeerCount", 21 }, { "lastAnnounceResult", 18 }, { "lastAnnounceStartTime", 21 }, { "lastAnnounceSucceeded", 21 }, { "lastAnnounceTime", 16 }, { "lastAnnounceTimedOut", 20 }, { "lastScrapeResult", 16 }, { "lastScrapeStartTime", 19 }, { "lastScrapeSucceeded", 19 }, { "lastScrapeTime", 14 }, { "lastScrapeTimedOut", 18 }, { "leecherCount", 12 }, { "leftUntilDone", 13 }, { "length", 6 }, { "location", 8 }, { "lpd-enabled", 11 }, { "m", 1 }, { "magnet-info", 11 }, { "magnetLink", 10 }, { "main-window-height", 18 }, { "main-window-is-maximized", 24 }, { "main-window-layout-order", 24 }, { "main-window-width", 17 }, { "main-window-x", 13 }, { "main-window-y", 13 }, { "manualAnnounceTime", 18 }, { "max-peers", 9 }, { "maxConnectedPeers", 17 }, { "memory-bytes", 12 }, { "memory-units", 12 }, { "message-level", 13 }, { "metadataPercentComplete", 23 }, { "metadata_size", 13 }, { "metainfo", 8 }, { "method", 6 }, { "min interval", 12 }, { "min_request_interval", 20 }, { "move", 4 }, { "msg_type", 8 }, { "mtimes", 6 }, { "name", 4 }, { "name.utf-8", 10 }, { "nextAnnounceTime", 16 }, { "nextScrapeTime", 14 }, { "nodes", 5 }, { "nodes6", 6 }, { "open-dialog-dir", 15 }, { "p", 1 }, { "path", 4 }, { "path.utf-8", 10 }, { "paused", 6 }, { "pausedTorrentCount", 18 }, { "peer-congestion-algorithm", 25 }, { "peer-id-ttl-hours", 17 }, { "peer-limit", 10 }, { "peer-limit-global", 17 }, { "peer-limit-per-torrent", 22 }, { "peer-port", 9 }, { "peer-port-random-high", 21 }, { "peer-port-random-low", 20 }, { "peer-port-random-on-start", 25 }, { "peer-socket-tos", 15 }, { "peerIsChoked", 12 }, { "peerIsInterested", 16 }, { "peers", 5 }, { "peers2", 6 }, { "peers2-6", 8 }, { "peers6", 6 }, { "peersConnected", 14 }, { "peersFrom", 9 }, { "peersGettingFromUs", 18 }, { "peersSendingToUs", 16 }, { "percentDone", 11 }, { "pex-enabled", 11 }, { "piece", 5 }, { "piece length", 12 }, { "pieceCount", 10 }, { "pieceSize", 9 }, { "pieces", 6 }, { "play-download-complete-sound", 28 }, { "port", 4 }, { "port-forwarding-enabled", 23 }, { "port-is-open", 12 }, { "preallocation", 13 }, { "prefetch-enabled", 16 }, { "priorities", 10 }, { "priority", 8 }, { "priority-high", 13 }, { "priority-low", 12 }, { "priority-normal", 15 }, { "private", 7 }, { "progress", 8 }, { "prompt-before-exit", 18 }, { "queue-move-bottom", 17 }, { "queue-move-down", 15 }, { "queue-move-top", 14 }, { "queue-move-up", 13 }, { "queue-stalled-enabled", 21 }, { "queue-stalled-minutes", 21 }, { "queuePosition", 13 }, { "rateDownload", 12 }, { "rateToClient", 12 }, { "rateToPeer", 10 }, { "rateUpload", 10 }, { "ratio-limit", 11 }, { "ratio-limit-enabled", 19 }, { "ratio-mode", 10 }, { "recent-download-dir-1", 21 }, { "recent-download-dir-2", 21 }, { "recent-download-dir-3", 21 }, { "recent-download-dir-4", 21 }, { "recheckProgress", 15 }, { "remote-session-enabled", 22 }, { "remote-session-host", 19 }, { "remote-session-password", 23 }, { "remote-session-port", 19 }, { "remote-session-requres-authentication", 37 }, { "remote-session-username", 23 }, { "removed", 7 }, { "rename-partial-files", 20 }, { "reqq", 4 }, { "result", 6 }, { "rpc-authentication-required", 27 }, { "rpc-bind-address", 16 }, { "rpc-enabled", 11 }, { "rpc-password", 12 }, { "rpc-port", 8 }, { "rpc-url", 7 }, { "rpc-username", 12 }, { "rpc-version", 11 }, { "rpc-version-minimum", 19 }, { "rpc-whitelist", 13 }, { "rpc-whitelist-enabled", 21 }, { "scrape", 6 }, { "scrape-paused-torrents-enabled", 30 }, { "scrapeState", 11 }, { "script-torrent-done-enabled", 27 }, { "script-torrent-done-filename", 28 }, { "seconds-active", 14 }, { "secondsActive", 13 }, { "secondsDownloading", 18 }, { "secondsSeeding", 14 }, { "seed-queue-enabled", 18 }, { "seed-queue-size", 15 }, { "seedIdleLimit", 13 }, { "seedIdleMode", 12 }, { "seedRatioLimit", 14 }, { "seedRatioLimited", 16 }, { "seedRatioMode", 13 }, { "seederCount", 11 }, { "seeding-time-seconds", 20 }, { "session-count", 13 }, { "sessionCount", 12 }, { "show-backup-trackers", 20 }, { "show-extra-peer-details", 23 }, { "show-filterbar", 14 }, { "show-notification-area-icon", 27 }, { "show-options-window", 19 }, { "show-statusbar", 14 }, { "show-toolbar", 12 }, { "show-tracker-scrapes", 20 }, { "size-bytes", 10 }, { "size-units", 10 }, { "sizeWhenDone", 12 }, { "sort-mode", 9 }, { "sort-reversed", 13 }, { "speed", 5 }, { "speed-Bps", 9 }, { "speed-bytes", 11 }, { "speed-limit-down", 16 }, { "speed-limit-down-enabled", 24 }, { "speed-limit-up", 14 }, { "speed-limit-up-enabled", 22 }, { "speed-units", 11 }, { "start-added-torrents", 20 }, { "start-minimized", 15 }, { "startDate", 9 }, { "status", 6 }, { "statusbar-stats", 15 }, { "tag", 3 }, { "tier", 4 }, { "time-checked", 12 }, { "torrent-added", 13 }, { "torrent-added-notification-command", 34 }, { "torrent-added-notification-enabled", 34 }, { "torrent-complete-notification-command", 37 }, { "torrent-complete-notification-enabled", 37 }, { "torrent-complete-sound-command", 30 }, { "torrent-complete-sound-enabled", 30 }, { "torrent-duplicate", 17 }, { "torrent-get", 11 }, { "torrent-set", 11 }, { "torrent-set-location", 20 }, { "torrentCount", 12 }, { "torrentFile", 11 }, { "torrents", 8 }, { "totalSize", 9 }, { "total_size", 10 }, { "tracker id", 10 }, { "trackerAdd", 10 }, { "trackerRemove", 13 }, { "trackerReplace", 14 }, { "trackerStats", 12 }, { "trackers", 8 }, { "trash-can-enabled", 17 }, { "trash-original-torrent-files", 28 }, { "umask", 5 }, { "units", 5 }, { "upload-slots-per-torrent", 24 }, { "uploadLimit", 11 }, { "uploadLimited", 13 }, { "uploadRatio", 11 }, { "uploadSpeed", 11 }, { "upload_only", 11 }, { "uploaded", 8 }, { "uploaded-bytes", 14 }, { "uploadedBytes", 13 }, { "uploadedEver", 12 }, { "url-list", 8 }, { "use-global-speed-limit", 22 }, { "use-speed-limit", 15 }, { "user-has-given-informed-consent", 31 }, { "ut_comment", 10 }, { "ut_holepunch", 12 }, { "ut_metadata", 11 }, { "ut_pex", 6 }, { "ut_recommend", 12 }, { "utp-enabled", 11 }, { "v", 1 }, { "version", 7 }, { "wanted", 6 }, { "warning message", 15 }, { "watch-dir", 9 }, { "watch-dir-enabled", 17 }, { "webseeds", 8 }, { "webseedsSendingToUs", 19 } }; static int compareKeys (const void * va, const void * vb) { int ret; const struct tr_key_struct * a = va; const struct tr_key_struct * b = vb; ret = memcmp (a->str, b->str, MIN (a->len, b->len)); if (!ret && (a->len != b->len)) ret = a->len < b->len ? -1 : 1; return ret; } static tr_ptrArray my_runtime = TR_PTR_ARRAY_INIT_STATIC; bool tr_quark_lookup (const void * str, size_t len, tr_quark * setme) { struct tr_key_struct tmp; struct tr_key_struct * match; static const size_t n_static = sizeof(my_static) / sizeof(struct tr_key_struct); bool success = false; assert (n_static == TR_N_KEYS); tmp.str = str; tmp.len = len; /* is it in our static array? */ match = bsearch (&tmp, my_static, n_static, sizeof(struct tr_key_struct), compareKeys); if (match != NULL) { *setme = match - my_static; success = true; } /* was it added during runtime? */ if (!success && !tr_ptrArrayEmpty(&my_runtime)) { size_t i; struct tr_key_struct ** runtime = (struct tr_key_struct **) tr_ptrArrayBase (&my_runtime); const size_t n_runtime = tr_ptrArraySize (&my_runtime); for (i=0; istr = tr_strndup (str, len); tmp->len = len; ret = TR_N_KEYS + tr_ptrArraySize (&my_runtime); tr_ptrArrayAppend (&my_runtime, tmp); return ret; } tr_quark tr_quark_new (const void * str, size_t len) { tr_quark ret = TR_KEY_NONE; if (str == NULL) len = 0; else if (len == TR_BAD_SIZE) len = strlen (str); if (!tr_quark_lookup (str, len, &ret)) ret = append_new_quark (str, len); return ret; } const char * tr_quark_get_string (tr_quark q, size_t * len) { const struct tr_key_struct * tmp; if (q < TR_N_KEYS) tmp = &my_static[q]; else tmp = tr_ptrArrayNth (&my_runtime, q-TR_N_KEYS); if (len != NULL) *len = tmp->len; return tmp->str; } transmission-2.92/libtransmission/PaxHeaders.4960/error.c0000644000000000000000000000013212505250244020372 xustar0030 mtime=1427460260.465243923 30 atime=1427460260.465243923 30 ctime=1457295919.993807799 transmission-2.92/libtransmission/error.c0000644000175000017500000000727312505250244022030 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: error.c 14369 2014-12-10 18:58:12Z mikedld $ */ #include #include "transmission.h" #include "error.h" #include "utils.h" tr_error * tr_error_new (int code, const char * message_format, ...) { tr_error * error; va_list args; assert (message_format != NULL); va_start (args, message_format); error = tr_error_new_valist (code, message_format, args); va_end (args); return error; } tr_error * tr_error_new_literal (int code, const char * message) { tr_error * error; assert (message != NULL); error = tr_new (tr_error, 1); error->code = code; error->message = tr_strdup (message); return error; } tr_error * tr_error_new_valist (int code, const char * message_format, va_list args) { tr_error * error; assert (message_format != NULL); error = tr_new (tr_error, 1); error->code = code; error->message = tr_strdup_vprintf (message_format, args); return error; } void tr_error_free (tr_error * error) { if (error == NULL) return; tr_free (error->message); tr_free (error); } void tr_error_set (tr_error ** error, int code, const char * message_format, ...) { va_list args; if (error == NULL) return; assert (*error == NULL); assert (message_format != NULL); va_start (args, message_format); *error = tr_error_new_valist (code, message_format, args); va_end (args); } void tr_error_set_literal (tr_error ** error, int code, const char * message) { if (error == NULL) return; assert (*error == NULL); assert (message != NULL); *error = tr_error_new_literal (code, message); } void tr_error_propagate (tr_error ** new_error, tr_error ** old_error) { assert (old_error != NULL); assert (*old_error != NULL); if (new_error != NULL) { assert (*new_error == NULL); *new_error = *old_error; *old_error = NULL; } else { tr_error_clear (old_error); } } void tr_error_clear (tr_error ** error) { if (error == NULL) return; tr_error_free (*error); *error = NULL; } static void error_prefix_valist (tr_error ** error, const char * prefix_format, va_list args) { char * prefix; char * new_message; assert (error != NULL); assert (*error != NULL); assert (prefix_format != NULL); prefix = tr_strdup_vprintf (prefix_format, args); new_message = tr_strdup_printf ("%s%s", prefix, (*error)->message); tr_free ((*error)->message); (*error)->message = new_message; tr_free (prefix); } void tr_error_prefix (tr_error ** error, const char * prefix_format, ...) { va_list args; assert (prefix_format != NULL); if (error == NULL || *error == NULL) return; va_start (args, prefix_format); error_prefix_valist (error, prefix_format, args); va_end (args); } void tr_error_propagate_prefixed (tr_error ** new_error, tr_error ** old_error, const char * prefix_format, ...) { va_list args; assert (prefix_format != NULL); tr_error_propagate (new_error, old_error); if (new_error == NULL) return; va_start (args, prefix_format); error_prefix_valist (new_error, prefix_format, args); va_end (args); } transmission-2.92/libtransmission/PaxHeaders.4960/history.c0000644000000000000000000000013112442116602020740 xustar0030 mtime=1418239362.939222717 30 atime=1418239362.939222717 29 ctime=1457295920.01680819 transmission-2.92/libtransmission/history.c0000644000175000017500000000220012442116602022360 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: history.c 14241 2014-01-21 03:10:30Z jordan $ */ #include #include /* memset () */ #include "transmission.h" #include "history.h" #include "utils.h" void tr_historyAdd (tr_recentHistory * h, time_t now, unsigned int n) { if (h->slices[h->newest].date == now) { h->slices[h->newest].n += n; } else { if (++h->newest == TR_RECENT_HISTORY_PERIOD_SEC) h->newest = 0; h->slices[h->newest].date = now; h->slices[h->newest].n = n; } } unsigned int tr_historyGet (const tr_recentHistory * h, time_t now, unsigned int sec) { unsigned int n = 0; const time_t cutoff = (now?now:tr_time ()) - sec; int i = h->newest; for (;;) { if (h->slices[i].date <= cutoff) break; n += h->slices[i].n; if (--i == -1) i = TR_RECENT_HISTORY_PERIOD_SEC - 1; /* circular history */ if (i == h->newest) break; /* we've come all the way around */ } return n; } transmission-2.92/libtransmission/PaxHeaders.4960/version.h0000644000000000000000000000013212667110731020740 xustar0030 mtime=1457295833.272333308 30 atime=1457295833.271333291 30 ctime=1457295919.880805877 transmission-2.92/libtransmission/version.h0000644000175000017500000000062612667110731022371 0ustar00mikedldmikedld00000000000000#define PEERID_PREFIX "-TR2920-" #define USERAGENT_PREFIX "2.92" #define SVN_REVISION "14714" #define SVN_REVISION_NUM 14714 #define SHORT_VERSION_STRING "2.92" #define LONG_VERSION_STRING "2.92 (14714)" #define VERSION_STRING_INFOPLIST 2.92 #define MAJOR_VERSION 2 #define MINOR_VERSION 92 #define TR_STABLE_RELEASE 1 transmission-2.92/libtransmission/PaxHeaders.4960/announcer.h0000644000000000000000000000013212442116602021235 xustar0030 mtime=1418239362.942222769 30 atime=1418239362.942222769 30 ctime=1457295919.548800231 transmission-2.92/libtransmission/announcer.h0000644000175000017500000000562612442116602022673 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: announcer.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef _TR_ANNOUNCER_H_ #define _TR_ANNOUNCER_H_ #include "transmission.h" struct tr_announcer; struct tr_torrent_tiers; /** * *** Tracker Publish / Subscribe * **/ typedef enum { TR_TRACKER_WARNING, TR_TRACKER_ERROR, TR_TRACKER_ERROR_CLEAR, TR_TRACKER_PEERS } TrackerEventType; struct tr_pex; /** @brief Notification object to tell listeners about announce or scrape occurences */ typedef struct { /* what type of event this is */ TrackerEventType messageType; /* for TR_TRACKER_WARNING and TR_TRACKER_ERROR */ const char * text; const char * tracker; /* for TR_TRACKER_PEERS */ const struct tr_pex * pex; size_t pexCount; /* [0...100] for probability a peer is a seed. calculated by the leecher/seeder ratio */ int8_t seedProbability; } tr_tracker_event; typedef void (*tr_tracker_callback) (tr_torrent * tor, const tr_tracker_event * event, void * client_data); /** *** Session ctor/dtor **/ void tr_announcerInit (tr_session *); void tr_announcerClose (tr_session *); /** *** For torrent customers **/ struct tr_torrent_tiers * tr_announcerAddTorrent (tr_torrent * torrent, tr_tracker_callback cb, void * cbdata); bool tr_announcerHasBacklog (const struct tr_announcer *); void tr_announcerResetTorrent (struct tr_announcer*, tr_torrent*); void tr_announcerRemoveTorrent (struct tr_announcer * , tr_torrent *); void tr_announcerChangeMyPort (tr_torrent *); bool tr_announcerCanManualAnnounce (const tr_torrent *); void tr_announcerManualAnnounce (tr_torrent *); void tr_announcerTorrentStarted (tr_torrent *); void tr_announcerTorrentStopped (tr_torrent *); void tr_announcerTorrentCompleted (tr_torrent *); enum { TR_ANN_UP, TR_ANN_DOWN, TR_ANN_CORRUPT }; void tr_announcerAddBytes (tr_torrent *, int up_down_or_corrupt, uint32_t byteCount); time_t tr_announcerNextManualAnnounce (const tr_torrent *); tr_tracker_stat * tr_announcerStats (const tr_torrent * torrent, int * setmeTrackerCount); void tr_announcerStatsFree (tr_tracker_stat * trackers, int trackerCount); /*** **** ***/ void tr_tracker_udp_upkeep (tr_session * session); void tr_tracker_udp_close (tr_session * session); bool tr_tracker_udp_is_idle (const tr_session * session); #endif /* _TR_ANNOUNCER_H_ */ transmission-2.92/libtransmission/PaxHeaders.4960/variant-test.c0000644000000000000000000000013212644245522021671 xustar0030 mtime=1452362578.741698854 30 atime=1452362578.741698854 30 ctime=1457295920.278812645 transmission-2.92/libtransmission/variant-test.c0000644000175000017500000003625312644245522023327 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: variant-test.c 14666 2016-01-07 19:20:14Z mikedld $ */ #include /* isspace () */ #include /* EILSEQ */ #include /* strlen (), strncmp () */ #include #define __LIBTRANSMISSION_VARIANT_MODULE__ #include "transmission.h" #include "utils.h" /* tr_free */ #include "variant.h" #include "variant-common.h" #include "libtransmission-test.h" #ifndef _WIN32 #define STACK_SMASH_DEPTH (1 * 1000 * 1000) #else #define STACK_SMASH_DEPTH ( 100 * 1000) #endif static int testInt (void) { uint8_t buf[128]; int64_t val; int err; const uint8_t * end; /* good int string */ tr_snprintf ((char*)buf, sizeof (buf), "i64e"); err = tr_bencParseInt (buf, buf + 4, &end, &val); check_int_eq (0, err); check_int_eq (64, val); check ((buf + 4) == end); /* missing 'e' */ end = NULL; val = 888; err = tr_bencParseInt (buf, buf + 3, &end, &val); check_int_eq (EILSEQ, err); check_int_eq (888, val); check (end == NULL); /* empty buffer */ err = tr_bencParseInt (buf, buf + 0, &end, &val); check_int_eq (EILSEQ, err); check_int_eq (888, val); check (end == NULL); /* bad number */ tr_snprintf ((char*)buf, sizeof (buf), "i6z4e"); err = tr_bencParseInt (buf, buf + 5, &end, &val); check_int_eq (EILSEQ, err); check_int_eq (888, val); check (end == NULL); /* negative number */ tr_snprintf ((char*)buf, sizeof (buf), "i-3e"); err = tr_bencParseInt (buf, buf + 4, &end, &val); check_int_eq (0, err); check_int_eq (-3, val); check ((buf + 4) == end); /* zero */ tr_snprintf ((char*)buf, sizeof (buf), "i0e"); err = tr_bencParseInt (buf, buf + 4, &end, &val); check_int_eq (0, err); check_int_eq (0, val); check ((buf + 3) == end); /* no leading zeroes allowed */ val = 0; end = NULL; tr_snprintf ((char*)buf, sizeof (buf), "i04e"); err = tr_bencParseInt (buf, buf + 4, &end, &val); check_int_eq (EILSEQ, err); check_int_eq (0, val); check (NULL == end); return 0; } static int testStr (void) { uint8_t buf[128]; int err; int n; const uint8_t * end; const uint8_t * str; size_t len; /* string len is designed to overflow */ n = tr_snprintf ((char*)buf, sizeof (buf), "%zu:boat", (size_t)(SIZE_MAX-2)); err = tr_bencParseStr (buf, buf+n, &end, &str, &len); check_int_eq (EILSEQ, err); check_int_eq (0, len); check (str == NULL); check (end == NULL); check (!len); /* good string */ n = tr_snprintf ((char*)buf, sizeof (buf), "4:boat"); err = tr_bencParseStr (buf, buf+n, &end, &str, &len); check_int_eq (0, err); check_int_eq (4, len); check (!strncmp ((const char*)str, "boat", len)); check (end == buf + 6); str = NULL; end = NULL; len = 0; /* string goes past end of buffer */ err = tr_bencParseStr (buf, buf+(n-1), &end, &str, &len); check_int_eq (EILSEQ, err); check_int_eq (0, len); check (str == NULL); check (end == NULL); check (!len); /* empty string */ n = tr_snprintf ((char*)buf, sizeof (buf), "0:"); err = tr_bencParseStr (buf, buf+n, &end, &str, &len); check_int_eq (0, err); check_int_eq (0, len); check (!*str); check (end == buf + 2); str = NULL; end = NULL; len = 0; /* short string */ n = tr_snprintf ((char*)buf, sizeof (buf), "3:boat"); err = tr_bencParseStr (buf, buf+n, &end, &str, &len); check_int_eq (0, err); check_int_eq (3, len); check (!strncmp ((const char*)str, "boa", len)); check (end == buf + 5); str = NULL; end = NULL; len = 0; return 0; } static int testString (const char * str, bool isGood) { tr_variant val; const char * end = NULL; char * saved; const size_t len = strlen (str); size_t savedLen; int err; err = tr_variantFromBencFull (&val, str, len, NULL, &end); if (!isGood) { check (err); } else { check (!err); #if 0 fprintf (stderr, "in: [%s]\n", str); fprintf (stderr, "out:\n%s", tr_variantToStr (&val, TR_VARIANT_FMT_JSON, NULL)); #endif check (end == str + len); saved = tr_variantToStr (&val, TR_VARIANT_FMT_BENC, &savedLen); check_streq (str, saved); check_int_eq (savedLen, len); tr_free (saved); tr_variantFree (&val); } return 0; } static int testParse (void) { tr_variant val; tr_variant * child; tr_variant * child2; char buf[512]; const char * end; int err; size_t len; int64_t i; char * saved; tr_snprintf ((char*)buf, sizeof (buf), "i64e"); err = tr_variantFromBencFull (&val, buf, sizeof(buf), NULL, &end); check (!err); check (tr_variantGetInt (&val, &i)); check_int_eq (64, i); check (end == buf + 4); tr_variantFree (&val); tr_snprintf ((char*)buf, sizeof (buf), "li64ei32ei16ee"); err = tr_variantFromBencFull (&val, buf, sizeof(buf), NULL, &end); check (!err); check (end == buf + strlen ((char*)buf)); check (val.val.l.count == 3); check (tr_variantGetInt (&val.val.l.vals[0], &i)); check_int_eq (64, i); check (tr_variantGetInt (&val.val.l.vals[1], &i)); check_int_eq (32, i); check (tr_variantGetInt (&val.val.l.vals[2], &i)); check_int_eq (16, i); saved = tr_variantToStr (&val, TR_VARIANT_FMT_BENC, &len); check_streq ((char*)buf, saved); tr_free (saved); tr_variantFree (&val); end = NULL; tr_snprintf ((char*)buf, sizeof (buf), "lllee"); err = tr_variantFromBencFull (&val, buf, sizeof(buf), NULL, &end); check (err); check (end == NULL); end = NULL; tr_snprintf ((char*)buf, sizeof (buf), "le"); err = tr_variantFromBencFull (&val, buf, sizeof(buf), NULL, &end); check (!err); check (end == buf + 2); saved = tr_variantToStr (&val, TR_VARIANT_FMT_BENC, &len); check_streq ("le", saved); tr_free (saved); tr_variantFree (&val); if ((err = testString ("llleee", true))) return err; if ((err = testString ("d3:cow3:moo4:spam4:eggse", true))) return err; if ((err = testString ("d4:spaml1:a1:bee", true))) return err; if ((err = testString ("d5:greenli1ei2ei3ee4:spamd1:ai123e3:keyi214eee", true))) return err; if ((err = testString ("d9:publisher3:bob17:publisher-webpage15:www.example.com18:publisher.location4:homee", true))) return err; if ((err = testString ("d8:completei1e8:intervali1800e12:min intervali1800e5:peers0:e", true))) return err; if ((err = testString ("d1:ai0e1:be", false))) /* odd number of children */ return err; if ((err = testString ("", false))) return err; if ((err = testString (" ", false))) return err; /* nested containers * parse an unsorted dict * save as a sorted dict */ end = NULL; tr_snprintf ((char*)buf, sizeof (buf), "lld1:bi32e1:ai64eeee"); err = tr_variantFromBencFull (&val, buf, sizeof(buf), NULL, &end); check (!err); check (end == buf + strlen ((const char*)buf)); check ((child = tr_variantListChild (&val, 0))); check ((child2 = tr_variantListChild (child, 0))); saved = tr_variantToStr (&val, TR_VARIANT_FMT_BENC, &len); check_streq ("lld1:ai64e1:bi32eeee", saved); tr_free (saved); tr_variantFree (&val); /* too many endings */ end = NULL; tr_snprintf ((char*)buf, sizeof (buf), "leee"); err = tr_variantFromBencFull (&val, buf, sizeof(buf), NULL, &end); check (!err); check (end == buf + 2); saved = tr_variantToStr (&val, TR_VARIANT_FMT_BENC, &len); check_streq ("le", saved); tr_free (saved); tr_variantFree (&val); /* no ending */ end = NULL; tr_snprintf ((char*)buf, sizeof (buf), "l1:a1:b1:c"); err = tr_variantFromBencFull (&val, buf, strlen(buf), NULL, &end); check (err); /* incomplete string */ end = NULL; tr_snprintf ((char*)buf, sizeof (buf), "1:"); err = tr_variantFromBencFull (&val, buf, strlen(buf), NULL, &end); check (err); return 0; } static void stripWhitespace (char * in) { char * out; for (out=in; in && *in; ++in) if (!isspace (*in)) *out++ = *in; *out = '\0'; } static int testJSONSnippet (const char * benc_str, const char * expected) { tr_variant top; char * serialized; struct evbuffer * buf; tr_variantFromBenc (&top, benc_str, strlen(benc_str)); buf = tr_variantToBuf (&top, TR_VARIANT_FMT_JSON); serialized = (char*) evbuffer_pullup (buf, -1); stripWhitespace (serialized); #if 0 fprintf (stderr, "benc: %s\n", benc_str); fprintf (stderr, "json: %s\n", serialized); fprintf (stderr, "want: %s\n", expected); #endif check_streq (expected, serialized); tr_variantFree (&top); evbuffer_free (buf); return 0; } static int testJSON (void) { int val; const char * benc_str; const char * expected; benc_str = "i6e"; expected = "6"; if ((val = testJSONSnippet (benc_str, expected))) return val; benc_str = "d5:helloi1e5:worldi2ee"; expected = "{\"hello\":1,\"world\":2}"; if ((val = testJSONSnippet (benc_str, expected))) return val; benc_str = "d5:helloi1e5:worldi2e3:fooli1ei2ei3eee"; expected = "{\"foo\":[1,2,3],\"hello\":1,\"world\":2}"; if ((val = testJSONSnippet (benc_str, expected))) return val; benc_str = "d5:helloi1e5:worldi2e3:fooli1ei2ei3ed1:ai0eeee"; expected = "{\"foo\":[1,2,3,{\"a\":0}],\"hello\":1,\"world\":2}"; if ((val = testJSONSnippet (benc_str, expected))) return val; benc_str = "d4:argsd6:statusle7:status2lee6:result7:successe"; expected = "{\"args\":{\"status\":[],\"status2\":[]},\"result\":\"success\"}"; if ((val = testJSONSnippet (benc_str, expected))) return val; return 0; } static int testMerge (void) { size_t len; tr_variant dest, src; int64_t i; const char * s; const tr_quark i1 = tr_quark_new ("i1", 2); const tr_quark i2 = tr_quark_new ("i2", 2); const tr_quark i3 = tr_quark_new ("i3", 2); const tr_quark i4 = tr_quark_new ("i4", 2); const tr_quark s5 = tr_quark_new ("s5", 2); const tr_quark s6 = tr_quark_new ("s6", 2); const tr_quark s7 = tr_quark_new ("s7", 2); const tr_quark s8 = tr_quark_new ("s8", 2); /* initial dictionary (default values) */ tr_variantInitDict (&dest, 10); tr_variantDictAddInt (&dest, i1, 1); tr_variantDictAddInt (&dest, i2, 2); tr_variantDictAddInt (&dest, i4, -35); /* remains untouched */ tr_variantDictAddStr (&dest, s5, "abc"); tr_variantDictAddStr (&dest, s6, "def"); tr_variantDictAddStr (&dest, s7, "127.0.0.1"); /* remains untouched */ /* new dictionary, will overwrite items in dest */ tr_variantInitDict (&src, 10); tr_variantDictAddInt (&src, i1, 1); /* same value */ tr_variantDictAddInt (&src, i2, 4); /* new value */ tr_variantDictAddInt (&src, i3, 3); /* new key:value */ tr_variantDictAddStr (&src, s5, "abc"); /* same value */ tr_variantDictAddStr (&src, s6, "xyz"); /* new value */ tr_variantDictAddStr (&src, s8, "ghi"); /* new key:value */ tr_variantMergeDicts (&dest, /*const*/ &src); check (tr_variantDictFindInt (&dest, i1, &i)); check_int_eq (1, i); check (tr_variantDictFindInt (&dest, i2, &i)); check_int_eq (4, i); check (tr_variantDictFindInt (&dest, i3, &i)); check_int_eq (3, i); check (tr_variantDictFindInt (&dest, i4, &i)); check_int_eq (-35, i); check (tr_variantDictFindStr (&dest, s5, &s, &len)); check_int_eq (3, len); check_streq ("abc", s); check (tr_variantDictFindStr (&dest, s6, &s, &len)); check_int_eq (3, len); check_streq ("xyz", s); check (tr_variantDictFindStr (&dest, s7, &s, &len)); check_int_eq (9, len); check_streq ("127.0.0.1", s); check (tr_variantDictFindStr (&dest, s8, &s, &len)); check_int_eq (3, len); check_streq ("ghi", s); tr_variantFree (&dest); tr_variantFree (&src); return 0; } static int testStackSmash (void) { int i; size_t len; int err; char * in; const char * end; tr_variant val; char * saved; const int depth = STACK_SMASH_DEPTH; in = tr_new (char, depth * 2 + 1); for (i = 0; i < depth; ++i) { in[i] = 'l'; in[depth + i] = 'e'; } in[depth * 2] = '\0'; err = tr_variantFromBencFull (&val, in, depth*2, NULL, &end); check_int_eq (0, err); check (end == in + (depth * 2)); saved = tr_variantToStr (&val, TR_VARIANT_FMT_BENC, &len); check_streq ((char*)in, saved); tr_free (in); tr_free (saved); tr_variantFree (&val); return 0; } static int testBool (void) { tr_variant top; int64_t intVal; bool boolVal; const tr_quark key1 = tr_quark_new ("key1", 4); const tr_quark key2 = tr_quark_new ("key2", 4); const tr_quark key3 = tr_quark_new ("key3", 4); const tr_quark key4 = tr_quark_new ("key4", 4); tr_variantInitDict (&top, 0); tr_variantDictAddBool (&top, key1, false); tr_variantDictAddBool (&top, key2, 0); tr_variantDictAddInt (&top, key3, true); tr_variantDictAddInt (&top, key4, 1); check (tr_variantDictFindBool (&top, key1, &boolVal)); check (!boolVal); check (tr_variantDictFindBool (&top, key2, &boolVal)); check (!boolVal); check (tr_variantDictFindBool (&top, key3, &boolVal)); check (boolVal); check (tr_variantDictFindBool (&top, key4, &boolVal)); check (boolVal); check (tr_variantDictFindInt (&top, key1, &intVal)); check (!intVal); check (tr_variantDictFindInt (&top, key2, &intVal)); check (!intVal); check (tr_variantDictFindInt (&top, key3, &intVal)); check (intVal); check (tr_variantDictFindInt (&top, key4, &intVal)); check (intVal); tr_variantFree (&top); return 0; } static int testParse2 (void) { tr_variant top; tr_variant top2; int64_t intVal; const char * strVal; double realVal; bool boolVal; size_t len; char * benc; const char * end; size_t strLen; const tr_quark key_bool = tr_quark_new ("this-is-a-bool", TR_BAD_SIZE); const tr_quark key_real = tr_quark_new ("this-is-a-real", TR_BAD_SIZE); const tr_quark key_int = tr_quark_new ("this-is-an-int", TR_BAD_SIZE); const tr_quark key_str = tr_quark_new ("this-is-a-string", TR_BAD_SIZE); tr_variantInitDict (&top, 0); tr_variantDictAddBool (&top, key_bool, true); tr_variantDictAddInt (&top, key_int, 1234); tr_variantDictAddReal (&top, key_real, 0.5); tr_variantDictAddStr (&top, key_str, "this-is-a-string"); benc = tr_variantToStr (&top, TR_VARIANT_FMT_BENC, &len); check_streq ("d14:this-is-a-booli1e14:this-is-a-real8:0.50000016:this-is-a-string16:this-is-a-string14:this-is-an-inti1234ee", benc); check (!tr_variantFromBencFull (&top2, benc, len, NULL, &end)); check (end == benc + len); check (tr_variantIsDict (&top2)); check (tr_variantDictFindInt (&top, key_int, &intVal)); check_int_eq (1234, intVal); check (tr_variantDictFindBool (&top, key_bool, &boolVal)); check (boolVal == true); check (tr_variantDictFindStr (&top, key_str, &strVal, &strLen)); check_int_eq (16, strLen); check_streq ("this-is-a-string", strVal); check (tr_variantDictFindReal (&top, key_real, &realVal)); check_int_eq (50, (int)(realVal*100)); tr_variantFree (&top2); tr_free (benc); tr_variantFree (&top); return 0; } int main (void) { static const testFunc tests[] = { testInt, testStr, testParse, testJSON, testMerge, testBool, testParse2, testStackSmash }; return runTests (tests, NUM_TESTS (tests)); } transmission-2.92/libtransmission/PaxHeaders.4960/web.h0000644000000000000000000000013212640354044020026 xustar0030 mtime=1451350052.458150527 30 atime=1451350052.458150527 30 ctime=1457295919.896806149 transmission-2.92/libtransmission/web.h0000644000175000017500000000511312640354044021453 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: web.h 14634 2015-12-25 11:34:35Z mikedld $ */ #ifndef TR_HTTP_H #define TR_HTTP_H #include #ifdef __cplusplus extern "C" { #endif struct tr_address; struct tr_web_task; typedef enum { TR_WEB_GET_CODE = CURLINFO_RESPONSE_CODE, TR_WEB_GET_REDIRECTS = CURLINFO_REDIRECT_COUNT, TR_WEB_GET_REAL_URL = CURLINFO_EFFECTIVE_URL } tr_web_task_info; typedef enum { TR_WEB_CLOSE_WHEN_IDLE, TR_WEB_CLOSE_NOW } tr_web_close_mode; void tr_webClose (tr_session * session, tr_web_close_mode close_mode); typedef void (*tr_web_done_func)(tr_session * session, bool did_connect_flag, bool timeout_flag, long response_code, const void * response, size_t response_byte_count, void * user_data); const char * tr_webGetResponseStr (long response_code); struct tr_web_task * tr_webRun (tr_session * session, const char * url, tr_web_done_func done_func, void * done_func_user_data); struct tr_web_task * tr_webRunWithCookies (tr_session * session, const char * url, const char * cookies, tr_web_done_func done_func, void * done_func_user_data); struct evbuffer; struct tr_web_task * tr_webRunWebseed (tr_torrent * tor, const char * url, const char * range, tr_web_done_func done_func, void * done_func_user_data, struct evbuffer * buffer); void tr_webGetTaskInfo (struct tr_web_task * task, tr_web_task_info info, void * dst); void tr_http_escape (struct evbuffer *out, const char *str, size_t len, bool escape_slashes); void tr_http_escape_sha1 (char * out, const uint8_t * sha1_digest); char* tr_http_unescape (const char * str, size_t len); #ifdef __cplusplus } #endif #endif transmission-2.92/libtransmission/PaxHeaders.4960/inout.c0000644000000000000000000000013212505250244020377 xustar0030 mtime=1427460260.452243691 30 atime=1427460260.452243691 30 ctime=1457295920.024808326 transmission-2.92/libtransmission/inout.c0000644000175000017500000002070512505250244022030 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: inout.c 14476 2015-03-15 11:43:32Z mikedld $ */ #include #include #include /* bsearch () */ #include /* memcmp () */ #include "transmission.h" #include "cache.h" /* tr_cacheReadBlock () */ #include "crypto-utils.h" #include "error.h" #include "fdlimit.h" #include "file.h" #include "inout.h" #include "log.h" #include "peer-common.h" /* MAX_BLOCK_SIZE */ #include "stats.h" /* tr_statsFileCreated () */ #include "torrent.h" #include "utils.h" /**** ***** Low-level IO functions ****/ enum { TR_IO_READ, TR_IO_PREFETCH, /* Any operations that require write access must follow TR_IO_WRITE. */ TR_IO_WRITE }; /* returns 0 on success, or an errno on failure */ static int readOrWriteBytes (tr_session * session, tr_torrent * tor, int ioMode, tr_file_index_t fileIndex, uint64_t fileOffset, void * buf, size_t buflen) { tr_sys_file_t fd; int err = 0; const bool doWrite = ioMode >= TR_IO_WRITE; const tr_info * const info = &tor->info; const tr_file * const file = &info->files[fileIndex]; assert (fileIndex < info->fileCount); assert (!file->length || (fileOffset < file->length)); assert (fileOffset + buflen <= file->length); if (!file->length) return 0; /*** **** Find the fd ***/ fd = tr_fdFileGetCached (session, tr_torrentId (tor), fileIndex, doWrite); if (fd == TR_BAD_SYS_FILE) { /* it's not cached, so open/create it now */ char * subpath; const char * base; /* see if the file exists... */ if (!tr_torrentFindFile2 (tor, fileIndex, &base, &subpath, NULL)) { /* we can't read a file that doesn't exist... */ if (!doWrite) err = ENOENT; /* figure out where the file should go, so we can create it */ base = tr_torrentGetCurrentDir (tor); subpath = tr_sessionIsIncompleteFileNamingEnabled (tor->session) ? tr_torrentBuildPartial (tor, fileIndex) : tr_strdup (file->name); } if (!err) { /* open (and maybe create) the file */ char * filename = tr_buildPath (base, subpath, NULL); const int prealloc = file->dnd || !doWrite ? TR_PREALLOCATE_NONE : tor->session->preallocationMode; if (((fd = tr_fdFileCheckout (session, tor->uniqueId, fileIndex, filename, doWrite, prealloc, file->length))) == TR_BAD_SYS_FILE) { err = errno; tr_logAddTorErr (tor, "tr_fdFileCheckout failed for \"%s\": %s", filename, tr_strerror (err)); } else if (doWrite) { /* make a note that we just created a file */ tr_statsFileCreated (tor->session); } tr_free (filename); } tr_free (subpath); } /*** **** Use the fd ***/ if (!err) { tr_error * error = NULL; if (ioMode == TR_IO_READ) { if (!tr_sys_file_read_at (fd, buf, buflen, fileOffset, NULL, &error)) { err = error->code; tr_logAddTorErr (tor, "read failed for \"%s\": %s", file->name, error->message); tr_error_free (error); } } else if (ioMode == TR_IO_WRITE) { if (!tr_sys_file_write_at (fd, buf, buflen, fileOffset, NULL, &error)) { err = error->code; tr_logAddTorErr (tor, "write failed for \"%s\": %s", file->name, error->message); tr_error_free (error); } } else if (ioMode == TR_IO_PREFETCH) { tr_sys_file_prefetch (fd, fileOffset, buflen, NULL); } else { abort (); } } return err; } static int compareOffsetToFile (const void * a, const void * b) { const uint64_t offset = * (const uint64_t*)a; const tr_file * file = b; if (offset < file->offset) return -1; if (offset >= file->offset + file->length) return 1; return 0; } void tr_ioFindFileLocation (const tr_torrent * tor, tr_piece_index_t pieceIndex, uint32_t pieceOffset, tr_file_index_t * fileIndex, uint64_t * fileOffset) { const uint64_t offset = tr_pieceOffset (tor, pieceIndex, pieceOffset, 0); const tr_file * file; assert (tr_isTorrent (tor)); assert (offset < tor->info.totalSize); file = bsearch (&offset, tor->info.files, tor->info.fileCount, sizeof (tr_file), compareOffsetToFile); assert (file != NULL); *fileIndex = file - tor->info.files; *fileOffset = offset - file->offset; assert (*fileIndex < tor->info.fileCount); assert (*fileOffset < file->length); assert (tor->info.files[*fileIndex].offset + *fileOffset == offset); } /* returns 0 on success, or an errno on failure */ static int readOrWritePiece (tr_torrent * tor, int ioMode, tr_piece_index_t pieceIndex, uint32_t pieceOffset, uint8_t * buf, size_t buflen) { int err = 0; tr_file_index_t fileIndex; uint64_t fileOffset; const tr_info * info = &tor->info; if (pieceIndex >= tor->info.pieceCount) return EINVAL; tr_ioFindFileLocation (tor, pieceIndex, pieceOffset, &fileIndex, &fileOffset); while (buflen && !err) { const tr_file * file = &info->files[fileIndex]; const uint64_t bytesThisPass = MIN (buflen, file->length - fileOffset); err = readOrWriteBytes (tor->session, tor, ioMode, fileIndex, fileOffset, buf, bytesThisPass); buf += bytesThisPass; buflen -= bytesThisPass; fileIndex++; fileOffset = 0; if ((err != 0) && (ioMode == TR_IO_WRITE) && (tor->error != TR_STAT_LOCAL_ERROR)) { char * path = tr_buildPath (tor->downloadDir, file->name, NULL); tr_torrentSetLocalError (tor, "%s (%s)", tr_strerror (err), path); tr_free (path); } } return err; } int tr_ioRead (tr_torrent * tor, tr_piece_index_t pieceIndex, uint32_t begin, uint32_t len, uint8_t * buf) { return readOrWritePiece (tor, TR_IO_READ, pieceIndex, begin, buf, len); } int tr_ioPrefetch (tr_torrent * tor, tr_piece_index_t pieceIndex, uint32_t begin, uint32_t len) { return readOrWritePiece (tor, TR_IO_PREFETCH, pieceIndex, begin, NULL, len); } int tr_ioWrite (tr_torrent * tor, tr_piece_index_t pieceIndex, uint32_t begin, uint32_t len, const uint8_t * buf) { return readOrWritePiece (tor, TR_IO_WRITE, pieceIndex, begin, (uint8_t*)buf, len); } /**** ***** ****/ static bool recalculateHash (tr_torrent * tor, tr_piece_index_t pieceIndex, uint8_t * setme) { size_t bytesLeft; uint32_t offset = 0; bool success = true; const size_t buflen = tor->blockSize; void * buffer = tr_valloc (buflen); tr_sha1_ctx_t sha; assert (tor != NULL); assert (pieceIndex < tor->info.pieceCount); assert (buffer != NULL); assert (buflen > 0); assert (setme != NULL); sha = tr_sha1_init (); bytesLeft = tr_torPieceCountBytes (tor, pieceIndex); tr_ioPrefetch (tor, pieceIndex, offset, bytesLeft); while (bytesLeft) { const size_t len = MIN (bytesLeft, buflen); success = !tr_cacheReadBlock (tor->session->cache, tor, pieceIndex, offset, len, buffer); if (!success) break; tr_sha1_update (sha, buffer, len); offset += len; bytesLeft -= len; } tr_sha1_final (sha, success ? setme : NULL); tr_free (buffer); return success; } bool tr_ioTestPiece (tr_torrent * tor, tr_piece_index_t piece) { uint8_t hash[SHA_DIGEST_LENGTH]; return recalculateHash (tor, piece, hash) && !memcmp (hash, tor->info.pieces[piece].hash, SHA_DIGEST_LENGTH); } transmission-2.92/libtransmission/PaxHeaders.4960/CMakeLists.txt0000644000000000000000000000013212662757243021654 xustar0030 mtime=1456201379.235861549 30 atime=1456201379.234861531 30 ctime=1457295917.344762752 transmission-2.92/libtransmission/CMakeLists.txt0000644000175000017500000001431712662757243023307 0ustar00mikedldmikedld00000000000000project(libtr) configure_file(version.h.in version.h) set(${PROJECT_NAME}_SOURCES announcer.c announcer-http.c announcer-udp.c bandwidth.c bitfield.c blocklist.c cache.c clients.c completion.c ConvertUTF.c crypto.c crypto-utils.c crypto-utils-cyassl.c crypto-utils-fallback.c crypto-utils-openssl.c crypto-utils-polarssl.c error.c fdlimit.c file.c file-posix.c file-win32.c handshake.c history.c inout.c list.c log.c magnet.c makemeta.c metainfo.c natpmp.c net.c peer-io.c peer-mgr.c peer-msgs.c platform.c platform-quota.c port-forwarding.c ptrarray.c quark.c resume.c rpcimpl.c rpc-server.c session.c stats.c torrent.c torrent-ctor.c torrent-magnet.c tr-dht.c trevent.c tr-getopt.c tr-lpd.c tr-udp.c tr-utp.c upnp.c utils.c variant-benc.c variant.c variant-json.c verify.c watchdir.c watchdir-generic.c watchdir-inotify.c watchdir-kqueue.c watchdir-win32.c web.c webseed.c wildmat.c ) set_source_files_properties(crypto-utils-fallback.c PROPERTIES HEADER_FILE_ONLY ON) foreach(CP cyassl openssl polarssl) if(NOT CP STREQUAL CRYPTO_PKG) set_source_files_properties(crypto-utils-${CP}.c PROPERTIES HEADER_FILE_ONLY ON) endif() endforeach() if(WITH_INOTIFY) add_definitions(-DWITH_INOTIFY) else() set_source_files_properties(watchdir-inotify.c PROPERTIES HEADER_FILE_ONLY ON) endif() if(WITH_KQUEUE) add_definitions(-DWITH_KQUEUE) else() set_source_files_properties(watchdir-kqueue.c PROPERTIES HEADER_FILE_ONLY ON) endif() if(WIN32) set_source_files_properties(file-posix.c PROPERTIES HEADER_FILE_ONLY ON) else() set_source_files_properties(file-win32.c watchdir-win32.c PROPERTIES HEADER_FILE_ONLY ON) endif() set(${PROJECT_NAME}_PUBLIC_HEADERS error.h error-types.h file.h log.h makemeta.h quark.h rpcimpl.h tr-getopt.h transmission.h utils.h variant.h watchdir.h web.h ${PROJECT_BINARY_DIR}/version.h ) set(${PROJECT_NAME}_PRIVATE_HEADERS announcer-common.h announcer.h bandwidth.h bitfield.h blocklist.h cache.h clients.h completion.h ConvertUTF.h crypto.h crypto-utils.h fdlimit.h handshake.h history.h inout.h list.h magnet.h metainfo.h natpmp_local.h net.h peer-common.h peer-io.h peer-mgr.h peer-msgs.h platform.h platform-quota.h port-forwarding.h ptrarray.h resume.h rpc-server.h session.h stats.h torrent.h torrent-magnet.h tr-dht.h trevent.h tr-lpd.h tr-udp.h tr-utp.h upnp.h variant-common.h verify.h version.h watchdir-common.h webseed.h ) if(NOT ENABLE_UTP) set_source_files_properties(tr-utp.c PROPERTIES HEADER_FILE_ONLY ON) endif() add_definitions( -D__TRANSMISSION__ "-DPACKAGE_DATA_DIR=\"${CMAKE_INSTALL_FULL_DATAROOTDIR}\"" ${NATPMP_DEFINITIONS} ${MINIUPNPC_DEFINITIONS} ) if(ENABLE_LIGHTWEIGHT) add_definitions(-DTR_LIGHTWEIGHT) endif() if(NOT ENABLE_NLS) add_definitions(-DDISABLE_GETTEXT) endif() if(ENABLE_UTP) add_definitions(-DWITH_UTP) endif() if(MINIUPNPC_VERSION VERSION_LESS 1.7) # API version macro was only added in 1.7 add_definitions(-DMINIUPNPC_API_VERSION=${MINIUPNPC_API_VERSION}) endif() if(USE_SYSTEM_B64) add_definitions(-DUSE_SYSTEM_B64) endif() include_directories( ${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR} ${ZLIB_INCLUDE_DIRS} ${CRYPTO_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} ${EVENT2_INCLUDE_DIRS} ${NATPMP_INCLUDE_DIRS} ${MINIUPNPC_INCLUDE_DIRS} ${DHT_INCLUDE_DIRS} ${UTP_INCLUDE_DIRS} ${B64_INCLUDE_DIRS} ) if(ICONV_FOUND) include_directories(${ICONV_INCLUDE_DIRS}) endif() if(ENABLE_UTP) include_directories(${TP_TOP}/libutp) endif() add_library(${TR_NAME} STATIC ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_PUBLIC_HEADERS} ${${PROJECT_NAME}_PRIVATE_HEADERS} ) foreach(UT ${EVENT2_UPSTREAM_TARGET} ${NATPMP_UPSTREAM_TARGET} ${MINIUPNPC_UPSTREAM_TARGET} ${DHT_UPSTREAM_TARGET} ${UTP_UPSTREAM_TARGET} ${B64_UPSTREAM_TARGET}) add_dependencies(${TR_NAME} ${UT}) endforeach() target_link_libraries(${TR_NAME} ${CMAKE_THREAD_LIBS_INIT} ${ZLIB_LIBRARIES} ${CRYPTO_LIBRARIES} ${CURL_LIBRARIES} ${EVENT2_LIBRARIES} ${NATPMP_LIBRARIES} ${MINIUPNPC_LIBRARIES} ${DHT_LIBRARIES} ${UTP_LIBRARIES} ${B64_LIBRARIES} ${LIBINTL_LIBRARY} ${LIBM_LIBRARY} ) if(ICONV_FOUND) target_link_libraries(${TR_NAME} ${ICONV_LIBRARIES}) endif() if(WIN32) target_link_libraries(${TR_NAME} iphlpapi ws2_32) endif() if(ENABLE_TESTS) add_library(${TR_NAME}-test STATIC libtransmission-test.c libtransmission-test.h ) target_link_libraries(${TR_NAME}-test ${TR_NAME}) set_property(TARGET ${TR_NAME}-test PROPERTY FOLDER "UnitTests") set(crypto-test_ADD_SOURCES crypto-test-ref.h) set(watchdir@generic-test_DEFINITIONS WATCHDIR_TEST_FORCE_GENERIC) foreach(T bitfield blocklist clients crypto error file history json magnet metainfo move peer-msgs quark rename rpc session tr-getopt utils variant watchdir watchdir@generic) set(TP ${TR_NAME}-test-${T}) if(T MATCHES "^([^@]+)@.+$") string(REPLACE "@" "_" TP "${TP}") set(${TP}_TEST_BASENAME "${CMAKE_MATCH_1}") else() set(${TP}_TEST_BASENAME "${T}") endif() add_executable(${TP} ${${TP}_TEST_BASENAME}-test.c ${${T}-test_ADD_SOURCES}) target_link_libraries(${TP} ${TR_NAME} ${TR_NAME}-test) if(DEFINED ${T}-test_DEFINITIONS) target_compile_definitions(${TP} PRIVATE ${${T}-test_DEFINITIONS}) endif() add_test(NAME ${T} COMMAND ${TP}) set_property(TARGET ${TP} PROPERTY FOLDER "UnitTests") endforeach() endif() if(INSTALL_LIB) install(TARGETS ${TR_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(FILES ${${PROJECT_NAME}_PUBLIC_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${TR_NAME}) endif() transmission-2.92/libtransmission/PaxHeaders.4960/rpc-server.h0000644000000000000000000000012612442116602021340 xustar0028 mtime=1418239362.9382227 28 atime=1418239362.9382227 30 ctime=1457295919.783804228 transmission-2.92/libtransmission/rpc-server.h0000644000175000017500000000426512442116602022771 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: rpc-server.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #include "variant.h" #ifndef TR_RPC_SERVER_H #define TR_RPC_SERVER_H typedef struct tr_rpc_server tr_rpc_server; tr_rpc_server * tr_rpcInit (tr_session * session, tr_variant * settings); void tr_rpcClose (tr_rpc_server ** freeme); void tr_rpcSetEnabled (tr_rpc_server * server, bool isEnabled); bool tr_rpcIsEnabled (const tr_rpc_server * server); void tr_rpcSetPort (tr_rpc_server * server, tr_port port); tr_port tr_rpcGetPort (const tr_rpc_server * server); void tr_rpcSetUrl (tr_rpc_server * server, const char * url); const char * tr_rpcGetUrl (const tr_rpc_server * server); int tr_rpcSetTest (const tr_rpc_server * server, const char * whitelist, char ** allocme_errmsg); void tr_rpcSetWhitelistEnabled (tr_rpc_server * server, bool isEnabled); bool tr_rpcGetWhitelistEnabled (const tr_rpc_server * server); void tr_rpcSetWhitelist (tr_rpc_server * server, const char * whitelist); const char* tr_rpcGetWhitelist (const tr_rpc_server * server); void tr_rpcSetPassword (tr_rpc_server * server, const char * password); const char* tr_rpcGetPassword (const tr_rpc_server * server); void tr_rpcSetUsername (tr_rpc_server * server, const char * username); const char* tr_rpcGetUsername (const tr_rpc_server * server); void tr_rpcSetPasswordEnabled (tr_rpc_server * server, bool isEnabled); bool tr_rpcIsPasswordEnabled (const tr_rpc_server * session); const char* tr_rpcGetBindAddress (const tr_rpc_server * server); #endif transmission-2.92/libtransmission/PaxHeaders.4960/rpcimpl.h0000644000000000000000000000013212640354044020717 xustar0030 mtime=1451350052.447150336 30 atime=1451350052.447150336 30 ctime=1457295919.782804211 transmission-2.92/libtransmission/rpcimpl.h0000644000175000017500000000266412640354044022354 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: rpcimpl.h 14633 2015-12-25 10:19:50Z mikedld $ */ #ifndef TR_RPC_H #define TR_RPC_H #ifdef __cplusplus extern "C" { #endif #include "transmission.h" #include "variant.h" /*** **** RPC processing ***/ typedef void (*tr_rpc_response_func)(tr_session * session, tr_variant * response, void * user_data); /* http://www.json.org/ */ void tr_rpc_request_exec_json (tr_session * session, const tr_variant * request, tr_rpc_response_func callback, void * callback_user_data); /* see the RPC spec's "Request URI Notation" section */ void tr_rpc_request_exec_uri (tr_session * session, const void * request_uri, size_t request_uri_len, tr_rpc_response_func callback, void * callback_user_data); void tr_rpc_parse_list_str (tr_variant * setme, const char * list_str, size_t list_str_len); #ifdef __cplusplus } #endif #endif /* TR_RPC_H */ transmission-2.92/libtransmission/PaxHeaders.4960/error-test.c0000644000000000000000000000013212662757235021367 xustar0030 mtime=1456201373.070756673 30 atime=1456201373.070756673 30 ctime=1457295920.264812407 transmission-2.92/libtransmission/error-test.c0000644000175000017500000000335712662757235023024 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: error-test.c 14657 2016-01-03 21:03:54Z mikedld $ */ #include "transmission.h" #include "error.h" #include "libtransmission-test.h" static int test_error_set (void) { tr_error * err = NULL; tr_error_prefix (&err, "error: "); check (err == NULL); tr_error_set (&err, 1, "error: %s (%d)", "oops", 2); check (err != NULL); check_int_eq (1, err->code); check_streq ("error: oops (2)", err->message); tr_error_clear (&err); check (err == NULL); tr_error_set_literal (&err, 2, "oops"); check (err != NULL); check_int_eq (2, err->code); check_streq ("oops", err->message); tr_error_prefix (&err, "error: "); check (err != NULL); check_int_eq (2, err->code); check_streq ("error: oops", err->message); tr_error_free (err); return 0; } static int test_error_propagate (void) { tr_error * err = NULL; tr_error * err2 = NULL; tr_error_set_literal (&err, 1, "oops"); check (err != NULL); check_int_eq (1, err->code); check_streq ("oops", err->message); tr_error_propagate (&err2, &err); check (err2 != NULL); check_int_eq (1, err2->code); check_streq ("oops", err2->message); check (err == NULL); tr_error_propagate_prefixed (&err, &err2, "error: "); check (err != NULL); check_int_eq (1, err->code); check_streq ("error: oops", err->message); check (err2 == NULL); tr_error_propagate (NULL, &err); check (err == NULL); tr_error_free (err2); return 0; } int main (void) { const testFunc tests[] = { test_error_set, test_error_propagate }; return runTests (tests, NUM_TESTS (tests)); } transmission-2.92/libtransmission/PaxHeaders.4960/stats.h0000644000000000000000000000013012442116602020401 xustar0029 mtime=1418239362.91022222 29 atime=1418239362.91022222 30 ctime=1457295919.795804432 transmission-2.92/libtransmission/stats.h0000644000175000017500000000120512442116602022026 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_STATS_H #define TR_STATS_H void tr_statsInit (tr_session * session); void tr_statsClose (tr_session * session); void tr_statsSaveDirty (tr_session * session); void tr_statsAddUploaded (tr_session * session, uint32_t bytes); void tr_statsAddDownloaded (tr_session * session, uint32_t bytes); void tr_statsFileCreated (tr_session * session); #endif transmission-2.92/libtransmission/PaxHeaders.4960/announcer.c0000644000000000000000000000013212641272401021231 xustar0030 mtime=1451586817.580878587 30 atime=1451586817.580878587 30 ctime=1457295919.923806608 transmission-2.92/libtransmission/announcer.c0000644000175000017500000015036612641272401022671 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: announcer.c 14644 2015-12-29 19:37:31Z mikedld $ */ #include #include /* INT_MAX */ #include #include /* qsort () */ #include /* strcmp (), memcpy () */ #include #include /* evtimer */ #define __LIBTRANSMISSION_ANNOUNCER_MODULE__ #include "transmission.h" #include "announcer.h" #include "announcer-common.h" #include "crypto-utils.h" /* tr_rand_int (), tr_rand_int_weak () */ #include "log.h" #include "peer-mgr.h" /* tr_peerMgrCompactToPex () */ #include "ptrarray.h" #include "session.h" #include "torrent.h" #include "utils.h" struct tr_tier; static void tier_build_log_name (const struct tr_tier * tier, char * buf, size_t buflen); #define dbgmsg(tier, ...) \ do \ { \ if (tr_logGetDeepEnabled ()) \ { \ char name[128]; \ tier_build_log_name (tier, name, sizeof (name)); \ tr_logAddDeep (__FILE__, __LINE__, name, __VA_ARGS__); \ } \ } \ while (0) enum { /* unless the tracker says otherwise, rescrape this frequently */ DEFAULT_SCRAPE_INTERVAL_SEC = (60 * 30), /* unless the tracker says otherwise, this is the announce interval */ DEFAULT_ANNOUNCE_INTERVAL_SEC = (60 * 10), /* unless the tracker says otherwise, this is the announce min_interval */ DEFAULT_ANNOUNCE_MIN_INTERVAL_SEC = (60 * 2), /* how many web tasks we allow at one time */ MAX_CONCURRENT_TASKS = 48, /* the value of the 'numwant' argument passed in tracker requests. */ NUMWANT = 80, UPKEEP_INTERVAL_SECS = 1, /* this is how often to call the UDP tracker upkeep */ TAU_UPKEEP_INTERVAL_SECS = 5 }; /*** **** ***/ const char* tr_announce_event_get_string (tr_announce_event e) { switch (e) { case TR_ANNOUNCE_EVENT_COMPLETED: return "completed"; case TR_ANNOUNCE_EVENT_STARTED: return "started"; case TR_ANNOUNCE_EVENT_STOPPED: return "stopped"; default: return ""; } } /*** **** ***/ static int compareTransfer (uint64_t a_uploaded, uint64_t a_downloaded, uint64_t b_uploaded, uint64_t b_downloaded) { /* higher upload count goes first */ if (a_uploaded != b_uploaded) return a_uploaded > b_uploaded ? -1 : 1; /* then higher download count goes first */ if (a_downloaded != b_downloaded) return a_downloaded > b_downloaded ? -1 : 1; return 0; } /** * Comparison function for tr_announce_requests. * * The primary key (amount of data transferred) is used to prioritize * tracker announcements of active torrents. The remaining keys are * used to satisfy the uniqueness requirement of a sorted tr_ptrArray. */ static int compareStops (const void * va, const void * vb) { int i; const tr_announce_request * a = va; const tr_announce_request * b = vb; /* primary key: volume of data transferred. */ if ((i = compareTransfer (a->up, a->down, b->up, b->down))) return i; /* secondary key: the torrent's info_hash */ if ((i = memcmp (a->info_hash, b->info_hash, SHA_DIGEST_LENGTH))) return i; /* tertiary key: the tracker's announec url */ return tr_strcmp0 (a->url, b->url); } /*** **** ***/ /** * "global" (per-tr_session) fields */ typedef struct tr_announcer { tr_ptrArray stops; /* tr_announce_request */ tr_session * session; struct event * upkeepTimer; int slotsAvailable; int key; time_t tauUpkeepAt; } tr_announcer; bool tr_announcerHasBacklog (const struct tr_announcer * announcer) { return announcer->slotsAvailable < 1; } static void onUpkeepTimer (evutil_socket_t foo UNUSED, short bar UNUSED, void * vannouncer); void tr_announcerInit (tr_session * session) { tr_announcer * a; assert (tr_isSession (session)); a = tr_new0 (tr_announcer, 1); a->stops = TR_PTR_ARRAY_INIT; a->key = tr_rand_int (INT_MAX); a->session = session; a->slotsAvailable = MAX_CONCURRENT_TASKS; a->upkeepTimer = evtimer_new (session->event_base, onUpkeepTimer, a); tr_timerAdd (a->upkeepTimer, UPKEEP_INTERVAL_SECS, 0); session->announcer = a; } static void flushCloseMessages (tr_announcer * announcer); void tr_announcerClose (tr_session * session) { tr_announcer * announcer = session->announcer; flushCloseMessages (announcer); tr_tracker_udp_start_shutdown (session); event_free (announcer->upkeepTimer); announcer->upkeepTimer = NULL; tr_ptrArrayDestruct (&announcer->stops, NULL); session->announcer = NULL; tr_free (announcer); } /*** **** ***/ /* a row in tr_tier's list of trackers */ typedef struct { char * key; char * announce; char * scrape; char * tracker_id_str; int seederCount; int leecherCount; int downloadCount; int downloaderCount; int consecutiveFailures; uint32_t id; } tr_tracker; /* format: host+':'+ port */ static char * getKey (const char * url) { char * ret; char * scheme = NULL; char * host = NULL; int port = 0; tr_urlParse (url, TR_BAD_SIZE, &scheme, &host, &port, NULL); ret = tr_strdup_printf ("%s://%s:%d", (scheme?scheme:"invalid"), (host?host:"invalid"), port); tr_free (host); tr_free (scheme); return ret; } static void trackerConstruct (tr_tracker * tracker, const tr_tracker_info * inf) { memset (tracker, 0, sizeof (tr_tracker)); tracker->key = getKey (inf->announce); tracker->announce = tr_strdup (inf->announce); tracker->scrape = tr_strdup (inf->scrape); tracker->id = inf->id; tracker->seederCount = -1; tracker->leecherCount = -1; tracker->downloadCount = -1; } static void trackerDestruct (tr_tracker * tracker) { tr_free (tracker->tracker_id_str); tr_free (tracker->scrape); tr_free (tracker->announce); tr_free (tracker->key); } /*** **** ***/ struct tr_torrent_tiers; /** @brief A group of trackers in a single tier, as per the multitracker spec */ typedef struct tr_tier { /* number of up/down/corrupt bytes since the last time we sent an * "event=stopped" message that was acknowledged by the tracker */ uint64_t byteCounts[3]; tr_tracker * trackers; int tracker_count; tr_tracker * currentTracker; int currentTrackerIndex; tr_torrent * tor; time_t scrapeAt; time_t lastScrapeStartTime; time_t lastScrapeTime; bool lastScrapeSucceeded; bool lastScrapeTimedOut; time_t announceAt; time_t manualAnnounceAllowedAt; time_t lastAnnounceStartTime; time_t lastAnnounceTime; bool lastAnnounceSucceeded; bool lastAnnounceTimedOut; tr_announce_event * announce_events; int announce_event_count; int announce_event_alloc; /* unique lookup key */ int key; int scrapeIntervalSec; int announceIntervalSec; int announceMinIntervalSec; int lastAnnouncePeerCount; bool isRunning; bool isAnnouncing; bool isScraping; bool wasCopied; char lastAnnounceStr[128]; char lastScrapeStr[128]; } tr_tier; static time_t get_next_scrape_time (const tr_session * session, const tr_tier * tier, int interval) { time_t ret; const time_t now = tr_time (); /* Maybe don't scrape paused torrents */ if (!tier->isRunning && !session->scrapePausedTorrents) ret = 0; /* Add the interval, and then increment to the nearest 10th second. * The latter step is to increase the odds of several torrents coming * due at the same time to improve multiscrape. */ else { ret = now + interval; while (ret % 10) ++ret; } return ret; } static void tierConstruct (tr_tier * tier, tr_torrent * tor) { static int nextKey = 1; memset (tier, 0, sizeof (tr_tier)); tier->key = nextKey++; tier->currentTrackerIndex = -1; tier->scrapeIntervalSec = DEFAULT_SCRAPE_INTERVAL_SEC; tier->announceIntervalSec = DEFAULT_ANNOUNCE_INTERVAL_SEC; tier->announceMinIntervalSec = DEFAULT_ANNOUNCE_MIN_INTERVAL_SEC; tier->scrapeAt = get_next_scrape_time (tor->session, tier, tr_rand_int_weak (180)); tier->tor = tor; } static void tierDestruct (tr_tier * tier) { tr_free (tier->announce_events); } static void tier_build_log_name (const tr_tier * tier, char * buf, size_t buflen) { tr_snprintf (buf, buflen, "[%s---%s]", (tier && tier->tor) ? tr_torrentName (tier->tor) : "?", (tier && tier->currentTracker) ? tier->currentTracker->key : "?"); } static void tierIncrementTracker (tr_tier * tier) { /* move our index to the next tracker in the tier */ const int i = (tier->currentTracker == NULL) ? 0 : (tier->currentTrackerIndex + 1) % tier->tracker_count; tier->currentTrackerIndex = i; tier->currentTracker = &tier->trackers[i]; /* reset some of the tier's fields */ tier->scrapeIntervalSec = DEFAULT_SCRAPE_INTERVAL_SEC; tier->announceIntervalSec = DEFAULT_ANNOUNCE_INTERVAL_SEC; tier->announceMinIntervalSec = DEFAULT_ANNOUNCE_MIN_INTERVAL_SEC; tier->isAnnouncing = false; tier->isScraping = false; tier->lastAnnounceStartTime = 0; tier->lastScrapeStartTime = 0; } /*** **** ***/ /** * @brief Opaque, per-torrent data structure for tracker announce information * * this opaque data structure can be found in tr_torrent.tiers */ typedef struct tr_torrent_tiers { tr_tier * tiers; int tier_count; tr_tracker * trackers; int tracker_count; tr_tracker_callback callback; void * callbackData; } tr_torrent_tiers; static tr_torrent_tiers* tiersNew (void) { return tr_new0 (tr_torrent_tiers, 1); } static void tiersDestruct (tr_torrent_tiers * tt) { int i; for (i=0; itracker_count; ++i) trackerDestruct (&tt->trackers[i]); tr_free (tt->trackers); for (i=0; itier_count; ++i) tierDestruct (&tt->tiers[i]); tr_free (tt->tiers); } static void tiersFree (tr_torrent_tiers * tt) { tiersDestruct (tt); tr_free (tt); } static tr_tier* getTier (tr_announcer * announcer, const uint8_t * info_hash, int tierId) { tr_tier * tier = NULL; if (announcer != NULL) { tr_session * session = announcer->session; tr_torrent * tor = tr_torrentFindFromHash (session, info_hash); if (tor && tor->tiers) { int i; tr_torrent_tiers * tt = tor->tiers; for (i=0; !tier && itier_count; ++i) if (tt->tiers[i].key == tierId) tier = &tt->tiers[i]; } } return tier; } /*** **** PUBLISH ***/ static const tr_tracker_event TRACKER_EVENT_INIT = { 0, 0, 0, 0, 0, 0 }; static void publishMessage (tr_tier * tier, const char * msg, int type) { if (tier && tier->tor && tier->tor->tiers && tier->tor->tiers->callback) { tr_torrent_tiers * tiers = tier->tor->tiers; tr_tracker_event event = TRACKER_EVENT_INIT; event.messageType = type; event.text = msg; if (tier->currentTracker) event.tracker = tier->currentTracker->announce; (*tiers->callback) (tier->tor, &event, tiers->callbackData); } } static void publishErrorClear (tr_tier * tier) { publishMessage (tier, NULL, TR_TRACKER_ERROR_CLEAR); } static void publishWarning (tr_tier * tier, const char * msg) { publishMessage (tier, msg, TR_TRACKER_WARNING); } static void publishError (tr_tier * tier, const char * msg) { publishMessage (tier, msg, TR_TRACKER_ERROR); } static int8_t getSeedProbability (tr_tier * tier, int seeds, int leechers, int pex_count) { /* special case optimization: ocelot omits seeds from peer lists sent to seeds on private trackers. so check for that case... */ if ((leechers == pex_count) && tr_torrentIsPrivate (tier->tor) && tr_torrentIsSeed (tier->tor) && (seeds + leechers < NUMWANT)) return 0; if (seeds>=0 && leechers>=0 && (seeds+leechers>0)) return (int8_t)((100.0*seeds)/ (seeds+leechers)); return -1; /* unknown */ } static void publishPeersPex (tr_tier * tier, int seeds, int leechers, const tr_pex * pex, int n) { if (tier->tor->tiers->callback) { tr_tracker_event e = TRACKER_EVENT_INIT; e.messageType = TR_TRACKER_PEERS; e.seedProbability = getSeedProbability (tier, seeds, leechers, n); e.pex = pex; e.pexCount = n; dbgmsg (tier, "got %d peers; seed prob %d", n, (int)e.seedProbability); (*tier->tor->tiers->callback) (tier->tor, &e, NULL); } } /*** **** ***/ struct ann_tracker_info { tr_tracker_info info; char * scheme; char * host; char * path; int port; }; /* primary key: tier * secondary key: udp comes before http */ static int filter_trackers_compare_func (const void * va, const void * vb) { const struct ann_tracker_info * a = va; const struct ann_tracker_info * b = vb; if (a->info.tier != b->info.tier) return a->info.tier - b->info.tier; return -strcmp (a->scheme, b->scheme); } /** * Massages the incoming list of trackers into something we can use. */ static tr_tracker_info * filter_trackers (tr_tracker_info * input, int input_count, int * setme_count) { int i, in; int j, jn; int n = 0; struct tr_tracker_info * ret; struct ann_tracker_info * tmp = tr_new0 (struct ann_tracker_info, input_count); /*for (i=0, in=input_count; iinfo.trackers, tor->info.trackerCount, &n); /* build the array of trackers */ tt->trackers = tr_new0 (tr_tracker, n); tt->tracker_count = n; for (i=0; itrackers[i], &infos[i]); /* count how many tiers there are */ tier_count = 0; for (i=0; itiers = tr_new0 (tr_tier, tier_count); tt->tier_count = 0; for (i=0; itracker_count; else { tier = &tt->tiers[tt->tier_count++]; tierConstruct (tier, tor); tier->trackers = &tt->trackers[i]; tier->tracker_count = 1; tierIncrementTracker (tier); } } /* cleanup */ tr_free (infos); } tr_torrent_tiers * tr_announcerAddTorrent (tr_torrent * tor, tr_tracker_callback callback, void * callbackData) { tr_torrent_tiers * tiers; assert (tr_isTorrent (tor)); tiers = tiersNew (); tiers->callback = callback; tiers->callbackData = callbackData; addTorrentToTier (tiers, tor); return tiers; } /*** **** ***/ static bool tierCanManualAnnounce (const tr_tier * tier) { return tier->manualAnnounceAllowedAt <= tr_time (); } bool tr_announcerCanManualAnnounce (const tr_torrent * tor) { int i; struct tr_torrent_tiers * tt = NULL; assert (tr_isTorrent (tor)); assert (tor->tiers != NULL); if (tor->isRunning) tt = tor->tiers; /* return true if any tier can manual announce */ for (i=0; tt && itier_count; ++i) if (tierCanManualAnnounce (&tt->tiers[i])) return true; return false; } time_t tr_announcerNextManualAnnounce (const tr_torrent * tor) { int i; time_t ret = ~ (time_t)0; struct tr_torrent_tiers * tt = tor->tiers; /* find the earliest manual announce time from all peers */ for (i=0; tt && itier_count; ++i) if (tt->tiers[i].isRunning) ret = MIN (ret, tt->tiers[i].manualAnnounceAllowedAt); return ret; } static void dbgmsg_tier_announce_queue (const tr_tier * tier) { if (tr_logGetDeepEnabled ()) { int i; char name[128]; char * message; struct evbuffer * buf = evbuffer_new (); tier_build_log_name (tier, name, sizeof (name)); for (i=0; iannounce_event_count; ++i) { const tr_announce_event e = tier->announce_events[i]; const char * str = tr_announce_event_get_string (e); evbuffer_add_printf (buf, "[%d:%s]", i, str); } message = evbuffer_free_to_str (buf, NULL); tr_logAddDeep (__FILE__, __LINE__, name, "announce queue is %s", message); tr_free (message); } } static void tier_announce_remove_trailing (tr_tier * tier, tr_announce_event e) { while ((tier->announce_event_count > 0) && (tier->announce_events[tier->announce_event_count-1] == e)) --tier->announce_event_count; } static void tier_announce_event_push (tr_tier * tier, tr_announce_event e, time_t announceAt) { int i; assert (tier != NULL); dbgmsg_tier_announce_queue (tier); dbgmsg (tier, "queued \"%s\"", tr_announce_event_get_string (e)); if (tier->announce_event_count > 0) { /* special case #1: if we're adding a "stopped" event, * dump everything leading up to it except "completed" */ if (e == TR_ANNOUNCE_EVENT_STOPPED) { bool has_completed = false; const tr_announce_event c = TR_ANNOUNCE_EVENT_COMPLETED; for (i=0; !has_completed && iannounce_event_count; ++i) has_completed = c == tier->announce_events[i]; tier->announce_event_count = 0; if (has_completed) tier->announce_events[tier->announce_event_count++] = c; } /* special case #2: dump all empty strings leading up to this event */ tier_announce_remove_trailing (tier, TR_ANNOUNCE_EVENT_NONE); /* special case #3: no consecutive duplicates */ tier_announce_remove_trailing (tier, e); } /* make room in the array for another event */ if (tier->announce_event_alloc <= tier->announce_event_count) { tier->announce_event_alloc += 4; tier->announce_events = tr_renew (tr_announce_event, tier->announce_events, tier->announce_event_alloc); } /* add it */ tier->announce_events[tier->announce_event_count++] = e; tier->announceAt = announceAt; dbgmsg_tier_announce_queue (tier); dbgmsg (tier, "announcing in %d seconds", (int)difftime (announceAt,tr_time ())); } static tr_announce_event tier_announce_event_pull (tr_tier * tier) { const tr_announce_event e = tier->announce_events[0]; tr_removeElementFromArray (tier->announce_events, 0, sizeof (tr_announce_event), tier->announce_event_count--); return e; } static void torrentAddAnnounce (tr_torrent * tor, tr_announce_event e, time_t announceAt) { int i; struct tr_torrent_tiers * tt = tor->tiers; /* walk through each tier and tell them to announce */ for (i=0; itier_count; ++i) tier_announce_event_push (&tt->tiers[i], e, announceAt); } void tr_announcerTorrentStarted (tr_torrent * tor) { torrentAddAnnounce (tor, TR_ANNOUNCE_EVENT_STARTED, tr_time ()); } void tr_announcerManualAnnounce (tr_torrent * tor) { torrentAddAnnounce (tor, TR_ANNOUNCE_EVENT_NONE, tr_time ()); } void tr_announcerTorrentStopped (tr_torrent * tor) { torrentAddAnnounce (tor, TR_ANNOUNCE_EVENT_STOPPED, tr_time ()); } void tr_announcerTorrentCompleted (tr_torrent * tor) { torrentAddAnnounce (tor, TR_ANNOUNCE_EVENT_COMPLETED, tr_time ()); } void tr_announcerChangeMyPort (tr_torrent * tor) { tr_announcerTorrentStarted (tor); } /*** **** ***/ void tr_announcerAddBytes (tr_torrent * tor, int type, uint32_t byteCount) { int i; struct tr_torrent_tiers * tt = tor->tiers; assert (tr_isTorrent (tor)); assert (type==TR_ANN_UP || type==TR_ANN_DOWN || type==TR_ANN_CORRUPT); for (i=0; itier_count; ++i) tt->tiers[i].byteCounts[ type ] += byteCount; } /*** **** ***/ static tr_announce_request * announce_request_new (const tr_announcer * announcer, tr_torrent * tor, const tr_tier * tier, tr_announce_event event) { tr_announce_request * req = tr_new0 (tr_announce_request, 1); req->port = tr_sessionGetPublicPeerPort (announcer->session); req->url = tr_strdup (tier->currentTracker->announce); req->tracker_id_str = tr_strdup (tier->currentTracker->tracker_id_str); memcpy (req->info_hash, tor->info.hash, SHA_DIGEST_LENGTH); memcpy (req->peer_id, tr_torrentGetPeerId(tor), PEER_ID_LEN); req->up = tier->byteCounts[TR_ANN_UP]; req->down = tier->byteCounts[TR_ANN_DOWN]; req->corrupt = tier->byteCounts[TR_ANN_CORRUPT]; req->leftUntilComplete = tr_torrentHasMetadata (tor) ? tor->info.totalSize - tr_torrentHaveTotal (tor) : ~ (uint64_t)0; req->event = event; req->numwant = event == TR_ANNOUNCE_EVENT_STOPPED ? 0 : NUMWANT; req->key = announcer->key; req->partial_seed = tr_torrentGetCompleteness (tor) == TR_PARTIAL_SEED; tier_build_log_name (tier, req->log_name, sizeof (req->log_name)); return req; } static void announce_request_free (tr_announce_request * req); void tr_announcerRemoveTorrent (tr_announcer * announcer, tr_torrent * tor) { struct tr_torrent_tiers * tt = tor->tiers; if (tt != NULL) { int i; for (i=0; itier_count; ++i) { tr_tier * tier = &tt->tiers[i]; if (tier->isRunning) { const tr_announce_event e = TR_ANNOUNCE_EVENT_STOPPED; tr_announce_request * req = announce_request_new (announcer, tor, tier, e); if (tr_ptrArrayFindSorted (&announcer->stops, req, compareStops) != NULL) announce_request_free (req); else tr_ptrArrayInsertSorted (&announcer->stops, req, compareStops); } } tiersFree (tor->tiers); tor->tiers = NULL; } } static int getRetryInterval (const tr_tracker * t) { switch (t->consecutiveFailures) { case 0: return 0; case 1: return 20; case 2: return tr_rand_int_weak (60) + (60 * 5); case 3: return tr_rand_int_weak (60) + (60 * 15); case 4: return tr_rand_int_weak (60) + (60 * 30); case 5: return tr_rand_int_weak (60) + (60 * 60); default: return tr_rand_int_weak (60) + (60 * 120); } } struct announce_data { int tierId; time_t timeSent; tr_announce_event event; tr_session * session; /** If the request succeeds, the value for tier's "isRunning" flag */ bool isRunningOnSuccess; }; static void on_announce_error (tr_tier * tier, const char * err, tr_announce_event e) { int interval; /* increment the error count */ if (tier->currentTracker != NULL) ++tier->currentTracker->consecutiveFailures; /* set the error message */ dbgmsg (tier, "%s", err); tr_logAddTorInfo (tier->tor, "%s", err); tr_strlcpy (tier->lastAnnounceStr, err, sizeof (tier->lastAnnounceStr)); /* switch to the next tracker */ tierIncrementTracker (tier); /* schedule a reannounce */ interval = getRetryInterval (tier->currentTracker); dbgmsg (tier, "Retrying announce in %d seconds.", interval); tr_logAddTorInfo (tier->tor, "Retrying announce in %d seconds.", interval); tier_announce_event_push (tier, e, tr_time () + interval); } static void on_announce_done (const tr_announce_response * response, void * vdata) { struct announce_data * data = vdata; tr_announcer * announcer = data->session->announcer; tr_tier * tier = getTier (announcer, response->info_hash, data->tierId); const time_t now = tr_time (); const tr_announce_event event = data->event; if (announcer) ++announcer->slotsAvailable; if (tier != NULL) { tr_tracker * tracker; dbgmsg (tier, "Got announce response: " "connected:%d " "timeout:%d " "seeders:%d " "leechers:%d " "downloads:%d " "interval:%d " "min_interval:%d " "tracker_id_str:%s " "pex:%zu " "pex6:%zu " "err:%s " "warn:%s", (int)response->did_connect, (int)response->did_timeout, response->seeders, response->leechers, response->downloads, response->interval, response->min_interval, response->tracker_id_str ? response->tracker_id_str : "none", response->pex_count, response->pex6_count, response->errmsg ? response->errmsg : "none", response->warning ? response->warning : "none"); tier->lastAnnounceTime = now; tier->lastAnnounceTimedOut = response->did_timeout; tier->lastAnnounceSucceeded = false; tier->isAnnouncing = false; tier->manualAnnounceAllowedAt = now + tier->announceMinIntervalSec; if (!response->did_connect) { on_announce_error (tier, _("Could not connect to tracker"), event); } else if (response->did_timeout) { on_announce_error (tier, _("Tracker did not respond"), event); } else if (response->errmsg) { /* If the torrent's only tracker returned an error, publish it. Don't bother publishing if there are other trackers -- it's all too common for people to load up dozens of dead trackers in a torrent's metainfo... */ if (tier->tor->info.trackerCount < 2) publishError (tier, response->errmsg); on_announce_error (tier, response->errmsg, event); } else { int i; const char * str; int scrape_fields = 0; int seeders = 0; int leechers = 0; int downloads = 0; const bool isStopped = event == TR_ANNOUNCE_EVENT_STOPPED; publishErrorClear (tier); if ((tracker = tier->currentTracker)) { tracker->consecutiveFailures = 0; if (response->seeders >= 0) { tracker->seederCount = seeders = response->seeders; ++scrape_fields; } if (response->leechers >= 0) { tracker->leecherCount = leechers = response->leechers; ++scrape_fields; } if (response->downloads >= 0) { tracker->downloadCount = downloads = response->downloads; ++scrape_fields; } if ((str = response->tracker_id_str)) { tr_free (tracker->tracker_id_str); tracker->tracker_id_str = tr_strdup (str); } } if ((str = response->warning)) { tr_strlcpy (tier->lastAnnounceStr, str, sizeof (tier->lastAnnounceStr)); dbgmsg (tier, "tracker gave \"%s\"", str); publishWarning (tier, str); } else { tr_strlcpy (tier->lastAnnounceStr, _("Success"), sizeof (tier->lastAnnounceStr)); } if ((i = response->min_interval)) tier->announceMinIntervalSec = i; if ((i = response->interval)) tier->announceIntervalSec = i; if (response->pex_count > 0) publishPeersPex (tier, seeders, leechers, response->pex, response->pex_count); if (response->pex6_count > 0) publishPeersPex (tier, seeders, leechers, response->pex6, response->pex6_count); tier->isRunning = data->isRunningOnSuccess; /* if the tracker included scrape fields in its announce response, then a separate scrape isn't needed */ if (scrape_fields >= 3 || (scrape_fields >= 1 && tracker->scrape != NULL)) { tr_logAddTorDbg (tier->tor, "Announce response contained scrape info; " "rescheduling next scrape to %d seconds from now.", tier->scrapeIntervalSec); tier->scrapeAt = get_next_scrape_time (announcer->session, tier, tier->scrapeIntervalSec); tier->lastScrapeTime = now; tier->lastScrapeSucceeded = true; } else if (tier->lastScrapeTime + tier->scrapeIntervalSec <= now) { tier->scrapeAt = get_next_scrape_time (announcer->session, tier, 0); } tier->lastAnnounceSucceeded = true; tier->lastAnnouncePeerCount = response->pex_count + response->pex6_count; if (isStopped) { /* now that we've successfully stopped the torrent, * we can reset the up/down/corrupt count we've kept * for this tracker */ tier->byteCounts[ TR_ANN_UP ] = 0; tier->byteCounts[ TR_ANN_DOWN ] = 0; tier->byteCounts[ TR_ANN_CORRUPT ] = 0; } if (!isStopped && !tier->announce_event_count) { /* the queue is empty, so enqueue a perodic update */ i = tier->announceIntervalSec; dbgmsg (tier, "Sending periodic reannounce in %d seconds", i); tier_announce_event_push (tier, TR_ANNOUNCE_EVENT_NONE, now + i); } } } tr_free (data); } static void announce_request_free (tr_announce_request * req) { tr_free (req->tracker_id_str); tr_free (req->url); tr_free (req); } static void announce_request_delegate (tr_announcer * announcer, tr_announce_request * request, tr_announce_response_func callback, void * callback_data) { tr_session * session = announcer->session; #if 0 fprintf (stderr, "ANNOUNCE: event %s isPartialSeed %d port %d key %d numwant %d" " up %"PRIu64" down %"PRIu64" corrupt %"PRIu64" left %"PRIu64 " url [%s] tracker_id_str [%s] peer_id [%20.20s]\n", tr_announce_event_get_string (request->event), (int)request->partial_seed, (int)request->port, request->key, request->numwant, request->up, request->down, request->corrupt, request->leftUntilComplete, request->url, request->tracker_id_str, request->peer_id); #endif if (!memcmp (request->url, "http", 4)) tr_tracker_http_announce (session, request, callback, callback_data); else if (!memcmp (request->url, "udp://", 6)) tr_tracker_udp_announce (session, request, callback, callback_data); else tr_logAddError ("Unsupported url: %s", request->url); announce_request_free (request); } static void tierAnnounce (tr_announcer * announcer, tr_tier * tier) { tr_announce_event announce_event; tr_announce_request * req; struct announce_data * data; tr_torrent * tor = tier->tor; const time_t now = tr_time (); assert (!tier->isAnnouncing); assert (tier->announce_event_count > 0); announce_event = tier_announce_event_pull (tier); req = announce_request_new (announcer, tor, tier, announce_event); data = tr_new0 (struct announce_data, 1); data->session = announcer->session; data->tierId = tier->key; data->isRunningOnSuccess = tor->isRunning; data->timeSent = now; data->event = announce_event; tier->isAnnouncing = true; tier->lastAnnounceStartTime = now; --announcer->slotsAvailable; announce_request_delegate (announcer, req, on_announce_done, data); } /*** **** **** SCRAPE **** ***/ static void on_scrape_error (tr_session * session, tr_tier * tier, const char * errmsg) { int interval; /* increment the error count */ if (tier->currentTracker != NULL) ++tier->currentTracker->consecutiveFailures; /* set the error message */ dbgmsg (tier, "Scrape error: %s", errmsg); tr_logAddTorInfo (tier->tor, "Scrape error: %s", errmsg); tr_strlcpy (tier->lastScrapeStr, errmsg, sizeof (tier->lastScrapeStr)); /* switch to the next tracker */ tierIncrementTracker (tier); /* schedule a rescrape */ interval = getRetryInterval (tier->currentTracker); dbgmsg (tier, "Retrying scrape in %zu seconds.", (size_t)interval); tr_logAddTorInfo (tier->tor, "Retrying scrape in %zu seconds.", (size_t)interval); tier->lastScrapeSucceeded = false; tier->scrapeAt = get_next_scrape_time (session, tier, interval); } static tr_tier * find_tier (tr_torrent * tor, const char * scrape) { int i; struct tr_torrent_tiers * tt = tor->tiers; for (i=0; tt && itier_count; ++i) { const tr_tracker * const tracker = tt->tiers[i].currentTracker; if (tracker && !tr_strcmp0 (scrape, tracker->scrape)) return &tt->tiers[i]; } return NULL; } static void on_scrape_done (const tr_scrape_response * response, void * vsession) { int i; const time_t now = tr_time (); tr_session * session = vsession; tr_announcer * announcer = session->announcer; for (i=0; irow_count; ++i) { const struct tr_scrape_response_row * row = &response->rows[i]; tr_torrent * tor = tr_torrentFindFromHash (session, row->info_hash); if (tor != NULL) { tr_tier * tier = find_tier (tor, response->url); if (tier != NULL) { dbgmsg (tier, "scraped url:%s -- " "did_connect:%d " "did_timeout:%d " "seeders:%d " "leechers:%d " "downloads:%d " "downloaders:%d " "min_request_interval:%d " "err:%s ", response->url, (int)response->did_connect, (int)response->did_timeout, row->seeders, row->leechers, row->downloads, row->downloaders, response->min_request_interval, response->errmsg ? response->errmsg : "none"); tier->isScraping = false; tier->lastScrapeTime = now; tier->lastScrapeSucceeded = false; tier->lastScrapeTimedOut = response->did_timeout; if (!response->did_connect) { on_scrape_error (session, tier, _("Could not connect to tracker")); } else if (response->did_timeout) { on_scrape_error (session, tier, _("Tracker did not respond")); } else if (response->errmsg) { on_scrape_error (session, tier, response->errmsg); } else { tr_tracker * tracker; tier->lastScrapeSucceeded = true; tier->scrapeIntervalSec = MAX (DEFAULT_SCRAPE_INTERVAL_SEC, response->min_request_interval); tier->scrapeAt = get_next_scrape_time (session, tier, tier->scrapeIntervalSec); tr_logAddTorDbg (tier->tor, "Scrape successful. Rescraping in %d seconds.", tier->scrapeIntervalSec); if ((tracker = tier->currentTracker)) { if (row->seeders >= 0) tracker->seederCount = row->seeders; if (row->leechers >= 0) tracker->leecherCount = row->leechers; if (row->downloads >= 0) tracker->downloadCount = row->downloads; tracker->downloaderCount = row->downloaders; tracker->consecutiveFailures = 0; } } } } } if (announcer) ++announcer->slotsAvailable; } static void scrape_request_delegate (tr_announcer * announcer, const tr_scrape_request * request, tr_scrape_response_func callback, void * callback_data) { tr_session * session = announcer->session; if (!memcmp (request->url, "http", 4)) tr_tracker_http_scrape (session, request, callback, callback_data); else if (!memcmp (request->url, "udp://", 6)) tr_tracker_udp_scrape (session, request, callback, callback_data); else tr_logAddError ("Unsupported url: %s", request->url); } static void multiscrape (tr_announcer * announcer, tr_ptrArray * tiers) { int i; int request_count = 0; const time_t now = tr_time (); const int tier_count = tr_ptrArraySize (tiers); const int max_request_count = MIN (announcer->slotsAvailable, tier_count); tr_scrape_request * requests = tr_new0 (tr_scrape_request, max_request_count); /* batch as many info_hashes into a request as we can */ for (i=0; icurrentTracker->scrape; const uint8_t * hash = tier->tor->info.hash; /* if there's a request with this scrape URL and a free slot, use it */ for (j=0; jinfo_hash_count >= TR_MULTISCRAPE_MAX) continue; if (tr_strcmp0 (req->url, url)) continue; memcpy (req->info_hash[req->info_hash_count++], hash, SHA_DIGEST_LENGTH); tier->isScraping = true; tier->lastScrapeStartTime = now; break; } /* otherwise, if there's room for another request, build a new one */ if ((j==request_count) && (request_count < max_request_count)) { tr_scrape_request * req = &requests[request_count++]; req->url = url; tier_build_log_name (tier, req->log_name, sizeof (req->log_name)); memcpy (req->info_hash[req->info_hash_count++], hash, SHA_DIGEST_LENGTH); tier->isScraping = true; tier->lastScrapeStartTime = now; } } /* send the requests we just built */ for (i=0; isession); /* cleanup */ tr_free (requests); } static void flushCloseMessages (tr_announcer * announcer) { int i; const int n = tr_ptrArraySize (&announcer->stops); for (i=0; istops, i), NULL, NULL); tr_ptrArrayClear (&announcer->stops); } static bool tierNeedsToAnnounce (const tr_tier * tier, const time_t now) { return !tier->isAnnouncing && !tier->isScraping && (tier->announceAt != 0) && (tier->announceAt <= now) && (tier->announce_event_count > 0); } static bool tierNeedsToScrape (const tr_tier * tier, const time_t now) { return (!tier->isScraping) && (tier->scrapeAt != 0) && (tier->scrapeAt <= now) && (tier->currentTracker != NULL) && (tier->currentTracker->scrape != NULL); } static int compareTiers (const void * va, const void * vb) { int ret; const tr_tier * a = * (const tr_tier**)va; const tr_tier * b = * (const tr_tier**)vb; /* primary key: larger stats come before smaller */ ret = compareTransfer (a->byteCounts[TR_ANN_UP], a->byteCounts[TR_ANN_DOWN], b->byteCounts[TR_ANN_UP], b->byteCounts[TR_ANN_DOWN]); /* secondary key: announcements that have been waiting longer go first */ if (!ret && (a->announceAt != b->announceAt)) ret = a->announceAt < b->announceAt ? -1 : 1; return ret; } static void announceMore (tr_announcer * announcer) { int i; int n; tr_torrent * tor; tr_ptrArray announceMe = TR_PTR_ARRAY_INIT; tr_ptrArray scrapeMe = TR_PTR_ARRAY_INIT; const time_t now = tr_time (); dbgmsg (NULL, "announceMore: slotsAvailable is %d", announcer->slotsAvailable); if (announcer->slotsAvailable < 1) return; /* build a list of tiers that need to be announced */ tor = NULL; while ((tor = tr_torrentNext (announcer->session, tor))) { struct tr_torrent_tiers * tt = tor->tiers; for (i=0; tt && itier_count; ++i) { tr_tier * tier = &tt->tiers[i]; if (tierNeedsToAnnounce (tier, now)) tr_ptrArrayAppend (&announceMe, tier); else if (tierNeedsToScrape (tier, now)) tr_ptrArrayAppend (&scrapeMe, tier); } } /* if there are more tiers than slots available, prioritize */ n = tr_ptrArraySize (&announceMe); if (n > announcer->slotsAvailable) qsort (tr_ptrArrayBase (&announceMe), n, sizeof (tr_tier*), compareTiers); /* announce some */ n = MIN (tr_ptrArraySize (&announceMe), announcer->slotsAvailable); for (i=0; itor, "%s", "Announcing to tracker"); dbgmsg (tier, "announcing tier %d of %d", i, n); tierAnnounce (announcer, tier); } /* scrape some */ multiscrape (announcer, &scrapeMe); /* cleanup */ tr_ptrArrayDestruct (&scrapeMe, NULL); tr_ptrArrayDestruct (&announceMe, NULL); } static void onUpkeepTimer (evutil_socket_t foo UNUSED, short bar UNUSED, void * vannouncer) { tr_announcer * announcer = vannouncer; tr_session * session = announcer->session; const bool is_closing = session->isClosed; const time_t now = tr_time (); tr_sessionLock (session); /* maybe send out some "stopped" messages for closed torrents */ flushCloseMessages (announcer); /* maybe send out some announcements to trackers */ if (!is_closing) announceMore (announcer); /* TAU upkeep */ if (announcer->tauUpkeepAt <= now) { announcer->tauUpkeepAt = now + TAU_UPKEEP_INTERVAL_SECS; tr_tracker_udp_upkeep (session); } /* set up the next timer */ tr_timerAdd (announcer->upkeepTimer, UPKEEP_INTERVAL_SECS, 0); tr_sessionUnlock (session); } /*** **** ***/ tr_tracker_stat * tr_announcerStats (const tr_torrent * torrent, int * setmeTrackerCount) { int i; int out = 0; tr_tracker_stat * ret; struct tr_torrent_tiers * tt; const time_t now = tr_time (); assert (tr_isTorrent (torrent)); tt = torrent->tiers; /* alloc the stats */ *setmeTrackerCount = tt->tracker_count; ret = tr_new0 (tr_tracker_stat, tt->tracker_count); /* populate the stats */ for (i=0; itier_count; ++i) { int j; const tr_tier * const tier = &tt->tiers[i]; for (j=0; jtracker_count; ++j) { const tr_tracker * const tracker = &tier->trackers[j]; tr_tracker_stat * st = &ret[out++]; st->id = tracker->id; tr_strlcpy (st->host, tracker->key, sizeof (st->host)); tr_strlcpy (st->announce, tracker->announce, sizeof (st->announce)); st->tier = i; st->isBackup = tracker != tier->currentTracker; st->lastScrapeStartTime = tier->lastScrapeStartTime; if (tracker->scrape) tr_strlcpy (st->scrape, tracker->scrape, sizeof (st->scrape)); else st->scrape[0] = '\0'; st->seederCount = tracker->seederCount; st->leecherCount = tracker->leecherCount; st->downloadCount = tracker->downloadCount; if (st->isBackup) { st->scrapeState = TR_TRACKER_INACTIVE; st->announceState = TR_TRACKER_INACTIVE; st->nextScrapeTime = 0; st->nextAnnounceTime = 0; } else { if ((st->hasScraped = tier->lastScrapeTime != 0)) { st->lastScrapeTime = tier->lastScrapeTime; st->lastScrapeSucceeded = tier->lastScrapeSucceeded; st->lastScrapeTimedOut = tier->lastScrapeTimedOut; tr_strlcpy (st->lastScrapeResult, tier->lastScrapeStr, sizeof (st->lastScrapeResult)); } if (tier->isScraping) st->scrapeState = TR_TRACKER_ACTIVE; else if (!tier->scrapeAt) st->scrapeState = TR_TRACKER_INACTIVE; else if (tier->scrapeAt > now) { st->scrapeState = TR_TRACKER_WAITING; st->nextScrapeTime = tier->scrapeAt; } else st->scrapeState = TR_TRACKER_QUEUED; st->lastAnnounceStartTime = tier->lastAnnounceStartTime; if ((st->hasAnnounced = tier->lastAnnounceTime != 0)) { st->lastAnnounceTime = tier->lastAnnounceTime; tr_strlcpy (st->lastAnnounceResult, tier->lastAnnounceStr, sizeof (st->lastAnnounceResult)); st->lastAnnounceSucceeded = tier->lastAnnounceSucceeded; st->lastAnnounceTimedOut = tier->lastAnnounceTimedOut; st->lastAnnouncePeerCount = tier->lastAnnouncePeerCount; } if (tier->isAnnouncing) st->announceState = TR_TRACKER_ACTIVE; else if (!torrent->isRunning || !tier->announceAt) st->announceState = TR_TRACKER_INACTIVE; else if (tier->announceAt > now) { st->announceState = TR_TRACKER_WAITING; st->nextAnnounceTime = tier->announceAt; } else st->announceState = TR_TRACKER_QUEUED; } } } return ret; } void tr_announcerStatsFree (tr_tracker_stat * trackers, int trackerCount UNUSED) { tr_free (trackers); } /*** **** ***/ static void copy_tier_attributes_impl (struct tr_tier * tgt, int trackerIndex, const tr_tier * src) { const tr_tier keep = *tgt; /* sanity clause */ assert (trackerIndex < tgt->tracker_count); assert (!tr_strcmp0 (tgt->trackers[trackerIndex].announce, src->currentTracker->announce)); /* bitwise copy will handle most of tr_tier's fields... */ *tgt = *src; /* ...fix the fields that can't be cleanly bitwise-copied */ tgt->wasCopied = true; tgt->trackers = keep.trackers; tgt->tracker_count = keep.tracker_count; tgt->announce_events = tr_memdup (src->announce_events, sizeof (tr_announce_event) * src->announce_event_count); tgt->announce_event_count = src->announce_event_count; tgt->announce_event_alloc = src->announce_event_count; tgt->currentTrackerIndex = trackerIndex; tgt->currentTracker = &tgt->trackers[trackerIndex]; tgt->currentTracker->seederCount = src->currentTracker->seederCount; tgt->currentTracker->leecherCount = src->currentTracker->leecherCount; tgt->currentTracker->downloadCount = src->currentTracker->downloadCount; tgt->currentTracker->downloaderCount = src->currentTracker->downloaderCount; } static void copy_tier_attributes (struct tr_torrent_tiers * tt, const tr_tier * src) { int i, j; bool found = false; /* find a tier (if any) which has a match for src->currentTracker */ for (i=0; !found && itier_count; ++i) for (j=0; !found && jtiers[i].tracker_count; ++j) if ((found = !tr_strcmp0 (src->currentTracker->announce, tt->tiers[i].trackers[j].announce))) copy_tier_attributes_impl (&tt->tiers[i], j, src); } void tr_announcerResetTorrent (tr_announcer * announcer UNUSED, tr_torrent * tor) { int i; const time_t now = tr_time (); struct tr_torrent_tiers * tt = tor->tiers; tr_torrent_tiers old = *tt; assert (tt != NULL); /* remove the old tiers / trackers */ tt->tiers = NULL; tt->trackers = NULL; tt->tier_count = 0; tt->tracker_count = 0; /* create the new tiers / trackers */ addTorrentToTier (tt, tor); /* copy the old tiers' states into their replacements */ for (i=0; iisRunning) for (i=0; itier_count; ++i) if (!tt->tiers[i].wasCopied) tier_announce_event_push (&tt->tiers[i], TR_ANNOUNCE_EVENT_STARTED, now); /* cleanup */ tiersDestruct (&old); } transmission-2.92/libtransmission/PaxHeaders.4960/crypto-test-ref.h0000644000000000000000000000013112505250244022314 xustar0030 mtime=1427460260.476244119 30 atime=1427460260.476244119 29 ctime=1457295920.26381239 transmission-2.92/libtransmission/crypto-test-ref.h0000644000175000017500000001257412505250244023753 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id$ */ #ifndef TR_CRYPTO_TEST_REF_H #define TR_CRYPTO_TEST_REF_H /* #define CRYPTO_REFERENCE_CHECK */ #ifdef CRYPTO_REFERENCE_CHECK #define KEY_LEN KEY_LEN_ #define tr_sha1_ctx_t tr_sha1_ctx_t_ #define tr_rc4_ctx_t tr_rc4_ctx_t_ #define tr_dh_ctx_t tr_dh_ctx_t_ #define tr_dh_secret_t tr_dh_secret_t_ #define tr_crypto tr_crypto_ #define tr_cryptoConstruct tr_cryptoConstruct_ #define tr_cryptoDestruct tr_cryptoDestruct_ #define tr_cryptoSetTorrentHash tr_cryptoSetTorrentHash_ #define tr_cryptoGetTorrentHash tr_cryptoGetTorrentHash_ #define tr_cryptoHasTorrentHash tr_cryptoHasTorrentHash_ #define tr_cryptoComputeSecret tr_cryptoComputeSecret_ #define tr_cryptoGetMyPublicKey tr_cryptoGetMyPublicKey_ #define tr_cryptoDecryptInit tr_cryptoDecryptInit_ #define tr_cryptoDecrypt tr_cryptoDecrypt_ #define tr_cryptoEncryptInit tr_cryptoEncryptInit_ #define tr_cryptoEncrypt tr_cryptoEncrypt_ #define tr_cryptoSecretKeySha1 tr_cryptoSecretKeySha1_ #define tr_sha1 tr_sha1_ #define tr_sha1_init tr_sha1_init_ #define tr_sha1_update tr_sha1_update_ #define tr_sha1_final tr_sha1_final_ #define tr_rc4_new tr_rc4_new_ #define tr_rc4_free tr_rc4_free_ #define tr_rc4_set_key tr_rc4_set_key_ #define tr_rc4_process tr_rc4_process_ #define tr_dh_new tr_dh_new_ #define tr_dh_free tr_dh_free_ #define tr_dh_make_key tr_dh_make_key_ #define tr_dh_agree tr_dh_agree_ #define tr_dh_secret_derive tr_dh_secret_derive_ #define tr_dh_secret_free tr_dh_secret_free_ #define tr_dh_align_key tr_dh_align_key_ #define tr_rand_int tr_rand_int_ #define tr_rand_int_weak tr_rand_int_weak_ #define tr_rand_buffer tr_rand_buffer_ #define tr_ssha1 tr_ssha1_ #define tr_ssha1_matches tr_ssha1_matches_ #define tr_base64_encode tr_base64_encode_ #define tr_base64_encode_str tr_base64_encode_str_ #define tr_base64_encode_impl tr_base64_encode_impl_ #define tr_base64_decode tr_base64_decode_ #define tr_base64_decode_str tr_base64_decode_str_ #define tr_base64_decode_impl tr_base64_decode_impl_ #define tr_sha1_to_hex tr_sha1_to_hex_ #define tr_hex_to_sha1 tr_hex_to_sha1_ #undef TR_ENCRYPTION_H #undef TR_CRYPTO_UTILS_H #include "crypto.h" #include "crypto-utils.h" #include "crypto.c" #include "crypto-utils.c" #include "crypto-utils-openssl.c" #undef KEY_LEN_ #undef tr_sha1_ctx_t #undef tr_rc4_ctx_t #undef tr_dh_ctx_t #undef tr_dh_secret_t #undef tr_crypto #undef tr_cryptoConstruct #undef tr_cryptoDestruct #undef tr_cryptoSetTorrentHash #undef tr_cryptoGetTorrentHash #undef tr_cryptoHasTorrentHash #undef tr_cryptoComputeSecret #undef tr_cryptoGetMyPublicKey #undef tr_cryptoDecryptInit #undef tr_cryptoDecrypt #undef tr_cryptoEncryptInit #undef tr_cryptoEncrypt #undef tr_cryptoSecretKeySha1 #undef tr_sha1 #undef tr_sha1_init #undef tr_sha1_update #undef tr_sha1_final #undef tr_rc4_new #undef tr_rc4_free #undef tr_rc4_set_key #undef tr_rc4_process #undef tr_dh_new #undef tr_dh_free #undef tr_dh_make_key #undef tr_dh_agree #undef tr_dh_secret_derive #undef tr_dh_secret_free #undef tr_dh_align_key #undef tr_rand_int #undef tr_rand_int_weak #undef tr_rand_buffer #undef tr_ssha1 #undef tr_ssha1_matches #undef tr_base64_encode #undef tr_base64_encode_str #undef tr_base64_encode_impl #undef tr_base64_decode #undef tr_base64_decode_str #undef tr_base64_decode_impl #undef tr_sha1_to_hex #undef tr_hex_to_sha1 #else /* CRYPTO_REFERENCE_CHECK */ #define KEY_LEN_ KEY_LEN #define tr_sha1_ctx_t_ tr_sha1_ctx_t #define tr_rc4_ctx_t_ tr_rc4_ctx_t #define tr_dh_ctx_t_ tr_dh_ctx_t #define tr_dh_secret_t_ tr_dh_secret_t #define tr_crypto_ tr_crypto #define tr_cryptoConstruct_ tr_cryptoConstruct #define tr_cryptoDestruct_ tr_cryptoDestruct #define tr_cryptoSetTorrentHash_ tr_cryptoSetTorrentHash #define tr_cryptoGetTorrentHash_ tr_cryptoGetTorrentHash #define tr_cryptoHasTorrentHash_ tr_cryptoHasTorrentHash #define tr_cryptoComputeSecret_ tr_cryptoComputeSecret #define tr_cryptoGetMyPublicKey_ tr_cryptoGetMyPublicKey #define tr_cryptoDecryptInit_ tr_cryptoDecryptInit #define tr_cryptoDecrypt_ tr_cryptoDecrypt #define tr_cryptoEncryptInit_ tr_cryptoEncryptInit #define tr_cryptoEncrypt_ tr_cryptoEncrypt #define tr_cryptoSecretKeySha1_ tr_cryptoSecretKeySha1 #define tr_sha1_ tr_sha1 #define tr_sha1_init_ tr_sha1_init #define tr_sha1_update_ tr_sha1_update #define tr_sha1_final_ tr_sha1_final #define tr_rc4_new_ tr_rc4_new #define tr_rc4_free_ tr_rc4_free #define tr_rc4_set_key_ tr_rc4_set_key #define tr_rc4_process_ tr_rc4_process #define tr_dh_new_ tr_dh_new #define tr_dh_free_ tr_dh_free #define tr_dh_make_key_ tr_dh_make_key #define tr_dh_agree_ tr_dh_agree #define tr_dh_secret_derive_ tr_dh_secret_derive #define tr_dh_secret_free_ tr_dh_secret_free #define tr_dh_align_key_ tr_dh_align_key #define tr_rand_int_ tr_rand_int #define tr_rand_int_weak_ tr_rand_int_weak #define tr_rand_buffer_ tr_rand_buffer #define tr_ssha1_ tr_ssha1 #define tr_ssha1_matches_ tr_ssha1_matches #define tr_base64_encode_ tr_base64_encode #define tr_base64_encode_str_ tr_base64_encode_str #define tr_base64_encode_impl_ tr_base64_encode_impl #define tr_base64_decode_ tr_base64_decode #define tr_base64_decode_str_ tr_base64_decode_str #define tr_base64_decode_impl_ tr_base64_decode_impl #define tr_sha1_to_hex_ tr_sha1_to_hex #define tr_hex_to_sha1_ tr_hex_to_sha1 #endif /* CRYPTO_REFERENCE_CHECK */ #endif /* TR_CRYPTO_TEST_REF_H */ transmission-2.92/libtransmission/PaxHeaders.4960/announcer-udp.c0000644000000000000000000000013212641272401022017 xustar0030 mtime=1451586817.569878391 30 atime=1451586817.569878391 30 ctime=1457295919.935806813 transmission-2.92/libtransmission/announcer-udp.c0000644000175000017500000007145012641272401023453 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: announcer-udp.c 14648 2015-12-31 14:17:37Z mikedld $ */ #define __LIBTRANSMISSION_ANNOUNCER_MODULE__ #include /* errno, EAFNOSUPPORT */ #include /* memcpy (), memset () */ #include #include #include #include "transmission.h" #include "announcer.h" #include "announcer-common.h" #include "crypto-utils.h" /* tr_rand_buffer () */ #include "log.h" #include "peer-io.h" #include "peer-mgr.h" /* tr_peerMgrCompactToPex () */ #include "ptrarray.h" #include "tr-udp.h" #include "utils.h" #define dbgmsg(name, ...) \ do \ { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, name, __VA_ARGS__); \ } \ while (0) /**** ***** ****/ static void tau_sockaddr_setport (struct sockaddr * sa, tr_port port) { if (sa->sa_family == AF_INET) ((struct sockaddr_in *)sa)->sin_port = htons (port); else if (sa->sa_family == AF_INET6) ((struct sockaddr_in6 *)sa)->sin6_port = htons (port); } static int tau_sendto (tr_session * session, struct evutil_addrinfo * ai, tr_port port, const void * buf, size_t buflen) { tr_socket_t sockfd; if (ai->ai_addr->sa_family == AF_INET) sockfd = session->udp_socket; else if (ai->ai_addr->sa_family == AF_INET6) sockfd = session->udp6_socket; else sockfd = TR_BAD_SOCKET; if (sockfd == TR_BAD_SOCKET) { errno = EAFNOSUPPORT; return -1; } tau_sockaddr_setport (ai->ai_addr, port); return sendto (sockfd, buf, buflen, 0, ai->ai_addr, ai->ai_addrlen); } /**** ***** ****/ static uint32_t evbuffer_read_ntoh_32 (struct evbuffer * buf) { uint32_t val; evbuffer_remove (buf, &val, sizeof (uint32_t)); return ntohl (val); } static uint64_t evbuffer_read_ntoh_64 (struct evbuffer * buf) { uint64_t val; evbuffer_remove (buf, &val, sizeof (uint64_t)); return tr_ntohll (val); } /**** ***** ****/ typedef uint64_t tau_connection_t; enum { TAU_CONNECTION_TTL_SECS = 60 }; typedef uint32_t tau_transaction_t; static tau_transaction_t tau_transaction_new (void) { tau_transaction_t tmp; tr_rand_buffer (&tmp, sizeof (tau_transaction_t)); return tmp; } /* used in the "action" field of a request */ typedef enum { TAU_ACTION_CONNECT = 0, TAU_ACTION_ANNOUNCE = 1, TAU_ACTION_SCRAPE = 2, TAU_ACTION_ERROR = 3 } tau_action_t; static bool is_tau_response_message (tau_action_t action, size_t msglen) { if (action == TAU_ACTION_CONNECT) return msglen == 16; if (action == TAU_ACTION_ANNOUNCE) return msglen >= 20; if (action == TAU_ACTION_SCRAPE ) return msglen >= 20; if (action == TAU_ACTION_ERROR ) return msglen >= 8; return false; } enum { TAU_REQUEST_TTL = 60 }; /**** ***** ***** SCRAPE ***** ****/ struct tau_scrape_request { void * payload; size_t payload_len; time_t sent_at; time_t created_at; tau_transaction_t transaction_id; tr_scrape_response response; tr_scrape_response_func callback; void * user_data; }; static struct tau_scrape_request * tau_scrape_request_new (const tr_scrape_request * in, tr_scrape_response_func callback, void * user_data) { int i; struct evbuffer * buf; struct tau_scrape_request * req; const tau_transaction_t transaction_id = tau_transaction_new (); /* build the payload */ buf = evbuffer_new (); evbuffer_add_hton_32 (buf, TAU_ACTION_SCRAPE); evbuffer_add_hton_32 (buf, transaction_id); for (i=0; iinfo_hash_count; ++i) evbuffer_add (buf, in->info_hash[i], SHA_DIGEST_LENGTH); /* build the tau_scrape_request */ req = tr_new0 (struct tau_scrape_request, 1); req->created_at = tr_time (); req->transaction_id = transaction_id; req->callback = callback; req->user_data = user_data; req->response.url = tr_strdup (in->url); req->response.row_count = in->info_hash_count; req->payload_len = evbuffer_get_length (buf); req->payload = tr_memdup (evbuffer_pullup (buf, -1), req->payload_len); for (i=0; iresponse.row_count; ++i) { req->response.rows[i].seeders = -1; req->response.rows[i].leechers = -1; req->response.rows[i].downloads = -1; memcpy (req->response.rows[i].info_hash, in->info_hash[i], SHA_DIGEST_LENGTH); } /* cleanup */ evbuffer_free (buf); return req; } static void tau_scrape_request_free (struct tau_scrape_request * req) { tr_free (req->response.errmsg); tr_free (req->response.url); tr_free (req->payload); tr_free (req); } static void tau_scrape_request_finished (const struct tau_scrape_request * request) { if (request->callback != NULL) request->callback (&request->response, request->user_data); } static void tau_scrape_request_fail (struct tau_scrape_request * request, bool did_connect, bool did_timeout, const char * errmsg) { request->response.did_connect = did_connect; request->response.did_timeout = did_timeout; request->response.errmsg = tr_strdup (errmsg); tau_scrape_request_finished (request); } static void on_scrape_response (struct tau_scrape_request * request, tau_action_t action, struct evbuffer * buf) { request->response.did_connect = true; request->response.did_timeout = false; if (action == TAU_ACTION_SCRAPE) { int i; for (i=0; iresponse.row_count; ++i) { struct tr_scrape_response_row * row; if (evbuffer_get_length (buf) < (sizeof (uint32_t) * 3)) break; row = &request->response.rows[i]; row->seeders = evbuffer_read_ntoh_32 (buf); row->downloads = evbuffer_read_ntoh_32 (buf); row->leechers = evbuffer_read_ntoh_32 (buf); } tau_scrape_request_finished (request); } else { char * errmsg; const size_t buflen = evbuffer_get_length (buf); if ((action == TAU_ACTION_ERROR) && (buflen > 0)) errmsg = tr_strndup (evbuffer_pullup (buf, -1), buflen); else errmsg = tr_strdup (_("Unknown error")); tau_scrape_request_fail (request, true, false, errmsg); tr_free (errmsg); } } /**** ***** ***** ANNOUNCE ***** ****/ struct tau_announce_request { void * payload; size_t payload_len; time_t created_at; time_t sent_at; tau_transaction_t transaction_id; tr_announce_response response; tr_announce_response_func callback; void * user_data; }; typedef enum { /* used in the "event" field of an announce request */ TAU_ANNOUNCE_EVENT_NONE = 0, TAU_ANNOUNCE_EVENT_COMPLETED = 1, TAU_ANNOUNCE_EVENT_STARTED = 2, TAU_ANNOUNCE_EVENT_STOPPED = 3 } tau_announce_event; static tau_announce_event get_tau_announce_event (tr_announce_event e) { switch (e) { case TR_ANNOUNCE_EVENT_COMPLETED: return TAU_ANNOUNCE_EVENT_COMPLETED; case TR_ANNOUNCE_EVENT_STARTED: return TAU_ANNOUNCE_EVENT_STARTED; case TR_ANNOUNCE_EVENT_STOPPED: return TAU_ANNOUNCE_EVENT_STOPPED; default: return TAU_ANNOUNCE_EVENT_NONE; } } static struct tau_announce_request * tau_announce_request_new (const tr_announce_request * in, tr_announce_response_func callback, void * user_data) { struct evbuffer * buf; struct tau_announce_request * req; const tau_transaction_t transaction_id = tau_transaction_new (); /* build the payload */ buf = evbuffer_new (); evbuffer_add_hton_32 (buf, TAU_ACTION_ANNOUNCE); evbuffer_add_hton_32 (buf, transaction_id); evbuffer_add (buf, in->info_hash, SHA_DIGEST_LENGTH); evbuffer_add (buf, in->peer_id, PEER_ID_LEN); evbuffer_add_hton_64 (buf, in->down); evbuffer_add_hton_64 (buf, in->leftUntilComplete); evbuffer_add_hton_64 (buf, in->up); evbuffer_add_hton_32 (buf, get_tau_announce_event (in->event)); evbuffer_add_hton_32 (buf, 0); evbuffer_add_hton_32 (buf, in->key); evbuffer_add_hton_32 (buf, in->numwant); evbuffer_add_hton_16 (buf, in->port); /* build the tau_announce_request */ req = tr_new0 (struct tau_announce_request, 1); req->created_at = tr_time (); req->transaction_id = transaction_id; req->callback = callback; req->user_data = user_data; req->payload_len = evbuffer_get_length (buf); req->payload = tr_memdup (evbuffer_pullup (buf, -1), req->payload_len); req->response.seeders = -1; req->response.leechers = -1; req->response.downloads = -1; memcpy (req->response.info_hash, in->info_hash, SHA_DIGEST_LENGTH); evbuffer_free (buf); return req; } static void tau_announce_request_free (struct tau_announce_request * req) { tr_free (req->response.tracker_id_str); tr_free (req->response.warning); tr_free (req->response.errmsg); tr_free (req->response.pex6); tr_free (req->response.pex); tr_free (req->payload); tr_free (req); } static void tau_announce_request_finished (const struct tau_announce_request * request) { if (request->callback != NULL) request->callback (&request->response, request->user_data); } static void tau_announce_request_fail (struct tau_announce_request * request, bool did_connect, bool did_timeout, const char * errmsg) { request->response.did_connect = did_connect; request->response.did_timeout = did_timeout; request->response.errmsg = tr_strdup (errmsg); tau_announce_request_finished (request); } static void on_announce_response (struct tau_announce_request * request, tau_action_t action, struct evbuffer * buf) { const size_t buflen = evbuffer_get_length (buf); request->response.did_connect = true; request->response.did_timeout = false; if ((action == TAU_ACTION_ANNOUNCE) && (buflen >= 3*sizeof (uint32_t))) { tr_announce_response * resp = &request->response; resp->interval = evbuffer_read_ntoh_32 (buf); resp->leechers = evbuffer_read_ntoh_32 (buf); resp->seeders = evbuffer_read_ntoh_32 (buf); resp->pex = tr_peerMgrCompactToPex (evbuffer_pullup (buf, -1), evbuffer_get_length (buf), NULL, 0, &request->response.pex_count); tau_announce_request_finished (request); } else { char * errmsg; if ((action == TAU_ACTION_ERROR) && (buflen > 0)) errmsg = tr_strndup (evbuffer_pullup (buf, -1), buflen); else errmsg = tr_strdup (_("Unknown error")); tau_announce_request_fail (request, true, false, errmsg); tr_free (errmsg); } } /**** ***** ***** TRACKERS ***** ****/ struct tau_tracker { tr_session * session; char * key; char * host; int port; struct evdns_getaddrinfo_request * dns_request; struct evutil_addrinfo * addr; time_t addr_expiration_time; time_t connecting_at; time_t connection_expiration_time; tau_connection_t connection_id; tau_transaction_t connection_transaction_id; time_t close_at; tr_ptrArray announces; tr_ptrArray scrapes; }; static void tau_tracker_upkeep (struct tau_tracker *); static void tau_tracker_free (struct tau_tracker * t) { assert (t->dns_request == NULL); if (t->addr) evutil_freeaddrinfo (t->addr); tr_ptrArrayDestruct (&t->announces, (PtrArrayForeachFunc)tau_announce_request_free); tr_ptrArrayDestruct (&t->scrapes, (PtrArrayForeachFunc)tau_scrape_request_free); tr_free (t->host); tr_free (t->key); tr_free (t); } static void tau_tracker_fail_all (struct tau_tracker * tracker, bool did_connect, bool did_timeout, const char * errmsg) { int i; int n; tr_ptrArray * reqs; /* fail all the scrapes */ reqs = &tracker->scrapes; for (i=0, n=tr_ptrArraySize (reqs); iannounces; for (i=0, n=tr_ptrArraySize (reqs); idns_request = NULL; if (errcode) { char * errmsg = tr_strdup_printf (_("DNS Lookup failed: %s"), evutil_gai_strerror (errcode)); dbgmsg (tracker->key, "%s", errmsg); tau_tracker_fail_all (tracker, false, false, errmsg); tr_free (errmsg); } else { dbgmsg (tracker->key, "DNS lookup succeeded"); tracker->addr = addr; tracker->addr_expiration_time = tr_time () + (60*60); /* one hour */ tau_tracker_upkeep (tracker); } } static void tau_tracker_send_request (struct tau_tracker * tracker, const void * payload, size_t payload_len) { struct evbuffer * buf = evbuffer_new (); dbgmsg (tracker->key, "sending request w/connection id %"PRIu64"\n", tracker->connection_id); evbuffer_add_hton_64 (buf, tracker->connection_id); evbuffer_add_reference (buf, payload, payload_len, NULL, NULL); tau_sendto (tracker->session, tracker->addr, tracker->port, evbuffer_pullup (buf, -1), evbuffer_get_length (buf)); evbuffer_free (buf); } static void tau_tracker_send_reqs (struct tau_tracker * tracker) { int i, n; tr_ptrArray * reqs; const time_t now = tr_time (); assert (tracker->dns_request == NULL); assert (tracker->connecting_at == 0); assert (tracker->addr != NULL); assert (tracker->connection_expiration_time > now); reqs = &tracker->announces; for (i=0, n=tr_ptrArraySize (reqs); isent_at) { dbgmsg (tracker->key, "sending announce req %p", (void*)req); req->sent_at = now; tau_tracker_send_request (tracker, req->payload, req->payload_len); if (req->callback == NULL) { tau_announce_request_free (req); tr_ptrArrayRemove (reqs, i); --i; --n; } } } reqs = &tracker->scrapes; for (i=0, n=tr_ptrArraySize (reqs); isent_at) { dbgmsg (tracker->key, "sending scrape req %p", (void*)req); req->sent_at = now; tau_tracker_send_request (tracker, req->payload, req->payload_len); if (req->callback == NULL) { tau_scrape_request_free (req); tr_ptrArrayRemove (reqs, i); --i; --n; } } } } static void on_tracker_connection_response (struct tau_tracker * tracker, tau_action_t action, struct evbuffer * buf) { const time_t now = tr_time (); tracker->connecting_at = 0; tracker->connection_transaction_id = 0; if (action == TAU_ACTION_CONNECT) { tracker->connection_id = evbuffer_read_ntoh_64 (buf); tracker->connection_expiration_time = now + TAU_CONNECTION_TTL_SECS; dbgmsg (tracker->key, "Got a new connection ID from tracker: %"PRIu64, tracker->connection_id); } else { char * errmsg; const size_t buflen = buf ? evbuffer_get_length (buf) : 0; if ((action == TAU_ACTION_ERROR) && (buflen > 0)) errmsg = tr_strndup (evbuffer_pullup (buf, -1), buflen); else errmsg = tr_strdup (_("Connection failed")); dbgmsg (tracker->key, "%s", errmsg); tau_tracker_fail_all (tracker, true, false, errmsg); tr_free (errmsg); } tau_tracker_upkeep (tracker); } static void tau_tracker_timeout_reqs (struct tau_tracker * tracker) { int i, n; tr_ptrArray * reqs; const time_t now = time (NULL); const bool cancel_all = tracker->close_at && (tracker->close_at <= now); if (tracker->connecting_at && (tracker->connecting_at + TAU_REQUEST_TTL < now)) { on_tracker_connection_response (tracker, TAU_ACTION_ERROR, NULL); } reqs = &tracker->announces; for (i=0, n=tr_ptrArraySize (reqs); icreated_at + TAU_REQUEST_TTL < now)) { dbgmsg (tracker->key, "timeout announce req %p", (void*)req); tau_announce_request_fail (req, false, true, NULL); tau_announce_request_free (req); tr_ptrArrayRemove (reqs, i); --i; --n; } } reqs = &tracker->scrapes; for (i=0, n=tr_ptrArraySize (reqs); icreated_at + TAU_REQUEST_TTL < now)) { dbgmsg (tracker->key, "timeout scrape req %p", (void*)req); tau_scrape_request_fail (req, false, true, NULL); tau_scrape_request_free (req); tr_ptrArrayRemove (reqs, i); --i; --n; } } } static bool tau_tracker_is_idle (const struct tau_tracker * tracker) { return tr_ptrArrayEmpty (&tracker->announces) && tr_ptrArrayEmpty (&tracker->scrapes) && tracker->dns_request == NULL; } static void tau_tracker_upkeep (struct tau_tracker * tracker) { const time_t now = tr_time (); const bool closing = tracker->close_at != 0; /* if the address info is too old, expire it */ if (tracker->addr != NULL && (closing || tracker->addr_expiration_time <= now)) { dbgmsg (tracker->host, "Expiring old DNS result"); evutil_freeaddrinfo (tracker->addr); tracker->addr = NULL; } /* are there any requests pending? */ if (tau_tracker_is_idle (tracker)) return; /* if we don't have an address yet, try & get one now. */ if (!closing && tracker->addr == NULL && tracker->dns_request == NULL) { struct evutil_addrinfo hints; memset (&hints, 0, sizeof (hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; hints.ai_protocol = IPPROTO_UDP; dbgmsg (tracker->host, "Trying a new DNS lookup"); tracker->dns_request = evdns_getaddrinfo (tracker->session->evdns_base, tracker->host, NULL, &hints, tau_tracker_on_dns, tracker); return; } dbgmsg (tracker->key, "addr %p -- connected %d (%zu %zu) -- connecting_at %zu", (void*)tracker->addr, (int)(tracker->connection_expiration_time > now), (size_t)tracker->connection_expiration_time, (size_t)now, (size_t)tracker->connecting_at); /* also need a valid connection ID... */ if (tracker->addr && (tracker->connection_expiration_time <= now) && (!tracker->connecting_at)) { struct evbuffer * buf = evbuffer_new (); tracker->connecting_at = now; tracker->connection_transaction_id = tau_transaction_new (); dbgmsg (tracker->key, "Trying to connect. Transaction ID is %u", tracker->connection_transaction_id); evbuffer_add_hton_64 (buf, 0x41727101980LL); evbuffer_add_hton_32 (buf, TAU_ACTION_CONNECT); evbuffer_add_hton_32 (buf, tracker->connection_transaction_id); tau_sendto (tracker->session, tracker->addr, tracker->port, evbuffer_pullup (buf, -1), evbuffer_get_length (buf)); evbuffer_free (buf); return; } tau_tracker_timeout_reqs (tracker); if ((tracker->addr != NULL) && (tracker->connection_expiration_time > now)) tau_tracker_send_reqs (tracker); } /**** ***** ***** SESSION ***** ****/ struct tr_announcer_udp { /* tau_tracker */ tr_ptrArray trackers; tr_session * session; }; static struct tr_announcer_udp* announcer_udp_get (tr_session * session) { struct tr_announcer_udp * tau; if (session->announcer_udp != NULL) return session->announcer_udp; tau = tr_new0 (struct tr_announcer_udp, 1); tau->trackers = TR_PTR_ARRAY_INIT; tau->session = session; session->announcer_udp = tau; return tau; } /* Finds the tau_tracker struct that corresponds to this url. If it doesn't exist yet, create one. */ static struct tau_tracker * tau_session_get_tracker (struct tr_announcer_udp * tau, const char * url) { int i; int n; int port; char * host; char * key; struct tau_tracker * tracker = NULL; /* see if we've already got a tracker that matches this host + port */ tr_urlParse (url, TR_BAD_SIZE, NULL, &host, &port, NULL); key = tr_strdup_printf ("%s:%d", host, port); for (i=0, n=tr_ptrArraySize (&tau->trackers); !tracker && itrackers, i); if (!tr_strcmp0 (tmp->key, key)) tracker = tmp; } /* if we don't have a match, build a new tracker */ if (tracker == NULL) { tracker = tr_new0 (struct tau_tracker, 1); tracker->session = tau->session; tracker->key = key; tracker->host = host; tracker->port = port; tracker->scrapes = TR_PTR_ARRAY_INIT; tracker->announces = TR_PTR_ARRAY_INIT; tr_ptrArrayAppend (&tau->trackers, tracker); dbgmsg (tracker->key, "New tau_tracker created"); } else { tr_free (key); tr_free (host); } return tracker; } /**** ***** ***** PUBLIC API ***** ****/ void tr_tracker_udp_upkeep (tr_session * session) { struct tr_announcer_udp * tau = session->announcer_udp; if (tau != NULL) tr_ptrArrayForeach (&tau->trackers, (PtrArrayForeachFunc)tau_tracker_upkeep); } bool tr_tracker_udp_is_idle (const tr_session * session) { int i; int n; struct tr_announcer_udp * tau = session->announcer_udp; if (tau != NULL) for (i=0, n=tr_ptrArraySize (&tau->trackers); itrackers, i))) return false; return true; } /* drop dead now. */ void tr_tracker_udp_close (tr_session * session) { struct tr_announcer_udp * tau = session->announcer_udp; if (tau != NULL) { session->announcer_udp = NULL; tr_ptrArrayDestruct (&tau->trackers, (PtrArrayForeachFunc)tau_tracker_free); tr_free (tau); } } /* start shutting down. This doesn't destroy everything if there are requests, but sets a deadline on how much longer to wait for the remaining ones */ void tr_tracker_udp_start_shutdown (tr_session * session) { const time_t now = time (NULL); struct tr_announcer_udp * tau = session->announcer_udp; if (tau != NULL) { int i, n; for (i=0, n=tr_ptrArraySize (&tau->trackers); itrackers, i); if (tracker->dns_request != NULL) evdns_getaddrinfo_cancel (tracker->dns_request); tracker->close_at = now + 3; tau_tracker_upkeep (tracker); } } } /* @brief process an incoming udp message if it's a tracker response. * @return true if msg was a tracker response; false otherwise */ bool tau_handle_message (tr_session * session, const uint8_t * msg, size_t msglen) { int i; int n; struct tr_announcer_udp * tau; tau_action_t action_id; tau_transaction_t transaction_id; struct evbuffer * buf; /*fprintf (stderr, "got an incoming udp message w/len %zu\n", msglen);*/ if (!session || !session->announcer_udp) return false; if (msglen < (sizeof (uint32_t)*2)) return false; /* extract the action_id and see if it makes sense */ buf = evbuffer_new (); evbuffer_add_reference (buf, msg, msglen, NULL, NULL); action_id = evbuffer_read_ntoh_32 (buf); if (!is_tau_response_message (action_id, msglen)) { evbuffer_free (buf); return false; } /* extract the transaction_id and look for a match */ tau = session->announcer_udp; transaction_id = evbuffer_read_ntoh_32 (buf); /*fprintf (stderr, "UDP got a transaction_id %u...\n", transaction_id);*/ for (i=0, n=tr_ptrArraySize (&tau->trackers); itrackers, i); /* is it a connection response? */ if (tracker->connecting_at && (transaction_id == tracker->connection_transaction_id)) { dbgmsg (tracker->key, "%"PRIu32" is my connection request!", transaction_id); on_tracker_connection_response (tracker, action_id, buf); evbuffer_free (buf); return true; } /* is it a response to one of this tracker's announces? */ reqs = &tracker->announces; for (j=0, jn=tr_ptrArraySize (reqs); jsent_at && (transaction_id == req->transaction_id)) { dbgmsg (tracker->key, "%"PRIu32" is an announce request!", transaction_id); tr_ptrArrayRemove (reqs, j); on_announce_response (req, action_id, buf); tau_announce_request_free (req); evbuffer_free (buf); return true; } } /* is it a response to one of this tracker's scrapes? */ reqs = &tracker->scrapes; for (j=0, jn=tr_ptrArraySize (reqs); jsent_at && (transaction_id == req->transaction_id)) { dbgmsg (tracker->key, "%"PRIu32" is a scrape request!", transaction_id); tr_ptrArrayRemove (reqs, j); on_scrape_response (req, action_id, buf); tau_scrape_request_free (req); evbuffer_free (buf); return true; } } } /* no match... */ evbuffer_free (buf); return false; } void tr_tracker_udp_announce (tr_session * session, const tr_announce_request * request, tr_announce_response_func response_func, void * user_data) { struct tr_announcer_udp * tau = announcer_udp_get (session); struct tau_tracker * tracker = tau_session_get_tracker (tau, request->url); struct tau_announce_request * r = tau_announce_request_new (request, response_func, user_data); tr_ptrArrayAppend (&tracker->announces, r); tau_tracker_upkeep (tracker); } void tr_tracker_udp_scrape (tr_session * session, const tr_scrape_request * request, tr_scrape_response_func response_func, void * user_data) { struct tr_announcer_udp * tau = announcer_udp_get (session); struct tau_tracker * tracker = tau_session_get_tracker (tau, request->url); struct tau_scrape_request * r = tau_scrape_request_new (request, response_func, user_data); tr_ptrArrayAppend (&tracker->scrapes, r); tau_tracker_upkeep (tracker); } transmission-2.92/libtransmission/PaxHeaders.4960/bandwidth.c0000644000000000000000000000013112641272401021204 xustar0030 mtime=1451586817.577878533 30 atime=1451586817.577878533 29 ctime=1457295919.93680683 transmission-2.92/libtransmission/bandwidth.c0000644000175000017500000002523412641272401022640 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: bandwidth.c 14644 2015-12-29 19:37:31Z mikedld $ */ #include #include /* memset () */ #include "transmission.h" #include "bandwidth.h" #include "crypto-utils.h" /* tr_rand_int_weak () */ #include "log.h" #include "peer-io.h" #include "utils.h" #define dbgmsg(...) \ do \ { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, NULL, __VA_ARGS__); \ } \ while (0) /*** **** ***/ static unsigned int getSpeed_Bps (const struct bratecontrol * r, unsigned int interval_msec, uint64_t now) { if (!now) now = tr_time_msec (); if (now != r->cache_time) { int i = r->newest; uint64_t bytes = 0; const uint64_t cutoff = now - interval_msec; struct bratecontrol * rvolatile = (struct bratecontrol*) r; for (;;) { if (r->transfers[i].date <= cutoff) break; bytes += r->transfers[i].size; if (--i == -1) i = HISTORY_SIZE - 1; /* circular history */ if (i == r->newest) break; /* we've come all the way around */ } rvolatile->cache_val = (unsigned int)((bytes * 1000u) / interval_msec); rvolatile->cache_time = now; } return r->cache_val; } static void bytesUsed (const uint64_t now, struct bratecontrol * r, size_t size) { if (r->transfers[r->newest].date + GRANULARITY_MSEC >= now) { r->transfers[r->newest].size += size; } else { if (++r->newest == HISTORY_SIZE) r->newest = 0; r->transfers[r->newest].date = now; r->transfers[r->newest].size = size; } /* invalidate cache_val*/ r->cache_time = 0; } /****** ******* ******* ******/ static int compareBandwidth (const void * va, const void * vb) { const tr_bandwidth * a = va; const tr_bandwidth * b = vb; return a->uniqueKey - b->uniqueKey; } /*** **** ***/ void tr_bandwidthConstruct (tr_bandwidth * b, tr_session * session, tr_bandwidth * parent) { static unsigned int uniqueKey = 0; b->session = session; b->children = TR_PTR_ARRAY_INIT; b->magicNumber = BANDWIDTH_MAGIC_NUMBER; b->uniqueKey = uniqueKey++; b->band[TR_UP].honorParentLimits = true; b->band[TR_DOWN].honorParentLimits = true; tr_bandwidthSetParent (b, parent); } void tr_bandwidthDestruct (tr_bandwidth * b) { assert (tr_isBandwidth (b)); tr_bandwidthSetParent (b, NULL); tr_ptrArrayDestruct (&b->children, NULL); memset (b, ~0, sizeof (tr_bandwidth)); } /*** **** ***/ void tr_bandwidthSetParent (tr_bandwidth * b, tr_bandwidth * parent) { assert (tr_isBandwidth (b)); assert (b != parent); if (b->parent) { assert (tr_isBandwidth (b->parent)); tr_ptrArrayRemoveSortedPointer (&b->parent->children, b, compareBandwidth); b->parent = NULL; } if (parent) { assert (tr_isBandwidth (parent)); assert (parent->parent != b); assert (tr_ptrArrayFindSorted (&parent->children, b, compareBandwidth) == NULL); tr_ptrArrayInsertSorted (&parent->children, b, compareBandwidth); assert (tr_ptrArrayFindSorted (&parent->children, b, compareBandwidth) == b); b->parent = parent; } } /*** **** ***/ static void allocateBandwidth (tr_bandwidth * b, tr_priority_t parent_priority, tr_direction dir, unsigned int period_msec, tr_ptrArray * peer_pool) { const tr_priority_t priority = MAX (parent_priority, b->priority); assert (tr_isBandwidth (b)); assert (tr_isDirection (dir)); /* set the available bandwidth */ if (b->band[dir].isLimited) { const uint64_t nextPulseSpeed = b->band[dir].desiredSpeed_Bps; b->band[dir].bytesLeft = nextPulseSpeed * period_msec / 1000u; } /* add this bandwidth's peer, if any, to the peer pool */ if (b->peer != NULL) { b->peer->priority = priority; tr_ptrArrayAppend (peer_pool, b->peer); } /* traverse & repeat for the subtree */ if (1) { int i; struct tr_bandwidth ** children = (struct tr_bandwidth**) tr_ptrArrayBase (&b->children); const int n = tr_ptrArraySize (&b->children); for (i=0; i 0) { const int i = tr_rand_int_weak (n); /* pick a peer at random */ /* value of 3000 bytes chosen so that when using uTP we'll send a full-size * frame right away and leave enough buffered data for the next frame to go * out in a timely manner. */ const size_t increment = 3000; const int bytesUsed = tr_peerIoFlush (peers[i], dir, increment); dbgmsg ("peer #%d of %d used %d bytes in this pass", i, n, bytesUsed); if (bytesUsed != (int)increment) { /* peer is done writing for now; move it to the end of the list */ tr_peerIo * pio = peers[i]; peers[i] = peers[n-1]; peers[n-1] = pio; --n; } } } void tr_bandwidthAllocate (tr_bandwidth * b, tr_direction dir, unsigned int period_msec) { int i, peerCount; tr_ptrArray tmp = TR_PTR_ARRAY_INIT; tr_ptrArray low = TR_PTR_ARRAY_INIT; tr_ptrArray high = TR_PTR_ARRAY_INIT; tr_ptrArray normal = TR_PTR_ARRAY_INIT; struct tr_peerIo ** peers; /* allocateBandwidth () is a helper function with two purposes: * 1. allocate bandwidth to b and its subtree * 2. accumulate an array of all the peerIos from b and its subtree. */ allocateBandwidth (b, TR_PRI_LOW, dir, period_msec, &tmp); peers = (struct tr_peerIo**) tr_ptrArrayBase (&tmp); peerCount = tr_ptrArraySize (&tmp); for (i=0; ipriority) { case TR_PRI_HIGH: tr_ptrArrayAppend (&high, io); /* fall through */ case TR_PRI_NORMAL: tr_ptrArrayAppend (&normal, io); /* fall through */ default: tr_ptrArrayAppend (&low, io); } } /* First phase of IO. Tries to distribute bandwidth fairly to keep faster * peers from starving the others. Loop through the peers, giving each a * small chunk of bandwidth. Keep looping until we run out of bandwidth * and/or peers that can use it */ phaseOne (&high, dir); phaseOne (&normal, dir); phaseOne (&low, dir); /* Second phase of IO. To help us scale in high bandwidth situations, * enable on-demand IO for peers with bandwidth left to burn. * This on-demand IO is enabled until (1) the peer runs out of bandwidth, * or (2) the next tr_bandwidthAllocate () call, when we start over again. */ for (i=0; ipeer = peer; } /*** **** ***/ static unsigned int bandwidthClamp (const tr_bandwidth * b, uint64_t now, tr_direction dir, unsigned int byteCount) { assert (tr_isBandwidth (b)); assert (tr_isDirection (dir)); if (b) { if (b->band[dir].isLimited) { byteCount = MIN (byteCount, b->band[dir].bytesLeft); /* if we're getting close to exceeding the speed limit, * clamp down harder on the bytes available */ if (byteCount > 0) { double current; double desired; double r; if (now == 0) now = tr_time_msec (); current = tr_bandwidthGetRawSpeed_Bps (b, now, TR_DOWN); desired = tr_bandwidthGetDesiredSpeed_Bps (b, TR_DOWN); r = desired >= 1 ? current / desired : 0; if (r > 1.0) byteCount = 0; else if (r > 0.9) byteCount *= 0.8; else if (r > 0.8) byteCount *= 0.9; } } if (b->parent && b->band[dir].honorParentLimits && (byteCount > 0)) byteCount = bandwidthClamp (b->parent, now, dir, byteCount); } return byteCount; } unsigned int tr_bandwidthClamp (const tr_bandwidth * b, tr_direction dir, unsigned int byteCount) { return bandwidthClamp (b, 0, dir, byteCount); } unsigned int tr_bandwidthGetRawSpeed_Bps (const tr_bandwidth * b, const uint64_t now, const tr_direction dir) { assert (tr_isBandwidth (b)); assert (tr_isDirection (dir)); return getSpeed_Bps (&b->band[dir].raw, HISTORY_MSEC, now); } unsigned int tr_bandwidthGetPieceSpeed_Bps (const tr_bandwidth * b, const uint64_t now, const tr_direction dir) { assert (tr_isBandwidth (b)); assert (tr_isDirection (dir)); return getSpeed_Bps (&b->band[dir].piece, HISTORY_MSEC, now); } void tr_bandwidthUsed (tr_bandwidth * b, tr_direction dir, size_t byteCount, bool isPieceData, uint64_t now) { struct tr_band * band; assert (tr_isBandwidth (b)); assert (tr_isDirection (dir)); band = &b->band[dir]; if (band->isLimited && isPieceData) band->bytesLeft -= MIN (band->bytesLeft, byteCount); #ifdef DEBUG_DIRECTION if ((dir == DEBUG_DIRECTION) && (band->isLimited)) fprintf (stderr, "%p consumed %5zu bytes of %5s data... was %6zu, now %6zu left\n", b, byteCount, (isPieceData?"piece":"raw"), oldBytesLeft, band->bytesLeft); #endif bytesUsed (now, &band->raw, byteCount); if (isPieceData) bytesUsed (now, &band->piece, byteCount); if (b->parent != NULL) tr_bandwidthUsed (b->parent, dir, byteCount, isPieceData, now); } transmission-2.92/libtransmission/PaxHeaders.4960/session.c0000644000000000000000000000013212644245522020733 xustar0030 mtime=1452362578.743698889 30 atime=1452362578.743698889 30 ctime=1457295920.135810214 transmission-2.92/libtransmission/session.c0000644000175000017500000023156612644245522022375 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: session.c 14666 2016-01-07 19:20:14Z mikedld $ */ #include #include /* ENOENT */ #include /* INT_MAX */ #include #include /* memcpy */ #include #ifndef _WIN32 #include /* umask () */ #include /* umask () */ #endif #include /* evdns_base_free () */ #include #include //#define TR_SHOW_DEPRECATED #include "transmission.h" #include "announcer.h" #include "bandwidth.h" #include "blocklist.h" #include "cache.h" #include "crypto-utils.h" #include "error.h" #include "error-types.h" #include "fdlimit.h" #include "file.h" #include "list.h" #include "log.h" #include "net.h" #include "peer-io.h" #include "peer-mgr.h" #include "platform.h" /* tr_lock, tr_getTorrentDir () */ #include "platform-quota.h" /* tr_device_info_free() */ #include "port-forwarding.h" #include "rpc-server.h" #include "session.h" #include "stats.h" #include "torrent.h" #include "tr-dht.h" /* tr_dhtUpkeep () */ #include "tr-udp.h" #include "tr-utp.h" #include "tr-lpd.h" #include "trevent.h" #include "utils.h" #include "variant.h" #include "verify.h" #include "version.h" #include "web.h" enum { #ifdef TR_LIGHTWEIGHT DEFAULT_CACHE_SIZE_MB = 2, DEFAULT_PREFETCH_ENABLED = false, #else DEFAULT_CACHE_SIZE_MB = 4, DEFAULT_PREFETCH_ENABLED = true, #endif SAVE_INTERVAL_SECS = 360 }; #define dbgmsg(...) \ do \ { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, NULL, __VA_ARGS__); \ } \ while (0) static tr_port getRandomPort (tr_session * s) { return tr_rand_int_weak (s->randomPortHigh - s->randomPortLow + 1) + s->randomPortLow; } /* Generate a peer id : "-TRxyzb-" + 12 random alphanumeric characters, where x is the major version number, y is the minor version number, z is the maintenance number, and b designates beta (Azureus-style) */ void tr_peerIdInit (uint8_t * buf) { int i; int val; int total = 0; const char * pool = "0123456789abcdefghijklmnopqrstuvwxyz"; const int base = 36; memcpy (buf, PEERID_PREFIX, 8); tr_rand_buffer (buf+8, 11); for (i=8; i<19; ++i) { val = buf[i] % base; total += val; buf[i] = pool[val]; } val = total % base ? base - (total % base) : 0; buf[19] = pool[val]; buf[20] = '\0'; } /*** **** ***/ tr_encryption_mode tr_sessionGetEncryption (tr_session * session) { assert (session); return session->encryptionMode; } void tr_sessionSetEncryption (tr_session * session, tr_encryption_mode mode) { assert (session); assert (mode == TR_ENCRYPTION_PREFERRED || mode == TR_ENCRYPTION_REQUIRED || mode == TR_CLEAR_PREFERRED); session->encryptionMode = mode; } /*** **** ***/ struct tr_bindinfo { tr_socket_t socket; tr_address addr; struct event * ev; }; static void close_bindinfo (struct tr_bindinfo * b) { if ((b != NULL) && (b->socket != TR_BAD_SOCKET)) { event_free (b->ev); b->ev = NULL; tr_netCloseSocket (b->socket); } } static void close_incoming_peer_port (tr_session * session) { close_bindinfo (session->public_ipv4); close_bindinfo (session->public_ipv6); } static void free_incoming_peer_port (tr_session * session) { close_bindinfo (session->public_ipv4); tr_free (session->public_ipv4); session->public_ipv4 = NULL; close_bindinfo (session->public_ipv6); tr_free (session->public_ipv6); session->public_ipv6 = NULL; } static void accept_incoming_peer (evutil_socket_t fd, short what UNUSED, void * vsession) { tr_socket_t clientSocket; tr_port clientPort; tr_address clientAddr; tr_session * session = vsession; clientSocket = tr_netAccept (session, fd, &clientAddr, &clientPort); if (clientSocket != TR_BAD_SOCKET) { tr_logAddDeep (__FILE__, __LINE__, NULL, "new incoming connection %"TR_PRI_SOCK" (%s)", clientSocket, tr_peerIoAddrStr (&clientAddr, clientPort)); tr_peerMgrAddIncoming (session->peerMgr, &clientAddr, clientPort, clientSocket, NULL); } } static void open_incoming_peer_port (tr_session * session) { struct tr_bindinfo * b; /* bind an ipv4 port to listen for incoming peers... */ b = session->public_ipv4; b->socket = tr_netBindTCP (&b->addr, session->private_peer_port, false); if (b->socket != TR_BAD_SOCKET) { b->ev = event_new (session->event_base, b->socket, EV_READ | EV_PERSIST, accept_incoming_peer, session); event_add (b->ev, NULL); } /* and do the exact same thing for ipv6, if it's supported... */ if (tr_net_hasIPv6 (session->private_peer_port)) { b = session->public_ipv6; b->socket = tr_netBindTCP (&b->addr, session->private_peer_port, false); if (b->socket != TR_BAD_SOCKET) { b->ev = event_new (session->event_base, b->socket, EV_READ | EV_PERSIST, accept_incoming_peer, session); event_add (b->ev, NULL); } } } const tr_address* tr_sessionGetPublicAddress (const tr_session * session, int tr_af_type, bool * is_default_value) { const char * default_value; const struct tr_bindinfo * bindinfo; switch (tr_af_type) { case TR_AF_INET: bindinfo = session->public_ipv4; default_value = TR_DEFAULT_BIND_ADDRESS_IPV4; break; case TR_AF_INET6: bindinfo = session->public_ipv6; default_value = TR_DEFAULT_BIND_ADDRESS_IPV6; break; default: bindinfo = NULL; default_value = ""; break; } if (is_default_value && bindinfo) *is_default_value = !tr_strcmp0 (default_value, tr_address_to_string (&bindinfo->addr)); return bindinfo ? &bindinfo->addr : NULL; } /*** **** ***/ #ifdef TR_LIGHTWEIGHT #define TR_DEFAULT_ENCRYPTION TR_CLEAR_PREFERRED #else #define TR_DEFAULT_ENCRYPTION TR_ENCRYPTION_PREFERRED #endif static int parse_tos (const char *str) { char *p; int value; if (!evutil_ascii_strcasecmp (str, "")) return 0; if (!evutil_ascii_strcasecmp (str, "default")) return 0; if (!evutil_ascii_strcasecmp (str, "lowcost")) return 0x10; if (!evutil_ascii_strcasecmp (str, "mincost")) return 0x10; if (!evutil_ascii_strcasecmp (str, "throughput")) return 0x08; if (!evutil_ascii_strcasecmp (str, "reliability")) return 0x04; if (!evutil_ascii_strcasecmp (str, "lowdelay")) return 0x02; value = strtol (str, &p, 0); if (!p || (p == str)) return 0; return value; } static const char * format_tos (int value) { static char buf[8]; switch (value) { case 0: return "default"; case 0x10: return "lowcost"; case 0x08: return "throughput"; case 0x04: return "reliability"; case 0x02: return "lowdelay"; default: tr_snprintf (buf, 8, "%d", value); return buf; } } void tr_sessionGetDefaultSettings (tr_variant * d) { assert (tr_variantIsDict (d)); tr_variantDictReserve (d, 63); tr_variantDictAddBool (d, TR_KEY_blocklist_enabled, false); tr_variantDictAddStr (d, TR_KEY_blocklist_url, "http://www.example.com/blocklist"); tr_variantDictAddInt (d, TR_KEY_cache_size_mb, DEFAULT_CACHE_SIZE_MB); tr_variantDictAddBool (d, TR_KEY_dht_enabled, true); tr_variantDictAddBool (d, TR_KEY_utp_enabled, true); tr_variantDictAddBool (d, TR_KEY_lpd_enabled, false); tr_variantDictAddStr (d, TR_KEY_download_dir, tr_getDefaultDownloadDir ()); tr_variantDictAddInt (d, TR_KEY_speed_limit_down, 100); tr_variantDictAddBool (d, TR_KEY_speed_limit_down_enabled, false); tr_variantDictAddInt (d, TR_KEY_encryption, TR_DEFAULT_ENCRYPTION); tr_variantDictAddInt (d, TR_KEY_idle_seeding_limit, 30); tr_variantDictAddBool (d, TR_KEY_idle_seeding_limit_enabled, false); tr_variantDictAddStr (d, TR_KEY_incomplete_dir, tr_getDefaultDownloadDir ()); tr_variantDictAddBool (d, TR_KEY_incomplete_dir_enabled, false); tr_variantDictAddInt (d, TR_KEY_message_level, TR_LOG_INFO); tr_variantDictAddInt (d, TR_KEY_download_queue_size, 5); tr_variantDictAddBool (d, TR_KEY_download_queue_enabled, true); tr_variantDictAddInt (d, TR_KEY_peer_limit_global, atoi (TR_DEFAULT_PEER_LIMIT_GLOBAL_STR)); tr_variantDictAddInt (d, TR_KEY_peer_limit_per_torrent, atoi (TR_DEFAULT_PEER_LIMIT_TORRENT_STR)); tr_variantDictAddInt (d, TR_KEY_peer_port, atoi (TR_DEFAULT_PEER_PORT_STR)); tr_variantDictAddBool (d, TR_KEY_peer_port_random_on_start, false); tr_variantDictAddInt (d, TR_KEY_peer_port_random_low, 49152); tr_variantDictAddInt (d, TR_KEY_peer_port_random_high, 65535); tr_variantDictAddStr (d, TR_KEY_peer_socket_tos, TR_DEFAULT_PEER_SOCKET_TOS_STR); tr_variantDictAddBool (d, TR_KEY_pex_enabled, true); tr_variantDictAddBool (d, TR_KEY_port_forwarding_enabled, true); tr_variantDictAddInt (d, TR_KEY_preallocation, TR_PREALLOCATE_SPARSE); tr_variantDictAddBool (d, TR_KEY_prefetch_enabled, DEFAULT_PREFETCH_ENABLED); tr_variantDictAddInt (d, TR_KEY_peer_id_ttl_hours, 6); tr_variantDictAddBool (d, TR_KEY_queue_stalled_enabled, true); tr_variantDictAddInt (d, TR_KEY_queue_stalled_minutes, 30); tr_variantDictAddReal (d, TR_KEY_ratio_limit, 2.0); tr_variantDictAddBool (d, TR_KEY_ratio_limit_enabled, false); tr_variantDictAddBool (d, TR_KEY_rename_partial_files, true); tr_variantDictAddBool (d, TR_KEY_rpc_authentication_required, false); tr_variantDictAddStr (d, TR_KEY_rpc_bind_address, "0.0.0.0"); tr_variantDictAddBool (d, TR_KEY_rpc_enabled, false); tr_variantDictAddStr (d, TR_KEY_rpc_password, ""); tr_variantDictAddStr (d, TR_KEY_rpc_username, ""); tr_variantDictAddStr (d, TR_KEY_rpc_whitelist, TR_DEFAULT_RPC_WHITELIST); tr_variantDictAddBool (d, TR_KEY_rpc_whitelist_enabled, true); tr_variantDictAddInt (d, TR_KEY_rpc_port, atoi (TR_DEFAULT_RPC_PORT_STR)); tr_variantDictAddStr (d, TR_KEY_rpc_url, TR_DEFAULT_RPC_URL_STR); tr_variantDictAddBool (d, TR_KEY_scrape_paused_torrents_enabled, true); tr_variantDictAddStr (d, TR_KEY_script_torrent_done_filename, ""); tr_variantDictAddBool (d, TR_KEY_script_torrent_done_enabled, false); tr_variantDictAddInt (d, TR_KEY_seed_queue_size, 10); tr_variantDictAddBool (d, TR_KEY_seed_queue_enabled, false); tr_variantDictAddBool (d, TR_KEY_alt_speed_enabled, false); tr_variantDictAddInt (d, TR_KEY_alt_speed_up, 50); /* half the regular */ tr_variantDictAddInt (d, TR_KEY_alt_speed_down, 50); /* half the regular */ tr_variantDictAddInt (d, TR_KEY_alt_speed_time_begin, 540); /* 9am */ tr_variantDictAddBool (d, TR_KEY_alt_speed_time_enabled, false); tr_variantDictAddInt (d, TR_KEY_alt_speed_time_end, 1020); /* 5pm */ tr_variantDictAddInt (d, TR_KEY_alt_speed_time_day, TR_SCHED_ALL); tr_variantDictAddInt (d, TR_KEY_speed_limit_up, 100); tr_variantDictAddBool (d, TR_KEY_speed_limit_up_enabled, false); tr_variantDictAddInt (d, TR_KEY_umask, 022); tr_variantDictAddInt (d, TR_KEY_upload_slots_per_torrent, 14); tr_variantDictAddStr (d, TR_KEY_bind_address_ipv4, TR_DEFAULT_BIND_ADDRESS_IPV4); tr_variantDictAddStr (d, TR_KEY_bind_address_ipv6, TR_DEFAULT_BIND_ADDRESS_IPV6); tr_variantDictAddBool (d, TR_KEY_start_added_torrents, true); tr_variantDictAddBool (d, TR_KEY_trash_original_torrent_files, false); } void tr_sessionGetSettings (tr_session * s, tr_variant * d) { assert (tr_variantIsDict (d)); tr_variantDictReserve (d, 63); tr_variantDictAddBool (d, TR_KEY_blocklist_enabled, tr_blocklistIsEnabled (s)); tr_variantDictAddStr (d, TR_KEY_blocklist_url, tr_blocklistGetURL (s)); tr_variantDictAddInt (d, TR_KEY_cache_size_mb, tr_sessionGetCacheLimit_MB (s)); tr_variantDictAddBool (d, TR_KEY_dht_enabled, s->isDHTEnabled); tr_variantDictAddBool (d, TR_KEY_utp_enabled, s->isUTPEnabled); tr_variantDictAddBool (d, TR_KEY_lpd_enabled, s->isLPDEnabled); tr_variantDictAddStr (d, TR_KEY_download_dir, tr_sessionGetDownloadDir (s)); tr_variantDictAddInt (d, TR_KEY_download_queue_size, tr_sessionGetQueueSize (s, TR_DOWN)); tr_variantDictAddBool (d, TR_KEY_download_queue_enabled, tr_sessionGetQueueEnabled (s, TR_DOWN)); tr_variantDictAddInt (d, TR_KEY_speed_limit_down, tr_sessionGetSpeedLimit_KBps (s, TR_DOWN)); tr_variantDictAddBool (d, TR_KEY_speed_limit_down_enabled, tr_sessionIsSpeedLimited (s, TR_DOWN)); tr_variantDictAddInt (d, TR_KEY_encryption, s->encryptionMode); tr_variantDictAddInt (d, TR_KEY_idle_seeding_limit, tr_sessionGetIdleLimit (s)); tr_variantDictAddBool (d, TR_KEY_idle_seeding_limit_enabled, tr_sessionIsIdleLimited (s)); tr_variantDictAddStr (d, TR_KEY_incomplete_dir, tr_sessionGetIncompleteDir (s)); tr_variantDictAddBool (d, TR_KEY_incomplete_dir_enabled, tr_sessionIsIncompleteDirEnabled (s)); tr_variantDictAddInt (d, TR_KEY_message_level, tr_logGetLevel ()); tr_variantDictAddInt (d, TR_KEY_peer_limit_global, s->peerLimit); tr_variantDictAddInt (d, TR_KEY_peer_limit_per_torrent, s->peerLimitPerTorrent); tr_variantDictAddInt (d, TR_KEY_peer_port, tr_sessionGetPeerPort (s)); tr_variantDictAddBool (d, TR_KEY_peer_port_random_on_start, s->isPortRandom); tr_variantDictAddInt (d, TR_KEY_peer_port_random_low, s->randomPortLow); tr_variantDictAddInt (d, TR_KEY_peer_port_random_high, s->randomPortHigh); tr_variantDictAddStr (d, TR_KEY_peer_socket_tos, format_tos (s->peerSocketTOS)); tr_variantDictAddStr (d, TR_KEY_peer_congestion_algorithm, s->peer_congestion_algorithm); tr_variantDictAddBool (d, TR_KEY_pex_enabled, s->isPexEnabled); tr_variantDictAddBool (d, TR_KEY_port_forwarding_enabled, tr_sessionIsPortForwardingEnabled (s)); tr_variantDictAddInt (d, TR_KEY_preallocation, s->preallocationMode); tr_variantDictAddBool (d, TR_KEY_prefetch_enabled, s->isPrefetchEnabled); tr_variantDictAddInt (d, TR_KEY_peer_id_ttl_hours, s->peer_id_ttl_hours); tr_variantDictAddBool (d, TR_KEY_queue_stalled_enabled, tr_sessionGetQueueStalledEnabled (s)); tr_variantDictAddInt (d, TR_KEY_queue_stalled_minutes, tr_sessionGetQueueStalledMinutes (s)); tr_variantDictAddReal (d, TR_KEY_ratio_limit, s->desiredRatio); tr_variantDictAddBool (d, TR_KEY_ratio_limit_enabled, s->isRatioLimited); tr_variantDictAddBool (d, TR_KEY_rename_partial_files, tr_sessionIsIncompleteFileNamingEnabled (s)); tr_variantDictAddBool (d, TR_KEY_rpc_authentication_required, tr_sessionIsRPCPasswordEnabled (s)); tr_variantDictAddStr (d, TR_KEY_rpc_bind_address, tr_sessionGetRPCBindAddress (s)); tr_variantDictAddBool (d, TR_KEY_rpc_enabled, tr_sessionIsRPCEnabled (s)); tr_variantDictAddStr (d, TR_KEY_rpc_password, tr_sessionGetRPCPassword (s)); tr_variantDictAddInt (d, TR_KEY_rpc_port, tr_sessionGetRPCPort (s)); tr_variantDictAddStr (d, TR_KEY_rpc_url, tr_sessionGetRPCUrl (s)); tr_variantDictAddStr (d, TR_KEY_rpc_username, tr_sessionGetRPCUsername (s)); tr_variantDictAddStr (d, TR_KEY_rpc_whitelist, tr_sessionGetRPCWhitelist (s)); tr_variantDictAddBool (d, TR_KEY_rpc_whitelist_enabled, tr_sessionGetRPCWhitelistEnabled (s)); tr_variantDictAddBool (d, TR_KEY_scrape_paused_torrents_enabled, s->scrapePausedTorrents); tr_variantDictAddBool (d, TR_KEY_script_torrent_done_enabled, tr_sessionIsTorrentDoneScriptEnabled (s)); tr_variantDictAddStr (d, TR_KEY_script_torrent_done_filename, tr_sessionGetTorrentDoneScript (s)); tr_variantDictAddInt (d, TR_KEY_seed_queue_size, tr_sessionGetQueueSize (s, TR_UP)); tr_variantDictAddBool (d, TR_KEY_seed_queue_enabled, tr_sessionGetQueueEnabled (s, TR_UP)); tr_variantDictAddBool (d, TR_KEY_alt_speed_enabled, tr_sessionUsesAltSpeed (s)); tr_variantDictAddInt (d, TR_KEY_alt_speed_up, tr_sessionGetAltSpeed_KBps (s, TR_UP)); tr_variantDictAddInt (d, TR_KEY_alt_speed_down, tr_sessionGetAltSpeed_KBps (s, TR_DOWN)); tr_variantDictAddInt (d, TR_KEY_alt_speed_time_begin, tr_sessionGetAltSpeedBegin (s)); tr_variantDictAddBool (d, TR_KEY_alt_speed_time_enabled, tr_sessionUsesAltSpeedTime (s)); tr_variantDictAddInt (d, TR_KEY_alt_speed_time_end, tr_sessionGetAltSpeedEnd (s)); tr_variantDictAddInt (d, TR_KEY_alt_speed_time_day, tr_sessionGetAltSpeedDay (s)); tr_variantDictAddInt (d, TR_KEY_speed_limit_up, tr_sessionGetSpeedLimit_KBps (s, TR_UP)); tr_variantDictAddBool (d, TR_KEY_speed_limit_up_enabled, tr_sessionIsSpeedLimited (s, TR_UP)); tr_variantDictAddInt (d, TR_KEY_umask, s->umask); tr_variantDictAddInt (d, TR_KEY_upload_slots_per_torrent, s->uploadSlotsPerTorrent); tr_variantDictAddStr (d, TR_KEY_bind_address_ipv4, tr_address_to_string (&s->public_ipv4->addr)); tr_variantDictAddStr (d, TR_KEY_bind_address_ipv6, tr_address_to_string (&s->public_ipv6->addr)); tr_variantDictAddBool (d, TR_KEY_start_added_torrents, !tr_sessionGetPaused (s)); tr_variantDictAddBool (d, TR_KEY_trash_original_torrent_files, tr_sessionGetDeleteSource (s)); } bool tr_sessionLoadSettings (tr_variant * dict, const char * configDir, const char * appName) { char * filename; tr_variant oldDict; tr_variant fileSettings; bool success; tr_error * error = NULL; assert (tr_variantIsDict (dict)); /* initializing the defaults: caller may have passed in some app-level defaults. * preserve those and use the session defaults to fill in any missing gaps. */ oldDict = *dict; tr_variantInitDict (dict, 0); tr_sessionGetDefaultSettings (dict); tr_variantMergeDicts (dict, &oldDict); tr_variantFree (&oldDict); /* if caller didn't specify a config dir, use the default */ if (!configDir || !*configDir) configDir = tr_getDefaultConfigDir (appName); /* file settings override the defaults */ filename = tr_buildPath (configDir, "settings.json", NULL); if (tr_variantFromFile (&fileSettings, TR_VARIANT_FMT_JSON, filename, &error)) { tr_variantMergeDicts (dict, &fileSettings); tr_variantFree (&fileSettings); success = true; } else { success = TR_ERROR_IS_ENOENT (error->code); tr_error_free (error); } /* cleanup */ tr_free (filename); return success; } void tr_sessionSaveSettings (tr_session * session, const char * configDir, const tr_variant * clientSettings) { tr_variant settings; char * filename = tr_buildPath (configDir, "settings.json", NULL); assert (tr_variantIsDict (clientSettings)); tr_variantInitDict (&settings, 0); /* the existing file settings are the fallback values */ { tr_variant fileSettings; if (tr_variantFromFile (&fileSettings, TR_VARIANT_FMT_JSON, filename, NULL)) { tr_variantMergeDicts (&settings, &fileSettings); tr_variantFree (&fileSettings); } } /* the client's settings override the file settings */ tr_variantMergeDicts (&settings, clientSettings); /* the session's true values override the file & client settings */ { tr_variant sessionSettings; tr_variantInitDict (&sessionSettings, 0); tr_sessionGetSettings (session, &sessionSettings); tr_variantMergeDicts (&settings, &sessionSettings); tr_variantFree (&sessionSettings); } /* save the result */ tr_variantToFile (&settings, TR_VARIANT_FMT_JSON, filename); /* cleanup */ tr_free (filename); tr_variantFree (&settings); } /*** **** ***/ /** * Periodically save the .resume files of any torrents whose * status has recently changed. This prevents loss of metadata * in the case of a crash, unclean shutdown, clumsy user, etc. */ static void onSaveTimer (evutil_socket_t foo UNUSED, short bar UNUSED, void * vsession) { tr_torrent * tor = NULL; tr_session * session = vsession; if (tr_cacheFlushDone (session->cache)) tr_logAddError ("Error while flushing completed pieces from cache"); while ((tor = tr_torrentNext (session, tor))) tr_torrentSave (tor); tr_statsSaveDirty (session); tr_timerAdd (session->saveTimer, SAVE_INTERVAL_SECS, 0); } /*** **** ***/ static void tr_sessionInitImpl (void *); struct init_data { bool done; bool messageQueuingEnabled; tr_session * session; const char * configDir; tr_variant * clientSettings; }; tr_session * tr_sessionInit (const char * configDir, bool messageQueuingEnabled, tr_variant * clientSettings) { int64_t i; tr_session * session; struct init_data data; assert (tr_variantIsDict (clientSettings)); tr_timeUpdate (time (NULL)); /* initialize the bare skeleton of the session object */ session = tr_new0 (tr_session, 1); session->udp_socket = TR_BAD_SOCKET; session->udp6_socket = TR_BAD_SOCKET; session->lock = tr_lockNew (); session->cache = tr_cacheNew (1024*1024*2); session->magicNumber = SESSION_MAGIC_NUMBER; tr_bandwidthConstruct (&session->bandwidth, session, NULL); tr_variantInitList (&session->removedTorrents, 0); /* nice to start logging at the very beginning */ if (tr_variantDictFindInt (clientSettings, TR_KEY_message_level, &i)) tr_logSetLevel (i); /* start the libtransmission thread */ tr_net_init (); /* must go before tr_eventInit */ tr_eventInit (session); assert (session->events != NULL); /* run the rest in the libtransmission thread */ data.done = false; data.session = session; data.configDir = configDir; data.messageQueuingEnabled = messageQueuingEnabled; data.clientSettings = clientSettings; tr_runInEventThread (session, tr_sessionInitImpl, &data); while (!data.done) tr_wait_msec (50); return session; } static void turtleCheckClock (tr_session * s, struct tr_turtle_info * t); static void onNowTimer (evutil_socket_t foo UNUSED, short bar UNUSED, void * vsession) { int usec; const int min = 100; const int max = 999999; struct timeval tv; tr_torrent * tor = NULL; tr_session * session = vsession; const time_t now = time (NULL); assert (tr_isSession (session)); assert (session->nowTimer != NULL); /** *** tr_session things to do once per second **/ tr_timeUpdate (now); tr_dhtUpkeep (session); if (session->turtle.isClockEnabled) turtleCheckClock (session, &session->turtle); while ((tor = tr_torrentNext (session, tor))) { if (tor->isRunning) { if (tr_torrentIsSeed (tor)) ++tor->secondsSeeding; else ++tor->secondsDownloading; } } /** *** Set the timer **/ /* schedule the next timer for right after the next second begins */ tr_gettimeofday (&tv); usec = 1000000 - tv.tv_usec; if (usec > max) usec = max; if (usec < min) usec = min; tr_timerAdd (session->nowTimer, 0, usec); /* fprintf (stderr, "time %zu sec, %zu microsec\n", (size_t)tr_time (), (size_t)tv.tv_usec); */ } static void loadBlocklists (tr_session * session); static void tr_sessionInitImpl (void * vdata) { tr_variant settings; struct init_data * data = vdata; tr_variant * clientSettings = data->clientSettings; tr_session * session = data->session; assert (tr_amInEventThread (session)); assert (tr_variantIsDict (clientSettings)); dbgmsg ("tr_sessionInit: the session's top-level bandwidth object is %p", (void*)&session->bandwidth); tr_variantInitDict (&settings, 0); tr_sessionGetDefaultSettings (&settings); tr_variantMergeDicts (&settings, clientSettings); assert (session->event_base != NULL); session->nowTimer = evtimer_new (session->event_base, onNowTimer, session); onNowTimer (0, 0, session); #ifndef _WIN32 /* Don't exit when writing on a broken socket */ signal (SIGPIPE, SIG_IGN); #endif tr_logSetQueueEnabled (data->messageQueuingEnabled); tr_setConfigDir (session, data->configDir); session->peerMgr = tr_peerMgrNew (session); session->shared = tr_sharedInit (session); /** *** Blocklist **/ { char * filename = tr_buildPath (session->configDir, "blocklists", NULL); tr_sys_dir_create (filename, TR_SYS_DIR_CREATE_PARENTS, 0777, NULL); tr_free (filename); loadBlocklists (session); } assert (tr_isSession (session)); session->saveTimer = evtimer_new (session->event_base, onSaveTimer, session); tr_timerAdd (session->saveTimer, SAVE_INTERVAL_SECS, 0); tr_announcerInit (session); /* first %s is the application name second %s is the version number */ tr_logAddInfo (_("%s %s started"), TR_NAME, LONG_VERSION_STRING); tr_statsInit (session); tr_sessionSet (session, &settings); tr_udpInit (session); if (session->isLPDEnabled) tr_lpdInit (session, &session->public_ipv4->addr); /* cleanup */ tr_variantFree (&settings); data->done = true; } static void turtleBootstrap (tr_session *, struct tr_turtle_info *); static void setPeerPort (tr_session * session, tr_port port); static void sessionSetImpl (void * vdata) { int64_t i; double d; bool boolVal; const char * str; struct tr_bindinfo b; struct init_data * data = vdata; tr_session * session = data->session; tr_variant * settings = data->clientSettings; struct tr_turtle_info * turtle = &session->turtle; assert (tr_isSession (session)); assert (tr_variantIsDict (settings)); assert (tr_amInEventThread (session)); if (tr_variantDictFindInt (settings, TR_KEY_message_level, &i)) tr_logSetLevel (i); #ifndef _WIN32 if (tr_variantDictFindInt (settings, TR_KEY_umask, &i)) { session->umask = (mode_t)i; umask (session->umask); } #endif /* misc features */ if (tr_variantDictFindInt (settings, TR_KEY_cache_size_mb, &i)) tr_sessionSetCacheLimit_MB (session, i); if (tr_variantDictFindInt (settings, TR_KEY_peer_limit_per_torrent, &i)) tr_sessionSetPeerLimitPerTorrent (session, i); if (tr_variantDictFindBool (settings, TR_KEY_pex_enabled, &boolVal)) tr_sessionSetPexEnabled (session, boolVal); if (tr_variantDictFindBool (settings, TR_KEY_dht_enabled, &boolVal)) tr_sessionSetDHTEnabled (session, boolVal); if (tr_variantDictFindBool (settings, TR_KEY_utp_enabled, &boolVal)) tr_sessionSetUTPEnabled (session, boolVal); if (tr_variantDictFindBool (settings, TR_KEY_lpd_enabled, &boolVal)) tr_sessionSetLPDEnabled (session, boolVal); if (tr_variantDictFindInt (settings, TR_KEY_encryption, &i)) tr_sessionSetEncryption (session, i); if (tr_variantDictFindStr (settings, TR_KEY_peer_socket_tos, &str, NULL)) session->peerSocketTOS = parse_tos (str); if (tr_variantDictFindStr (settings, TR_KEY_peer_congestion_algorithm, &str, NULL)) session->peer_congestion_algorithm = tr_strdup (str); else session->peer_congestion_algorithm = tr_strdup (""); if (tr_variantDictFindBool (settings, TR_KEY_blocklist_enabled, &boolVal)) tr_blocklistSetEnabled (session, boolVal); if (tr_variantDictFindStr (settings, TR_KEY_blocklist_url, &str, NULL)) tr_blocklistSetURL (session, str); if (tr_variantDictFindBool (settings, TR_KEY_start_added_torrents, &boolVal)) tr_sessionSetPaused (session, !boolVal); if (tr_variantDictFindBool (settings, TR_KEY_trash_original_torrent_files, &boolVal)) tr_sessionSetDeleteSource (session, boolVal); if (tr_variantDictFindInt (settings, TR_KEY_peer_id_ttl_hours, &i)) session->peer_id_ttl_hours = i; /* torrent queues */ if (tr_variantDictFindInt (settings, TR_KEY_queue_stalled_minutes, &i)) tr_sessionSetQueueStalledMinutes (session, i); if (tr_variantDictFindBool (settings, TR_KEY_queue_stalled_enabled, &boolVal)) tr_sessionSetQueueStalledEnabled (session, boolVal); if (tr_variantDictFindInt (settings, TR_KEY_download_queue_size, &i)) tr_sessionSetQueueSize (session, TR_DOWN, i); if (tr_variantDictFindBool (settings, TR_KEY_download_queue_enabled, &boolVal)) tr_sessionSetQueueEnabled (session, TR_DOWN, boolVal); if (tr_variantDictFindInt (settings, TR_KEY_seed_queue_size, &i)) tr_sessionSetQueueSize (session, TR_UP, i); if (tr_variantDictFindBool (settings, TR_KEY_seed_queue_enabled, &boolVal)) tr_sessionSetQueueEnabled (session, TR_UP, boolVal); /* files and directories */ if (tr_variantDictFindBool (settings, TR_KEY_prefetch_enabled, &boolVal)) session->isPrefetchEnabled = boolVal; if (tr_variantDictFindInt (settings, TR_KEY_preallocation, &i)) session->preallocationMode = i; if (tr_variantDictFindStr (settings, TR_KEY_download_dir, &str, NULL)) tr_sessionSetDownloadDir (session, str); if (tr_variantDictFindStr (settings, TR_KEY_incomplete_dir, &str, NULL)) tr_sessionSetIncompleteDir (session, str); if (tr_variantDictFindBool (settings, TR_KEY_incomplete_dir_enabled, &boolVal)) tr_sessionSetIncompleteDirEnabled (session, boolVal); if (tr_variantDictFindBool (settings, TR_KEY_rename_partial_files, &boolVal)) tr_sessionSetIncompleteFileNamingEnabled (session, boolVal); /* rpc server */ if (session->rpcServer != NULL) /* close the old one */ tr_rpcClose (&session->rpcServer); session->rpcServer = tr_rpcInit (session, settings); /* public addresses */ free_incoming_peer_port (session); tr_variantDictFindStr (settings, TR_KEY_bind_address_ipv4, &str, NULL); if (!tr_address_from_string (&b.addr, str) || (b.addr.type != TR_AF_INET)) b.addr = tr_inaddr_any; b.socket = TR_BAD_SOCKET; session->public_ipv4 = tr_memdup (&b, sizeof (struct tr_bindinfo)); tr_variantDictFindStr (settings, TR_KEY_bind_address_ipv6, &str, NULL); if (!tr_address_from_string (&b.addr, str) || (b.addr.type != TR_AF_INET6)) b.addr = tr_in6addr_any; b.socket = TR_BAD_SOCKET; session->public_ipv6 = tr_memdup (&b, sizeof (struct tr_bindinfo)); /* incoming peer port */ if (tr_variantDictFindInt (settings, TR_KEY_peer_port_random_low, &i)) session->randomPortLow = i; if (tr_variantDictFindInt (settings, TR_KEY_peer_port_random_high, &i)) session->randomPortHigh = i; if (tr_variantDictFindBool (settings, TR_KEY_peer_port_random_on_start, &boolVal)) tr_sessionSetPeerPortRandomOnStart (session, boolVal); if (!tr_variantDictFindInt (settings, TR_KEY_peer_port, &i)) i = session->private_peer_port; setPeerPort (session, boolVal ? getRandomPort (session) : i); if (tr_variantDictFindBool (settings, TR_KEY_port_forwarding_enabled, &boolVal)) tr_sessionSetPortForwardingEnabled (session, boolVal); if (tr_variantDictFindInt (settings, TR_KEY_peer_limit_global, &i)) session->peerLimit = i; /** **/ if (tr_variantDictFindInt (settings, TR_KEY_upload_slots_per_torrent, &i)) session->uploadSlotsPerTorrent = i; if (tr_variantDictFindInt (settings, TR_KEY_speed_limit_up, &i)) tr_sessionSetSpeedLimit_KBps (session, TR_UP, i); if (tr_variantDictFindBool (settings, TR_KEY_speed_limit_up_enabled, &boolVal)) tr_sessionLimitSpeed (session, TR_UP, boolVal); if (tr_variantDictFindInt (settings, TR_KEY_speed_limit_down, &i)) tr_sessionSetSpeedLimit_KBps (session, TR_DOWN, i); if (tr_variantDictFindBool (settings, TR_KEY_speed_limit_down_enabled, &boolVal)) tr_sessionLimitSpeed (session, TR_DOWN, boolVal); if (tr_variantDictFindReal (settings, TR_KEY_ratio_limit, &d)) tr_sessionSetRatioLimit (session, d); if (tr_variantDictFindBool (settings, TR_KEY_ratio_limit_enabled, &boolVal)) tr_sessionSetRatioLimited (session, boolVal); if (tr_variantDictFindInt (settings, TR_KEY_idle_seeding_limit, &i)) tr_sessionSetIdleLimit (session, i); if (tr_variantDictFindBool (settings, TR_KEY_idle_seeding_limit_enabled, &boolVal)) tr_sessionSetIdleLimited (session, boolVal); /** *** Turtle Mode **/ /* update the turtle mode's fields */ if (tr_variantDictFindInt (settings, TR_KEY_alt_speed_up, &i)) turtle->speedLimit_Bps[TR_UP] = toSpeedBytes (i); if (tr_variantDictFindInt (settings, TR_KEY_alt_speed_down, &i)) turtle->speedLimit_Bps[TR_DOWN] = toSpeedBytes (i); if (tr_variantDictFindInt (settings, TR_KEY_alt_speed_time_begin, &i)) turtle->beginMinute = i; if (tr_variantDictFindInt (settings, TR_KEY_alt_speed_time_end, &i)) turtle->endMinute = i; if (tr_variantDictFindInt (settings, TR_KEY_alt_speed_time_day, &i)) turtle->days = i; if (tr_variantDictFindBool (settings, TR_KEY_alt_speed_time_enabled, &boolVal)) turtle->isClockEnabled = boolVal; if (tr_variantDictFindBool (settings, TR_KEY_alt_speed_enabled, &boolVal)) turtle->isEnabled = boolVal; turtleBootstrap (session, turtle); /** *** Scripts **/ if (tr_variantDictFindBool (settings, TR_KEY_script_torrent_done_enabled, &boolVal)) tr_sessionSetTorrentDoneScriptEnabled (session, boolVal); if (tr_variantDictFindStr (settings, TR_KEY_script_torrent_done_filename, &str, NULL)) tr_sessionSetTorrentDoneScript (session, str); if (tr_variantDictFindBool (settings, TR_KEY_scrape_paused_torrents_enabled, &boolVal)) session->scrapePausedTorrents = boolVal; data->done = true; } void tr_sessionSet (tr_session * session, tr_variant * settings) { struct init_data data; data.done = false; data.session = session; data.clientSettings = settings; /* run the rest in the libtransmission thread */ tr_runInEventThread (session, sessionSetImpl, &data); while (!data.done) tr_wait_msec (100); } /*** **** ***/ void tr_sessionSetDownloadDir (tr_session * session, const char * dir) { struct tr_device_info * info = NULL; assert (tr_isSession (session)); if (dir != NULL) info = tr_device_info_create (dir); tr_device_info_free (session->downloadDir); session->downloadDir = info; } const char * tr_sessionGetDownloadDir (const tr_session * session) { const char * dir = NULL; assert (tr_isSession (session)); if ((session != NULL) && (session->downloadDir != NULL)) dir = session->downloadDir->path; return dir; } int64_t tr_sessionGetDirFreeSpace (tr_session * session, const char * dir) { int64_t free_space; if (!tr_strcmp0 (dir, tr_sessionGetDownloadDir (session))) free_space = tr_device_info_get_free_space (session->downloadDir); else free_space = tr_getDirFreeSpace (dir); return free_space; } /*** **** ***/ void tr_sessionSetIncompleteFileNamingEnabled (tr_session * session, bool b) { assert (tr_isSession (session)); assert (tr_isBool (b)); session->isIncompleteFileNamingEnabled = b; } bool tr_sessionIsIncompleteFileNamingEnabled (const tr_session * session) { assert (tr_isSession (session)); return session->isIncompleteFileNamingEnabled; } /*** **** ***/ void tr_sessionSetIncompleteDir (tr_session * session, const char * dir) { assert (tr_isSession (session)); if (session->incompleteDir != dir) { tr_free (session->incompleteDir); session->incompleteDir = tr_strdup (dir); } } const char* tr_sessionGetIncompleteDir (const tr_session * session) { assert (tr_isSession (session)); return session->incompleteDir; } void tr_sessionSetIncompleteDirEnabled (tr_session * session, bool b) { assert (tr_isSession (session)); assert (tr_isBool (b)); session->isIncompleteDirEnabled = b; } bool tr_sessionIsIncompleteDirEnabled (const tr_session * session) { assert (tr_isSession (session)); return session->isIncompleteDirEnabled; } /*** **** ***/ void tr_sessionLock (tr_session * session) { assert (tr_isSession (session)); tr_lockLock (session->lock); } void tr_sessionUnlock (tr_session * session) { assert (tr_isSession (session)); tr_lockUnlock (session->lock); } bool tr_sessionIsLocked (const tr_session * session) { return tr_isSession (session) && tr_lockHave (session->lock); } /*** **** Peer Port ***/ static void peerPortChanged (void * session) { tr_torrent * tor = NULL; assert (tr_isSession (session)); close_incoming_peer_port (session); open_incoming_peer_port (session); tr_sharedPortChanged (session); while ((tor = tr_torrentNext (session, tor))) tr_torrentChangeMyPort (tor); } static void setPeerPort (tr_session * session, tr_port port) { session->private_peer_port = port; session->public_peer_port = port; tr_runInEventThread (session, peerPortChanged, session); } void tr_sessionSetPeerPort (tr_session * session, tr_port port) { if (tr_isSession (session) && (session->private_peer_port != port)) { setPeerPort (session, port); } } tr_port tr_sessionGetPeerPort (const tr_session * session) { return tr_isSession (session) ? session->private_peer_port : 0; } tr_port tr_sessionSetPeerPortRandom (tr_session * session) { assert (tr_isSession (session)); tr_sessionSetPeerPort (session, getRandomPort (session)); return session->private_peer_port; } void tr_sessionSetPeerPortRandomOnStart (tr_session * session, bool random) { assert (tr_isSession (session)); session->isPortRandom = random; } bool tr_sessionGetPeerPortRandomOnStart (tr_session * session) { assert (tr_isSession (session)); return session->isPortRandom; } tr_port_forwarding tr_sessionGetPortForwarding (const tr_session * session) { assert (tr_isSession (session)); return tr_sharedTraversalStatus (session->shared); } /*** **** ***/ void tr_sessionSetRatioLimited (tr_session * session, bool isLimited) { assert (tr_isSession (session)); session->isRatioLimited = isLimited; } void tr_sessionSetRatioLimit (tr_session * session, double desiredRatio) { assert (tr_isSession (session)); session->desiredRatio = desiredRatio; } bool tr_sessionIsRatioLimited (const tr_session * session) { assert (tr_isSession (session)); return session->isRatioLimited; } double tr_sessionGetRatioLimit (const tr_session * session) { assert (tr_isSession (session)); return session->desiredRatio; } /*** **** ***/ void tr_sessionSetIdleLimited (tr_session * session, bool isLimited) { assert (tr_isSession (session)); session->isIdleLimited = isLimited; } void tr_sessionSetIdleLimit (tr_session * session, uint16_t idleMinutes) { assert (tr_isSession (session)); session->idleLimitMinutes = idleMinutes; } bool tr_sessionIsIdleLimited (const tr_session * session) { assert (tr_isSession (session)); return session->isIdleLimited; } uint16_t tr_sessionGetIdleLimit (const tr_session * session) { assert (tr_isSession (session)); return session->idleLimitMinutes; } /*** **** **** SPEED LIMITS **** ***/ bool tr_sessionGetActiveSpeedLimit_Bps (const tr_session * session, tr_direction dir, unsigned int * setme_Bps) { bool isLimited = true; if (!tr_isSession (session)) return false; if (tr_sessionUsesAltSpeed (session)) *setme_Bps = tr_sessionGetAltSpeed_Bps (session, dir); else if (tr_sessionIsSpeedLimited (session, dir)) *setme_Bps = tr_sessionGetSpeedLimit_Bps (session, dir); else isLimited = false; return isLimited; } bool tr_sessionGetActiveSpeedLimit_KBps (const tr_session * session, tr_direction dir, double * setme_KBps) { unsigned int Bps = 0; const bool is_active = tr_sessionGetActiveSpeedLimit_Bps (session, dir, &Bps); *setme_KBps = toSpeedKBps (Bps); return is_active; } static void updateBandwidth (tr_session * session, tr_direction dir) { unsigned int limit_Bps = 0; const bool isLimited = tr_sessionGetActiveSpeedLimit_Bps (session, dir, &limit_Bps); const bool zeroCase = isLimited && !limit_Bps; tr_bandwidthSetLimited (&session->bandwidth, dir, isLimited && !zeroCase); tr_bandwidthSetDesiredSpeed_Bps (&session->bandwidth, dir, limit_Bps); } enum { MINUTES_PER_HOUR = 60, MINUTES_PER_DAY = MINUTES_PER_HOUR * 24, MINUTES_PER_WEEK = MINUTES_PER_DAY * 7 }; static void turtleUpdateTable (struct tr_turtle_info * t) { int day; tr_bitfield * b = &t->minutes; tr_bitfieldSetHasNone (b); for (day=0; day<7; ++day) { if (t->days & (1<beginMinute; time_t end = t->endMinute; if (end <= begin) end += MINUTES_PER_DAY; for (i=begin; iturtle; assert (tr_isSession (session)); updateBandwidth (session, TR_UP); updateBandwidth (session, TR_DOWN); if (t->callback != NULL) (*t->callback)(session, t->isEnabled, t->changedByUser, t->callbackUserData); } static void useAltSpeed (tr_session * s, struct tr_turtle_info * t, bool enabled, bool byUser) { assert (tr_isSession (s)); assert (t != NULL); assert (tr_isBool (enabled)); assert (tr_isBool (byUser)); if (t->isEnabled != enabled) { t->isEnabled = enabled; t->changedByUser = byUser; tr_runInEventThread (s, altSpeedToggled, s); } } /** * @return whether turtle should be on/off according to the scheduler */ static bool getInTurtleTime (const struct tr_turtle_info * t) { struct tm tm; size_t minute_of_the_week; const time_t now = tr_time (); tr_localtime_r (&now, &tm); minute_of_the_week = tm.tm_wday * MINUTES_PER_DAY + tm.tm_hour * MINUTES_PER_HOUR + tm.tm_min; if (minute_of_the_week >= MINUTES_PER_WEEK) /* leap minutes? */ minute_of_the_week = MINUTES_PER_WEEK - 1; return tr_bitfieldHas (&t->minutes, minute_of_the_week); } static inline tr_auto_switch_state_t autoSwitchState (bool enabled) { return enabled ? TR_AUTO_SWITCH_ON : TR_AUTO_SWITCH_OFF; } static void turtleCheckClock (tr_session * s, struct tr_turtle_info * t) { bool enabled; bool alreadySwitched; tr_auto_switch_state_t newAutoTurtleState; assert (t->isClockEnabled); enabled = getInTurtleTime (t); newAutoTurtleState = autoSwitchState (enabled); alreadySwitched = (t->autoTurtleState == newAutoTurtleState); if (!alreadySwitched) { tr_logAddInfo ("Time to turn %s turtle mode!", (enabled?"on":"off")); t->autoTurtleState = newAutoTurtleState; useAltSpeed (s, t, enabled, false); } } /* Called after the turtle's fields are loaded from an outside source. * It initializes the implementation fields * and turns on turtle mode if the clock settings say to. */ static void turtleBootstrap (tr_session * session, struct tr_turtle_info * turtle) { turtle->changedByUser = false; turtle->autoTurtleState = TR_AUTO_SWITCH_UNUSED; tr_bitfieldConstruct (&turtle->minutes, MINUTES_PER_WEEK); turtleUpdateTable (turtle); if (turtle->isClockEnabled) { turtle->isEnabled = getInTurtleTime (turtle); turtle->autoTurtleState = autoSwitchState (turtle->isEnabled); } altSpeedToggled (session); } /*** **** Primary session speed limits ***/ void tr_sessionSetSpeedLimit_Bps (tr_session * s, tr_direction d, unsigned int Bps) { assert (tr_isSession (s)); assert (tr_isDirection (d)); s->speedLimit_Bps[d] = Bps; updateBandwidth (s, d); } void tr_sessionSetSpeedLimit_KBps (tr_session * s, tr_direction d, unsigned int KBps) { tr_sessionSetSpeedLimit_Bps (s, d, toSpeedBytes (KBps)); } unsigned int tr_sessionGetSpeedLimit_Bps (const tr_session * s, tr_direction d) { assert (tr_isSession (s)); assert (tr_isDirection (d)); return s->speedLimit_Bps[d]; } unsigned int tr_sessionGetSpeedLimit_KBps (const tr_session * s, tr_direction d) { return toSpeedKBps (tr_sessionGetSpeedLimit_Bps (s, d)); } void tr_sessionLimitSpeed (tr_session * s, tr_direction d, bool b) { assert (tr_isSession (s)); assert (tr_isDirection (d)); assert (tr_isBool (b)); s->speedLimitEnabled[d] = b; updateBandwidth (s, d); } bool tr_sessionIsSpeedLimited (const tr_session * s, tr_direction d) { assert (tr_isSession (s)); assert (tr_isDirection (d)); return s->speedLimitEnabled[d]; } /*** **** Alternative speed limits that are used during scheduled times ***/ void tr_sessionSetAltSpeed_Bps (tr_session * s, tr_direction d, unsigned int Bps) { assert (tr_isSession (s)); assert (tr_isDirection (d)); s->turtle.speedLimit_Bps[d] = Bps; updateBandwidth (s, d); } void tr_sessionSetAltSpeed_KBps (tr_session * s, tr_direction d, unsigned int KBps) { tr_sessionSetAltSpeed_Bps (s, d, toSpeedBytes (KBps)); } unsigned int tr_sessionGetAltSpeed_Bps (const tr_session * s, tr_direction d) { assert (tr_isSession (s)); assert (tr_isDirection (d)); return s->turtle.speedLimit_Bps[d]; } unsigned int tr_sessionGetAltSpeed_KBps (const tr_session * s, tr_direction d) { return toSpeedKBps (tr_sessionGetAltSpeed_Bps (s, d)); } static void userPokedTheClock (tr_session * s, struct tr_turtle_info * t) { tr_logAddDebug ("Refreshing the turtle mode clock due to user changes"); t->autoTurtleState = TR_AUTO_SWITCH_UNUSED; turtleUpdateTable (t); if (t->isClockEnabled) { const bool enabled = getInTurtleTime (t); useAltSpeed (s, t, enabled, true); t->autoTurtleState = autoSwitchState (enabled); } } void tr_sessionUseAltSpeedTime (tr_session * s, bool b) { struct tr_turtle_info * t = &s->turtle; assert (tr_isSession (s)); assert (tr_isBool (b)); if (t->isClockEnabled != b) { t->isClockEnabled = b; userPokedTheClock (s, t); } } bool tr_sessionUsesAltSpeedTime (const tr_session * s) { assert (tr_isSession (s)); return s->turtle.isClockEnabled; } void tr_sessionSetAltSpeedBegin (tr_session * s, int minute) { assert (tr_isSession (s)); assert (0<=minute && minute< (60*24)); if (s->turtle.beginMinute != minute) { s->turtle.beginMinute = minute; userPokedTheClock (s, &s->turtle); } } int tr_sessionGetAltSpeedBegin (const tr_session * s) { assert (tr_isSession (s)); return s->turtle.beginMinute; } void tr_sessionSetAltSpeedEnd (tr_session * s, int minute) { assert (tr_isSession (s)); assert (0<=minute && minute< (60*24)); if (s->turtle.endMinute != minute) { s->turtle.endMinute = minute; userPokedTheClock (s, &s->turtle); } } int tr_sessionGetAltSpeedEnd (const tr_session * s) { assert (tr_isSession (s)); return s->turtle.endMinute; } void tr_sessionSetAltSpeedDay (tr_session * s, tr_sched_day days) { assert (tr_isSession (s)); if (s->turtle.days != days) { s->turtle.days = days; userPokedTheClock (s, &s->turtle); } } tr_sched_day tr_sessionGetAltSpeedDay (const tr_session * s) { assert (tr_isSession (s)); return s->turtle.days; } void tr_sessionUseAltSpeed (tr_session * session, bool enabled) { useAltSpeed (session, &session->turtle, enabled, true); } bool tr_sessionUsesAltSpeed (const tr_session * s) { assert (tr_isSession (s)); return s->turtle.isEnabled; } void tr_sessionSetAltSpeedFunc (tr_session * session, tr_altSpeedFunc func, void * userData) { assert (tr_isSession (session)); session->turtle.callback = func; session->turtle.callbackUserData = userData; } void tr_sessionClearAltSpeedFunc (tr_session * session) { tr_sessionSetAltSpeedFunc (session, NULL, NULL); } /*** **** ***/ void tr_sessionSetPeerLimit (tr_session * session, uint16_t n) { assert (tr_isSession (session)); session->peerLimit = n; } uint16_t tr_sessionGetPeerLimit (const tr_session * session) { assert (tr_isSession (session)); return session->peerLimit; } void tr_sessionSetPeerLimitPerTorrent (tr_session * session, uint16_t n) { assert (tr_isSession (session)); session->peerLimitPerTorrent = n; } uint16_t tr_sessionGetPeerLimitPerTorrent (const tr_session * session) { assert (tr_isSession (session)); return session->peerLimitPerTorrent; } /*** **** ***/ void tr_sessionSetPaused (tr_session * session, bool isPaused) { assert (tr_isSession (session)); session->pauseAddedTorrent = isPaused; } bool tr_sessionGetPaused (const tr_session * session) { assert (tr_isSession (session)); return session->pauseAddedTorrent; } void tr_sessionSetDeleteSource (tr_session * session, bool deleteSource) { assert (tr_isSession (session)); session->deleteSourceTorrent = deleteSource; } bool tr_sessionGetDeleteSource (const tr_session * session) { assert (tr_isSession (session)); return session->deleteSourceTorrent; } /*** **** ***/ unsigned int tr_sessionGetPieceSpeed_Bps (const tr_session * session, tr_direction dir) { return tr_isSession (session) ? tr_bandwidthGetPieceSpeed_Bps (&session->bandwidth, 0, dir) : 0; } unsigned int tr_sessionGetRawSpeed_Bps (const tr_session * session, tr_direction dir) { return tr_isSession (session) ? tr_bandwidthGetRawSpeed_Bps (&session->bandwidth, 0, dir) : 0; } double tr_sessionGetRawSpeed_KBps (const tr_session * session, tr_direction dir) { return toSpeedKBps (tr_sessionGetRawSpeed_Bps (session, dir)); } int tr_sessionCountTorrents (const tr_session * session) { return tr_isSession (session) ? session->torrentCount : 0; } tr_torrent ** tr_sessionGetTorrents (tr_session * session, int * setme_n) { int i; int n; tr_torrent ** torrents; tr_torrent * tor; assert (tr_isSession (session)); assert (setme_n != NULL); n = tr_sessionCountTorrents (session); *setme_n = n; torrents = tr_new (tr_torrent *, n); tor = NULL; for (i=0; idownloadedCur + a->uploadedCur; const uint64_t bCur = b->downloadedCur + b->uploadedCur; if (aCur != bCur) return aCur > bCur ? -1 : 1; /* close the biggest torrents first */ return 0; } static void closeBlocklists (tr_session *); static void sessionCloseImplWaitForIdleUdp (evutil_socket_t foo UNUSED, short bar UNUSED, void * vsession); static void sessionCloseImplStart (tr_session * session) { int i, n; tr_torrent ** torrents; session->isClosing = true; free_incoming_peer_port (session); if (session->isLPDEnabled) tr_lpdUninit (session); tr_utpClose (session); tr_dhtUninit (session); event_free (session->saveTimer); session->saveTimer = NULL; event_free (session->nowTimer); session->nowTimer = NULL; tr_verifyClose (session); tr_sharedClose (session); tr_rpcClose (&session->rpcServer); /* Close the torrents. Get the most active ones first so that * if we can't get them all closed in a reasonable amount of time, * at least we get the most important ones first. */ torrents = tr_sessionGetTorrents (session, &n); qsort (torrents, n, sizeof (tr_torrent*), compareTorrentByCur); for (i=0; icache); session->cache = NULL; /* saveTimer is not used at this point, reusing for UDP shutdown wait */ assert (session->saveTimer == NULL); session->saveTimer = evtimer_new (session->event_base, sessionCloseImplWaitForIdleUdp, session); tr_timerAdd (session->saveTimer, 0, 0); } static void sessionCloseImplFinish (tr_session * session); static void sessionCloseImplWaitForIdleUdp (evutil_socket_t foo UNUSED, short bar UNUSED, void * vsession) { tr_session * session = vsession; assert (tr_isSession (session)); /* gotta keep udp running long enough to send out all the &event=stopped UDP tracker messages */ if (!tr_tracker_udp_is_idle (session)) { tr_tracker_udp_upkeep (session); tr_timerAdd (session->saveTimer, 0, 100000); return; } sessionCloseImplFinish (session); } static void sessionCloseImplFinish (tr_session * session) { /* we had to wait until UDP trackers were closed before closing these: */ evdns_base_free (session->evdns_base, 0); session->evdns_base = NULL; tr_tracker_udp_close (session); tr_udpUninit (session); tr_statsClose (session); tr_peerMgrFree (session->peerMgr); closeBlocklists (session); tr_fdClose (session); session->isClosed = true; } static void sessionCloseImpl (void * vsession) { tr_session * session = vsession; assert (tr_isSession (session)); sessionCloseImplStart (session); } static int deadlineReached (const time_t deadline) { return time (NULL) >= deadline; } #define SHUTDOWN_MAX_SECONDS 20 void tr_sessionClose (tr_session * session) { const time_t deadline = time (NULL) + SHUTDOWN_MAX_SECONDS; assert (tr_isSession (session)); dbgmsg ("shutting down transmission session %p... now is %zu, deadline is %zu", (void*)session, (size_t)time (NULL), (size_t)deadline); /* close the session */ tr_runInEventThread (session, sessionCloseImpl, session); while (!session->isClosed && !deadlineReached (deadline)) { dbgmsg ("waiting for the libtransmission thread to finish"); tr_wait_msec (100); } /* "shared" and "tracker" have live sockets, * so we need to keep the transmission thread alive * for a bit while they tell the router & tracker * that we're closing now */ while ((session->shared || session->web || session->announcer || session->announcer_udp) && !deadlineReached (deadline)) { dbgmsg ("waiting on port unmap (%p) or announcer (%p)... now %zu deadline %zu", (void*)session->shared, (void*)session->announcer, (size_t)time (NULL), (size_t)deadline); tr_wait_msec (50); } tr_webClose (session, TR_WEB_CLOSE_NOW); /* close the libtransmission thread */ tr_eventClose (session); while (session->events != NULL) { static bool forced = false; dbgmsg ("waiting for libtransmission thread to finish... now %zu deadline %zu", (size_t)time (NULL), (size_t)deadline); tr_wait_msec (100); if (deadlineReached (deadline) && !forced) { dbgmsg ("calling event_loopbreak ()"); forced = true; event_base_loopbreak (session->event_base); } if (deadlineReached (deadline+3)) { dbgmsg ("deadline+3 reached... calling break...\n"); break; } } /* free the session memory */ tr_variantFree (&session->removedTorrents); tr_bandwidthDestruct (&session->bandwidth); tr_bitfieldDestruct (&session->turtle.minutes); tr_lockFree (session->lock); if (session->metainfoLookup) { tr_variantFree (session->metainfoLookup); tr_free (session->metainfoLookup); } tr_device_info_free (session->downloadDir); tr_free (session->torrentDoneScript); tr_free (session->configDir); tr_free (session->resumeDir); tr_free (session->torrentDir); tr_free (session->incompleteDir); tr_free (session->blocklist_url); tr_free (session->peer_congestion_algorithm); tr_free (session); } struct sessionLoadTorrentsData { tr_session * session; tr_ctor * ctor; int * setmeCount; tr_torrent ** torrents; bool done; }; static void sessionLoadTorrents (void * vdata) { int i; int n = 0; tr_sys_path_info info; tr_sys_dir_t odir = NULL; tr_list * l = NULL; tr_list * list = NULL; struct sessionLoadTorrentsData * data = vdata; const char * dirname = tr_getTorrentDir (data->session); assert (tr_isSession (data->session)); tr_ctorSetSave (data->ctor, false); /* since we already have them */ if (tr_sys_path_get_info (dirname, 0, &info, NULL) && info.type == TR_SYS_PATH_IS_DIRECTORY && (odir = tr_sys_dir_open (dirname, NULL)) != TR_BAD_SYS_DIR) { const char * name; while ((name = tr_sys_dir_read_name (odir, NULL)) != NULL) { if (tr_str_has_suffix (name, ".torrent")) { tr_torrent * tor; char * path = tr_buildPath (dirname, name, NULL); tr_ctorSetMetainfoFromFile (data->ctor, path); if ((tor = tr_torrentNew (data->ctor, NULL, NULL))) { tr_list_prepend (&list, tor); ++n; } tr_free (path); } } tr_sys_dir_close (odir, NULL); } data->torrents = tr_new (tr_torrent *, n); for (i=0, l=list; l!=NULL; l=l->next) data->torrents[i++] = (tr_torrent*) l->data; assert (i == n); tr_list_free (&list, NULL); if (n) tr_logAddInfo (_("Loaded %d torrents"), n); if (data->setmeCount) *data->setmeCount = n; data->done = true; } tr_torrent ** tr_sessionLoadTorrents (tr_session * session, tr_ctor * ctor, int * setmeCount) { struct sessionLoadTorrentsData data; data.session = session; data.ctor = ctor; data.setmeCount = setmeCount; data.torrents = NULL; data.done = false; tr_runInEventThread (session, sessionLoadTorrents, &data); while (!data.done) tr_wait_msec (100); return data.torrents; } /*** **** ***/ void tr_sessionSetPexEnabled (tr_session * session, bool enabled) { assert (tr_isSession (session)); assert (tr_isBool (enabled)); session->isPexEnabled = enabled; } bool tr_sessionIsPexEnabled (const tr_session * session) { assert (tr_isSession (session)); return session->isPexEnabled; } bool tr_sessionAllowsDHT (const tr_session * session) { return tr_sessionIsDHTEnabled (session); } bool tr_sessionIsDHTEnabled (const tr_session * session) { assert (tr_isSession (session)); return session->isDHTEnabled; } static void toggleDHTImpl (void * data) { tr_session * session = data; assert (tr_isSession (session)); tr_udpUninit (session); session->isDHTEnabled = !session->isDHTEnabled; tr_udpInit (session); } void tr_sessionSetDHTEnabled (tr_session * session, bool enabled) { assert (tr_isSession (session)); assert (tr_isBool (enabled)); if (enabled != session->isDHTEnabled) tr_runInEventThread (session, toggleDHTImpl, session); } /*** **** ***/ bool tr_sessionIsUTPEnabled (const tr_session * session) { assert (tr_isSession (session)); #ifdef WITH_UTP return session->isUTPEnabled; #else return false; #endif } static void toggle_utp (void * data) { tr_session * session = data; assert (tr_isSession (session)); session->isUTPEnabled = !session->isUTPEnabled; tr_udpSetSocketBuffers (session); /* But don't call tr_utpClose -- see reset_timer in tr-utp.c for an explanation. */ } void tr_sessionSetUTPEnabled (tr_session * session, bool enabled) { assert (tr_isSession (session)); assert (tr_isBool (enabled)); if (enabled != session->isUTPEnabled) tr_runInEventThread (session, toggle_utp, session); } /*** **** ***/ static void toggleLPDImpl (void * data) { tr_session * session = data; assert (tr_isSession (session)); if (session->isLPDEnabled) tr_lpdUninit (session); session->isLPDEnabled = !session->isLPDEnabled; if (session->isLPDEnabled) tr_lpdInit (session, &session->public_ipv4->addr); } void tr_sessionSetLPDEnabled (tr_session * session, bool enabled) { assert (tr_isSession (session)); assert (tr_isBool (enabled)); if (enabled != session->isLPDEnabled) tr_runInEventThread (session, toggleLPDImpl, session); } bool tr_sessionIsLPDEnabled (const tr_session * session) { assert (tr_isSession (session)); return session->isLPDEnabled; } bool tr_sessionAllowsLPD (const tr_session * session) { return tr_sessionIsLPDEnabled (session); } /*** **** ***/ void tr_sessionSetCacheLimit_MB (tr_session * session, int max_bytes) { assert (tr_isSession (session)); tr_cacheSetLimit (session->cache, toMemBytes (max_bytes)); } int tr_sessionGetCacheLimit_MB (const tr_session * session) { assert (tr_isSession (session)); return toMemMB (tr_cacheGetLimit (session->cache)); } /*** **** ***/ struct port_forwarding_data { bool enabled; struct tr_shared * shared; }; static void setPortForwardingEnabled (void * vdata) { struct port_forwarding_data * data = vdata; tr_sharedTraversalEnable (data->shared, data->enabled); tr_free (data); } void tr_sessionSetPortForwardingEnabled (tr_session * session, bool enabled) { struct port_forwarding_data * d; d = tr_new0 (struct port_forwarding_data, 1); d->shared = session->shared; d->enabled = enabled; tr_runInEventThread (session, setPortForwardingEnabled, d); } bool tr_sessionIsPortForwardingEnabled (const tr_session * session) { assert (tr_isSession (session)); return tr_sharedTraversalIsEnabled (session->shared); } /*** **** ***/ static int tr_stringEndsWith (const char * str, const char * end) { const size_t slen = strlen (str); const size_t elen = strlen (end); return slen >= elen && !memcmp (&str[slen - elen], end, elen); } static void loadBlocklists (tr_session * session) { tr_sys_dir_t odir; char * dirname; const char * name; tr_list * blocklists = NULL; tr_ptrArray loadme = TR_PTR_ARRAY_INIT; const bool isEnabled = session->isBlocklistEnabled; /* walk the blocklist directory... */ dirname = tr_buildPath (session->configDir, "blocklists", NULL); odir = tr_sys_dir_open (dirname, NULL); if (odir == TR_BAD_SYS_DIR) { tr_free (dirname); return; } while ((name = tr_sys_dir_read_name (odir, NULL)) != NULL) { char * path; char * load = NULL; if (name[0] == '.') /* ignore dotfiles */ continue; path = tr_buildPath (dirname, name, NULL); if (tr_stringEndsWith (path, ".bin")) { load = tr_strdup (path); } else { char * binname; char * basename; tr_sys_path_info path_info; tr_sys_path_info binname_info; basename = tr_sys_path_basename (name, NULL); binname = tr_strdup_printf ("%s" TR_PATH_DELIMITER_STR "%s.bin", dirname, basename); if (!tr_sys_path_get_info (binname, 0, &binname_info, NULL)) /* create it */ { tr_blocklistFile * b = tr_blocklistFileNew (binname, isEnabled); const int n = tr_blocklistFileSetContent (b, path); if (n > 0) load = tr_strdup (binname); tr_blocklistFileFree (b); } else if (tr_sys_path_get_info (path, 0, &path_info, NULL) && path_info.last_modified_at >= binname_info.last_modified_at) /* update it */ { char * old; tr_blocklistFile * b; old = tr_strdup_printf ("%s.old", binname); tr_sys_path_remove (old, NULL); tr_sys_path_rename (binname, old, NULL); b = tr_blocklistFileNew (binname, isEnabled); if (tr_blocklistFileSetContent (b, path) > 0) { tr_sys_path_remove (old, NULL); } else { tr_sys_path_remove (binname, NULL); tr_sys_path_rename (old, binname, NULL); } tr_blocklistFileFree (b); tr_free (old); } tr_free (basename); tr_free (binname); } if (load != NULL) { if (tr_ptrArrayFindSorted (&loadme, load, (PtrArrayCompareFunc)strcmp) == NULL) tr_ptrArrayInsertSorted (&loadme, load, (PtrArrayCompareFunc)strcmp); else tr_free (load); } tr_free (path); } if (!tr_ptrArrayEmpty (&loadme)) { int i; const int n = tr_ptrArraySize (&loadme); const char * const * paths = (const char * const *) tr_ptrArrayBase (&loadme); for (i=0; iblocklists = blocklists; } static void closeBlocklists (tr_session * session) { tr_list_free (&session->blocklists, (TrListForeachFunc)tr_blocklistFileFree); } void tr_sessionReloadBlocklists (tr_session * session) { closeBlocklists (session); loadBlocklists (session); tr_peerMgrOnBlocklistChanged (session->peerMgr); } int tr_blocklistGetRuleCount (const tr_session * session) { tr_list * l; int n = 0; assert (tr_isSession (session)); for (l = session->blocklists; l; l = l->next) n += tr_blocklistFileGetRuleCount (l->data); return n; } bool tr_blocklistIsEnabled (const tr_session * session) { assert (tr_isSession (session)); return session->isBlocklistEnabled; } void tr_blocklistSetEnabled (tr_session * session, bool isEnabled) { tr_list * l; assert (tr_isSession (session)); assert (tr_isBool (isEnabled)); session->isBlocklistEnabled = isEnabled; for (l=session->blocklists; l!=NULL; l=l->next) tr_blocklistFileSetEnabled (l->data, isEnabled); } bool tr_blocklistExists (const tr_session * session) { assert (tr_isSession (session)); return session->blocklists != NULL; } int tr_blocklistSetContent (tr_session * session, const char * contentFilename) { tr_list * l; int ruleCount; tr_blocklistFile * b; const char * defaultName = DEFAULT_BLOCKLIST_FILENAME; tr_sessionLock (session); for (b=NULL, l=session->blocklists; !b && l; l=l->next) if (tr_stringEndsWith (tr_blocklistFileGetFilename (l->data), defaultName)) b = l->data; if (!b) { char * path = tr_buildPath (session->configDir, "blocklists", defaultName, NULL); b = tr_blocklistFileNew (path, session->isBlocklistEnabled); tr_list_append (&session->blocklists, b); tr_free (path); } ruleCount = tr_blocklistFileSetContent (b, contentFilename); tr_sessionUnlock (session); return ruleCount; } bool tr_sessionIsAddressBlocked (const tr_session * session, const tr_address * addr) { tr_list * l; assert (tr_isSession (session)); for (l = session->blocklists; l; l = l->next) if (tr_blocklistFileHasAddress (l->data, addr)) return true; return false; } void tr_blocklistSetURL (tr_session * session, const char * url) { if (session->blocklist_url != url) { tr_free (session->blocklist_url); session->blocklist_url = tr_strdup (url); } } const char * tr_blocklistGetURL (const tr_session * session) { return session->blocklist_url; } /*** **** ***/ static void metainfoLookupInit (tr_session * session) { tr_sys_path_info info; const char * dirname = tr_getTorrentDir (session); tr_sys_dir_t odir; tr_ctor * ctor = NULL; tr_variant * lookup; int n = 0; assert (tr_isSession (session)); /* walk through the directory and find the mappings */ lookup = tr_new0 (tr_variant, 1); tr_variantInitDict (lookup, 0); ctor = tr_ctorNew (session); tr_ctorSetSave (ctor, false); /* since we already have them */ if (tr_sys_path_get_info (dirname, 0, &info, NULL) && info.type == TR_SYS_PATH_IS_DIRECTORY && (odir = tr_sys_dir_open (dirname, NULL)) != TR_BAD_SYS_DIR) { const char * name; while ((name = tr_sys_dir_read_name (odir, NULL)) != NULL) { if (tr_str_has_suffix (name, ".torrent")) { tr_info inf; char * path = tr_buildPath (dirname, name, NULL); tr_ctorSetMetainfoFromFile (ctor, path); if (!tr_torrentParse (ctor, &inf)) { ++n; tr_variantDictAddStr (lookup, tr_quark_new(inf.hashString, TR_BAD_SIZE), path); } tr_free (path); } } tr_sys_dir_close (odir, NULL); } tr_ctorFree (ctor); session->metainfoLookup = lookup; tr_logAddDebug ("Found %d torrents in \"%s\"", n, dirname); } const char* tr_sessionFindTorrentFile (const tr_session * session, const char * hashString) { const char * filename = NULL; if (!session->metainfoLookup) metainfoLookupInit ((tr_session*)session); tr_variantDictFindStr (session->metainfoLookup, tr_quark_new(hashString, TR_BAD_SIZE), &filename, NULL); return filename; } void tr_sessionSetTorrentFile (tr_session * session, const char * hashString, const char * filename) { /* since we walk session->configDir/torrents/ to build the lookup table, * and tr_sessionSetTorrentFile () is just to tell us there's a new file * in that same directory, we don't need to do anything here if the * lookup table hasn't been built yet */ if (session->metainfoLookup) tr_variantDictAddStr (session->metainfoLookup, tr_quark_new(hashString, TR_BAD_SIZE), filename); } /*** **** ***/ void tr_sessionSetRPCEnabled (tr_session * session, bool isEnabled) { assert (tr_isSession (session)); tr_rpcSetEnabled (session->rpcServer, isEnabled); } bool tr_sessionIsRPCEnabled (const tr_session * session) { assert (tr_isSession (session)); return tr_rpcIsEnabled (session->rpcServer); } void tr_sessionSetRPCPort (tr_session * session, tr_port port) { assert (tr_isSession (session)); tr_rpcSetPort (session->rpcServer, port); } tr_port tr_sessionGetRPCPort (const tr_session * session) { assert (tr_isSession (session)); return tr_rpcGetPort (session->rpcServer); } void tr_sessionSetRPCUrl (tr_session * session, const char * url) { assert (tr_isSession (session)); tr_rpcSetUrl (session->rpcServer, url); } const char* tr_sessionGetRPCUrl (const tr_session * session) { assert (tr_isSession (session)); return tr_rpcGetUrl (session->rpcServer); } void tr_sessionSetRPCCallback (tr_session * session, tr_rpc_func func, void * user_data) { assert (tr_isSession (session)); session->rpc_func = func; session->rpc_func_user_data = user_data; } void tr_sessionSetRPCWhitelist (tr_session * session, const char * whitelist) { assert (tr_isSession (session)); tr_rpcSetWhitelist (session->rpcServer, whitelist); } const char* tr_sessionGetRPCWhitelist (const tr_session * session) { assert (tr_isSession (session)); return tr_rpcGetWhitelist (session->rpcServer); } void tr_sessionSetRPCWhitelistEnabled (tr_session * session, bool isEnabled) { assert (tr_isSession (session)); tr_rpcSetWhitelistEnabled (session->rpcServer, isEnabled); } bool tr_sessionGetRPCWhitelistEnabled (const tr_session * session) { assert (tr_isSession (session)); return tr_rpcGetWhitelistEnabled (session->rpcServer); } void tr_sessionSetRPCPassword (tr_session * session, const char * password) { assert (tr_isSession (session)); tr_rpcSetPassword (session->rpcServer, password); } const char* tr_sessionGetRPCPassword (const tr_session * session) { assert (tr_isSession (session)); return tr_rpcGetPassword (session->rpcServer); } void tr_sessionSetRPCUsername (tr_session * session, const char * username) { assert (tr_isSession (session)); tr_rpcSetUsername (session->rpcServer, username); } const char* tr_sessionGetRPCUsername (const tr_session * session) { assert (tr_isSession (session)); return tr_rpcGetUsername (session->rpcServer); } void tr_sessionSetRPCPasswordEnabled (tr_session * session, bool isEnabled) { assert (tr_isSession (session)); tr_rpcSetPasswordEnabled (session->rpcServer, isEnabled); } bool tr_sessionIsRPCPasswordEnabled (const tr_session * session) { assert (tr_isSession (session)); return tr_rpcIsPasswordEnabled (session->rpcServer); } const char * tr_sessionGetRPCBindAddress (const tr_session * session) { assert (tr_isSession (session)); return tr_rpcGetBindAddress (session->rpcServer); } /**** ***** ****/ bool tr_sessionIsTorrentDoneScriptEnabled (const tr_session * session) { assert (tr_isSession (session)); return session->isTorrentDoneScriptEnabled; } void tr_sessionSetTorrentDoneScriptEnabled (tr_session * session, bool isEnabled) { assert (tr_isSession (session)); assert (tr_isBool (isEnabled)); session->isTorrentDoneScriptEnabled = isEnabled; } const char * tr_sessionGetTorrentDoneScript (const tr_session * session) { assert (tr_isSession (session)); return session->torrentDoneScript; } void tr_sessionSetTorrentDoneScript (tr_session * session, const char * scriptFilename) { assert (tr_isSession (session)); if (session->torrentDoneScript != scriptFilename) { tr_free (session->torrentDoneScript); session->torrentDoneScript = tr_strdup (scriptFilename); } } /*** **** ***/ void tr_sessionSetQueueSize (tr_session * session, tr_direction dir, int n) { assert (tr_isSession (session)); assert (tr_isDirection (dir)); session->queueSize[dir] = n; } int tr_sessionGetQueueSize (const tr_session * session, tr_direction dir) { assert (tr_isSession (session)); assert (tr_isDirection (dir)); return session->queueSize[dir]; } void tr_sessionSetQueueEnabled (tr_session * session, tr_direction dir, bool is_enabled) { assert (tr_isSession (session)); assert (tr_isDirection (dir)); assert (tr_isBool (is_enabled)); session->queueEnabled[dir] = is_enabled; } bool tr_sessionGetQueueEnabled (const tr_session * session, tr_direction dir) { assert (tr_isSession (session)); assert (tr_isDirection (dir)); return session->queueEnabled[dir]; } void tr_sessionSetQueueStalledMinutes (tr_session * session, int minutes) { assert (tr_isSession (session)); assert (minutes > 0); session->queueStalledMinutes = minutes; } void tr_sessionSetQueueStalledEnabled (tr_session * session, bool is_enabled) { assert (tr_isSession (session)); assert (tr_isBool (is_enabled)); session->stalledEnabled = is_enabled; } bool tr_sessionGetQueueStalledEnabled (const tr_session * session) { assert (tr_isSession (session)); return session->stalledEnabled; } int tr_sessionGetQueueStalledMinutes (const tr_session * session) { assert (tr_isSession (session)); return session->queueStalledMinutes; } struct TorrentAndPosition { tr_torrent * tor; int position; }; static int compareTorrentAndPositions (const void * va, const void * vb) { int ret; const struct TorrentAndPosition * a = va; const struct TorrentAndPosition * b = vb; if (a->position > b->position) ret = 1; else if (a->position < b->position) ret = -1; else ret = 0; return ret; } void tr_sessionGetNextQueuedTorrents (tr_session * session, tr_direction direction, size_t num_wanted, tr_ptrArray * setme) { size_t i; size_t n; tr_torrent * tor; struct TorrentAndPosition * candidates; assert (tr_isSession (session)); assert (tr_isDirection (direction)); /* build an array of the candidates */ n = tr_sessionCountTorrents (session); candidates = tr_new (struct TorrentAndPosition, n); i = 0; tor = NULL; while ((tor = tr_torrentNext (session, tor))) { if (!tr_torrentIsQueued (tor)) continue; if (direction != tr_torrentGetQueueDirection (tor)) continue; candidates[i].tor = tor; candidates[i].position = tr_torrentGetQueuePosition (tor); ++i; } /* find the best n candidates */ if (num_wanted > i) num_wanted = i; else if (num_wanted < i) tr_quickfindFirstK (candidates, i, sizeof(struct TorrentAndPosition), compareTorrentAndPositions, num_wanted); /* add them to the return array */ for (i=0; i= max) return 0; return max - active_count; } transmission-2.92/libtransmission/PaxHeaders.4960/rpc-test.c0000644000000000000000000000013212640354044021005 xustar0030 mtime=1451350052.448150354 30 atime=1451350052.448150354 30 ctime=1457295920.274812577 transmission-2.92/libtransmission/rpc-test.c0000644000175000017500000001451612640354044022441 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: rpc-test.c 14633 2015-12-25 10:19:50Z mikedld $ */ #include "transmission.h" #include "rpcimpl.h" #include "utils.h" #include "variant.h" #include "libtransmission-test.h" static int test_list (void) { size_t len; int64_t i; const char * str; tr_variant top; tr_rpc_parse_list_str (&top, "12", TR_BAD_SIZE); check (tr_variantIsInt (&top)); check (tr_variantGetInt (&top, &i)); check_int_eq (12, i); tr_variantFree (&top); tr_rpc_parse_list_str (&top, "12", 1); check (tr_variantIsInt (&top)); check (tr_variantGetInt (&top, &i)); check_int_eq (1, i); tr_variantFree (&top); tr_rpc_parse_list_str (&top, "6,7", TR_BAD_SIZE); check (tr_variantIsList (&top)); check (tr_variantListSize (&top) == 2); check (tr_variantGetInt (tr_variantListChild (&top, 0), &i)); check_int_eq (6, i); check (tr_variantGetInt (tr_variantListChild (&top, 1), &i)); check_int_eq (7, i); tr_variantFree (&top); tr_rpc_parse_list_str (&top, "asdf", TR_BAD_SIZE); check (tr_variantIsString (&top)); check (tr_variantGetStr (&top, &str, &len)); check_int_eq (4, len); check_streq ("asdf", str); tr_variantFree (&top); tr_rpc_parse_list_str (&top, "1,3-5", TR_BAD_SIZE); check (tr_variantIsList (&top)); check (tr_variantListSize (&top) == 4); check (tr_variantGetInt (tr_variantListChild (&top, 0), &i)); check_int_eq (1, i); check (tr_variantGetInt (tr_variantListChild (&top, 1), &i)); check_int_eq (3, i); check (tr_variantGetInt (tr_variantListChild (&top, 2), &i)); check_int_eq (4, i); check (tr_variantGetInt (tr_variantListChild (&top, 3), &i)); check_int_eq (5, i); tr_variantFree (&top); return 0; } /*** **** ***/ static void rpc_response_func (tr_session * session UNUSED, tr_variant * response, void * setme) { *(tr_variant *) setme = *response; tr_variantInitBool (response, false); } static int test_session_get_and_set (void) { tr_session * session; tr_variant request; tr_variant response; tr_variant * args; tr_torrent * tor; session = libttest_session_init (NULL); tor= libttest_zero_torrent_init (session); check (tor != NULL); tr_variantInitDict (&request, 1); tr_variantDictAddStr (&request, TR_KEY_method, "session-get"); tr_rpc_request_exec_json (session, &request, rpc_response_func, &response); tr_variantFree (&request); check (tr_variantIsDict(&response)); check (tr_variantDictFindDict (&response, TR_KEY_arguments, &args)); check (tr_variantDictFind (args, TR_KEY_alt_speed_down) != NULL); check (tr_variantDictFind (args, TR_KEY_alt_speed_enabled) != NULL); check (tr_variantDictFind (args, TR_KEY_alt_speed_time_begin) != NULL); check (tr_variantDictFind (args, TR_KEY_alt_speed_time_day) != NULL); check (tr_variantDictFind (args, TR_KEY_alt_speed_time_enabled) != NULL); check (tr_variantDictFind (args, TR_KEY_alt_speed_time_end) != NULL); check (tr_variantDictFind (args, TR_KEY_alt_speed_up) != NULL); check (tr_variantDictFind (args, TR_KEY_blocklist_enabled) != NULL); check (tr_variantDictFind (args, TR_KEY_blocklist_size) != NULL); check (tr_variantDictFind (args, TR_KEY_blocklist_url) != NULL); check (tr_variantDictFind (args, TR_KEY_cache_size_mb) != NULL); check (tr_variantDictFind (args, TR_KEY_config_dir) != NULL); check (tr_variantDictFind (args, TR_KEY_dht_enabled) != NULL); check (tr_variantDictFind (args, TR_KEY_download_dir) != NULL); check (tr_variantDictFind (args, TR_KEY_download_dir_free_space) != NULL); check (tr_variantDictFind (args, TR_KEY_download_queue_enabled) != NULL); check (tr_variantDictFind (args, TR_KEY_download_queue_size) != NULL); check (tr_variantDictFind (args, TR_KEY_encryption) != NULL); check (tr_variantDictFind (args, TR_KEY_idle_seeding_limit) != NULL); check (tr_variantDictFind (args, TR_KEY_idle_seeding_limit_enabled) != NULL); check (tr_variantDictFind (args, TR_KEY_incomplete_dir) != NULL); check (tr_variantDictFind (args, TR_KEY_incomplete_dir_enabled) != NULL); check (tr_variantDictFind (args, TR_KEY_lpd_enabled) != NULL); check (tr_variantDictFind (args, TR_KEY_peer_limit_global) != NULL); check (tr_variantDictFind (args, TR_KEY_peer_limit_per_torrent) != NULL); check (tr_variantDictFind (args, TR_KEY_peer_port) != NULL); check (tr_variantDictFind (args, TR_KEY_peer_port_random_on_start) != NULL); check (tr_variantDictFind (args, TR_KEY_pex_enabled) != NULL); check (tr_variantDictFind (args, TR_KEY_port_forwarding_enabled) != NULL); check (tr_variantDictFind (args, TR_KEY_queue_stalled_enabled) != NULL); check (tr_variantDictFind (args, TR_KEY_queue_stalled_minutes) != NULL); check (tr_variantDictFind (args, TR_KEY_rename_partial_files) != NULL); check (tr_variantDictFind (args, TR_KEY_rpc_version) != NULL); check (tr_variantDictFind (args, TR_KEY_rpc_version_minimum) != NULL); check (tr_variantDictFind (args, TR_KEY_script_torrent_done_enabled) != NULL); check (tr_variantDictFind (args, TR_KEY_script_torrent_done_filename) != NULL); check (tr_variantDictFind (args, TR_KEY_seed_queue_enabled) != NULL); check (tr_variantDictFind (args, TR_KEY_seed_queue_size) != NULL); check (tr_variantDictFind (args, TR_KEY_seedRatioLimit) != NULL); check (tr_variantDictFind (args, TR_KEY_seedRatioLimited) != NULL); check (tr_variantDictFind (args, TR_KEY_speed_limit_down) != NULL); check (tr_variantDictFind (args, TR_KEY_speed_limit_down_enabled) != NULL); check (tr_variantDictFind (args, TR_KEY_speed_limit_up) != NULL); check (tr_variantDictFind (args, TR_KEY_speed_limit_up_enabled) != NULL); check (tr_variantDictFind (args, TR_KEY_start_added_torrents) != NULL); check (tr_variantDictFind (args, TR_KEY_trash_original_torrent_files) != NULL); check (tr_variantDictFind (args, TR_KEY_units) != NULL); check (tr_variantDictFind (args, TR_KEY_utp_enabled) != NULL); check (tr_variantDictFind (args, TR_KEY_version) != NULL); tr_variantFree (&response); /* cleanup */ tr_torrentRemove (tor, false, NULL); libttest_session_close (session); return 0; } /*** **** ***/ int main (void) { const testFunc tests[] = { test_list, test_session_get_and_set }; return runTests (tests, NUM_TESTS (tests)); } transmission-2.92/libtransmission/PaxHeaders.4960/tr-lpd.h0000644000000000000000000000013212505250244020450 xustar0030 mtime=1427460260.486244298 30 atime=1427460260.486244298 30 ctime=1457295919.842805231 transmission-2.92/libtransmission/tr-lpd.h0000644000175000017500000000347712505250244022110 0ustar00mikedldmikedld00000000000000/* Copyright (c) 2010 by Johannes Lieder 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. */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef _TR_LPD_H #define _TR_LPD_H /* $Id: tr-lpd.h 14321 2014-07-08 00:15:12Z jordan $ */ int tr_lpdInit (tr_session*, tr_address*); void tr_lpdUninit (tr_session*); bool tr_lpdEnabled (const tr_session*); bool tr_lpdSendAnnounce (const tr_torrent*); /** * @defgroup Preproc Helper macros * @{ * * @def lengthof * @brief returns the static length of a C array type * @note A lower case macro name is tolerable here since this definition of lengthof () * is intimately related to sizeof semantics. * Meaningful return values are only guaranteed for true array types. */ #define lengthof(arr)(sizeof (* (arr)) > 0 ? sizeof (arr) / sizeof (* (arr)) : 0) /** * @} */ #endif /* _TR_LPD_H */ transmission-2.92/libtransmission/PaxHeaders.4960/peer-msgs.c0000644000000000000000000000013212644245522021152 xustar0030 mtime=1452362578.738698801 30 atime=1452362578.738698801 30 ctime=1457295920.078809244 transmission-2.92/libtransmission/peer-msgs.c0000644000175000017500000022735312644245522022613 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: peer-msgs.c 14666 2016-01-07 19:20:14Z mikedld $ */ #include #include #include #include #include #include #include #include #include "transmission.h" #include "cache.h" #include "completion.h" #include "file.h" #include "log.h" #include "peer-io.h" #include "peer-mgr.h" #include "peer-msgs.h" #include "session.h" #include "torrent.h" #include "torrent-magnet.h" #include "tr-dht.h" #include "utils.h" #include "variant.h" #include "version.h" #ifndef EBADMSG #define EBADMSG EINVAL #endif /** *** **/ enum { BT_CHOKE = 0, BT_UNCHOKE = 1, BT_INTERESTED = 2, BT_NOT_INTERESTED = 3, BT_HAVE = 4, BT_BITFIELD = 5, BT_REQUEST = 6, BT_PIECE = 7, BT_CANCEL = 8, BT_PORT = 9, BT_FEXT_SUGGEST = 13, BT_FEXT_HAVE_ALL = 14, BT_FEXT_HAVE_NONE = 15, BT_FEXT_REJECT = 16, BT_FEXT_ALLOWED_FAST = 17, BT_LTEP = 20, LTEP_HANDSHAKE = 0, UT_PEX_ID = 1, UT_METADATA_ID = 3, MAX_PEX_PEER_COUNT = 50, MIN_CHOKE_PERIOD_SEC = 10, /* idle seconds before we send a keepalive */ KEEPALIVE_INTERVAL_SECS = 100, PEX_INTERVAL_SECS = 90, /* sec between sendPex () calls */ REQQ = 512, METADATA_REQQ = 64, MAGIC_NUMBER = 21549, /* used in lowering the outMessages queue period */ IMMEDIATE_PRIORITY_INTERVAL_SECS = 0, HIGH_PRIORITY_INTERVAL_SECS = 2, LOW_PRIORITY_INTERVAL_SECS = 10, /* number of pieces we'll allow in our fast set */ MAX_FAST_SET_SIZE = 3, /* how many blocks to keep prefetched per peer */ PREFETCH_SIZE = 18, /* when we're making requests from another peer, batch them together to send enough requests to meet our bandwidth goals for the next N seconds */ REQUEST_BUF_SECS = 10, /* defined in BEP #9 */ METADATA_MSG_TYPE_REQUEST = 0, METADATA_MSG_TYPE_DATA = 1, METADATA_MSG_TYPE_REJECT = 2 }; enum { AWAITING_BT_LENGTH, AWAITING_BT_ID, AWAITING_BT_MESSAGE, AWAITING_BT_PIECE }; typedef enum { ENCRYPTION_PREFERENCE_UNKNOWN, ENCRYPTION_PREFERENCE_YES, ENCRYPTION_PREFERENCE_NO } encryption_preference_t; /** *** **/ struct peer_request { uint32_t index; uint32_t offset; uint32_t length; }; static void blockToReq (const tr_torrent * tor, tr_block_index_t block, struct peer_request * setme) { tr_torrentGetBlockLocation (tor, block, &setme->index, &setme->offset, &setme->length); } /** *** **/ /* this is raw, unchanged data from the peer regarding * the current message that it's sending us. */ struct tr_incoming { uint8_t id; uint32_t length; /* includes the +1 for id length */ struct peer_request blockReq; /* metadata for incoming blocks */ struct evbuffer * block; /* piece data for incoming blocks */ }; /** * Low-level communication state information about a connected peer. * * This structure remembers the low-level protocol states that we're * in with this peer, such as active requests, pex messages, and so on. * Its fields are all private to peer-msgs.c. * * Data not directly involved with sending & receiving messages is * stored in tr_peer, where it can be accessed by both peermsgs and * the peer manager. * * @see struct peer_atom * @see tr_peer */ struct tr_peerMsgs { struct tr_peer peer; /* parent */ uint16_t magic_number; /* Whether or not we've choked this peer. */ bool peer_is_choked; /* whether or not the peer has indicated it will download from us. */ bool peer_is_interested; /* whether or the peer is choking us. */ bool client_is_choked; /* whether or not we've indicated to the peer that we would download from them if unchoked. */ bool client_is_interested; bool peerSupportsPex; bool peerSupportsMetadataXfer; bool clientSentLtepHandshake; bool peerSentLtepHandshake; /*bool haveFastSet;*/ int desiredRequestCount; int prefetchCount; int is_active[2]; /* how long the outMessages batch should be allowed to grow before * it's flushed -- some messages (like requests >:) should be sent * very quickly; others aren't as urgent. */ int8_t outMessagesBatchPeriod; uint8_t state; uint8_t ut_pex_id; uint8_t ut_metadata_id; uint16_t pexCount; uint16_t pexCount6; tr_port dht_port; encryption_preference_t encryption_preference; size_t metadata_size_hint; #if 0 size_t fastsetSize; tr_piece_index_t fastset[MAX_FAST_SET_SIZE]; #endif tr_torrent * torrent; tr_peer_callback callback; void * callbackData; struct evbuffer * outMessages; /* all the non-piece messages */ struct peer_request peerAskedFor[REQQ]; int peerAskedForMetadata[METADATA_REQQ]; int peerAskedForMetadataCount; tr_pex * pex; tr_pex * pex6; /*time_t clientSentPexAt;*/ time_t clientSentAnythingAt; time_t chokeChangedAt; /* when we started batching the outMessages */ time_t outMessagesBatchedAt; struct tr_incoming incoming; /* if the peer supports the Extension Protocol in BEP 10 and supplied a reqq argument, it's stored here. Otherwise, the value is zero and should be ignored. */ int64_t reqq; struct event * pexTimer; struct tr_peerIo * io; }; /** *** **/ static inline tr_session* getSession (struct tr_peerMsgs * msgs) { return msgs->torrent->session; } /** *** **/ static void myDebug (const char * file, int line, const struct tr_peerMsgs * msgs, const char * fmt, ...) TR_GNUC_PRINTF(4, 5); static void myDebug (const char * file, int line, const struct tr_peerMsgs * msgs, const char * fmt, ...) { const tr_sys_file_t fp = tr_logGetFile (); if (fp != TR_BAD_SYS_FILE) { va_list args; char timestr[64]; struct evbuffer * buf = evbuffer_new (); char * base = tr_sys_path_basename (file, NULL); char * message; evbuffer_add_printf (buf, "[%s] %s - %s [%s]: ", tr_logGetTimeStr (timestr, sizeof (timestr)), tr_torrentName (msgs->torrent), tr_peerIoGetAddrStr (msgs->io), tr_quark_get_string (msgs->peer.client, NULL)); va_start (args, fmt); evbuffer_add_vprintf (buf, fmt, args); va_end (args); evbuffer_add_printf (buf, " (%s:%d)", base, line); message = evbuffer_free_to_str (buf, NULL); tr_sys_file_write_line (fp, message, NULL); tr_free (base); tr_free (message); } } #define dbgmsg(msgs, ...) \ do \ { \ if (tr_logGetDeepEnabled ()) \ myDebug (__FILE__, __LINE__, msgs, __VA_ARGS__); \ } \ while (0) /** *** **/ static void pokeBatchPeriod (tr_peerMsgs * msgs, int interval) { if (msgs->outMessagesBatchPeriod > interval) { msgs->outMessagesBatchPeriod = interval; dbgmsg (msgs, "lowering batch interval to %d seconds", interval); } } static void dbgOutMessageLen (tr_peerMsgs * msgs) { dbgmsg (msgs, "outMessage size is now %zu", evbuffer_get_length (msgs->outMessages)); } static void protocolSendReject (tr_peerMsgs * msgs, const struct peer_request * req) { struct evbuffer * out = msgs->outMessages; assert (tr_peerIoSupportsFEXT (msgs->io)); evbuffer_add_uint32 (out, sizeof (uint8_t) + 3 * sizeof (uint32_t)); evbuffer_add_uint8 (out, BT_FEXT_REJECT); evbuffer_add_uint32 (out, req->index); evbuffer_add_uint32 (out, req->offset); evbuffer_add_uint32 (out, req->length); dbgmsg (msgs, "rejecting %u:%u->%u...", req->index, req->offset, req->length); dbgOutMessageLen (msgs); } static void protocolSendRequest (tr_peerMsgs * msgs, const struct peer_request * req) { struct evbuffer * out = msgs->outMessages; evbuffer_add_uint32 (out, sizeof (uint8_t) + 3 * sizeof (uint32_t)); evbuffer_add_uint8 (out, BT_REQUEST); evbuffer_add_uint32 (out, req->index); evbuffer_add_uint32 (out, req->offset); evbuffer_add_uint32 (out, req->length); dbgmsg (msgs, "requesting %u:%u->%u...", req->index, req->offset, req->length); dbgOutMessageLen (msgs); pokeBatchPeriod (msgs, IMMEDIATE_PRIORITY_INTERVAL_SECS); } static void protocolSendCancel (tr_peerMsgs * msgs, const struct peer_request * req) { struct evbuffer * out = msgs->outMessages; evbuffer_add_uint32 (out, sizeof (uint8_t) + 3 * sizeof (uint32_t)); evbuffer_add_uint8 (out, BT_CANCEL); evbuffer_add_uint32 (out, req->index); evbuffer_add_uint32 (out, req->offset); evbuffer_add_uint32 (out, req->length); dbgmsg (msgs, "cancelling %u:%u->%u...", req->index, req->offset, req->length); dbgOutMessageLen (msgs); pokeBatchPeriod (msgs, IMMEDIATE_PRIORITY_INTERVAL_SECS); } static void protocolSendPort (tr_peerMsgs *msgs, uint16_t port) { struct evbuffer * out = msgs->outMessages; dbgmsg (msgs, "sending Port %u", port); evbuffer_add_uint32 (out, 3); evbuffer_add_uint8 (out, BT_PORT); evbuffer_add_uint16 (out, port); } static void protocolSendHave (tr_peerMsgs * msgs, uint32_t index) { struct evbuffer * out = msgs->outMessages; evbuffer_add_uint32 (out, sizeof (uint8_t) + sizeof (uint32_t)); evbuffer_add_uint8 (out, BT_HAVE); evbuffer_add_uint32 (out, index); dbgmsg (msgs, "sending Have %u", index); dbgOutMessageLen (msgs); pokeBatchPeriod (msgs, LOW_PRIORITY_INTERVAL_SECS); } #if 0 static void protocolSendAllowedFast (tr_peerMsgs * msgs, uint32_t pieceIndex) { tr_peerIo * io = msgs->io; struct evbuffer * out = msgs->outMessages; assert (tr_peerIoSupportsFEXT (msgs->io)); evbuffer_add_uint32 (io, out, sizeof (uint8_t) + sizeof (uint32_t)); evbuffer_add_uint8 (io, out, BT_FEXT_ALLOWED_FAST); evbuffer_add_uint32 (io, out, pieceIndex); dbgmsg (msgs, "sending Allowed Fast %u...", pieceIndex); dbgOutMessageLen (msgs); } #endif static void protocolSendChoke (tr_peerMsgs * msgs, int choke) { struct evbuffer * out = msgs->outMessages; evbuffer_add_uint32 (out, sizeof (uint8_t)); evbuffer_add_uint8 (out, choke ? BT_CHOKE : BT_UNCHOKE); dbgmsg (msgs, "sending %s...", choke ? "Choke" : "Unchoke"); dbgOutMessageLen (msgs); pokeBatchPeriod (msgs, IMMEDIATE_PRIORITY_INTERVAL_SECS); } static void protocolSendHaveAll (tr_peerMsgs * msgs) { struct evbuffer * out = msgs->outMessages; assert (tr_peerIoSupportsFEXT (msgs->io)); evbuffer_add_uint32 (out, sizeof (uint8_t)); evbuffer_add_uint8 (out, BT_FEXT_HAVE_ALL); dbgmsg (msgs, "sending HAVE_ALL..."); dbgOutMessageLen (msgs); pokeBatchPeriod (msgs, IMMEDIATE_PRIORITY_INTERVAL_SECS); } static void protocolSendHaveNone (tr_peerMsgs * msgs) { struct evbuffer * out = msgs->outMessages; assert (tr_peerIoSupportsFEXT (msgs->io)); evbuffer_add_uint32 (out, sizeof (uint8_t)); evbuffer_add_uint8 (out, BT_FEXT_HAVE_NONE); dbgmsg (msgs, "sending HAVE_NONE..."); dbgOutMessageLen (msgs); pokeBatchPeriod (msgs, IMMEDIATE_PRIORITY_INTERVAL_SECS); } /** *** EVENTS **/ static void publish (tr_peerMsgs * msgs, tr_peer_event * e) { if (msgs->callback != NULL) (*msgs->callback) (&msgs->peer, e, msgs->callbackData); } static void fireError (tr_peerMsgs * msgs, int err) { tr_peer_event e = TR_PEER_EVENT_INIT; e.eventType = TR_PEER_ERROR; e.err = err; publish (msgs, &e); } static void fireGotBlock (tr_peerMsgs * msgs, const struct peer_request * req) { tr_peer_event e = TR_PEER_EVENT_INIT; e.eventType = TR_PEER_CLIENT_GOT_BLOCK; e.pieceIndex = req->index; e.offset = req->offset; e.length = req->length; publish (msgs, &e); } static void fireGotRej (tr_peerMsgs * msgs, const struct peer_request * req) { tr_peer_event e = TR_PEER_EVENT_INIT; e.eventType = TR_PEER_CLIENT_GOT_REJ; e.pieceIndex = req->index; e.offset = req->offset; e.length = req->length; publish (msgs, &e); } static void fireGotChoke (tr_peerMsgs * msgs) { tr_peer_event e = TR_PEER_EVENT_INIT; e.eventType = TR_PEER_CLIENT_GOT_CHOKE; publish (msgs, &e); } static void fireClientGotHaveAll (tr_peerMsgs * msgs) { tr_peer_event e = TR_PEER_EVENT_INIT; e.eventType = TR_PEER_CLIENT_GOT_HAVE_ALL; publish (msgs, &e); } static void fireClientGotHaveNone (tr_peerMsgs * msgs) { tr_peer_event e = TR_PEER_EVENT_INIT; e.eventType = TR_PEER_CLIENT_GOT_HAVE_NONE; publish (msgs, &e); } static void fireClientGotPieceData (tr_peerMsgs * msgs, uint32_t length) { tr_peer_event e = TR_PEER_EVENT_INIT; e.length = length; e.eventType = TR_PEER_CLIENT_GOT_PIECE_DATA; publish (msgs, &e); } static void firePeerGotPieceData (tr_peerMsgs * msgs, uint32_t length) { tr_peer_event e = TR_PEER_EVENT_INIT; e.length = length; e.eventType = TR_PEER_PEER_GOT_PIECE_DATA; publish (msgs, &e); } static void fireClientGotSuggest (tr_peerMsgs * msgs, uint32_t pieceIndex) { tr_peer_event e = TR_PEER_EVENT_INIT; e.eventType = TR_PEER_CLIENT_GOT_SUGGEST; e.pieceIndex = pieceIndex; publish (msgs, &e); } static void fireClientGotPort (tr_peerMsgs * msgs, tr_port port) { tr_peer_event e = TR_PEER_EVENT_INIT; e.eventType = TR_PEER_CLIENT_GOT_PORT; e.port = port; publish (msgs, &e); } static void fireClientGotAllowedFast (tr_peerMsgs * msgs, uint32_t pieceIndex) { tr_peer_event e = TR_PEER_EVENT_INIT; e.eventType = TR_PEER_CLIENT_GOT_ALLOWED_FAST; e.pieceIndex = pieceIndex; publish (msgs, &e); } static void fireClientGotBitfield (tr_peerMsgs * msgs, tr_bitfield * bitfield) { tr_peer_event e = TR_PEER_EVENT_INIT; e.eventType = TR_PEER_CLIENT_GOT_BITFIELD; e.bitfield = bitfield; publish (msgs, &e); } static void fireClientGotHave (tr_peerMsgs * msgs, tr_piece_index_t index) { tr_peer_event e = TR_PEER_EVENT_INIT; e.eventType = TR_PEER_CLIENT_GOT_HAVE; e.pieceIndex = index; publish (msgs, &e); } /** *** ALLOWED FAST SET *** For explanation, see http://www.bittorrent.org/beps/bep_0006.html **/ #if 0 size_t tr_generateAllowedSet (tr_piece_index_t * setmePieces, size_t desiredSetSize, size_t pieceCount, const uint8_t * infohash, const tr_address * addr) { size_t setSize = 0; assert (setmePieces); assert (desiredSetSize <= pieceCount); assert (desiredSetSize); assert (pieceCount); assert (infohash); assert (addr); if (addr->type == TR_AF_INET) { uint8_t w[SHA_DIGEST_LENGTH + 4], *walk=w; uint8_t x[SHA_DIGEST_LENGTH]; uint32_t ui32 = ntohl (htonl (addr->addr.addr4.s_addr) & 0xffffff00); /* (1) */ memcpy (w, &ui32, sizeof (uint32_t)); walk += sizeof (uint32_t); memcpy (walk, infohash, SHA_DIGEST_LENGTH); /* (2) */ walk += SHA_DIGEST_LENGTH; tr_sha1 (x, w, walk-w, NULL); /* (3) */ assert (sizeof (w) == walk-w); while (setSizeio); const int peerIsNeedy = msgs->peer->progress < 0.10; if (fext && peerIsNeedy && !msgs->haveFastSet) { size_t i; const struct tr_address * addr = tr_peerIoGetAddress (msgs->io, NULL); const tr_info * inf = &msgs->torrent->info; const size_t numwant = MIN (MAX_FAST_SET_SIZE, inf->pieceCount); /* build the fast set */ msgs->fastsetSize = tr_generateAllowedSet (msgs->fastset, numwant, inf->pieceCount, inf->hash, addr); msgs->haveFastSet = true; /* send it to the peer */ for (i=0; ifastsetSize; ++i) protocolSendAllowedFast (msgs, msgs->fastset[i]); } } #endif /*** **** ACTIVE ***/ static bool tr_peerMsgsCalculateActive (const tr_peerMsgs * msgs, tr_direction direction) { bool is_active; assert (tr_isPeerMsgs (msgs)); assert (tr_isDirection (direction)); if (direction == TR_CLIENT_TO_PEER) { is_active = tr_peerMsgsIsPeerInterested (msgs) && !tr_peerMsgsIsPeerChoked (msgs); /* FIXME: https://trac.transmissionbt.com/ticket/5505 if (is_active) assert (!tr_peerIsSeed (&msgs->peer)); */ } else /* TR_PEER_TO_CLIENT */ { if (!tr_torrentHasMetadata (msgs->torrent)) { is_active = true; } else { is_active = tr_peerMsgsIsClientInterested (msgs) && !tr_peerMsgsIsClientChoked (msgs); if (is_active) assert (!tr_torrentIsSeed (msgs->torrent)); } } return is_active; } bool tr_peerMsgsIsActive (const tr_peerMsgs * msgs, tr_direction direction) { bool is_active; assert (tr_isPeerMsgs (msgs)); assert (tr_isDirection (direction)); is_active = msgs->is_active[direction]; assert (is_active == tr_peerMsgsCalculateActive (msgs, direction)); return is_active; } static void tr_peerMsgsSetActive (tr_peerMsgs * msgs, tr_direction direction, bool is_active) { dbgmsg (msgs, "direction [%d] is_active [%d]", (int)direction, (int)is_active); if (msgs->is_active[direction] != is_active) { msgs->is_active[direction] = is_active; tr_swarmIncrementActivePeers (msgs->torrent->swarm, direction, is_active); } } void tr_peerMsgsUpdateActive (tr_peerMsgs * msgs, tr_direction direction) { const bool is_active = tr_peerMsgsCalculateActive (msgs, direction); tr_peerMsgsSetActive (msgs, direction, is_active); } /** *** INTEREST **/ static void sendInterest (tr_peerMsgs * msgs, bool b) { struct evbuffer * out = msgs->outMessages; assert (msgs); assert (tr_isBool (b)); msgs->client_is_interested = b; dbgmsg (msgs, "Sending %s", b ? "Interested" : "Not Interested"); evbuffer_add_uint32 (out, sizeof (uint8_t)); evbuffer_add_uint8 (out, b ? BT_INTERESTED : BT_NOT_INTERESTED); pokeBatchPeriod (msgs, HIGH_PRIORITY_INTERVAL_SECS); dbgOutMessageLen (msgs); } static void updateInterest (tr_peerMsgs * msgs UNUSED) { /* FIXME -- might need to poke the mgr on startup */ } void tr_peerMsgsSetInterested (tr_peerMsgs * msgs, bool b) { assert (tr_isBool (b)); if (msgs->client_is_interested != b) { sendInterest (msgs, b); tr_peerMsgsUpdateActive (msgs, TR_PEER_TO_CLIENT); } } static bool popNextMetadataRequest (tr_peerMsgs * msgs, int * piece) { if (msgs->peerAskedForMetadataCount == 0) return false; *piece = msgs->peerAskedForMetadata[0]; tr_removeElementFromArray (msgs->peerAskedForMetadata, 0, sizeof (int), msgs->peerAskedForMetadataCount--); return true; } static bool popNextRequest (tr_peerMsgs * msgs, struct peer_request * setme) { if (msgs->peer.pendingReqsToClient == 0) return false; *setme = msgs->peerAskedFor[0]; tr_removeElementFromArray (msgs->peerAskedFor, 0, sizeof (struct peer_request), msgs->peer.pendingReqsToClient--); return true; } static void cancelAllRequestsToClient (tr_peerMsgs * msgs) { struct peer_request req; const int mustSendCancel = tr_peerIoSupportsFEXT (msgs->io); while (popNextRequest (msgs, &req)) if (mustSendCancel) protocolSendReject (msgs, &req); } void tr_peerMsgsSetChoke (tr_peerMsgs * msgs, bool peer_is_choked) { const time_t now = tr_time (); const time_t fibrillationTime = now - MIN_CHOKE_PERIOD_SEC; assert (msgs != NULL); assert (tr_isBool (peer_is_choked)); if (msgs->chokeChangedAt > fibrillationTime) { dbgmsg (msgs, "Not changing choke to %d to avoid fibrillation", peer_is_choked); } else if (msgs->peer_is_choked != peer_is_choked) { msgs->peer_is_choked = peer_is_choked; if (peer_is_choked) cancelAllRequestsToClient (msgs); protocolSendChoke (msgs, peer_is_choked); msgs->chokeChangedAt = now; tr_peerMsgsUpdateActive (msgs, TR_CLIENT_TO_PEER); } } /** *** **/ void tr_peerMsgsHave (tr_peerMsgs * msgs, uint32_t index) { protocolSendHave (msgs, index); /* since we have more pieces now, we might not be interested in this peer */ updateInterest (msgs); } /** *** **/ static bool reqIsValid (const tr_peerMsgs * peer, uint32_t index, uint32_t offset, uint32_t length) { return tr_torrentReqIsValid (peer->torrent, index, offset, length); } static bool requestIsValid (const tr_peerMsgs * msgs, const struct peer_request * req) { return reqIsValid (msgs, req->index, req->offset, req->length); } void tr_peerMsgsCancel (tr_peerMsgs * msgs, tr_block_index_t block) { struct peer_request req; /*fprintf (stderr, "SENDING CANCEL MESSAGE FOR BLOCK %zu\n\t\tFROM PEER %p ------------------------------------\n", (size_t)block, msgs->peer);*/ blockToReq (msgs->torrent, block, &req); protocolSendCancel (msgs, &req); } /** *** **/ static void sendLtepHandshake (tr_peerMsgs * msgs) { tr_variant val; bool allow_pex; bool allow_metadata_xfer; struct evbuffer * payload; struct evbuffer * out = msgs->outMessages; const unsigned char * ipv6 = tr_globalIPv6 (); static tr_quark version_quark = 0; if (msgs->clientSentLtepHandshake) return; if (!version_quark) version_quark = tr_quark_new (TR_NAME " " USERAGENT_PREFIX, TR_BAD_SIZE); dbgmsg (msgs, "sending an ltep handshake"); msgs->clientSentLtepHandshake = true; /* decide if we want to advertise metadata xfer support (BEP 9) */ if (tr_torrentIsPrivate (msgs->torrent)) allow_metadata_xfer = false; else allow_metadata_xfer = true; /* decide if we want to advertise pex support */ if (!tr_torrentAllowsPex (msgs->torrent)) allow_pex = false; else if (msgs->peerSentLtepHandshake) allow_pex = msgs->peerSupportsPex; else allow_pex = true; tr_variantInitDict (&val, 8); tr_variantDictAddInt (&val, TR_KEY_e, getSession (msgs)->encryptionMode != TR_CLEAR_PREFERRED); if (ipv6 != NULL) tr_variantDictAddRaw (&val, TR_KEY_ipv6, ipv6, 16); if (allow_metadata_xfer && tr_torrentHasMetadata (msgs->torrent) && (msgs->torrent->infoDictLength > 0)) tr_variantDictAddInt (&val, TR_KEY_metadata_size, msgs->torrent->infoDictLength); tr_variantDictAddInt (&val, TR_KEY_p, tr_sessionGetPublicPeerPort (getSession (msgs))); tr_variantDictAddInt (&val, TR_KEY_reqq, REQQ); tr_variantDictAddInt (&val, TR_KEY_upload_only, tr_torrentIsSeed (msgs->torrent)); tr_variantDictAddQuark (&val, TR_KEY_v, version_quark); if (allow_metadata_xfer || allow_pex) { tr_variant * m = tr_variantDictAddDict (&val, TR_KEY_m, 2); if (allow_metadata_xfer) tr_variantDictAddInt (m, TR_KEY_ut_metadata, UT_METADATA_ID); if (allow_pex) tr_variantDictAddInt (m, TR_KEY_ut_pex, UT_PEX_ID); } payload = tr_variantToBuf (&val, TR_VARIANT_FMT_BENC); evbuffer_add_uint32 (out, 2 * sizeof (uint8_t) + evbuffer_get_length (payload)); evbuffer_add_uint8 (out, BT_LTEP); evbuffer_add_uint8 (out, LTEP_HANDSHAKE); evbuffer_add_buffer (out, payload); pokeBatchPeriod (msgs, IMMEDIATE_PRIORITY_INTERVAL_SECS); dbgOutMessageLen (msgs); /* cleanup */ evbuffer_free (payload); tr_variantFree (&val); } static void parseLtepHandshake (tr_peerMsgs * msgs, uint32_t len, struct evbuffer * inbuf) { int64_t i; tr_variant val, * sub; uint8_t * tmp = tr_new (uint8_t, len); const uint8_t *addr; size_t addr_len; tr_pex pex; int8_t seedProbability = -1; memset (&pex, 0, sizeof (tr_pex)); tr_peerIoReadBytes (msgs->io, inbuf, tmp, len); msgs->peerSentLtepHandshake = true; if (tr_variantFromBenc (&val, tmp, len) || !tr_variantIsDict (&val)) { dbgmsg (msgs, "GET extended-handshake, couldn't get dictionary"); tr_free (tmp); return; } /* arbitrary limit, should be more than enough */ if (len <= 4096) dbgmsg (msgs, "here is the handshake: [%*.*s]", (int) len, (int) len, tmp); else dbgmsg (msgs, "handshake length is too big (%" PRIu32 "), printing skipped", len); /* does the peer prefer encrypted connections? */ if (tr_variantDictFindInt (&val, TR_KEY_e, &i)) { msgs->encryption_preference = i ? ENCRYPTION_PREFERENCE_YES : ENCRYPTION_PREFERENCE_NO; if (i) pex.flags |= ADDED_F_ENCRYPTION_FLAG; } /* check supported messages for utorrent pex */ msgs->peerSupportsPex = false; msgs->peerSupportsMetadataXfer = false; if (tr_variantDictFindDict (&val, TR_KEY_m, &sub)) { if (tr_variantDictFindInt (sub, TR_KEY_ut_pex, &i)) { msgs->peerSupportsPex = i != 0; msgs->ut_pex_id = (uint8_t) i; dbgmsg (msgs, "msgs->ut_pex is %d", (int)msgs->ut_pex_id); } if (tr_variantDictFindInt (sub, TR_KEY_ut_metadata, &i)) { msgs->peerSupportsMetadataXfer = i != 0; msgs->ut_metadata_id = (uint8_t) i; dbgmsg (msgs, "msgs->ut_metadata_id is %d", (int)msgs->ut_metadata_id); } if (tr_variantDictFindInt (sub, TR_KEY_ut_holepunch, &i)) { /* Mysterious µTorrent extension that we don't grok. However, it implies support for µTP, so use it to indicate that. */ tr_peerMgrSetUtpFailed (msgs->torrent, tr_peerIoGetAddress (msgs->io, NULL), false); } } /* look for metainfo size (BEP 9) */ if (tr_variantDictFindInt (&val, TR_KEY_metadata_size, &i)) { if (tr_torrentSetMetadataSizeHint (msgs->torrent, i)) msgs->metadata_size_hint = (size_t) i; } /* look for upload_only (BEP 21) */ if (tr_variantDictFindInt (&val, TR_KEY_upload_only, &i)) seedProbability = i==0 ? 0 : 100; /* get peer's listening port */ if (tr_variantDictFindInt (&val, TR_KEY_p, &i)) { pex.port = htons ((uint16_t)i); fireClientGotPort (msgs, pex.port); dbgmsg (msgs, "peer's port is now %d", (int)i); } if (tr_peerIoIsIncoming (msgs->io) && tr_variantDictFindRaw (&val, TR_KEY_ipv4, &addr, &addr_len) && (addr_len == 4)) { pex.addr.type = TR_AF_INET; memcpy (&pex.addr.addr.addr4, addr, 4); tr_peerMgrAddPex (msgs->torrent, TR_PEER_FROM_LTEP, &pex, seedProbability); } if (tr_peerIoIsIncoming (msgs->io) && tr_variantDictFindRaw (&val, TR_KEY_ipv6, &addr, &addr_len) && (addr_len == 16)) { pex.addr.type = TR_AF_INET6; memcpy (&pex.addr.addr.addr6, addr, 16); tr_peerMgrAddPex (msgs->torrent, TR_PEER_FROM_LTEP, &pex, seedProbability); } /* get peer's maximum request queue size */ if (tr_variantDictFindInt (&val, TR_KEY_reqq, &i)) msgs->reqq = i; tr_variantFree (&val); tr_free (tmp); } static void parseUtMetadata (tr_peerMsgs * msgs, uint32_t msglen, struct evbuffer * inbuf) { tr_variant dict; char * msg_end; const char * benc_end; int64_t msg_type = -1; int64_t piece = -1; int64_t total_size = 0; uint8_t * tmp = tr_new (uint8_t, msglen); tr_peerIoReadBytes (msgs->io, inbuf, tmp, msglen); msg_end = (char*)tmp + msglen; if (!tr_variantFromBencFull (&dict, tmp, msglen, NULL, &benc_end)) { tr_variantDictFindInt (&dict, TR_KEY_msg_type, &msg_type); tr_variantDictFindInt (&dict, TR_KEY_piece, &piece); tr_variantDictFindInt (&dict, TR_KEY_total_size, &total_size); tr_variantFree (&dict); } dbgmsg (msgs, "got ut_metadata msg: type %d, piece %d, total_size %d", (int)msg_type, (int)piece, (int)total_size); if (msg_type == METADATA_MSG_TYPE_REJECT) { /* NOOP */ } if ((msg_type == METADATA_MSG_TYPE_DATA) && (!tr_torrentHasMetadata (msgs->torrent)) && (msg_end - benc_end <= METADATA_PIECE_SIZE) && (piece * METADATA_PIECE_SIZE + (msg_end - benc_end) <= total_size)) { const int pieceLen = msg_end - benc_end; tr_torrentSetMetadataPiece (msgs->torrent, piece, benc_end, pieceLen); } if (msg_type == METADATA_MSG_TYPE_REQUEST) { if ((piece >= 0) && tr_torrentHasMetadata (msgs->torrent) && !tr_torrentIsPrivate (msgs->torrent) && (msgs->peerAskedForMetadataCount < METADATA_REQQ)) { msgs->peerAskedForMetadata[msgs->peerAskedForMetadataCount++] = piece; } else { tr_variant tmp; struct evbuffer * payload; struct evbuffer * out = msgs->outMessages; /* build the rejection message */ tr_variantInitDict (&tmp, 2); tr_variantDictAddInt (&tmp, TR_KEY_msg_type, METADATA_MSG_TYPE_REJECT); tr_variantDictAddInt (&tmp, TR_KEY_piece, piece); payload = tr_variantToBuf (&tmp, TR_VARIANT_FMT_BENC); /* write it out as a LTEP message to our outMessages buffer */ evbuffer_add_uint32 (out, 2 * sizeof (uint8_t) + evbuffer_get_length (payload)); evbuffer_add_uint8 (out, BT_LTEP); evbuffer_add_uint8 (out, msgs->ut_metadata_id); evbuffer_add_buffer (out, payload); pokeBatchPeriod (msgs, HIGH_PRIORITY_INTERVAL_SECS); dbgOutMessageLen (msgs); /* cleanup */ evbuffer_free (payload); tr_variantFree (&tmp); } } tr_free (tmp); } static void parseUtPex (tr_peerMsgs * msgs, uint32_t msglen, struct evbuffer * inbuf) { int loaded = 0; uint8_t * tmp = tr_new (uint8_t, msglen); tr_variant val; tr_torrent * tor = msgs->torrent; const uint8_t * added; size_t added_len; tr_peerIoReadBytes (msgs->io, inbuf, tmp, msglen); if (tr_torrentAllowsPex (tor) && ((loaded = !tr_variantFromBenc (&val, tmp, msglen)))) { if (tr_variantDictFindRaw (&val, TR_KEY_added, &added, &added_len)) { tr_pex * pex; size_t i, n; size_t added_f_len = 0; const uint8_t * added_f = NULL; tr_variantDictFindRaw (&val, TR_KEY_added_f, &added_f, &added_f_len); pex = tr_peerMgrCompactToPex (added, added_len, added_f, added_f_len, &n); n = MIN (n, MAX_PEX_PEER_COUNT); for (i=0; i 0); tr_peerIoReadUint8 (msgs->io, inbuf, <ep_msgid); msglen--; if (ltep_msgid == LTEP_HANDSHAKE) { dbgmsg (msgs, "got ltep handshake"); parseLtepHandshake (msgs, msglen, inbuf); if (tr_peerIoSupportsLTEP (msgs->io)) { sendLtepHandshake (msgs); sendPex (msgs); } } else if (ltep_msgid == UT_PEX_ID) { dbgmsg (msgs, "got ut pex"); msgs->peerSupportsPex = true; parseUtPex (msgs, msglen, inbuf); } else if (ltep_msgid == UT_METADATA_ID) { dbgmsg (msgs, "got ut metadata"); msgs->peerSupportsMetadataXfer = true; parseUtMetadata (msgs, msglen, inbuf); } else { dbgmsg (msgs, "skipping unknown ltep message (%d)", (int)ltep_msgid); evbuffer_drain (inbuf, msglen); } } static int readBtLength (tr_peerMsgs * msgs, struct evbuffer * inbuf, size_t inlen) { uint32_t len; if (inlen < sizeof (len)) return READ_LATER; tr_peerIoReadUint32 (msgs->io, inbuf, &len); if (len == 0) /* peer sent us a keepalive message */ dbgmsg (msgs, "got KeepAlive"); else { msgs->incoming.length = len; msgs->state = AWAITING_BT_ID; } return READ_NOW; } static int readBtMessage (tr_peerMsgs *, struct evbuffer *, size_t); static int readBtId (tr_peerMsgs * msgs, struct evbuffer * inbuf, size_t inlen) { uint8_t id; if (inlen < sizeof (uint8_t)) return READ_LATER; tr_peerIoReadUint8 (msgs->io, inbuf, &id); msgs->incoming.id = id; dbgmsg (msgs, "msgs->incoming.id is now %d; msgs->incoming.length is %zu", id, (size_t)msgs->incoming.length); if (id == BT_PIECE) { msgs->state = AWAITING_BT_PIECE; return READ_NOW; } else if (msgs->incoming.length != 1) { msgs->state = AWAITING_BT_MESSAGE; return READ_NOW; } else return readBtMessage (msgs, inbuf, inlen - 1); } static void updatePeerProgress (tr_peerMsgs * msgs) { tr_peerUpdateProgress (msgs->torrent, &msgs->peer); /*updateFastSet (msgs);*/ updateInterest (msgs); } static void prefetchPieces (tr_peerMsgs *msgs) { int i; if (!getSession (msgs)->isPrefetchEnabled) return; for (i=msgs->prefetchCount; ipeer.pendingReqsToClient && ipeerAskedFor + i; if (requestIsValid (msgs, req)) { tr_cachePrefetchBlock (getSession (msgs)->cache, msgs->torrent, req->index, req->offset, req->length); ++msgs->prefetchCount; } } } static void peerMadeRequest (tr_peerMsgs * msgs, const struct peer_request * req) { const bool fext = tr_peerIoSupportsFEXT (msgs->io); const int reqIsValid = requestIsValid (msgs, req); const int clientHasPiece = reqIsValid && tr_torrentPieceIsComplete (msgs->torrent, req->index); const int peerIsChoked = msgs->peer_is_choked; bool allow = false; if (!reqIsValid) dbgmsg (msgs, "rejecting an invalid request."); else if (!clientHasPiece) dbgmsg (msgs, "rejecting request for a piece we don't have."); else if (peerIsChoked) dbgmsg (msgs, "rejecting request from choked peer"); else if (msgs->peer.pendingReqsToClient + 1 >= REQQ) dbgmsg (msgs, "rejecting request ... reqq is full"); else allow = true; if (allow) { msgs->peerAskedFor[msgs->peer.pendingReqsToClient++] = *req; prefetchPieces (msgs); } else if (fext) { protocolSendReject (msgs, req); } } static bool messageLengthIsCorrect (const tr_peerMsgs * msg, uint8_t id, uint32_t len) { switch (id) { case BT_CHOKE: case BT_UNCHOKE: case BT_INTERESTED: case BT_NOT_INTERESTED: case BT_FEXT_HAVE_ALL: case BT_FEXT_HAVE_NONE: return len == 1; case BT_HAVE: case BT_FEXT_SUGGEST: case BT_FEXT_ALLOWED_FAST: return len == 5; case BT_BITFIELD: if (tr_torrentHasMetadata (msg->torrent)) return len == (msg->torrent->info.pieceCount >> 3) + (msg->torrent->info.pieceCount & 7 ? 1 : 0) + 1u; /* we don't know the piece count yet, so we can only guess whether to send true or false */ if (msg->metadata_size_hint > 0) return len <= msg->metadata_size_hint; return true; case BT_REQUEST: case BT_CANCEL: case BT_FEXT_REJECT: return len == 13; case BT_PIECE: return len > 9 && len <= 16393; case BT_PORT: return len == 3; case BT_LTEP: return len >= 2; default: return false; } } static int clientGotBlock (tr_peerMsgs * msgs, struct evbuffer * block, const struct peer_request * req); static int readBtPiece (tr_peerMsgs * msgs, struct evbuffer * inbuf, size_t inlen, size_t * setme_piece_bytes_read) { struct peer_request * req = &msgs->incoming.blockReq; assert (evbuffer_get_length (inbuf) >= inlen); dbgmsg (msgs, "In readBtPiece"); if (!req->length) { if (inlen < 8) return READ_LATER; tr_peerIoReadUint32 (msgs->io, inbuf, &req->index); tr_peerIoReadUint32 (msgs->io, inbuf, &req->offset); req->length = msgs->incoming.length - 9; dbgmsg (msgs, "got incoming block header %u:%u->%u", req->index, req->offset, req->length); return READ_NOW; } else { int err; size_t n; size_t nLeft; struct evbuffer * block_buffer; if (msgs->incoming.block == NULL) msgs->incoming.block = evbuffer_new (); block_buffer = msgs->incoming.block; /* read in another chunk of data */ nLeft = req->length - evbuffer_get_length (block_buffer); n = MIN (nLeft, inlen); tr_peerIoReadBytesToBuf (msgs->io, inbuf, block_buffer, n); fireClientGotPieceData (msgs, n); *setme_piece_bytes_read += n; dbgmsg (msgs, "got %zu bytes for block %u:%u->%u ... %d remain", n, req->index, req->offset, req->length, (int)(req->length - evbuffer_get_length (block_buffer))); if (evbuffer_get_length (block_buffer) < req->length) return READ_LATER; /* pass the block along... */ err = clientGotBlock (msgs, block_buffer, req); evbuffer_drain (block_buffer, evbuffer_get_length (block_buffer)); /* cleanup */ req->length = 0; msgs->state = AWAITING_BT_LENGTH; return err ? READ_ERR : READ_NOW; } } static void updateDesiredRequestCount (tr_peerMsgs * msgs); static int readBtMessage (tr_peerMsgs * msgs, struct evbuffer * inbuf, size_t inlen) { uint32_t ui32; uint32_t msglen = msgs->incoming.length; const uint8_t id = msgs->incoming.id; #ifndef NDEBUG const size_t startBufLen = evbuffer_get_length (inbuf); #endif const bool fext = tr_peerIoSupportsFEXT (msgs->io); assert (msglen > 0); --msglen; /* id length */ dbgmsg (msgs, "got BT id %d, len %d, buffer size is %zu", (int)id, (int)msglen, inlen); if (inlen < msglen) return READ_LATER; if (!messageLengthIsCorrect (msgs, id, msglen + 1)) { dbgmsg (msgs, "bad packet - BT message #%d with a length of %d", (int)id, (int)msglen); fireError (msgs, EMSGSIZE); return READ_ERR; } switch (id) { case BT_CHOKE: dbgmsg (msgs, "got Choke"); msgs->client_is_choked = true; if (!fext) fireGotChoke (msgs); tr_peerMsgsUpdateActive (msgs, TR_PEER_TO_CLIENT); break; case BT_UNCHOKE: dbgmsg (msgs, "got Unchoke"); msgs->client_is_choked = false; tr_peerMsgsUpdateActive (msgs, TR_PEER_TO_CLIENT); updateDesiredRequestCount (msgs); break; case BT_INTERESTED: dbgmsg (msgs, "got Interested"); msgs->peer_is_interested = true; tr_peerMsgsUpdateActive (msgs, TR_CLIENT_TO_PEER); break; case BT_NOT_INTERESTED: dbgmsg (msgs, "got Not Interested"); msgs->peer_is_interested = false; tr_peerMsgsUpdateActive (msgs, TR_CLIENT_TO_PEER); break; case BT_HAVE: tr_peerIoReadUint32 (msgs->io, inbuf, &ui32); dbgmsg (msgs, "got Have: %u", ui32); if (tr_torrentHasMetadata (msgs->torrent) && (ui32 >= msgs->torrent->info.pieceCount)) { fireError (msgs, ERANGE); return READ_ERR; } /* a peer can send the same HAVE message twice... */ if (!tr_bitfieldHas (&msgs->peer.have, ui32)) { tr_bitfieldAdd (&msgs->peer.have, ui32); fireClientGotHave (msgs, ui32); } updatePeerProgress (msgs); break; case BT_BITFIELD: { uint8_t * tmp = tr_new (uint8_t, msglen); dbgmsg (msgs, "got a bitfield"); tr_peerIoReadBytes (msgs->io, inbuf, tmp, msglen); tr_bitfieldSetRaw (&msgs->peer.have, tmp, msglen, tr_torrentHasMetadata (msgs->torrent)); fireClientGotBitfield (msgs, &msgs->peer.have); updatePeerProgress (msgs); tr_free (tmp); break; } case BT_REQUEST: { struct peer_request r; tr_peerIoReadUint32 (msgs->io, inbuf, &r.index); tr_peerIoReadUint32 (msgs->io, inbuf, &r.offset); tr_peerIoReadUint32 (msgs->io, inbuf, &r.length); dbgmsg (msgs, "got Request: %u:%u->%u", r.index, r.offset, r.length); peerMadeRequest (msgs, &r); break; } case BT_CANCEL: { int i; struct peer_request r; tr_peerIoReadUint32 (msgs->io, inbuf, &r.index); tr_peerIoReadUint32 (msgs->io, inbuf, &r.offset); tr_peerIoReadUint32 (msgs->io, inbuf, &r.length); tr_historyAdd (&msgs->peer.cancelsSentToClient, tr_time (), 1); dbgmsg (msgs, "got a Cancel %u:%u->%u", r.index, r.offset, r.length); for (i=0; ipeer.pendingReqsToClient; ++i) { const struct peer_request * req = msgs->peerAskedFor + i; if ((req->index == r.index) && (req->offset == r.offset) && (req->length == r.length)) break; } if (i < msgs->peer.pendingReqsToClient) tr_removeElementFromArray (msgs->peerAskedFor, i, sizeof (struct peer_request), msgs->peer.pendingReqsToClient--); break; } case BT_PIECE: assert (0); /* handled elsewhere! */ break; case BT_PORT: dbgmsg (msgs, "Got a BT_PORT"); tr_peerIoReadUint16 (msgs->io, inbuf, &msgs->dht_port); if (msgs->dht_port > 0) tr_dhtAddNode (getSession (msgs), tr_peerAddress (&msgs->peer), msgs->dht_port, 0); break; case BT_FEXT_SUGGEST: dbgmsg (msgs, "Got a BT_FEXT_SUGGEST"); tr_peerIoReadUint32 (msgs->io, inbuf, &ui32); if (fext) fireClientGotSuggest (msgs, ui32); else { fireError (msgs, EMSGSIZE); return READ_ERR; } break; case BT_FEXT_ALLOWED_FAST: dbgmsg (msgs, "Got a BT_FEXT_ALLOWED_FAST"); tr_peerIoReadUint32 (msgs->io, inbuf, &ui32); if (fext) fireClientGotAllowedFast (msgs, ui32); else { fireError (msgs, EMSGSIZE); return READ_ERR; } break; case BT_FEXT_HAVE_ALL: dbgmsg (msgs, "Got a BT_FEXT_HAVE_ALL"); if (fext) { tr_bitfieldSetHasAll (&msgs->peer.have); assert (tr_bitfieldHasAll (&msgs->peer.have)); fireClientGotHaveAll (msgs); updatePeerProgress (msgs); } else { fireError (msgs, EMSGSIZE); return READ_ERR; } break; case BT_FEXT_HAVE_NONE: dbgmsg (msgs, "Got a BT_FEXT_HAVE_NONE"); if (fext) { tr_bitfieldSetHasNone (&msgs->peer.have); fireClientGotHaveNone (msgs); updatePeerProgress (msgs); } else { fireError (msgs, EMSGSIZE); return READ_ERR; } break; case BT_FEXT_REJECT: { struct peer_request r; dbgmsg (msgs, "Got a BT_FEXT_REJECT"); tr_peerIoReadUint32 (msgs->io, inbuf, &r.index); tr_peerIoReadUint32 (msgs->io, inbuf, &r.offset); tr_peerIoReadUint32 (msgs->io, inbuf, &r.length); if (fext) fireGotRej (msgs, &r); else { fireError (msgs, EMSGSIZE); return READ_ERR; } break; } case BT_LTEP: dbgmsg (msgs, "Got a BT_LTEP"); parseLtep (msgs, msglen, inbuf); break; default: dbgmsg (msgs, "peer sent us an UNKNOWN: %d", (int)id); tr_peerIoDrain (msgs->io, inbuf, msglen); break; } assert (msglen + 1 == msgs->incoming.length); assert (evbuffer_get_length (inbuf) == startBufLen - msglen); msgs->state = AWAITING_BT_LENGTH; return READ_NOW; } /* returns 0 on success, or an errno on failure */ static int clientGotBlock (tr_peerMsgs * msgs, struct evbuffer * data, const struct peer_request * req) { int err; tr_torrent * tor = msgs->torrent; const tr_block_index_t block = _tr_block (tor, req->index, req->offset); assert (msgs); assert (req); if (!requestIsValid (msgs, req)) { dbgmsg (msgs, "dropping invalid block %u:%u->%u", req->index, req->offset, req->length); return EBADMSG; } if (req->length != tr_torBlockCountBytes (msgs->torrent, block)) { dbgmsg (msgs, "wrong block size -- expected %u, got %d", tr_torBlockCountBytes (msgs->torrent, block), req->length); return EMSGSIZE; } dbgmsg (msgs, "got block %u:%u->%u", req->index, req->offset, req->length); if (!tr_peerMgrDidPeerRequest (msgs->torrent, &msgs->peer, block)) { dbgmsg (msgs, "we didn't ask for this message..."); return 0; } if (tr_torrentPieceIsComplete (msgs->torrent, req->index)) { dbgmsg (msgs, "we did ask for this message, but the piece is already complete..."); return 0; } /** *** Save the block **/ if ((err = tr_cacheWriteBlock (getSession (msgs)->cache, tor, req->index, req->offset, req->length, data))) return err; tr_bitfieldAdd (&msgs->peer.blame, req->index); fireGotBlock (msgs, req); return 0; } static int peerPulse (void * vmsgs); static void didWrite (tr_peerIo * io, size_t bytesWritten, bool wasPieceData, void * vmsgs) { tr_peerMsgs * msgs = vmsgs; if (wasPieceData) firePeerGotPieceData (msgs, bytesWritten); if (tr_isPeerIo (io) && io->userData) peerPulse (msgs); } static ReadState canRead (tr_peerIo * io, void * vmsgs, size_t * piece) { ReadState ret; tr_peerMsgs * msgs = vmsgs; struct evbuffer * in = tr_peerIoGetReadBuffer (io); const size_t inlen = evbuffer_get_length (in); dbgmsg (msgs, "canRead: inlen is %zu, msgs->state is %d", inlen, msgs->state); if (!inlen) { ret = READ_LATER; } else if (msgs->state == AWAITING_BT_PIECE) { ret = readBtPiece (msgs, in, inlen, piece); } else switch (msgs->state) { case AWAITING_BT_LENGTH: ret = readBtLength (msgs, in, inlen); break; case AWAITING_BT_ID: ret = readBtId (msgs, in, inlen); break; case AWAITING_BT_MESSAGE: ret = readBtMessage (msgs, in, inlen); break; default: ret = READ_ERR; assert (0); } dbgmsg (msgs, "canRead: ret is %d", (int)ret); return ret; } int tr_peerMsgsIsReadingBlock (const tr_peerMsgs * msgs, tr_block_index_t block) { if (msgs->state != AWAITING_BT_PIECE) return false; return block == _tr_block (msgs->torrent, msgs->incoming.blockReq.index, msgs->incoming.blockReq.offset); } /** *** **/ static void updateDesiredRequestCount (tr_peerMsgs * msgs) { tr_torrent * const torrent = msgs->torrent; /* there are lots of reasons we might not want to request any blocks... */ if (tr_torrentIsSeed (torrent) || !tr_torrentHasMetadata (torrent) || msgs->client_is_choked || !msgs->client_is_interested) { msgs->desiredRequestCount = 0; } else { int estimatedBlocksInPeriod; unsigned int rate_Bps; unsigned int irate_Bps; const int floor = 4; const int seconds = REQUEST_BUF_SECS; const uint64_t now = tr_time_msec (); /* Get the rate limit we should use. * FIXME: this needs to consider all the other peers as well... */ rate_Bps = tr_peerGetPieceSpeed_Bps (&msgs->peer, now, TR_PEER_TO_CLIENT); if (tr_torrentUsesSpeedLimit (torrent, TR_PEER_TO_CLIENT)) rate_Bps = MIN (rate_Bps, tr_torrentGetSpeedLimit_Bps (torrent, TR_PEER_TO_CLIENT)); /* honor the session limits, if enabled */ if (tr_torrentUsesSessionLimits (torrent) && tr_sessionGetActiveSpeedLimit_Bps (torrent->session, TR_PEER_TO_CLIENT, &irate_Bps)) rate_Bps = MIN (rate_Bps, irate_Bps); /* use this desired rate to figure out how * many requests we should send to this peer */ estimatedBlocksInPeriod = (rate_Bps * seconds) / torrent->blockSize; msgs->desiredRequestCount = MAX (floor, estimatedBlocksInPeriod); /* honor the peer's maximum request count, if specified */ if (msgs->reqq > 0) if (msgs->desiredRequestCount > msgs->reqq) msgs->desiredRequestCount = msgs->reqq; } } static void updateMetadataRequests (tr_peerMsgs * msgs, time_t now) { int piece; if (msgs->peerSupportsMetadataXfer && tr_torrentGetNextMetadataRequest (msgs->torrent, now, &piece)) { tr_variant tmp; struct evbuffer * payload; struct evbuffer * out = msgs->outMessages; /* build the data message */ tr_variantInitDict (&tmp, 3); tr_variantDictAddInt (&tmp, TR_KEY_msg_type, METADATA_MSG_TYPE_REQUEST); tr_variantDictAddInt (&tmp, TR_KEY_piece, piece); payload = tr_variantToBuf (&tmp, TR_VARIANT_FMT_BENC); dbgmsg (msgs, "requesting metadata piece #%d", piece); /* write it out as a LTEP message to our outMessages buffer */ evbuffer_add_uint32 (out, 2 * sizeof (uint8_t) + evbuffer_get_length (payload)); evbuffer_add_uint8 (out, BT_LTEP); evbuffer_add_uint8 (out, msgs->ut_metadata_id); evbuffer_add_buffer (out, payload); pokeBatchPeriod (msgs, HIGH_PRIORITY_INTERVAL_SECS); dbgOutMessageLen (msgs); /* cleanup */ evbuffer_free (payload); tr_variantFree (&tmp); } } static void updateBlockRequests (tr_peerMsgs * msgs) { if (tr_torrentIsPieceTransferAllowed (msgs->torrent, TR_PEER_TO_CLIENT) && (msgs->desiredRequestCount > 0) && (msgs->peer.pendingReqsToPeer <= (msgs->desiredRequestCount * 0.66))) { int i; int n; tr_block_index_t * blocks; const int numwant = msgs->desiredRequestCount - msgs->peer.pendingReqsToPeer; assert (tr_peerMsgsIsClientInterested (msgs)); assert (!tr_peerMsgsIsClientChoked (msgs)); blocks = tr_new (tr_block_index_t, numwant); tr_peerMgrGetNextRequests (msgs->torrent, &msgs->peer, numwant, blocks, &n, false); for (i=0; itorrent, blocks[i], &req); protocolSendRequest (msgs, &req); } tr_free (blocks); } } static size_t fillOutputBuffer (tr_peerMsgs * msgs, time_t now) { int piece; size_t bytesWritten = 0; struct peer_request req; const bool haveMessages = evbuffer_get_length (msgs->outMessages) != 0; const bool fext = tr_peerIoSupportsFEXT (msgs->io); /** *** Protocol messages **/ if (haveMessages && !msgs->outMessagesBatchedAt) /* fresh batch */ { dbgmsg (msgs, "started an outMessages batch (length is %zu)", evbuffer_get_length (msgs->outMessages)); msgs->outMessagesBatchedAt = now; } else if (haveMessages && ((now - msgs->outMessagesBatchedAt) >= msgs->outMessagesBatchPeriod)) { const size_t len = evbuffer_get_length (msgs->outMessages); /* flush the protocol messages */ dbgmsg (msgs, "flushing outMessages... to %p (length is %zu)", (void*)msgs->io, len); tr_peerIoWriteBuf (msgs->io, msgs->outMessages, false); msgs->clientSentAnythingAt = now; msgs->outMessagesBatchedAt = 0; msgs->outMessagesBatchPeriod = LOW_PRIORITY_INTERVAL_SECS; bytesWritten += len; } /** *** Metadata Pieces **/ if ((tr_peerIoGetWriteBufferSpace (msgs->io, now) >= METADATA_PIECE_SIZE) && popNextMetadataRequest (msgs, &piece)) { char * data; size_t dataLen; bool ok = false; data = tr_torrentGetMetadataPiece (msgs->torrent, piece, &dataLen); if (data != NULL) { tr_variant tmp; struct evbuffer * payload; struct evbuffer * out = msgs->outMessages; /* build the data message */ tr_variantInitDict (&tmp, 3); tr_variantDictAddInt (&tmp, TR_KEY_msg_type, METADATA_MSG_TYPE_DATA); tr_variantDictAddInt (&tmp, TR_KEY_piece, piece); tr_variantDictAddInt (&tmp, TR_KEY_total_size, msgs->torrent->infoDictLength); payload = tr_variantToBuf (&tmp, TR_VARIANT_FMT_BENC); /* write it out as a LTEP message to our outMessages buffer */ evbuffer_add_uint32 (out, 2 * sizeof (uint8_t) + evbuffer_get_length (payload) + dataLen); evbuffer_add_uint8 (out, BT_LTEP); evbuffer_add_uint8 (out, msgs->ut_metadata_id); evbuffer_add_buffer (out, payload); evbuffer_add (out, data, dataLen); pokeBatchPeriod (msgs, HIGH_PRIORITY_INTERVAL_SECS); dbgOutMessageLen (msgs); evbuffer_free (payload); tr_variantFree (&tmp); tr_free (data); ok = true; } if (!ok) /* send a rejection message */ { tr_variant tmp; struct evbuffer * payload; struct evbuffer * out = msgs->outMessages; /* build the rejection message */ tr_variantInitDict (&tmp, 2); tr_variantDictAddInt (&tmp, TR_KEY_msg_type, METADATA_MSG_TYPE_REJECT); tr_variantDictAddInt (&tmp, TR_KEY_piece, piece); payload = tr_variantToBuf (&tmp, TR_VARIANT_FMT_BENC); /* write it out as a LTEP message to our outMessages buffer */ evbuffer_add_uint32 (out, 2 * sizeof (uint8_t) + evbuffer_get_length (payload)); evbuffer_add_uint8 (out, BT_LTEP); evbuffer_add_uint8 (out, msgs->ut_metadata_id); evbuffer_add_buffer (out, payload); pokeBatchPeriod (msgs, HIGH_PRIORITY_INTERVAL_SECS); dbgOutMessageLen (msgs); evbuffer_free (payload); tr_variantFree (&tmp); } } /** *** Data Blocks **/ if ((tr_peerIoGetWriteBufferSpace (msgs->io, now) >= msgs->torrent->blockSize) && popNextRequest (msgs, &req)) { --msgs->prefetchCount; if (requestIsValid (msgs, &req) && tr_torrentPieceIsComplete (msgs->torrent, req.index)) { int err; const uint32_t msglen = 4 + 1 + 4 + 4 + req.length; struct evbuffer * out; struct evbuffer_iovec iovec[1]; out = evbuffer_new (); evbuffer_expand (out, msglen); evbuffer_add_uint32 (out, sizeof (uint8_t) + 2 * sizeof (uint32_t) + req.length); evbuffer_add_uint8 (out, BT_PIECE); evbuffer_add_uint32 (out, req.index); evbuffer_add_uint32 (out, req.offset); evbuffer_reserve_space (out, req.length, iovec, 1); err = tr_cacheReadBlock (getSession (msgs)->cache, msgs->torrent, req.index, req.offset, req.length, iovec[0].iov_base); iovec[0].iov_len = req.length; evbuffer_commit_space (out, iovec, 1); /* check the piece if it needs checking... */ if (!err && tr_torrentPieceNeedsCheck (msgs->torrent, req.index)) if ((err = !tr_torrentCheckPiece (msgs->torrent, req.index))) tr_torrentSetLocalError (msgs->torrent, _("Please Verify Local Data! Piece #%zu is corrupt."), (size_t)req.index); if (err) { if (fext) protocolSendReject (msgs, &req); } else { const size_t n = evbuffer_get_length (out); dbgmsg (msgs, "sending block %u:%u->%u", req.index, req.offset, req.length); assert (n == msglen); tr_peerIoWriteBuf (msgs->io, out, true); bytesWritten += n; msgs->clientSentAnythingAt = now; tr_historyAdd (&msgs->peer.blocksSentToPeer, tr_time (), 1); } evbuffer_free (out); if (err) { bytesWritten = 0; msgs = NULL; } } else if (fext) /* peer needs a reject message */ { protocolSendReject (msgs, &req); } if (msgs != NULL) prefetchPieces (msgs); } /** *** Keepalive **/ if ((msgs != NULL) && (msgs->clientSentAnythingAt != 0) && ((now - msgs->clientSentAnythingAt) > KEEPALIVE_INTERVAL_SECS)) { dbgmsg (msgs, "sending a keepalive message"); evbuffer_add_uint32 (msgs->outMessages, 0); pokeBatchPeriod (msgs, IMMEDIATE_PRIORITY_INTERVAL_SECS); } return bytesWritten; } static int peerPulse (void * vmsgs) { tr_peerMsgs * msgs = vmsgs; const time_t now = tr_time (); if (tr_isPeerIo (msgs->io)) { updateDesiredRequestCount (msgs); updateBlockRequests (msgs); updateMetadataRequests (msgs, now); } for (;;) if (fillOutputBuffer (msgs, now) < 1) break; return true; /* loop forever */ } void tr_peerMsgsPulse (tr_peerMsgs * msgs) { if (msgs != NULL) peerPulse (msgs); } static void gotError (tr_peerIo * io UNUSED, short what, void * vmsgs) { if (what & BEV_EVENT_TIMEOUT) dbgmsg (vmsgs, "libevent got a timeout, what=%hd", what); if (what & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) dbgmsg (vmsgs, "libevent got an error! what=%hd, errno=%d (%s)", what, errno, tr_strerror (errno)); fireError (vmsgs, ENOTCONN); } static void sendBitfield (tr_peerMsgs * msgs) { void * bytes; size_t byte_count = 0; struct evbuffer * out = msgs->outMessages; assert (tr_torrentHasMetadata (msgs->torrent)); bytes = tr_torrentCreatePieceBitfield (msgs->torrent, &byte_count); evbuffer_add_uint32 (out, sizeof (uint8_t) + byte_count); evbuffer_add_uint8 (out, BT_BITFIELD); evbuffer_add (out, bytes, byte_count); dbgmsg (msgs, "sending bitfield... outMessage size is now %zu", evbuffer_get_length (out)); pokeBatchPeriod (msgs, IMMEDIATE_PRIORITY_INTERVAL_SECS); tr_free (bytes); } static void tellPeerWhatWeHave (tr_peerMsgs * msgs) { const bool fext = tr_peerIoSupportsFEXT (msgs->io); if (fext && tr_torrentHasAll (msgs->torrent)) { protocolSendHaveAll (msgs); } else if (fext && tr_torrentHasNone (msgs->torrent)) { protocolSendHaveNone (msgs); } else if (!tr_torrentHasNone (msgs->torrent)) { sendBitfield (msgs); } } /** *** **/ /* some peers give us error messages if we send more than this many peers in a single pex message http://wiki.theory.org/BitTorrentPeerExchangeConventions */ #define MAX_PEX_ADDED 50 #define MAX_PEX_DROPPED 50 typedef struct { tr_pex * added; tr_pex * dropped; tr_pex * elements; int addedCount; int droppedCount; int elementCount; } PexDiffs; static void pexAddedCb (void * vpex, void * userData) { PexDiffs * diffs = userData; tr_pex * pex = vpex; if (diffs->addedCount < MAX_PEX_ADDED) { diffs->added[diffs->addedCount++] = *pex; diffs->elements[diffs->elementCount++] = *pex; } } static inline void pexDroppedCb (void * vpex, void * userData) { PexDiffs * diffs = userData; tr_pex * pex = vpex; if (diffs->droppedCount < MAX_PEX_DROPPED) { diffs->dropped[diffs->droppedCount++] = *pex; } } static inline void pexElementCb (void * vpex, void * userData) { PexDiffs * diffs = userData; tr_pex * pex = vpex; diffs->elements[diffs->elementCount++] = *pex; } typedef void (tr_set_func)(void * element, void * userData); /** * @brief find the differences and commonalities in two sorted sets * @param a the first set * @param aCount the number of elements in the set 'a' * @param b the second set * @param bCount the number of elements in the set 'b' * @param compare the sorting method for both sets * @param elementSize the sizeof the element in the two sorted sets * @param in_a called for items in set 'a' but not set 'b' * @param in_b called for items in set 'b' but not set 'a' * @param in_both called for items that are in both sets * @param userData user data passed along to in_a, in_b, and in_both */ static void tr_set_compare (const void * va, size_t aCount, const void * vb, size_t bCount, int compare (const void * a, const void * b), size_t elementSize, tr_set_func in_a_cb, tr_set_func in_b_cb, tr_set_func in_both_cb, void * userData) { const uint8_t * a = va; const uint8_t * b = vb; const uint8_t * aend = a + elementSize * aCount; const uint8_t * bend = b + elementSize * bCount; while (a != aend || b != bend) { if (a == aend) { (*in_b_cb)((void*)b, userData); b += elementSize; } else if (b == bend) { (*in_a_cb)((void*)a, userData); a += elementSize; } else { const int val = (*compare)(a, b); if (!val) { (*in_both_cb)((void*)a, userData); a += elementSize; b += elementSize; } else if (val < 0) { (*in_a_cb)((void*)a, userData); a += elementSize; } else if (val > 0) { (*in_b_cb)((void*)b, userData); b += elementSize; } } } } static void sendPex (tr_peerMsgs * msgs) { if (msgs->peerSupportsPex && tr_torrentAllowsPex (msgs->torrent)) { PexDiffs diffs; PexDiffs diffs6; tr_pex * newPex = NULL; tr_pex * newPex6 = NULL; const int newCount = tr_peerMgrGetPeers (msgs->torrent, &newPex, TR_AF_INET, TR_PEERS_CONNECTED, MAX_PEX_PEER_COUNT); const int newCount6 = tr_peerMgrGetPeers (msgs->torrent, &newPex6, TR_AF_INET6, TR_PEERS_CONNECTED, MAX_PEX_PEER_COUNT); /* build the diffs */ diffs.added = tr_new (tr_pex, newCount); diffs.addedCount = 0; diffs.dropped = tr_new (tr_pex, msgs->pexCount); diffs.droppedCount = 0; diffs.elements = tr_new (tr_pex, newCount + msgs->pexCount); diffs.elementCount = 0; tr_set_compare (msgs->pex, msgs->pexCount, newPex, newCount, tr_pexCompare, sizeof (tr_pex), pexDroppedCb, pexAddedCb, pexElementCb, &diffs); diffs6.added = tr_new (tr_pex, newCount6); diffs6.addedCount = 0; diffs6.dropped = tr_new (tr_pex, msgs->pexCount6); diffs6.droppedCount = 0; diffs6.elements = tr_new (tr_pex, newCount6 + msgs->pexCount6); diffs6.elementCount = 0; tr_set_compare (msgs->pex6, msgs->pexCount6, newPex6, newCount6, tr_pexCompare, sizeof (tr_pex), pexDroppedCb, pexAddedCb, pexElementCb, &diffs6); dbgmsg ( msgs, "pex: old peer count %d+%d, new peer count %d+%d, " "added %d+%d, removed %d+%d", msgs->pexCount, msgs->pexCount6, newCount, newCount6, diffs.addedCount, diffs6.addedCount, diffs.droppedCount, diffs6.droppedCount); if (!diffs.addedCount && !diffs.droppedCount && !diffs6.addedCount && !diffs6.droppedCount) { tr_free (diffs.elements); tr_free (diffs6.elements); } else { int i; tr_variant val; uint8_t * tmp, *walk; struct evbuffer * payload; struct evbuffer * out = msgs->outMessages; /* update peer */ tr_free (msgs->pex); msgs->pex = diffs.elements; msgs->pexCount = diffs.elementCount; tr_free (msgs->pex6); msgs->pex6 = diffs6.elements; msgs->pexCount6 = diffs6.elementCount; /* build the pex payload */ tr_variantInitDict (&val, 3); /* ipv6 support: left as 3: * speed vs. likelihood? */ if (diffs.addedCount > 0) { /* "added" */ tmp = walk = tr_new (uint8_t, diffs.addedCount * 6); for (i = 0; i < diffs.addedCount; ++i) { memcpy (walk, &diffs.added[i].addr.addr, 4); walk += 4; memcpy (walk, &diffs.added[i].port, 2); walk += 2; } assert ((walk - tmp) == diffs.addedCount * 6); tr_variantDictAddRaw (&val, TR_KEY_added, tmp, walk - tmp); tr_free (tmp); /* "added.f" * unset each holepunch flag because we don't support it. */ tmp = walk = tr_new (uint8_t, diffs.addedCount); for (i = 0; i < diffs.addedCount; ++i) *walk++ = diffs.added[i].flags & ~ADDED_F_HOLEPUNCH; assert ((walk - tmp) == diffs.addedCount); tr_variantDictAddRaw (&val, TR_KEY_added_f, tmp, walk - tmp); tr_free (tmp); } if (diffs.droppedCount > 0) { /* "dropped" */ tmp = walk = tr_new (uint8_t, diffs.droppedCount * 6); for (i = 0; i < diffs.droppedCount; ++i) { memcpy (walk, &diffs.dropped[i].addr.addr, 4); walk += 4; memcpy (walk, &diffs.dropped[i].port, 2); walk += 2; } assert ((walk - tmp) == diffs.droppedCount * 6); tr_variantDictAddRaw (&val, TR_KEY_dropped, tmp, walk - tmp); tr_free (tmp); } if (diffs6.addedCount > 0) { /* "added6" */ tmp = walk = tr_new (uint8_t, diffs6.addedCount * 18); for (i = 0; i < diffs6.addedCount; ++i) { memcpy (walk, &diffs6.added[i].addr.addr.addr6.s6_addr, 16); walk += 16; memcpy (walk, &diffs6.added[i].port, 2); walk += 2; } assert ((walk - tmp) == diffs6.addedCount * 18); tr_variantDictAddRaw (&val, TR_KEY_added6, tmp, walk - tmp); tr_free (tmp); /* "added6.f" * unset each holepunch flag because we don't support it. */ tmp = walk = tr_new (uint8_t, diffs6.addedCount); for (i = 0; i < diffs6.addedCount; ++i) *walk++ = diffs6.added[i].flags & ~ADDED_F_HOLEPUNCH; assert ((walk - tmp) == diffs6.addedCount); tr_variantDictAddRaw (&val, TR_KEY_added6_f, tmp, walk - tmp); tr_free (tmp); } if (diffs6.droppedCount > 0) { /* "dropped6" */ tmp = walk = tr_new (uint8_t, diffs6.droppedCount * 18); for (i = 0; i < diffs6.droppedCount; ++i) { memcpy (walk, &diffs6.dropped[i].addr.addr.addr6.s6_addr, 16); walk += 16; memcpy (walk, &diffs6.dropped[i].port, 2); walk += 2; } assert ((walk - tmp) == diffs6.droppedCount * 18); tr_variantDictAddRaw (&val, TR_KEY_dropped6, tmp, walk - tmp); tr_free (tmp); } /* write the pex message */ payload = tr_variantToBuf (&val, TR_VARIANT_FMT_BENC); evbuffer_add_uint32 (out, 2 * sizeof (uint8_t) + evbuffer_get_length (payload)); evbuffer_add_uint8 (out, BT_LTEP); evbuffer_add_uint8 (out, msgs->ut_pex_id); evbuffer_add_buffer (out, payload); pokeBatchPeriod (msgs, HIGH_PRIORITY_INTERVAL_SECS); dbgmsg (msgs, "sending a pex message; outMessage size is now %zu", evbuffer_get_length (out)); dbgOutMessageLen (msgs); evbuffer_free (payload); tr_variantFree (&val); } /* cleanup */ tr_free (diffs.added); tr_free (diffs.dropped); tr_free (newPex); tr_free (diffs6.added); tr_free (diffs6.dropped); tr_free (newPex6); /*msgs->clientSentPexAt = tr_time ();*/ } } static void pexPulse (evutil_socket_t foo UNUSED, short bar UNUSED, void * vmsgs) { struct tr_peerMsgs * msgs = vmsgs; sendPex (msgs); assert (msgs->pexTimer != NULL); tr_timerAdd (msgs->pexTimer, PEX_INTERVAL_SECS, 0); } /*** **** tr_peer virtual functions ***/ static bool peermsgs_is_transferring_pieces (const struct tr_peer * peer, uint64_t now, tr_direction direction, unsigned int * setme_Bps) { unsigned int Bps = 0; if (tr_isPeerMsgs (peer)) { const tr_peerMsgs * msgs = (const tr_peerMsgs *) peer; Bps = tr_peerIoGetPieceSpeed_Bps (msgs->io, now, direction); } if (setme_Bps != NULL) *setme_Bps = Bps; return Bps > 0; } static void peermsgs_destruct (tr_peer * peer) { tr_peerMsgs * msgs = PEER_MSGS (peer); assert (msgs != NULL); tr_peerMsgsSetActive (msgs, TR_UP, false); tr_peerMsgsSetActive (msgs, TR_DOWN, false); if (msgs->pexTimer != NULL) event_free (msgs->pexTimer); if (msgs->incoming.block != NULL) evbuffer_free (msgs->incoming.block); if (msgs->io) { tr_peerIoClear (msgs->io); tr_peerIoUnref (msgs->io); /* balanced by the ref in handshakeDoneCB () */ } evbuffer_free (msgs->outMessages); tr_free (msgs->pex6); tr_free (msgs->pex); tr_peerDestruct (&msgs->peer); memset (msgs, ~0, sizeof (tr_peerMsgs)); } static const struct tr_peer_virtual_funcs my_funcs = { .destruct = peermsgs_destruct, .is_transferring_pieces = peermsgs_is_transferring_pieces }; /*** **** ***/ time_t tr_peerMsgsGetConnectionAge (const tr_peerMsgs * msgs) { assert (tr_isPeerMsgs (msgs)); return tr_peerIoGetAge (msgs->io); } bool tr_peerMsgsIsPeerChoked (const tr_peerMsgs * msgs) { assert (tr_isPeerMsgs (msgs)); return msgs->peer_is_choked; } bool tr_peerMsgsIsPeerInterested (const tr_peerMsgs * msgs) { assert (tr_isPeerMsgs (msgs)); return msgs->peer_is_interested; } bool tr_peerMsgsIsClientChoked (const tr_peerMsgs * msgs) { assert (tr_isPeerMsgs (msgs)); return msgs->client_is_choked; } bool tr_peerMsgsIsClientInterested (const tr_peerMsgs * msgs) { assert (tr_isPeerMsgs (msgs)); return msgs->client_is_interested; } bool tr_peerMsgsIsUtpConnection (const tr_peerMsgs * msgs) { assert (tr_isPeerMsgs (msgs)); return msgs->io->utp_socket != NULL; } bool tr_peerMsgsIsEncrypted (const tr_peerMsgs * msgs) { assert (tr_isPeerMsgs (msgs)); return tr_peerIoIsEncrypted (msgs->io); } bool tr_peerMsgsIsIncomingConnection (const tr_peerMsgs * msgs) { assert (tr_isPeerMsgs (msgs)); return tr_peerIoIsIncoming (msgs->io); } /*** **** ***/ bool tr_isPeerMsgs (const void * msgs) { /* FIXME: this is pretty crude */ return (msgs != NULL) && (((struct tr_peerMsgs*)msgs)->magic_number == MAGIC_NUMBER); } tr_peerMsgs * tr_peerMsgsCast (void * vm) { return tr_isPeerMsgs(vm) ? vm : NULL; } tr_peerMsgs * tr_peerMsgsNew (struct tr_torrent * torrent, struct tr_peerIo * io, tr_peer_callback callback, void * callbackData) { tr_peerMsgs * m; assert (io != NULL); m = tr_new0 (tr_peerMsgs, 1); tr_peerConstruct (&m->peer, torrent); m->peer.funcs = &my_funcs; m->magic_number = MAGIC_NUMBER; m->client_is_choked = true; m->peer_is_choked = true; m->client_is_interested = false; m->peer_is_interested = false; m->is_active[TR_UP] = false; m->is_active[TR_DOWN] = false; m->callback = callback; m->callbackData = callbackData; m->io = io; m->torrent = torrent; m->state = AWAITING_BT_LENGTH; m->outMessages = evbuffer_new (); m->outMessagesBatchedAt = 0; m->outMessagesBatchPeriod = LOW_PRIORITY_INTERVAL_SECS; if (tr_torrentAllowsPex (torrent)) { m->pexTimer = evtimer_new (torrent->session->event_base, pexPulse, m); tr_timerAdd (m->pexTimer, PEX_INTERVAL_SECS, 0); } if (tr_peerIoSupportsUTP (m->io)) { const tr_address * addr = tr_peerIoGetAddress (m->io, NULL); tr_peerMgrSetUtpSupported (torrent, addr); tr_peerMgrSetUtpFailed (torrent, addr, false); } if (tr_peerIoSupportsLTEP (m->io)) sendLtepHandshake (m); tellPeerWhatWeHave (m); if (tr_dhtEnabled (torrent->session) && tr_peerIoSupportsDHT (m->io)) { /* Only send PORT over IPv6 when the IPv6 DHT is running (BEP-32). */ const struct tr_address *addr = tr_peerIoGetAddress (m->io, NULL); if (addr->type == TR_AF_INET || tr_globalIPv6 ()) protocolSendPort (m, tr_dhtPort (torrent->session)); } tr_peerIoSetIOFuncs (m->io, canRead, didWrite, gotError, m); updateDesiredRequestCount (m); return m; } transmission-2.92/libtransmission/PaxHeaders.4960/tr-utp.h0000644000000000000000000000013212512314245020501 xustar0030 mtime=1428789413.091287652 30 atime=1428789413.091287652 30 ctime=1457295919.835805112 transmission-2.92/libtransmission/tr-utp.h0000644000175000017500000000304012512314245022123 0ustar00mikedldmikedld00000000000000/* Copyright (c) 2010 by Juliusz Chroboczek 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. */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef _TR_UTP_H_ #define _TR_UTP_H_ int tr_utpPacket (const unsigned char *buf, size_t buflen, const struct sockaddr *from, socklen_t fromlen, tr_session *ss); void tr_utpClose (tr_session *); void tr_utpSendTo (void *closure, const unsigned char *buf, size_t buflen, const struct sockaddr *to, socklen_t tolen); #endif /* #ifndef _TR_UTP_H_ */ transmission-2.92/libtransmission/PaxHeaders.4960/handshake.c0000644000000000000000000000013212641272401021167 xustar0030 mtime=1451586817.582878622 30 atime=1451586817.582878622 30 ctime=1457295920.015808173 transmission-2.92/libtransmission/handshake.c0000644000175000017500000010576112641272401022626 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: handshake.c 14644 2015-12-29 19:37:31Z mikedld $ */ #include #include #include /* strcmp (), strlen () */ #include #include #include "transmission.h" #include "clients.h" #include "crypto-utils.h" #include "handshake.h" #include "log.h" #include "peer-io.h" #include "peer-mgr.h" #include "session.h" #include "torrent.h" #include "tr-dht.h" #include "utils.h" /* enable LibTransmission extension protocol */ #define ENABLE_LTEP * / /* fast extensions */ #define ENABLE_FAST * / /* DHT */ #define ENABLE_DHT * / /*** **** ***/ #define HANDSHAKE_NAME "\023BitTorrent protocol" enum { /* BitTorrent Handshake Constants */ HANDSHAKE_NAME_LEN = 20, HANDSHAKE_FLAGS_LEN = 8, HANDSHAKE_SIZE = 68, INCOMING_HANDSHAKE_LEN = 48, /* Encryption Constants */ PadA_MAXLEN = 512, PadB_MAXLEN = 512, PadC_MAXLEN = 512, PadD_MAXLEN = 512, VC_LENGTH = 8, CRYPTO_PROVIDE_PLAINTEXT = 1, CRYPTO_PROVIDE_CRYPTO = 2, /* how long to wait before giving up on a handshake */ HANDSHAKE_TIMEOUT_SEC = 30 }; #ifdef ENABLE_LTEP #define HANDSHAKE_HAS_LTEP(bits)(((bits)[5] & 0x10) != 0) #define HANDSHAKE_SET_LTEP(bits)((bits)[5] |= 0x10) #else #define HANDSHAKE_HAS_LTEP(bits)(false) #define HANDSHAKE_SET_LTEP(bits)((void)0) #endif #ifdef ENABLE_FAST #define HANDSHAKE_HAS_FASTEXT(bits)(((bits)[7] & 0x04) != 0) #define HANDSHAKE_SET_FASTEXT(bits)((bits)[7] |= 0x04) #else #define HANDSHAKE_HAS_FASTEXT(bits)(false) #define HANDSHAKE_SET_FASTEXT(bits)((void)0) #endif #ifdef ENABLE_DHT #define HANDSHAKE_HAS_DHT(bits)(((bits)[7] & 0x01) != 0) #define HANDSHAKE_SET_DHT(bits)((bits)[7] |= 0x01) #else #define HANDSHAKE_HAS_DHT(bits)(false) #define HANDSHAKE_SET_DHT(bits)((void)0) #endif /* http://www.azureuswiki.com/index.php/Extension_negotiation_protocol these macros are to be used if both extended messaging and the azureus protocol is supported, they indicate which protocol is preferred */ #define HANDSHAKE_GET_EXTPREF(reserved) ((reserved)[5] & 0x03) #define HANDSHAKE_SET_EXTPREF(reserved, val)((reserved)[5] |= 0x03 & (val)) /** *** **/ typedef enum { /* incoming */ AWAITING_HANDSHAKE, AWAITING_PEER_ID, AWAITING_YA, AWAITING_PAD_A, AWAITING_CRYPTO_PROVIDE, AWAITING_PAD_C, AWAITING_IA, AWAITING_PAYLOAD_STREAM, /* outgoing */ AWAITING_YB, AWAITING_VC, AWAITING_CRYPTO_SELECT, AWAITING_PAD_D, N_STATES } handshake_state_t; struct tr_handshake { bool haveReadAnythingFromPeer; bool havePeerID; bool haveSentBitTorrentHandshake; tr_peerIo * io; tr_crypto * crypto; tr_session * session; handshake_state_t state; tr_encryption_mode encryptionMode; uint16_t pad_c_len; uint16_t pad_d_len; uint16_t ia_len; uint32_t crypto_select; uint32_t crypto_provide; uint8_t myReq1[SHA_DIGEST_LENGTH]; handshakeDoneCB doneCB; void * doneUserData; struct event * timeout_timer; }; /** *** **/ #define dbgmsg(handshake, ...) \ do { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, tr_peerIoGetAddrStr (handshake->io), __VA_ARGS__); \ } while (0) static const char* getStateName (const handshake_state_t state) { static const char * const state_strings[N_STATES] = { /* AWAITING_HANDSHAKE */ "awaiting handshake", /* AWAITING_PEER_ID */ "awaiting peer id", /* AWAITING_YA */ "awaiting ya", /* AWAITING_PAD_A */ "awaiting pad a", /* AWAITING_CRYPTO_PROVIDE */ "awaiting crypto_provide", /* AWAITING_PAD_C */ "awaiting pad c", /* AWAITING_IA */ "awaiting ia", /* AWAITING_PAYLOAD_STREAM */ "awaiting payload stream", /* AWAITING_YB */ "awaiting yb", /* AWAITING_VC */ "awaiting vc", /* AWAITING_CRYPTO_SELECT */ "awaiting crypto select", /* AWAITING_PAD_D */ "awaiting pad d" }; return statestate = state; } static void setReadState (tr_handshake * handshake, handshake_state_t state) { setState (handshake, state); } static bool buildHandshakeMessage (tr_handshake * handshake, uint8_t * buf) { const unsigned char * peer_id = NULL; const uint8_t * torrentHash; tr_torrent * tor; bool success; if ((torrentHash = tr_cryptoGetTorrentHash (handshake->crypto))) if ((tor = tr_torrentFindFromHash (handshake->session, torrentHash))) peer_id = tr_torrentGetPeerId (tor); if (peer_id == NULL) { success = false; } else { uint8_t * walk = buf; memcpy (walk, HANDSHAKE_NAME, HANDSHAKE_NAME_LEN); walk += HANDSHAKE_NAME_LEN; memset (walk, 0, HANDSHAKE_FLAGS_LEN); HANDSHAKE_SET_LTEP (walk); HANDSHAKE_SET_FASTEXT (walk); /* Note that this doesn't depend on whether the torrent is private. * We don't accept DHT peers for a private torrent, * but we participate in the DHT regardless. */ if (tr_dhtEnabled (handshake->session)) HANDSHAKE_SET_DHT (walk); walk += HANDSHAKE_FLAGS_LEN; memcpy (walk, torrentHash, SHA_DIGEST_LENGTH); walk += SHA_DIGEST_LENGTH; memcpy (walk, peer_id, PEER_ID_LEN); walk += PEER_ID_LEN; assert (walk - buf == HANDSHAKE_SIZE); success = true; } return success; } static ReadState tr_handshakeDone (tr_handshake * handshake, bool isConnected); typedef enum { HANDSHAKE_OK, HANDSHAKE_ENCRYPTION_WRONG, HANDSHAKE_BAD_TORRENT, HANDSHAKE_PEER_IS_SELF, } handshake_parse_err_t; static handshake_parse_err_t parseHandshake (tr_handshake * handshake, struct evbuffer * inbuf) { uint8_t name[HANDSHAKE_NAME_LEN]; uint8_t reserved[HANDSHAKE_FLAGS_LEN]; uint8_t hash[SHA_DIGEST_LENGTH]; tr_torrent * tor; uint8_t peer_id[PEER_ID_LEN]; dbgmsg (handshake, "payload: need %d, got %zu", HANDSHAKE_SIZE, evbuffer_get_length (inbuf)); if (evbuffer_get_length (inbuf) < HANDSHAKE_SIZE) return HANDSHAKE_ENCRYPTION_WRONG; /* confirm the protocol */ tr_peerIoReadBytes (handshake->io, inbuf, name, HANDSHAKE_NAME_LEN); if (memcmp (name, HANDSHAKE_NAME, HANDSHAKE_NAME_LEN)) return HANDSHAKE_ENCRYPTION_WRONG; /* read the reserved bytes */ tr_peerIoReadBytes (handshake->io, inbuf, reserved, HANDSHAKE_FLAGS_LEN); /* torrent hash */ tr_peerIoReadBytes (handshake->io, inbuf, hash, sizeof (hash)); assert (tr_peerIoHasTorrentHash (handshake->io)); if (!tr_torrentExists (handshake->session, hash) || memcmp (hash, tr_peerIoGetTorrentHash (handshake->io), SHA_DIGEST_LENGTH)) { dbgmsg (handshake, "peer returned the wrong hash. wtf?"); return HANDSHAKE_BAD_TORRENT; } /* peer_id */ tr_peerIoReadBytes (handshake->io, inbuf, peer_id, sizeof (peer_id)); tr_peerIoSetPeersId (handshake->io, peer_id); /* peer id */ handshake->havePeerID = true; dbgmsg (handshake, "peer-id is [%*.*s]", PEER_ID_LEN, PEER_ID_LEN, peer_id); tor = tr_torrentFindFromHash (handshake->session, hash); if (!memcmp (peer_id, tr_torrentGetPeerId(tor), PEER_ID_LEN)) { dbgmsg (handshake, "streuth! we've connected to ourselves."); return HANDSHAKE_PEER_IS_SELF; } /** *** Extensions **/ tr_peerIoEnableDHT (handshake->io, HANDSHAKE_HAS_DHT (reserved)); tr_peerIoEnableLTEP (handshake->io, HANDSHAKE_HAS_LTEP (reserved)); tr_peerIoEnableFEXT (handshake->io, HANDSHAKE_HAS_FASTEXT (reserved)); return HANDSHAKE_OK; } /*** **** **** OUTGOING CONNECTIONS **** ***/ /* 1 A->B: Diffie Hellman Ya, PadA */ static void sendYa (tr_handshake * handshake) { int len; const uint8_t * public_key; char outbuf[ KEY_LEN + PadA_MAXLEN ]; char *walk = outbuf; /* add our public key (Ya) */ public_key = tr_cryptoGetMyPublicKey (handshake->crypto, &len); assert (len == KEY_LEN); assert (public_key); memcpy (walk, public_key, len); walk += len; /* add some bullshit padding */ len = tr_rand_int (PadA_MAXLEN); tr_rand_buffer (walk, len); walk += len; /* send it */ setReadState (handshake, AWAITING_YB); tr_peerIoWriteBytes (handshake->io, outbuf, walk - outbuf, false); } static uint32_t getCryptoProvide (const tr_handshake * handshake) { uint32_t provide = 0; switch (handshake->encryptionMode) { case TR_ENCRYPTION_REQUIRED: case TR_ENCRYPTION_PREFERRED: provide |= CRYPTO_PROVIDE_CRYPTO; break; case TR_CLEAR_PREFERRED: provide |= CRYPTO_PROVIDE_CRYPTO | CRYPTO_PROVIDE_PLAINTEXT; break; } return provide; } static uint32_t getCryptoSelect (const tr_handshake * handshake, uint32_t crypto_provide) { uint32_t choices[2]; int i; int nChoices = 0; switch (handshake->encryptionMode) { case TR_ENCRYPTION_REQUIRED: choices[nChoices++] = CRYPTO_PROVIDE_CRYPTO; break; case TR_ENCRYPTION_PREFERRED: choices[nChoices++] = CRYPTO_PROVIDE_CRYPTO; choices[nChoices++] = CRYPTO_PROVIDE_PLAINTEXT; break; case TR_CLEAR_PREFERRED: choices[nChoices++] = CRYPTO_PROVIDE_PLAINTEXT; choices[nChoices++] = CRYPTO_PROVIDE_CRYPTO; break; } for (i=0; icrypto, name, 4, NULL, 0, hash); } static ReadState readYb (tr_handshake * handshake, struct evbuffer * inbuf) { bool isEncrypted; uint8_t yb[KEY_LEN]; struct evbuffer * outbuf; size_t needlen = HANDSHAKE_NAME_LEN; if (evbuffer_get_length (inbuf) < needlen) return READ_LATER; isEncrypted = memcmp (evbuffer_pullup (inbuf, HANDSHAKE_NAME_LEN), HANDSHAKE_NAME, HANDSHAKE_NAME_LEN) != 0; if (isEncrypted) { needlen = KEY_LEN; if (evbuffer_get_length (inbuf) < needlen) return READ_LATER; } dbgmsg (handshake, "got an %s handshake", (isEncrypted ? "encrypted" : "plain")); tr_peerIoSetEncryption (handshake->io, isEncrypted ? PEER_ENCRYPTION_RC4 : PEER_ENCRYPTION_NONE); if (!isEncrypted) { setState (handshake, AWAITING_HANDSHAKE); return READ_NOW; } handshake->haveReadAnythingFromPeer = true; /* compute the secret */ evbuffer_remove (inbuf, yb, KEY_LEN); tr_cryptoComputeSecret (handshake->crypto, yb); /* now send these: HASH ('req1', S), HASH ('req2', SKEY) xor HASH ('req3', S), * ENCRYPT (VC, crypto_provide, len (PadC), PadC, len (IA)), ENCRYPT (IA) */ outbuf = evbuffer_new (); /* HASH ('req1', S) */ { uint8_t req1[SHA_DIGEST_LENGTH]; computeRequestHash (handshake, "req1", req1); evbuffer_add (outbuf, req1, SHA_DIGEST_LENGTH); } /* HASH ('req2', SKEY) xor HASH ('req3', S) */ { int i; uint8_t req2[SHA_DIGEST_LENGTH]; uint8_t req3[SHA_DIGEST_LENGTH]; uint8_t buf[SHA_DIGEST_LENGTH]; tr_sha1 (req2, "req2", 4, tr_cryptoGetTorrentHash (handshake->crypto), SHA_DIGEST_LENGTH, NULL); computeRequestHash (handshake, "req3", req3); for (i=0; iio, outbuf, false); tr_cryptoEncryptInit (handshake->crypto); tr_peerIoSetEncryption (handshake->io, PEER_ENCRYPTION_RC4); evbuffer_add (outbuf, vc, VC_LENGTH); evbuffer_add_uint32 (outbuf, getCryptoProvide (handshake)); evbuffer_add_uint16 (outbuf, 0); } /* ENCRYPT len (IA)), ENCRYPT (IA) */ { uint8_t msg[HANDSHAKE_SIZE]; if (!buildHandshakeMessage (handshake, msg)) return tr_handshakeDone (handshake, false); evbuffer_add_uint16 (outbuf, sizeof (msg)); evbuffer_add (outbuf, msg, sizeof (msg)); handshake->haveSentBitTorrentHandshake = true; } /* send it */ tr_cryptoDecryptInit (handshake->crypto); setReadState (handshake, AWAITING_VC); tr_peerIoWriteBuf (handshake->io, outbuf, false); /* cleanup */ evbuffer_free (outbuf); return READ_LATER; } static ReadState readVC (tr_handshake * handshake, struct evbuffer * inbuf) { uint8_t tmp[VC_LENGTH]; const int key_len = VC_LENGTH; const uint8_t key[VC_LENGTH] = { 0, 0, 0, 0, 0, 0, 0, 0 }; /* note: this works w/o having to `unwind' the buffer if * we read too much, but it is pretty brute-force. * it would be nice to make this cleaner. */ for (;;) { if (evbuffer_get_length (inbuf) < VC_LENGTH) { dbgmsg (handshake, "not enough bytes... returning read_more"); return READ_LATER; } memcpy (tmp, evbuffer_pullup (inbuf, key_len), key_len); tr_cryptoDecryptInit (handshake->crypto); tr_cryptoDecrypt (handshake->crypto, key_len, tmp, tmp); if (!memcmp (tmp, key, key_len)) break; evbuffer_drain (inbuf, 1); } dbgmsg (handshake, "got it!"); evbuffer_drain (inbuf, key_len); setState (handshake, AWAITING_CRYPTO_SELECT); return READ_NOW; } static ReadState readCryptoSelect (tr_handshake * handshake, struct evbuffer * inbuf) { uint16_t pad_d_len; uint32_t crypto_select; static const size_t needlen = sizeof (uint32_t) + sizeof (uint16_t); if (evbuffer_get_length (inbuf) < needlen) return READ_LATER; tr_peerIoReadUint32 (handshake->io, inbuf, &crypto_select); handshake->crypto_select = crypto_select; dbgmsg (handshake, "crypto select is %d", (int)crypto_select); if (!(crypto_select & getCryptoProvide (handshake))) { dbgmsg (handshake, "peer selected an encryption option we didn't offer"); return tr_handshakeDone (handshake, false); } tr_peerIoReadUint16 (handshake->io, inbuf, &pad_d_len); dbgmsg (handshake, "pad_d_len is %d", (int)pad_d_len); if (pad_d_len > 512) { dbgmsg (handshake, "encryption handshake: pad_d_len is too long"); return tr_handshakeDone (handshake, false); } handshake->pad_d_len = pad_d_len; setState (handshake, AWAITING_PAD_D); return READ_NOW; } static ReadState readPadD (tr_handshake * handshake, struct evbuffer * inbuf) { const size_t needlen = handshake->pad_d_len; dbgmsg (handshake, "pad d: need %zu, got %zu", needlen, evbuffer_get_length (inbuf)); if (evbuffer_get_length (inbuf) < needlen) return READ_LATER; tr_peerIoDrain (handshake->io, inbuf, needlen); tr_peerIoSetEncryption (handshake->io, handshake->crypto_select); setState (handshake, AWAITING_HANDSHAKE); return READ_NOW; } /*** **** **** INCOMING CONNECTIONS **** ***/ static ReadState readHandshake (tr_handshake * handshake, struct evbuffer * inbuf) { uint8_t pstrlen; uint8_t pstr[20]; uint8_t reserved[HANDSHAKE_FLAGS_LEN]; uint8_t hash[SHA_DIGEST_LENGTH]; dbgmsg (handshake, "payload: need %d, got %zu", INCOMING_HANDSHAKE_LEN, evbuffer_get_length (inbuf)); if (evbuffer_get_length (inbuf) < INCOMING_HANDSHAKE_LEN) return READ_LATER; handshake->haveReadAnythingFromPeer = true; pstrlen = evbuffer_pullup (inbuf, 1)[0]; /* peek, don't read. We may be handing inbuf to AWAITING_YA */ if (pstrlen == 19) /* unencrypted */ { tr_peerIoSetEncryption (handshake->io, PEER_ENCRYPTION_NONE); if (handshake->encryptionMode == TR_ENCRYPTION_REQUIRED) { dbgmsg (handshake, "peer is unencrypted, and we're disallowing that"); return tr_handshakeDone (handshake, false); } } else /* encrypted or corrupt */ { tr_peerIoSetEncryption (handshake->io, PEER_ENCRYPTION_RC4); if (tr_peerIoIsIncoming (handshake->io)) { dbgmsg (handshake, "I think peer is sending us an encrypted handshake..."); setState (handshake, AWAITING_YA); return READ_NOW; } tr_cryptoDecrypt (handshake->crypto, 1, &pstrlen, &pstrlen); if (pstrlen != 19) { dbgmsg (handshake, "I think peer has sent us a corrupt handshake..."); return tr_handshakeDone (handshake, false); } } evbuffer_drain (inbuf, 1); /* pstr (BitTorrent) */ assert (pstrlen == 19); tr_peerIoReadBytes (handshake->io, inbuf, pstr, pstrlen); pstr[pstrlen] = '\0'; if (memcmp (pstr, "BitTorrent protocol", 19)) return tr_handshakeDone (handshake, false); /* reserved bytes */ tr_peerIoReadBytes (handshake->io, inbuf, reserved, sizeof (reserved)); /** *** Extensions **/ tr_peerIoEnableDHT (handshake->io, HANDSHAKE_HAS_DHT (reserved)); tr_peerIoEnableLTEP (handshake->io, HANDSHAKE_HAS_LTEP (reserved)); tr_peerIoEnableFEXT (handshake->io, HANDSHAKE_HAS_FASTEXT (reserved)); /* torrent hash */ tr_peerIoReadBytes (handshake->io, inbuf, hash, sizeof (hash)); if (tr_peerIoIsIncoming (handshake->io)) { if (!tr_torrentExists (handshake->session, hash)) { dbgmsg (handshake, "peer is trying to connect to us for a torrent we don't have."); return tr_handshakeDone (handshake, false); } else { assert (!tr_peerIoHasTorrentHash (handshake->io)); tr_peerIoSetTorrentHash (handshake->io, hash); } } else /* outgoing */ { assert (tr_peerIoHasTorrentHash (handshake->io)); if (memcmp (hash, tr_peerIoGetTorrentHash (handshake->io), SHA_DIGEST_LENGTH)) { dbgmsg (handshake, "peer returned the wrong hash. wtf?"); return tr_handshakeDone (handshake, false); } } /** *** If it's an incoming message, we need to send a response handshake **/ if (!handshake->haveSentBitTorrentHandshake) { uint8_t msg[HANDSHAKE_SIZE]; if (!buildHandshakeMessage (handshake, msg)) return tr_handshakeDone (handshake, false); tr_peerIoWriteBytes (handshake->io, msg, sizeof (msg), false); handshake->haveSentBitTorrentHandshake = true; } setReadState (handshake, AWAITING_PEER_ID); return READ_NOW; } static ReadState readPeerId (tr_handshake * handshake, struct evbuffer * inbuf) { bool connected_to_self; char client[128]; uint8_t peer_id[PEER_ID_LEN]; tr_torrent * tor; if (evbuffer_get_length (inbuf) < PEER_ID_LEN) return READ_LATER; /* peer id */ tr_peerIoReadBytes (handshake->io, inbuf, peer_id, PEER_ID_LEN); tr_peerIoSetPeersId (handshake->io, peer_id); handshake->havePeerID = true; tr_clientForId (client, sizeof (client), peer_id); dbgmsg (handshake, "peer-id is [%s] ... isIncoming is %d", client, tr_peerIoIsIncoming (handshake->io)); /* if we've somehow connected to ourselves, don't keep the connection */ tor = tr_torrentFindFromHash (handshake->session, tr_peerIoGetTorrentHash (handshake->io)); connected_to_self = (tor != NULL) && !memcmp (peer_id, tr_torrentGetPeerId(tor), PEER_ID_LEN); return tr_handshakeDone (handshake, !connected_to_self); } static ReadState readYa (tr_handshake * handshake, struct evbuffer * inbuf) { uint8_t ya[KEY_LEN]; uint8_t * walk, outbuf[KEY_LEN + PadB_MAXLEN]; const uint8_t * myKey; int len; dbgmsg (handshake, "in readYa... need %d, have %zu", KEY_LEN, evbuffer_get_length (inbuf)); if (evbuffer_get_length (inbuf) < KEY_LEN) return READ_LATER; /* read the incoming peer's public key */ evbuffer_remove (inbuf, ya, KEY_LEN); tr_cryptoComputeSecret (handshake->crypto, ya); computeRequestHash (handshake, "req1", handshake->myReq1); /* send our public key to the peer */ dbgmsg (handshake, "sending B->A: Diffie Hellman Yb, PadB"); walk = outbuf; myKey = tr_cryptoGetMyPublicKey (handshake->crypto, &len); memcpy (walk, myKey, len); walk += len; len = tr_rand_int (PadB_MAXLEN); tr_rand_buffer (walk, len); walk += len; setReadState (handshake, AWAITING_PAD_A); tr_peerIoWriteBytes (handshake->io, outbuf, walk - outbuf, false); return READ_NOW; } static ReadState readPadA (tr_handshake * handshake, struct evbuffer * inbuf) { /* resynchronizing on HASH ('req1',S) */ struct evbuffer_ptr ptr = evbuffer_search (inbuf, (const char*)handshake->myReq1, SHA_DIGEST_LENGTH, NULL); if (ptr.pos != -1) /* match */ { evbuffer_drain (inbuf, ptr.pos); dbgmsg (handshake, "found it... looking setting to awaiting_crypto_provide"); setState (handshake, AWAITING_CRYPTO_PROVIDE); return READ_NOW; } else { const size_t len = evbuffer_get_length (inbuf); if (len > SHA_DIGEST_LENGTH) evbuffer_drain (inbuf, len - SHA_DIGEST_LENGTH); return READ_LATER; } } static ReadState readCryptoProvide (tr_handshake * handshake, struct evbuffer * inbuf) { /* HASH ('req2', SKEY) xor HASH ('req3', S), ENCRYPT (VC, crypto_provide, len (PadC)) */ int i; uint8_t vc_in[VC_LENGTH]; uint8_t req2[SHA_DIGEST_LENGTH]; uint8_t req3[SHA_DIGEST_LENGTH]; uint8_t obfuscatedTorrentHash[SHA_DIGEST_LENGTH]; uint16_t padc_len = 0; uint32_t crypto_provide = 0; tr_torrent * tor; const size_t needlen = SHA_DIGEST_LENGTH /* HASH ('req1',s) */ + SHA_DIGEST_LENGTH /* HASH ('req2', SKEY) xor HASH ('req3', S) */ + VC_LENGTH + sizeof (crypto_provide) + sizeof (padc_len); if (evbuffer_get_length (inbuf) < needlen) return READ_LATER; /* TODO: confirm they sent HASH ('req1',S) here? */ evbuffer_drain (inbuf, SHA_DIGEST_LENGTH); /* This next piece is HASH ('req2', SKEY) xor HASH ('req3', S) ... * we can get the first half of that (the obufscatedTorrentHash) * by building the latter and xor'ing it with what the peer sent us */ dbgmsg (handshake, "reading obfuscated torrent hash..."); evbuffer_remove (inbuf, req2, SHA_DIGEST_LENGTH); computeRequestHash (handshake, "req3", req3); for (i=0; isession, obfuscatedTorrentHash))) { const bool clientIsSeed = tr_torrentIsSeed (tor); const bool peerIsSeed = tr_peerMgrPeerIsSeed (tor, tr_peerIoGetAddress (handshake->io, NULL)); dbgmsg (handshake, "got INCOMING connection's encrypted handshake for torrent [%s]", tr_torrentName (tor)); tr_peerIoSetTorrentHash (handshake->io, tor->info.hash); if (clientIsSeed && peerIsSeed) { dbgmsg (handshake, "another seed tried to reconnect to us!"); return tr_handshakeDone (handshake, false); } } else { dbgmsg (handshake, "can't find that torrent..."); return tr_handshakeDone (handshake, false); } /* next part: ENCRYPT (VC, crypto_provide, len (PadC), */ tr_cryptoDecryptInit (handshake->crypto); tr_peerIoReadBytes (handshake->io, inbuf, vc_in, VC_LENGTH); tr_peerIoReadUint32 (handshake->io, inbuf, &crypto_provide); handshake->crypto_provide = crypto_provide; dbgmsg (handshake, "crypto_provide is %d", (int)crypto_provide); tr_peerIoReadUint16 (handshake->io, inbuf, &padc_len); dbgmsg (handshake, "padc is %d", (int)padc_len); handshake->pad_c_len = padc_len; setState (handshake, AWAITING_PAD_C); return READ_NOW; } static ReadState readPadC (tr_handshake * handshake, struct evbuffer * inbuf) { char * padc; uint16_t ia_len; const size_t needlen = handshake->pad_c_len + sizeof (uint16_t); if (evbuffer_get_length (inbuf) < needlen) return READ_LATER; /* read the throwaway padc */ padc = tr_new (char, handshake->pad_c_len); tr_peerIoReadBytes (handshake->io, inbuf, padc, handshake->pad_c_len); tr_free (padc); /* read ia_len */ tr_peerIoReadUint16 (handshake->io, inbuf, &ia_len); dbgmsg (handshake, "ia_len is %d", (int)ia_len); handshake->ia_len = ia_len; setState (handshake, AWAITING_IA); return READ_NOW; } static ReadState readIA (tr_handshake * handshake, struct evbuffer * inbuf) { const size_t needlen = handshake->ia_len; struct evbuffer * outbuf; uint32_t crypto_select; dbgmsg (handshake, "reading IA... have %zu, need %zu", evbuffer_get_length (inbuf), needlen); if (evbuffer_get_length (inbuf) < needlen) return READ_LATER; /** *** B->A: ENCRYPT (VC, crypto_select, len (padD), padD), ENCRYPT2 (Payload Stream) **/ tr_cryptoEncryptInit (handshake->crypto); outbuf = evbuffer_new (); { /* send VC */ uint8_t vc[VC_LENGTH]; memset (vc, 0, VC_LENGTH); evbuffer_add (outbuf, vc, VC_LENGTH); dbgmsg (handshake, "sending vc"); } /* send crypto_select */ crypto_select = getCryptoSelect (handshake, handshake->crypto_provide); if (crypto_select) { dbgmsg (handshake, "selecting crypto mode '%d'", (int)crypto_select); evbuffer_add_uint32 (outbuf, crypto_select); } else { dbgmsg (handshake, "peer didn't offer an encryption mode we like."); evbuffer_free (outbuf); return tr_handshakeDone (handshake, false); } dbgmsg (handshake, "sending pad d"); /* ENCRYPT (VC, crypto_provide, len (PadD), PadD * PadD is reserved for future extensions to the handshake... * standard practice at this time is for it to be zero-length */ { const uint16_t len = 0; evbuffer_add_uint16 (outbuf, len); } /* maybe de-encrypt our connection */ if (crypto_select == CRYPTO_PROVIDE_PLAINTEXT) { tr_peerIoWriteBuf (handshake->io, outbuf, false); tr_peerIoSetEncryption (handshake->io, PEER_ENCRYPTION_NONE); } dbgmsg (handshake, "sending handshake"); /* send our handshake */ { uint8_t msg[HANDSHAKE_SIZE]; if (!buildHandshakeMessage (handshake, msg)) return tr_handshakeDone (handshake, false); evbuffer_add (outbuf, msg, sizeof (msg)); handshake->haveSentBitTorrentHandshake = true; } /* send it out */ tr_peerIoWriteBuf (handshake->io, outbuf, false); evbuffer_free (outbuf); /* now await the handshake */ setState (handshake, AWAITING_PAYLOAD_STREAM); return READ_NOW; } static ReadState readPayloadStream (tr_handshake * handshake, struct evbuffer * inbuf) { handshake_parse_err_t i; const size_t needlen = HANDSHAKE_SIZE; dbgmsg (handshake, "reading payload stream... have %zu, need %zu", evbuffer_get_length (inbuf), needlen); if (evbuffer_get_length (inbuf) < needlen) return READ_LATER; /* parse the handshake ... */ i = parseHandshake (handshake, inbuf); dbgmsg (handshake, "parseHandshake returned %d", i); if (i != HANDSHAKE_OK) return tr_handshakeDone (handshake, false); /* we've completed the BT handshake... pass the work on to peer-msgs */ return tr_handshakeDone (handshake, true); } /*** **** **** **** ***/ static ReadState canRead (struct tr_peerIo * io, void * arg, size_t * piece) { ReadState ret; tr_handshake * handshake = arg; struct evbuffer * inbuf = tr_peerIoGetReadBuffer (io); bool readyForMore = true; assert (tr_isPeerIo (io)); /* no piece data in handshake */ *piece = 0; dbgmsg (handshake, "handling canRead; state is [%s]", getStateName (handshake->state)); while (readyForMore) { switch (handshake->state) { case AWAITING_HANDSHAKE: ret = readHandshake (handshake, inbuf); break; case AWAITING_PEER_ID: ret = readPeerId (handshake, inbuf); break; case AWAITING_YA: ret = readYa (handshake, inbuf); break; case AWAITING_PAD_A: ret = readPadA (handshake, inbuf); break; case AWAITING_CRYPTO_PROVIDE: ret = readCryptoProvide (handshake, inbuf); break; case AWAITING_PAD_C: ret = readPadC (handshake, inbuf); break; case AWAITING_IA: ret = readIA (handshake, inbuf); break; case AWAITING_PAYLOAD_STREAM: ret = readPayloadStream (handshake, inbuf); break; case AWAITING_YB: ret = readYb (handshake, inbuf); break; case AWAITING_VC: ret = readVC (handshake, inbuf); break; case AWAITING_CRYPTO_SELECT: ret = readCryptoSelect (handshake, inbuf); break; case AWAITING_PAD_D: ret = readPadD (handshake, inbuf); break; default: assert (0); } if (ret != READ_NOW) readyForMore = false; else if (handshake->state == AWAITING_PAD_C) readyForMore = evbuffer_get_length (inbuf) >= handshake->pad_c_len; else if (handshake->state == AWAITING_PAD_D) readyForMore = evbuffer_get_length (inbuf) >= handshake->pad_d_len; else if (handshake->state == AWAITING_IA) readyForMore = evbuffer_get_length (inbuf) >= handshake->ia_len; } return ret; } static bool fireDoneFunc (tr_handshake * handshake, bool isConnected) { const uint8_t * peer_id = isConnected && handshake->havePeerID ? tr_peerIoGetPeersId (handshake->io) : NULL; const bool success = (*handshake->doneCB)(handshake, handshake->io, handshake->haveReadAnythingFromPeer, isConnected, peer_id, handshake->doneUserData); return success; } static void tr_handshakeFree (tr_handshake * handshake) { if (handshake->io) tr_peerIoUnref (handshake->io); /* balanced by the ref in tr_handshakeNew */ event_free (handshake->timeout_timer); tr_free (handshake); } static ReadState tr_handshakeDone (tr_handshake * handshake, bool isOK) { bool success; dbgmsg (handshake, "handshakeDone: %s", isOK ? "connected" : "aborting"); tr_peerIoSetIOFuncs (handshake->io, NULL, NULL, NULL, NULL); success = fireDoneFunc (handshake, isOK); tr_handshakeFree (handshake); return success ? READ_LATER : READ_ERR; } void tr_handshakeAbort (tr_handshake * handshake) { if (handshake != NULL) tr_handshakeDone (handshake, false); } static void gotError (tr_peerIo * io, short what, void * vhandshake) { int errcode = errno; tr_handshake * handshake = vhandshake; if (io->utp_socket && !io->isIncoming && handshake->state == AWAITING_YB) { /* This peer probably doesn't speak uTP. */ tr_torrent *tor; if (tr_peerIoHasTorrentHash (io)) tor = tr_torrentFindFromHash (handshake->session, tr_peerIoGetTorrentHash (io)); else tor = NULL; /* Don't mark a peer as non-uTP unless it's really a connect failure. */ if ((errcode == ETIMEDOUT || errcode == ECONNREFUSED) && tr_isTorrent(tor)) tr_peerMgrSetUtpFailed (tor, tr_peerIoGetAddress (io, NULL), true); if (!tr_peerIoReconnect (handshake->io)) { uint8_t msg[HANDSHAKE_SIZE]; buildHandshakeMessage (handshake, msg); handshake->haveSentBitTorrentHandshake = true; setReadState (handshake, AWAITING_HANDSHAKE); tr_peerIoWriteBytes (handshake->io, msg, sizeof (msg), false); } } /* if the error happened while we were sending a public key, we might * have encountered a peer that doesn't do encryption... reconnect and * try a plaintext handshake */ if (((handshake->state == AWAITING_YB) || (handshake->state == AWAITING_VC)) && (handshake->encryptionMode != TR_ENCRYPTION_REQUIRED) && (!tr_peerIoReconnect (handshake->io))) { uint8_t msg[HANDSHAKE_SIZE]; dbgmsg (handshake, "handshake failed, trying plaintext..."); buildHandshakeMessage (handshake, msg); handshake->haveSentBitTorrentHandshake = true; setReadState (handshake, AWAITING_HANDSHAKE); tr_peerIoWriteBytes (handshake->io, msg, sizeof (msg), false); } else { dbgmsg (handshake, "libevent got an error what==%d, errno=%d (%s)", (int)what, errno, tr_strerror (errno)); tr_handshakeDone (handshake, false); } } /** *** **/ static void handshakeTimeout (evutil_socket_t foo UNUSED, short bar UNUSED, void * handshake) { tr_handshakeAbort (handshake); } tr_handshake* tr_handshakeNew (tr_peerIo * io, tr_encryption_mode encryptionMode, handshakeDoneCB doneCB, void * doneUserData) { tr_handshake * handshake; tr_session * session = tr_peerIoGetSession (io); handshake = tr_new0 (tr_handshake, 1); handshake->io = io; handshake->crypto = tr_peerIoGetCrypto (io); handshake->encryptionMode = encryptionMode; handshake->doneCB = doneCB; handshake->doneUserData = doneUserData; handshake->session = session; handshake->timeout_timer = evtimer_new (session->event_base, handshakeTimeout, handshake); tr_timerAdd (handshake->timeout_timer, HANDSHAKE_TIMEOUT_SEC, 0); tr_peerIoRef (io); /* balanced by the unref in tr_handshakeFree */ tr_peerIoSetIOFuncs (handshake->io, canRead, NULL, gotError, handshake); tr_peerIoSetEncryption (io, PEER_ENCRYPTION_NONE); if (tr_peerIoIsIncoming (handshake->io)) { setReadState (handshake, AWAITING_HANDSHAKE); } else if (encryptionMode != TR_CLEAR_PREFERRED) { sendYa (handshake); } else { uint8_t msg[HANDSHAKE_SIZE]; buildHandshakeMessage (handshake, msg); handshake->haveSentBitTorrentHandshake = true; setReadState (handshake, AWAITING_HANDSHAKE); tr_peerIoWriteBytes (handshake->io, msg, sizeof (msg), false); } return handshake; } struct tr_peerIo* tr_handshakeGetIO (tr_handshake * handshake) { assert (handshake != NULL); assert (handshake->io != NULL); return handshake->io; } struct tr_peerIo* tr_handshakeStealIO (tr_handshake * handshake) { struct tr_peerIo * io; assert (handshake != NULL); assert (handshake->io != NULL); io = handshake->io; handshake->io = NULL; return io; } const tr_address * tr_handshakeGetAddr (const struct tr_handshake * handshake, tr_port * port) { assert (handshake != NULL); assert (handshake->io != NULL); return tr_peerIoGetAddress (handshake->io, port); } transmission-2.92/libtransmission/PaxHeaders.4960/bitfield.h0000644000000000000000000000013212442116602021027 xustar0030 mtime=1418239362.935222649 30 atime=1418239362.935222649 30 ctime=1457295919.568800572 transmission-2.92/libtransmission/bitfield.h0000644000175000017500000000426512442116602022463 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: bitfield.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_BITFIELD_H #define TR_BITFIELD_H 1 #include "transmission.h" /** @brief Implementation of the BitTorrent spec's Bitfield array of bits */ typedef struct tr_bitfield { uint8_t * bits; size_t alloc_count; size_t bit_count; size_t true_count; /* Special cases for when full or empty but we don't know the bitCount. This occurs when a magnet link's peers send have all / have none */ bool have_all_hint; bool have_none_hint; } tr_bitfield; /*** **** ***/ void tr_bitfieldSetHasAll (tr_bitfield*); void tr_bitfieldSetHasNone (tr_bitfield*); void tr_bitfieldAdd (tr_bitfield*, size_t bit); void tr_bitfieldRem (tr_bitfield*, size_t bit); void tr_bitfieldAddRange (tr_bitfield*, size_t begin, size_t end); void tr_bitfieldRemRange (tr_bitfield*, size_t begin, size_t end); /*** **** life cycle ***/ extern const tr_bitfield TR_BITFIELD_INIT; void tr_bitfieldConstruct (tr_bitfield*, size_t bit_count); static inline void tr_bitfieldDestruct (tr_bitfield * b) { tr_bitfieldSetHasNone (b); } /*** **** ***/ void tr_bitfieldSetFromFlags (tr_bitfield*, const bool * bytes, size_t n); void tr_bitfieldSetFromBitfield (tr_bitfield*, const tr_bitfield*); void tr_bitfieldSetRaw (tr_bitfield*, const void * bits, size_t byte_count, bool bounded); void* tr_bitfieldGetRaw (const tr_bitfield * b, size_t * byte_count); /*** **** ***/ size_t tr_bitfieldCountRange (const tr_bitfield*, size_t begin, size_t end); size_t tr_bitfieldCountTrueBits (const tr_bitfield * b); static inline bool tr_bitfieldHasAll (const tr_bitfield * b) { return b->bit_count ? (b->true_count == b->bit_count) : b->have_all_hint; } static inline bool tr_bitfieldHasNone (const tr_bitfield * b) { return b->bit_count ? (b->true_count == 0) : b->have_none_hint; } bool tr_bitfieldHas (const tr_bitfield * b, size_t n); #endif transmission-2.92/libtransmission/PaxHeaders.4960/peer-io.h0000644000000000000000000000013112505250244020605 xustar0030 mtime=1427460260.463243887 30 atime=1427460260.463243887 29 ctime=1457295919.72280319 transmission-2.92/libtransmission/peer-io.h0000644000175000017500000002526312505250244022243 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: peer-io.h 14479 2015-03-18 07:34:26Z mikedld $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_PEER_IO_H #define TR_PEER_IO_H /** *** **/ #include #include "transmission.h" #include "bandwidth.h" #include "crypto.h" #include "net.h" /* tr_address */ #include "utils.h" /* tr_time () */ struct evbuffer; struct tr_bandwidth; struct tr_datatype; struct tr_peerIo; /** * @addtogroup networked_io Networked IO * @{ */ typedef enum { READ_NOW, READ_LATER, READ_ERR } ReadState; typedef enum { /* these match the values in MSE's crypto_select */ PEER_ENCRYPTION_NONE = (1 << 0), PEER_ENCRYPTION_RC4 = (1 << 1) } tr_encryption_type; typedef ReadState (*tr_can_read_cb)(struct tr_peerIo * io, void * user_data, size_t * setme_piece_byte_count); typedef void (*tr_did_write_cb)(struct tr_peerIo * io, size_t bytesWritten, bool wasPieceData, void * userData); typedef void (*tr_net_error_cb)(struct tr_peerIo * io, short what, void * userData); typedef struct tr_peerIo { bool isEncrypted; bool isIncoming; bool peerIdIsSet; bool extendedProtocolSupported; bool fastExtensionSupported; bool dhtSupported; bool utpSupported; tr_priority_t priority; short int pendingEvents; int magicNumber; tr_encryption_type encryption_type; bool isSeed; tr_port port; tr_socket_t socket; struct UTPSocket * utp_socket; int refCount; uint8_t peerId[SHA_DIGEST_LENGTH]; time_t timeCreated; tr_session * session; tr_address addr; tr_can_read_cb canRead; tr_did_write_cb didWrite; tr_net_error_cb gotError; void * userData; struct tr_bandwidth bandwidth; tr_crypto crypto; struct evbuffer * inbuf; struct evbuffer * outbuf; struct tr_datatype * outbuf_datatypes; struct event * event_read; struct event * event_write; } tr_peerIo; /** *** **/ tr_peerIo* tr_peerIoNewOutgoing (tr_session * session, struct tr_bandwidth * parent, const struct tr_address * addr, tr_port port, const uint8_t * torrentHash, bool isSeed, bool utp); tr_peerIo* tr_peerIoNewIncoming (tr_session * session, struct tr_bandwidth * parent, const struct tr_address * addr, tr_port port, tr_socket_t socket, struct UTPSocket * utp_socket); void tr_peerIoRefImpl (const char * file, int line, tr_peerIo * io); #define tr_peerIoRef(io) tr_peerIoRefImpl (__FILE__, __LINE__, (io)); void tr_peerIoUnrefImpl (const char * file, int line, tr_peerIo * io); #define tr_peerIoUnref(io) tr_peerIoUnrefImpl (__FILE__, __LINE__, (io)); #define PEER_IO_MAGIC_NUMBER 206745 static inline bool tr_isPeerIo (const tr_peerIo * io) { return (io != NULL) && (io->magicNumber == PEER_IO_MAGIC_NUMBER) && (io->refCount >= 0) && (tr_isBandwidth (&io->bandwidth)) && (tr_address_is_valid (&io->addr)); } /** *** **/ static inline void tr_peerIoEnableFEXT (tr_peerIo * io, bool flag) { io->fastExtensionSupported = flag; } static inline bool tr_peerIoSupportsFEXT (const tr_peerIo * io) { return io->fastExtensionSupported; } static inline void tr_peerIoEnableLTEP (tr_peerIo * io, bool flag) { io->extendedProtocolSupported = flag; } static inline bool tr_peerIoSupportsLTEP (const tr_peerIo * io) { return io->extendedProtocolSupported; } static inline void tr_peerIoEnableDHT (tr_peerIo * io, bool flag) { io->dhtSupported = flag; } static inline bool tr_peerIoSupportsDHT (const tr_peerIo * io) { return io->dhtSupported; } static inline bool tr_peerIoSupportsUTP (const tr_peerIo * io) { return io->utpSupported; } /** *** **/ static inline tr_session* tr_peerIoGetSession (tr_peerIo * io) { assert (tr_isPeerIo (io)); assert (io->session); return io->session; } const char* tr_peerIoAddrStr (const struct tr_address * addr, tr_port port); const char* tr_peerIoGetAddrStr (const tr_peerIo * io); const struct tr_address * tr_peerIoGetAddress (const tr_peerIo * io, tr_port * port); const uint8_t* tr_peerIoGetTorrentHash (tr_peerIo * io); bool tr_peerIoHasTorrentHash (const tr_peerIo * io); void tr_peerIoSetTorrentHash (tr_peerIo * io, const uint8_t * hash); int tr_peerIoReconnect (tr_peerIo * io); static inline bool tr_peerIoIsIncoming (const tr_peerIo * io) { return io->isIncoming; } static inline int tr_peerIoGetAge (const tr_peerIo * io) { return tr_time () - io->timeCreated; } /** *** **/ void tr_peerIoSetPeersId (tr_peerIo * io, const uint8_t * peer_id); static inline const uint8_t* tr_peerIoGetPeersId (const tr_peerIo * io) { assert (tr_isPeerIo (io)); assert (io->peerIdIsSet); return io->peerId; } /** *** **/ void tr_peerIoSetIOFuncs (tr_peerIo * io, tr_can_read_cb readcb, tr_did_write_cb writecb, tr_net_error_cb errcb, void * user_data); void tr_peerIoClear (tr_peerIo * io); /** *** **/ void tr_peerIoWriteBytes (tr_peerIo * io, const void * writeme, size_t writemeLen, bool isPieceData); void tr_peerIoWriteBuf (tr_peerIo * io, struct evbuffer * buf, bool isPieceData); /** *** **/ static inline tr_crypto * tr_peerIoGetCrypto (tr_peerIo * io) { return &io->crypto; } void tr_peerIoSetEncryption (tr_peerIo * io, tr_encryption_type encryption_type); static inline bool tr_peerIoIsEncrypted (const tr_peerIo * io) { return (io != NULL) && (io->encryption_type == PEER_ENCRYPTION_RC4); } void evbuffer_add_uint8 (struct evbuffer * outbuf, uint8_t byte); void evbuffer_add_uint16 (struct evbuffer * outbuf, uint16_t hs); void evbuffer_add_uint32 (struct evbuffer * outbuf, uint32_t hl); void evbuffer_add_uint64 (struct evbuffer * outbuf, uint64_t hll); static inline void evbuffer_add_hton_16 (struct evbuffer * buf, uint16_t val) { evbuffer_add_uint16 (buf, val); } static inline void evbuffer_add_hton_32 (struct evbuffer * buf, uint32_t val) { evbuffer_add_uint32 (buf, val); } static inline void evbuffer_add_hton_64 (struct evbuffer * buf, uint64_t val) { evbuffer_add_uint64 (buf, val); } void tr_peerIoReadBytesToBuf (tr_peerIo * io, struct evbuffer * inbuf, struct evbuffer * outbuf, size_t byteCount); void tr_peerIoReadBytes (tr_peerIo * io, struct evbuffer * inbuf, void * bytes, size_t byteCount); static inline void tr_peerIoReadUint8 (tr_peerIo * io, struct evbuffer * inbuf, uint8_t * setme) { tr_peerIoReadBytes (io, inbuf, setme, sizeof (uint8_t)); } void tr_peerIoReadUint16 (tr_peerIo * io, struct evbuffer * inbuf, uint16_t * setme); void tr_peerIoReadUint32 (tr_peerIo * io, struct evbuffer * inbuf, uint32_t * setme); void tr_peerIoDrain (tr_peerIo * io, struct evbuffer * inbuf, size_t byteCount); /** *** **/ size_t tr_peerIoGetWriteBufferSpace (const tr_peerIo * io, uint64_t now); static inline void tr_peerIoSetParent (tr_peerIo * io, struct tr_bandwidth * parent) { assert (tr_isPeerIo (io)); tr_bandwidthSetParent (&io->bandwidth, parent); } void tr_peerIoBandwidthUsed (tr_peerIo * io, tr_direction direction, size_t byteCount, int isPieceData); static inline bool tr_peerIoHasBandwidthLeft (const tr_peerIo * io, tr_direction dir) { return tr_bandwidthClamp (&io->bandwidth, dir, 1024) > 0; } static inline unsigned int tr_peerIoGetPieceSpeed_Bps (const tr_peerIo * io, uint64_t now, tr_direction dir) { return tr_bandwidthGetPieceSpeed_Bps (&io->bandwidth, now, dir); } /** *** **/ void tr_peerIoSetEnabled (tr_peerIo * io, tr_direction dir, bool isEnabled); int tr_peerIoFlush (tr_peerIo * io, tr_direction dir, size_t byteLimit); int tr_peerIoFlushOutgoingProtocolMsgs (tr_peerIo * io); /** *** **/ static inline struct evbuffer * tr_peerIoGetReadBuffer (tr_peerIo * io) { return io->inbuf; } /* @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/makemeta-test.c0000644000000000000000000000013212612560132022001 xustar0030 mtime=1445650522.632234866 30 atime=1445650522.632234866 30 ctime=1457295920.269812492 transmission-2.92/libtransmission/makemeta-test.c0000644000175000017500000002231312612560132023427 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: makemeta-test.c 14428 2015-01-02 11:15:31Z mikedld $ */ #include "libtransmission-test.h" #include "transmission.h" #include "crypto-utils.h" #include "file.h" #include "makemeta.h" #include /* mktemp() */ #include /* strlen() */ static int test_single_file_impl (const tr_tracker_info * trackers, const size_t trackerCount, const void * payload, const size_t payloadSize, const char * comment, bool isPrivate) { char* sandbox; char* input_file; char* torrent_file; tr_metainfo_builder* builder; tr_ctor * ctor; tr_parse_result parse_result; tr_info inf; char * tmpstr; /* set up our local test sandbox */ sandbox = libtest_sandbox_create(); /* create a single input file */ input_file = tr_buildPath (sandbox, "test.XXXXXX", NULL); libtest_create_tmpfile_with_contents (input_file, payload, payloadSize); builder = tr_metaInfoBuilderCreate (input_file); check_streq (input_file, builder->top); check_int_eq (1, builder->fileCount); check_streq (input_file, builder->files[0].filename); check_int_eq (payloadSize, builder->files[0].size); check_int_eq (payloadSize, builder->totalSize); check (!builder->isFolder); check (!builder->abortFlag); /* have tr_makeMetaInfo() build the .torrent file */ torrent_file = tr_strdup_printf ("%s.torrent", input_file); tr_makeMetaInfo (builder, torrent_file, trackers, trackerCount, comment, isPrivate); check (isPrivate == builder->isPrivate); check_streq (torrent_file, builder->outputFile); check_streq (comment, builder->comment); check_int_eq (trackerCount, builder->trackerCount); while (!builder->isDone) tr_wait_msec (100); /* now let's check our work: parse the .torrent file */ ctor = tr_ctorNew (NULL); libttest_sync (); tr_ctorSetMetainfoFromFile (ctor, torrent_file); parse_result = tr_torrentParse (ctor, &inf); check_int_eq (TR_PARSE_OK, parse_result); /* quick check of some of the parsed metainfo */ check_int_eq (payloadSize, inf.totalSize); tmpstr = tr_sys_path_basename (input_file, NULL); check_streq (tmpstr, inf.name); tr_free (tmpstr); check_streq (comment, inf.comment); check_int_eq (1, inf.fileCount); check_int_eq (isPrivate, inf.isPrivate); check (!inf.isFolder); check_int_eq (trackerCount, inf.trackerCount); /* cleanup */ tr_free (torrent_file); tr_free (input_file); tr_ctorFree (ctor); tr_metainfoFree (&inf); tr_metaInfoBuilderFree (builder); libtest_sandbox_destroy (sandbox); tr_free (sandbox); return 0; } static int test_single_file (void) { tr_tracker_info trackers[16]; size_t trackerCount; bool isPrivate; const char * comment; const char * payload; size_t payloadSize; trackerCount = 0; trackers[trackerCount].tier = trackerCount; trackers[trackerCount].announce = (char*) "udp://tracker.openbittorrent.com:80"; ++trackerCount; trackers[trackerCount].tier = trackerCount; trackers[trackerCount].announce = (char*) "udp://tracker.publicbt.com:80"; ++trackerCount; payload = "Hello, World!\n"; payloadSize = strlen(payload); comment = "This is the comment"; isPrivate = false; test_single_file_impl (trackers, trackerCount, payload, payloadSize, comment, isPrivate); return 0; } static int test_single_directory_impl (const tr_tracker_info * trackers, const size_t trackerCount, const void ** payloads, const size_t * payloadSizes, const size_t payloadCount, const char * comment, const bool isPrivate) { char* sandbox; char* torrent_file; tr_metainfo_builder* builder; tr_ctor * ctor; tr_parse_result parse_result; tr_info inf; char * top; char ** files; size_t totalSize; size_t i; char* tmpstr; /* set up our local test sandbox */ sandbox = libtest_sandbox_create(); /* create the top temp directory */ top = tr_buildPath (sandbox, "folder.XXXXXX", NULL); tr_sys_dir_create_temp (top, NULL); /* build the payload files that go into the top temp directory */ files = tr_new (char*, payloadCount); totalSize = 0; for (i=0; iabortFlag); check_streq (top, builder->top); check_int_eq (payloadCount, builder->fileCount); check_int_eq (totalSize, builder->totalSize); check (builder->isFolder); for (i=0; ifileCount; i++) { check_streq (files[i], builder->files[i].filename); check_int_eq (payloadSizes[i], builder->files[i].size); } /* call tr_makeMetaInfo() to build the .torrent file */ torrent_file = tr_strdup_printf ("%s.torrent", top); tr_makeMetaInfo (builder, torrent_file, trackers, trackerCount, comment, isPrivate); check (isPrivate == builder->isPrivate); check_streq (torrent_file, builder->outputFile); check_streq (comment, builder->comment); check_int_eq (trackerCount, builder->trackerCount); while (!builder->isDone) tr_wait_msec (100); /* now let's check our work: parse the .torrent file */ ctor = tr_ctorNew (NULL); libttest_sync (); tr_ctorSetMetainfoFromFile (ctor, torrent_file); parse_result = tr_torrentParse (ctor, &inf); check_int_eq (TR_PARSE_OK, parse_result); /* quick check of some of the parsed metainfo */ check_int_eq (totalSize, inf.totalSize); tmpstr = tr_sys_path_basename (top, NULL); check_streq (tmpstr, inf.name); tr_free (tmpstr); check_streq (comment, inf.comment); check_int_eq (payloadCount, inf.fileCount); check_int_eq (isPrivate, inf.isPrivate); check_int_eq (builder->isFolder, inf.isFolder); check_int_eq (trackerCount, inf.trackerCount); /* cleanup */ tr_free (torrent_file); tr_ctorFree (ctor); tr_metainfoFree (&inf); tr_metaInfoBuilderFree (builder); for (i=0; i #include /* isdigit() */ #include #include /* strtoul() */ #include /* strlen(), memchr() */ #include #include "ConvertUTF.h" #define __LIBTRANSMISSION_VARIANT_MODULE__ #include "transmission.h" #include "ptrarray.h" #include "utils.h" /* tr_snprintf() */ #include "variant.h" #include "variant-common.h" /*** **** tr_variantParse() **** tr_variantLoad() ***/ /** * The initial i and trailing e are beginning and ending delimiters. * You can have negative numbers such as i-3e. You cannot prefix the * number with a zero such as i04e. However, i0e is valid. * Example: i3e represents the integer "3" * NOTE: The maximum number of bit of this integer is unspecified, * but to handle it as a signed 64bit integer is mandatory to handle * "large files" aka .torrent for more that 4Gbyte */ int tr_bencParseInt (const uint8_t * buf, const uint8_t * bufend, const uint8_t ** setme_end, int64_t * setme_val) { char * endptr; const void * begin; const void * end; int64_t val; if (buf >= bufend) return EILSEQ; if (*buf != 'i') return EILSEQ; begin = buf + 1; end = memchr (begin, 'e', (bufend - buf) - 1); if (end == NULL) return EILSEQ; errno = 0; val = evutil_strtoll (begin, &endptr, 10); if (errno || (endptr != end)) /* incomplete parse */ return EILSEQ; if (val && * (const char*)begin == '0') /* no leading zeroes! */ return EILSEQ; *setme_end = (const uint8_t*)end + 1; *setme_val = val; return 0; } /** * Byte strings are encoded as follows: * : * Note that there is no constant beginning delimiter, and no ending delimiter. * Example: 4:spam represents the string "spam" */ int tr_bencParseStr (const uint8_t * buf, const uint8_t * bufend, const uint8_t ** setme_end, const uint8_t ** setme_str, size_t * setme_strlen) { const void * end; size_t len; char * ulend; const uint8_t * strbegin; const uint8_t * strend; if (buf >= bufend) goto err; if (!isdigit (*buf)) goto err; end = memchr (buf, ':', bufend - buf); if (end == NULL) goto err; errno = 0; len = strtoul ((const char*)buf, &ulend, 10); if (errno || ulend != end) goto err; strbegin = (const uint8_t*)end + 1; strend = strbegin + len; if ((strendbufend)) goto err; *setme_end = (const uint8_t*)end + 1 + len; *setme_str = (const uint8_t*)end + 1; *setme_strlen = len; return 0; err: *setme_end = NULL; *setme_str = NULL; *setme_strlen= 0; return EILSEQ; } static tr_variant* get_node (tr_ptrArray * stack, tr_quark * key, tr_variant * top, int * err) { tr_variant * node = NULL; if (tr_ptrArrayEmpty (stack)) { node = top; } else { tr_variant * parent = tr_ptrArrayBack (stack); if (tr_variantIsList (parent)) { node = tr_variantListAdd (parent); } else if (*key && tr_variantIsDict (parent)) { node = tr_variantDictAdd (parent, *key); *key = 0; } else { *err = EILSEQ; } } return node; } /** * This function's previous recursive implementation was * easier to read, but was vulnerable to a smash-stacking * attack via maliciously-crafted bencoded data. (#667) */ int tr_variantParseBenc (const void * buf_in, const void * bufend_in, tr_variant * top, const char ** setme_end) { int err = 0; const uint8_t * buf = buf_in; const uint8_t * bufend = bufend_in; tr_ptrArray stack = TR_PTR_ARRAY_INIT; tr_quark key = 0; tr_variantInit (top, 0); while (buf != bufend) { if (buf > bufend) /* no more text to parse... */ err = EILSEQ; if (err) break; if (*buf == 'i') /* int */ { int64_t val; const uint8_t * end; tr_variant * v; if ((err = tr_bencParseInt (buf, bufend, &end, &val))) break; buf = end; if ((v = get_node (&stack, &key, top, &err))) tr_variantInitInt (v, val); } else if (*buf == 'l') /* list */ { tr_variant * v; ++buf; if ((v = get_node (&stack, &key, top, &err))) { tr_variantInitList (v, 0); tr_ptrArrayAppend (&stack, v); } } else if (*buf == 'd') /* dict */ { tr_variant * v; ++buf; if ((v = get_node (&stack, &key, top, &err))) { tr_variantInitDict (v, 0); tr_ptrArrayAppend (&stack, v); } } else if (*buf == 'e') /* end of list or dict */ { ++buf; if (tr_ptrArrayEmpty (&stack) || (key != 0)) { err = EILSEQ; break; } else { tr_ptrArrayPop (&stack); if (tr_ptrArrayEmpty (&stack)) break; } } else if (isdigit (*buf)) /* string? */ { tr_variant * v; const uint8_t * end; const uint8_t * str; size_t str_len; if ((err = tr_bencParseStr (buf, bufend, &end, &str, &str_len))) break; buf = end; if (!key && !tr_ptrArrayEmpty(&stack) && tr_variantIsDict(tr_ptrArrayBack(&stack))) key = tr_quark_new (str, str_len); else if ((v = get_node (&stack, &key, top, &err))) tr_variantInitStr (v, str, str_len); } else /* invalid bencoded text... march past it */ { ++buf; } if (tr_ptrArrayEmpty (&stack)) break; } if (!err && (!top->type || !tr_ptrArrayEmpty(&stack))) err = EILSEQ; if (!err && setme_end) *setme_end = (const char*) buf; tr_ptrArrayDestruct (&stack, NULL); return err; } /**** ***** ****/ static void saveIntFunc (const tr_variant * val, void * evbuf) { evbuffer_add_printf (evbuf, "i%" PRId64 "e", val->val.i); } static void saveBoolFunc (const tr_variant * val, void * evbuf) { if (val->val.b) evbuffer_add (evbuf, "i1e", 3); else evbuffer_add (evbuf, "i0e", 3); } static void saveRealFunc (const tr_variant * val, void * evbuf) { int len; char buf[128]; len = tr_snprintf (buf, sizeof (buf), "%f", val->val.d); evbuffer_add_printf (evbuf, "%d:", len); evbuffer_add (evbuf, buf, len); } static void saveStringFunc (const tr_variant * v, void * evbuf) { size_t len; const char * str; tr_variantGetStr (v, &str, &len); evbuffer_add_printf (evbuf, "%zu:", len); evbuffer_add (evbuf, str, len); } static void saveDictBeginFunc (const tr_variant * val UNUSED, void * evbuf) { evbuffer_add (evbuf, "d", 1); } static void saveListBeginFunc (const tr_variant * val UNUSED, void * evbuf) { evbuffer_add (evbuf, "l", 1); } static void saveContainerEndFunc (const tr_variant * val UNUSED, void * evbuf) { evbuffer_add (evbuf, "e", 1); } static const struct VariantWalkFuncs walk_funcs = { saveIntFunc, saveBoolFunc, saveRealFunc, saveStringFunc, saveDictBeginFunc, saveListBeginFunc, saveContainerEndFunc }; void tr_variantToBufBenc (const tr_variant * top, struct evbuffer * buf) { tr_variantWalk (top, &walk_funcs, buf, true); } transmission-2.92/libtransmission/PaxHeaders.4960/torrent-magnet.h0000644000000000000000000000013212644245522022223 xustar0030 mtime=1452362578.743698889 30 atime=1452362578.743698889 30 ctime=1457295919.807804636 transmission-2.92/libtransmission/torrent-magnet.h0000644000175000017500000000160712644245522023654 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: torrent-magnet.h 14664 2016-01-07 17:12:14Z mikedld $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_TORRENT_MAGNET_H #define TR_TORRENT_MAGNET_H 1 #include #include enum { /* defined by BEP #9 */ METADATA_PIECE_SIZE = (1024 * 16) }; void* tr_torrentGetMetadataPiece (tr_torrent * tor, int piece, size_t * len); void tr_torrentSetMetadataPiece (tr_torrent * tor, int piece, const void * data, int len); bool tr_torrentGetNextMetadataRequest (tr_torrent * tor, time_t now, int * setme); bool tr_torrentSetMetadataSizeHint (tr_torrent * tor, int64_t metadata_size); double tr_torrentGetMetadataPercent (const tr_torrent * tor); #endif transmission-2.92/libtransmission/PaxHeaders.4960/session.h0000644000000000000000000000013212611361001020721 xustar0030 mtime=1445323265.053745757 30 atime=1445323265.053745757 30 ctime=1457295919.788804313 transmission-2.92/libtransmission/session.h0000644000175000017500000002333212611361001022351 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: session.h 14581 2015-10-18 18:39:14Z mikedld $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_INTERNAL_H #define TR_INTERNAL_H 1 #define TR_NAME "Transmission" #ifndef UNUSED #ifdef __GNUC__ #define UNUSED __attribute__ ((unused)) #else #define UNUSED #endif #endif #include "bandwidth.h" #include "bitfield.h" #include "net.h" #include "utils.h" #include "variant.h" typedef enum { TR_NET_OK, TR_NET_ERROR, TR_NET_WAIT } tr_tristate_t; typedef enum { TR_AUTO_SWITCH_UNUSED, TR_AUTO_SWITCH_ON, TR_AUTO_SWITCH_OFF, } tr_auto_switch_state_t; enum { PEER_ID_LEN = 20 }; void tr_peerIdInit (uint8_t * setme); struct event_base; struct evdns_base; struct tr_address; struct tr_announcer; struct tr_announcer_udp; struct tr_bindsockets; struct tr_cache; struct tr_fdInfo; struct tr_device_info; struct tr_turtle_info { /* TR_UP and TR_DOWN speed limits */ unsigned int speedLimit_Bps[2]; /* is turtle mode on right now? */ bool isEnabled; /* does turtle mode turn itself on and off at given times? */ bool isClockEnabled; /* when clock mode is on, minutes after midnight to turn on turtle mode */ int beginMinute; /* when clock mode is on, minutes after midnight to turn off turtle mode */ int endMinute; /* only use clock mode on these days of the week */ tr_sched_day days; /* called when isEnabled changes */ tr_altSpeedFunc callback; /* the callback's user_data argument */ void * callbackUserData; /* the callback's changedByUser argument. * indicates whether the change came from the user or from the clock. */ bool changedByUser; /* bitfield of all the minutes in a week. * Each bit's value indicates whether the scheduler wants turtle * limits on or off at that given minute in the week. */ tr_bitfield minutes; /* recent action that was done by turtle's automatic switch */ tr_auto_switch_state_t autoTurtleState; }; /** @brief handle to an active libtransmission session */ struct tr_session { bool isPortRandom; bool isPexEnabled; bool isDHTEnabled; bool isUTPEnabled; bool isLPDEnabled; bool isBlocklistEnabled; bool isPrefetchEnabled; bool isTorrentDoneScriptEnabled; bool isClosing; bool isClosed; bool isIncompleteFileNamingEnabled; bool isRatioLimited; bool isIdleLimited; bool isIncompleteDirEnabled; bool pauseAddedTorrent; bool deleteSourceTorrent; bool scrapePausedTorrents; uint8_t peer_id_ttl_hours; tr_variant removedTorrents; bool stalledEnabled; bool queueEnabled[2]; int queueSize[2]; int queueStalledMinutes; int umask; unsigned int speedLimit_Bps[2]; bool speedLimitEnabled[2]; struct tr_turtle_info turtle; struct tr_fdInfo * fdInfo; int magicNumber; tr_encryption_mode encryptionMode; tr_preallocation_mode preallocationMode; struct event_base * event_base; struct evdns_base * evdns_base; struct tr_event_handle * events; uint16_t peerLimit; uint16_t peerLimitPerTorrent; int uploadSlotsPerTorrent; /* The UDP sockets used for the DHT and uTP. */ tr_port udp_port; tr_socket_t udp_socket; tr_socket_t udp6_socket; unsigned char * udp6_bound; struct event *udp_event; struct event *udp6_event; /* The open port on the local machine for incoming peer requests */ tr_port private_peer_port; /** * The open port on the public device for incoming peer requests. * This is usually the same as private_peer_port but can differ * if the public device is a router and it decides to use a different * port than the one requested by Transmission. */ tr_port public_peer_port; tr_port randomPortLow; tr_port randomPortHigh; int peerSocketTOS; char * peer_congestion_algorithm; int torrentCount; tr_torrent * torrentList; char * torrentDoneScript; char * configDir; char * resumeDir; char * torrentDir; char * incompleteDir; char * blocklist_url; struct tr_device_info * downloadDir; struct tr_list * blocklists; struct tr_peerMgr * peerMgr; struct tr_shared * shared; struct tr_cache * cache; struct tr_lock * lock; struct tr_web * web; struct tr_rpc_server * rpcServer; tr_rpc_func rpc_func; void * rpc_func_user_data; struct tr_stats_handle * sessionStats; struct tr_announcer * announcer; struct tr_announcer_udp * announcer_udp; tr_variant * metainfoLookup; struct event * nowTimer; struct event * saveTimer; /* monitors the "global pool" speeds */ struct tr_bandwidth bandwidth; float desiredRatio; uint16_t idleLimitMinutes; struct tr_bindinfo * public_ipv4; struct tr_bindinfo * public_ipv6; }; static inline tr_port tr_sessionGetPublicPeerPort (const tr_session * session) { return session->public_peer_port; } bool tr_sessionAllowsDHT (const tr_session * session); bool tr_sessionAllowsLPD (const tr_session * session); const char * tr_sessionFindTorrentFile (const tr_session * session, const char * hashString); void tr_sessionSetTorrentFile (tr_session * session, const char * hashString, const char * filename); bool tr_sessionIsAddressBlocked (const tr_session * session, const struct tr_address * addr); void tr_sessionLock (tr_session *); void tr_sessionUnlock (tr_session *); bool tr_sessionIsLocked (const tr_session *); const struct tr_address* tr_sessionGetPublicAddress (const tr_session * session, int tr_af_type, bool * is_default_value); struct tr_bindsockets * tr_sessionGetBindSockets (tr_session *); int tr_sessionCountTorrents (const tr_session * session); tr_torrent ** tr_sessionGetTorrents (tr_session * session, int * setme_n); enum { SESSION_MAGIC_NUMBER = 3845, }; static inline bool tr_isSession (const tr_session * session) { return (session != NULL) && (session->magicNumber == SESSION_MAGIC_NUMBER); } static inline bool tr_isPreallocationMode (tr_preallocation_mode m) { return (m == TR_PREALLOCATE_NONE) || (m == TR_PREALLOCATE_SPARSE) || (m == TR_PREALLOCATE_FULL); } static inline bool tr_isEncryptionMode (tr_encryption_mode m) { return (m == TR_CLEAR_PREFERRED) || (m == TR_ENCRYPTION_PREFERRED) || (m == TR_ENCRYPTION_REQUIRED); } static inline bool tr_isPriority (tr_priority_t p) { return (p == TR_PRI_LOW) || (p == TR_PRI_NORMAL) || (p == TR_PRI_HIGH); } /*** **** ***/ static inline unsigned int toSpeedBytes (unsigned int KBps) { return KBps * tr_speed_K; } static inline double toSpeedKBps (unsigned int Bps) { return Bps / (double)tr_speed_K; } static inline uint64_t toMemBytes (unsigned int MB) { uint64_t B = tr_mem_K * tr_mem_K; B *= MB; return B; } static inline int toMemMB (uint64_t B) { return B / (tr_mem_K * tr_mem_K); } /** **/ unsigned int tr_sessionGetSpeedLimit_Bps (const tr_session *, tr_direction); unsigned int tr_sessionGetAltSpeed_Bps (const tr_session *, tr_direction); unsigned int tr_sessionGetRawSpeed_Bps (const tr_session *, tr_direction); unsigned int tr_sessionGetPieceSpeed_Bps (const tr_session *, tr_direction); void tr_sessionSetSpeedLimit_Bps (tr_session *, tr_direction, unsigned int Bps); void tr_sessionSetAltSpeed_Bps (tr_session *, tr_direction, unsigned int Bps); bool tr_sessionGetActiveSpeedLimit_Bps (const tr_session * session, tr_direction dir, unsigned int * setme); void tr_sessionGetNextQueuedTorrents (tr_session * session, tr_direction dir, size_t numwanted, tr_ptrArray * setme); int tr_sessionCountQueueFreeSlots (tr_session * session, tr_direction); #endif transmission-2.92/libtransmission/PaxHeaders.4960/peer-mgr.h0000644000000000000000000000013212604343570020771 xustar0030 mtime=1444005752.190339149 30 atime=1444005752.190339149 30 ctime=1457295919.730803326 transmission-2.92/libtransmission/peer-mgr.h0000644000175000017500000001553712604343570022431 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: peer-mgr.h 14479 2015-03-18 07:34:26Z mikedld $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_PEER_MGR_H #define TR_PEER_MGR_H #include /* uint16_t */ #ifdef _WIN32 #include /* struct in_addr */ #endif #include "net.h" /* tr_address */ #include "peer-common.h" #include "quark.h" /** * @addtogroup peers Peers * @{ */ struct UTPSocket; struct tr_peer_stat; struct tr_torrent; typedef struct tr_peerMgr tr_peerMgr; /* added_f's bitwise-or'ed flags */ enum { /* true if the peer supports encryption */ ADDED_F_ENCRYPTION_FLAG = 1, /* true if the peer is a seed or partial seed */ ADDED_F_SEED_FLAG = 2, /* true if the peer supports uTP */ ADDED_F_UTP_FLAGS = 4, /* true if the peer has holepunch support */ ADDED_F_HOLEPUNCH = 8, /* true if the peer telling us about this peer * initiated the connection (implying that it is connectible) */ ADDED_F_CONNECTABLE = 16 }; typedef struct tr_pex { tr_address addr; tr_port port; /* this field is in network byte order */ uint8_t flags; } tr_pex; struct peer_atom; struct tr_peerIo; struct tr_peerMsgs; struct tr_swarm; static inline bool tr_isPex (const tr_pex * pex) { return pex && tr_address_is_valid (&pex->addr); } const tr_address * tr_peerAddress (const tr_peer *); int tr_pexCompare (const void * a, const void * b); tr_peerMgr * tr_peerMgrNew (tr_session * session); void tr_peerMgrFree (tr_peerMgr * manager); bool tr_peerMgrPeerIsSeed (const tr_torrent * tor, const tr_address * addr); void tr_peerMgrSetUtpSupported (tr_torrent * tor, const tr_address * addr); void tr_peerMgrSetUtpFailed (tr_torrent * tor, const tr_address * addr, bool failed); void tr_peerMgrGetNextRequests (tr_torrent * torrent, tr_peer * peer, int numwant, tr_block_index_t * setme, int * numgot, bool get_intervals); bool tr_peerMgrDidPeerRequest (const tr_torrent * torrent, const tr_peer * peer, tr_block_index_t block); void tr_peerMgrRebuildRequests (tr_torrent * torrent); void tr_peerMgrAddIncoming (tr_peerMgr * manager, tr_address * addr, tr_port port, tr_socket_t socket, struct UTPSocket * utp_socket); tr_pex * tr_peerMgrCompactToPex (const void * compact, size_t compactLen, const uint8_t * added_f, size_t added_f_len, size_t * setme_pex_count); tr_pex * tr_peerMgrCompact6ToPex (const void * compact, size_t compactLen, const uint8_t * added_f, size_t added_f_len, size_t * pexCount); tr_pex * tr_peerMgrArrayToPex (const void * array, size_t arrayLen, size_t * setme_pex_count); /** * @param seedProbability [0..100] for likelihood that the peer is a seed; -1 for unknown */ void tr_peerMgrAddPex (tr_torrent * tor, uint8_t from, const tr_pex * pex, int8_t seedProbability); void tr_peerMgrMarkAllAsSeeds (tr_torrent * tor); enum { TR_PEERS_CONNECTED, TR_PEERS_INTERESTING }; int tr_peerMgrGetPeers (tr_torrent * tor, tr_pex ** setme_pex, uint8_t address_type, uint8_t peer_list_mode, int max_peer_count); void tr_peerMgrStartTorrent (tr_torrent * tor); void tr_peerMgrStopTorrent (tr_torrent * tor); void tr_peerMgrAddTorrent (tr_peerMgr * manager, struct tr_torrent * tor); void tr_peerMgrRemoveTorrent (tr_torrent * tor); void tr_peerMgrTorrentAvailability (const tr_torrent * tor, int8_t * tab, unsigned int tabCount); uint64_t tr_peerMgrGetDesiredAvailable (const tr_torrent * tor); void tr_peerMgrOnTorrentGotMetainfo (tr_torrent * tor); void tr_peerMgrOnBlocklistChanged (tr_peerMgr * manager); struct tr_peer_stat * tr_peerMgrPeerStats (const tr_torrent * tor, int * setmeCount); double * tr_peerMgrWebSpeeds_KBps (const tr_torrent * tor); unsigned int tr_peerGetPieceSpeed_Bps (const tr_peer * peer, uint64_t now, tr_direction direction); void tr_peerMgrClearInterest (tr_torrent * tor); void tr_peerMgrGotBadPiece (tr_torrent * tor, tr_piece_index_t pieceIndex); void tr_peerMgrPieceCompleted (tr_torrent * tor, tr_piece_index_t pieceIndex); /* @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/upnp.h0000644000000000000000000000013112442116602020226 xustar0030 mtime=1418239362.936222666 30 atime=1418239362.936222666 29 ctime=1457295919.84980535 transmission-2.92/libtransmission/upnp.h0000644000175000017500000000127012442116602021654 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: upnp.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_UPNP_H #define TR_UPNP_H 1 /** * @addtogroup port_forwarding Port Forwarding * @{ */ typedef struct tr_upnp tr_upnp; tr_upnp * tr_upnpInit (void); void tr_upnpClose (tr_upnp *); int tr_upnpPulse ( tr_upnp *, int port, int isEnabled, int doPortCheck); /* @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/blocklist.c0000644000000000000000000000013212641272401021227 xustar0030 mtime=1451586817.566878338 30 atime=1451586817.566878338 30 ctime=1457295919.948807034 transmission-2.92/libtransmission/blocklist.c0000644000175000017500000002244612641272401022664 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: blocklist.c 14644 2015-12-29 19:37:31Z mikedld $ */ #include #include #include #include /* bsearch (), qsort () */ #include #include "transmission.h" #include "blocklist.h" #include "error.h" #include "file.h" #include "log.h" #include "net.h" #include "utils.h" /*** **** PRIVATE ***/ struct tr_ipv4_range { uint32_t begin; uint32_t end; }; struct tr_blocklistFile { bool isEnabled; tr_sys_file_t fd; size_t ruleCount; uint64_t byteCount; char * filename; struct tr_ipv4_range * rules; }; static void blocklistClose (tr_blocklistFile * b) { if (b->rules != NULL) { tr_sys_file_unmap (b->rules, b->byteCount, NULL); tr_sys_file_close (b->fd, NULL); b->rules = NULL; b->ruleCount = 0; b->byteCount = 0; b->fd = TR_BAD_SYS_FILE; } } static void blocklistLoad (tr_blocklistFile * b) { tr_sys_file_t fd; uint64_t byteCount; tr_sys_path_info info; char * base; tr_error * error = NULL; const char * err_fmt = _("Couldn't read \"%1$s\": %2$s"); blocklistClose (b); if (!tr_sys_path_get_info (b->filename, 0, &info, NULL)) return; byteCount = info.size; if (byteCount == 0) return; fd = tr_sys_file_open (b->filename, TR_SYS_FILE_READ, 0, &error); if (fd == TR_BAD_SYS_FILE) { tr_logAddError (err_fmt, b->filename, error->message); tr_error_free (error); return; } b->rules = tr_sys_file_map_for_reading (fd, 0, byteCount, &error); if (!b->rules) { tr_logAddError (err_fmt, b->filename, error->message); tr_sys_file_close (fd, NULL); tr_error_free (error); return; } b->fd = fd; b->byteCount = byteCount; b->ruleCount = byteCount / sizeof (struct tr_ipv4_range); base = tr_sys_path_basename (b->filename, NULL); tr_logAddInfo (_("Blocklist \"%s\" contains %zu entries"), base, b->ruleCount); tr_free (base); } static void blocklistEnsureLoaded (tr_blocklistFile * b) { if (b->rules == NULL) blocklistLoad (b); } static int compareAddressToRange (const void * va, const void * vb) { const uint32_t * a = va; const struct tr_ipv4_range * b = vb; if (*a < b->begin) return -1; if (*a > b->end) return 1; return 0; } static void blocklistDelete (tr_blocklistFile * b) { blocklistClose (b); tr_sys_path_remove (b->filename, NULL); } /*** **** PACKAGE-VISIBLE ***/ tr_blocklistFile * tr_blocklistFileNew (const char * filename, bool isEnabled) { tr_blocklistFile * b; b = tr_new0 (tr_blocklistFile, 1); b->fd = TR_BAD_SYS_FILE; b->filename = tr_strdup (filename); b->isEnabled = isEnabled; return b; } const char* tr_blocklistFileGetFilename (const tr_blocklistFile * b) { return b->filename; } void tr_blocklistFileFree (tr_blocklistFile * b) { blocklistClose (b); tr_free (b->filename); tr_free (b); } bool tr_blocklistFileExists (const tr_blocklistFile * b) { return tr_sys_path_exists (b->filename, NULL); } int tr_blocklistFileGetRuleCount (const tr_blocklistFile * b) { blocklistEnsureLoaded ((tr_blocklistFile*)b); return b->ruleCount; } bool tr_blocklistFileIsEnabled (tr_blocklistFile * b) { return b->isEnabled; } void tr_blocklistFileSetEnabled (tr_blocklistFile * b, bool isEnabled) { assert (b != NULL); assert (tr_isBool (isEnabled)); b->isEnabled = isEnabled; } bool tr_blocklistFileHasAddress (tr_blocklistFile * b, const tr_address * addr) { uint32_t needle; const struct tr_ipv4_range * range; assert (tr_address_is_valid (addr)); if (!b->isEnabled || addr->type == TR_AF_INET6) return false; blocklistEnsureLoaded (b); if (!b->rules || !b->ruleCount) return false; needle = ntohl (addr->addr.addr4.s_addr); range = bsearch (&needle, b->rules, b->ruleCount, sizeof (struct tr_ipv4_range), compareAddressToRange); return range != NULL; } /* * P2P plaintext format: "comment:x.x.x.x-y.y.y.y" * http://wiki.phoenixlabs.org/wiki/P2P_Format * http://en.wikipedia.org/wiki/PeerGuardian#P2P_plaintext_format */ static bool parseLine1 (const char * line, struct tr_ipv4_range * range) { char * walk; int b[4]; int e[4]; char str[64]; tr_address addr; walk = strrchr (line, ':'); if (!walk) return false; ++walk; /* walk past the colon */ if (sscanf (walk, "%d.%d.%d.%d-%d.%d.%d.%d", &b[0], &b[1], &b[2], &b[3], &e[0], &e[1], &e[2], &e[3]) != 8) return false; tr_snprintf (str, sizeof (str), "%d.%d.%d.%d", b[0], b[1], b[2], b[3]); if (!tr_address_from_string (&addr, str)) return false; range->begin = ntohl (addr.addr.addr4.s_addr); tr_snprintf (str, sizeof (str), "%d.%d.%d.%d", e[0], e[1], e[2], e[3]); if (!tr_address_from_string (&addr, str)) return false; range->end = ntohl (addr.addr.addr4.s_addr); return true; } /* * DAT format: "000.000.000.000 - 000.255.255.255 , 000 , invalid ip" * http://wiki.phoenixlabs.org/wiki/DAT_Format */ static bool parseLine2 (const char * line, struct tr_ipv4_range * range) { int unk; int a[4]; int b[4]; char str[32]; tr_address addr; if (sscanf (line, "%3d.%3d.%3d.%3d - %3d.%3d.%3d.%3d , %3d , ", &a[0], &a[1], &a[2], &a[3], &b[0], &b[1], &b[2], &b[3], &unk) != 9) return false; tr_snprintf (str, sizeof (str), "%d.%d.%d.%d", a[0], a[1], a[2], a[3]); if (!tr_address_from_string (&addr, str)) return false; range->begin = ntohl (addr.addr.addr4.s_addr); tr_snprintf (str, sizeof (str), "%d.%d.%d.%d", b[0], b[1], b[2], b[3]); if (!tr_address_from_string (&addr, str)) return false; range->end = ntohl (addr.addr.addr4.s_addr); return true; } static bool parseLine (const char * line, struct tr_ipv4_range * range) { return parseLine1 (line, range) || parseLine2 (line, range); } static int compareAddressRangesByFirstAddress (const void * va, const void * vb) { const struct tr_ipv4_range * a = va; const struct tr_ipv4_range * b = vb; if (a->begin != b->begin) return a->begin < b->begin ? -1 : 1; return 0; } int tr_blocklistFileSetContent (tr_blocklistFile * b, const char * filename) { tr_sys_file_t in; tr_sys_file_t out; int inCount = 0; char line[2048]; const char * err_fmt = _("Couldn't read \"%1$s\": %2$s"); struct tr_ipv4_range * ranges = NULL; size_t ranges_alloc = 0; size_t ranges_count = 0; tr_error * error = NULL; if (!filename) { blocklistDelete (b); return 0; } in = tr_sys_file_open (filename, TR_SYS_FILE_READ, 0, &error); if (in == TR_BAD_SYS_FILE) { tr_logAddError (err_fmt, filename, error->message); tr_error_free (error); return 0; } blocklistClose (b); out = tr_sys_file_open (b->filename, TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE | TR_SYS_FILE_TRUNCATE, 0666, &error); if (out == TR_BAD_SYS_FILE) { tr_logAddError (err_fmt, b->filename, error->message); tr_error_free (error); tr_sys_file_close (in, NULL); return 0; } /* load the rules into memory */ while (tr_sys_file_read_line (in, line, sizeof (line), NULL)) { struct tr_ipv4_range range; ++inCount; if (!parseLine (line, &range)) { /* don't try to display the actual lines - it causes issues */ tr_logAddError (_("blocklist skipped invalid address at line %d"), inCount); continue; } if (ranges_alloc == ranges_count) { ranges_alloc += 4096; /* arbitrary */ ranges = tr_renew (struct tr_ipv4_range, ranges, ranges_alloc); } ranges[ranges_count++] = range; } if (ranges_count > 0) /* sort and merge */ { struct tr_ipv4_range * r; struct tr_ipv4_range * keep = ranges; const struct tr_ipv4_range * end; /* sort */ qsort (ranges, ranges_count, sizeof (struct tr_ipv4_range), compareAddressRangesByFirstAddress); /* merge */ for (r=ranges+1, end=ranges+ranges_count; r!=end; ++r) { if (keep->end < r->begin) *++keep = *r; else if (keep->end < r->end) keep->end = r->end; } ranges_count = keep + 1 - ranges; #ifndef NDEBUG /* sanity checks: make sure the rules are sorted * in ascending order and don't overlap */ { size_t i; for (i=0; ifilename, error->message); tr_error_free (error); } else { char * base = tr_sys_path_basename (b->filename, NULL); tr_logAddInfo (_("Blocklist \"%s\" updated with %zu entries"), base, ranges_count); tr_free (base); } tr_free (ranges); tr_sys_file_close (out, NULL); tr_sys_file_close (in, NULL); blocklistLoad (b); return ranges_count; } transmission-2.92/libtransmission/PaxHeaders.4960/ptrarray.c0000644000000000000000000000013212617217203021107 xustar0030 mtime=1446846083.246743939 30 atime=1446846083.246743939 30 ctime=1457295920.100809618 transmission-2.92/libtransmission/ptrarray.c0000644000175000017500000001253612617217203022543 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: ptrarray.c 14592 2015-10-25 17:13:14Z mikedld $ */ #include #include /* memmove */ #include "ptrarray.h" #include "utils.h" #define FLOOR 32 const tr_ptrArray TR_PTR_ARRAY_INIT = TR_PTR_ARRAY_INIT_STATIC; void tr_ptrArrayDestruct (tr_ptrArray * p, PtrArrayForeachFunc func) { assert (p != NULL); assert (p->items || !p->n_items); if (func) tr_ptrArrayForeach (p, func); tr_free (p->items); } void tr_ptrArrayForeach (tr_ptrArray * t, PtrArrayForeachFunc func) { int i; assert (t); assert (t->items || !t->n_items); assert (func); for (i=0; in_items; ++i) func (t->items[i]); } void** tr_ptrArrayPeek (tr_ptrArray * t, int * size) { *size = t->n_items; return t->items; } int tr_ptrArrayInsert (tr_ptrArray * t, void * ptr, int pos) { if (t->n_items >= t->n_alloc) { t->n_alloc = MAX (FLOOR, t->n_alloc * 2); t->items = tr_renew (void*, t->items, t->n_alloc); } if (pos < 0 || pos > t->n_items) pos = t->n_items; else memmove (t->items+pos+1, t->items+pos, sizeof(void*)*(t->n_items-pos)); t->items[pos] = ptr; t->n_items++; return pos; } void* tr_ptrArrayPop (tr_ptrArray* t) { void * ret = NULL; if (t->n_items) ret = t->items[--t->n_items]; return ret; } void tr_ptrArrayErase (tr_ptrArray * t, int begin, int end) { if (end < 0) end = t->n_items; assert (begin >= 0); assert (begin < end); assert (end <= t->n_items); memmove (t->items+begin, t->items+end, sizeof(void*)*(t->n_items-end)); t->n_items -= (end - begin); } /** *** **/ int tr_ptrArrayLowerBound (const tr_ptrArray * t, const void * ptr, int compare (const void *, const void *), bool * exact_match) { int pos = -1; bool match = false; if (t->n_items == 0) { pos = 0; } else { int first = 0; int last = t->n_items - 1; for (;;) { const int half = (last - first) / 2; const int c = compare (t->items[first + half], ptr); if (c < 0) { const int new_first = first + half + 1; if (new_first > last) { pos = new_first; break; } first = new_first; } else if (c > 0) { const int new_last = first + half - 1; if (new_last < first) { pos = first; break; } last = new_last; } else { match = true; pos = first + half; break; } } } if (exact_match != NULL) *exact_match = match; return pos; } #ifdef NDEBUG #define assertArrayIsSortedAndUnique(array,compare) /* no-op */ #define assertIndexIsSortedAndUnique(array,pos,compare) /* no-op */ #else static void assertArrayIsSortedAndUnique (const tr_ptrArray * t, int compare (const void*, const void*)) { int i; for (i=0; in_items-2; ++i) assert (compare (t->items[i], t->items[i+1]) < 0); } static void assertIndexIsSortedAndUnique (const tr_ptrArray * t, int pos, int compare (const void*, const void*)) { if (pos > 0) assert (compare (t->items[pos-1], t->items[pos]) < 0); if ((pos + 1) < t->n_items) assert (compare (t->items[pos], t->items[pos+1]) < 0); } #endif int tr_ptrArrayInsertSorted (tr_ptrArray * t, void * ptr, int compare (const void*, const void*)) { int pos; int ret; assertArrayIsSortedAndUnique (t, compare); pos = tr_ptrArrayLowerBound (t, ptr, compare, NULL); ret = tr_ptrArrayInsert (t, ptr, pos); assertIndexIsSortedAndUnique (t, ret, compare); return ret; } void* tr_ptrArrayFindSorted (tr_ptrArray * t, const void * ptr, int compare (const void*, const void*)) { bool match = false; const int pos = tr_ptrArrayLowerBound (t, ptr, compare, &match); return match ? t->items[pos] : NULL; } static void* tr_ptrArrayRemoveSortedValue (tr_ptrArray * t, const void * ptr, int compare (const void*, const void*)) { int pos; bool match; void * ret = NULL; assertArrayIsSortedAndUnique (t, compare); pos = tr_ptrArrayLowerBound (t, ptr, compare, &match); if (match) { ret = t->items[pos]; assert (compare (ret, ptr) == 0); tr_ptrArrayErase (t, pos, pos + 1); } assert ((ret == NULL) || (compare (ret, ptr) == 0)); return ret; } void tr_ptrArrayRemoveSortedPointer (tr_ptrArray * t, const void * ptr, int compare (const void*, const void*)) { #ifdef NDEBUG tr_ptrArrayRemoveSortedValue (t, ptr, compare); #else void * removed = tr_ptrArrayRemoveSortedValue (t, ptr, compare); assert (removed != NULL); assert (removed == ptr); assert (tr_ptrArrayFindSorted (t, ptr, compare) == NULL); #endif } transmission-2.92/libtransmission/PaxHeaders.4960/wildmat.c0000644000000000000000000000013212442116602020701 xustar0030 mtime=1418239362.939222717 30 atime=1418239362.939222717 30 ctime=1457295920.250812169 transmission-2.92/libtransmission/wildmat.c0000644000175000017500000000741712442116602022337 0ustar00mikedldmikedld00000000000000/* $XConsortium: wildmat.c,v 1.2 94/04/13 18:40:59 rws Exp $ */ /* ** ** Do shell-style pattern matching for ?, \, [], and * characters. ** Might not be robust in face of malformed patterns; e.g., "foo[a-" ** could cause a segmentation violation. It is 8bit clean. ** ** Written by Rich $alz, mirror!rs, Wed Nov 26 19:03:17 EST 1986. ** Rich $alz is now . ** April, 1991: Replaced mutually-recursive calls with in-line code ** for the star character. ** ** Special thanks to Lars Mathiesen for the ABORT code. ** This can greatly speed up failing wildcard patterns. For example: ** pattern: -*-*-*-*-*-*-12-*-*-*-m-*-*-* ** text 1: -adobe-courier-bold-o-normal--12-120-75-75-m-70-iso8859-1 ** text 2: -adobe-courier-bold-o-normal--12-120-75-75-X-70-iso8859-1 ** Text 1 matches with 51 calls, while text 2 fails with 54 calls. Without ** the ABORT, then it takes 22310 calls to fail. Ugh. The following ** explanation is from Lars: ** The precondition that must be fulfilled is that DoMatch will consume ** at least one character in text. This is true if *p is neither '*' nor ** '\0'.) The last return has ABORT instead of false to avoid quadratic ** behaviour in cases like pattern "*a*b*c*d" with text "abcxxxxx". With ** false, each star-loop has to run to the end of the text; with ABORT ** only the last one does. ** ** Once the control of one instance of DoMatch enters the star-loop, that ** instance will return either true or ABORT, and any calling instance ** will therefore return immediately after (without calling recursively ** again). In effect, only one star-loop is ever active. It would be ** possible to modify the code to maintain this context explicitly, ** eliminating all recursive calls at the cost of some complication and ** loss of clarity (and the ABORT stuff seems to be unclear enough by ** itself). I think it would be unwise to try to get this into a ** released version unless you have a good test data base to try it out ** on. */ #include "transmission.h" #include "utils.h" #define ABORT -1 /* What character marks an inverted character class? */ #define NEGATE_CLASS '^' /* Is "*" a common pattern? */ #define OPTIMIZE_JUST_STAR /* Do tar (1) matching rules, which ignore a trailing slash? */ #undef MATCH_TAR_PATTERN /* ** Match text and p, return true, false, or ABORT. */ static int DoMatch (const char * text, const char * p) { register int last; register int matched; register int reverse; for (; *p; text++, p++) { if (*text == '\0' && *p != '*') return ABORT; switch (*p) { case '\\': /* Literal match with following character. */ p++; /* FALLTHROUGH */ default: if (*text != *p) return false; continue; case '?': /* Match anything. */ continue; case '*': while (*++p == '*') /* Consecutive stars act just like one. */ continue; if (*p == '\0') /* Trailing star matches everything. */ return true; while (*text) if ((matched = DoMatch (text++, p)) != false) return matched; return ABORT; case '[': reverse = p[1] == NEGATE_CLASS ? true : false; if (reverse) /* Inverted character class. */ p++; for (last = 0400, matched = false; *++p && *p != ']'; last = *p) /* This next line requires a good C compiler. */ if (*p == '-' ? *text <= *++p && *text >= last : *text == *p) matched = true; if (matched == reverse) return false; continue; } } #ifdef MATCH_TAR_PATTERN if (*text == '/') return true; #endif /* MATCH_TAR_ATTERN */ return *text == '\0'; } /* User-level routine. returns whether or not 'text' and 'p' matched */ bool tr_wildmat (const char * text, const char * p) { if (p[0] == '*' && p[1] == '\0') return true; return DoMatch (text, p) == true; } transmission-2.92/libtransmission/PaxHeaders.4960/move-test.c0000644000000000000000000000013212612560135021166 xustar0030 mtime=1445650525.018276228 30 atime=1445650525.018276228 30 ctime=1457295920.271812526 transmission-2.92/libtransmission/move-test.c0000644000175000017500000001425112612560135022616 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: move-test.c 14587 2015-10-23 04:09:40Z mikedld $ */ #include #include /* strcmp() */ #include #include #include "transmission.h" #include "cache.h" #include "file.h" #include "resume.h" #include "trevent.h" #include "torrent.h" /* tr_isTorrent() */ #include "variant.h" #include "libtransmission-test.h" /*** **** ***/ static void zeroes_completeness_func (tr_torrent * torrent UNUSED, tr_completeness completeness, bool wasRunning UNUSED, void * user_data) { *(tr_completeness*)user_data = completeness; } #define check_file_location(tor, i, expected_path) \ do { \ char * path = tr_torrentFindFile (tor, i); \ char * expected = expected_path; \ check_streq (expected, path); \ tr_free (expected); \ tr_free (path); \ } while (0) struct test_incomplete_dir_data { tr_session * session; tr_torrent * tor; tr_block_index_t block; tr_piece_index_t pieceIndex; uint32_t offset; struct evbuffer * buf; bool done; }; static void test_incomplete_dir_threadfunc (void * vdata) { struct test_incomplete_dir_data * data = vdata; tr_cacheWriteBlock (data->session->cache, data->tor, 0, data->offset, data->tor->blockSize, data->buf); tr_torrentGotBlock (data->tor, data->block); data->done = true; } static int test_incomplete_dir_impl (const char * incomplete_dir, const char * download_dir) { size_t i; tr_session * session; tr_torrent * tor; tr_completeness completeness; const tr_completeness completeness_unset = -1; const time_t deadline = time(NULL) + 300; tr_variant settings; /* init the session */ tr_variantInitDict (&settings, 3); tr_variantDictAddStr (&settings, TR_KEY_download_dir, download_dir); tr_variantDictAddStr (&settings, TR_KEY_incomplete_dir, incomplete_dir); tr_variantDictAddBool (&settings, TR_KEY_incomplete_dir_enabled, true); session = libttest_session_init (&settings); tr_variantFree (&settings); download_dir = tr_sessionGetDownloadDir (session); incomplete_dir = tr_sessionGetIncompleteDir (session); /* init an incomplete torrent. the test zero_torrent will be missing its first piece */ tor = libttest_zero_torrent_init (session); libttest_zero_torrent_populate (tor, false); check (tr_torrentStat(tor)->leftUntilDone == tor->info.pieceSize); check_file_location (tor, 0, tr_strdup_printf("%s/%s.part", incomplete_dir, tor->info.files[0].name)); check_file_location (tor, 1, tr_buildPath(incomplete_dir, tor->info.files[1].name, NULL)); check_int_eq (tor->info.pieceSize, tr_torrentStat(tor)->leftUntilDone); completeness = completeness_unset; tr_torrentSetCompletenessCallback (tor, zeroes_completeness_func, &completeness); /* now finish writing it */ { tr_block_index_t first, last; char * zero_block = tr_new0 (char, tor->blockSize); struct test_incomplete_dir_data data; data.session = session; data.tor = tor; data.pieceIndex = 0; data.buf = evbuffer_new (); tr_torGetPieceBlockRange (tor, data.pieceIndex, &first, &last); for (i=first; i<=last; ++i) { evbuffer_add (data.buf, zero_block, tor->blockSize); data.block = i; data.done = false; data.offset = data.block * tor->blockSize; tr_runInEventThread (session, test_incomplete_dir_threadfunc, &data); do { tr_wait_msec(50); } while (!data.done); } evbuffer_free (data.buf); tr_free (zero_block); } libttest_blockingTorrentVerify (tor); check_int_eq (0, tr_torrentStat(tor)->leftUntilDone); while ((completeness==completeness_unset) && (time(NULL)<=deadline)) tr_wait_msec (50); check_int_eq (TR_SEED, completeness); for (i=0; iinfo.fileCount; ++i) check_file_location (tor, i, tr_buildPath (download_dir, tor->info.files[i].name, NULL)); /* cleanup */ tr_torrentRemove (tor, true, tr_sys_path_remove); libttest_session_close (session); return 0; } static int test_incomplete_dir (void) { int rv; /* test what happens when incompleteDir is a subdir of downloadDir*/ if ((rv = test_incomplete_dir_impl ("Downloads/Incomplete", "Downloads"))) return rv; /* test what happens when downloadDir is a subdir of incompleteDir */ if ((rv = test_incomplete_dir_impl ("Downloads", "Downloads/Complete"))) return rv; /* test what happens when downloadDir and incompleteDir are siblings */ if ((rv = test_incomplete_dir_impl ("Incomplete", "Downloads"))) return rv; return 0; } /*** **** ***/ static int test_set_location (void) { size_t i; int state; char * target_dir; tr_torrent * tor; tr_session * session; const time_t deadline = time(NULL) + 300; /* init the session */ session = libttest_session_init (NULL); target_dir = tr_buildPath (tr_sessionGetConfigDir (session), "target", NULL); tr_sys_dir_create (target_dir, TR_SYS_DIR_CREATE_PARENTS, 0777, NULL); /* init a torrent. */ tor = libttest_zero_torrent_init (session); libttest_zero_torrent_populate (tor, true); libttest_blockingTorrentVerify (tor); check_int_eq (0, tr_torrentStat(tor)->leftUntilDone); /* now move it */ state = -1; tr_torrentSetLocation (tor, target_dir, true, NULL, &state); while ((state==TR_LOC_MOVING) && (time(NULL)<=deadline)) tr_wait_msec (50); check_int_eq (TR_LOC_DONE, state); /* confirm the torrent is still complete after being moved */ libttest_blockingTorrentVerify (tor); check_int_eq (0, tr_torrentStat(tor)->leftUntilDone); /* confirm the filest really got moved */ libttest_sync (); for (i=0; iinfo.fileCount; ++i) check_file_location (tor, i, tr_buildPath (target_dir, tor->info.files[i].name, NULL)); /* cleanup */ tr_free (target_dir); tr_torrentRemove (tor, true, tr_sys_path_remove); libttest_session_close (session); return 0; } /*** **** ***/ int main (void) { const testFunc tests[] = { test_incomplete_dir, test_set_location }; return runTests (tests, NUM_TESTS (tests)); } transmission-2.92/libtransmission/PaxHeaders.4960/watchdir-common.h0000644000000000000000000000013012662757235022357 xustar0029 mtime=1456201373.07175669 29 atime=1456201373.07175669 30 ctime=1457295919.895806132 transmission-2.92/libtransmission/watchdir-common.h0000644000175000017500000000303312662757235024005 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015-2016 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: watchdir-common.h 14651 2016-01-02 14:28:59Z mikedld $ */ #ifndef TR_WATCHDIR_COMMON_H #define TR_WATCHDIR_COMMON_H #ifndef __LIBTRANSMISSION_WATCHDIR_MODULE__ #error only the libtransmission watchdir module should #include this header. #endif struct tr_ptrArray; typedef struct tr_watchdir_backend { void (* free_func) (struct tr_watchdir_backend *); } tr_watchdir_backend; #define BACKEND_DOWNCAST(b) ((tr_watchdir_backend *) (b)) /* ... */ tr_watchdir_backend * tr_watchdir_get_backend (tr_watchdir_t handle); struct event_base * tr_watchdir_get_event_base (tr_watchdir_t handle); /* ... */ void tr_watchdir_process (tr_watchdir_t handle, const char * name); void tr_watchdir_scan (tr_watchdir_t handle, struct tr_ptrArray * dir_entries); /* ... */ tr_watchdir_backend * tr_watchdir_generic_new (tr_watchdir_t handle); #ifdef WITH_INOTIFY tr_watchdir_backend * tr_watchdir_inotify_new (tr_watchdir_t handle); #endif #ifdef WITH_KQUEUE tr_watchdir_backend * tr_watchdir_kqueue_new (tr_watchdir_t handle); #endif #ifdef _WIN32 tr_watchdir_backend * tr_watchdir_win32_new (tr_watchdir_t handle); #endif #endif /* TR_WATCHDIR_COMMON_H */ transmission-2.92/libtransmission/PaxHeaders.4960/trevent.h0000644000000000000000000000013212442116602020734 xustar0030 mtime=1418239362.925222478 30 atime=1418239362.925222478 30 ctime=1457295919.848805333 transmission-2.92/libtransmission/trevent.h0000644000175000017500000000107512442116602022364 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: trevent.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_EVENT_H #define TR_EVENT_H /** **/ void tr_eventInit (tr_session *); void tr_eventClose (tr_session *); bool tr_amInEventThread (const tr_session *); void tr_runInEventThread (tr_session *, void func (void*), void * user_data); #endif transmission-2.92/libtransmission/PaxHeaders.4960/handshake.h0000644000000000000000000000013212442116602021173 xustar0030 mtime=1418239362.946222837 30 atime=1418239362.946222837 30 ctime=1457295919.637801745 transmission-2.92/libtransmission/handshake.h0000644000175000017500000000340112442116602022616 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: handshake.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_HANDSHAKE_H #define TR_HANDSHAKE_H #include "transmission.h" #include "net.h" /** @addtogroup peers Peers @{ */ struct tr_peerIo; /** @brief opaque struct holding hanshake state information. freed when the handshake is completed. */ typedef struct tr_handshake tr_handshake; /* returns true on success, false on error */ typedef bool (*handshakeDoneCB)(struct tr_handshake * handshake, struct tr_peerIo * io, bool readAnythingFromPeer, bool isConnected, const uint8_t * peerId, void * userData); /** @brief instantiate a new handshake */ tr_handshake * tr_handshakeNew (struct tr_peerIo * io, tr_encryption_mode encryptionMode, handshakeDoneCB doneCB, void * doneUserData); const tr_address * tr_handshakeGetAddr (const struct tr_handshake * handshake, tr_port * port); void tr_handshakeAbort (tr_handshake * handshake); struct tr_peerIo* tr_handshakeGetIO (tr_handshake * handshake); struct tr_peerIo* tr_handshakeStealIO (tr_handshake * handshake); /** @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/clients.h0000644000000000000000000000013212442116602020706 xustar0030 mtime=1418239362.955222992 30 atime=1418239362.955222992 30 ctime=1457295919.583800827 transmission-2.92/libtransmission/clients.h0000644000175000017500000000103612442116602022333 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: clients.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_CLIENTS_H #define TR_CLIENTS_H /** * @brief parse a peer-id into a human-readable client name and version number * @ingroup utils */ char* tr_clientForId (char * buf, size_t buflen, const void * peer_id); #endif transmission-2.92/libtransmission/PaxHeaders.4960/tr-dht.h0000644000000000000000000000013212532765473020467 xustar0030 mtime=1433135931.844661441 30 atime=1433135931.844661441 30 ctime=1457295919.822804891 transmission-2.92/libtransmission/tr-dht.h0000644000175000017500000000364012532765473022117 0ustar00mikedldmikedld00000000000000/* * Copyright (c) 2009-2010 by Juliusz Chroboczek * * 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. * * $Id: tr-dht.h 14532 2015-05-31 22:13:31Z mikedld $ * */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif enum { TR_DHT_STOPPED = 0, TR_DHT_BROKEN = 1, TR_DHT_POOR = 2, TR_DHT_FIREWALLED = 3, TR_DHT_GOOD = 4 }; int tr_dhtInit (tr_session *); void tr_dhtUninit (tr_session *); bool tr_dhtEnabled (const tr_session *); tr_port tr_dhtPort (tr_session *); int tr_dhtStatus (tr_session *, int af, int * setme_nodeCount); const char *tr_dhtPrintableStatus (int status); bool tr_dhtAddNode (tr_session *, const tr_address *, tr_port, bool bootstrap); void tr_dhtUpkeep (tr_session *); void tr_dhtCallback (unsigned char *buf, int buflen, struct sockaddr *from, socklen_t fromlen, void *sv); transmission-2.92/libtransmission/PaxHeaders.4960/tr-getopt.h0000644000000000000000000000013212634073127021201 xustar0030 mtime=1450210903.501467033 30 atime=1450210903.501467033 30 ctime=1457295919.811804704 transmission-2.92/libtransmission/tr-getopt.h0000644000175000017500000000343412634073127022632 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: tr-getopt.h 14615 2015-12-06 22:39:14Z jordan $ */ #ifndef TR_GETOPT_H #define TR_GETOPT_H #ifdef __cplusplus extern "C" { #endif /** * @addtogroup utils Utilities * @{ */ /** @brief Similar to optind, this is the current index into argv */ extern int tr_optind; typedef struct tr_option { int val; /* the value to return from tr_getopt () */ const char * longName; /* --long-form */ const char * description; /* option's description for tr_getopt_usage () */ const char * shortName; /* short form */ int has_arg; /* 0 for no argument, 1 for argument */ const char * argName; /* argument's description for tr_getopt_usage () */ } tr_option; enum { /* all options have been processed */ TR_OPT_DONE = 0, /* a syntax error was detected, such as a missing * argument for an option that requires one */ TR_OPT_ERR = -1, /* an unknown option was reached */ TR_OPT_UNK = -2 }; /** * @brief similar to getopt () * @return TR_GETOPT_DONE, TR_GETOPT_ERR, TR_GETOPT_UNK, or the matching tr_option's `val' field */ int tr_getopt (const char * summary, int argc, const char * const * argv, const tr_option * opts, const char ** setme_optarg); /** @brief prints the `Usage' help section to stdout */ void tr_getopt_usage (const char * appName, const char * description, const tr_option * opts); #ifdef __cplusplus } /* extern "C" */ #endif /** @} */ #endif /* TR_GETOPT_H */ transmission-2.92/libtransmission/PaxHeaders.4960/rpcimpl.c0000644000000000000000000000013112641272401020706 xustar0030 mtime=1451586817.584878658 29 atime=1451586817.58387864 30 ctime=1457295920.122809993 transmission-2.92/libtransmission/rpcimpl.c0000644000175000017500000021746412641272401022352 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: rpcimpl.c 14644 2015-12-29 19:37:31Z mikedld $ */ #include #include /* isdigit */ #include #include /* strtol */ #include /* strcmp */ #include #include #include "transmission.h" #include "completion.h" #include "crypto-utils.h" #include "error.h" #include "fdlimit.h" #include "file.h" #include "log.h" #include "platform-quota.h" /* tr_device_info_get_free_space() */ #include "rpcimpl.h" #include "session.h" #include "torrent.h" #include "utils.h" #include "variant.h" #include "version.h" #include "web.h" #define RPC_VERSION 15 #define RPC_VERSION_MIN 1 #define RECENTLY_ACTIVE_SECONDS 60 #define TR_N_ELEMENTS(ary)(sizeof (ary) / sizeof (*ary)) #if 0 #define dbgmsg(fmt, ...) \ do { \ fprintf (stderr, "%s:%d"#fmt, __FILE__, __LINE__, __VA_ARGS__); \ fprintf (stderr, "\n"); \ } while (0) #else #define dbgmsg(...) \ do \ { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, "RPC", __VA_ARGS__); \ } \ while (0) #endif /*** **** ***/ static tr_rpc_callback_status notify (tr_session * session, int type, tr_torrent * tor) { tr_rpc_callback_status status = 0; if (session->rpc_func) status = session->rpc_func (session, type, tor, session->rpc_func_user_data); return status; } /*** **** ***/ /* For functions that can't be immediately executed, like torrentAdd, * this is the callback data used to pass a response to the caller * when the task is complete */ struct tr_rpc_idle_data { tr_session * session; tr_variant * response; tr_variant * args_out; tr_rpc_response_func callback; void * callback_user_data; }; static void tr_idle_function_done (struct tr_rpc_idle_data * data, const char * result) { if (result == NULL) result = "success"; tr_variantDictAddStr (data->response, TR_KEY_result, result); (*data->callback)(data->session, data->response, data->callback_user_data); tr_variantFree (data->response); tr_free (data->response); tr_free (data); } /*** **** ***/ static tr_torrent ** getTorrents (tr_session * session, tr_variant * args, int * setmeCount) { int torrentCount = 0; int64_t id; tr_torrent ** torrents = NULL; tr_variant * ids; const char * str; if (tr_variantDictFindList (args, TR_KEY_ids, &ids)) { int i; const int n = tr_variantListSize (ids); torrents = tr_new0 (tr_torrent *, n); for (i=0; ianyDate >= now - window) torrents[torrentCount++] = tor; } else { tr_torrent * tor; torrents = tr_new0 (tr_torrent *, 1); if ((tor = tr_torrentFindFromHashString (session, str))) torrents[torrentCount++] = tor; } } else /* all of them */ { torrents = tr_sessionGetTorrents (session, &torrentCount); } *setmeCount = torrentCount; return torrents; } static void notifyBatchQueueChange (tr_session * session, tr_torrent ** torrents, int n) { int i; for (i=0; iqueuePosition - b->queuePosition; } static const char* torrentStart (tr_session * session, tr_variant * args_in, tr_variant * args_out UNUSED, struct tr_rpc_idle_data * idle_data UNUSED) { int i; int torrentCount; tr_torrent ** torrents; assert (idle_data == NULL); torrents = getTorrents (session, args_in, &torrentCount); qsort (torrents, torrentCount, sizeof (tr_torrent *), compareTorrentByQueuePosition); for (i=0; iisRunning) { tr_torrentStart (tor); notify (session, TR_RPC_TORRENT_STARTED, tor); } } tr_free (torrents); return NULL; } static const char* torrentStartNow (tr_session * session, tr_variant * args_in, tr_variant * args_out UNUSED, struct tr_rpc_idle_data * idle_data UNUSED) { int i; int torrentCount; tr_torrent ** torrents; assert (idle_data == NULL); torrents = getTorrents (session, args_in, &torrentCount); qsort (torrents, torrentCount, sizeof (tr_torrent *), compareTorrentByQueuePosition); for (i=0; iisRunning) { tr_torrentStartNow (tor); notify (session, TR_RPC_TORRENT_STARTED, tor); } } tr_free (torrents); return NULL; } static const char* torrentStop (tr_session * session, tr_variant * args_in, tr_variant * args_out UNUSED, struct tr_rpc_idle_data * idle_data UNUSED) { int i; int torrentCount; tr_torrent ** torrents; assert (idle_data == NULL); torrents = getTorrents (session, args_in, &torrentCount); for (i=0; iisRunning || tr_torrentIsQueued (tor)) { tor->isStopping = true; notify (session, TR_RPC_TORRENT_STOPPED, tor); } } tr_free (torrents); return NULL; } static const char* torrentRemove (tr_session * session, tr_variant * args_in, tr_variant * args_out UNUSED, struct tr_rpc_idle_data * idle_data UNUSED) { int i; int torrentCount; tr_rpc_callback_type type; bool deleteFlag; tr_torrent ** torrents; assert (idle_data == NULL); if (!tr_variantDictFindBool (args_in, TR_KEY_delete_local_data, &deleteFlag)) deleteFlag = false; type = deleteFlag ? TR_RPC_TORRENT_TRASHING : TR_RPC_TORRENT_REMOVING; torrents = getTorrents (session, args_in, &torrentCount); for (i=0; ifileCount; ++i) { const tr_file * file = &info->files[i]; tr_variant * d = tr_variantListAddDict (list, 3); tr_variantDictAddInt (d, TR_KEY_bytesCompleted, files[i].bytesCompleted); tr_variantDictAddInt (d, TR_KEY_priority, file->priority); tr_variantDictAddBool (d, TR_KEY_wanted, !file->dnd); } tr_torrentFilesFree (files, n); } static void addFiles (const tr_torrent * tor, tr_variant * list) { tr_file_index_t i; tr_file_index_t n; const tr_info * info = tr_torrentInfo (tor); tr_file_stat * files = tr_torrentFiles (tor, &n); for (i=0; ifileCount; ++i) { const tr_file * file = &info->files[i]; tr_variant * d = tr_variantListAddDict (list, 3); tr_variantDictAddInt (d, TR_KEY_bytesCompleted, files[i].bytesCompleted); tr_variantDictAddInt (d, TR_KEY_length, file->length); tr_variantDictAddStr (d, TR_KEY_name, file->name); } tr_torrentFilesFree (files, n); } static void addWebseeds (const tr_info * info, tr_variant * webseeds) { unsigned int i; for (i=0; i< info->webseedCount; ++i) tr_variantListAddStr (webseeds, info->webseeds[i]); } static void addTrackers (const tr_info * info, tr_variant * trackers) { unsigned int i; for (i=0; itrackerCount; ++i) { const tr_tracker_info * t = &info->trackers[i]; tr_variant * d = tr_variantListAddDict (trackers, 4); tr_variantDictAddStr (d, TR_KEY_announce, t->announce); tr_variantDictAddInt (d, TR_KEY_id, t->id); tr_variantDictAddStr (d, TR_KEY_scrape, t->scrape); tr_variantDictAddInt (d, TR_KEY_tier, t->tier); } } static void addTrackerStats (const tr_tracker_stat * st, int n, tr_variant * list) { int i; for (i=0; iannounce); tr_variantDictAddInt (d, TR_KEY_announceState, s->announceState); tr_variantDictAddInt (d, TR_KEY_downloadCount, s->downloadCount); tr_variantDictAddBool (d, TR_KEY_hasAnnounced, s->hasAnnounced); tr_variantDictAddBool (d, TR_KEY_hasScraped, s->hasScraped); tr_variantDictAddStr (d, TR_KEY_host, s->host); tr_variantDictAddInt (d, TR_KEY_id, s->id); tr_variantDictAddBool (d, TR_KEY_isBackup, s->isBackup); tr_variantDictAddInt (d, TR_KEY_lastAnnouncePeerCount, s->lastAnnouncePeerCount); tr_variantDictAddStr (d, TR_KEY_lastAnnounceResult, s->lastAnnounceResult); tr_variantDictAddInt (d, TR_KEY_lastAnnounceStartTime, s->lastAnnounceStartTime); tr_variantDictAddBool (d, TR_KEY_lastAnnounceSucceeded, s->lastAnnounceSucceeded); tr_variantDictAddInt (d, TR_KEY_lastAnnounceTime, s->lastAnnounceTime); tr_variantDictAddBool (d, TR_KEY_lastAnnounceTimedOut, s->lastAnnounceTimedOut); tr_variantDictAddStr (d, TR_KEY_lastScrapeResult, s->lastScrapeResult); tr_variantDictAddInt (d, TR_KEY_lastScrapeStartTime, s->lastScrapeStartTime); tr_variantDictAddBool (d, TR_KEY_lastScrapeSucceeded, s->lastScrapeSucceeded); tr_variantDictAddInt (d, TR_KEY_lastScrapeTime, s->lastScrapeTime); tr_variantDictAddInt (d, TR_KEY_lastScrapeTimedOut, s->lastScrapeTimedOut); tr_variantDictAddInt (d, TR_KEY_leecherCount, s->leecherCount); tr_variantDictAddInt (d, TR_KEY_nextAnnounceTime, s->nextAnnounceTime); tr_variantDictAddInt (d, TR_KEY_nextScrapeTime, s->nextScrapeTime); tr_variantDictAddStr (d, TR_KEY_scrape, s->scrape); tr_variantDictAddInt (d, TR_KEY_scrapeState, s->scrapeState); tr_variantDictAddInt (d, TR_KEY_seederCount, s->seederCount); tr_variantDictAddInt (d, TR_KEY_tier, s->tier); } } static void addPeers (tr_torrent * tor, tr_variant * list) { int i; int peerCount; tr_peer_stat * peers = tr_torrentPeers (tor, &peerCount); tr_variantInitList (list, peerCount); for (i=0; iaddr); tr_variantDictAddStr (d, TR_KEY_clientName, peer->client); tr_variantDictAddBool (d, TR_KEY_clientIsChoked, peer->clientIsChoked); tr_variantDictAddBool (d, TR_KEY_clientIsInterested, peer->clientIsInterested); tr_variantDictAddStr (d, TR_KEY_flagStr, peer->flagStr); tr_variantDictAddBool (d, TR_KEY_isDownloadingFrom, peer->isDownloadingFrom); tr_variantDictAddBool (d, TR_KEY_isEncrypted, peer->isEncrypted); tr_variantDictAddBool (d, TR_KEY_isIncoming, peer->isIncoming); tr_variantDictAddBool (d, TR_KEY_isUploadingTo, peer->isUploadingTo); tr_variantDictAddBool (d, TR_KEY_isUTP, peer->isUTP); tr_variantDictAddBool (d, TR_KEY_peerIsChoked, peer->peerIsChoked); tr_variantDictAddBool (d, TR_KEY_peerIsInterested, peer->peerIsInterested); tr_variantDictAddInt (d, TR_KEY_port, peer->port); tr_variantDictAddReal (d, TR_KEY_progress, peer->progress); tr_variantDictAddInt (d, TR_KEY_rateToClient, toSpeedBytes (peer->rateToClient_KBps)); tr_variantDictAddInt (d, TR_KEY_rateToPeer, toSpeedBytes (peer->rateToPeer_KBps)); } tr_torrentPeersFree (peers, peerCount); } static void addField (tr_torrent * const tor, const tr_info * const inf, const tr_stat * const st, tr_variant * const d, const tr_quark key) { char * str; switch (key) { case TR_KEY_activityDate: tr_variantDictAddInt (d, key, st->activityDate); break; case TR_KEY_addedDate: tr_variantDictAddInt (d, key, st->addedDate); break; case TR_KEY_bandwidthPriority: tr_variantDictAddInt (d, key, tr_torrentGetPriority (tor)); break; case TR_KEY_comment: tr_variantDictAddStr (d, key, inf->comment ? inf->comment : ""); break; case TR_KEY_corruptEver: tr_variantDictAddInt (d, key, st->corruptEver); break; case TR_KEY_creator: tr_variantDictAddStr (d, key, inf->creator ? inf->creator : ""); break; case TR_KEY_dateCreated: tr_variantDictAddInt (d, key, inf->dateCreated); break; case TR_KEY_desiredAvailable: tr_variantDictAddInt (d, key, st->desiredAvailable); break; case TR_KEY_doneDate: tr_variantDictAddInt (d, key, st->doneDate); break; case TR_KEY_downloadDir: tr_variantDictAddStr (d, key, tr_torrentGetDownloadDir (tor)); break; case TR_KEY_downloadedEver: tr_variantDictAddInt (d, key, st->downloadedEver); break; case TR_KEY_downloadLimit: tr_variantDictAddInt (d, key, tr_torrentGetSpeedLimit_KBps (tor, TR_DOWN)); break; case TR_KEY_downloadLimited: tr_variantDictAddBool (d, key, tr_torrentUsesSpeedLimit (tor, TR_DOWN)); break; case TR_KEY_error: tr_variantDictAddInt (d, key, st->error); break; case TR_KEY_errorString: tr_variantDictAddStr (d, key, st->errorString); break; case TR_KEY_eta: tr_variantDictAddInt (d, key, st->eta); break; case TR_KEY_files: addFiles (tor, tr_variantDictAddList (d, key, inf->fileCount)); break; case TR_KEY_fileStats: addFileStats (tor, tr_variantDictAddList (d, key, inf->fileCount)); break; case TR_KEY_hashString: tr_variantDictAddStr (d, key, tor->info.hashString); break; case TR_KEY_haveUnchecked: tr_variantDictAddInt (d, key, st->haveUnchecked); break; case TR_KEY_haveValid: tr_variantDictAddInt (d, key, st->haveValid); break; case TR_KEY_honorsSessionLimits: tr_variantDictAddBool (d, key, tr_torrentUsesSessionLimits (tor)); break; case TR_KEY_id: tr_variantDictAddInt (d, key, st->id); break; case TR_KEY_isFinished: tr_variantDictAddBool (d, key, st->finished); break; case TR_KEY_isPrivate: tr_variantDictAddBool (d, key, tr_torrentIsPrivate (tor)); break; case TR_KEY_isStalled: tr_variantDictAddBool (d, key, st->isStalled); break; case TR_KEY_leftUntilDone: tr_variantDictAddInt (d, key, st->leftUntilDone); break; case TR_KEY_manualAnnounceTime: tr_variantDictAddInt (d, key, st->manualAnnounceTime); break; case TR_KEY_maxConnectedPeers: tr_variantDictAddInt (d, key, tr_torrentGetPeerLimit (tor)); break; case TR_KEY_magnetLink: str = tr_torrentGetMagnetLink (tor); tr_variantDictAddStr (d, key, str); tr_free (str); break; case TR_KEY_metadataPercentComplete: tr_variantDictAddReal (d, key, st->metadataPercentComplete); break; case TR_KEY_name: tr_variantDictAddStr (d, key, tr_torrentName (tor)); break; case TR_KEY_percentDone: tr_variantDictAddReal (d, key, st->percentDone); break; case TR_KEY_peer_limit: tr_variantDictAddInt (d, key, tr_torrentGetPeerLimit (tor)); break; case TR_KEY_peers: addPeers (tor, tr_variantDictAdd (d, key)); break; case TR_KEY_peersConnected: tr_variantDictAddInt (d, key, st->peersConnected); break; case TR_KEY_peersFrom: { tr_variant * tmp = tr_variantDictAddDict (d, key, 7); const int * f = st->peersFrom; tr_variantDictAddInt (tmp, TR_KEY_fromCache, f[TR_PEER_FROM_RESUME]); tr_variantDictAddInt (tmp, TR_KEY_fromDht, f[TR_PEER_FROM_DHT]); tr_variantDictAddInt (tmp, TR_KEY_fromIncoming, f[TR_PEER_FROM_INCOMING]); tr_variantDictAddInt (tmp, TR_KEY_fromLpd, f[TR_PEER_FROM_LPD]); tr_variantDictAddInt (tmp, TR_KEY_fromLtep, f[TR_PEER_FROM_LTEP]); tr_variantDictAddInt (tmp, TR_KEY_fromPex, f[TR_PEER_FROM_PEX]); tr_variantDictAddInt (tmp, TR_KEY_fromTracker, f[TR_PEER_FROM_TRACKER]); break; } case TR_KEY_peersGettingFromUs: tr_variantDictAddInt (d, key, st->peersGettingFromUs); break; case TR_KEY_peersSendingToUs: tr_variantDictAddInt (d, key, st->peersSendingToUs); break; case TR_KEY_pieces: if (tr_torrentHasMetadata (tor)) { size_t byte_count = 0; void * bytes = tr_torrentCreatePieceBitfield (tor, &byte_count); char * str = tr_base64_encode (bytes, byte_count, NULL); tr_variantDictAddStr (d, key, str!=NULL ? str : ""); tr_free (str); tr_free (bytes); } else { tr_variantDictAddStr (d, key, ""); } break; case TR_KEY_pieceCount: tr_variantDictAddInt (d, key, inf->pieceCount); break; case TR_KEY_pieceSize: tr_variantDictAddInt (d, key, inf->pieceSize); break; case TR_KEY_priorities: { tr_file_index_t i; tr_variant * p = tr_variantDictAddList (d, key, inf->fileCount); for (i=0; ifileCount; ++i) tr_variantListAddInt (p, inf->files[i].priority); break; } case TR_KEY_queuePosition: tr_variantDictAddInt (d, key, st->queuePosition); break; case TR_KEY_etaIdle: tr_variantDictAddInt (d, key, st->etaIdle); break; case TR_KEY_rateDownload: tr_variantDictAddInt (d, key, toSpeedBytes (st->pieceDownloadSpeed_KBps)); break; case TR_KEY_rateUpload: tr_variantDictAddInt (d, key, toSpeedBytes (st->pieceUploadSpeed_KBps)); break; case TR_KEY_recheckProgress: tr_variantDictAddReal (d, key, st->recheckProgress); break; case TR_KEY_seedIdleLimit: tr_variantDictAddInt (d, key, tr_torrentGetIdleLimit (tor)); break; case TR_KEY_seedIdleMode: tr_variantDictAddInt (d, key, tr_torrentGetIdleMode (tor)); break; case TR_KEY_seedRatioLimit: tr_variantDictAddReal (d, key, tr_torrentGetRatioLimit (tor)); break; case TR_KEY_seedRatioMode: tr_variantDictAddInt (d, key, tr_torrentGetRatioMode (tor)); break; case TR_KEY_sizeWhenDone: tr_variantDictAddInt (d, key, st->sizeWhenDone); break; case TR_KEY_startDate: tr_variantDictAddInt (d, key, st->startDate); break; case TR_KEY_status: tr_variantDictAddInt (d, key, st->activity); break; case TR_KEY_secondsDownloading: tr_variantDictAddInt (d, key, st->secondsDownloading); break; case TR_KEY_secondsSeeding: tr_variantDictAddInt (d, key, st->secondsSeeding); break; case TR_KEY_trackers: addTrackers (inf, tr_variantDictAddList (d, key, inf->trackerCount)); break; case TR_KEY_trackerStats: { int n; tr_tracker_stat * s = tr_torrentTrackers (tor, &n); addTrackerStats (s, n, tr_variantDictAddList (d, key, n)); tr_torrentTrackersFree (s, n); break; } case TR_KEY_torrentFile: tr_variantDictAddStr (d, key, inf->torrent); break; case TR_KEY_totalSize: tr_variantDictAddInt (d, key, inf->totalSize); break; case TR_KEY_uploadedEver: tr_variantDictAddInt (d, key, st->uploadedEver); break; case TR_KEY_uploadLimit: tr_variantDictAddInt (d, key, tr_torrentGetSpeedLimit_KBps (tor, TR_UP)); break; case TR_KEY_uploadLimited: tr_variantDictAddBool (d, key, tr_torrentUsesSpeedLimit (tor, TR_UP)); break; case TR_KEY_uploadRatio: tr_variantDictAddReal (d, key, st->ratio); break; case TR_KEY_wanted: { tr_file_index_t i; tr_variant * w = tr_variantDictAddList (d, key, inf->fileCount); for (i=0; ifileCount; ++i) tr_variantListAddInt (w, inf->files[i].dnd ? 0 : 1); break; } case TR_KEY_webseeds: addWebseeds (inf, tr_variantDictAddList (d, key, inf->webseedCount)); break; case TR_KEY_webseedsSendingToUs: tr_variantDictAddInt (d, key, st->webseedsSendingToUs); break; default: break; } } static void addInfo (tr_torrent * tor, tr_variant * d, tr_variant * fields) { const int n = tr_variantListSize (fields); tr_variantInitDict (d, n); if (n > 0) { int i; const tr_info * const inf = tr_torrentInfo (tor); const tr_stat * const st = tr_torrentStat ((tr_torrent*)tor); for (i=0; iremovedTorrents, n++))) { int64_t intVal; if (tr_variantDictFindInt (d, TR_KEY_date, &intVal) && (intVal >= now - interval)) { tr_variantDictFindInt (d, TR_KEY_id, &intVal); tr_variantListAddInt (removed_out, intVal); } } } if (!tr_variantDictFindList (args_in, TR_KEY_fields, &fields)) errmsg = "no fields specified"; else for (i=0; iinfo.fileCount); if (n) { for (i=0; iinfo.fileCount) files[fileCount++] = tmp; else errmsg = "file index out of range"; } } } else /* if empty set, apply to all */ { tr_file_index_t t; for (t=0; tinfo.fileCount; ++t) files[fileCount++] = t; } if (fileCount) tr_torrentSetFilePriorities (tor, files, fileCount, priority); tr_free (files); return errmsg; } static const char* setFileDLs (tr_torrent * tor, bool do_download, tr_variant * list) { int i; int64_t tmp; int fileCount = 0; const int n = tr_variantListSize (list); const char * errmsg = NULL; tr_file_index_t * files = tr_new0 (tr_file_index_t, tor->info.fileCount); if (n) /* if argument list, process them */ { for (i=0; iinfo.fileCount) files[fileCount++] = tmp; else errmsg = "file index out of range"; } } } else /* if empty set, apply to all */ { tr_file_index_t t; for (t=0; tinfo.fileCount; ++t) files[fileCount++] = t; } if (fileCount) tr_torrentSetFileDLs (tor, files, fileCount, do_download); tr_free (files); return errmsg; } static bool findAnnounceUrl (const tr_tracker_info * t, int n, const char * url, int * pos) { int i; bool found = false; for (i=0; itrackerCount; trackers = tr_new0 (tr_tracker_info, n + tr_variantListSize (urls)); tier = copyTrackers (trackers, inf->trackers, n); /* and add the new ones */ i = 0; while ((val = tr_variantListChild (urls, i++))) { const char * announce = NULL; if ( tr_variantGetStr (val, &announce, NULL) && tr_urlIsValidTracker (announce) && !findAnnounceUrl (trackers, n, announce, NULL)) { trackers[n].tier = ++tier; /* add a new tier */ trackers[n].announce = tr_strdup (announce); ++n; changed = true; } } if (!changed) errmsg = "invalid argument"; else if (!tr_torrentSetAnnounceList (tor, trackers, n)) errmsg = "error setting announce list"; freeTrackers (trackers, n); return errmsg; } static const char* replaceTrackers (tr_torrent * tor, tr_variant * urls) { int i; tr_variant * pair[2]; tr_tracker_info * trackers; bool changed = false; const tr_info * inf = tr_torrentInfo (tor); const int n = inf->trackerCount; const char * errmsg = NULL; /* make a working copy of the existing announce list */ trackers = tr_new0 (tr_tracker_info, n); copyTrackers (trackers, inf->trackers, n); /* make the substitutions... */ i = 0; while (((pair[0] = tr_variantListChild (urls,i))) && ((pair[1] = tr_variantListChild (urls,i+1)))) { size_t len; int64_t pos; const char * newval; if (tr_variantGetInt (pair[0], &pos) && tr_variantGetStr (pair[1], &newval, &len) && tr_urlIsValidTracker (newval) && pos < n && pos >= 0) { tr_free (trackers[pos].announce); trackers[pos].announce = tr_strndup (newval, len); changed = true; } i += 2; } if (!changed) errmsg = "invalid argument"; else if (!tr_torrentSetAnnounceList (tor, trackers, n)) errmsg = "error setting announce list"; freeTrackers (trackers, n); return errmsg; } static const char* removeTrackers (tr_torrent * tor, tr_variant * ids) { int i; int n; int t = 0; int dup = -1; int * tids; tr_variant * val; tr_tracker_info * trackers; bool changed = false; const tr_info * inf = tr_torrentInfo (tor); const char * errmsg = NULL; /* make a working copy of the existing announce list */ n = inf->trackerCount; tids = tr_new0 (int, n); trackers = tr_new0 (tr_tracker_info, n); copyTrackers (trackers, inf->trackers, n); /* remove the ones specified in the urls list */ i = 0; while ((val = tr_variantListChild (ids, i++))) { int64_t pos; if (tr_variantGetInt (val, &pos) && (0 <= pos) && (pos < n)) tids[t++] = pos; } /* sort trackerIds and remove from largest to smallest so there is no need to recacluate array indicies */ qsort (tids, t, sizeof (int), compareInt); while (t--) { /* check for duplicates */ if (tids[t] == dup) continue; tr_removeElementFromArray (trackers, tids[t], sizeof (tr_tracker_info), n--); dup = tids[t]; changed = true; } if (!changed) errmsg = "invalid argument"; else if (!tr_torrentSetAnnounceList (tor, trackers, n)) errmsg = "error setting announce list"; freeTrackers (trackers, n); tr_free (tids); return errmsg; } static const char* torrentSet (tr_session * session, tr_variant * args_in, tr_variant * args_out UNUSED, struct tr_rpc_idle_data * idle_data UNUSED) { int i; int torrentCount; tr_torrent ** torrents; const char * errmsg = NULL; assert (idle_data == NULL); torrents = getTorrents (session, args_in, &torrentCount); for (i=0; iargs_out, TR_KEY_id, tr_torrentId(tor)); tr_variantDictAddStr (data->args_out, TR_KEY_path, oldpath); tr_variantDictAddStr (data->args_out, TR_KEY_name, newname); if (error == 0) result = NULL; else result = tr_strerror (error); tr_idle_function_done (data, result); } static const char* torrentRenamePath (tr_session * session, tr_variant * args_in, tr_variant * args_out UNUSED, struct tr_rpc_idle_data * idle_data) { int torrentCount; tr_torrent ** torrents; const char * oldpath = NULL; const char * newname = NULL; const char * errmsg = NULL; tr_variantDictFindStr (args_in, TR_KEY_path, &oldpath, NULL); tr_variantDictFindStr (args_in, TR_KEY_name, &newname, NULL); torrents = getTorrents (session, args_in, &torrentCount); if (torrentCount == 1) tr_torrentRenamePath (torrents[0], oldpath, newname, torrentRenamePathDone, idle_data); else errmsg = "torrent-rename-path requires 1 torrent"; /* cleanup */ tr_free (torrents); return errmsg; } /*** **** ***/ static void portTested (tr_session * session UNUSED, bool did_connect UNUSED, bool did_timeout UNUSED, long response_code, const void * response, size_t response_byte_count, void * user_data) { char result[1024]; struct tr_rpc_idle_data * data = user_data; if (response_code != 200) { tr_snprintf (result, sizeof (result), "portTested: http error %ld: %s", response_code, tr_webGetResponseStr (response_code)); } else /* success */ { const bool isOpen = response_byte_count && * (char*)response == '1'; tr_variantDictAddBool (data->args_out, TR_KEY_port_is_open, isOpen); tr_snprintf (result, sizeof (result), "success"); } tr_idle_function_done (data, result); } static const char* portTest (tr_session * session, tr_variant * args_in UNUSED, tr_variant * args_out UNUSED, struct tr_rpc_idle_data * idle_data) { const int port = tr_sessionGetPeerPort (session); char * url = tr_strdup_printf ("http://portcheck.transmissionbt.com/%d", port); tr_webRun (session, url, portTested, idle_data); tr_free (url); return NULL; } /*** **** ***/ static void gotNewBlocklist (tr_session * session, bool did_connect UNUSED, bool did_timeout UNUSED, long response_code, const void * response, size_t response_byte_count, void * user_data) { char result[1024]; struct tr_rpc_idle_data * data = user_data; *result = '\0'; if (response_code != 200) { tr_snprintf (result, sizeof (result), "gotNewBlocklist: http error %ld: %s", response_code, tr_webGetResponseStr (response_code)); } else /* successfully fetched the blocklist... */ { tr_sys_file_t fd; int err; char * filename; z_stream stream; const char * configDir = tr_sessionGetConfigDir (session); const size_t buflen = 1024 * 128; /* 128 KiB buffer */ uint8_t * buf = tr_valloc (buflen); tr_error * error = NULL; /* this is an odd Magic Number required by zlib to enable gz support. See zlib's inflateInit2 () documentation for a full description */ const int windowBits = 15 + 32; stream.zalloc = (alloc_func) Z_NULL; stream.zfree = (free_func) Z_NULL; stream.opaque = (voidpf) Z_NULL; stream.next_in = (void*) response; stream.avail_in = response_byte_count; inflateInit2 (&stream, windowBits); filename = tr_buildPath (configDir, "blocklist.tmp.XXXXXX", NULL); fd = tr_sys_file_open_temp (filename, &error); if (fd == TR_BAD_SYS_FILE) { tr_snprintf (result, sizeof (result), _("Couldn't save file \"%1$s\": %2$s"), filename, error->message); tr_error_clear (&error); } for (;;) { stream.next_out = (void*) buf; stream.avail_out = buflen; err = inflate (&stream, Z_NO_FLUSH); if (stream.avail_out < buflen) { if (!tr_sys_file_write (fd, buf, buflen - stream.avail_out, NULL, &error)) { tr_snprintf (result, sizeof (result), _("Couldn't save file \"%1$s\": %2$s"), filename, error->message); tr_error_clear (&error); break; } } if (err != Z_OK) { if ((err != Z_STREAM_END) && (err != Z_DATA_ERROR)) tr_snprintf (result, sizeof (result), _("Error uncompressing blocklist: %s (%d)"), zError (err), err); break; } } inflateEnd (&stream); if (err == Z_DATA_ERROR) /* couldn't inflate it... it's probably already uncompressed */ if (!tr_sys_file_write (fd, response, response_byte_count, NULL, &error)) { tr_snprintf (result, sizeof (result), _("Couldn't save file \"%1$s\": %2$s"), filename, error->message); tr_error_clear (&error); } tr_sys_file_close (fd, NULL); if (*result) { tr_logAddError ("%s", result); } else { /* feed it to the session and give the client a response */ const int rule_count = tr_blocklistSetContent (session, filename); tr_variantDictAddInt (data->args_out, TR_KEY_blocklist_size, rule_count); tr_snprintf (result, sizeof (result), "success"); } tr_sys_path_remove (filename, NULL); tr_free (filename); tr_free (buf); } tr_idle_function_done (data, result); } static const char* blocklistUpdate (tr_session * session, tr_variant * args_in UNUSED, tr_variant * args_out UNUSED, struct tr_rpc_idle_data * idle_data) { tr_webRun (session, session->blocklist_url, gotNewBlocklist, idle_data); return NULL; } /*** **** ***/ static void addTorrentImpl (struct tr_rpc_idle_data * data, tr_ctor * ctor) { int err; int duplicate_id; const char * result; tr_torrent * tor; tr_quark key; err = 0; duplicate_id = 0; tor = tr_torrentNew (ctor, &err, &duplicate_id); tr_ctorFree (ctor); if (!err) { key = TR_KEY_torrent_added; result = NULL; } else if (err == TR_PARSE_DUPLICATE) { tor = tr_torrentFindFromId (data->session, duplicate_id); key = TR_KEY_torrent_duplicate; result = "duplicate torrent"; } else /* err == TR_PARSE_ERR */ { key = 0; result = "invalid or corrupt torrent file"; } if (tor && key) { tr_variant fields; tr_variantInitList (&fields, 3); tr_variantListAddStr (&fields, "id"); tr_variantListAddStr (&fields, "name"); tr_variantListAddStr (&fields, "hashString"); addInfo (tor, tr_variantDictAdd (data->args_out, key), &fields); if (result == NULL) notify (data->session, TR_RPC_TORRENT_ADDED, tor); tr_variantFree (&fields); result = NULL; } tr_idle_function_done (data, result); } struct add_torrent_idle_data { struct tr_rpc_idle_data * data; tr_ctor * ctor; }; static void gotMetadataFromURL (tr_session * session UNUSED, bool did_connect UNUSED, bool did_timeout UNUSED, long response_code, const void * response, size_t response_byte_count, void * user_data) { struct add_torrent_idle_data * data = user_data; dbgmsg ("torrentAdd: HTTP response code was %ld (%s); response length was %zu bytes", response_code, tr_webGetResponseStr (response_code), response_byte_count); if (response_code==200 || response_code==221) /* http or ftp success.. */ { tr_ctorSetMetainfo (data->ctor, response, response_byte_count); addTorrentImpl (data->data, data->ctor); } else { char result[1024]; tr_snprintf (result, sizeof (result), "gotMetadataFromURL: http error %ld: %s", response_code, tr_webGetResponseStr (response_code)); tr_idle_function_done (data->data, result); } tr_free (data); } static bool isCurlURL (const char * filename) { if (filename == NULL) return false; return !strncmp (filename, "ftp://", 6) || !strncmp (filename, "http://", 7) || !strncmp (filename, "https://", 8); } static tr_file_index_t* fileListFromList (tr_variant * list, tr_file_index_t * setmeCount) { size_t i; const size_t childCount = tr_variantListSize (list); tr_file_index_t n = 0; tr_file_index_t * files = tr_new0 (tr_file_index_t, childCount); for (i=0; idata = idle_data; d->ctor = ctor; tr_webRunWithCookies (session, filename, cookies, gotMetadataFromURL, d); } else { char * fname = tr_strstrip (tr_strdup (filename)); if (fname == NULL) { size_t len; char * metainfo = tr_base64_decode_str (metainfo_base64, &len); tr_ctorSetMetainfo (ctor, (uint8_t*)metainfo, len); tr_free (metainfo); } else if (!strncmp (fname, "magnet:?", 8)) { tr_ctorSetMetainfoFromMagnetLink (ctor, fname); } else { tr_ctorSetMetainfoFromFile (ctor, fname); } addTorrentImpl (idle_data, ctor); tr_free (fname); } return NULL; } /*** **** ***/ static const char* sessionSet (tr_session * session, tr_variant * args_in, tr_variant * args_out UNUSED, struct tr_rpc_idle_data * idle_data UNUSED) { assert (idle_data == NULL); const char * download_dir = NULL; const char * incomplete_dir = NULL; if (tr_variantDictFindStr (args_in, TR_KEY_download_dir, &download_dir, NULL)) { if (tr_sys_path_is_relative (download_dir)) return "download directory path is not absolute"; } if (tr_variantDictFindStr (args_in, TR_KEY_incomplete_dir, &incomplete_dir, NULL)) { if (tr_sys_path_is_relative (incomplete_dir)) return "incomplete torrents directory path is not absolute"; } int64_t i; double d; bool boolVal; const char * str; if (tr_variantDictFindInt (args_in, TR_KEY_cache_size_mb, &i)) tr_sessionSetCacheLimit_MB (session, i); if (tr_variantDictFindInt (args_in, TR_KEY_alt_speed_up, &i)) tr_sessionSetAltSpeed_KBps (session, TR_UP, i); if (tr_variantDictFindInt (args_in, TR_KEY_alt_speed_down, &i)) tr_sessionSetAltSpeed_KBps (session, TR_DOWN, i); if (tr_variantDictFindBool (args_in, TR_KEY_alt_speed_enabled, &boolVal)) tr_sessionUseAltSpeed (session, boolVal); if (tr_variantDictFindInt (args_in, TR_KEY_alt_speed_time_begin, &i)) tr_sessionSetAltSpeedBegin (session, i); if (tr_variantDictFindInt (args_in, TR_KEY_alt_speed_time_end, &i)) tr_sessionSetAltSpeedEnd (session, i); if (tr_variantDictFindInt (args_in, TR_KEY_alt_speed_time_day, &i)) tr_sessionSetAltSpeedDay (session, i); if (tr_variantDictFindBool (args_in, TR_KEY_alt_speed_time_enabled, &boolVal)) tr_sessionUseAltSpeedTime (session, boolVal); if (tr_variantDictFindBool (args_in, TR_KEY_blocklist_enabled, &boolVal)) tr_blocklistSetEnabled (session, boolVal); if (tr_variantDictFindStr (args_in, TR_KEY_blocklist_url, &str, NULL)) tr_blocklistSetURL (session, str); if (download_dir != NULL) tr_sessionSetDownloadDir (session, download_dir); if (tr_variantDictFindInt (args_in, TR_KEY_queue_stalled_minutes, &i)) tr_sessionSetQueueStalledMinutes (session, i); if (tr_variantDictFindBool (args_in, TR_KEY_queue_stalled_enabled, &boolVal)) tr_sessionSetQueueStalledEnabled (session, boolVal); if (tr_variantDictFindInt (args_in, TR_KEY_download_queue_size, &i)) tr_sessionSetQueueSize (session, TR_DOWN, i); if (tr_variantDictFindBool (args_in, TR_KEY_download_queue_enabled, &boolVal)) tr_sessionSetQueueEnabled (session, TR_DOWN, boolVal); if (incomplete_dir != NULL) tr_sessionSetIncompleteDir (session, incomplete_dir); if (tr_variantDictFindBool (args_in, TR_KEY_incomplete_dir_enabled, &boolVal)) tr_sessionSetIncompleteDirEnabled (session, boolVal); if (tr_variantDictFindInt (args_in, TR_KEY_peer_limit_global, &i)) tr_sessionSetPeerLimit (session, i); if (tr_variantDictFindInt (args_in, TR_KEY_peer_limit_per_torrent, &i)) tr_sessionSetPeerLimitPerTorrent (session, i); if (tr_variantDictFindBool (args_in, TR_KEY_pex_enabled, &boolVal)) tr_sessionSetPexEnabled (session, boolVal); if (tr_variantDictFindBool (args_in, TR_KEY_dht_enabled, &boolVal)) tr_sessionSetDHTEnabled (session, boolVal); if (tr_variantDictFindBool (args_in, TR_KEY_utp_enabled, &boolVal)) tr_sessionSetUTPEnabled (session, boolVal); if (tr_variantDictFindBool (args_in, TR_KEY_lpd_enabled, &boolVal)) tr_sessionSetLPDEnabled (session, boolVal); if (tr_variantDictFindBool (args_in, TR_KEY_peer_port_random_on_start, &boolVal)) tr_sessionSetPeerPortRandomOnStart (session, boolVal); if (tr_variantDictFindInt (args_in, TR_KEY_peer_port, &i)) tr_sessionSetPeerPort (session, i); if (tr_variantDictFindBool (args_in, TR_KEY_port_forwarding_enabled, &boolVal)) tr_sessionSetPortForwardingEnabled (session, boolVal); if (tr_variantDictFindBool (args_in, TR_KEY_rename_partial_files, &boolVal)) tr_sessionSetIncompleteFileNamingEnabled (session, boolVal); if (tr_variantDictFindReal (args_in, TR_KEY_seedRatioLimit, &d)) tr_sessionSetRatioLimit (session, d); if (tr_variantDictFindBool (args_in, TR_KEY_seedRatioLimited, &boolVal)) tr_sessionSetRatioLimited (session, boolVal); if (tr_variantDictFindInt (args_in, TR_KEY_idle_seeding_limit, &i)) tr_sessionSetIdleLimit (session, i); if (tr_variantDictFindBool (args_in, TR_KEY_idle_seeding_limit_enabled, &boolVal)) tr_sessionSetIdleLimited (session, boolVal); if (tr_variantDictFindBool (args_in, TR_KEY_start_added_torrents, &boolVal)) tr_sessionSetPaused (session, !boolVal); if (tr_variantDictFindBool (args_in, TR_KEY_seed_queue_enabled, &boolVal)) tr_sessionSetQueueEnabled (session, TR_UP, boolVal); if (tr_variantDictFindInt (args_in, TR_KEY_seed_queue_size, &i)) tr_sessionSetQueueSize (session, TR_UP, i); if (tr_variantDictFindStr (args_in, TR_KEY_script_torrent_done_filename, &str, NULL)) tr_sessionSetTorrentDoneScript (session, str); if (tr_variantDictFindBool (args_in, TR_KEY_script_torrent_done_enabled, &boolVal)) tr_sessionSetTorrentDoneScriptEnabled (session, boolVal); if (tr_variantDictFindBool (args_in, TR_KEY_trash_original_torrent_files, &boolVal)) tr_sessionSetDeleteSource (session, boolVal); if (tr_variantDictFindInt (args_in, TR_KEY_speed_limit_down, &i)) tr_sessionSetSpeedLimit_KBps (session, TR_DOWN, i); if (tr_variantDictFindBool (args_in, TR_KEY_speed_limit_down_enabled, &boolVal)) tr_sessionLimitSpeed (session, TR_DOWN, boolVal); if (tr_variantDictFindInt (args_in, TR_KEY_speed_limit_up, &i)) tr_sessionSetSpeedLimit_KBps (session, TR_UP, i); if (tr_variantDictFindBool (args_in, TR_KEY_speed_limit_up_enabled, &boolVal)) tr_sessionLimitSpeed (session, TR_UP, boolVal); if (tr_variantDictFindStr (args_in, TR_KEY_encryption, &str, NULL)) { if (!tr_strcmp0 (str, "required")) tr_sessionSetEncryption (session, TR_ENCRYPTION_REQUIRED); else if (!tr_strcmp0 (str, "tolerated")) tr_sessionSetEncryption (session, TR_CLEAR_PREFERRED); else tr_sessionSetEncryption (session, TR_ENCRYPTION_PREFERRED); } notify (session, TR_RPC_SESSION_CHANGED, NULL); return NULL; } static const char* sessionStats (tr_session * session, tr_variant * args_in UNUSED, tr_variant * args_out, struct tr_rpc_idle_data * idle_data UNUSED) { int running = 0; int total = 0; tr_variant * d; tr_session_stats currentStats = { 0.0f, 0, 0, 0, 0, 0 }; tr_session_stats cumulativeStats = { 0.0f, 0, 0, 0, 0, 0 }; tr_torrent * tor = NULL; assert (idle_data == NULL); while ((tor = tr_torrentNext (session, tor))) { ++total; if (tor->isRunning) ++running; } tr_sessionGetStats (session, ¤tStats); tr_sessionGetCumulativeStats (session, &cumulativeStats); tr_variantDictAddInt (args_out, TR_KEY_activeTorrentCount, running); tr_variantDictAddReal (args_out, TR_KEY_downloadSpeed, tr_sessionGetPieceSpeed_Bps (session, TR_DOWN)); tr_variantDictAddInt (args_out, TR_KEY_pausedTorrentCount, total - running); tr_variantDictAddInt (args_out, TR_KEY_torrentCount, total); tr_variantDictAddReal (args_out, TR_KEY_uploadSpeed, tr_sessionGetPieceSpeed_Bps (session, TR_UP)); d = tr_variantDictAddDict (args_out, TR_KEY_cumulative_stats, 5); tr_variantDictAddInt (d, TR_KEY_downloadedBytes, cumulativeStats.downloadedBytes); tr_variantDictAddInt (d, TR_KEY_filesAdded, cumulativeStats.filesAdded); tr_variantDictAddInt (d, TR_KEY_secondsActive, cumulativeStats.secondsActive); tr_variantDictAddInt (d, TR_KEY_sessionCount, cumulativeStats.sessionCount); tr_variantDictAddInt (d, TR_KEY_uploadedBytes, cumulativeStats.uploadedBytes); d = tr_variantDictAddDict (args_out, TR_KEY_current_stats, 5); tr_variantDictAddInt (d, TR_KEY_downloadedBytes, currentStats.downloadedBytes); tr_variantDictAddInt (d, TR_KEY_filesAdded, currentStats.filesAdded); tr_variantDictAddInt (d, TR_KEY_secondsActive, currentStats.secondsActive); tr_variantDictAddInt (d, TR_KEY_sessionCount, currentStats.sessionCount); tr_variantDictAddInt (d, TR_KEY_uploadedBytes, currentStats.uploadedBytes); return NULL; } static const char* sessionGet (tr_session * s, tr_variant * args_in UNUSED, tr_variant * args_out, struct tr_rpc_idle_data * idle_data UNUSED) { const char * str; tr_variant * d = args_out; assert (idle_data == NULL); tr_variantDictAddInt (d, TR_KEY_alt_speed_up, tr_sessionGetAltSpeed_KBps (s,TR_UP)); tr_variantDictAddInt (d, TR_KEY_alt_speed_down, tr_sessionGetAltSpeed_KBps (s,TR_DOWN)); tr_variantDictAddBool (d, TR_KEY_alt_speed_enabled, tr_sessionUsesAltSpeed (s)); tr_variantDictAddInt (d, TR_KEY_alt_speed_time_begin, tr_sessionGetAltSpeedBegin (s)); tr_variantDictAddInt (d, TR_KEY_alt_speed_time_end,tr_sessionGetAltSpeedEnd (s)); tr_variantDictAddInt (d, TR_KEY_alt_speed_time_day,tr_sessionGetAltSpeedDay (s)); tr_variantDictAddBool (d, TR_KEY_alt_speed_time_enabled, tr_sessionUsesAltSpeedTime (s)); tr_variantDictAddBool (d, TR_KEY_blocklist_enabled, tr_blocklistIsEnabled (s)); tr_variantDictAddStr (d, TR_KEY_blocklist_url, tr_blocklistGetURL (s)); tr_variantDictAddInt (d, TR_KEY_cache_size_mb, tr_sessionGetCacheLimit_MB (s)); tr_variantDictAddInt (d, TR_KEY_blocklist_size, tr_blocklistGetRuleCount (s)); tr_variantDictAddStr (d, TR_KEY_config_dir, tr_sessionGetConfigDir (s)); tr_variantDictAddStr (d, TR_KEY_download_dir, tr_sessionGetDownloadDir (s)); tr_variantDictAddInt (d, TR_KEY_download_dir_free_space, tr_device_info_get_free_space (s->downloadDir)); tr_variantDictAddBool (d, TR_KEY_download_queue_enabled, tr_sessionGetQueueEnabled (s, TR_DOWN)); tr_variantDictAddInt (d, TR_KEY_download_queue_size, tr_sessionGetQueueSize (s, TR_DOWN)); tr_variantDictAddInt (d, TR_KEY_peer_limit_global, tr_sessionGetPeerLimit (s)); tr_variantDictAddInt (d, TR_KEY_peer_limit_per_torrent, tr_sessionGetPeerLimitPerTorrent (s)); tr_variantDictAddStr (d, TR_KEY_incomplete_dir, tr_sessionGetIncompleteDir (s)); tr_variantDictAddBool (d, TR_KEY_incomplete_dir_enabled, tr_sessionIsIncompleteDirEnabled (s)); tr_variantDictAddBool (d, TR_KEY_pex_enabled, tr_sessionIsPexEnabled (s)); tr_variantDictAddBool (d, TR_KEY_utp_enabled, tr_sessionIsUTPEnabled (s)); tr_variantDictAddBool (d, TR_KEY_dht_enabled, tr_sessionIsDHTEnabled (s)); tr_variantDictAddBool (d, TR_KEY_lpd_enabled, tr_sessionIsLPDEnabled (s)); tr_variantDictAddInt (d, TR_KEY_peer_port, tr_sessionGetPeerPort (s)); tr_variantDictAddBool (d, TR_KEY_peer_port_random_on_start, tr_sessionGetPeerPortRandomOnStart (s)); tr_variantDictAddBool (d, TR_KEY_port_forwarding_enabled, tr_sessionIsPortForwardingEnabled (s)); tr_variantDictAddBool (d, TR_KEY_rename_partial_files, tr_sessionIsIncompleteFileNamingEnabled (s)); tr_variantDictAddInt (d, TR_KEY_rpc_version, RPC_VERSION); tr_variantDictAddInt (d, TR_KEY_rpc_version_minimum, RPC_VERSION_MIN); tr_variantDictAddReal (d, TR_KEY_seedRatioLimit, tr_sessionGetRatioLimit (s)); tr_variantDictAddBool (d, TR_KEY_seedRatioLimited, tr_sessionIsRatioLimited (s)); tr_variantDictAddInt (d, TR_KEY_idle_seeding_limit, tr_sessionGetIdleLimit (s)); tr_variantDictAddBool (d, TR_KEY_idle_seeding_limit_enabled, tr_sessionIsIdleLimited (s)); tr_variantDictAddBool (d, TR_KEY_seed_queue_enabled, tr_sessionGetQueueEnabled (s, TR_UP)); tr_variantDictAddInt (d, TR_KEY_seed_queue_size, tr_sessionGetQueueSize (s, TR_UP)); tr_variantDictAddBool (d, TR_KEY_start_added_torrents, !tr_sessionGetPaused (s)); tr_variantDictAddBool (d, TR_KEY_trash_original_torrent_files, tr_sessionGetDeleteSource (s)); tr_variantDictAddInt (d, TR_KEY_speed_limit_up, tr_sessionGetSpeedLimit_KBps (s, TR_UP)); tr_variantDictAddBool (d, TR_KEY_speed_limit_up_enabled, tr_sessionIsSpeedLimited (s, TR_UP)); tr_variantDictAddInt (d, TR_KEY_speed_limit_down, tr_sessionGetSpeedLimit_KBps (s, TR_DOWN)); tr_variantDictAddBool (d, TR_KEY_speed_limit_down_enabled, tr_sessionIsSpeedLimited (s, TR_DOWN)); tr_variantDictAddStr (d, TR_KEY_script_torrent_done_filename, tr_sessionGetTorrentDoneScript (s)); tr_variantDictAddBool (d, TR_KEY_script_torrent_done_enabled, tr_sessionIsTorrentDoneScriptEnabled (s)); tr_variantDictAddBool (d, TR_KEY_queue_stalled_enabled, tr_sessionGetQueueStalledEnabled (s)); tr_variantDictAddInt (d, TR_KEY_queue_stalled_minutes, tr_sessionGetQueueStalledMinutes (s)); tr_formatter_get_units (tr_variantDictAddDict (d, TR_KEY_units, 0)); tr_variantDictAddStr (d, TR_KEY_version, LONG_VERSION_STRING); switch (tr_sessionGetEncryption (s)) { case TR_CLEAR_PREFERRED: str = "tolerated"; break; case TR_ENCRYPTION_REQUIRED: str = "required"; break; default: str = "preferred"; break; } tr_variantDictAddStr (d, TR_KEY_encryption, str); return NULL; } static const char* freeSpace (tr_session * session, tr_variant * args_in, tr_variant * args_out, struct tr_rpc_idle_data * idle_data UNUSED) { int tmperr; const char * path = NULL; const char * err = NULL; int64_t free_space = -1; if (!tr_variantDictFindStr (args_in, TR_KEY_path, &path, NULL)) return "directory path argument is missing"; if (tr_sys_path_is_relative (path)) return "directory path is not absolute"; /* get the free space */ tmperr = errno; errno = 0; free_space = tr_sessionGetDirFreeSpace (session, path); if (free_space < 0) err = tr_strerror (errno); errno = tmperr; /* response */ if (path != NULL) tr_variantDictAddStr (args_out, TR_KEY_path, path); tr_variantDictAddInt (args_out, TR_KEY_size_bytes, free_space); return err; } /*** **** ***/ static const char* sessionClose (tr_session * session, tr_variant * args_in UNUSED, tr_variant * args_out UNUSED, struct tr_rpc_idle_data * idle_data UNUSED) { notify (session, TR_RPC_SESSION_CLOSE, NULL); return NULL; } /*** **** ***/ typedef const char* (*handler)(tr_session*, tr_variant*, tr_variant*, struct tr_rpc_idle_data *); static struct method { const char * name; bool immediate; handler func; } methods[] = { { "port-test", false, portTest }, { "blocklist-update", false, blocklistUpdate }, { "free-space", true, freeSpace }, { "session-close", true, sessionClose }, { "session-get", true, sessionGet }, { "session-set", true, sessionSet }, { "session-stats", true, sessionStats }, { "torrent-add", false, torrentAdd }, { "torrent-get", true, torrentGet }, { "torrent-remove", true, torrentRemove }, { "torrent-rename-path", false, torrentRenamePath }, { "torrent-set", true, torrentSet }, { "torrent-set-location", true, torrentSetLocation }, { "torrent-start", true, torrentStart }, { "torrent-start-now", true, torrentStartNow }, { "torrent-stop", true, torrentStop }, { "torrent-verify", true, torrentVerify }, { "torrent-reannounce", true, torrentReannounce }, { "queue-move-top", true, queueMoveTop }, { "queue-move-up", true, queueMoveUp }, { "queue-move-down", true, queueMoveDown }, { "queue-move-bottom", true, queueMoveBottom } }; static void noop_response_callback (tr_session * session UNUSED, tr_variant * response UNUSED, void * user_data UNUSED) { } void tr_rpc_request_exec_json (tr_session * session, const tr_variant * request, tr_rpc_response_func callback, void * callback_user_data) { int i; const char * str; tr_variant * const mutable_request = (tr_variant *) request; tr_variant * args_in = tr_variantDictFind (mutable_request, TR_KEY_arguments); const char * result = NULL; if (callback == NULL) callback = noop_response_callback; /* parse the request */ if (!tr_variantDictFindStr (mutable_request, TR_KEY_method, &str, NULL)) { result = "no method name"; } else { const int n = TR_N_ELEMENTS (methods); for (i=0; isession = session; data->response = tr_new0 (tr_variant, 1); tr_variantInitDict (data->response, 3); if (tr_variantDictFindInt (mutable_request, TR_KEY_tag, &tag)) tr_variantDictAddInt (data->response, TR_KEY_tag, tag); data->args_out = tr_variantDictAddDict (data->response, TR_KEY_arguments, 0); data->callback = callback; data->callback_user_data = callback_user_data; result = (*methods[i].func)(session, args_in, data->args_out, data); /* Async operation failed prematurely? Invoke callback or else client will not get a reply */ if (result != NULL) tr_idle_function_done (data, result); } } /** * Munge the URI into a usable form. * * We have very loose typing on this to make the URIs as simple as possible: * - anything not a 'tag' or 'method' is automatically in 'arguments' * - values that are all-digits are numbers * - values that are all-digits or commas are number lists * - all other values are strings */ void tr_rpc_parse_list_str (tr_variant * setme, const char * str, size_t len) { int valueCount; int * values = tr_parseNumberRange (str, len, &valueCount); if (valueCount == 0) { tr_variantInitStr (setme, str, len); } else if (valueCount == 1) { tr_variantInitInt (setme, values[0]); } else { int i; tr_variantInitList (setme, valueCount); for (i=0; i #include #ifdef SYSTEM_MINIUPNP #include #include #else #include #include #endif #include "transmission.h" #include "log.h" #include "port-forwarding.h" #include "session.h" #include "upnp.h" #include "utils.h" static const char * getKey (void) { return _("Port Forwarding (UPnP)"); } typedef enum { TR_UPNP_IDLE, TR_UPNP_ERR, TR_UPNP_DISCOVER, TR_UPNP_MAP, TR_UPNP_UNMAP } tr_upnp_state; struct tr_upnp { bool hasDiscovered; struct UPNPUrls urls; struct IGDdatas data; int port; char lanaddr[16]; unsigned int isMapped; tr_upnp_state state; }; /** *** **/ tr_upnp* tr_upnpInit (void) { tr_upnp * ret = tr_new0 (tr_upnp, 1); ret->state = TR_UPNP_DISCOVER; ret->port = -1; return ret; } void tr_upnpClose (tr_upnp * handle) { assert (!handle->isMapped); assert ((handle->state == TR_UPNP_IDLE) || (handle->state == TR_UPNP_ERR) || (handle->state == TR_UPNP_DISCOVER)); if (handle->hasDiscovered) FreeUPNPUrls (&handle->urls); tr_free (handle); } /** *** Wrappers for miniupnpc functions **/ static struct UPNPDev * tr_upnpDiscover (int msec) { struct UPNPDev * ret; bool have_err; #if (MINIUPNPC_API_VERSION >= 8) /* adds ipv6 and error args */ int err = UPNPDISCOVER_SUCCESS; #if (MINIUPNPC_API_VERSION >= 14) /* adds ttl */ ret = upnpDiscover (msec, NULL, NULL, 0, 0, 2, &err); #else ret = upnpDiscover (msec, NULL, NULL, 0, 0, &err); #endif have_err = err != UPNPDISCOVER_SUCCESS; #else ret = upnpDiscover (msec, NULL, NULL, 0); have_err = ret == NULL; #endif if (have_err) tr_logAddNamedDbg (getKey (), "upnpDiscover failed (errno %d - %s)", errno, tr_strerror (errno)); return ret; } static int tr_upnpGetSpecificPortMappingEntry (tr_upnp * handle, const char * proto) { int err; char intClient[16]; char intPort[16]; char portStr[16]; *intClient = '\0'; *intPort = '\0'; tr_snprintf (portStr, sizeof(portStr), "%d", (int)handle->port); #if (MINIUPNPC_API_VERSION >= 10) /* adds remoteHost arg */ err = UPNP_GetSpecificPortMappingEntry (handle->urls.controlURL, handle->data.first.servicetype, portStr, proto, NULL /*remoteHost*/, intClient, intPort, NULL /*desc*/, NULL /*enabled*/, NULL /*duration*/); #elif (MINIUPNPC_API_VERSION >= 8) /* adds desc, enabled and leaseDuration args */ err = UPNP_GetSpecificPortMappingEntry (handle->urls.controlURL, handle->data.first.servicetype, portStr, proto, intClient, intPort, NULL /*desc*/, NULL /*enabled*/, NULL /*duration*/); #else err = UPNP_GetSpecificPortMappingEntry (handle->urls.controlURL, handle->data.first.servicetype, portStr, proto, intClient, intPort); #endif return err; } static int tr_upnpAddPortMapping (const tr_upnp * handle, const char * proto, tr_port port, const char * desc) { int err; const int old_errno = errno; char portStr[16]; errno = 0; tr_snprintf (portStr, sizeof (portStr), "%d", (int)port); #if (MINIUPNPC_API_VERSION >= 8) err = UPNP_AddPortMapping (handle->urls.controlURL, handle->data.first.servicetype, portStr, portStr, handle->lanaddr, desc, proto, NULL, NULL); #else err = UPNP_AddPortMapping (handle->urls.controlURL, handle->data.first.servicetype, portStr, portStr, handle->lanaddr, desc, proto, NULL); #endif if (err) tr_logAddNamedDbg (getKey (), "%s Port forwarding failed with error %d (errno %d - %s)", proto, err, errno, tr_strerror (errno)); errno = old_errno; return err; } static void tr_upnpDeletePortMapping (const tr_upnp * handle, const char * proto, tr_port port) { char portStr[16]; tr_snprintf (portStr, sizeof (portStr), "%d", (int)port); UPNP_DeletePortMapping (handle->urls.controlURL, handle->data.first.servicetype, portStr, proto, NULL); } /** *** **/ enum { UPNP_IGD_NONE = 0, UPNP_IGD_VALID_CONNECTED = 1, UPNP_IGD_VALID_NOT_CONNECTED = 2, UPNP_IGD_INVALID = 3 }; int tr_upnpPulse (tr_upnp * handle, int port, int isEnabled, int doPortCheck) { int ret; if (isEnabled && (handle->state == TR_UPNP_DISCOVER)) { struct UPNPDev * devlist; devlist = tr_upnpDiscover (2000); errno = 0; if (UPNP_GetValidIGD (devlist, &handle->urls, &handle->data, handle->lanaddr, sizeof (handle->lanaddr)) == UPNP_IGD_VALID_CONNECTED) { tr_logAddNamedInfo (getKey (), _( "Found Internet Gateway Device \"%s\""), handle->urls.controlURL); tr_logAddNamedInfo (getKey (), _( "Local Address is \"%s\""), handle->lanaddr); handle->state = TR_UPNP_IDLE; handle->hasDiscovered = true; } else { handle->state = TR_UPNP_ERR; tr_logAddNamedDbg ( getKey (), "UPNP_GetValidIGD failed (errno %d - %s)", errno, tr_strerror (errno)); tr_logAddNamedDbg ( getKey (), "If your router supports UPnP, please make sure UPnP is enabled!"); } freeUPNPDevlist (devlist); } if (handle->state == TR_UPNP_IDLE) { if (handle->isMapped && (!isEnabled || (handle->port != port))) handle->state = TR_UPNP_UNMAP; } if (isEnabled && handle->isMapped && doPortCheck) { if ((tr_upnpGetSpecificPortMappingEntry (handle, "TCP") != UPNPCOMMAND_SUCCESS) || (tr_upnpGetSpecificPortMappingEntry (handle, "UDP") != UPNPCOMMAND_SUCCESS)) { tr_logAddNamedInfo (getKey (), _("Port %d isn't forwarded"), handle->port); handle->isMapped = false; } } if (handle->state == TR_UPNP_UNMAP) { tr_upnpDeletePortMapping (handle, "TCP", handle->port); tr_upnpDeletePortMapping (handle, "UDP", handle->port); tr_logAddNamedInfo (getKey (), _("Stopping port forwarding through \"%s\", service \"%s\""), handle->urls.controlURL, handle->data.first.servicetype); handle->isMapped = 0; handle->state = TR_UPNP_IDLE; handle->port = -1; } if (handle->state == TR_UPNP_IDLE) { if (isEnabled && !handle->isMapped) handle->state = TR_UPNP_MAP; } if (handle->state == TR_UPNP_MAP) { int err_tcp = -1; int err_udp = -1; errno = 0; if (!handle->urls.controlURL) handle->isMapped = 0; else { char desc[64]; tr_snprintf (desc, sizeof (desc), "%s at %d", TR_NAME, port); err_tcp = tr_upnpAddPortMapping (handle, "TCP", port, desc); err_udp = tr_upnpAddPortMapping (handle, "UDP", port, desc); handle->isMapped = !err_tcp | !err_udp; } tr_logAddNamedInfo (getKey (), _("Port forwarding through \"%s\", service \"%s\". (local address: %s:%d)"), handle->urls.controlURL, handle->data.first.servicetype, handle->lanaddr, port); if (handle->isMapped) { tr_logAddNamedInfo (getKey (), "%s", _("Port forwarding successful!")); handle->port = port; handle->state = TR_UPNP_IDLE; } else { tr_logAddNamedDbg (getKey (), "If your router supports UPnP, please make sure UPnP is enabled!"); handle->port = -1; handle->state = TR_UPNP_ERR; } } switch (handle->state) { case TR_UPNP_DISCOVER: ret = TR_PORT_UNMAPPED; break; case TR_UPNP_MAP: ret = TR_PORT_MAPPING; break; case TR_UPNP_UNMAP: ret = TR_PORT_UNMAPPING; break; case TR_UPNP_IDLE: ret = handle->isMapped ? TR_PORT_MAPPED : TR_PORT_UNMAPPED; break; default: ret = TR_PORT_ERROR; break; } return ret; } transmission-2.92/libtransmission/PaxHeaders.4960/fdlimit.c0000644000000000000000000000013012612560132020666 xustar0029 mtime=1445650522.63823497 29 atime=1445650522.63823497 30 ctime=1457295919.998807884 transmission-2.92/libtransmission/fdlimit.c0000644000175000017500000003441712612560132022326 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2005-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: fdlimit.c 14548 2015-07-01 00:54:41Z mikedld $ */ #include #include #include #include #ifndef _WIN32 #include /* getrlimit */ #include /* getrlimit */ #endif #include "transmission.h" #include "error.h" #include "error-types.h" #include "fdlimit.h" #include "file.h" #include "log.h" #include "session.h" #include "torrent.h" /* tr_isTorrent () */ #define dbgmsg(...) \ do \ { \ if (tr_logGetDeepEnabled ()) \ tr_logAddDeep (__FILE__, __LINE__, NULL, __VA_ARGS__); \ } \ while (0) /*** **** **** Local Files **** ***/ static bool preallocate_file_sparse (tr_sys_file_t fd, uint64_t length, tr_error ** error) { tr_error * my_error = NULL; if (length == 0) return true; if (tr_sys_file_preallocate (fd, length, TR_SYS_FILE_PREALLOC_SPARSE, &my_error)) return true; dbgmsg ("Preallocating (sparse, normal) failed (%d): %s", my_error->code, my_error->message); if (!TR_ERROR_IS_ENOSPC (my_error->code)) { const char zero = '\0'; tr_error_clear (&my_error); /* fallback: the old-style seek-and-write */ if (tr_sys_file_write_at (fd, &zero, 1, length - 1, NULL, &my_error) && tr_sys_file_truncate (fd, length, &my_error)) return true; dbgmsg ("Preallocating (sparse, fallback) failed (%d): %s", my_error->code, my_error->message); } tr_error_propagate (error, &my_error); return false; } static bool preallocate_file_full (tr_sys_file_t fd, uint64_t length, tr_error ** error) { tr_error * my_error = NULL; if (length == 0) return true; if (tr_sys_file_preallocate (fd, length, 0, &my_error)) return true; dbgmsg ("Preallocating (full, normal) failed (%d): %s", my_error->code, my_error->message); if (!TR_ERROR_IS_ENOSPC (my_error->code)) { uint8_t buf[4096]; bool success = true; memset (buf, 0, sizeof (buf)); tr_error_clear (&my_error); /* fallback: the old-fashioned way */ while (success && length > 0) { const uint64_t thisPass = MIN (length, sizeof (buf)); uint64_t bytes_written; success = tr_sys_file_write (fd, buf, thisPass, &bytes_written, &my_error); length -= bytes_written; } if (success) return true; dbgmsg ("Preallocating (full, fallback) failed (%d): %s", my_error->code, my_error->message); } tr_error_propagate (error, &my_error); return false; } /***** ****** ****** ****** *****/ struct tr_cached_file { bool is_writable; tr_sys_file_t fd; int torrent_id; tr_file_index_t file_index; time_t used_at; }; static inline bool cached_file_is_open (const struct tr_cached_file * o) { assert (o != NULL); return o->fd != TR_BAD_SYS_FILE; } static void cached_file_close (struct tr_cached_file * o) { assert (cached_file_is_open (o)); tr_sys_file_close (o->fd, NULL); o->fd = TR_BAD_SYS_FILE; } /** * returns 0 on success, or an errno value on failure. * errno values include ENOENT if the parent folder doesn't exist, * plus the errno values set by tr_sys_dir_create () and tr_sys_file_open (). */ static int cached_file_open (struct tr_cached_file * o, const char * filename, bool writable, tr_preallocation_mode allocation, uint64_t file_size) { int flags; tr_sys_path_info info; bool already_existed; bool resize_needed; tr_sys_file_t fd = TR_BAD_SYS_FILE; tr_error * error = NULL; /* create subfolders, if any */ if (writable) { char * dir = tr_sys_path_dirname (filename, NULL); if (!tr_sys_dir_create (dir, TR_SYS_DIR_CREATE_PARENTS, 0777, &error)) { tr_logAddError (_("Couldn't create \"%1$s\": %2$s"), dir, error->message); tr_free (dir); goto fail; } tr_free (dir); } already_existed = tr_sys_path_get_info (filename, 0, &info, NULL) && info.type == TR_SYS_PATH_IS_FILE; /* we can't resize the file w/o write permissions */ resize_needed = already_existed && (file_size < info.size); writable |= resize_needed; /* open the file */ flags = writable ? (TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE) : 0; flags |= TR_SYS_FILE_READ | TR_SYS_FILE_SEQUENTIAL; fd = tr_sys_file_open (filename, flags, 0666, &error); if (fd == TR_BAD_SYS_FILE) { tr_logAddError (_("Couldn't open \"%1$s\": %2$s"), filename, error->message); goto fail; } if (writable && !already_existed && allocation != TR_PREALLOCATE_NONE) { bool success = false; const char * type = NULL; if (allocation == TR_PREALLOCATE_FULL) { success = preallocate_file_full (fd, file_size, &error); type = _("full"); } else if (allocation == TR_PREALLOCATE_SPARSE) { success = preallocate_file_sparse (fd, file_size, &error); type = _("sparse"); } assert (type != NULL); if (!success) { tr_logAddError (_("Couldn't preallocate file \"%1$s\" (%2$s, size: %3$"PRIu64"): %4$s"), filename, type, file_size, error->message); goto fail; } tr_logAddDebug (_("Preallocated file \"%1$s\" (%2$s, size: %3$"PRIu64")"), filename, type, file_size); } /* If the file already exists and it's too large, truncate it. * This is a fringe case that happens if a torrent's been updated * and one of the updated torrent's files is smaller. * http://trac.transmissionbt.com/ticket/2228 * https://bugs.launchpad.net/ubuntu/+source/transmission/+bug/318249 */ if (resize_needed && !tr_sys_file_truncate (fd, file_size, &error)) { tr_logAddError (_("Couldn't truncate \"%1$s\": %2$s"), filename, error->message); goto fail; } o->fd = fd; return 0; fail: { const int err = error->code; tr_error_free (error); if (fd != TR_BAD_SYS_FILE) tr_sys_file_close (fd, NULL); return err; } } /*** **** ***/ struct tr_fileset { struct tr_cached_file * begin; const struct tr_cached_file * end; }; static void fileset_construct (struct tr_fileset * set, int n) { struct tr_cached_file * o; const struct tr_cached_file TR_CACHED_FILE_INIT = { false, TR_BAD_SYS_FILE, 0, 0, 0 }; set->begin = tr_new (struct tr_cached_file, n); set->end = set->begin + n; for (o=set->begin; o!=set->end; ++o) *o = TR_CACHED_FILE_INIT; } static void fileset_close_all (struct tr_fileset * set) { struct tr_cached_file * o; if (set != NULL) for (o=set->begin; o!=set->end; ++o) if (cached_file_is_open (o)) cached_file_close (o); } static void fileset_destruct (struct tr_fileset * set) { fileset_close_all (set); tr_free (set->begin); set->end = set->begin = NULL; } static void fileset_close_torrent (struct tr_fileset * set, int torrent_id) { struct tr_cached_file * o; if (set != NULL) for (o=set->begin; o!=set->end; ++o) if ((o->torrent_id == torrent_id) && cached_file_is_open (o)) cached_file_close (o); } static struct tr_cached_file * fileset_lookup (struct tr_fileset * set, int torrent_id, tr_file_index_t i) { struct tr_cached_file * o; if (set != NULL) for (o=set->begin; o!=set->end; ++o) if ((torrent_id == o->torrent_id) && (i == o->file_index) && cached_file_is_open (o)) return o; return NULL; } static struct tr_cached_file * fileset_get_empty_slot (struct tr_fileset * set) { struct tr_cached_file * cull = NULL; if (set->begin != NULL) { struct tr_cached_file * o; /* try to find an unused slot */ for (o=set->begin; o!=set->end; ++o) if (!cached_file_is_open (o)) return o; /* all slots are full... recycle the least recently used */ for (cull=NULL, o=set->begin; o!=set->end; ++o) if (!cull || o->used_at < cull->used_at) cull = o; cached_file_close (cull); } return cull; } /*** **** **** Startup / Shutdown **** ***/ struct tr_fdInfo { int peerCount; struct tr_fileset fileset; }; static void ensureSessionFdInfoExists (tr_session * session) { assert (tr_isSession (session)); if (session->fdInfo == NULL) { struct tr_fdInfo * i; const int FILE_CACHE_SIZE = 32; /* Create the local file cache */ i = tr_new0 (struct tr_fdInfo, 1); fileset_construct (&i->fileset, FILE_CACHE_SIZE); session->fdInfo = i; #ifndef _WIN32 /* set the open-file limit to the largest safe size wrt FD_SETSIZE */ struct rlimit limit; if (!getrlimit (RLIMIT_NOFILE, &limit)) { const int old_limit = (int) limit.rlim_cur; const int new_limit = MIN (limit.rlim_max, FD_SETSIZE); if (new_limit != old_limit) { limit.rlim_cur = new_limit; setrlimit (RLIMIT_NOFILE, &limit); getrlimit (RLIMIT_NOFILE, &limit); tr_logAddInfo ("Changed open file limit from %d to %d", old_limit, (int)limit.rlim_cur); } } #endif } } void tr_fdClose (tr_session * session) { if (session && session->fdInfo) { struct tr_fdInfo * i = session->fdInfo; fileset_destruct (&i->fileset); tr_free (i); session->fdInfo = NULL; } } /*** **** ***/ static struct tr_fileset* get_fileset (tr_session * session) { if (!session) return NULL; ensureSessionFdInfoExists (session); return &session->fdInfo->fileset; } void tr_fdFileClose (tr_session * s, const tr_torrent * tor, tr_file_index_t i) { struct tr_cached_file * o; if ((o = fileset_lookup (get_fileset (s), tr_torrentId (tor), i))) { /* flush writable files so that their mtimes will be * up-to-date when this function returns to the caller... */ if (o->is_writable) tr_sys_file_flush (o->fd, NULL); cached_file_close (o); } } tr_sys_file_t tr_fdFileGetCached (tr_session * s, int torrent_id, tr_file_index_t i, bool writable) { struct tr_cached_file * o = fileset_lookup (get_fileset (s), torrent_id, i); if (!o || (writable && !o->is_writable)) return TR_BAD_SYS_FILE; o->used_at = tr_time (); return o->fd; } bool tr_fdFileGetCachedMTime (tr_session * s, int torrent_id, tr_file_index_t i, time_t * mtime) { bool success; tr_sys_path_info info; struct tr_cached_file * o = fileset_lookup (get_fileset (s), torrent_id, i); if ((success = (o != NULL) && tr_sys_file_get_info (o->fd, &info, NULL))) *mtime = info.last_modified_at; return success; } void tr_fdTorrentClose (tr_session * session, int torrent_id) { assert (tr_sessionIsLocked (session)); fileset_close_torrent (get_fileset (session), torrent_id); } /* returns an fd on success, or a TR_BAD_SYS_FILE on failure and sets errno */ tr_sys_file_t tr_fdFileCheckout (tr_session * session, int torrent_id, tr_file_index_t i, const char * filename, bool writable, tr_preallocation_mode allocation, uint64_t file_size) { struct tr_fileset * set = get_fileset (session); struct tr_cached_file * o = fileset_lookup (set, torrent_id, i); if (o && writable && !o->is_writable) cached_file_close (o); /* close it so we can reopen in rw mode */ else if (!o) o = fileset_get_empty_slot (set); if (!cached_file_is_open (o)) { const int err = cached_file_open (o, filename, writable, allocation, file_size); if (err) { errno = err; return TR_BAD_SYS_FILE; } dbgmsg ("opened '%s' writable %c", filename, writable?'y':'n'); o->is_writable = writable; } dbgmsg ("checking out '%s'", filename); o->torrent_id = torrent_id; o->file_index = i; o->used_at = tr_time (); return o->fd; } /*** **** **** Sockets **** ***/ tr_socket_t tr_fdSocketCreate (tr_session * session, int domain, int type) { tr_socket_t s = TR_BAD_SOCKET; struct tr_fdInfo * gFd; assert (tr_isSession (session)); ensureSessionFdInfoExists (session); gFd = session->fdInfo; if (gFd->peerCount < session->peerLimit) if ((s = socket (domain, type, 0)) == TR_BAD_SOCKET) if (sockerrno != EAFNOSUPPORT) { char err_buf[512]; tr_logAddError (_("Couldn't create socket: %s"), tr_net_strerror (err_buf, sizeof (err_buf), sockerrno)); } if (s != TR_BAD_SOCKET) ++gFd->peerCount; assert (gFd->peerCount >= 0); if (s != TR_BAD_SOCKET) { static bool buf_logged = false; if (!buf_logged) { int i; socklen_t size = sizeof (int); buf_logged = true; getsockopt (s, SOL_SOCKET, SO_SNDBUF, (void *) &i, &size); tr_logAddDebug ("SO_SNDBUF size is %d", i); getsockopt (s, SOL_SOCKET, SO_RCVBUF, (void *) &i, &size); tr_logAddDebug ("SO_RCVBUF size is %d", i); } } return s; } tr_socket_t tr_fdSocketAccept (tr_session * s, tr_socket_t sockfd, tr_address * addr, tr_port * port) { tr_socket_t fd; socklen_t len; struct tr_fdInfo * gFd; struct sockaddr_storage sock; assert (tr_isSession (s)); assert (addr); assert (port); ensureSessionFdInfoExists (s); gFd = s->fdInfo; len = sizeof (struct sockaddr_storage); fd = accept (sockfd, (struct sockaddr *) &sock, &len); if (fd != TR_BAD_SOCKET) { if ((gFd->peerCount < s->peerLimit) && tr_address_from_sockaddr_storage (addr, port, &sock)) { ++gFd->peerCount; } else { tr_netCloseSocket (fd); fd = TR_BAD_SOCKET; } } return fd; } void tr_fdSocketClose (tr_session * session, tr_socket_t fd) { assert (tr_isSession (session)); if (session->fdInfo != NULL) { struct tr_fdInfo * gFd = session->fdInfo; if (fd != TR_BAD_SOCKET) { tr_netCloseSocket (fd); --gFd->peerCount; } assert (gFd->peerCount >= 0); } } transmission-2.92/libtransmission/PaxHeaders.4960/tr-udp.c0000644000000000000000000000013212544707177020473 xustar0030 mtime=1435733631.774962728 30 atime=1435733631.774962728 30 ctime=1457295920.176810911 transmission-2.92/libtransmission/tr-udp.c0000644000175000017500000002426612544707177022132 0ustar00mikedldmikedld00000000000000/* Copyright (c) 2010 by Juliusz Chroboczek 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. */ #include #include /* memcmp (), memcpy (), memset () */ #include /* malloc (), free () */ #ifdef _WIN32 #include /* dup2 () */ #else #include /* dup2 () */ #endif #include #include #include "transmission.h" #include "log.h" #include "net.h" #include "session.h" #include "tr-dht.h" #include "tr-utp.h" #include "tr-udp.h" /* Since we use a single UDP socket in order to implement multiple uTP sockets, try to set up huge buffers. */ #define RECV_BUFFER_SIZE (4 * 1024 * 1024) #define SEND_BUFFER_SIZE (1 * 1024 * 1024) #define SMALL_BUFFER_SIZE (32 * 1024) static void set_socket_buffers (tr_socket_t fd, int large) { int size, rbuf, sbuf, rc; socklen_t rbuf_len = sizeof (rbuf), sbuf_len = sizeof (sbuf); char err_buf[512]; size = large ? RECV_BUFFER_SIZE : SMALL_BUFFER_SIZE; rc = setsockopt (fd, SOL_SOCKET, SO_RCVBUF, (const void *) &size, sizeof (size)); if (rc < 0) tr_logAddNamedError ("UDP", "Failed to set receive buffer: %s", tr_net_strerror (err_buf, sizeof (err_buf), sockerrno)); size = large ? SEND_BUFFER_SIZE : SMALL_BUFFER_SIZE; rc = setsockopt (fd, SOL_SOCKET, SO_SNDBUF, (const void *) &size, sizeof (size)); if (rc < 0) tr_logAddNamedError ("UDP", "Failed to set send buffer: %s", tr_net_strerror (err_buf, sizeof (err_buf), sockerrno)); if (large) { rc = getsockopt (fd, SOL_SOCKET, SO_RCVBUF, (void *) &rbuf, &rbuf_len); if (rc < 0) rbuf = 0; rc = getsockopt (fd, SOL_SOCKET, SO_SNDBUF, (void *) &sbuf, &sbuf_len); if (rc < 0) sbuf = 0; if (rbuf < RECV_BUFFER_SIZE) { tr_logAddNamedError ("UDP", "Failed to set receive buffer: requested %d, got %d", RECV_BUFFER_SIZE, rbuf); #ifdef __linux__ tr_logAddNamedInfo ("UDP", "Please add the line " "\"net.core.rmem_max = %d\" to /etc/sysctl.conf", RECV_BUFFER_SIZE); #endif } if (sbuf < SEND_BUFFER_SIZE) { tr_logAddNamedError ("UDP", "Failed to set send buffer: requested %d, got %d", SEND_BUFFER_SIZE, sbuf); #ifdef __linux__ tr_logAddNamedInfo ("UDP", "Please add the line " "\"net.core.wmem_max = %d\" to /etc/sysctl.conf", SEND_BUFFER_SIZE); #endif } } } void tr_udpSetSocketBuffers (tr_session *session) { bool utp = tr_sessionIsUTPEnabled (session); if (session->udp_socket != TR_BAD_SOCKET) set_socket_buffers (session->udp_socket, utp); if (session->udp6_socket != TR_BAD_SOCKET) set_socket_buffers (session->udp6_socket, utp); } /* BEP-32 has a rather nice explanation of why we need to bind to one IPv6 address, if I may say so myself. */ static void rebind_ipv6 (tr_session *ss, bool force) { bool is_default; const struct tr_address * public_addr; struct sockaddr_in6 sin6; const unsigned char *ipv6 = tr_globalIPv6 (); tr_socket_t s = TR_BAD_SOCKET; int rc; int one = 1; /* We currently have no way to enable or disable IPv6 after initialisation. No way to fix that without some surgery to the DHT code itself. */ if (ipv6 == NULL || (!force && ss->udp6_socket == TR_BAD_SOCKET)) { if (ss->udp6_bound) { free (ss->udp6_bound); ss->udp6_bound = NULL; } return; } if (ss->udp6_bound != NULL && memcmp (ipv6, ss->udp6_bound, 16) == 0) return; s = socket (PF_INET6, SOCK_DGRAM, 0); if (s == TR_BAD_SOCKET) goto fail; #ifdef IPV6_V6ONLY /* Since we always open an IPv4 socket on the same port, this shouldn't matter. But I'm superstitious. */ setsockopt (s, IPPROTO_IPV6, IPV6_V6ONLY, (const void *) &one, sizeof (one)); #endif memset (&sin6, 0, sizeof (sin6)); sin6.sin6_family = AF_INET6; if (ipv6) memcpy (&sin6.sin6_addr, ipv6, 16); sin6.sin6_port = htons (ss->udp_port); public_addr = tr_sessionGetPublicAddress (ss, TR_AF_INET6, &is_default); if (public_addr && !is_default) sin6.sin6_addr = public_addr->addr.addr6; rc = bind (s, (struct sockaddr*)&sin6, sizeof (sin6)); if (rc < 0) goto fail; if (ss->udp6_socket == TR_BAD_SOCKET) { ss->udp6_socket = s; } else { /* FIXME: dup2 doesn't work for sockets on Windows */ rc = dup2 (s, ss->udp6_socket); if (rc < 0) goto fail; tr_netCloseSocket (s); } if (ss->udp6_bound == NULL) ss->udp6_bound = malloc (16); if (ss->udp6_bound) memcpy (ss->udp6_bound, ipv6, 16); return; fail: /* Something went wrong. It's difficult to recover, so let's simply set things up so that we try again next time. */ tr_logAddNamedError ("UDP", "Couldn't rebind IPv6 socket"); if (s != TR_BAD_SOCKET) tr_netCloseSocket (s); if (ss->udp6_bound) { free (ss->udp6_bound); ss->udp6_bound = NULL; } } static void event_callback (evutil_socket_t s, short type UNUSED, void *sv) { int rc; socklen_t fromlen; unsigned char buf[4096]; struct sockaddr_storage from; tr_session *ss = sv; assert (tr_isSession (sv)); assert (type == EV_READ); fromlen = sizeof (from); rc = recvfrom (s, (void *) buf, 4096 - 1, 0, (struct sockaddr*)&from, &fromlen); /* Since most packets we receive here are µTP, make quick inline checks for the other protocols. The logic is as follows: - all DHT packets start with 'd'; - all UDP tracker packets start with a 32-bit (!) "action", which is between 0 and 3; - the above cannot be µTP packets, since these start with a 4-bit version number (1). */ if (rc > 0) { if (buf[0] == 'd') { if (tr_sessionAllowsDHT (ss)) { buf[rc] = '\0'; /* required by the DHT code */ tr_dhtCallback (buf, rc, (struct sockaddr*)&from, fromlen, sv); } } else if (rc >= 8 && buf[0] == 0 && buf[1] == 0 && buf[2] == 0 && buf[3] <= 3) { rc = tau_handle_message (ss, buf, rc); if (!rc) tr_logAddNamedDbg ("UDP", "Couldn't parse UDP tracker packet."); } else { if (tr_sessionIsUTPEnabled (ss)) { rc = tr_utpPacket (buf, rc, (struct sockaddr*)&from, fromlen, ss); if (!rc) tr_logAddNamedDbg ("UDP", "Unexpected UDP packet"); } } } } void tr_udpInit (tr_session *ss) { bool is_default; const struct tr_address * public_addr; struct sockaddr_in sin; int rc; assert (ss->udp_socket == TR_BAD_SOCKET); assert (ss->udp6_socket == TR_BAD_SOCKET); ss->udp_port = tr_sessionGetPeerPort (ss); if (ss->udp_port <= 0) return; ss->udp_socket = socket (PF_INET, SOCK_DGRAM, 0); if (ss->udp_socket == TR_BAD_SOCKET) { tr_logAddNamedError ("UDP", "Couldn't create IPv4 socket"); goto ipv6; } memset (&sin, 0, sizeof (sin)); sin.sin_family = AF_INET; public_addr = tr_sessionGetPublicAddress (ss, TR_AF_INET, &is_default); if (public_addr && !is_default) memcpy (&sin.sin_addr, &public_addr->addr.addr4, sizeof (struct in_addr)); sin.sin_port = htons (ss->udp_port); rc = bind (ss->udp_socket, (struct sockaddr*)&sin, sizeof (sin)); if (rc < 0) { tr_logAddNamedError ("UDP", "Couldn't bind IPv4 socket"); tr_netCloseSocket (ss->udp_socket); ss->udp_socket = TR_BAD_SOCKET; goto ipv6; } ss->udp_event = event_new (ss->event_base, ss->udp_socket, EV_READ | EV_PERSIST, event_callback, ss); if (ss->udp_event == NULL) tr_logAddNamedError ("UDP", "Couldn't allocate IPv4 event"); ipv6: if (tr_globalIPv6 ()) rebind_ipv6 (ss, true); if (ss->udp6_socket != TR_BAD_SOCKET) { ss->udp6_event = event_new (ss->event_base, ss->udp6_socket, EV_READ | EV_PERSIST, event_callback, ss); if (ss->udp6_event == NULL) tr_logAddNamedError ("UDP", "Couldn't allocate IPv6 event"); } tr_udpSetSocketBuffers (ss); if (ss->isDHTEnabled) tr_dhtInit (ss); if (ss->udp_event) event_add (ss->udp_event, NULL); if (ss->udp6_event) event_add (ss->udp6_event, NULL); } void tr_udpUninit (tr_session *ss) { tr_dhtUninit (ss); if (ss->udp_socket != TR_BAD_SOCKET) { tr_netCloseSocket (ss->udp_socket); ss->udp_socket = TR_BAD_SOCKET; } if (ss->udp_event) { event_free (ss->udp_event); ss->udp_event = NULL; } if (ss->udp6_socket != TR_BAD_SOCKET) { tr_netCloseSocket (ss->udp6_socket); ss->udp6_socket = TR_BAD_SOCKET; } if (ss->udp6_event) { event_free (ss->udp6_event); ss->udp6_event = NULL; } if (ss->udp6_bound) { free (ss->udp6_bound); ss->udp6_bound = NULL; } } transmission-2.92/libtransmission/PaxHeaders.4960/cache.h0000644000000000000000000000013112442116602020307 xustar0030 mtime=1418239362.955222992 30 atime=1418239362.955222992 29 ctime=1457295919.58280081 transmission-2.92/libtransmission/cache.h0000644000175000017500000000341512442116602021740 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: cache.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_CACHE_H #define TR_CACHE_H struct evbuffer; typedef struct tr_cache tr_cache; /*** **** ***/ tr_cache * tr_cacheNew (int64_t max_bytes); void tr_cacheFree (tr_cache *); /*** **** ***/ int tr_cacheSetLimit (tr_cache * cache, int64_t max_bytes); int64_t tr_cacheGetLimit (const tr_cache *); int tr_cacheWriteBlock (tr_cache * cache, tr_torrent * torrent, tr_piece_index_t piece, uint32_t offset, uint32_t len, struct evbuffer * writeme); int tr_cacheReadBlock (tr_cache * cache, tr_torrent * torrent, tr_piece_index_t piece, uint32_t offset, uint32_t len, uint8_t * setme); int tr_cachePrefetchBlock (tr_cache * cache, tr_torrent * torrent, tr_piece_index_t piece, uint32_t offset, uint32_t len); /*** **** ***/ int tr_cacheFlushDone (tr_cache * cache); int tr_cacheFlushTorrent (tr_cache * cache, tr_torrent * torrent); int tr_cacheFlushFile (tr_cache * cache, tr_torrent * torrent, tr_file_index_t file); #endif transmission-2.92/libtransmission/PaxHeaders.4960/metainfo.h0000644000000000000000000000013212640354044021053 xustar0030 mtime=1451350052.447150336 30 atime=1451350052.447150336 30 ctime=1457295919.703802867 transmission-2.92/libtransmission/metainfo.h0000644000175000017500000000154712640354044022507 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2005-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: metainfo.h 14634 2015-12-25 11:34:35Z mikedld $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_METAINFO_H #define TR_METAINFO_H 1 #include "transmission.h" #include "variant.h" bool tr_metainfoParse (const tr_session * session, const tr_variant * variant, tr_info * setmeInfo, bool * setmeHasInfoDict, size_t * setmeInfoDictLength); void tr_metainfoRemoveSaved (const tr_session * session, const tr_info * info); char* tr_metainfoGetBasename (const tr_info *); #endif transmission-2.92/libtransmission/PaxHeaders.4960/json-test.c0000644000000000000000000000013212640354044021172 xustar0030 mtime=1451350052.451150406 30 atime=1451350052.451150406 30 ctime=1457295920.267812458 transmission-2.92/libtransmission/json-test.c0000644000175000017500000001717112640354044022626 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: json-test.c 14640 2015-12-28 23:53:55Z mikedld $ */ #include /* strlen () */ #include /* setlocale() */ #define __LIBTRANSMISSION_VARIANT_MODULE__ #include "transmission.h" #include "utils.h" /* tr_free */ #include "variant.h" #include "variant-common.h" #include "libtransmission-test.h" static int test_elements (void) { const char * in; tr_variant top; const char * str; bool f; double d; int64_t i; int err = 0; tr_quark key; in = "{ \"string\": \"hello world\"," " \"escaped\": \"bell \\b formfeed \\f linefeed \\n carriage return \\r tab \\t\"," " \"int\": 5, " " \"float\": 6.5, " " \"true\": true, " " \"false\": false, " " \"null\": null }"; err = tr_variantFromJson (&top, in, strlen(in)); check_int_eq (0, err); check (tr_variantIsDict (&top)); str = NULL; key = tr_quark_new ("string", 6); check (tr_variantDictFindStr (&top, key, &str, NULL)); check_streq ("hello world", str); check (tr_variantDictFindStr (&top, tr_quark_new("escaped",7), &str, NULL)); check_streq ("bell \b formfeed \f linefeed \n carriage return \r tab \t", str); i = 0; check (tr_variantDictFindInt (&top, tr_quark_new("int",3), &i)); check_int_eq (5, i); d = 0; check (tr_variantDictFindReal (&top, tr_quark_new("float",5), &d)); check_int_eq (65, ((int)(d*10))); f = false; check (tr_variantDictFindBool (&top, tr_quark_new("true",4), &f)); check_int_eq (true, f); check (tr_variantDictFindBool (&top, tr_quark_new("false",5), &f)); check_int_eq (false, f); check (tr_variantDictFindStr (&top, tr_quark_new("null",4), &str, NULL)); check_streq ("", str); if (!err) tr_variantFree (&top); return 0; } static int test_utf8 (void) { const char * in = "{ \"key\": \"Letöltések\" }"; tr_variant top; const char * str; char * json; int err; const tr_quark key = tr_quark_new ("key", 3); err = tr_variantFromJson (&top, in, strlen(in)); check (!err); check (tr_variantIsDict (&top)); check (tr_variantDictFindStr (&top, key, &str, NULL)); check_streq ("Letöltések", str); if (!err) tr_variantFree (&top); in = "{ \"key\": \"\\u005C\" }"; err = tr_variantFromJson (&top, in, strlen(in)); check (!err); check (tr_variantIsDict (&top)); check (tr_variantDictFindStr (&top, key, &str, NULL)); check_streq ("\\", str); if (!err) tr_variantFree (&top); /** * 1. Feed it JSON-escaped nonascii to the JSON decoder. * 2. Confirm that the result is UTF-8. * 3. Feed the same UTF-8 back into the JSON encoder. * 4. Confirm that the result is JSON-escaped. * 5. Dogfood that result back into the parser. * 6. Confirm that the result is UTF-8. */ in = "{ \"key\": \"Let\\u00f6lt\\u00e9sek\" }"; err = tr_variantFromJson (&top, in, strlen(in)); check (!err); check (tr_variantIsDict (&top)); check (tr_variantDictFindStr (&top, key, &str, NULL)); check_streq ("Letöltések", str); json = tr_variantToStr (&top, TR_VARIANT_FMT_JSON, NULL); if (!err) tr_variantFree (&top); check (json); check (strstr (json, "\\u00f6") != NULL); check (strstr (json, "\\u00e9") != NULL); err = tr_variantFromJson (&top, json, strlen(json)); check (!err); check (tr_variantIsDict (&top)); check (tr_variantDictFindStr (&top, key, &str, NULL)); check_streq ("Letöltések", str); if (!err) tr_variantFree (&top); tr_free (json); return 0; } static int test1 (void) { const char * in = "{\n" " \"headers\": {\n" " \"type\": \"request\",\n" " \"tag\": 666\n" " },\n" " \"body\": {\n" " \"name\": \"torrent-info\",\n" " \"arguments\": {\n" " \"ids\": [ 7, 10 ]\n" " }\n" " }\n" "}\n"; tr_variant top, *headers, *body, *args, *ids; const char * str; int64_t i; const int err = tr_variantFromJson (&top, in, strlen(in)); check (!err); check (tr_variantIsDict (&top)); check ((headers = tr_variantDictFind (&top, tr_quark_new("headers",7)))); check (tr_variantIsDict (headers)); check (tr_variantDictFindStr (headers, tr_quark_new("type",4), &str, NULL)); check_streq ("request", str); check (tr_variantDictFindInt (headers, TR_KEY_tag, &i)); check_int_eq (666, i); check ((body = tr_variantDictFind (&top, tr_quark_new("body",4)))); check (tr_variantDictFindStr (body, TR_KEY_name, &str, NULL)); check_streq ("torrent-info", str); check ((args = tr_variantDictFind (body, tr_quark_new("arguments",9)))); check (tr_variantIsDict (args)); check ((ids = tr_variantDictFind (args, TR_KEY_ids))); check (tr_variantIsList (ids)); check_int_eq (2, tr_variantListSize (ids)); check (tr_variantGetInt (tr_variantListChild (ids, 0), &i)); check_int_eq (7, i); check (tr_variantGetInt (tr_variantListChild (ids, 1), &i)); check_int_eq (10, i); tr_variantFree (&top); return 0; } static int test2 (void) { tr_variant top; const char * in = " "; int err; top.type = 0; err = tr_variantFromJson (&top, in, strlen(in)); check (err); check (!tr_variantIsDict (&top)); return 0; } static int test3 (void) { const char * in = "{ \"error\": 2," " \"errorString\": \"torrent not registered with this tracker 6UHsVW'*C\"," " \"eta\": 262792," " \"id\": 25," " \"leftUntilDone\": 2275655680 }"; tr_variant top; const char * str; const int err = tr_variantFromJson (&top, in, strlen(in)); check (!err); check (tr_variantDictFindStr (&top, TR_KEY_errorString, &str, NULL)); check_streq ("torrent not registered with this tracker 6UHsVW'*C", str); tr_variantFree (&top); return 0; } static int test_unescape (void) { const char * in = "{ \"string-1\": \"\\/usr\\/lib\" }"; tr_variant top; const char * str; const int err = tr_variantFromJson (&top, in, strlen(in)); check_int_eq (0, err); check (tr_variantDictFindStr (&top, tr_quark_new("string-1",8), &str, NULL)); check_streq ("/usr/lib", str); tr_variantFree (&top); return 0; } int main (void) { int i; int n; int rv; const char * comma_locales[] = { "da_DK.UTF-8", "fr_FR.UTF-8", "ru_RU.UTF-8"}; const testFunc tests[] = { test_elements, test_utf8, test1, test2, test3, test_unescape }; /* run the tests in a locale with a decimal point of '.' */ setlocale (LC_NUMERIC, "C"); if ((rv = runTests (tests, NUM_TESTS (tests)))) return rv; /* run the tests in a locale with a decimal point of ',' */ n = sizeof(comma_locales) / sizeof(comma_locales[0]); for (i=0; i #include #include #include "transmission.h" #include "session.h" #include "utils.h" #include "version.h" #undef VERBOSE #include "libtransmission-test.h" static int testPeerId (void) { int i; uint8_t peer_id[PEER_ID_LEN+1]; for (i = 0; i < 100000; ++i) { int j; int val = 0; tr_peerIdInit (peer_id); check (strlen ((char*)peer_id) == PEER_ID_LEN); check (!memcmp (peer_id, PEERID_PREFIX, 8)); for (j = 8; j < PEER_ID_LEN; ++j) { char tmp[2] = { peer_id[j], '\0' }; val += strtoul (tmp, NULL, 36); } check ((val % 36) == 0); } return 0; } MAIN_SINGLE_TEST (testPeerId) transmission-2.92/libtransmission/PaxHeaders.4960/history.h0000644000000000000000000000013112442116602020745 xustar0030 mtime=1418239362.940222735 30 atime=1418239362.940222735 29 ctime=1457295919.64280183 transmission-2.92/libtransmission/history.h0000644000175000017500000000271612442116602022401 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: history.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_RECENT_HISTORY_H #define TR_RECENT_HISTORY_H /** * A generic short-term memory object that remembers how many times * something happened over the last N seconds. * * For example, it could count how many are bytes transferred * to estimate the speed over the last N seconds. */ enum { TR_RECENT_HISTORY_PERIOD_SEC = 60 }; typedef struct tr_recentHistory { /* these are PRIVATE IMPLEMENTATION details included for composition only. * Don't access these directly! */ int newest; struct { unsigned int n; time_t date; } slices[TR_RECENT_HISTORY_PERIOD_SEC]; } tr_recentHistory; /** * @brief add a counter to the recent history object. * @param when the current time in sec, such as from tr_time () * @param n how many items to add to the history's counter */ void tr_historyAdd (tr_recentHistory *, time_t when, unsigned int n); /** * @brief count how many events have occurred in the last N seconds. * @param when the current time in sec, such as from tr_time () * @param seconds how many seconds to count back through. */ unsigned int tr_historyGet (const tr_recentHistory *, time_t when, unsigned int seconds); #endif transmission-2.92/libtransmission/PaxHeaders.4960/net.c0000644000000000000000000000013012610252362020025 xustar0029 mtime=1445025010.97387807 29 atime=1445025010.97387807 30 ctime=1457295920.060808938 transmission-2.92/libtransmission/net.c0000644000175000017500000004602612610252362021464 0ustar00mikedldmikedld00000000000000/****************************************************************************** * * $Id: net.c 14578 2015-10-16 19:49:07Z mikedld $ * * Copyright (c) Transmission authors and contributors * * 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. *****************************************************************************/ #include #include #include #include #ifdef _WIN32 #include #else #include /* TCP_CONGESTION */ #endif #include #include #include "transmission.h" #include "fdlimit.h" /* tr_fdSocketClose () */ #include "net.h" #include "peer-io.h" /* tr_peerIoAddrStr () FIXME this should be moved to net.h */ #include "session.h" /* tr_sessionGetPublicAddress () */ #include "tr-utp.h" /* tr_utpSendTo () */ #include "log.h" #include "utils.h" /* tr_time (), tr_logAddDebug () */ #ifndef IN_MULTICAST #define IN_MULTICAST(a) (((a) & 0xf0000000) == 0xe0000000) #endif const tr_address tr_in6addr_any = { TR_AF_INET6, { IN6ADDR_ANY_INIT } }; const tr_address tr_inaddr_any = { TR_AF_INET, { { { { INADDR_ANY, 0x00, 0x00, 0x00 } } } } }; char * tr_net_strerror (char * buf, size_t buflen, int err) { *buf = '\0'; #ifdef _WIN32 DWORD len = FormatMessageA (FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, buf, buflen, NULL); while (len > 0 && buf[len - 1] >= '\0' && buf[len - 1] <= ' ') buf[--len] = '\0'; #else tr_strlcpy (buf, tr_strerror (err), buflen); #endif return buf; } const char * tr_address_to_string_with_buf (const tr_address * addr, char * buf, size_t buflen) { assert (tr_address_is_valid (addr)); if (addr->type == TR_AF_INET) return evutil_inet_ntop (AF_INET, &addr->addr, buf, buflen); else return evutil_inet_ntop (AF_INET6, &addr->addr, buf, buflen); } /* * Non-threadsafe version of tr_address_to_string_with_buf () * and uses a static memory area for a buffer. * This function is suitable to be called from libTransmission's networking code, * which is single-threaded. */ const char * tr_address_to_string (const tr_address * addr) { static char buf[INET6_ADDRSTRLEN]; return tr_address_to_string_with_buf (addr, buf, sizeof (buf)); } bool tr_address_from_string (tr_address * dst, const char * src) { bool ok; if ((ok = evutil_inet_pton (AF_INET, src, &dst->addr) == 1)) dst->type = TR_AF_INET; if (!ok) /* try IPv6 */ if ((ok = evutil_inet_pton (AF_INET6, src, &dst->addr) == 1)) dst->type = TR_AF_INET6; return ok; } /* * Compare two tr_address structures. * Returns: * <0 if a < b * >0 if a > b * 0 if a == b */ int tr_address_compare (const tr_address * a, const tr_address * b) { static const int sizes[2] = { sizeof (struct in_addr), sizeof (struct in6_addr) }; /* IPv6 addresses are always "greater than" IPv4 */ if (a->type != b->type) return a->type == TR_AF_INET ? 1 : -1; return memcmp (&a->addr, &b->addr, sizes[a->type]); } /*********************************************************************** * TCP sockets **********************************************************************/ void tr_netSetTOS (tr_socket_t s, int tos) { #if defined (IP_TOS) && !defined (_WIN32) if (setsockopt (s, IPPROTO_IP, IP_TOS, (const void *) &tos, sizeof (tos)) == -1) { char err_buf[512]; tr_logAddNamedInfo ("Net", "Can't set TOS '%d': %s", tos, tr_net_strerror (err_buf, sizeof (err_buf), sockerrno)); } #else (void) s; (void) tos; #endif } void tr_netSetCongestionControl (tr_socket_t s, const char * algorithm) { #ifdef TCP_CONGESTION if (setsockopt (s, IPPROTO_TCP, TCP_CONGESTION, (const void *) algorithm, strlen (algorithm) + 1) == -1) { char err_buf[512]; tr_logAddNamedInfo ("Net", "Can't set congestion control algorithm '%s': %s", algorithm, tr_net_strerror (err_buf, sizeof (err_buf), sockerrno)); } #else (void) s; (void) algorithm; #endif } bool tr_address_from_sockaddr_storage (tr_address * setme_addr, tr_port * setme_port, const struct sockaddr_storage * from) { if (from->ss_family == AF_INET) { struct sockaddr_in * sin = (struct sockaddr_in *)from; setme_addr->type = TR_AF_INET; setme_addr->addr.addr4.s_addr = sin->sin_addr.s_addr; *setme_port = sin->sin_port; return true; } if (from->ss_family == AF_INET6) { struct sockaddr_in6 *sin6 = (struct sockaddr_in6*) from; setme_addr->type = TR_AF_INET6; setme_addr->addr.addr6 = sin6->sin6_addr; *setme_port = sin6->sin6_port; return true; } return false; } static socklen_t setup_sockaddr (const tr_address * addr, tr_port port, struct sockaddr_storage * sockaddr) { assert (tr_address_is_valid (addr)); if (addr->type == TR_AF_INET) { struct sockaddr_in sock4; memset (&sock4, 0, sizeof (sock4)); sock4.sin_family = AF_INET; sock4.sin_addr.s_addr = addr->addr.addr4.s_addr; sock4.sin_port = port; memcpy (sockaddr, &sock4, sizeof (sock4)); return sizeof (struct sockaddr_in); } else { struct sockaddr_in6 sock6; memset (&sock6, 0, sizeof (sock6)); sock6.sin6_family = AF_INET6; sock6.sin6_port = port; sock6.sin6_flowinfo = 0; sock6.sin6_addr = addr->addr.addr6; memcpy (sockaddr, &sock6, sizeof (sock6)); return sizeof (struct sockaddr_in6); } } tr_socket_t tr_netOpenPeerSocket (tr_session * session, const tr_address * addr, tr_port port, bool clientIsSeed) { static const int domains[NUM_TR_AF_INET_TYPES] = { AF_INET, AF_INET6 }; tr_socket_t s; struct sockaddr_storage sock; socklen_t addrlen; const tr_address * source_addr; socklen_t sourcelen; struct sockaddr_storage source_sock; char err_buf[512]; assert (tr_address_is_valid (addr)); if (!tr_address_is_valid_for_peers (addr, port)) return TR_BAD_SOCKET; /* -EINVAL */ s = tr_fdSocketCreate (session, domains[addr->type], SOCK_STREAM); if (s == TR_BAD_SOCKET) return TR_BAD_SOCKET; /* seeds don't need much of a read buffer... */ if (clientIsSeed) { int n = 8192; if (setsockopt (s, SOL_SOCKET, SO_RCVBUF, (const void *) &n, sizeof (n))) tr_logAddInfo ("Unable to set SO_RCVBUF on socket %"TR_PRI_SOCK": %s", s, tr_net_strerror (err_buf, sizeof (err_buf), sockerrno)); } if (evutil_make_socket_nonblocking (s) < 0) { tr_netClose (session, s); return TR_BAD_SOCKET; } addrlen = setup_sockaddr (addr, port, &sock); /* set source address */ source_addr = tr_sessionGetPublicAddress (session, addr->type, NULL); assert (source_addr); sourcelen = setup_sockaddr (source_addr, 0, &source_sock); if (bind (s, (struct sockaddr *) &source_sock, sourcelen)) { tr_logAddError (_("Couldn't set source address %s on %"TR_PRI_SOCK": %s"), tr_address_to_string (source_addr), s, tr_net_strerror (err_buf, sizeof (err_buf), sockerrno)); tr_netClose (session, s); return TR_BAD_SOCKET; /* -errno */ } if ((connect (s, (struct sockaddr *) &sock, addrlen) < 0) #ifdef _WIN32 && (sockerrno != WSAEWOULDBLOCK) #endif && (sockerrno != EINPROGRESS)) { int tmperrno; tmperrno = sockerrno; if ((tmperrno != ENETUNREACH && tmperrno != EHOSTUNREACH) || addr->type == TR_AF_INET) { tr_logAddError (_("Couldn't connect socket %"TR_PRI_SOCK" to %s, port %d (errno %d - %s)"), s, tr_address_to_string (addr), (int)ntohs (port), tmperrno, tr_net_strerror (err_buf, sizeof (err_buf), tmperrno)); } tr_netClose (session, s); s = TR_BAD_SOCKET; /* -tmperrno */ } tr_logAddDeep (__FILE__, __LINE__, NULL, "New OUTGOING connection %"TR_PRI_SOCK" (%s)", s, tr_peerIoAddrStr (addr, port)); return s; } struct UTPSocket * tr_netOpenPeerUTPSocket (tr_session * session, const tr_address * addr, tr_port port, bool clientIsSeed UNUSED) { struct UTPSocket * ret = NULL; if (tr_address_is_valid_for_peers (addr, port)) { struct sockaddr_storage ss; const socklen_t sslen = setup_sockaddr (addr, port, &ss); ret = UTP_Create (tr_utpSendTo, session, (struct sockaddr*)&ss, sslen); } return ret; } static tr_socket_t tr_netBindTCPImpl (const tr_address * addr, tr_port port, bool suppressMsgs, int * errOut) { static const int domains[NUM_TR_AF_INET_TYPES] = { AF_INET, AF_INET6 }; struct sockaddr_storage sock; tr_socket_t fd; int addrlen; int optval; assert (tr_address_is_valid (addr)); fd = socket (domains[addr->type], SOCK_STREAM, 0); if (fd == TR_BAD_SOCKET) { *errOut = sockerrno; return TR_BAD_SOCKET; } if (evutil_make_socket_nonblocking (fd) < 0) { *errOut = sockerrno; tr_netCloseSocket (fd); return TR_BAD_SOCKET; } optval = 1; setsockopt (fd, SOL_SOCKET, SO_KEEPALIVE, (const void *) &optval, sizeof (optval)); setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (const void *) &optval, sizeof (optval)); #ifdef IPV6_V6ONLY if (addr->type == TR_AF_INET6) if (setsockopt (fd, IPPROTO_IPV6, IPV6_V6ONLY, (const void *) &optval, sizeof (optval)) == -1) if (sockerrno != ENOPROTOOPT) { /* if the kernel doesn't support it, ignore it */ *errOut = sockerrno; tr_netCloseSocket (fd); return TR_BAD_SOCKET; } #endif addrlen = setup_sockaddr (addr, htons (port), &sock); if (bind (fd, (struct sockaddr *) &sock, addrlen)) { const int err = sockerrno; if (!suppressMsgs) { const char * fmt; const char * hint; char err_buf[512]; if (err == EADDRINUSE) hint = _("Is another copy of Transmission already running?"); else hint = NULL; if (hint == NULL) fmt = _("Couldn't bind port %d on %s: %s"); else fmt = _("Couldn't bind port %d on %s: %s (%s)"); tr_logAddError (fmt, port, tr_address_to_string (addr), tr_net_strerror (err_buf, sizeof (err_buf), err), hint); } tr_netCloseSocket (fd); *errOut = err; return TR_BAD_SOCKET; } if (!suppressMsgs) tr_logAddDebug ("Bound socket %"TR_PRI_SOCK" to port %d on %s", fd, port, tr_address_to_string (addr)); if (listen (fd, 128) == -1) { *errOut = sockerrno; tr_netCloseSocket (fd); return TR_BAD_SOCKET; } return fd; } tr_socket_t tr_netBindTCP (const tr_address * addr, tr_port port, bool suppressMsgs) { int unused; return tr_netBindTCPImpl (addr, port, suppressMsgs, &unused); } bool tr_net_hasIPv6 (tr_port port) { static bool result = false; static bool alreadyDone = false; if (!alreadyDone) { int err; tr_socket_t fd = tr_netBindTCPImpl (&tr_in6addr_any, port, true, &err); if (fd != TR_BAD_SOCKET || err != EAFNOSUPPORT) /* we support ipv6 */ result = true; if (fd != TR_BAD_SOCKET) tr_netCloseSocket (fd); alreadyDone = true; } return result; } tr_socket_t tr_netAccept (tr_session * session, tr_socket_t b, tr_address * addr, tr_port * port) { tr_socket_t fd = tr_fdSocketAccept (session, b, addr, port); if (fd != TR_BAD_SOCKET && evutil_make_socket_nonblocking (fd) < 0) { tr_netClose (session, fd); fd = TR_BAD_SOCKET; } return fd; } void tr_netCloseSocket (tr_socket_t fd) { evutil_closesocket (fd); } void tr_netClose (tr_session * session, tr_socket_t s) { tr_fdSocketClose (session, s); } /* get_source_address () and global_unicast_address () were written by Juliusz Chroboczek, and are covered under the same license as dht.c. Please feel free to copy them into your software if it can help unbreaking the double-stack Internet. */ /* Get the source address used for a given destination address. Since there is no official interface to get this information, we create a connected UDP socket (connected UDP... hmm...) and check its source address. */ static int get_source_address (const struct sockaddr * dst, socklen_t dst_len, struct sockaddr * src, socklen_t * src_len) { tr_socket_t s; int rc, save; s = socket (dst->sa_family, SOCK_DGRAM, 0); if (s == TR_BAD_SOCKET) goto fail; /* Since it's a UDP socket, this doesn't actually send any packets. */ rc = connect (s, dst, dst_len); if (rc < 0) goto fail; rc = getsockname (s, src, src_len); if (rc < 0) goto fail; evutil_closesocket (s); return rc; fail: save = errno; evutil_closesocket (s); errno = save; return -1; } /* We all hate NATs. */ static int global_unicast_address (struct sockaddr *sa) { if (sa->sa_family == AF_INET) { const unsigned char *a = (unsigned char*)& ((struct sockaddr_in*)sa)->sin_addr; if (a[0] == 0 || a[0] == 127 || a[0] >= 224 || a[0] == 10 || (a[0] == 172 && a[1] >= 16 && a[1] <= 31) || (a[0] == 192 && a[1] == 168)) return 0; return 1; } else if (sa->sa_family == AF_INET6) { const unsigned char *a = (unsigned char*)& ((struct sockaddr_in6*)sa)->sin6_addr; /* 2000::/3 */ return (a[0] & 0xE0) == 0x20; } else { errno = EAFNOSUPPORT; return -1; } } static int tr_globalAddress (int af, void *addr, int *addr_len) { struct sockaddr_storage ss; socklen_t sslen = sizeof (ss); struct sockaddr_in sin; struct sockaddr_in6 sin6; struct sockaddr *sa; socklen_t salen; int rc; switch (af) { case AF_INET: memset (&sin, 0, sizeof (sin)); sin.sin_family = AF_INET; evutil_inet_pton (AF_INET, "91.121.74.28", &sin.sin_addr); sin.sin_port = htons (6969); sa = (struct sockaddr*)&sin; salen = sizeof (sin); break; case AF_INET6: memset (&sin6, 0, sizeof (sin6)); sin6.sin6_family = AF_INET6; /* In order for address selection to work right, this should be a native IPv6 address, not Teredo or 6to4. */ evutil_inet_pton (AF_INET6, "2001:1890:1112:1::20", &sin6.sin6_addr); sin6.sin6_port = htons (6969); sa = (struct sockaddr*)&sin6; salen = sizeof (sin6); break; default: return -1; } rc = get_source_address (sa, salen, (struct sockaddr*)&ss, &sslen); if (rc < 0) return -1; if (!global_unicast_address ((struct sockaddr*)&ss)) return -1; switch (af) { case AF_INET: if (*addr_len < 4) return -1; memcpy (addr, & ((struct sockaddr_in*)&ss)->sin_addr, 4); *addr_len = 4; return 1; case AF_INET6: if (*addr_len < 16) return -1; memcpy (addr, & ((struct sockaddr_in6*)&ss)->sin6_addr, 16); *addr_len = 16; return 1; default: return -1; } } /* Return our global IPv6 address, with caching. */ const unsigned char * tr_globalIPv6 (void) { static unsigned char ipv6[16]; static time_t last_time = 0; static bool have_ipv6 = false; const time_t now = tr_time (); /* Re-check every half hour */ if (last_time < now - 1800) { int addrlen = 16; const int rc = tr_globalAddress (AF_INET6, ipv6, &addrlen); have_ipv6 = (rc >= 0) && (addrlen == 16); last_time = now; } return have_ipv6 ? ipv6 : NULL; } /*** **** **** ***/ static bool isIPv4MappedAddress (const tr_address * addr) { return (addr->type == TR_AF_INET6) && IN6_IS_ADDR_V4MAPPED (&addr->addr.addr6); } static bool isIPv6LinkLocalAddress (const tr_address * addr) { return ((addr->type == TR_AF_INET6) && IN6_IS_ADDR_LINKLOCAL (&addr->addr.addr6)); } /* isMartianAddr was written by Juliusz Chroboczek, and is covered under the same license as third-party/dht/dht.c. */ static bool isMartianAddr (const struct tr_address * a) { static const unsigned char zeroes[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; assert (tr_address_is_valid (a)); switch (a->type) { case TR_AF_INET: { const unsigned char * address = (const unsigned char*)&a->addr.addr4; return (address[0] == 0) || (address[0] == 127) || ((address[0] & 0xE0) == 0xE0); } case TR_AF_INET6: { const unsigned char * address = (const unsigned char*)&a->addr.addr6; return (address[0] == 0xFF) || (memcmp (address, zeroes, 15) == 0 && (address[15] == 0 || address[15] == 1)); } default: return true; } } bool tr_address_is_valid_for_peers (const tr_address * addr, tr_port port) { return (port != 0) && (tr_address_is_valid (addr)) && (!isIPv6LinkLocalAddress (addr)) && (!isIPv4MappedAddress (addr)) && (!isMartianAddr (addr)); } transmission-2.92/libtransmission/PaxHeaders.4960/ptrarray.h0000644000000000000000000000013112662757235021131 xustar0029 mtime=1456201373.07175669 30 atime=1456201373.070756673 30 ctime=1457295919.764803905 transmission-2.92/libtransmission/ptrarray.h0000644000175000017500000001030312662757235022554 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: ptrarray.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef _TR_PTR_ARRAY_H_ #define _TR_PTR_ARRAY_H_ #include #include "transmission.h" /** * @addtogroup utils Utilities * @{ */ /** * @brief simple pointer array that resizes itself dynamically. */ typedef struct tr_ptrArray { void ** items; int n_items; int n_alloc; } tr_ptrArray; typedef int (*PtrArrayCompareFunc)(const void * a, const void * b); typedef void (*PtrArrayForeachFunc)(void *); #define TR_PTR_ARRAY_INIT_STATIC { NULL, 0, 0 } extern const tr_ptrArray TR_PTR_ARRAY_INIT; /** @brief Destructor to free a tr_ptrArray's internal memory */ void tr_ptrArrayDestruct (tr_ptrArray*, PtrArrayForeachFunc func); /** @brief Iterate through each item in a tr_ptrArray */ void tr_ptrArrayForeach (tr_ptrArray * array, PtrArrayForeachFunc func); /** @brief Return the nth item in a tr_ptrArray @return the nth item in a tr_ptrArray */ static inline void* tr_ptrArrayNth (tr_ptrArray * array, int i) { assert (array); assert (i >= 0); assert (i < array->n_items); return array->items[i]; } /** @brief Remove the last item from the array and return it @return the pointer that's been removed from the array @see tr_ptrArrayBack () */ void* tr_ptrArrayPop (tr_ptrArray * array); /** @brief Return the last item in a tr_ptrArray @return the last item in a tr_ptrArray, or NULL if the array is empty @see tr_ptrArrayPop () */ static inline void* tr_ptrArrayBack (tr_ptrArray * array) { return array->n_items > 0 ? tr_ptrArrayNth (array, array->n_items - 1) : NULL; } void tr_ptrArrayErase (tr_ptrArray * t, int begin, int end); static inline void tr_ptrArrayRemove (tr_ptrArray * t, int pos) { tr_ptrArrayErase (t, pos, pos+1); } /** @brief Peek at the array pointer and its size, for easy iteration */ void** tr_ptrArrayPeek (tr_ptrArray * array, int * size); static inline void tr_ptrArrayClear (tr_ptrArray * a) { a->n_items = 0; } /** @brief Insert a pointer into the array at the specified position @return the index of the stored pointer */ int tr_ptrArrayInsert (tr_ptrArray * array, void * insertMe, int pos); /** @brief Append a pointer into the array */ static inline int tr_ptrArrayAppend (tr_ptrArray * array, void * appendMe) { return tr_ptrArrayInsert (array, appendMe, -1); } static inline void** tr_ptrArrayBase (const tr_ptrArray * a) { return a->items; } /** @brief Return the number of items in the array @return the number of items in the array */ static inline int tr_ptrArraySize (const tr_ptrArray * a) { return a->n_items; } /** @brief Return True if the array has no pointers @return True if the array has no pointers */ static inline bool tr_ptrArrayEmpty (const tr_ptrArray * a) { return tr_ptrArraySize (a) == 0; } int tr_ptrArrayLowerBound (const tr_ptrArray * array, const void * key, int compare (const void * arrayItem, const void * key), bool * exact_match); /** @brief Insert a pointer into the array at the position determined by the sort function @return the index of the stored pointer */ int tr_ptrArrayInsertSorted (tr_ptrArray * array, void * value, int compare (const void*, const void*)); /** @brief Remove this specific pointer from a sorted ptrarray */ void tr_ptrArrayRemoveSortedPointer (tr_ptrArray * t, const void * ptr, int compare (const void*, const void*)); /** @brief Find a pointer from an array sorted by the specified sort function @return the matching pointer, or NULL if no match was found */ void* tr_ptrArrayFindSorted (tr_ptrArray * array, const void * key, int compare (const void*, const void*)); /* @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/tr-dht.c0000644000000000000000000000013212536122177020452 xustar0030 mtime=1433969791.635956941 30 atime=1433969791.635956941 30 ctime=1457295920.167810758 transmission-2.92/libtransmission/tr-dht.c0000644000175000017500000005010712536122177022102 0ustar00mikedldmikedld00000000000000/* * Copyright (c) 2009-2010 by Juliusz Chroboczek * * 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. * * $Id: tr-dht.c 14536 2015-06-08 19:54:51Z mikedld $ * */ /* ansi */ #include #include #include /* memcpy (), memset (), memchr (), strlen () */ #include /* atoi () */ /* posix */ #include /* sig_atomic_t */ #ifdef _WIN32 #include #include #undef gai_strerror #define gai_strerror gai_strerrorA #else #include #include #include /* socket (), bind () */ #include #include /* sockaddr_in */ #endif /* third party */ #include #include /* libT */ #include "transmission.h" #include "crypto-utils.h" #include "file.h" #include "log.h" #include "net.h" #include "peer-mgr.h" /* tr_peerMgrCompactToPex () */ #include "platform.h" /* tr_threadNew () */ #include "session.h" #include "torrent.h" /* tr_torrentFindFromHash () */ #include "tr-dht.h" #include "trevent.h" /* tr_runInEventThread () */ #include "utils.h" #include "variant.h" static struct event *dht_timer = NULL; static unsigned char myid[20]; static tr_session *session = NULL; static void timer_callback (evutil_socket_t s, short type, void *ignore); struct bootstrap_closure { tr_session *session; uint8_t *nodes; uint8_t *nodes6; size_t len, len6; }; static bool bootstrap_done (tr_session *session, int af) { int status; if (af == 0) return bootstrap_done (session, AF_INET) && bootstrap_done (session, AF_INET6); status = tr_dhtStatus (session, af, NULL); return status == TR_DHT_STOPPED || status >= TR_DHT_FIREWALLED; } static void nap (int roughly_sec) { const int roughly_msec = roughly_sec * 1000; const int msec = roughly_msec/2 + tr_rand_int_weak (roughly_msec); tr_wait_msec (msec); } static int bootstrap_af (tr_session *session) { if (bootstrap_done (session, AF_INET6)) return AF_INET; else if (bootstrap_done (session, AF_INET)) return AF_INET6; else return 0; } static void bootstrap_from_name (const char *name, tr_port port, int af) { struct addrinfo hints, *info, *infop; char pp[10]; int rc; memset (&hints, 0, sizeof (hints)); hints.ai_socktype = SOCK_DGRAM; hints.ai_family = af; /* No, just passing p + 1 to gai won't work. */ tr_snprintf (pp, sizeof (pp), "%d", (int)port); rc = getaddrinfo (name, pp, &hints, &info); if (rc != 0) { tr_logAddNamedError ("DHT", "%s:%s: %s", name, pp, gai_strerror (rc)); return; } infop = info; while (infop) { dht_ping_node (infop->ai_addr, infop->ai_addrlen); nap (15); if (bootstrap_done (session, af)) break; infop = infop->ai_next; } freeaddrinfo (info); } static void dht_bootstrap (void *closure) { struct bootstrap_closure *cl = closure; int i; int num = cl->len / 6, num6 = cl->len6 / 18; if (session != cl->session) return; if (cl->len > 0) tr_logAddNamedInfo ("DHT", "Bootstrapping from %d IPv4 nodes", num); if (cl->len6 > 0) tr_logAddNamedInfo ("DHT", "Bootstrapping from %d IPv6 nodes", num6); for (i = 0; i < MAX (num, num6); i++) { if (i < num && !bootstrap_done (cl->session, AF_INET)) { tr_port port; struct tr_address addr; memset (&addr, 0, sizeof (addr)); addr.type = TR_AF_INET; memcpy (&addr.addr.addr4, &cl->nodes[i * 6], 4); memcpy (&port, &cl->nodes[i * 6 + 4], 2); port = ntohs (port); tr_dhtAddNode (cl->session, &addr, port, 1); } if (i < num6 && !bootstrap_done (cl->session, AF_INET6)) { tr_port port; struct tr_address addr; memset (&addr, 0, sizeof (addr)); addr.type = TR_AF_INET6; memcpy (&addr.addr.addr6, &cl->nodes6[i * 18], 16); memcpy (&port, &cl->nodes6[i * 18 + 16], 2); port = ntohs (port); tr_dhtAddNode (cl->session, &addr, port, 1); } /* Our DHT code is able to take up to 9 nodes in a row without dropping any. After that, it takes some time to split buckets. So ping the first 8 nodes quickly, then slow down. */ if (i < 8) nap (2); else nap (15); if (bootstrap_done (session, 0)) break; } if (!bootstrap_done (cl->session, 0)) { char *bootstrap_file; tr_sys_file_t f = TR_BAD_SYS_FILE; bootstrap_file = tr_buildPath (cl->session->configDir, "dht.bootstrap", NULL); if (bootstrap_file) f = tr_sys_file_open (bootstrap_file, TR_SYS_FILE_READ, 0, NULL); if (f != TR_BAD_SYS_FILE) { tr_logAddNamedInfo ("DHT", "Attempting manual bootstrap"); for (;;) { char buf[201]; char *p; int port = 0; if (!tr_sys_file_read_line (f, buf, 200, NULL)) break; p = memchr (buf, ' ', strlen (buf)); if (p != NULL) port = atoi (p + 1); if (p == NULL || port <= 0 || port >= 0x10000) { tr_logAddNamedError ("DHT", "Couldn't parse %s", buf); continue; } *p = '\0'; bootstrap_from_name (buf, port, bootstrap_af (session)); if (bootstrap_done (cl->session, 0)) break; } tr_sys_file_close (f, NULL); } tr_free (bootstrap_file); } if (!bootstrap_done (cl->session, 0)) { for (i = 0; i < 6; i++) { /* We don't want to abuse our bootstrap nodes, so be very slow. The initial wait is to give other nodes a chance to contact us before we attempt to contact a bootstrap node, for example because we've just been restarted. */ nap (40); if (bootstrap_done (cl->session, 0)) break; if (i == 0) tr_logAddNamedInfo ("DHT", "Attempting bootstrap from dht.transmissionbt.com"); bootstrap_from_name ("dht.transmissionbt.com", 6881, bootstrap_af (session)); } } if (cl->nodes) tr_free (cl->nodes); if (cl->nodes6) tr_free (cl->nodes6); tr_free (closure); tr_logAddNamedDbg ("DHT", "Finished bootstrapping"); } int tr_dhtInit (tr_session *ss) { tr_variant benc; int rc; bool have_id = false; char * dat_file; uint8_t * nodes = NULL, * nodes6 = NULL; const uint8_t * raw; size_t len, len6; struct bootstrap_closure * cl; if (session) /* already initialized */ return -1; tr_logAddNamedDbg ("DHT", "Initializing DHT"); if (tr_env_key_exists ("TR_DHT_VERBOSE")) dht_debug = stderr; dat_file = tr_buildPath (ss->configDir, "dht.dat", NULL); rc = tr_variantFromFile (&benc, TR_VARIANT_FMT_BENC, dat_file, NULL) ? 0 : -1; tr_free (dat_file); if (rc == 0) { have_id = tr_variantDictFindRaw (&benc, TR_KEY_id, &raw, &len); if (have_id && len==20) memcpy (myid, raw, len); if (ss->udp_socket != TR_BAD_SOCKET && tr_variantDictFindRaw (&benc, TR_KEY_nodes, &raw, &len) && ! (len%6)) { nodes = tr_memdup (raw, len); } if (ss->udp6_socket != TR_BAD_SOCKET && tr_variantDictFindRaw (&benc, TR_KEY_nodes6, &raw, &len6) && ! (len6%18)) { nodes6 = tr_memdup (raw, len6); } tr_variantFree (&benc); } if (nodes == NULL) len = 0; if (nodes6 == NULL) len6 = 0; if (have_id) tr_logAddNamedInfo ("DHT", "Reusing old id"); else { /* Note that DHT ids need to be distributed uniformly, * so it should be something truly random. */ tr_logAddNamedInfo ("DHT", "Generating new id"); tr_rand_buffer (myid, 20); } rc = dht_init (ss->udp_socket, ss->udp6_socket, myid, NULL); if (rc < 0) goto fail; session = ss; cl = tr_new (struct bootstrap_closure, 1); cl->session = session; cl->nodes = nodes; cl->nodes6 = nodes6; cl->len = len; cl->len6 = len6; tr_threadNew (dht_bootstrap, cl); dht_timer = evtimer_new (session->event_base, timer_callback, session); tr_timerAdd (dht_timer, 0, tr_rand_int_weak (1000000)); tr_logAddNamedDbg ("DHT", "DHT initialized"); return 1; fail: tr_logAddNamedDbg ("DHT", "DHT initialization failed (errno = %d)", errno); session = NULL; return -1; } void tr_dhtUninit (tr_session *ss) { if (session != ss) return; tr_logAddNamedDbg ("DHT", "Uninitializing DHT"); if (dht_timer != NULL) { event_free (dht_timer); dht_timer = NULL; } /* Since we only save known good nodes, avoid erasing older data if we don't know enough nodes. */ if ((tr_dhtStatus (ss, AF_INET, NULL) < TR_DHT_FIREWALLED) && (tr_dhtStatus (ss, AF_INET6, NULL) < TR_DHT_FIREWALLED)) { tr_logAddNamedInfo ("DHT", "Not saving nodes, DHT not ready"); } else { tr_variant benc; struct sockaddr_in sins[300]; struct sockaddr_in6 sins6[300]; char compact[300 * 6], compact6[300 * 18]; char *dat_file; int i, j, num = 300, num6 = 300; int n = dht_get_nodes (sins, &num, sins6, &num6); tr_logAddNamedInfo ("DHT", "Saving %d (%d + %d) nodes", n, num, num6); j = 0; for (i=0; i 0) tr_variantDictAddRaw (&benc, TR_KEY_nodes, compact, num * 6); if (num6 > 0) tr_variantDictAddRaw (&benc, TR_KEY_nodes6, compact6, num6 * 18); dat_file = tr_buildPath (ss->configDir, "dht.dat", NULL); tr_variantToFile (&benc, TR_VARIANT_FMT_BENC, dat_file); tr_variantFree (&benc); tr_free (dat_file); } dht_uninit (); tr_logAddNamedDbg ("DHT", "Done uninitializing DHT"); session = NULL; } bool tr_dhtEnabled (const tr_session * ss) { return ss && (ss == session); } struct getstatus_closure { int af; sig_atomic_t status; sig_atomic_t count; }; static void getstatus (void * cl) { struct getstatus_closure * closure = cl; int good, dubious, incoming; dht_nodes (closure->af, &good, &dubious, NULL, &incoming); closure->count = good + dubious; if (good < 4 || good + dubious <= 8) closure->status = TR_DHT_BROKEN; else if (good < 40) closure->status = TR_DHT_POOR; else if (incoming < 8) closure->status = TR_DHT_FIREWALLED; else closure->status = TR_DHT_GOOD; } int tr_dhtStatus (tr_session * session, int af, int * nodes_return) { struct getstatus_closure closure = { af, -1, -1 }; if (!tr_dhtEnabled (session) || (af == AF_INET && session->udp_socket == TR_BAD_SOCKET) || (af == AF_INET6 && session->udp6_socket == TR_BAD_SOCKET)) { if (nodes_return) *nodes_return = 0; return TR_DHT_STOPPED; } tr_runInEventThread (session, getstatus, &closure); while (closure.status < 0) tr_wait_msec (50 /*msec*/); if (nodes_return) *nodes_return = closure.count; return closure.status; } tr_port tr_dhtPort (tr_session *ss) { return tr_dhtEnabled (ss) ? ss->udp_port : 0; } bool tr_dhtAddNode (tr_session * ss, const tr_address * address, tr_port port, bool bootstrap) { int af = address->type == TR_AF_INET ? AF_INET : AF_INET6; if (!tr_dhtEnabled (ss)) return false; /* Since we don't want to abuse our bootstrap nodes, * we don't ping them if the DHT is in a good state. */ if (bootstrap) { if (tr_dhtStatus (ss, af, NULL) >= TR_DHT_FIREWALLED) return false; } if (address->type == TR_AF_INET) { struct sockaddr_in sin; memset (&sin, 0, sizeof (sin)); sin.sin_family = AF_INET; memcpy (&sin.sin_addr, &address->addr.addr4, 4); sin.sin_port = htons (port); dht_ping_node ((struct sockaddr*)&sin, sizeof (sin)); return true; } else if (address->type == TR_AF_INET6) { struct sockaddr_in6 sin6; memset (&sin6, 0, sizeof (sin6)); sin6.sin6_family = AF_INET6; memcpy (&sin6.sin6_addr, &address->addr.addr6, 16); sin6.sin6_port = htons (port); dht_ping_node ((struct sockaddr*)&sin6, sizeof (sin6)); return true; } return false; } const char * tr_dhtPrintableStatus (int status) { switch (status) { case TR_DHT_STOPPED: return "stopped"; case TR_DHT_BROKEN: return "broken"; case TR_DHT_POOR: return "poor"; case TR_DHT_FIREWALLED: return "firewalled"; case TR_DHT_GOOD: return "good"; default: return "???"; } } static void callback (void *ignore UNUSED, int event, const unsigned char *info_hash, const void *data, size_t data_len) { if (event == DHT_EVENT_VALUES || event == DHT_EVENT_VALUES6) { tr_torrent *tor; tr_sessionLock (session); tor = tr_torrentFindFromHash (session, info_hash); if (tor && tr_torrentAllowsDHT (tor)) { size_t i, n; tr_pex * pex; if (event == DHT_EVENT_VALUES) pex = tr_peerMgrCompactToPex (data, data_len, NULL, 0, &n); else pex = tr_peerMgrCompact6ToPex (data, data_len, NULL, 0, &n); for (i=0; idhtAnnounceInProgress = 0; } else { tr_logAddTorInfo (tor, "%s", "IPv6 DHT announce done"); tor->dhtAnnounce6InProgress = 0; } } } } static int tr_dhtAnnounce (tr_torrent *tor, int af, bool announce) { int rc, status, numnodes, ret = 0; if (!tr_torrentAllowsDHT (tor)) return -1; status = tr_dhtStatus (tor->session, af, &numnodes); if (status == TR_DHT_STOPPED) { /* Let the caller believe everything is all right. */ return 1; } if (status >= TR_DHT_POOR) { rc = dht_search (tor->info.hash, announce ? tr_sessionGetPeerPort (session) : 0, af, callback, NULL); if (rc >= 1) { tr_logAddTorInfo (tor, "Starting %s DHT announce (%s, %d nodes)", af == AF_INET6 ? "IPv6" : "IPv4", tr_dhtPrintableStatus (status), numnodes); if (af == AF_INET) tor->dhtAnnounceInProgress = true; else tor->dhtAnnounce6InProgress = true; ret = 1; } else { tr_logAddTorErr (tor, "%s DHT announce failed (%s, %d nodes): %s", af == AF_INET6 ? "IPv6" : "IPv4", tr_dhtPrintableStatus (status), numnodes, tr_strerror (errno)); } } else { tr_logAddTorDbg (tor, "%s DHT not ready (%s, %d nodes)", af == AF_INET6 ? "IPv6" : "IPv4", tr_dhtPrintableStatus (status), numnodes); } return ret; } void tr_dhtUpkeep (tr_session * session) { tr_torrent * tor = NULL; const time_t now = tr_time (); while ((tor = tr_torrentNext (session, tor))) { if (!tor->isRunning || !tr_torrentAllowsDHT (tor)) continue; if (tor->dhtAnnounceAt <= now) { const int rc = tr_dhtAnnounce (tor, AF_INET, 1); tor->dhtAnnounceAt = now + ((rc == 0) ? 5 + tr_rand_int_weak (5) : 25 * 60 + tr_rand_int_weak (3*60)); } if (tor->dhtAnnounce6At <= now) { const int rc = tr_dhtAnnounce (tor, AF_INET6, 1); tor->dhtAnnounce6At = now + ((rc == 0) ? 5 + tr_rand_int_weak (5) : 25 * 60 + tr_rand_int_weak (3*60)); } } } void tr_dhtCallback (unsigned char *buf, int buflen, struct sockaddr *from, socklen_t fromlen, void *sv) { time_t tosleep; int rc; assert (tr_isSession (sv)); if (sv != session) return; rc = dht_periodic (buf, buflen, from, fromlen, &tosleep, callback, NULL); if (rc < 0) { if (errno == EINTR) { tosleep = 0; } else { tr_logAddNamedError ("DHT", "dht_periodic failed: %s", tr_strerror (errno)); if (errno == EINVAL || errno == EFAULT) abort (); tosleep = 1; } } /* Being slightly late is fine, and has the added benefit of adding some jitter. */ tr_timerAdd (dht_timer, tosleep, tr_rand_int_weak (1000000)); } static void timer_callback (evutil_socket_t s UNUSED, short type UNUSED, void *session) { tr_dhtCallback (NULL, 0, NULL, 0, session); } /* This function should return true when a node is blacklisted. We do not support using a blacklist with the DHT in Transmission, since massive (ab)use of this feature could harm the DHT. However, feel free to add support to your private copy as long as you don't redistribute it. */ int dht_blacklisted (const struct sockaddr *sa UNUSED, int salen UNUSED) { return 0; } void dht_hash (void *hash_return, int hash_size, const void *v1, int len1, const void *v2, int len2, const void *v3, int len3) { unsigned char sha1[SHA_DIGEST_LENGTH]; tr_sha1 (sha1, v1, len1, v2, len2, v3, len3, NULL); memset (hash_return, 0, hash_size); memcpy (hash_return, sha1, MIN (hash_size, SHA_DIGEST_LENGTH)); } int dht_random_bytes (void * buf, size_t size) { tr_rand_buffer (buf, size); return size; } #if defined (_WIN32) && !defined (__MINGW32__) int dht_gettimeofday (struct timeval * tv, struct timezone * tz) { assert (tz == NULL); return tr_gettimeofday (tv); } #endif transmission-2.92/libtransmission/PaxHeaders.4960/makemeta.h0000644000000000000000000000013212442116602021031 xustar0030 mtime=1418239362.960223077 30 atime=1418239362.960223077 30 ctime=1457295919.695802731 transmission-2.92/libtransmission/makemeta.h0000644000175000017500000000743012442116602022462 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: makemeta.h 14294 2014-06-10 00:43:21Z jordan $ */ #ifndef TR_MAKEMETA_H #define TR_MAKEMETA_H 1 #ifdef __cplusplus extern "C" { #endif typedef struct tr_metainfo_builder_file { char * filename; uint64_t size; } tr_metainfo_builder_file; typedef enum { TR_MAKEMETA_OK, TR_MAKEMETA_URL, TR_MAKEMETA_CANCELLED, TR_MAKEMETA_IO_READ, /* see builder.errfile, builder.my_errno */ TR_MAKEMETA_IO_WRITE /* see builder.errfile, builder.my_errno */ } tr_metainfo_builder_err; typedef struct tr_metainfo_builder { /** *** These are set by tr_makeMetaInfoBuilderCreate () *** and cleaned up by tr_metaInfoBuilderFree () **/ char * top; tr_metainfo_builder_file * files; uint64_t totalSize; uint32_t fileCount; uint32_t pieceSize; uint32_t pieceCount; bool isFolder; /** *** These are set inside tr_makeMetaInfo () *** by copying the arguments passed to it, *** and cleaned up by tr_metaInfoBuilderFree () **/ tr_tracker_info * trackers; int trackerCount; char * comment; char * outputFile; bool isPrivate; /** *** These are set inside tr_makeMetaInfo () so the client *** can poll periodically to see what the status is. *** The client can also set abortFlag to nonzero to *** tell tr_makeMetaInfo () to abort and clean up after itself. **/ uint32_t pieceIndex; bool abortFlag; bool isDone; tr_metainfo_builder_err result; /* file in use when result was set to _IO_READ or _IO_WRITE, * or the URL in use when the result was set to _URL */ char errfile[2048]; /* errno encountered when result was set to _IO_READ or _IO_WRITE */ int my_errno; /** *** This is an implementation detail. *** The client should never use these fields. **/ struct tr_metainfo_builder * nextBuilder; } tr_metainfo_builder; tr_metainfo_builder * tr_metaInfoBuilderCreate (const char * topFile); /** * Call this before tr_makeMetaInfo() to override the builder.pieceSize * and builder.pieceCount values that were set by tr_metainfoBuilderCreate() * * @return false if the piece size isn't valid; eg, isn't a power of two. */ bool tr_metaInfoBuilderSetPieceSize (tr_metainfo_builder * builder, uint32_t bytes); void tr_metaInfoBuilderFree (tr_metainfo_builder*); /** * @brief create a new .torrent file * * This is actually done in a worker thread, not the main thread! * Otherwise the client's interface would lock up while this runs. * * It is the caller's responsibility to poll builder->isDone * from time to time! When the worker thread sets that flag, * the caller must pass the builder to tr_metaInfoBuilderFree (). * * @param outputFile if NULL, builder->top + ".torrent" will be used. * @param trackers An array of trackers, sorted by tier from first to last. * NOTE: only the `tier' and `announce' fields are used. * * @param trackerCount size of the `trackers' array */ void tr_makeMetaInfo (tr_metainfo_builder * builder, const char * outputFile, const tr_tracker_info * trackers, int trackerCount, const char * comment, bool isPrivate); #ifdef __cplusplus } #endif #endif transmission-2.92/libtransmission/PaxHeaders.4960/magnet.c0000644000000000000000000000013212640354044020517 xustar0030 mtime=1451350052.448150354 30 atime=1451350052.448150354 30 ctime=1457295920.042808632 transmission-2.92/libtransmission/magnet.c0000644000175000017500000001543012640354044022147 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: magnet.c 14634 2015-12-25 11:34:35Z mikedld $ */ #include #include /* strchr () */ #include /* sscanf () */ #include "transmission.h" #include "crypto-utils.h" /* tr_hex_to_sha1 () */ #include "magnet.h" #include "variant.h" #include "web.h" /*** **** ***/ /* this base32 code converted from code by Robert Kaye and Gordon Mohr * and is public domain. see http://bitzi.com/publicdomain for more info */ static const int base32Lookup[] = { 0xFF,0xFF,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, /* '0', '1', '2', '3', '4', '5', '6', '7' */ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, /* '8', '9', ':', ';', '<', '=', '>', '?' */ 0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06, /* '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G' */ 0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E, /* 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O' */ 0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16, /* 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W' */ 0x17,0x18,0x19,0xFF,0xFF,0xFF,0xFF,0xFF, /* 'X', 'Y', 'Z', '[', '\', ']', '^', '_' */ 0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06, /* '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g' */ 0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E, /* 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o' */ 0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16, /* 'p', 'q', 'r', 's', 't', 'u', 'v', 'w' */ 0x17,0x18,0x19,0xFF,0xFF,0xFF,0xFF,0xFF /* 'x', 'y', 'z', '{', '|', '}', '~', 'DEL' */ }; static const int base32LookupLen = sizeof (base32Lookup) / sizeof (base32Lookup[0]); static void base32_to_sha1 (uint8_t * out, const char * in, const size_t inlen) { const size_t outlen = 20; size_t i, index, offset; memset (out, 0, 20); assert (inlen == 32); for (i=0, index=0, offset=0; i=base32LookupLen) continue; /* If this digit is not in the table, ignore it */ digit = base32Lookup[lookup]; if (digit == 0xFF) continue; if (index <= 3) { index = (index + 5) % 8; if (index == 0) { out[offset] |= digit; offset++; if (offset >= outlen) break; } else { out[offset] |= digit << (8 - index); } } else { index = (index + 5) % 8; out[offset] |= (digit >> index); offset++; if (offset >= outlen) break; out[offset] |= digit << (8 - index); } } } /*** **** ***/ #define MAX_TRACKERS 64 #define MAX_WEBSEEDS 64 tr_magnet_info * tr_magnetParse (const char * uri) { bool got_checksum = false; int trCount = 0; int wsCount = 0; char * tr[MAX_TRACKERS]; char * ws[MAX_WEBSEEDS]; char * displayName = NULL; uint8_t sha1[SHA_DIGEST_LENGTH]; tr_magnet_info * info = NULL; if ((uri != NULL) && !memcmp (uri, "magnet:?", 8)) { const char * walk; for (walk=uri+8; walk && *walk;) { const char * key = walk; const char * delim = strchr (key, '='); const char * val = delim == NULL ? NULL : delim + 1; const char * next = strchr (delim == NULL ? key : val, '&'); size_t keylen, vallen; if (delim != NULL) keylen = (size_t) (delim - key); else if (next != NULL) keylen = (size_t) (next - key); else keylen = strlen (key); if (val == NULL) vallen = 0; else if (next != NULL) vallen = (size_t) (next - val); else vallen = strlen (val); if ((keylen==2) && !memcmp (key, "xt", 2) && val && !memcmp (val, "urn:btih:", 9)) { const char * hash = val + 9; const size_t hashlen = vallen - 9; if (hashlen == 40) { tr_hex_to_sha1 (sha1, hash); got_checksum = true; } else if (hashlen == 32) { base32_to_sha1 (sha1, hash, hashlen); got_checksum = true; } } if ((vallen > 0) && (keylen==2) && !memcmp (key, "dn", 2)) displayName = tr_http_unescape (val, vallen); if ((vallen > 0) && (trCount < MAX_TRACKERS)) { int i; if ((keylen==2) && !memcmp (key, "tr", 2)) tr[trCount++] = tr_http_unescape (val, vallen); else if ((sscanf (key, "tr.%d=", &i) == 1) && (i >= 0)) /* ticket #3341 and #5134 */ tr[trCount++] = tr_http_unescape (val, vallen); } if ((vallen > 0) && (keylen==2) && !memcmp (key, "ws", 2) && (wsCount < MAX_WEBSEEDS)) ws[wsCount++] = tr_http_unescape (val, vallen); walk = next != NULL ? next + 1 : NULL; } } if (got_checksum) { info = tr_new0 (tr_magnet_info, 1); info->displayName = displayName; info->trackerCount = trCount; info->trackers = tr_memdup (tr, sizeof (char*) * trCount); info->webseedCount = wsCount; info->webseeds = tr_memdup (ws, sizeof (char*) * wsCount); memcpy (info->hash, sha1, sizeof (uint8_t) * SHA_DIGEST_LENGTH); } return info; } void tr_magnetFree (tr_magnet_info * info) { if (info != NULL) { int i; for (i=0; itrackerCount; ++i) tr_free (info->trackers[i]); tr_free (info->trackers); for (i=0; iwebseedCount; ++i) tr_free (info->webseeds[i]); tr_free (info->webseeds); tr_free (info->displayName); tr_free (info); } } void tr_magnetCreateMetainfo (const tr_magnet_info * info, tr_variant * top) { int i; tr_variant * d; tr_variantInitDict (top, 4); /* announce list */ if (info->trackerCount == 1) { tr_variantDictAddStr (top, TR_KEY_announce, info->trackers[0]); } else { tr_variant * trackers = tr_variantDictAddList (top, TR_KEY_announce_list, info->trackerCount); for (i=0; itrackerCount; ++i) tr_variantListAddStr (tr_variantListAddList (trackers, 1), info->trackers[i]); } /* webseeds */ if (info->webseedCount > 0) { tr_variant * urls = tr_variantDictAddList (top, TR_KEY_url_list, info->webseedCount); for (i=0; iwebseedCount; ++i) tr_variantListAddStr (urls, info->webseeds[i]); } /* nonstandard keys */ d = tr_variantDictAddDict (top, TR_KEY_magnet_info, 2); tr_variantDictAddRaw (d, TR_KEY_info_hash, info->hash, 20); if (info->displayName != NULL) tr_variantDictAddStr (d, TR_KEY_display_name, info->displayName); } transmission-2.92/libtransmission/PaxHeaders.4960/variant-common.h0000644000000000000000000000013112522604362022202 xustar0030 mtime=1430980850.673381475 30 atime=1430980850.673381475 29 ctime=1457295919.86980569 transmission-2.92/libtransmission/variant-common.h0000644000175000017500000000432012522604362023627 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: variant-common.h 14521 2015-05-04 19:58:34Z mikedld $ */ #ifndef __LIBTRANSMISSION_VARIANT_MODULE__ #error only libtransmission/variant-*.c should #include this header. #endif #ifndef _TR_VARIANT_COMMON_H_ #define _TR_VARIANT_COMMON_H_ typedef void (*VariantWalkFunc)(const tr_variant * val, void * user_data); struct VariantWalkFuncs { VariantWalkFunc intFunc; VariantWalkFunc boolFunc; VariantWalkFunc realFunc; VariantWalkFunc stringFunc; VariantWalkFunc dictBeginFunc; VariantWalkFunc listBeginFunc; VariantWalkFunc containerEndFunc; }; void tr_variantWalk (const tr_variant * top, const struct VariantWalkFuncs * walkFuncs, void * user_data, bool sort_dicts); void tr_variantToBufJson (const tr_variant * top, struct evbuffer * buf, bool lean); void tr_variantToBufBenc (const tr_variant * top, struct evbuffer * buf); void tr_variantInit (tr_variant * v, char type); int tr_jsonParse (const char * source, /* Such as a filename. Only when logging an error */ const void * vbuf, size_t len, tr_variant * setme_benc, const char ** setme_end); /** @brief Private function that's exposed here only for unit tests */ int tr_bencParseInt (const uint8_t * buf, const uint8_t * bufend, const uint8_t ** setme_end, int64_t * setme_val); /** @brief Private function that's exposed here only for unit tests */ int tr_bencParseStr (const uint8_t * buf, const uint8_t * bufend, const uint8_t ** setme_end, const uint8_t ** setme_str, size_t * setme_strlen); int tr_variantParseBenc (const void * buf, const void * end, tr_variant * top, const char ** setme_end); #endif /* _TR_VARIANT_COMMON_H_ */ transmission-2.92/libtransmission/PaxHeaders.4960/ConvertUTF.c0000644000000000000000000000013212662757243021257 xustar0030 mtime=1456201379.235861549 30 atime=1456201379.235861549 30 ctime=1457295919.975807493 transmission-2.92/libtransmission/ConvertUTF.c0000644000175000017500000005024112662757243022706 0ustar00mikedldmikedld00000000000000/* * Copyright 2001-2004 Unicode, Inc. * * Disclaimer * * This source code is provided as is by Unicode, Inc. No claims are * made as to fitness for any particular purpose. No warranties of any * kind are expressed or implied. The recipient agrees to determine * applicability of information provided. If this file has been * purchased on magnetic or optical media from Unicode, Inc., the * sole remedy for any claim will be exchange of defective media * within 90 days of receipt. * * Limitations on Rights to Redistribute This Code * * Unicode, Inc. hereby grants the right to freely use the information * supplied in this file in the creation of products supporting the * Unicode Standard, and to make copies of this file in any form * for internal or external distribution as long as this notice * remains attached. */ /* --------------------------------------------------------------------- Conversions between UTF32, UTF-16, and UTF-8. Source code file. Author: Mark E. Davis, 1994. Rev History: Rick McGowan, fixes & updates May 2001. Sept 2001: fixed const & error conditions per mods suggested by S. Parent & A. Lillich. June 2002: Tim Dodd added detection and handling of incomplete source sequences, enhanced error detection, added casts to eliminate compiler warnings. July 2003: slight mods to back out aggressive FFFE detection. Jan 2004: updated switches in from-UTF8 conversions. Oct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions. May 2006: updated isLegalUTF8Sequence. See the header file "ConvertUTF.h" for complete documentation. ------------------------------------------------------------------------ */ #ifdef CVTUTF_DEBUG #include #endif #include /* strlen () */ #include "transmission.h" #include "ConvertUTF.h" static const int halfShift = 10; /* used for shifting by 10 bits */ static const UTF32 halfBase = 0x0010000UL; static const UTF32 halfMask = 0x3FFUL; #define UNI_SUR_HIGH_START (UTF32)0xD800 #define UNI_SUR_HIGH_END (UTF32)0xDBFF #define UNI_SUR_LOW_START (UTF32)0xDC00 #define UNI_SUR_LOW_END (UTF32)0xDFFF #define false 0 #define true 1 /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF32toUTF16 ( const UTF32** sourceStart, const UTF32* sourceEnd, UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF32* source = *sourceStart; UTF16* target = *targetStart; while (source < sourceEnd) { UTF32 ch; if (target >= targetEnd) { result = targetExhausted; break; } ch = *source++; if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ /* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { if (flags == strictConversion) { --source; /* return to the illegal value itself */ result = sourceIllegal; break; } else { *target++ = UNI_REPLACEMENT_CHAR; } } else { *target++ = (UTF16)ch; /* normal case */ } } else if (ch > UNI_MAX_LEGAL_UTF32) { if (flags == strictConversion) { result = sourceIllegal; } else { *target++ = UNI_REPLACEMENT_CHAR; } } else { /* target is a character in range 0xFFFF - 0x10FFFF. */ if (target + 1 >= targetEnd) { --source; /* Back up source pointer! */ result = targetExhausted; break; } ch -= halfBase; *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); } } *sourceStart = source; *targetStart = target; return result; } /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF16toUTF32 ( const UTF16** sourceStart, const UTF16* sourceEnd, UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF16* source = *sourceStart; UTF32* target = *targetStart; UTF32 ch, ch2; while (source < sourceEnd) { const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ ch = *source++; /* If we have a surrogate pair, convert to UTF32 first. */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { /* If the 16 bits following the high surrogate are in the source buffer... */ if (source < sourceEnd) { ch2 = *source; /* If it's a low surrogate, convert to UTF32. */ if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + (ch2 - UNI_SUR_LOW_START) + halfBase; ++source; } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ --source; /* return to the illegal value itself */ result = sourceIllegal; break; } } else { /* We don't have the 16 bits following the high surrogate. */ --source; /* return to the high surrogate */ result = sourceExhausted; break; } } else if (flags == strictConversion) { /* UTF-16 surrogate values are illegal in UTF-32 */ if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { --source; /* return to the illegal value itself */ result = sourceIllegal; break; } } if (target >= targetEnd) { source = oldSource; /* Back up source pointer! */ result = targetExhausted; break; } *target++ = ch; } *sourceStart = source; *targetStart = target; #ifdef CVTUTF_DEBUG if (result == sourceIllegal) { fprintf (stderr, "ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\n", ch, ch2); fflush (stderr); } #endif return result; } /* --------------------------------------------------------------------- */ /* * Index into the table below with the first byte of a UTF-8 sequence to * get the number of trailing bytes that are supposed to follow it. * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is * left as-is for anyone who may want to do such conversion, which was * allowed in earlier algorithms. */ static const char trailingBytesForUTF8[256] = { 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,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,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,0,0,0, 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, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; /* * Magic values subtracted from a buffer value during UTF8 conversion. * This table contains as many values as there might be trailing bytes * in a UTF-8 sequence. */ static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, 0x03C82080UL, 0xFA082080UL, 0x82082080UL }; /* * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed * into the first byte, depending on how many bytes follow. There are * as many entries in this table as there are UTF-8 sequence types. * (I.e., one byte sequence, two byte... etc.). Remember that sequencs * for *legal* UTF-8 will be 4 or fewer bytes total. */ static const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; /* --------------------------------------------------------------------- */ /* The interface converts a whole buffer to avoid function-call overhead. * Constants have been gathered. Loops & conditionals have been removed as * much as possible for efficiency, in favor of drop-through switches. * (See "Note A" at the bottom of the file for equivalent code.) * If your compiler supports it, the "isLegalUTF8" call can be turned * into an inline function. */ /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF16toUTF8 ( const UTF16** sourceStart, const UTF16* sourceEnd, UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF16* source = *sourceStart; UTF8* target = *targetStart; while (source < sourceEnd) { UTF32 ch; unsigned short bytesToWrite = 0; const UTF32 byteMask = 0xBF; const UTF32 byteMark = 0x80; const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ ch = *source++; /* If we have a surrogate pair, convert to UTF32 first. */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { /* If the 16 bits following the high surrogate are in the source buffer... */ if (source < sourceEnd) { UTF32 ch2 = *source; /* If it's a low surrogate, convert to UTF32. */ if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + (ch2 - UNI_SUR_LOW_START) + halfBase; ++source; } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ --source; /* return to the illegal value itself */ result = sourceIllegal; break; } } else { /* We don't have the 16 bits following the high surrogate. */ --source; /* return to the high surrogate */ result = sourceExhausted; break; } } else if (flags == strictConversion) { /* UTF-16 surrogate values are illegal in UTF-32 */ if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { --source; /* return to the illegal value itself */ result = sourceIllegal; break; } } /* Figure out how many bytes the result will require */ if (ch < (UTF32)0x80) { bytesToWrite = 1; } else if (ch < (UTF32)0x800) { bytesToWrite = 2; } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; } else if (ch < (UTF32)0x110000) { bytesToWrite = 4; } else { bytesToWrite = 3; ch = UNI_REPLACEMENT_CHAR; } target += bytesToWrite; if (target > targetEnd) { source = oldSource; /* Back up source pointer! */ target -= bytesToWrite; result = targetExhausted; break; } switch (bytesToWrite) { /* note: everything falls through. */ case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 1: *--target = (UTF8)(ch | firstByteMark[bytesToWrite]); } target += bytesToWrite; } *sourceStart = source; *targetStart = target; return result; } /* --------------------------------------------------------------------- */ /* * Utility routine to tell whether a sequence of bytes is legal UTF-8. * This must be called with the length pre-determined by the first byte. * If not calling this from ConvertUTF8to*, then the length can be set by: * length = trailingBytesForUTF8[*source]+1; * and the sequence is illegal right away if there aren't that many bytes * available. * If presented with a length > 4, this returns false. The Unicode * definition of UTF-8 goes up to 4-byte sequences. */ static Boolean isLegalUTF8 (const UTF8 *source, int length) { UTF8 a; const UTF8 *srcptr = source+length; switch (length) { default: return false; /* Everything else falls through when "true"... */ case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; case 2: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; switch (*source) { /* no fall-through in this inner switch */ case 0xE0: if (a < 0xA0) return false; break; case 0xED: if (a > 0x9F) return false; break; case 0xF0: if (a < 0x90) return false; break; case 0xF4: if (a > 0x8F) return false; break; default: if (a < 0x80) return false; } case 1: if (*source >= 0x80 && *source < 0xC2) return false; } if (*source > 0xF4) return false; return true; } /* --------------------------------------------------------------------- */ /* * Exported function to return whether a UTF-8 sequence is legal or not. * This is not used here; it's just exported. */ Boolean isLegalUTF8Sequence (const UTF8 *source, const UTF8 *sourceEnd) { int length; if (source == sourceEnd) { return true; } while (true) { length = trailingBytesForUTF8[*source]+1; if (source+length > sourceEnd) { return false; } if (!isLegalUTF8 (source, length)) { return false; } source += length; if (source >= sourceEnd) { return true; } } } /** * This is a variation of isLegalUTF8Sequence () that behaves like g_utf8_validate (). * In addition to knowing if the sequence is legal, it also tells you the last good character. */ Boolean tr_utf8_validate (const char * str, size_t max_len, const char ** end) { const UTF8* source = (const UTF8*) str; const UTF8* sourceEnd; if (max_len == 0) return true; if (str == NULL) return false; sourceEnd = source + (max_len == TR_BAD_SIZE ? strlen (str) : max_len); if (source == sourceEnd) { if (end != NULL) *end = (const char*) source; return true; } for (;;) { const int length = trailingBytesForUTF8[*source] + 1; if (source + length > sourceEnd) { if (end != NULL) *end = (const char*) source; return false; } if (!isLegalUTF8 (source, length)) { if (end != NULL) *end = (const char*) source; return false; } source += length; if (source >= sourceEnd) { if (end != NULL) *end = (const char*) source; return true; } } } /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF8toUTF16 ( const UTF8** sourceStart, const UTF8* sourceEnd, UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF8* source = *sourceStart; UTF16* target = *targetStart; while (source < sourceEnd) { UTF32 ch = 0; unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; if (extraBytesToRead >= sourceEnd - source) { result = sourceExhausted; break; } /* Do this check whether lenient or strict */ if (! isLegalUTF8 (source, extraBytesToRead+1)) { result = sourceIllegal; break; } /* * The cases all fall through. See "Note A" below. */ switch (extraBytesToRead) { case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ case 3: ch += *source++; ch <<= 6; case 2: ch += *source++; ch <<= 6; case 1: ch += *source++; ch <<= 6; case 0: ch += *source++; } ch -= offsetsFromUTF8[extraBytesToRead]; if (target >= targetEnd) { source -= (extraBytesToRead+1); /* Back up source pointer! */ result = targetExhausted; break; } if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ /* UTF-16 surrogate values are illegal in UTF-32 */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { if (flags == strictConversion) { source -= (extraBytesToRead+1); /* return to the illegal value itself */ result = sourceIllegal; break; } else { *target++ = UNI_REPLACEMENT_CHAR; } } else { *target++ = (UTF16)ch; /* normal case */ } } else if (ch > UNI_MAX_UTF16) { if (flags == strictConversion) { result = sourceIllegal; source -= (extraBytesToRead+1); /* return to the start */ break; /* Bail out; shouldn't continue */ } else { *target++ = UNI_REPLACEMENT_CHAR; } } else { /* target is a character in range 0xFFFF - 0x10FFFF. */ if (target + 1 >= targetEnd) { source -= (extraBytesToRead+1); /* Back up source pointer! */ result = targetExhausted; break; } ch -= halfBase; *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); } } *sourceStart = source; *targetStart = target; return result; } /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF32toUTF8 ( const UTF32** sourceStart, const UTF32* sourceEnd, UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF32* source = *sourceStart; UTF8* target = *targetStart; while (source < sourceEnd) { UTF32 ch; unsigned short bytesToWrite = 0; const UTF32 byteMask = 0xBF; const UTF32 byteMark = 0x80; ch = *source++; if (flags == strictConversion) { /* UTF-16 surrogate values are illegal in UTF-32 */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { --source; /* return to the illegal value itself */ result = sourceIllegal; break; } } /* * Figure out how many bytes the result will require. Turn any * illegally large UTF32 things (> Plane 17) into replacement chars. */ if (ch < (UTF32)0x80) { bytesToWrite = 1; } else if (ch < (UTF32)0x800) { bytesToWrite = 2; } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; } else if (ch <= UNI_MAX_LEGAL_UTF32) { bytesToWrite = 4; } else { bytesToWrite = 3; ch = UNI_REPLACEMENT_CHAR; result = sourceIllegal; } target += bytesToWrite; if (target > targetEnd) { --source; /* Back up source pointer! */ target -= bytesToWrite; result = targetExhausted; break; } switch (bytesToWrite) { /* note: everything falls through. */ case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; case 1: *--target = (UTF8)(ch | firstByteMark[bytesToWrite]); } target += bytesToWrite; } *sourceStart = source; *targetStart = target; return result; } /* --------------------------------------------------------------------- */ ConversionResult ConvertUTF8toUTF32 ( const UTF8** sourceStart, const UTF8* sourceEnd, UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { ConversionResult result = conversionOK; const UTF8* source = *sourceStart; UTF32* target = *targetStart; while (source < sourceEnd) { UTF32 ch = 0; unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; if (extraBytesToRead >= sourceEnd - source) { result = sourceExhausted; break; } /* Do this check whether lenient or strict */ if (! isLegalUTF8 (source, extraBytesToRead+1)) { result = sourceIllegal; break; } /* * The cases all fall through. See "Note A" below. */ switch (extraBytesToRead) { case 5: ch += *source++; ch <<= 6; case 4: ch += *source++; ch <<= 6; case 3: ch += *source++; ch <<= 6; case 2: ch += *source++; ch <<= 6; case 1: ch += *source++; ch <<= 6; case 0: ch += *source++; } ch -= offsetsFromUTF8[extraBytesToRead]; if (target >= targetEnd) { source -= (extraBytesToRead+1); /* Back up the source pointer! */ result = targetExhausted; break; } if (ch <= UNI_MAX_LEGAL_UTF32) { /* * UTF-16 surrogate values are illegal in UTF-32, and anything * over Plane 17 (> 0x10FFFF) is illegal. */ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { if (flags == strictConversion) { source -= (extraBytesToRead+1); /* return to the illegal value itself */ result = sourceIllegal; break; } else { *target++ = UNI_REPLACEMENT_CHAR; } } else { *target++ = ch; } } else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */ result = sourceIllegal; *target++ = UNI_REPLACEMENT_CHAR; } } *sourceStart = source; *targetStart = target; return result; } /* --------------------------------------------------------------------- Note A. The fall-through switches in UTF-8 reading code save a temp variable, some decrements & conditionals. The switches are equivalent to the following loop: { int tmpBytesToRead = extraBytesToRead+1; do { ch += *source++; --tmpBytesToRead; if (tmpBytesToRead) ch <<= 6; } while (tmpBytesToRead > 0); } In UTF-8 writing code, the switches on "bytesToWrite" are similarly unrolled loops. --------------------------------------------------------------------- */ transmission-2.92/libtransmission/PaxHeaders.4960/makemeta.c0000644000000000000000000000013212612560132021024 xustar0030 mtime=1445650522.639234988 30 atime=1445650522.639234988 30 ctime=1457295920.043808649 transmission-2.92/libtransmission/makemeta.c0000644000175000017500000003576512612560132022471 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: makemeta.c 14355 2014-12-04 12:13:59Z mikedld $ */ #include #include #include /* qsort */ #include /* strcmp, strlen */ #include /* evutil_ascii_strcasecmp () */ #include "transmission.h" #include "crypto-utils.h" /* tr_sha1 */ #include "error.h" #include "file.h" #include "log.h" #include "session.h" #include "makemeta.h" #include "platform.h" /* threads, locks */ #include "utils.h" /* buildpath */ #include "variant.h" #include "version.h" /**** ***** ****/ struct FileList { uint64_t size; char * filename; struct FileList * next; }; static struct FileList * getFiles (const char * dir, const char * base, struct FileList * list) { tr_sys_dir_t odir; char * buf; tr_sys_path_info info; tr_error * error = NULL; buf = tr_buildPath (dir, base, NULL); if (!tr_sys_path_get_info (buf, 0, &info, &error)) { tr_logAddError (_("Torrent Creator is skipping file \"%s\": %s"), buf, error->message); tr_free (buf); tr_error_free (error); return list; } if (info.type == TR_SYS_PATH_IS_DIRECTORY && (odir = tr_sys_dir_open (buf, NULL)) != TR_BAD_SYS_DIR) { const char * name; while ((name = tr_sys_dir_read_name (odir, NULL)) != NULL) if (name[0] != '.') /* skip dotfiles */ list = getFiles (buf, name, list); tr_sys_dir_close (odir, NULL); } else if (info.type == TR_SYS_PATH_IS_FILE && info.size > 0) { struct FileList * node = tr_new (struct FileList, 1); node->size = info.size; node->filename = tr_strdup (buf); node->next = list; list = node; } tr_free (buf); return list; } static uint32_t bestPieceSize (uint64_t totalSize) { const uint32_t KiB = 1024; const uint32_t MiB = 1048576; const uint32_t GiB = 1073741824; if (totalSize >= (2 * GiB)) return 2 * MiB; if (totalSize >= (1 * GiB)) return 1 * MiB; if (totalSize >= (512 * MiB)) return 512 * KiB; if (totalSize >= (350 * MiB)) return 256 * KiB; if (totalSize >= (150 * MiB)) return 128 * KiB; if (totalSize >= (50 * MiB)) return 64 * KiB; return 32 * KiB; /* less than 50 meg */ } static int builderFileCompare (const void * va, const void * vb) { const tr_metainfo_builder_file * a = va; const tr_metainfo_builder_file * b = vb; return evutil_ascii_strcasecmp (a->filename, b->filename); } tr_metainfo_builder* tr_metaInfoBuilderCreate (const char * topFileArg) { int i; struct FileList * files; struct FileList * walk; tr_metainfo_builder * ret = tr_new0 (tr_metainfo_builder, 1); ret->top = tr_sys_path_resolve (topFileArg, NULL); { tr_sys_path_info info; ret->isFolder = tr_sys_path_get_info (ret->top, 0, &info, NULL) && info.type == TR_SYS_PATH_IS_DIRECTORY; } /* build a list of files containing top file and, if it's a directory, all of its children */ { char * dir = tr_sys_path_dirname (ret->top, NULL); char * base = tr_sys_path_basename (ret->top, NULL); files = getFiles (dir, base, NULL); tr_free (base); tr_free (dir); } for (walk=files; walk!=NULL; walk=walk->next) ++ret->fileCount; ret->files = tr_new0 (tr_metainfo_builder_file, ret->fileCount); for (i=0, walk=files; walk!=NULL; ++i) { struct FileList * tmp = walk; tr_metainfo_builder_file * file = &ret->files[i]; walk = walk->next; file->filename = tmp->filename; file->size = tmp->size; ret->totalSize += tmp->size; tr_free (tmp); } qsort (ret->files, ret->fileCount, sizeof (tr_metainfo_builder_file), builderFileCompare); tr_metaInfoBuilderSetPieceSize (ret, bestPieceSize (ret->totalSize)); return ret; } static bool isValidPieceSize (uint32_t n) { const bool isPowerOfTwo = !(n == 0) && !(n & (n - 1)); return isPowerOfTwo; } bool tr_metaInfoBuilderSetPieceSize (tr_metainfo_builder * b, uint32_t bytes) { if (!isValidPieceSize (bytes)) { char wanted[32]; char gotten[32]; tr_formatter_mem_B (wanted, bytes, sizeof(wanted)); tr_formatter_mem_B (gotten, b->pieceSize, sizeof(gotten)); tr_logAddError (_("Failed to set piece size to %s, leaving it at %s"), wanted, gotten); return false; } b->pieceSize = bytes; b->pieceCount = (int)(b->totalSize / b->pieceSize); if (b->totalSize % b->pieceSize) ++b->pieceCount; return true; } void tr_metaInfoBuilderFree (tr_metainfo_builder * builder) { if (builder) { int i; tr_file_index_t t; for (t=0; tfileCount; ++t) tr_free (builder->files[t].filename); tr_free (builder->files); tr_free (builder->top); tr_free (builder->comment); for (i=0; itrackerCount; ++i) tr_free (builder->trackers[i].announce); tr_free (builder->trackers); tr_free (builder->outputFile); tr_free (builder); } } /**** ***** ****/ static uint8_t* getHashInfo (tr_metainfo_builder * b) { uint32_t fileIndex = 0; uint8_t *ret = tr_new0 (uint8_t, SHA_DIGEST_LENGTH * b->pieceCount); uint8_t *walk = ret; uint8_t *buf; uint64_t totalRemain; uint64_t off = 0; tr_sys_file_t fd; tr_error * error = NULL; if (!b->totalSize) return ret; buf = tr_valloc (b->pieceSize); b->pieceIndex = 0; totalRemain = b->totalSize; fd = tr_sys_file_open (b->files[fileIndex].filename, TR_SYS_FILE_READ | TR_SYS_FILE_SEQUENTIAL, 0, &error); if (fd == TR_BAD_SYS_FILE) { b->my_errno = error->code; tr_strlcpy (b->errfile, b->files[fileIndex].filename, sizeof (b->errfile)); b->result = TR_MAKEMETA_IO_READ; tr_free (buf); tr_free (ret); tr_error_free (error); return NULL; } while (totalRemain) { uint8_t * bufptr = buf; const uint32_t thisPieceSize = (uint32_t) MIN (b->pieceSize, totalRemain); uint64_t leftInPiece = thisPieceSize; assert (b->pieceIndex < b->pieceCount); while (leftInPiece) { const uint64_t n_this_pass = MIN (b->files[fileIndex].size - off, leftInPiece); uint64_t n_read = 0; tr_sys_file_read (fd, bufptr, n_this_pass, &n_read, NULL); bufptr += n_read; off += n_read; leftInPiece -= n_read; if (off == b->files[fileIndex].size) { off = 0; tr_sys_file_close (fd, NULL); fd = TR_BAD_SYS_FILE; if (++fileIndex < b->fileCount) { fd = tr_sys_file_open (b->files[fileIndex].filename, TR_SYS_FILE_READ | TR_SYS_FILE_SEQUENTIAL, 0, &error); if (fd == TR_BAD_SYS_FILE) { b->my_errno = error->code; tr_strlcpy (b->errfile, b->files[fileIndex].filename, sizeof (b->errfile)); b->result = TR_MAKEMETA_IO_READ; tr_free (buf); tr_free (ret); tr_error_free (error); return NULL; } } } } assert (bufptr - buf == (int)thisPieceSize); assert (leftInPiece == 0); tr_sha1 (walk, buf, thisPieceSize, NULL); walk += SHA_DIGEST_LENGTH; if (b->abortFlag) { b->result = TR_MAKEMETA_CANCELLED; break; } totalRemain -= thisPieceSize; ++b->pieceIndex; } assert (b->abortFlag || (walk - ret == (int)(SHA_DIGEST_LENGTH * b->pieceCount))); assert (b->abortFlag || !totalRemain); if (fd != TR_BAD_SYS_FILE) tr_sys_file_close (fd, NULL); tr_free (buf); return ret; } static void getFileInfo (const char * topFile, const tr_metainfo_builder_file * file, tr_variant * uninitialized_length, tr_variant * uninitialized_path) { size_t offset; /* get the file size */ tr_variantInitInt (uninitialized_length, file->size); /* how much of file->filename to walk past */ offset = strlen (topFile); if (offset>0 && topFile[offset-1]!=TR_PATH_DELIMITER) ++offset; /* +1 for the path delimiter */ /* build the path list */ tr_variantInitList (uninitialized_path, 0); if (strlen (file->filename) > offset) { char * filename = tr_strdup (file->filename + offset); char * walk = filename; const char * token; while ((token = tr_strsep (&walk, TR_PATH_DELIMITER_STR))) if (*token) tr_variantListAddStr (uninitialized_path, token); tr_free (filename); } } static void makeInfoDict (tr_variant * dict, tr_metainfo_builder * builder) { char * base; uint8_t * pch; tr_variantDictReserve (dict, 5); if (builder->isFolder) /* root node is a directory */ { uint32_t i; tr_variant * list = tr_variantDictAddList (dict, TR_KEY_files, builder->fileCount); for (i=0; ifileCount; ++i) { tr_variant * d = tr_variantListAddDict (list, 2); tr_variant * length = tr_variantDictAdd (d, TR_KEY_length); tr_variant * pathVal = tr_variantDictAdd (d, TR_KEY_path); getFileInfo (builder->top, &builder->files[i], length, pathVal); } } else { tr_variantDictAddInt (dict, TR_KEY_length, builder->files[0].size); } base = tr_sys_path_basename (builder->top, NULL); tr_variantDictAddStr (dict, TR_KEY_name, base); tr_free (base); tr_variantDictAddInt (dict, TR_KEY_piece_length, builder->pieceSize); if ((pch = getHashInfo (builder))) { tr_variantDictAddRaw (dict, TR_KEY_pieces, pch, SHA_DIGEST_LENGTH * builder->pieceCount); tr_free (pch); } tr_variantDictAddInt (dict, TR_KEY_private, builder->isPrivate ? 1 : 0); } static void tr_realMakeMetaInfo (tr_metainfo_builder * builder) { int i; tr_variant top; /* allow an empty set, but if URLs *are* listed, verify them. #814, #971 */ for (i=0; itrackerCount && !builder->result; ++i) { if (!tr_urlIsValidTracker (builder->trackers[i].announce)) { tr_strlcpy (builder->errfile, builder->trackers[i].announce, sizeof (builder->errfile)); builder->result = TR_MAKEMETA_URL; } } tr_variantInitDict (&top, 6); if (!builder->fileCount || !builder->totalSize || !builder->pieceSize || !builder->pieceCount) { builder->errfile[0] = '\0'; builder->my_errno = ENOENT; builder->result = TR_MAKEMETA_IO_READ; builder->isDone = true; } if (!builder->result && builder->trackerCount) { int prevTier = -1; tr_variant * tier = NULL; if (builder->trackerCount > 1) { tr_variant * annList = tr_variantDictAddList (&top, TR_KEY_announce_list, 0); for (i=0; itrackerCount; ++i) { if (prevTier != builder->trackers[i].tier) { prevTier = builder->trackers[i].tier; tier = tr_variantListAddList (annList, 0); } tr_variantListAddStr (tier, builder->trackers[i].announce); } } tr_variantDictAddStr (&top, TR_KEY_announce, builder->trackers[0].announce); } if (!builder->result && !builder->abortFlag) { if (builder->comment && *builder->comment) tr_variantDictAddStr (&top, TR_KEY_comment, builder->comment); tr_variantDictAddStr (&top, TR_KEY_created_by, TR_NAME "/" LONG_VERSION_STRING); tr_variantDictAddInt (&top, TR_KEY_creation_date, time (NULL)); tr_variantDictAddStr (&top, TR_KEY_encoding, "UTF-8"); makeInfoDict (tr_variantDictAddDict (&top, TR_KEY_info, 666), builder); } /* save the file */ if (!builder->result && !builder->abortFlag) { if (tr_variantToFile (&top, TR_VARIANT_FMT_BENC, builder->outputFile)) { builder->my_errno = errno; tr_strlcpy (builder->errfile, builder->outputFile, sizeof (builder->errfile)); builder->result = TR_MAKEMETA_IO_WRITE; } } /* cleanup */ tr_variantFree (&top); if (builder->abortFlag) builder->result = TR_MAKEMETA_CANCELLED; builder->isDone = true; } /*** **** **** A threaded builder queue **** ***/ static tr_metainfo_builder * queue = NULL; static tr_thread * workerThread = NULL; static tr_lock* getQueueLock (void) { static tr_lock * lock = NULL; if (!lock) lock = tr_lockNew (); return lock; } static void makeMetaWorkerFunc (void * unused UNUSED) { for (;;) { tr_metainfo_builder * builder = NULL; /* find the next builder to process */ tr_lock * lock = getQueueLock (); tr_lockLock (lock); if (queue) { builder = queue; queue = queue->nextBuilder; } tr_lockUnlock (lock); /* if no builders, this worker thread is done */ if (builder == NULL) break; tr_realMakeMetaInfo (builder); } workerThread = NULL; } void tr_makeMetaInfo (tr_metainfo_builder * builder, const char * outputFile, const tr_tracker_info * trackers, int trackerCount, const char * comment, bool isPrivate) { int i; tr_lock * lock; assert (tr_isBool (isPrivate)); /* free any variables from a previous run */ for (i=0; itrackerCount; ++i) tr_free (builder->trackers[i].announce); tr_free (builder->trackers); tr_free (builder->comment); tr_free (builder->outputFile); /* initialize the builder variables */ builder->abortFlag = false; builder->result = 0; builder->isDone = false; builder->pieceIndex = 0; builder->trackerCount = trackerCount; builder->trackers = tr_new0 (tr_tracker_info, builder->trackerCount); for (i=0; itrackerCount; ++i) { builder->trackers[i].tier = trackers[i].tier; builder->trackers[i].announce = tr_strdup (trackers[i].announce); } builder->comment = tr_strdup (comment); builder->isPrivate = isPrivate; if (outputFile && *outputFile) builder->outputFile = tr_strdup (outputFile); else builder->outputFile = tr_strdup_printf ("%s.torrent", builder->top); /* enqueue the builder */ lock = getQueueLock (); tr_lockLock (lock); builder->nextBuilder = queue; queue = builder; if (!workerThread) workerThread = tr_threadNew (makeMetaWorkerFunc, NULL); tr_lockUnlock (lock); } transmission-2.92/libtransmission/PaxHeaders.4960/natpmp.c0000644000000000000000000000013212532765473020557 xustar0030 mtime=1433135931.841661389 30 atime=1433135931.841661389 30 ctime=1457295920.055808853 transmission-2.92/libtransmission/natpmp.c0000644000175000017500000001532312532765473022210 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: natpmp.c 14532 2015-05-31 22:13:31Z mikedld $ */ #include #include #include #include /* evutil_inet_ntop () */ #define ENABLE_STRNATPMPERR #include "natpmp.h" #include "transmission.h" #include "natpmp_local.h" #include "log.h" #include "net.h" /* tr_netCloseSocket */ #include "port-forwarding.h" #include "utils.h" #define LIFETIME_SECS 3600 #define COMMAND_WAIT_SECS 8 static const char * getKey (void) { return _("Port Forwarding (NAT-PMP)"); } typedef enum { TR_NATPMP_IDLE, TR_NATPMP_ERR, TR_NATPMP_DISCOVER, TR_NATPMP_RECV_PUB, TR_NATPMP_SEND_MAP, TR_NATPMP_RECV_MAP, TR_NATPMP_SEND_UNMAP, TR_NATPMP_RECV_UNMAP } tr_natpmp_state; struct tr_natpmp { bool has_discovered; bool is_mapped; tr_port public_port; tr_port private_port; time_t renew_time; time_t command_time; tr_natpmp_state state; natpmp_t natpmp; }; /** *** **/ static void logVal (const char * func, int ret) { if (ret == NATPMP_TRYAGAIN) return; if (ret >= 0) tr_logAddNamedInfo (getKey (), _("%s succeeded (%d)"), func, ret); else tr_logAddNamedDbg ( getKey (), "%s failed. Natpmp returned %d (%s); errno is %d (%s)", func, ret, strnatpmperr (ret), errno, tr_strerror (errno)); } struct tr_natpmp* tr_natpmpInit (void) { struct tr_natpmp * nat; nat = tr_new0 (struct tr_natpmp, 1); nat->state = TR_NATPMP_DISCOVER; nat->public_port = 0; nat->private_port = 0; nat->natpmp.s = TR_BAD_SOCKET; /* socket */ return nat; } void tr_natpmpClose (tr_natpmp * nat) { if (nat) { closenatpmp (&nat->natpmp); tr_free (nat); } } static bool canSendCommand (const struct tr_natpmp * nat) { return tr_time () >= nat->command_time; } static void setCommandTime (struct tr_natpmp * nat) { nat->command_time = tr_time () + COMMAND_WAIT_SECS; } int tr_natpmpPulse (struct tr_natpmp * nat, tr_port private_port, bool is_enabled, tr_port * public_port) { int ret; if (is_enabled && (nat->state == TR_NATPMP_DISCOVER)) { int val = initnatpmp (&nat->natpmp, 0, 0); logVal ("initnatpmp", val); val = sendpublicaddressrequest (&nat->natpmp); logVal ("sendpublicaddressrequest", val); nat->state = val < 0 ? TR_NATPMP_ERR : TR_NATPMP_RECV_PUB; nat->has_discovered = true; setCommandTime (nat); } if ((nat->state == TR_NATPMP_RECV_PUB) && canSendCommand (nat)) { natpmpresp_t response; const int val = readnatpmpresponseorretry (&nat->natpmp, &response); logVal ("readnatpmpresponseorretry", val); if (val >= 0) { char str[128]; evutil_inet_ntop (AF_INET, &response.pnu.publicaddress.addr, str, sizeof (str)); tr_logAddNamedInfo (getKey (), _("Found public address \"%s\""), str); nat->state = TR_NATPMP_IDLE; } else if (val != NATPMP_TRYAGAIN) { nat->state = TR_NATPMP_ERR; } } if ((nat->state == TR_NATPMP_IDLE) || (nat->state == TR_NATPMP_ERR)) { if (nat->is_mapped && (!is_enabled || (nat->private_port != private_port))) nat->state = TR_NATPMP_SEND_UNMAP; } if ((nat->state == TR_NATPMP_SEND_UNMAP) && canSendCommand (nat)) { const int val = sendnewportmappingrequest (&nat->natpmp, NATPMP_PROTOCOL_TCP, nat->private_port, nat->public_port, 0); logVal ("sendnewportmappingrequest", val); nat->state = val < 0 ? TR_NATPMP_ERR : TR_NATPMP_RECV_UNMAP; setCommandTime (nat); } if (nat->state == TR_NATPMP_RECV_UNMAP) { natpmpresp_t resp; const int val = readnatpmpresponseorretry (&nat->natpmp, &resp); logVal ("readnatpmpresponseorretry", val); if (val >= 0) { const int private_port = resp.pnu.newportmapping.privateport; tr_logAddNamedInfo (getKey (), _("no longer forwarding port %d"), private_port); if (nat->private_port == private_port) { nat->private_port = 0; nat->public_port = 0; nat->state = TR_NATPMP_IDLE; nat->is_mapped = false; } } else if (val != NATPMP_TRYAGAIN) { nat->state = TR_NATPMP_ERR; } } if (nat->state == TR_NATPMP_IDLE) { if (is_enabled && !nat->is_mapped && nat->has_discovered) nat->state = TR_NATPMP_SEND_MAP; else if (nat->is_mapped && tr_time () >= nat->renew_time) nat->state = TR_NATPMP_SEND_MAP; } if ((nat->state == TR_NATPMP_SEND_MAP) && canSendCommand (nat)) { const int val = sendnewportmappingrequest (&nat->natpmp, NATPMP_PROTOCOL_TCP, private_port, private_port, LIFETIME_SECS); logVal ("sendnewportmappingrequest", val); nat->state = val < 0 ? TR_NATPMP_ERR : TR_NATPMP_RECV_MAP; setCommandTime (nat); } if (nat->state == TR_NATPMP_RECV_MAP) { natpmpresp_t resp; const int val = readnatpmpresponseorretry (&nat->natpmp, &resp); logVal ("readnatpmpresponseorretry", val); if (val >= 0) { nat->state = TR_NATPMP_IDLE; nat->is_mapped = true; nat->renew_time = tr_time () + (resp.pnu.newportmapping.lifetime / 2); nat->private_port = resp.pnu.newportmapping.privateport; nat->public_port = resp.pnu.newportmapping.mappedpublicport; tr_logAddNamedInfo (getKey (), _("Port %d forwarded successfully"), nat->private_port); } else if (val != NATPMP_TRYAGAIN) { nat->state = TR_NATPMP_ERR; } } switch (nat->state) { case TR_NATPMP_IDLE: *public_port = nat->public_port; return nat->is_mapped ? TR_PORT_MAPPED : TR_PORT_UNMAPPED; break; case TR_NATPMP_DISCOVER: ret = TR_PORT_UNMAPPED; break; case TR_NATPMP_RECV_PUB: case TR_NATPMP_SEND_MAP: case TR_NATPMP_RECV_MAP: ret = TR_PORT_MAPPING; break; case TR_NATPMP_SEND_UNMAP: case TR_NATPMP_RECV_UNMAP: ret = TR_PORT_UNMAPPING; break; default: ret = TR_PORT_ERROR; break; } return ret; } transmission-2.92/libtransmission/PaxHeaders.4960/natpmp_local.h0000644000000000000000000000013212505250244021717 xustar0030 mtime=1427460260.476244119 30 atime=1427460260.476244119 30 ctime=1457295919.708802952 transmission-2.92/libtransmission/natpmp_local.h0000644000175000017500000000117412505250244023347 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: natpmp_local.h 14369 2014-12-10 18:58:12Z mikedld $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_NATPMP_H #define TR_NATPMP_H 1 /** * @addtogroup port_forwarding Port Forwarding * @{ */ typedef struct tr_natpmp tr_natpmp; tr_natpmp * tr_natpmpInit (void); void tr_natpmpClose (tr_natpmp *); int tr_natpmpPulse (tr_natpmp *, tr_port port, bool isEnabled, tr_port * public_port); /* @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/crypto.c0000644000000000000000000000013112505250244020560 xustar0030 mtime=1427460260.445243566 30 atime=1427460260.445243566 29 ctime=1457295919.97680751 transmission-2.92/libtransmission/crypto.c0000644000175000017500000001241212505250244022206 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: crypto.c 14476 2015-03-15 11:43:32Z mikedld $ */ #include #include /* memcpy (), memmove (), memset () */ #include "transmission.h" #include "crypto.h" #include "crypto-utils.h" #include "utils.h" /** *** **/ #define PRIME_LEN 96 #define DH_PRIVKEY_LEN 20 static const uint8_t dh_P[PRIME_LEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x3A, 0x36, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x05, 0x63, }; static const uint8_t dh_G[] = { 2 }; /** *** **/ static void ensureKeyExists (tr_crypto * crypto) { if (crypto->dh == NULL) { size_t public_key_length; crypto->dh = tr_dh_new (dh_P, sizeof (dh_P), dh_G, sizeof (dh_G)); tr_dh_make_key (crypto->dh, DH_PRIVKEY_LEN, crypto->myPublicKey, &public_key_length); assert (public_key_length == KEY_LEN); } } void tr_cryptoConstruct (tr_crypto * crypto, const uint8_t * torrentHash, bool isIncoming) { memset (crypto, 0, sizeof (tr_crypto)); crypto->isIncoming = isIncoming; tr_cryptoSetTorrentHash (crypto, torrentHash); } void tr_cryptoDestruct (tr_crypto * crypto) { tr_dh_secret_free (crypto->mySecret); tr_dh_free (crypto->dh); tr_rc4_free (crypto->enc_key); tr_rc4_free (crypto->dec_key); } /** *** **/ bool tr_cryptoComputeSecret (tr_crypto * crypto, const uint8_t * peerPublicKey) { ensureKeyExists (crypto); crypto->mySecret = tr_dh_agree (crypto->dh, peerPublicKey, KEY_LEN); return crypto->mySecret != NULL; } const uint8_t* tr_cryptoGetMyPublicKey (const tr_crypto * crypto, int * setme_len) { ensureKeyExists ((tr_crypto *) crypto); *setme_len = KEY_LEN; return crypto->myPublicKey; } /** *** **/ static void initRC4 (tr_crypto * crypto, tr_rc4_ctx_t * setme, const char * key) { uint8_t buf[SHA_DIGEST_LENGTH]; assert (crypto->torrentHashIsSet); if (*setme == NULL) *setme = tr_rc4_new (); if (tr_cryptoSecretKeySha1 (crypto, key, 4, crypto->torrentHash, SHA_DIGEST_LENGTH, buf)) tr_rc4_set_key (*setme, buf, SHA_DIGEST_LENGTH); } void tr_cryptoDecryptInit (tr_crypto * crypto) { uint8_t discard[1024]; const char * txt = crypto->isIncoming ? "keyA" : "keyB"; initRC4 (crypto, &crypto->dec_key, txt); tr_rc4_process (crypto->dec_key, discard, discard, sizeof (discard)); } void tr_cryptoDecrypt (tr_crypto * crypto, size_t buf_len, const void * buf_in, void * buf_out) { /* FIXME: someone calls this function with uninitialized key */ if (crypto->dec_key == NULL) { if (buf_in != buf_out) memmove (buf_out, buf_in, buf_len); return; } tr_rc4_process (crypto->dec_key, buf_in, buf_out, buf_len); } void tr_cryptoEncryptInit (tr_crypto * crypto) { uint8_t discard[1024]; const char * txt = crypto->isIncoming ? "keyB" : "keyA"; initRC4 (crypto, &crypto->enc_key, txt); tr_rc4_process (crypto->enc_key, discard, discard, sizeof (discard)); } void tr_cryptoEncrypt (tr_crypto * crypto, size_t buf_len, const void * buf_in, void * buf_out) { /* FIXME: someone calls this function with uninitialized key */ if (crypto->enc_key == NULL) { if (buf_in != buf_out) memmove (buf_out, buf_in, buf_len); return; } tr_rc4_process (crypto->enc_key, buf_in, buf_out, buf_len); } bool tr_cryptoSecretKeySha1 (const tr_crypto * crypto, const void * prepend_data, size_t prepend_data_size, const void * append_data, size_t append_data_size, uint8_t * hash) { assert (crypto != NULL); assert (crypto->mySecret != NULL); return tr_dh_secret_derive (crypto->mySecret, prepend_data, prepend_data_size, append_data, append_data_size, hash); } /** *** **/ void tr_cryptoSetTorrentHash (tr_crypto * crypto, const uint8_t * hash) { crypto->torrentHashIsSet = hash != NULL; if (hash) memcpy (crypto->torrentHash, hash, SHA_DIGEST_LENGTH); else memset (crypto->torrentHash, 0, SHA_DIGEST_LENGTH); } const uint8_t* tr_cryptoGetTorrentHash (const tr_crypto * crypto) { assert (crypto); return crypto->torrentHashIsSet ? crypto->torrentHash : NULL; } bool tr_cryptoHasTorrentHash (const tr_crypto * crypto) { assert (crypto); return crypto->torrentHashIsSet; } transmission-2.92/libtransmission/PaxHeaders.4960/Makefile.am0000644000000000000000000000013112662757243021147 xustar0030 mtime=1456201379.237861582 30 atime=1456201379.237861582 29 ctime=1457295919.54280013 transmission-2.92/libtransmission/Makefile.am0000644000175000017500000001435312662757243022603 0ustar00mikedldmikedld00000000000000AM_CPPFLAGS = \ -I$(top_srcdir) \ -D__TRANSMISSION__ \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" AM_CFLAGS = \ @DHT_CFLAGS@ \ @LIBB64_CFLAGS@ \ @LIBUTP_CFLAGS@ \ @LIBUPNP_CFLAGS@ \ @LIBNATPMP_CFLAGS@ \ @LIBEVENT_CFLAGS@ \ @LIBCURL_CFLAGS@ \ @CRYPTO_CFLAGS@ \ @PTHREAD_CFLAGS@ \ @ZLIB_CFLAGS@ noinst_LIBRARIES = libtransmission.a libtransmission_a_SOURCES = \ announcer.c \ announcer-http.c \ announcer-udp.c \ bandwidth.c \ bitfield.c \ blocklist.c \ cache.c \ clients.c \ completion.c \ ConvertUTF.c \ crypto.c \ crypto-utils.c \ crypto-utils-fallback.c \ error.c \ fdlimit.c \ file.c \ handshake.c \ history.c \ inout.c \ list.c \ log.c \ magnet.c \ makemeta.c \ metainfo.c \ natpmp.c \ net.c \ peer-io.c \ peer-mgr.c \ peer-msgs.c \ platform.c \ platform-quota.c \ port-forwarding.c \ ptrarray.c \ quark.c \ resume.c \ rpcimpl.c \ rpc-server.c \ session.c \ stats.c \ torrent.c \ torrent-ctor.c \ torrent-magnet.c \ tr-dht.c \ tr-lpd.c \ tr-udp.c \ tr-utp.c \ tr-getopt.c \ trevent.c \ upnp.c \ utils.c \ variant.c \ variant-benc.c \ variant-json.c \ verify.c \ watchdir.c \ watchdir-generic.c \ web.c \ webseed.c \ wildmat.c if USE_INOTIFY libtransmission_a_SOURCES += watchdir-inotify.c AM_CPPFLAGS += -DWITH_INOTIFY endif if USE_KQUEUE libtransmission_a_SOURCES += watchdir-kqueue.c AM_CPPFLAGS += -DWITH_KQUEUE endif if WIN32 libtransmission_a_SOURCES += file-win32.c watchdir-win32.c else libtransmission_a_SOURCES += file-posix.c endif if CRYPTO_USE_OPENSSL libtransmission_a_SOURCES += crypto-utils-openssl.c endif if CRYPTO_USE_CYASSL libtransmission_a_SOURCES += crypto-utils-cyassl.c endif if CRYPTO_USE_POLARSSL libtransmission_a_SOURCES += crypto-utils-polarssl.c endif noinst_HEADERS = \ announcer.h \ announcer-common.h \ bandwidth.h \ bitfield.h \ blocklist.h \ cache.h \ clients.h \ ConvertUTF.h \ crypto.h \ crypto-utils.h \ completion.h \ error.h \ error-types.h \ fdlimit.h \ file.h \ handshake.h \ history.h \ inout.h \ jsonsl.c \ jsonsl.h \ libtransmission-test.h \ list.h \ log.h \ magnet.h \ makemeta.h \ metainfo.h \ natpmp_local.h \ net.h \ peer-common.h \ peer-io.h \ peer-mgr.h \ peer-msgs.h \ platform.h \ platform-quota.h \ port-forwarding.h \ ptrarray.h \ quark.h \ resume.h \ rpcimpl.h \ rpc-server.h \ session.h \ stats.h \ torrent.h \ torrent-magnet.h \ tr-getopt.h \ transmission.h \ tr-dht.h \ tr-udp.h \ tr-utp.h \ tr-lpd.h \ trevent.h \ upnp.h \ utils.h \ variant.h \ variant-common.h \ verify.h \ version.h \ watchdir.h \ watchdir-common.h \ web.h \ webseed.h TESTS = \ bitfield-test \ blocklist-test \ clients-test \ crypto-test \ error-test \ file-test \ history-test \ json-test \ magnet-test \ makemeta-test \ metainfo-test \ move-test \ peer-msgs-test \ quark-test \ rename-test \ rpc-test \ session-test \ tr-getopt-test \ utils-test \ variant-test \ watchdir-test \ watchdir-generic-test noinst_PROGRAMS = $(TESTS) apps_ldadd = \ ./libtransmission.a \ @LIBUPNP_LIBS@ \ @LIBNATPMP_LIBS@ \ @INTLLIBS@ \ @DHT_LIBS@ \ @LIBB64_LIBS@ \ @LIBUTP_LIBS@ \ @LIBCURL_LIBS@ \ @LIBEVENT_LIBS@ \ @CRYPTO_LIBS@ \ @PTHREAD_LIBS@ \ @ZLIB_LIBS@ \ ${LIBM} TEST_SOURCES = libtransmission-test.c bitfield_test_SOURCES = bitfield-test.c $(TEST_SOURCES) bitfield_test_LDADD = ${apps_ldadd} bitfield_test_LDFLAGS = ${apps_ldflags} blocklist_test_SOURCES = blocklist-test.c $(TEST_SOURCES) blocklist_test_LDADD = ${apps_ldadd} blocklist_test_LDFLAGS = ${apps_ldflags} clients_test_SOURCES = clients-test.c $(TEST_SOURCES) clients_test_LDADD = ${apps_ldadd} clients_test_LDFLAGS = ${apps_ldflags} crypto_test_SOURCES = crypto-test.c crypto-test-ref.h $(TEST_SOURCES) crypto_test_LDADD = ${apps_ldadd} crypto_test_LDFLAGS = ${apps_ldflags} error_test_SOURCES = error-test.c $(TEST_SOURCES) error_test_LDADD = ${apps_ldadd} error_test_LDFLAGS = ${apps_ldflags} file_test_SOURCES = file-test.c $(TEST_SOURCES) file_test_LDADD = ${apps_ldadd} file_test_LDFLAGS = ${apps_ldflags} history_test_SOURCES = history-test.c $(TEST_SOURCES) history_test_LDADD = ${apps_ldadd} history_test_LDFLAGS = ${apps_ldflags} json_test_SOURCES = json-test.c $(TEST_SOURCES) json_test_LDADD = ${apps_ldadd} json_test_LDFLAGS = ${apps_ldflags} quark_test_SOURCES = quark-test.c $(TEST_SOURCES) quark_test_LDADD = ${apps_ldadd} quark_test_LDFLAGS = ${apps_ldflags} magnet_test_SOURCES = magnet-test.c $(TEST_SOURCES) magnet_test_LDADD = ${apps_ldadd} magnet_test_LDFLAGS = ${apps_ldflags} metainfo_test_SOURCES = metainfo-test.c $(TEST_SOURCES) metainfo_test_LDADD = ${apps_ldadd} metainfo_test_LDFLAGS = ${apps_ldflags} makemeta_test_SOURCES = makemeta-test.c $(TEST_SOURCES) makemeta_test_LDADD = ${apps_ldadd} makemeta_test_LDFLAGS = ${apps_ldflags} move_test_SOURCES = move-test.c $(TEST_SOURCES) move_test_LDADD = ${apps_ldadd} move_test_LDFLAGS = ${apps_ldflags} peer_msgs_test_SOURCES = peer-msgs-test.c $(TEST_SOURCES) peer_msgs_test_LDADD = ${apps_ldadd} peer_msgs_test_LDFLAGS = ${apps_ldflags} rpc_test_SOURCES = rpc-test.c $(TEST_SOURCES) rpc_test_LDADD = ${apps_ldadd} rpc_test_LDFLAGS = ${apps_ldflags} session_test_SOURCES = session-test.c $(TEST_SOURCES) session_test_LDADD = ${apps_ldadd} session_test_LDFLAGS = ${apps_ldflags} tr_getopt_test_SOURCES = tr-getopt-test.c $(TEST_SOURCES) tr_getopt_test_LDADD = ${apps_ldadd} tr_getopt_test_LDFLAGS = ${apps_ldflags} utils_test_SOURCES = utils-test.c $(TEST_SOURCES) utils_test_LDADD = ${apps_ldadd} utils_test_LDFLAGS = ${apps_ldflags} variant_test_SOURCES = variant-test.c $(TEST_SOURCES) variant_test_LDADD = ${apps_ldadd} variant_test_LDFLAGS = ${apps_ldflags} watchdir_test_SOURCES = watchdir-test.c $(TEST_SOURCES) watchdir_test_LDADD = ${apps_ldadd} watchdir_test_LDFLAGS = ${apps_ldflags} watchdir_generic_test_SOURCES = watchdir-test.c $(TEST_SOURCES) watchdir_generic_test_LDADD = ${apps_ldadd} watchdir_generic_test_LDFLAGS = ${apps_ldflags} watchdir_generic_test_CPPFLAGS = -DWATCHDIR_TEST_FORCE_GENERIC $(AM_CPPFLAGS) rename_test_SOURCES = rename-test.c $(TEST_SOURCES) rename_test_LDADD = ${apps_ldadd} rename_test_LDFLAGS = ${apps_ldflags} transmission-2.92/libtransmission/PaxHeaders.4960/variant-json.c0000644000000000000000000000013012641272401021652 xustar0029 mtime=1451586817.57487848 29 atime=1451586817.57487848 30 ctime=1457295920.224811727 transmission-2.92/libtransmission/variant-json.c0000644000175000017500000004050212641272401023302 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: variant-json.c 14644 2015-12-29 19:37:31Z mikedld $ */ #include #include #include /* fabs() */ #include #include #include /* EILSEQ, EINVAL */ #include /* evbuffer_add() */ #include /* evutil_strtoll () */ #define JSONSL_STATE_USER_FIELDS /* no fields */ #include "jsonsl.h" #include "jsonsl.c" #define __LIBTRANSMISSION_VARIANT_MODULE__ #include "transmission.h" #include "ConvertUTF.h" #include "list.h" #include "log.h" #include "ptrarray.h" #include "utils.h" #include "variant.h" #include "variant-common.h" /* arbitrary value... this is much deeper than our code goes */ #define MAX_DEPTH 64 struct json_wrapper_data { int error; bool has_content; tr_variant * top; const char * key; size_t keylen; struct evbuffer * keybuf; struct evbuffer * strbuf; const char * source; tr_ptrArray stack; }; static tr_variant* get_node (struct jsonsl_st * jsn) { tr_variant * parent; tr_variant * node = NULL; struct json_wrapper_data * data = jsn->data; parent = tr_ptrArrayEmpty (&data->stack) ? NULL : tr_ptrArrayBack (&data->stack); if (!parent) { node = data->top; } else if (tr_variantIsList (parent)) { node = tr_variantListAdd (parent); } else if (tr_variantIsDict (parent) && (data->key!=NULL)) { node = tr_variantDictAdd (parent, tr_quark_new (data->key, data->keylen)); data->key = NULL; data->keylen = 0; } return node; } static void error_handler (jsonsl_t jsn, jsonsl_error_t error, struct jsonsl_state_st * state UNUSED, const jsonsl_char_t * buf) { struct json_wrapper_data * data = jsn->data; if (data->source) { tr_logAddError ("JSON parse failed in %s at pos %zu: %s -- remaining text \"%.16s\"", data->source, jsn->pos, jsonsl_strerror (error), buf); } else { tr_logAddError ("JSON parse failed at pos %zu: %s -- remaining text \"%.16s\"", jsn->pos, jsonsl_strerror (error), buf); } data->error = EILSEQ; } static int error_callback (jsonsl_t jsn, jsonsl_error_t error, struct jsonsl_state_st * state, jsonsl_char_t * at) { error_handler (jsn, error, state, at); return 0; /* bail */ } static void action_callback_PUSH (jsonsl_t jsn, jsonsl_action_t action UNUSED, struct jsonsl_state_st * state, const jsonsl_char_t * buf UNUSED) { tr_variant * node; struct json_wrapper_data * data = jsn->data; switch (state->type) { case JSONSL_T_LIST: data->has_content = true; node = get_node (jsn); tr_variantInitList (node, 0); tr_ptrArrayAppend (&data->stack, node); break; case JSONSL_T_OBJECT: data->has_content = true; node = get_node (jsn); tr_variantInitDict (node, 0); tr_ptrArrayAppend (&data->stack, node); break; default: /* nothing else interesting on push */ break; } } /* like sscanf(in+2, "%4x", &val) but less slow */ static bool decode_hex_string (const char * in, unsigned int * setme) { unsigned int val = 0; const char * const end = in + 6; assert (in != NULL); assert (in[0] == '\\'); assert (in[1] == 'u'); in += 2; do { val <<= 4; if (('0'<=*in) && (*in<='9')) val += (*in-'0'); else if (('a'<=*in) && (*in<='f')) val += (*in-'a') + 10u; else if (('A'<=*in) && (*in<='F')) val += (*in-'A') + 10u; else return false; } while (++in != end); *setme = val; return true; } static char* extract_escaped_string (const char * in, size_t in_len, size_t * len, struct evbuffer * buf) { const char * const in_end = in + in_len; evbuffer_drain (buf, evbuffer_get_length (buf)); while (in < in_end) { bool unescaped = false; if (*in=='\\' && in_end-in>=2) { switch (in[1]) { case 'b' : evbuffer_add (buf, "\b", 1); in+=2; unescaped = true; break; case 'f' : evbuffer_add (buf, "\f", 1); in+=2; unescaped = true; break; case 'n' : evbuffer_add (buf, "\n", 1); in+=2; unescaped = true; break; case 'r' : evbuffer_add (buf, "\r", 1); in+=2; unescaped = true; break; case 't' : evbuffer_add (buf, "\t", 1); in+=2; unescaped = true; break; case '/' : evbuffer_add (buf, "/" , 1); in+=2; unescaped = true; break; case '"' : evbuffer_add (buf, "\"" , 1); in+=2; unescaped = true; break; case '\\': evbuffer_add (buf, "\\", 1); in+=2; unescaped = true; break; case 'u': { if (in_end - in >= 6) { unsigned int val = 0; if (decode_hex_string (in, &val)) { UTF32 str32_buf[2] = { val, 0 }; const UTF32 * str32_walk = str32_buf; const UTF32 * str32_end = str32_buf + 1; UTF8 str8_buf[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; UTF8 * str8_walk = str8_buf; UTF8 * str8_end = str8_buf + 8; if (ConvertUTF32toUTF8 (&str32_walk, str32_end, &str8_walk, str8_end, 0) == 0) { const size_t len = str8_walk - str8_buf; evbuffer_add (buf, str8_buf, len); unescaped = true; } in += 6; break; } } } } } if (!unescaped) { evbuffer_add (buf, in, 1); ++in; } } *len = evbuffer_get_length (buf); return (char*) evbuffer_pullup (buf, -1); } static const char * extract_string (jsonsl_t jsn, struct jsonsl_state_st * state, size_t * len, struct evbuffer * buf) { const char * ret; const char * in_begin; const char * in_end; size_t in_len; /* figure out where the string is */ in_begin = jsn->base + state->pos_begin; if (*in_begin == '"') in_begin++; in_end = jsn->base + state->pos_cur; in_len = in_end - in_begin; if (memchr (in_begin, '\\', in_len) == NULL) { /* it's not escaped */ ret = in_begin; *len = in_len; } else { ret = extract_escaped_string (in_begin, in_len, len, buf); } return ret; } static void action_callback_POP (jsonsl_t jsn, jsonsl_action_t action UNUSED, struct jsonsl_state_st * state, const jsonsl_char_t * buf UNUSED) { struct json_wrapper_data * data = jsn->data; if (state->type == JSONSL_T_STRING) { size_t len; const char * str = extract_string (jsn, state, &len, data->strbuf); tr_variantInitStr (get_node (jsn), str, len); data->has_content = true; } else if (state->type == JSONSL_T_HKEY) { data->has_content = true; data->key = extract_string (jsn, state, &data->keylen, data->keybuf); } else if ((state->type == JSONSL_T_LIST) || (state->type == JSONSL_T_OBJECT)) { tr_ptrArrayPop (&data->stack); } else if (state->type == JSONSL_T_SPECIAL) { if (state->special_flags & JSONSL_SPECIALf_NUMNOINT) { const char * begin = jsn->base + state->pos_begin; data->has_content = true; tr_variantInitReal (get_node (jsn), strtod (begin, NULL)); } else if (state->special_flags & JSONSL_SPECIALf_NUMERIC) { const char * begin = jsn->base + state->pos_begin; data->has_content = true; tr_variantInitInt (get_node (jsn), evutil_strtoll (begin, NULL, 10)); } else if (state->special_flags & JSONSL_SPECIALf_BOOLEAN) { const bool b = (state->special_flags & JSONSL_SPECIALf_TRUE) != 0; data->has_content = true; tr_variantInitBool (get_node (jsn), b); } else if (state->special_flags & JSONSL_SPECIALf_NULL) { data->has_content = true; tr_variantInitQuark (get_node (jsn), TR_KEY_NONE); } } } int tr_jsonParse (const char * source, const void * vbuf, size_t len, tr_variant * setme_variant, const char ** setme_end) { int error; jsonsl_t jsn; struct json_wrapper_data data; jsn = jsonsl_new (MAX_DEPTH); jsn->action_callback_PUSH = action_callback_PUSH; jsn->action_callback_POP = action_callback_POP; jsn->error_callback = error_callback; jsn->data = &data; jsonsl_enable_all_callbacks (jsn); data.error = 0; data.has_content = false; data.key = NULL; data.top = setme_variant; data.stack = TR_PTR_ARRAY_INIT; data.source = source; data.keybuf = evbuffer_new (); data.strbuf = evbuffer_new (); /* parse it */ jsonsl_feed (jsn, vbuf, len); /* EINVAL if there was no content */ if (!data.error && !data.has_content) data.error = EINVAL; /* maybe set the end ptr */ if (setme_end) *setme_end = ((const char*)vbuf) + jsn->pos; /* cleanup */ error = data.error; evbuffer_free (data.keybuf); evbuffer_free (data.strbuf); tr_ptrArrayDestruct (&data.stack, NULL); jsonsl_destroy (jsn); return error; } /**** ***** ****/ struct ParentState { int variantType; int childIndex; int childCount; }; struct jsonWalk { bool doIndent; tr_list * parents; struct evbuffer * out; }; static void jsonIndent (struct jsonWalk * data) { static char buf[1024] = { '\0' }; if (!*buf) { memset (buf, ' ', sizeof(buf)); buf[0] = '\n'; } if (data->doIndent) evbuffer_add (data->out, buf, tr_list_size(data->parents)*4 + 1); } static void jsonChildFunc (struct jsonWalk * data) { if (data->parents && data->parents->data) { struct ParentState * pstate = data->parents->data; switch (pstate->variantType) { case TR_VARIANT_TYPE_DICT: { const int i = pstate->childIndex++; if (! (i % 2)) { evbuffer_add (data->out, ": ", data->doIndent ? 2 : 1); } else { const bool isLast = pstate->childIndex == pstate->childCount; if (!isLast) { evbuffer_add (data->out, ",", 1); jsonIndent (data); } } break; } case TR_VARIANT_TYPE_LIST: { const bool isLast = ++pstate->childIndex == pstate->childCount; if (!isLast) { evbuffer_add (data->out, ",", 1); jsonIndent (data); } break; } default: break; } } } static void jsonPushParent (struct jsonWalk * data, const tr_variant * v) { struct ParentState * pstate = tr_new (struct ParentState, 1); pstate->variantType = v->type; pstate->childIndex = 0; pstate->childCount = v->val.l.count; if (tr_variantIsDict (v)) pstate->childCount *= 2; tr_list_prepend (&data->parents, pstate); } static void jsonPopParent (struct jsonWalk * data) { tr_free (tr_list_pop_front (&data->parents)); } static void jsonIntFunc (const tr_variant * val, void * vdata) { struct jsonWalk * data = vdata; evbuffer_add_printf (data->out, "%" PRId64, val->val.i); jsonChildFunc (data); } static void jsonBoolFunc (const tr_variant * val, void * vdata) { struct jsonWalk * data = vdata; if (val->val.b) evbuffer_add (data->out, "true", 4); else evbuffer_add (data->out, "false", 5); jsonChildFunc (data); } static void jsonRealFunc (const tr_variant * val, void * vdata) { struct jsonWalk * data = vdata; if (fabs (val->val.d - (int)val->val.d) < 0.00001) evbuffer_add_printf (data->out, "%d", (int)val->val.d); else evbuffer_add_printf (data->out, "%.4f", tr_truncd (val->val.d, 4)); jsonChildFunc (data); } static void jsonStringFunc (const tr_variant * val, void * vdata) { char * out; char * outwalk; char * outend; struct evbuffer_iovec vec[1]; struct jsonWalk * data = vdata; const char * str; size_t len; const unsigned char * it; const unsigned char * end; tr_variantGetStr (val, &str, &len); it = (const unsigned char *) str; end = it + len; evbuffer_reserve_space (data->out, len * 4, vec, 1); out = vec[0].iov_base; outend = out + vec[0].iov_len; outwalk = out; *outwalk++ = '"'; for (; it!=end; ++it) { switch (*it) { case '\b': *outwalk++ = '\\'; *outwalk++ = 'b'; break; case '\f': *outwalk++ = '\\'; *outwalk++ = 'f'; break; case '\n': *outwalk++ = '\\'; *outwalk++ = 'n'; break; case '\r': *outwalk++ = '\\'; *outwalk++ = 'r'; break; case '\t': *outwalk++ = '\\'; *outwalk++ = 't'; break; case '"' : *outwalk++ = '\\'; *outwalk++ = '"'; break; case '\\': *outwalk++ = '\\'; *outwalk++ = '\\'; break; default: if (isprint (*it)) { *outwalk++ = *it; } else { const UTF8 * tmp = it; UTF32 buf[1] = { 0 }; UTF32 * u32 = buf; ConversionResult result = ConvertUTF8toUTF32 (&tmp, end, &u32, buf + 1, 0); if (((result==conversionOK) || (result==targetExhausted)) && (tmp!=it)) { outwalk += tr_snprintf (outwalk, outend-outwalk, "\\u%04x", (unsigned int)buf[0]); it = tmp - 1; } } break; } } *outwalk++ = '"'; vec[0].iov_len = outwalk - out; evbuffer_commit_space (data->out, vec, 1); jsonChildFunc (data); } static void jsonDictBeginFunc (const tr_variant * val, void * vdata) { struct jsonWalk * data = vdata; jsonPushParent (data, val); evbuffer_add (data->out, "{", 1); if (val->val.l.count) jsonIndent (data); } static void jsonListBeginFunc (const tr_variant * val, void * vdata) { const size_t nChildren = tr_variantListSize (val); struct jsonWalk * data = vdata; jsonPushParent (data, val); evbuffer_add (data->out, "[", 1); if (nChildren) jsonIndent (data); } static void jsonContainerEndFunc (const tr_variant * val, void * vdata) { struct jsonWalk * data = vdata; bool emptyContainer = false; jsonPopParent (data); if (!emptyContainer) jsonIndent (data); if (tr_variantIsDict (val)) evbuffer_add (data->out, "}", 1); else /* list */ evbuffer_add (data->out, "]", 1); jsonChildFunc (data); } static const struct VariantWalkFuncs walk_funcs = { jsonIntFunc, jsonBoolFunc, jsonRealFunc, jsonStringFunc, jsonDictBeginFunc, jsonListBeginFunc, jsonContainerEndFunc }; void tr_variantToBufJson (const tr_variant * top, struct evbuffer * buf, bool lean) { struct jsonWalk data; data.doIndent = !lean; data.out = buf; data.parents = NULL; tr_variantWalk (top, &walk_funcs, &data, true); if (evbuffer_get_length (buf)) evbuffer_add_printf (buf, "\n"); } transmission-2.92/libtransmission/PaxHeaders.4960/version.h.in0000644000000000000000000000013212505250244021340 xustar0030 mtime=1427460260.488244333 30 atime=1427460260.488244333 30 ctime=1457295917.355762939 transmission-2.92/libtransmission/version.h.in0000644000175000017500000000127512505250244022772 0ustar00mikedldmikedld00000000000000#ifndef TR_VERSION_H #define TR_VERSION_H #define PEERID_PREFIX "${TR_PEER_ID_PREFIX}" #define USERAGENT_PREFIX "${TR_USER_AGENT_PREFIX}" #define SVN_REVISION "${TR_SCM_REVISION}" #define SVN_REVISION_NUM ${TR_SCM_REVISION} #define SHORT_VERSION_STRING "${TR_USER_AGENT_PREFIX}" #define LONG_VERSION_STRING "${TR_USER_AGENT_PREFIX} (${TR_SCM_REVISION})" #define VERSION_STRING_INFOPLIST ${TR_USER_AGENT_PREFIX} #define MAJOR_VERSION ${TR_VERSION_MAJOR} #define MINOR_VERSION ${TR_VERSION_MINOR} #cmakedefine TR_BETA_RELEASE 1 #cmakedefine TR_NIGHTLY_RELEASE 1 #cmakedefine TR_STABLE_RELEASE 1 #endif /* TR_VERSION_H */ transmission-2.92/libtransmission/PaxHeaders.4960/log.c0000644000000000000000000000013212634073127020030 xustar0030 mtime=1450210903.499466997 30 atime=1450210903.499466997 30 ctime=1457295920.035808513 transmission-2.92/libtransmission/log.c0000644000175000017500000001432112634073127021456 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: log.c 14620 2015-12-13 10:34:53Z mikedld $ */ #include #include #include #include #include "transmission.h" #include "file.h" #include "log.h" #include "platform.h" /* tr_lock */ #include "utils.h" tr_log_level __tr_message_level = TR_LOG_ERROR; static bool myQueueEnabled = false; static tr_log_message * myQueue = NULL; static tr_log_message ** myQueueTail = &myQueue; static int myQueueLength = 0; #ifndef _WIN32 /* make null versions of these win32 functions */ static inline int IsDebuggerPresent (void) { return false; } static inline void OutputDebugStringA (const void * unused UNUSED) { } #endif /*** **** ***/ tr_log_level tr_logGetLevel (void) { return __tr_message_level; } /*** **** ***/ static tr_lock* getMessageLock (void) { static tr_lock * l = NULL; if (!l) l = tr_lockNew (); return l; } tr_sys_file_t tr_logGetFile (void) { static bool initialized = false; static tr_sys_file_t file = TR_BAD_SYS_FILE; if (!initialized) { const int fd = tr_env_get_int ("TR_DEBUG_FD", 0); switch (fd) { case 1: file = tr_sys_file_get_std (TR_STD_SYS_FILE_OUT, NULL); break; case 2: file = tr_sys_file_get_std (TR_STD_SYS_FILE_ERR, NULL); break; } initialized = true; } return file; } void tr_logSetLevel (tr_log_level level) { __tr_message_level = level; } void tr_logSetQueueEnabled (bool isEnabled) { assert (tr_isBool (isEnabled)); myQueueEnabled = isEnabled; } bool tr_logGetQueueEnabled (void) { return myQueueEnabled; } tr_log_message * tr_logGetQueue (void) { tr_log_message * ret; tr_lockLock (getMessageLock ()); ret = myQueue; myQueue = NULL; myQueueTail = &myQueue; myQueueLength = 0; tr_lockUnlock (getMessageLock ()); return ret; } void tr_logFreeQueue (tr_log_message * list) { tr_log_message * next; while (NULL != list) { next = list->next; tr_free (list->message); tr_free (list->name); tr_free (list); list = next; } } /** *** **/ char* tr_logGetTimeStr (char * buf, size_t buflen) { char tmp[64]; struct tm now_tm; struct timeval tv; time_t seconds; int milliseconds; tr_gettimeofday (&tv); seconds = tv.tv_sec; tr_localtime_r (&seconds, &now_tm); strftime (tmp, sizeof (tmp), "%Y-%m-%d %H:%M:%S.%%03d", &now_tm); milliseconds = tv.tv_usec / 1000; tr_snprintf (buf, buflen, tmp, milliseconds); return buf; } bool tr_logGetDeepEnabled (void) { static int8_t deepLoggingIsActive = -1; if (deepLoggingIsActive < 0) deepLoggingIsActive = IsDebuggerPresent () || (tr_logGetFile () != TR_BAD_SYS_FILE); return deepLoggingIsActive != 0; } void tr_logAddDeep (const char * file, int line, const char * name, const char * fmt, ...) { const tr_sys_file_t fp = tr_logGetFile (); if (fp != TR_BAD_SYS_FILE || IsDebuggerPresent ()) { va_list args; char timestr[64]; char * message; size_t message_len; struct evbuffer * buf = evbuffer_new (); char * base = tr_sys_path_basename (file, NULL); evbuffer_add_printf (buf, "[%s] ", tr_logGetTimeStr (timestr, sizeof (timestr))); if (name) evbuffer_add_printf (buf, "%s ", name); va_start (args, fmt); evbuffer_add_vprintf (buf, fmt, args); va_end (args); evbuffer_add_printf (buf, " (%s:%d)" TR_NATIVE_EOL_STR, base, line); /* FIXME (libevent2) ifdef this out for nonwindows platforms */ message = evbuffer_free_to_str (buf, &message_len); OutputDebugStringA (message); if (fp != TR_BAD_SYS_FILE) tr_sys_file_write (fp, message, message_len, NULL, NULL); tr_free (message); tr_free (base); } } /*** **** ***/ void tr_logAddMessage (const char * file, int line, tr_log_level level, const char * name, const char * fmt, ...) { const int err = errno; /* message logging shouldn't affect errno */ char buf[1024]; int buf_len; va_list ap; tr_lockLock (getMessageLock ()); /* build the text message */ *buf = '\0'; va_start (ap, fmt); buf_len = evutil_vsnprintf (buf, sizeof (buf), fmt, ap); va_end (ap); if (buf_len < 0) return; #ifdef _WIN32 if ((size_t) buf_len < sizeof (buf) - 3) { buf[buf_len + 0] = '\r'; buf[buf_len + 1] = '\n'; buf[buf_len + 2] = '\0'; OutputDebugStringA (buf); buf[buf_len + 0] = '\0'; } else { OutputDebugStringA (buf); } #endif if (*buf) { if (tr_logGetQueueEnabled ()) { tr_log_message * newmsg; newmsg = tr_new0 (tr_log_message, 1); newmsg->level = level; newmsg->when = tr_time (); newmsg->message = tr_strdup (buf); newmsg->file = file; newmsg->line = line; newmsg->name = tr_strdup (name); *myQueueTail = newmsg; myQueueTail = &newmsg->next; ++myQueueLength; if (myQueueLength > TR_LOG_MAX_QUEUE_LENGTH) { tr_log_message * old = myQueue; myQueue = old->next; old->next = NULL; tr_logFreeQueue (old); --myQueueLength; assert (myQueueLength == TR_LOG_MAX_QUEUE_LENGTH); } } else { tr_sys_file_t fp; char timestr[64]; fp = tr_logGetFile (); if (fp == TR_BAD_SYS_FILE) fp = tr_sys_file_get_std (TR_STD_SYS_FILE_ERR, NULL); tr_logGetTimeStr (timestr, sizeof (timestr)); if (name) tr_sys_file_write_fmt (fp, "[%s] %s: %s" TR_NATIVE_EOL_STR, NULL, timestr, name, buf); else tr_sys_file_write_fmt (fp, "[%s] %s" TR_NATIVE_EOL_STR, NULL, timestr, buf); tr_sys_file_flush (fp, NULL); } } tr_lockUnlock (getMessageLock ()); errno = err; } transmission-2.92/libtransmission/PaxHeaders.4960/blocklist-test.c0000644000000000000000000000013212612560132022203 xustar0030 mtime=1445650522.620234658 30 atime=1445650522.620234658 30 ctime=1457295920.260812339 transmission-2.92/libtransmission/blocklist-test.c0000644000175000017500000001102512612560132023627 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: blocklist-test.c 14382 2014-12-13 15:22:39Z mikedld $ */ #include #include #include /* strlen () */ #include "transmission.h" #include "blocklist.h" #include "file.h" #include "net.h" #include "session.h" /* tr_sessionIsAddressBlocked() */ #include "utils.h" #include "libtransmission-test.h" static const char * contents1 = "Austin Law Firm:216.16.1.144-216.16.1.151\n" "Sargent Controls and Aerospace:216.19.18.0-216.19.18.255\n" "Corel Corporation:216.21.157.192-216.21.157.223\n" "Fox Speed Channel:216.79.131.192-216.79.131.223\n"; static const char * contents2 = "Austin Law Firm:216.16.1.144-216.16.1.151\n" "Sargent Controls and Aerospace:216.19.18.0-216.19.18.255\n" "Corel Corporation:216.21.157.192-216.21.157.223\n" "Fox Speed Channel:216.79.131.192-216.79.131.223\n" "Evilcorp:216.88.88.0-216.88.88.255\n"; static void create_text_file (const char * path, const char * contents) { tr_sys_file_t fd; char * dir; dir = tr_sys_path_dirname (path, NULL); tr_sys_dir_create (dir, TR_SYS_DIR_CREATE_PARENTS, 0700, NULL); tr_free (dir); fd = tr_sys_file_open (path, TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE | TR_SYS_FILE_TRUNCATE, 0600, NULL); tr_sys_file_write (fd, contents, strlen (contents), NULL, NULL); tr_sys_file_close (fd, NULL); libttest_sync (); } static bool address_is_blocked (tr_session * session, const char * address_str) { struct tr_address addr; tr_address_from_string (&addr, address_str); return tr_sessionIsAddressBlocked (session, &addr); } static int test_parsing (void) { char * path; tr_session * session; /* init the session */ session = libttest_session_init (NULL); check (!tr_blocklistExists (session)); check_int_eq (0, tr_blocklistGetRuleCount (session)); /* init the blocklist */ path = tr_buildPath (tr_sessionGetConfigDir(session), "blocklists", "level1", NULL); create_text_file (path, contents1); tr_free (path); tr_sessionReloadBlocklists (session); check (tr_blocklistExists (session)); check_int_eq (4, tr_blocklistGetRuleCount (session)); /* enable the blocklist */ check (!tr_blocklistIsEnabled (session)); tr_blocklistSetEnabled (session, true); check (tr_blocklistIsEnabled (session)); /* test blocked addresses */ check (!address_is_blocked (session, "216.16.1.143")); check ( address_is_blocked (session, "216.16.1.144")); check ( address_is_blocked (session, "216.16.1.145")); check ( address_is_blocked (session, "216.16.1.146")); check ( address_is_blocked (session, "216.16.1.147")); check ( address_is_blocked (session, "216.16.1.148")); check ( address_is_blocked (session, "216.16.1.149")); check ( address_is_blocked (session, "216.16.1.150")); check ( address_is_blocked (session, "216.16.1.151")); check (!address_is_blocked (session, "216.16.1.152")); check (!address_is_blocked (session, "216.16.1.153")); check (!address_is_blocked (session, "217.0.0.1")); check (!address_is_blocked (session, "255.0.0.1")); /* cleanup */ libttest_session_close (session); return 0; } /*** **** ***/ static int test_updating (void) { char * path; tr_session * session; /* init the session */ session = libttest_session_init (NULL); path = tr_buildPath (tr_sessionGetConfigDir(session), "blocklists", "level1", NULL); /* no blocklist to start with... */ check_int_eq (0, tr_blocklistGetRuleCount (session)); /* test that updated source files will get loaded */ create_text_file (path, contents1); tr_sessionReloadBlocklists (session); check_int_eq (4, tr_blocklistGetRuleCount (session)); /* test that updated source files will get loaded */ create_text_file (path, contents2); tr_sessionReloadBlocklists (session); check_int_eq (5, tr_blocklistGetRuleCount (session)); /* test that updated source files will get loaded */ create_text_file (path, contents1); tr_sessionReloadBlocklists (session); check_int_eq (4, tr_blocklistGetRuleCount (session)); /* ensure that new files, if bad, get skipped */ create_text_file (path, "# nothing useful\n"); tr_sessionReloadBlocklists (session); check_int_eq (4, tr_blocklistGetRuleCount (session)); /* cleanup */ libttest_session_close (session); tr_free (path); return 0; } /*** **** ***/ int main (void) { const testFunc tests[] = { test_parsing, test_updating }; return runTests (tests, NUM_TESTS (tests)); } transmission-2.92/libtransmission/PaxHeaders.4960/quark.h0000644000000000000000000000013212544044705020377 xustar0030 mtime=1435519429.613528096 30 atime=1435519429.613528096 30 ctime=1457295919.768803973 transmission-2.92/libtransmission/quark.h0000644000175000017500000002461412544044705022033 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: quark.h 14369 2014-12-10 18:58:12Z mikedld $ */ #ifndef TR_QUARK_H #define TR_QUARK_H 1 #ifdef __cplusplus extern "C" { #endif /* Quarks — a 2-way association between a string and a unique integer identifier */ typedef size_t tr_quark; /* * Predefined Quarks. * * TODO: it would be nice to clean up all the naming inconsistencies * between RPC and settings. This will be a mess and we shouldn't be * in a hurry to do it. */ enum { TR_KEY_NONE, /* represented as an empty string */ TR_KEY_activeTorrentCount, /* rpc */ TR_KEY_activity_date, /* resume file */ TR_KEY_activityDate, /* rpc */ TR_KEY_added, /* pex */ TR_KEY_added_date, /* rpc */ TR_KEY_added_f, /* pex */ TR_KEY_added6, /* pex */ TR_KEY_added6_f, /* pex */ TR_KEY_addedDate, /* rpc */ TR_KEY_address, /* rpc */ TR_KEY_alt_speed_down, /* rpc, settings */ TR_KEY_alt_speed_enabled, /* rpc, settings */ TR_KEY_alt_speed_time_begin, /* rpc, settings */ TR_KEY_alt_speed_time_day, /* rpc, settings */ TR_KEY_alt_speed_time_enabled, /* rpc, settings */ TR_KEY_alt_speed_time_end, /* rpc, settings */ TR_KEY_alt_speed_up, /* rpc, settings */ TR_KEY_announce, /* metainfo */ TR_KEY_announce_list, /* metainfo */ TR_KEY_announceState, /* rpc */ TR_KEY_arguments, /* rpc */ TR_KEY_bandwidth_priority, TR_KEY_bandwidthPriority, TR_KEY_bind_address_ipv4, TR_KEY_bind_address_ipv6, TR_KEY_bitfield, TR_KEY_blocklist_date, TR_KEY_blocklist_enabled, TR_KEY_blocklist_size, TR_KEY_blocklist_updates_enabled, TR_KEY_blocklist_url, TR_KEY_blocks, TR_KEY_bytesCompleted, TR_KEY_cache_size_mb, TR_KEY_clientIsChoked, TR_KEY_clientIsInterested, TR_KEY_clientName, TR_KEY_comment, TR_KEY_comment_utf_8, TR_KEY_compact_view, TR_KEY_complete, TR_KEY_config_dir, TR_KEY_cookies, TR_KEY_corrupt, TR_KEY_corruptEver, TR_KEY_created_by, TR_KEY_created_by_utf_8, TR_KEY_creation_date, TR_KEY_creator, TR_KEY_cumulative_stats, TR_KEY_current_stats, TR_KEY_date, TR_KEY_dateCreated, TR_KEY_delete_local_data, TR_KEY_desiredAvailable, TR_KEY_destination, TR_KEY_dht_enabled, TR_KEY_display_name, TR_KEY_dnd, TR_KEY_done_date, TR_KEY_doneDate, TR_KEY_download_dir, TR_KEY_download_dir_free_space, TR_KEY_download_queue_enabled, TR_KEY_download_queue_size, TR_KEY_downloadCount, TR_KEY_downloadDir, TR_KEY_downloadLimit, TR_KEY_downloadLimited, TR_KEY_downloadSpeed, TR_KEY_downloaded, TR_KEY_downloaded_bytes, TR_KEY_downloadedBytes, TR_KEY_downloadedEver, TR_KEY_downloaders, TR_KEY_downloading_time_seconds, TR_KEY_dropped, TR_KEY_dropped6, TR_KEY_e, TR_KEY_encoding, TR_KEY_encryption, TR_KEY_error, TR_KEY_errorString, TR_KEY_eta, TR_KEY_etaIdle, TR_KEY_failure_reason, TR_KEY_fields, TR_KEY_fileStats, TR_KEY_filename, TR_KEY_files, TR_KEY_files_added, TR_KEY_files_unwanted, TR_KEY_files_wanted, TR_KEY_filesAdded, TR_KEY_filter_mode, TR_KEY_filter_text, TR_KEY_filter_trackers, TR_KEY_flagStr, TR_KEY_flags, TR_KEY_fromCache, TR_KEY_fromDht, TR_KEY_fromIncoming, TR_KEY_fromLpd, TR_KEY_fromLtep, TR_KEY_fromPex, TR_KEY_fromTracker, TR_KEY_hasAnnounced, TR_KEY_hasScraped, TR_KEY_hashString, TR_KEY_have, TR_KEY_haveUnchecked, TR_KEY_haveValid, TR_KEY_honorsSessionLimits, TR_KEY_host, TR_KEY_id, TR_KEY_idle_limit, TR_KEY_idle_mode, TR_KEY_idle_seeding_limit, TR_KEY_idle_seeding_limit_enabled, TR_KEY_ids, TR_KEY_incomplete, TR_KEY_incomplete_dir, TR_KEY_incomplete_dir_enabled, TR_KEY_info, TR_KEY_info_hash, TR_KEY_inhibit_desktop_hibernation, TR_KEY_interval, TR_KEY_ip, TR_KEY_ipv4, TR_KEY_ipv6, TR_KEY_isBackup, TR_KEY_isDownloadingFrom, TR_KEY_isEncrypted, TR_KEY_isFinished, TR_KEY_isIncoming, TR_KEY_isPrivate, TR_KEY_isStalled, TR_KEY_isUTP, TR_KEY_isUploadingTo, TR_KEY_lastAnnouncePeerCount, TR_KEY_lastAnnounceResult, TR_KEY_lastAnnounceStartTime, TR_KEY_lastAnnounceSucceeded, TR_KEY_lastAnnounceTime, TR_KEY_lastAnnounceTimedOut, TR_KEY_lastScrapeResult, TR_KEY_lastScrapeStartTime, TR_KEY_lastScrapeSucceeded, TR_KEY_lastScrapeTime, TR_KEY_lastScrapeTimedOut, TR_KEY_leecherCount, TR_KEY_leftUntilDone, TR_KEY_length, TR_KEY_location, TR_KEY_lpd_enabled, TR_KEY_m, TR_KEY_magnet_info, TR_KEY_magnetLink, TR_KEY_main_window_height, TR_KEY_main_window_is_maximized, TR_KEY_main_window_layout_order, TR_KEY_main_window_width, TR_KEY_main_window_x, TR_KEY_main_window_y, TR_KEY_manualAnnounceTime, TR_KEY_max_peers, TR_KEY_maxConnectedPeers, TR_KEY_memory_bytes, TR_KEY_memory_units, TR_KEY_message_level, TR_KEY_metadataPercentComplete, TR_KEY_metadata_size, TR_KEY_metainfo, TR_KEY_method, TR_KEY_min_interval, TR_KEY_min_request_interval, TR_KEY_move, TR_KEY_msg_type, TR_KEY_mtimes, TR_KEY_name, TR_KEY_name_utf_8, TR_KEY_nextAnnounceTime, TR_KEY_nextScrapeTime, TR_KEY_nodes, TR_KEY_nodes6, TR_KEY_open_dialog_dir, TR_KEY_p, TR_KEY_path, TR_KEY_path_utf_8, TR_KEY_paused, TR_KEY_pausedTorrentCount, TR_KEY_peer_congestion_algorithm, TR_KEY_peer_id_ttl_hours, TR_KEY_peer_limit, TR_KEY_peer_limit_global, TR_KEY_peer_limit_per_torrent, TR_KEY_peer_port, TR_KEY_peer_port_random_high, TR_KEY_peer_port_random_low, TR_KEY_peer_port_random_on_start, TR_KEY_peer_socket_tos, TR_KEY_peerIsChoked, TR_KEY_peerIsInterested, TR_KEY_peers, TR_KEY_peers2, TR_KEY_peers2_6, TR_KEY_peers6, TR_KEY_peersConnected, TR_KEY_peersFrom, TR_KEY_peersGettingFromUs, TR_KEY_peersSendingToUs, TR_KEY_percentDone, TR_KEY_pex_enabled, TR_KEY_piece, TR_KEY_piece_length, TR_KEY_pieceCount, TR_KEY_pieceSize, TR_KEY_pieces, TR_KEY_play_download_complete_sound, TR_KEY_port, TR_KEY_port_forwarding_enabled, TR_KEY_port_is_open, TR_KEY_preallocation, TR_KEY_prefetch_enabled, TR_KEY_priorities, TR_KEY_priority, TR_KEY_priority_high, TR_KEY_priority_low, TR_KEY_priority_normal, TR_KEY_private, TR_KEY_progress, TR_KEY_prompt_before_exit, TR_KEY_queue_move_bottom, TR_KEY_queue_move_down, TR_KEY_queue_move_top, TR_KEY_queue_move_up, TR_KEY_queue_stalled_enabled, TR_KEY_queue_stalled_minutes, TR_KEY_queuePosition, TR_KEY_rateDownload, TR_KEY_rateToClient, TR_KEY_rateToPeer, TR_KEY_rateUpload, TR_KEY_ratio_limit, TR_KEY_ratio_limit_enabled, TR_KEY_ratio_mode, TR_KEY_recent_download_dir_1, TR_KEY_recent_download_dir_2, TR_KEY_recent_download_dir_3, TR_KEY_recent_download_dir_4, TR_KEY_recheckProgress, TR_KEY_remote_session_enabled, TR_KEY_remote_session_host, TR_KEY_remote_session_password, TR_KEY_remote_session_port, TR_KEY_remote_session_requres_authentication, TR_KEY_remote_session_username, TR_KEY_removed, TR_KEY_rename_partial_files, TR_KEY_reqq, TR_KEY_result, TR_KEY_rpc_authentication_required, TR_KEY_rpc_bind_address, TR_KEY_rpc_enabled, TR_KEY_rpc_password, TR_KEY_rpc_port, TR_KEY_rpc_url, TR_KEY_rpc_username, TR_KEY_rpc_version, TR_KEY_rpc_version_minimum, TR_KEY_rpc_whitelist, TR_KEY_rpc_whitelist_enabled, TR_KEY_scrape, TR_KEY_scrape_paused_torrents_enabled, TR_KEY_scrapeState, TR_KEY_script_torrent_done_enabled, TR_KEY_script_torrent_done_filename, TR_KEY_seconds_active, TR_KEY_secondsActive, TR_KEY_secondsDownloading, TR_KEY_secondsSeeding, TR_KEY_seed_queue_enabled, TR_KEY_seed_queue_size, TR_KEY_seedIdleLimit, TR_KEY_seedIdleMode, TR_KEY_seedRatioLimit, TR_KEY_seedRatioLimited, TR_KEY_seedRatioMode, TR_KEY_seederCount, TR_KEY_seeding_time_seconds, TR_KEY_session_count, TR_KEY_sessionCount, TR_KEY_show_backup_trackers, TR_KEY_show_extra_peer_details, TR_KEY_show_filterbar, TR_KEY_show_notification_area_icon, TR_KEY_show_options_window, TR_KEY_show_statusbar, TR_KEY_show_toolbar, TR_KEY_show_tracker_scrapes, TR_KEY_size_bytes, TR_KEY_size_units, TR_KEY_sizeWhenDone, TR_KEY_sort_mode, TR_KEY_sort_reversed, TR_KEY_speed, TR_KEY_speed_Bps, TR_KEY_speed_bytes, TR_KEY_speed_limit_down, TR_KEY_speed_limit_down_enabled, TR_KEY_speed_limit_up, TR_KEY_speed_limit_up_enabled, TR_KEY_speed_units, TR_KEY_start_added_torrents, TR_KEY_start_minimized, TR_KEY_startDate, TR_KEY_status, TR_KEY_statusbar_stats, TR_KEY_tag, TR_KEY_tier, TR_KEY_time_checked, TR_KEY_torrent_added, TR_KEY_torrent_added_notification_command, TR_KEY_torrent_added_notification_enabled, TR_KEY_torrent_complete_notification_command, TR_KEY_torrent_complete_notification_enabled, TR_KEY_torrent_complete_sound_command, TR_KEY_torrent_complete_sound_enabled, TR_KEY_torrent_duplicate, TR_KEY_torrent_get, TR_KEY_torrent_set, TR_KEY_torrent_set_location, TR_KEY_torrentCount, TR_KEY_torrentFile, TR_KEY_torrents, TR_KEY_totalSize, TR_KEY_total_size, TR_KEY_tracker_id, TR_KEY_trackerAdd, TR_KEY_trackerRemove, TR_KEY_trackerReplace, TR_KEY_trackerStats, TR_KEY_trackers, TR_KEY_trash_can_enabled, TR_KEY_trash_original_torrent_files, TR_KEY_umask, TR_KEY_units, TR_KEY_upload_slots_per_torrent, TR_KEY_uploadLimit, TR_KEY_uploadLimited, TR_KEY_uploadRatio, TR_KEY_uploadSpeed, TR_KEY_upload_only, TR_KEY_uploaded, TR_KEY_uploaded_bytes, TR_KEY_uploadedBytes, TR_KEY_uploadedEver, TR_KEY_url_list, TR_KEY_use_global_speed_limit, TR_KEY_use_speed_limit, TR_KEY_user_has_given_informed_consent, TR_KEY_ut_comment, TR_KEY_ut_holepunch, TR_KEY_ut_metadata, TR_KEY_ut_pex, TR_KEY_ut_recommend, TR_KEY_utp_enabled, TR_KEY_v, TR_KEY_version, TR_KEY_wanted, TR_KEY_warning_message, TR_KEY_watch_dir, TR_KEY_watch_dir_enabled, TR_KEY_webseeds, TR_KEY_webseedsSendingToUs, TR_N_KEYS }; /** * Find the quark that matches the specified string * * @return true if the specified string exists as a quark */ bool tr_quark_lookup (const void * str, size_t len, tr_quark * setme); /** * Get the string that corresponds to the specified quark */ const char * tr_quark_get_string (tr_quark quark, size_t * len); /** * Create a new quark for the specified string. If a quark already * exists for that string, it is returned so that no duplicates are * created. */ tr_quark tr_quark_new (const void * str, size_t len); /*** **** ***/ #ifdef __cplusplus } #endif #endif transmission-2.92/libtransmission/PaxHeaders.4960/platform.c0000644000000000000000000000013212640354044021070 xustar0030 mtime=1451350052.455150475 30 atime=1451350052.455150475 30 ctime=1457295920.083809329 transmission-2.92/libtransmission/platform.c0000644000175000017500000003343012640354044022520 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: platform.c 14633 2015-12-25 10:19:50Z mikedld $ */ #define _XOPEN_SOURCE 600 /* needed for recursive locks. */ #ifndef __USE_UNIX98 #define __USE_UNIX98 /* some older Linuxes need it spelt out for them */ #endif #include #include #include #ifdef __HAIKU__ #include /* PATH_MAX */ #endif #ifdef _WIN32 #include /* _beginthreadex (), _endthreadex () */ #include #include /* SHGetKnownFolderPath (), FOLDERID_... */ #else #include /* getuid() */ #ifdef BUILD_MAC_CLIENT #include #endif #ifdef __HAIKU__ #include #endif #include #endif #include "transmission.h" #include "file.h" #include "list.h" #include "log.h" #include "platform.h" #include "session.h" #include "utils.h" /*** **** THREADS ***/ #ifdef _WIN32 typedef DWORD tr_thread_id; #else typedef pthread_t tr_thread_id; #endif static tr_thread_id tr_getCurrentThread (void) { #ifdef _WIN32 return GetCurrentThreadId (); #else return pthread_self (); #endif } static bool tr_areThreadsEqual (tr_thread_id a, tr_thread_id b) { #ifdef _WIN32 return a == b; #else return pthread_equal (a, b) != 0; #endif } /** @brief portability wrapper around OS-dependent threads */ struct tr_thread { void (* func)(void *); void * arg; tr_thread_id thread; #ifdef _WIN32 HANDLE thread_handle; #endif }; bool tr_amInThread (const tr_thread * t) { return tr_areThreadsEqual (tr_getCurrentThread (), t->thread); } #ifdef _WIN32 #define ThreadFuncReturnType unsigned WINAPI #else #define ThreadFuncReturnType void #endif static ThreadFuncReturnType ThreadFunc (void * _t) { tr_thread * t = _t; t->func (t->arg); tr_free (t); #ifdef _WIN32 _endthreadex (0); return 0; #endif } tr_thread * tr_threadNew (void (*func)(void *), void * arg) { tr_thread * t = tr_new0 (tr_thread, 1); t->func = func; t->arg = arg; #ifdef _WIN32 { unsigned int id; t->thread_handle = (HANDLE) _beginthreadex (NULL, 0, &ThreadFunc, t, 0, &id); t->thread = (DWORD) id; } #else pthread_create (&t->thread, NULL, (void* (*)(void*))ThreadFunc, t); pthread_detach (t->thread); #endif return t; } /*** **** LOCKS ***/ /** @brief portability wrapper around OS-dependent thread mutexes */ struct tr_lock { int depth; #ifdef _WIN32 CRITICAL_SECTION lock; DWORD lockThread; #else pthread_mutex_t lock; pthread_t lockThread; #endif }; tr_lock* tr_lockNew (void) { tr_lock * l = tr_new0 (tr_lock, 1); #ifdef _WIN32 InitializeCriticalSection (&l->lock); /* supports recursion */ #else pthread_mutexattr_t attr; pthread_mutexattr_init (&attr); pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init (&l->lock, &attr); #endif return l; } void tr_lockFree (tr_lock * l) { #ifdef _WIN32 DeleteCriticalSection (&l->lock); #else pthread_mutex_destroy (&l->lock); #endif tr_free (l); } void tr_lockLock (tr_lock * l) { #ifdef _WIN32 EnterCriticalSection (&l->lock); #else pthread_mutex_lock (&l->lock); #endif assert (l->depth >= 0); assert (!l->depth || tr_areThreadsEqual (l->lockThread, tr_getCurrentThread ())); l->lockThread = tr_getCurrentThread (); ++l->depth; } bool tr_lockHave (const tr_lock * l) { return (l->depth > 0) && (tr_areThreadsEqual (l->lockThread, tr_getCurrentThread ())); } void tr_lockUnlock (tr_lock * l) { assert (l->depth > 0); assert (tr_areThreadsEqual (l->lockThread, tr_getCurrentThread ())); --l->depth; assert (l->depth >= 0); #ifdef _WIN32 LeaveCriticalSection (&l->lock); #else pthread_mutex_unlock (&l->lock); #endif } /*** **** PATHS ***/ #ifndef _WIN32 #include #endif #ifdef _WIN32 static char * win32_get_known_folder (REFKNOWNFOLDERID folder_id) { char * ret = NULL; PWSTR path; if (SHGetKnownFolderPath (folder_id, KF_FLAG_DONT_UNEXPAND | KF_FLAG_DONT_VERIFY, NULL, &path) == S_OK) { ret = tr_win32_native_to_utf8 (path, -1); CoTaskMemFree (path); } return ret; } #endif static const char * getHomeDir (void) { static char * home = NULL; if (!home) { home = tr_env_get_string ("HOME", NULL); if (!home) { #ifdef _WIN32 home = win32_get_known_folder (&FOLDERID_Profile); #else struct passwd * pw = getpwuid (getuid ()); if (pw) home = tr_strdup (pw->pw_dir); endpwent (); #endif } if (!home) home = tr_strdup (""); } return home; } #if defined (__APPLE__) || defined (_WIN32) #define RESUME_SUBDIR "Resume" #define TORRENT_SUBDIR "Torrents" #else #define RESUME_SUBDIR "resume" #define TORRENT_SUBDIR "torrents" #endif void tr_setConfigDir (tr_session * session, const char * configDir) { char * path; session->configDir = tr_strdup (configDir); path = tr_buildPath (configDir, RESUME_SUBDIR, NULL); tr_sys_dir_create (path, TR_SYS_DIR_CREATE_PARENTS, 0777, NULL); session->resumeDir = path; path = tr_buildPath (configDir, TORRENT_SUBDIR, NULL); tr_sys_dir_create (path, TR_SYS_DIR_CREATE_PARENTS, 0777, NULL); session->torrentDir = path; } const char * tr_sessionGetConfigDir (const tr_session * session) { return session->configDir; } const char * tr_getTorrentDir (const tr_session * session) { return session->torrentDir; } const char * tr_getResumeDir (const tr_session * session) { return session->resumeDir; } const char* tr_getDefaultConfigDir (const char * appname) { static char * s = NULL; if (!appname || !*appname) appname = "Transmission"; if (!s) { s = tr_env_get_string ("TRANSMISSION_HOME", NULL); if (s == NULL) { #ifdef __APPLE__ s = tr_buildPath (getHomeDir (), "Library", "Application Support", appname, NULL); #elif defined (_WIN32) char * appdata = win32_get_known_folder (&FOLDERID_LocalAppData); s = tr_buildPath (appdata, appname, NULL); tr_free (appdata); #elif defined (__HAIKU__) char buf[PATH_MAX]; find_directory (B_USER_SETTINGS_DIRECTORY, -1, true, buf, sizeof (buf)); s = tr_buildPath (buf, appname, NULL); #else char * const xdg_config_home = tr_env_get_string ("XDG_CONFIG_HOME", NULL); if (xdg_config_home != NULL) { s = tr_buildPath (xdg_config_home, appname, NULL); tr_free (xdg_config_home); } else { s = tr_buildPath (getHomeDir (), ".config", appname, NULL); } #endif } } return s; } const char* tr_getDefaultDownloadDir (void) { static char * user_dir = NULL; if (user_dir == NULL) { char * config_home; char * config_file; char * content; size_t content_len; /* figure out where to look for user-dirs.dirs */ config_home = tr_env_get_string ("XDG_CONFIG_HOME", NULL); if (config_home && *config_home) config_file = tr_buildPath (config_home, "user-dirs.dirs", NULL); else config_file = tr_buildPath (getHomeDir (), ".config", "user-dirs.dirs", NULL); tr_free (config_home); /* read in user-dirs.dirs and look for the download dir entry */ content = (char *) tr_loadFile (config_file, &content_len, NULL); if (content && content_len>0) { const char * key = "XDG_DOWNLOAD_DIR=\""; char * line = strstr (content, key); if (line != NULL) { char * value = line + strlen (key); char * end = strchr (value, '"'); if (end) { *end = '\0'; if (!memcmp (value, "$HOME/", 6)) user_dir = tr_buildPath (getHomeDir (), value+6, NULL); else if (!strcmp (value, "$HOME")) user_dir = tr_strdup (getHomeDir ()); else user_dir = tr_strdup (value); } } } #ifdef _WIN32 if (user_dir == NULL) user_dir = win32_get_known_folder (&FOLDERID_Downloads); #endif if (user_dir == NULL) #ifdef __HAIKU__ user_dir = tr_buildPath (getHomeDir (), "Desktop", NULL); #else user_dir = tr_buildPath (getHomeDir (), "Downloads", NULL); #endif tr_free (content); tr_free (config_file); } return user_dir; } /*** **** ***/ static bool isWebClientDir (const char * path) { char * tmp = tr_buildPath (path, "index.html", NULL); const bool ret = tr_sys_path_exists (tmp, NULL); tr_logAddInfo (_("Searching for web interface file \"%s\""), tmp); tr_free (tmp); return ret; } const char * tr_getWebClientDir (const tr_session * session UNUSED) { static char * s = NULL; if (!s) { s = tr_env_get_string ("CLUTCH_HOME", NULL); if (s == NULL) s = tr_env_get_string ("TRANSMISSION_WEB_HOME", NULL); if (s == NULL) { #ifdef BUILD_MAC_CLIENT /* on Mac, look in the Application Support folder first, then in the app bundle. */ /* Look in the Application Support folder */ s = tr_buildPath (tr_sessionGetConfigDir (session), "web", NULL); if (!isWebClientDir (s)) { tr_free (s); CFURLRef appURL = CFBundleCopyBundleURL (CFBundleGetMainBundle ()); CFStringRef appRef = CFURLCopyFileSystemPath (appURL, kCFURLPOSIXPathStyle); const CFIndex appStringLength = CFStringGetMaximumSizeOfFileSystemRepresentation (appRef); char * appString = tr_malloc (appStringLength); const bool success = CFStringGetFileSystemRepresentation (appRef, appString, appStringLength); assert (success); CFRelease (appURL); CFRelease (appRef); /* Fallback to the app bundle */ s = tr_buildPath (appString, "Contents", "Resources", "web", NULL); if (!isWebClientDir (s)) { tr_free (s); s = NULL; } tr_free (appString); } #elif defined (_WIN32) /* Generally, Web interface should be stored in a Web subdir of * calling executable dir. */ static REFKNOWNFOLDERID known_folder_ids[] = { &FOLDERID_LocalAppData, &FOLDERID_RoamingAppData, &FOLDERID_ProgramData }; for (size_t i = 0; s == NULL && i < ARRAYSIZE (known_folder_ids); ++i) { char * dir = win32_get_known_folder (known_folder_ids[i]); s = tr_buildPath (dir, "Transmission", "Web", NULL); tr_free (dir); if (!isWebClientDir (s)) { tr_free (s); s = NULL; } } if (s == NULL) /* check calling module place */ { wchar_t wide_module_path[MAX_PATH]; char * module_path; char * dir; GetModuleFileNameW (NULL, wide_module_path, sizeof (wide_module_path) / sizeof (*wide_module_path)); module_path = tr_win32_native_to_utf8 (wide_module_path, -1); dir = tr_sys_path_dirname (module_path, NULL); tr_free (module_path); s = tr_buildPath (dir, "Web", NULL); tr_free (dir); if (!isWebClientDir (s)) { tr_free (s); s = NULL; } } #else /* everyone else, follow the XDG spec */ tr_list *candidates = NULL, *l; char * tmp; /* XDG_DATA_HOME should be the first in the list of candidates */ tmp = tr_env_get_string ("XDG_DATA_HOME", NULL); if (tmp && *tmp) { tr_list_append (&candidates, tmp); } else { char * dhome = tr_buildPath (getHomeDir (), ".local", "share", NULL); tr_list_append (&candidates, dhome); tr_free (tmp); } /* XDG_DATA_DIRS are the backup directories */ { const char * pkg = PACKAGE_DATA_DIR; char * xdg = tr_env_get_string ("XDG_DATA_DIRS", NULL); const char * fallback = "/usr/local/share:/usr/share"; char * buf = tr_strdup_printf ("%s:%s:%s", (pkg?pkg:""), (xdg?xdg:""), fallback); tr_free (xdg); tmp = buf; while (tmp && *tmp) { const char * end = strchr (tmp, ':'); if (end) { if ((end - tmp) > 1) tr_list_append (&candidates, tr_strndup (tmp, (size_t) (end - tmp))); tmp = (char *) end + 1; } else if (tmp && *tmp) { tr_list_append (&candidates, tr_strdup (tmp)); break; } } tr_free (buf); } /* walk through the candidates & look for a match */ for (l=candidates; l; l=l->next) { char * path = tr_buildPath (l->data, "transmission", "web", NULL); const int found = isWebClientDir (path); if (found) { s = path; break; } tr_free (path); } tr_list_free (&candidates, tr_free); #endif } } return s; } transmission-2.92/libtransmission/PaxHeaders.4960/watchdir.h0000644000000000000000000000013212662757243021072 xustar0030 mtime=1456201379.236861566 30 atime=1456201379.236861566 30 ctime=1457295919.885805962 transmission-2.92/libtransmission/watchdir.h0000644000175000017500000000234312662757243022521 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015-2016 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: watchdir.h 14674 2016-01-25 21:48:58Z mikedld $ */ #ifndef TR_WATCHDIR_H #define TR_WATCHDIR_H #ifdef __cplusplus extern "C" { #endif struct event_base; typedef struct tr_watchdir * tr_watchdir_t; typedef enum { TR_WATCHDIR_ACCEPT, TR_WATCHDIR_IGNORE, TR_WATCHDIR_RETRY } tr_watchdir_status; typedef tr_watchdir_status (* tr_watchdir_cb) (tr_watchdir_t handle, const char * name, void * user_data); /* ... */ tr_watchdir_t tr_watchdir_new (const char * path, tr_watchdir_cb callback, void * callback_user_data, struct event_base * event_base, bool force_generic); void tr_watchdir_free (tr_watchdir_t handle); const char * tr_watchdir_get_path (tr_watchdir_t handle); #ifdef __cplusplus } #endif #endif /* TR_WATCHDIR_H */ transmission-2.92/libtransmission/PaxHeaders.4960/variant.c0000644000000000000000000000013012640354044020706 xustar0029 mtime=1451350052.45315044 29 atime=1451350052.45315044 30 ctime=1457295920.215811574 transmission-2.92/libtransmission/variant.c0000644000175000017500000007732412640354044022352 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: variant.c 14634 2015-12-25 11:34:35Z mikedld $ */ #if defined (HAVE_USELOCALE) && (!defined (_XOPEN_SOURCE) || _XOPEN_SOURCE < 700) #undef _XOPEN_SOURCE #define _XOPEN_SOURCE 700 #endif #if defined (HAVE_USELOCALE) && !defined (_GNU_SOURCE) #define _GNU_SOURCE #endif #include #include #include /* strtod(), realloc(), qsort() */ #include #ifdef _WIN32 #include #endif #include /* setlocale() */ #if defined (HAVE_USELOCALE) && defined (HAVE_XLOCALE_H) #include #endif #include #define __LIBTRANSMISSION_VARIANT_MODULE__ #include "transmission.h" #include "ConvertUTF.h" #include "error.h" #include "file.h" #include "log.h" #include "utils.h" /* tr_new(), tr_free() */ #include "variant.h" #include "variant-common.h" /* don't use newlocale/uselocale on old versions of uClibc because they're buggy. * https://trac.transmissionbt.com/ticket/6006 */ #if defined (__UCLIBC__) && !TR_UCLIBC_CHECK_VERSION (0, 9, 34) #undef HAVE_USELOCALE #endif /** *** **/ struct locale_context { #ifdef HAVE_USELOCALE locale_t new_locale; locale_t old_locale; #else #if defined (HAVE__CONFIGTHREADLOCALE) && defined (_ENABLE_PER_THREAD_LOCALE) int old_thread_config; #endif int category; char old_locale[128]; #endif }; static void use_numeric_locale (struct locale_context * context, const char * locale_name) { #ifdef HAVE_USELOCALE context->new_locale = newlocale (LC_NUMERIC_MASK, locale_name, NULL); context->old_locale = uselocale (context->new_locale); #else #if defined (HAVE__CONFIGTHREADLOCALE) && defined (_ENABLE_PER_THREAD_LOCALE) context->old_thread_config = _configthreadlocale (_ENABLE_PER_THREAD_LOCALE); #endif context->category = LC_NUMERIC; tr_strlcpy (context->old_locale, setlocale (context->category, NULL), sizeof (context->old_locale)); setlocale (context->category, locale_name); #endif } static void restore_locale (struct locale_context * context) { #ifdef HAVE_USELOCALE uselocale (context->old_locale); freelocale (context->new_locale); #else setlocale (context->category, context->old_locale); #if defined (HAVE__CONFIGTHREADLOCALE) && defined (_ENABLE_PER_THREAD_LOCALE) _configthreadlocale (context->old_thread_config); #endif #endif } /*** **** ***/ static bool tr_variantIsContainer (const tr_variant * v) { return tr_variantIsList (v) || tr_variantIsDict (v); } static bool tr_variantIsSomething (const tr_variant * v) { return tr_variantIsContainer (v) || tr_variantIsInt (v) || tr_variantIsString (v) || tr_variantIsReal (v) || tr_variantIsBool (v); } void tr_variantInit (tr_variant * v, char type) { v->type = type; memset (&v->val, 0, sizeof(v->val)); } /*** **** ***/ static const struct tr_variant_string STRING_INIT = { .type = TR_STRING_TYPE_QUARK, .quark = TR_KEY_NONE, .len = 0, .str.str = "" }; static void tr_variant_string_clear (struct tr_variant_string * str) { if (str->type == TR_STRING_TYPE_HEAP) tr_free ((char*)(str->str.str)); *str = STRING_INIT; } /* returns a const pointer to the variant's string */ static const char * tr_variant_string_get_string (const struct tr_variant_string * str) { const char * ret; switch (str->type) { case TR_STRING_TYPE_BUF: ret = str->str.buf; break; case TR_STRING_TYPE_HEAP: ret = str->str.str; break; case TR_STRING_TYPE_QUARK: ret = str->str.str; break; default: ret = NULL; } return ret; } static void tr_variant_string_set_quark (struct tr_variant_string * str, const tr_quark quark) { tr_variant_string_clear (str); str->type = TR_STRING_TYPE_QUARK; str->quark = quark; str->str.str = tr_quark_get_string (quark, &str->len); } static void tr_variant_string_set_string (struct tr_variant_string * str, const char * bytes, size_t len) { tr_variant_string_clear (str); if (bytes == NULL) len = 0; else if (len == TR_BAD_SIZE) len = strlen (bytes); if (len < sizeof (str->str.buf)) { str->type = TR_STRING_TYPE_BUF; memcpy (str->str.buf, bytes, len); str->str.buf[len] = '\0'; str->len = len; } else { char * tmp = tr_new (char, len+1); memcpy (tmp, bytes, len); tmp[len] = '\0'; str->type = TR_STRING_TYPE_HEAP; str->str.str = tmp; str->len = len; } } /*** **** ***/ static inline const char * getStr (const tr_variant * v) { assert (tr_variantIsString (v)); return tr_variant_string_get_string (&v->val.s); } static int dictIndexOf (const tr_variant * dict, const tr_quark key) { if (tr_variantIsDict (dict)) { const tr_variant * walk; const tr_variant * const begin = dict->val.l.vals; const tr_variant * const end = begin + dict->val.l.count; for (walk=begin; walk!=end; ++walk) if (walk->key == key) return walk - begin; } return -1; } tr_variant * tr_variantDictFind (tr_variant * dict, const tr_quark key) { const int i = dictIndexOf (dict, key); return i < 0 ? NULL : dict->val.l.vals+i; } static bool tr_variantDictFindType (tr_variant * dict, const tr_quark key, int type, tr_variant ** setme) { return tr_variantIsType (*setme = tr_variantDictFind (dict, key), type); } size_t tr_variantListSize (const tr_variant * list) { return tr_variantIsList (list) ? list->val.l.count : 0; } tr_variant* tr_variantListChild (tr_variant * v, size_t i) { tr_variant * ret = NULL; if (tr_variantIsList (v) && (i < v->val.l.count)) ret = v->val.l.vals + i; return ret; } bool tr_variantListRemove (tr_variant * list, size_t i) { bool removed = false; if (tr_variantIsList (list) && (i < list->val.l.count)) { removed = true; tr_variantFree (&list->val.l.vals[i]); tr_removeElementFromArray (list->val.l.vals, i, sizeof (tr_variant), list->val.l.count--); } return removed; } bool tr_variantGetInt (const tr_variant * v, int64_t * setme) { bool success = false; if (!success && ((success = tr_variantIsInt (v)))) if (setme) *setme = v->val.i; if (!success && ((success = tr_variantIsBool (v)))) if (setme) *setme = v->val.b ? 1 : 0; return success; } bool tr_variantGetStr (const tr_variant * v, const char ** setme, size_t * len) { const bool success = tr_variantIsString (v); if (success) *setme = getStr (v); if (len != NULL) *len = success ? v->val.s.len : 0; return success; } bool tr_variantGetRaw (const tr_variant * v, const uint8_t ** setme_raw, size_t * setme_len) { const bool success = tr_variantIsString (v); if (success) { *setme_raw = (uint8_t*) getStr (v); *setme_len = v->val.s.len; } return success; } bool tr_variantGetBool (const tr_variant * v, bool * setme) { const char * str; bool success = false; if ((success = tr_variantIsBool (v))) *setme = v->val.b; if (!success && tr_variantIsInt (v)) if ((success = (v->val.i==0 || v->val.i==1))) *setme = v->val.i!=0; if (!success && tr_variantGetStr (v, &str, NULL)) if ((success = (!strcmp (str,"true") || !strcmp (str,"false")))) *setme = !strcmp (str,"true"); return success; } bool tr_variantGetReal (const tr_variant * v, double * setme) { bool success = false; if (!success && ((success = tr_variantIsReal (v)))) *setme = v->val.d; if (!success && ((success = tr_variantIsInt (v)))) *setme = v->val.i; if (!success && tr_variantIsString (v)) { char * endptr; struct locale_context locale_ctx; double d; /* the json spec requires a '.' decimal point regardless of locale */ use_numeric_locale (&locale_ctx, "C"); d = strtod (getStr (v), &endptr); restore_locale (&locale_ctx); if ((success = (getStr (v) != endptr) && !*endptr)) *setme = d; } return success; } bool tr_variantDictFindInt (tr_variant * dict, const tr_quark key, int64_t * setme) { tr_variant * child = tr_variantDictFind (dict, key); return tr_variantGetInt (child, setme); } bool tr_variantDictFindBool (tr_variant * dict, const tr_quark key, bool * setme) { tr_variant * child = tr_variantDictFind (dict, key); return tr_variantGetBool (child, setme); } bool tr_variantDictFindReal (tr_variant * dict, const tr_quark key, double * setme) { tr_variant * child = tr_variantDictFind (dict, key); return tr_variantGetReal (child, setme); } bool tr_variantDictFindStr (tr_variant * dict, const tr_quark key, const char ** setme, size_t * len) { tr_variant * child = tr_variantDictFind (dict, key); return tr_variantGetStr (child, setme, len); } bool tr_variantDictFindList (tr_variant * dict, const tr_quark key, tr_variant ** setme) { return tr_variantDictFindType (dict, key, TR_VARIANT_TYPE_LIST, setme); } bool tr_variantDictFindDict (tr_variant * dict, const tr_quark key, tr_variant ** setme) { return tr_variantDictFindType (dict, key, TR_VARIANT_TYPE_DICT, setme); } bool tr_variantDictFindRaw (tr_variant * dict, const tr_quark key, const uint8_t ** setme_raw, size_t * setme_len) { tr_variant * child = tr_variantDictFind (dict, key); return tr_variantGetRaw (child, setme_raw, setme_len); } /*** **** ***/ void tr_variantInitRaw (tr_variant * v, const void * src, size_t byteCount) { tr_variantInit (v, TR_VARIANT_TYPE_STR); tr_variant_string_set_string (&v->val.s, src, byteCount); } void tr_variantInitQuark (tr_variant * v, const tr_quark q) { tr_variantInit (v, TR_VARIANT_TYPE_STR); tr_variant_string_set_quark (&v->val.s, q); } void tr_variantInitStr (tr_variant * v, const void * str, size_t len) { tr_variantInit (v, TR_VARIANT_TYPE_STR); tr_variant_string_set_string (&v->val.s, str, len); } void tr_variantInitBool (tr_variant * v, bool value) { tr_variantInit (v, TR_VARIANT_TYPE_BOOL); v->val.b = value != 0; } void tr_variantInitReal (tr_variant * v, double value) { tr_variantInit (v, TR_VARIANT_TYPE_REAL); v->val.d = value; } void tr_variantInitInt (tr_variant * v, int64_t value) { tr_variantInit (v, TR_VARIANT_TYPE_INT); v->val.i = value; } void tr_variantInitList (tr_variant * v, size_t reserve_count) { tr_variantInit (v, TR_VARIANT_TYPE_LIST); tr_variantListReserve (v, reserve_count); } static void containerReserve (tr_variant * v, size_t count) { const size_t needed = v->val.l.count + count; assert (tr_variantIsContainer (v)); if (needed > v->val.l.alloc) { /* scale the alloc size in powers-of-2 */ size_t n = v->val.l.alloc ? v->val.l.alloc : 8; while (n < needed) n *= 2u; v->val.l.vals = tr_renew (tr_variant, v->val.l.vals, n); v->val.l.alloc = n; } } void tr_variantListReserve (tr_variant * list, size_t count) { assert (tr_variantIsList (list)); containerReserve (list, count); } void tr_variantInitDict (tr_variant * v, size_t reserve_count) { tr_variantInit (v, TR_VARIANT_TYPE_DICT); tr_variantDictReserve (v, reserve_count); } void tr_variantDictReserve (tr_variant * dict, size_t reserve_count) { assert (tr_variantIsDict (dict)); containerReserve (dict, reserve_count); } tr_variant * tr_variantListAdd (tr_variant * list) { tr_variant * child; assert (tr_variantIsList (list)); containerReserve (list, 1); child = &list->val.l.vals[list->val.l.count++]; child->key = 0; tr_variantInit (child, TR_VARIANT_TYPE_INT); return child; } tr_variant * tr_variantListAddInt (tr_variant * list, int64_t val) { tr_variant * child = tr_variantListAdd (list); tr_variantInitInt (child, val); return child; } tr_variant * tr_variantListAddReal (tr_variant * list, double val) { tr_variant * child = tr_variantListAdd (list); tr_variantInitReal (child, val); return child; } tr_variant * tr_variantListAddBool (tr_variant * list, bool val) { tr_variant * child = tr_variantListAdd (list); tr_variantInitBool (child, val); return child; } tr_variant * tr_variantListAddStr (tr_variant * list, const char * val) { tr_variant * child = tr_variantListAdd (list); tr_variantInitStr (child, val, TR_BAD_SIZE); return child; } tr_variant * tr_variantListAddQuark (tr_variant * list, const tr_quark val) { tr_variant * child = tr_variantListAdd (list); tr_variantInitQuark (child, val); return child; } tr_variant * tr_variantListAddRaw (tr_variant * list, const void * val, size_t len) { tr_variant * child = tr_variantListAdd (list); tr_variantInitRaw (child, val, len); return child; } tr_variant* tr_variantListAddList (tr_variant * list, size_t reserve_count) { tr_variant * child = tr_variantListAdd (list); tr_variantInitList (child, reserve_count); return child; } tr_variant* tr_variantListAddDict (tr_variant * list, size_t reserve_count) { tr_variant * child = tr_variantListAdd (list); tr_variantInitDict (child, reserve_count); return child; } tr_variant * tr_variantDictAdd (tr_variant * dict, const tr_quark key) { tr_variant * val; assert (tr_variantIsDict (dict)); containerReserve (dict, 1); val = dict->val.l.vals + dict->val.l.count++; tr_variantInit (val, TR_VARIANT_TYPE_INT); val->key = key; return val; } static tr_variant* dictFindOrAdd (tr_variant * dict, const tr_quark key, int type) { tr_variant * child; /* see if it already exists, and if so, try to reuse it */ if ((child = tr_variantDictFind (dict, key))) { if (!tr_variantIsType (child, type)) { tr_variantDictRemove (dict, key); child = NULL; } else if (child->type == TR_VARIANT_TYPE_STR) { tr_variant_string_clear (&child->val.s); } } /* if it doesn't exist, create it */ if (child == NULL) child = tr_variantDictAdd (dict, key); return child; } tr_variant* tr_variantDictAddInt (tr_variant * dict, const tr_quark key, int64_t val) { tr_variant * child = dictFindOrAdd (dict, key, TR_VARIANT_TYPE_INT); tr_variantInitInt (child, val); return child; } tr_variant* tr_variantDictAddBool (tr_variant * dict, const tr_quark key, bool val) { tr_variant * child = dictFindOrAdd (dict, key, TR_VARIANT_TYPE_BOOL); tr_variantInitBool (child, val); return child; } tr_variant* tr_variantDictAddReal (tr_variant * dict, const tr_quark key, double val) { tr_variant * child = dictFindOrAdd (dict, key, TR_VARIANT_TYPE_REAL); tr_variantInitReal (child, val); return child; } tr_variant* tr_variantDictAddQuark (tr_variant * dict, const tr_quark key, const tr_quark val) { tr_variant * child = dictFindOrAdd (dict, key, TR_VARIANT_TYPE_STR); tr_variantInitQuark (child, val); return child; } tr_variant* tr_variantDictAddStr (tr_variant * dict, const tr_quark key, const char * val) { tr_variant * child = dictFindOrAdd (dict, key, TR_VARIANT_TYPE_STR); tr_variantInitStr (child, val, TR_BAD_SIZE); return child; } tr_variant* tr_variantDictAddRaw (tr_variant * dict, const tr_quark key, const void * src, size_t len) { tr_variant * child = dictFindOrAdd (dict, key, TR_VARIANT_TYPE_STR); tr_variantInitRaw (child, src, len); return child; } tr_variant* tr_variantDictAddList (tr_variant * dict, const tr_quark key, size_t reserve_count) { tr_variant * child = tr_variantDictAdd (dict, key); tr_variantInitList (child, reserve_count); return child; } tr_variant* tr_variantDictAddDict (tr_variant * dict, const tr_quark key, size_t reserve_count) { tr_variant * child = tr_variantDictAdd (dict, key); tr_variantInitDict (child, reserve_count); return child; } tr_variant * tr_variantDictSteal (tr_variant * dict, const tr_quark key, tr_variant * value) { tr_variant * child = tr_variantDictAdd (dict, key); *child = *value; child->key = key; tr_variantInit (value, value->type); return child; } bool tr_variantDictRemove (tr_variant * dict, const tr_quark key) { bool removed = false; const int i = dictIndexOf (dict, key); if (i >= 0) { const int last = dict->val.l.count - 1; tr_variantFree (&dict->val.l.vals[i]); if (i != last) dict->val.l.vals[i] = dict->val.l.vals[last]; --dict->val.l.count; removed = true; } return removed; } /*** **** BENC WALKING ***/ struct KeyIndex { const char * keystr; tr_variant * val; }; static int compareKeyIndex (const void * va, const void * vb) { const struct KeyIndex * a = va; const struct KeyIndex * b = vb; return strcmp (a->keystr, b->keystr); } struct SaveNode { const tr_variant * v; tr_variant sorted; size_t childIndex; bool isVisited; }; static void nodeConstruct (struct SaveNode * node, const tr_variant * v, bool sort_dicts) { node->isVisited = false; node->childIndex = 0; if (sort_dicts && tr_variantIsDict(v)) { /* make node->sorted a sorted version of this dictionary */ size_t i; const size_t n = v->val.l.count; struct KeyIndex * tmp = tr_new (struct KeyIndex, n); for (i=0; ival.l.vals+i; tmp[i].keystr = tr_quark_get_string (tmp[i].val->key, NULL); } qsort (tmp, n, sizeof (struct KeyIndex), compareKeyIndex); tr_variantInitDict (&node->sorted, n); for (i=0; isorted.val.l.vals[i] = *tmp[i].val; node->sorted.val.l.count = n; tr_free (tmp); node->v = &node->sorted; } else { node->v = v; } } static void nodeDestruct (struct SaveNode * node) { if (node->v == &node->sorted) tr_free (node->sorted.val.l.vals); } /** * This function's previous recursive implementation was * easier to read, but was vulnerable to a smash-stacking * attack via maliciously-crafted data. (#667) */ void tr_variantWalk (const tr_variant * v, const struct VariantWalkFuncs * walkFuncs, void * user_data, bool sort_dicts) { int stackSize = 0; int stackAlloc = 64; struct SaveNode * stack = tr_new (struct SaveNode, stackAlloc); nodeConstruct (&stack[stackSize++], v, sort_dicts); while (stackSize > 0) { struct SaveNode * node = &stack[stackSize-1]; const tr_variant * v; if (!node->isVisited) { v = node->v; node->isVisited = true; } else if (tr_variantIsContainer(node->v) && (node->childIndex < node->v->val.l.count)) { const int index = node->childIndex++; v = node->v->val.l.vals + index; if (tr_variantIsDict (node->v)) { tr_variant tmp; tr_variantInitQuark (&tmp, v->key); walkFuncs->stringFunc (&tmp, user_data); } } else /* done with this node */ { if (tr_variantIsContainer (node->v)) walkFuncs->containerEndFunc (node->v, user_data); --stackSize; nodeDestruct (node); continue; } if (v) switch (v->type) { case TR_VARIANT_TYPE_INT: walkFuncs->intFunc (v, user_data); break; case TR_VARIANT_TYPE_BOOL: walkFuncs->boolFunc (v, user_data); break; case TR_VARIANT_TYPE_REAL: walkFuncs->realFunc (v, user_data); break; case TR_VARIANT_TYPE_STR: walkFuncs->stringFunc (v, user_data); break; case TR_VARIANT_TYPE_LIST: if (v == node->v) { walkFuncs->listBeginFunc (v, user_data); } else { if (stackAlloc == stackSize) { stackAlloc *= 2; stack = tr_renew (struct SaveNode, stack, stackAlloc); } nodeConstruct (&stack[stackSize++], v, sort_dicts); } break; case TR_VARIANT_TYPE_DICT: if (v == node->v) { walkFuncs->dictBeginFunc (v, user_data); } else { if (stackAlloc == stackSize) { stackAlloc *= 2; stack = tr_renew (struct SaveNode, stack, stackAlloc); } nodeConstruct (&stack[stackSize++], v, sort_dicts); } break; default: /* did caller give us an uninitialized val? */ tr_logAddError ("%s", _("Invalid metadata")); break; } } tr_free (stack); } /**** ***** ****/ static void freeDummyFunc (const tr_variant * v UNUSED, void * buf UNUSED) {} static void freeStringFunc (const tr_variant * v, void * unused UNUSED) { tr_variant_string_clear (&((tr_variant*)v)->val.s); } static void freeContainerEndFunc (const tr_variant * v, void * unused UNUSED) { tr_free (v->val.l.vals); } static const struct VariantWalkFuncs freeWalkFuncs = { freeDummyFunc, freeDummyFunc, freeDummyFunc, freeStringFunc, freeDummyFunc, freeDummyFunc, freeContainerEndFunc }; void tr_variantFree (tr_variant * v) { if (tr_variantIsSomething (v)) tr_variantWalk (v, &freeWalkFuncs, NULL, false); } /*** **** ***/ static void tr_variantListCopy (tr_variant * target, const tr_variant * src) { int i = 0; const tr_variant * val; while ((val = tr_variantListChild ((tr_variant*)src, i++))) { if (tr_variantIsBool (val)) { bool boolVal = 0; tr_variantGetBool (val, &boolVal); tr_variantListAddBool (target, boolVal); } else if (tr_variantIsReal (val)) { double realVal = 0; tr_variantGetReal (val, &realVal); tr_variantListAddReal (target, realVal); } else if (tr_variantIsInt (val)) { int64_t intVal = 0; tr_variantGetInt (val, &intVal); tr_variantListAddInt (target, intVal); } else if (tr_variantIsString (val)) { size_t len; const char * str; tr_variantGetStr (val, &str, &len); tr_variantListAddRaw (target, str, len); } else if (tr_variantIsDict (val)) { tr_variantMergeDicts (tr_variantListAddDict (target, 0), val); } else if (tr_variantIsList (val)) { tr_variantListCopy (tr_variantListAddList (target, 0), val); } else { tr_logAddError ("tr_variantListCopy skipping item"); } } } static size_t tr_variantDictSize (const tr_variant * dict) { return tr_variantIsDict (dict) ? dict->val.l.count : 0; } bool tr_variantDictChild (tr_variant * dict, size_t n, tr_quark * key, tr_variant ** val) { bool success = 0; assert (tr_variantIsDict (dict)); if (tr_variantIsDict (dict) && (nval.l.count)) { *key = dict->val.l.vals[n].key; *val = dict->val.l.vals+n; success = true; } return success; } void tr_variantMergeDicts (tr_variant * target, const tr_variant * source) { size_t i; const size_t sourceCount = tr_variantDictSize (source); assert (tr_variantIsDict (target)); assert (tr_variantIsDict (source)); tr_variantDictReserve (target, sourceCount + tr_variantDictSize(target)); for (i=0; i 0) { uint64_t n; if (!tr_sys_file_write (fd, walk, nleft, &n, &error)) { err = error->code; break; } nleft -= n; walk += n; } evbuffer_free (buf); } tr_sys_file_close (fd, NULL); if (nleft > 0) { tr_logAddError (_("Couldn't save temporary file \"%1$s\": %2$s"), tmp, error->message); tr_sys_path_remove (tmp, NULL); tr_error_free (error); } else { tr_error_clear (&error); if (tr_sys_path_rename (tmp, filename, &error)) { tr_logAddInfo (_("Saved \"%s\""), filename); } else { err = error->code; tr_logAddError (_("Couldn't save file \"%1$s\": %2$s"), filename, error->message); tr_sys_path_remove (tmp, NULL); tr_error_free (error); } } } else { err = error->code; tr_logAddError (_("Couldn't save temporary file \"%1$s\": %2$s"), tmp, error->message); tr_error_free (error); } tr_free (tmp); tr_free (real_filename); return err; } /*** **** ***/ bool tr_variantFromFile (tr_variant * setme, tr_variant_fmt fmt, const char * filename, tr_error ** error) { bool ret = false; uint8_t * buf; size_t buflen; buf = tr_loadFile (filename, &buflen, error); if (buf != NULL) { if (tr_variantFromBuf (setme, fmt, buf, buflen, filename, NULL) == 0) ret = true; else tr_error_set_literal (error, 0, _("Unable to parse file content")); tr_free (buf); } return ret; } int tr_variantFromBuf (tr_variant * setme, tr_variant_fmt fmt, const void * buf, size_t buflen, const char * optional_source, const char ** setme_end) { int err; struct locale_context locale_ctx; /* parse with LC_NUMERIC="C" to ensure a "." decimal separator */ use_numeric_locale (&locale_ctx, "C"); switch (fmt) { case TR_VARIANT_FMT_JSON: case TR_VARIANT_FMT_JSON_LEAN: err = tr_jsonParse (optional_source, buf, buflen, setme, setme_end); break; default /* TR_VARIANT_FMT_BENC */: err = tr_variantParseBenc (buf, ((const char*)buf)+buflen, setme, setme_end); break; } /* restore the previous locale */ restore_locale (&locale_ctx); return err; } transmission-2.92/libtransmission/PaxHeaders.4960/webseed.c0000644000000000000000000000013212634073127020665 xustar0030 mtime=1450210903.492466872 30 atime=1450210903.492466872 30 ctime=1457295920.249812152 transmission-2.92/libtransmission/webseed.c0000644000175000017500000004355712634073127022330 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: webseed.c 14619 2015-12-13 10:23:22Z mikedld $ */ #include /* strlen () */ #include #include #include "transmission.h" #include "bandwidth.h" #include "cache.h" #include "inout.h" /* tr_ioFindFileLocation () */ #include "list.h" #include "peer-mgr.h" #include "torrent.h" #include "trevent.h" /* tr_runInEventThread () */ #include "utils.h" #include "web.h" #include "webseed.h" struct tr_webseed_task { bool dead; struct evbuffer * content; struct tr_webseed * webseed; tr_session * session; tr_block_index_t block; tr_piece_index_t piece_index; uint32_t piece_offset; uint32_t length; tr_block_index_t blocks_done; uint32_t block_size; struct tr_web_task * web_task; long response_code; }; struct tr_webseed { tr_peer parent; tr_bandwidth bandwidth; tr_session * session; tr_peer_callback callback; void * callback_data; tr_list * tasks; struct event * timer; char * base_url; size_t base_url_len; int torrent_id; int consecutive_failures; int retry_tickcount; int retry_challenge; int idle_connections; int active_transfers; char ** file_urls; }; enum { TR_IDLE_TIMER_MSEC = 2000, FAILURE_RETRY_INTERVAL = 150, MAX_CONSECUTIVE_FAILURES = 5, MAX_WEBSEED_CONNECTIONS = 4 }; /*** **** ***/ static void publish (tr_webseed * w, tr_peer_event * e) { if (w->callback != NULL) w->callback (&w->parent, e, w->callback_data); } static void fire_client_got_rejs (tr_torrent * tor, tr_webseed * w, tr_block_index_t block, tr_block_index_t count) { tr_block_index_t i; tr_peer_event e = TR_PEER_EVENT_INIT; e.eventType = TR_PEER_CLIENT_GOT_REJ; tr_torrentGetBlockLocation (tor, block, &e.pieceIndex, &e.offset, &e.length); for (i = 1; i <= count; i++) { if (i == count) e.length = tr_torBlockCountBytes (tor, block + count - 1); publish (w, &e); e.offset += e.length; } } static void fire_client_got_blocks (tr_torrent * tor, tr_webseed * w, tr_block_index_t block, tr_block_index_t count) { tr_block_index_t i; tr_peer_event e = TR_PEER_EVENT_INIT; e.eventType = TR_PEER_CLIENT_GOT_BLOCK; tr_torrentGetBlockLocation (tor, block, &e.pieceIndex, &e.offset, &e.length); for (i = 1; i <= count; i++) { if (i == count) e.length = tr_torBlockCountBytes (tor, block + count - 1); publish (w, &e); e.offset += e.length; } } static void fire_client_got_piece_data (tr_webseed * w, uint32_t length) { tr_peer_event e = TR_PEER_EVENT_INIT; e.eventType = TR_PEER_CLIENT_GOT_PIECE_DATA; e.length = length; publish (w, &e); } /*** **** ***/ struct write_block_data { tr_session * session; int torrent_id; struct tr_webseed * webseed; struct evbuffer * content; tr_piece_index_t piece_index; tr_block_index_t block_index; tr_block_index_t count; uint32_t block_offset; }; static void write_block_func (void * vdata) { struct write_block_data * data = vdata; struct tr_webseed * w = data->webseed; struct evbuffer * buf = data->content; struct tr_torrent * tor; tor = tr_torrentFindFromId (data->session, data->torrent_id); if (tor != NULL) { const uint32_t block_size = tor->blockSize; uint32_t len = evbuffer_get_length (buf); const uint32_t offset_end = data->block_offset + len; tr_cache * cache = data->session->cache; const tr_piece_index_t piece = data->piece_index; if (!tr_torrentPieceIsComplete (tor, piece)) { while (len > 0) { const uint32_t bytes_this_pass = MIN (len, block_size); tr_cacheWriteBlock (cache, tor, piece, offset_end - len, bytes_this_pass, buf); len -= bytes_this_pass; } fire_client_got_blocks (tor, w, data->block_index, data->count); } } evbuffer_free (buf); tr_free (data); } /*** **** ***/ struct connection_succeeded_data { struct tr_webseed * webseed; char * real_url; tr_piece_index_t piece_index; uint32_t piece_offset; }; static void connection_succeeded (void * vdata) { tr_torrent * tor; struct connection_succeeded_data * data = vdata; struct tr_webseed * w = data->webseed; if (++w->active_transfers >= w->retry_challenge && w->retry_challenge) /* the server seems to be accepting more connections now */ w->consecutive_failures = w->retry_tickcount = w->retry_challenge = 0; if (data->real_url && (tor = tr_torrentFindFromId (w->session, w->torrent_id))) { uint64_t file_offset; tr_file_index_t file_index; tr_ioFindFileLocation (tor, data->piece_index, data->piece_offset, &file_index, &file_offset); tr_free (w->file_urls[file_index]); w->file_urls[file_index] = data->real_url; data->real_url = NULL; } tr_free (data->real_url); tr_free (data); } /*** **** ***/ static void on_content_changed (struct evbuffer * buf, const struct evbuffer_cb_info * info, void * vtask) { const size_t n_added = info->n_added; struct tr_webseed_task * task = vtask; tr_session * session = task->session; tr_sessionLock (session); if (!task->dead && (n_added>0)) { uint32_t len; struct tr_webseed * w = task->webseed; tr_bandwidthUsed (&w->bandwidth, TR_DOWN, n_added, true, tr_time_msec ()); fire_client_got_piece_data (w, n_added); len = evbuffer_get_length (buf); if (!task->response_code) { tr_webGetTaskInfo (task->web_task, TR_WEB_GET_CODE, &task->response_code); if (task->response_code == 206) { const char * url; struct connection_succeeded_data * data; url = NULL; tr_webGetTaskInfo (task->web_task, TR_WEB_GET_REAL_URL, &url); data = tr_new (struct connection_succeeded_data, 1); data->webseed = w; data->real_url = tr_strdup (url); data->piece_index = task->piece_index; data->piece_offset = task->piece_offset + (task->blocks_done * task->block_size) + (len - 1); /* processing this uses a tr_torrent pointer, so push the work to the libevent thread... */ tr_runInEventThread (w->session, connection_succeeded, data); } } if ((task->response_code == 206) && (len >= task->block_size)) { /* once we've got at least one full block, save it */ struct write_block_data * data; const uint32_t block_size = task->block_size; const tr_block_index_t completed = len / block_size; data = tr_new (struct write_block_data, 1); data->webseed = task->webseed; data->piece_index = task->piece_index; data->block_index = task->block + task->blocks_done; data->count = completed; data->block_offset = task->piece_offset + task->blocks_done * block_size; data->content = evbuffer_new (); data->torrent_id = w->torrent_id; data->session = w->session; /* we don't use locking on this evbuffer so we must copy out the data that will be needed when writing the block in a different thread */ evbuffer_remove_buffer (task->content, data->content, block_size * completed); tr_runInEventThread (w->session, write_block_func, data); task->blocks_done += completed; } } tr_sessionUnlock (session); } static void task_request_next_chunk (struct tr_webseed_task * task); static void on_idle (tr_webseed * w) { int want; int running_tasks = tr_list_size (w->tasks); tr_torrent * tor = tr_torrentFindFromId (w->session, w->torrent_id); if (w->consecutive_failures >= MAX_CONSECUTIVE_FAILURES) { want = w->idle_connections; if (w->retry_tickcount >= FAILURE_RETRY_INTERVAL) { /* some time has passed since our connection attempts failed. try again */ ++want; /* if this challenge is fulfilled we will reset consecutive_failures */ w->retry_challenge = running_tasks + want; } } else { want = MAX_WEBSEED_CONNECTIONS - running_tasks; w->retry_challenge = running_tasks + w->idle_connections + 1; } if (tor && tor->isRunning && !tr_torrentIsSeed (tor) && (want > 0)) { int i; int got = 0; tr_block_index_t * blocks = NULL; blocks = tr_new (tr_block_index_t, want*2); tr_peerMgrGetNextRequests (tor, &w->parent, want, blocks, &got, true); w->idle_connections -= MIN (w->idle_connections, got); if (w->retry_tickcount >= FAILURE_RETRY_INTERVAL && got == want) w->retry_tickcount = 0; for (i=0; isession = tor->session; task->webseed = w; task->block = b; task->piece_index = tr_torBlockPiece (tor, b); task->piece_offset = (tor->blockSize * b) - (tor->info.pieceSize * task->piece_index); task->length = (be - b) * tor->blockSize + tr_torBlockCountBytes (tor, be); task->blocks_done = 0; task->response_code = 0; task->block_size = tor->blockSize; task->content = evbuffer_new (); evbuffer_add_cb (task->content, on_content_changed, task); tr_list_append (&w->tasks, task); task_request_next_chunk (task); } tr_free (blocks); } } static void web_response_func (tr_session * session, bool did_connect UNUSED, bool did_timeout UNUSED, long response_code, const void * response UNUSED, size_t response_byte_count UNUSED, void * vtask) { tr_webseed * w; tr_torrent * tor; struct tr_webseed_task * t = vtask; const int success = (response_code == 206); if (t->dead) { evbuffer_free (t->content); tr_free (t); return; } w = t->webseed; tor = tr_torrentFindFromId (session, w->torrent_id); if (tor != NULL) { /* active_transfers was only increased if the connection was successful */ if (t->response_code == 206) --w->active_transfers; if (!success) { const tr_block_index_t blocks_remain = (t->length + tor->blockSize - 1) / tor->blockSize - t->blocks_done; if (blocks_remain) fire_client_got_rejs (tor, w, t->block + t->blocks_done, blocks_remain); if (t->blocks_done) ++w->idle_connections; else if (++w->consecutive_failures >= MAX_CONSECUTIVE_FAILURES && !w->retry_tickcount) /* now wait a while until retrying to establish a connection */ ++w->retry_tickcount; tr_list_remove_data (&w->tasks, t); evbuffer_free (t->content); tr_free (t); } else { const uint32_t bytes_done = t->blocks_done * tor->blockSize; const uint32_t buf_len = evbuffer_get_length (t->content); if (bytes_done + buf_len < t->length) { /* request finished successfully but there's still data missing. that means we've reached the end of a file and need to request the next one */ t->response_code = 0; task_request_next_chunk (t); } else { if (buf_len && !tr_torrentPieceIsComplete (tor, t->piece_index)) { /* on_content_changed () will not write a block if it is smaller than the torrent's block size, i.e. the torrent's very last block */ tr_cacheWriteBlock (session->cache, tor, t->piece_index, t->piece_offset + bytes_done, buf_len, t->content); fire_client_got_blocks (tor, t->webseed, t->block + t->blocks_done, 1); } ++w->idle_connections; tr_list_remove_data (&w->tasks, t); evbuffer_free (t->content); tr_free (t); on_idle (w); } } } } static struct evbuffer * make_url (tr_webseed * w, const tr_file * file) { struct evbuffer * buf = evbuffer_new (); evbuffer_add (buf, w->base_url, w->base_url_len); /* if url ends with a '/', add the torrent name */ if (w->base_url[w->base_url_len - 1] == '/' && file->name) tr_http_escape (buf, file->name, strlen (file->name), false); return buf; } static void task_request_next_chunk (struct tr_webseed_task * t) { tr_webseed * w = t->webseed; tr_torrent * tor = tr_torrentFindFromId (w->session, w->torrent_id); if (tor != NULL) { char range[64]; char ** urls = t->webseed->file_urls; const tr_info * inf = tr_torrentInfo (tor); const uint64_t remain = t->length - t->blocks_done * tor->blockSize - evbuffer_get_length (t->content); const uint64_t total_offset = tr_pieceOffset (tor, t->piece_index, t->piece_offset, t->length - remain); const tr_piece_index_t step_piece = total_offset / inf->pieceSize; const uint64_t step_piece_offset = total_offset - (inf->pieceSize * step_piece); tr_file_index_t file_index; const tr_file * file; uint64_t file_offset; uint64_t this_pass; tr_ioFindFileLocation (tor, step_piece, step_piece_offset, &file_index, &file_offset); file = &inf->files[file_index]; this_pass = MIN (remain, file->length - file_offset); if (!urls[file_index]) urls[file_index] = evbuffer_free_to_str (make_url (t->webseed, file), NULL); tr_snprintf (range, sizeof range, "%"PRIu64"-%"PRIu64, file_offset, file_offset + this_pass - 1); t->web_task = tr_webRunWebseed (tor, urls[file_index], range, web_response_func, t, t->content); } } /*** **** ***/ static void webseed_timer_func (evutil_socket_t foo UNUSED, short bar UNUSED, void * vw) { tr_webseed * w = vw; if (w->retry_tickcount) ++w->retry_tickcount; on_idle (w); tr_timerAddMsec (w->timer, TR_IDLE_TIMER_MSEC); } /*** **** tr_peer virtual functions ***/ static bool webseed_is_transferring_pieces (const tr_peer * peer, uint64_t now, tr_direction direction, unsigned int * setme_Bps) { unsigned int Bps = 0; bool is_active = false; if (direction == TR_DOWN) { const tr_webseed * w = (const tr_webseed *) peer; is_active = w->tasks != NULL; Bps = tr_bandwidthGetPieceSpeed_Bps (&w->bandwidth, now, direction); } if (setme_Bps != NULL) *setme_Bps = Bps; return is_active; } static void webseed_destruct (tr_peer * peer) { tr_list * l; tr_webseed * w = (tr_webseed *) peer; /* flag all the pending tasks as dead */ for (l=w->tasks; l!=NULL; l=l->next) { struct tr_webseed_task * task = l->data; task->dead = true; } tr_list_free (&w->tasks, NULL); /* if we have an array of file URLs, free it */ if (w->file_urls != NULL) { tr_file_index_t i; tr_torrent * tor = tr_torrentFindFromId (w->session, w->torrent_id); const tr_info * inf = tr_torrentInfo (tor); for (i=0; ifileCount; ++i) tr_free (w->file_urls[i]); tr_free (w->file_urls); } /* webseed destruct */ event_free (w->timer); tr_bandwidthDestruct (&w->bandwidth); tr_free (w->base_url); /* parent class destruct */ tr_peerDestruct (&w->parent); } static const struct tr_peer_virtual_funcs my_funcs = { .destruct = webseed_destruct, .is_transferring_pieces = webseed_is_transferring_pieces }; /*** **** ***/ tr_webseed* tr_webseedNew (struct tr_torrent * tor, const char * url, tr_peer_callback callback, void * callback_data) { tr_webseed * w = tr_new0 (tr_webseed, 1); tr_peer * peer = &w->parent; const tr_info * inf = tr_torrentInfo (tor); /* construct parent class */ tr_peerConstruct (peer, tor); peer->client = TR_KEY_webseeds; peer->funcs = &my_funcs; tr_bitfieldSetHasAll (&peer->have); tr_peerUpdateProgress (tor, peer); w->torrent_id = tr_torrentId (tor); w->session = tor->session; w->base_url_len = strlen (url); w->base_url = tr_strndup (url, w->base_url_len); w->callback = callback; w->callback_data = callback_data; w->file_urls = tr_new0 (char *, inf->fileCount); //tr_rcConstruct (&w->download_rate); tr_bandwidthConstruct (&w->bandwidth, tor->session, &tor->bandwidth); w->timer = evtimer_new (w->session->event_base, webseed_timer_func, w); tr_timerAddMsec (w->timer, TR_IDLE_TIMER_MSEC); return w; } transmission-2.92/libtransmission/PaxHeaders.4960/peer-common.h0000644000000000000000000000013112505250244021466 xustar0030 mtime=1427460260.449243637 29 atime=1427460260.44824362 30 ctime=1457295919.716803088 transmission-2.92/libtransmission/peer-common.h0000644000175000017500000001033612505250244023117 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: peer-common.h 14382 2014-12-13 15:22:39Z mikedld $ */ #ifndef __TRANSMISSION__ #error only libtransmission should #include this header. #endif #ifndef TR_PEER_H #define TR_PEER_H #include "transmission.h" #include "bitfield.h" #include "history.h" #include "quark.h" /** * @addtogroup peers Peers * @{ */ struct tr_peer; struct tr_swarm; enum { /* this is the maximum size of a block request. most bittorrent clients will reject requests larger than this size. */ MAX_BLOCK_SIZE = (1024 * 16) }; /** *** Peer Publish / Subscribe **/ typedef enum { TR_PEER_CLIENT_GOT_BLOCK, TR_PEER_CLIENT_GOT_CHOKE, TR_PEER_CLIENT_GOT_PIECE_DATA, TR_PEER_CLIENT_GOT_ALLOWED_FAST, TR_PEER_CLIENT_GOT_SUGGEST, TR_PEER_CLIENT_GOT_PORT, TR_PEER_CLIENT_GOT_REJ, TR_PEER_CLIENT_GOT_BITFIELD, TR_PEER_CLIENT_GOT_HAVE, TR_PEER_CLIENT_GOT_HAVE_ALL, TR_PEER_CLIENT_GOT_HAVE_NONE, TR_PEER_PEER_GOT_PIECE_DATA, TR_PEER_ERROR } PeerEventType; typedef struct { PeerEventType eventType; uint32_t pieceIndex; /* for GOT_BLOCK, GOT_HAVE, CANCEL, ALLOWED, SUGGEST */ struct tr_bitfield * bitfield; /* for GOT_BITFIELD */ uint32_t offset; /* for GOT_BLOCK */ uint32_t length; /* for GOT_BLOCK + GOT_PIECE_DATA */ int err; /* errno for GOT_ERROR */ tr_port port; /* for GOT_PORT */ } tr_peer_event; extern const tr_peer_event TR_PEER_EVENT_INIT; typedef void (*tr_peer_callback) (struct tr_peer * peer, const tr_peer_event * event, void * client_data); /*** **** ***/ typedef void (*tr_peer_destruct_func)(struct tr_peer * peer); typedef bool (*tr_peer_is_transferring_pieces_func)(const struct tr_peer * peer, uint64_t now, tr_direction direction, unsigned int * Bps); struct tr_peer_virtual_funcs { tr_peer_destruct_func destruct; tr_peer_is_transferring_pieces_func is_transferring_pieces; }; /** * State information about a connected peer. * * @see struct peer_atom * @see tr_peerMsgs */ typedef struct tr_peer { /* whether or not we should free this peer soon. NOTE: private to peer-mgr.c */ bool doPurge; /* number of bad pieces they've contributed to */ uint8_t strikes; /* how many requests the peer has made that we haven't responded to yet */ int pendingReqsToClient; /* how many requests we've made and are currently awaiting a response for */ int pendingReqsToPeer; /* Hook to private peer-mgr information */ struct peer_atom * atom; struct tr_swarm * swarm; /** how complete the peer's copy of the torrent is. [0.0...1.0] */ float progress; struct tr_bitfield blame; struct tr_bitfield have; /* the client name. For BitTorrent peers, this is the app name derived from the `v' string in LTEP's handshake dictionary */ tr_quark client; tr_recentHistory blocksSentToClient; tr_recentHistory blocksSentToPeer; tr_recentHistory cancelsSentToClient; tr_recentHistory cancelsSentToPeer; const struct tr_peer_virtual_funcs * funcs; } tr_peer; void tr_peerConstruct (struct tr_peer * peer, const tr_torrent * tor); void tr_peerDestruct (struct tr_peer * peer); /** Update the tr_peer.progress field based on the 'have' bitset. */ void tr_peerUpdateProgress (tr_torrent * tor, struct tr_peer *); bool tr_peerIsSeed (const struct tr_peer * peer); /*** **** ***/ typedef struct tr_swarm_stats { int activePeerCount[2]; int activeWebseedCount; int peerCount; int peerFromCount[TR_PEER_FROM__MAX]; } tr_swarm_stats; extern const tr_swarm_stats TR_SWARM_STATS_INIT; void tr_swarmGetStats (const struct tr_swarm * swarm, tr_swarm_stats * setme); void tr_swarmIncrementActivePeers (struct tr_swarm * swarm, tr_direction direction, bool is_active); /*** **** ***/ #ifdef _WIN32 #undef EMSGSIZE #define EMSGSIZE WSAEMSGSIZE #endif /** @} */ #endif transmission-2.92/libtransmission/PaxHeaders.4960/announcer-common.h0000644000000000000000000000013212522604362022527 xustar0030 mtime=1430980850.671381439 30 atime=1430980850.671381439 30 ctime=1457295919.555800351 transmission-2.92/libtransmission/announcer-common.h0000644000175000017500000001455012522604362024161 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: announcer-common.h 14521 2015-05-04 19:58:34Z mikedld $ */ #ifndef __LIBTRANSMISSION_ANNOUNCER_MODULE__ #error only the libtransmission announcer module should #include this header. #endif #ifndef _TR_ANNOUNCER_COMMON_H_ #define _TR_ANNOUNCER_COMMON_H_ #include "transmission.h" /* SHA_DIGEST_LENGTH */ #include "session.h" /* PEER_ID_LEN */ /*** **** SCRAPE ***/ enum { /* pick a number small enough for common tracker software: * - ocelot has no upper bound * - opentracker has an upper bound of 64 * - udp protocol has an upper bound of 74 * - xbtt has no upper bound */ TR_MULTISCRAPE_MAX = 64 }; typedef struct { /* the scrape URL */ char * url; /* the name to use when deep logging is enabled */ char log_name[128]; /* info hashes of the torrents to scrape */ uint8_t info_hash[TR_MULTISCRAPE_MAX][SHA_DIGEST_LENGTH]; /* how many hashes to use in the info_hash field */ int info_hash_count; } tr_scrape_request; struct tr_scrape_response_row { /* the torrent's info_hash */ uint8_t info_hash[SHA_DIGEST_LENGTH]; /* how many peers are seeding this torrent */ int seeders; /* how many peers are downloading this torrent */ int leechers; /* how many times this torrent has been downloaded */ int downloads; /* the number of active downloaders in the swarm. * this is a BEP 21 extension that some trackers won't support. * http://www.bittorrent.org/beps/bep_0021.html#tracker-scrapes */ int downloaders; }; typedef struct { /* whether or not we managed to connect to the tracker */ bool did_connect; /* whether or not the scrape timed out */ bool did_timeout; /* how many info hashes are in the 'rows' field */ int row_count; /* the individual torrents' scrape results */ struct tr_scrape_response_row rows[TR_MULTISCRAPE_MAX]; /* the raw scrape url */ char * url; /* human-readable error string on failure, or NULL */ char * errmsg; /* minimum interval (in seconds) allowed between scrapes. * this is an unofficial extension that some trackers won't support. */ int min_request_interval; } tr_scrape_response; typedef void (*tr_scrape_response_func) (const tr_scrape_response * response, void * user_data); void tr_tracker_http_scrape (tr_session * session, const tr_scrape_request * req, tr_scrape_response_func response_func, void * user_data); void tr_tracker_udp_scrape (tr_session * session, const tr_scrape_request * req, tr_scrape_response_func response_func, void * user_data); /*** **** ANNOUNCE ***/ typedef enum { TR_ANNOUNCE_EVENT_NONE, TR_ANNOUNCE_EVENT_COMPLETED, TR_ANNOUNCE_EVENT_STARTED, TR_ANNOUNCE_EVENT_STOPPED } tr_announce_event; const char * tr_announce_event_get_string (tr_announce_event); typedef struct { tr_announce_event event; bool partial_seed; /* the port we listen for incoming peers on */ int port; /* per-session key */ int key; /* the number of peers we'd like to get back in the response */ int numwant; /* the number of bytes we uploaded since the last 'started' event */ uint64_t up; /* the number of good bytes we downloaded since the last 'started' event */ uint64_t down; /* the number of bad bytes we downloaded since the last 'started' event */ uint64_t corrupt; /* the total size of the torrent minus the number of bytes completed */ uint64_t leftUntilComplete; /* the tracker's announce URL */ char * url; /* key generated by and returned from an http tracker. * see tr_announce_response.tracker_id_str */ char * tracker_id_str; /* the torrent's peer id. * this changes when a torrent is stopped -> restarted. */ char peer_id[PEER_ID_LEN]; /* the torrent's info_hash */ uint8_t info_hash[SHA_DIGEST_LENGTH]; /* the name to use when deep logging is enabled */ char log_name[128]; } tr_announce_request; struct tr_pex; typedef struct { /* the torrent's info hash */ uint8_t info_hash[SHA_DIGEST_LENGTH]; /* whether or not we managed to connect to the tracker */ bool did_connect; /* whether or not the scrape timed out */ bool did_timeout; /* preferred interval between announces. * transmission treats this as the interval for periodic announces */ int interval; /* minimum interval between announces. (optional) * transmission treats this as the min interval for manual announces */ int min_interval; /* how many peers are seeding this torrent */ int seeders; /* how many peers are downloading this torrent */ int leechers; /* how many times this torrent has been downloaded */ int downloads; /* number of items in the 'pex' field */ size_t pex_count; /* IPv4 peers that we acquired from the tracker */ struct tr_pex * pex; /* number of items in the 'pex6' field */ size_t pex6_count; /* IPv6 peers that we acquired from the tracker */ struct tr_pex * pex6; /* human-readable error string on failure, or NULL */ char * errmsg; /* human-readable warning string or NULL */ char * warning; /* key generated by and returned from an http tracker. * if this is provided, subsequent http announces must include this. */ char * tracker_id_str; } tr_announce_response; typedef void (*tr_announce_response_func) (const tr_announce_response * response, void * userdata); void tr_tracker_http_announce (tr_session * session, const tr_announce_request * req, tr_announce_response_func response_func, void * user_data); void tr_tracker_udp_announce (tr_session * session, const tr_announce_request * req, tr_announce_response_func response_func, void * user_data); void tr_tracker_udp_start_shutdown (tr_session * session); #endif /* _TR_ANNOUNCER_COMMON_H_ */ transmission-2.92/libtransmission/PaxHeaders.4960/utils-test.c0000644000000000000000000000013212662757243021375 xustar0030 mtime=1456201379.238861599 30 atime=1456201379.238861599 30 ctime=1457295920.277812628 transmission-2.92/libtransmission/utils-test.c0000644000175000017500000003001412662757243023020 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: utils-test.c 14678 2016-02-07 11:54:01Z mikedld $ */ #include /* INT_MAX */ #include /* sqrt () */ #include /* strlen () */ #include /* setenv (), unsetenv () */ #ifdef _WIN32 #include #define setenv(key, value, unused) SetEnvironmentVariableA (key, value) #define unsetenv(key) SetEnvironmentVariableA (key, NULL) #endif #include "transmission.h" #include "ConvertUTF.h" /* tr_utf8_validate*/ #include "platform.h" #include "crypto-utils.h" /* tr_rand_int_weak */ #include "utils.h" #include "web.h" #define SPEED_TEST 0 #if SPEED_TEST #define VERBOSE #endif #include "libtransmission-test.h" static int test_strip_positional_args (void) { const char * in; const char * out; const char * expected; in = "Hello %1$s foo %2$.*f"; expected = "Hello %s foo %.*f"; out = tr_strip_positional_args (in); check_streq (expected, out); in = "Hello %1$'d foo %2$'f"; expected = "Hello %d foo %f"; out = tr_strip_positional_args (in); check_streq (expected, out); return 0; } static int test_strstrip (void) { char *in, *out; /* strstrip */ in = tr_strdup (" test "); out = tr_strstrip (in); check (in == out); check_streq ("test", out); tr_free (in); /* strstrip */ in = tr_strdup (" test test "); out = tr_strstrip (in); check (in == out); check_streq ("test test", out); tr_free (in); /* strstrip */ in = tr_strdup ("test"); out = tr_strstrip (in); check (in == out); check_streq ("test", out); tr_free (in); return 0; } static int test_buildpath (void) { char * out; out = tr_buildPath ("foo", "bar", NULL); check_streq ("foo" TR_PATH_DELIMITER_STR "bar", out); tr_free (out); out = tr_buildPath ("", "foo", "bar", NULL); check_streq (TR_PATH_DELIMITER_STR "foo" TR_PATH_DELIMITER_STR "bar", out); tr_free (out); return 0; } static int test_utf8 (void) { const char * in; char * out; in = "hello world"; out = tr_utf8clean (in, TR_BAD_SIZE); check_streq (in, out); tr_free (out); in = "hello world"; out = tr_utf8clean (in, 5); check_streq ("hello", out); tr_free (out); /* this version is not utf-8 (but cp866) */ in = "\x92\xE0\xE3\xA4\xAD\xAE \xA1\xEB\xE2\xEC \x81\xAE\xA3\xAE\xAC"; out = tr_utf8clean (in, 17); check (out != NULL); check ((strlen (out) == 17) || (strlen (out) == 33)); check (tr_utf8_validate (out, TR_BAD_SIZE, NULL)); tr_free (out); /* same string, but utf-8 clean */ in = "Трудно быть Богом"; out = tr_utf8clean (in, TR_BAD_SIZE); check (out != NULL); check (tr_utf8_validate (out, TR_BAD_SIZE, NULL)); check_streq (in, out); tr_free (out); in = "\xF4\x00\x81\x82"; out = tr_utf8clean (in, 4); check (out != NULL); check ((strlen (out) == 1) || (strlen (out) == 2)); check (tr_utf8_validate (out, TR_BAD_SIZE, NULL)); tr_free (out); in = "\xF4\x33\x81\x82"; out = tr_utf8clean (in, 4); check (out != NULL); check ((strlen (out) == 4) || (strlen (out) == 7)); check (tr_utf8_validate (out, TR_BAD_SIZE, NULL)); tr_free (out); return 0; } static int test_numbers (void) { int i; int count; int * numbers; numbers = tr_parseNumberRange ("1-10,13,16-19", TR_BAD_SIZE, &count); check_int_eq (15, count); check_int_eq (1, numbers[0]); check_int_eq (6, numbers[5]); check_int_eq (10, numbers[9]); check_int_eq (13, numbers[10]); check_int_eq (16, numbers[11]); check_int_eq (19, numbers[14]); tr_free (numbers); numbers = tr_parseNumberRange ("1-5,3-7,2-6", TR_BAD_SIZE, &count); check (count == 7); check (numbers != NULL); for (i=0; i buf[i]) lowest_high = buf[i]; check (highest_low <= lowest_high); return 0; } static int test_quickfindFirst (void) { size_t i; const size_t k = 10; const size_t n = 100; const size_t n_trials = 1000; int * buf = tr_new (int, n); for (i=0; i /* isprint () */ #include /* strtol () */ #include #include "transmission.h" #include "clients.h" #include "utils.h" /* tr_snprintf (), tr_strlcpy () */ static int charint (uint8_t ch) { if ('0' <= ch && ch <= '9') return ch - '0'; if ('A' <= ch && ch <= 'Z') return 10 + ch - 'A'; if ('a' <= ch && ch <= 'z') return 36 + ch - 'a'; return 0; } static bool getShadowInt (uint8_t ch, int * setme) { const char * str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.-"; const char * pch = strchr (str, ch); if (!pch) return false; *setme = pch - str; return true; } static int strint (const void * pch, int span) { char tmp[64]; memcpy (tmp, pch, span); tmp[span] = '\0'; return strtol (tmp, NULL, 0); } static const char* getMnemonicEnd (uint8_t ch) { switch (ch) { case 'b': case 'B': return " (Beta)"; case 'd': return " (Debug)"; case 'x': case 'X': case 'Z': return " (Dev)"; default: return ""; } } static void three_digits (char * buf, size_t buflen, const char * name, const uint8_t * digits) { tr_snprintf (buf, buflen, "%s %d.%d.%d", name, charint (digits[0]), charint (digits[1]), charint (digits[2])); } static void four_digits (char * buf, size_t buflen, const char * name, const uint8_t * digits) { tr_snprintf (buf, buflen, "%s %d.%d.%d.%d", name, charint (digits[0]), charint (digits[1]), charint (digits[2]), charint (digits[3])); } static void two_major_two_minor (char * buf, size_t buflen, const char * name, const uint8_t * digits) { tr_snprintf (buf, buflen, "%s %d.%02d", name, strint (digits, 2), strint (digits+2, 2)); } static void no_version (char * buf, size_t buflen, const char * name) { tr_strlcpy (buf, name, buflen); } static void mainline_style (char * buf, size_t buflen, const char * name, const uint8_t * id) { if (id[4] == '-' && id[6] == '-') tr_snprintf (buf, buflen, "%s %c.%c.%c", name, id[1], id[3], id[5]); else if (id[5] == '-') tr_snprintf (buf, buflen, "%s %c.%c%c.%c", name, id[1], id[3], id[4], id[6]); } static bool isMainlineStyle (const uint8_t * peer_id) { /** * One of the following styles will be used: * Mx-y-z-- * Mx-yy-z- */ return peer_id[2]=='-' && peer_id[7]=='-' && (peer_id[4]=='-' || peer_id[5]=='-'); } static bool decodeBitCometClient (char * buf, size_t buflen, const uint8_t * id) { int is_bitlord; int major, minor; const char * name; const char * mod = NULL; if (!memcmp (id, "exbc", 4)) mod = ""; else if (!memcmp (id, "FUTB", 4)) mod = " (Solidox Mod) "; else if (!memcmp (id, "xUTB", 4)) mod = " (Mod 2) "; else return false; is_bitlord = !memcmp (id+6, "LORD", 4); name = (is_bitlord) ? "BitLord " : "BitComet "; major = id[4]; minor = id[5]; /** * Bitcomet, and older versions of BitLord, are of the form x.yy. * Bitcoment 1.0 and onwards are of the form x.y. */ if (is_bitlord && major>0) tr_snprintf (buf, buflen, "%s%s%d.%d", name, mod, major, minor); else tr_snprintf (buf, buflen, "%s%s%d.%02d", name, mod, major, minor); return true; } char * tr_clientForId (char * buf, size_t buflen, const void * id_in) { const uint8_t * id = id_in; *buf = '\0'; if (!id) return buf; /* Azureus-style */ if (id[0] == '-' && id[7] == '-') { if (!memcmp (id+1, "TR", 2)) { if (!memcmp (id+3, "000", 3)) /* very old client style: -TR0006- is 0.6 */ tr_snprintf (buf, buflen, "Transmission 0.%c", id[6]); else if (!memcmp (id+3, "00", 2)) /* previous client style: -TR0072- is 0.72 */ tr_snprintf (buf, buflen, "Transmission 0.%02d", strint (id+5,2)); else /* current client style: -TR111Z- is 1.11+ */ tr_snprintf (buf, buflen, "Transmission %d.%02d%s", strint (id+3,1), strint (id+4,2), id[6]=='Z' || id[6]=='X' ? "+" : ""); } else if (!memcmp (id+1, "UT", 2)) { tr_snprintf (buf, buflen, "\xc2\xb5Torrent %d.%d.%d%s", strint (id+3,1), strint (id+4,1), strint (id+5,1), getMnemonicEnd (id[6])); } else if (!memcmp (id+1, "BT", 2)) { tr_snprintf (buf, buflen, "BitTorrent %d.%d.%d%s", strint (id+3,1), strint (id+4,1), strint (id+5,1), getMnemonicEnd (id[6])); } else if (!memcmp (id+1, "UM", 2)) { tr_snprintf (buf, buflen, "\xc2\xb5Torrent Mac %d.%d.%d%s", strint (id+3,1), strint (id+4,1), strint (id+5,1), getMnemonicEnd (id[6])); } else if (!memcmp (id+1, "UE", 2)) { tr_snprintf (buf, buflen, "\xc2\xb5Torrent Embedded %d.%d.%d%s", strint (id+3,1), strint (id+4,1), strint (id+5,1), getMnemonicEnd (id[6])); } else if (!memcmp (id+1, "AZ", 2)) { if (id[3] > '3' || (id[3] == '3' && id[4] >= '1')) /* Vuze starts at version 3.1.0.0 */ four_digits (buf, buflen, "Vuze", id+3); else four_digits (buf, buflen, "Azureus", id+3); } else if (!memcmp (id+1, "KT", 2)) { if (id[5] == 'D') tr_snprintf (buf, buflen, "KTorrent %d.%d Dev %d", charint (id[3]), charint (id[4]), charint (id[6])); else if (id[5] == 'R') tr_snprintf (buf, buflen, "KTorrent %d.%d RC %d", charint (id[3]), charint (id[4]), charint (id[6])); else three_digits (buf, buflen, "KTorrent", id+3); } else if (!memcmp (id+1, "AG", 2)) four_digits (buf, buflen, "Ares", id+3); else if (!memcmp (id+1, "AR", 2)) four_digits (buf, buflen, "Arctic", id+3); else if (!memcmp (id+1, "AT", 2)) four_digits (buf, buflen, "Artemis", id+3); else if (!memcmp (id+1, "AV", 2)) four_digits (buf, buflen, "Avicora", id+3); else if (!memcmp (id+1, "BB", 2)) four_digits (buf, buflen, "BitBuddy", id+3); else if (!memcmp (id+1, "BE", 2)) four_digits (buf, buflen, "BitTorrent SDK", id+3); else if (!memcmp (id+1, "BG", 2)) four_digits (buf, buflen, "BTGetit", id+3); else if (!memcmp (id+1, "BH", 2)) four_digits (buf, buflen, "BitZilla", id+3); else if (!memcmp (id+1, "BM", 2)) four_digits (buf, buflen, "BitMagnet", id+3); else if (!memcmp (id+1, "BP", 2)) four_digits (buf, buflen, "BitTorrent Pro (Azureus + Spyware)", id+3); else if (!memcmp (id+1, "BX", 2)) four_digits (buf, buflen, "BittorrentX", id+3); else if (!memcmp (id+1, "bk", 2)) four_digits (buf, buflen, "BitKitten (libtorrent)", id+3); else if (!memcmp (id+1, "BS", 2)) four_digits (buf, buflen, "BTSlave", id+3); else if (!memcmp (id+1, "BW", 2)) four_digits (buf, buflen, "BitWombat", id+3); else if (!memcmp (id+1, "BX", 2)) four_digits (buf, buflen, "BittorrentX", id+3); else if (!memcmp (id+1, "EB", 2)) four_digits (buf, buflen, "EBit", id+3); else if (!memcmp (id+1, "DE", 2)) four_digits (buf, buflen, "Deluge", id+3); else if (!memcmp (id+1, "DP", 2)) four_digits (buf, buflen, "Propogate Data Client", id+3); else if (!memcmp (id+1, "FC", 2)) four_digits (buf, buflen, "FileCroc", id+3); else if (!memcmp (id+1, "FT", 2)) four_digits (buf, buflen, "FoxTorrent/RedSwoosh", id+3); else if (!memcmp (id+1, "GR", 2)) four_digits (buf, buflen, "GetRight", id+3); else if (!memcmp (id+1, "GS", 2)) four_digits (buf, buflen, "GSTorrent", id+3); else if (!memcmp (id+1, "HK", 2)) four_digits (buf, buflen, "Hekate", id+3); else if (!memcmp (id+1, "HN", 2)) four_digits (buf, buflen, "Hydranode", id+3); else if (!memcmp (id+1, "KG", 2)) four_digits (buf, buflen, "KGet", id+3); else if (!memcmp (id+1, "LC", 2)) four_digits (buf, buflen, "LeechCraft", id+3); else if (!memcmp (id+1, "LH", 2)) four_digits (buf, buflen, "LH-ABC", id+3); else if (!memcmp (id+1, "NX", 2)) four_digits (buf, buflen, "Net Transport", id+3); else if (!memcmp (id+1, "MK", 2)) four_digits (buf, buflen, "Meerkat", id+3); else if (!memcmp (id+1, "MO", 2)) four_digits (buf, buflen, "MonoTorrent", id+3); else if (!memcmp (id+1, "MR", 2)) four_digits (buf, buflen, "Miro", id+3); else if (!memcmp (id+1, "MT", 2)) four_digits (buf, buflen, "Moonlight", id+3); else if (!memcmp (id+1, "OS", 2)) four_digits (buf, buflen, "OneSwarm", id+3); else if (!memcmp (id+1, "OT", 2)) four_digits (buf, buflen, "OmegaTorrent", id+3); else if (!memcmp (id+1, "PD", 2)) four_digits (buf, buflen, "Pando", id+3); else if (!memcmp (id+1, "QD", 2)) four_digits (buf, buflen, "QQDownload", id+3); else if (!memcmp (id+1, "RS", 2)) four_digits (buf, buflen, "Rufus", id+3); else if (!memcmp (id+1, "RT", 2)) four_digits (buf, buflen, "Retriever", id+3); else if (!memcmp (id+1, "RZ", 2)) four_digits (buf, buflen, "RezTorrent", id+3); else if (!memcmp (id+1, "SD", 2)) four_digits (buf, buflen, "Thunder", id+3); else if (!memcmp (id+1, "SM", 2)) four_digits (buf, buflen, "SoMud", id+3); else if (!memcmp (id+1, "SS", 2)) four_digits (buf, buflen, "SwarmScope", id+3); else if (!memcmp (id+1, "ST", 2)) four_digits (buf, buflen, "SymTorrent", id+3); else if (!memcmp (id+1, "SZ", 2)) four_digits (buf, buflen, "Shareaza", id+3); else if (!memcmp (id+1, "S~", 2)) four_digits (buf, buflen, "Shareaza", id+3); else if (!memcmp (id+1, "st", 2)) four_digits (buf, buflen, "SharkTorrent", id+3); else if (!memcmp (id+1, "TN", 2)) four_digits (buf, buflen, "Torrent .NET", id+3); else if (!memcmp (id+1, "TS", 2)) four_digits (buf, buflen, "TorrentStorm", id+3); else if (!memcmp (id+1, "TT", 2)) four_digits (buf, buflen, "TuoTu", id+3); else if (!memcmp (id+1, "UL", 2)) four_digits (buf, buflen, "uLeecher!", id+3); else if (!memcmp (id+1, "VG", 2)) four_digits (buf, buflen, "Vagaa", id+3); else if (!memcmp (id+1, "WT", 2)) four_digits (buf, buflen, "BitLet", id+3); else if (!memcmp (id+1, "WY", 2)) four_digits (buf, buflen, "FireTorrent", id+3); else if (!memcmp (id+1, "XL", 2)) four_digits (buf, buflen, "Xunlei", id+3); else if (!memcmp (id+1, "XS", 2)) four_digits (buf, buflen, "XSwifter", id+3); else if (!memcmp (id+1, "XT", 2)) four_digits (buf, buflen, "XanTorrent", id+3); else if (!memcmp (id+1, "XX", 2)) four_digits (buf, buflen, "Xtorrent", id+3); else if (!memcmp (id+1, "ZT", 2)) four_digits (buf, buflen, "Zip Torrent", id+3); else if (!memcmp (id+1, "ZO", 2)) four_digits (buf, buflen, "Zona", id+3); else if (!memcmp (id+1, "AG", 2)) three_digits (buf, buflen, "Ares", id+3); else if (!memcmp (id+1, "A~", 2)) three_digits (buf, buflen, "Ares", id+3); else if (!memcmp (id+1, "ES", 2)) three_digits (buf, buflen, "Electric Sheep", id+3); else if (!memcmp (id+1, "HL", 2)) three_digits (buf, buflen, "Halite", id+3); else if (!memcmp (id+1, "LT", 2)) three_digits (buf, buflen, "libtorrent (Rasterbar)", id+3); else if (!memcmp (id+1, "lt", 2)) three_digits (buf, buflen, "libTorrent (Rakshasa)", id+3); else if (!memcmp (id+1, "MP", 2)) three_digits (buf, buflen, "MooPolice", id+3); else if (!memcmp (id+1, "pb", 2)) three_digits (buf, buflen, "pbTorrent", id+3); else if (!memcmp (id+1, "TT", 2)) three_digits (buf, buflen, "TuoTu", id+3); else if (!memcmp (id+1, "qB", 2)) three_digits (buf, buflen, "qBittorrent", id+3); else if (!memcmp (id+1, "AX", 2)) two_major_two_minor (buf, buflen, "BitPump", id+3); else if (!memcmp (id+1, "BC", 2)) two_major_two_minor (buf, buflen, "BitComet", id+3); else if (!memcmp (id+1, "CD", 2)) two_major_two_minor (buf, buflen, "Enhanced CTorrent", id+3); else if (!memcmp (id+1, "LP", 2)) two_major_two_minor (buf, buflen, "Lphant", id+3); else if (!memcmp (id+1, "BF", 2)) no_version (buf, buflen, "BitFlu"); else if (!memcmp (id+1, "LW", 2)) no_version (buf, buflen, "LimeWire"); else if (!memcmp (id+1, "BB", 2)) { tr_snprintf (buf, buflen, "BitBuddy %c.%c%c%c", id[3], id[4], id[5], id[6]); } else if (!memcmp (id+1, "BR", 2)) { tr_snprintf (buf, buflen, "BitRocket %c.%c (%c%c)", id[3], id[4], id[5], id[6]); } else if (!memcmp (id+1, "CT", 2)) { tr_snprintf (buf, buflen, "CTorrent %d.%d.%02d", charint (id[3]), charint (id[4]), strint (id+5,2)); } else if (!memcmp (id+1, "XC", 2) || !memcmp (id+1, "XX", 2)) { tr_snprintf (buf, buflen, "Xtorrent %d.%d (%d)", charint (id[3]), charint (id[4]), strint (id+5,2)); } else if (!memcmp (id+1, "BOW", 3)) { if (!memcmp (&id[4], "A0B", 3)) tr_snprintf (buf, buflen, "Bits on Wheels 1.0.5"); else if (!memcmp (&id[4], "A0C", 3)) tr_snprintf (buf, buflen, "Bits on Wheels 1.0.6"); else tr_snprintf (buf, buflen, "Bits on Wheels %c.%c.%c", id[4], id[5], id[5]); } else if (!memcmp (id+1, "MG", 2)) { tr_snprintf (buf, buflen, "MediaGet %d.%02d", charint (id[3]), charint (id[4])); } if (*buf) return buf; } /* uTorrent will replace the trailing dash with an extra digit for longer version numbers */ if (id[0] == '-') { if (!memcmp (id+1, "UT", 2)) { tr_snprintf (buf, buflen, "\xc2\xb5Torrent %d.%d.%d%s", strint (id+3,1), strint (id+4,1), strint (id+5,2), getMnemonicEnd (id[7])); } else if (!memcmp (id+1, "UM", 2)) { tr_snprintf (buf, buflen, "\xc2\xb5Torrent Mac %d.%d.%d%s", strint (id+3,1), strint (id+4,1), strint (id+5,2), getMnemonicEnd (id[7])); } else if (!memcmp (id+1, "UE", 2)) { tr_snprintf (buf, buflen, "\xc2\xb5Torrent Embedded %d.%d.%d%s", strint (id+3,1), strint (id+4,1), strint (id+5,2), getMnemonicEnd (id[7])); } if (*buf) return buf; } /* Mainline */ if (isMainlineStyle (id)) { if (*id=='M') mainline_style (buf, buflen, "BitTorrent", id); if (*id=='Q') mainline_style (buf, buflen, "Queen Bee", id); if (*buf) return buf; } if (decodeBitCometClient (buf, buflen, id)) return buf; /* Clients with no version */ if (!memcmp (id, "AZ2500BT", 8)) no_version (buf, buflen, "BitTyrant (Azureus Mod)"); else if (!memcmp (id, "LIME", 4)) no_version (buf, buflen, "Limewire"); else if (!memcmp (id, "martini", 7)) no_version (buf, buflen, "Martini Man"); else if (!memcmp (id, "Pando", 5)) no_version (buf, buflen, "Pando"); else if (!memcmp (id, "a00---0", 7)) no_version (buf, buflen, "Swarmy"); else if (!memcmp (id, "a02---0", 7)) no_version (buf, buflen, "Swarmy"); else if (!memcmp (id, "-G3", 3)) no_version (buf, buflen, "G3 Torrent"); else if (!memcmp (id, "10-------", 9)) no_version (buf, buflen, "JVtorrent"); else if (!memcmp (id, "346-", 4)) no_version (buf, buflen, "TorrentTopia"); else if (!memcmp (id, "eX", 2)) no_version (buf, buflen, "eXeem"); else if (!memcmp (id, "aria2-", 6)) no_version (buf, buflen, "aria2"); else if (!memcmp (id, "-WT-", 4)) no_version (buf, buflen, "BitLet"); else if (!memcmp (id, "-FG", 3)) two_major_two_minor (buf, buflen, "FlashGet", id+3); /* Everything else */ else if (!memcmp (id, "S3", 2) && id[2] == '-' && id[4] == '-' && id[6] == '-') { tr_snprintf (buf, buflen, "Amazon S3 %c.%c.%c", id[3], id[5], id[7]); } else if (!memcmp (id, "OP", 2)) { tr_snprintf (buf, buflen, "Opera (Build %c%c%c%c)", id[2], id[3], id[4], id[5]); } else if (!memcmp (id, "-ML", 3)) { tr_snprintf (buf, buflen, "MLDonkey %c%c%c%c%c", id[3], id[4], id[5], id[6], id[7]); } else if (!memcmp (id, "DNA", 3)) { tr_snprintf (buf, buflen, "BitTorrent DNA %d.%d.%d", strint (id+3,2), strint (id+5,2), strint (id+7,2)); } else if (!memcmp (id, "Plus", 4)) { tr_snprintf (buf, buflen, "Plus! v2 %c.%c%c", id[4], id[5], id[6]); } else if (!memcmp (id, "XBT", 3)) { tr_snprintf (buf, buflen, "XBT Client %c.%c.%c%s", id[3], id[4], id[5], getMnemonicEnd (id[6])); } else if (!memcmp (id, "Mbrst", 5)) { tr_snprintf (buf, buflen, "burst! %c.%c.%c", id[5], id[7], id[9]); } else if (!memcmp (id, "btpd", 4)) { tr_snprintf (buf, buflen, "BT Protocol Daemon %c%c%c", id[5], id[6], id[7]); } else if (!memcmp (id, "BLZ", 3)) { tr_snprintf (buf, buflen, "Blizzard Downloader %d.%d", id[3]+1, id[4]); } else if (!memcmp (id, "-SP", 3)) { three_digits (buf, buflen, "BitSpirit", id+3); } else if ('\0' == id[0] && !memcmp (id+2, "BS", 2)) { tr_snprintf (buf, buflen, "BitSpirit %u", (id[1] == 0 ? 1 : id[1])); } else if (!memcmp (id, "QVOD", 4)) { four_digits (buf, buflen, "QVOD", id+4); } else if (!memcmp (id, "-NE", 3)) { four_digits (buf, buflen, "BT Next Evolution", id+3); } else if (!memcmp (id, "TIX", 3)) { two_major_two_minor (buf, buflen, "Tixati", id+3); } /* Shad0w-style */ if (!*buf) { int a, b, c; if (strchr ("AOQRSTU", id[0]) && getShadowInt (id[1], &a) && getShadowInt (id[2], &b) && getShadowInt (id[3], &c)) { const char * name = NULL; switch (id[0]) { case 'A': name = "ABC"; break; case 'O': name = "Osprey"; break; case 'Q': name = "BTQueue"; break; case 'R': name = "Tribler"; break; case 'S': name = "Shad0w"; break; case 'T': name = "BitTornado"; break; case 'U': name = "UPnP NAT Bit Torrent"; break; } if (name) { tr_snprintf (buf, buflen, "%s %d.%d.%d", name, a, b, c); return buf; } } } /* No match */ if (!*buf) { char out[32], *walk=out; const char *in, *in_end; for (in= (const char*)id, in_end=in+8; in!=in_end; ++in) { if (isprint ((unsigned char) *in)) *walk++ = *in; else { tr_snprintf (walk, out+sizeof (out)-walk, "%%%02X", (unsigned int)*in); walk += 3; } } *walk = '\0'; tr_strlcpy (buf, out, buflen); } return buf; } transmission-2.92/PaxHeaders.4960/qt0000644000000000000000000000013112667111043014225 xustar0029 mtime=1457295907.57659665 30 atime=1418239362.976223352 30 ctime=1457295917.277761613 transmission-2.92/qt/0000755000175000017500000000000012667111043015730 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/PaxHeaders.4960/BaseDialog.h0000644000000000000000000000013212571431256016453 xustar0030 mtime=1441149614.409176884 30 atime=1441149614.409176884 30 ctime=1457295917.240760984 transmission-2.92/qt/BaseDialog.h0000644000175000017500000000106012571431256020075 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: BaseDialog.h 14561 2015-09-01 20:19:26Z mikedld $ */ #ifndef QTR_BASE_DIALOG_H #define QTR_BASE_DIALOG_H #include class BaseDialog: public QDialog { public: BaseDialog (QWidget * parent = nullptr, Qt::WindowFlags flags = 0): QDialog (parent, flags) { setWindowFlags (windowFlags () & ~Qt::WindowContextHelpButtonHint); } }; #endif // QTR_BASE_DIALOG_H transmission-2.92/qt/PaxHeaders.4960/FileTreeItem.h0000644000000000000000000000013212562200461016767 xustar0030 mtime=1439236401.249800042 30 atime=1439236401.249800042 30 ctime=1457295917.240760984 transmission-2.92/qt/FileTreeItem.h0000644000175000017500000000464512562200461020425 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FileTreeItem.h 14557 2015-08-10 19:40:58Z mikedld $ */ #ifndef QTR_FILE_TREE_ITEM_H #define QTR_FILE_TREE_ITEM_H #include #include #include #include #include #include #include class FileTreeItem { Q_DECLARE_TR_FUNCTIONS (FileTreeItem) Q_DISABLE_COPY (FileTreeItem) public: enum { LOW = (1 << 0), NORMAL = (1 << 1), HIGH = (1 << 2) }; public: FileTreeItem (const QString& name = QString (), int fileIndex = -1, uint64_t size = 0): myName (name), myFileIndex (fileIndex), myTotalSize (size), myParent (nullptr), myPriority (0), myIsWanted (false), myHaveSize (0), myFirstUnhashedRow (0) {} ~FileTreeItem(); public: void appendChild (FileTreeItem * child); FileTreeItem * child (const QString& filename); FileTreeItem * child (int row) { return myChildren.at (row); } int childCount () const { return myChildren.size (); } FileTreeItem * parent () { return myParent; } const FileTreeItem * parent () const { return myParent; } int row () const; const QString& name () const { return myName; } QVariant data (int column, int role) const; std::pair update (const QString& name, bool want, int priority, uint64_t have, bool updateFields); void setSubtreeWanted (bool, QSet& fileIds); void setSubtreePriority (int priority, QSet& fileIds); int fileIndex () const { return myFileIndex; } uint64_t totalSize () const { return myTotalSize; } QString path () const; bool isComplete () const; int priority () const; int isSubtreeWanted () const; private: QString priorityString () const; QString sizeString () const; void getSubtreeWantedSize (uint64_t& have, uint64_t& total) const; double progress () const; uint64_t size () const; const QHash& getMyChildRows(); private: QString myName; const int myFileIndex; const uint64_t myTotalSize; FileTreeItem * myParent; QList myChildren; QHash myChildRows; int myPriority; bool myIsWanted; uint64_t myHaveSize; size_t myFirstUnhashedRow; }; #endif // QTR_FILE_TREE_ITEM_H transmission-2.92/qt/PaxHeaders.4960/OptionsDialog.h0000644000000000000000000000013212571431256017234 xustar0030 mtime=1441149614.412176937 30 atime=1441149614.412176937 30 ctime=1457295917.237760933 transmission-2.92/qt/OptionsDialog.h0000644000175000017500000000350412571431256020663 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: OptionsDialog.h 14561 2015-09-01 20:19:26Z mikedld $ */ #ifndef QTR_OPTIONS_DIALOG_H #define QTR_OPTIONS_DIALOG_H #include #include #include #include #include #include #include #include "AddData.h" // AddData #include "BaseDialog.h" #include "Torrent.h" // FileList #include "ui_OptionsDialog.h" class Prefs; class Session; extern "C" { struct tr_variant; } class OptionsDialog: public BaseDialog { Q_OBJECT public: OptionsDialog (Session& session, const Prefs& prefs, const AddData& addme, QWidget * parent = nullptr); virtual ~OptionsDialog (); private: typedef QMap mybins_t; private: void reload (); void clearInfo (); void clearVerify (); private slots: void onAccepted (); void onPriorityChanged (const QSet& fileIndices, int); void onWantedChanged (const QSet& fileIndices, bool); void onVerify (); void onTimeout (); void onSourceChanged (); void onDestinationChanged (); private: Session& mySession; AddData myAdd; Ui::OptionsDialog ui; QDir myLocalDestination; bool myHaveInfo; tr_info myInfo; QPushButton * myVerifyButton; QVector myPriorities; QVector myWanted; FileList myFiles; QTimer myVerifyTimer; char myVerifyBuf[2048 * 4]; QFile myVerifyFile; uint64_t myVerifyFilePos; int myVerifyFileIndex; uint32_t myVerifyPieceIndex; uint32_t myVerifyPiecePos; QVector myVerifyFlags; QCryptographicHash myVerifyHash; mybins_t myVerifyBins; QTimer myEditTimer; }; #endif // QTR_OPTIONS_DIALOG_H transmission-2.92/qt/PaxHeaders.4960/qtr.rc0000644000000000000000000000013212442116610015433 xustar0030 mtime=1418239368.304314661 30 atime=1418239368.304314661 30 ctime=1457295917.269761477 transmission-2.92/qt/qtr.rc0000644000175000017500000000004512442116610017057 0ustar00mikedldmikedld00000000000000IDI_ICON1 ICON DISCARDABLE "qtr.ico" transmission-2.92/qt/PaxHeaders.4960/FilterBarLineEdit.h0000644000000000000000000000013212537301461017745 xustar0030 mtime=1434288945.177419338 30 atime=1434288945.177419338 30 ctime=1457295917.244761052 transmission-2.92/qt/FilterBarLineEdit.h0000644000175000017500000000126612537301461021377 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FilterBarLineEdit.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_FILTER_BAR_LINE_EDIT_H #define QTR_FILTER_BAR_LINE_EDIT_H #include class QToolButton; class FilterBarLineEdit: public QLineEdit { Q_OBJECT public: FilterBarLineEdit (QWidget * parent = nullptr); protected: // QWidget virtual void resizeEvent (QResizeEvent * event); private slots: void updateClearButtonVisibility (); private: QToolButton * myClearButton; }; #endif // QTR_FILTER_BAR_LINE_EDIT_H transmission-2.92/qt/PaxHeaders.4960/InteropHelper.h0000644000000000000000000000013212634376710017244 xustar0030 mtime=1450311112.716085615 30 atime=1450311112.716085615 30 ctime=1457295917.246761086 transmission-2.92/qt/InteropHelper.h0000644000175000017500000000151512634376710020673 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: InteropHelper.h 14624 2015-12-16 20:01:03Z mikedld $ */ #ifndef QTR_INTEROP_HELPER_H #define QTR_INTEROP_HELPER_H #ifdef ENABLE_COM_INTEROP #include "ComInteropHelper.h" #endif #ifdef ENABLE_DBUS_INTEROP #include "DBusInteropHelper.h" #endif class QAxObject; class QString; class QVariant; class InteropHelper { public: bool isConnected () const; bool addMetainfo (const QString& metainfo); static void initialize (); static void registerObject (QObject * parent); private: #ifdef ENABLE_DBUS_INTEROP DBusInteropHelper myDbusClient; #endif #ifdef ENABLE_COM_INTEROP ComInteropHelper myComClient; #endif }; #endif // QTR_INTEROP_HELPER_H transmission-2.92/qt/PaxHeaders.4960/translations0000644000000000000000000000013112664476417016766 xustar0030 mtime=1456635151.996496524 29 atime=1418239366.89329048 30 ctime=1457295917.277761613 transmission-2.92/qt/translations/0000755000175000017500000000000012664476417020471 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/translations/PaxHeaders.4960/transmission_en.ts0000644000000000000000000000013212664476417022627 xustar0030 mtime=1456635151.996496524 30 atime=1456635151.996496524 30 ctime=1457295917.269761477 transmission-2.92/qt/translations/transmission_en.ts0000644000175000017500000025512412664476417024265 0ustar00mikedldmikedld00000000000000 UTF-8 AboutDialog About Transmission <b style='font-size:x-large'>Transmission %1</b> A fast and easy BitTorrent client Copyright (c) The Transmission Project C&redits &License Credits Application <b>Transmission is a file sharing program.</b> When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. I &Agree Torrent Completed Torrent Added DetailsDialog None Mixed Unknown Finished Paused Active now %1 ago %1 (%Ln pieces @ %2) %1 (%Ln piece @ %2) %1 (%Ln pieces @ %2) %1 (%Ln pieces) %1 (%Ln piece) %1 (%Ln pieces) Private to this tracker -- DHT and PEX disabled Public torrent Created by %1 Created on %1 Created by %1 on %2 Encrypted connection Optimistic unchoke Downloading from this peer We would download from this peer if they would let us Uploading to peer We would upload to this peer if they asked Peer has unchoked us, but we're not interested We unchoked this peer, but they're not interested Peer was discovered through DHT Peer was discovered through Peer Exchange (PEX) Peer is an incoming connection minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minute minutes Error Tracker already exists. %1 (100%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data %1 of %2 (%3%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data, %2 is overall size of torrent data, %3 is percentage (%1/%2*100) %1 of %2 (%3%), %4 Unverified Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded data (both verified and unverified), %2 is overall size of torrent data, %3 is percentage (%1/%2*100), %4 is amount of downloaded but not yet verified data %1 (%2 corrupt) %1 (Ratio: %2) N/A Peer is connected over uTP Add URL Add tracker announce URL: Invalid URL "%1" Edit URL Edit tracker announce URL: High Normal Low Use Global Settings Seed regardless of ratio Stop seeding at ratio: Seed regardless of activity Stop seeding if idle for: Up Down % Status Address Client Torrent Properties Information Activity Have: Availability: Uploaded: Downloaded: State: Running time: Remaining time: Last activity: Error: Details Size: Location: Hash: Privacy: Origin: Comment: Peers Tracker Add Tracker Edit Tracker Remove Trackers Show &more details Show &backup trackers Files Options Speed Honor global &limits Limit &download speed: Limit &upload speed: Torrent &priority: Seeding Limits &Ratio: &Idle: Peer Connections &Maximum peers: FileAdded Add Torrent <p><b>Unable to add "%1".</b></p><p>It is a duplicate of "%2" which is already added.</p> Error Adding Torrent FileTreeItem Low High Normal Mixed FileTreeModel File Size Progress Download Priority FileTreeView Check Selected Uncheck Selected Only Check Selected Priority Open Rename... FilterBar All Active Downloading Seeding Paused Finished Verifying Error Show: FilterBarLineEdit Search... Formatter B/s kB/s MB/s GB/s TB/s B kB MB GB TB KiB MiB GiB TiB Unknown None %1 %2 %Ln day(s) %Ln day %Ln days %Ln hour(s) %Ln hour %Ln hours %Ln minute(s) %Ln minute %Ln minutes %Ln second(s) %Ln second %Ln seconds %1, %2 FreeSpaceLabel <i>Calculating Free Space...</i> %1 free LicenseDialog License MainWindow Transmission &Torrent &Edit &Help &View &File &New... Create a new torrent &Properties Show torrent properties Open the torrent's folder Queue &Open... Open Open a torrent Open Fold&er &Start Start torrent Ask Tracker for &More Peers Ask tracker for more peers &Pause Pause torrent &Verify Local Data Verify local data &Remove Remove torrent &Delete Files and Remove Remove torrent and delete its files &Start All &Pause All &Quit &Select All &Deselect All &Preferences &Compact View Compact View &Toolbar &Filterbar &Statusbar Sort by &Activity Sort by A&ge Sort by Time &Left Sort by &Name Sort by &Progress Sort by Rati&o Sort by Si&ze Sort by Stat&e Sort by T&racker Message &Log &Statistics &Contents &About Re&verse Sort Order &Name &Files &Tracker Total Ratio Session Ratio Total Transfer Session Transfer &Main Window Tray &Icon &Change Session... Choose Session Start a local session or connect to a running session Set &Location... &Copy Magnet Link to Clipboard Open &URL... &Donate Start &Now Bypass the queue and start now Move to &Top Move &Up Move &Down Move to &Bottom Sort by &Queue Limit Download Speed Unlimited Limited at %1 Limit Upload Speed Stop Seeding at Ratio Seed Forever Stop at Ratio (%1) - %1:%2 Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); notice that leading space (before the dash) is included here Idle Ratio: %1 Down: %1, Up: %2 Torrent Files (*.torrent);;All Files (*.*) Show &options dialog Open Torrent Speed Limits Network Error Click to disable Temporary Speed Limits (%1 down, %2 up) Click to enable Temporary Speed Limits (%1 down, %2 up) Remove torrent? Delete this torrent's downloaded files? Remove %Ln torrent(s)? Remove %Ln torrent? Remove %Ln torrents? Showing %L1 of %Ln torrent(s) Showing %L1 of %Ln torrent Showing %L1 of %Ln torrents Delete these %Ln torrent(s)' downloaded files? Delete this %Ln torrent's downloaded files? Delete these %Ln torrents' downloaded files? Once removed, continuing the transfer will require the torrent file or magnet link. Once removed, continuing the transfers will require the torrent files or magnet links. This torrent has not finished downloading. These torrents have not finished downloading. This torrent is connected to peers. These torrents are connected to peers. One of these torrents is connected to peers. Some of these torrents are connected to peers. One of these torrents has not finished downloading. Some of these torrents have not finished downloading. %1 has not responded yet %1 is responding %1 last responded %2 ago %1 is not responding MakeDialog New Torrent <i>No source selected<i> %Ln File(s) %Ln File %Ln Files %Ln Piece(s) %Ln Piece %Ln Pieces %1 in %2; %3 @ %4 Files Sa&ve to: Source f&older: Source &file: Properties &Trackers: To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. Co&mment: &Private torrent MakeProgressDialog New Torrent Creating "%1" Created "%1"! Error: invalid announce URL "%1" Cancelled Error reading "%1": %2 Error writing "%1": %2 OptionsDialog Open Torrent Open Torrent from File Open Torrent from URL or Magnet Link &Source: &Destination folder: High Normal Low &Priority: S&tart when added &Verify Local Data Mo&ve .torrent file to the trash Torrent Files (*.torrent);;All Files (*.*) Select Destination PathButton (None) Select Folder Select File PrefsDialog Use &authentication &Username: Pass&word: &Open web client Addresses: Speed Limits <small>Override normal speed limits manually or at scheduled times</small> &Scheduled times: &On days: Every Day Weekdays Weekends Sunday Monday Tuesday Wednesday Thursday Friday Saturday Port is <b>open</b> Port is <b>closed</b> Incoming Peers Status unknown &Port for incoming connections: Use UPnP or NAT-PMP port &forwarding from my router Options Enable &uTP for peer connections uTP is a tool for reducing network congestion. minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minute minutes minute(s) ago Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) minute ago minutes ago Automatically add .torrent files &from: Show the Torrent Options &dialog &Start added torrents Mo&ve the .torrent file to the trash Download Queue Ma&ximum active downloads: Incomplete Seeding Remote <i>Blocklist contains %Ln rule(s)</i> <i>Blocklist contains %Ln rule</i> <i>Blocklist contains %Ln rules</i> Pick a &random port every time Transmission is started Limits Maximum peers per &torrent: Maximum peers &overall: <b>Update succeeded!</b><p>Blocklist now has %Ln rule(s). <b>Update succeeded!</b><p>Blocklist now has %Ln rule. <b>Update succeeded!</b><p>Blocklist now has %Ln rules. <b>Update Blocklist</b><p>Getting new blocklist... Blocklist Enable &automatic updates Allow encryption Prefer encryption Require encryption Privacy &to Desktop Show Transmission icon in the &notification area Te&st Port Enable &blocklist: &Update &Encryption mode: Remote Control Allow &remote access HTTP &port: Only allow these IP a&ddresses: &Upload: &Download: Alternative Speed Limits U&pload: Do&wnload: Start &minimized in notification area Notification Show a notification when torrents are a&dded Show a notification when torrents &finish Play a &sound when torrents finish Testing TCP Port... Peer Limits Use PE&X to find more peers PEX is a tool for exchanging peer lists with the peers you're connected to. Use &DHT to find more peers DHT is a tool for finding peers without a tracker. Use &Local Peer Discovery to find more peers LPD is a tool for finding peers on your local network. Encryption Select "Torrent Done" Script Select Incomplete Directory Select Watch Directory Select Destination Adding Download is i&nactive if data sharing stopped: Please keep this phrase as short as possible, it's curently the longest and influences dialog width Downloading Append ".&part" to incomplete files' names Keep &incomplete files in: Save to &Location: Call scrip&t when torrent is completed: Stop seeding at &ratio: Stop seedi&ng if idle for: Transmission Preferences Speed Network Not supported by remote sessions QObject Invalid option RelocateDialog Select Location Set Torrent Location Set Location New &location: &Move from the current folder Local data is &already there Session Error Renaming Path <p><b>Unable to rename "%1" as "%2": %3.</b></p> <p>Please correct the errors and try again.</p> Add Torrent SessionDialog Change Session Source Start &Local Session Connect to &Remote Session &Host: &Port: &Authentication required &Username: Pass&word: StatsDialog Statistics Current Session Uploaded: Downloaded: Ratio: Duration: Total Started %Ln time(s) Started %Ln time Started %Ln times Torrent Verifying local data Downloading Seeding Finished Paused Queued for verification Queued for download Queued for seeding Tracker gave a warning: %1 Tracker gave an error: %1 Error: %1 TorrentDelegate Magnetized transfer - retrieving metadata (%1%) First part of torrent progress string; %1 is the percentage of torrent metadata downloaded %1 of %2 (%3%) First part of torrent progress string; %1 is how much we've got, %2 is how much we'll have when done, %3 is a percentage of the two %1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio, %6 is the ratio we want to reach before we stop uploading %1 of %2 (%3%), uploaded %4 (Ratio: %5) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio %1, uploaded %2 (Ratio: %3 Goal: %4) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio, %4 is the ratio we want to reach before we stop uploading %1, uploaded %2 (Ratio: %3) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio - %1 left Second (optional) part of torrent progress string; %1 is duration; notice that leading space (before the dash) is included here - Remaining time unknown Second (optional) part of torrent progress string; notice that leading space (before the dash) is included here Ratio: %1 Downloading from %Ln peer(s) First part of phrase "Downloading from ... peer(s) and ... web seed(s)" Downloading from %Ln peer Downloading from %Ln peers Seeding to %Ln peer(s) Seeding to %Ln peer Seeding to %Ln peers - Downloading metadata from %Ln peer(s) (%1% done) Downloading metadata from %Ln peer (%1% done) Downloading metadata from %Ln peers (%1% done) Downloading from %1 of %Ln connected peer(s) First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" Downloading from %1 of %Ln connected peer Downloading from %1 of %Ln connected peers and %Ln web seed(s) Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; notice that leading space (before "and") is included here and %Ln web seed and %Ln web seeds Seeding to %1 of %Ln connected peer(s) Seeding to %1 of %Ln connected peer Seeding to %1 of %Ln connected peers Error Verifying local data (%1% tested) TrackerDelegate Got a list of%1 %Ln peer(s)%2 %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Got a list of%1 %Ln peer%2 %3 ago Got a list of%1 %Ln peers%2 %3 ago Peer list request %1timed out%2 %3 ago; will retry %1 and %2 are replaced with HTML markup, %3 is duration Got an error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration No updates scheduled Asking for more peers in %1 %1 is duration Queued to ask for more peers Asking for more peers now... <small>%1</small> %1 is duration Tracker had%1 %Ln seeder(s)%2 First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup Tracker had%1 %Ln seeder%2 Tracker had%1 %Ln seeders%2 and%1 %Ln leecher(s)%2 %3 ago Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup, %3 is duration; notice that leading space (before "and") is included here and%1 %Ln leecher%2 %3 ago and%1 %Ln leechers%2 %3 ago Tracker had %1no information%2 on peer counts %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Got a scrape error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Asking for peer counts in %1 %1 is duration Queued to ask for peer counts Asking for peer counts now... <small>%1</small> %1 is duration transmission-2.92/qt/translations/PaxHeaders.4960/transmission_it_IT.ts0000644000000000000000000000013212664476417023235 xustar0030 mtime=1456635151.988496386 30 atime=1456635151.987496369 30 ctime=1457295917.274761562 transmission-2.92/qt/translations/transmission_it_IT.ts0000644000175000017500000026242712664476417024677 0ustar00mikedldmikedld00000000000000 UTF-8 AboutDialog About Transmission Informazioni su Transmission <b style='font-size:x-large'>Transmission %1</b> <b style='font-size:x-large'>Transmission %1</b> A fast and easy BitTorrent client Un client BitTorrent semplice e veloce Copyright (c) The Transmission Project Copyright (c) The Transmission Project C&redits C&rediti &License &Licenza Credits Crediti Application <b>Transmission is a file sharing program.</b> <b>Transmission è un programma di file sharing.</b> When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. Quando avvii un torrent, i suoi dati saranno resi disponibili a terzi tramite upload. Qualsiasi contenuto condividerai è di tua sola responsabilità. I &Agree &Accetto Torrent Completed Torrent completato Torrent Added Torrent aggiunto DetailsDialog None Nessuno Mixed Misto Unknown Sconosciuto Finished Finito Paused In pausa Active now Attivo %1 ago %1 fa %1 (%Ln pieces @ %2) %1 (%Ln pezzo @ %2) %1 (%Ln pezzi @ %2) %1 (%Ln pieces) %1 (%Ln pezzo) %1 (%Ln pezzi) Private to this tracker -- DHT and PEX disabled Privato a questo tracker -- DHT e PEX disabilitati Public torrent Torrent pubblico Created by %1 Creato da %1 Created on %1 Creato il %1 Created by %1 on %2 Creato da %1 il %2 Encrypted connection Connessione crittografata Optimistic unchoke Optimistic unchoke Downloading from this peer Download da questo peer We would download from this peer if they would let us Vorremmo scaricare da questo peer se ce lo permettono Uploading to peer Upload al peer We would upload to this peer if they asked Vorremmo caricare a questo peer se ce lo chiede Peer has unchoked us, but we're not interested Il peer ci ha "unchoked", ma non siamo interessati We unchoked this peer, but they're not interested Abbiamo "unchoked" questo peer, ma non sono interessati Peer was discovered through DHT Il peer è stato scoperto attraverso DHT Peer was discovered through Peer Exchange (PEX) Il peer è stato trovato attraverso il Peer Exchange (PEX) Peer is an incoming connection Il peer è una connessione in ingresso minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minuto minuti Error Errore Tracker already exists. Il tracker è già esistente. %1 (100%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data %1 (100%) %1 of %2 (%3%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data, %2 is overall size of torrent data, %3 is percentage (%1/%2*100) %1 di %2 (%3%) %1 of %2 (%3%), %4 Unverified Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded data (both verified and unverified), %2 is overall size of torrent data, %3 is percentage (%1/%2*100), %4 is amount of downloaded but not yet verified data %1 di %2 (%3%), %4 Non verificato %1 (%2 corrupt) %1 (%2 corrotto) %1 (Ratio: %2) %1 (Rapporto: %2) N/A N/D Peer is connected over uTP Il peer è connesso attraverso uTP Add URL Aggiungi URL Add tracker announce URL: Aggiungi tracker announce URL: Invalid URL "%1" URL non valido "%1" Edit URL Modifica URL Edit tracker announce URL: Modifica tracker announce URL: High Alta Normal Normale Low Bassa Use Global Settings Usa impostazioni globali Seed regardless of ratio Fai seed indipendentemente dal rapporto Stop seeding at ratio: Ferma al rapporto di seed: Seed regardless of activity Fai seed indipendentemente dall'attività Stop seeding if idle for: Ferma il seed se inattivo per: Up Up Down Down % % Status Stato Address Indirizzo Client Client Torrent Properties Proprietà torrent Information Informazioni Activity Attività Have: Possiede: Availability: Disponibilità: Uploaded: Caricato: Downloaded: Scaricato: State: Stato: Running time: Tempo trascorso: Remaining time: Tempo rimanente: Last activity: Ultima attività: Error: Errori: Details Dettagli Size: Dimensione: Location: Posizione: Hash: Hash: Privacy: Privacy: Origin: Origine: Comment: Commento: Peers Peer Tracker Tracker Add Tracker Aggiungi tracker Edit Tracker Modifica tracker Remove Trackers Rimuovi tracker Show &more details Mostra &più dettagli Show &backup trackers Mostra i tracker di &backup Files File Options Opzioni Speed Velocità Honor global &limits Rispetta i &limiti globali Limit &download speed: Limita velocità in &download: Limit &upload speed: Limita velocità in &upload: Torrent &priority: &Priorità torrent: Seeding Limits Limiti di seed &Ratio: &Rapporto: &Idle: &Inattività: Peer Connections Connessioni ai peer &Maximum peers: Peer &massimi: FileAdded Add Torrent Aggiungi torrent <p><b>Unable to add "%1".</b></p><p>It is a duplicate of "%2" which is already added.</p> <p><b>Impossibile aggiungere "%1".</b></p><p>In quanto è un duplicato di "%2" che è già stato aggiunto.</p> Error Adding Torrent Errore durante l'aggiunta del torrent FileTreeItem Low Bassa High Alta Normal Normale Mixed Mista FileTreeModel File File Size Dimensione Progress Avanzamento Download Download Priority Priorità FileTreeView Check Selected Spunta selezionati Uncheck Selected Togli la spunta dai selezionati Only Check Selected Spunta solo i selezionati Priority Priorità Open Apri Rename... Rinomina... FilterBar All Tutti Active Attivi Downloading In scaricamento Seeding In seed Paused In pausa Finished Completati Verifying In verifica Error Errori Show: Mostra: FilterBarLineEdit Search... Cerca... Formatter B/s B/s kB/s kB/s MB/s MB/s GB/s GB/s TB/s TB/s B B kB kB MB MB GB GB TB TB KiB KiB MiB MiB GiB GiB TiB TiB Unknown Sconosciuta None Nessuno %1 %2 %1 %2 %Ln day(s) %Ln giorno %Ln giorni %Ln hour(s) %Ln ora %Ln ore %Ln minute(s) %Ln minuto %Ln minuti %Ln second(s) %Ln secondo %Ln secondi %1, %2 %1, %2 FreeSpaceLabel <i>Calculating Free Space...</i> <i>Calcolo dello spazio libero in corso...</i> %1 free %1 libero LicenseDialog License Licenza MainWindow Transmission Transmission &Torrent &Torrent &Edit &Modifica &Help &Aiuto &View &Visualizza &File &File &New... &Nuovo... Create a new torrent Crea un nuovo torrent &Properties &Proprietà Show torrent properties Mostra le proprietà del torrent Open the torrent's folder Apri la cartella del torrent Queue Coda &Open... &Apri... Open Apri Open a torrent Apri un torrent Open Fold&er Apri cart&ella &Start &Avvia Start torrent Avvia torrent Ask Tracker for &More Peers Chiedi al tracker per &più peer Ask tracker for more peers Chiedi al tracker per più peer &Pause &Pausa Pause torrent Metti torrent in pausa &Verify Local Data &Verifica dati locali Verify local data Verifica dati locali &Remove &Rimuovi Remove torrent Rimuovi torrent &Delete Files and Remove &Cancella file e rimuovi Remove torrent and delete its files Rimuovi torrent e cancella i suoi file &Start All &Avvia tutti &Pause All &Pausa tutti &Quit &Esci &Select All &Seleziona tutti &Deselect All &Deseleziona tutti &Preferences &Preferenze &Compact View Vista &compatta Compact View Vista compatta &Toolbar &Toolbar &Filterbar Barra dei &filtri &Statusbar Barra di &stato Sort by &Activity Ordina per &attività Sort by A&ge Ordina per &Età Sort by Time &Left Ordina per tempo &rimanente Sort by &Name Ordina per &Nome Sort by &Progress Ordina per A&vanzamento Sort by Rati&o Ordina per rapp&orto Sort by Si&ze Ordina per &dimensione Sort by Stat&e Ordina per &stato Sort by T&racker Ordina per t&racker Message &Log &Log dei messaggi &Statistics &Statistiche &Contents &Contenuti &About &Informazioni Re&verse Sort Order In&verti ordinamento &Name &Nome &Files &File &Tracker &Tracker Total Ratio Rapporto totale Session Ratio Rapporto di sessione Total Transfer Trasferimento totale Session Transfer Trasferimento di sessione &Main Window &Finestra principale Tray &Icon &Icona nell'area di notifica &Change Session... &Cambia sessione... Choose Session Start a local session or connect to a running session Scegli sessione Set &Location... Seleziona &Posizione... &Copy Magnet Link to Clipboard &Copia link magnetico negli appunti Open &URL... Apri &URL... &Donate &Dona Start &Now Avvia &Ora Bypass the queue and start now Ignora la coda e avvia ora Move to &Top Sposta in &cima Move &Up Sposta &su Move &Down Sposta &giù Move to &Bottom Sposta in &basso Sort by &Queue Ordina per &coda Limit Download Speed Limita velocità di download Unlimited Illimitata Limited at %1 Limitata a %1 Limit Upload Speed Limita velocità di upload Stop Seeding at Ratio Ferma il seed al rapporto Seed Forever Seed perpetuo Stop at Ratio (%1) Ferma al rapporto (%1) - %1:%2 Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); notice that leading space (before the dash) is included here - %1:%2 Idle Inattivo Ratio: %1 Rapporto: %1 Down: %1, Up: %2 Down: %1, Up: %2 Torrent Files (*.torrent);;All Files (*.*) File torrent (*.torrent);;Tutti i file (*.*) Show &options dialog Mostra maschera delle &opzioni Open Torrent Apri torrent Speed Limits Limiti di velocità Network Error Errore di rete Click to disable Temporary Speed Limits (%1 down, %2 up) Premi per disabilitare i limiti di velocità temporanei (%1 down, %2 up) Click to enable Temporary Speed Limits (%1 down, %2 up) Premi per abilitare i limiti di velocità temporanei (%1 down, %2 up) Remove torrent? Rimuovere il torrent? Delete this torrent's downloaded files? Rimuovere i file scaricati da questo torrent? Remove %Ln torrent(s)? Rimuovere %Ln torrent? Rimuovere %Ln torrent? Showing %L1 of %Ln torrent(s) Delete these %Ln torrent(s)' downloaded files? Rimuovere i file scaricati da questo %Ln torrent? Rimuovere i file scaricati da questi %Ln torrent? Once removed, continuing the transfer will require the torrent file or magnet link. Una volta rimosso, continuare il trasferimento richiederà il file torrent o il magnet link. Once removed, continuing the transfers will require the torrent files or magnet links. Una volta rimosso, continuare i trasferimenti richiederà i file torrent o i magnet link. This torrent has not finished downloading. Questo torrent non ha finito lo scaricamento. These torrents have not finished downloading. Questi torrent non hanno finito lo scaricamento. This torrent is connected to peers. Questo torrent è connesso ai peer. These torrents are connected to peers. Questi torrent sono connessi ai peer. One of these torrents is connected to peers. Uno di questi torrent è connesso ai peer. Some of these torrents are connected to peers. Alcuni di questi torrent sono connessi ai peer. One of these torrents has not finished downloading. Uno di questi torrent non ha finito lo scaricamento. Some of these torrents have not finished downloading. Alcuni di questi torrent non hanno finito lo scaricamento. %1 has not responded yet %1 non ha ancora risposto %1 is responding %1 sta rispondendo %1 last responded %2 ago %1 ha risposto l'ultima volta %2 fa %1 is not responding %1 non risponde MakeDialog New Torrent Nuovo torrent <i>No source selected<i> <i>Nessuna sorgente selezionata</i> %Ln File(s) %Ln File %Ln File %Ln Piece(s) %Ln pezzo %Ln pezzi %1 in %2; %3 @ %4 %1 in %2; %3 @ %4 Files File Sa&ve to: Sal&va in: Source f&older: Cartella s&orgente: Source &file: &File sorgente: Properties Proprietà &Trackers: &Trackers: To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. Per aggiungere un URL di backup, aggiungerlo sulla riga dopo l'URL primario. Per aggiungere un altro URL primario, aggiungerlo dopo una riga vuota. Co&mment: Co&mmento: &Private torrent Torrent &privato MakeProgressDialog New Torrent Nuovo torrent Creating "%1" Sto creando "%1" Created "%1"! Creato "%1"! Error: invalid announce URL "%1" Errore: announce URL "%1" non valido Cancelled Annullato Error reading "%1": %2 Errore durante la lettura del file "%1": %2 Error writing "%1": %2 Errore durante la scrittura del file "%1": %2 OptionsDialog Open Torrent Apri torrent Open Torrent from File Apri torrent da file Open Torrent from URL or Magnet Link Apri torrent da URL o da link magnetico &Source: &Sorgente: &Destination folder: Cartella di &destinazione: High Alta Normal Normale Low Bassa &Priority: &Priorità: S&tart when added &Avvia all'aggiunta &Verify Local Data &Verifica dati locali Mo&ve .torrent file to the trash Spos&ta il file .torrent nel cestino Torrent Files (*.torrent);;All Files (*.*) File torrent (*.torrent);;Tutti i file (*.*) Select Destination Seleziona la destinazione PathButton (None) (Nessuno) Select Folder Seleziona cartella Select File Seleziona file PrefsDialog Use &authentication Usa &autenticazione &Username: Nome &utente: Pass&word: Pass&word: &Open web client Apri &client web Addresses: Indirizzi: Speed Limits Limiti di velocità <small>Override normal speed limits manually or at scheduled times</small> <small>Sostituisci i limiti di velocità normali manualmente o ad orari prestabiliti</small> &Scheduled times: &Orari prestabiliti: &On days: &Nei giorni: Every Day Ogni giorno Weekdays Settimanali Weekends Fine settimana Sunday Domenica Monday Lunedì Tuesday Martedì Wednesday Mercoledì Thursday Giovedì Friday Venerdì Saturday Sabato Port is <b>open</b> La porta è <b>aperta</b> Port is <b>closed</b> La porta è <b>chiusa</b> Incoming Peers Peer in ingresso Status unknown Stato sconosciuto &Port for incoming connections: &Porta per le connessioni in entrata: Use UPnP or NAT-PMP port &forwarding from my router Usa l'&inoltro di porta UPnP o NAT-PMP dal mio router Options Opzioni Enable &uTP for peer connections Abilita l'&uTP per le connessioni coi peer uTP is a tool for reducing network congestion. L'uTP è uno strumento per ridurre la congestione di rete. minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minuto minuti minute(s) ago Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) minuto fa minuti fa Automatically add .torrent files &from: Aggiungi automaticamente i file .torrent &da: Show the Torrent Options &dialog Mostra la &maschera delle ozioni torrent &Start added torrents &Avvia all'aggiunta del torrent Mo&ve the .torrent file to the trash Spos&ta il file .torrent nel cestino Download Queue Coda di download Ma&ximum active downloads: Numero &massimo di download attivi: Incomplete Incompleti Seeding Seeding Remote Remoto <i>Blocklist contains %Ln rule(s)</i> <i>La lista dei bloccati contiene %Ln regola</i> <i>La lista dei bloccati contiene %Ln regole</i> Pick a &random port every time Transmission is started Seleziona una porta &casuale ogni volta che Transmission viene avviato Limits Limiti Maximum peers per &torrent: Numero massimo di peer per &torrent: Maximum peers &overall: Numero massimo di peer &globali: <b>Update succeeded!</b><p>Blocklist now has %Ln rule(s). <b>Aggiornamento completato!</b><p>La lista dei bloccati ora contiene %Ln regola. <b>Aggiornamento completato!</b><p>La lista dei bloccati ora contiene %Ln regole. <b>Update Blocklist</b><p>Getting new blocklist... <b>Aggiornamento lista dei bloccati</b><p>Ricezione nuova lista dei bloccati... Blocklist Lista bloccati Enable &automatic updates Abilita aggiornamenti &automatici Allow encryption Consenti crittografia Prefer encryption Preferisci crittografia Require encryption Richiedi crittografia Privacy Privacy &to &a Desktop Desktop Show Transmission icon in the &notification area Mostra l'icona di Transmission nell'area di &notifica Te&st Port Te&sta porta Enable &blocklist: Abilita lista dei &bloccati: &Update &Aggiornamento &Encryption mode: Modalità &crittografia: Remote Control Controllo remoto Allow &remote access Consenti l'accesso &remoto HTTP &port: &Porta HTTP: Only allow these IP a&ddresses: Consenti solo i seguenti &indirizzi IP &Upload: &Upload: &Download: &Download: Alternative Speed Limits Limiti di velocità alternativi U&pload: U&pload: Do&wnload: Do&wnload: Start &minimized in notification area Avvia &ridotto nell'area di notifica Notification Notifiche Show a notification when torrents are a&dded Mostra una notifica quanto un torrent viene a&ggiunto Show a notification when torrents &finish Mostra una notifica quando un torrent viene &completato Play a &sound when torrents finish Riproduci un &suono quando un torrent viene completato Testing TCP Port... Test delle porte TCP in corso... Peer Limits Limiti dei peer Use PE&X to find more peers Usa PE&X per trovare più peer PEX is a tool for exchanging peer lists with the peers you're connected to. PEX è uno strumento per lo scambio di liste di peer con i peer con cui sei connesso. Use &DHT to find more peers Usa &DHT per trovare più peer DHT is a tool for finding peers without a tracker. DHT è uno strumento per trovare peer senza un tracker. Use &Local Peer Discovery to find more peers Usa il &Local Peer Discovery per trovare più peer LPD is a tool for finding peers on your local network. LPD è uno strumento per trovare peer sulla tua rete locale. Encryption Crittografia Select "Torrent Done" Script Seleziona lo script "torrent completato" Select Incomplete Directory Seleziona la cartella incompleti Select Watch Directory Seleziona la cartella osservata Select Destination Seleziona la destinazione Adding Aggiunta Download is i&nactive if data sharing stopped: Please keep this phrase as short as possible, it's curently the longest and influences dialog width Il download è i&nattivo se la condivisione è stata fermata: Downloading Scaricamento Append ".&part" to incomplete files' names Aggiungi ".&part" al nome di file incompleti Keep &incomplete files in: Tieni i file &incompleti in: Save to &Location: Salva nella &Posizione: Call scrip&t when torrent is completed: Chiama scrip&t quando il torrent viene completato: Stop seeding at &ratio: Ferma il seeding se il &rapporto è: Stop seedi&ng if idle for: Ferma il seedi&ng se inattivo per: Transmission Preferences Preferenze di Transmission Speed Velocità Network Rete Not supported by remote sessions Non supportato dalle sessioni remote QObject Invalid option Opzione non valida RelocateDialog Select Location Seleziona posizione Set Torrent Location Imposta posizione torrent Set Location Imposta posizione New &location: Nuova &posizione: &Move from the current folder &Sposta dalla cartella corrente Local data is &already there I dati locali sono &già li Session Error Renaming Path Errore durante la rinomina del precorso <p><b>Unable to rename "%1" as "%2": %3.</b></p> <p>Please correct the errors and try again.</p> <p><b>Impossibile rinominare "%1" in "%2": %3.</b></p> <p>Si prega di correggere gli errori e riprovare.</p> Add Torrent Aggiungi torrent SessionDialog Change Session Cambia sessione Source Sorgente Start &Local Session Avvia sessione &locale Connect to &Remote Session Connetti a una sessione &remota &Host: &Host: &Port: &Porta: &Authentication required &Autenticazione richiesta &Username: &Utente: Pass&word: Pass&word: StatsDialog Statistics Statistiche Current Session Sessione corrente Uploaded: Caricato: Downloaded: Scaricato: Ratio: Rapporto: Duration: Durata: Total Totale Started %Ln time(s) Avviato %Ln volta Avviato %Ln volte Torrent Verifying local data Verifica dei dati locali Downloading In download Seeding In seeding Finished Completato Paused In pausa Queued for verification In coda per la verifica Queued for download In coda per il download Queued for seeding In coda per il seed Tracker gave a warning: %1 Il tracker ha dato un avviso: %1 Tracker gave an error: %1 Il tracker ha dato un errore: %1 Error: %1 Errore: %1 TorrentDelegate Magnetized transfer - retrieving metadata (%1%) First part of torrent progress string; %1 is the percentage of torrent metadata downloaded Trasferimento magnetizzato - scaricamento metadati (%1%) %1 of %2 (%3%) First part of torrent progress string; %1 is how much we've got, %2 is how much we'll have when done, %3 is a percentage of the two %1 di %2 (%3%) %1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio, %6 is the ratio we want to reach before we stop uploading %1 di %2 (%3%), caricato %4 (Rapporto: %5 Obbiettivo: %6) %1 of %2 (%3%), uploaded %4 (Ratio: %5) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio %1 di %2 (%3%), caricato %4 (Rapporto: %5) %1, uploaded %2 (Ratio: %3 Goal: %4) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio, %4 is the ratio we want to reach before we stop uploading %1, caricato %2 (Rapporto: %3 Obbiettivo: %4) %1, uploaded %2 (Ratio: %3) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio %1, caricato %2 (Rapporto: %3) - %1 left Second (optional) part of torrent progress string; %1 is duration; notice that leading space (before the dash) is included here - %1 rimanente - Remaining time unknown Second (optional) part of torrent progress string; notice that leading space (before the dash) is included here - Tempo rimanente sconosciuto Ratio: %1 Rapporto: %1 Downloading from %Ln peer(s) First part of phrase "Downloading from ... peer(s) and ... web seed(s)" Scaricamento da %Ln peer Scaricamento da %Ln peer Seeding to %Ln peer(s) Seeding a %Ln peer Seeding a %Ln peer - - Downloading metadata from %Ln peer(s) (%1% done) Scaricamento metadati da %Ln peer (%1% completato) Scaricamento metadati da %Ln peer (%1% completato) Downloading from %1 of %Ln connected peer(s) First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" Scaricamento da %1 di %Ln peer connesso Scaricamento da %1 di %Ln peer connessi and %Ln web seed(s) Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; notice that leading space (before "and") is included here e %Ln web seed e %Ln web seed Seeding to %1 of %Ln connected peer(s) Seeding a %1 di %Ln peer connesso Seeding a %1 di %Ln peer connessi Error Errore Verifying local data (%1% tested) Verifica dati locali (%1% testati) TrackerDelegate Got a list of%1 %Ln peer(s)%2 %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Ottenuta una lista di%1 %Ln peer%2 %3 fa Ottenuta una lista di%1 %Ln peer%2 %3 fa Peer list request %1timed out%2 %3 ago; will retry %1 and %2 are replaced with HTML markup, %3 is duration Richiesta della lista dei peer %1scaduta%2 %3 fa; riproverò Got an error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Ricevuto un errore %1"%2"%3 %4 fa No updates scheduled Nessun aggiornamento pianificato Asking for more peers in %1 %1 is duration Richiesta di più peer in %1 Queued to ask for more peers In coda per richiedere più peer Asking for more peers now... <small>%1</small> %1 is duration Richiesta di più peer... <small>%1</small> Tracker had%1 %Ln seeder(s)%2 First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup Il tracker ha%1 %Ln seeder%2 Il tracker ha%1 %Ln seeder%2 and%1 %Ln leecher(s)%2 %3 ago Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup, %3 is duration; notice that leading space (before "and") is included here e%1 %Ln leecher%2 %3 fa e%1 %Ln leecher%2 %3 fa Tracker had %1no information%2 on peer counts %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Il tracker %1non ha informazioni%2 sul conto dei peer %3 fa Got a scrape error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Ricevuto un errore di raschiatura %1"%2"%3 %4 fa Asking for peer counts in %1 %1 is duration Richeista del conto dei peer tra %1 Queued to ask for peer counts In coda per richiedere i conteggi dei peer Asking for peer counts now... <small>%1</small> %1 is duration Richeista del conto dei peer... <small>%1</small> transmission-2.92/qt/translations/PaxHeaders.4960/transmission_hu.ts0000644000000000000000000000013212664476417022641 xustar0030 mtime=1456635151.993496472 30 atime=1456635151.993496472 30 ctime=1457295917.276761596 transmission-2.92/qt/translations/transmission_hu.ts0000644000175000017500000026054012664476417024275 0ustar00mikedldmikedld00000000000000 UTF-8 AboutDialog About Transmission A Transmission-rÅ‘l <b style='font-size:x-large'>Transmission %1</b> <b style='font-size:x-large'>Transmission %1</b> A fast and easy BitTorrent client Egy gyors és egyszerű BitTorrent kliens Copyright (c) The Transmission Project Copyright (c) The Transmission Project C&redits K&észítették &License &Licensz Credits Készítették Application <b>Transmission is a file sharing program.</b> <b>A Transmission egy fájlmegosztó program.</b> When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. Mikor futtatsz egy torrentet, az adatot feltöltés révén elérhetÅ‘vé teszed mások számára. Minden megosztott adat a saját felelÅ‘sséged. I &Agree &Elfogadom Torrent Completed Torrent befejezve Torrent Added Torrent hozzáadva DetailsDialog None Nincs Mixed Vegyes Unknown Ismeretlen Finished Befejezve Paused Szünetelteve Active now Jelenleg aktív %1 ago %1 óta %1 (%Ln pieces @ %2) %1 (%Ln darab @ %2) %1 (%Ln pieces) %1 (%Ln darab) Private to this tracker -- DHT and PEX disabled Privát ezen tracker számára --DHT és PEX letiltva Public torrent Publikus torrent Created by %1 Készítette: %1 Created on %1 Készült: %1 Created by %1 on %2 Készítette: %1 ekkor: %2 Encrypted connection Titkosított kapcsolat Optimistic unchoke Optimista unchoke Downloading from this peer Letöltés ettÅ‘l a partnertÅ‘l We would download from this peer if they would let us Töltenénk ettÅ‘l a partnertÅ‘l ha az megengedné Uploading to peer Feltöltés partnernek We would upload to this peer if they asked Feltöltenénk ennek apartnernek ha az kérné Peer has unchoked us, but we're not interested A partner unchoke-olt minket, de nem vagyunk ebben érdekeltek We unchoked this peer, but they're not interested Unchoke-oltuk a partnert, de Å‘ nem érdeklÅ‘dik Peer was discovered through DHT A partner DHT-n keresztül lett felderítva Peer was discovered through Peer Exchange (PEX) A partner PEX-en keresztül lett felfedezve Peer is an incoming connection BejövÅ‘ kapcsolatú partner minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) perc Error Hiba Tracker already exists. A tracker már létezik. %1 (100%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data %1 (100%) %1 of %2 (%3%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data, %2 is overall size of torrent data, %3 is percentage (%1/%2*100) %1 of %2 (%3%) %1 of %2 (%3%), %4 Unverified Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded data (both verified and unverified), %2 is overall size of torrent data, %3 is percentage (%1/%2*100), %4 is amount of downloaded but not yet verified data %1 of %2 (%3%), %4 EllenÅ‘rízetlen %1 (%2 corrupt) %1 (%2 hibás) %1 (Ratio: %2) %1 (Arány: %2) N/A N/A Peer is connected over uTP A partner uTP-n keresztül kapcsolódik Add URL URL hozzáadása Add tracker announce URL: Tracker URL hozzáadása: Invalid URL "%1" Érvénytelen URL: "%1" Edit URL URL szerkesztése Edit tracker announce URL: Tracker bejelentési URL szerkesztése: High Magas Normal Normál Low Alacsony Use Global Settings Globális sebességkorlátok használata Seed regardless of ratio Aránytól függetlenül seedeljen Stop seeding at ratio: Seedelés befejezése ha elérte az arányt: Seed regardless of activity Aktivitástól független seedelés Stop seeding if idle for: Seedelés befejezése ha inaktív a torrent: Up Fel Down Le % % Status Ãllapot Address Cím Client Kliens Torrent Properties Torrent tulajdonságai Information Információ Activity Aktivitás Have: Van: Availability: ElérhetÅ‘ség: Uploaded: Feltöltve: Downloaded: Letöltve: State: Ãllapot: Running time: FutásidÅ‘: Remaining time: HátralevÅ‘ idÅ‘: Last activity: Utolsó aktivitás: Error: Hiba: Details Részletek Size: Méret: Location: Hely: Hash: Hash: Privacy: Titkosítás: Origin: Eredet: Comment: Megjegyzés: Peers Partnerek Tracker Tracker Add Tracker Tracker hozzáadása Edit Tracker Tracker szerkesztése Remove Trackers Trackerek eltávolítása Show &more details További &részletek mutatása Show &backup trackers Mutassa a &backup trackereket Files Fájlok Options Opciók Speed Sebesség Honor global &limits &Globális limitek betartása Limit &download speed: &Letöltési sebességkorlát: Limit &upload speed: &Feltöltési sebességkorlát: Torrent &priority: Torrent &prioritása: Seeding Limits Sebesség korlátok &Ratio: &Arány: &Idle: &Inaktív: Peer Connections Csatlakozott partnerek &Maximum peers: Partnerek &maximális száma: FileAdded Add Torrent Torrent hozzáadása <p><b>Unable to add "%1".</b></p><p>It is a duplicate of "%2" which is already added.</p> <p><b>"%1" hozzáadása sikertelen.</b></p><p>Megegyezik a "%2" torrenttel, ami pedig már hozzá lett adva.</p> Error Adding Torrent Hiba a torrent hozzáadásakor FileTreeItem Low Alacsony High Magas Normal Normál Mixed Vegyes FileTreeModel File Fájl Size Méret Progress Folyamat Download Letöltés Priority Prioritás FileTreeView Check Selected Uncheck Selected Only Check Selected Priority Prioritás Open Megnyitás Rename... Ãtnevezés... FilterBar All Mind Active Aktív Downloading Letöltés alatt Seeding Feltöltés alatt Paused Szüneteltetve Finished Befejezve Verifying EllenÅ‘rzés Error Hiba Show: Mutat: FilterBarLineEdit Search... Keresés... Formatter B/s B/s kB/s kB/s MB/s MB/s GB/s GB/s TB/s TB/s B B kB kB MB MB GB GB TB TB KiB KiB MiB MiB GiB GiB TiB TiB Unknown Ismeretlen None Nincs %1 %2 %1 %2 %Ln day(s) %Ln nap %Ln hour(s) %Ln óra %Ln minute(s) %Ln perc %Ln second(s) %Ln másodperc %1, %2 %1, %2 FreeSpaceLabel <i>Calculating Free Space...</i> <i>Szabad terület kiszámítása...</i> %1 free %1 szabad LicenseDialog License Licensz MainWindow Transmission Transmission &Torrent &Torrent &Edit &Szerkesztés &Help &Súgó &View &Nézet &File &Fájl &New... &Új... Create a new torrent Új torrent létrehozása &Properties &Tulajdonságok Show torrent properties Torrent tulajdonságainak megjelenítése Open the torrent's folder Torrent mappájának megnyitása Queue Sorrend &Open... &Megnyitás... Open Megnyitás Open a torrent Torrent megnyitása Open Fold&er &Mappa megnyitása &Start &Indítás Start torrent Torrent indítása Ask Tracker for &More Peers Több &partner igénylése a trackertÅ‘l Ask tracker for more peers Több partner igénylése a trackertÅ‘l &Pause &Szünet Pause torrent Torrent szüneteltetése &Verify Local Data &Helyi adat ellenÅ‘rzése Verify local data Helyi adat ellenÅ‘rzése &Remove &Törlés Remove torrent Torrent törlése &Delete Files and Remove Törlés az &adatokkal együtt Remove torrent and delete its files Törlés az adatokkal együtt &Start All Összes &indítása &Pause All Összes &szüneteltetése &Quit &Kilépés &Select All Összes &kijelölése &Deselect All Kijelölés &megszüntetése &Preferences &Beállítások &Compact View &Kompakt nézet Compact View Kompakt nézet &Toolbar &Eszköztár &Filterbar &SzűrÅ‘menü &Statusbar &Lábléc Sort by &Activity Rendezés &aktivitás szerint Sort by A&ge Rendezés &kor szerint Sort by Time &Left Rendezés &hátralévÅ‘ idÅ‘ szerint Sort by &Name Rendezés &név szerint Sort by &Progress Rendezés &elkészültség szerint Sort by Rati&o Rendezés a&rány szerint Sort by Si&ze Rendezés &méret szerint Sort by Stat&e Rendezés á&llapot szerint Sort by T&racker Rendezés &tracker szerint Message &Log Ü&zenetnapló &Statistics &Statisztika &Contents &Tartalom &About A Transmission-&rÅ‘l Re&verse Sort Order Rendezés &fordítva &Name &Név &Files &Fájlok &Tracker &Tracker Total Ratio Összarány Session Ratio Munkamenet aránya Total Transfer Összes forgalom Session Transfer Munkamenet forgalma &Main Window &FÅ‘ablak Tray &Icon Tálca&ikon &Change Session... Munkamenet &váltás... Choose Session Start a local session or connect to a running session Munkamenet kiválasztása Set &Location... Adatok &helye... &Copy Magnet Link to Clipboard Magnet Link másolása a &vágólapra Open &URL... &URL megnyitása... &Donate &Adakozás Start &Now Indítás a&zonnal Bypass the queue and start now A sor figyelmen kívül hagyása és azonnali indítás Move to &Top Mozgatás &legfelülre Move &Up Mozgatás &fel Move &Down Mozgatás &le Move to &Bottom Mozgatás leg&alulra Sort by &Queue &Sorrend szerint rendezés Limit Download Speed Letöltési sebességkorlát Unlimited Korlátlan Limited at %1 Koráltozva %1-re Limit Upload Speed Feltöltési sebességkorlát Stop Seeding at Ratio Seedelés befejezése ha elérte az arányt Seed Forever Seedelés örökké Stop at Ratio (%1) Seedelés befejezése ha elérte a %1 arányt - %1:%2 Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); notice that leading space (before the dash) is included here - %1:%2 Idle Inaktív Ratio: %1 Arány: %1 Down: %1, Up: %2 Le: %1, Fel: %2 Torrent Files (*.torrent);;All Files (*.*) Torrent fájlok (*.torrent);;Minden fájl (*.*) Show &options dialog &Opciók ablak megjelenítése Open Torrent Torrent megnyitása Speed Limits Ideiglenes sebesség korlátok Network Error Hálózati hiba Click to disable Temporary Speed Limits (%1 down, %2 up) Kattintson az ideiglenes sebességkorlátok kikapcsolásához (%1 le, %2 fel) Click to enable Temporary Speed Limits (%1 down, %2 up) Kattintson az ideiglenes sebességkorlátok bekapcsolásához (%1 le, %2 fel) Remove torrent? Valóban törölni kívánod a torrentet? Delete this torrent's downloaded files? Valóban le kívánod törölni a torrent letöltött fájlait? Remove %Ln torrent(s)? Valóban törölni kívánod mind a %Ln torrentet? Showing %L1 of %Ln torrent(s) %L1 /%Ln torrent mutatása Delete these %Ln torrent(s)' downloaded files? Valóban le kívánod törölni a torrent letöltött fájlait? Once removed, continuing the transfer will require the torrent file or magnet link. Ha egyzser eltávolítod a folytatáshoz szükséged lesz a torrent fájlra, vagy egy magnet linkre. Once removed, continuing the transfers will require the torrent files or magnet links. Ha egyzser eltávolítod a folytatáshoz szükséged lesz a torrent fájlokra, vagy egy magnet linkekre. This torrent has not finished downloading. Ez a torrent még nem fejezte be a letöltést. These torrents have not finished downloading. Ezek a torrentek még nem fejezték be a letöltést. This torrent is connected to peers. Ennél a torrent partnerekhez kapcsolódik. These torrents are connected to peers. Ezen torrentek partnerekhez vannak csatlakoztatva. One of these torrents is connected to peers. A torrentek közül valamelyikhez még vannak partnerek csatlakoztatva. Some of these torrents are connected to peers. A torrentek közül valamelyikhez még vannak partnerek csatlakoztatva. One of these torrents has not finished downloading. Ezen torrentek egyike még nincs letöltve. Some of these torrents have not finished downloading. Ezen torrentek némelyike még nincs letöltve. %1 has not responded yet %1 még nem válaszolt %1 is responding %1 válaszol %1 last responded %2 ago %1 %2 válaszolt %1 is not responding %1 nem válaszol MakeDialog New Torrent Új Torrent <i>No source selected<i> <i>Nincs forrás kiválasztva<i> %Ln File(s) %Ln fájl %Ln Piece(s) %Ln szelet %1 in %2; %3 @ %4 %1 in %2; %3 @ %4 Files Fájlok Sa&ve to: Mentés &ide: Source f&older: Forrás&mappa: Source &file: &Forrásfájl: Properties Tulajdonságok &Trackers: &Trackerek: To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. Ha tartalék URL-t kívánsz hozzáadni írd azt az elsÅ‘dleges után vele egy sorba. Másik elsÅ‘dleges URL-t új sorba írva adhatsz hozzá. Co&mment: Megje&gyzés: &Private torrent &Privát torrent MakeProgressDialog New Torrent Új Torrent Creating "%1" "%1" létrehozás alatt Created "%1"! "%1" létrehozva! Error: invalid announce URL "%1" Hibás announce URL: "%1" Cancelled Megszakítva Error reading "%1": %2 "%2" hiba történt a(z) "%1" olvasásakor Error writing "%1": %2 "%2" hiba történt a(z) "%1" írásakor OptionsDialog Open Torrent Torrent megnyitása Open Torrent from File Torrent fájl megnyitása Open Torrent from URL or Magnet Link Torrent URL vagy Magnet Link megnyitása &Source: &Forrás: &Destination folder: &Célmappa: High Magas Normal Normál Low Alacsony &Priority: &Priorítás: S&tart when added I&ndítás hozzáadás után &Verify Local Data Hely adat &ellenÅ‘rzése Mo&ve .torrent file to the trash Torrent fájl &lomtárba helyezése Torrent Files (*.torrent);;All Files (*.*) Torrent fájlok (*.torrent);;Minden fájl (*.*) Select Destination Célmappa kiválasztása PathButton (None) (Nincs) Select Folder Mappa kiválasztása Select File Fájl kiválasztása PrefsDialog Use &authentication &Authentikáció használata &Username: &Felhasználónév: Pass&word: &Jelszó: &Open web client &Webes kliens megnyitása Addresses: Címek: Speed Limits Sebesség korlátok <small>Override normal speed limits manually or at scheduled times</small> <small>Normál sebességlimitek felülbírálása kézzel vagy ütemezve a következÅ‘ idÅ‘szakokban</small> &Scheduled times: Ü&temezett idÅ‘szakok: &On days: Megadott &napokon: Every Day Minden nap Weekdays Hétköznap Weekends Hétvégén Sunday Vasárnap Monday HétfÅ‘ Tuesday Kedd Wednesday Szerda Thursday Csütörtök Friday Péntek Saturday Szombat Port is <b>open</b> A port <b>nyitva</b> Port is <b>closed</b> A port <b>zárva</b> Incoming Peers BejövÅ‘ partnerek Status unknown Státusz nem ismert &Port for incoming connections: &BejövÅ‘ kapcsolatok portja: Use UPnP or NAT-PMP port &forwarding from my router UPnP vagy NAT-PMP port &forward a routerhez Options Opciók Enable &uTP for peer connections &uTP engedélyezése uTP is a tool for reducing network congestion. A uTP egy eszköz ami a hálózat túlterhelése ellen véd. minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) perc minute(s) ago Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) perce Automatically add .torrent files &from: Torrent fájlok automatikus hozzáadása &innen: Show the Torrent Options &dialog Torrent Beállítások &ablak megnyitása &Start added torrents &Hozzáadott torrentek indítása Mo&ve the .torrent file to the trash Torrent fájl &lomtárba helyezése Download Queue Letöltési sorrend Ma&ximum active downloads: Ma&ximum aktív letöltések: Incomplete Félkész Seeding Seedelés Remote Távoli <i>Blocklist contains %Ln rule(s)</i> <i>A blokkolási lista %Ln szabályt tartalmaz</i> Pick a &random port every time Transmission is started &Véletlen port választása minden indításnál Limits Korlátok Maximum peers per &torrent: Partnerek maximális száma &torrentenként:: Maximum peers &overall: &Partnerek maximális száma: <b>Update succeeded!</b><p>Blocklist now has %Ln rule(s). <b>Frissítés sikeres!</b><p>A tiltólistában most %Ln elemet tartalmaz. <b>Update Blocklist</b><p>Getting new blocklist... <b>Tiltólista frissítése</b><p>Új tiltólista letöltése... Blocklist Tiltólista Enable &automatic updates &Automata frissítések engedélyezése Allow encryption Titkosítás engedélyezése Prefer encryption Titkosítás elÅ‘nyben részesítése Require encryption Titkosítás megkövetelése Privacy Biztonság &to &ide Desktop Asztal Show Transmission icon in the &notification area Ikon mutatása a &tálcán Te&st Port Tesz&t port Enable &blocklist: &Tiltólista engedélyezése: &Update &Frissítés &Encryption mode: &Titkosítási mód: Remote Control Távvezérlés Allow &remote access &Távvezérlés engedélyezése HTTP &port: HTTP &port: Only allow these IP a&ddresses: Csak a következÅ‘ IP cí&mek engedélyezése: &Upload: &Feltöltés: &Download: &Letöltés: Alternative Speed Limits Alternatív sebességkorlátok U&pload: F&eltöltés: Do&wnload: Le&töltés: Start &minimized in notification area Indítás a tálcán, kis méretben Notification Értesítés Show a notification when torrents are a&dded Értesítés megjelenítése torrentek h&ozzáadásakor Show a notification when torrents &finish Értesítés megjelenítése a letöltések &befejeztével Play a &sound when torrents finish &Hang lejátszása mikor végeznek a torrentek Testing TCP Port... TCP port tesztelése... Peer Limits Partner korlátok Use PE&X to find more peers &PEX használata több partnerek kereséséhez PEX is a tool for exchanging peer lists with the peers you're connected to. A PEX elósegíti a partnerlista cseréjét a csatlakozott partnerekkel. Use &DHT to find more peers &DHT használata több partnerek kereséséhez DHT is a tool for finding peers without a tracker. A DHT segítségével tracker nélkül találhatod meg a partnereket. Use &Local Peer Discovery to find more peers &LPD használata több partnerek kereséséhez LPD is a tool for finding peers on your local network. A LDP segít partnereket találni a helyi hálózaton. Encryption Titkosítás Select "Torrent Done" Script Válaszd ki a torrent befejezésekor lefuttatni kívánt szkriptet Select Incomplete Directory Válaszd ki az átmeneti könyvtárat Select Watch Directory Válaszd ki a megfigyelni kívánt könyvtárat Select Destination Válaszd ki a cél könyvtárat Adding Hozzáadá Download is i&nactive if data sharing stopped: Please keep this phrase as short as possible, it's curently the longest and influences dialog width Letöltés i&naktív ha az adatmegosztás megállítva: Downloading Letöltés Append ".&part" to incomplete files' names Félkész fájlok nevéhez ".&part" hozzáfűzése Keep &incomplete files in: &Az átmeneti fájlok tárolása ebben a mappában: Save to &Location: Mentés &ide: Call scrip&t when torrent is completed: &Program futtatása amikor a torrent befejezÅ‘dik: Stop seeding at &ratio: Seedelés befejezése ha elérte az &arányt: Stop seedi&ng if idle for: Seedelés befejezése ha i&naktív a torrent: Transmission Preferences Transmission beállításai Speed Sebesség Network Hálózat Not supported by remote sessions Távoli munkamenet esetén nem támogatott QObject Invalid option érvénytelen opció RelocateDialog Select Location Válaszd ki a mappát Set Torrent Location Válaszd ki a torrentet Set Location Válaszd ki a mappát New &location: Új &hely: &Move from the current folder Ãthelyezés a &jelenlegi mappából Local data is &already there A letöltött adat &már itt van Session Error Renaming Path Hiba az elérési út átnevezésekor <p><b>Unable to rename "%1" as "%2": %3.</b></p> <p>Please correct the errors and try again.</p> <p><b>Nem sikerült átnevezni "%1"-et "%2"-re, mert: %3.</b></p> <p>Kérem javítsa ki a hibákat, és próbálkozzon újra.</p> Add Torrent Torrent hozzáadása SessionDialog Change Session Munkamenet váltás Source Forrás Start &Local Session &Helyi munkamenet indítása Connect to &Remote Session Csatalkozás &távoli munkamenethez &Host: &Hoszt: &Port: &Port: &Authentication required &Authentikáció kötelezÅ‘ &Username: &Felhasználónév: Pass&word: &Jelszó: StatsDialog Statistics Statisztika Current Session Jelenlegi munkamenet Uploaded: Feltöltve: Downloaded: Letöltve: Ratio: Arány: Duration: IdÅ‘tartam: Total Összesen Started %Ln time(s) %Ln alkalommal lett elindítva Torrent Verifying local data Helyi adat ellenÅ‘rzése Downloading Letöltés Seeding Feltöltés Finished Befejezve Paused Szünetelteve Queued for verification Sorbaállítva ellenÅ‘rzésre Queued for download Sorbaállítva letöltésre Queued for seeding Sorbaállítva feltöltésre Tracker gave a warning: %1 A tracker figyelmeztetést dobott: %1 Tracker gave an error: %1 A tracker hibát dobott: %1 Error: %1 Hiba: %1 TorrentDelegate Magnetized transfer - retrieving metadata (%1%) First part of torrent progress string; %1 is the percentage of torrent metadata downloaded Mágneses átvitel - metadat letöltése (%1 %) %1 of %2 (%3%) First part of torrent progress string; %1 is how much we've got, %2 is how much we'll have when done, %3 is a percentage of the two %1 a %2 (%3%) -ból %1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio, %6 is the ratio we want to reach before we stop uploading %1 a %2 (%3%)-ból, feltöltve: %4 (Arány: %5 Cél: %6) %1 of %2 (%3%), uploaded %4 (Ratio: %5) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio %1 a %2 (%3%)-ból, feltöltve: %4 (Arány: %5) %1, uploaded %2 (Ratio: %3 Goal: %4) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio, %4 is the ratio we want to reach before we stop uploading %1, feltöltve %2 (Arány: %3 Cél: %4) %1, uploaded %2 (Ratio: %3) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio %1, feltöltve %2 (Arány: %3) - %1 left Second (optional) part of torrent progress string; %1 is duration; notice that leading space (before the dash) is included here - %1 van hátra - Remaining time unknown Second (optional) part of torrent progress string; notice that leading space (before the dash) is included here - HátralévÅ‘ idÅ‘ ismeretlen Ratio: %1 Arány: %1 Downloading from %Ln peer(s) First part of phrase "Downloading from ... peer(s) and ... web seed(s)" Letöltés %Ln partnertÅ‘l Seeding to %Ln peer(s) Seedelés a %Ln partnernek - - Downloading metadata from %Ln peer(s) (%1% done) Metaadat letöltése %Ln partnertÅ‘l (%1 % kész) Downloading from %1 of %Ln connected peer(s) First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" Letöltés %1 (a %Ln-bÅ‘l) partnertÅ‘l and %Ln web seed(s) Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; notice that leading space (before "and") is included here és %Ln web seed Seeding to %1 of %Ln connected peer(s) Seedelés a %1 partnernek (%Ln elérhetÅ‘) Error Hiba Verifying local data (%1% tested) Helyi adatok ellenÅ‘rzése (%1 %1) TrackerDelegate Got a list of%1 %Ln peer(s)%2 %3 ago %1 and %2 are replaced with HTML markup, %3 is duration %1 %Ln partner%2 listája lekérve %3 ezelÅ‘tt Peer list request %1timed out%2 %3 ago; will retry %1 and %2 are replaced with HTML markup, %3 is duration A %1 partnerlista lekérés idÅ‘túllépésre futott %2 %3 ezelÅ‘tt; újrapróbálom Got an error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Hiba történt %1"%2"%3 %4 ezelÅ‘tt No updates scheduled Nincs frissítés beütemezve Asking for more peers in %1 %1 is duration Több partner kérése %1 múlva Queued to ask for more peers További partnerek kérése beütemezve Asking for more peers now... <small>%1</small> %1 is duration Új partnerek kérése... <small>%1</small> Tracker had%1 %Ln seeder(s)%2 First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup and%1 %Ln leecher(s)%2 %3 ago Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup, %3 is duration; notice that leading space (before "and") is included here Tracker had %1no information%2 on peer counts %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Got a scrape error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Scrape hiba történt ennyi ideje: %1"%2"%3 %4 Asking for peer counts in %1 %1 is duration Partnerszám lekérése %1 múlva Queued to ask for peer counts Partnerszám lekérése beütemezve Asking for peer counts now... <small>%1</small> %1 is duration Partnerszám lekérése most... <small>%1</small> transmission-2.92/qt/translations/PaxHeaders.4960/transmission_ko.ts0000644000000000000000000000013212664476417022636 xustar0030 mtime=1456635151.992496455 30 atime=1456635151.988496386 30 ctime=1457295917.277761613 transmission-2.92/qt/translations/transmission_ko.ts0000644000175000017500000026126612664476417024300 0ustar00mikedldmikedld00000000000000 UTF-8 AboutDialog About Transmission Transmissionì— ëŒ€í•˜ì—¬ <b style='font-size:x-large'>Transmission %1</b> <b style='font-size:x-large'>Transmission %1</b> A fast and easy BitTorrent client 빠르고 편리한 BitTorrent í´ë¼ì´ì–¸íЏ Copyright (c) The Transmission Project 저작권 (c) The Transmission Project C&redits í¬ë ˆë”§ (&r) &License ë¼ì´ì„ ìФ (&L) Credits í¬ë ˆë”§ Application <b>Transmission is a file sharing program.</b> <b>Transmissionì€ íŒŒì¼ ê³µìœ  프로그램 입니다.</b> When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. 토런트를 사용하실때, 다른 ì‚¬ëžŒì´ ì‚¬ìš©í•˜ë„ë¡ ì—¬ëŸ¬ë¶„ì˜ ë°ì´í„°ë¥¼ 업로드 합니다. 여러분께서 사용하시는 컨í…ì¸ ì— ëŒ€í•œ ì±…ìž„ì€ ì—¬ëŸ¬ë¶„ì´ ì§€ì…”ì•¼ 합니다. I &Agree ë™ì˜í•©ë‹ˆë‹¤ (&A) Torrent Completed Torrent ì™„ë£Œë¨ Torrent Added Torrent ì¶”ê°€ë¨ DetailsDialog None 아님 Mixed 섞임 Unknown 알려지지 ì•ŠìŒ Finished ì™„ë£Œë¨ Paused ì¼ì‹œì •ì§€ë¨ Active now 현재 ë™ìž‘중 %1 ago %1 ì „ %1 (%Ln pieces @ %2) %1 (%Ln / %2 ì¡°ê°ë“¤) %1 (%Ln pieces) %1 (%Ln ì¡°ê°ë“¤) Private to this tracker -- DHT and PEX disabled ì´ íŠ¸ëž˜ì»¤ë¥¼ 비공개로 하기 -- DHT, PEX 비활성화 Public torrent 공개 Torrent Created by %1 %1 ì— ì˜í•´ ë§Œë“¤ì–´ì§ Created on %1 %1 ì— ì˜í•´ 만듬 Created by %1 on %2 %2ì— %1ì´ ë§Œë“¬ Encrypted connection ì•”í˜¸í™”ëœ ì—°ê²° Optimistic unchoke 양호한 소통 Downloading from this peer ì´ í”¼ì–´ë¡œë¶€í„° 다운로드 중 We would download from this peer if they would let us ê·¸ë“¤ì´ í—ˆìš©í•  경우 다운로드 í•  것입니다 Uploading to peer 피어로 업로드 중 We would upload to this peer if they asked ê·¸ë“¤ì´ ìš”ì²­í•  경우 업로드 í•  것입니다 Peer has unchoked us, but we're not interested 피어가 소통하지 않으며, ê´€ì‹¬ì´ ì—†ìŠµë‹ˆë‹¤ We unchoked this peer, but they're not interested 피어가 소통하지 않으며, ê´€ì‹¬ìžˆì–´í•˜ì§€ë„ ì•ŠìŠµë‹ˆë‹¤. Peer was discovered through DHT DHT를 통해 피어가 발견ë˜ì—ˆìŠµë‹ˆë‹¤ Peer was discovered through Peer Exchange (PEX) 피어 êµí™˜(PEX)를 통해 피어가 발견ë˜ì—ˆìŠµë‹ˆë‹¤ Peer is an incoming connection 들어오는 ì—°ê²°ì— í”¼ì–´ê°€ 있습니다 minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) ë¶„ Error 오류 Tracker already exists. 트래커가 ì´ë¯¸ 존재합니다. %1 (100%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data %1 (100%) %1 of %2 (%3%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data, %2 is overall size of torrent data, %3 is percentage (%1/%2*100) %1 / %2 (%3%) %1 of %2 (%3%), %4 Unverified Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded data (both verified and unverified), %2 is overall size of torrent data, %3 is percentage (%1/%2*100), %4 is amount of downloaded but not yet verified data %1 / %2 (%3%), %4 ê²€ì¦ë˜ì§€ ì•ŠìŒ %1 (%2 corrupt) %1 (%2 ì†ìƒë¨) %1 (Ratio: %2) %1 (비율: %2) N/A 해당사항 ì—†ìŒ Peer is connected over uTP 피어가 uTP로 ì ‘ì†í–ˆìŠµë‹ˆë‹¤ Add URL URL 추가 Add tracker announce URL: 트래커 안내 URL 추가: Invalid URL "%1" ìž˜ëª»ëœ URL "%1" Edit URL URL 수정 Edit tracker announce URL: 트래커 안내 URL 수정: High ë†’ìŒ Normal 보통 Low ë‚®ìŒ Use Global Settings ì „ì—­ 설정 사용 Seed regardless of ratio ë¹„ìœ¨ì— ê´€ê³„ ì—†ì´ ì‹œë“œ Stop seeding at ratio: ì´ ë¹„ìœ¨ì´ ë˜ë©´ 시드 중지: Seed regardless of activity ë™ìž‘ì— ê´€ê³„ ì—†ì´ ì‹œë“œ Stop seeding if idle for: 비활성화 ë˜ë©´ 시드 중지 Up ì—… Down 다운 % % Status ìƒíƒœ Address 주소 Client í´ë¼ì´ì–¸íЏ Torrent Properties Torrent ì†ì„± Information ì •ë³´ Activity í™œë™ Have: 갖고있ìŒ: Availability: 가용율: Uploaded: 업로드 함: Downloaded: 다운로드 함: State: ìƒíƒœ: Running time: ë™ìž‘ 시간: Remaining time: ë‚¨ì€ ì‹œê°„: Last activity: 마지막 활ë™: Error: 오류 Details 세부사항 Size: í¬ê¸°: Location: 위치: Hash: 해쉬: Privacy: 공개/비공개: Origin: 출처: Comment: 주ì„: Peers 피어 Tracker 트래커 Add Tracker 트래커 추가 Edit Tracker 트래커 수정 Remove Trackers 트래커 제거 Show &more details ë”ë§Žì€ ì„¸ë¶€ì‚¬í•­ ë³´ì´ê¸° (&m) Show &backup trackers 백업 트래커 ë³´ì´ê¸° (&b) Files íŒŒì¼ Options 옵션 Speed ì†ë„ Honor global &limits ê´‘ì—­ 제한 존중 (&l) Limit &download speed: 다운로드 ì†ë„ 제한 (&d) Limit &upload speed: 업로드 ì†ë„ 제한 (&u) Torrent &priority: 토런트 & ì†ì„±: Seeding Limits 시드 제한 &Ratio: 비율 (&R): &Idle: 비활성 (&l) Peer Connections 피어 ì—°ê²° &Maximum peers: 최대 피어 (&M) FileAdded Add Torrent Torrent 추가 <p><b>Unable to add "%1".</b></p><p>It is a duplicate of "%2" which is already added.</p> <p><b>"%1"를 추가할수 없습니다.</b></p><p>ì´ë¯¸ ì¶”ê°€ëœ "%2"와 중복ë©ë‹ˆë‹¤ .</p> Error Adding Torrent 토런트 추가 오류 FileTreeItem Low ë‚®ìŒ High ë†’ìŒ Normal 보통 Mixed 섞임 FileTreeModel File íŒŒì¼ Size í¬ê¸° Progress ì§„í–‰ë„ Download 다운로드 Priority 우선순위 FileTreeView Check Selected ì„ íƒí•­ëª© ì²´í¬ Uncheck Selected ì„ íƒí•­ëª© ì²´í¬ í•´ì œ Only Check Selected ì˜¤ì§ ì„ íƒí•­ëª©ë§Œ ì²´í¬ Priority 우선순위 Open 열기 Rename... ì´ë¦„변경... FilterBar All ì „ì²´ Active 활ë™ì¤‘ Downloading 다운로드중 Seeding 시딩중 Paused ì¼ì‹œì •ì§€ë¨ Finished ì™„ë£Œë¨ Verifying ê²€ì¦ì¤‘ Error 오류 Show: 보기: FilterBarLineEdit Search... 검색... Formatter B/s B/s kB/s kB/s MB/s MB/s GB/s GB/s TB/s TB/s B B kB KB MB MB GB GB TB TB KiB KiB MiB MiB GiB GiB TiB TiB Unknown 알려지지 ì•ŠìŒ None 아님 %1 %2 %1 %2 %Ln day(s) %Ln ì¼ %Ln hour(s) %Ln 시간 %Ln minute(s) %Ln ë¶„ %Ln second(s) %Ln ì´ˆ %1, %2 %1, %2 FreeSpaceLabel <i>Calculating Free Space...</i> 여유 공간 계산중... %1 free %1 ë‚¨ìŒ LicenseDialog License ë¼ì´ì„ ìФ MainWindow Transmission Transmission &Torrent 토런트 (&T) &Edit 수정 (&E) &Help ë„ì›€ë§ (&H) &View 보기 (&V) &File íŒŒì¼ (&F) &New... 새로운... (&N) Create a new torrent 새 토런트 만들기 &Properties ì†ì„± (&P) Show torrent properties 토런트 ì†ì„± 보기 Open the torrent's folder 토런트 í´ë” 열기 Queue í &Open... 열기 (&O) Open 열기 Open a torrent 토런트 열기 Open Fold&er í´ë” 열기 (&e) &Start 시작 (&S) Start torrent 토런트 시작 Ask Tracker for &More Peers íŠ¸ëž˜ì»¤ì— ìš”ì²­í•˜ì—¬ 피어 가져오기 (&M) Ask tracker for more peers íŠ¸ëž˜ì»¤ì— ìš”ì²­í•˜ì—¬ 피어 가져오기 &Pause ì¼ì‹œì •ì§€ (&P) Pause torrent 토런트 ì¼ì‹œ ì •ì§€ &Verify Local Data 로컬 ë°ì´í„° ê²€ì¦ (&V) Verify local data 로컬 ë°ì´í„° ê²€ì¦ &Remove ì‚­ì œ (&R) Remove torrent 토런트 ì‚­ì œ &Delete Files and Remove 토런트 파ì¼ê³¼ ë°ì´í„° ì‚­ì œ (&D) Remove torrent and delete its files 토런트 파ì¼ê³¼ ë°ì´í„° ì‚­ì œ &Start All ì „ì²´ 시작 (&S) &Pause All ì „ì²´ ì¼ì‹œì •ì§€ (&P) &Quit 나가기 (&Q) &Select All ì „ì²´ ì„ íƒ (&S) &Deselect All ì „ì²´ ì„ íƒí•´ì œ(&D) &Preferences 설정 (&P) &Compact View 간략하게 보기 (&C) Compact View 간략하게 보기 &Toolbar 툴바 (&T) &Filterbar í•„í„° ë°” (&F) &Statusbar ìƒíƒœ ë°” (&S) Sort by &Activity 활ë™ìˆœìœ¼ë¡œ ì •ë ¬ (&A) Sort by A&ge ë°›ì€ ê¸°í•œëŒ€ë¡œ ì •ë ¬ (&g) Sort by Time &Left ë‚¨ì€ ì‹œê°„ëŒ€ë¡œ ì •ë ¬ (&L) Sort by &Name ì´ë¦„순으로 ì •ë ¬ (&N) Sort by &Progress ì§„ì²™ì‚¬í•­ì— ë”°ë¼ ì •ë ¬ (&P) Sort by Rati&o ë¹„ìœ¨ì— ë”°ë¼ ì •ë ¬ (&o) Sort by Si&ze í¬ê¸°ì— ë”°ë¼ ì •ë ¬ (&z) Sort by Stat&e ìƒíƒœì— ë”°ë¼ ì •ë ¬ (&e) Sort by T&racker íŠ¸ëž˜ì»¤ì— ë”°ë¼ ì •ë ¬ (&r) Message &Log 메시지 & 로그 &Statistics 통계 (&S) &Contents 항목 (&C) &About 대하여 (&A) Re&verse Sort Order ìˆœì„œì— ë”°ë¼ ì •ë ¬ 뒤집기 (&v) &Name ì´ë¦„ (&N) &Files íŒŒì¼ (&F) &Tracker 트래커 (&T) Total Ratio ì´ ë¹„ìœ¨ Session Ratio 세션 비율 Total Transfer ì´ ì „ì†¡ëŸ‰ Session Transfer 세션 전송량 &Main Window 주 ìœˆë„ (&M) Tray &Icon íŠ¸ë ˆì´ ì•„ì´ì½˜ (&I) &Change Session... 세션 변경 (&C) Choose Session Start a local session or connect to a running session 세션 ì„ íƒ Set &Location... 위치 ì„ íƒ (&L) &Copy Magnet Link to Clipboard 마그넷 ë§í¬ í´ë¦½ë³´ë“œì— 복사 (&C) Open &URL... URL 열기 (&U) &Donate 기부 (&D) Start &Now 바로 시작 (&N) Bypass the queue and start now í를 넘기고 바로 시작합니다 Move to &Top 맨 위로 옮김 (&T) Move &Up 위로 옮김 (&U) Move &Down 아래로 옮김 (&D) Move to &Bottom 맨 아래로 옮김 (&B) Sort by &Queue í ìˆœì„œì— ë”°ë¼ ì •ë ¬ (&Q) Limit Download Speed 다운로드 ì†ë„ 제한 Unlimited 무제한 Limited at %1 %1 ì— í•œì • Limit Upload Speed 업로드 ì†ë„ 제한 Stop Seeding at Ratio ì´ ë¹„ìœ¨ì´ ë˜ë©´ 시드 중지 Seed Forever ê³„ì† ì‹œë“œ Stop at Ratio (%1) ë¹„ìœ¨ì— ë”°ë¼ ì •ì§€ (%1) - %1:%2 Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); notice that leading space (before the dash) is included here - %1:%2 Idle 비활성 Ratio: %1 비율: %1 Down: %1, Up: %2 다운: %1, ì—…: %2 Torrent Files (*.torrent);;All Files (*.*) Torrent íŒŒì¼ (*.torrent);;ì „ì²´ íŒŒì¼ (*.*) Show &options dialog 다ì´ì–´ë¡œê·¸ ì„¤ì •ë° ë³´ê¸° (&o) Open Torrent 토런트 열기 Speed Limits ì†ë„ 제한 Network Error ë„¤íŠ¸ì›Œí¬ ì˜¤ë¥˜ Click to disable Temporary Speed Limits (%1 down, %2 up) í´ë¦­í•˜ì—¬ ì¼ì‹œì ìœ¼ë¡œ ì†ë„ 제한 해제하기 (%1 다운, %2 ì—…) Click to enable Temporary Speed Limits (%1 down, %2 up) í´ë¦­í•˜ì—¬ ì¼ì‹œì ìœ¼ë¡œ ì†ë„ 제한 걸기 (%1 다운, %2 ì—…) Remove torrent? Torrent를 삭제하시겠습니까? Delete this torrent's downloaded files? ë‹¤ìš´ë°›ì€ Torrent 파ì¼ì„ 삭제하시겠습니까? Remove %Ln torrent(s)? %Ln Torrent를 삭제하시겠습니까? Showing %L1 of %Ln torrent(s) %L1 / %Ln Torrent ë³´ì´ê¸° Delete these %Ln torrent(s)' downloaded files? ì´ %Ln í† ëŸ°íŠ¸ì˜ ë‹¤ìš´ë¡œë“œëœ íŒŒì¼ë“¤ì„ 삭제하시겠습니까? Once removed, continuing the transfer will require the torrent file or magnet link. 삭제시, ì „ì†¡ì„ ìž¬ê²Œ 하려면 Torrent íŒŒì¼ í˜¹ì€ ë§ˆê·¸ë„· ë§í¬ê°€ 필요합니다. Once removed, continuing the transfers will require the torrent files or magnet links. 삭제시, ì „ì†¡ì„ ìž¬ê²Œ 하려면 Torrent 파ì¼ì´ë‚˜ 마그넷 ë§í¬ê°€ 필요합니다. This torrent has not finished downloading. ì´ Torrent는 다운로드가 완료ë˜ì§€ 않았습니다. These torrents have not finished downloading. ì´ Torrentë“¤ì€ ë‹¤ìš´ë¡œë“œê°€ 완료ë˜ì§€ 않았습니다. This torrent is connected to peers. Torrentê°€ í”¼ì–´ì— ì—°ê²°ë˜ì—ˆìŠµë‹ˆë‹¤ These torrents are connected to peers. Torrent ë“¤ì´ í”¼ì–´ì— ì—°ê²°ë˜ì—ˆìŠµë‹ˆë‹¤ One of these torrents is connected to peers. Torrent 파ì¼ë“¤ì¤‘ 하나가 í”¼ì–´ì— ì—°ê²°ë˜ì—ˆìŠµë‹ˆë‹¤. Some of these torrents are connected to peers. Torrent 파ì¼ë“¤ì¤‘ 몇몇개가 í”¼ì–´ì— ì—°ê²°ë˜ì—ˆìŠµë‹ˆë‹¤. One of these torrents has not finished downloading. Torrent 파ì¼ë“¤ì¤‘ í•œê°œì˜ Torrentì˜ ë‹¤ìš´ë¡œë“œê°€ ë나지 않았습니다. Some of these torrents have not finished downloading. Torrent 파ì¼ë“¤ì¤‘ ëª‡ëª‡ê°œì˜ Torrentì˜ ë‹¤ìš´ë¡œë“œê°€ ë나지 않았습니다. %1 has not responded yet %1ê°€ ë°˜ì‘하지 않고 있습니다 %1 is responding %1 ë°˜ì‘중 %1 last responded %2 ago %1 ì˜ ë§ˆì§€ë§‰ ë°˜ì‘ - %2 ì „ %1 is not responding %1 ë°˜ì‘하지 ì•ŠìŒ MakeDialog New Torrent 새 Torrent <i>No source selected<i> <i>아무런 ì¶œì²˜ë„ ì„ íƒë˜ì§€ 않았습니다<i> %Ln File(s) %Ln íŒŒì¼ %Ln Piece(s) %Ln ì¡°ê° %1 in %2; %3 @ %4 %2 안 %1; %4ì˜ %3 Files íŒŒì¼ Sa&ve to: 저장 (&v) Source f&older: 소스 í´ë” (&o) Source &file: 소스 íŒŒì¼ (&f) Properties ì†ì„± &Trackers: 트래커 (&T) To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. 백업 URLì„ ì¶”ê°€í•˜ì‹¤ë ¤ë©´ 주 URL 아래ì—다가 추가하십시오. 다른 주 URLì„ ì¶”ê°€í•˜ì‹¤ë ¤ë©´ 빈 ë¼ì¸ ì•„ëž˜ì— ì¶”ê°€í•˜ì‹­ì‹œì˜¤. Co&mment: ì£¼ì„ (&m) &Private torrent 비공개 Torrent (&P) MakeProgressDialog New Torrent 새 Torrent Creating "%1" "%1" ìƒì„±ì¤‘ Created "%1"! "%1" ìƒì„±ë¨! Error: invalid announce URL "%1" 오류: "%1" ë¶€ì ì ˆí•œ 안내 URL Cancelled ì·¨ì†Œë¨ Error reading "%1": %2 오류 ì½ëŠ”ì¤‘ "%1": %2 Error writing "%1": %2 오류 쓰는중 "%1": %2 OptionsDialog Open Torrent Torrent 열기 Open Torrent from File 파ì¼ë¡œë¶€í„° Torrent 열기 Open Torrent from URL or Magnet Link 마그넷 ë§í¬ë‚˜ URL로부터 Torrent 열기 &Source: 소스 (&S) &Destination folder: ëª©ì  í´ë” (&D) High ë†’ìŒ Normal 보통 Low ë‚®ìŒ &Priority: 우선순위 (&P) S&tart when added 추가시 시작 (&t) &Verify Local Data 로컬 ë°ì´í„° ê²€ì¦ (&V) Mo&ve .torrent file to the trash .torrent 파ì¼ì„ 휴지통으로 ì´ë™ (&v) Torrent Files (*.torrent);;All Files (*.*) Torrent íŒŒì¼ (*.torrent);;ì „ì²´ íŒŒì¼ (*.*) Select Destination 목ì ì§€ ì„ íƒ PathButton (None) (아님) Select Folder í´ë” ì„ íƒ Select File íŒŒì¼ ì„ íƒ PrefsDialog Use &authentication ì¸ì¦ 사용 (&a) &Username: 유저 ì´ë¦„ (&U) Pass&word: 비밀번호 (&w) &Open web client 웹 í´ë¼ì´ì–¸íЏ 열기 (&O) Addresses: 주소: Speed Limits ì†ë„ 제한ì†ë„ 제한 <small>Override normal speed limits manually or at scheduled times</small> ìˆ˜ë™ í˜¹ì€ ì •í•´ì§„ ì‹œê°„ì— ì¼ë°˜ ì†ë„ 제한 무시하기 &Scheduled times: ì •í•´ì§„ 시간 (&S) &On days: 날들 ì¤‘ì— (&O): Every Day 모든 ë‚  Weekdays 주중 Weekends ì£¼ë§ Sunday ì¼ìš”ì¼ Monday ì›”ìš”ì¼ Tuesday í™”ìš”ì¼ Wednesday ìˆ˜ìš”ì¼ Thursday ëª©ìš”ì¼ Friday ê¸ˆìš”ì¼ Saturday í† ìš”ì¼ Port is <b>open</b> í¬íŠ¸ê°€ <b>열려있습니다</b> Port is <b>closed</b> í¬íŠ¸ê°€ <b>닫혀있습니다</b> Incoming Peers 피어 받는중 Status unknown ìƒíƒœ 알수 ì—†ìŒ &Port for incoming connections: 들어오는 ì—°ê²° í¬íЏ (&P) Use UPnP or NAT-PMP port &forwarding from my router ê³µìœ ê¸°ì˜ UPnP나 NAP-PMP í¬íЏ í¬ì›Œë”©ì„ 사용해보세요 Options 옵션 Enable &uTP for peer connections 피어 연결시 uTP 활성 uTP is a tool for reducing network congestion. uTP는 ë„¤íŠ¸ì›Œí¬ í˜¼ìž¡ì„ ì¤„ì´ëŠ” ë„구입니다. minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) ë¶„ minute(s) ago Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) ë¶„ì „ Automatically add .torrent files &from: ì—¬ê¸°ì— ìžˆëŠ” .torrent íŒŒì¼ ìžë™ìœ¼ë¡œ 추가 (&f) Show the Torrent Options &dialog Torrent 옵션과 다ì´ì–´ë¡œê·¸ 보기 (&d) &Start added torrents ì¶”ê°€ëœ Torrent 시작(&S) Mo&ve the .torrent file to the trash .torrent 파ì¼ì„ 휴지통으로 ì´ë™ (&v) Download Queue 다운로드 í Ma&ximum active downloads: 최대 활성 다운로드 수 (&x): Incomplete ì™„ë£Œì•ˆë¨ Seeding 시딩중 Remote 리모트 <i>Blocklist contains %Ln rule(s)</i> <i>블ë¡ë¦¬ìŠ¤íŠ¸ëŠ” %Ln ê·œì¹™ì„ í¬í•¨í•˜ê³  있습니다</i> Pick a &random port every time Transmission is started í•­ìƒ Transmission 시작시 무작위 í¬íЏ ì„ íƒ (&r) Limits 제한 Maximum peers per &torrent: Torrent당 최대 피어수(&t): Maximum peers &overall: 최대 ì´ í”¼ì–´ìˆ˜(&o): <b>Update succeeded!</b><p>Blocklist now has %Ln rule(s). <b>ì—…ë°ì´íЏ 완료!</b><p>블ë¡ë¦¬ìŠ¤íŠ¸ì— %Ln ê·œì¹™ì´ ì¶”ê°€ë˜ì—ˆìŠµë‹ˆë‹¤. <b>Update Blocklist</b><p>Getting new blocklist... <b>블ë¡ë¦¬ìŠ¤íŠ¸ ì—…ë°ì´íЏ</b><p>새 블ë¡ë¦¬ìŠ¤íŠ¸ 가져오는중... Blocklist 블ë¡ë¦¬ìŠ¤íŠ¸ Enable &automatic updates ìžë™ ì—…ë°ì´íЏ 허용 (&a) Allow encryption 암호화 허용 Prefer encryption 암호화 선호 Require encryption 암호화 í•„ìš” Privacy 프ë¼ì´ë²„시 &to ì—게 (&t) Desktop ë°ìФí¬íƒ‘ Show Transmission icon in the &notification area 알람 ì˜ì—­ì— Transmission ì•„ì´ì½˜ ë³´ì´ê¸° (&n) Te&st Port í¬íЏ 테스트 (&s) Enable &blocklist: 블ë¡ë¦¬ìŠ¤íŠ¸ 허용 (&b) &Update ì—…ë°ì´íЏ (&U) &Encryption mode: 암호화 모드 (&E): Remote Control ì›ê²© 조종 Allow &remote access ì›ê²© 조종 허용 (&r) HTTP &port: HTTP í¬íЏ (&p): Only allow these IP a&ddresses: ì´ IP 주소들만 허용 (&d): &Upload: 업로드 (&U): &Download: 다운로드 (&D): Alternative Speed Limits 대체 ì†ë„ 제한 U&pload: 업로드 (&p): Do&wnload: 다운로드 (&w): Start &minimized in notification area 시작시 알람 ì˜ì—­ì— 최소화 Notification 알람 Show a notification when torrents are a&dded Torrentê°€ 추가시 알람 ë³´ì´ê¸° (&d) Show a notification when torrents &finish Torrentê°€ 완료시 알람 ë³´ì´ê¸° (&f) Play a &sound when torrents finish Torrentê°€ 완료시 소리 재ìƒí•˜ê¸° (&s) Testing TCP Port... TCP í¬íЏ 시험중... Peer Limits 피어 제한 Use PE&X to find more peers PEX를 사용하여 ë” ë§Žì€ í”¼ì–´ 찾기 (&X) PEX is a tool for exchanging peer lists with the peers you're connected to. PEX는 ì—°ê²°ë˜ì–´ 있는 피어로부터 피어를 êµí™˜ë°›ëŠ” ë„구입니다. Use &DHT to find more peers DHT를 사용하여 ë” ë§Žì€ í”¼ì–´ 찾기 (&D) DHT is a tool for finding peers without a tracker. DHT는 트래커 ë°–ì—서 피어를 찾는 ë„구입니다. Use &Local Peer Discovery to find more peers 로컬 피어 찾기를 사용하여 ë” ë§Žì€ í”¼ì–´ 찾기 (&L) LPD is a tool for finding peers on your local network. LPD는 로컬 네í¬ì›Œí¬ ìƒì— 있는 피어를 발견하는 ë„구입니다. Encryption 암호화 Select "Torrent Done" Script "Torrent Done" 스í¬ë¦½íЏ ì„ íƒ Select Incomplete Directory 불완전 Torrent 디렉터리 ì„ íƒ Select Watch Directory ì£¼ì˜ ë””ë ‰í„°ë¦¬ ì„ íƒ Select Destination ëª©ì  í´ë” ì„ íƒ Adding 추가중 Download is i&nactive if data sharing stopped: Please keep this phrase as short as possible, it's curently the longest and influences dialog width ë°ì´í„° 공유 중단시 다운로드 비활성화 (&n) Downloading 다운로드중 Append ".&part" to incomplete files' names 완전하지 ì•Šì€ íŒŒì¼ëª… ë’¤ì— ".&part" ë¶™ì´ê¸° Keep &incomplete files in: 완전하지 ì•Šì€ íŒŒì¼ë“¤ ë³´ê´€ (&i): Save to &Location: 저장할 장소 (&L): Call scrip&t when torrent is completed: Torrent 파ì¼ì´ 완료시 스í¬ë¦½íЏ 실행 (&t): Stop seeding at &ratio: ì´ ë¹„ìœ¨ì´ ë˜ë©´ 시드 중지: Stop seedi&ng if idle for: 비활성화 ë˜ë©´ 시드 중지 (&n) Transmission Preferences Transmission 설정 Speed ì†ë„ Network ë„¤íŠ¸ì›Œí¬ Not supported by remote sessions 리모트 ì„¸ì…˜ì€ ì§€ì›í•˜ì§€ 않습니다 QObject Invalid option ìž˜ëª»ëœ ì˜µì…˜ RelocateDialog Select Location 위치 ì„ íƒ Set Torrent Location Torrent 위치 ì„ íƒ Set Location 위치 ì„ íƒ New &location: 새 위치 (&l): &Move from the current folder 현 í´ë”ì—서 ì´ë™ (&M) Local data is &already there ì´ë¯¸ 있는 로컬 ë°ì´í„° (&a) Session Error Renaming Path ì´ë¦„변경 위치 오류 <p><b>Unable to rename "%1" as "%2": %3.</b></p> <p>Please correct the errors and try again.</p> <p><b>"%1" ì„ "%2"로 변경할수 없습니다: %3.</b></p> <p>오류를 수정하고 다시 시ë„해주십시오.</p> Add Torrent Torrent 추가 SessionDialog Change Session 세션 변경 Source 소스 Start &Local Session 로컬 세션 시작 (&L) Connect to &Remote Session 리모트 세션 ì—°ê²° (&R) &Host: 호스트 (&H): &Port: í¬íЏ (&P): &Authentication required ì¸ì¦ 필요함 (&A): &Username: 유저 ì´ë¦„ (&U) Pass&word: 비밀번호 (&w) StatsDialog Statistics 통계 Current Session 현재 세션 Uploaded: 업로드 함: Downloaded: 다운로드 함: Ratio: 비율: Duration: 기간: Total ì´ Started %Ln time(s) %Ln 번 시작함 Torrent Verifying local data 로컬 ë°ì´í„° ê²€ì¦ì¤‘ Downloading 다운로드중 Seeding 시딩중 Finished ì™„ë£Œë¨ Paused ì¼ì‹œì •ì§€ë¨ Queued for verification ê²€ì¦ í Queued for download 다운로드 í Queued for seeding 시드 í Tracker gave a warning: %1 트래커가 경고를 주었습니다: %1 Tracker gave an error: %1 트래커가 오류를 주었습니다: %1 Error: %1 오류: %1 TorrentDelegate Magnetized transfer - retrieving metadata (%1%) First part of torrent progress string; %1 is the percentage of torrent metadata downloaded 마그넷 전송 - 메타ë°ì´í„° 가져오는 중 (%1%) %1 of %2 (%3%) First part of torrent progress string; %1 is how much we've got, %2 is how much we'll have when done, %3 is a percentage of the two %1 / %2 (%3%) %1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio, %6 is the ratio we want to reach before we stop uploading %1 / %2 (%3%), 업로드 %4 (비율: %5 목표: %6) %1 of %2 (%3%), uploaded %4 (Ratio: %5) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio %1 / %2 (%3%), 업로드 %4 (비율: %5) %1, uploaded %2 (Ratio: %3 Goal: %4) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio, %4 is the ratio we want to reach before we stop uploading %1, 업로드 %2 (비율: %3 목표: %4) %1, uploaded %2 (Ratio: %3) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio %1, 업로드 %2 (비율: %3) - %1 left Second (optional) part of torrent progress string; %1 is duration; notice that leading space (before the dash) is included here - %1 ë‚¨ìŒ - Remaining time unknown Second (optional) part of torrent progress string; notice that leading space (before the dash) is included here - 완료 시간 불분명함 Ratio: %1 비율: %1 Downloading from %Ln peer(s) First part of phrase "Downloading from ... peer(s) and ... web seed(s)" %Ln 피어로부터 다운로드중 Seeding to %Ln peer(s) %Ln 피어로부터 시드중 - - Downloading metadata from %Ln peer(s) (%1% done) %Ln 피어로부터 메타ë°ì´í„° 다운로드중 (%1% 완료) Downloading from %1 of %Ln connected peer(s) First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" %1ì„ %Ln ì—°ê²°ëœ í”¼ì–´ë¡œë¶€í„° 다운로드 중 and %Ln web seed(s) Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; notice that leading space (before "and") is included here 그리고 %Ln 웹 시드들 Seeding to %1 of %Ln connected peer(s) %Ln ì—°ê²°ëœ í”¼ì–´ë“¤ì—게 %1 시드 중 Error 오류 Verifying local data (%1% tested) 로컬 ë°ì´í„° ê²€ì¦ì¤‘ (%1% 완료ë¨) TrackerDelegate Got a list of%1 %Ln peer(s)%2 %3 ago %1 and %2 are replaced with HTML markup, %3 is duration %1ì˜ ëª©ë¡ì„ %3 ì „ì— %Ln 피어들 %2로부터 ë°›ìŒ Peer list request %1timed out%2 %3 ago; will retry %1 and %2 are replaced with HTML markup, %3 is duration 피어 ëª©ë¡ ìš”ì²­ %3 ì „ì— %1 시간 ì œí•œë¨ %2 ; 다시 ì‹œë„ Got an error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration %1"%2"%3 %4 ì „ì— ì˜¤ë¥˜ë¥¼ ë°›ìŒ No updates scheduled ì—…ë°ì´íЏ ì¼ì • ì—†ìŒ Asking for more peers in %1 %1 is duration %1 로부터 피어를 ë” ë°›ì•„ì˜¬ìˆ˜ 있는지 물어봄 Queued to ask for more peers 피어를 ë” ë°›ì•„ì˜¬ìˆ˜ 있는지 물어봄 í Asking for more peers now... <small>%1</small> %1 is duration 지금 피어를 ë” ë°›ì•„ì˜¬ìˆ˜ 있는지 물어봄... <small>%1</small> Tracker had%1 %Ln seeder(s)%2 First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup 트래커가 %1 %Ln 시ë”를 ê°–ê³  ìžˆìŒ %2 and%1 %Ln leecher(s)%2 %3 ago Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup, %3 is duration; notice that leading space (before "and") is included here 그리고 %3 ì „ì— %1 %Ln ë„ ê°–ê³  ìžˆìŒ %2 Tracker had %1no information%2 on peer counts %3 ago %1 and %2 are replaced with HTML markup, %3 is duration %3 ì „ 트래커ì—게 피어 ìˆ˜ì— ëŒ€í•œ %1ì •ë³´ê°€ 없었ìŒ%2 Got a scrape error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration %1"%2"%3 %4 ì „ì— ê¸ì–´ì˜¤ê¸° 오류 가져옴 Asking for peer counts in %1 %1 is duration %1 ì— í”¼ì–´ 수 물어보기 Queued to ask for peer counts 피어 수 물어봄 í Asking for peer counts now... <small>%1</small> %1 is duration 지금 피어 수를 물어봄... <small>%1</small> transmission-2.92/qt/translations/PaxHeaders.4960/transmission_uk.ts0000644000000000000000000000013212664476417022644 xustar0030 mtime=1456635151.994496489 30 atime=1456635151.993496472 30 ctime=1457295917.276761596 transmission-2.92/qt/translations/transmission_uk.ts0000644000175000017500000031041512664476417024275 0ustar00mikedldmikedld00000000000000 UTF-8 AboutDialog About Transmission Про Transmission <b style='font-size:x-large'>Transmission %1</b> <b style='font-size:x-large'>Transmission %1</b> A fast and easy BitTorrent client Швидкий Ñ– проÑтий у викориÑтанні клієнт BitTorrent Copyright (c) The Transmission Project © The Transmission Project C&redits Ð&втори &License &Ð›Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ Credits Ðвтори Application <b>Transmission is a file sharing program.</b> <b>Transmission — програма Ð´Ð»Ñ Ð¿Ð¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð².</b> When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. Дані завантаженого вами торента будуть доÑтупні іншим кориÑтувачам, Ñкі зможуть завантажити ці дані на Ñвої комп'ютери. Повна відповідальніÑть за ваші Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Ñ‚Ð° Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°ÐºÐ¾Ð½Ð¾Ð´Ð°Ð²Ñтва вашої країни покладаєтьÑÑ Ð½Ð° Ð²Ð°Ñ Ñ– лише на ваÑ. I &Agree По&годжуюÑÑŒ Torrent Completed Торент завершено Torrent Added Торент додано DetailsDialog None Ðічого Mixed Змішаний Unknown Ðевідомо Finished Завершено Paused Призупинено Active now Зараз активно %1 ago %1 тому %1 (%Ln pieces @ %2) %1 (%Ln чаÑтина @ %2) %1 (%Ln чаÑтини @ %2) %1 (%Ln чаÑтин @ %2) %1 (%Ln pieces) %1 (%Ln чаÑтина) %1 (%Ln чаÑтини) %1 (%Ln чаÑтин) Private to this tracker -- DHT and PEX disabled ОÑобиÑто до цього трекера -- DHT та PEX вимкнено Public torrent Публічний торент Created by %1 Ðвтор %1 Created on %1 Створено у %1 Created by %1 on %2 Створено автором %1 у %2 Encrypted connection Шифроване з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Optimistic unchoke СприÑтлива передача Downloading from this peer Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð· цього вузла We would download from this peer if they would let us Ми можемо завантажити з цього вузла, Ñкщо він це дозволить Uploading to peer Ð’Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° вузол We would upload to this peer if they asked Можлива передача даних на цей вузол, Ñкщо надійде відповідний запит Peer has unchoked us, but we're not interested Вузол може передати дані, але нам ці дані не потрібні We unchoked this peer, but they're not interested ÐŸÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð½Ð° вузол дозволене, але відповідних запитів не надходило Peer was discovered through DHT Вузол був знайдений через DHT Peer was discovered through Peer Exchange (PEX) Вузол був знайдений через обмін вузлами (PEX) Peer is an incoming connection Вузол Ñ” вхідним з’єднаннÑм minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) хвилина хвилини хвилин Error Помилка Tracker already exists. Трекер вже Ñ–Ñнує. %1 (100%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data %1 (100%) %1 of %2 (%3%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data, %2 is overall size of torrent data, %3 is percentage (%1/%2*100) %1 з %2 (%3%) %1 of %2 (%3%), %4 Unverified Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded data (both verified and unverified), %2 is overall size of torrent data, %3 is percentage (%1/%2*100), %4 is amount of downloaded but not yet verified data %1 з %2 (%3%), не перевірено %4 %1 (%2 corrupt) %1 (%2 пошкоджено) %1 (Ratio: %2) %1 (СпіввідношеннÑ: %2) N/A н/д Peer is connected over uTP Вузол з'єднано за протоколом µTP Add URL Додати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Add tracker announce URL: Додати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° трекер оголошень: Invalid URL "%1" Помилка в URL «%1» Edit URL Змінити поÑÐ¸Ð»Ð°Ð½Ð½Ñ Edit tracker announce URL: Змінити поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñ‚Ñ€ÐµÐºÐµÑ€Ñƒ оголошень: High ВиÑокий Normal Звичайний Low Ðизький Use Global Settings ВикориÑтовувати загальні параметри Seed regardless of ratio Поширювати незалежно від ÑÐ¿Ñ–Ð²Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Stop seeding at ratio: Припинити Ð¿Ð¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ Ñпіввідношенні: Seed regardless of activity Поширювати незалежно від активноÑті Stop seeding if idle for: Припинити поширеннÑ, Ñкщо не буде активноÑті: Up Вивант Down Завант % % Status Стан Address ÐдреÑа Client Клієнт Torrent Properties ВлаÑтивоÑті торенту Information Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Activity ÐктивніÑть Have: Маємо: Availability: ДоÑтупніÑть: Uploaded: Вивантажено: Downloaded: Завантажено: State: Стан: Running time: ТриваліÑть роботи: Remaining time: ЗалишилоÑÑŒ чаÑу: Last activity: Ð§Ð°Ñ Ð¾Ñтанньої активноÑті: Error: Помилка: Details Подробиці Size: Розмір: Location: РозташуваннÑ: Hash: Хеш: Privacy: КонфіденційніÑть: Origin: ПоходженнÑ: Comment: Коментар: Peers Вузли Tracker Трекер Add Tracker Додати трекер Edit Tracker Змінити трекер Remove Trackers Вилучити трекери Show &more details &Докладніше Show &backup trackers Показати &резервні трекери Files Файли Options Параметри Speed ШвидкіÑть Honor global &limits Зважати на за&гальні Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Limit &download speed: Обмежити &швидкіÑть завантаженнÑ: Limit &upload speed: Обмежити шв&идкіÑть відвантаженнÑ: Torrent &priority: Прі&оритетніÑть торента: Seeding Limits ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ñті &Ratio: С&піввідношеннÑ: &Idle: &ÐеактивніÑть: Peer Connections ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð²ÑƒÐ·Ð»Ñ–Ð² &Maximum peers: &МакÑимальна кількіÑть вузлів: FileAdded Add Torrent Додати торент <p><b>Unable to add "%1".</b></p><p>It is a duplicate of "%2" which is already added.</p> <p><b>Ðеможливо додати "%1".</b></p><p>Це дублікат "%2", Ñкий вже було додано.</p> Error Adding Torrent Помилка під Ñ‡Ð°Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ñ‚Ð¾Ñ€ÐµÐ½Ñ‚Ñƒ FileTreeItem Low Ðизький High ВиÑокий Normal Звичайний Mixed Змішаний FileTreeModel File Файл Size Розмір Progress ПоÑтуп Download Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Priority Пріоритет FileTreeView Check Selected Обрати виділене Uncheck Selected ЗнÑти виділене Only Check Selected Обрати тільки виділене Priority Пріоритет Open Відкрити Rename... Змінити ім'Ñ... FilterBar All Ð’ÑÑ– Active Ðктивний Downloading Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Seeding ÐŸÐ¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Paused Призупинено Finished Завершено Verifying Перевірка Error Помилка Show: Показувати: FilterBarLineEdit Search... Шукати... Formatter B/s Б/Ñ kB/s кБ/Ñ MB/s МБ/Ñ GB/s ГБ/Ñ TB/s ТБ/Ñ B Б kB кБ MB МБ GB ГБ TB ТБ KiB КіБ MiB МіБ GiB ГіБ TiB ТіБ Unknown Ðевідомо None Ðічого %1 %2 %1 %2 %Ln day(s) %Ln день %Ln дні %Ln днів %Ln hour(s) %Ln година %Ln години %Ln годин %Ln minute(s) %Ln хвилина %Ln хвилини %Ln хвилин %Ln second(s) %Ln Ñекунда %Ln Ñекунди %Ln Ñекунд %1, %2 %1, %2 FreeSpaceLabel <i>Calculating Free Space...</i> <i>ОбчиÑÐ»ÐµÐ½Ð½Ñ Ð²Ñ–Ð»ÑŒÐ½Ð¾Ð³Ð¾ проÑтору...</i> %1 free %1 вільно LicenseDialog License Ð›Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ MainWindow Transmission Transmission &Torrent &Торент &Edit З&міни &Help &Довідка &View П&ереглÑд &File &Файл &New... С&творити… Create a new torrent Створити новий торент &Properties &ВлаÑтивоÑті Show torrent properties Показати вікно влаÑтивоÑтей торенту Open the torrent's folder Відкрити теку з торентами Queue Черга &Open... &Відкрити… Open Відкрити Open a torrent Відкрити торент Open Fold&er Відкрити &теку &Start &ЗапуÑтити Start torrent ЗапуÑтити торент Ask Tracker for &More Peers ЗапроÑити у трекера &більше вузлів Ask tracker for more peers ЗапроÑити у трекера більше вузлів &Pause &Призупинити Pause torrent Призупинити торент &Verify Local Data &Перевірити локальні дані Verify local data Перевірити локальні дані &Remove Ð’&илучити Remove torrent Вилучити торент &Delete Files and Remove &Вилучити файли Ñ– торент-файл Remove torrent and delete its files Вилучити торент разом із файлами &Start All &ЗапуÑтити вÑе &Pause All П&ризупинити вÑÑ– &Quit Ви&йти &Select All Поз&начити вÑÑ– &Deselect All &ЗнÑти Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ &Preferences &ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ &Compact View &СтиÑлий переглÑд Compact View СтиÑлий переглÑд &Toolbar &Панель інÑтрументів &Filterbar Панель &Ñ„Ñ–Ð»ÑŒÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ &Statusbar &Смужка Ñтану Sort by &Activity ВпорÑдкувати за &активніÑтю Sort by A&ge ВпорÑдкувати за &віком Sort by Time &Left ВпорÑдкувати за ча&Ñом, що залишивÑÑ Sort by &Name ВпорÑдкувати за &назвою Sort by &Progress ВпорÑдкувати за &поÑтупом Sort by Rati&o ВпорÑдкувати за Ñпів&відношеннÑм Sort by Si&ze ВпорÑдкувати за ро&зміром Sort by Stat&e ВпорÑдкувати за Ñта&ном Sort by T&racker ВпорÑдкувати за трекером Message &Log &Журнал повідомлень &Statistics &СтатиÑтика &Contents &ВміÑÑ‚ &About &Про програму Re&verse Sort Order &Змінити порÑдок ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ &Name &Ðазва &Files &Файли &Tracker &Трекери Total Ratio Загальне ÑÐ¿Ñ–Ð²Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Session Ratio Ð¡Ð¿Ñ–Ð²Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð·Ð° ÑÐµÐ°Ð½Ñ Total Transfer Ð’Ñього передано Session Transfer Передано за ÑÐµÐ°Ð½Ñ &Main Window &Головне вікно Tray &Icon Іконка в зоні Ñповіщень &Change Session... &Змінити ÑеанÑ… Choose Session Start a local session or connect to a running session Обрати ÑÐµÐ°Ð½Ñ Set &Location... Вказати розміщеннÑ… &Copy Magnet Link to Clipboard С&копіювати magnet-поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð¾ буфера обміну Open &URL... Відкри&ти поÑиланнÑ… &Donate &Підтримати фінанÑово Start &Now ЗапуÑтити зараз Bypass the queue and start now ПропуÑтити чергу Ñ– почати зараз Move to &Top ПереÑунути на &початок Move &Up ПереміÑтити в&гору Move &Down ПереміÑтити в&низ Move to &Bottom ПереÑунути в &кінець Sort by &Queue ВпорÑдкувати за чергою Limit Download Speed Обмежити швидкіÑть Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Unlimited Ðеобмежено Limited at %1 Обмежено до %1 Limit Upload Speed Обмежити швидкіÑть Ð¿Ð¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Stop Seeding at Ratio Припинити Ð¿Ð¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð·Ð° ÑÐ¿Ñ–Ð²Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Seed Forever Поширювати завжди Stop at Ratio (%1) Зупинити за ÑÐ¿Ñ–Ð²Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ (%1) - %1:%2 Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); notice that leading space (before the dash) is included here - %1:%2 Idle Ðеактивний Ratio: %1 Рейтинг: %1 Down: %1, Up: %2 Завн: %1, Пошир: %2 Torrent Files (*.torrent);;All Files (*.*) Торент файли (*.torrent);;Ð’ÑÑ– файли (*.*) Show &options dialog Показати &діалог Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Open Torrent Відкрити торент Speed Limits ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ñті Network Error Помилка мережі Click to disable Temporary Speed Limits (%1 down, %2 up) ÐатиÑніть Ð´Ð»Ñ Ð·Ð½ÑÑ‚Ñ‚Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñових обмежень швидкоÑті (%1 завантаженнÑ, %2 поширеннÑ) Click to enable Temporary Speed Limits (%1 down, %2 up) ÐатиÑніть Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñового Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ñті (%1 завантаженнÑ, %2 поширеннÑ) Remove torrent? Вилучити торент? Delete this torrent's downloaded files? Вилучити завантажені файли цих торентів? Remove %Ln torrent(s)? Вилучити %Ln торент? Вилучити %Ln торента? Вилучити %Ln торентів? Showing %L1 of %Ln torrent(s) Відображен %L1 з %Ln торентів Відображені %L1 з %Ln торентів Відображені %L1 з %Ln торентів Delete these %Ln torrent(s)' downloaded files? Вилучити завантажени файлы цього %Ln торенту? Вилучити завантажени файлы цих %Ln торентів? Вилучити завантажени файлы цих %Ln торентів? Once removed, continuing the transfer will require the torrent file or magnet link. ПіÑÐ»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±ÐµÐ½ буде торент-файл або маґнет-поÑиланнÑ. Once removed, continuing the transfers will require the torrent files or magnet links. ПіÑÐ»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±ÐµÐ½ буде торрент-файл або магнет-поÑиланнÑ. This torrent has not finished downloading. Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ торенту не завершене. These torrents have not finished downloading. Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ†Ð¸Ñ… торентів не завершено. This torrent is connected to peers. Цей торент підключений до вузлів. These torrents are connected to peers. Ці торенти підключені до вузлів. One of these torrents is connected to peers. Один з цих торентів підключений до вузлів. Some of these torrents are connected to peers. ДеÑкі із цих торентів підключений до вузлів. One of these torrents has not finished downloading. Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ із цих торентів не завершене. Some of these torrents have not finished downloading. Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´ÐµÑких із цих торентів не завершене. %1 has not responded yet %1 ще не відповів %1 is responding %1 відповідає %1 last responded %2 ago %1 оÑÑ‚Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´ÑŒ %2 тому %1 is not responding %1 не відповідає MakeDialog New Torrent Ðовий торент <i>No source selected<i> <i>Ðе вказано джерела<i> %Ln File(s) %Ln файл %Ln файла %Ln файлів %Ln Piece(s) %Ln чаÑтина %Ln чаÑтини %Ln чаÑтин %1 in %2; %3 @ %4 %1 у %2; %3 @ %4 Files Файли Sa&ve to: З&берегти до: Source f&older: Тека з &даними: Source &file: &Файл даних: Properties ВлаÑтивоÑті &Trackers: &Трекери: To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. Резервну адреÑу додавайте піÑÐ»Ñ Ð¾Ñновної. Щоб додати нову оÑновну адреÑу, допишіть Ñ—Ñ— піÑÐ»Ñ Ð¿Ð¾Ñ€Ð¾Ð¶Ð½ÑŒÐ¾Ð³Ð¾ Ñ€Ñдка. Co&mment: Ком&ентар: &Private torrent &Приватний торент MakeProgressDialog New Torrent Ðовий торент Creating "%1" СтворюєтьÑÑ Â«%1» Created "%1"! «%1» Ñтворено! Error: invalid announce URL "%1" Помилка: пошкоджена адреÑа оголошень «%1» Cancelled СкаÑовано Error reading "%1": %2 Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ «%1»: %2 Error writing "%1": %2 Ðе вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати «%1»: %2 OptionsDialog Open Torrent Відкрити торент Open Torrent from File Відкрити торент з файлу Open Torrent from URL or Magnet Link Відкрити торент з поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñ‡Ð¸ Маґнет &Source: &Джерело: &Destination folder: &Тека призначеннÑ: High ВиÑокий Normal Ðормальний Low Ðизький &Priority: &Пріоритет: S&tart when added &Розпочинати безпоÑередньо піÑÐ»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ &Verify Local Data &Перевірити локальні дані Mo&ve .torrent file to the trash Вилу&чати файли .torrent до Ñмітника Torrent Files (*.torrent);;All Files (*.*) Торент файли (*.torrent);;Ð’ÑÑ– файли (*.*) Select Destination Обрати Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ PathButton (None) (Ðічого) Select Folder Обрати теку Select File Обрати файл PrefsDialog Use &authentication Вимагати авто&ризації &Username: &КориÑтувач: Pass&word: &Пароль: &Open web client ПереглÑнути через веб Addresses: ÐдреÑи: Speed Limits ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ñті <small>Override normal speed limits manually or at scheduled times</small> <small>Ðе дотримуватиÑÑŒ обмежень швидкоÑті при вÑтановленні обмежень вручну або за розкладом</small> &Scheduled times: З&гідно розкладу: &On days: &За днÑми: Every Day Кожного Ð´Ð½Ñ Weekdays Ð’ робочі дні Weekends У вихідні Sunday ÐÐµÐ´Ñ–Ð»Ñ Monday Понеділок Tuesday Вівторок Wednesday Середа Thursday Четвер Friday П'ÑÑ‚Ð½Ð¸Ñ†Ñ Saturday Субота Port is <b>open</b> Порт <b>відкритий</b> Port is <b>closed</b> Порт <b>закритий</b> Incoming Peers Вузли з вхідними підключеннÑми Status unknown Ðевідомий ÑÑ‚Ð°Ñ‚ÑƒÑ &Port for incoming connections: &Порт Ð´Ð»Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¸Ñ… з’єднань: Use UPnP or NAT-PMP port &forwarding from my router ВикориÑтовувати UPnP або NAT-PMP п&ереадреÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñ–Ð² з мого маршрутизатора Options Параметри Enable &uTP for peer connections Увімкнути обмін д&аними за µTP uTP is a tool for reducing network congestion. µTP — інÑтрумент Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½ÑŽ мережі. minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) хвилина хвилини хвилин minute(s) ago Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) хвилину тому хвилин тому хвилин тому Automatically add .torrent files &from: Ðвтоматично &додавати торенти з: Show the Torrent Options &dialog Показати &діалог Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð¾Ñ€ÐµÐ½Ñ‚Ñƒ &Start added torrents &Розпочати додані торенти Mo&ve the .torrent file to the trash Вилу&чати файли .torrent до Ñмітника Download Queue Черга завантажень Ma&ximum active downloads: МакÑимальна &к-ть активних завантажень: Incomplete Ðе завершено Seeding ÐŸÐ¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Remote Віддалений доÑтуп <i>Blocklist contains %Ln rule(s)</i> <i>У ÑпиÑку Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–ÑтитьÑÑ %Ln правило</i> <i>У ÑпиÑку Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–ÑтитьÑÑ %Ln правила</i> <i>У ÑпиÑку Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–ÑтитьÑÑ %Ln правил</i> Pick a &random port every time Transmission is started Вибирати випадковий порт при кожному запу&Ñку Transmission Limits ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Maximum peers per &torrent: МакÑ. кількіÑть вузлів на &торент: Maximum peers &overall: МакÑ. кількіÑть вузлів &взагалі: <b>Update succeeded!</b><p>Blocklist now has %Ln rule(s). <b>УÑпішно оновлено!</b><p>ÑпиÑок блокувань тепер міÑтить %Ln правило. <b>УÑпішно оновлено!</b><p>ÑпиÑок блокувань тепер міÑтить %Ln правила. <b>УÑпішно оновлено!</b><p>ÑпиÑок блокувань тепер міÑтить %Ln правил. <b>Update Blocklist</b><p>Getting new blocklist... <b>Оновити ÑпиÑок блокуваннÑ</b><p>ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑпиÑку… Blocklist СпиÑок блокувань Enable &automatic updates Увімкнути &автоматичне Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Allow encryption Дозволити ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Prefer encryption Ðадавати перевагу шифруванню Require encryption Вимагати ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Privacy КонфіденційніÑть &to &до Desktop Робочий Ñтіл Show Transmission icon in the &notification area Показувати &значок Transmission в зоні ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Te&st Port Перевірити порт Enable &blocklist: Дозволити ÑпиÑок блокувань: &Update &Оновити &Encryption mode: Режим &шифруваннÑ: Remote Control Віддалене ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Allow &remote access Дозволити &віддалений доÑтуп HTTP &port: HTTP порт: Only allow these IP a&ddresses: Дозволити лише таким IP-&адреÑам: &Upload: Ð’Ñ–&двантаженнÑ: &Download: З&авантаженнÑ: Alternative Speed Limits Ðльтернативні Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ñті U&pload: Ð’Ñ–&двантаженнÑ: Do&wnload: З&авантаженнÑ: Start &minimized in notification area ЗапуÑкати зверненим у ÑиÑтемний лоток Notification Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Show a notification when torrents are a&dded П&оказувати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñƒ відповідь на Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ñ‚Ð¾Ñ€ÐµÐ½Ñ‚Ð° Show a notification when torrents &finish Показувати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ‰Ð¾Ð´Ð¾ &Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ‚Ð¾Ñ€ÐµÐ½Ñ‚Ð° Play a &sound when torrents finish Відтворити зв&уковий файл піÑÐ»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Testing TCP Port... ТеÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñƒ TCP… Peer Limits ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ñ–Ñ€Ñ–Ð² Use PE&X to find more peers ВикориÑтовувати PE&X Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ вузлів PEX is a tool for exchanging peer lists with the peers you're connected to. PEX — це ÑпоÑіб обміну ÑпиÑками вузлів між вузлами, з Ñкими вÑтановлено з’єднаннÑ. Use &DHT to find more peers ВикориÑтовувати &DHT Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ вузлів DHT is a tool for finding peers without a tracker. DHT — це ÑпоÑіб пошуку вузлів без викориÑÑ‚Ð°Ð½Ð½Ñ Ñ‚Ñ€ÐµÐºÐµÑ€Ð°. Use &Local Peer Discovery to find more peers ВикориÑтовувати ви&ÑÐ²Ð»ÐµÐ½Ð½Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¸Ñ… вузлів LPD is a tool for finding peers on your local network. LPD — програма Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ вузлів у вашій локальній мережі. Encryption Ð¨Ð¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Select "Torrent Done" Script Обрати Ñценарій Select Incomplete Directory Обрати теку Ð´Ð»Ñ Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ… Select Watch Directory Обрати теку Ð´Ð»Ñ ÑпоÑÑ‚ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Select Destination Виберіть Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Adding Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Download is i&nactive if data sharing stopped: Please keep this phrase as short as possible, it's curently the longest and influences dialog width Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾, Ñкщо обмін даними зупинено: Downloading Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Append ".&part" to incomplete files' names Додавати до назви незавершених файлів «.&part» Keep &incomplete files in: Зберігати &незавершені файли у: Save to &Location: Зберігати до: Call scrip&t when torrent is completed: Виконати Ñ&ценарій, піÑÐ»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ: Stop seeding at &ratio: Припинити Ð¿Ð¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ Ñпіввідношенні: Stop seedi&ng if idle for: Припинити поширеннÑ, Ñкщо не буде активноÑті: Transmission Preferences ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Transmission Speed ШвидкіÑть Network Мережа Not supported by remote sessions Ðе підтримуєтьÑÑ Ð²Ñ–Ð´Ð´Ð°Ð»ÐµÐ½Ð¾ÑŽ ÑеÑією QObject Invalid option Помилковий параметр RelocateDialog Select Location Обрати Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Set Torrent Location Ð’Ñтановити Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð¾Ñ€ÐµÐ½Ñ‚Ñƒ Set Location Ð’Ñтановити Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ New &location: Ðо&ве розташуваннÑ: &Move from the current folder &ПеренеÑти зі Ñтарої теки у вказану Local data is &already there &Локальні дані вже перенеÑено Session Error Renaming Path Помилка під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ ÑˆÐ»Ñху <p><b>Unable to rename "%1" as "%2": %3.</b></p> <p>Please correct the errors and try again.</p> <p><b>Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ «%1» на «%2»: %3.</b></p> <p>Виправте помилку Ñ– Ñпробуйте ще раз.</p> Add Torrent Додати торент SessionDialog Change Session Змінити ÑÐµÐ°Ð½Ñ Source Джерело Start &Local Session Ро&зпочати локальний ÑÐµÐ°Ð½Ñ Connect to &Remote Session Під&ключитиÑÑŒ до віддаленого ÑеанÑу &Host: &ХоÑÑ‚: &Port: &Порт: &Authentication required Ðеобхідна ав&Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ &Username: &КориÑтувач: Pass&word: &Пароль: StatsDialog Statistics СтатиÑтика Current Session Поточна ÑеÑÑ–Ñ Uploaded: Вивантажено: Downloaded: Завантажено: Ratio: Рейтинг: Duration: ТриваліÑть: Total Загалом Started %Ln time(s) Запущено %Ln раз Запущено %Ln раза Запущено %Ln разів Torrent Verifying local data Перевірка локальних даних Downloading Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Seeding ÐŸÐ¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Finished Завершено Paused Призупинено Queued for verification Черга на перевірку Queued for download Черга на Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Queued for seeding Черга на Ð¿Ð¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Tracker gave a warning: %1 Трекер видав попередженнÑ: %1 Tracker gave an error: %1 Трекер повідомив про помилку: %1 Error: %1 Помилка: %1 TorrentDelegate Magnetized transfer - retrieving metadata (%1%) First part of torrent progress string; %1 is the percentage of torrent metadata downloaded Маґнет-передача - Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¼ÐµÑ‚Ð°Ð´Ð°Ð½Ð¸Ñ… (%1%) %1 of %2 (%3%) First part of torrent progress string; %1 is how much we've got, %2 is how much we'll have when done, %3 is a percentage of the two %1 з %2 (%3%) %1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio, %6 is the ratio we want to reach before we stop uploading %1 з %2 (%3%), відвантажено %4 (СпіввідношеннÑ: %5 Мета: %6) %1 of %2 (%3%), uploaded %4 (Ratio: %5) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio %1 з %2 (%3%), відвантажено %4 (СпіввідношеннÑ: %5) %1, uploaded %2 (Ratio: %3 Goal: %4) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio, %4 is the ratio we want to reach before we stop uploading %1, відвантажено %2 (СпіввідношеннÑ: %3 Мета: %4) %1, uploaded %2 (Ratio: %3) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio %1, відвантажено %2 (СпіввідношеннÑ: %3) - %1 left Second (optional) part of torrent progress string; %1 is duration; notice that leading space (before the dash) is included here - %1 лишилоÑÑŒ - Remaining time unknown Second (optional) part of torrent progress string; notice that leading space (before the dash) is included here - ЧаÑ, що залишивÑÑ, невідомий Ratio: %1 Рейтинг: %1 Downloading from %Ln peer(s) First part of phrase "Downloading from ... peer(s) and ... web seed(s)" Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %Ln вузла Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %Ln вузлів Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %Ln вузлів Seeding to %Ln peer(s) ÐŸÐ¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð´Ð¾ %Ln вузла ÐŸÐ¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð´Ð¾ %Ln вузлів ÐŸÐ¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð´Ð¾ %Ln вузлів - - Downloading metadata from %Ln peer(s) (%1% done) ЗавантажуютьÑÑ Ð¼ÐµÑ‚Ð°Ð´Ð°Ð½Ñ– з %Ln піра (%1% завершено) ЗавантажуютьÑÑ Ð¼ÐµÑ‚Ð°Ð´Ð°Ð½Ñ– з %Ln пірів (%1% завершено) ЗавантажуютьÑÑ Ð¼ÐµÑ‚Ð°Ð´Ð°Ð½Ñ– з %Ln пірів (%1% завершено) Downloading from %1 of %Ln connected peer(s) First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %1 з %Ln підключеного вузла Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %1 з %Ln підключених вузлів Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %1 з %Ln підключених вузлів and %Ln web seed(s) Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; notice that leading space (before "and") is included here Ñ– %Ln веб Ñіда Ñ– %Ln веб Ñідів Ñ– %Ln веб Ñідів Seeding to %1 of %Ln connected peer(s) ÐŸÐ¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð´Ð¾ %1 з %Ln підключеного вузла ÐŸÐ¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð´Ð¾ %1 з %Ln підключених вузлів ÐŸÐ¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð´Ð¾ %1 з %Ln підключених вузлів Error Помилка Verifying local data (%1% tested) ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ локальних даних (%1% перевірено) TrackerDelegate Got a list of%1 %Ln peer(s)%2 %3 ago %1 and %2 are replaced with HTML markup, %3 is duration СпиÑок вузлів отримано з%1 %Ln пірa%2 %3 тому СпиÑок вузлів отримано з%1 %Ln пірів%2 %3 тому СпиÑок вузлів отримано з%1 %Ln пірів%2 %3 тому Peer list request %1timed out%2 %3 ago; will retry %1 and %2 are replaced with HTML markup, %3 is duration Запит ÑпиÑку вузлів %1проÑтрочено%2 %3 тому; повтор Got an error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Отримано Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку %1«%2»%3 %4 тому No updates scheduled Жодних оновлень не заплановано Asking for more peers in %1 %1 is duration Запит щодо нових вузлів за %1 Queued to ask for more peers Ð’ черзі на перевірку нових вузлів Asking for more peers now... <small>%1</small> %1 is duration Запит щодо додаткових вузлів… <small>%1</small> Tracker had%1 %Ln seeder(s)%2 First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup Ðа трекері був%1 %Ln Ñідер%2 Ðа трекері було%1 %Ln Ñідера%2 Ðа трекері було%1 %Ln Ñідерів%2 and%1 %Ln leecher(s)%2 %3 ago Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup, %3 is duration; notice that leading space (before "and") is included here Ñ–%1 %Ln лічер%2 %3 тому Ñ–%1 %Ln лічера%2 %3 тому Ñ–%1 %Ln лічерів%2 %3 тому Tracker had %1no information%2 on peer counts %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Трекер %1не мав інформації%2 щодо кількоÑті вузлів %3 тому Got a scrape error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Отримано Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку %1«%2»%3 %4 тому Asking for peer counts in %1 %1 is duration Запит щодо кількоÑті вузлів за %1 Queued to ask for peer counts У черзі на запит кількіÑть вузлів Asking for peer counts now... <small>%1</small> %1 is duration ÐадÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ щодо кількоÑті отримувачів… <small>%1</small> transmission-2.92/qt/translations/PaxHeaders.4960/transmission_de.ts0000644000000000000000000000013212664476417022615 xustar0030 mtime=1456635151.995496507 30 atime=1456635151.994496489 30 ctime=1457295917.276761596 transmission-2.92/qt/translations/transmission_de.ts0000644000175000017500000026337312664476417024260 0ustar00mikedldmikedld00000000000000 UTF-8 AboutDialog About Transmission Über Transmission <b style='font-size:x-large'>Transmission %1</b> <b style='font-size:x-large'>Transmission %1</b> A fast and easy BitTorrent client Ein schneller und einfacher BitTorrent-Klient Copyright (c) The Transmission Project Copyright (c) Das Transmission Projekt C&redits &Mitwirkende &License &Lizenz Credits Mitwirkende Application <b>Transmission is a file sharing program.</b> <b>Transmission ist ein Filesharing-Programm.</b> When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. Wenn du einen Torrent laufen lässt, werden seine Daten anderen zugänglich gemacht, indem er hochgeladen wird. Du bist für alle Inhalte, die du teilst, verantwortlich. I &Agree Ich &stimme zu Torrent Completed Torrent abgeschlossen Torrent Added Torrent hinzugefügt DetailsDialog None Keine Mixed Gemischt Unknown Unbekannt Finished Beendet Paused Pausiert Active now Jetzt aktiv %1 ago Vor %1 %1 (%Ln pieces @ %2) %1 (%Ln Teil @ %2) %1 (%Ln Teile @ %2) %1 (%Ln pieces) %1 (%Ln Teil) %1 (%Ln Teile) Private to this tracker -- DHT and PEX disabled Geheim auf diesem Tracker -- DHT und PEX sind deaktiviert Public torrent Öffentlicher Torrent Created by %1 Erstellt von %1 Created on %1 Erstellt auf %1 Created by %1 on %2 Erstellt von %1 am %2 Encrypted connection Verschlüsselte Verbindung Optimistic unchoke Downloading from this peer Von diesem Peer herunterladen We would download from this peer if they would let us Wir würden von diesem Peer herunterladen, wenn Sie uns lassen würden Uploading to peer Lade zu Peer hoch We would upload to this peer if they asked Wir würden Peer has unchoked us, but we're not interested We unchoked this peer, but they're not interested Peer was discovered through DHT Peer wurde durch DHT entdeckt Peer was discovered through Peer Exchange (PEX) Peer wurde entdeckt durch Peer Exchange (PEX) Peer is an incoming connection Peer ist eine eingehende Verbindung minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) Minute Minuten Error Fehler Tracker already exists. Tracker existiert bereits. %1 (100%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data %1 (100%) %1 of %2 (%3%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data, %2 is overall size of torrent data, %3 is percentage (%1/%2*100) %1 von %2 (%3%) %1 of %2 (%3%), %4 Unverified Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded data (both verified and unverified), %2 is overall size of torrent data, %3 is percentage (%1/%2*100), %4 is amount of downloaded but not yet verified data %1 von %2 (%3%); %4 ungeprüft %1 (%2 corrupt) %1 (%2 korrupt) %1 (Ratio: %2) %1 (Verhältnis: %2) N/A Nicht verfügbar Peer is connected over uTP Peer ist über uTP verbunden Add URL URL hinzufügen Add tracker announce URL: Announce URL zum Tracker hinzufügen: Invalid URL "%1" Ungültige URL "%1" Edit URL URL bearbeiten Edit tracker announce URL: Announce URL des Trackers bearbeiten: High Hoch Normal Normal Low Niedrig Use Global Settings Globale Einstellungen verwenden Seed regardless of ratio Ungeachtet des Verhältnisses verteilen Stop seeding at ratio: Verteilung bei diesem Verhältnis stoppen: Seed regardless of activity Ungeachtet der Aktivität verteilen Stop seeding if idle for: Verteilung stoppen, wenn untätig für: Up Hoch Down Runter % % Status Status Address Adresse Client Client Torrent Properties Torrent-Eigenschaften Information Information Activity Aktivität: Have: Vorhanden: Availability: Verfügbarkeit: Uploaded: Hochgeladen: Downloaded: Runtergeladen: State: Status: Running time: Laufzeit: Remaining time: Verbleibende Zeit: Last activity: Letzte Aktivität: Error: Fehler: Details Details Size: Größe: Location: Ort: Hash: Hash: Privacy: Datenschutz: Origin: Herkunft: Comment: Kommentar: Peers Peers Tracker Tracker Add Tracker Tracker hinzufügen Edit Tracker Tracker bearbeiten Remove Trackers Tracker entfernen Show &more details Zeige &mehr Details Show &backup trackers &Alternativ-Tracker anzeigen Files Dateien Options Optionen Speed Geschwindigkeit Honor global &limits G&lobale Beschränkungen beachten Limit &download speed: &Download-Geschwindigkeit beschränken: Limit &upload speed: &Upload-Geschwindigkeit beschränken: Torrent &priority: Torrent-&Priorität: Seeding Limits Verteilungsbeschränkungen &Ratio: Ve&rhältnis: &Idle: &Inaktivität: Peer Connections Peer-Verbindungen &Maximum peers: Maximale Anzahl an Peers: FileAdded Add Torrent Torrent hinzufügen <p><b>Unable to add "%1".</b></p><p>It is a duplicate of "%2" which is already added.</p> <p><b>Konnte "%1" nicht hinzufügen.</b></p><p>Es handelt sich um ein Duplikat von "%2", welche bereits hinzugefügt wurde.</p> Error Adding Torrent Fehler beim Hinzufügen eines Torrents FileTreeItem Low Niedrig High Hoch Normal Normal Mixed Gemischt FileTreeModel File Datei Size Größe Progress Fortschritt Download Download Priority Priorität FileTreeView Check Selected Uncheck Selected Only Check Selected Priority Priorität Open Öffnen Rename... FilterBar All Alle Active Aktiv Downloading Lade herunter Seeding Verteile Paused Pausiert Finished Beendet Verifying Verifiziere Error Fehler Show: Zeige: FilterBarLineEdit Search... Suche ... Formatter B/s B/s kB/s kB/s MB/s MB/s GB/s GB/s TB/s TB/s B B kB kB MB MB GB GB TB TB KiB KiB MiB MiB GiB GiB TiB TiB Unknown Unbekannt None Keine %1 %2 %1 %2 %Ln day(s) %Ln Tag %Ln Tage %Ln hour(s) %Ln Stunde %Ln Stunden %Ln minute(s) %Ln Minute %Ln Minuten %Ln second(s) %Ln Sekunde %Ln Sekunden %1, %2 %1, %2 FreeSpaceLabel <i>Calculating Free Space...</i> <i>Berechne freien Platz ...</i> %1 free %1 frei LicenseDialog License Lizenz MainWindow Transmission Transmission &Torrent &Torrent &Edit &Editieren &Help &Hilfe &View &Zeige &File &Datei &New... &Neu Create a new torrent Erstelle einen neuen Torrent &Properties &Eigenschaften Show torrent properties Zeige Eigenschaften des Torrents Open the torrent's folder Öffne den Ordner des Torrents Queue Warteschlange &Open... &Öffne ... Open Offen Open a torrent Öffne einen Torrent Open Fold&er Öffne Ordn&er &Start &Starte Start torrent Starte Torrent Ask Tracker for &More Peers &Mehr Peers vom Tracker anfordern Ask tracker for more peers Mehr Peers vom Tracker anfordern &Pause &Pause Pause torrent Pausiere Torrent &Verify Local Data &Verifiziere lokale Daten Verify local data Verifiziere lokale Daten &Remove &Entferne Remove torrent Entferne Torrent &Delete Files and Remove &Lösche Dateien und entferne Remove torrent and delete its files Entferne Torrent und lösche Dateien &Start All &Starte alle &Pause All &Pausiere alle &Quit &Beenden &Select All Alle aus&wählen &Deselect All Alle a&bwählen &Preferences &Eigenschaften &Compact View &Kompakte Ansicht Compact View Kompakte Ansicht &Toolbar &Werkzeugleiste &Filterbar &Filterleiste &Statusbar &Statusleiste Sort by &Activity Nach &Aktivität sortieren Sort by A&ge Nach A&lter sortieren Sort by Time &Left Nach &verbleibender Zeit sortieren Sort by &Name Nach &Name sortieren Sort by &Progress Nach &Fortschritt sortieren Sort by Rati&o Nach Ver&hältnis sortieren Sort by Si&ze Nach &Größe sortieren Sort by Stat&e Nach Status sorti&eren Sort by T&racker Nach T&racker sortieren Message &Log Nachrichtenprotoko&ll &Statistics &Statistiken &Contents &Inhalte &About &Über Re&verse Sort Order S&ortierreihenfolge umkehren &Name &Name &Files &Dateien &Tracker &Tracker Total Ratio Gesamtverhältnis Session Ratio Verhältnis der Sitzung Total Transfer Gesamttransfer Session Transfer Transfer der Sitzung &Main Window &Hauptfenster Tray &Icon &Change Session... Sitzung we&chseln... Choose Session Start a local session or connect to a running session Wähle Sitzung aus Set &Location... Ort fest&legen &Copy Magnet Link to Clipboard Magnet-Link in die Zwis&chenablage kopieren Open &URL... Öffne &URL ... &Donate &Spende Start &Now Starte &Jetzt Bypass the queue and start now Warteschlange überspringen und jetzt anfangen Move to &Top An den &Anfang verschieben Move &Up &Hoch schieben Move &Down &Runter schieben Move to &Bottom An das &Ende verschieben Sort by &Queue Nach War&teschlange sortieren Limit Download Speed Download-Geschwindigkeit begrenzen Unlimited Unbeschränkt Limited at %1 Begrenzt auf %1 Limit Upload Speed Upload-Geschwindigkeit begrenzen Stop Seeding at Ratio Verteilung bei Verhältnis stoppen Seed Forever Für immer verteilen Stop at Ratio (%1) Stoppen bei Verhältnis (%1) - %1:%2 Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); notice that leading space (before the dash) is included here - %1:%2 Idle Untätig Ratio: %1 Verhältnis: %1 Down: %1, Up: %2 Runter: %1, Hoch: %2 Torrent Files (*.torrent);;All Files (*.*) Torrent-Dateien (*.torrent);;Alle Dateien (*.*) Show &options dialog &Optionsdialog anzeigen Open Torrent Torrent öffnen Speed Limits Geschwindigkeitsbegrenzungen Network Error Netzwerkfehler Click to disable Temporary Speed Limits (%1 down, %2 up) Klicken um temporäre Geschwindigkeitsbegrenzungen zu deaktivieren (%1 hoch, %2 runter) Click to enable Temporary Speed Limits (%1 down, %2 up) Klicken um temporäre Geschwindigkeitsbegrenzungen zu aktivieren (%1 hoch, %2 runter) Remove torrent? Torrent entfernen? Delete this torrent's downloaded files? Heruntergeladene Dateien von diesem Torrent löschen? Remove %Ln torrent(s)? %Ln Torrent entfernen? %Ln Torrents entfernen? Showing %L1 of %Ln torrent(s) Delete these %Ln torrent(s)' downloaded files? Die Dateien von diesem Torrent löschen? Die Dateien dieser %Ln Torrents löschen? Once removed, continuing the transfer will require the torrent file or magnet link. Einmal entfernt, wird das Fortführen der Übertragung eine Torrent-Datei oder einen Magnet-Link erfordern. Once removed, continuing the transfers will require the torrent files or magnet links. Einmal entfernt, wird das Fortführen der Übertragungen die Torrent-Dateien oder die Magnet-Links erfordern. This torrent has not finished downloading. Dieser Torrent ist noch nicht abgeschlossen. These torrents have not finished downloading. Diese Torrents sind noch nicht abgeschlossen. This torrent is connected to peers. Dieser Torrent ist mit Peers verbunden. These torrents are connected to peers. Diese Torrents sind mit Peers verbunden. One of these torrents is connected to peers. Einer dieser Torrents ist mit Peers verbunden. Some of these torrents are connected to peers. Einige dieser Torrents sind mit Peers verbunden. One of these torrents has not finished downloading. Einer dieser Torrents ist noch nicht abgeschlossen. Some of these torrents have not finished downloading. Einige dieser Torrents sind noch nicht abgeschlossen. %1 has not responded yet %1 hat noch nicht geantwortet %1 is responding %1 antwortet %1 last responded %2 ago %1 hat zuletzt vor %2 geantwortet %1 is not responding %1 antwortet nicht MakeDialog New Torrent Neuer Torrent <i>No source selected<i> <i>Keine Quelle ausgewählt<i> %Ln File(s) %Ln Datei %Ln Dateien %Ln Piece(s) %Ln Teil %Ln Teile %1 in %2; %3 @ %4 %1 von %2; %3 @ %4 Files Dateien Sa&ve to: Sp&eichern unter: Source f&older: Quellen O&rdner: Source &file: Quellen-D&atei: Properties Eigenschaften &Trackers: &Trackers: To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. Um eine alternative URL hinzuzufügen, muss diese auf der Zeile nach der primären URL hinzugefügt werden. Um eine weitere primäre URL hinzuzufügen, muss diese nach einer Leerzeile eingefügt werden. Co&mment: Ko&mmentar: &Private torrent &Privater Torrent MakeProgressDialog New Torrent Neuer Torrent Creating "%1" Erstelle "%1" Created "%1"! "%1" erstellt! Error: invalid announce URL "%1" Fehler: Ungültige Ankündigung URL "%1" Cancelled Abgebrochen Error reading "%1": %2 Fehler beim Lesen "%1": %2 Error writing "%1": %2 Fehler beim Schreiben "%1": %2 OptionsDialog Open Torrent Öffne Torrent Open Torrent from File Öffne Torrent aus Datei Open Torrent from URL or Magnet Link Öffne Torrent von URL oder Magnetischem Link &Source: &Quelle: &Destination folder: &Zielordner: High Hoch Normal Normal Low Niedrig &Priority: &Priorität: S&tart when added S&tarte sobald hinzugefügt &Verify Local Data Lokale Daten überprü&fen Mo&ve .torrent file to the trash &Verschiebe .torrent-Datei in den Papierkorb Torrent Files (*.torrent);;All Files (*.*) Torrent-Dateien (*.torrent);;Alle Dateien (*.*) Select Destination Wähle Bestimmungsort aus PathButton (None) (Keiner) Select Folder Verzeichnis auswählen Select File Datei auswählen PrefsDialog Use &authentication Verwende &Authentifizierung &Username: Ben&utzername: Pass&word: Pass&wort: &Open web client Web-Client &öffnen Addresses: Adressen: Speed Limits Geschwindigkeitsbegrenzungen <small>Override normal speed limits manually or at scheduled times</small> <small>Überschreibe normale Geschwindigkeitsbegrenzungen manuell oder zu geplanten Zeiten</small> &Scheduled times: &Geplante Zeiten: &On days: &An Tagen: Every Day Jeden Tag Weekdays Wochentagen Weekends Wochenenden Sunday Sonntag Monday Montag Tuesday Dienstag Wednesday Mittwoch Thursday Donnerstag Friday Freitag Saturday Samstag Port is <b>open</b> Port ist <b>geöffnet</b> Port is <b>closed</b> Port ist <b>geschlossen</b> Incoming Peers Eingehende Peers Status unknown Status unbekannt &Port for incoming connections: &Port für eingehende Verbindungen: Use UPnP or NAT-PMP port &forwarding from my router Verwende UPnP oder NAT-PMP Port-Weiterleitung meines Routers Options Optionen Enable &uTP for peer connections Aktiviere &uTP für Peer-Verbindungen uTP is a tool for reducing network congestion. Mit uTP lässt sich die Netzwerkauslastung reduzieren. minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) Minute Minuten minute(s) ago Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) Minute her Minuten her Automatically add .torrent files &from: Füge .Torrent-Dateien automatisch hinzu von: Show the Torrent Options &dialog Zeige den Torrent-Optionen-&Dialog &Start added torrents &Starte hinzugefügte Torrents Mo&ve the .torrent file to the trash Wi&rf die .Torrentdatei in den Müll Download Queue Download-Warteschlange Ma&ximum active downloads: Downloads mit ma&ximaler Aktivität Incomplete Unvollständig Seeding Verteilen Remote Entfernte Sitzungen <i>Blocklist contains %Ln rule(s)</i> <i>Sperrliste enthält %Ln Regel</i> <i>Sperrliste enthält %Ln Regeln</i> Pick a &random port every time Transmission is started Bei jedem Sta&rt von Transmission einen zufälligen Port wählen Limits Begrenzungen Maximum peers per &torrent: Maximale Peers pro &Torrent: Maximum peers &overall: Maximale Peers &gesamt: <b>Update succeeded!</b><p>Blocklist now has %Ln rule(s). <b>Aktualisierung erfolgreich!</b><p>Die Sperrliste hat nun %Ln Regel. <b>Aktualisierung erfolgreich!</b><p>Die Sperrliste hat nun %Ln Regeln. <b>Update Blocklist</b><p>Getting new blocklist... <b>Aktualisiere Sperrliste</b><p>Hole neue Sperrliste... Blocklist Sperrliste Enable &automatic updates &Automatische Aktualisierungen aktivieren Allow encryption Erlaube Verschlüsselung Prefer encryption Ziehe Verschlüsselung vor Require encryption Verlange Verschlüsselung Privacy Privatssphäre / Datenschutz &to Desktop Arbeitsfläche Show Transmission icon in the &notification area Zeige das Transmission-Symbol im Be&nachrichtigungsfeld Te&st Port Port t&esten Enable &blocklist: &Sperrliste aktivieren: &Update Akt&ualisieren &Encryption mode: &Verschlüsselungsmodus: Remote Control Entfernte Steuerung Allow &remote access Entfe&rnten Zugriff zulassen HTTP &port: HTTP &Port: Only allow these IP a&ddresses: Erlaube nur diese IP-A&dressen: &Upload: &Hochladen: &Download: &Runterladen: Alternative Speed Limits Alternatie Geschwindigkeitsbegrenzungen U&pload: H&ochladen: Do&wnload: Ru&nterladen: Start &minimized in notification area &Minimiert im Benachrichtigungsfeld starten Notification Benachrichtigung Show a notification when torrents are a&dded Zeige eine Benachrichtigung an wenn Torrents h&inzugefügt werden Show a notification when torrents &finish Zeige eine Benachrichtigung wenn Torrents &beendet sind Play a &sound when torrents finish Ton ab&spielen wenn Torrents abgeschlossen sind Testing TCP Port... Überprüfe TCP Port... Peer Limits Peer-Beschränkungen Use PE&X to find more peers PE&X verwenden, um mehr Peers zu finden PEX is a tool for exchanging peer lists with the peers you're connected to. Mit PEX können Peer-Listen mit verbundenen Peers ausgetauscht werden. Use &DHT to find more peers &DHT verwenden, um mehr Peers zu finden DHT is a tool for finding peers without a tracker. Mit DHT können Peers ohne Tracker gefunden werden. Use &Local Peer Discovery to find more peers &Lokale Peersuche verwenden, um mehr Peers zu finden LPD is a tool for finding peers on your local network. Mit LPD können Peers im lokalen Netwerk gefunden werden. Encryption Verschlüsselung Select "Torrent Done" Script Wähle Skript Select Incomplete Directory Verzeichnis für unvollständige Dateien wählen Select Watch Directory Zu überwachendes Verzeichnis wählen Select Destination Ziel auswählen Adding Hinzufügen Download is i&nactive if data sharing stopped: Please keep this phrase as short as possible, it's curently the longest and influences dialog width Herunterladen ist i&naktiv, wenn momentan keine Dateien getauscht werden: Downloading Herunterladen Append ".&part" to incomplete files' names Endung "&part" an unvollständig heruntergeladene Dateien anfügen Keep &incomplete files in: &Unvollständige Torrents verbleiben in: Save to &Location: An diesem &Ort speichern: Call scrip&t when torrent is completed: Skrip&t ausführen, wenn Torrent abgeschlossen ist: Stop seeding at &ratio: Verteilung bei diesem Ve&rhältnis stoppen: Stop seedi&ng if idle for: Verteile&n anhalten, wenn untätig für: Transmission Preferences Transmission-Einstellungen Speed Geschwindigkeit Network Netzwerk Not supported by remote sessions Nicht unterstützt von entfernten Sitzungen QObject Invalid option Ungültige Option RelocateDialog Select Location Ort auswählen Set Torrent Location Ort für Torrent festlegen Set Location Ort festlegen New &location: Neuer &Ort: &Move from the current folder Aus &momentanem Verzeichnis verschieben Local data is &already there &Lokale Daten befinden sich bereits dort Session Error Renaming Path Fehler beim Umbenennen des Pfades <p><b>Unable to rename "%1" as "%2": %3.</b></p> <p>Please correct the errors and try again.</p> <p><b>Konnte "%1" nicht zu "%2" umbenennen: %3.</b></p> <p>Bitte Fehler korrigieren und erneut versuchen.</p> Add Torrent Torrent hinzufügen SessionDialog Change Session Sitzung wechseln Source Quelle Start &Local Session &Lokale Sitzung starten Connect to &Remote Session Zu entfe%rnter Sitzung verbinden &Host: &Host: &Port: &Port: &Authentication required &Authentifizierung erforderlich &Username: Ben&utzername: Pass&word: Pass&wort: StatsDialog Statistics Statistiken Current Session Momentane Sitzung Uploaded: Hochgeladen: Downloaded: Runtergeladen: Ratio: Verhältnis: Duration: Dauer: Total Gesamt Started %Ln time(s) %Ln mal gestartet %Ln mal gestartet Torrent Verifying local data Überprüfe lokale Daten Downloading Lade herunter Seeding Verteile Finished Abgeschlossen Paused Pausiert Queued for verification Eingereiht für Überprüfung Queued for download Eingereiht für Herunterladen Queued for seeding Eingereiht für Verteilen Tracker gave a warning: %1 Tracker gab Warnung zurück: %1 Tracker gave an error: %1 Tracker gab Fehler zurück: %1 Error: %1 Fehler: %1 TorrentDelegate Magnetized transfer - retrieving metadata (%1%) First part of torrent progress string; %1 is the percentage of torrent metadata downloaded %1 of %2 (%3%) First part of torrent progress string; %1 is how much we've got, %2 is how much we'll have when done, %3 is a percentage of the two %1 von %2 (%3%) %1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio, %6 is the ratio we want to reach before we stop uploading %1 von %2 (%3%), hochgeladen %4 (Verhältnis: %5 Ziel: %6) %1 of %2 (%3%), uploaded %4 (Ratio: %5) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio %1 von %2 (%3%), hochgeladen %4 (Verhältnis: %5) %1, uploaded %2 (Ratio: %3 Goal: %4) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio, %4 is the ratio we want to reach before we stop uploading %1, hochgeladen %2 (Verhältnis: %3 Ziel: %4) %1, uploaded %2 (Ratio: %3) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio %1, hochgeladen %2 (Verhältnis: %3) - %1 left Second (optional) part of torrent progress string; %1 is duration; notice that leading space (before the dash) is included here - %1 verbleibend - Remaining time unknown Second (optional) part of torrent progress string; notice that leading space (before the dash) is included here - Verbleibende Zeit unbekannt Ratio: %1 Verhältnis: %1 Downloading from %Ln peer(s) First part of phrase "Downloading from ... peer(s) and ... web seed(s)" Lade von %Ln Peer herunter Lade von %Ln Peers herunter Seeding to %Ln peer(s) Verteile an %Ln Peer Verteile an %Ln Peers - - Downloading metadata from %Ln peer(s) (%1% done) Lade Metadaten von %Ln Peer herunter (%1% fertig) Lade Metadaten von %Ln Peers herunter (%1% fertig) Downloading from %1 of %Ln connected peer(s) First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" Lade von %1 von &Ln verbundenem Peer herunter Lade von %1 von &Ln verbundenen Peers herunter and %Ln web seed(s) Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; notice that leading space (before "and") is included here und %Ln Web-Quelle und %Ln Web-Quellen Seeding to %1 of %Ln connected peer(s) Verteile an %1 von %Ln verbundenem Peer Verteile an %1 von %Ln verbundenen Peers Error Fehler Verifying local data (%1% tested) Überprüfe lokale Daten (%1% überprüft) TrackerDelegate Got a list of%1 %Ln peer(s)%2 %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Eine Liste erhalten mit%1 %Ln Peer%2 vor %3 Eine Liste erhalten mit%1 %Ln Peers%2 vor %3 Peer list request %1timed out%2 %3 ago; will retry %1 and %2 are replaced with HTML markup, %3 is duration Anfrage nach Peerliste ist %1ausgelaufen%2 vor %3; werde erneut versuchen Got an error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Ein Fehler ist aufgetreten %1"%2"%3 vor %4 No updates scheduled Keine Aktualisierungen geplant Asking for more peers in %1 %1 is duration Frage nach mehr Peers in %1 Queued to ask for more peers Anfrage für mehr Peers eingereiht Asking for more peers now... <small>%1</small> %1 is duration Frage jetzt nach mehr Peers... <small>%1</small> Tracker had%1 %Ln seeder(s)%2 First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup Tracker hatte%1 %Ln Seeder%2 Tracker hatte%1 %Ln Seeder%2 and%1 %Ln leecher(s)%2 %3 ago Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup, %3 is duration; notice that leading space (before "and") is included here und%1 %Ln Leecher%2 vor %3 und%1 %Ln Leecher%2 vor %3 Tracker had %1no information%2 on peer counts %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Tracker hatte %1keine Informationen%2 über die Anzahl an Peers vor %3 Got a scrape error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Asking for peer counts in %1 %1 is duration Frage nach Anzahl der Peers in %1 Queued to ask for peer counts Anfragen nach der Anzahl der Peers eingereiht Asking for peer counts now... <small>%1</small> %1 is duration Fordere jetzt Anzahl an Peers an... <small>%1</small> transmission-2.92/qt/translations/PaxHeaders.4960/transmission_zh_CN.ts0000644000000000000000000000013212664476417023226 xustar0030 mtime=1456635151.996496524 30 atime=1456635151.995496507 30 ctime=1457295917.271761511 transmission-2.92/qt/translations/transmission_zh_CN.ts0000644000175000017500000025517712664476417024674 0ustar00mikedldmikedld00000000000000 UTF-8 AboutDialog About Transmission 关于 Transmission <b style='font-size:x-large'>Transmission %1</b> <b style='font-size:x-large'>Transmission %1</b> A fast and easy BitTorrent client 一个快速和简å•çš„ BitTorrent 客户端 Copyright (c) The Transmission Project Copyright (c) The Transmission Project C&redits 感谢(&R) &License 许å¯åè®®(&L) Credits 感谢 Application <b>Transmission is a file sharing program.</b> <b>Transmission 是一个文件共享程åºã€‚</b> When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. 当您è¿è¡Œä¸€ä¸ª Torrent,其数æ®å°†ä»¥ä¸Šä¼ çš„æ–¹å¼æä¾›ç»™ä»–人。您è¦å¯¹æ‚¨æ‰€å…±äº«çš„内容负唯一的责任。 I &Agree æˆ‘åŒæ„(&A) Torrent Completed Torrent å·²å®Œæˆ Torrent Added Torrent 已添加 DetailsDialog None æ—  Mixed æ··åˆ Unknown 未知 Finished å·²å®Œæˆ Paused å·²æš‚åœ Active now 当剿´»åЍ %1 ago %1 ä¹‹å‰ %1 (%Ln pieces @ %2) %1 (%Ln ä¸ªåŒºå— @ %2) %1 (%Ln pieces) %1 (%Ln 个区å—) Private to this tracker -- DHT and PEX disabled å½“å‰ Tracker è®¾ç½®ä¸ºç§æœ‰ -- DHT å’Œ PEX 被ç¦ç”¨ Public torrent 公开的 Torrent Created by %1 ç”± %1 制作 Created on %1 制作于 %1 Created by %1 on %2 ç”± %1 制作于 %2 Encrypted connection 加密连接 Optimistic unchoke ä¹è§‚è§£é” Downloading from this peer 正在从该用户下载 We would download from this peer if they would let us 如果他们å…许,我们将从该用户下载 Uploading to peer 正在上传给该用户 We would upload to this peer if they asked 如果他们请求,我们将上传给该用户 Peer has unchoked us, but we're not interested 该用户已对我们解é”ï¼Œä½†æˆ‘ä»¬ä¸æ„Ÿå…´è¶£ We unchoked this peer, but they're not interested 我们已对该用户解é”ï¼Œä½†ä»–ä»¬ä¸æ„Ÿå…´è¶£ Peer was discovered through DHT 通过 DHT å‘现的用户 Peer was discovered through Peer Exchange (PEX) 通过用户交æ¢(PEX)å‘现的用户 Peer is an incoming connection 用户是一个入站的连接 minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) 分钟 Error 错误 Tracker already exists. Tracker å·²ç»å­˜åœ¨ã€‚ %1 (100%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data %1 (100%) %1 of %2 (%3%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data, %2 is overall size of torrent data, %3 is percentage (%1/%2*100) %1 / %2 (%3%) %1 of %2 (%3%), %4 Unverified Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded data (both verified and unverified), %2 is overall size of torrent data, %3 is percentage (%1/%2*100), %4 is amount of downloaded but not yet verified data %1 / %2 (%3%), %4 未检查 %1 (%2 corrupt) %1 (%2 æŸå) %1 (Ratio: %2) %1 (分享率: %2) N/A N/A Peer is connected over uTP 通过 uTP 连接的用户 Add URL 添加链接 Add tracker announce URL: 添加 Tracker 通告链接: Invalid URL "%1" 无效链接 "%1" Edit URL 编辑链接 Edit tracker announce URL: 编辑 Tracker 通告链接: High 高 Normal 普通 Low 低 Use Global Settings 使用全局设置 Seed regardless of ratio ä¸ç®¡åˆ†äº«çŽ‡å¤šå°‘éƒ½åšç§ Stop seeding at ratio: åœæ­¢åšç§å½“分享率达到: Seed regardless of activity ä¸ç®¡æ´»åŠ¨çŠ¶æ€å¦‚何都åšç§ Stop seeding if idle for: åœæ­¢åšç§å½“空闲达到: Up 上传 Down 下载 % % Status çŠ¶æ€ Address åœ°å€ Client 客户端 Torrent Properties Torrent 属性 Information ä¿¡æ¯ Activity 活动 Have: 已有: Availability: å¥åº·åº¦: Uploaded: 已上传: Downloaded: 已下载: State: 状æ€: Running time: è¿è¡Œæ—¶é—´: Remaining time: 剩余时间: Last activity: 上次活动: Error: 错误: Details è¯¦ç»†ä¿¡æ¯ Size: 大å°: Location: ä½ç½®: Hash: 散列: Privacy: éšç§: Origin: æ¥æº: Comment: 说明: Peers 用户 Tracker Tracker Add Tracker 添加 Tracker Edit Tracker 编辑 Tracker Remove Trackers 移除 Tracker Show &more details 显示更多详细信æ¯(&M) Show &backup trackers 显示备用 Tracker(&B) Files 文件 Options 选项 Speed 速度 Honor global &limits éµå¾ªå…¨å±€é™åˆ¶(&L) Limit &download speed: é™åˆ¶ä¸‹è½½é€Ÿåº¦(&D): Limit &upload speed: é™åˆ¶ä¸Šä¼ é€Ÿåº¦(&U): Torrent &priority: Torrent 优先级(&P): Seeding Limits åšç§é™åˆ¶ &Ratio: 分享率(&R): &Idle: 空闲(&I): Peer Connections 用户连接 &Maximum peers: 最大用户数(&M): FileAdded Add Torrent 添加 Torrent <p><b>Unable to add "%1".</b></p><p>It is a duplicate of "%2" which is already added.</p> <p><b>无法添加 "%1"。</b></p><p>å®ƒä¸Žå·²ç»æ·»åŠ çš„ "%2" é‡å¤ã€‚</p> Error Adding Torrent 添加 Torrent 错误 FileTreeItem Low 低 High 高 Normal 普通 Mixed æ··åˆ FileTreeModel File 文件 Size å¤§å° Progress 进度 Download 下载 Priority 优先级 FileTreeView Check Selected 勾选选择 Uncheck Selected å–æ¶ˆå‹¾é€‰é€‰æ‹© Only Check Selected 仅勾选选择 Priority 优先级 Open 打开 Rename... é‡å‘½å... FilterBar All 全部 Active 活动 Downloading 正在下载 Seeding 正在åšç§ Paused å·²æš‚åœ Finished å·²å®Œæˆ Verifying 正在检查 Error 错误 Show: 显示: FilterBarLineEdit Search... æœç´¢... Formatter B/s B/s kB/s kB/s MB/s MB/s GB/s GB/s TB/s TB/s B B kB kB MB MB GB GB TB TB KiB KiB MiB MiB GiB GiB TiB TiB Unknown 未知 None æ—  %1 %2 %1 %2 %Ln day(s) %Ln 天 %Ln hour(s) %Ln å°æ—¶ %Ln minute(s) %Ln 分钟 %Ln second(s) %Ln ç§’ %1, %2 %1, %2 FreeSpaceLabel <i>Calculating Free Space...</i> <i>正在计算å¯ç”¨ç©ºé—´...</i> %1 free %1 å¯ç”¨ LicenseDialog License 许å¯åè®® MainWindow Transmission Transmission &Torrent Torrent(&T) &Edit 编辑(&E) &Help 帮助(&H) &View 查看(&V) &File 文件(&F) &New... 新建(&N)... Create a new torrent 制作一个新的 Torrent &Properties 属性(&P) Show torrent properties 显示 Torrent 属性 Open the torrent's folder 打开 Torrent 的文件夹 Queue 队列 &Open... 打开(&O)... Open 打开 Open a torrent 打开一个 Torrent Open Fold&er 打开文件夹(&E) &Start 开始(&S) Start torrent 开始 Torrent Ask Tracker for &More Peers å‘ Tracker 请求更多用户(&M) Ask tracker for more peers å‘ Tracker 请求更多用户 &Pause æš‚åœ(&P) Pause torrent æš‚åœ Torrent &Verify Local Data 检查本地数æ®(&V) Verify local data æ£€æŸ¥æœ¬åœ°æ•°æ® &Remove 移除(&R) Remove torrent 移除 Torrent &Delete Files and Remove 删除文件并移除(&D) Remove torrent and delete its files 移除 Torrent 并删除它的文件 &Start All 全部开始(&S) &Pause All 全部暂åœ(&P) &Quit 退出(&Q) &Select All 全选(&S) &Deselect All å–æ¶ˆå…¨é€‰(&D) &Preferences 首选项(&P) &Compact View 紧凑型视图(&C) Compact View 紧凑型视图 &Toolbar 工具æ (&T) &Filterbar 过滤æ (&F) &Statusbar çŠ¶æ€æ (&S) Sort by &Activity 按活动排åº(&A) Sort by A&ge 按存在时间排åº(&G) Sort by Time &Left 按剩余时间排åº(&L) Sort by &Name 按å称排åº(&N) Sort by &Progress 按进度排åº(&P) Sort by Rati&o 按分享率排åº(&O) Sort by Si&ze æŒ‰å¤§å°æŽ’åº(&Z) Sort by Stat&e æŒ‰çŠ¶æ€æŽ’åº(&E) Sort by T&racker 按 Tracker 排åº(&R) Message &Log 消æ¯è®°å½•(&L) &Statistics 统计(&S) &Contents 内容(&C) &About 关于(&A) Re&verse Sort Order 倒åº(&V) &Name åç§°(&N) &Files 文件(&F) &Tracker Tracker(&T) Total Ratio 总分享率 Session Ratio 会è¯åˆ†äº«çއ Total Transfer æ€»ä¼ è¾“é‡ Session Transfer 会è¯ä¼ è¾“é‡ &Main Window 主窗å£(&M) Tray &Icon 托盘图标(&I) &Change Session... 更改会è¯(&C)... Choose Session Start a local session or connect to a running session é€‰æ‹©ä¼šè¯ Set &Location... 设置ä½ç½®(&L)... &Copy Magnet Link to Clipboard å¤åˆ¶ç£åŠ›é“¾æŽ¥åˆ°å‰ªè´´æ¿(&C) Open &URL... 打开链接(&U)... &Donate æèµ (&D) Start &Now 立刻开始(&N) Bypass the queue and start now 绕开队列并立刻开始 Move to &Top 移到顶部(&T) Move &Up 上移(&U) Move &Down 下移(&D) Move to &Bottom 移到底部(&B) Sort by &Queue 按队列排åº(&Q) Limit Download Speed é™åˆ¶ä¸‹è½½é€Ÿåº¦ Unlimited ä¸é™åˆ¶ Limited at %1 é™åˆ¶åœ¨ %1 Limit Upload Speed é™åˆ¶ä¸Šä¼ é€Ÿåº¦ Stop Seeding at Ratio åœæ­¢åšç§å½“分享率达到 Seed Forever 一直åšç§ Stop at Ratio (%1) åœæ­¢å½“分享率达到 (%1) - %1:%2 Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); notice that leading space (before the dash) is included here - %1:%2 Idle 空闲 Ratio: %1 分享率: %1 Down: %1, Up: %2 下载: %1, 上传: %2 Torrent Files (*.torrent);;All Files (*.*) Torrent 文件 (*.torrent);;全部文件 (*.*) Show &options dialog æ˜¾ç¤ºé€‰é¡¹å¯¹è¯æ¡†(&O) Open Torrent 打开 Torrent Speed Limits 速度é™åˆ¶ Network Error 网络错误 Click to disable Temporary Speed Limits (%1 down, %2 up) 点击ç¦ç”¨ä¸´æ—¶é€Ÿåº¦é™åˆ¶ (%1 下载, %2 上传) Click to enable Temporary Speed Limits (%1 down, %2 up) 点击å¯ç”¨ä¸´æ—¶é€Ÿåº¦é™åˆ¶ (%1 下载, %2 上传) Remove torrent? 移除 Torrent? Delete this torrent's downloaded files? 删除此 Torrent 已下载的文件? Remove %Ln torrent(s)? 移除 %Ln 个 Torrent? Showing %L1 of %Ln torrent(s) 显示 %L1 / %Ln 个 Torrent Delete these %Ln torrent(s)' downloaded files? 删除这些 %Ln 个 Torrent 已下载的文件? Once removed, continuing the transfer will require the torrent file or magnet link. ä¸€æ—¦ç§»é™¤ï¼Œç»§ç»­è¯¥ä¼ è¾“å°†ä¼šè¦æ±‚ Torrent 文件或者ç£åŠ›é“¾æŽ¥ã€‚ Once removed, continuing the transfers will require the torrent files or magnet links. ä¸€æ—¦ç§»é™¤ï¼Œç»§ç»­è¿™äº›ä¼ è¾“å°†ä¼šè¦æ±‚ Torrent 文件或者ç£åŠ›é“¾æŽ¥ã€‚ This torrent has not finished downloading. 该 Torrent 还没有完æˆä¸‹è½½ã€‚ These torrents have not finished downloading. 这些 Torrent 还没有完æˆä¸‹è½½ã€‚ This torrent is connected to peers. 该 Torrent 已连接到用户。 These torrents are connected to peers. 这些 Torrent 已连接到用户。 One of these torrents is connected to peers. 其中有个 Torrent 已连接到用户。 Some of these torrents are connected to peers. 其中有些 Torrent 已连接到用户。 One of these torrents has not finished downloading. 其中有个 Torrent 还没有完æˆä¸‹è½½ã€‚ Some of these torrents have not finished downloading. 其中有些 Torrent 还没有完æˆä¸‹è½½ã€‚ %1 has not responded yet %1 还没有å“应 %1 is responding %1 正在å“应 %1 last responded %2 ago %1 上次å“应在 %2 ä¹‹å‰ %1 is not responding %1 没有å“应 MakeDialog New Torrent æ–°çš„ Torrent <i>No source selected<i> <i>æ²¡æœ‰é€‰æ‹©æ¥æº<i> %Ln File(s) %Ln 个文件 %Ln Piece(s) %Ln ä¸ªåŒºå— %1 in %2; %3 @ %4 %1 / %2; %3 @ %4 Files 文件 Sa&ve to: ä¿å­˜åˆ°(&V): Source f&older: æ¥æºæ–‡ä»¶å¤¹(&O): Source &file: æ¥æºæ–‡ä»¶(&F): Properties 属性 &Trackers: Tracker(&T): To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. è¦æ·»åŠ ä¸€ä¸ªå¤‡ç”¨é“¾æŽ¥ï¼Œè¯·å°†å…¶æ·»åŠ åˆ°ä¸»é“¾æŽ¥çš„ä¸‹ä¸€è¡Œã€‚ è¦æ·»åŠ å¦ä¸€ä¸ªä¸»é“¾æŽ¥ï¼Œè¯·å°†å…¶æ·»åŠ åˆ°ä¸€ä¸ªç©ºè¡Œçš„ä¸‹ä¸€è¡Œã€‚ Co&mment: 说明(&M): &Private torrent ç§æœ‰ Torrent(&P) MakeProgressDialog New Torrent æ–°çš„ Torrent Creating "%1" 正在制作 "%1" Created "%1"! 已制作 "%1"! Error: invalid announce URL "%1" 错误: 无效的通告链接 "%1" Cancelled 已喿¶ˆ Error reading "%1": %2 è¯»å– "%1" 时出错: %2 Error writing "%1": %2 写入 "%1" 时出错: %2 OptionsDialog Open Torrent 打开 Torrent Open Torrent from File 从文件打开 Torrent Open Torrent from URL or Magnet Link 从链接或ç£åŠ›é“¾æŽ¥æ‰“å¼€ Torrent &Source: æ¥æº(&S): &Destination folder: 目标文件夹(&D): High 高 Normal 普通 Low 低 &Priority: 优先级(&P): S&tart when added 添加åŽå¼€å§‹(&T) &Verify Local Data 检查本地数æ®(&V) Mo&ve .torrent file to the trash å°† .torrent 文件移至回收站(&V) Torrent Files (*.torrent);;All Files (*.*) Torrent 文件 (*.torrent);;全部文件 (*.*) Select Destination 选择目标 PathButton (None) (æ— ) Select Folder 选择文件夹 Select File 选择文件 PrefsDialog Use &authentication 使用身份验è¯(&A) &Username: 用户å(&U): Pass&word: 密ç (&W): &Open web client 打开 WEB 客户端(&O) Addresses: 地å€: Speed Limits 速度é™åˆ¶ <small>Override normal speed limits manually or at scheduled times</small> <small>手动或者定时覆盖普通速度é™åˆ¶</small> &Scheduled times: 定时(&S): &On days: 天数(&O): Every Day æ¯å¤© Weekdays 工作日 Weekends 周末 Sunday 星期天 Monday 星期一 Tuesday 星期二 Wednesday 星期三 Thursday 星期四 Friday 星期五 Saturday 星期六 Port is <b>open</b> ç«¯å£æ˜¯ <b>打开的</b> Port is <b>closed</b> ç«¯å£æ˜¯ <b>关闭的</b> Incoming Peers 入站的用户 Status unknown çŠ¶æ€æœªçŸ¥ &Port for incoming connections: 入站连接的端å£(&P): Use UPnP or NAT-PMP port &forwarding from my router 使用路由器的 UPnP 或 NAT-PMP 端å£è½¬å‘(&F) Options 选项 Enable &uTP for peer connections 为用户连接å¯ç”¨ uTP(&U) uTP is a tool for reducing network congestion. uTP 是一个å‡å°ç½‘络拥挤的工具。 minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) 分钟 minute(s) ago Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) åˆ†é’Ÿä¹‹å‰ Automatically add .torrent files &from: 自动添加 .torrent 文件从(&F): Show the Torrent Options &dialog 显示 Torrent çš„é€‰é¡¹å¯¹è¯æ¡†(&D) &Start added torrents 添加 Torrent åŽå¼€å§‹(&S) Mo&ve the .torrent file to the trash å°† .torrent 文件移至回收站(&V) Download Queue 下载队列 Ma&ximum active downloads: 最大活动下载数(&X): Incomplete æœªå®Œæˆ Seeding åšç§ Remote 远程 <i>Blocklist contains %Ln rule(s)</i> <i>黑åå•åŒ…å« %Ln æ¡è§„则</i> Pick a &random port every time Transmission is started Transmission æ¯æ¬¡å¯åŠ¨æ—¶éšæœºé€‰æ‹©ç«¯å£(&R) Limits é™åˆ¶ Maximum peers per &torrent: æ¯ä¸ª Torrent 的最大用户数(&T): Maximum peers &overall: 全体最大用户数(&O): <b>Update succeeded!</b><p>Blocklist now has %Ln rule(s). <b>æ›´æ–°æˆåŠŸï¼</b><p>黑åå•现在有 %Ln æ¡è§„则。 <b>Update Blocklist</b><p>Getting new blocklist... <b>更新黑åå•</b><p>æ­£åœ¨èŽ·å–æ–°çš„黑åå•... Blocklist 黑åå• Enable &automatic updates å¯ç”¨è‡ªåŠ¨æ›´æ–°(&A) Allow encryption å…许加密 Prefer encryption 优先加密 Require encryption è¦æ±‚加密 Privacy éšç§ &to 到(&T) Desktop æ¡Œé¢ Show Transmission icon in the &notification area 在通知区域显示 Transmission 图标(&N) Te&st Port 测试端å£(&S) Enable &blocklist: å¯ç”¨é»‘åå•(&B): &Update æ›´æ–°(&U) &Encryption mode: 加密模å¼(&E): Remote Control 远程控制 Allow &remote access å…许远程访问(&R) HTTP &port: HTTP 端å£(&P): Only allow these IP a&ddresses: åªå…许这些 IP 地å€(&D): &Upload: 上传(&U): &Download: 下载(&D): Alternative Speed Limits 备用速度é™åˆ¶ U&pload: 上传(&P): Do&wnload: 下载(&W): Start &minimized in notification area å¯åŠ¨æ—¶æœ€å°åŒ–到通知区域(&M) Notification 通知 Show a notification when torrents are a&dded 当添加 Torrent 时显示一个通知(&D) Show a notification when torrents &finish 当 Torrent å®Œæˆæ—¶æ˜¾ç¤ºä¸€ä¸ªé€šçŸ¥(&F) Play a &sound when torrents finish 当 Torrent å®Œæˆæ—¶æ’­æ”¾æç¤ºéŸ³(&S) Testing TCP Port... 正在测试 TCP 端å£... Peer Limits 用户é™åˆ¶ Use PE&X to find more peers 使用 PEX 以寻找更多用户(&X) PEX is a tool for exchanging peer lists with the peers you're connected to. PEX 是一个用æ¥ä¸Žæ‚¨æ‰€è¿žæŽ¥çš„用户交æ¢ç”¨æˆ·åˆ—表的工具。 Use &DHT to find more peers 使用 DHT 以寻找更多用户(&D) DHT is a tool for finding peers without a tracker. DHT 是一个没有 Tracker 也能寻找用户的工具。 Use &Local Peer Discovery to find more peers 使用本地用户å‘现以寻找更多用户(&L) LPD is a tool for finding peers on your local network. LPD 是一个用æ¥å‘现您本地网络用户的工具。 Encryption 加密 Select "Torrent Done" Script 选择 "Torrent 完æˆ" 脚本 Select Incomplete Directory 选择未完æˆç›®å½• Select Watch Directory 选择监视目录 Select Destination 选择目标 Adding 正在添加 Download is i&nactive if data sharing stopped: Please keep this phrase as short as possible, it's curently the longest and influences dialog width ä¸‹è½½æ˜¯ä¸æ´»åŠ¨çš„å¦‚æžœåœæ­¢åˆ†äº«æ•°æ®åœ¨(&N): Downloading 下载 Append ".&part" to incomplete files' names ä¸ºæœªå®Œæˆæ–‡ä»¶é™„加 ".part" 扩展å(&P) Keep &incomplete files in: ä¿å­˜æœªå®Œæˆæ–‡ä»¶åˆ°(&I): Save to &Location: ä¿å­˜åˆ°ä½ç½®(&L): Call scrip&t when torrent is completed: 当 Torrent å®Œæˆæ—¶è°ƒç”¨è„šæœ¬(&T): Stop seeding at &ratio: åœæ­¢åšç§å½“分享率达到(&R): Stop seedi&ng if idle for: åœæ­¢åšç§å½“空闲达到(&N): Transmission Preferences Transmission 首选项 Speed 速度 Network 网络 Not supported by remote sessions 远程会è¯ä¸æ”¯æŒ QObject Invalid option 无效选项 RelocateDialog Select Location 选择ä½ç½® Set Torrent Location 设置 Torrent ä½ç½® Set Location 设置ä½ç½® New &location: æ–°çš„ä½ç½®(&L): &Move from the current folder ä»Žå½“å‰æ–‡ä»¶å¤¹ç§»åЍ(&M) Local data is &already there 本地数æ®å·²ç»åœ¨é‚£é‡Œ(&A) Session Error Renaming Path é‡å‘½å路径错误 <p><b>Unable to rename "%1" as "%2": %3.</b></p> <p>Please correct the errors and try again.</p> <p><b>无法é‡å‘½å "%1" 为 "%2": %3.</b></p> <p>请纠正错误åŽé‡è¯•。</p> Add Torrent 添加 Torrent SessionDialog Change Session æ›´æ”¹ä¼šè¯ Source æ¥æº Start &Local Session 开始本地会è¯(&L) Connect to &Remote Session 连接远程会è¯(&R) &Host: 主机(&H): &Port: 端å£(&P): &Authentication required è¦æ±‚身份认è¯(&A) &Username: 用户å(&U): Pass&word: 密ç (&W): StatsDialog Statistics 统计 Current Session 当å‰ä¼šè¯ Uploaded: 已上传: Downloaded: 已下载: Ratio: 分享率: Duration: æ—¶é•¿: Total 总计 Started %Ln time(s) å·²å¯åЍ %Ln 次 Torrent Verifying local data æ­£åœ¨æ£€æŸ¥æœ¬åœ°æ•°æ® Downloading 正在下载 Seeding 正在åšç§ Finished å·²å®Œæˆ Paused å·²æš‚åœ Queued for verification 排队检查 Queued for download 排队下载 Queued for seeding 排队åšç§ Tracker gave a warning: %1 Tracker 给出一个警告: %1 Tracker gave an error: %1 Tracker 给出一个错误: %1 Error: %1 错误: %1 TorrentDelegate Magnetized transfer - retrieving metadata (%1%) First part of torrent progress string; %1 is the percentage of torrent metadata downloaded ç£åŠ›ä¼ è¾“ - æ­£åœ¨æ£€ç´¢å…ƒæ•°æ® (%1%) %1 of %2 (%3%) First part of torrent progress string; %1 is how much we've got, %2 is how much we'll have when done, %3 is a percentage of the two %1 / %2 (%3%) %1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio, %6 is the ratio we want to reach before we stop uploading %1 / %2 (%3%), 已上传 %4 (分享率: %5 目标: %6) %1 of %2 (%3%), uploaded %4 (Ratio: %5) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio %1 / %2 (%3%), 已上传 %4 (分享率: %5) %1, uploaded %2 (Ratio: %3 Goal: %4) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio, %4 is the ratio we want to reach before we stop uploading %1, 已上传 %2 (分享率: %3 目标: %4) %1, uploaded %2 (Ratio: %3) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio %1, 已上传 %2 (分享率: %3) - %1 left Second (optional) part of torrent progress string; %1 is duration; notice that leading space (before the dash) is included here - %1 剩余 - Remaining time unknown Second (optional) part of torrent progress string; notice that leading space (before the dash) is included here - 剩余时间未知 Ratio: %1 分享率: %1 Downloading from %Ln peer(s) First part of phrase "Downloading from ... peer(s) and ... web seed(s)" 正在下载自 %Ln 个用户 Seeding to %Ln peer(s) 正在åšç§ç»™ %Ln 个用户 - - Downloading metadata from %Ln peer(s) (%1% done) 正在从 %Ln ä¸ªç”¨æˆ·ä¸‹è½½å…ƒæ•°æ® (%1% 已完æˆ) Downloading from %1 of %Ln connected peer(s) First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" 正在下载自 %1 / %Ln 个已连接用户 and %Ln web seed(s) Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; notice that leading space (before "and") is included here å’Œ %Ln 个 WEB ç§æº Seeding to %1 of %Ln connected peer(s) 正在åšç§ç»™ %1 / %Ln 个已连接用户 Error 错误 Verifying local data (%1% tested) æ­£åœ¨æ£€æŸ¥æœ¬åœ°æ•°æ® (%1% 已测试) TrackerDelegate Got a list of%1 %Ln peer(s)%2 %3 ago %1 and %2 are replaced with HTML markup, %3 is duration 在 %3å‰å¾—到一份%1 %Ln个用户%2 的列表 Peer list request %1timed out%2 %3 ago; will retry %1 and %2 are replaced with HTML markup, %3 is duration 在 %3å‰ç”¨æˆ·åˆ—表请求%1è¶…æ—¶%2;将é‡è¯• Got an error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration 在 %4å‰å¾—到一个错误 %1"%2"%3 No updates scheduled 无更新计划任务 Asking for more peers in %1 %1 is duration 将在 %1åŽè¯·æ±‚更多用户 Queued to ask for more peers 排队请求更多用户 Asking for more peers now... <small>%1</small> %1 is duration 正在请求更多用户... <small>%1</small> Tracker had%1 %Ln seeder(s)%2 First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup Tracker 有%1 %Ln个åšç§ç”¨æˆ·%2 and%1 %Ln leecher(s)%2 %3 ago Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup, %3 is duration; notice that leading space (before "and") is included here å’Œ%1 %Ln个下载用户%2 在 %3å‰ Tracker had %1no information%2 on peer counts %3 ago %1 and %2 are replaced with HTML markup, %3 is duration 在 %3å‰ Tracker 对用户数é‡%1没有信æ¯%2 Got a scrape error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration 在 %4å‰å¾—åˆ°ä¸€ä¸ªçŠ¶æ€æŸ¥è¯¢é”™è¯¯ %1"%2"%3 Asking for peer counts in %1 %1 is duration 将在 %1åŽè¯·æ±‚ç”¨æˆ·æ•°é‡ Queued to ask for peer counts æŽ’é˜Ÿè¯·æ±‚ç”¨æˆ·æ•°é‡ Asking for peer counts now... <small>%1</small> %1 is duration 正在请求用户数é‡... <small>%1</small> transmission-2.92/qt/translations/PaxHeaders.4960/transmission_es.ts0000644000000000000000000000013212664476417022634 xustar0030 mtime=1456635151.986496352 30 atime=1456635151.986496352 30 ctime=1457295917.271761511 transmission-2.92/qt/translations/transmission_es.ts0000644000175000017500000026347512664476417024302 0ustar00mikedldmikedld00000000000000 UTF-8 AboutDialog About Transmission Acerca de Transmission <b style='font-size:x-large'>Transmission %1</b> <b style='font-size:x-large'>Transmission %1</b> A fast and easy BitTorrent client Un cliente de BitTorrent rápido y fácil Copyright (c) The Transmission Project Derechos de Autor (c) The Transmission Project C&redits C&réditos &License &Licencia Credits Créditos Application <b>Transmission is a file sharing program.</b> <b>Transmission es un programa para compartir archivos.</b> When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. Cuando usas un torrent, sus datos estarán disponibles para otros por medio de la subida. Cualquier contenido que compartas es de tu responsabilidad. I &Agree Yo &acepto Torrent Completed Torrent completado Torrent Added Torrent añadido DetailsDialog None Ninguno Mixed Mezclado Unknown Desconocido Finished Terminado Paused Detenido Active now Activo %1 ago hace %1 %1 (%Ln pieces @ %2) %1 (%n pieza @ %2) %1 (%Ln piezas @ %2) %1 (%Ln pieces) %1 (%n pieza) %1 (%Ln piezas) Private to this tracker -- DHT and PEX disabled Privado a este tracker -- DHT y PEX deshabilitado Public torrent Torrent público Created by %1 Creado por %1 Created on %1 Creado el %1 Created by %1 on %2 Creado por %1 el %2 Encrypted connection Conexión cifrada Optimistic unchoke Desahogo optimista Downloading from this peer Descargando de este compañero We would download from this peer if they would let us Descargaríamos de este compañero si nos dejara Uploading to peer Subiendo para este compañero We would upload to this peer if they asked Subiríamos para este compañero si nos lo pidiera Peer has unchoked us, but we're not interested El compañero nos desahogo, pero no estamos interesados We unchoked this peer, but they're not interested Nosotros desahogamos este compañero, pero él no está interesado Peer was discovered through DHT Compañero encontrado a través de DHT Peer was discovered through Peer Exchange (PEX) Compañero encontrado por Intercambio de Compañeros (PEX) Peer is an incoming connection El compañero es una conexión de entrada minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minuto minutos Error Error Tracker already exists. El tracker ya existe. %1 (100%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data %1 (100%) %1 of %2 (%3%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data, %2 is overall size of torrent data, %3 is percentage (%1/%2*100) %1 de %2 (%3%) %1 of %2 (%3%), %4 Unverified Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded data (both verified and unverified), %2 is overall size of torrent data, %3 is percentage (%1/%2*100), %4 is amount of downloaded but not yet verified data %1 de %2 (%3%), %4 Sin verificar %1 (%2 corrupt) %1 (%2 corrupto) %1 (Ratio: %2) %1 (Proporción: %2) N/A N/D Peer is connected over uTP Compañero conectado usando uTP Add URL Añadir URL Add tracker announce URL: Añadir URL de anuncio del tracker: Invalid URL "%1" URL inválida "%1" Edit URL Editar URL Edit tracker announce URL: Editar URL de anuncio del tracker: High Alta Normal Normal Low Baja Use Global Settings Usar Configuración Global Seed regardless of ratio Compartir sin límite Stop seeding at ratio: Detener al llegar a: Seed regardless of activity Compartir sin importar la actividad Stop seeding if idle for: Dejar de compartir si está inactivo: Up Subiendo Down Bajando % % Status Estado Address Dirección Client Cliente Torrent Properties Propiedades del torrent Information Información Activity Actividad Have: Tenemos: Availability: Disponible: Uploaded: Subido: Downloaded: Descargados: State: Estado: Running time: Tiempo transcurrido: Remaining time: Tiempo restante: Last activity: Ultima actividad: Error: Mensaje de error: Details Detalles Size: Tamaño: Location: Localización: Hash: Hash: Privacy: Privacidad: Origin: Origen: Comment: Comentario: Peers Compañeros Tracker Tracker Add Tracker Añadir tracker Edit Tracker Editar tracker Remove Trackers Borrar trackers Show &more details Muestra &más detalles Show &backup trackers Muestra trackers de &respaldo Files Archivos Options Opciones Speed Velocidad Honor global &limits Respetar &límites globales Limit &download speed: Limitar &descarga: Limit &upload speed: Limitar &subida: Torrent &priority: &Prioridad del torrent: Seeding Limits Límite para compartir &Ratio: &Proporción: &Idle: &Inactivo: Peer Connections Conexiones de compañeros &Maximum peers: &Máximo nº de compañeros: FileAdded Add Torrent Añadir torrent <p><b>Unable to add "%1".</b></p><p>It is a duplicate of "%2" which is already added.</p> <p><b>No se puede añadir "%1".</b></p><p>es un duplicado de "%2" que ya está en la lista.</p> Error Adding Torrent Error al añadir torrent FileTreeItem Low Baja High Alta Normal Normal Mixed Mezclada FileTreeModel File Archivo Size Tamaño Progress Progreso Download Descargar Priority Prioridad FileTreeView Check Selected Marcar elegido Uncheck Selected Desmarcar elegido Only Check Selected Sólo marcar lo elegido Priority Prioridad Open Abrir Rename... Renombrar... FilterBar All Todos Active Activos Downloading Descargando Seeding Compartiendo Paused Detenidos Finished Terminados Verifying Verificando Error Error Show: Mostrar: FilterBarLineEdit Search... Buscar... Formatter B/s B/s kB/s kB/s MB/s MB/s GB/s GB/s TB/s TB/s B B kB kB MB MB GB GB TB TB KiB KiB MiB MiB GiB GiB TiB TiB Unknown Desconocido None Nada %1 %2 %1 %2 %Ln day(s) %n día %Ln días %Ln hour(s) %n hora %Ln horas %Ln minute(s) %n minuto %Ln minutos %Ln second(s) %n segundo %Ln segundos %1, %2 %1, %2 FreeSpaceLabel <i>Calculating Free Space...</i> <i>Calculando espacio libre...</i> %1 free %1 Libre LicenseDialog License Licencia MainWindow Transmission Transmission &Torrent &Torrent &Edit &Editar &Help &Ayuda &View &Ver &File &Archivo &New... &Nuevo... Create a new torrent Crear un nuevo torrent &Properties &Propiedades Show torrent properties Mostrar propiedades del torrent Open the torrent's folder Abrir el folder del torrent Queue Cola &Open... &Abrir... Open Abrir Open a torrent Abrir el archivo Open Fold&er Abrir la &carpeta &Start &Arrancar Start torrent Arrancar el torrent Ask Tracker for &More Peers Pedirle al tracker &más compañeros Ask tracker for more peers Pedirle más compañeros al tracker &Pause &Detener Pause torrent Detener el torrent &Verify Local Data &Verificar datos locales Verify local data Verificar los datos locales &Remove &Borrar Remove torrent Borrar el torrent &Delete Files and Remove &Eliminar archivos y borrar Remove torrent and delete its files Borrar el torrent y sus archivos &Start All Arrancar &Todos &Pause All Dete&ner todos &Quit &Salir &Select All &Seleccionar todos &Deselect All Seleccionar &ninguno &Preferences &Preferencias &Compact View Vista &compacta Compact View Vista compacta &Toolbar &Barra de herramientas &Filterbar Barra de &filtros &Statusbar Barra de &estados Sort by &Activity Ordenar por &actividad Sort by A&ge Ordenar por &edad Sort by Time &Left Ordenar por tiempo &restante Sort by &Name Ordenar por &nombre Sort by &Progress Ordenar por a&vance Sort by Rati&o Ordenar por &proporción Sort by Si&ze Ordenar por &tamaño Sort by Stat&e Ordenar por &estado Sort by T&racker Ordenar por &seguidor Message &Log Bitácora de &mensajes &Statistics &Estadísticas &Contents &Contenido &About &Acerca de Re&verse Sort Order &Invertir orden &Name &Nombre &Files &Archivos &Tracker &Tracker Total Ratio Proporción total Session Ratio Proporción sesión Total Transfer Transferencia total Session Transfer Transferencia sesión &Main Window &Ventana principal Tray &Icon &Icono en bandeja &Change Session... &Cambiar sesión... Choose Session Start a local session or connect to a running session Seleccionar sesión Set &Location... Definir &localización... &Copy Magnet Link to Clipboard &Copiar enlace magnético al portapapeles Open &URL... Abrir &URL... &Donate &Donar Start &Now Iniciar &ahora Bypass the queue and start now Saltar la cola e iniciar ahora Move to &Top Mover al &principio Move &Up Mover hacia &arriba Move &Down Mover hacia a&bajo Move to &Bottom Mover al &final Sort by &Queue Ordenar por &cola Limit Download Speed Limitar velocidad de descarga Unlimited Sin límite Limited at %1 Limitada a %1 Limit Upload Speed Limitar velocidad de subida Stop Seeding at Ratio Dejar de compartir al llegar la proporción Seed Forever Compartir sin límite Stop at Ratio (%1) Detener a la proporción (%1) - %1:%2 Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); notice that leading space (before the dash) is included here - %1:%2 Idle Sin cambio Ratio: %1 Proporción: %1 Down: %1, Up: %2 Bajada: %1, Subida: %2 Torrent Files (*.torrent);;All Files (*.*) Archivos de torrent (*.torrent);;Todos los archivos (*.*) Show &options dialog Mostrar diálogo de &opciones Open Torrent Abrir torrent Speed Limits Límites de velocidad Network Error Error de red Click to disable Temporary Speed Limits (%1 down, %2 up) DeClick para desactivar temporalmente los limites de velocidad (%1 Descarga, %2 Subida) Click to enable Temporary Speed Limits (%1 down, %2 up) Click para activar temporalmente los limites de velocidad (%1 Descarga, %2 Subida) Remove torrent? ¿Borrar torrent? Delete this torrent's downloaded files? ¿Borrar archivos descargados de este torrent? Remove %Ln torrent(s)? ¿Remover %Ln torrent? ¿Borrar %Ln torrents? Showing %L1 of %Ln torrent(s) Mostrando %L1 de %Ln torrent Mostrando %L1 de %Ln torrents Delete these %Ln torrent(s)' downloaded files? ¿Borrar archivos descargados de estos %Ln torrent? ¿Borrar archivos descargados de estos %Ln torrents? Once removed, continuing the transfer will require the torrent file or magnet link. Una vez eliminado, para continuar la transferencia se requerirá el archivo .torrent o un enlace magnético. Once removed, continuing the transfers will require the torrent files or magnet links. Una vez removidos, continuar las transferencias va a requerir los archivos .torrent o las ligas magnéticas. This torrent has not finished downloading. Este torrent no ha terminado de descargar. These torrents have not finished downloading. Estos torrent no han terminado su descarga. This torrent is connected to peers. Este torrent está conectado a compañeros. These torrents are connected to peers. Estos torrent están conectados a compañeros. One of these torrents is connected to peers. Uno de estos torrents está conectado a compañeros. Some of these torrents are connected to peers. Algunos de estos torrents están conectados a compañeros. One of these torrents has not finished downloading. Uno de estos torrents no ha terminado su descarga. Some of these torrents have not finished downloading. Algunos de estos torrents no han terminado su descarga. %1 has not responded yet %1 no ha respondido %1 is responding %1 está respondiendo %1 last responded %2 ago %1 respondió hace %2 %1 is not responding %1 no está respondiendo MakeDialog New Torrent Nuevo torrent <i>No source selected<i> <i>No se seleccionó la fuente<i> %Ln File(s) %n Archivo %Ln Archivos %Ln Piece(s) %n Pieza %Ln Piezas %1 in %2; %3 @ %4 %1 en %2; %3 @ %4 Files Archivos Sa&ve to: &Guardar en: Source f&older: &Folder fuente: Source &file: &Archivo fuente: Properties Propiedades &Trackers: &Trackers To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. Para añadir una URL de respaldo, añádela en la línea posterior a la URL primaria. Para añadir otra URL primaria, añádela después de una línea en blanco. Co&mment: Co&mentario: &Private torrent Torrent &privado MakeProgressDialog New Torrent Nuevo torrent Creating "%1" Creando "%1" Created "%1"! ¡"%1" Creado! Error: invalid announce URL "%1" Error: URL para anuncio invalido "%1" Cancelled Cancelado Error reading "%1": %2 Error al leer "%1": %2 Error writing "%1": %2 Error al escribir "%1": %2 OptionsDialog Open Torrent Abrir Torrent Open Torrent from File Abrir Torrent desde archivo Open Torrent from URL or Magnet Link Abrir URL del Torrent o Magnet Link &Source: &Fuente: &Destination folder: Directorio &destino: High Alta Normal Normal Low Baja &Priority: &Prioridad: S&tart when added &Iniciar al añadir &Verify Local Data &Verificar datos locales Mo&ve .torrent file to the trash M&over archivo .torrent al basurero Torrent Files (*.torrent);;All Files (*.*) Archivos torrent (*.torrent);;Todos los archivos (*.*) Select Destination Seleccione destino PathButton (None) (Ninguno) Select Folder Seleccione directorio Select File Seleccione archivo PrefsDialog Use &authentication Usar a&utentificación &Username: &Nombre de usuario: Pass&word: Cla&ve de usuario: &Open web client &Abrir cliente de Web Addresses: Direcciones: Speed Limits Límites de velocidad <small>Override normal speed limits manually or at scheduled times</small> <small>Ignorar límites normales de velocidad manualmente o en horarios programados</small> &Scheduled times: &Horarios programados: &On days: &Días activos: Every Day Todos los días Weekdays Entre semana Weekends Fin de semana Sunday Domingo Monday Lunes Tuesday Martes Wednesday Miércoles Thursday Jueves Friday Viernes Saturday Sábado Port is <b>open</b> El puerto está <b>abierto</b> Port is <b>closed</b> El puerto está <b>cerrado</b> Incoming Peers Conexiones de entrada Status unknown Estado desconocido &Port for incoming connections: &Puerto para recibir conexiones: Use UPnP or NAT-PMP port &forwarding from my router Usar UPnP o NAT-PMP para obtener un puerto y su mapeo de mi router Options Opciones Enable &uTP for peer connections Habilitar &uTP en conexiones con compañeros uTP is a tool for reducing network congestion. uTP es una herramienta para reducir la congestión en redes. minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minuto minutos minute(s) ago Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) minuto atrás minutos atrás Automatically add .torrent files &from: &Añadir archivos .torrent desde: Show the Torrent Options &dialog Mostrar el &dialogo de opciones del Torrent &Start added torrents I&niciar torrents añadidos Mo&ve the .torrent file to the trash Mo&ver el archivo .torrent a la papelera Download Queue Cola de descargas Ma&ximum active downloads: Ma&ximo de descargas activas: Incomplete Incompleto Seeding Compartiendo Remote Remoto <i>Blocklist contains %Ln rule(s)</i> <i>Lista de bloqueos contiene %Ln regla</i> <i>Lista de bloqueos contiene %Ln reglas</i> Pick a &random port every time Transmission is started Seleccionar un puerto &aleatoriamente cada vez que arranque Transmission Limits Límites Maximum peers per &torrent: Máximo número de compañeros por &torrent: Maximum peers &overall: Máximo número de compañeros &global: <b>Update succeeded!</b><p>Blocklist now has %Ln rule(s). <b>¡Actualización exitosa!</b><p>La lista de bloqueos tiene ahora %Ln regla. <b>¡Actualización exitosa!</b><p>La lista de bloqueos tiene ahora %Ln reglas. <b>Update Blocklist</b><p>Getting new blocklist... <b>Actualizar Lista de bloqueos</b><p>Obteniendo nueva lista... Blocklist Lista de bloqueo Enable &automatic updates Habilitar actualización &automática Allow encryption Permitir cifrado Prefer encryption Preferir cifrado Require encryption Requerir cifrado Privacy Privacidad &to &a Desktop Escritorio Show Transmission icon in the &notification area Mostrar ícono de Transmission en el área de &notificaciones Te&st Port P&robar puerto Enable &blocklist: Habilitar lista de &bloqueo: &Update Act&ualizar &Encryption mode: &Modo de cifrado: Remote Control Control Remoto Allow &remote access Permitir control &remoto HTTP &port: &Puerto HTTP: Only allow these IP a&ddresses: Solo permitir estas &direcciones IP: &Upload: &Subida: &Download: &Descarga: Alternative Speed Limits Limites de velocidad alternativos U&pload: S&ubida: Do&wnload: D&escarga: Start &minimized in notification area Empezar &minimizado en el área de notificaciones Notification Notificación Show a notification when torrents are a&dded Mostrar notificación cuando los torrents son aña&didos Show a notification when torrents &finish Mostrar notificación cuando los torrents &finalizan Play a &sound when torrents finish Reproducir un &sonido cuando los torrents terminan Testing TCP Port... Probando puerto TCP... Peer Limits Limite de compañeros Use PE&X to find more peers Usar PE&X para encontrar más compañeros PEX is a tool for exchanging peer lists with the peers you're connected to. PEX es una herramienta para intercambiar listas de compañeros con los que ya están conectados. Use &DHT to find more peers Usar &DHT para encontrar más compañeros DHT is a tool for finding peers without a tracker. DHT es una herramienta para encontrar compañeros sin usar un tracker. Use &Local Peer Discovery to find more peers Usar Descubrimiento de Compañeros &Local para encontrar más LPD is a tool for finding peers on your local network. LPD es una herramienta para encontrar compañeros en la red local. Encryption Cifrado Select "Torrent Done" Script Seleccionar script ejecutado cuando el torrent termina descarga Select Incomplete Directory Seleccionar directorio para incompletos Select Watch Directory Seleccionar directorio de guardia Select Destination Seleccionar destino Adding Al añadir Download is i&nactive if data sharing stopped: Please keep this phrase as short as possible, it's curently the longest and influences dialog width La &Descarga esta inactiva si se compartió por ultima vez: Downloading Descargando Append ".&part" to incomplete files' names Añadir .&part al nombre de archivos incompletos Keep &incomplete files in: Mantener archivos &incompletos en: Save to &Location: &Guardar en: Call scrip&t when torrent is completed: Ejecutar scrip&t cuando el torrent esté completo: Stop seeding at &ratio: Dejar de compartir llegando a &proporción: Stop seedi&ng if idle for: Dejar de compartir si está i&nactivo: Transmission Preferences Preferencias del programa Speed Velocidad Network Red Not supported by remote sessions No soportado por sesiones remotas QObject Invalid option Opción inválida RelocateDialog Select Location Seleccione localización Set Torrent Location Defina localización del torrent Set Location Definir localización New &location: Nueva &localización: &Move from the current folder &Mover del directorio actual Local data is &already there Los datos locales &ya están ahí Session Error Renaming Path Error renombrando la ruta <p><b>Unable to rename "%1" as "%2": %3.</b></p> <p>Please correct the errors and try again.</p> <p><b>No se puede renombrar "%1" como "%2": %3.</b></p> <p>Por favor corrija los errores e inténtelo de nuevo.</p> Add Torrent Añadir torrent SessionDialog Change Session Cambiar sesión Source Fuente Start &Local Session Empezar sesión &local Connect to &Remote Session Conectar a sesión &remota &Host: &Anfitrión: &Port: &Puerto: &Authentication required &Autentificación requerida &Username: &Nombre de usuario Pass&word: &Clave de usuario: StatsDialog Statistics Estadísticas Current Session Sesión actual Uploaded: Subido: Downloaded: Descargados: Ratio: Proporción: Duration: Duración: Total Total Started %Ln time(s) Iniciado %n vez Iniciado %Ln veces Torrent Verifying local data Verificando datos locales Downloading Descargando Seeding Compartiendo Finished Terminado Paused Detenido Queued for verification En cola para verificación Queued for download En cola para descarga Queued for seeding En cola para compartir Tracker gave a warning: %1 El tracker dio una advertencia: %1 Tracker gave an error: %1 El tracker dio un error: %1 Error: %1 Error: %1 TorrentDelegate Magnetized transfer - retrieving metadata (%1%) First part of torrent progress string; %1 is the percentage of torrent metadata downloaded Transferencia magnética - descargando metadata (%1%) %1 of %2 (%3%) First part of torrent progress string; %1 is how much we've got, %2 is how much we'll have when done, %3 is a percentage of the two %1 de %2 (%3%) %1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio, %6 is the ratio we want to reach before we stop uploading %1 de %2 (%3%), subido %4 (Proporción: %5 Meta: %6) %1 of %2 (%3%), uploaded %4 (Ratio: %5) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio %1 de %2 (%3%), subido %4 (Proporción: %5) %1, uploaded %2 (Ratio: %3 Goal: %4) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio, %4 is the ratio we want to reach before we stop uploading %1, subido %2 (Proporción: %3 Meta: %4) %1, uploaded %2 (Ratio: %3) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio %1, subido %2 (Proporción: %3) - %1 left Second (optional) part of torrent progress string; %1 is duration; notice that leading space (before the dash) is included here - falta %1 - Remaining time unknown Second (optional) part of torrent progress string; notice that leading space (before the dash) is included here - Tiempo faltante desconocido Ratio: %1 Proporción: %1 Downloading from %Ln peer(s) First part of phrase "Downloading from ... peer(s) and ... web seed(s)" Descargando desde %Ln compañero Descargando desde %Ln compañeros Seeding to %Ln peer(s) Compartiendo a %Ln compañero Compartiendo a %Ln compañeros - - Downloading metadata from %Ln peer(s) (%1% done) Descargando metadata desde %Ln compañero (%1% obtenido) Descargando metadatos desde %Ln compañeros (%1% obtenido) Downloading from %1 of %Ln connected peer(s) First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" Descargando desde %1 de %Ln compañero conectado Descargando desde %1 de %Ln compañeros conectados and %Ln web seed(s) Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; notice that leading space (before "and") is included here y %Ln web seed y %Ln web seeds Seeding to %1 of %Ln connected peer(s) Compartiendo a %1 de %Ln compañero conectado Compartiendo a %1 de %Ln compañeros conectados Error Error Verifying local data (%1% tested) Verificando datos locales (%1% probado) TrackerDelegate Got a list of%1 %Ln peer(s)%2 %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Recibimos una lista de%1 %Ln compañero%2 hace %3 Recibimos una lista de%1 %Ln compañeros%2 hace %3 Peer list request %1timed out%2 %3 ago; will retry %1 and %2 are replaced with HTML markup, %3 is duration El pedido de la lista de compañeros %1caducó hace %2 %3; se volverá a intentar Got an error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Obtuvimos un error %1"%2"%3 hace %4 No updates scheduled No hay actualizaciones programadas Asking for more peers in %1 %1 is duration Solicitando más compañeros en %1 Queued to ask for more peers En cola para pedir más compañeros Asking for more peers now... <small>%1</small> %1 is duration Solicitando más compañeros ahora... <small>%1</small> Tracker had%1 %Ln seeder(s)%2 First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup El seguidor tenía%1 %Ln compartiendo%2 El seguidor tenía%1 %Ln compartiendos%2 and%1 %Ln leecher(s)%2 %3 ago Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup, %3 is duration; notice that leading space (before "and") is included here y%1 %Ln descargando%2 hace %3 y%1 %Ln descargandos%2 hace %3 Tracker had %1no information%2 on peer counts %3 ago %1 and %2 are replaced with HTML markup, %3 is duration El tracker tenía %1nada%2 del conteo de compañeros %3 atrás Got a scrape error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Obtuvimos un error de barrido' %1"%2"%3 hace %4 Asking for peer counts in %1 %1 is duration Solicitando cuenta de compañeros en %1 Queued to ask for peer counts En cola para pedir cuenta de compañeros Asking for peer counts now... <small>%1</small> %1 is duration Solicitando cuenta de compañeros ahora... <small>%1</small> transmission-2.92/qt/translations/PaxHeaders.4960/transmission_id.ts0000644000000000000000000000013212664476417022621 xustar0030 mtime=1456635151.995496507 30 atime=1456635151.995496507 30 ctime=1457295917.271761511 transmission-2.92/qt/translations/transmission_id.ts0000644000175000017500000025545212664476417024263 0ustar00mikedldmikedld00000000000000 UTF-8 AboutDialog About Transmission Tentang Transmission <b style='font-size:x-large'>Transmission %1</b> <b style='font-size:x-large'>Transmission %1</b> A fast and easy BitTorrent client Sebuah klien BitTorrent cepat dan mudah Copyright (c) The Transmission Project Hak Cipta (c) Proyek Transmission C&redits K&redit &License &Lisensi Credits Kredit Application <b>Transmission is a file sharing program.</b> <b>Transmission adalah sebuah program untuk berbagi berkas.</b> When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. I &Agree Saya &Setuju Torrent Completed Torrent Selesai Torrent Added Torrent Ditambahkan DetailsDialog None Tidak ada Mixed Unknown Tidak diketahui Finished Selesai Paused Berhenti Sejenak Active now Aktif sekarang %1 ago %1 lalu %1 (%Ln pieces @ %2) %1 (%Ln bagian @ %2) %1 (%Ln pieces) %1 (%Ln bagian) Private to this tracker -- DHT and PEX disabled Pribadi ke pelacak ini -- DHT dan PEX dinonaktifkan Public torrent Torrent publik Created by %1 Dibuat oleh %1 Created on %1 Dibuat pada %1 Created by %1 on %2 Dibuat oleh %1 pada %2 Encrypted connection Sambungan terenkripsi Optimistic unchoke Downloading from this peer Mengunduh dari rekan ini We would download from this peer if they would let us Kami akan mengunduh dari rekan ini jika mereka mengizinkan kami Uploading to peer Mengunggah ke rekan We would upload to this peer if they asked Kami akan mengunggah ke rekan ini jika mereka bertanya Peer has unchoked us, but we're not interested We unchoked this peer, but they're not interested Peer was discovered through DHT Rekan ditemukan melalui DHT Peer was discovered through Peer Exchange (PEX) Rekan ditemukan melalui Pertukaran Rekan (PEX) Peer is an incoming connection Rekan adalah sambungan yang masuk minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) menit Error Galat Tracker already exists. Pelacak telah ada. %1 (100%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data %1 (100%) %1 of %2 (%3%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data, %2 is overall size of torrent data, %3 is percentage (%1/%2*100) %1 dari %2 (%3%) %1 of %2 (%3%), %4 Unverified Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded data (both verified and unverified), %2 is overall size of torrent data, %3 is percentage (%1/%2*100), %4 is amount of downloaded but not yet verified data %1 dari %2 (%3%), %4 Belum diverifikasi %1 (%2 corrupt) %1 (%2 korup) %1 (Ratio: %2) %1 (Rasio: %2) N/A N/A Peer is connected over uTP Rekan tersambung melalui uTP Add URL Tambah URL Add tracker announce URL: Tambah URL pengumuman pelacak: Invalid URL "%1" URL Tidak sah "%1" Edit URL Sunting URL Edit tracker announce URL: Sunting URL pengumuman pelacak: High Tinggi Normal Normal Low Rendah Use Global Settings Gunakan Pengaturan Global Seed regardless of ratio Kirim terlepas dari rasio Stop seeding at ratio: Berhenti kirim saat rasio: Seed regardless of activity Kirim terlepas dari rasio Stop seeding if idle for: Up Atas Down Bawah % % Status Status Address Alamat Client Klien Torrent Properties Properti Torrent Information Informasi Activity Aktivitas Have: Memiliki: Availability: Ketersediaan: Uploaded: Diunggah: Downloaded: Diunduh: State: Keadaan: Running time: Waktu berjalan: Remaining time: Sisa waktu: Last activity: Aktivitas terakhir: Error: Galat: Details Rincian Size: Ukuran: Location: Lokasi: Hash: Hash: Privacy: Privasi: Origin: Asal Usul: Comment: Komentar: Peers Rekan Tracker Pelacak Add Tracker Tambah Pelacak Edit Tracker Sunting Pelacak Remove Trackers Hapus Pelacak Show &more details Tampilan &rincian lebih Show &backup trackers Tampilan &pelacak cadangan Files Berkas Options Opsi Speed Kecepatan Honor global &limits Limit &download speed: Batas &kecepatan unduh: Limit &upload speed: Batas &kecepatan unggah: Torrent &priority: Prioritas &Torrent: Seeding Limits Batas Kirim &Ratio: &Rasio &Idle: Peer Connections Sambungan Rekan &Maximum peers: &Rekan Maksimum: FileAdded Add Torrent Tambah Torrent <p><b>Unable to add "%1".</b></p><p>It is a duplicate of "%2" which is already added.</p> <p><b>Tidak dapat menambahkan "%1".</b></p><p>Ini adalah duplikat dari "%2" yang telah ditambahkan.</p> Error Adding Torrent Galat Menambahkan Torrent FileTreeItem Low Rendah High Tinggi Normal Normal Mixed FileTreeModel File Berkas Size Ukuran Progress Kemajuan Download Unduh Priority Prioritas FileTreeView Check Selected Uncheck Selected Only Check Selected Priority Prioritas Open Buka Rename... FilterBar All Semua Active Aktif Downloading Mengunduh Seeding Mengirim Paused Berhenti Sejenak Finished Selesai Verifying Memeriksa Error Galat Show: Tampilkan: FilterBarLineEdit Search... Cari... Formatter B/s B/d kB/s kB/s MB/s MB/s GB/s GB/s TB/s TB/s B B kB kB MB MB GB GB TB TB KiB KiB MiB MiB GiB GiB TiB TiB Unknown Tidak diketahui None Tidak ada %1 %2 %1 %2 %Ln day(s) %Ln hari %Ln hour(s) %Ln jam %Ln minute(s) %Ln menit %Ln second(s) %Ln detik %1, %2 %1, %2 FreeSpaceLabel <i>Calculating Free Space...</i> <i>Menghitung Ruang Bebas...</i> %1 free %1 bebas LicenseDialog License Lisensi MainWindow Transmission Transmission &Torrent &Torrent &Edit &Sunting &Help &Bantuan &View &Tampilan &File &Berkas &New... &Baru... Create a new torrent Buat sebuah torrent baru &Properties &Properti Show torrent properties Tampilkan properti torrent Open the torrent's folder Buka folder torrent Queue Antrian &Open... &Buka... Open Buka Open a torrent Buka sebuah torrent Open Fold&er Buka Fold&er &Start &Mulai Start torrent Mulai torrent Ask Tracker for &More Peers Tanya Pelacak untuk &Rekan Lebih Banyak Ask tracker for more peers Tanya pelacak untuk rekan lebih banyak &Pause &Berhenti Sejenak Pause torrent Hentikan sejenak torrent &Verify Local Data &Verifikasi Data Lokal Verify local data Verifikasi Data Lokal &Remove &Hapus Remove torrent Hilangkan torrent &Delete Files and Remove Hapus File dan Hilangkan Remove torrent and delete its files Hilangkan torrent dan hapus berkasnya &Start All &Mulai Semua &Pause All &Hentikan Sejenak Semua &Quit &Keluar &Select All &Pilih Semua &Deselect All &Batalkan Pilih Semua &Preferences &Preferensi &Compact View &Tampilan Padat Compact View Tampilan Padata &Toolbar &Bilah Alat &Filterbar &Bilah Penyaring &Statusbar &Bilah Status Sort by &Activity Urutkan dengan &Aktivitas Sort by A&ge Urutkan dengan U&mur Sort by Time &Left Urutkan dengan Waktu &Tersisa Sort by &Name Urutkan dengan &Nama Sort by &Progress Urutkan dengan &Kemajuan Sort by Rati&o Urutkan dengan Rasi&o Sort by Si&ze Urutkan dengan Uku&ran Sort by Stat&e Urutkan dengan Kead&aan Sort by T&racker Urutkan dengan P&elacak Message &Log Catatan &Pesan &Statistics &Statistik &Contents &Konten &About &Tentang Re&verse Sort Order Ur&utan Sortis Terbalik &Name &Nama &Files &Berkas &Tracker &Pelacak Total Ratio Total Rasio Session Ratio Sesi Rasio Total Transfer Total Rasio Session Transfer Sesi Transfer &Main Window &Jendela Utama Tray &Icon Ikon &Baki &Change Session... &Ubah Sesi... Choose Session Start a local session or connect to a running session Pilih Sesi Set &Location... Tetapkan &Lokasi... &Copy Magnet Link to Clipboard &Salin Tautan Magnet ke Papan Klip Open &URL... Buka &URL... &Donate &Menyumbang Start &Now Mulai &Sekarang Bypass the queue and start now Lewati antrian dan jalankan sekarang Move to &Top Pindah ke &Atas Move &Up Pindah ke &Atas Move &Down Pindah ke &Bawah Move to &Bottom Pindah ke Paling &Bawah Sort by &Queue Urutkan dengan &Antrian Limit Download Speed Batas Kecepatan Unduh Unlimited Tidak terbatas Limited at %1 Dibatasi pada %1 Limit Upload Speed Batas Kecepatan Unngah Stop Seeding at Ratio Berhenti Kirim pada Rasio Seed Forever Kirim Selamanya Stop at Ratio (%1) Berhenti pada Rasio (%1) - %1:%2 Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); notice that leading space (before the dash) is included here - %1:%2 Idle Ratio: %1 Rasio: %1 Down: %1, Up: %2 Bawah: %1, Atas: %2 Torrent Files (*.torrent);;All Files (*.*) Berkas Torrent (*.torrent);;Semua Berkas (*.*) Show &options dialog Tampilkan &dialog pengaturan Open Torrent Buka Torrent Speed Limits Batas Kecepatan Network Error Galat Jaringan Click to disable Temporary Speed Limits (%1 down, %2 up) Klik untuk menonaktifkan sementara Batas Kecepatan (%1 unduh, %2 unggah) Click to enable Temporary Speed Limits (%1 down, %2 up) Klik untuk mengaktifkan sementara Batas Kecepatan (%1 unduh, %2 unggah) Remove torrent? Hilangkan torrent? Delete this torrent's downloaded files? Hapus berkas yang diunduh torrent ini? Remove %Ln torrent(s)? Hilangkan %Ln torrent? Showing %L1 of %Ln torrent(s) Delete these %Ln torrent(s)' downloaded files? Hapus berkas %Ln yang diunduh torrent ini? Once removed, continuing the transfer will require the torrent file or magnet link. Sekali dihilangkan, melanjutkan transfer akan membutuhkan berkas torrent atau tautan magnet. Once removed, continuing the transfers will require the torrent files or magnet links. Sekali dihilangkan, melanjutkan transfer akan membutuhkan berkas torrent atau tautan magnet. This torrent has not finished downloading. Torrent ini belum selesai diunduh. These torrents have not finished downloading. Torrent ini belum selesai diunduh. This torrent is connected to peers. Torrent ini tersambung dengan rekan - rekan. These torrents are connected to peers. Torrent ini tersambung dengan rekan - rekan. One of these torrents is connected to peers. Salah satu torrent ini tersambung ke rekan-rekan. Some of these torrents are connected to peers. Beberapa torrent ini tersambung dengan rekan-rekan. One of these torrents has not finished downloading. Salah satu torrent ini belum selesai diunduh. Some of these torrents have not finished downloading. Beberapa torrent ini belum selesai diunduh. %1 has not responded yet %1 masih belum menanggapi juga %1 is responding %1 menanggapi %1 last responded %2 ago %1 terakhir menanggapi %2 lalu %1 is not responding %1 tidak menanggapi MakeDialog New Torrent Torrent Baru <i>No source selected<i> <i>Tidak ada sumber yang dipilih<i> %Ln File(s) %Ln Berkas %Ln Piece(s) %Ln Bagian %1 in %2; %3 @ %4 %1 dalam %2; %3 @ %4 Files Berkas Sa&ve to: Si&mpan ke: Source f&older: Folder s&umber: Source &file: Berkas s&umber: Properties Properti &Trackers: &Pelacak: To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. Untuk menambahkan URL cadangan, tambahkan pada baris setelah URL utama. Untuk menambahkan URL utama, tambahkan setelah baris kosong. Co&mment: Ko&mentar: &Private torrent &Torrent pribadi MakeProgressDialog New Torrent Torrent Baru Creating "%1" Membuat "%1" Created "%1"! Dibuat "%1"! Error: invalid announce URL "%1" Galat: URL pengumuman tidak sah "%1" Cancelled Dibatalkan Error reading "%1": %2 Galat membaca "%1": %2 Error writing "%1": %2 Galat menulis "%1": %2 OptionsDialog Open Torrent Buka Torrent Open Torrent from File Buka Torrent dari Berkas Open Torrent from URL or Magnet Link Buka Torrent dari URL atau Tautan Magnet &Source: &Sumber: &Destination folder: &Folder Tujuan: High Tinggi Normal Normal Low Rendah &Priority: &Prioritas: S&tart when added M&ulai ketika ditambahkan &Verify Local Data &Verifikasi Data Lokal Mo&ve .torrent file to the trash Pi&ndahkan berkas .torrent ke tempat sampah Torrent Files (*.torrent);;All Files (*.*) Berkas Torrent (*.torrent);;Semua Berkas (*.*) Select Destination Pilih Tujuan PathButton (None) (Tidak ada) Select Folder Pilih Folder Select File Pilih Berkas PrefsDialog Use &authentication Gunakan &otentikasi &Username: &Nama Pengguna: Pass&word: Kata& Sandi: &Open web client &Buka klien web Addresses: Alamat: Speed Limits Batas Kecepatan <small>Override normal speed limits manually or at scheduled times</small> <small>Override batas kecepatan normal secara manual atau pada waktu yang dijadwalkan</small> &Scheduled times: &Waktu dijadwalkan: &On days: &Pada hari: Every Day Setiap Hari Weekdays Hari kerja Weekends Akhir pekan Sunday Minggu Monday Senin Tuesday Selasa Wednesday Rabu Thursday Kamis Friday Jumat Saturday Sabtu Port is <b>open</b> Port <b>terbuka</b> Port is <b>closed</b> Port <b>tertutup</b> Incoming Peers Rekan Masuk Status unknown Status tidak diketahui &Port for incoming connections: &Port untuk sambungan masuk: Use UPnP or NAT-PMP port &forwarding from my router Gunakan penerusan port UPnP atau NAT-PMP dari router saya Options Opsi Enable &uTP for peer connections Aktifkan &uTP untuk sambungan rekan uTP is a tool for reducing network congestion. uTP adalah alat untuk mengurangi kemacetan jaringan. minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) menit minute(s) ago Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) menit yang lalu Automatically add .torrent files &from: Otomatis menambahkan berkas .torrent &dari: Show the Torrent Options &dialog Tampilkan dialog Pilihan &Torrent &Start added torrents &Mulai torrent yang ditambahkan Mo&ve the .torrent file to the trash Pi&ndah berkas .torrent ke tempat sampah Download Queue Antrian Unduh Ma&ximum active downloads: Maksimum unduh yang aktif: Incomplete Tidak selesai Seeding Mengirim Remote <i>Blocklist contains %Ln rule(s)</i> Pick a &random port every time Transmission is started Pilih sebuah &port acak setiap kali Transmission dijalankan Limits Batas Maximum peers per &torrent: Maksimum rekan per &torrent: Maximum peers &overall: Maksimum rekan &keseluruhan <b>Update succeeded!</b><p>Blocklist now has %Ln rule(s). <b>Pembaruan sukses!</b><p>Daftar blok sekarang memiliki %Ln aturan. <b>Update Blocklist</b><p>Getting new blocklist... <b>Memperbarui Daftar Blok</b><p>Mendapatkan daftar blok baru... Blocklist Daftar blok Enable &automatic updates Mengaktifkan &pembaruan otomatis Allow encryption Mengizinkan enkripsi Prefer encryption Lebih memilih enkripsi Require encryption Membutuhkan enkripsi Privacy Privasi &to &to Desktop Desktop Show Transmission icon in the &notification area Tampilkan ikon Transmission di &area notifikasi Te&st Port Po&rt Uji Enable &blocklist: Aktifkan &daftarblok: &Update &Perbarui &Encryption mode: &Mode enkripsi: Remote Control Allow &remote access Izinkan &akses remote HTTP &port: Port &HTTP: Only allow these IP a&ddresses: Hanya mengizinkan Alamat IP ini: &Upload: &Unggah: &Download: &Unduh: Alternative Speed Limits Batas Kecepatan Alternatif U&pload: U&nggah: Do&wnload: Und&uh Start &minimized in notification area Mulai &minimalkan di area notifikasi Notification Notifikasi Show a notification when torrents are a&dded Tampilkan notifikasi ketika torrent &ditambahkan Show a notification when torrents &finish Tampilkan notifikasi ketika torrent &selesai Play a &sound when torrents finish Jalankan sebuah &suara ketika torrent selesai Testing TCP Port... Menguji Port TCP... Peer Limits Batas Rekan Use PE&X to find more peers Gunakan PE&X untuk mencari lebih banyak rekan PEX is a tool for exchanging peer lists with the peers you're connected to. PEX adalah alat untuk menukar daftar rekan dengan rekan yang tersambung denganmu. Use &DHT to find more peers Gunakan &DHT untuk mencari lebih banyak rekan DHT is a tool for finding peers without a tracker. DHT adalah alat untuk mencari rekan tanpa sebuah pelacak. Use &Local Peer Discovery to find more peers Gunakan &Penemuan Rekan Lokal untuk mencari lebih banyak rekan LPD is a tool for finding peers on your local network. LPD adalah alat untuk mencari rekan pada jaringan lokalmu. Encryption Enkripsi Select "Torrent Done" Script Pilih Skrip "Torrent Selesai" Select Incomplete Directory Pilih Direktori Tidak Selesai Select Watch Directory Select Destination Pilih Tujuan Adding Menambahkan Download is i&nactive if data sharing stopped: Please keep this phrase as short as possible, it's curently the longest and influences dialog width Unduh tidak &aktif jika berbagi data dihentikan: Downloading Mengunduh Append ".&part" to incomplete files' names Tambahkan ".&part" pada nama berkas yang tidak selesai Keep &incomplete files in: Save to &Location: Simpan ke &Lokasi: Call scrip&t when torrent is completed: Simpan skri&p ketika torrent selesai: Stop seeding at &ratio: Berhenti kirim pada &rasio: Stop seedi&ng if idle for: Transmission Preferences Preferensi Transmission Speed Kecepatan Network Jaringan Not supported by remote sessions QObject Invalid option Opsi Tidak sah RelocateDialog Select Location Pilih Lokasi Set Torrent Location Tetapkan Lokasi Torrent Set Location Tetapkan Lokasi New &location: Lokasi &Baru: &Move from the current folder &Pindah dari folder saat ini Local data is &already there Data lokal &telah ada di sana Session Error Renaming Path Galat Penggantian Jalur <p><b>Unable to rename "%1" as "%2": %3.</b></p> <p>Please correct the errors and try again.</p> <p><b>Tidak dapat mengubah nama "%1" sebagai "%2": %3.</b></p> <p>Silakan perbaiki galat dan coba lagi.</p> Add Torrent Tambah Torrent SessionDialog Change Session Ubah Sesi Source Sumber Start &Local Session Mulai &Lokal Sesi Connect to &Remote Session &Host: &Host: &Port: &Port: &Authentication required &Otentifikasi dibutuhkan &Username: &Nama Pengguna: Pass&word: Kata &Sandi: StatsDialog Statistics Statistik Current Session Sesi Saat INi Uploaded: Diunggah: Downloaded: Diunduh: Ratio: Rasio: Duration: Durasi: Total Total Started %Ln time(s) Dimulai %Ln kali Torrent Verifying local data Memeriksa data lokal Downloading Mengunduh Seeding Mengirim Finished Selesai Paused Berhenti Sejenak Queued for verification Antri untuk pemeriksaan Queued for download Antri untuk mengunduh Queued for seeding Antri untuk mengirim Tracker gave a warning: %1 Pelacak memberi sebuah peringatan: %1 Tracker gave an error: %1 Pelacak memberi sebuah galat: %1 Error: %1 Galat: %1 TorrentDelegate Magnetized transfer - retrieving metadata (%1%) First part of torrent progress string; %1 is the percentage of torrent metadata downloaded %1 of %2 (%3%) First part of torrent progress string; %1 is how much we've got, %2 is how much we'll have when done, %3 is a percentage of the two %1 dari %2 (%3%) %1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio, %6 is the ratio we want to reach before we stop uploading %1 ddari %2 (%3%), diunggah %4 (Rasion: %5 Tujuan: %6) %1 of %2 (%3%), uploaded %4 (Ratio: %5) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio %1 dari %2 (%3%), diunggah %4 (Rasio: %5) %1, uploaded %2 (Ratio: %3 Goal: %4) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio, %4 is the ratio we want to reach before we stop uploading %1, diunggah %2 (Rasio: %3 Tujuan: %4) %1, uploaded %2 (Ratio: %3) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio %1, diunggah %2 (Rasio: %3) - %1 left Second (optional) part of torrent progress string; %1 is duration; notice that leading space (before the dash) is included here - %1 tersisa - Remaining time unknown Second (optional) part of torrent progress string; notice that leading space (before the dash) is included here - Sisa waktu tidak diketahui Ratio: %1 Rasio: %1 Downloading from %Ln peer(s) First part of phrase "Downloading from ... peer(s) and ... web seed(s)" Mengunduh dari %Ln rekan Seeding to %Ln peer(s) Mengirim ke %Ln rekan - - Downloading metadata from %Ln peer(s) (%1% done) Mengunduh metadata dari %Ln rekan (%1% selesai) Downloading from %1 of %Ln connected peer(s) First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" Mengunduh dari %1 dari %Ln rekan yang tersambung and %Ln web seed(s) Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; notice that leading space (before "and") is included here dan %Ln kirim web Seeding to %1 of %Ln connected peer(s) Mengirim ke %1 dari %Ln rekan tersambung Error Galat Verifying local data (%1% tested) Memeriksa lokal data (%1% diuji) TrackerDelegate Got a list of%1 %Ln peer(s)%2 %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Telah mendapatkan daftar dari%1 %Ln rekan%2 %3 lalu Peer list request %1timed out%2 %3 ago; will retry %1 and %2 are replaced with HTML markup, %3 is duration Meminta daftar rekan %1kehabisan waktu%2 %3 lalu; akan mencoba lagi Got an error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Mendapat sebuah galat %1"%2"%3 %4 lalu No updates scheduled Tidak ada pembaruan terjadwal Asking for more peers in %1 %1 is duration Menanyakan untuk rekan lebih banyak di %1 Queued to ask for more peers Antri untuk meminta lebih banyak rekan-rekan Asking for more peers now... <small>%1</small> %1 is duration Meminta lebih banya rekan sekarang... <small>%1</small> Tracker had%1 %Ln seeder(s)%2 First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup Pelacak memiliki%1 %Ln pengirim%2 and%1 %Ln leecher(s)%2 %3 ago Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup, %3 is duration; notice that leading space (before "and") is included here dan%1 %Ln penerima%2 %3 lalu Tracker had %1no information%2 on peer counts %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Pelacak tidak memiliki %1informasi%2 pada jumlah rekan %3 lalu Got a scrape error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Mendapat kesalahan gesekan %1"%2"%3 %4 lalu Asking for peer counts in %1 %1 is duration Meminta untuk jumlah rekan di %1 Queued to ask for peer counts Antri untuk meminta jumlah rekan Asking for peer counts now... <small>%1</small> %1 is duration Meminta jumlah rekan sekarang.. <small>%1</small> transmission-2.92/qt/translations/PaxHeaders.4960/transmission_kk.ts0000644000000000000000000000013012664476417022630 xustar0030 mtime=1456635151.984496318 28 atime=1456635151.9834963 30 ctime=1457295917.276761596 transmission-2.92/qt/translations/transmission_kk.ts0000644000175000017500000026762012664476417024274 0ustar00mikedldmikedld00000000000000 UTF-8 AboutDialog About Transmission <b style='font-size:x-large'>Transmission %1</b> A fast and easy BitTorrent client Жылдам мен қарапайым BitTorrent қолданбаÑÑ‹ Copyright (c) The Transmission Project Copyright (c) The Transmission Project C&redits &License Credits Application <b>Transmission is a file sharing program.</b> When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. I &Agree Torrent Completed Torrent Added Торрент қоÑылған DetailsDialog None ЕшнәрÑе Mixed ÐÑ€Ð°Ð»Ð°Ñ Unknown БелгіÑіз Finished ÐÑқталған Paused ÐÑлдатылған Active now Қазір белÑенді %1 ago %1 бұрын %1 (%Ln pieces @ %2) %1 (%Ln pieces) Private to this tracker -- DHT and PEX disabled ОÑÑ‹ трекерге жеке -- DHT және PEX Ñөндірулі Public torrent Публикалық торрент Created by %1 %1 жаÑаған Created on %1 %1 жаÑалған Created by %1 on %2 %1 жаÑаған, %2 Encrypted connection Шифрленген Ð±Ð°Ð¹Ð»Ð°Ð½Ñ‹Ñ Optimistic unchoke ЖақÑÑ‹ таратылым Downloading from this peer Бұл тораптан жүктеу We would download from this peer if they would let us РұқÑат етÑе, оÑÑ‹ тораптан жүктеуге болады Uploading to peer Торапқа беру We would upload to this peer if they asked ҚызықÑа, оÑÑ‹ торапқа беруге болады Peer has unchoked us, but we're not interested Торап мәліметтерді бере алады, бірақ бізге олар керек ÐµÐ¼ÐµÑ We unchoked this peer, but they're not interested Торапқа беруге Ñ€Ò±Ñқат бар, бірақ ол қызықпаған Peer was discovered through DHT ОÑÑ‹ торап DHT көмегімен табылған Peer was discovered through Peer Exchange (PEX) ОÑÑ‹ торап тораптармен алмаÑу арқылы табылған (PEX) Peer is an incoming connection Торап қабылдау режимінде Ð¶Ò±Ð¼Ñ‹Ñ Ñ–Ñтеп тұр minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) Error Қате Tracker already exists. %1 (100%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data %1 (100%) %1 of %2 (%3%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data, %2 is overall size of torrent data, %3 is percentage (%1/%2*100) %1 дайын, барлығы %2 (%3%) %1 of %2 (%3%), %4 Unverified Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded data (both verified and unverified), %2 is overall size of torrent data, %3 is percentage (%1/%2*100), %4 is amount of downloaded but not yet verified data %1 (%2 corrupt) %1 (%2 қате) %1 (Ratio: %2) %1 (Рейтингі: %2) N/A Ðнықталмаған Peer is connected over uTP Add URL URL қоÑу Add tracker announce URL: Invalid URL "%1" Ð”Ò±Ñ€Ñ‹Ñ ÐµÐ¼ÐµÑ URL "%1" Edit URL Edit tracker announce URL: High Жоғары Normal Қалыпты Low Төмен Use Global Settings Жалпы баптауларды қолдану Seed regardless of ratio Рейтингті елемей, тарату Stop seeding at ratio: Рейтинг мәні келеÑіге жеткенде, таратуды тоқтату: Seed regardless of activity БелÑенділікті елемей, тарату Stop seeding if idle for: БелÑенді ÐµÐ¼ÐµÑ Ð±Ð¾Ð»Ñа, таратуды тоқтату: Up Тарату Down Ðлу % % Status Қалып-күйі Address ÐÐ´Ñ€ÐµÑ Client Клиент Torrent Properties Торрент қаÑиеттері Information Ðқпараты Activity БелÑенділігі Have: Бар: Availability: Қол жетерлігі: Uploaded: Таратылған: Downloaded: Жүктелген: State: Күйі: Running time: Ð–Ò±Ð¼Ñ‹Ñ ÑƒÐ°Ò›Ñ‹Ñ‚Ñ‹: Remaining time: Қалған уақыт: Last activity: Соңғы белÑенділігі: Error: Қате: Details Көбірек білу Size: Location: ОрналаÑуы: Hash: Хеші: Privacy: Жекелігі: Origin: Тегі: Comment: ТүÑініктемеÑÑ–: Peers ҚатыÑушылар Tracker Трекер Add Tracker Edit Tracker Remove Trackers Show &more details &Көбірек ақпарат шығару Show &backup trackers Òš&ор трекерлерін көрÑету Files Файлдар Options Баптаулары Speed Жылдамдығы Honor global &limits Глобалды шектеу&лерді елемеу Limit &download speed: Қаб&ылдау жылдамдығын шектеу: Limit &upload speed: Тар&ату жылдамдығын шектеу: Torrent &priority: Торрент п&риоритеті: Seeding Limits Тарату шектеулері &Ratio: &Рейтингі: &Idle: Кү&ту: Peer Connections Тораптармен байланыÑтар &Maximum peers: Тораптардың ма&кÑимал Ñаны: FileAdded Add Torrent Торрентті қоÑу <p><b>Unable to add "%1".</b></p><p>It is a duplicate of "%2" which is already added.</p> Error Adding Torrent FileTreeItem Low Төмен High Жоғары Normal Қалыпты Mixed ÐÑ€Ð°Ð»Ð°Ñ FileTreeModel File Файл Size Progress БарыÑÑ‹ Download Жүктеп алу Priority Приоритеті FileTreeView Check Selected Uncheck Selected Only Check Selected Priority Приоритеті Open Rename... FilterBar All Барлығы Active БелÑенді Downloading Жүктелуде Seeding Таратылуда Paused ÐÑлдатылған Finished ÐÑқталған Verifying ТекÑерілуде Error Қате Show: КөрÑету: FilterBarLineEdit Search... Formatter B/s kB/s MB/s GB/s TB/s B kB MB GB TB KiB MiB GiB TiB Unknown БелгіÑіз None ЕшнәрÑе %1 %2 %Ln day(s) %Ln hour(s) %Ln minute(s) %Ln second(s) %1, %2 %1, %2 FreeSpaceLabel <i>Calculating Free Space...</i> %1 free LicenseDialog License MainWindow Transmission Transmission &Torrent &Торрент &Edit Тү&зету &Help &Көмек &View Тү&рі &File &Файл &New... &ЖаÑау... Create a new torrent Торренті жаÑау &Properties &ҚаÑиеттері Show torrent properties Open the torrent's folder Queue &Open... Open Open a torrent Open Fold&er &Start Ба&Ñтау Start torrent Торренті жіберу Ask Tracker for &More Peers Тре&керден тағы тораптарды Ñұрау Ask tracker for more peers Трекерден тағы тораптарды Ñұрау &Pause Ð&Ñлдату Pause torrent Торренті аÑлдату &Verify Local Data Жергі&лікті мәліметтерді текÑеріп шығу Verify local data Жергілікті мәліметтерді текÑеріп шығу &Remove Remove torrent Торрентті өшіру &Delete Files and Remove &Файлдар мен торрентті өшіру Remove torrent and delete its files &Start All &Барлығын жіберу &Pause All Барлығын аÑ&лдату &Quit &Шығу &Select All Б&арлығын ерекшелеу &Deselect All Ерекше&леуді барлығынан алып таÑтау &Preferences &Баптаулары &Compact View Ық&шам көрініÑÑ– Compact View Ықшам көрініÑÑ– &Toolbar Сай&мандар панелі &Filterbar &Сүзгілер &Statusbar Қалы&п-күй жолағы Sort by &Activity БелÑенділігі бойынш&а Ñұрыптау Sort by A&ge ҚоÑылған &уақыты бойынша Ñұрыптау Sort by Time &Left Тре&кері бойынша Ñұрыптау Sort by &Name Ðты бойы&нша Ñұрыптау Sort by &Progress Үр&діÑÑ– бойынша Ñұрыптау Sort by Rati&o Ре&йтингі бойынша Ñұрыптау Sort by Si&ze Ó¨&лшемі ойынша Ñұрыптау Sort by Stat&e Қал&ып-күйі бойынша Ñұрыптау Sort by T&racker &Трекер бойынша Ñұрыптау Message &Log &Хабарламалар журналы &Statistics &СтатиÑтика &Contents Құра&маÑÑ‹ &About Re&verse Sort Order Ке&рі Ñұрыптау &Name &Ðты &Files &Файлдар &Tracker &Трекер Total Ratio Жалпы рейтинг Session Ratio СеÑÑÐ¸Ñ Ñ€ÐµÐ¹Ñ‚Ð¸Ð½Ð³Ñ– Total Transfer Жалпы таратылған Session Transfer ОÑÑ‹ ÑеÑÑиÑда таратылған &Main Window &БаÑты терезе Tray &Icon &Change Session... Choose Session Start a local session or connect to a running session Set &Location... &ОрналаÑуын көрÑету... &Copy Magnet Link to Clipboard Magnet Ñілте&меÑін алмаÑу буферіне көшіру Open &URL... &Donate ÐÒ›&шалай көмектеÑу Start &Now Bypass the queue and start now Move to &Top Move &Up Move &Down Move to &Bottom Sort by &Queue Limit Download Speed Қабылдау жылдамдығын шектеу Unlimited Шектелмеген Limited at %1 Limit Upload Speed Тарату жылдамдығын шектеу Stop Seeding at Ratio КелеÑÑ– рейтингке жеткенде таратуды тоқтату Seed Forever Мәңгі тарату Stop at Ratio (%1) Рейтингте тоқтату (%1) - %1:%2 Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); notice that leading space (before the dash) is included here - %1:%2 Idle ІÑÑіз Ratio: %1 Рейтингі: %1 Down: %1, Up: %2 Қабылданған: %1, Таратылған: %2 Torrent Files (*.torrent);;All Files (*.*) Show &options dialog Ба&птаулар терезеÑін көрÑету Open Torrent Speed Limits Жылдамдықты шектеу Network Error Click to disable Temporary Speed Limits (%1 down, %2 up) Click to enable Temporary Speed Limits (%1 down, %2 up) Remove torrent? Торрентт(ерд)Ñ– өшіру керек пе? Delete this torrent's downloaded files? Бұл торрентт(ерд)Ñ–Ò£ жүктелген файлдарын өшіру керек пе? Remove %Ln torrent(s)? Showing %L1 of %Ln torrent(s) Delete these %Ln torrent(s)' downloaded files? Once removed, continuing the transfer will require the torrent file or magnet link. ӨшірілÑе, торренті қайта жалғаÑтыру үшін торрент файлы не ÑілтемеÑÑ– керек болады. Once removed, continuing the transfers will require the torrent files or magnet links. ӨшірілÑе, торренті қайта жалғаÑтыру үшін торрент файлдар не ÑілтемеÑÑ– керек болады. This torrent has not finished downloading. Бұл торренттің жүктелуі аÑқталмаған. These torrents have not finished downloading. Бұл торренттердің жүктелуі аÑқталмаған. This torrent is connected to peers. Бұл торрент тораптарға қоÑулы тұр. These torrents are connected to peers. Бұл торренттер тораптарға қоÑулы тұр. One of these torrents is connected to peers. Some of these torrents are connected to peers. One of these torrents has not finished downloading. Бұл торренттердің біреуінің жүктелуі аÑқталмаған. Some of these torrents have not finished downloading. %1 has not responded yet %1 is responding %1 last responded %2 ago %1 is not responding MakeDialog New Torrent Жаңа торрент <i>No source selected<i> <i>Көзі таңдалмаған</i> %Ln File(s) %Ln Piece(s) %1 in %2; %3 @ %4 Files Файлдар Sa&ve to: Қа&йда Ñақтау: Source f&older: Бу&мадан жаÑау: Source &file: Фай&лдан жаÑау: Properties ҚаÑиеттері &Trackers: &Трекерлер: To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. Қор URL-ын қоÑу үшін оны баÑтапқы URL жолынан кейін қоÑыңыз. БаÑқа баÑтапқы URL қоÑу үшін оны бір Ð±Ð¾Ñ Ð¶Ð¾Ð»Ð´Ð°Ð½ кейін қоÑыңыз. Co&mment: К&омментарийі: &Private torrent &Жабық торрент MakeProgressDialog New Torrent Жаңа торрент Creating "%1" Created "%1"! ЖаÑалды %1! Error: invalid announce URL "%1" Қате: Ð´Ò¯Ñ€Ñ‹Ñ ÐµÐ¼ÐµÑ Ð°Ð½Ð¾Ð½Ñ URL-Ñ‹ %1 Cancelled Ð‘Ð°Ñ Ñ‚Ð°Ñ€Ñ‚Ñ‹Ð»Ð´Ñ‹ Error reading "%1": %2 "%1" оқу қатеÑÑ–: %2 Error writing "%1": %2 "%1" жазу қатеÑÑ–: %2 OptionsDialog Open Torrent Open Torrent from File Open Torrent from URL or Magnet Link &Source: &Destination folder: &МақÑат бумаÑÑ‹: High Жоғары Normal Қалыпты Low Төмен &Priority: S&tart when added &Verify Local Data Жергі&лікті мәліметтерді текÑеріп шығу Mo&ve .torrent file to the trash ҚоÑқаннан &кейін .torrent файлын Ò›Ð¾Ò›Ñ‹Ñ ÑˆÐµÐ»ÐµÐ³Ñ–Ð½Ðµ таÑтау Torrent Files (*.torrent);;All Files (*.*) Select Destination МақÑат бумаÑын таңдаңыз PathButton (None) (ЕшнәрÑе) Select Folder Бумадан жаÑау Select File Файлдан жаÑау PrefsDialog Use &authentication &ÐутентификациÑны қолдану &Username: &Пайдаланушы аты: Pass&word: Па&роль: &Open web client Ð’&еб клиентті ашу Addresses: ÐдреÑтері: Speed Limits Жылдамдықты шектеу <small>Override normal speed limits manually or at scheduled times</small> <small>Қалыпты жылдамдық шектеулерін қолмен не жоÑпарланған уақытта Ñөндіреді</small> &Scheduled times: &ЖоÑпарланған уақыты: &On days: Кү&ндерде: Every Day Күнде Weekdays Ð–Ò±Ð¼Ñ‹Ñ ÐºÒ¯Ð½Ð´ÐµÑ€Ñ– Weekends Ð”ÐµÐ¼Ð°Ð»Ñ‹Ñ ÐºÒ¯Ð½Ð´ÐµÑ€Ñ– Sunday ЖекÑенбі Monday ДүйÑенбі Tuesday СейÑенбі Wednesday СәрÑенбі Thursday БейÑенбі Friday Жұма Saturday Saturday Port is <b>open</b> Порт <b>ашық</b> Port is <b>closed</b> Порт <b>жабық</b> Incoming Peers ÐšÑ–Ñ€Ñ–Ñ Ð±Ð°Ð¹Ð»Ð°Ð½Ñ‹Ñтар Status unknown Қалып-күйі белгіÑіз &Port for incoming connections: ÐšÑ–Ñ€Ñ–Ñ Ð±Ð°Ð¹Ð»Ð°Ð½Ñ‹Ñтар &порты: Use UPnP or NAT-PMP port &forwarding from my router UPnP Ð½ÐµÐ¼ÐµÑ NAT-PMP порттарды бағ&дарлауды қолдану Options Баптаулары Enable &uTP for peer connections uTP is a tool for reducing network congestion. minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minute(s) ago Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) Automatically add .torrent files &from: Show the Torrent Options &dialog &Start added torrents Mo&ve the .torrent file to the trash Download Queue Ma&ximum active downloads: Incomplete Seeding Таратылуда Remote <i>Blocklist contains %Ln rule(s)</i> Pick a &random port every time Transmission is started Әр Ñ€&ет Transmission қоÑылғанда, кездейÑоқ портты таңдау Limits Шектеулер Maximum peers per &torrent: Торрент үшін макÑи&малды тораптар Ñаны: Maximum peers &overall: Жал&пы макÑималды тораптар Ñаны: <b>Update succeeded!</b><p>Blocklist now has %Ln rule(s). <b>Update Blocklist</b><p>Getting new blocklist... Blocklist Блоктізім Enable &automatic updates &Ðвтожаңартуға Ñ€Ò±Ò›Ñат беру Allow encryption Шифрлеуге Ñ€Ò±Ñқат беру Prefer encryption Шифрлеуді таңдау Require encryption Шифрлеуді талап ету Privacy Жекелігі &to Desktop Ð–Ò±Ð¼Ñ‹Ñ Ò¯Ñтелі Show Transmission icon in the &notification area Transmission таңбашаÑ&ын трейде көрÑету Te&st Port Портт&Ñ‹ текÑеру Enable &blocklist: Блок&тізімді Ñ–Ñке қоÑу: &Update &Жаңарту &Encryption mode: &Шифрлеу режимі: Remote Control Allow &remote access HTTP &port: Only allow these IP a&ddresses: &Upload: &Download: Alternative Speed Limits U&pload: Do&wnload: Start &minimized in notification area Notification Show a notification when torrents are a&dded Show a notification when torrents &finish Play a &sound when torrents finish Testing TCP Port... Peer Limits Use PE&X to find more peers Тораптарды іздеу үші&н PEX қолдану PEX is a tool for exchanging peer lists with the peers you're connected to. PEX - бұл қоÑылған тораптардан баÑқа тораптар тізімдерін алу құралы. Use &DHT to find more peers Тораптарды Ñ–&здеу үшін DHT қолдану DHT is a tool for finding peers without a tracker. DHT - бұл трекерÑіз-ақ тораптарды іздеу құралы. Use &Local Peer Discovery to find more peers &Тораптарды табу үшін LPD қолдану LPD is a tool for finding peers on your local network. LPD - жергілікті желіңізден пирлерді табу құралы. Encryption Select "Torrent Done" Script Select Incomplete Directory Select Watch Directory Select Destination МақÑат бумаÑын таңдаңыз Adding ҚоÑу Download is i&nactive if data sharing stopped: Please keep this phrase as short as possible, it's curently the longest and influences dialog width Downloading Жүктелуде Append ".&part" to incomplete files' names Толық ÐµÐ¼ÐµÑ Ñ„Ð°Ð¹Ð»Ð´Ð°Ñ€ аттарына ".&part" қоÑып отыру Keep &incomplete files in: ÐÑқтал&маған торренттерді Ñақтау орны: Save to &Location: Қай&да Ñақтау: Call scrip&t when torrent is completed: Торрент аÑқталған кезде Ñкрипт&ті орындау: Stop seeding at &ratio: Рейтинг &мәні келеÑідей болғанда, таратуды тоқтату: Stop seedi&ng if idle for: БелÑенді е&Ð¼ÐµÑ Ð±Ð¾Ð»Ñа, таратуды тоқтату: Transmission Preferences Transmission баптаулары Speed Жылдамдығы Network Желі Not supported by remote sessions QObject Invalid option RelocateDialog Select Location Set Torrent Location Торрент орналаÑуын көрÑетіңіз Set Location ОрналаÑуын көрÑету New &location: &Move from the current folder &Ðғымдағы бумадан жылжыту Local data is &already there Жергілікті мәліметтер ол жерде &болып тұр Session Error Renaming Path <p><b>Unable to rename "%1" as "%2": %3.</b></p> <p>Please correct the errors and try again.</p> Add Torrent Торрентті қоÑу SessionDialog Change Session Source Қайдан Start &Local Session Connect to &Remote Session &Host: &Port: &Authentication required &Username: &Пайдаланушы аты: Pass&word: Па&роль: StatsDialog Statistics СтатиÑтика Current Session Ðғымдағы ÑеÑÑÐ¸Ñ Uploaded: Таратылған: Downloaded: Жүктелген: Ratio: Рейтинг: Duration: Ұзақтығы: Total Жалпы Started %Ln time(s) Torrent Verifying local data Жергілікті мәліметтерді текÑеру Downloading Жүктелуде Seeding Таратылуда Finished ÐÑқталған Paused ÐÑлдатылған Queued for verification Queued for download Queued for seeding Tracker gave a warning: %1 Трекер еÑкерту жіберген: %1 Tracker gave an error: %1 Трекер қате жіберген: %1 Error: %1 Қате: %1 TorrentDelegate Magnetized transfer - retrieving metadata (%1%) First part of torrent progress string; %1 is the percentage of torrent metadata downloaded %1 of %2 (%3%) First part of torrent progress string; %1 is how much we've got, %2 is how much we'll have when done, %3 is a percentage of the two %1 дайын, барлығы %2 (%3%) %1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio, %6 is the ratio we want to reach before we stop uploading %1, барлығы %2 (%3%), %4 таратылды (Рейтингі: %5 МақÑаты: %6) %1 of %2 (%3%), uploaded %4 (Ratio: %5) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio %1, барлығы %2 (%3%), %4 таратылды (Рейтингі: %5) %1, uploaded %2 (Ratio: %3 Goal: %4) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio, %4 is the ratio we want to reach before we stop uploading %1, %2 таратылған (Рейтингі: %3 Шектеуі: %4) %1, uploaded %2 (Ratio: %3) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio %1, %2 таратылған (Рейтингі: %3) - %1 left Second (optional) part of torrent progress string; %1 is duration; notice that leading space (before the dash) is included here - Remaining time unknown Second (optional) part of torrent progress string; notice that leading space (before the dash) is included here Ratio: %1 Рейтингі: %1 Downloading from %Ln peer(s) First part of phrase "Downloading from ... peer(s) and ... web seed(s)" Seeding to %Ln peer(s) - - Downloading metadata from %Ln peer(s) (%1% done) Downloading from %1 of %Ln connected peer(s) First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" and %Ln web seed(s) Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; notice that leading space (before "and") is included here Seeding to %1 of %Ln connected peer(s) Error Қате Verifying local data (%1% tested) Жергілікті мәліметтерді текÑеру (%1% текÑерілген) TrackerDelegate Got a list of%1 %Ln peer(s)%2 %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Peer list request %1timed out%2 %3 ago; will retry %1 and %2 are replaced with HTML markup, %3 is duration Пирлер тізімін Ñұрау %1уақыты бітті%2 %3 бұрын; қайталаймыз Got an error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Қате алынды %1"%2"%3 %4 бұрын No updates scheduled ЖоÑпарланған жаңартулар жоқ Asking for more peers in %1 %1 is duration Көбірек пирлерді Ñұрау, %1 кейін Queued to ask for more peers Көбірек пирлерді Ñұрауда кезекте тұр Asking for more peers now... <small>%1</small> %1 is duration Қазір көбірек пир Ñұралуда... <small>%1</small> Tracker had%1 %Ln seeder(s)%2 First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup and%1 %Ln leecher(s)%2 %3 ago Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup, %3 is duration; notice that leading space (before "and") is included here Tracker had %1no information%2 on peer counts %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Got a scrape error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration %1 %2 %3 scrape қатеÑÑ– алынды, %4 бұрын Asking for peer counts in %1 %1 is duration %1 ішіндегі пирлер Ñаны Ñұрауда Queued to ask for peer counts Пирлер Ñанын Ñұрауда кезекте тұр Asking for peer counts now... <small>%1</small> %1 is duration Пирлер Ñаны қазір Ñұралуда... <small>%1</small> transmission-2.92/qt/translations/PaxHeaders.4960/transmission_pl_PL.ts0000644000000000000000000000013212664476417023233 xustar0030 mtime=1456635151.985496335 30 atime=1456635151.985496335 30 ctime=1457295917.269761477 transmission-2.92/qt/translations/transmission_pl_PL.ts0000644000175000017500000026631112664476417024671 0ustar00mikedldmikedld00000000000000 UTF-8 AboutDialog About Transmission O programie <b style='font-size:x-large'>Transmission %1</b> <b style='font-size:x-large'>Transmission %1</b> A fast and easy BitTorrent client Szybki i Å‚atwy w użyciu klient BitTorrent Copyright (c) The Transmission Project (c) Transmission Project 2005 - 2015 C&redits A&utorzy &License &Licencja Credits Autorzy Application <b>Transmission is a file sharing program.</b> <b>Transmission to program do dzielenia siÄ™ plikami.</b> When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. Kiedy uruchomisz torrent, wszystkie jego dane bÄ™dÄ… dostÄ™pne dla innych. Odpowiadasz za wszystko co udostÄ™pniasz. I &Agree &Zgadzam siÄ™ Torrent Completed UkoÅ„czono pobieranie Torrent Added Dodano torrent DetailsDialog None Nic Mixed Mieszane Unknown Nieznane Finished UkoÅ„czone Paused Wstrzymane Active now Aktywne obecnie %1 ago %1 temu %1 (%Ln pieces @ %2) %1 (%Ln część @ %2) %1 (%Ln części @ %2) %1 (%Ln części @ %2) %1 (%Ln pieces) %1 (%Ln część) %1 (%Ln części) %1 (%Ln części) Private to this tracker -- DHT and PEX disabled Tylko dla tego trackera -- DHT i PEX wyłączone Public torrent Torrent publiczny Created by %1 Stworzony przez %1 Created on %1 Stworzony na %1 Created by %1 on %2 Stworzony przez %1 na %2 Encrypted connection Szyfrowane połączenie Optimistic unchoke Korzystne odblokowywanie Downloading from this peer Pobieranie od tego peera We would download from this peer if they would let us Pobieranie od peera byÅ‚oby możliwe, jeÅ›li pozwoliÅ‚by nam na to. Uploading to peer WysyÅ‚anie do peera We would upload to this peer if they asked WysyÅ‚alibyÅ›my do tego peera, gdyby nas poprosili Peer has unchoked us, but we're not interested Peer odblokowaÅ‚ nas, ale nie jesteÅ›my zainteresowani We unchoked this peer, but they're not interested OdblokowaliÅ›my tego peera, ale nie jest on zainteresowany Peer was discovered through DHT Peer zostaÅ‚ odkryty poprzez DHT Peer was discovered through Peer Exchange (PEX) Peer zostaÅ‚ odkryty poprzez Peer Exchange (PEX) Peer is an incoming connection Peer zainicjowaÅ‚ połączenie minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minuta minut minut Error Błąd Tracker already exists. Tracker już istnieje. %1 (100%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data %1 (100%) %1 of %2 (%3%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data, %2 is overall size of torrent data, %3 is percentage (%1/%2*100) %1 z %2 (%3%) %1 of %2 (%3%), %4 Unverified Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded data (both verified and unverified), %2 is overall size of torrent data, %3 is percentage (%1/%2*100), %4 is amount of downloaded but not yet verified data %1 z %2 (%3%), %4 niezweryfikowane %1 (%2 corrupt) %1 (%2 uszkodzone) %1 (Ratio: %2) %1 (Współczynnik: %2) N/A n/d Peer is connected over uTP Peer jest połączony poprzez uTP Add URL Dodaj URL Add tracker announce URL: Dodaj URL trackera: Invalid URL "%1" NieprawidÅ‚owy URL "%1" Edit URL Edytuj URL Edit tracker announce URL: Edytuj URL trackera: High Wysoki Normal Normalny Low Niski Use Global Settings Użyj ustawieÅ„ globalnych Seed regardless of ratio Seed niezależnie od współczynnika Stop seeding at ratio: Wstrzymaj seed przy współczynniku: Seed regardless of activity Seed niezależnie od aktywnoÅ›ci Stop seeding if idle for: Wstrzymaj seed jeÅ›li nieaktywny przez: Up Do góry Down W dół % % Status Status Address Adres Client Klient Torrent Properties WÅ‚aÅ›ciwoÅ›ci torrenta Information Informacje Activity Aktywność Have: Posiada: Availability: DostÄ™pność: Uploaded: WysÅ‚ane: Downloaded: Pobrane: State: Stan: Running time: Czas trwania: Remaining time: PozostaÅ‚y czas: Last activity: Ostatnia aktywność: Error: Błąd: Details Szczegóły Size: Rozmiar: Location: Lokalizacja: Hash: Hash: Privacy: Prywatność: Origin: Pochodzenie: Comment: Komentarz: Peers Peerowie Tracker Tracker Add Tracker Dodaj tracker Edit Tracker Edytuj tracker Remove Trackers UsuÅ„ trackery Show &more details Pokaż &wiÄ™cej informacji Show &backup trackers Pokaż &zapasowe trackery Files Pliki Options Opcje Speed PrÄ™dkość Honor global &limits Stosuj globalne &ograniczenia Limit &download speed: Ogranicz prÄ™dkość &pobierania: Limit &upload speed: Ogranicz prÄ™dkość &wysyÅ‚ania: Torrent &priority: &Priorytet torrentu: Seeding Limits Ograniczenia seed &Ratio: &Współczynnik: &Idle: &Nieaktywny: Peer Connections Połączenia z peerami &Maximum peers: &Maksymalna ilość peerów: FileAdded Add Torrent Dodaj torrent <p><b>Unable to add "%1".</b></p><p>It is a duplicate of "%2" which is already added.</p> <p><b>Dodanie "%1" jest niemożliwe.</b></p><p>Jest to duplikat"%2".</p> Error Adding Torrent Błąd podczas dodawania torrentu FileTreeItem Low Niski High Wysoki Normal Normalny Mixed Mieszany FileTreeModel File Plik Size Rozmiar Progress PostÄ™p Download Pobieranie Priority Priorytet FileTreeView Check Selected Uncheck Selected Only Check Selected Priority Priorytet Open Otwórz Rename... FilterBar All Wszystkie Active Aktywne Downloading Pobierane Seeding Seedowane Paused Wstrzymane Finished UkoÅ„czone Verifying Weryfikowanie Error Błąd Show: Pokaż: FilterBarLineEdit Search... Szukanie... Formatter B/s B/s kB/s kB/s MB/s MB/s GB/s GB/s TB/s TB/s B B kB kB MB MB GB GB TB TB KiB KiB MiB MiB GiB GiB TiB TiB Unknown Nieznane None Nic %1 %2 %1 %2 %Ln day(s) %Ln dzieÅ„ %Ln dni %Ln dni %Ln hour(s) %Ln godzina %Ln godziny %Ln godzin %Ln minute(s) %Ln minuta %Ln minut %Ln minut %Ln second(s) %Ln sekunda %Ln sekundy %Ln sekund %1, %2 %1, %2 FreeSpaceLabel <i>Calculating Free Space...</i> <i>Obliczanie wolnego miejsca na dysku...</i> %1 free Wolne %1 LicenseDialog License Licencja MainWindow Transmission Transmission &Torrent &Torrent &Edit &Edytuj &Help &Pomoc &View &WyglÄ…d &File &Plik &New... &Nowy... Create a new torrent Stwórz nowy torrent &Properties &WÅ‚aÅ›ciwoÅ›ci Show torrent properties Pokaż wÅ‚aÅ›ciwoÅ›ci torrentu Open the torrent's folder Otwórz folder torrentu Queue Kolejka &Open... &Otwórz... Open Otwórz Open a torrent Otwórz torrent Open Fold&er Otwórz fold&er &Start &Uruchom Start torrent Uruchom torrent Ask Tracker for &More Peers Zapytaj tracker o &wiÄ™cej peerów Ask tracker for more peers Zapytaj tracker o wiÄ™cej peerów &Pause &Wstrzymaj Pause torrent Wstrzymaj torrent &Verify Local Data &Weryfikuj pliki lokalne Verify local data Weryfikuj pliki lokalne &Remove &UsuÅ„ Remove torrent UsuÅ„ torrent &Delete Files and Remove &UsuÅ„ torrent oraz pliki z dysku Remove torrent and delete its files UsuÅ„ torrent oraz pliki z dysku &Start All &Uruchom wszystkie &Pause All &Wstrzymaj wszystkie &Quit &ZakoÅ„cz &Select All &Zaznacz wszystkie &Deselect All &Odznacz wszystkie &Preferences &Ustawienia &Compact View &Tryb kompaktowy Compact View Tryb kompaktowy &Toolbar &Pasek narzÄ™dzi &Filterbar &Pasek filtrów &Statusbar &Pasek stanu Sort by &Activity Sortuj wedÅ‚ug &aktywnoÅ›ci Sort by A&ge Sortuj wedÅ‚ug &czasu dodania Sort by Time &Left Sortuj wedÅ‚ug &czasu do ukoÅ„czenia Sort by &Name Sortuj wedÅ‚ug &nazwy Sort by &Progress Sortuj wedÅ‚ug &postÄ™pu Sort by Rati&o Sortuj wedÅ‚ug &współczynnika udostÄ™pniania Sort by Si&ze Sortuj wedÅ‚ug &rozmiaru pliku Sort by Stat&e Sortuj wedÅ‚ug &stanu Sort by T&racker Sortuj wedÅ‚ug &trackera Message &Log &Dziennik wiadomoÅ›ci &Statistics &Statystyki &Contents &Zawartość &About &O Re&verse Sort Order &Odwróć porzÄ…dek sortowania &Name &Nazwa &Files &Pliki &Tracker &Tracker Total Ratio CaÅ‚kowity współczynnik dzielenia Session Ratio Współczynnik sesji Total Transfer CaÅ‚kowity transfer Session Transfer Transfer sesji &Main Window &Główne okno Tray &Icon &Ikona zasobnika &Change Session... &ZmieÅ„ sesjÄ™... Choose Session Start a local session or connect to a running session Wybierz sesjÄ™ Set &Location... Ustaw &lokacjÄ™... &Copy Magnet Link to Clipboard &Skopiuj odnoÅ›nik magnet do schowka Open &URL... Otwórz &URL... &Donate &Podaruj Start &Now Uruchom &teraz Bypass the queue and start now PomiÅ„ kolejkÄ™ i uruchom teraz Move to &Top PrzenieÅ› na &poczÄ…tek Move &Up PrzenieÅ› &wyżej Move &Down PrzenieÅ› &w dół Move to &Bottom PrzenieÅ› na &koniec Sort by &Queue Sortuj wedÅ‚ug &kolejki Limit Download Speed Ogranicz prÄ™dkość pobierania Unlimited Nieograniczona Limited at %1 Ograniczona do %1 Limit Upload Speed Ogranicz prÄ™dkość wysyÅ‚ania Stop Seeding at Ratio Wstrzymaj seed przy współczynniku Seed Forever Seed w nieskoÅ„czoność Stop at Ratio (%1) Wstrzymaj przy współczynniku (%1) - %1:%2 Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); notice that leading space (before the dash) is included here - %1:%2 Idle Bezczynny Ratio: %1 Współczynnik udostÄ™pniania: %1 Down: %1, Up: %2 P: %1, W: %2 Torrent Files (*.torrent);;All Files (*.*) Pliki torrent (*.torrent);;Wszystkie pliki (*.*) Show &options dialog Pokaż &opcje dialogowe Open Torrent Otwórz torrent Speed Limits Ograniczenia prÄ™dkoÅ›ci Network Error Błąd sieci Click to disable Temporary Speed Limits (%1 down, %2 up) Kliknij by wyłączyć tymczasowe ograniczenia prÄ™dkoÅ›ci (%1 P., %2 W.) Click to enable Temporary Speed Limits (%1 down, %2 up) Kliknij by włączyć tymczasowe ograniczenia prÄ™dkoÅ›ci (%1 P., %2 W.) Remove torrent? Usunąć torrent? Delete this torrent's downloaded files? Usunąć już pobrane pliki z tego torrentu? Remove %Ln torrent(s)? Usunąć %Ln torrent? Usunąć %Ln torrenty? Usunąć %Ln torrentów? Showing %L1 of %Ln torrent(s) Delete these %Ln torrent(s)' downloaded files? Usunąć już pobrane pliki tego %Ln torrentu? Usunąć już pobrane pliki tych %Ln torrentów? Usunąć już pobrane pliki tych %Ln torrentów? Once removed, continuing the transfer will require the torrent file or magnet link. Po usuniÄ™ciu, kontynuowanie tego transferu bÄ™dzie wymagać pliku torrent lub odnoÅ›nika magnet. Once removed, continuing the transfers will require the torrent files or magnet links. Po usuniÄ™ciu, kontynuowanie tych transferów bÄ™dzie wymagać plików torrent lub odnoÅ›ników magnet. This torrent has not finished downloading. Pobieranie tego torrentu jeszcze siÄ™ nie zakoÅ„czyÅ‚o. These torrents have not finished downloading. Pobieranie tych torrentów nie zostaÅ‚o jeszcze zakoÅ„czone. This torrent is connected to peers. Ten torrent jest połączony z peerami. These torrents are connected to peers. Te torrenty sÄ… połączone z peerami. One of these torrents is connected to peers. Jeden z tych torrentów jest połączony z peerami. Some of these torrents are connected to peers. Niektóre z tych torrentów sÄ… połączone z peerami One of these torrents has not finished downloading. Pobieranie jednego z tych torrentów nie zostaÅ‚o jeszcze ukoÅ„czone. Some of these torrents have not finished downloading. Pobieranie niektórych z tych torrentów nie zostaÅ‚o jeszcze ukoÅ„czone. %1 has not responded yet %1 dotÄ…d nie odpowiedziaÅ‚o %1 is responding %1 odpowiada %1 last responded %2 ago %1 odpowiedziaÅ‚ %2 temu %1 is not responding %1 nie odpowiada MakeDialog New Torrent Nowy torrent <i>No source selected<i> <i>Nie wykryto źródÅ‚a<i> %Ln File(s) %Ln Plik %Ln Pliki %Ln Pliki %Ln Piece(s) %Ln część %Ln części %Ln części %1 in %2; %3 @ %4 %1 w %2; %3 @ %4 Files Pliki Sa&ve to: Za&pisz w: Source f&older: F&older źródÅ‚owy: Source &file: &Plik źródÅ‚owy: Properties WÅ‚aÅ›ciwoÅ›ci &Trackers: &Trackery: To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. By dodać zapasowy URL, dodaj go do linii po głównym URL. By dodać inny główny URL, wpisz go po pustej linii. Co&mment: Ko&mentarz: &Private torrent &Prywatny torrent MakeProgressDialog New Torrent Nowy torrent Creating "%1" Tworzenie "%1" Created "%1"! Stworzono "%1"! Error: invalid announce URL "%1" Błąd: nieprawidÅ‚owy URL "%1" Cancelled Anulowano Error reading "%1": %2 Błąd odczytu "%1": %2 Error writing "%1": %2 Błąd zapisu "%1": %2 OptionsDialog Open Torrent Otwarto torrent Open Torrent from File Otwórz torrent z pliku Open Torrent from URL or Magnet Link Otwórz torrent z URL lub odnoÅ›nika Magnet &Source: &ŹródÅ‚o: &Destination folder: &Docelowy folder: High Wysoki Normal Normalny Low Niski &Priority: &Priorytet: S&tart when added U&ruchom gdy dodany &Verify Local Data &Weryfikuj pliki lokalne Mo&ve .torrent file to the trash Prz&enieÅ› plik .torrent do kosza Torrent Files (*.torrent);;All Files (*.*) Pliki torrent (*.torrent);;All Files (*.*) Select Destination Wybierz miejsce zapisu PathButton (None) (Nic) Select Folder Wybierz folder Select File Wybierz plik PrefsDialog Use &authentication Użyj &uwierzytelniania &Username: &Nazwa użytkownika: Pass&word: Has&Å‚o: &Open web client &Otwórz klient sieci web Addresses: Adresy: Speed Limits Ograniczenia prÄ™dkoÅ›ci <small>Override normal speed limits manually or at scheduled times</small> <small>ZmieÅ„ limity prÄ™dkoÅ›ci rÄ™cznie lub w zaplanowanym czasie</small> &Scheduled times: &Zaplanowane ograniczenia: &On days: &W: Every Day Każdy dzieÅ„ Weekdays Dni robocze Weekends Weekendy Sunday Niedziele Monday PoniedziaÅ‚ki Tuesday Wtorki Wednesday Åšrody Thursday Czwartki Friday PiÄ…tki Saturday Soboty Port is <b>open</b> Port jest <b>otwarty</b> Port is <b>closed</b> Port jest <b>zamkniÄ™ty</b> Incoming Peers Połączenia z peerami Status unknown Status nieznany &Port for incoming connections: &Port dla połączeÅ„ przychodzÄ…cych: Use UPnP or NAT-PMP port &forwarding from my router Użyj &przekierowania UPnP lub NAT-PMP portów z mojego routera Options Opcje Enable &uTP for peer connections Aktywuj &uTP dla połączeÅ„ z peerami uTP is a tool for reducing network congestion. uTP jest narzÄ™dziem redukujÄ…cym przeciążenie sieci. minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minuta minuty minut minute(s) ago Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) minutÄ™ temu minuty temu minut temu Automatically add .torrent files &from: Automatycznie dodaj pliki .torrent &z: Show the Torrent Options &dialog Pokaż opcje &dialogowe torrentu &Start added torrents &Uruchom dodane torrenty Mo&ve the .torrent file to the trash Prze&nieÅ› pliki .torrent do kosza Download Queue Kolejka pobierania Ma&ximum active downloads: Ma&ksymalna liczba aktywnych pobieraÅ„: Incomplete Niekompletne Seeding Seed Remote Zdalne <i>Blocklist contains %Ln rule(s)</i> <i>Bloklista zawiera %Ln zasadÄ™</i> <i>Bloklista zawiera %Ln zasady</i> <i>Bloklista zawiera %Ln zasad</i> Pick a &random port every time Transmission is started Wybierz &losowy port przy każdym uruchomieniu Transmission Limits Ograniczenia Maximum peers per &torrent: Maksymalna ilość peerów na &torrent: Maximum peers &overall: Maksymalna &caÅ‚kowita ilość peerów: <b>Update succeeded!</b><p>Blocklist now has %Ln rule(s). <b>Aktualizacja pomyÅ›lna!</b><p>Bloklista ma teraz %Ln zasadÄ™. <b>Aktualizacja pomyÅ›lna!</b><p>Bloklista ma teraz %Ln zasady. <b>Aktualizacja pomyÅ›lna!</b><p>Bloklista ma teraz %Ln zasad. <b>Update Blocklist</b><p>Getting new blocklist... <b>Aktualizowanie bloklisty</b><p>Pobieranie nowej listy... Blocklist Bloklista Enable &automatic updates Aktywuj &automatyczne aktualizacje Allow encryption Pozwól na szyfrowanie Prefer encryption Preferuj szyfrowanie Require encryption Wymagaj szyfrowania Privacy Prywatność &to &do Desktop Pulpit Show Transmission icon in the &notification area Pokaż ikonÄ™ programu w &zasobniku systemowym Te&st Port Prze&testuj port Enable &blocklist: Aktywuj &bloklistÄ™ &Update &Aktualizuj &Encryption mode: &Szyfrowanie: Remote Control Zdalna kontrola Allow &remote access Pozwól na &zdalny dostÄ™p HTTP &port: &Port HTTP: Only allow these IP a&ddresses: Zezwalaj tylko tym a&dresom IP: &Upload: &WysyÅ‚anie: &Download: &Pobieranie: Alternative Speed Limits Alternatywne ograniczenia prÄ™dkoÅ›ci U&pload: Wy&syÅ‚anie: Do&wnload: Po&bieranie: Start &minimized in notification area Uruchom &zminimalizowany w zasobniku Notification Powiadomienia Show a notification when torrents are a&dded Pokaż powiadomienie gdy torrenty sÄ… do&dawane Show a notification when torrents &finish Pokaż powiadomienie gdy torrenty sÄ… &ukoÅ„czone Play a &sound when torrents finish Powiadomienie &dźwiÄ™kowe gdy torrent zostanie ukoÅ„czony Testing TCP Port... Testowanie portu TCP... Peer Limits Ograniczenia peerów Use PE&X to find more peers Użyj PE&X by znaleźć wiÄ™cej peerów PEX is a tool for exchanging peer lists with the peers you're connected to. PEX jest narzÄ™dziem do wymiany list peerów pomiÄ™dzy tymi peerami, z którymi jesteÅ› połączony. Use &DHT to find more peers Użyj &DHT by znaleźć wiÄ™cej peerów DHT is a tool for finding peers without a tracker. DHT jest narzÄ™dziem do wyszukiwania peerów bez trackera. Use &Local Peer Discovery to find more peers Użyj &Local Peer Discovery by znaleźć wiÄ™cej peerów. LPD is a tool for finding peers on your local network. LDP jest narzÄ™dziem do wyszukiwania peerów w Twojej sieci lokalnej. Encryption Szyfrowanie Select "Torrent Done" Script Wybierz skrypt "Torrent ukoÅ„czony" Select Incomplete Directory Wybierz folder dla plików tymczasowych Select Watch Directory Wybierz folder do obserwacji Select Destination Wybierz folder docelowy Adding Dodawanie Download is i&nactive if data sharing stopped: Please keep this phrase as short as possible, it's curently the longest and influences dialog width Pobieranie jest nie&aktywne jeÅ›li wstrzymano wymianÄ™ plików: Downloading Pobieranie Append ".&part" to incomplete files' names Dodaj ".&part" do nazw niekompletnych plików Keep &incomplete files in: Przechowuj &niekompletne pliki w: Save to &Location: Zapisz do &lokalizacji: Call scrip&t when torrent is completed: Uruchom skryp&t gdy torrent zostanie ukoÅ„czony: Stop seeding at &ratio: Wstrzymaj seed przy &współczynniku: Stop seedi&ng if idle for: Wstrzymaj seed jeÅ›li &nieaktywny przez: Transmission Preferences Ustawienia Transmission Speed PrÄ™dkość Network Sieć Not supported by remote sessions Niewspierane w sesjach zdalnych QObject Invalid option NieprawidÅ‚owa opcja RelocateDialog Select Location Wybierz lokalizacjÄ™ Set Torrent Location Wybierz lokalizacjÄ™ torrentu Set Location Ustaw lokalizacjÄ™ New &location: Nowa &lokalizacja: &Move from the current folder &PrzenieÅ› z obecnego folderu Local data is &already there Pliki &już siÄ™ tam znajdujÄ… Session Error Renaming Path Błąd podczas zmieniania nazwy <p><b>Unable to rename "%1" as "%2": %3.</b></p> <p>Please correct the errors and try again.</p> <p><b>Zmiana nazwy "%1" na "%2": %3 byÅ‚a niemożliwa.</b></p> <p>Popraw błędy i spróbuj ponownie.</p> Add Torrent Dodaj torrent SessionDialog Change Session ZmieÅ„ sesjÄ™ Source ŹródÅ‚o Start &Local Session Uruchom &lokalnÄ… sesjÄ™ Connect to &Remote Session Połącz z sesjÄ… &zdalnÄ… &Host: &Host: &Port: &Port: &Authentication required &Uwierzytelnienie wymagane &Username: &Nazwa użytkownika: Pass&word: Has&Å‚o: StatsDialog Statistics Statystyki Current Session Obecna sesja Uploaded: WysÅ‚ano: Downloaded: Pobrano: Ratio: Współczynnik udostÄ™pniania: Duration: Czas trwania: Total CaÅ‚kowicie Started %Ln time(s) Uruchomiono %Ln raz Uruchomiono %Ln razy Uruchomiono %Ln razy Torrent Verifying local data Weryfikowanie plików lokalnych Downloading Pobieranie Seeding Seed Finished UkoÅ„czono Paused Wstrzymano Queued for verification Weryfikowanie dodano do kolejki dziaÅ‚aÅ„ Queued for download Pobieranie dodano do kolejki dziaÅ‚aÅ„ Queued for seeding Seed dodano do kolejki dziaÅ‚aÅ„ Tracker gave a warning: %1 Tracker wysÅ‚aÅ‚ ostrzeżenie: %1 Tracker gave an error: %1 Tracker wysÅ‚aÅ‚ błąd: %1 Error: %1 Błąd: %1 TorrentDelegate Magnetized transfer - retrieving metadata (%1%) First part of torrent progress string; %1 is the percentage of torrent metadata downloaded Transfer magnet - odbieranie metadanych (%1%) %1 of %2 (%3%) First part of torrent progress string; %1 is how much we've got, %2 is how much we'll have when done, %3 is a percentage of the two %1 z %2 (%3%) %1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio, %6 is the ratio we want to reach before we stop uploading %1 z %2 (%3%), wysÅ‚ano %4 (Współczynnik: %5 Cel: %6) %1 of %2 (%3%), uploaded %4 (Ratio: %5) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio %1 z %2 (%3%), wysÅ‚ano %4 (Współczynnik: %5) %1, uploaded %2 (Ratio: %3 Goal: %4) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio, %4 is the ratio we want to reach before we stop uploading %1, wysÅ‚ano %2 (Współczynnik: %3 Cel: %4) %1, uploaded %2 (Ratio: %3) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio %1, wysÅ‚ano %2 (Współczynnik: %3) - %1 left Second (optional) part of torrent progress string; %1 is duration; notice that leading space (before the dash) is included here - pozostaÅ‚o %1 - Remaining time unknown Second (optional) part of torrent progress string; notice that leading space (before the dash) is included here - PozostaÅ‚y czas nieznany Ratio: %1 Współczynnik: %1 Downloading from %Ln peer(s) First part of phrase "Downloading from ... peer(s) and ... web seed(s)" Pobieranie od %Ln peer Pobieranie od %Ln peerów Pobieranie od %Ln peerów Seeding to %Ln peer(s) Seed do %Ln peera Seed do %Ln peerów Seed do %Ln peerów - - Downloading metadata from %Ln peer(s) (%1% done) Pobieranie metadanych od %Ln peer (ukoÅ„czono %1%) Pobieranie metadanych od %Ln peerów (ukoÅ„czono %1%) Pobieranie metadanych od %Ln peerów (ukoÅ„czono %1%) Downloading from %1 of %Ln connected peer(s) First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" Pobieranie od %1 z %Ln połączonych peerów Pobieranie od %1 z %Ln połączonych peerów Pobieranie od %1 z %Ln połączonych peerów and %Ln web seed(s) Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; notice that leading space (before "and") is included here i %Ln web seed i %Ln web seedy i %Ln web seedów Seeding to %1 of %Ln connected peer(s) Seed do %1 z %Ln połączonych peerów Seed do %1 z %Ln połączonych peerów Seed do %1 z %Ln połączonych peerów Error Błąd Verifying local data (%1% tested) Weryfikowanie plików lokalnych (%1% sprawdzonych) TrackerDelegate Got a list of%1 %Ln peer(s)%2 %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Otrzymano listÄ™ od%1 %Ln peera%2 %3 temu Otrzymano listÄ™ od%1 %Ln peerów%2 %3 temu Otrzymano listÄ™ od%1 %Ln peerów%2 %3 temu Peer list request %1timed out%2 %3 ago; will retry %1 and %2 are replaced with HTML markup, %3 is duration Zażądano listÄ™ peerów, ale %1przekroczony zostaÅ‚ czas odpowiedzi%2 %3 temu; nastÄ…pi ponowna próba Got an error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Otrzymano błąd %1"%2"%3 %4 temu No updates scheduled Å»adne aktualizacje nie sÄ… zaplanowane Asking for more peers in %1 %1 is duration Zapytanie o wiÄ™cej peerów w %1 Queued to ask for more peers Zapytanie o wiÄ™cej peerów dodano do kolejki Asking for more peers now... <small>%1</small> %1 is duration Pytanie o wiÄ™cej peerów... <small>%1</small> Tracker had%1 %Ln seeder(s)%2 First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup Na trackerze byÅ‚%1 %Ln seed%2 Na trackerze byÅ‚o%1 %Ln seedów%2 Na trackerze byÅ‚o%1 %Ln seedów%2 and%1 %Ln leecher(s)%2 %3 ago Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup, %3 is duration; notice that leading space (before "and") is included here i%1 %Ln leech%2 %3 temu i%1 %Ln leech%2 %3 temu i%1 %Ln leech%2 %3 temu Tracker had %1no information%2 on peer counts %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Od trackera %1nie byÅ‚o informacji%2 o iloÅ›ci peerów %3 temu Got a scrape error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Otrzymano błąd w zapytaniu %1"%2"%3 %4 temu Asking for peer counts in %1 %1 is duration Pytanie o ilość peerów w %1 Queued to ask for peer counts Zapytanie o ilość peerów jest w kolejce Asking for peer counts now... <small>%1</small> %1 is duration Pytanie o ilość peerów... <small>%1</small> transmission-2.92/qt/translations/PaxHeaders.4960/transmission_lt.ts0000644000000000000000000000013212664476417022644 xustar0030 mtime=1456635151.993496472 30 atime=1456635151.993496472 30 ctime=1457295917.277761613 transmission-2.92/qt/translations/transmission_lt.ts0000644000175000017500000026752412664476417024311 0ustar00mikedldmikedld00000000000000 UTF-8 AboutDialog About Transmission Apie „Transmission“ <b style='font-size:x-large'>Transmission %1</b> <b style='font-size:x-large'>Transmission %1</b> A fast and easy BitTorrent client Sparti ir paprasta „BitTorrent“ klientinÄ— programa Copyright (c) The Transmission Project © „Transmission“ projektas C&redits &PadÄ—kos &License &Licencija Credits PadÄ—kos Application <b>Transmission is a file sharing program.</b> <b>Transmission yra failų dalinimosi programa.</b> When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. Kai vykdysite torentÄ…, jo duomenys, dalinimosi tikslais, bus prieinami kitiems. Bet koks turinys, kuriuo dalinatÄ—s, yra tik jÅ«sų paÄių atsakomybÄ—. I &Agree AÅ¡ &sutinku Torrent Completed Torento siuntimas užbaigtas Torrent Added Torentas pridÄ—tas DetailsDialog None nÄ—ra Mixed įvairuoja Unknown nežinomas Finished baigtas Paused pristabdytas Active now aktyvus dabar %1 ago prieÅ¡ %1 %1 (%Ln pieces @ %2) %1 (%Ln dalis po %2) %1 (%Ln dalys po %2) %1 (%Ln dalių po %2) %1 (%Ln pieces) %1 (%Ln dalis) %1 (%Ln dalys) %1 (%Ln dalių) Private to this tracker -- DHT and PEX disabled privatus Å¡iam sekikliui – DHT ir PEX funkcijos iÅ¡jungtos Public torrent vieÅ¡as torentas Created by %1 sukurtas naudojant „%1“ Created on %1 sukurtas %1 Created by %1 on %2 sukurtas %2 naudojant „%1“ Encrypted connection Å ifruota jungtis Optimistic unchoke Optimistinis atlaisvinimas Downloading from this peer AtsiunÄiama iÅ¡ Å¡io siuntÄ—jo We would download from this peer if they would let us Siųstume iÅ¡ Å¡io siuntÄ—jo, jei jis leistų Uploading to peer IÅ¡siunÄiama Å¡iam siuntÄ—jui We would upload to this peer if they asked Siųstume Å¡iam siuntÄ—jui, jei jis papraÅ¡ytų Peer has unchoked us, but we're not interested SiuntÄ—jas mus atlaisvino, taÄiau tai mÅ«sų nedomina We unchoked this peer, but they're not interested Mes atlaisvinome šį siuntÄ—jÄ…, taÄiau tai jo nedomina Peer was discovered through DHT SiuntÄ—jas aptiktas naudojant DHT Peer was discovered through Peer Exchange (PEX) SiuntÄ—jas aptiktas naudojant „Peer Exchange“ (PEX) Peer is an incoming connection SiuntÄ—jas yra įeinantis ryÅ¡ys minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minutÄ— minutÄ—s minuÄių Error Klaida Tracker already exists. Å is sekiklis jau naudojamas. %1 (100%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data %1 (100%) %1 of %2 (%3%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data, %2 is overall size of torrent data, %3 is percentage (%1/%2*100) %1 iÅ¡ %2 (%3%) %1 of %2 (%3%), %4 Unverified Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded data (both verified and unverified), %2 is overall size of torrent data, %3 is percentage (%1/%2*100), %4 is amount of downloaded but not yet verified data %1 iÅ¡ %2 (%3%), %4 nepatikrinta %1 (%2 corrupt) %1 (%2 sugadinta) %1 (Ratio: %2) %1 (santykis: %2) N/A N/D Peer is connected over uTP SiuntÄ—jas naudoja µTP Add URL URL pridÄ—jimas Add tracker announce URL: Ä®veskite pridedamo sekiklio skelbimo URL: Invalid URL "%1" Klaidingas URL adresas „%1“ Edit URL URL taisymas Edit tracker announce URL: Pataisykite sekiklio skelbimo URL: High aukÅ¡tas Normal normalus Low žemas Use Global Settings naudoti visuotinius parametrus Seed regardless of ratio skleisti nepaisant santykio Stop seeding at ratio: nebeskleisti esant santykiui: Seed regardless of activity skleisti nepaisant aktyvumo Stop seeding if idle for: Nebeskleisti, jei pasyvus: Up IÅ¡siųsta Down Atsiųsta % % Status BÅ«sena Address Adresas Client Programa Torrent Properties Torento(-ų) savybÄ—s Information SavybÄ—s Activity Aktyvumas Have: Turima: Availability: Pasiekiamumas: Uploaded: IÅ¡siųsta: Downloaded: Atsiųsta: State: BÅ«sena: Running time: Veikimo laikas: Remaining time: LikÄ™s laikas: Last activity: PaskutinÄ— veikla: Error: Klaida: Details IÅ¡samiau Size: Dydis: Location: Vieta: Hash: MaiÅ¡a: Privacy: Privatumas: Origin: KilmÄ—: Comment: Komentaras: Peers SiuntÄ—jai Tracker Sekiklis Add Tracker PridÄ—ti sekiklį Edit Tracker Redaguoti sekiklį Remove Trackers Å alinti sekiklius Show &more details Rodyti &iÅ¡samesnÄ™ informacijÄ… Show &backup trackers Rodyti &atsarginius sekiklius Files Failai Options Nuostatos Speed Greitis Honor global &limits Paisyti &visuotinių apribojimų Limit &download speed: Riboti &atsiuntimo greitį: Limit &upload speed: Riboti i&Å¡siuntimo greitį: Torrent &priority: Torento p&rioritetas: Seeding Limits Sklaidos apribojimai &Ratio: &Santykis: &Idle: &Pasyvumas: Peer Connections SiuntÄ—jų ryÅ¡iai &Maximum peers: &Daugiausia galimų siuntÄ—jų: FileAdded Add Torrent Torento pridÄ—jimas <p><b>Unable to add "%1".</b></p><p>It is a duplicate of "%2" which is already added.</p> <p><b>Nepavyko pridÄ—ti "%1".</b></p><p>Tai yra jau pridÄ—to "%2" dublikatas.</p> Error Adding Torrent Klaida pridedant torentÄ… FileTreeItem Low žemas High AukÅ¡tas Normal Normalus Mixed MaiÅ¡yta FileTreeModel File Failas Size Dydis Progress Pažanga Download Atsiuntimas Priority Prioritetas FileTreeView Check Selected PažymÄ—ti pasirinktus Uncheck Selected Nuimti žymÄ—jimÄ… nuo pasirinktų Only Check Selected PažymÄ—ti tik pasirinktus Priority Prioritetas Open Atverti Rename... Pervadinti... FilterBar All visus Active aktyvius Downloading atsiunÄiamus Seeding skleidžiamus Paused pristabdytus Finished užbaigtus Verifying tikrinamus Error klaidas Show: Rodyti: FilterBarLineEdit Search... PaieÅ¡ka... Formatter B/s B/s kB/s kB/s MB/s MB/s GB/s GB/s TB/s TB/s B B kB kB MB MB GB GB TB TB KiB KiB MiB MiB GiB GiB TiB TiB Unknown nežinomas None laisvas %1 %2 %1 %2 %Ln day(s) %Ln diena %Ln dienos %Ln dienų %Ln hour(s) %Ln valanda %Ln valandos %Ln valandų %Ln minute(s) %Ln minutÄ— %Ln minutÄ—s %Ln minuÄių %Ln second(s) %Ln sekundÄ— %Ln sekundÄ—s %Ln sekundžių %1, %2 %1, %2 FreeSpaceLabel <i>Calculating Free Space...</i> <i>ApskaiÄiuojama laisva vieta...</i> %1 free %1 laisva LicenseDialog License Licencija MainWindow Transmission Transmission &Torrent T&orentas &Edit &Taisa &Help &Pagalba &View &Rodymas &File &Failas &New... &Naujas… Create a new torrent Sukurti naujÄ… torentÄ… &Properties &SavybÄ—s Show torrent properties Rodyti torento savybes Open the torrent's folder Atverti torento aplankÄ… Queue &EilÄ— &Open... &Atverti… Open Atverti Open a torrent Atverti torentÄ… Open Fold&er &Atverti aplankÄ… &Start &Paleisti Start torrent Paleisti torentÄ… Ask Tracker for &More Peers PapraÅ¡yti sekiklio &daugiau siuntÄ—jų Ask tracker for more peers PapraÅ¡yti sekiklio daugiau siuntÄ—jų &Pause &Pristabdyti Pause torrent Pristabdyti torentÄ… &Verify Local Data Pa&tikrinti turimus duomenis Verify local data Patikrinti turimus duomenis &Remove Pa&Å¡alinti Remove torrent PaÅ¡alinti torentÄ… &Delete Files and Remove IÅ¡trinti &failus ir paÅ¡alinti Remove torrent and delete its files PaÅ¡alinti torentÄ… ir jo failus &Start All Pa&leisti visus &Pause All Pri&stabdyti visus &Quit &Baigti darbÄ… &Select All PažymÄ—ti &viskÄ… &Deselect All &Panaikinti žymÄ—jimÄ… &Preferences &Nuostatos &Compact View &Glaustasis rodinys Compact View Glaustasis rodinys &Toolbar Ä®&rankinÄ— &Filterbar &Filtro juosta &Statusbar &BÅ«senos juosta Sort by &Activity Rikiuoti pagal &aktyvumÄ… Sort by A&ge Rikiuoti pagal se&numÄ… Sort by Time &Left Rikiuoti pagal likusį &laikÄ… Sort by &Name Rikiuoti pagal pa&vadinimÄ… Sort by &Progress Rikiuoti pagal &pažangÄ… Sort by Rati&o Rikiuoti pagal &santykį Sort by Si&ze Rikiuoti pagal &dydį Sort by Stat&e Rikiuoti pagal b&Å«senÄ… Sort by T&racker Rikiuoti pagal se&kiklį Message &Log PraneÅ¡imų &žurnalas &Statistics &Statistika &Contents &Žinynas &About &Apie Re&verse Sort Order A&tvirkÅ¡tinÄ— rikiavimo tvarka &Name Pa&vadinimas &Files &Failai &Tracker &Sekiklis Total Ratio Bendras santykis Session Ratio Seanso santykis Total Transfer Visas siuntimas Session Transfer Seanso siuntimas &Main Window &Pagrindinis langas Tray &Icon &Piktograma praneÅ¡imų srityje &Change Session... &Keisti seansą… Choose Session Start a local session or connect to a running session Pasirinkite seansÄ… Set &Location... Nurodyti &vietą… &Copy Magnet Link to Clipboard Kopijuoti &magnet nuorodÄ… į iÅ¡karpinÄ™ Open &URL... Atverti &URL… &Donate &Paaukoti Start &Now Paleisti da&bar Bypass the queue and start now Nepaisyti eilÄ—s ir paleisti torentÄ… dabar Move to &Top Perkelti &aukÅ¡tyn Move &Up Pa&kelti Move &Down Nu&leisti Move to &Bottom Perkelti &žemyn Sort by &Queue Rikiuoti pagal &eilÄ™ Limit Download Speed Apriboti atsiuntimo greitį Unlimited Be ribojimų Limited at %1 Ribojama iki %1 Limit Upload Speed Apriboti iÅ¡siuntimo greitį Stop Seeding at Ratio Nebeskleisti esant santykiui Seed Forever Skleisti visada Stop at Ratio (%1) Nebeskleisti esant santykiui (%1) - %1:%2 Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); notice that leading space (before the dash) is included here - %1:%2 Idle Pasyvus Ratio: %1 Santykis: %1 Down: %1, Up: %2 Ats.: %1, iÅ¡s.: %2 Torrent Files (*.torrent);;All Files (*.*) Torentų failai (*.torrent);;Visi failai (*.*) Show &options dialog Rodyti &parinkÄių langÄ… Open Torrent Atverti torentÄ… Speed Limits GreiÄio ribojimai Network Error Tinklo Klaida Click to disable Temporary Speed Limits (%1 down, %2 up) SpustelÄ—kite, kad iÅ¡jungtumÄ—te laikinus greiÄio apribojimus (%1 atsiuntimui, %2 iÅ¡siuntimui) Click to enable Temporary Speed Limits (%1 down, %2 up) SpustelÄ—kite, kad įjungtumÄ—te laikinus greiÄio apribojimus (%1 atsiuntimui, %2 iÅ¡siuntimui) Remove torrent? PaÅ¡alinti torentÄ…? Delete this torrent's downloaded files? PaÅ¡alinti Å¡io torento atsiųstus failus? Remove %Ln torrent(s)? Å alinti %Ln torentÄ…? Å alinti %Ln torentus? Å alinti %Ln torentų? Showing %L1 of %Ln torrent(s) Rodomas %L1 iÅ¡ %Ln torentų Rodomi %L1 iÅ¡ %Ln torentų Rodoma %L1 iÅ¡ %Ln torentų Delete these %Ln torrent(s)' downloaded files? IÅ¡trinti Å¡io %Ln torento atsiųstus failus? IÅ¡trinti Å¡ių %Ln torentų atsiųstus failus? IÅ¡trinti Å¡ių %Ln torentų atsiųstus failus? Once removed, continuing the transfer will require the torrent file or magnet link. Jeigu paÅ¡alinsite, norint tÄ™sti siuntimÄ…, jums prireiks torento failo arba magnet nuorodos. Once removed, continuing the transfers will require the torrent files or magnet links. Jeigu paÅ¡alinsite, norint tÄ™sti siuntimus, jums prireiks atitinkamų torentų failų arba magnet nuorodų. This torrent has not finished downloading. Å is torentas dar neatsiųstas. These torrents have not finished downloading. Å ie torentai dar neatsiųsti. This torrent is connected to peers. Å is torentas prisijungÄ™s prie siuntÄ—jų. These torrents are connected to peers. Å ie torentai prisijungÄ™ prie siuntÄ—jų. One of these torrents is connected to peers. Vienas Å¡ių torentų prisijungÄ™s prie siuntÄ—jų. Some of these torrents are connected to peers. Kai kurie Å¡ių torentų prisijungÄ™ prie siuntÄ—jų. One of these torrents has not finished downloading. Vienas Å¡ių torentų dar neatsiųstas. Some of these torrents have not finished downloading. Kai kurie Å¡ių torentų dar neatsiųsti. %1 has not responded yet %1 dar neatsakÄ— %1 is responding %1 atsako %1 last responded %2 ago %1 paskutinį kartÄ… atsakÄ— prieÅ¡ %2 %1 is not responding %1 neatsako MakeDialog New Torrent Naujas torentas <i>No source selected<i> <i>Nepasirinktas Å¡altinis</i> %Ln File(s) %Ln failas %Ln failai %Ln failų %Ln Piece(s) %Ln dalis %Ln dalys %Ln dalių %1 in %2; %3 @ %4 %1, %2; %3 po %4 Files Failai Sa&ve to: Ä®&raÅ¡yti į: Source f&older: Å altinio &aplankas: Source &file: Å altinio &failas: Properties SavybÄ—s &Trackers: &Sekikliai: To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. Atsarginį URL adresÄ… veskite atskiroje eilutÄ—je po pirminiu URL adresu. PapildomÄ… pirminį URL adresÄ… galite įvesti, palikÄ™ prieÅ¡ jį tuÅ¡ÄiÄ… eilutÄ™. Co&mment: &Komentaras: &Private torrent &Privatus torentas MakeProgressDialog New Torrent Naujas torentas Creating "%1" Kuriamas „%1“ Created "%1"! Sukurtas „%1“! Error: invalid announce URL "%1" Klaida: netinkamas praneÅ¡imo URL „%1“ Cancelled Atsisakyta Error reading "%1": %2 Klaida skaitant „%1“: %2 Error writing "%1": %2 Klaida raÅ¡ant „%1“: %2 OptionsDialog Open Torrent Torento atvÄ—rimas Open Torrent from File Atverti torentÄ… iÅ¡ failo Open Torrent from URL or Magnet Link Atverti torentÄ… iÅ¡ URL ar Magnet nuorodos &Source: Å &altinis: &Destination folder: Paskirties &aplankas: High aukÅ¡tas Normal normalus Low žemas &Priority: &Prioritetas: S&tart when added PridÄ—jus, pradÄ—ti &Verify Local Data Pa&tikrinti turimus duomenis Mo&ve .torrent file to the trash Per&kelti .torrent failÄ… į Å¡iukÅ¡linÄ™ Torrent Files (*.torrent);;All Files (*.*) Torentų failai (*.torrent);;Visi failai (*.*) Select Destination Parinkite paskirties vietÄ… PathButton (None) (Joks) Select Folder Parinkite aplankÄ… Select File Parinkite failÄ… PrefsDialog Use &authentication Reikalauti &tapatybÄ—s nustatymo &Username: Naudotojo &vardas: Pass&word: &Slaptažodis: &Open web client &Atverti saityno sÄ…sajÄ… Addresses: Ad&resai: Speed Limits GreiÄio ribojimai <small>Override normal speed limits manually or at scheduled times</small> <small>Taikomi vietoje įprastų greiÄio ribojimų rankiniu bÅ«du arba numatytuoju laiku</small> &Scheduled times: &Numatytasis laikas: &On days: Å iomis &dienomis: Every Day kasdien Weekdays Å¡iokiadieniais Weekends savaitgaliais Sunday sekmadieniais Monday pirmadieniais Tuesday antradieniais Wednesday treÄiadieniais Thursday ketvirtadieniais Friday penktadieniais Saturday Å¡eÅ¡tadieniais Port is <b>open</b> Prievadas yra <b>atviras</b> Port is <b>closed</b> Prievadas yra <b>užvertas</b> Incoming Peers Ä®einantys ryÅ¡iai Status unknown BÅ«sena nežinoma &Port for incoming connections: Ä®einantiems ryÅ¡iams naudotinas &prievadas: Use UPnP or NAT-PMP port &forwarding from my router Naudototi &UPnP arba NAT-PMP prievadų persiuntimÄ… marÅ¡rutizatoriuje Options Nuostatos Enable &uTP for peer connections RyÅ¡iams su &siuntÄ—jais naudoti µTP uTP is a tool for reducing network congestion. µTP – tai priemonÄ—, padedanti mažinti tinklo apkrovas. minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minutÄ— minutÄ—s minuÄių minute(s) ago Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) minutÄ™ minutes minuÄių Automatically add .torrent files &from: AutomatiÅ¡kai pridÄ—ti .torrent &failus iÅ¡: Show the Torrent Options &dialog Rodyti torento parinkÄių &dialogÄ… &Start added torrents Palei&sti pridÄ—tus torentus Mo&ve the .torrent file to the trash Per&kelti .torrent failÄ… į Å¡iukÅ¡linÄ™ Download Queue Atsiuntimų EilÄ— Ma&ximum active downloads: Dau&giausiai aktyvių atsiuntimų: Incomplete Nebaigtas Seeding Skleidimas Remote Nuotoliniai <i>Blocklist contains %Ln rule(s)</i> <i>Blokavimo sÄ…raÅ¡e yra %Ln taisyklÄ—</i> <i>Blokavimo sÄ…raÅ¡e yra %Ln taisyklÄ—s</i> <i>Blokavimo sÄ…raÅ¡e yra %Ln taisyklių</i> Pick a &random port every time Transmission is started Pasirinkti &atsitiktinį prievadÄ… kaskart paleidus „Transmission“ Limits Ribojimai Maximum peers per &torrent: Daugiausiai galimų &vieno torento siuntÄ—jų: Maximum peers &overall: &Daugiausiai galimų siuntÄ—jų iÅ¡ viso: <b>Update succeeded!</b><p>Blocklist now has %Ln rule(s). <b>Naujinimas sÄ—kmingas!</b><p>Blokavimo sÄ…raÅ¡e dabar yra %Ln taisyklÄ—. <b>Naujinimas sÄ—kmingas!</b><p>Blokavimo sÄ…raÅ¡e dabar yra %Ln taisyklÄ—s. <b>Naujinimas sÄ—kmingas!</b><p>Blokavimo sÄ…raÅ¡e dabar yra %Ln taisyklių. <b>Update Blocklist</b><p>Getting new blocklist... <b>Blokavimo sÄ…raÅ¡o naujinimas</b><p>Gaunamas naujas blokavimo sÄ…raÅ¡as… Blocklist Blokavimo sÄ…raÅ¡as Enable &automatic updates Ä®jungti &automatinius naujinimus Allow encryption leisti Å¡ifravimÄ… Prefer encryption teikti pirmenybÄ™ Å¡ifravimui Require encryption reikalauti Å¡ifravimo Privacy Privatumas &to i&ki Desktop Aplinka Show Transmission icon in the &notification area Rodyti „Transmission“ piktogramÄ… praneÅ¡imų &srityje Te&st Port &Tikrinti prievadÄ… Enable &blocklist: Ä®jungti &blokavimo sÄ…rašą: &Update At&naujinti &Encryption mode: Pozicija dÄ—l &Å¡ifravimo: Remote Control Nuotolinis Valdymas Allow &remote access Leisti nuotolinÄ™ p&rieigÄ… HTTP &port: HTTP &prievadas: Only allow these IP a&ddresses: Leisti tik Å¡iuos IP a&dresus: &Upload: IÅ¡si&untimo: &Download: &Atsiuntimo: Alternative Speed Limits AlternatyvÅ«s greiÄio apribojimai U&pload: IÅ¡siunti&mo: Do&wnload: A&tsiuntimo: Start &minimized in notification area Paleisti su&mažintÄ… praneÅ¡imų srityje Notification PraneÅ¡imai Show a notification when torrents are a&dded Rodyti praneÅ¡imÄ…, kai yra pride&dami torentai Show a notification when torrents &finish Rodyti praneÅ¡imÄ…, kai torentai &yra užbaigiami Play a &sound when torrents finish Groti gar&sÄ…, kai torentai yra užbaigiami Testing TCP Port... Tikrinamas TCP prievadas… Peer Limits RyÅ¡ių ribojimai Use PE&X to find more peers Naudoti PE&X papildomiems siuntÄ—jams rasti PEX is a tool for exchanging peer lists with the peers you're connected to. PEX – tai priemonÄ—, skirta apsikeisti siuntÄ—jų sÄ…raÅ¡ais su siuntÄ—jais, prie kurių esate prisijungÄ™. Use &DHT to find more peers Naudoti &DHT papildomiems siuntÄ—jams rasti DHT is a tool for finding peers without a tracker. DHT – tai priemonÄ—, skirta siuntÄ—jams be sekiklio rasti. Use &Local Peer Discovery to find more peers Naudoti &vietinių siuntÄ—jų aptikimo metodÄ… papildomiems siuntÄ—jams rasti LPD is a tool for finding peers on your local network. VSA – tai priemonÄ—, skirta siuntÄ—jams JÅ«sų vietiniame tinkle rasti. Encryption Å ifravimas Select "Torrent Done" Script Parinkite „torentas baigtas“ scenarijų Select Incomplete Directory Parinkite nebaigtų torentų aplankÄ… Select Watch Directory Parinkite stebimÄ… aplankÄ… Select Destination Parinkite paskirties aplankÄ… Adding PridÄ—jimas Download is i&nactive if data sharing stopped: Please keep this phrase as short as possible, it's curently the longest and influences dialog width Atsiuntimas yra &neaktyvus, jei dalinimasis duomenimis sustabdytas: Downloading Atsiuntimas Append ".&part" to incomplete files' names Nebaigtų failų varduose naudoti „.part“ &prievardį Keep &incomplete files in: Ä®raÅ¡yti &nebaigtus torentus į: Save to &Location: Ä®raÅ¡yti &vietoje: Call scrip&t when torrent is completed: Baigus siųsti torentÄ…, vykdyti s&cenarijų: Stop seeding at &ratio: Nebeskleisti esant &santykiui: Stop seedi&ng if idle for: Nebeskleisti jei &pasyvus: Transmission Preferences „Transmission“ nuostatos Speed Greitis Network Tinklas Not supported by remote sessions Nepalaikoma nuotolinių seansų QObject Invalid option Netinkamas parametras RelocateDialog Select Location Parinkite vietÄ… Set Torrent Location Torento vietos nustatymas Set Location Nustatyti vietÄ… New &location: Nauja &vieta: &Move from the current folder &Perkelti iÅ¡ dabartinio aplanko Local data is &already there Vietiniai duomenys jau yra &ten Session Error Renaming Path Klaida, pervadinant keliÄ… <p><b>Unable to rename "%1" as "%2": %3.</b></p> <p>Please correct the errors and try again.</p> <p><b>Nepavyko pervadinti "%1" kaip "%2": %3.</b></p> <p>PraÅ¡ome iÅ¡taisyti klaidas ir bandyti dar kartÄ….</p> Add Torrent Torento pridÄ—jimas SessionDialog Change Session Seanso keitimas Source Seanso kilmÄ— Start &Local Session PradÄ—ti &vietinį seansÄ… Connect to &Remote Session &Jungtis prie nuotolinio seanso &Host: &Mazgas: &Port: &Prievadas: &Authentication required Reikia patvirtinti &tapatybÄ™ &Username: &Naudotojo vardas: Pass&word: &Slaptažodis: StatsDialog Statistics Statistika Current Session Å is seansas Uploaded: IÅ¡siųsta: Downloaded: Atsiųsta: Ratio: Santykis: Duration: Naudojimosi trukmÄ—: Total Bendra Started %Ln time(s) PradÄ—tas %Ln kartÄ… PradÄ—tas %Ln kartus PradÄ—tas %Ln kartų Torrent Verifying local data Tikrinami vietiniai duomenys Downloading atsiunÄiamas Seeding skleidžiamas Finished Baigtas Paused Pristabdytas Queued for verification EilÄ—je duomenų tikrinimui Queued for download EilÄ—je parsiuntimui Queued for seeding EilÄ—je skleidimui Tracker gave a warning: %1 Sekiklis įspÄ—jo: %1 Tracker gave an error: %1 Sekiklis pranešė apie klaidÄ…: %1 Error: %1 Klaida: %1 TorrentDelegate Magnetized transfer - retrieving metadata (%1%) First part of torrent progress string; %1 is the percentage of torrent metadata downloaded Ä®magnetintas perdavimas – atsiunÄiami metaduomenys (%1%) %1 of %2 (%3%) First part of torrent progress string; %1 is how much we've got, %2 is how much we'll have when done, %3 is a percentage of the two %1 iÅ¡ %2 (%3%) %1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio, %6 is the ratio we want to reach before we stop uploading %1 iÅ¡ %2 (%3%), iÅ¡siųsta %4 (santykis: %5, tikslas: %6) %1 of %2 (%3%), uploaded %4 (Ratio: %5) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio %1 iÅ¡ %2 (%3%), iÅ¡siųsta %4 (santykis: %5) %1, uploaded %2 (Ratio: %3 Goal: %4) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio, %4 is the ratio we want to reach before we stop uploading %1, iÅ¡siųsta %2 (santykis: %3, tikslas: %4) %1, uploaded %2 (Ratio: %3) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio %1, iÅ¡siųsta %2 (santykis: %3) - %1 left Second (optional) part of torrent progress string; %1 is duration; notice that leading space (before the dash) is included here - liko %1 - Remaining time unknown Second (optional) part of torrent progress string; notice that leading space (before the dash) is included here - LikÄ™s laikas nežinomas Ratio: %1 Santykis: %1 Downloading from %Ln peer(s) First part of phrase "Downloading from ... peer(s) and ... web seed(s)" AtsiunÄiama iÅ¡ %Ln siuntÄ—jo AtsiunÄiama iÅ¡ %Ln siuntÄ—jų AtsiunÄiama iÅ¡ %Ln siuntÄ—jų Seeding to %Ln peer(s) Skleidžiama %Ln siuntÄ—jui Skleidžiama %Ln siuntÄ—jams Skleidžiama %Ln siuntÄ—jų - – Downloading metadata from %Ln peer(s) (%1% done) AtsiunÄiami metaduomenys iÅ¡ %Ln siuntÄ—jo (%1% atlikta) AtsiunÄiami metaduomenys iÅ¡ %Ln siuntÄ—jų (%1% atlikta) AtsiunÄiami metaduomenys iÅ¡ %Ln siuntÄ—jų (%1% atlikta) Downloading from %1 of %Ln connected peer(s) First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" AtsiunÄiama iÅ¡ %1 iÅ¡ %Ln prisijungusio siuntÄ—jo AtsiunÄiama iÅ¡ %1 iÅ¡ %Ln prisijungusių siuntÄ—jų AtsiunÄiama iÅ¡ %1 iÅ¡ %Ln prisijungusių siuntÄ—jų and %Ln web seed(s) Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; notice that leading space (before "and") is included here ir %Ln saityno skleidÄ—jo ir %Ln saityno skleidÄ—jų ir %Ln saityno skleidÄ—jų Seeding to %1 of %Ln connected peer(s) Skleidžiama %1 iÅ¡ %Ln prisijungusio siuntÄ—jo Skleidžiama %1 iÅ¡ %Ln prisijungusių siuntÄ—jų Skleidžiama %1 iÅ¡ %Ln prisijungusių siuntÄ—jų Error Klaida Verifying local data (%1% tested) Tikrinami vietiniai duomenys (patikrinta %1%) TrackerDelegate Got a list of%1 %Ln peer(s)%2 %3 ago %1 and %2 are replaced with HTML markup, %3 is duration PrieÅ¡ %3 gautas%1 %Ln siuntÄ—jo%2 sÄ…raÅ¡as PrieÅ¡ %3 gautas%1 %Ln siuntÄ—jų%2 sÄ…raÅ¡as PrieÅ¡ %3 gautas%1 %Ln siuntÄ—jų%2 sÄ…raÅ¡as Peer list request %1timed out%2 %3 ago; will retry %1 and %2 are replaced with HTML markup, %3 is duration PrieÅ¡ %2 %3 baigÄ—si siuntÄ—jų sÄ…raÅ¡o užklausos %1 laukimo laikas; bus bandoma dar kartÄ… Got an error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration PrieÅ¡ %4 gauta klaida %1„%2“%3 No updates scheduled NÄ—ra suplanuotų atnaujinimų Asking for more peers in %1 %1 is duration Už %1 bus papraÅ¡yta daugiau siuntÄ—jų Queued to ask for more peers Suplanuota papraÅ¡yti daugiau siuntÄ—jų Asking for more peers now... <small>%1</small> %1 is duration Dabar praÅ¡oma daugiau siuntÄ—jų… <small>%1</small> Tracker had%1 %Ln seeder(s)%2 First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup Sekiklis turÄ—jo%1 %Ln skleidÄ—jÄ…%2 Sekiklis turÄ—jo%1 %Ln skleidÄ—jus%2 Sekiklis turÄ—jo%1 %Ln skleidÄ—jų%2 and%1 %Ln leecher(s)%2 %3 ago Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup, %3 is duration; notice that leading space (before "and") is included here ir%1 %Ln atsisiuntÄ—jÄ…%2 prieÅ¡ %3 ir%1 %Ln atsisiuntÄ—jus%2 prieÅ¡ %3 ir%1 %Ln atsisiuntÄ—jų%2 prieÅ¡ %3 Tracker had %1no information%2 on peer counts %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Sekiklis prieÅ¡ %3 neturÄ—jo %1jokios informacijos%2 apie siuntÄ—jų skaiÄių Got a scrape error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration PrieÅ¡ %4 gauta klaida %1„%2“%3 Asking for peer counts in %1 %1 is duration Bus užklausta siuntÄ—jų skaiÄiaus po %1 Queued to ask for peer counts Suplanuota užklausti siuntÄ—jų skaiÄiaus Asking for peer counts now... <small>%1</small> %1 is duration Dabar užklausiama siuntÄ—jų skaiÄiaus… <small>%1</small> transmission-2.92/qt/translations/PaxHeaders.4960/transmission_fr.ts0000644000000000000000000000013212664476417022634 xustar0030 mtime=1456635151.987496369 30 atime=1456635151.986496352 30 ctime=1457295917.276761596 transmission-2.92/qt/translations/transmission_fr.ts0000644000175000017500000026470312664476417024275 0ustar00mikedldmikedld00000000000000 UTF-8 AboutDialog About Transmission À propos de Transmission <b style='font-size:x-large'>Transmission %1</b> <b style='font-size:x-large'>Transmission %1</b> A fast and easy BitTorrent client Un client BitTorrent simple et rapide Copyright (c) The Transmission Project Copyright (c) Le projet Transmission C&redits C&rédits &License &Licence Credits Crédits Application <b>Transmission is a file sharing program.</b> <b>Transmission est un programme de partage de fichiers.</b> When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. Lorsque vous exécutez un torrent, ses données sont mises à disposition des autres par envoi de données. Le partage de tout contenu est votre entière responsabilité. I &Agree Je suis d'&accord Torrent Completed Torrent complété Torrent Added Torrent ajouté DetailsDialog None Aucun Mixed Mixte Unknown Inconnu Finished Terminé Paused Suspendu Active now Actif actuellement %1 ago Il y a %1 %1 (%Ln pieces @ %2) %1 (%Ln partie @ %2) %1 (%Ln parties @ %2) %1 (%Ln pieces) %1 (%Ln partie) %1 (%Ln parties) Private to this tracker -- DHT and PEX disabled Privé sur ce traqueur -- DHT et PEX désactivés Public torrent Torrent public Created by %1 Créé par : %1 Created on %1 Créé : %1 Created by %1 on %2 Créé par : %1 %2-an Encrypted connection Connexion chiffrée Optimistic unchoke Proposition d'échanges optimiste Downloading from this peer Réception à partir de ce pair We would download from this peer if they would let us Nous téléchargerions à partir de ce pair s'il nous le permettait Uploading to peer Envoi au pair We would upload to this peer if they asked Nous enverrions vers ce pair s'il nous le demandait Peer has unchoked us, but we're not interested Le pair nous a proposé un échange, mais nous ne sommes pas intéressés We unchoked this peer, but they're not interested Nous avons proposé un échange à ce pair, mais il n'est pas intéressé Peer was discovered through DHT Pair trouvé par DHT Peer was discovered through Peer Exchange (PEX) Pair trouvé par échange de pairs (PEX) Peer is an incoming connection Le pair est une connexion entrante minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minute minutes Error Erreur Tracker already exists. Le traqueur existe déjà. %1 (100%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data %1 (100%) %1 of %2 (%3%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data, %2 is overall size of torrent data, %3 is percentage (%1/%2*100) %1 sur %2 (%3%) %1 of %2 (%3%), %4 Unverified Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded data (both verified and unverified), %2 is overall size of torrent data, %3 is percentage (%1/%2*100), %4 is amount of downloaded but not yet verified data %1 sur %2 (%3%), %4 non vérifiés %1 (%2 corrupt) %1 (%2 corrompu) %1 (Ratio: %2) %1 (Ratio: %2) N/A N/D Peer is connected over uTP Pair connecté via uTP Add URL Ajouter une URL Add tracker announce URL: Ajouter URL d'annonce du traqueur: Invalid URL "%1" URL invalide "%1" Edit URL Éditer l'URL Edit tracker announce URL: Éditer l'URL d'annonce du traqueur: High Élevée Normal Normale Low Basse Use Global Settings Utiliser la configuration globale Seed regardless of ratio Partage indépendant du ratio Stop seeding at ratio: Partager jusqu’au ratio: Seed regardless of activity Partager quelle que soit l’activité Stop seeding if idle for: Arrêter de partager si inactif depuis: Up Émission Down Réception % % Status État Address Adresse Client Client Torrent Properties Propriétés du Torrent Information Information Activity Activité Have: Obtenu: Availability: Disponibilité: Uploaded: Envoyé: Downloaded: Téléchargé: State: État: Running time: Temps d'exécution: Remaining time: Temps restant: Last activity: Dernière activité: Error: Erreur: Details Détails Size: Taille: Location: Emplacement: Hash: Hachage: Privacy: Confidentialité: Origin: Origine: Comment: Commentaire: Peers Pairs Tracker Traqueur Add Tracker Ajouter un traqueur Edit Tracker Modifier un traqueur Remove Trackers Enlever un traqueur Show &more details Afficher &plus de détails Show &backup trackers Afficher les traqueurs de &secours Files Fichiers Options Options Speed Vitesse Honor global &limits Respecter les &limites globales Limit &download speed: Limiter le taux de &réception: Limit &upload speed: Limiter le taux d'&émission: Torrent &priority: &Priorité du Torrent: Seeding Limits Limites d'envoi &Ratio: &Ratio: &Idle: &Inactif: Peer Connections Connexions aux pairs &Maximum peers: Nombre &maximum de pairs: FileAdded Add Torrent Ajouter un torrent <p><b>Unable to add "%1".</b></p><p>It is a duplicate of "%2" which is already added.</p> <p><b>Impossible d'ajouter "%1".</b></p><p> c'est un double de "%2" qui est déjà ajouté.</p> Error Adding Torrent Erreur lors de l'ajout du torrent FileTreeItem Low Basse High Élevée Normal Normale Mixed Mixte FileTreeModel File Fichiers Size Taille Progress Avancement Download Téléchargement Priority Priorité FileTreeView Check Selected Cocher les éléments sélectionnés Uncheck Selected Décocher les éléments sélectionnés Only Check Selected Cocher uniquement les éléments sélectionnés Priority Priorité Open Ouvrir Rename... Renommer... FilterBar All Tous Active Actifs Downloading En réception Seeding En partage Paused Suspendus Finished Terminés Verifying En cours de vérification Error Erreur Show: Afficher: FilterBarLineEdit Search... Recherche... Formatter B/s B/s kB/s kB/s MB/s MB/s GB/s GB/s TB/s TB/s B B kB kB MB MB GB GB TB TB KiB Ko MiB Mo GiB Go TiB To Unknown Inconnu None Aucun %1 %2 %1 %2 %Ln day(s) %Ln jour %Ln jours %Ln hour(s) %Ln heure. %Ln heures. %Ln minute(s) %Ln minute %Ln minutes %Ln second(s) %Ln seconde %Ln secondes %1, %2 %1, %2 FreeSpaceLabel <i>Calculating Free Space...</i> <i>Calcul de l'espace libre...</i> %1 free %1 libre LicenseDialog License Licence MainWindow Transmission Transmission &Torrent &Torrent &Edit &Editer &Help &Aide &View &Afficher &File &Fichier &New... &Nouveau... Create a new torrent Créer un nouveau torrent &Properties &Propriétés Show torrent properties Afficher les propriétés du torrent Open the torrent's folder Ouvrir le dossier du torrent Queue File d'attente &Open... &Ouvrir... Open Ouvrir Open a torrent Ouvrir un torrent Open Fold&er &Ouvrir un dossier &Start &Démarrer Start torrent Démarrer le ou les torrent(s) sélectionné(s) Ask Tracker for &More Peers Demander &plus de pairs au traqueur Ask tracker for more peers Demander plus de pairs au traqueur &Pause Sus&pendre Pause torrent Suspendre le ou les torrent(s) sélectionné(s) &Verify Local Data &Vérifier les données locales Verify local data Vérifier les données locales &Remove &Enlever Remove torrent Enlever le torrent &Delete Files and Remove &Supprimer les fichiers et enlever Remove torrent and delete its files Supprimer les fichiers et enlever &Start All Tout &démarrer &Pause All Tout sus&pendre &Quit &Quitter &Select All Tout &Sélectionner &Deselect All &Tout désélectionner &Preferences &Préférences &Compact View Vue &compacte Compact View Vue compacte &Toolbar Barre d'ou&tils &Filterbar Barre des &filtres &Statusbar Barre d'&état Sort by &Activity Trier par &activité Sort by A&ge Trier par â&ge Sort by Time &Left Trier par temps &restant Sort by &Name Trier par &nom Sort by &Progress Trier par avan&cement Sort by Rati&o Trier par &ratio Sort by Si&ze Trier par &taille Sort by Stat&e Trier par &état Sort by T&racker Trier par tra&queur Message &Log Journa&l des messages &Statistics &Statistiques &Contents &Contenu &About &A propos Re&verse Sort Order Ordre in&versé &Name &Nom &Files &Fichiers &Tracker &Traqueur Total Ratio Ratio total Session Ratio Ratio de la session Total Transfer Transfert total Session Transfer Transfert de la session &Main Window Fenêtre &principale Tray &Icon &Icône dans la zone de notification &Change Session... &Changer de session... Choose Session Start a local session or connect to a running session Choisir la session Set &Location... Définir l'emp&lacement... &Copy Magnet Link to Clipboard Copier le lien &Magnet vers le presse-papiers Open &URL... Ouvrir une &URL... &Donate C&ontribuer Start &Now Démarrer mainte&nant Bypass the queue and start now Eviter la file d'attente et démarrer maintenant Move to &Top Déplacer en &tête Move &Up Déplacer vers le ha&ut Move &Down Déplacer vers le b&as Move to &Bottom Déplacer en &queue Sort by &Queue Trier par &file d'attente Limit Download Speed Limite de réception Unlimited Pas de limite Limited at %1 Limité à: %1 Limit Upload Speed Limite d'émission Stop Seeding at Ratio Arrêter le partage au ratio Seed Forever Partage illimité Stop at Ratio (%1) Arrêter au ratio (%1) - %1:%2 Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); notice that leading space (before the dash) is included here - %1:%2 Idle Inactif Ratio: %1 Ratio: %1 Down: %1, Up: %2 Réception: %1, Envoi: %2 Torrent Files (*.torrent);;All Files (*.*) Fichiers Torrent (*.torrent);;Tous les fichiers (*.*) Show &options dialog Afficher la fenêtre des &options Open Torrent Ouvrir un torrent Speed Limits Limites de vitesse Network Error Problème de réseau Click to disable Temporary Speed Limits (%1 down, %2 up) Cliquez pour désactiver les limitations de vitesse temporaires (%1 down, %2 up) Click to enable Temporary Speed Limits (%1 down, %2 up) Cliquez pour activer les limitations de vitesse temporaires (%1 down, %2 up) Remove torrent? Enlever le torrent? Delete this torrent's downloaded files? Effacer les fichiers de ce torrent? Remove %Ln torrent(s)? Enlever %Ln torrent? Enlever %Ln torrents? Showing %L1 of %Ln torrent(s) Delete these %Ln torrent(s)' downloaded files? Effacer les fichiers de ces %Ln torrent? Effacer les fichiers de ces %Ln torrents? Once removed, continuing the transfer will require the torrent file or magnet link. Une fois supprimé, la reprise du torrent nécessitera le fichier torrent ou le lien magnet. Once removed, continuing the transfers will require the torrent files or magnet links. Une fois supprimés, la reprise des torrents nécessitera les fichiers torrent ou les liens magnet. This torrent has not finished downloading. Le téléchargement de ce torrent n'est pas terminé. These torrents have not finished downloading. Le téléchargement de ces torrents n'est pas terminé. This torrent is connected to peers. Ce torrent est connecté à des pairs. These torrents are connected to peers. Ces torrents sont connectés à des pairs. One of these torrents is connected to peers. Un de ces torrent est connecté à des pairs. Some of these torrents are connected to peers. Plusieurs de ces torrents sont connectés à des pairs. One of these torrents has not finished downloading. Le téléchargement d'un de ces torrents n'est pas terminé. Some of these torrents have not finished downloading. Le téléchargement de plusieurs de ces torrents n'est pas terminé. %1 has not responded yet %1 n'a pas encore répondu %1 is responding %1 répond %1 last responded %2 ago %1 a répondu pour la dernière fois il ya %2 %1 is not responding %1 ne répond pas MakeDialog New Torrent Nouveau Torrent <i>No source selected<i> <i>Pas de source seléctionnée<i> %Ln File(s) %Ln Fichier %Ln Fichiers %Ln Piece(s) %Ln Part %Ln Parts %1 in %2; %3 @ %4 %1 sur %2; %3 @ %4 Files Fichiers Sa&ve to: S&auvegarder vers: Source f&older: Répert&oire source: Source &file: &Fichier source: Properties Propriétés &Trackers: &Traqueurs: To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. "Pour ajouter une URL de secours, placez-la sur la ligne après l'URL primaire. Pour ajouter une autre URL primaire, placez-la après une ligne vide. Co&mment: Co&mmentaire: &Private torrent &Torrent privé MakeProgressDialog New Torrent Nouveau Torrent Creating "%1" Création de "%1" Created "%1"! "%1" créé! Error: invalid announce URL "%1" Erreur: URL d'annonce invalide "%1" Cancelled Annulé Error reading "%1": %2 Erreur de lecture "%1": %2 Error writing "%1": %2 Erreur d'écriture "%1": %2 OptionsDialog Open Torrent Ouvrir un torrent Open Torrent from File Ouvrir un torrent à partir d'un fichier Open Torrent from URL or Magnet Link Ouvrir un torrent à partir d'une URL ou d'un lien Magnet &Source: &Source: &Destination folder: Dossier de &destination: High Haute Normal Normale Low Basse &Priority: &Priorité: S&tart when added &Commencer à l'ajout &Verify Local Data &Vérifier les données locales Mo&ve .torrent file to the trash &Déplacer .torrent vers la corbeille Torrent Files (*.torrent);;All Files (*.*) Fichers Torrent (*.torrent);;Tous les fichiers (*.*) Select Destination Sélectionner la destination PathButton (None) (Aucun) Select Folder Sélectionner le dossier Select File Sélectionner le fichier PrefsDialog Use &authentication Utiliser l'&authentification &Username: Nom d'&utilisateur: Pass&word: &Mot de passe: &Open web client &Ouvrir le client web Addresses: Adresses: Speed Limits Limites de vitesse <small>Override normal speed limits manually or at scheduled times</small> <small>Outrepasser les limites de vitesse manuellement ou aux périodes définies</small> &Scheduled times: Périodes &définies: &On days: Les &jours: Every Day tous les jours Weekdays en semaine Weekends le weekend Sunday Dimanche Monday Lundi Tuesday Mardi Wednesday Mercredi Thursday Jeudi Friday Vendredi Saturday Samedi Port is <b>open</b> Le Port est <b>ouvert</b> Port is <b>closed</b> Le port est <b>fermé</b> Incoming Peers Pairs entrants Status unknown État inconnu &Port for incoming connections: &Port pour les connexions entrantes: Use UPnP or NAT-PMP port &forwarding from my router Utiliser les &redirections de ports UPnP ou NAT-PMP de mon routeur Options Options Enable &uTP for peer connections Activer &uTP pour les connexions aux pairs uTP is a tool for reducing network congestion. uTP est un outil destiné à réduire la congestion du réseau. minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minute minutes minute(s) ago Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) minute minutes Automatically add .torrent files &from: Ajouter automatiquement les fichiers .torrent dans: Show the Torrent Options &dialog Afficher les options du torrent &Start added torrents Commencez les torrents à l'ajout Mo&ve the .torrent file to the trash Déplacez le fichier .torrent à la poubelle Download Queue File de téléchargement Ma&ximum active downloads: Nombre maximal de téléchargements actifs: Incomplete Incomplet Seeding Envoi Remote À distance <i>Blocklist contains %Ln rule(s)</i> <i>La liste de blocage contient %Ln règle</i> <i>La liste de blocage contient %Ln règles</i> Pick a &random port every time Transmission is started Choisir un port au hasa&rd à chaque lancement de Transmission Limits Limites Maximum peers per &torrent: Nombre maximum de pairs par torrent: Maximum peers &overall: Nombre global maximum de pairs: <b>Update succeeded!</b><p>Blocklist now has %Ln rule(s). <b>Mise à jour réussie!</b><p>La liste de blocage contient maintenant %Ln règle. <b>Mise à jour réussie!</b><p>La liste de blocage contient maintenant %Ln règles. <b>Update Blocklist</b><p>Getting new blocklist... <b>Mise à jour de la liste d'exclusion</b><p>Obtention de la nouvelle liste... Blocklist Liste d'exclusion Enable &automatic updates Activer les mises à jour &automatiques Allow encryption Autoriser le chiffrement Prefer encryption Préférer le chiffrement Require encryption Exiger le chiffrement Privacy Confidentialité &to &à Desktop Bureau Show Transmission icon in the &notification area Afficher l'icône de Transmission dans la zone de &notification Te&st Port Te&ster le port Enable &blocklist: Activer la &liste d'exclusion: &Update &Mettre à jour &Encryption mode: Mode de &chiffrement: Remote Control Contrôle à distance Allow &remote access Autoriser l'accès à distance HTTP &port: Port HTTP: Only allow these IP a&ddresses: N'autoriser que ces adresses IP: &Upload: Envoi: &Download: Réception: Alternative Speed Limits Limites de vitesse alternatives U&pload: Envoi: Do&wnload: Réception: Start &minimized in notification area Commencez minimisé dans la zone de notification Notification Notifications Show a notification when torrents are a&dded Afficher une notification lorsque des torrents sont ajoutés Show a notification when torrents &finish Afficher une notification lorsque des torrents sont terminés Play a &sound when torrents finish Jouer un son lorsque des torrents sont terminés Testing TCP Port... Test du port TCP... Peer Limits Limites des pairs Use PE&X to find more peers Utiliser PE&X pour trouver d'autres pairs PEX is a tool for exchanging peer lists with the peers you're connected to. PEX est un outil permettant d'échanger des listes de pairs avec ceux auxquels vous êtes connecté. Use &DHT to find more peers Utiliser &DHT pour trouver d'autres pairs DHT is a tool for finding peers without a tracker. DHT est un outil permettant de trouver des pairs en l'absence de traqueur. Use &Local Peer Discovery to find more peers Utiliser la découverte de pairs &locaux pour trouver plus de pairs LPD is a tool for finding peers on your local network. LPD est un outil pour trouver des pairs sur votre réseau local. Encryption Chiffrement Select "Torrent Done" Script Sélectionner le script "Torrent complété" Select Incomplete Directory Sélectionner dossier temporaire Select Watch Directory Sélectionner dossier surveillé Select Destination Selectionner la destination Adding Ajout Download is i&nactive if data sharing stopped: Please keep this phrase as short as possible, it's curently the longest and influences dialog width Le téléchargement est inactif si le partage de fichier est arrêté il y a: Downloading Téléchargement Append ".&part" to incomplete files' names &Ajouter ".part" aux fichiers incomplets Keep &incomplete files in: Garder les fichiers &incomplets dans: Save to &Location: Sauvegarder dans l'emp&lacement: Call scrip&t when torrent is completed: Appeler ce scrip&t quand un torrent est terminé: Stop seeding at &ratio: Partager jusqu’à un &ratio de: Stop seedi&ng if idle for: Arrêter de partager si i&nactif depuis: Transmission Preferences Préférences de Transmission Speed Vitesse Network Réseau Not supported by remote sessions Non supporté par les sessions à distance QObject Invalid option Option invalide RelocateDialog Select Location Séléctionner l'emplacement Set Torrent Location Définir l'emplacement du torrent Set Location Définir l'emplacement New &location: Nouvel emp&lacement: &Move from the current folder &Déplacer depuis le dossier courant Local data is &already there Les données locales sont &déjà là Session Error Renaming Path Renommer le fichier d'erreur <p><b>Unable to rename "%1" as "%2": %3.</b></p> <p>Please correct the errors and try again.</p> <p><b>Impossible de renommer "%1" en "%2": %3.</b></p> <p>Corrigez les erreurs et essayez à nouveau.</p> Add Torrent Ajouter un torrent SessionDialog Change Session Changer de session Source Source Start &Local Session Démarrer une session &locale Connect to &Remote Session Se connecter à une session à &distance &Host: &Hôte: &Port: &Port: &Authentication required &Authentification requise &Username: Nom d'&utilisateur: Pass&word: &Mot de passe: StatsDialog Statistics Statistiques Current Session Session courante Uploaded: Envoyé: Downloaded: Téléchargé: Ratio: Ratio: Duration: Durée: Total Total Started %Ln time(s) Débuté %Ln fois Débuté %Ln fois Torrent Verifying local data Vérification des données locales Downloading En téléchargement Seeding Partage en cours Finished Términé Paused En pause Queued for verification En attente de vérification Queued for download En attente de téléchargement Queued for seeding En attente de partage Tracker gave a warning: %1 Le traqueur a envoyé un avertissement: %1 Tracker gave an error: %1 Le traqueur a signalé une erreur: %1 Error: %1 Erreur: %1 TorrentDelegate Magnetized transfer - retrieving metadata (%1%) First part of torrent progress string; %1 is the percentage of torrent metadata downloaded Tansfert Magnetisé - réception des méta-données (%1%) %1 of %2 (%3%) First part of torrent progress string; %1 is how much we've got, %2 is how much we'll have when done, %3 is a percentage of the two %1 sur %2 (%3%) %1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio, %6 is the ratio we want to reach before we stop uploading %1 sur %2 (%3%), envoyé %4 (Ratio: %5 Objectif: %6) %1 of %2 (%3%), uploaded %4 (Ratio: %5) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio %1 sur %2 (%3%), envoyé %4 (Ratio: %5) %1, uploaded %2 (Ratio: %3 Goal: %4) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio, %4 is the ratio we want to reach before we stop uploading %1, envoyé %2 (Ratio: %3 Objectif: %4) %1, uploaded %2 (Ratio: %3) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio %1, envoyé %2 (Ratio: %3) - %1 left Second (optional) part of torrent progress string; %1 is duration; notice that leading space (before the dash) is included here - %1 restant - Remaining time unknown Second (optional) part of torrent progress string; notice that leading space (before the dash) is included here - Temps restant inconnu Ratio: %1 Ratio: %1 Downloading from %Ln peer(s) First part of phrase "Downloading from ... peer(s) and ... web seed(s)" Téléchargement depuis %Ln pair Téléchargement depuis %Ln pairs Seeding to %Ln peer(s) Partage vers %Ln pair Partage vers %Ln pairs - - Downloading metadata from %Ln peer(s) (%1% done) Téléchargement des méta-données depuis %Ln pair (%1% fait) Téléchargement des méta-données depuis %Ln pairs (%1% fait) Downloading from %1 of %Ln connected peer(s) First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" Téléchargement depuis %1 sur %Ln pair connecté Téléchargement depuis %1 sur %Ln pairs connectés and %Ln web seed(s) Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; notice that leading space (before "and") is included here et %Ln serveur web et %Ln serveurs web Seeding to %1 of %Ln connected peer(s) Partage vers %1 de %Ln pair connecté Partage vers %1 de %Ln pairs connectés Error Erreur Verifying local data (%1% tested) Vérification des données locales (%1% testées) TrackerDelegate Got a list of%1 %Ln peer(s)%2 %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Liste de%1 %Ln pair%2 reçue il y a %3 Liste de%1 %Ln pairs%2 reçue il y a %3 Peer list request %1timed out%2 %3 ago; will retry %1 and %2 are replaced with HTML markup, %3 is duration La demande de la liste de pairs %1 a expiré il y a %2 %3; nouvelle tentative programmée Got an error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Erreur survenue %1"%2"%3 il y a %4 No updates scheduled Aucune mise à jour prévue Asking for more peers in %1 %1 is duration Demande d'autres pairs dans %1 Queued to ask for more peers En attente pour demander plus de pairs Asking for more peers now... <small>%1</small> %1 is duration Demande de pairs supplémentaires en cours... <small>%1</small> Tracker had%1 %Ln seeder(s)%2 First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup Le traqueur a%1 %Ln fournisseur%2 Le traqueur a%1 %Ln fournisseurs%2 and%1 %Ln leecher(s)%2 %3 ago Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup, %3 is duration; notice that leading space (before "and") is included here et%1 %Ln téléchargeur%2 il y a %3 et%1 %Ln téléchargeurs%2 il y a %3 Tracker had %1no information%2 on peer counts %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Le traqueur n'avait %1pas d'information%2 à propos du nombre de pairs %3 ago Got a scrape error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Reçu une erreur (scrape error) %1"%2"%3 il y a %4 Asking for peer counts in %1 %1 is duration Décompte des pairs dans %1 Queued to ask for peer counts Décompte des pairs en attente Asking for peer counts now... <small>%1</small> %1 is duration Décompte des pairs en cours... <small>%1</small> transmission-2.92/qt/translations/PaxHeaders.4960/transmission_eu.ts0000644000000000000000000000013212664476417022636 xustar0030 mtime=1456635151.988496386 30 atime=1456635151.988496386 30 ctime=1457295917.271761511 transmission-2.92/qt/translations/transmission_eu.ts0000644000175000017500000026235112664476417024274 0ustar00mikedldmikedld00000000000000 UTF-8 AboutDialog About Transmission Transmissioni buruz <b style='font-size:x-large'>Transmission %1</b> <b style='font-size:x-large'>Transmission %1</b> A fast and easy BitTorrent client BitTorrent bezero azkar eta erraz bat Copyright (c) The Transmission Project Copyrighta (c) Transmission Egitasmoa C&redits &Kreditoak &License &Baimena Credits Kreditoak Application <b>Transmission is a file sharing program.</b> <b>Transmission agiri elkarbanatze programa bat da.</b> When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. Torrent bati ekiten diozunean, bere datuak eskuragarri daude besteentzat igoera bidez. Elkarbanatzen duzun edozein eduki zeure erantzukizunezkoa besterik ez da. I &Agree &Onartzen dut Torrent Completed Torrenta Osatuta Torrent Added Torrenta Gehituta DetailsDialog None Ezer ez Mixed Nahastua Unknown Ezezaguna Finished Amaituta Paused Pausatuta Active now Jardunean orain %1 ago Duela %1 %1 (%Ln pieces @ %2) %1 (%Ln atal @ %2) %1 (%Ln atal @ %2) %1 (%Ln pieces) %1 (%Ln atal) %1 (%Ln atal) Private to this tracker -- DHT and PEX disabled Aztarnari honen pribatua -- DHT eta PEX ezgaituta Public torrent Torrent publikoa Created by %1 Sortzailea: %1 Created on %1 Sortua: %1 Created by %1 on %2 Sortua: %1 %2-an Encrypted connection Elkarkaketa enkriptatua Optimistic unchoke Itogabetasun baikorra Downloading from this peer Hartzaile honengandik jeisten We would download from this peer if they would let us Hartzaile honetatik jeitsiko genuke beraiek utziz gero Uploading to peer Hartzailera igotzen We would upload to this peer if they asked Hartzaile honetara igoko genuke beraiek galdetuz gero Peer has unchoked us, but we're not interested Hartzaileak itogabetu gaitu, baina ez gaude interesaturik We unchoked this peer, but they're not interested Hartzaile hau itogabetu dugu, baina beraiek ez daude interesaturik Peer was discovered through DHT Hartzailea DHT bidez aurkitu da Peer was discovered through Peer Exchange (PEX) Hartzailea (PEX) Hartzaile Aldaketa bidea aurkitu da Peer is an incoming connection Hartzailea barrurako elkarketa bat da minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minutu minutu Error Akatsa Tracker already exists. Aztarnaria jadanik badago. %1 (100%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data %1 (100%) %1 of %2 (%3%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data, %2 is overall size of torrent data, %3 is percentage (%1/%2*100) %1 --> %2 (%3%) %1 of %2 (%3%), %4 Unverified Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded data (both verified and unverified), %2 is overall size of torrent data, %3 is percentage (%1/%2*100), %4 is amount of downloaded but not yet verified data %1 --> %2 (%3%), %4 Egiaztatu gabe %1 (%2 corrupt) %1 (%2 hondatuta) %1 (Ratio: %2) %1 (Maila: %2) N/A E/G Peer is connected over uTP Hartzailea uTP bidez elkarketaturik dago Add URL Gehitu URL-a Add tracker announce URL: Gehitu aztarnari iragarpen URL-a: Invalid URL "%1" URL baliogabea "%1" Edit URL Editatu URL-a Edit tracker announce URL: Editatu aztarnari iragarpen URL-a: High Handia Normal Arrunta Low Apala Use Global Settings Erabili Ezarpen Orokorrak Seed regardless of ratio Emaritu maila kontuan izan gabe Stop seeding at ratio: Gelditu emaritza maila honetan: Seed regardless of activity Emaritu jarduera kontuan izan gabe Stop seeding if idle for: Gelditu emaritza jardungabe badago: Up Igotzen Down Jeisten % % Status Egoera Address Helbidea Client Bezeroa Torrent Properties Torrent Ezaugarriak Information Argibideak Activity Jarduera Have: Du: Availability: Eskuragarritasuna: Uploaded: Igota: Downloaded: Jeitsita: State: Egoera: Running time: Jardun denbora: Remaining time: Gelditzen den denbora: Last activity: Azken jarduera: Error: Akatsa: Details Xehetasunak Size: Neurria: Location: Kokalekua: Hash: Hasha: Privacy: Pribatutasuna: Origin: Jatorria: Comment: Aipamena: Peers Hartzaileak Tracker Aztarnaria Add Tracker Gehitu Aztarnaria Edit Tracker Editatu Aztarnaria Remove Trackers Kendu Aztarnariak Show &more details Erakutsi &xehetasun gehiago Show &backup trackers Erakutsi &babeskopia aztarnariak Files Agiriak Options Aukerak Speed Abiadura Honor global &limits &Ohorezko muga orokorrak Limit &download speed: &Mugatu jeisketa abiadura: Limit &upload speed: M&ugatu igoera abiadura: Torrent &priority: &Torrent lehentasuna: Seeding Limits Emaritza Mugak &Ratio: M&aila: &Idle: &Jardungabe: Peer Connections Hartzaile Elkarketak &Maximum peers: &Gehienezko hartzaile: FileAdded Add Torrent Gehitu Torrenta <p><b>Unable to add "%1".</b></p><p>It is a duplicate of "%2" which is already added.</p> <p><b>Ezinezkoa "%1" gehitzea.</b></p><p>Jadanik gehituta dagoen "%2"-ren bikoizketa da.</p> Error Adding Torrent Akatsa Torrenta Gehitzerakoan FileTreeItem Low Apala High Handia Normal Arrunta Mixed Nahastua FileTreeModel File Agiria Size Neurria Progress Garapena Download Jeitsi Priority Lehentasuna FileTreeView Check Selected Aukeratu Hautatua Uncheck Selected Desaukeratu Hautatua Only Check Selected Aukeratu Hautatua Bakarrik Priority Lehentasuna Open Ireki Rename... Berrizendatu... FilterBar All Denak Active Jardunean Downloading Jeisten Seeding Emaritzan Paused Pausatuta Finished Amaituta Verifying Egiaztatzen Error Akatsa Show: Erakutsi: FilterBarLineEdit Search... Bilatu Formatter B/s B/s kB/s kB/s MB/s MB/s GB/s GB/s TB/s TB/s B B kB kB MB MB GB GB TB TB KiB KiB MiB MiB GiB GiB TiB TiB Unknown Ezezaguna None Ezer ez %1 %2 %1 %2 %Ln day(s) %Ln egun %Ln egun %Ln hour(s) %Ln ordu %Ln ordu %Ln minute(s) %Ln minutu %Ln minutu %Ln second(s) %Ln segundu %Ln segundu %1, %2 %1, %2 FreeSpaceLabel <i>Calculating Free Space...</i> <i>Toki Askea Kalkulatzen...</i> %1 free %1 aske LicenseDialog License Baimena MainWindow Transmission Transmission &Torrent &Torrenta &Edit &Editatu &Help &Laguntza &View &Ikusi &File &Agiria &New... &Berria... Create a new torrent Sortu torrent berri bat &Properties &Ezaugarriak Show torrent properties Erakutsi torrentaren ezaugarriak Open the torrent's folder Ireki torrentaren agiritegia Queue Lerrokatu &Open... &Ireki... Open Ireki Open a torrent Ireki torrent bat Open Fold&er &Ireki Agiritegia &Start &Hasi Start torrent Hasi torrenta Ask Tracker for &More Peers &Galdetu Aztarnariari Hartzaile Gehiagoz Ask tracker for more peers Galdetu aztarnariari hartzaile gehiagoz &Pause &Pausatu Pause torrent Pausatu torrenta &Verify Local Data Egiaztatu &Tokiko Datuak Verify local data Egiaztatu tokiko datuak &Remove &Kendu Remove torrent Kendu torrenta &Delete Files and Remove E&zabatu Agiriak eta Kendu Remove torrent and delete its files Kendu torrenta eta ezabatu bere agiriak &Start All &Hasi Denak &Pause All &Pausatu Denak &Quit Ut&zi &Select All Hautatu &Denak &Deselect All &Ezhautatu Denak &Preferences &Hobespenak &Compact View &Ikuspegi Trinkoa Compact View Ikuspegi Trinkoa &Toolbar &Tresnabarra &Filterbar I&ragazkibarra &Statusbar &Egoerabarra Sort by &Activity Antolatu &Jardueraz Sort by A&ge Antolatu &Adinez Sort by Time &Left Antolatu Gelditzen &Denboraz Sort by &Name Antolatu I&zenez Sort by &Progress Antolatu &Garapenez Sort by Rati&o Antolatu &Mailaz Sort by Si&ze Antolatu &Neurriz Sort by Stat&e Antolat&u Egoeraz Sort by T&racker Antolatu Az&tarnariz Message &Log Mezu &Oharra &Statistics &Estatistikak &Contents Ed&ukiak &About Honi &Buruz Re&verse Sort Order Alderantzizkatu Antolakuntza &Hurrenkera &Name &Izena &Files &Agiriak &Tracker A&ztarnaria Total Ratio Maila Guztira Session Ratio Saio Maila Total Transfer Eskualdaketa Guztira Session Transfer Saioan Eskualdatuta &Main Window Leiho &Nagusia Tray &Icon Erretilu &Ikurra &Change Session... &Aldatu Saioa... Choose Session Start a local session or connect to a running session Hautatu Saioa Set &Location... Ez&arri Kokalekua... &Copy Magnet Link to Clipboard Kopiatu &Magnet Lotura Gakora Open &URL... Ireki &URL-a... &Donate &Dirulaguntza Start &Now Hasi &Orain Bypass the queue and start now Ezikusi lerroa eta hasi orain Move to &Top Mugitu &Goren Move &Up Mugitu G&ora Move &Down Mugitu B&ehera Move to &Bottom Mugitu &Beheren Sort by &Queue Antolatu &Lerroz Limit Download Speed Mugatu Jeisketa Abiadura Unlimited Mugagabea Limited at %1 Muga: %1 Limit Upload Speed Mugatu Igoera Abiadura Stop Seeding at Ratio Gelditu Emaritza Maila honetan Seed Forever Emaritu Etengabe Stop at Ratio (%1) Gelditu Maila honetan (%1) - %1:%2 Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); notice that leading space (before the dash) is included here - %1:%2 Idle Jardungabe Ratio: %1 Maila: %1 Down: %1, Up: %2 Jeisketa: %1, Igoera: %2 Torrent Files (*.torrent);;All Files (*.*) Torrent Agiriak (*.torrent);;Agiri Guzitak (*.*) Show &options dialog Erakutsi a&ukera elkarrizketa Open Torrent Ireki Torrenta Speed Limits Abiadura Mugak Network Error Sare Akatsa Click to disable Temporary Speed Limits (%1 down, %2 up) Klikatu Aldibaterako Abiadura Mugak ezgaitzeko (%1 jeitsiera, %2 igoera) Click to enable Temporary Speed Limits (%1 down, %2 up) Klikatu Aldibaterako Abiadura Mugak gaitzeko (%1 jeitsiera, %2 igoera) Remove torrent? Kendu torrenta? Delete this torrent's downloaded files? Ezabatu jeitsitako torrent honen agiriak? Remove %Ln torrent(s)? Kendu %Ln torrent? Kendu %Ln torrent? Showing %L1 of %Ln torrent(s) Erakusten %L1 -> %Ln torrent Erakusten %L1 -> %Ln torrent Delete these %Ln torrent(s)' downloaded files? Ezabatu jeitsitako %Ln torrent hauen agiriak? Ezabatu jeitsitako %Ln torrent hauen agiriak? Once removed, continuing the transfer will require the torrent file or magnet link. Behin kenduta, eskualdaketarekin jarraitzeak torrent agiria edo magnet lotura beharko du. Once removed, continuing the transfers will require the torrent files or magnet links. Behin kenduta, eskualdaketekin jarraitzeak torrent agiriak edo magnet loturak beharko ditu. This torrent has not finished downloading. Torrent honek ez dut jeisketa amaitu. These torrents have not finished downloading. Torrent hauek ez dute jeisketa amaitu. This torrent is connected to peers. Torrent hau hartzailetara elkarketaturik dago. These torrents are connected to peers. Torrent hauek hartzailetara elkarketaturik daude. One of these torrents is connected to peers. Torrent hauetako bat hartzailetara elkarketaturik dago. Some of these torrents are connected to peers. Torrent hauetako batzuk hartzailetara elkarketaturik daude. One of these torrents has not finished downloading. Torrent hauetako batek ez du jeisketa amaitu. Some of these torrents have not finished downloading. Torrent hauetako batzuk ez dute jeisketa amaitu. %1 has not responded yet %1 ez du oraindik erantzun %1 is responding %1 erantzuten ari da %1 last responded %2 ago %1 azken erantzuna duela %2 %1 is not responding %1 ez du erantzuten MakeDialog New Torrent Torrent Berria <i>No source selected<i> <i>Ez dago iturbururik hautatuta<i> %Ln File(s) %Ln Agiri %Ln Agiri %Ln Piece(s) %Ln Atal %Ln Atal %1 in %2; %3 @ %4 %1 -> %2; %3 @ %4 Files Agiriak Sa&ve to: &Gorde hemen: Source f&older: &Iturburu agiritegia: Source &file: I&turburu Agiria: Properties Ezaugarriak &Trackers: A&ztarnariak: To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. Babeskopia URL bat gehitzeko, gehitu hura lehen URL-aren ondorengo lerroan. Beste lehen URL bat gehitzeko, gehitu hura lerro huts baten ondoren. Co&mment: &Aipamena: &Private torrent &Torrent pribatua MakeProgressDialog New Torrent Torrent Berria Creating "%1" "%1" sortzen Created "%1"! "%1" sortuta! Error: invalid announce URL "%1" Akatsa: iragarpen URL baliogabea "%1" Cancelled Ezeztatuta Error reading "%1": %2 Akatsa irakurtzen "%1": %2 Error writing "%1": %2 Akatsa idazten "%1": %2 OptionsDialog Open Torrent Ireki Torrenta Open Torrent from File Ireki Torrenta Agiritik Open Torrent from URL or Magnet Link Ireki Torrenta URL edo Magnet Loturatik &Source: &Iturburua: &Destination folder: &Helmuga agiritegia: High Handia Normal Arrunta Low Apala &Priority: &Lehentasuna: S&tart when added H&asi gehitutakoan &Verify Local Data &Egiaztatu Tokiko Datuak Mo&ve .torrent file to the trash &Mugitu .torrent agiria zakarrontzira Torrent Files (*.torrent);;All Files (*.*) Torrent Agiriak (*.torrent);;Agiri Denak (*.*) Select Destination Hautatu Helmuga PathButton (None) (Ezer ez) Select Folder Hautatu Agiritegia Select File Hautatu Agiria PrefsDialog Use &authentication E&rabili egiaztapena &Username: &Erabiltzaile-izena: Pass&word: &Sarhitza: &Open web client &Ireki web bezeroa Addresses: Helbideak: Speed Limits Abiadura Mugak <small>Override normal speed limits manually or at scheduled times</small> <small>Ezeztatu abiadura muga arruntak eskuz edo denborak egitarautuz</small> &Scheduled times: Egitarautu &denborak: &On days: Eg&unak: Every Day Egunero Weekdays Lanegunak Weekends Asteburuak Sunday Igandea Monday Astelehena Tuesday Asteartea Wednesday Asteazkena Thursday Osteguna Friday Ostirala Saturday Larunbata Port is <b>open</b> Ataka <b>irekita</b> dago Port is <b>closed</b> Ataka <b>itxita</b> dago Incoming Peers Barrurako Hartzaileak Status unknown Egoera ezezaguna &Port for incoming connections: &Barrurako elkarketentzako ataka: Use UPnP or NAT-PMP port &forwarding from my router &Erabili UPnP edo NAT-PMP ataka bidalketa nire bideratzailetik Options Aukerak Enable &uTP for peer connections Gaitu &uTP hartzaile elkarketentzat uTP is a tool for reducing network congestion. uTP sare betekada murrizteko tresna bat da. minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minutu minutu minute(s) ago Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) minutu duela minutu duela Automatically add .torrent files &from: &Berezgaitasunez gehitu .torrent agiriak hemendik: Show the Torrent Options &dialog Erakutsi &Torrentaren Aukera elkarrizketa &Start added torrents &Hasi gehitutako torrentak Mo&ve the .torrent file to the trash &Mugitu .torrent agiriak zakarrontzira Download Queue Jeisketa Lerroa Ma&ximum active downloads: Gehienezko &jeisketa eraginda: Incomplete Osatugabe Seeding Emaritzan Remote Hurrunekoa <i>Blocklist contains %Ln rule(s)</i> <i>Blokeo-zerrendak ditu %Ln arau</i> <i>Blokeo-zerrendak %Ln arau ditu</i> Pick a &random port every time Transmission is started &Hautatu zorizko ataka bat Transmission abiarazten den bakoitzean Limits Mugak Maximum peers per &torrent: Gehinezko hartzaile &torrenteko: Maximum peers &overall: Gehinezko hartzaile &orotara: <b>Update succeeded!</b><p>Blocklist now has %Ln rule(s). <b>Eguneraketa eginda!</b><p>Blokeo-zerrendak orain %Ln arau ditu. <b>Eguneraketa eginda!</b><p>Blokeo-zerrendak orain %Ln arau ditu. <b>Update Blocklist</b><p>Getting new blocklist... <b>Eguneratu Blokeo-zerrenda</b><p>Blokeo-zerrenda berria lortzen... Blocklist Blokeo-zerrenda Enable &automatic updates Gaitu &berezgaitasunezko eguneraketak Allow encryption Ahalbidetu enkriptaketa Prefer encryption Hobetsi enkriptaketa Require encryption Beharrezkoa enkriptaketa Privacy Pribatutasuna &to &hona Desktop Mahaigaina Show Transmission icon in the &notification area Erakutsi &Transmission ikurra jakinarazpen eremuan Te&st Port &Ataka Azterketa Enable &blocklist: Gaitu blokeo-&zerrenda: &Update &Eguneraketa &Encryption mode: Enkriptaketa &modua: Remote Control Hurruneko Agintea Allow &remote access Ahalbidetu h&urruneko sarbidea HTTP &port: HTTP &ataka: Only allow these IP a&ddresses: A&halbidetu IP helbide hauek bakarrik: &Upload: &Igoera: &Download: &Jeitsera: Alternative Speed Limits Aurkerazko Abiadura Mugak U&pload: I&goera: Do&wnload: J&eitsiera: Start &minimized in notification area &Hasi jakinarazpen eremuan ikurtuta Notification Jakinarazpena Show a notification when torrents are a&dded &Erakutsi jakinarazpen bat torreta gehitzen denean Show a notification when torrents &finish E&rakutsi jakinarazpen bat torrentak amaitzean Play a &sound when torrents finish &Jo soinu bat torrentek amaitzean Testing TCP Port... TCP Ataka aztertzen... Peer Limits Hartzaile Mugak Use PE&X to find more peers Erabili PE&X hartzaile gehiago bilatzeko PEX is a tool for exchanging peer lists with the peers you're connected to. PEX elkarketaturik zauden hartzaileekin hartzaile zerrendak elkarraldatzeko tresna bat da. Use &DHT to find more peers Erabili &DHT hartzaile gehiago bilatzeko DHT is a tool for finding peers without a tracker. DHT aztarnari gabeko hartzaileak bilatzeko tresna bat da. Use &Local Peer Discovery to find more peers Erabili To&kiko Hartzaile Aurkikuntza hartzaile gehiago bilatzeko LPD is a tool for finding peers on your local network. LPD zure tokiko zarean hartzaile gehiago bilatzeko tresna bat da. Encryption Enkriptaketa Select "Torrent Done" Script Hautatu "Torrenta Eginda" Eskripta Select Incomplete Directory Hautatu Osatugabeko Zuzenbidea Select Watch Directory Hautatu Ikusi Zuzenbidea Select Destination Hautatu Helmuga Adding Gehiketa Download is i&nactive if data sharing stopped: Please keep this phrase as short as possible, it's curently the longest and influences dialog width Jeisketa &jardungabe elkabanatzea geldik badago: Downloading Jeisten Append ".&part" to incomplete files' names &Erantsi ".part" osatugabeko agiri izenei Keep &incomplete files in: &Gorde osatugabeko agiriak hemen: Save to &Location: Gorde &Kokaleku honetan: Call scrip&t when torrent is completed: &Deitu eskripta torrenta osatutakoan: Stop seeding at &ratio: &Gelditu emaritza maila honetan: Stop seedi&ng if idle for: Gelditu emarit&za jardungabe badago: Transmission Preferences Transmission Hobespenak Speed Abiadura Network Sarea Not supported by remote sessions Ez dago sostengaturik hurruneko saioentzat QObject Invalid option Aukera baliogabea RelocateDialog Select Location Hautatu Kokalekua Set Torrent Location Ezarri Torrentaren Kokalekua Set Location Ezarri Kokalekua New &location: &Kokaleku berria: &Move from the current folder &Mugitu oraingo agiritegitik Local data is &already there &Tokiko datuak jadanik hor daude Session Error Renaming Path Akatsa Helburua Berrizendatzerakoan <p><b>Unable to rename "%1" as "%2": %3.</b></p> <p>Please correct the errors and try again.</p> <p><b>Ezinezkoa berreizendatzea "%1" -> "%2": %3.</b></p> <p>Mesedez zuzendu akatsak eta saiatu berriro.</p> Add Torrent Gehitu Torrenta SessionDialog Change Session Aldatu Saioa Source Iturburua Start &Local Session Hasi &Tokiko Saioa Connect to &Remote Session Elkarketatu H&urruneko Saiora &Host: &Hostalaria: &Port: &Ataka: &Authentication required &Egiaztapena beharrezkoa &Username: Erabiltzaile-&izena: Pass&word: &Sarhitza: StatsDialog Statistics Estatistikak Current Session Oraingo Saioa Uploaded: Igota: Downloaded: Jeitsita: Ratio: Maila: Duration: Iraupena: Total Guztira Started %Ln time(s) Hasita %Ln aldiz Hasita %Ln aldiz Torrent Verifying local data Tokiko datuak egiaztatzen Downloading Jeisten Seeding Emaritzan Finished Amaituta Paused Pausatuta Queued for verification Egiaztapenerako lerrokatuta Queued for download Jeisteko lerrokatuta Queued for seeding Emaritzarako lerrokatuta Tracker gave a warning: %1 Aztarnariak arrisku bat eman du: %1 Tracker gave an error: %1 Aztarnariak akats bat eman du: %1 Error: %1 Akatsa: %1 TorrentDelegate Magnetized transfer - retrieving metadata (%1%) First part of torrent progress string; %1 is the percentage of torrent metadata downloaded Magneturiko eskualdaketa - metadatu berreskurapena (%1%) %1 of %2 (%3%) First part of torrent progress string; %1 is how much we've got, %2 is how much we'll have when done, %3 is a percentage of the two %1 --> %2 (%3%) %1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio, %6 is the ratio we want to reach before we stop uploading %1 --> %2 (%3%), igota %4 (Maila: %5 Xedea: %6) %1 of %2 (%3%), uploaded %4 (Ratio: %5) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio %1 --> %2 (%3%), igota %4 (Maila: %5) %1, uploaded %2 (Ratio: %3 Goal: %4) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio, %4 is the ratio we want to reach before we stop uploading %1, igota %2 (Maila: %3 Xedea: %4) %1, uploaded %2 (Ratio: %3) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio %1, igota %2 (Maila: %3) - %1 left Second (optional) part of torrent progress string; %1 is duration; notice that leading space (before the dash) is included here - %1 gelditzen d(ir)a - Remaining time unknown Second (optional) part of torrent progress string; notice that leading space (before the dash) is included here - Gelditzen den denbora ezezaguna Ratio: %1 Maila: %1 Downloading from %Ln peer(s) First part of phrase "Downloading from ... peer(s) and ... web seed(s)" Jeisten %1 --> %Ln elkarketaturiko hartzailetik Jeisten %1 --> %Ln elkarketaturiko hartzailetik Seeding to %Ln peer(s) %Ln hartzailera emaritzen %Ln hartzailera emaritzen - - Downloading metadata from %Ln peer(s) (%1% done) Metadatuak jeisten %Ln hartzailetik (%1% eginda) Metadatuak jeisten %Ln hartzailetik (%1% eginda) Downloading from %1 of %Ln connected peer(s) First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" Jeisten %1 --> %Ln elkarketaturiko hartzailetik Jeisten %1 --> %Ln elkarketaturiko hartzailetik and %Ln web seed(s) Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; notice that leading space (before "and") is included here eta %Ln web emaritza eta %Ln web emaritza Seeding to %1 of %Ln connected peer(s) %1 --> %Ln elkarturiko hartzailera emaritzen %1 --> %Ln elkarturiko hartzailera emaritzen Error Akatsa Verifying local data (%1% tested) Tokiko datuak egiaztatzen (%1% aztertuta) TrackerDelegate Got a list of%1 %Ln peer(s)%2 %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Zerrenda:%1 %Ln hartzaile%2 %3 Zerrenda:%1 %Ln hartzaile%2 %3 Peer list request %1timed out%2 %3 ago; will retry %1 and %2 are replaced with HTML markup, %3 is duration Hartzaile zerrenda eskaera %1denboraz kanpo%2 %3 ; besaiatuko da Got an error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Akatsa: %1"%2"%3 %4 No updates scheduled Ez dago eguneraketarik egitaraututa Asking for more peers in %1 %1 is duration Hartzaile gehiagogaitik galdetzen: %1 Queued to ask for more peers Lerrokatuta hartzaile gehiagogaitik galdetzeko Asking for more peers now... <small>%1</small> %1 is duration Hartzaile gehiagogaitik galdetzen orain... <small>%1</small> Tracker had%1 %Ln seeder(s)%2 First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup Aztarnariak du%1 %Ln emale%2 Aztarnariak du%1 %Ln emale%2 and%1 %Ln leecher(s)%2 %3 ago Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup, %3 is duration; notice that leading space (before "and") is included here eta%1 %Ln izain%2 %3 eta%1 %Ln izain%2 %3 Tracker had %1no information%2 on peer counts %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Aztarnariak du %1argibiderik ez%2 hartzaile zenbatekoan duela %3 Got a scrape error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Zuriketa akatsa: %1"%2"%3 %4 Asking for peer counts in %1 %1 is duration Hartzaile zenbatekoaz galdetzen: %1 Queued to ask for peer counts Lerrokatuta hartzaile zenbatekoaz galdetzeko Asking for peer counts now... <small>%1</small> %1 is duration Hartzaile zenbatekoagaitik galdetzen orain... <small>%1</small> transmission-2.92/qt/translations/PaxHeaders.4960/transmission_ru.ts0000644000000000000000000000013212664476417022653 xustar0030 mtime=1456635151.994496489 30 atime=1456635151.994496489 30 ctime=1457295917.276761596 transmission-2.92/qt/translations/transmission_ru.ts0000644000175000017500000030705512664476417024312 0ustar00mikedldmikedld00000000000000 UTF-8 AboutDialog About Transmission О «Transmission» <b style='font-size:x-large'>Transmission %1</b> <b style='font-size:x-large'>Transmission %1</b> A fast and easy BitTorrent client ПроÑтой и быÑтрый BitTorrent-клиент Copyright (c) The Transmission Project © Transmission Project, 2005-2015 C&redits Ð&вторы &License &Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Credits Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± авторах Application <b>Transmission is a file sharing program.</b> <b>Transmission — программа обмена файлами.</b> When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. Когда вы запуÑкаете торрент, его данные будут доÑтупны другим в результате загрузки. Ð’Ñ‹ отвечаете за вÑе данные, которые вы раздаете. I &Agree &Принимаю Torrent Completed Торрент завершен Torrent Added Торрент добавлен DetailsDialog None Ðет Mixed Смешанный Unknown ÐеизвеÑтно Finished Завершено Paused ПриоÑтановлено Active now Ðктивен ÑÐµÐ¹Ñ‡Ð°Ñ %1 ago %1 тому назад %1 (%Ln pieces @ %2) %1 (%Ln чаÑть @ %2) %1 (%Ln чаÑти @ %2) %1 (%Ln чаÑтей @ %2) %1 (%Ln pieces) %1 (%Ln чаÑть) %1 (%Ln чаÑти) %1 (%Ln чаÑтей) Private to this tracker -- DHT and PEX disabled Только Ð´Ð»Ñ Ñтого трекера — DHT и PEX отключены Public torrent Публичный торрент Created by %1 Создан %1 Created on %1 Создан %1 Created by %1 on %2 Создан %1, %2 Encrypted connection Зашифрованное Ñоединение Optimistic unchoke БлагоприÑÑ‚Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° Downloading from this peer Загрузка Ñ Ñтого пира We would download from this peer if they would let us Возможен прием данных от Ñтого пира, еÑли он позволит Uploading to peer Отдача пиру We would upload to this peer if they asked Возможна отдача данных Ñтому пиру, еÑли он будет заинтереÑован Peer has unchoked us, but we're not interested Пир ÑоглаÑен передавать данные, но мы не заинтереÑованы We unchoked this peer, but they're not interested Передача пиру была разрешена, но он не заинтереÑован Peer was discovered through DHT Пир был обнаружен через DHT Peer was discovered through Peer Exchange (PEX) Пир был обнаружен через Peer Exchange (PEX) Peer is an incoming connection Пир работает в режиме приема minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) минута минуты минут Error Ошибка Tracker already exists. Трекер уже ÑущеÑтвует. %1 (100%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data %1 (100%) %1 of %2 (%3%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data, %2 is overall size of torrent data, %3 is percentage (%1/%2*100) %1 из %2 (%3%) %1 of %2 (%3%), %4 Unverified Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded data (both verified and unverified), %2 is overall size of torrent data, %3 is percentage (%1/%2*100), %4 is amount of downloaded but not yet verified data %1 из %2 (%3%), не подтверждено %4 %1 (%2 corrupt) %1 (%2 повреждено) %1 (Ratio: %2) %1 (Рейтинг: %2) N/A Ð/Д Peer is connected over uTP Пир подключен через uTP Add URL Добавить URL Add tracker announce URL: Добавить URL-Ð°Ð´Ñ€ÐµÑ Ð¾Ð±ÑŠÑвлений трекера: Invalid URL "%1" ÐедопуÑтимый URL-Ð°Ð´Ñ€ÐµÑ "%1" Edit URL Изменить URL Edit tracker announce URL: Изменить URL-Ð°Ð´Ñ€ÐµÑ Ð¾Ð±ÑŠÑвлений трекера: High Ð’Ñ‹Ñокий Normal Обычный Low Ðизкий Use Global Settings ИÑпользовать общие наÑтройки Seed regardless of ratio Раздавать незавиÑимо от рейтинга Stop seeding at ratio: Прекратить раздачу при рейтинге: Seed regardless of activity Раздавать незавиÑимо от активноÑти Stop seeding if idle for: Прекратить раздачу при проÑтое: Up Раздача Down Прием % % Status Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Address ÐÐ´Ñ€ÐµÑ Client Клиент Torrent Properties СвойÑтва торрента Information Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Activity ÐктивноÑть Have: Ð’ наличии: Availability: ДоÑтупноÑть: Uploaded: Отдано: Downloaded: Загружено: State: СоÑтоÑние: Running time: ДлительноÑть: Remaining time: ОÑтавшееÑÑ Ð²Ñ€ÐµÐ¼Ñ: Last activity: ПоÑледнÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ñть: Error: Ошибка: Details Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Size: Размер: Location: РаÑположение: Hash: Хеш: Privacy: КонфиденциальноÑть: Origin: ПроиÑхождение: Comment: Комментарий: Peers Пиры Tracker Трекер Add Tracker Добавить трекер Edit Tracker Редактировать трекер Remove Trackers Удалить трекеры Show &more details Показать &больше Ñведений Show &backup trackers Показать &резервные трекеры Files Файлы Options Параметры Speed СкороÑть Honor global &limits Учитывать глобальные ограничени&Ñ Limit &download speed: Ограничить ÑкороÑть &загрузки: Limit &upload speed: Ограничить ÑкороÑть &раздачи: Torrent &priority: &Приоритет торрента: Seeding Limits ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð´Ð°Ñ‡Ð¸ &Ratio: &Рейтинг: &Idle: &Ожидание: Peer Connections Ð¡Ð¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¸Ñ€Ð°Ð¼Ð¸ &Maximum peers: &МакÑимальное количеÑтво пиров: FileAdded Add Torrent Добавить торрент <p><b>Unable to add "%1".</b></p><p>It is a duplicate of "%2" which is already added.</p> <p><b>Ðевозможно добавить "%1".</b></p><p>Он дублирует "%2", который уже добавлен.</p> Error Adding Torrent Ошибка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ñ€Ñ€ÐµÐ½Ñ‚Ð° FileTreeItem Low Ðизкий High Ð’Ñ‹Ñокий Normal Обычный Mixed Смешанный FileTreeModel File Файл Size Объем Progress ВыполнÑетÑÑ Download Загрузка Priority Приоритет FileTreeView Check Selected Отметить выбранное Uncheck Selected СнÑть отметку Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ Only Check Selected Отметить только выбранное Priority Приоритет Open Открыть Rename... Переименовать... FilterBar All Ð’Ñе Active Ðктивные Downloading Загрузки Seeding Раздачи Paused ПриоÑтановленные Finished Завершенные Verifying Проверки Error Ошибки Show: Показать: FilterBarLineEdit Search... ПоиÑк... Formatter B/s Б/Ñ kB/s кБ/Ñ MB/s МБ/Ñ GB/s ГБ/Ñ TB/s ТБ/Ñ B Б kB кБ MB МБ GB ГБ TB ТБ KiB КиБ MiB МиБ GiB ГиБ TiB ТиБ Unknown ÐеизвеÑтно None Ðет данных %1 %2 %1 %2 %Ln day(s) %Ln день %Ln Ð´Ð½Ñ %Ln дней %Ln hour(s) %Ln Ñ‡Ð°Ñ %Ln чаÑа %Ln чаÑов %Ln minute(s) %Ln минута %Ln минуты %Ln минут %Ln second(s) %Ln Ñекунда %Ln Ñекунды %Ln Ñекунд %1, %2 %1, %2 FreeSpaceLabel <i>Calculating Free Space...</i> <i>ВычиÑлÑетÑÑ Ñвободное меÑто...</i> %1 free %1 Ñвободно LicenseDialog License Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ MainWindow Transmission Transmission &Torrent &Торрент &Edit &Правка &Help &Справка &View &Вид &File &Файл &New... &Создать... Create a new torrent Создать новый торрент &Properties &СвойÑтва Show torrent properties Отобразить ÑвойÑтва торрента Open the torrent's folder Открыть папку торрента Queue Очередь &Open... &Открыть... Open Открыть Open a torrent Открыть файл Open Fold&er Откр&ыть папку &Start З&апуÑтить Start torrent ЗапуÑтить торрент Ask Tracker for &More Peers Зап&роÑить у трекера больше пиров Ask tracker for more peers ЗапроÑить у трекера больше пиров &Pause &ПриоÑтановить Pause torrent ПриоÑтановить торрент &Verify Local Data Про&верить локальные данные Verify local data Проверить локальные данные &Remove &Удалить Remove torrent Удалить торрент &Delete Files and Remove Удалить &файлы и данные Remove torrent and delete its files Удалить торрент и файлы &Start All &ЗапуÑтить вÑе &Pause All &ПриоÑтановить вÑе &Quit Ð’&ыход &Select All Ð’Ñ‹&брать вÑе &Deselect All &Отменить вÑе &Preferences Ð&аÑтройки &Compact View &Компактный вид Compact View Компактный вид &Toolbar Панель &инÑтрументов &Filterbar Панель &фильтров &Statusbar Строка ÑоÑто&ÑÐ½Ð¸Ñ Sort by &Activity Сортировать по &активноÑти Sort by A&ge Сортировать по &возраÑту Sort by Time &Left Сортировать по &оÑтавшемуÑÑ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ Sort by &Name Сортировать по &названию Sort by &Progress Сортировать по Ñтепени &загрузки Sort by Rati&o Сортировать по ре&йтингу Sort by Si&ze Сортировать по &размеру Sort by Stat&e Сортировать по &ÑоÑтоÑнию Sort by T&racker Сортировать по &поÑледовательноÑти Message &Log &Журнал Ñообщений &Statistics &СтатиÑтика &Contents Со&держание &About О програ&мме Re&verse Sort Order Обра&тный порÑдок Ñортировки &Name &Ðазвание &Files &Файлы &Tracker &Трекер Total Ratio Общий рейтинг Session Ratio Рейтинг ÑеанÑа Total Transfer Ð’Ñего передано Session Transfer Передано за ÑÐµÐ°Ð½Ñ &Main Window &Главное окно Tray &Icon &Значок в облаÑти уведомлений &Change Session... &Сменить ÑеанÑ... Choose Session Start a local session or connect to a running session Выбрать ÑÐµÐ°Ð½Ñ Set &Location... Указать &папку... &Copy Magnet Link to Clipboard С&копировать magnet-ÑÑылку в буфер обмена Open &URL... О&ткрыть URL... &Donate &Пожертвовать Start &Now ЗапуÑтить ÑÐµÐ¹Ñ‡Ð°Ñ Bypass the queue and start now ПропуÑтить очередь и запуÑтить ÑÐµÐ¹Ñ‡Ð°Ñ Move to &Top ПеремеÑтить на Ñамый верх Move &Up ПеремеÑтить выше Move &Down ПеремеÑтить ниже Move to &Bottom ПеремеÑтить в Ñамый низ Sort by &Queue Сортировать по очередноÑти Limit Download Speed Ограничить ÑкороÑть загрузки Unlimited Ðе ограничено Limited at %1 Ограничено до %1 Limit Upload Speed Ограничить ÑкороÑть раздачи Stop Seeding at Ratio Прекратить раздачу при рейтинге Seed Forever Раздавать вÑегда Stop at Ratio (%1) ОÑтановить при рейтинге (%1) - %1:%2 Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); notice that leading space (before the dash) is included here - %1:%2 Idle Ожидание Ratio: %1 Рейтинг: %1 Down: %1, Up: %2 ПринÑто: %1, Отдано: %2 Torrent Files (*.torrent);;All Files (*.*) Торрент-файлы (*.torrent);;Ð’Ñе файлы (*.*) Show &options dialog Показать диалоговое окно &наÑтроек Open Torrent Открыть торрент Speed Limits ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти Network Error Ошибка Ñети Click to disable Temporary Speed Limits (%1 down, %2 up) Ðажмите Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ… ограничений ÑкороÑти (%1 загрузка, %2 раздача) Click to enable Temporary Speed Limits (%1 down, %2 up) Ðажмите Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ… ограничений ÑкороÑти (%1 загрузка, %2 раздача) Remove torrent? Удалить торрент? Delete this torrent's downloaded files? Удалить загруженные файлы Ñтого торрента? Remove %Ln torrent(s)? Удалить %Ln торрент? Удалить %Ln торрента? Удалить %Ln торрентов? Showing %L1 of %Ln torrent(s) ОтображаетÑÑ %L1 из %Ln торрентов ОтображаетÑÑ %L1 из %Ln торрентов ОтображаетÑÑ %L1 из %Ln торрентов Delete these %Ln torrent(s)' downloaded files? Удалить загруженные файлы Ñтого %Ln торрента? Удалить загруженные файлы Ñтих %Ln торрентов? Удалить загруженные файлы Ñтих %Ln торрентов? Once removed, continuing the transfer will require the torrent file or magnet link. ПоÑле ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð´Ð°Ñ‡Ð¸ потребуетÑÑ Ñ‚Ð¾Ñ€Ñ€ÐµÐ½Ñ‚-файл или magnet-ÑÑылка. Once removed, continuing the transfers will require the torrent files or magnet links. ПоÑле ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð´Ð°Ñ‡Ð¸ потребуютÑÑ Ñ‚Ð¾Ñ€Ñ€ÐµÐ½Ñ‚-файлы или magnet-ÑÑылки. This torrent has not finished downloading. Загрузка Ñтого торрента не завершена. These torrents have not finished downloading. Загрузка Ñтих торрентов не завершена. This torrent is connected to peers. Этот торрент подключен к пирам. These torrents are connected to peers. Эти торренты подключены к пирам. One of these torrents is connected to peers. Один из Ñтих торрентов подключен к узлам. Some of these torrents are connected to peers. Ðекоторые из Ñтих торрентов подключены к пирам. One of these torrents has not finished downloading. Загрузка одного из Ñтих торрентов не завершена. Some of these torrents have not finished downloading. Загрузка некоторых из Ñтих торрентов не завершена. %1 has not responded yet %1 еще не ответил %1 is responding %1 отвечает %1 last responded %2 ago %1 ответил %2 тому назад %1 is not responding %1 не отвечает MakeDialog New Torrent Создание нового торрента <i>No source selected<i> <i>Ðе выбраны иÑходные данные<i> %Ln File(s) %Ln файл %Ln файла %Ln файлов %Ln Piece(s) %Ln чаÑть %Ln чаÑти %Ln чаÑтей %1 in %2; %3 @ %4 %1 в %2; %3 @ %4 Files Файлы Sa&ve to: &Сохранить в папку: Source f&older: ИÑходный к&аталог: Source &file: &ИÑходный файл: Properties СвойÑтва &Trackers: &Трекеры: To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. Чтобы добавить резервный URL, добавьте его поÑле оÑновного URL в той же Ñтроке. Чтобы добавить ещё один оÑновной URL, добавьте его в новой Ñтроке. Co&mment: &Комментарий: &Private torrent &Закрытый торрент MakeProgressDialog New Torrent Создание нового торрента Creating "%1" Создание "%1" Created "%1"! Создан "%1"! Error: invalid announce URL "%1" Ошибка: неверный URL-Ð°Ð´Ñ€ÐµÑ Ð¾Ð±ÑŠÑвлений "%1" Cancelled Отменено Error reading "%1": %2 Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ "%1": %2 Error writing "%1": %2 Ошибка запиÑи "%1": %2 OptionsDialog Open Torrent Открыть торрент Open Torrent from File Открыть торрент из файла Open Torrent from URL or Magnet Link Открыть торрент по URL или magnet-ÑÑылке &Source: ИÑточник: &Destination folder: &Папка назначениÑ: High Ð’Ñ‹Ñокий Normal Обычный Low Ðизкий &Priority: Приоритет: S&tart when added ЗапуÑтить при добавлении &Verify Local Data Про&верить локальные данные Mo&ve .torrent file to the trash Пере&меÑтить файл .torrent в корзину Torrent Files (*.torrent);;All Files (*.*) Торрент-файлы (*.torrent);;Ð’Ñе файлы (*.*) Select Destination Выберите папку Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ PathButton (None) (Ðе выбран) Select Folder Выбор папки Select File Выбор файла PrefsDialog Use &authentication ИÑпол&ьзовать проверку подлинноÑти &Username: &Пользователь: Pass&word: Па&роль: &Open web client &Открыть веб-клиент Addresses: ÐдреÑа: Speed Limits ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти <small>Override normal speed limits manually or at scheduled times</small> <small>Изменение нормального Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти вручную или по раÑпиÑанию</small> &Scheduled times: &По раÑпиÑанию: &On days: Ð’ указанные &дни: Every Day Ежедневно Weekdays По рабочим днÑм Weekends Выходные Sunday ВоÑкреÑенье Monday Понедельник Tuesday Вторник Wednesday Среда Thursday Четверг Friday ПÑтница Saturday Суббота Port is <b>open</b> Порт <b>открыт</b> Port is <b>closed</b> Порт <b>закрыт</b> Incoming Peers ВходÑщие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Status unknown Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð½ÐµÐ¸Ð·Ð²ÐµÑтен &Port for incoming connections: &Порт Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих подключений: Use UPnP or NAT-PMP port &forwarding from my router ИÑпользовать пере&направление портов UPnP или NAT-PMP Options Параметры Enable &uTP for peer connections Включить uTP Ð´Ð»Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¸Ñ€Ð°Ð¼Ð¸ uTP is a tool for reducing network congestion. uTP — Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ ÑÐ½Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð½Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ на Ñеть minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) минута минуты минут minute(s) ago Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) минуту назад минуты назад минут назад Automatically add .torrent files &from: ÐвтоматичеÑки добавлÑть файлы .torrent из: Show the Torrent Options &dialog Показать окно наÑтроек торрента &Start added torrents ЗапуÑтить добавленные торренты Mo&ve the .torrent file to the trash ПеремеÑтить торрент-файл в корзину Download Queue Очередь ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ma&ximum active downloads: МаÑкимальное количеÑтво активных Ñкачиваний: Incomplete Ðе завершено Seeding Раздача Remote Удалённый доÑтуп <i>Blocklist contains %Ln rule(s)</i> <i>"Черный ÑпиÑок" Ñодержит %Ln правило</i> <i>"Черный ÑпиÑок" Ñодержит %Ln правила</i> <i>"Черный ÑпиÑок" Ñодержит %Ln правил</i> Pick a &random port every time Transmission is started Выбирать &Ñлучайный порт при каждом запуÑке программы Limits ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Maximum peers per &torrent: &МакÑимальное количеÑтво пиров на торрент: Maximum peers &overall: &Общее макÑимальное количеÑтво пиров: <b>Update succeeded!</b><p>Blocklist now has %Ln rule(s). <b>Обновление уÑпешно завершено!</b><p>Ð’ "черном ÑпиÑке" %Ln правило. <b>Обновление уÑпешно завершено!</b><p>Ð’ "черном ÑпиÑке" %Ln правила. <b>Обновление уÑпешно завершено!</b><p>Ð’ "черном ÑпиÑке" %Ln правил. <b>Update Blocklist</b><p>Getting new blocklist... <b>Обновление «чёрного ÑпиÑка»</b><p>Получение нового «черного ÑпиÑка»... Blocklist «Чёрный ÑпиÑок» Enable &automatic updates Разрешить &автоматичеÑкое обновление Allow encryption Разрешить шифрование Prefer encryption Предпочитать шифрование Require encryption Требовать шифрование Privacy БезопаÑноÑть &to &до Desktop Рабочий Ñтол Show Transmission icon in the &notification area Показать значок Transmission в о&блаÑти уведомлений Te&st Port Про&верить порт Enable &blocklist: Включить «&чёрный ÑпиÑок»: &Update &Обновить &Encryption mode: &Режим шифрованиÑ: Remote Control Удалённый доÑтуп Allow &remote access Разрешить &удалённый доÑтуп HTTP &port: HTTP-порт: Only allow these IP a&ddresses: Разрешить только Ñти IP-адреÑа: &Upload: Отдача: &Download: Загрузка: Alternative Speed Limits Ðльтернативные Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти U&pload: Отдача: Do&wnload: Загрузка: Start &minimized in notification area ЗапуÑкать Ñвернутым в облаÑть уведомлений Notification Уведомление Show a notification when torrents are a&dded Отображать уведомление при добавлении торрента Show a notification when torrents &finish Отображать уведомление при окончании торрента Play a &sound when torrents finish Звуковое уведомление при завершении торрента Testing TCP Port... Проверка TCP-порта... Peer Limits ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¸Ñ€Ð¾Ð² Use PE&X to find more peers ИÑполь&зовать PEX-протокол Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка пиров PEX is a tool for exchanging peer lists with the peers you're connected to. PEX — Ñто Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° ÑпиÑками пиров Ñ Ñ‚ÐµÐ¼Ð¸, к кому вы подключаетеÑÑŒ. Use &DHT to find more peers ИÑпо&льзовать DHT Ð´Ð»Ñ Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¿Ð¸Ñ€Ð¾Ð² DHT is a tool for finding peers without a tracker. DHT — Ñто Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð¿Ð¾Ð¸Ñка пиров без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€ÐµÐºÐµÑ€Ð°. Use &Local Peer Discovery to find more peers &ИÑпользовать LPD Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка пиров LPD is a tool for finding peers on your local network. LPD — Ñто Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð¿Ð¾Ð¸Ñка пиров в вашей локальной Ñети. Encryption Шифрование Select "Torrent Done" Script Выбор Ñкрипта, запуÑкаемого при завершении торрента Select Incomplete Directory Выбор каталога Select Watch Directory Выбор каталога Select Destination Выбор папки Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Adding Добавление Download is i&nactive if data sharing stopped: Please keep this phrase as short as possible, it's curently the longest and influences dialog width Загрузка недоÑтупна, еÑли обмен данными оÑтановлен: Downloading Загрузка Append ".&part" to incomplete files' names ДобавлÑÑ‚&ÑŒ «.part» к именам не завершенных файлов Keep &incomplete files in: СохранÑть &не завершенные файлы в: Save to &Location: СохранÑть в &папку: Call scrip&t when torrent is completed: Выполнить Ñ&крипт, поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸: Stop seeding at &ratio: Прекратить &раздачу при рейтинге: Stop seedi&ng if idle for: Прекратить раздачу при &проÑтое: Transmission Preferences ÐаÑтройки Transmission Speed СкороÑть Network Сеть Not supported by remote sessions Ðе поддерживаетÑÑ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ñ‹Ð¼Ð¸ ÑеанÑами QObject Invalid option ÐедопуÑтимый параметр RelocateDialog Select Location Выберите папку Set Torrent Location Указать папку торрента Set Location Указать раÑположение New &location: Ðовое &раÑположение: &Move from the current folder &ПеремеÑтить из текущей папки Local data is &already there &Локальные данные уже там Session Error Renaming Path Ошибка Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ <p><b>Unable to rename "%1" as "%2": %3.</b></p> <p>Please correct the errors and try again.</p> <p><b>Ðевозможно переименовать "%1" в "%2": %3.</b></p> <p>ПожалуйÑта, иÑправьте ошибки и попробуйте ещё раз.</p> Add Torrent Добавить торрент SessionDialog Change Session Изменить ÑÐµÐ°Ð½Ñ Source ИÑточник Start &Local Session &ЗапуÑтить локальный ÑÐµÐ°Ð½Ñ Connect to &Remote Session ПодключитьÑÑ Ðº &удалённому ÑеанÑу &Host: Уз&ел: &Port: &Порт: &Authentication required &ТребуетÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° подлинноÑти &Username: По&льзователь: Pass&word: Па&роль: StatsDialog Statistics СтатиÑтика Current Session Текущий ÑÐµÐ°Ð½Ñ Uploaded: Отдано: Downloaded: Загружено: Ratio: Рейтинг: Duration: ДлительноÑть: Total Ð’Ñего Started %Ln time(s) Запущено %Ln раз Запущено %Ln раза Запущено %Ln раз Torrent Verifying local data Проверка локальных данных Downloading Загрузка Seeding Раздача Finished Завершено Paused ПриоÑтановлено Queued for verification Ð’ очереди на проверку Queued for download Ð’ очереди на загрузку Queued for seeding Ð’ очереди на раздачу Tracker gave a warning: %1 Трекер выдал предупреждение: %1 Tracker gave an error: %1 Трекер выдал ошибку: %1 Error: %1 Ошибка: %1 TorrentDelegate Magnetized transfer - retrieving metadata (%1%) First part of torrent progress string; %1 is the percentage of torrent metadata downloaded ÐœÐ°Ð³Ð½ÐµÑ‚Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° — получение метаданных (%1%) %1 of %2 (%3%) First part of torrent progress string; %1 is how much we've got, %2 is how much we'll have when done, %3 is a percentage of the two %1 из %2 (%3%) %1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio, %6 is the ratio we want to reach before we stop uploading %1 из %2 (%3%), отдано %4 (Рейтинг: %5 Цель: %6) %1 of %2 (%3%), uploaded %4 (Ratio: %5) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio %1 из %2 (%3%), отдано %4 (Рейтинг: %5) %1, uploaded %2 (Ratio: %3 Goal: %4) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio, %4 is the ratio we want to reach before we stop uploading %1, отдано %2 (Рейтинг: %3 Цель: %4) %1, uploaded %2 (Ratio: %3) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio %1, отдано %2 (Рейтинг: %3) - %1 left Second (optional) part of torrent progress string; %1 is duration; notice that leading space (before the dash) is included here - оÑталоÑÑŒ %1 - Remaining time unknown Second (optional) part of torrent progress string; notice that leading space (before the dash) is included here - ОÑтавшееÑÑ Ð²Ñ€ÐµÐ¼Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтно Ratio: %1 Рейтинг: %1 Downloading from %Ln peer(s) First part of phrase "Downloading from ... peer(s) and ... web seed(s)" Приём от %Ln пира Приём от %Ln пиров Приём от %Ln пиров Seeding to %Ln peer(s) Раздача к %Ln пиру Раздача к %Ln пирам Раздача к %Ln пирам - - Downloading metadata from %Ln peer(s) (%1% done) Загрузка метаданных от %Ln пира (%1% завершено) Загрузка метаданных от %Ln пиров (%1% завершено) Загрузка метаданных от %Ln пиров (%1% завершено) Downloading from %1 of %Ln connected peer(s) First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" Приём от %1 из %Ln подключённого пира Приём от %1 из %Ln подключённых пиров Приём от %1 из %Ln подключённых пиров and %Ln web seed(s) Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; notice that leading space (before "and") is included here и %Ln веб-раздачи и %Ln веб-раздач и %Ln веб-раздач Seeding to %1 of %Ln connected peer(s) Раздача к %1 из %Ln подключённого пира Раздача к %1 из %Ln подключённых пиров Раздача к %1 из %Ln подключённых пиров Error Ошибка Verifying local data (%1% tested) Проверка локальных данных (%1% проверено) TrackerDelegate Got a list of%1 %Ln peer(s)%2 %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Получен ÑпиÑок от%1 %Ln пира%2 %3 тому назад Получен ÑпиÑок от%1 %Ln пиров%2 %3 тому назад Получен ÑпиÑок от%1 %Ln пиров%2 %3 тому назад Peer list request %1timed out%2 %3 ago; will retry %1 and %2 are replaced with HTML markup, %3 is duration Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа ÑпиÑка пиров %1 иÑтекло %2 %3 тому назад, повтор попытки Got an error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Получена ошибка %1"%2"%3 %4 тому назад No updates scheduled ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ запланированы Asking for more peers in %1 %1 is duration Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ñ… пиров через %1 Queued to ask for more peers Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ñ… пиров поÑтавлен в очередь Asking for more peers now... <small>%1</small> %1 is duration Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ñ… пиров... <small>%1</small> Tracker had%1 %Ln seeder(s)%2 First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup Ðа трекере был%1 %Ln раздающий%2 Ðа трекере было%1 %Ln раздающих%2 Ðа трекере было%1 %Ln раздающих%2 and%1 %Ln leecher(s)%2 %3 ago Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup, %3 is duration; notice that leading space (before "and") is included here и%1 %Ln принимающий%2 %3 тому назад и%1 %Ln принимающих%2 %3 тому назад и%1 %Ln принимающих%2 %3 тому назад Tracker had %1no information%2 on peer counts %3 ago %1 and %2 are replaced with HTML markup, %3 is duration От трекера %1не было информации%2 о количеÑтве пиров %3 тому назад Got a scrape error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Получена ошибка при запроÑе к трекеру %1"%2"%3 %4 тому назад Asking for peer counts in %1 %1 is duration Ð—Ð°Ð¿Ñ€Ð¾Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтва пиров через %1 Queued to ask for peer counts Ð—Ð°Ð¿Ñ€Ð¾Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтва пиров поÑтавлен в очередь Asking for peer counts now... <small>%1</small> %1 is duration Ð—Ð°Ð¿Ñ€Ð¾Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтва пиров... <small>%1</small> transmission-2.92/qt/translations/PaxHeaders.4960/transmission_pt_BR.ts0000644000000000000000000000013212664476417023233 xustar0030 mtime=1456635151.985496335 30 atime=1456635151.985496335 30 ctime=1457295917.271761511 transmission-2.92/qt/translations/transmission_pt_BR.ts0000644000175000017500000025767612664476417024707 0ustar00mikedldmikedld00000000000000 UTF-8 AboutDialog About Transmission Sobre o Transmission <b style='font-size:x-large'>Transmission %1</b> <b style='font-size:x-large'>Transmission %1</b> A fast and easy BitTorrent client Um cliente BitTorrent rápido e descomplicado Copyright (c) The Transmission Project Copyright (c) Projeto Transmission C&redits C&réditos &License &Licença Credits Créditos Application <b>Transmission is a file sharing program.</b> <b>Transmission é um programa de compartilhamento de arquivos.</b> When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. I &Agree &Aceito Torrent Completed Torrent Completo Torrent Added Torrent adicionado DetailsDialog None Nenhum Mixed Misto Unknown Desconhecido Finished Concluído Paused Pausado Active now Ativo %1 ago %1 atrás %1 (%Ln pieces @ %2) %1 (%Ln pedaço de %2) %1 (%Ln pedaços de %2) %1 (%Ln pieces) %1 (%Ln pedaço) %1 (%Ln pedaço) Private to this tracker -- DHT and PEX disabled Rastreador Privado -- DHT e PEX desativados Public torrent Torrent Público Created by %1 Criado pelo %1 Created on %1 Criado em Created by %1 on %2 Criado pelo %1 em %2 Encrypted connection Conexão criptografada Optimistic unchoke Desbloqueio otimista Downloading from this peer Baixando desta fonte We would download from this peer if they would let us Baixaríamos desta fonte se ela deixasse Uploading to peer Enviando para a fonte We would upload to this peer if they asked Enviaríamos para esta fonte se ela pedisse Peer has unchoked us, but we're not interested A fonte nos desbloqueou, mas não estamos interessados We unchoked this peer, but they're not interested Desbloqueamos esta fonte, mas ela não está interessada Peer was discovered through DHT A fonte foi descoberta por DHT Peer was discovered through Peer Exchange (PEX) A fonte foi descoberta por Troca de Fontes (PEX) Peer is an incoming connection A fonte é uma conexão de entrada minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minuto minutos Error Erro Tracker already exists. O rastreador já existe %1 (100%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data %1 (100%) %1 of %2 (%3%) Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded and verified data, %2 is overall size of torrent data, %3 is percentage (%1/%2*100) %1 de %2 (%3%) %1 of %2 (%3%), %4 Unverified Text following the "Have:" label in torrent properties dialog; %1 is amount of downloaded data (both verified and unverified), %2 is overall size of torrent data, %3 is percentage (%1/%2*100), %4 is amount of downloaded but not yet verified data %1 de %2 (%3%), %4 não verificado %1 (%2 corrupt) %1 (%2 corrompido) %1 (Ratio: %2) %1 (Taxa: %2) N/A N/A Peer is connected over uTP Peer conectado via uTP Add URL Adicionar URL Add tracker announce URL: Adicionar URL de rastreador: Invalid URL "%1" URL Inválida "%1" Edit URL Editar URL: Edit tracker announce URL: Editar URL de rastreador: High Alta Normal Normal Low Baixa Use Global Settings Usar Configurações Globais Seed regardless of ratio Semear independente da proporção Stop seeding at ratio: Parar de semear na proporção: Seed regardless of activity Semear independente de atividade Stop seeding if idle for: Parar de semear se ocioso por: Up Enviando Down Baixando % % Status Estado Address Endereço Client Cliente Torrent Properties Propriedades do Torrent Information Informação Activity Atividade Have: Possui: Availability: Disponibilidade: Uploaded: Enviado: Downloaded: Baixado: State: Estado: Running time: Executando a: Remaining time: Tempo Restante: Last activity: Ultima Atividade: Error: Erro: Details Detalhes Size: Tamanho: Location: Local: Hash: Hash: Privacy: Privacidade: Origin: Fonte: Comment: Comentário: Peers Fontes Tracker Rastreador Add Tracker Adicionar rastreador Edit Tracker Editar rastreador Remove Trackers Remover rastreadores Show &more details Exibir &mais detalhes Show &backup trackers Mostrar rastreadores &backup Files Arquivos Options Opções Speed Velocidade Honor global &limits Respeitar limites globais Limit &download speed: Limitar velocidade de download: Limit &upload speed: Limitar velocidade de &upload: Torrent &priority: &prioridade do Torrent: Seeding Limits Limites de Envio &Ratio: P&roporção: &Idle: Oc&ioso: Peer Connections Conexões da Fonte &Maximum peers: &Máximo de fontes: FileAdded Add Torrent Adicionar Torrent <p><b>Unable to add "%1".</b></p><p>It is a duplicate of "%2" which is already added.</p> <p><b>Impossível adicionar "%1".</b></p><p>É uma cópia de "%2" que já está adicionado.</p> Error Adding Torrent Erro ao adicionar torrent FileTreeItem Low Baixa High Alta Normal Normal Mixed Misto FileTreeModel File Arquivo Size Tamanho Progress Progresso Download Baixando Priority Prioridade FileTreeView Check Selected Uncheck Selected Only Check Selected Priority Prioridade Open Abrir Rename... FilterBar All Todos Active Ativo Downloading Baixando Seeding Semeando Paused Pausado Finished Concluído Verifying Verificando Error Erro Show: Mostrar: FilterBarLineEdit Search... Busca... Formatter B/s B/s kB/s kB/s MB/s MB/s GB/s GB/s TB/s TB/s B B kB kB MB MB GB GB TB TB KiB KB MiB MB GiB GB TiB TB Unknown Desconhecido None Nenhum %1 %2 %1 %2 %Ln day(s) %Ln dia %Ln dias %Ln hour(s) %Ln hora %Ln horas %Ln minute(s) %Ln minuto %Ln minutos %Ln second(s) %Ln segundo %Ln segundos %1, %2 %1, %2 FreeSpaceLabel <i>Calculating Free Space...</i> <i>Calculando espaço livre...</i> %1 free %1 livre LicenseDialog License Licença MainWindow Transmission Transmission &Torrent &Torrent &Edit &Editar &Help Ajuda(&H) &View Exibir(&V) &File Arquivo &New... &Novo... Create a new torrent Cria um novo torrent &Properties &Propriedades Show torrent properties Exibe as propriedades do torrent Open the torrent's folder Abre a pasta do torrent Queue Fila &Open... &Abrir Open Abrir Open a torrent Abrir um torrent Open Fold&er Abrir Pasta &Start Iniciar Start torrent Inicia o torrent Ask Tracker for &More Peers Pedir Mais Fontes ao Rastreador Ask tracker for more peers Solicita mais fontes ao rastreador &Pause Pausar Pause torrent Pausa o torrent &Verify Local Data Verificar Dados Locais Verify local data Verifica os dados já baixados &Remove &Remover Remove torrent Apaga o torrent da lista &Delete Files and Remove Remover e %Deletar Arquivos Remove torrent and delete its files Apaga o torrent da lista e exclui os arquivos associados &Start All Iniciar Todos &Pause All &Pausar Todos &Quit Sair &Select All Selecionar Todos &Deselect All Selecionar Nenhum &Preferences Preferências &Compact View Modo Compacto Compact View Modo Compacto &Toolbar Barra de Ferramentas &Filterbar Barra de Filtros &Statusbar Barra de Estado Sort by &Activity Ordenar por Atividade Sort by A&ge Ordenar por Idade Sort by Time &Left Ordenar por Tempo Restante Sort by &Name Ordenar por Nome Sort by &Progress Ordenar por Progresso Sort by Rati&o Ordenar por Proporção Sort by Si&ze Ordenar por Tamanho Sort by Stat&e Ordenar por Estado Sort by T&racker Ordenar por Rastreador Message &Log Registro de Mensagens &Statistics E&statísticas &Contents &Conteúdo &About Sobre Re&verse Sort Order In&verter Ordem &Name &Nome &Files Arquivos &Tracker Ras&treador Total Ratio Proporção Total Session Ratio Proporção da Sessão Total Transfer Transferẽncia Total Session Transfer Transferência da Sessão &Main Window Janela Principal Tray &Icon &Ãcone da Bandeja &Change Session... Alterar Sessão... Choose Session Start a local session or connect to a running session Escolher Sessão Set &Location... Definir &Local... &Copy Magnet Link to Clipboard Copiar Link Magnet Open &URL... Abrir &URL... &Donate &Doar Start &Now Começar agora Bypass the queue and start now Ignorar fila e começar agora Move to &Top Mover para o &Topo Move &Up Move &Down Move to &Bottom Sort by &Queue Limit Download Speed Limitar Download Unlimited Ilimitado Limited at %1 Limitar em %1 Limit Upload Speed Limitar Upload Stop Seeding at Ratio Parar de Semear na Proporção Seed Forever Semear Eternamente Stop at Ratio (%1) Parar na Proporção (%1) - %1:%2 Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); notice that leading space (before the dash) is included here - %1:%2 Idle Ocioso Ratio: %1 Proporção: %1 Down: %1, Up: %2 Baixado: %1 - Enviado: %2 Torrent Files (*.torrent);;All Files (*.*) Arquivos Torrent (*.torrent);;Todos os Arquivos (*.*) Show &options dialog Exibir diálogo de opções Open Torrent Abrir Torrent Speed Limits Limites de Velocidade Network Error Erro de rede Click to disable Temporary Speed Limits (%1 down, %2 up) Clique para desabilitar temporariamente o limite de velocidade (%1 down, %2 up) Click to enable Temporary Speed Limits (%1 down, %2 up) Clique para habilitar temporariamente o limite de velocidade (%1 down, %2 up) Remove torrent? Remover torrent? Delete this torrent's downloaded files? Excluir este torrent e os arquivos baixados? Remove %Ln torrent(s)? Remover %Ln torrent? Remover %Ln torrents? Showing %L1 of %Ln torrent(s) Delete these %Ln torrent(s)' downloaded files? Excluir este %Ln torrent e arquivos baixados? Excluir estes %Ln torrents e arquivos baixados? Once removed, continuing the transfer will require the torrent file or magnet link. Uma vez removido, para continuar a transferência será necessário o arquivo torrent ou o link Magnet. Once removed, continuing the transfers will require the torrent files or magnet links. Uma vez removidos, para continuar as transferências serão necessários os arquivos torrent ou os links Magnet. This torrent has not finished downloading. A transferência deste torrent ainda não foi concluída. These torrents have not finished downloading. As transferências destes torrents ainda não foram concluídas. This torrent is connected to peers. Este torrent está conectado a fontes. These torrents are connected to peers. Estes torrents estão conectados a fontes. One of these torrents is connected to peers. Um destes torrents estão conectados a fontes. Some of these torrents are connected to peers. Alguns destes torrents estão conectados a fontes. One of these torrents has not finished downloading. Um destes torrents ainda não foi concluído. Some of these torrents have not finished downloading. Alguns destes torrents ainda não foram concluídos. %1 has not responded yet %1 is responding %1 está respondendo %1 last responded %2 ago %1 is not responding %1 não está respondendo MakeDialog New Torrent Novo Torrent <i>No source selected<i> <i>Nenhuma fonte selecionada<i> %Ln File(s) %Ln Arquivo %Ln Arquivos %Ln Piece(s) %Ln Pedaço %Ln Pedaços %1 in %2; %3 @ %4 %1 em %2; %3 @ %4 Files Arquivos Sa&ve to: Salvar em: Source f&older: Pasta fonte: Source &file: Arquivo Fonte: Properties Propriedades &Trackers: Rastreadores: To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. Adicione uma URL reserva na linha após a primária. Adicione outra URL primária depois de uma linha em branco. Co&mment: Comentário: &Private torrent Torrent Privado MakeProgressDialog New Torrent Novo Torrent Creating "%1" Criando "%1" Created "%1"! "%1" Criado! Error: invalid announce URL "%1" Erro: URL de anúncio inválida "%1" Cancelled Cancelado Error reading "%1": %2 Erro na leitura de "%1": %2 Error writing "%1": %2 Erro na gravação de "%1": %2 OptionsDialog Open Torrent Abrir Torrent Open Torrent from File Abrir arquivo Torrent Open Torrent from URL or Magnet Link Abrir Torrent a partir de URL ou link Magnet &Source: Origem: &Destination folder: Salvar na pasta: High Alta Normal Normal Low Baixa &Priority: &Prioridade: S&tart when added Iniciar quando adicionado &Verify Local Data Verificar Dados Locais Mo&ve .torrent file to the trash Mover arquivo .torrent para a lixeira Torrent Files (*.torrent);;All Files (*.*) Arquivos Torrent (*.torrent);;Todos os Arquivos (*.*) Select Destination Selecione o Destino PathButton (None) (Nenhuma) Select Folder Selecionar Pasta Select File Selecionar Arquivo PrefsDialog Use &authentication Usar autenticação &Username: Usuário: Pass&word: Senha: &Open web client Abrir Addresses: Endereços: Speed Limits Limites de Velocidade <small>Override normal speed limits manually or at scheduled times</small> <small>Sobrepõe os limites normais manualmente ou em tempos programados</small> &Scheduled times: Agendar: &On days: Nos dias Every Day Todos Weekdays Dias Úteis Weekends Fins de Semana Sunday Domingo Monday Segunda Tuesday Terça Wednesday Quarta Thursday Quinta Friday Sexta Saturday Sábado Port is <b>open</b> A porta está <b>aberta</b> Port is <b>closed</b> A porta está <b>fechada</b> Incoming Peers Conexões de Entrada Status unknown Estado desconhecido &Port for incoming connections: Porta para conexões de entrada: Use UPnP or NAT-PMP port &forwarding from my router Usar encaminhamento UPnP ou NAT-PMP no meu roteador Options Opções Enable &uTP for peer connections Habilitar &uTP para coneões peer uTP is a tool for reducing network congestion. uTP é uma ferramenta para redução de congestionamento de rede. minute(s) Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) minuto minutos minute(s) ago Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) um minuto atrás minutos atrás Automatically add .torrent files &from: Show the Torrent Options &dialog &Start added torrents Mo&ve the .torrent file to the trash Mo&ver o arquivo .torrent para a lixeira Download Queue Download inserido na fila Ma&ximum active downloads: Incomplete Incompleto Seeding Semeando Remote Remoto <i>Blocklist contains %Ln rule(s)</i> Pick a &random port every time Transmission is started Usar uma porta aleatória quando iniciar Limits Limites Maximum peers per &torrent: Máximo de fontes por torrent: Maximum peers &overall: Máximo de fontes ao todo: <b>Update succeeded!</b><p>Blocklist now has %Ln rule(s). <b>Atualização concluída!</b><p>A lista de bloqueios tem agora %Ln regra. <b>Atualização concluída!</b><p>A lista de bloqueios tem agora %Ln regras. <b>Update Blocklist</b><p>Getting new blocklist... <b>Atualizando Lista de Bloqueios</b><p>Obtendo nova lista... Blocklist Lista de Bloqueios Enable &automatic updates Atualizar automaticamente Allow encryption Permitir Prefer encryption Preferir Require encryption Exigir Privacy Privacidade &to para Desktop Desktop Show Transmission icon in the &notification area Mostrar o ícone do Transmission na área de &notificação Te&st Port Te&star Porta Enable &blocklist: &Update At&ualizar &Encryption mode: Criptografia: Remote Control Controle remoto Allow &remote access habilitar acesso &remoto HTTP &port: &porta HTTP: Only allow these IP a&ddresses: liberar apenas esses en&dereços IP: &Upload: &Upload: &Download: &Download: Alternative Speed Limits U&pload: U&pload: Do&wnload: Do&wnload: Start &minimized in notification area Iniciar &minimizado na área de notificação Notification Notificação Show a notification when torrents are a&dded Mostrar uma notificação quando torrents forem a&dicionados Show a notification when torrents &finish Mostrar uma notificação quando torrents forem &finalizados Play a &sound when torrents finish Testing TCP Port... Testando porta TCP... Peer Limits Limite de Peer Use PE&X to find more peers Usar PEX para encontrar mais fontes PEX is a tool for exchanging peer lists with the peers you're connected to. O PEX é uma ferramenta que faz troca de fontes entre as fontes conectadas. Use &DHT to find more peers Usar DHT para encontrar mais fontes DHT is a tool for finding peers without a tracker. O DHT é uma ferramenta para localizar fontes sem um rastreador. Use &Local Peer Discovery to find more peers Usar Descoberta Local de Fontes para encontrar mais fontes LPD is a tool for finding peers on your local network. O LPD é uma ferramentas que encontra fontes na sua rede local. Encryption criptografia Select "Torrent Done" Script Selecione o Script Select Incomplete Directory Pasta de Downloads Incompletos Select Watch Directory Monitorar Pasta Select Destination Seleciona o Destino Adding Adicionando Download is i&nactive if data sharing stopped: Please keep this phrase as short as possible, it's curently the longest and influences dialog width Downloading Baixando Append ".&part" to incomplete files' names Adicionar ".part" aos arquivos incompletos Keep &incomplete files in: Manter arquivos incompletos em: Save to &Location: Salvar em: Call scrip&t when torrent is completed: Stop seeding at &ratio: Parar de semear na proporção: Stop seedi&ng if idle for: Parar de semear se ocioso por: Transmission Preferences Preferências do Transmission Speed Velocidade Network Rede Not supported by remote sessions Não suportado por sessões remotas QObject Invalid option Opção inválida RelocateDialog Select Location Selecionar local Set Torrent Location Definir Local do Torrent Set Location Definir Local New &location: Novo local: &Move from the current folder Mover da pasta atual Local data is &already there Os dados locais já estão lá Session Error Renaming Path Erro ao renomear caminho <p><b>Unable to rename "%1" as "%2": %3.</b></p> <p>Please correct the errors and try again.</p> Add Torrent Adicionar Torrent SessionDialog Change Session Alterar Sessão Source Fonte Start &Local Session Iniciar Sessão Local Connect to &Remote Session Conectar numa Sessão Remota &Host: Servidor: &Port: Porta: &Authentication required Requer autenticação &Username: Usuário: Pass&word: Senha: StatsDialog Statistics Estatísticas Current Session Sessão Atual Uploaded: Enviado: Downloaded: Baixado: Ratio: Proporção: Duration: Duração: Total Total Started %Ln time(s) Torrent Verifying local data Verificando dados locais Downloading Baixando Seeding Semeando Finished Concluído Paused Pausado Queued for verification Inserido na fila de verificação Queued for download Inserido na fila para download Queued for seeding Inserido na fila para semear Tracker gave a warning: %1 O rastreador enviou um aviso: %1 Tracker gave an error: %1 O rastreador enviou um erro: %1 Error: %1 Erro: %1 TorrentDelegate Magnetized transfer - retrieving metadata (%1%) First part of torrent progress string; %1 is the percentage of torrent metadata downloaded Recebendo metadado da transferência Magnet (%1%) %1 of %2 (%3%) First part of torrent progress string; %1 is how much we've got, %2 is how much we'll have when done, %3 is a percentage of the two %1 de %2 (%3%) %1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio, %6 is the ratio we want to reach before we stop uploading %1 de %2 (%3%), %4 enviados (Proporção: %5 Meta: %6) %1 of %2 (%3%), uploaded %4 (Ratio: %5) First part of torrent progress string; %1 is how much we've got, %2 is the torrent's total size, %3 is a percentage of the two, %4 is how much we've uploaded, %5 is our upload-to-download ratio %1 de %2 (%3%), %4 enviados (Proporção: %5) %1, uploaded %2 (Ratio: %3 Goal: %4) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio, %4 is the ratio we want to reach before we stop uploading %1, uploaded %2 (Relação: %3 Objetivo: %4) %1, uploaded %2 (Ratio: %3) First part of torrent progress string; %1 is the torrent's total size, %2 is how much we've uploaded, %3 is our upload-to-download ratio %1, %2 enviados (Proporção: %3) - %1 left Second (optional) part of torrent progress string; %1 is duration; notice that leading space (before the dash) is included here - %1 restantes - Remaining time unknown Second (optional) part of torrent progress string; notice that leading space (before the dash) is included here - Tempo restante desconhecido Ratio: %1 Proporção: %1 Downloading from %Ln peer(s) First part of phrase "Downloading from ... peer(s) and ... web seed(s)" Baixando de %Ln fonte Baixando de %Ln fontes Seeding to %Ln peer(s) Semeando para %1 fonte Semeando para %1 fontes - - Downloading metadata from %Ln peer(s) (%1% done) Baixando metadado de %Ln fonte (%1% concluído) Baixando metadado de %Ln fontes (%1% concluído) Downloading from %1 of %Ln connected peer(s) First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" Baixando de %1 de %Ln fonte conectadas Baixando de %1 de %Ln fontes conectadas and %Ln web seed(s) Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; notice that leading space (before "and") is included here Seeding to %1 of %Ln connected peer(s) Semeando para %1 de %Ln fonte conectadas Semeando para %1 de %Ln fontes conectadas Error Erro Verifying local data (%1% tested) Verificando dados locais (%1% testado) TrackerDelegate Got a list of%1 %Ln peer(s)%2 %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Uma lista de%1 %Ln fonte%2 foi obtida %3 atrás Uma lista de%1 %Ln fontes%2 foi obtida %3 atrás Peer list request %1timed out%2 %3 ago; will retry %1 and %2 are replaced with HTML markup, %3 is duration Got an error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Ocorreu um erro %1"%2"%3 %4 atrás No updates scheduled Nenhuma atualização agendada Asking for more peers in %1 %1 is duration Pedindo mais fontes em %1 Queued to ask for more peers Pedido de mais fontes em espera Asking for more peers now... <small>%1</small> %1 is duration Pedindo mais fontes agora... <small>%1</small> Tracker had%1 %Ln seeder(s)%2 First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup O rastreador tinha%1 %Ln seeder%2 O rastreador tinha%1 %Ln seeders%2 and%1 %Ln leecher(s)%2 %3 ago Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; %1 and %2 are replaced with HTML markup, %3 is duration; notice that leading space (before "and") is included here e%1 %Ln leecher%2 %3 atrás e%1 %Ln leechers%2 %3 atrás Tracker had %1no information%2 on peer counts %3 ago %1 and %2 are replaced with HTML markup, %3 is duration Got a scrape error %1"%2"%3 %4 ago %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration Asking for peer counts in %1 %1 is duration Pedindo contagem de fontes em %1 Queued to ask for peer counts Pedido de contagem de peers em espera Asking for peer counts now... <small>%1</small> %1 is duration Pedindo contagem de peers agora... <small>%1</small> transmission-2.92/qt/PaxHeaders.4960/RelocateDialog.cc0000644000000000000000000000013212571431256017475 xustar0030 mtime=1441149614.417177027 30 atime=1441149614.417177027 30 ctime=1457295917.240760984 transmission-2.92/qt/RelocateDialog.cc0000644000175000017500000000466012571431256021130 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: RelocateDialog.cc 14561 2015-09-01 20:19:26Z mikedld $ */ #include #include "RelocateDialog.h" #include "Session.h" #include "Torrent.h" #include "TorrentModel.h" bool RelocateDialog::myMoveFlag = true; void RelocateDialog::onSetLocation () { mySession.torrentSetLocation (myIds, newLocation (), myMoveFlag); close (); } void RelocateDialog::onMoveToggled (bool b) { myMoveFlag = b; } RelocateDialog::RelocateDialog (Session & session, const TorrentModel & model, const QSet & ids, QWidget * parent): BaseDialog (parent), mySession (session), myIds (ids) { ui.setupUi (this); QString path; for (const int id: myIds) { const Torrent * tor = model.getTorrentFromId (id); if (path.isEmpty ()) { path = tor->getPath (); } else if (path != tor->getPath ()) { if (mySession.isServer ()) path = QDir::homePath (); else path = QDir::rootPath (); break; } } if (mySession.isServer ()) { ui.newLocationStack->setCurrentWidget (ui.newLocationButton); ui.newLocationButton->setMode (PathButton::DirectoryMode); ui.newLocationButton->setTitle (tr ("Select Location")); ui.newLocationButton->setPath (path); } else { ui.newLocationStack->setCurrentWidget (ui.newLocationEdit); ui.newLocationEdit->setText (path); ui.newLocationEdit->selectAll (); } ui.newLocationStack->setFixedHeight (ui.newLocationStack->currentWidget ()->sizeHint ().height ()); ui.newLocationLabel->setBuddy (ui.newLocationStack->currentWidget ()); if (myMoveFlag) ui.moveDataRadio->setChecked (true); else ui.findDataRadio->setChecked (true); connect (ui.moveDataRadio, SIGNAL (toggled (bool)), this, SLOT (onMoveToggled (bool))); connect (ui.dialogButtons, SIGNAL (rejected ()), this, SLOT (close ())); connect (ui.dialogButtons, SIGNAL (accepted ()), this, SLOT (onSetLocation ())); } QString RelocateDialog::newLocation () const { return ui.newLocationStack->currentWidget () == ui.newLocationButton ? ui.newLocationButton->path () : ui.newLocationEdit->text (); } transmission-2.92/qt/PaxHeaders.4960/ComInteropHelper.cc0000644000000000000000000000013212634376710020041 xustar0030 mtime=1450311112.718085651 30 atime=1450311112.718085651 30 ctime=1457295917.246761086 transmission-2.92/qt/ComInteropHelper.cc0000644000175000017500000000300512634376710021464 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: ComInteropHelper.cc 14624 2015-12-16 20:01:03Z mikedld $ */ #include #include #include #include #include #include #include "ComInteropHelper.h" #include "InteropObject.h" QAXFACTORY_BEGIN("{1e405fc2-1a3a-468b-8bd6-bfbb58770390}", "{792d1aac-53cc-4dc9-bc29-e5295fdb93a9}") QAXCLASS(InteropObject) QAXFACTORY_END() // These are ActiveQt internals; declaring here as I don't like their WinMain much... extern HANDLE qAxInstance; extern bool qAxOutProcServer; extern wchar_t qAxModuleFilename[MAX_PATH]; extern QString qAxInit(); ComInteropHelper::ComInteropHelper (): m_client (new QAxObject (QLatin1String ("Transmission.QtClient"))) { } ComInteropHelper::~ComInteropHelper () { } bool ComInteropHelper::isConnected () const { return !m_client->isNull (); } QVariant ComInteropHelper::addMetainfo (const QString& metainfo) { return m_client->dynamicCall ("AddMetainfo(QString)", metainfo); } void ComInteropHelper::initialize () { qAxOutProcServer = true; ::GetModuleFileNameW (0, qAxModuleFilename, MAX_PATH); qAxInstance = ::GetModuleHandleW (NULL); ::CoInitializeEx (NULL, COINIT_APARTMENTTHREADED); qAxInit (); } void ComInteropHelper::registerObject (QObject * parent) { QAxFactory::startServer(); QAxFactory::registerActiveObject(new InteropObject (parent)); } transmission-2.92/qt/PaxHeaders.4960/MakeDialog.cc0000644000000000000000000000013212571431256016614 xustar0030 mtime=1441149614.410176902 30 atime=1441149614.410176902 30 ctime=1457295917.237760933 transmission-2.92/qt/MakeDialog.cc0000644000175000017500000001731112571431256020244 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: MakeDialog.cc 14561 2015-09-01 20:19:26Z mikedld $ */ #include #include #include #include #include #include #include #include #include "ColumnResizer.h" #include "Formatter.h" #include "MakeDialog.h" #include "Session.h" #include "Utils.h" #include "ui_MakeProgressDialog.h" namespace { class MakeProgressDialog: public BaseDialog { Q_OBJECT public: MakeProgressDialog (Session& session, tr_metainfo_builder& builder, QWidget * parent = nullptr); private slots: void onButtonBoxClicked (QAbstractButton *); void onProgress (); private: Session& mySession; tr_metainfo_builder& myBuilder; Ui::MakeProgressDialog ui; QTimer myTimer; }; } MakeProgressDialog::MakeProgressDialog (Session& session, tr_metainfo_builder& builder, QWidget * parent): BaseDialog (parent), mySession (session), myBuilder (builder) { ui.setupUi (this); connect (ui.dialogButtons, SIGNAL (clicked (QAbstractButton *)), this, SLOT (onButtonBoxClicked (QAbstractButton *))); connect (&myTimer, SIGNAL (timeout ()), this, SLOT (onProgress ())); myTimer.start (100); onProgress (); } void MakeProgressDialog::onButtonBoxClicked (QAbstractButton * button) { switch (ui.dialogButtons->standardButton (button)) { case QDialogButtonBox::Open: mySession.addNewlyCreatedTorrent (QString::fromUtf8 (myBuilder.outputFile), QFileInfo (QString::fromUtf8 (myBuilder.top)).dir ().path ()); break; case QDialogButtonBox::Abort: myBuilder.abortFlag = true; break; default: // QDialogButtonBox::Ok: break; } close (); } void MakeProgressDialog::onProgress () { // progress bar const tr_metainfo_builder& b = myBuilder; const double denom = b.pieceCount ? b.pieceCount : 1; ui.progressBar->setValue (static_cast ((100.0 * b.pieceIndex) / denom)); // progress label const QString top = QString::fromUtf8 (b.top); const QString base (QFileInfo (top).completeBaseName ()); QString str; if (!b.isDone) str = tr ("Creating \"%1\"").arg (base); else if (b.result == TR_MAKEMETA_OK) str = tr ("Created \"%1\"!").arg (base); else if (b.result == TR_MAKEMETA_URL) str = tr ("Error: invalid announce URL \"%1\"").arg (QString::fromUtf8 (b.errfile)); else if (b.result == TR_MAKEMETA_CANCELLED) str = tr ("Cancelled"); else if (b.result == TR_MAKEMETA_IO_READ) str = tr ("Error reading \"%1\": %2").arg (QString::fromUtf8 (b.errfile)). arg (QString::fromLocal8Bit (tr_strerror (b.my_errno))); else if (b.result == TR_MAKEMETA_IO_WRITE) str = tr ("Error writing \"%1\": %2").arg (QString::fromUtf8 (b.errfile)). arg (QString::fromLocal8Bit (tr_strerror (b.my_errno))); ui.progressLabel->setText (str); // buttons ui.dialogButtons->button (QDialogButtonBox::Abort)->setEnabled (!b.isDone); ui.dialogButtons->button (QDialogButtonBox::Ok)->setEnabled (b.isDone); ui.dialogButtons->button (QDialogButtonBox::Open)->setEnabled (b.isDone && b.result == TR_MAKEMETA_OK); } #include "MakeDialog.moc" /*** **** ***/ void MakeDialog::makeTorrent () { if (myBuilder == nullptr) return; // get the tiers int tier = 0; QVector trackers; for (const QString& line: ui.trackersEdit->toPlainText ().split (QLatin1Char ('\n'))) { const QString announceUrl = line.trimmed (); if (announceUrl.isEmpty ()) { ++tier; } else { tr_tracker_info tmp; tmp.announce = tr_strdup (announceUrl.toUtf8 ().constData ()); tmp.tier = tier; trackers.append (tmp); } } // the file to create const QString path = QString::fromUtf8 (myBuilder->top); const QString torrentName = QFileInfo (path).completeBaseName () + QLatin1String (".torrent"); const QString target = QDir (ui.destinationButton->path ()).filePath (torrentName); // comment QString comment; if (ui.commentCheck->isChecked ()) comment = ui.commentEdit->text (); // start making the torrent tr_makeMetaInfo (myBuilder.get (), target.toUtf8 ().constData (), trackers.isEmpty () ? NULL : trackers.data (), trackers.size (), comment.isEmpty () ? NULL : comment.toUtf8 ().constData (), ui.privateCheck->isChecked ()); // pop up the dialog MakeProgressDialog * dialog = new MakeProgressDialog (mySession, *myBuilder, this); dialog->setAttribute (Qt::WA_DeleteOnClose); dialog->open (); } /*** **** ***/ QString MakeDialog::getSource () const { return (ui.sourceFileRadio->isChecked () ? ui.sourceFileButton : ui.sourceFolderButton)->path (); } /*** **** ***/ void MakeDialog::onSourceChanged () { myBuilder.reset (); const QString filename = getSource (); if (!filename.isEmpty ()) myBuilder.reset (tr_metaInfoBuilderCreate (filename.toUtf8 ().constData ())); QString text; if (myBuilder == nullptr) { text = tr ("No source selected"); } else { QString files = tr ("%Ln File(s)", 0, myBuilder->fileCount); QString pieces = tr ("%Ln Piece(s)", 0, myBuilder->pieceCount); text = tr ("%1 in %2; %3 @ %4") .arg (Formatter::sizeToString (myBuilder->totalSize)) .arg (files) .arg (pieces) .arg (Formatter::sizeToString (myBuilder->pieceSize)); } ui.sourceSizeLabel->setText (text); } MakeDialog::MakeDialog (Session& session, QWidget * parent): BaseDialog (parent), mySession (session), myBuilder (nullptr, &tr_metaInfoBuilderFree) { ui.setupUi (this); ui.destinationButton->setMode (PathButton::DirectoryMode); ui.destinationButton->setPath (QDir::homePath ()); ui.sourceFolderButton->setMode (PathButton::DirectoryMode); ui.sourceFileButton->setMode (PathButton::FileMode); ColumnResizer * cr (new ColumnResizer (this)); cr->addLayout (ui.filesSectionLayout); cr->addLayout (ui.propertiesSectionLayout); cr->update (); resize (minimumSizeHint ()); connect (ui.sourceFolderRadio, SIGNAL (toggled (bool)), this, SLOT (onSourceChanged ())); connect (ui.sourceFolderButton, SIGNAL (pathChanged (QString)), this, SLOT (onSourceChanged ())); connect (ui.sourceFileRadio, SIGNAL (toggled (bool)), this, SLOT (onSourceChanged ())); connect (ui.sourceFileButton, SIGNAL (pathChanged (QString)), this, SLOT (onSourceChanged ())); connect (ui.dialogButtons, SIGNAL (accepted ()), this, SLOT (makeTorrent ())); connect (ui.dialogButtons, SIGNAL (rejected ()), this, SLOT (close ())); onSourceChanged (); } MakeDialog::~MakeDialog () { } /*** **** ***/ void MakeDialog::dragEnterEvent (QDragEnterEvent * event) { const QMimeData * mime = event->mimeData (); if (!mime->urls ().isEmpty () && QFileInfo (mime->urls ().front ().path ()).exists ()) event->acceptProposedAction (); } void MakeDialog::dropEvent (QDropEvent * event) { const QString filename = event->mimeData ()->urls ().front ().path (); const QFileInfo fileInfo (filename); if (fileInfo.exists ()) { if (fileInfo.isDir ()) { ui.sourceFolderRadio->setChecked (true); ui.sourceFolderButton->setPath (filename); } else // it's a file { ui.sourceFileRadio->setChecked (true); ui.sourceFileButton->setPath (filename); } } } transmission-2.92/qt/PaxHeaders.4960/InteropObject.cc0000644000000000000000000000013212634330106017356 xustar0030 mtime=1450291270.037772355 30 atime=1450291270.037772355 30 ctime=1457295917.241761001 transmission-2.92/qt/InteropObject.cc0000644000175000017500000000115612634330106021006 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: InteropObject.cc 14621 2015-12-16 17:57:05Z mikedld $ */ #include "AddData.h" #include "Application.h" #include "InteropObject.h" InteropObject::InteropObject (QObject * parent): QObject (parent) { } bool InteropObject::PresentWindow () { qApp->raise (); return true; } bool InteropObject::AddMetainfo (const QString& metainfo) { AddData addme (metainfo); if (addme.type != addme.NONE) qApp->addTorrent (addme); return true; } transmission-2.92/qt/PaxHeaders.4960/TrackerModelFilter.cc0000644000000000000000000000013212536126416020341 xustar0030 mtime=1433971982.546590108 30 atime=1433971982.546590108 30 ctime=1457295917.244761052 transmission-2.92/qt/TrackerModelFilter.cc0000644000175000017500000000160012536126416021763 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: TrackerModelFilter.cc 14537 2015-06-10 21:27:11Z mikedld $ */ #include "TrackerModel.h" #include "TrackerModelFilter.h" TrackerModelFilter::TrackerModelFilter (QObject * parent): QSortFilterProxyModel (parent), myShowBackups (false) { } void TrackerModelFilter::setShowBackupTrackers (bool b) { myShowBackups = b; invalidateFilter (); } bool TrackerModelFilter::filterAcceptsRow (int sourceRow, const QModelIndex & sourceParent) const { QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent); const TrackerInfo trackerInfo = index.data(TrackerModel::TrackerRole).value(); return myShowBackups || !trackerInfo.st.isBackup; } transmission-2.92/qt/PaxHeaders.4960/SqueezeLabel.cc0000644000000000000000000000013212536126416017200 xustar0030 mtime=1433971982.532589846 30 atime=1433971982.532589846 30 ctime=1457295917.241761001 transmission-2.92/qt/SqueezeLabel.cc0000644000175000017500000000571612536126416020636 0ustar00mikedldmikedld00000000000000/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** ** This file is part of the demonstration applications of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include "SqueezeLabel.h" SqueezeLabel::SqueezeLabel (const QString& text, QWidget * parent): QLabel (text, parent) { } SqueezeLabel::SqueezeLabel (QWidget * parent): QLabel (parent) { } void SqueezeLabel::paintEvent (QPaintEvent * paintEvent) { if (hasFocus () && (textInteractionFlags () & (Qt::TextSelectableByKeyboard | Qt::TextSelectableByMouse))) return QLabel::paintEvent (paintEvent); QPainter painter (this); QFontMetrics fm = fontMetrics (); QStyleOption opt; opt.initFrom (this); const QString fullText = text (); const QString elidedText = fm.elidedText (fullText, Qt::ElideRight, width()); style()->drawItemText (&painter, contentsRect(), alignment(), opt.palette, isEnabled(), elidedText, foregroundRole()); #ifndef QT_NO_TOOLTIP setToolTip (fullText != elidedText ? fullText : QString ()); #endif } transmission-2.92/qt/PaxHeaders.4960/StatsDialog.cc0000644000000000000000000000013212571431256017035 xustar0030 mtime=1441149614.412176937 30 atime=1441149614.412176937 30 ctime=1457295917.240760984 transmission-2.92/qt/StatsDialog.cc0000644000175000017500000000410412571431256020461 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: StatsDialog.cc 14562 2015-09-01 20:39:34Z mikedld $ */ #include #include "ColumnResizer.h" #include "Formatter.h" #include "Session.h" #include "StatsDialog.h" enum { REFRESH_INTERVAL_MSEC = (15*1000) }; StatsDialog::StatsDialog (Session& session, QWidget * parent): BaseDialog (parent), mySession (session), myTimer (new QTimer (this)) { ui.setupUi (this); ColumnResizer * cr (new ColumnResizer (this)); cr->addLayout (ui.currentSessionSectionLayout); cr->addLayout (ui.totalSectionLayout); cr->update (); myTimer->setSingleShot (false); connect (myTimer, SIGNAL (timeout ()), &mySession, SLOT (refreshSessionStats ())); connect (&mySession, SIGNAL (statsUpdated ()), this, SLOT (updateStats ())); updateStats (); mySession.refreshSessionStats (); } StatsDialog::~StatsDialog () { } void StatsDialog::setVisible (bool visible) { myTimer->stop (); if (visible) myTimer->start (REFRESH_INTERVAL_MSEC); BaseDialog::setVisible (visible); } void StatsDialog::updateStats () { const tr_session_stats& current (mySession.getStats ()); const tr_session_stats& total (mySession.getCumulativeStats ()); ui.currentUploadedValueLabel->setText (Formatter::sizeToString (current.uploadedBytes)); ui.currentDownloadedValueLabel->setText (Formatter::sizeToString (current.downloadedBytes)); ui.currentRatioValueLabel->setText (Formatter::ratioToString (current.ratio)); ui.currentDurationValueLabel->setText (Formatter::timeToString (current.secondsActive)); ui.totalUploadedValueLabel->setText (Formatter::sizeToString (total.uploadedBytes)); ui.totalDownloadedValueLabel->setText (Formatter::sizeToString (total.downloadedBytes)); ui.totalRatioValueLabel->setText (Formatter::ratioToString (total.ratio)); ui.totalDurationValueLabel->setText (Formatter::timeToString (total.secondsActive)); ui.startCountLabel->setText (tr ("Started %Ln time(s)", 0, total.sessionCount)); } transmission-2.92/qt/PaxHeaders.4960/PrefsDialog.h0000644000000000000000000000013212571431256016660 xustar0030 mtime=1441149614.410176902 30 atime=1441149614.410176902 30 ctime=1457295917.240760984 transmission-2.92/qt/PrefsDialog.h0000644000175000017500000000432212571431256020306 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: PrefsDialog.h 14561 2015-09-01 20:19:26Z mikedld $ */ #ifndef QTR_PREFS_DIALOG_H #define QTR_PREFS_DIALOG_H #include #include #include "BaseDialog.h" #include "Prefs.h" #include "ui_PrefsDialog.h" class QHttp; class QMessageBox; class QString; class Prefs; class Session; class PrefsDialog: public BaseDialog { Q_OBJECT public: PrefsDialog (Session&, Prefs&, QWidget * parent = nullptr); virtual ~PrefsDialog (); private: typedef QMap key2widget_t; private: bool updateWidgetValue (QWidget * widget, int prefKey); void linkWidgetToPref (QWidget * widget, int prefKey); void updateBlocklistLabel (); void setPref (int key, const QVariant& v); void initDownloadingTab (); void initSeedingTab (); void initSpeedTab (); void initPrivacyTab (); void initNetworkTab (); void initDesktopTab (); void initRemoteTab (); private slots: void checkBoxToggled (bool checked); void spinBoxEditingFinished (); void timeEditingFinished (); void lineEditingFinished (); void pathChanged (const QString& path); void refreshPref (int key); void encryptionEdited (int); void altSpeedDaysEdited (int); void sessionUpdated (); void onPortTested (bool); void onPortTest (); void onIdleLimitChanged (); void onQueueStalledMinutesChanged (); void onUpdateBlocklistClicked (); void onUpdateBlocklistCancelled (); void onBlocklistDialogDestroyed (QObject *); void onBlocklistUpdated (int n); private: Session& mySession; Prefs& myPrefs; Ui::PrefsDialog ui; key2widget_t myWidgets; const bool myIsServer; QWidgetList myWebWidgets; QWidgetList myWebAuthWidgets; QWidgetList myWebWhitelistWidgets; QWidgetList myProxyWidgets; QWidgetList myProxyAuthWidgets; QWidgetList mySchedWidgets; QWidgetList myBlockWidgets; QWidgetList myUnsupportedWhenRemote; int myBlocklistHttpTag; QHttp * myBlocklistHttp; QMessageBox * myBlocklistDialog; }; #endif // QTR_PREFS_DIALOG_H transmission-2.92/qt/PaxHeaders.4960/RelocateDialog.ui0000644000000000000000000000013212536126416017525 xustar0030 mtime=1433971982.541590014 30 atime=1433971982.540589995 30 ctime=1457295917.241761001 transmission-2.92/qt/RelocateDialog.ui0000644000175000017500000000456712536126416021166 0ustar00mikedldmikedld00000000000000 RelocateDialog 0 0 333 155 Set Torrent Location QLayout::SetFixedSize font-weight:bold Set Location 18 New &location: &Move from the current folder Local data is &already there Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok PathButton QToolButton
PathButton.h
transmission-2.92/qt/PaxHeaders.4960/Application.h0000644000000000000000000000013212634073014016716 xustar0030 mtime=1450210828.843138866 30 atime=1450210828.843138866 30 ctime=1457295917.240760984 transmission-2.92/qt/Application.h0000644000175000017500000000321212634073014020341 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: Application.h 14600 2015-11-15 11:03:27Z mikedld $ */ #ifndef QTR_APPLICATION_H #define QTR_APPLICATION_H #include #include #include #include #include "FaviconCache.h" class AddData; class Prefs; class Session; class TorrentModel; class MainWindow; class WatchDir; class Application: public QApplication { Q_OBJECT public: Application (int& argc, char ** argv); virtual ~Application (); void raise (); bool notifyApp (const QString& title, const QString& body) const; FaviconCache& faviconCache (); public slots: void addTorrent (const QString&); void addTorrent (const AddData&); private: void maybeUpdateBlocklist (); void loadTranslations (); void quitLater (); private slots: void consentGiven (int result); void onSessionSourceChanged (); void refreshPref (int key); void refreshTorrents (); void onTorrentsAdded (const QSet& torrents); void onTorrentCompleted (int); void onNewTorrentChanged (int); private: Prefs * myPrefs; Session * mySession; TorrentModel * myModel; MainWindow * myWindow; WatchDir * myWatchDir; QTimer myModelTimer; QTimer myStatsTimer; QTimer mySessionTimer; time_t myLastFullUpdateTime; QTranslator myQtTranslator; QTranslator myAppTranslator; FaviconCache myFavicons; }; #undef qApp #define qApp static_cast (Application::instance ()) #endif // QTR_APPLICATION_H transmission-2.92/qt/PaxHeaders.4960/FilterBar.cc0000644000000000000000000000013012613027544016465 xustar0029 mtime=1445736292.78607624 29 atime=1445736292.78607624 30 ctime=1457295917.237760933 transmission-2.92/qt/FilterBar.cc0000644000175000017500000002707112613027544020123 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FilterBar.cc 14590 2015-10-24 20:56:45Z mikedld $ */ #include #include #include #include "Application.h" #include "FaviconCache.h" #include "Filters.h" #include "FilterBar.h" #include "FilterBarComboBox.h" #include "FilterBarComboBoxDelegate.h" #include "FilterBarLineEdit.h" #include "Prefs.h" #include "Torrent.h" #include "TorrentFilter.h" #include "TorrentModel.h" enum { ActivityRole = FilterBarComboBox::UserRole, TrackerRole }; namespace { QString readableHostName (const QString& host) { // get the readable name... QString name = host; const int pos = name.lastIndexOf (QLatin1Char ('.')); if (pos >= 0) name.truncate (pos); if (!name.isEmpty ()) name[0] = name[0].toUpper (); return name; } } /*** **** ***/ FilterBarComboBox * FilterBar::createActivityCombo () { FilterBarComboBox * c = new FilterBarComboBox (this); FilterBarComboBoxDelegate * delegate = new FilterBarComboBoxDelegate (this, c); c->setItemDelegate (delegate); QStandardItemModel * model = new QStandardItemModel (this); QStandardItem * row = new QStandardItem (tr ("All")); row->setData (FilterMode::SHOW_ALL, ActivityRole); model->appendRow (row); model->appendRow (new QStandardItem); // separator delegate->setSeparator (model, model->index (1, 0)); row = new QStandardItem (QIcon::fromTheme (QLatin1String ("system-run")), tr ("Active")); row->setData (FilterMode::SHOW_ACTIVE, ActivityRole); model->appendRow (row); row = new QStandardItem (QIcon::fromTheme (QLatin1String ("go-down")), tr ("Downloading")); row->setData (FilterMode::SHOW_DOWNLOADING, ActivityRole); model->appendRow (row); row = new QStandardItem (QIcon::fromTheme (QLatin1String ("go-up")), tr ("Seeding")); row->setData (FilterMode::SHOW_SEEDING, ActivityRole); model->appendRow (row); row = new QStandardItem (QIcon::fromTheme (QLatin1String ("media-playback-pause")), tr ("Paused")); row->setData (FilterMode::SHOW_PAUSED, ActivityRole); model->appendRow (row); row = new QStandardItem (QIcon::fromTheme (QLatin1String ("dialog-ok")), tr ("Finished")); row->setData (FilterMode::SHOW_FINISHED, ActivityRole); model->appendRow (row); row = new QStandardItem (QIcon::fromTheme (QLatin1String ("view-refresh")), tr ("Verifying")); row->setData (FilterMode::SHOW_VERIFYING, ActivityRole); model->appendRow (row); row = new QStandardItem (QIcon::fromTheme (QLatin1String ("process-stop")), tr ("Error")); row->setData (FilterMode::SHOW_ERROR, ActivityRole); model->appendRow (row); c->setModel (model); return c; } /*** **** ***/ void FilterBar::refreshTrackers () { FaviconCache& favicons = qApp->faviconCache (); const int firstTrackerRow = 2; // skip over the "All" and separator... // pull info from the tracker model... QSet oldHosts; for (int row=firstTrackerRow; ; ++row) { QModelIndex index = myTrackerModel->index (row, 0); if (!index.isValid ()) break; oldHosts << index.data (TrackerRole).toString (); } // pull the new stats from the torrent model... QSet newHosts; QMap torrentsPerHost; for (int row=0; ; ++row) { QModelIndex index = myTorrents.index (row, 0); if (!index.isValid ()) break; const Torrent * tor = index.data (TorrentModel::TorrentRole).value (); QSet torrentNames; for (const QString& host: tor->hosts ()) { newHosts.insert (host); torrentNames.insert (readableHostName (host)); } for (const QString& name: torrentNames) ++torrentsPerHost[name]; } // update the "All" row myTrackerModel->setData (myTrackerModel->index (0,0), myTorrents.rowCount (), FilterBarComboBox::CountRole); myTrackerModel->setData (myTrackerModel->index (0,0), getCountString (myTorrents.rowCount ()), FilterBarComboBox::CountStringRole); // rows to update for (const QString& host: oldHosts & newHosts) { const QString name = readableHostName (host); QStandardItem * row = myTrackerModel->findItems (name).front (); const int count = torrentsPerHost[name]; row->setData (count, FilterBarComboBox::CountRole); row->setData (getCountString (count), FilterBarComboBox::CountStringRole); row->setData (favicons.findFromHost (host), Qt::DecorationRole); } // rows to remove for (const QString& host: oldHosts - newHosts) { const QString name = readableHostName (host); QStandardItem * item = myTrackerModel->findItems (name).front (); if (!item->data (TrackerRole).toString ().isEmpty ()) // don't remove "All" myTrackerModel->removeRows (item->row (), 1); } // rows to add bool anyAdded = false; for (const QString& host: newHosts - oldHosts) { const QString name = readableHostName (host); if (!myTrackerModel->findItems (name).isEmpty ()) continue; // find the sorted position to add this row int i = firstTrackerRow; for (int n=myTrackerModel->rowCount (); iindex (i,0).data (Qt::DisplayRole).toString (); if (rowName >= name) break; } // add the row QStandardItem * row = new QStandardItem (favicons.findFromHost (host), name); const int count = torrentsPerHost[host]; row->setData (count, FilterBarComboBox::CountRole); row->setData (getCountString (count), FilterBarComboBox::CountStringRole); row->setData (favicons.findFromHost (host), Qt::DecorationRole); row->setData (host, TrackerRole); myTrackerModel->insertRow (i, row); anyAdded = true; } if (anyAdded) // the one added might match our filter... refreshPref (Prefs::FILTER_TRACKERS); } FilterBarComboBox * FilterBar::createTrackerCombo (QStandardItemModel * model) { FilterBarComboBox * c = new FilterBarComboBox (this); FilterBarComboBoxDelegate * delegate = new FilterBarComboBoxDelegate (this, c); c->setItemDelegate (delegate); QStandardItem * row = new QStandardItem (tr ("All")); row->setData (QString (), TrackerRole); const int count = myTorrents.rowCount (); row->setData (count, FilterBarComboBox::CountRole); row->setData (getCountString (count), FilterBarComboBox::CountStringRole); model->appendRow (row); model->appendRow (new QStandardItem); // separator delegate->setSeparator (model, model->index (1, 0)); c->setModel (model); return c; } /*** **** ***/ FilterBar::FilterBar (Prefs& prefs, const TorrentModel& torrents, const TorrentFilter& filter, QWidget * parent): QWidget (parent), myPrefs (prefs), myTorrents (torrents), myFilter (filter), myRecountTimer (new QTimer (this)), myIsBootstrapping (true) { QHBoxLayout * h = new QHBoxLayout (this); h->setContentsMargins (3, 3, 3, 3); myCountLabel = new QLabel (tr ("Show:"), this); h->addWidget (myCountLabel); myActivityCombo = createActivityCombo (); myActivityCombo->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed)); h->addWidget (myActivityCombo); myTrackerModel = new QStandardItemModel (this); myTrackerCombo = createTrackerCombo (myTrackerModel); h->addWidget (myTrackerCombo); myLineEdit = new FilterBarLineEdit (this); h->addWidget (myLineEdit); connect (myLineEdit, SIGNAL (textChanged (QString)), this, SLOT (onTextChanged (QString))); // listen for changes from the other players connect (&myPrefs, SIGNAL (changed (int)), this, SLOT (refreshPref (int))); connect (myActivityCombo, SIGNAL (currentIndexChanged (int)), this, SLOT (onActivityIndexChanged (int))); connect (myTrackerCombo, SIGNAL (currentIndexChanged (int)), this, SLOT (onTrackerIndexChanged (int))); connect (&myTorrents, SIGNAL (modelReset ()), this, SLOT (recountSoon ())); connect (&myTorrents, SIGNAL (rowsInserted (QModelIndex, int, int)), this, SLOT (recountSoon ())); connect (&myTorrents, SIGNAL (rowsRemoved (QModelIndex, int, int)), this, SLOT (recountSoon ())); connect (&myTorrents, SIGNAL (dataChanged (QModelIndex, QModelIndex)), this, SLOT (recountSoon ())); connect (myRecountTimer, SIGNAL (timeout ()), this, SLOT (recount ())); recountSoon (); refreshTrackers (); myIsBootstrapping = false; // initialize our state QList initKeys; initKeys << Prefs::FILTER_MODE << Prefs::FILTER_TRACKERS; for (const int key: initKeys) refreshPref (key); } FilterBar::~FilterBar () { delete myRecountTimer; } /*** **** ***/ void FilterBar::clear () { myActivityCombo->setCurrentIndex (0); myTrackerCombo->setCurrentIndex (0); myLineEdit->clear (); } /*** **** ***/ void FilterBar::refreshPref (int key) { switch (key) { case Prefs::FILTER_MODE: { const FilterMode m = myPrefs.get (key); QAbstractItemModel * model = myActivityCombo->model (); QModelIndexList indices = model->match (model->index (0,0), ActivityRole, m.mode ()); myActivityCombo->setCurrentIndex (indices.isEmpty () ? 0 : indices.first ().row ()); break; } case Prefs::FILTER_TRACKERS: { const QString tracker = myPrefs.getString (key); const QString name = readableHostName (tracker); QList rows = myTrackerModel->findItems (name); if (!rows.isEmpty ()) { myTrackerCombo->setCurrentIndex (rows.front ()->row ()); } else // hm, we don't seem to have this tracker anymore... { const bool isBootstrapping = myTrackerModel->rowCount () <= 2; if (!isBootstrapping) myPrefs.set (key, QString ()); } break; } } } void FilterBar::onTextChanged (const QString& str) { if (!myIsBootstrapping) myPrefs.set (Prefs::FILTER_TEXT, str.trimmed ()); } void FilterBar::onTrackerIndexChanged (int i) { if (!myIsBootstrapping) { QString str; const bool isTracker = !myTrackerCombo->itemData (i,TrackerRole).toString ().isEmpty (); if (!isTracker) { // show all } else { str = myTrackerCombo->itemData (i,TrackerRole).toString (); const int pos = str.lastIndexOf (QLatin1Char ('.')); if (pos >= 0) str.truncate (pos+1); } myPrefs.set (Prefs::FILTER_TRACKERS, str); } } void FilterBar::onActivityIndexChanged (int i) { if (!myIsBootstrapping) { const FilterMode mode = myActivityCombo->itemData (i, ActivityRole).toInt (); myPrefs.set (Prefs::FILTER_MODE, mode); } } /*** **** ***/ void FilterBar::recountSoon () { if (!myRecountTimer->isActive ()) { myRecountTimer->setSingleShot (true); myRecountTimer->start (800); } } void FilterBar::recount () { QAbstractItemModel * model = myActivityCombo->model (); int torrentsPerMode[FilterMode::NUM_MODES] = {}; myFilter.countTorrentsPerMode (torrentsPerMode); for (int row=0, n=model->rowCount (); rowindex (row, 0); const int mode = index.data (ActivityRole).toInt (); const int count = torrentsPerMode [mode]; model->setData (index, count, FilterBarComboBox::CountRole); model->setData (index, getCountString (count), FilterBarComboBox::CountStringRole); } refreshTrackers (); } QString FilterBar::getCountString (int n) const { return QString::fromLatin1 ("%L1").arg (n); } transmission-2.92/qt/PaxHeaders.4960/TorrentDelegate.h0000644000000000000000000000013212537301461017545 xustar0030 mtime=1434288945.175419303 30 atime=1434288945.175419303 30 ctime=1457295917.244761052 transmission-2.92/qt/TorrentDelegate.h0000644000175000017500000000321612537301461021174 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: TorrentDelegate.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_TORRENT_DELEGATE_H #define QTR_TORRENT_DELEGATE_H #include class QStyle; class QStyleOptionProgressBar; class Torrent; class TorrentDelegate: public QStyledItemDelegate { Q_OBJECT public: explicit TorrentDelegate (QObject * parent = nullptr); virtual ~TorrentDelegate (); // QAbstractItemDelegate virtual QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const; virtual void paint(QPainter * painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; protected: QSize margin (const QStyle& style) const; void setProgressBarPercentDone (const QStyleOptionViewItem& option, const Torrent&) const; // Our own overridables virtual QSize sizeHint (const QStyleOptionViewItem&, const Torrent&) const; virtual void drawTorrent (QPainter * painter, const QStyleOptionViewItem& option, const Torrent&) const; static QString statusString (const Torrent& tor); static QString progressString (const Torrent& tor); static QString shortStatusString (const Torrent& tor); static QString shortTransferString (const Torrent& tor); protected: QStyleOptionProgressBar * myProgressBarStyle; static QColor blueBrush; static QColor greenBrush; static QColor silverBrush; static QColor blueBack; static QColor greenBack; static QColor silverBack; }; #endif // QTR_TORRENT_DELEGATE_H transmission-2.92/qt/PaxHeaders.4960/FileTreeModel.cc0000644000000000000000000000013212631124544017273 xustar0030 mtime=1449437540.255758146 30 atime=1449437540.255758146 30 ctime=1457295917.237760933 transmission-2.92/qt/FileTreeModel.cc0000644000175000017500000003211412631124544020721 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FileTreeModel.cc 14609 2015-12-06 17:39:18Z jordan $ */ #include #include // priorities #include "FileTreeItem.h" #include "FileTreeModel.h" namespace { class PathIteratorBase { protected: PathIteratorBase(const QString& path, int slashIndex): myPath (path), mySlashIndex (slashIndex), myToken () { myToken.reserve (path.size () / 2); } protected: const QString& myPath; int mySlashIndex; QString myToken; static const QChar SlashChar; }; const QChar PathIteratorBase::SlashChar = QLatin1Char ('/'); class ForwardPathIterator: public PathIteratorBase { public: ForwardPathIterator (const QString& path): PathIteratorBase (path, path.size () - 1) { } bool hasNext () const { return mySlashIndex > 0; } const QString& next () { int newSlashIndex = myPath.lastIndexOf (SlashChar, mySlashIndex); myToken.truncate (0); myToken += myPath.midRef (newSlashIndex + 1, mySlashIndex - newSlashIndex); mySlashIndex = newSlashIndex - 1; return myToken; } }; class BackwardPathIterator: public PathIteratorBase { public: BackwardPathIterator (const QString& path): PathIteratorBase (path, 0) { } bool hasNext () const { return mySlashIndex < myPath.size (); } const QString& next () { int newSlashIndex = myPath.indexOf (SlashChar, mySlashIndex); if (newSlashIndex == -1) newSlashIndex = myPath.size (); myToken.truncate (0); myToken += myPath.midRef (mySlashIndex, newSlashIndex - mySlashIndex); mySlashIndex = newSlashIndex + 1; return myToken; } }; } FileTreeModel::FileTreeModel (QObject * parent, bool isEditable): QAbstractItemModel(parent), myIsEditable (isEditable), myRootItem (new FileTreeItem), myIndexCache () { } FileTreeModel::~FileTreeModel() { clear(); delete myRootItem; } void FileTreeModel::setEditable (bool editable) { myIsEditable = editable; } FileTreeItem * FileTreeModel::itemFromIndex (const QModelIndex& index) const { if (!index.isValid()) return nullptr; assert (index.model () == this); return static_cast(index.internalPointer()); } QModelIndexList FileTreeModel::getOrphanIndices (const QModelIndexList& indices) const { QModelIndexList orphanIndices = indices; qSort (orphanIndices); for (QMutableListIterator it (orphanIndices); it.hasNext ();) { QModelIndex walk = it.next (); for (;;) { walk = parent (walk, walk.column ()); if (!walk.isValid ()) break; if (qBinaryFind (orphanIndices, walk) != orphanIndices.end ()) { it.remove (); break; } } } return orphanIndices; } QVariant FileTreeModel::data (const QModelIndex &index, int role) const { QVariant value; if (index.isValid()) value = itemFromIndex(index)->data (index.column(), role); return value; } Qt::ItemFlags FileTreeModel::flags (const QModelIndex& index) const { int i(Qt::ItemIsSelectable | Qt::ItemIsEnabled); if(myIsEditable && (index.column() == COL_NAME)) i |= Qt::ItemIsEditable; if(index.column() == COL_WANTED) i |= Qt::ItemIsUserCheckable | Qt::ItemIsTristate; return Qt::ItemFlags(i); } bool FileTreeModel::setData (const QModelIndex& index, const QVariant& newname, int role) { if (role == Qt::EditRole) { FileTreeItem * item = itemFromIndex (index); emit pathEdited (item->path (), newname.toString ()); } return false; // don't update the view until the session confirms the change } QVariant FileTreeModel::headerData (int column, Qt::Orientation orientation, int role) const { QVariant data; if (orientation==Qt::Horizontal && role==Qt::DisplayRole) { switch (column) { case COL_NAME: data.setValue (tr("File")); break; case COL_SIZE: data.setValue (tr("Size")); break; case COL_PROGRESS: data.setValue (tr("Progress")); break; case COL_WANTED: data.setValue (tr("Download")); break; case COL_PRIORITY: data.setValue (tr("Priority")); break; default: break; } } return data; } QModelIndex FileTreeModel::index (int row, int column, const QModelIndex& parent) const { QModelIndex i; if (hasIndex (row, column, parent)) { FileTreeItem * parentItem; if (!parent.isValid ()) parentItem = myRootItem; else parentItem = itemFromIndex (parent); FileTreeItem * childItem = parentItem->child (row); if (childItem) i = createIndex (row, column, childItem); } return i; } QModelIndex FileTreeModel::parent (const QModelIndex& child) const { return parent (child, 0); // QAbstractItemModel::parent() wants col 0 } QModelIndex FileTreeModel::parent (const QModelIndex& child, int column) const { QModelIndex parent; if (child.isValid()) parent = indexOf (itemFromIndex(child)->parent(), column); return parent; } int FileTreeModel::rowCount (const QModelIndex& parent) const { FileTreeItem * parentItem; if (parent.isValid()) parentItem = itemFromIndex (parent); else parentItem = myRootItem; return parentItem->childCount(); } int FileTreeModel::columnCount (const QModelIndex& parent) const { Q_UNUSED(parent); return NUM_COLUMNS; } QModelIndex FileTreeModel::indexOf (FileTreeItem * item, int column) const { if (!item || item==myRootItem) return QModelIndex(); return createIndex(item->row(), column, item); } void FileTreeModel::clearSubtree (const QModelIndex& top) { size_t i = rowCount (top); while (i > 0) clearSubtree(index(--i, 0, top)); FileTreeItem * const item = itemFromIndex (top); if (item == 0) return; if (item->fileIndex () != -1) myIndexCache.remove (item->fileIndex ()); delete item; } void FileTreeModel::clear () { beginResetModel (); clearSubtree (QModelIndex()); endResetModel (); assert (myIndexCache.isEmpty ()); } FileTreeItem * FileTreeModel::findItemForFileIndex (int fileIndex) const { return myIndexCache.value (fileIndex, 0); } void FileTreeModel::addFile (int fileIndex, const QString& filename, bool wanted, int priority, uint64_t totalSize, uint64_t have, bool updateFields) { FileTreeItem * item; item = findItemForFileIndex (fileIndex); if (item) // this file is already in the tree, we've added this { QModelIndex indexWithChangedParents; ForwardPathIterator filenameIt (filename); while (filenameIt.hasNext ()) { const QString& token = filenameIt.next (); const std::pair changed = item->update (token, wanted, priority, have, updateFields); if (changed.first >= 0) { emit dataChanged (indexOf (item, changed.first), indexOf (item, changed.second)); if (!indexWithChangedParents.isValid () && changed.first <= COL_PRIORITY && changed.second >= COL_SIZE) indexWithChangedParents = indexOf (item, 0); } item = item->parent(); } assert (item == myRootItem); if (indexWithChangedParents.isValid ()) emitParentsChanged (indexWithChangedParents, COL_SIZE, COL_PRIORITY); } else // we haven't build the FileTreeItems for these tokens yet { bool added = false; item = myRootItem; BackwardPathIterator filenameIt (filename); while (filenameIt.hasNext ()) { const QString& token = filenameIt.next (); FileTreeItem * child(item->child(token)); if (!child) { added = true; QModelIndex parentIndex (indexOf(item, 0)); const int n (item->childCount()); beginInsertRows (parentIndex, n, n); if (!filenameIt.hasNext ()) child = new FileTreeItem (token, fileIndex, totalSize); else child = new FileTreeItem (token); item->appendChild (child); endInsertRows (); } item = child; } if (item != myRootItem) { assert (item->fileIndex() == fileIndex); assert (item->totalSize() == totalSize); myIndexCache[fileIndex] = item; const std::pair changed = item->update (item->name(), wanted, priority, have, added || updateFields); if (changed.first >= 0) emit dataChanged (indexOf (item, changed.first), indexOf (item, changed.second)); } } } void FileTreeModel::emitParentsChanged (const QModelIndex& index, int firstColumn, int lastColumn, QSet * visitedParentIndices) { assert (firstColumn <= lastColumn); QModelIndex walk = index; for (;;) { walk = parent (walk, firstColumn); if (!walk.isValid ()) break; if (visitedParentIndices != nullptr) { if (visitedParentIndices->contains (walk)) break; visitedParentIndices->insert (walk); } emit dataChanged (walk, walk.sibling (walk.row (), lastColumn)); } } void FileTreeModel::emitSubtreeChanged (const QModelIndex& index, int firstColumn, int lastColumn) { assert (firstColumn <= lastColumn); const int childCount = rowCount (index); if (!childCount) return; // tell everyone that this item changed emit dataChanged (index.child (0, firstColumn), index.child (childCount - 1, lastColumn)); // walk the subitems for (int i=0; i wantedIndices; for (const QModelIndex& i: getOrphanIndices (indices)) { const FileTreeItem * const item = itemFromIndex (i); wantedIndices[item->isSubtreeWanted () != Qt::Checked] << i; } for (int i = 0; i <= 1; ++i) { if (wantedIndices.contains (i)) setWanted (wantedIndices[i], i != 0); } } void FileTreeModel::twiddlePriority (const QModelIndexList& indices) { QMap priorityIndices; for (const QModelIndex& i: getOrphanIndices (indices)) { const FileTreeItem * const item = itemFromIndex (i); int priority = item->priority (); // ... -> normal -> high -> low -> normal -> ...; mixed -> normal if (priority == FileTreeItem::NORMAL) priority = TR_PRI_HIGH; else if (priority == FileTreeItem::HIGH) priority = TR_PRI_LOW; else priority = TR_PRI_NORMAL; priorityIndices[priority] << i; } for (int i = TR_PRI_LOW; i <= TR_PRI_HIGH; ++i) { if (priorityIndices.contains (i)) setPriority (priorityIndices[i], i); } } void FileTreeModel::setWanted (const QModelIndexList& indices, bool wanted) { if (indices.isEmpty ()) return; const QModelIndexList orphanIndices = getOrphanIndices (indices); QSet fileIds; for (const QModelIndex& i: orphanIndices) { FileTreeItem * const item = itemFromIndex (i); item->setSubtreeWanted (wanted, fileIds); emit dataChanged (i, i); emitSubtreeChanged (i, COL_WANTED, COL_WANTED); } // emit parent changes separately to avoid multiple updates for same items QSet parentIndices; for (const QModelIndex& i: orphanIndices) emitParentsChanged (i, COL_SIZE, COL_WANTED, &parentIndices); if (!fileIds.isEmpty ()) emit wantedChanged (fileIds, wanted); } void FileTreeModel::setPriority (const QModelIndexList& indices, int priority) { if (indices.isEmpty ()) return; const QModelIndexList orphanIndices = getOrphanIndices (indices); QSet fileIds; for (const QModelIndex& i: orphanIndices) { FileTreeItem * const item = itemFromIndex (i); item->setSubtreePriority (priority, fileIds); emit dataChanged (i, i); emitSubtreeChanged (i, COL_PRIORITY, COL_PRIORITY); } // emit parent changes separately to avoid multiple updates for same items QSet parentIndices; for (const QModelIndex& i: orphanIndices) emitParentsChanged (i, COL_PRIORITY, COL_PRIORITY, &parentIndices); if (!fileIds.isEmpty ()) emit priorityChanged (fileIds, priority); } bool FileTreeModel::openFile (const QModelIndex& index) { if (!index.isValid ()) return false; FileTreeItem * const item = itemFromIndex (index); if (item->fileIndex () < 0 || !item->isComplete ()) return false; emit openRequested (item->path ()); return true; } transmission-2.92/qt/PaxHeaders.4960/FileTreeView.cc0000644000000000000000000000013112602045102017132 xustar0029 mtime=1443383874.00293468 30 atime=1441149614.408176866 30 ctime=1457295917.240760984 transmission-2.92/qt/FileTreeView.cc0000644000175000017500000003022112602045102020556 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FileTreeView.cc 14559 2015-08-16 22:07:09Z mikedld $ */ #include #include #include #include #include #include #include #include // priorities #include "FileTreeDelegate.h" #include "FileTreeItem.h" #include "FileTreeModel.h" #include "FileTreeView.h" #include "Formatter.h" #include "Utils.h" #define PRIORITY_KEY "priority" FileTreeView::FileTreeView (QWidget * parent, bool isEditable): QTreeView (parent), myModel (new FileTreeModel (this, isEditable)), myProxy (new QSortFilterProxyModel (this)), myDelegate (new FileTreeDelegate (this)) { myProxy->setSourceModel (myModel); myProxy->setSortRole (FileTreeModel::SortRole); myProxy->setSortCaseSensitivity (Qt::CaseInsensitive); setModel (myProxy); setItemDelegate (myDelegate); sortByColumn (FileTreeModel::COL_NAME, Qt::AscendingOrder); connect (this, SIGNAL(clicked(QModelIndex)), this, SLOT(onClicked(QModelIndex))); connect (myModel, SIGNAL(priorityChanged(QSet, int)), this, SIGNAL(priorityChanged(QSet, int))); connect (myModel, SIGNAL(wantedChanged(QSet, bool)), this, SIGNAL(wantedChanged(QSet, bool))); connect (myModel, SIGNAL(pathEdited(QString, QString)), this, SIGNAL(pathEdited(QString, QString))); connect (myModel, SIGNAL (openRequested (QString)), this, SIGNAL (openRequested (QString))); } void FileTreeView::onClicked (const QModelIndex& proxyIndex) { const QModelIndex modelIndex = myProxy->mapToSource (proxyIndex); if (modelIndex.column () == FileTreeModel::COL_WANTED) myModel->twiddleWanted (QModelIndexList () << modelIndex); else if (modelIndex.column () == FileTreeModel::COL_PRIORITY) myModel->twiddlePriority (QModelIndexList () << modelIndex); } void FileTreeView::resizeEvent (QResizeEvent * event) { QTreeView::resizeEvent (event); // this is kind of a hack to get the last four columns be the // right size, and to have the filename column use whatever // space is left over... int left = event->size ().width () - 1; for (int column = 0; column < FileTreeModel::NUM_COLUMNS; ++column) { if (column == FileTreeModel::COL_NAME) continue; int minWidth = 0; QStringList itemTexts; switch (column) { case FileTreeModel::COL_SIZE: for (int s = Formatter::B; s <= Formatter::TB; ++s) itemTexts << QLatin1String ("999.9 ") + Formatter::unitStr (Formatter::MEM, static_cast (s)); break; case FileTreeModel::COL_PROGRESS: itemTexts << QLatin1String (" 100% "); break; case FileTreeModel::COL_WANTED: minWidth = 20; break; case FileTreeModel::COL_PRIORITY: itemTexts << FileTreeItem::tr ("Low") << FileTreeItem::tr ("Normal") << FileTreeItem::tr ("High") << FileTreeItem::tr ("Mixed"); break; } int itemWidth = 0; for (const QString& itemText: itemTexts) itemWidth = std::max (itemWidth, Utils::measureViewItem (this, itemText)); const QString headerText = myModel->headerData (column, Qt::Horizontal).toString (); int headerWidth = Utils::measureHeaderItem (this->header (), headerText); const int width = std::max (minWidth, std::max (itemWidth, headerWidth)); setColumnWidth (column, width); left -= width; } setColumnWidth (FileTreeModel::COL_NAME, std::max (left, 0)); } void FileTreeView::keyPressEvent (QKeyEvent * event) { if (state () != EditingState) { if (event->key () == Qt::Key_Space) { // handle using the keyboard to toggle the // wanted/unwanted state or the file priority const Qt::KeyboardModifiers modifiers = event->modifiers (); if (modifiers == Qt::NoModifier) { myModel->twiddleWanted (selectedSourceRows ()); return; } if (modifiers == Qt::ShiftModifier) { myModel->twiddlePriority (selectedSourceRows ()); return; } } } QTreeView::keyPressEvent (event); } void FileTreeView::mouseDoubleClickEvent (QMouseEvent * event) { const QModelIndex index = currentIndex (); if (!index.isValid () || index.column () == FileTreeModel::COL_WANTED || index.column () == FileTreeModel::COL_PRIORITY) return; if (openSelectedItem ()) return; QTreeView::mouseDoubleClickEvent (event); } void FileTreeView::contextMenuEvent (QContextMenuEvent * event) { const QModelIndex rootIndex = myModel->index (0, 0); if (!rootIndex.isValid ()) return; if (myContextMenu == nullptr) initContextMenu (); myContextMenu->popup (event->globalPos ()); } void FileTreeView::update (const FileList& files, bool updateFields) { const bool modelWasEmpty = myProxy->rowCount () == 0; for (const TorrentFile& file: files) myModel->addFile (file.index, file.filename, file.wanted, file.priority, file.size, file.have, updateFields); if (modelWasEmpty) { // expand up until the item with more than one expandable child for (QModelIndex index = myProxy->index (0, 0); index.isValid ();) { const QModelIndex oldIndex = index; expand (oldIndex); index = QModelIndex (); for (int i = 0, count = myProxy->rowCount (oldIndex); i < count; ++i) { const QModelIndex newIndex = myProxy->index (i, 0, oldIndex); if (myProxy->rowCount (newIndex) == 0) continue; if (index.isValid ()) { index = QModelIndex (); break; } index = newIndex; } } } myProxy->sort (header ()->sortIndicatorSection (), header ()->sortIndicatorOrder ()); } void FileTreeView::clear () { myModel->clear(); } void FileTreeView::setEditable (bool editable) { myModel->setEditable (editable); } bool FileTreeView::edit (const QModelIndex& index, EditTrigger trigger, QEvent * event) { if (selectionModel ()->selectedRows ().size () != 1) return false; const QModelIndex nameIndex = index.sibling (index.row (), FileTreeModel::COL_NAME); if (editTriggers ().testFlag (trigger)) selectionModel ()->setCurrentIndex (nameIndex, QItemSelectionModel::NoUpdate); return QTreeView::edit (nameIndex, trigger, event); } void FileTreeView::checkSelectedItems () { myModel->setWanted (selectedSourceRows (), true); } void FileTreeView::uncheckSelectedItems () { myModel->setWanted (selectedSourceRows (), false); } void FileTreeView::onlyCheckSelectedItems () { const QModelIndex rootIndex = myModel->index (0, 0); if (!rootIndex.isValid ()) return; QModelIndexList wantedIndices = selectedSourceRows (); myModel->setWanted (wantedIndices, true); qSort (wantedIndices); QSet wantedIndicesParents; for (const QModelIndex& i: wantedIndices) { for (QModelIndex p = i.parent (); p.isValid (); p = p.parent ()) wantedIndicesParents.insert (p); } QQueue parentsQueue; parentsQueue.enqueue (rootIndex); QModelIndexList unwantedIndices; while (!parentsQueue.isEmpty ()) { const QModelIndex parentIndex = parentsQueue.dequeue (); if (qBinaryFind (wantedIndices, parentIndex) != wantedIndices.end ()) continue; for (int i = 0, count = myModel->rowCount (parentIndex); i < count; ++i) { const QModelIndex childIndex = parentIndex.child (i, 0); const int childCheckState = childIndex.data (FileTreeModel::WantedRole).toInt (); if (childCheckState == Qt::Unchecked || qBinaryFind (wantedIndices, childIndex) != wantedIndices.end ()) continue; if (childCheckState == Qt::Checked && childIndex.data (FileTreeModel::FileIndexRole).toInt () >= 0) { unwantedIndices << childIndex; } else { if (!wantedIndicesParents.contains (childIndex)) unwantedIndices << childIndex; else parentsQueue.enqueue (childIndex); } } } myModel->setWanted (unwantedIndices, false); } void FileTreeView::setSelectedItemsPriority () { QAction * action = qobject_cast (sender ()); assert (action != nullptr); myModel->setPriority (selectedSourceRows (), action->property (PRIORITY_KEY).toInt ()); } bool FileTreeView::openSelectedItem () { return myModel->openFile (myProxy->mapToSource (currentIndex ())); } void FileTreeView::renameSelectedItem () { QTreeView::edit (currentIndex ()); } void FileTreeView::refreshContextMenuActionsSensitivity () { assert (myContextMenu != nullptr); const QModelIndexList selectedRows = selectionModel ()->selectedRows (); const Qt::CheckState checkState = getCumulativeCheckState (selectedRows); const bool haveSelection = !selectedRows.isEmpty (); const bool haveSingleSelection = selectedRows.size() == 1; const bool haveUnchecked = checkState == Qt::Unchecked || checkState == Qt::PartiallyChecked; const bool haveChecked = checkState == Qt::Checked || checkState == Qt::PartiallyChecked; myCheckSelectedAction->setEnabled (haveUnchecked); myUncheckSelectedAction->setEnabled (haveChecked); myOnlyCheckSelectedAction->setEnabled (haveSelection); myPriorityMenu->setEnabled (haveSelection); myOpenAction->setEnabled (haveSingleSelection && selectedRows.first ().data (FileTreeModel::FileIndexRole).toInt () >= 0 && selectedRows.first ().data (FileTreeModel::CompleteRole).toBool ()); myRenameAction->setEnabled (haveSingleSelection); } void FileTreeView::initContextMenu () { myContextMenu = new QMenu (this); myCheckSelectedAction = myContextMenu->addAction (tr ("Check Selected"), this, SLOT (checkSelectedItems ())); myUncheckSelectedAction = myContextMenu->addAction (tr ("Uncheck Selected"), this, SLOT (uncheckSelectedItems ())); myOnlyCheckSelectedAction = myContextMenu->addAction (tr ("Only Check Selected"), this, SLOT (onlyCheckSelectedItems ())); myContextMenu->addSeparator (); myPriorityMenu = myContextMenu->addMenu (tr ("Priority")); myHighPriorityAction = myPriorityMenu->addAction (FileTreeItem::tr ("High"), this, SLOT (setSelectedItemsPriority ())); myNormalPriorityAction = myPriorityMenu->addAction (FileTreeItem::tr ("Normal"), this, SLOT (setSelectedItemsPriority ())); myLowPriorityAction = myPriorityMenu->addAction (FileTreeItem::tr ("Low"), this, SLOT (setSelectedItemsPriority ())); myHighPriorityAction->setProperty (PRIORITY_KEY, TR_PRI_HIGH); myNormalPriorityAction->setProperty (PRIORITY_KEY, TR_PRI_NORMAL); myLowPriorityAction->setProperty (PRIORITY_KEY, TR_PRI_LOW); myContextMenu->addSeparator (); myOpenAction = myContextMenu->addAction (tr ("Open"), this, SLOT (openSelectedItem ())); myRenameAction = myContextMenu->addAction (tr ("Rename..."), this, SLOT (renameSelectedItem ())); connect (myContextMenu, SIGNAL (aboutToShow ()), SLOT (refreshContextMenuActionsSensitivity ())); } QModelIndexList FileTreeView::selectedSourceRows (int column) const { QModelIndexList indices; for (const QModelIndex& i: selectionModel ()->selectedRows (column)) indices << myProxy->mapToSource (i); return indices; } Qt::CheckState FileTreeView::getCumulativeCheckState (const QModelIndexList& indices) { bool haveChecked = false, haveUnchecked = false; for (const QModelIndex& i: indices) { switch (i.data (FileTreeModel::WantedRole).toInt ()) { case Qt::Checked: haveChecked = true; break; case Qt::Unchecked: haveUnchecked = true; break; case Qt::PartiallyChecked: return Qt::PartiallyChecked; } if (haveChecked && haveUnchecked) return Qt::PartiallyChecked; } return haveChecked ? Qt::Checked : Qt::Unchecked; } transmission-2.92/qt/PaxHeaders.4960/RpcClient.cc0000644000000000000000000000013212640354044016476 xustar0030 mtime=1451350052.463150614 30 atime=1451350052.463150614 30 ctime=1457295917.246761086 transmission-2.92/qt/RpcClient.cc0000644000175000017500000001525412640354044020132 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2014-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: RpcClient.cc 14634 2015-12-25 11:34:35Z mikedld $ */ #include #include #include #include #include #include #include #include #include #include // tr_free #include // LONG_VERSION_STRING #include "RpcClient.h" // #define DEBUG_HTTP #define REQUEST_DATA_PROPERTY_KEY "requestData" namespace { void destroyVariant (tr_variant * json) { tr_variantFree (json); tr_free (json); } TrVariantPtr createVariant () { return TrVariantPtr (tr_new0 (tr_variant, 1), &destroyVariant); } } RpcClient::RpcClient (QObject * parent): QObject (parent), mySession (nullptr), myNAM (nullptr) { qRegisterMetaType ("TrVariantPtr"); connect (this, SIGNAL (responseReceived (TrVariantPtr)), this, SLOT (parseResponse (TrVariantPtr))); } void RpcClient::stop () { mySession = nullptr; mySessionId.clear (); myUrl.clear (); if (myNAM != nullptr) { myNAM->deleteLater (); myNAM = nullptr; } } void RpcClient::start (tr_session * session) { mySession = session; } void RpcClient::start (const QUrl& url) { myUrl = url; } bool RpcClient::isLocal () const { if (mySession != 0) return true; #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) if (myUrl.host () == QLatin1String ("127.0.0.1") || myUrl.host ().compare (QLatin1String ("localhost"), Qt::CaseInsensitive) == 0) return true; #else if (QHostAddress (myUrl.host ()).isLoopback ()) return true; #endif return false; } const QUrl& RpcClient::url () const { return myUrl; } void RpcClient::exec (tr_quark method, tr_variant * args, int64_t tag) { exec (tr_quark_get_string (method, nullptr), args, tag); } void RpcClient::exec (const char* method, tr_variant * args, int64_t tag) { TrVariantPtr json = createVariant (); tr_variantInitDict (json.get (), 3); tr_variantDictAddStr (json.get (), TR_KEY_method, method); if (tag >= 0) tr_variantDictAddInt (json.get (), TR_KEY_tag, tag); if (args != nullptr) tr_variantDictSteal (json.get (), TR_KEY_arguments, args); sendRequest (json); } void RpcClient::sendRequest (TrVariantPtr json) { if (mySession != nullptr) { tr_rpc_request_exec_json (mySession, json.get (), localSessionCallback, this); } else if (!myUrl.isEmpty ()) { QNetworkRequest request; request.setUrl (myUrl); request.setRawHeader ("User-Agent", (qApp->applicationName () + QLatin1Char ('/') + QString::fromUtf8 (LONG_VERSION_STRING)).toUtf8 ()); request.setRawHeader ("Content-Type", "application/json; charset=UTF-8"); if (!mySessionId.isEmpty ()) request.setRawHeader (TR_RPC_SESSION_ID_HEADER, mySessionId.toUtf8 ()); size_t rawJsonDataLength; char * rawJsonData = tr_variantToStr (json.get (), TR_VARIANT_FMT_JSON_LEAN, &rawJsonDataLength); QByteArray jsonData (rawJsonData, rawJsonDataLength); tr_free (rawJsonData); QNetworkReply * reply = networkAccessManager ()->post (request, jsonData); reply->setProperty (REQUEST_DATA_PROPERTY_KEY, QVariant::fromValue (json)); connect (reply, SIGNAL (downloadProgress (qint64, qint64)), this, SIGNAL (dataReadProgress ())); connect (reply, SIGNAL (uploadProgress (qint64, qint64)), this, SIGNAL (dataSendProgress ())); connect (reply, SIGNAL (error (QNetworkReply::NetworkError)), this, SIGNAL (error (QNetworkReply::NetworkError))); #ifdef DEBUG_HTTP std::cerr << "sending " << "POST " << qPrintable (myUrl.path ()) << std::endl; for (const QByteArray& b: request.rawHeaderList ()) std::cerr << b.constData () << ": " << request.rawHeader (b).constData () << std::endl; std::cerr << "Body:\n" << jsonData.constData () << std::endl; #endif } } QNetworkAccessManager * RpcClient::networkAccessManager () { if (myNAM == 0) { myNAM = new QNetworkAccessManager (); connect (myNAM, SIGNAL (finished (QNetworkReply *)), this, SLOT (onFinished (QNetworkReply *))); connect (myNAM, SIGNAL (authenticationRequired (QNetworkReply *,QAuthenticator *)), this, SIGNAL (httpAuthenticationRequired ())); } return myNAM; } void RpcClient::localSessionCallback (tr_session * s, tr_variant * response, void * vself) { Q_UNUSED (s); RpcClient * self = static_cast (vself); TrVariantPtr json = createVariant (); *json = *response; tr_variantInitBool (response, false); // this callback is invoked in the libtransmission thread, so we don't want // to process the response here... let's push it over to the Qt thread. self->responseReceived (json); } void RpcClient::onFinished (QNetworkReply * reply) { #ifdef DEBUG_HTTP std::cerr << "http response header: " << std::endl; for (const QByteArray& b: reply->rawHeaderList ()) std::cerr << b.constData () << ": " << reply->rawHeader (b).constData () << std::endl; std::cerr << "json:\n" << reply->peek (reply->bytesAvailable ()).constData () << std::endl; #endif if (reply->attribute (QNetworkRequest::HttpStatusCodeAttribute).toInt () == 409 && reply->hasRawHeader (TR_RPC_SESSION_ID_HEADER)) { // we got a 409 telling us our session id has expired. // update it and resubmit the request. mySessionId = QString::fromUtf8 (reply->rawHeader (TR_RPC_SESSION_ID_HEADER)); sendRequest (reply->property (REQUEST_DATA_PROPERTY_KEY).value ()); } else if (reply->error () != QNetworkReply::NoError) { emit errorMessage (reply->errorString ()); } else { const QByteArray jsonData = reply->readAll ().trimmed (); TrVariantPtr json = createVariant (); if (tr_variantFromJson (json.get (), jsonData.constData (), jsonData.size ()) == 0) parseResponse (json); emit error (QNetworkReply::NoError); } reply->deleteLater (); } void RpcClient::parseResponse (TrVariantPtr json) { int64_t tag; if (!tr_variantDictFindInt (json.get (), TR_KEY_tag, &tag)) tag = -1; const char * result; if (!tr_variantDictFindStr (json.get (), TR_KEY_result, &result, nullptr)) result = nullptr; tr_variant * args; if (!tr_variantDictFindDict (json.get (), TR_KEY_arguments, &args)) args = nullptr; emit executed (tag, result == nullptr ? QString () : QString::fromUtf8 (result), args); } transmission-2.92/qt/PaxHeaders.4960/InteropHelper.cc0000644000000000000000000000013212665050653017401 xustar0030 mtime=1456755115.348510131 30 atime=1450311112.719085669 30 ctime=1457295917.246761086 transmission-2.92/qt/InteropHelper.cc0000644000175000017500000000236612665050653021035 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: InteropHelper.cc 14624 2015-12-16 20:01:03Z mikedld $ */ #include #include "InteropHelper.h" bool InteropHelper::isConnected () const { #ifdef ENABLE_DBUS_INTEROP if (myDbusClient.isConnected ()) return true; #endif #ifdef ENABLE_COM_INTEROP if (myComClient.isConnected ()) return true; #endif return false; } bool InteropHelper::addMetainfo (const QString& metainfo) { #ifdef ENABLE_DBUS_INTEROP { const QVariant response = myDbusClient.addMetainfo (metainfo); if (response.isValid () && response.toBool ()) return true; } #endif #ifdef ENABLE_COM_INTEROP { const QVariant response = myComClient.addMetainfo (metainfo); if (response.isValid () && response.toBool ()) return true; } #endif return false; } void InteropHelper::initialize () { #ifdef ENABLE_COM_INTEROP ComInteropHelper::initialize (); #endif } void InteropHelper::registerObject (QObject * parent) { #ifdef ENABLE_DBUS_INTEROP DBusInteropHelper::registerObject (parent); #endif #ifdef ENABLE_COM_INTEROP ComInteropHelper::registerObject (parent); #endif } transmission-2.92/qt/PaxHeaders.4960/README.txt0000644000000000000000000000013012505250245015776 xustar0029 mtime=1427460261.79126759 29 atime=1427460261.79126759 30 ctime=1457295917.241761001 transmission-2.92/qt/README.txt0000644000175000017500000000330712505250245017430 0ustar00mikedldmikedld00000000000000VOLUNTEERS WANTED - Qt developers and translators are needed - If you find a bug, please report it at http://trac.transmissionbt.com/ ABOUT TRANSMISSION-QT Transmission-qt is a GUI for Transmission loosely based on the GTK+ client. This is the only Transmission client that can act as its own self-contained session (as the GTK+ and Mac clients do), and can also connect to a remote session (as the web client and transmission-remote terminal client do). Use Case 1: If you like to run BitTorrent for awhile from your desktop, then the Mac, GTK+, and Qt clients are a good match. Use Case 2: If you like to leave BitTorrent running nonstop on your computer or router, and want to control it from your desktop or from a remote site, then transmission-remote and the web and Qt clients are a good match. To use the Qt client as a remote, in the menu go to Edit > Change Session The Qt client is also the most likely to wind up running on Windows, though that's not a high priority at the moment... BUILDING ON WINDOWS rb07 has a writeup of this on the Transmission wiki: https://trac.transmissionbt.com/wiki/BuildingTransmissionQtWindows BUILDING ON OS X nnc has a writeup of this on the Transmission wiki: https://trac.transmissionbt.com/wiki/BuildingTransmissionQtMac BUILDING ON UNIX 1. Prerequisites: Qt >= 4.6 and its development packages 2. Build Transmission as normal 3. In the qt/ directory, type "qmake qtr.pro" (or "qmake-qt4 qtr.pro", or "qmake-qt5 qtr.pro") 4. In the qt/ directory, type "make" 5. In the qt/ directory, as root, type "INSTALL_ROOT=/usr make install" (Feel free to replace /usr with /usr/local or /opt or whatever) transmission-2.92/qt/PaxHeaders.4960/SessionDialog.ui0000644000000000000000000000013212571431256017412 xustar0030 mtime=1441149614.408176866 30 atime=1441149614.408176866 30 ctime=1457295917.237760933 transmission-2.92/qt/SessionDialog.ui0000644000175000017500000001062212571431256021040 0ustar00mikedldmikedld00000000000000 SessionDialog 0 0 250 265 Change Session QLayout::SetFixedSize font-weight:bold Source 18 Start &Local Session Connect to &Remote Session &Host: hostEdit &Port: portSpin 1 65535 &Authentication required &Username: usernameEdit Pass&word: passwordEdit QLineEdit::Password Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok dialogButtons accepted() SessionDialog accept() 124 244 124 132 dialogButtons rejected() SessionDialog reject() 124 244 124 132 transmission-2.92/qt/PaxHeaders.4960/FileTreeDelegate.cc0000644000000000000000000000013212631124544017745 xustar0030 mtime=1449437540.254758128 30 atime=1449437540.254758128 30 ctime=1457295917.240760984 transmission-2.92/qt/FileTreeDelegate.cc0000644000175000017500000000462612631124544021402 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FileTreeDelegate.cc 14609 2015-12-06 17:39:18Z jordan $ */ #include #include #include "FileTreeDelegate.h" #include "FileTreeModel.h" QSize FileTreeDelegate::sizeHint(const QStyleOptionViewItem& item, const QModelIndex& index) const { QSize size; switch(index.column()) { case FileTreeModel::COL_PROGRESS: case FileTreeModel::COL_WANTED: size = QSize(20, 1); break; default: size = QItemDelegate::sizeHint (item, index); } size.rheight() += 8; // make the spacing a little nicer return size; } void FileTreeDelegate::paint (QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const { const int column(index.column()); if ((column != FileTreeModel::COL_PROGRESS) && (column != FileTreeModel::COL_WANTED)) { QItemDelegate::paint(painter, option, index); return; } QStyle * style (qApp->style ()); painter->save(); QItemDelegate::drawBackground (painter, option, index); if(column == FileTreeModel::COL_PROGRESS) { QStyleOptionProgressBar p; p.state = option.state | QStyle::State_Small; p.direction = qApp->layoutDirection(); p.rect = option.rect; p.rect.setSize (QSize(option.rect.width() - 4, option.rect.height() - 8)); p.rect.moveCenter (option.rect.center()); p.fontMetrics = qApp->fontMetrics(); p.minimum = 0; p.maximum = 100; p.textAlignment = Qt::AlignCenter; p.textVisible = true; p.progress = int(100.0*index.data().toDouble()); p.text = QString::fromLatin1 ("%1%").arg (p.progress); style->drawControl(QStyle::CE_ProgressBar, &p, painter); } else if(column == FileTreeModel::COL_WANTED) { QStyleOptionViewItemV4 vi (option); vi.features |= QStyleOptionViewItemV4::HasCheckIndicator; QRect checkRect = style->subElementRect (QStyle::SE_ItemViewItemCheckIndicator, &vi, nullptr); checkRect.moveCenter (option.rect.center ()); drawCheck (painter, vi, checkRect, static_cast (index.data ().toInt ())); } QItemDelegate::drawFocus (painter, option, option.rect); painter->restore(); } transmission-2.92/qt/PaxHeaders.4960/InteropObject.h0000644000000000000000000000013212634376710017233 xustar0030 mtime=1450311112.718085651 30 atime=1450311112.718085651 30 ctime=1457295917.246761086 transmission-2.92/qt/InteropObject.h0000644000175000017500000000172512634376710020665 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: InteropObject.h 14624 2015-12-16 20:01:03Z mikedld $ */ #ifndef QTR_INTEROP_OBJECT_H #define QTR_INTEROP_OBJECT_H #include class InteropObject: public QObject { Q_OBJECT #ifdef ENABLE_DBUS_INTEROP Q_CLASSINFO ("D-Bus Interface", "com.transmissionbt.Transmission") #endif #ifdef ENABLE_COM_INTEROP Q_CLASSINFO ("ClassID", "{0e2c952c-0597-491f-ba26-249d7e6fab49}") Q_CLASSINFO ("InterfaceID", "{9402f54f-4906-4f20-ad73-afcfeb5b228d}") Q_CLASSINFO ("RegisterObject", "yes") Q_CLASSINFO ("CoClassAlias", "QtClient") Q_CLASSINFO ("Description", "Transmission Qt Client Class") #endif public: InteropObject (QObject * parent = nullptr); public slots: bool PresentWindow (); bool AddMetainfo (const QString& metainfo); }; #endif // QTR_INTEROP_OBJECT_H transmission-2.92/qt/PaxHeaders.4960/PathButton.h0000644000000000000000000000013212537301461016545 xustar0030 mtime=1434288945.163419093 30 atime=1434288945.163419093 30 ctime=1457295917.244761052 transmission-2.92/qt/PathButton.h0000644000175000017500000000226012537301461020172 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2014-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: PathButton.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_PATH_BUTTON_H #define QTR_PATH_BUTTON_H #include class PathButton: public QToolButton { Q_OBJECT public: enum Mode { DirectoryMode, FileMode }; public: PathButton (QWidget * parent = nullptr); void setMode (Mode mode); void setTitle (const QString& title); void setNameFilter (const QString& nameFilter); void setPath (const QString& path); const QString& path () const; // QWidget virtual QSize sizeHint () const; signals: void pathChanged (const QString& path); protected: // QWidget virtual void paintEvent (QPaintEvent * event); private: void updateAppearance (); bool isDirMode () const; QString effectiveTitle () const; private slots: void onClicked (); void onFileSelected (const QString& path); private: Mode myMode; QString myTitle; QString myNameFilter; QString myPath; }; #endif // QTR_PATH_BUTTON_H transmission-2.92/qt/PaxHeaders.4960/Filters.h0000644000000000000000000000013212560567042016072 xustar0030 mtime=1438838306.611593702 30 atime=1438838306.611593702 30 ctime=1457295917.240760984 transmission-2.92/qt/Filters.h0000644000175000017500000000332412560567042017521 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: Filters.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_FILTERS_H #define QTR_FILTERS_H #include #include #include class FilterMode { public: enum { SHOW_ALL, SHOW_ACTIVE, SHOW_DOWNLOADING, SHOW_SEEDING, SHOW_PAUSED, SHOW_FINISHED, SHOW_VERIFYING, SHOW_ERROR, NUM_MODES }; public: FilterMode (int mode = SHOW_ALL): myMode (mode) {} FilterMode (const QString& name): myMode (modeFromName (name)) {} int mode () const { return myMode; } const QString& name () const { return names[myMode]; } static int modeFromName (const QString& name); static const QString& nameFromMode(int mode) { return names[mode]; } private: int myMode; static const QString names[]; }; Q_DECLARE_METATYPE(FilterMode) class SortMode { public: enum { SORT_BY_ACTIVITY, SORT_BY_AGE, SORT_BY_ETA, SORT_BY_NAME, SORT_BY_PROGRESS, SORT_BY_QUEUE, SORT_BY_RATIO, SORT_BY_SIZE, SORT_BY_STATE, SORT_BY_ID, NUM_MODES }; public: SortMode (int mode = SORT_BY_ID): myMode (mode) {} SortMode (const QString& name): myMode (modeFromName (name)) {} int mode () const { return myMode; } const QString& name () const { return names[myMode]; } static int modeFromName (const QString& name); static const QString& nameFromMode (int mode); private: int myMode; static const QString names[]; }; Q_DECLARE_METATYPE(SortMode) #endif // QTR_FILTERS_H transmission-2.92/qt/PaxHeaders.4960/FileTreeModel.h0000644000000000000000000000013212571431256017141 xustar0030 mtime=1441149614.413176955 30 atime=1441149614.413176955 30 ctime=1457295917.240760984 transmission-2.92/qt/FileTreeModel.h0000644000175000017500000000605112571431256020570 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FileTreeModel.h 14559 2015-08-16 22:07:09Z mikedld $ */ #ifndef QTR_FILE_TREE_MODEL_H #define QTR_FILE_TREE_MODEL_H #include #include #include #include #include class FileTreeItem; class FileTreeModel: public QAbstractItemModel { Q_OBJECT public: enum { COL_NAME, COL_SIZE, COL_PROGRESS, COL_WANTED, COL_PRIORITY, NUM_COLUMNS }; enum Role { SortRole = Qt::UserRole, FileIndexRole, WantedRole, CompleteRole }; public: FileTreeModel (QObject * parent = nullptr, bool isEditable = true); virtual ~FileTreeModel (); void setEditable (bool editable); void clear (); void addFile (int index, const QString& filename, bool wanted, int priority, uint64_t size, uint64_t have, bool torrentChanged); bool openFile (const QModelIndex& index); void twiddleWanted (const QModelIndexList& indices); void twiddlePriority (const QModelIndexList& indices); void setWanted (const QModelIndexList& indices, bool wanted); void setPriority (const QModelIndexList& indices, int priority); QModelIndex parent (const QModelIndex& child, int column) const; // QAbstractItemModel virtual QVariant data (const QModelIndex& index, int role = Qt::DisplayRole) const; virtual Qt::ItemFlags flags (const QModelIndex& index) const; virtual QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; virtual QModelIndex index (int row, int column, const QModelIndex& parent = QModelIndex ()) const; virtual QModelIndex parent (const QModelIndex& child) const; virtual int rowCount (const QModelIndex& parent = QModelIndex ()) const; virtual int columnCount (const QModelIndex& parent = QModelIndex ()) const; virtual bool setData (const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); signals: void priorityChanged (const QSet& fileIndices, int); void wantedChanged (const QSet& fileIndices, bool); void pathEdited (const QString& oldpath, const QString& newname); void openRequested (const QString& path); private: void clearSubtree (const QModelIndex&); QModelIndex indexOf (FileTreeItem *, int column) const; void emitParentsChanged (const QModelIndex&, int firstColumn, int lastColumn, QSet * visitedParentIndices = nullptr); void emitSubtreeChanged (const QModelIndex&, int firstColumn, int lastColumn); FileTreeItem * findItemForFileIndex (int fileIndex) const; FileTreeItem * itemFromIndex (const QModelIndex&) const; QModelIndexList getOrphanIndices (const QModelIndexList& indices) const; private: bool myIsEditable; FileTreeItem * myRootItem; QMap myIndexCache; }; #endif // QTR_FILE_TREE_MODEL_H transmission-2.92/qt/PaxHeaders.4960/LicenseDialog.h0000644000000000000000000000013212571431256017163 xustar0030 mtime=1441149614.416177009 30 atime=1441149614.416177009 30 ctime=1457295917.240760984 transmission-2.92/qt/LicenseDialog.h0000644000175000017500000000106412571431256020611 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: LicenseDialog.h 14561 2015-09-01 20:19:26Z mikedld $ */ #ifndef QTR_LICENSE_DIALOG_H #define QTR_LICENSE_DIALOG_H #include "BaseDialog.h" #include "ui_LicenseDialog.h" class LicenseDialog: public BaseDialog { Q_OBJECT public: LicenseDialog (QWidget * parent = nullptr); virtual ~LicenseDialog () {} private: Ui::LicenseDialog ui; }; #endif // QTR_LICENSE_DIALOG_H transmission-2.92/qt/PaxHeaders.4960/AboutDialog.cc0000644000000000000000000000013012571431256017007 xustar0029 mtime=1441149614.42017708 29 atime=1441149614.42017708 30 ctime=1457295917.237760933 transmission-2.92/qt/AboutDialog.cc0000644000175000017500000000267012571431256020443 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: AboutDialog.cc 14561 2015-09-01 20:19:26Z mikedld $ */ #include #include #include #include #include #include #include "AboutDialog.h" #include "LicenseDialog.h" #include "Utils.h" AboutDialog::AboutDialog (QWidget * parent): BaseDialog (parent), myLicenseDialog () { ui.setupUi (this); ui.iconLabel->setPixmap (qApp->windowIcon ().pixmap (48)); ui.titleLabel->setText (tr ("Transmission %1").arg (QString::fromUtf8 (LONG_VERSION_STRING))); QPushButton * b; b = ui.dialogButtons->addButton (tr ("C&redits"), QDialogButtonBox::ActionRole); connect (b, SIGNAL (clicked ()), this, SLOT (showCredits ())); b = ui.dialogButtons->addButton (tr ("&License"), QDialogButtonBox::ActionRole); connect (b, SIGNAL (clicked ()), this, SLOT (showLicense ())); ui.dialogButtons->button (QDialogButtonBox::Close)->setDefault (true); } void AboutDialog::showCredits () { QMessageBox::about ( this, tr ("Credits"), QString::fromUtf8 ("Jordan Lee (Backend; Daemon; GTK+; Qt)\n" "Michell Livingston (OS X)\n")); } void AboutDialog::showLicense () { Utils::openDialog (myLicenseDialog, this); } transmission-2.92/qt/PaxHeaders.4960/Torrent.cc0000644000000000000000000000013212631124544016250 xustar0030 mtime=1449437540.251758075 30 atime=1449437540.251758075 30 ctime=1457295917.244761052 transmission-2.92/qt/Torrent.cc0000644000175000017500000005545712631124544017715 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: Torrent.cc 14610 2015-12-06 18:02:37Z jordan $ */ #include #include #include #include #include #include #include #include #include #include #include #include /* tr_new0, tr_strdup */ #include #include "Application.h" #include "Prefs.h" #include "Torrent.h" #include "Utils.h" Torrent::Torrent (const Prefs& prefs, int id): myPrefs (prefs), magnetTorrent (false) { #ifndef NDEBUG for (int i=0; istyle()->standardIcon (QStyle::SP_FileIcon)); } Torrent::~Torrent () { } /*** **** ***/ Torrent::Property Torrent::myProperties[] = { { ID, TR_KEY_id, QVariant::Int, INFO, }, { UPLOAD_SPEED, TR_KEY_rateUpload, QVariant::ULongLong, STAT } /* Bps */, { DOWNLOAD_SPEED, TR_KEY_rateDownload, QVariant::ULongLong, STAT }, /* Bps */ { DOWNLOAD_DIR, TR_KEY_downloadDir, QVariant::String, STAT }, { ACTIVITY, TR_KEY_status, QVariant::Int, STAT }, { NAME, TR_KEY_name, QVariant::String, INFO }, { ERROR, TR_KEY_error, QVariant::Int, STAT }, { ERROR_STRING, TR_KEY_errorString, QVariant::String, STAT }, { SIZE_WHEN_DONE, TR_KEY_sizeWhenDone, QVariant::ULongLong, STAT }, { LEFT_UNTIL_DONE, TR_KEY_leftUntilDone, QVariant::ULongLong, STAT }, { HAVE_UNCHECKED, TR_KEY_haveUnchecked, QVariant::ULongLong, STAT }, { HAVE_VERIFIED, TR_KEY_haveValid, QVariant::ULongLong, STAT }, { DESIRED_AVAILABLE, TR_KEY_desiredAvailable, QVariant::ULongLong, STAT }, { TOTAL_SIZE, TR_KEY_totalSize, QVariant::ULongLong, INFO }, { PIECE_SIZE, TR_KEY_pieceSize, QVariant::ULongLong, INFO }, { PIECE_COUNT, TR_KEY_pieceCount, QVariant::Int, INFO }, { PEERS_GETTING_FROM_US, TR_KEY_peersGettingFromUs, QVariant::Int, STAT }, { PEERS_SENDING_TO_US, TR_KEY_peersSendingToUs, QVariant::Int, STAT }, { WEBSEEDS_SENDING_TO_US, TR_KEY_webseedsSendingToUs, QVariant::Int, STAT_EXTRA }, { PERCENT_DONE, TR_KEY_percentDone, QVariant::Double, STAT }, { METADATA_PERCENT_DONE, TR_KEY_metadataPercentComplete, QVariant::Double, STAT }, { PERCENT_VERIFIED, TR_KEY_recheckProgress, QVariant::Double, STAT }, { DATE_ACTIVITY, TR_KEY_activityDate, QVariant::DateTime, STAT_EXTRA }, { DATE_ADDED, TR_KEY_addedDate, QVariant::DateTime, INFO }, { DATE_STARTED, TR_KEY_startDate, QVariant::DateTime, STAT_EXTRA }, { DATE_CREATED, TR_KEY_dateCreated, QVariant::DateTime, INFO }, { PEERS_CONNECTED, TR_KEY_peersConnected, QVariant::Int, STAT }, { ETA, TR_KEY_eta, QVariant::Int, STAT }, { RATIO, TR_KEY_uploadRatio, QVariant::Double, STAT }, { DOWNLOADED_EVER, TR_KEY_downloadedEver, QVariant::ULongLong, STAT }, { UPLOADED_EVER, TR_KEY_uploadedEver, QVariant::ULongLong, STAT }, { FAILED_EVER, TR_KEY_corruptEver, QVariant::ULongLong, STAT_EXTRA }, { TRACKERS, TR_KEY_trackers, QVariant::StringList, STAT }, { HOSTS, TR_KEY_NONE, QVariant::StringList, DERIVED }, { TRACKERSTATS, TR_KEY_trackerStats, CustomVariantType::TrackerStatsList, STAT_EXTRA }, { MIME_ICON, TR_KEY_NONE, QVariant::Icon, DERIVED }, { SEED_RATIO_LIMIT, TR_KEY_seedRatioLimit, QVariant::Double, STAT }, { SEED_RATIO_MODE, TR_KEY_seedRatioMode, QVariant::Int, STAT }, { SEED_IDLE_LIMIT, TR_KEY_seedIdleLimit, QVariant::Int, STAT_EXTRA }, { SEED_IDLE_MODE, TR_KEY_seedIdleMode, QVariant::Int, STAT_EXTRA }, { DOWN_LIMIT, TR_KEY_downloadLimit, QVariant::Int, STAT_EXTRA }, /* KB/s */ { DOWN_LIMITED, TR_KEY_downloadLimited, QVariant::Bool, STAT_EXTRA }, { UP_LIMIT, TR_KEY_uploadLimit, QVariant::Int, STAT_EXTRA }, /* KB/s */ { UP_LIMITED, TR_KEY_uploadLimited, QVariant::Bool, STAT_EXTRA }, { HONORS_SESSION_LIMITS, TR_KEY_honorsSessionLimits, QVariant::Bool, STAT_EXTRA }, { PEER_LIMIT, TR_KEY_peer_limit, QVariant::Int, STAT_EXTRA }, { HASH_STRING, TR_KEY_hashString, QVariant::String, INFO }, { IS_FINISHED, TR_KEY_isFinished, QVariant::Bool, STAT }, { IS_PRIVATE, TR_KEY_isPrivate, QVariant::Bool, INFO }, { IS_STALLED, TR_KEY_isStalled, QVariant::Bool, STAT }, { COMMENT, TR_KEY_comment, QVariant::String, INFO }, { CREATOR, TR_KEY_creator, QVariant::String, INFO }, { MANUAL_ANNOUNCE_TIME, TR_KEY_manualAnnounceTime, QVariant::DateTime, STAT_EXTRA }, { PEERS, TR_KEY_peers, CustomVariantType::PeerList, STAT_EXTRA }, { BANDWIDTH_PRIORITY, TR_KEY_bandwidthPriority, QVariant::Int, STAT_EXTRA }, { QUEUE_POSITION, TR_KEY_queuePosition, QVariant::Int, STAT }, }; Torrent::KeyList Torrent::buildKeyList (Group group) { KeyList keys; if (keys.empty()) for (int i=0; i(); } /*** **** ***/ bool Torrent::getSeedRatio (double& ratio) const { bool isLimited; switch (seedRatioMode ()) { case TR_RATIOLIMIT_SINGLE: isLimited = true; ratio = seedRatioLimit (); break; case TR_RATIOLIMIT_GLOBAL: if ((isLimited = myPrefs.getBool (Prefs::RATIO_ENABLED))) ratio = myPrefs.getDouble (Prefs::RATIO); break; default: // TR_RATIOLIMIT_UNLIMITED: isLimited = false; break; } return isLimited; } bool Torrent::hasFileSubstring (const QString& substr) const { for (const TorrentFile& file: myFiles) if (file.filename.contains (substr, Qt::CaseInsensitive)) return true; return false; } bool Torrent::hasTrackerSubstring (const QString& substr) const { for (const QString& s: myValues[TRACKERS].toStringList()) if (s.contains (substr, Qt::CaseInsensitive)) return true; return false; } int Torrent::compareSeedRatio (const Torrent& that) const { double a; double b; const bool has_a = getSeedRatio (a); const bool has_b = that.getSeedRatio (b); if (!has_a && !has_b) return 0; if (!has_a || !has_b) return has_a ? -1 : 1; if (a < b) return -1; if (a > b) return 1; return 0; } int Torrent::compareRatio (const Torrent& that) const { const double a = ratio (); const double b = that.ratio (); if (static_cast (a) == TR_RATIO_INF && static_cast (b) == TR_RATIO_INF) return 0; if (static_cast (a) == TR_RATIO_INF) return 1; if (static_cast (b) == TR_RATIO_INF) return -1; if (a < b) return -1; if (a > b) return 1; return 0; } int Torrent::compareETA (const Torrent& that) const { const bool haveA (hasETA ()); const bool haveB (that.hasETA ()); if (haveA && haveB) return getETA() - that.getETA(); if (haveA) return 1; if (haveB) return -1; return 0; } int Torrent::compareTracker (const Torrent& that) const { Q_UNUSED (that); // FIXME return 0; } /*** **** ***/ void Torrent::updateMimeIcon () { const FileList& files (myFiles); QIcon icon; if (files.size () > 1) icon = QFileIconProvider().icon (QFileIconProvider::Folder); else if (files.size () == 1) icon = Utils::guessMimeIcon (files.at(0).filename); else icon = QIcon (); setIcon (MIME_ICON, icon); } /*** **** ***/ void Torrent::notifyComplete () const { // if someone wants to implement notification, here's the hook. } /*** **** ***/ void Torrent::update (tr_variant * d) { static bool lookup_initialized = false; static int key_to_property_index[TR_N_KEYS]; bool changed = false; const bool was_seed = isSeed (); const uint64_t old_verified_size = haveVerified (); if (!lookup_initialized) { lookup_initialized = true; for (int i=0; ifaviconCache ().add (QUrl(QString::fromUtf8(str))); list.append (QString::fromUtf8 (str, len)); } } if (myValues[TRACKERS] != list) { QStringList hosts; for (const QString& tracker: list) { const QString host = FaviconCache::getHost (QUrl (tracker)); if (!host.isEmpty()) hosts.append (host); } hosts.removeDuplicates(); myValues[TRACKERS].setValue (list); myValues[HOSTS].setValue (hosts); changed = true; } } tr_variant * trackerStats; if (tr_variantDictFindList (d, TR_KEY_trackerStats, &trackerStats)) { tr_variant * child; TrackerStatsList trackerStatsList; int childNum = 0; while ((child = tr_variantListChild (trackerStats, childNum++))) { bool b; int64_t i; size_t len; const char * str; TrackerStat trackerStat; if (tr_variantDictFindStr(child, TR_KEY_announce, &str, &len)) { trackerStat.announce = QString::fromUtf8 (str, len); qApp->faviconCache ().add (QUrl (trackerStat.announce)); } if (tr_variantDictFindInt (child, TR_KEY_announceState, &i)) trackerStat.announceState = i; if (tr_variantDictFindInt (child, TR_KEY_downloadCount, &i)) trackerStat.downloadCount = i; if (tr_variantDictFindBool (child, TR_KEY_hasAnnounced, &b)) trackerStat.hasAnnounced = b; if (tr_variantDictFindBool (child, TR_KEY_hasScraped, &b)) trackerStat.hasScraped = b; if (tr_variantDictFindStr(child, TR_KEY_host, &str, &len)) trackerStat.host = QString::fromUtf8 (str, len); if (tr_variantDictFindInt (child, TR_KEY_id, &i)) trackerStat.id = i; if (tr_variantDictFindBool (child, TR_KEY_isBackup, &b)) trackerStat.isBackup = b; if (tr_variantDictFindInt (child, TR_KEY_lastAnnouncePeerCount, &i)) trackerStat.lastAnnouncePeerCount = i; if (tr_variantDictFindStr(child, TR_KEY_lastAnnounceResult, &str, &len)) trackerStat.lastAnnounceResult = QString::fromUtf8(str, len); if (tr_variantDictFindInt (child, TR_KEY_lastAnnounceStartTime, &i)) trackerStat.lastAnnounceStartTime = i; if (tr_variantDictFindBool (child, TR_KEY_lastAnnounceSucceeded, &b)) trackerStat.lastAnnounceSucceeded = b; if (tr_variantDictFindInt (child, TR_KEY_lastAnnounceTime, &i)) trackerStat.lastAnnounceTime = i; if (tr_variantDictFindBool (child, TR_KEY_lastAnnounceTimedOut, &b)) trackerStat.lastAnnounceTimedOut = b; if (tr_variantDictFindStr(child, TR_KEY_lastScrapeResult, &str, &len)) trackerStat.lastScrapeResult = QString::fromUtf8 (str, len); if (tr_variantDictFindInt (child, TR_KEY_lastScrapeStartTime, &i)) trackerStat.lastScrapeStartTime = i; if (tr_variantDictFindBool (child, TR_KEY_lastScrapeSucceeded, &b)) trackerStat.lastScrapeSucceeded = b; if (tr_variantDictFindInt (child, TR_KEY_lastScrapeTime, &i)) trackerStat.lastScrapeTime = i; if (tr_variantDictFindBool (child, TR_KEY_lastScrapeTimedOut, &b)) trackerStat.lastScrapeTimedOut = b; if (tr_variantDictFindInt (child, TR_KEY_leecherCount, &i)) trackerStat.leecherCount = i; if (tr_variantDictFindInt (child, TR_KEY_nextAnnounceTime, &i)) trackerStat.nextAnnounceTime = i; if (tr_variantDictFindInt (child, TR_KEY_nextScrapeTime, &i)) trackerStat.nextScrapeTime = i; if (tr_variantDictFindInt (child, TR_KEY_scrapeState, &i)) trackerStat.scrapeState = i; if (tr_variantDictFindInt (child, TR_KEY_seederCount, &i)) trackerStat.seederCount = i; if (tr_variantDictFindInt (child, TR_KEY_tier, &i)) trackerStat.tier = i; trackerStatsList << trackerStat; } myValues[TRACKERSTATS].setValue (trackerStatsList); changed = true; } tr_variant * peers; if (tr_variantDictFindList (d, TR_KEY_peers, &peers)) { tr_variant * child; PeerList peerList; int childNum = 0; while ((child = tr_variantListChild (peers, childNum++))) { double d; bool b; int64_t i; size_t len; const char * str; Peer peer; if (tr_variantDictFindStr(child, TR_KEY_address, &str, &len)) peer.address = QString::fromUtf8 (str, len); if (tr_variantDictFindStr(child, TR_KEY_clientName, &str, &len)) peer.clientName = QString::fromUtf8 (str, len); if (tr_variantDictFindBool (child, TR_KEY_clientIsChoked, &b)) peer.clientIsChoked = b; if (tr_variantDictFindBool (child, TR_KEY_clientIsInterested, &b)) peer.clientIsInterested = b; if (tr_variantDictFindStr(child, TR_KEY_flagStr, &str, &len)) peer.flagStr = QString::fromUtf8 (str, len); if (tr_variantDictFindBool (child, TR_KEY_isDownloadingFrom, &b)) peer.isDownloadingFrom = b; if (tr_variantDictFindBool (child, TR_KEY_isEncrypted, &b)) peer.isEncrypted = b; if (tr_variantDictFindBool (child, TR_KEY_isIncoming, &b)) peer.isIncoming = b; if (tr_variantDictFindBool (child, TR_KEY_isUploadingTo, &b)) peer.isUploadingTo = b; if (tr_variantDictFindBool (child, TR_KEY_peerIsChoked, &b)) peer.peerIsChoked = b; if (tr_variantDictFindBool (child, TR_KEY_peerIsInterested, &b)) peer.peerIsInterested = b; if (tr_variantDictFindInt (child, TR_KEY_port, &i)) peer.port = i; if (tr_variantDictFindReal (child, TR_KEY_progress, &d)) peer.progress = d; if (tr_variantDictFindInt (child, TR_KEY_rateToClient, &i)) peer.rateToClient = Speed::fromBps (i); if (tr_variantDictFindInt (child, TR_KEY_rateToPeer, &i)) peer.rateToPeer = Speed::fromBps (i); peerList << peer; } myValues[PEERS].setValue (peerList); changed = true; } if (changed) emit torrentChanged (id ()); if (!was_seed && isSeed() && (old_verified_size>0)) emit torrentCompleted (id ()); } QString Torrent::activityString () const { QString str; switch (getActivity ()) { case TR_STATUS_STOPPED: str = isFinished() ? tr("Finished"): tr("Paused"); break; case TR_STATUS_CHECK_WAIT: str = tr("Queued for verification"); break; case TR_STATUS_CHECK: str = tr("Verifying local data"); break; case TR_STATUS_DOWNLOAD_WAIT: str = tr("Queued for download"); break; case TR_STATUS_DOWNLOAD: str = tr("Downloading"); break; case TR_STATUS_SEED_WAIT: str = tr("Queued for seeding"); break; case TR_STATUS_SEED: str = tr("Seeding"); break; } return str; } QString Torrent::getError () const { QString s = getString (ERROR_STRING); switch (getInt (ERROR)) { case TR_STAT_TRACKER_WARNING: s = tr("Tracker gave a warning: %1").arg(s); break; case TR_STAT_TRACKER_ERROR: s = tr("Tracker gave an error: %1").arg(s); break; case TR_STAT_LOCAL_ERROR: s = tr("Error: %1").arg(s); break; default: s.clear(); break; } return s; } QPixmap TrackerStat::getFavicon () const { return qApp->faviconCache ().find (QUrl (announce)); } transmission-2.92/qt/PaxHeaders.4960/Speed.h0000644000000000000000000000013212537301461015515 xustar0030 mtime=1434288945.181419409 30 atime=1434288945.181419409 30 ctime=1457295917.241761001 transmission-2.92/qt/Speed.h0000644000175000017500000000160612537301461017145 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: Speed.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_SPEED_H #define QTR_SPEED_H class Speed { public: Speed (): _Bps (0) {} double KBps () const; int Bps () const { return _Bps; } bool isZero () const { return _Bps == 0; } static Speed fromKBps (double KBps); static Speed fromBps (int Bps) { return Speed (Bps); } void setBps (int Bps) { _Bps = Bps; } Speed& operator+= (const Speed& that) { _Bps += that._Bps; return *this; } Speed operator+ (const Speed& that) const { return Speed (_Bps + that._Bps); } bool operator< (const Speed& that) const { return _Bps < that._Bps; } private: Speed (int Bps): _Bps (Bps) {} private: int _Bps; }; #endif // QTR_SPEED_H transmission-2.92/qt/PaxHeaders.4960/DetailsDialog.cc0000644000000000000000000000013212631124544017320 xustar0030 mtime=1449437540.252758093 30 atime=1449437540.252758093 30 ctime=1457295917.237760933 transmission-2.92/qt/DetailsDialog.cc0000644000175000017500000011411112631124544020744 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: DetailsDialog.cc 14611 2015-12-06 21:07:37Z jordan $ */ #include #include /* INT_MAX */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // tr_getRatio () #include "ColumnResizer.h" #include "DetailsDialog.h" #include "Formatter.h" #include "Prefs.h" #include "Session.h" #include "SqueezeLabel.h" #include "Torrent.h" #include "TorrentModel.h" #include "TrackerDelegate.h" #include "TrackerModel.h" #include "TrackerModelFilter.h" #include "Utils.h" class Prefs; class Session; /**** ***** ****/ namespace { const int REFRESH_INTERVAL_MSEC = 4000; const char * PREF_KEY ("pref-key"); enum // peer columns { COL_LOCK, COL_UP, COL_DOWN, COL_PERCENT, COL_STATUS, COL_ADDRESS, COL_CLIENT, N_COLUMNS }; int measureViewItem (QTreeWidget * view, int column, const QString& text) { const QTreeWidgetItem * headerItem = view->headerItem (); const int itemWidth = Utils::measureViewItem (view, text); const int headerWidth = Utils::measureHeaderItem (view->header (), headerItem->text (column)); return std::max (itemWidth, headerWidth); } } /*** **** ***/ class PeerItem: public QTreeWidgetItem { Peer peer; mutable QString collatedAddress; QString status; public: PeerItem (const Peer& p): peer(p) {} virtual ~PeerItem () {} public: void refresh (const Peer& p) { if (p.address != peer.address) collatedAddress.clear (); peer = p; } void setStatus (const QString& s) { status = s; } virtual bool operator< (const QTreeWidgetItem & other) const { const PeerItem * i = dynamic_cast (&other); QTreeWidget * tw (treeWidget ()); const int column = tw ? tw->sortColumn () : 0; assert (i != nullptr); switch (column) { case COL_UP: return peer.rateToPeer < i->peer.rateToPeer; case COL_DOWN: return peer.rateToClient < i->peer.rateToClient; case COL_PERCENT: return peer.progress < i->peer.progress; case COL_STATUS: return status < i->status; case COL_CLIENT: return peer.clientName < i->peer.clientName; case COL_LOCK: return peer.isEncrypted && !i->peer.isEncrypted; default: return address () < i->address (); } } private: const QString& address () const { if (collatedAddress.isEmpty ()) { QHostAddress ipAddress; if (ipAddress.setAddress (peer.address)) { if (ipAddress.protocol () == QAbstractSocket::IPv4Protocol) { const quint32 ipv4Address = ipAddress.toIPv4Address (); collatedAddress = QLatin1String ("1-") + QString::fromLatin1 (QByteArray::number (ipv4Address, 16).rightJustified (8, '0')); } else if (ipAddress.protocol () == QAbstractSocket::IPv6Protocol) { const Q_IPV6ADDR ipv6Address = ipAddress.toIPv6Address (); QByteArray tmp (16, '\0'); for (int i = 0; i < 16; ++i) tmp[i] = ipv6Address[i]; collatedAddress = QLatin1String ("2-") + QString::fromLatin1 (tmp.toHex ()); } } if (collatedAddress.isEmpty ()) collatedAddress = QLatin1String ("3-") + peer.address.toLower (); } return collatedAddress; } }; /*** **** ***/ QIcon DetailsDialog::getStockIcon (const QString& freedesktop_name, int fallback) { QIcon icon = QIcon::fromTheme (freedesktop_name); if (icon.isNull ()) icon = style ()->standardIcon (QStyle::StandardPixmap (fallback), 0, this); return icon; } DetailsDialog::DetailsDialog (Session & session, Prefs & prefs, const TorrentModel & model, QWidget * parent): BaseDialog (parent), mySession (session), myPrefs (prefs), myModel (model), myChangedTorrents (false), myHavePendingRefresh (false) { ui.setupUi(this); initInfoTab (); initPeersTab (); initTrackerTab (); initFilesTab (); initOptionsTab (); adjustSize (); ui.commentBrowser->setMaximumHeight (QWIDGETSIZE_MAX); QList initKeys; initKeys << Prefs::SHOW_TRACKER_SCRAPES << Prefs::SHOW_BACKUP_TRACKERS; for (const int key: initKeys) refreshPref (key); connect (&myTimer, SIGNAL (timeout ()), this, SLOT (onTimer ())); connect (&myPrefs, SIGNAL (changed (int)), this, SLOT (refreshPref (int))); onTimer (); myTimer.setSingleShot (false); myTimer.start (REFRESH_INTERVAL_MSEC); } DetailsDialog::~DetailsDialog () { myTrackerDelegate->deleteLater (); myTrackerFilter->deleteLater (); myTrackerModel->deleteLater (); } void DetailsDialog::setIds (const QSet& ids) { if (ids == myIds) return; myChangedTorrents = true; // stop listening to the old torrents for (const int id: myIds) { const Torrent * tor = myModel.getTorrentFromId (id); if (tor) disconnect (tor, SIGNAL (torrentChanged (int)), this, SLOT (onTorrentChanged ())); } ui.filesView->clear (); myIds = ids; myTrackerModel->refresh (myModel, myIds); // listen to the new torrents for (const int id: myIds) { const Torrent * tor = myModel.getTorrentFromId (id); if (tor) connect (tor, SIGNAL (torrentChanged (int)), this, SLOT (onTorrentChanged ())); } for (int i = 0; i < ui.tabs->count (); ++i) ui.tabs->widget (i)->setEnabled (false); onTimer (); } void DetailsDialog::refreshPref (int key) { QString str; switch (key) { case Prefs::SHOW_TRACKER_SCRAPES: { QItemSelectionModel * selectionModel (ui.trackersView->selectionModel ()); const QItemSelection selection (selectionModel->selection ()); const QModelIndex currentIndex (selectionModel->currentIndex ()); myTrackerDelegate->setShowMore (myPrefs.getBool (key)); selectionModel->clear (); ui.trackersView->reset (); selectionModel->select (selection, QItemSelectionModel::Select); selectionModel->setCurrentIndex (currentIndex, QItemSelectionModel::NoUpdate); break; } case Prefs::SHOW_BACKUP_TRACKERS: myTrackerFilter->setShowBackupTrackers (myPrefs.getBool (key)); break; default: break; } } /*** **** ***/ void DetailsDialog::onTimer () { getNewData (); } void DetailsDialog::getNewData () { if (!myIds.empty ()) { QSet infos; for (const int id: myIds) { const Torrent * tor = myModel.getTorrentFromId (id); if (tor->isMagnet ()) infos.insert (tor->id ()); } if (!infos.isEmpty ()) mySession.initTorrents (infos); mySession.refreshExtraStats (myIds); } } void DetailsDialog::onTorrentChanged () { if (!myHavePendingRefresh) { myHavePendingRefresh = true; QTimer::singleShot (100, this, SLOT (refresh ())); } } namespace { void setIfIdle (QComboBox * box, int i) { if (!box->hasFocus ()) { box->blockSignals (true); box->setCurrentIndex (i); box->blockSignals (false); } } void setIfIdle (QDoubleSpinBox * spin, double value) { if (!spin->hasFocus ()) { spin->blockSignals (true); spin->setValue (value); spin->blockSignals (false); } } void setIfIdle (QSpinBox * spin, int value) { if (!spin->hasFocus ()) { spin->blockSignals (true); spin->setValue (value); spin->blockSignals (false); } } } void DetailsDialog::refresh () { const int n = myIds.size (); const bool single = n == 1; const QString blank; const QFontMetrics fm (fontMetrics ()); QList torrents; QString string; const QString none = tr ("None"); const QString mixed = tr ("Mixed"); const QString unknown = tr ("Unknown"); // build a list of torrents for (const int id: myIds) { const Torrent * tor = myModel.getTorrentFromId (id); if (tor) torrents << tor; } /// /// activity tab /// // myStateLabel if (torrents.empty ()) { string = none; } else { bool isMixed = false; bool allPaused = true; bool allFinished = true; const tr_torrent_activity baseline = torrents[0]->getActivity (); for (const Torrent * const t: torrents) { const tr_torrent_activity activity = t->getActivity (); if (activity != baseline) isMixed = true; if (activity != TR_STATUS_STOPPED) allPaused = allFinished = false; if (!t->isFinished ()) allFinished = false; } if (isMixed) string = mixed; else if (allFinished) string = tr ("Finished"); else if (allPaused) string = tr ("Paused"); else string = torrents[0]->activityString (); } ui.stateValueLabel->setText (string); const QString stateString = string; // myHaveLabel uint64_t sizeWhenDone = 0; uint64_t available = 0; if (torrents.empty ()) { string = none; } else { uint64_t leftUntilDone = 0; int64_t haveTotal = 0; int64_t haveVerified = 0; int64_t haveUnverified = 0; int64_t verifiedPieces = 0; for (const Torrent * const t: torrents) { if (t->hasMetadata ()) { haveTotal += t->haveTotal (); haveUnverified += t->haveUnverified (); const uint64_t v = t->haveVerified (); haveVerified += v; if (t->pieceSize ()) verifiedPieces += v / t->pieceSize (); sizeWhenDone += t->sizeWhenDone (); leftUntilDone += t->leftUntilDone (); available += t->sizeWhenDone () - t->leftUntilDone () + t->desiredAvailable (); } } const double d = 100.0 * (sizeWhenDone ? (sizeWhenDone - leftUntilDone) / sizeWhenDone : 1); QString pct = Formatter::percentToString (d); if (!haveUnverified && !leftUntilDone) { //: Text following the "Have:" label in torrent properties dialog; //: %1 is amount of downloaded and verified data string = tr ("%1 (100%)") .arg (Formatter::sizeToString (haveVerified)); } else if (!haveUnverified) { //: Text following the "Have:" label in torrent properties dialog; //: %1 is amount of downloaded and verified data, //: %2 is overall size of torrent data, //: %3 is percentage (%1/%2*100) string = tr ("%1 of %2 (%3%)") .arg (Formatter::sizeToString (haveVerified)) .arg (Formatter::sizeToString (sizeWhenDone)) .arg (pct); } else { //: Text following the "Have:" label in torrent properties dialog; //: %1 is amount of downloaded data (both verified and unverified), //: %2 is overall size of torrent data, //: %3 is percentage (%1/%2*100), //: %4 is amount of downloaded but not yet verified data string = tr ("%1 of %2 (%3%), %4 Unverified") .arg (Formatter::sizeToString (haveVerified + haveUnverified)) .arg (Formatter::sizeToString (sizeWhenDone)) .arg (pct) .arg (Formatter::sizeToString (haveUnverified)); } } ui.haveValueLabel->setText (string); // myAvailabilityLabel if (torrents.empty ()) string = none; else if (sizeWhenDone == 0) string = none; else string = QString::fromLatin1 ("%1%").arg (Formatter::percentToString ( (100.0 * available) / sizeWhenDone)); ui.availabilityValueLabel->setText (string); // myDownloadedLabel if (torrents.empty ()) { string = none; } else { uint64_t d = 0; uint64_t f = 0; for (const Torrent * const t: torrents) { d += t->downloadedEver (); f += t->failedEver (); } const QString dstr = Formatter::sizeToString (d); const QString fstr = Formatter::sizeToString (f); if (f) string = tr ("%1 (%2 corrupt)").arg (dstr).arg (fstr); else string = dstr; } ui.downloadedValueLabel->setText (string); // myUploadedLabel if (torrents.empty ()) { string = none; } else { uint64_t u = 0; uint64_t d = 0; for (const Torrent * const t: torrents) { u += t->uploadedEver (); d += t->downloadedEver (); } string = tr ("%1 (Ratio: %2)") .arg (Formatter::sizeToString (u)) .arg (Formatter::ratioToString (tr_getRatio (u, d))); } ui.uploadedValueLabel->setText (string); const QDateTime qdt_now = QDateTime::currentDateTime (); // myRunTimeLabel if (torrents.empty ()) { string = none; } else { bool allPaused = true; QDateTime baseline = torrents[0]->lastStarted (); for (const Torrent * const t: torrents) { if (baseline != t->lastStarted ()) baseline = QDateTime (); if (!t->isPaused ()) allPaused = false; } if (allPaused) string = stateString; // paused || finished else if (baseline.isNull ()) string = mixed; else string = Formatter::timeToString (baseline.secsTo (qdt_now)); } ui.runningTimeValueLabel->setText (string); // myETALabel string.clear (); if (torrents.empty ()) { string = none; } else { int baseline = torrents[0]->getETA (); for (const Torrent * const t: torrents) { if (baseline != t->getETA ()) { string = mixed; break; } } if (string.isEmpty ()) { if (baseline < 0) string = tr ("Unknown"); else string = Formatter::timeToString (baseline); } } ui.remainingTimeValueLabel->setText (string); // myLastActivityLabel if (torrents.empty ()) { string = none; } else { QDateTime latest = torrents[0]->lastActivity (); for (const Torrent * const t: torrents) { const QDateTime dt = t->lastActivity (); if (latest < dt) latest = dt; } const int seconds = latest.isValid () ? latest.secsTo (qdt_now) : -1; if (seconds < 0) string = none; else if (seconds < 5) string = tr ("Active now"); else string = tr ("%1 ago").arg (Formatter::timeToString (seconds)); } ui.lastActivityValueLabel->setText (string); if (torrents.empty ()) { string = none; } else { string = torrents[0]->getError (); for (const Torrent * const t: torrents) { if (string != t->getError ()) { string = mixed; break; } } } if (string.isEmpty ()) string = none; ui.errorValueLabel->setText (string); /// /// information tab /// // mySizeLabel if (torrents.empty ()) { string = none; } else { int pieces = 0; uint64_t size = 0; uint32_t pieceSize = torrents[0]->pieceSize (); for (const Torrent * const t: torrents) { pieces += t->pieceCount (); size += t->totalSize (); if (pieceSize != t->pieceSize ()) pieceSize = 0; } if (!size) string = none; else if (pieceSize > 0) string = tr ("%1 (%Ln pieces @ %2)", "", pieces) .arg (Formatter::sizeToString (size)) .arg (Formatter::memToString (pieceSize)); else string = tr ("%1 (%Ln pieces)", "", pieces) .arg (Formatter::sizeToString (size)); } ui.sizeValueLabel->setText (string); // myHashLabel string = none; if (!torrents.empty ()) { string = torrents[0]->hashString (); for (const Torrent * const t: torrents) { if (string != t->hashString ()) { string = mixed; break; } } } ui.hashValueLabel->setText (string); // myPrivacyLabel string = none; if (!torrents.empty ()) { bool b = torrents[0]->isPrivate (); string = b ? tr ("Private to this tracker -- DHT and PEX disabled") : tr ("Public torrent"); for (const Torrent * const t: torrents) { if (b != t->isPrivate ()) { string = mixed; break; } } } ui.privacyValueLabel->setText (string); // myCommentBrowser string = none; bool isCommentMixed = false; if (!torrents.empty ()) { string = torrents[0]->comment (); for (const Torrent * const t: torrents) { if (string != t->comment ()) { string = mixed; isCommentMixed = true; break; } } } if (ui.commentBrowser->toPlainText() != string) { ui.commentBrowser->setText (string); } ui.commentBrowser->setEnabled (!isCommentMixed && !string.isEmpty ()); // myOriginLabel string = none; if (!torrents.empty ()) { bool mixed_creator=false, mixed_date=false; const QString creator = torrents[0]->creator (); const QString date = torrents[0]->dateCreated ().toString (); for (const Torrent * const t: torrents) { mixed_creator |= (creator != t->creator ()); mixed_date |= (date != t->dateCreated ().toString ()); } const bool empty_creator = creator.isEmpty (); const bool empty_date = date.isEmpty (); if (mixed_creator || mixed_date) string = mixed; else if (empty_creator && empty_date) string = tr ("N/A"); else if (empty_date && !empty_creator) string = tr ("Created by %1").arg (creator); else if (empty_creator && !empty_date) string = tr ("Created on %1").arg (date); else string = tr ("Created by %1 on %2").arg (creator).arg (date); } ui.originValueLabel->setText (string); // myLocationLabel string = none; if (!torrents.empty ()) { string = torrents[0]->getPath (); for (const Torrent * const t: torrents) { if (string != t->getPath ()) { string = mixed; break; } } } ui.locationValueLabel->setText (string); /// /// Options Tab /// if (myChangedTorrents && !torrents.empty ()) { int i; bool uniform; bool baselineFlag; int baselineInt; const Torrent& baseline = *torrents.front (); // mySessionLimitCheck uniform = true; baselineFlag = baseline.honorsSessionLimits (); for (const Torrent * const tor: torrents) if (baselineFlag != tor->honorsSessionLimits ()) { uniform = false; break; } ui.sessionLimitCheck->setChecked (uniform && baselineFlag); // mySingleDownCheck uniform = true; baselineFlag = baseline.downloadIsLimited (); for (const Torrent * const tor: torrents) if (baselineFlag != tor->downloadIsLimited ()) { uniform = false; break; } ui.singleDownCheck->setChecked (uniform && baselineFlag); // mySingleUpCheck uniform = true; baselineFlag = baseline.uploadIsLimited (); for (const Torrent * const tor: torrents) if (baselineFlag != tor->uploadIsLimited ()) { uniform = false; break; } ui.singleUpCheck->setChecked (uniform && baselineFlag); // myBandwidthPriorityCombo uniform = true; baselineInt = baseline.getBandwidthPriority (); for (const Torrent * const tor: torrents) if (baselineInt != tor->getBandwidthPriority ()) { uniform = false; break; } if (uniform) i = ui.bandwidthPriorityCombo->findData (baselineInt); else i = -1; setIfIdle (ui.bandwidthPriorityCombo, i); setIfIdle (ui.singleDownSpin, int (baseline.downloadLimit ().KBps ())); setIfIdle (ui.singleUpSpin, int (baseline.uploadLimit ().KBps ())); setIfIdle (ui.peerLimitSpin, baseline.peerLimit ()); } if (!torrents.empty ()) { const Torrent& baseline = *torrents.front (); // ratio bool uniform = true; int baselineInt = baseline.seedRatioMode (); for (const Torrent * const tor: torrents) if (baselineInt != tor->seedRatioMode ()) { uniform = false; break; } setIfIdle (ui.ratioCombo, uniform ? ui.ratioCombo->findData (baselineInt) : -1); ui.ratioSpin->setVisible (uniform && (baselineInt == TR_RATIOLIMIT_SINGLE)); setIfIdle (ui.ratioSpin, baseline.seedRatioLimit ()); // idle uniform = true; baselineInt = baseline.seedIdleMode (); for (const Torrent * const tor: torrents) if (baselineInt != tor->seedIdleMode ()) { uniform = false; break; } setIfIdle (ui.idleCombo, uniform ? ui.idleCombo->findData (baselineInt) : -1); ui.idleSpin->setVisible (uniform && (baselineInt == TR_RATIOLIMIT_SINGLE)); setIfIdle (ui.idleSpin, baseline.seedIdleLimit ()); onIdleLimitChanged (); } /// /// Tracker tab /// myTrackerModel->refresh (myModel, myIds); /// /// Peers tab /// QMap peers2; QList newItems; for (const Torrent * const t: torrents) { const QString idStr (QString::number (t->id ())); PeerList peers = t->peers (); for (const Peer& peer: peers) { const QString key = idStr + QLatin1Char (':') + peer.address; PeerItem * item = static_cast (myPeers.value (key, 0)); if (item == 0) // new peer has connected { static const QIcon myEncryptionIcon (QLatin1String (":/icons/encrypted.png")); static const QIcon myEmptyIcon; item = new PeerItem (peer); item->setTextAlignment (COL_UP, Qt::AlignRight|Qt::AlignVCenter); item->setTextAlignment (COL_DOWN, Qt::AlignRight|Qt::AlignVCenter); item->setTextAlignment (COL_PERCENT, Qt::AlignRight|Qt::AlignVCenter); item->setIcon (COL_LOCK, peer.isEncrypted ? myEncryptionIcon : myEmptyIcon); item->setToolTip (COL_LOCK, peer.isEncrypted ? tr ("Encrypted connection") : QString ()); item->setText (COL_ADDRESS, peer.address); item->setText (COL_CLIENT, peer.clientName); newItems << item; } const QString code = peer.flagStr; item->setStatus (code); item->refresh (peer); QString codeTip; for (const QChar ch: code) { QString txt; switch (ch.unicode ()) { case 'O': txt = tr ("Optimistic unchoke"); break; case 'D': txt = tr ("Downloading from this peer"); break; case 'd': txt = tr ("We would download from this peer if they would let us"); break; case 'U': txt = tr ("Uploading to peer"); break; case 'u': txt = tr ("We would upload to this peer if they asked"); break; case 'K': txt = tr ("Peer has unchoked us, but we're not interested"); break; case '?': txt = tr ("We unchoked this peer, but they're not interested"); break; case 'E': txt = tr ("Encrypted connection"); break; case 'H': txt = tr ("Peer was discovered through DHT"); break; case 'X': txt = tr ("Peer was discovered through Peer Exchange (PEX)"); break; case 'I': txt = tr ("Peer is an incoming connection"); break; case 'T': txt = tr ("Peer is connected over uTP"); break; } if (!txt.isEmpty ()) codeTip += QString::fromLatin1 ("%1: %2\n").arg (ch).arg (txt); } if (!codeTip.isEmpty ()) codeTip.resize (codeTip.size ()-1); // eat the trailing linefeed item->setText (COL_UP, peer.rateToPeer.isZero () ? QString () : Formatter::speedToString (peer.rateToPeer)); item->setText (COL_DOWN, peer.rateToClient.isZero () ? QString () : Formatter::speedToString (peer.rateToClient)); item->setText (COL_PERCENT, peer.progress > 0 ? QString::fromLatin1 ("%1%").arg(int(peer.progress * 100.0)) : QString ()); item->setText (COL_STATUS, code); item->setToolTip (COL_STATUS, codeTip); peers2.insert (key, item); } } ui.peersView->addTopLevelItems (newItems); for (const QString& key: myPeers.keys ()) { if (!peers2.contains (key)) // old peer has disconnected { QTreeWidgetItem * item = myPeers.value (key, 0); ui.peersView->takeTopLevelItem (ui.peersView->indexOfTopLevelItem (item)); delete item; } } myPeers = peers2; if (!single) ui.filesView->clear (); if (single) ui.filesView->update (torrents[0]->files (), myChangedTorrents); myChangedTorrents = false; myHavePendingRefresh = false; for (int i = 0; i < ui.tabs->count (); ++i) ui.tabs->widget (i)->setEnabled (true); } /*** **** ***/ void DetailsDialog::initInfoTab () { const int h = QFontMetrics (ui.commentBrowser->font ()).lineSpacing () * 4; ui.commentBrowser->setFixedHeight (h); ColumnResizer * cr (new ColumnResizer (this)); cr->addLayout (ui.activitySectionLayout); cr->addLayout (ui.detailsSectionLayout); cr->update (); } /*** **** ***/ void DetailsDialog::onShowTrackerScrapesToggled (bool val) { myPrefs.set (Prefs::SHOW_TRACKER_SCRAPES, val); } void DetailsDialog::onShowBackupTrackersToggled (bool val) { myPrefs.set (Prefs::SHOW_BACKUP_TRACKERS, val); } void DetailsDialog::onHonorsSessionLimitsToggled (bool val) { mySession.torrentSet (myIds, TR_KEY_honorsSessionLimits, val); getNewData (); } void DetailsDialog::onDownloadLimitedToggled (bool val) { mySession.torrentSet (myIds, TR_KEY_downloadLimited, val); getNewData (); } void DetailsDialog::onSpinBoxEditingFinished () { const QObject * spin = sender (); const tr_quark key = spin->property (PREF_KEY).toInt (); const QDoubleSpinBox * d = qobject_cast (spin); if (d) mySession.torrentSet (myIds, key, d->value ()); else mySession.torrentSet (myIds, key, qobject_cast (spin)->value ()); getNewData (); } void DetailsDialog::onUploadLimitedToggled (bool val) { mySession.torrentSet (myIds, TR_KEY_uploadLimited, val); getNewData (); } void DetailsDialog::onIdleModeChanged (int index) { const int val = ui.idleCombo->itemData (index).toInt (); mySession.torrentSet (myIds, TR_KEY_seedIdleMode, val); getNewData (); } void DetailsDialog::onIdleLimitChanged () { //: Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) const QString unitsSuffix = tr (" minute(s)", 0, ui.idleSpin->value ()); if (ui.idleSpin->suffix () != unitsSuffix) ui.idleSpin->setSuffix (unitsSuffix); } void DetailsDialog::onRatioModeChanged (int index) { const int val = ui.ratioCombo->itemData (index).toInt (); mySession.torrentSet (myIds, TR_KEY_seedRatioMode, val); } void DetailsDialog::onBandwidthPriorityChanged (int index) { if (index != -1) { const int priority = ui.bandwidthPriorityCombo->itemData (index).toInt (); mySession.torrentSet (myIds, TR_KEY_bandwidthPriority, priority); getNewData (); } } void DetailsDialog::onTrackerSelectionChanged () { const int selectionCount = ui.trackersView->selectionModel ()->selectedRows ().size (); ui.editTrackerButton->setEnabled (selectionCount == 1); ui.removeTrackerButton->setEnabled (selectionCount > 0); } void DetailsDialog::onAddTrackerClicked () { bool ok = false; const QString url = QInputDialog::getText (this, tr ("Add URL "), tr ("Add tracker announce URL:"), QLineEdit::Normal, QString (), &ok); if (!ok) { // user pressed "cancel" -- noop } else if (!QUrl (url).isValid ()) { QMessageBox::warning (this, tr ("Error"), tr ("Invalid URL \"%1\"").arg (url)); } else { QSet ids; for (const int id: myIds) if (myTrackerModel->find (id,url) == -1) ids.insert (id); if (ids.empty ()) // all the torrents already have this tracker { QMessageBox::warning (this, tr ("Error"), tr ("Tracker already exists.")); } else { QStringList urls; urls << url; mySession.torrentSet (ids, TR_KEY_trackerAdd, urls); getNewData (); } } } void DetailsDialog::onEditTrackerClicked () { QItemSelectionModel * selectionModel = ui.trackersView->selectionModel (); QModelIndexList selectedRows = selectionModel->selectedRows (); assert (selectedRows.size () == 1); QModelIndex i = selectionModel->currentIndex (); const TrackerInfo trackerInfo = ui.trackersView->model ()->data (i, TrackerModel::TrackerRole).value (); bool ok = false; const QString newval = QInputDialog::getText (this, tr ("Edit URL "), tr ("Edit tracker announce URL:"), QLineEdit::Normal, trackerInfo.st.announce, &ok); if (!ok) { // user pressed "cancel" -- noop } else if (!QUrl (newval).isValid ()) { QMessageBox::warning (this, tr ("Error"), tr ("Invalid URL \"%1\"").arg (newval)); } else { QSet ids; ids << trackerInfo.torrentId; const QPair idUrl = qMakePair (trackerInfo.st.id, newval); mySession.torrentSet (ids, TR_KEY_trackerReplace, idUrl); getNewData (); } } void DetailsDialog::onRemoveTrackerClicked () { // make a map of torrentIds to announce URLs to remove QItemSelectionModel * selectionModel = ui.trackersView->selectionModel (); QModelIndexList selectedRows = selectionModel->selectedRows (); QMap torrentId_to_trackerIds; for (const QModelIndex& i: selectedRows) { const TrackerInfo inf = ui.trackersView->model ()->data (i, TrackerModel::TrackerRole).value (); torrentId_to_trackerIds.insertMulti (inf.torrentId, inf.st.id); } // batch all of a tracker's torrents into one command for (const int id: torrentId_to_trackerIds.uniqueKeys ()) { QSet ids; ids << id; mySession.torrentSet (ids, TR_KEY_trackerRemove, torrentId_to_trackerIds.values (id)); } selectionModel->clearSelection (); getNewData (); } void DetailsDialog::initOptionsTab () { const QString speed_K_str = Formatter::unitStr (Formatter::SPEED, Formatter::KB); ui.singleDownSpin->setSuffix (QString::fromLatin1 (" %1").arg (speed_K_str)); ui.singleUpSpin->setSuffix (QString::fromLatin1 (" %1").arg (speed_K_str)); ui.singleDownSpin->setProperty (PREF_KEY, TR_KEY_downloadLimit); ui.singleUpSpin->setProperty (PREF_KEY, TR_KEY_uploadLimit); ui.ratioSpin->setProperty (PREF_KEY, TR_KEY_seedRatioLimit); ui.idleSpin->setProperty (PREF_KEY, TR_KEY_seedIdleLimit); ui.peerLimitSpin->setProperty (PREF_KEY, TR_KEY_peer_limit); ui.bandwidthPriorityCombo->addItem (tr ("High"), TR_PRI_HIGH); ui.bandwidthPriorityCombo->addItem (tr ("Normal"), TR_PRI_NORMAL); ui.bandwidthPriorityCombo->addItem (tr ("Low"), TR_PRI_LOW); ui.ratioCombo->addItem (tr ("Use Global Settings"), TR_RATIOLIMIT_GLOBAL); ui.ratioCombo->addItem (tr ("Seed regardless of ratio"), TR_RATIOLIMIT_UNLIMITED); ui.ratioCombo->addItem (tr ("Stop seeding at ratio:"), TR_RATIOLIMIT_SINGLE); ui.idleCombo->addItem (tr ("Use Global Settings"), TR_IDLELIMIT_GLOBAL); ui.idleCombo->addItem (tr ("Seed regardless of activity"), TR_IDLELIMIT_UNLIMITED); ui.idleCombo->addItem (tr ("Stop seeding if idle for:"), TR_IDLELIMIT_SINGLE); ColumnResizer * cr (new ColumnResizer (this)); cr->addLayout (ui.speedSectionLayout); cr->addLayout (ui.seedingLimitsSectionRatioLayout); cr->addLayout (ui.seedingLimitsSectionIdleLayout); cr->addLayout (ui.peerConnectionsSectionLayout); cr->update (); connect (ui.sessionLimitCheck, SIGNAL (clicked (bool)), SLOT (onHonorsSessionLimitsToggled (bool))); connect (ui.singleDownCheck, SIGNAL (clicked (bool)), SLOT (onDownloadLimitedToggled (bool))); connect (ui.singleDownSpin, SIGNAL (editingFinished ()), SLOT (onSpinBoxEditingFinished ())); connect (ui.singleUpCheck, SIGNAL (clicked (bool)), SLOT (onUploadLimitedToggled (bool))); connect (ui.singleUpSpin, SIGNAL (editingFinished ()), SLOT (onSpinBoxEditingFinished ())); connect (ui.bandwidthPriorityCombo, SIGNAL (currentIndexChanged (int)), SLOT (onBandwidthPriorityChanged (int))); connect (ui.ratioCombo, SIGNAL (currentIndexChanged (int)), SLOT (onRatioModeChanged (int))); connect (ui.ratioSpin, SIGNAL (editingFinished ()), SLOT (onSpinBoxEditingFinished ())); connect (ui.idleCombo, SIGNAL (currentIndexChanged (int)), SLOT (onIdleModeChanged (int))); connect (ui.idleSpin, SIGNAL (editingFinished ()), SLOT (onSpinBoxEditingFinished ())); connect (ui.idleSpin, SIGNAL (valueChanged (int)), SLOT (onIdleLimitChanged ())); connect (ui.peerLimitSpin, SIGNAL (editingFinished ()), SLOT (onSpinBoxEditingFinished ())); } /*** **** ***/ void DetailsDialog::initTrackerTab () { myTrackerModel = new TrackerModel (); myTrackerFilter = new TrackerModelFilter (); myTrackerFilter->setSourceModel (myTrackerModel); myTrackerDelegate = new TrackerDelegate (); ui.trackersView->setModel (myTrackerFilter); ui.trackersView->setItemDelegate (myTrackerDelegate); ui.addTrackerButton->setIcon (getStockIcon (QLatin1String ("list-add"), QStyle::SP_DialogOpenButton)); ui.editTrackerButton->setIcon (getStockIcon (QLatin1String ("document-properties"), QStyle::SP_DesktopIcon)); ui.removeTrackerButton->setIcon (getStockIcon (QLatin1String ("list-remove"), QStyle::SP_TrashIcon)); ui.showTrackerScrapesCheck->setChecked (myPrefs.getBool (Prefs::SHOW_TRACKER_SCRAPES)); ui.showBackupTrackersCheck->setChecked (myPrefs.getBool (Prefs::SHOW_BACKUP_TRACKERS)); connect (ui.trackersView->selectionModel (), SIGNAL (selectionChanged (QItemSelection, QItemSelection)), SLOT (onTrackerSelectionChanged ())); connect (ui.addTrackerButton, SIGNAL (clicked ()), SLOT (onAddTrackerClicked ())); connect (ui.editTrackerButton, SIGNAL (clicked ()), SLOT (onEditTrackerClicked ())); connect (ui.removeTrackerButton, SIGNAL (clicked ()), SLOT (onRemoveTrackerClicked ())); connect (ui.showTrackerScrapesCheck, SIGNAL (clicked (bool)), SLOT (onShowTrackerScrapesToggled (bool))); connect (ui.showBackupTrackersCheck, SIGNAL (clicked (bool)), SLOT (onShowBackupTrackersToggled (bool))); onTrackerSelectionChanged (); } /*** **** ***/ void DetailsDialog::initPeersTab () { QStringList headers; headers << QString () << tr ("Up") << tr ("Down") << tr ("%") << tr ("Status") << tr ("Address") << tr ("Client"); ui.peersView->setHeaderLabels (headers); ui.peersView->sortByColumn (COL_ADDRESS, Qt::AscendingOrder); ui.peersView->setColumnWidth (COL_LOCK, 20); ui.peersView->setColumnWidth (COL_UP, measureViewItem (ui.peersView, COL_UP, QLatin1String ("1024 MiB/s"))); ui.peersView->setColumnWidth (COL_DOWN, measureViewItem (ui.peersView, COL_DOWN, QLatin1String ("1024 MiB/s"))); ui.peersView->setColumnWidth (COL_PERCENT, measureViewItem (ui.peersView, COL_PERCENT, QLatin1String ("100%"))); ui.peersView->setColumnWidth (COL_STATUS, measureViewItem (ui.peersView, COL_STATUS, QLatin1String ("ODUK?EXI"))); ui.peersView->setColumnWidth (COL_ADDRESS, measureViewItem (ui.peersView, COL_ADDRESS, QLatin1String ("888.888.888.888"))); } /*** **** ***/ void DetailsDialog::initFilesTab () { connect (ui.filesView, SIGNAL (priorityChanged (QSet, int)), SLOT (onFilePriorityChanged (QSet, int))); connect (ui.filesView, SIGNAL (wantedChanged (QSet, bool)), SLOT (onFileWantedChanged (QSet, bool))); connect (ui.filesView, SIGNAL (pathEdited (QString, QString)), SLOT (onPathEdited (QString, QString))); connect (ui.filesView, SIGNAL (openRequested (QString)), SLOT (onOpenRequested (QString))); } void DetailsDialog::onFilePriorityChanged (const QSet& indices, int priority) { tr_quark key; switch (priority) { case TR_PRI_LOW: key = TR_KEY_priority_low; break; case TR_PRI_HIGH: key = TR_KEY_priority_high; break; default: key = TR_KEY_priority_normal; break; } mySession.torrentSet (myIds, key, indices.toList ()); getNewData (); } void DetailsDialog::onFileWantedChanged (const QSet& indices, bool wanted) { const tr_quark key = wanted ? TR_KEY_files_wanted : TR_KEY_files_unwanted; mySession.torrentSet (myIds, key, indices.toList ()); getNewData (); } void DetailsDialog::onPathEdited (const QString& oldpath, const QString& newname) { mySession.torrentRenamePath (myIds, oldpath, newname); } void DetailsDialog::onOpenRequested (const QString& path) { if (!mySession.isLocal ()) return; for (const int id: myIds) { const Torrent * const tor = myModel.getTorrentFromId (id); if (tor == NULL) continue; const QString localFilePath = tor->getPath () + QLatin1Char ('/') + path; if (!QFile::exists (localFilePath)) continue; if (QDesktopServices::openUrl (QUrl::fromLocalFile (localFilePath))) break; } } transmission-2.92/qt/PaxHeaders.4960/ColumnResizer.h0000644000000000000000000000013212537301461017256 xustar0030 mtime=1434288945.165419128 30 atime=1434288945.165419128 30 ctime=1457295917.244761052 transmission-2.92/qt/ColumnResizer.h0000644000175000017500000000140212537301461020700 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: ColumnResizer.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_COLUMN_RESIZER_H #define QTR_COLUMN_RESIZER_H #include #include class QGridLayout; class QTimer; class ColumnResizer: public QObject { Q_OBJECT public: ColumnResizer (QObject * parent = nullptr); void addLayout (QGridLayout * layout); // QObject virtual bool eventFilter (QObject * object, QEvent * event); public slots: void update (); private: void scheduleUpdate (); private: QTimer * myTimer; QSet myLayouts; }; #endif // QTR_COLUMN_RESIZER_H transmission-2.92/qt/PaxHeaders.4960/TorrentView.h0000644000000000000000000000013012613027544016745 xustar0029 mtime=1445736292.78607624 29 atime=1445736292.78607624 30 ctime=1457295917.241761001 transmission-2.92/qt/TorrentView.h0000644000175000017500000000135712613027544020402 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: TorrentView.h 14590 2015-10-24 20:56:45Z mikedld $ */ #ifndef QTR_TORRENT_VIEW_H #define QTR_TORRENT_VIEW_H #include class TorrentView: public QListView { Q_OBJECT public: TorrentView (QWidget * parent = nullptr); public slots: void setHeaderText (const QString& text); signals: void headerDoubleClicked (); protected: virtual void resizeEvent (QResizeEvent * event); private: class HeaderWidget; private: void adjustHeaderPosition (); private: HeaderWidget * const myHeaderWidget; }; #endif // QTR_TORRENT_VIEW_H transmission-2.92/qt/PaxHeaders.4960/FilterBarComboBoxDelegate.cc0000644000000000000000000000013212536126416021555 xustar0030 mtime=1433971982.537589939 30 atime=1433971982.537589939 30 ctime=1457295917.241761001 transmission-2.92/qt/FilterBarComboBoxDelegate.cc0000644000175000017500000001122212536126416023200 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FilterBarComboBoxDelegate.cc 14537 2015-06-10 21:27:11Z mikedld $ */ #include #include #include #include #include "FilterBarComboBox.h" #include "FilterBarComboBoxDelegate.h" #include "Utils.h" namespace { int getHSpacing (const QWidget * w) { return qMax (3, w->style ()->pixelMetric (QStyle::PM_LayoutHorizontalSpacing, 0, w)); } } FilterBarComboBoxDelegate::FilterBarComboBoxDelegate (QObject * parent, QComboBox * combo): QItemDelegate (parent), myCombo (combo) { } bool FilterBarComboBoxDelegate::isSeparator (const QModelIndex& index) { return index.data (Qt::AccessibleDescriptionRole).toString () == QLatin1String ("separator"); } void FilterBarComboBoxDelegate::setSeparator (QAbstractItemModel * model, const QModelIndex& index) { model->setData (index, QString::fromLatin1 ("separator"), Qt::AccessibleDescriptionRole); if (QStandardItemModel *m = qobject_cast (model)) if (QStandardItem *item = m->itemFromIndex (index)) item->setFlags (item->flags () & ~ (Qt::ItemIsSelectable|Qt::ItemIsEnabled)); } void FilterBarComboBoxDelegate::paint (QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const { if (isSeparator (index)) { QRect rect = option.rect; if (const QStyleOptionViewItemV3 *v3 = qstyleoption_cast (&option)) if (const QAbstractItemView *view = qobject_cast (v3->widget)) rect.setWidth (view->viewport ()->width ()); QStyleOption opt; opt.rect = rect; myCombo->style ()->drawPrimitive (QStyle::PE_IndicatorToolBarSeparator, &opt, painter, myCombo); } else { QStyleOptionViewItem disabledOption = option; const QPalette::ColorRole disabledColorRole = (disabledOption.state & QStyle::State_Selected) ? QPalette::HighlightedText : QPalette::Text; disabledOption.palette.setColor (disabledColorRole, Utils::getFadedColor (disabledOption.palette.color (disabledColorRole))); QRect boundingBox = option.rect; const int hmargin = getHSpacing (myCombo); boundingBox.adjust (hmargin, 0, -hmargin, 0); QRect decorationRect = rect (option, index, Qt::DecorationRole); decorationRect.setSize (myCombo->iconSize ()); decorationRect = QStyle::alignedRect (option.direction, Qt::AlignLeft|Qt::AlignVCenter, decorationRect.size (), boundingBox); Utils::narrowRect (boundingBox, decorationRect.width () + hmargin, 0, option.direction); QRect countRect = rect (option, index, FilterBarComboBox::CountStringRole); countRect = QStyle::alignedRect (option.direction, Qt::AlignRight|Qt::AlignVCenter, countRect.size (), boundingBox); Utils::narrowRect (boundingBox, 0, countRect.width () + hmargin, option.direction); const QRect displayRect = boundingBox; drawBackground (painter, option, index); QStyleOptionViewItem option2 = option; option2.decorationSize = myCombo->iconSize (); drawDecoration (painter, option, decorationRect, decoration (option2,index.data (Qt::DecorationRole))); drawDisplay (painter, option, displayRect, index.data (Qt::DisplayRole).toString ()); drawDisplay (painter, disabledOption, countRect, index.data (FilterBarComboBox::CountStringRole).toString ()); drawFocus (painter, option, displayRect|countRect); } } QSize FilterBarComboBoxDelegate::sizeHint (const QStyleOptionViewItem & option, const QModelIndex & index) const { if (isSeparator (index)) { const int pm = myCombo->style ()->pixelMetric (QStyle::PM_DefaultFrameWidth, 0, myCombo); return QSize (pm, pm + 10); } else { QStyle * s = myCombo->style (); const int hmargin = getHSpacing (myCombo); QSize size = QItemDelegate::sizeHint (option, index); size.setHeight (qMax (size.height (), myCombo->iconSize ().height () + 6)); size.rwidth () += s->pixelMetric (QStyle::PM_FocusFrameHMargin, 0, myCombo); size.rwidth () += rect (option,index,FilterBarComboBox::CountStringRole).width (); size.rwidth () += hmargin * 4; return size; } } transmission-2.92/qt/PaxHeaders.4960/TrackerDelegate.h0000644000000000000000000000013212541564756017520 xustar0030 mtime=1434905070.041831217 30 atime=1434905070.041831217 30 ctime=1457295917.237760933 transmission-2.92/qt/TrackerDelegate.h0000644000175000017500000000224612541564756021151 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: TrackerDelegate.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_TRACKER_DELEGATE_H #define QTR_TRACKER_DELEGATE_H #include class QStyle; class Session; struct TrackerInfo; class TrackerDelegate: public QItemDelegate { Q_OBJECT public: TrackerDelegate (QObject * parent = nullptr): QItemDelegate (parent), myShowMore (false) {} virtual ~TrackerDelegate () {} void setShowMore (bool b); // QAbstractItemDelegate virtual QSize sizeHint (const QStyleOptionViewItem& option, const QModelIndex& index) const; virtual void paint (QPainter * painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; protected: QString getText (const TrackerInfo&) const; QSize margin (const QStyle& style) const; QSize sizeHint (const QStyleOptionViewItem&, const TrackerInfo&) const; void drawTracker (QPainter *, const QStyleOptionViewItem&, const TrackerInfo&) const; private: bool myShowMore; }; #endif // QTR_TRACKER_DELEGATE_H transmission-2.92/qt/PaxHeaders.4960/TrackerModel.h0000644000000000000000000000013212537301461017031 xustar0030 mtime=1434288945.169419198 30 atime=1434288945.169419198 30 ctime=1457295917.244761052 transmission-2.92/qt/TrackerModel.h0000644000175000017500000000213312537301461020455 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: TrackerModel.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_TRACKER_MODEL_H #define QTR_TRACKER_MODEL_H #include #include #include #include "Torrent.h" class TorrentModel; struct TrackerInfo { TrackerStat st; int torrentId; }; Q_DECLARE_METATYPE(TrackerInfo) class TrackerModel: public QAbstractListModel { Q_OBJECT public: enum Role { TrackerRole = Qt::UserRole }; public: TrackerModel () {} virtual ~TrackerModel () {} void refresh (const TorrentModel&, const QSet& ids); int find (int torrentId, const QString& url) const; // QAbstractItemModel virtual int rowCount (const QModelIndex& parent = QModelIndex ()) const; virtual QVariant data (const QModelIndex& index, int role = Qt::DisplayRole) const; private: typedef QVector rows_t; private: rows_t myRows; }; #endif // QTR_TRACKER_MODEL_H transmission-2.92/qt/PaxHeaders.4960/ColumnResizer.cc0000644000000000000000000000013212536126416017420 xustar0030 mtime=1433971982.538589958 30 atime=1433971982.538589958 30 ctime=1457295917.241761001 transmission-2.92/qt/ColumnResizer.cc0000644000175000017500000000337212536126416021052 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: ColumnResizer.cc 14537 2015-06-10 21:27:11Z mikedld $ */ #include #include #include #include "ColumnResizer.h" namespace { int itemColumnSpan (QGridLayout * layout, const QLayoutItem * item) { for (int i = 0, count = layout->count (); i < count; ++i) { if (layout->itemAt (i) != item) continue; int row, column, rowSpan, columnSpan; layout->getItemPosition (i, &row, &column, &rowSpan, &columnSpan); return columnSpan; } return 0; } } ColumnResizer::ColumnResizer (QObject * parent): QObject (parent), myTimer (new QTimer (this)), myLayouts () { myTimer->setSingleShot (true); connect (myTimer, SIGNAL (timeout ()), SLOT (update ())); } void ColumnResizer::addLayout (QGridLayout * layout) { myLayouts << layout; scheduleUpdate (); } bool ColumnResizer::eventFilter (QObject * object, QEvent * event) { if (event->type () == QEvent::Resize) scheduleUpdate (); return QObject::eventFilter (object, event); } void ColumnResizer::update () { int maxWidth = 0; for (QGridLayout * const layout: myLayouts) { for (int i = 0, count = layout->rowCount (); i < count; ++i) { QLayoutItem * item = layout->itemAtPosition (i, 0); if (item == nullptr || itemColumnSpan (layout, item) > 1) continue; maxWidth = qMax (maxWidth, item->sizeHint ().width ()); } } for (QGridLayout * const layout: myLayouts) layout->setColumnMinimumWidth (0, maxWidth); } void ColumnResizer::scheduleUpdate () { myTimer->start (0); } transmission-2.92/qt/PaxHeaders.4960/FaviconCache.h0000644000000000000000000000013212537301461016766 xustar0030 mtime=1434288945.184419461 30 atime=1434288945.184419461 30 ctime=1457295917.244761052 transmission-2.92/qt/FaviconCache.h0000644000175000017500000000241112537301461020411 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FaviconCache.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_FAVICON_CACHE_H #define QTR_FAVICON_CACHE_H #include #include #include #include class QNetworkAccessManager; class QNetworkReply; class QUrl; class FaviconCache: public QObject { Q_OBJECT public: FaviconCache (); virtual ~FaviconCache (); // returns a cached pixmap, or a NULL pixmap if there's no match in the cache QPixmap find (const QUrl& url); // returns a cached pixmap, or a NULL pixmap if there's no match in the cache QPixmap findFromHost (const QString& host); // this will emit a signal when (if) the icon becomes ready void add (const QUrl& url); static QString getHost (const QUrl& url); static QSize getIconSize (); signals: void pixmapReady (const QString& host); private: QString getCacheDir (); void ensureCacheDirHasBeenScanned (); private slots: void onRequestFinished (QNetworkReply * reply); private: QNetworkAccessManager * myNAM; QMap myPixmaps; }; #endif // QTR_FAVICON_CACHE_H transmission-2.92/qt/PaxHeaders.4960/DetailsDialog.h0000644000000000000000000000013212571431256017166 xustar0030 mtime=1441149614.411176919 30 atime=1441149614.411176919 30 ctime=1457295917.240760984 transmission-2.92/qt/DetailsDialog.h0000644000175000017500000000472312571431256020621 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: DetailsDialog.h 14561 2015-09-01 20:19:26Z mikedld $ */ #ifndef QTR_DETAILS_DIALOG_H #define QTR_DETAILS_DIALOG_H #include #include #include #include #include "BaseDialog.h" #include "ui_DetailsDialog.h" class QTreeWidgetItem; class Prefs; class Session; class Torrent; class TorrentModel; class TrackerDelegate; class TrackerModel; class TrackerModelFilter; class DetailsDialog: public BaseDialog { Q_OBJECT public: DetailsDialog (Session&, Prefs&, const TorrentModel&, QWidget * parent = nullptr); virtual ~DetailsDialog (); void setIds (const QSet& ids); // QWidget virtual QSize sizeHint () const { return QSize (440, 460); } private: void initPeersTab (); void initTrackerTab (); void initInfoTab (); void initFilesTab (); void initOptionsTab (); void getNewData (); QIcon getStockIcon (const QString& freedesktop_name, int fallback); private slots: void refresh (); void refreshPref (int key); void onTorrentChanged (); void onTimer (); // Tracker tab void onTrackerSelectionChanged (); void onAddTrackerClicked (); void onEditTrackerClicked (); void onRemoveTrackerClicked (); void onShowTrackerScrapesToggled (bool); void onShowBackupTrackersToggled (bool); // Files tab void onFilePriorityChanged (const QSet& fileIndices, int); void onFileWantedChanged (const QSet& fileIndices, bool); void onPathEdited (const QString& oldpath, const QString& newname); void onOpenRequested (const QString& path); // Options tab void onBandwidthPriorityChanged (int); void onHonorsSessionLimitsToggled (bool); void onDownloadLimitedToggled (bool); void onSpinBoxEditingFinished (); void onUploadLimitedToggled (bool); void onRatioModeChanged (int); void onIdleModeChanged (int); void onIdleLimitChanged (); private: Session& mySession; Prefs& myPrefs; const TorrentModel& myModel; Ui::DetailsDialog ui; QSet myIds; QTimer myTimer; bool myChangedTorrents; bool myHavePendingRefresh; TrackerModel * myTrackerModel; TrackerModelFilter * myTrackerFilter; TrackerDelegate * myTrackerDelegate; QMap myPeers; }; #endif // QTR_DETAILS_DIALOG_H transmission-2.92/qt/PaxHeaders.4960/SessionDialog.cc0000644000000000000000000000013212571431256017362 xustar0030 mtime=1441149614.415176991 30 atime=1441149614.415176991 30 ctime=1457295917.240760984 transmission-2.92/qt/SessionDialog.cc0000644000175000017500000000454412571431256021016 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: SessionDialog.cc 14562 2015-09-01 20:39:34Z mikedld $ */ #include "Prefs.h" #include "Session.h" #include "SessionDialog.h" /*** **** ***/ void SessionDialog::accept () { myPrefs.set (Prefs::SESSION_IS_REMOTE, ui.remoteSessionRadio->isChecked ()); myPrefs.set (Prefs::SESSION_REMOTE_HOST, ui.hostEdit->text ()); myPrefs.set (Prefs::SESSION_REMOTE_PORT, ui.portSpin->value ()); myPrefs.set (Prefs::SESSION_REMOTE_AUTH, ui.authCheck->isChecked ()); myPrefs.set (Prefs::SESSION_REMOTE_USERNAME, ui.usernameEdit->text ()); myPrefs.set (Prefs::SESSION_REMOTE_PASSWORD, ui.passwordEdit->text ()); mySession.restart (); BaseDialog::accept (); } void SessionDialog::resensitize () { const bool isRemote = ui.remoteSessionRadio->isChecked (); const bool useAuth = ui.authCheck->isChecked (); for (QWidget * const w: myRemoteWidgets) w->setEnabled (isRemote); for (QWidget * const w: myAuthWidgets) w->setEnabled (isRemote && useAuth); } /*** **** ***/ SessionDialog::SessionDialog (Session& session, Prefs& prefs, QWidget * parent): BaseDialog (parent), mySession (session), myPrefs (prefs) { ui.setupUi (this); ui.localSessionRadio->setChecked (!prefs.get (Prefs::SESSION_IS_REMOTE)); connect (ui.localSessionRadio, SIGNAL (toggled (bool)), this, SLOT (resensitize ())); ui.remoteSessionRadio->setChecked (prefs.get (Prefs::SESSION_IS_REMOTE)); connect (ui.remoteSessionRadio, SIGNAL (toggled (bool)), this, SLOT (resensitize ())); ui.hostEdit->setText (prefs.get (Prefs::SESSION_REMOTE_HOST)); myRemoteWidgets << ui.hostLabel << ui.hostEdit; ui.portSpin->setValue (prefs.get (Prefs::SESSION_REMOTE_PORT)); myRemoteWidgets << ui.portLabel << ui.portSpin; ui.authCheck->setChecked (prefs.get (Prefs::SESSION_REMOTE_AUTH)); connect (ui.authCheck, SIGNAL (toggled (bool)), this, SLOT (resensitize ())); myRemoteWidgets << ui.authCheck; ui.usernameEdit->setText (prefs.get (Prefs::SESSION_REMOTE_USERNAME)); myAuthWidgets << ui.usernameLabel << ui.usernameEdit; ui.passwordEdit->setText (prefs.get (Prefs::SESSION_REMOTE_PASSWORD)); myAuthWidgets << ui.passwordLabel << ui.passwordEdit; resensitize (); } transmission-2.92/qt/PaxHeaders.4960/AddData.cc0000644000000000000000000000013212631124544016075 xustar0030 mtime=1449437540.255758146 30 atime=1449437540.255758146 30 ctime=1457295917.237760933 transmission-2.92/qt/AddData.cc0000644000175000017500000000457512631124544017535 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: AddData.cc 14609 2015-12-06 17:39:18Z jordan $ */ #include #include #include #include // tr_base64_encode() #include "AddData.h" #include "Utils.h" int AddData::set (const QString& key) { if (Utils::isMagnetLink (key)) { magnet = key; type = MAGNET; } else if (Utils::isUriWithSupportedScheme (key)) { url = key; type = URL; } else if (QFile(key).exists ()) { filename = QDir::fromNativeSeparators (key); type = FILENAME; QFile file (key); file.open (QIODevice::ReadOnly); metainfo = file.readAll (); file.close (); } else if (Utils::isHexHashcode (key)) { magnet = QString::fromUtf8("magnet:?xt=urn:btih:") + key; type = MAGNET; } else { size_t len; void * raw = tr_base64_decode (key.toUtf8().constData(), key.toUtf8().size(), &len); if (raw) { metainfo.append (static_cast (raw), int(len)); tr_free (raw); type = METAINFO; } else { type = NONE; } } return type; } QByteArray AddData::toBase64 () const { QByteArray ret; if (!metainfo.isEmpty ()) { size_t len; void * b64 = tr_base64_encode (metainfo.constData(), metainfo.size(), &len); ret = QByteArray (static_cast (b64), int(len)); tr_free (b64); } return ret; } QString AddData::readableName () const { QString ret; switch (type) { case FILENAME: ret = filename; break; case MAGNET: ret = magnet; break; case URL: ret = url.toString(); break; case METAINFO: { tr_info inf; tr_ctor * ctor = tr_ctorNew (NULL); tr_ctorSetMetainfo (ctor, reinterpret_cast (metainfo.constData()), metainfo.size()); if (tr_torrentParse (ctor, &inf) == TR_PARSE_OK ) { ret = QString::fromUtf8 (inf.name); // metainfo is required to be UTF-8 tr_metainfoFree (&inf); } tr_ctorFree (ctor); break; } } return ret; } transmission-2.92/qt/PaxHeaders.4960/icons0000644000000000000000000000013212505250245015340 xustar0030 mtime=1427460261.641264913 30 atime=1418239364.391247601 30 ctime=1457295917.269761477 transmission-2.92/qt/icons/0000755000175000017500000000000012505250245017042 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/PaxHeaders.4960/turtle-grey.png0000644000000000000000000000013212505250245020406 xustar0030 mtime=1427460261.641264913 30 atime=1427460261.641264913 30 ctime=1457295917.246761086 transmission-2.92/qt/icons/turtle-grey.png0000644000175000017500000000046612505250245022041 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasRGB®Îé pHYs  šœÛIDAT8Ëc`ø€++k6 U£×y~~þÿ ÌÇÇ÷Ÿƒƒc>Ñš…„„>ˆ‹‹ÿ—––þ/##ó_JJ꿨¨ènnn°!@W%€ Z‚a¨€˜˜Ø99¹ÿÊÊÊÿUUUÁXEEå¿¢¢"Ø@ ü 0ÛÐÐp;Šn äF%%¥ÿšššÿµµµQ°––Ö;;»›S¦Léùÿÿ; p«¨¨X ¯¯ÿßÀÀëééýwuuÝT#‰7ÜÝÝ˃ƒƒ"ÙƵµµóA.ºrþhâ¤wdb´¤}9RIEND®B`‚transmission-2.92/qt/icons/PaxHeaders.4960/transmission.png0000644000000000000000000000013212444412037020655 xustar0030 mtime=1418859551.390065392 30 atime=1418239366.439282699 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/transmission.png0000644000175000017500000000512712444412037022307 0ustar00mikedldmikedld00000000000000‰PNG  IHDR00Wù‡ IDATxÚÕZGleþfg‹g›·9î11!1Ó{-Àr@ÐD½pBBp†¢Ù˜B'. Ä.z H‰÷`ÇööZf~Þû­ug‹™<éÓþÓþ÷¾Wg,Cq\Êã[ŽÇ<¤}}ÏÝÛ×ÿÌBìßèívº¯ÿ¹±¾åx¸ðäkÀ‡„qZ·â0(Šè}ú ñɧŠŸv|'~úù{†\öùÇ¢÷™'ÅK6›(÷,ïù:0ñð ­Ÿ}¸â˜xxêíµk3÷Üc =ú¨{ì11Uㄾ¾§ÅÄä˜Ø?²O ïßËàµ<÷â¶^1´ukÅçyoÖñËý÷ïœxbŠt¿uÔÈ;…é;î3==bJÓÄ”Ý^ãN§xžD£17wЄh4,¶÷?+†ª{°Žé®.1{×]â5‹%K©?ZbêºëÄ^ &öX­’À|xVLÏ0ϽÔÿŒØéñ,k¯ÉM›Ä›Gú ©š}Ôcxx“>F£@EŒA×u‹Eô¢vØPuÖ1ávctj ù|^ÍyT–Ú,À›»‡†R“¯‰úz¤* M ac E˜” ã2^oÅç“Ö1 €u*B|ðá£n£Û_Þ¦pÒ:A뿽b6[¢’N¦éþ´¬—ð{E&J‡ªŽàe½¯…BBXàñxÙš+"À˜Š'h·ÛaͪЋ4„BT̶’Â%:’‰$örš"Ç|x€X È)HäR<Ìh?ƒîµWtDˆºO!Ÿ‡Eáˆx`èzëJ#ÐæpÔÈSät+ta €×%­&ß pÊ·Ü2}d"Qn¥t„Ïç§Vœ¢TtËúhii)ë–¦æfš)#œÜ…¸ äÔj¥–K€ÇoÒH³ªª g0”)dvÚ!íÑh ªb‘i2:6N÷‡JÉbŸ@,‘ Þî#’I¬]ËÎ0;¢‰††ü¹çO°nÇS‡ÃÜJ—M`­Ud;ËÑ€ .¤kXâ8¹¢œ“n]Žößwí’^—]KH¢2.§a)Ý&gˆ%‘hjlB&““º€£g%ÜJ¿XV¼Þã­×h‹ªráI¯R*–d’ ¯FÁrÚ©eª)0‹ )’±X±hŒßw òëÊ@I‰¿Wñ>Ba>Ò½Üàœëöz<¼?êu “1!C©›È¯¯B¾€i>›CÅq,UAŽú|SCkéy™¹¿%iAp¹­pjNJ]*d¸¸…+Ó—K€7>Éíq˸<æóûÓGˆ…_~ývÈÁLm6ÞJ?WM"ѨlËýÛúä~ÜéÎ<óLtuÌzcZ¤4Ê’ñB6’“–ý6JlÛ5®~U%”ÿ AÞœ ò5þ³Î: [¶ÜFEB–¼þÃOˆPzLœ« .à¿ö Iãׯ?‰ö¸§v:á”á'ÑÒ܆ Ï rN½×ËÎl¤N¤ÖŒÝ䤪×ìv{_׸¦åÄKßrËfê{ iuØ7<‚=î“*'kÈ—w1šššpÕ•W!@ý¾’´¶¶`pp&£ït:s”¢ö׊À:o}}–Ó‚_kóÜBCAT“®“OÆwÞ…Ë.½×lºœÛrD¾öî¥_€Ë.¹7\“®j\s͵+6ž÷Ó?ÒìY#m`ñûàVª”_èéé©§¢9«ôf¿qãüH›=òÈÃÐê4¤@a- ÁËâ1Dé@~BöÙ¨ÈGKk…]j<_“ÆŸsιÒò«låºa¬_þù< ‚ÄD »»Û¦8­Bí¬˜F÷âæ==§‘.9° ø M0c󚥴”×°8i!/›—®K<”…ãÅ!7??Ï$dÇÓ‹EŸ×ao;ûì³÷(˜Ð jJ×ýÄÞÆc<Y °aÃF¸œ.¬†d³YjË»¹Ùx°Ø œñxö"`Ÿ…€x,†™ƒ3|,W[¸‹²^Å¢•NTF¾²ÿ‰”û¯L PÔwÎÎÍ z”¹·úÆË{ù¢ÈbÃ(KÀápððÒã‰ä‡c£c¹x<†Ö–V´·µ¯*Ú<ÉÇ'Æ9… Š%[¶ÎÎÎv·;<‰ Øm¶—wý±ëŠ€H­ö¿Bð‹œJ¿£óáè«T¤á`"¡/Fˆ.,Îî±>«µ™ ů*ŠfwØÝX}áo’BZ7ŠaDŒLæÀÎ;Ó¥9ð`@¯ƒý¤[IEND®B`‚transmission-2.92/qt/icons/PaxHeaders.4960/utilities.png0000644000000000000000000000013212444412037020137 xustar0030 mtime=1418859551.418065878 30 atime=1418239366.439282699 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/utilities.png0000644000175000017500000000133412444412037021565 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿa£IDATx^uQíOÒQæï¨Í/åúØZ®TÀ÷÷63g­²œNImˆ¨å‰•_2Wd¥*†† ¤‚?ÌÚ4Mí ~À‰þØtþN÷¬ÉòÃÙ}vÎó<÷¹ç²à¿ÕÖù˜-‘vú%Ò?âÓx±¢ó'¸½ë‰ÐdžôžAÉ7èêîpõÊ¥äì'¤3äô|™7š ÆIÔÿTÚ"§+Ê µ­9QFÄÔòW¤ a÷õ›Wó ˜³ÍÂÛÁƒn™dW7>^^ñ¢a5Q šZÃÊaß²ff§°`Ž8\6p{@‘þÊw¨5JZÜ*RÄ=_[  (´Ù­ðqäý¡HÜljnÜÓèÔ‡«k?À÷Í âQ¹ƒòŠÛì{•媚 êy_/íòØA£SUVWLÙY,Ä£ZåÑ’Çò—2šÌ(Ô –u·âÎÎØ„–™1MÓí¼é‘àa°´¬$r âºü=·Ç FÓ'˜4ŒÁ¨f„¹U~ÓÏ*»Qº3¡×2fógÀ%nÿÞ$ Á¢üs'ˆ«ùUA¯Ï F³ô“:Pª†˜’ëÅ~Vz&›),(Ê£^ôÉ韫`±šó ²-dv+7?Ë2®×/º ©Y@“••“!Dmd‰—¯$%_»°Ù-°µ½V«™©«çï߯­Ù7š¦™Í­uÓ«¡°(/€Ü¸_à¥qÏä=a§s‰°Dö±NÒlüZ·g‘ôT€ Ú;Zi/%ú/%]LLÏà…\Kv$ˆ9A=m4`Ê8 ˆ±×#“„ÎyàòRC¨‰JÀᦸp€îd˜ÊI¦þn{R¹Éöp†äÆ>!’äŸUêaP¼`Çsâ bÍØiÜ’Èø4Þ °‘f•aÕIEND®B`‚transmission-2.92/qt/icons/PaxHeaders.4960/lock.png0000644000000000000000000000013212444412037017054 xustar0030 mtime=1418859551.118060668 30 atime=1418239366.439282699 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/lock.png0000644000175000017500000000064212444412037020503 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿaiIDATxÍ‘DCa…_$ÄJ1ÁH£^°…D’ ¥<"eQé)ª¥¥´AÓT¤‘È(a«µ¦‰¶™ž6£$ðpúl¯Y@—Ï®s¿ÿ°MúŸãt:»F ;3©˜’€¢ªªÑP(„ŸáÎŒ·J <| /dYÞ%Ü™ñVI&|(¾Í áÎŒ·?$RQ˜ªÅ“ãp´ÅlotèJS³Ú_Ï·>â^¼‡Wðz9‡üù$²'cлóƒ]£‚ºñ¶ZäWÐ.dö$7Gð¸Ü‡‡;b36ÜTСkTÐÀö\tÙÓ ýåhÏþ^d|v¤·mHº›õı:t ØñÎ"±Ô­Ç]íˆM·àvª 7ŠÅ¢ŸÍw€Î¯lú†‘Þ‘õÔV+’në7V<­[õë5è”-à/VÌzñ?ÀŒ·r&MÐ)pð³ˆBF‡néTóÀö²Ð¡[˜/²='»(±îìIEND®B`‚transmission-2.92/qt/icons/PaxHeaders.4960/turtle-blue.png0000644000000000000000000000013212505250245020367 xustar0030 mtime=1427460261.641264913 30 atime=1427460261.641264913 30 ctime=1457295917.246761086 transmission-2.92/qt/icons/turtle-blue.png0000644000175000017500000000045212505250245022015 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasRGB®Îé pHYs  šœÏIDAT8Ëí½ ‚`F»„ÖîÂE’Ò¾üÊ+PégiÑE‚&»‰F‡6[›ZZ››»‹îà4XAQ»ÎøœÞZ­â#šF·Ùd­ª( UE×¹B@§­ÙÏcÓä&%Ø6 ‡0@¯†QD4¥Ðn¿E…º”ÜF#˜L ÇcpÝ"hYðŒ/KËâàºàye}Âkž³¢‡ÝRiÊ~6ƒù¼ìt qÌ h|ýÁjÅ&I8¿\‰€h·#ó<è÷|fÅÜhð¦K>ÖB;IEND®B`‚transmission-2.92/qt/icons/PaxHeaders.4960/hicolor0000644000000000000000000000013112442116606017000 xustar0029 mtime=1418239366.24327934 30 atime=1418239364.391247601 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/hicolor/0000755000175000017500000000000012442116606020503 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/hicolor/PaxHeaders.4960/22x220000644000000000000000000000013212442116604017556 xustar0030 mtime=1418239364.715253154 30 atime=1418239364.604251252 30 ctime=1457295917.246761086 transmission-2.92/qt/icons/hicolor/22x22/0000755000175000017500000000000012442116604021260 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/hicolor/22x22/PaxHeaders.4960/transmission-qt.png0000644000000000000000000000013212442116604023514 xustar0030 mtime=1418239364.715253154 30 atime=1418239364.715253154 30 ctime=1457295917.246761086 transmission-2.92/qt/icons/hicolor/22x22/transmission-qt.png0000644000175000017500000000210312442116604025135 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l; IDATx¥”]L“gÇŸ1X¼ßÅn¦Ë–eÙnH15Ã%[²9’ˆ£´”ï¡J)-ˆ 8úA -È7mÃ4™Le*L2— LÌ\â>Uù‰ËTèç<ohP/ðâ—>}Îy~}ÞsÎ[@¡Vˆ¦3]töÝå.?±Wˆßúƒƒ}Ó&¬V,Øl˜#\eܽ{cc·Y.÷ÎáÜ+t¦AˆŠé×‡Ž á;KÛÓÉîÝcX¬ÄÎmb‰Îö¾HÌ¥x¯Nˆ3Ä<­ŸIŸ9vÜúó ‹•A¹³D­×­¿ ­q–9¯ƒañKòWŠÕš¯ßÔĪÏ“ÄÃÄÆi¦Yvuð #Å2æÏ½mtÞsÅ(Ý™¶ý‰¥Ø »ÃêÝ¿ôt3,¦=›…EÐÅkÓåÂWˆµº˜žÂoó±77)Û“üM¢$%5IÊ:»bx­Ä˜ôŒ4—X‘½7‹Ÿ¤éyâ1Wy)t ZxjÑtÔ+ÉÚ—;ì¸pFâ(µ¡¼Ò%c‡=ÈÚcÂn’ZŠ‹@޾búµ§5õÕˆOÔah¤OaGº™FTÔTJ ™ð4º•xëéã0õ¨ª­„F§žðSmÞJHŠû¯º®FS:nÜÆ(óû0btZDk5Ð HË0 Z£™ú02:ˆaâÒå.$¥$ ¹å—b‘\o,«Ò »æV”4;?èêCšAÍ‘[öÙç’Ȩ­ÈÎÙƒé™Iø|>ܼuƒ§ÁwÇ[¸æ äúp¹X››ŸûÈá´ãP“½}=°Ù-( ffî6"*z+¢ÔQØFŸÛèó€¹[•ă‘ë×`0éÑÔÜÄõž'Wärñ~gYé¢ÅfF{Ç9yãÛcÃí­OJxd¾øj¾Ü¼ ©;Si2è¼xãS1AØKŠQç©ÕnyB®lEL3x¬¡Ñ‹œü}èèÃÜ£YÉÌÜ4ÎuÐ$8m\g9¯ž†:üsç/Ž+pœe%p7Ôƒ^¨fEL“põäéVjœƒ×09=‰É© †n4Ž_‡‡PQUŽîKx8ñÀã÷ñé0SiN´~v)⸄Øñ®î.T×V 1%ôV@“Ir“ãvìJÅ‘£‡qñç.~§¤8444ˆ{éTÛItœoÇåÞžUÁg<ÛúkXŠØ¾F„„„¼C_d£òä!¯ gUì/Ì…÷Ô¼¥õŸn|_«To“xÁæ°PcêW›à¿/ªTªuB­V¿áRk£Ÿòc¼ ,¥™oBÈæñbÃÕÚõÃ>z>ûd-¹^cçÿ[á'ÞQùæIEND®B`‚transmission-2.92/qt/icons/hicolor/PaxHeaders.4960/72x720000644000000000000000000000013112442116606017571 xustar0030 mtime=1418239366.241279307 29 atime=1418239366.17727821 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/hicolor/72x72/0000755000175000017500000000000012442116606021274 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/hicolor/72x72/PaxHeaders.4960/transmission-qt.png0000644000000000000000000000013212442116606023530 xustar0030 mtime=1418239366.241279307 30 atime=1418239366.241279307 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/hicolor/72x72/transmission-qt.png0000644000175000017500000001054212442116606025157 0ustar00mikedldmikedld00000000000000‰PNG  IHDRHHUí³G)IDATxí[YŒ\Uzþέ}ëêêêÅÝÆî½Ýf7lÚf°g!À6“¼D‰’Œ¢ä%/ÑDà€0a4l¯£¼”‡<1€ AaÀc³°éµªºkßïùóçÏÕmUúÒ]Õ®NÆ6ŸôéV•oßsê;ÿvþS­ÂoèÆ7X¾ÁªXÃľáÿ«ýä'G»ŸxâÑ?ùãÃ_ÃC<õÈæKÒ‚üá#=ñãêcOõŒÇ³æ3™žCšù¿~‹ç÷óÀóJŰN´žÅ”RÏâ7<ž®ØÄ„îêêR.€ 0×ÞŽubëÖA @“iÝ8 ßc(¦Öx?“Áäw¾íñKX ðÖ(s8—ÍÞ˜üä“¿Ðår‘EûaxêA¢ê†ºØÏ€¿} »åóó¤™ýˆf[äWLv:öú«477MgÏ~áÈÙÙizûí7åÞS?Üò83ÌÓGÒëwÜ¡yÎÄ|vC]ì¨âuþnKOÝpÍ5Fø½÷ _xÕÇkO> ¼>/Á ‘ˆ#ƒüo>¿ Ôž¾åqLþ›à›oâÊ‘µ}xŒ?{A©î «ƒ/—õõ)w*õÒKðž;‡@¡Ð2 MÐ&1µ3õ²ëù‹Å–ÇðÍÌ@ýò—pOOcs_î*°aÙÈ—ËH'“HT«Hë¡íÞšL˜Ú‘"&)`}ciÅ…dóù¯¤s‘Îf‘H$ …°´ÌÄZLgŠÙ­k¬¤×‹d.‡¥t`˜m˜@ETðîL"a~5?lW²ÝÝHG£-1Ã\¶ S;S‚ÙH¤õqâqd{{1ËÖþåܘM§7ÔÅ4ð×u¢âôì,-°Hyöõz½ͤæi ÄB˜ši:Ó â÷­<ßd9n¥ØÒÏÍÌèJ½^¯ñ†§y+Õ÷0Ÿ{H1É"=ÔŸjkñ·»ö?iþšžù’¾8}Ê‘ÓÓ_Ò[Vš:kêÙÌúòœ„9æ?= ýŸµ;ØÕþJ}ÿyà*¸AA²Cœ t­Q(º< 5Ùä€ Ò~ÿ¿X5Ò*€4° eI ¼¿ øõA"ó‚Ú‹=ôÐC~¶ zåÕ—éì—§é“O?t¢‹o¾ùïbA>úèÐ%·›'’ ¶z "}é6Ì“ô*u“èHÈÔ«TÒÒ—°@šÖ¶ º¤]LƒVƒ]I³¥8Q¤ -Ýÿ]}÷>ø³{øÕ¡Ã¿Z?üøÃÏ­ -uŽùuñ`œüèÄ[ëï7ï½ç‡÷¹gpÃ:pÿ«Mò~ …ïû]]±Í==Ýë`|ÀNó–›9‘ÌåvGW,¶©Õqâñ®Í ÿ¥Ô\¦úíÁÃÿpÃZ®‡òº ü«Û㎌áHÊPB‹°R8, úšJš–ƒô–-[e—­¸±Êår8súL¨Z­þó=tÏÈ/~þ‹Ù¶ D.º„-CCƒèˆFP­ÕP.”e£ºD;:@Úr1S;‹h’]e²™–¶Ûí†ßïç±¢6>úðcŸ«¦þ^¶Iív1˜2 ƒ:c1”Ëeðª Æ"É—D6“E2‘lŠ©d .¦MgÒr¡˜J-"±X“étõZ]žËƒl6+‹GÐÙÙ©üé#FÚ.FÂẂB¹RæË³g±°° “aášbcs&i²³X¡_ë™2~‚çqæÌÌÍÍÙ[, ”Í›7‹a¹ê¸µí.¦ãþ€_î·vßâ^©T ÝÝqŒ!ÞÝ…& –—˜O¢ì¼a'b±(Ö€XÐüÜ<>ùäS$T½}½2ßJ¥ÂV{¿ÕíH©‰@ ¨\† $—’< Âž½Sðù|hÓÓ³h¥b‰- k@NBúŽ„ñëwßC„c]8i“MÇŽIŠiãmu1Î`a"êæÔÁpÂ"Ozrû$†G†1°y iÖMVQ׺¥1¦öì†Xkµ*s%_B¡¯©º¼­F}²:ë½¥jõ*¸‚×ëi‰óL[Ej1ÝÒ,‚á èªÌ—@P†!¦‰¶îß¿ßÝ6L¸FyI™šH”8D@›p«`“øU«™¼Â5ŽUGröaò}|ïÂ:DíáØ(ÄóeÀP†T2Üñøpû²é1®)àóú¡‰Af݃k¢Ö:7=ƒR¹Â,¢P*!—Ï/3·Ìb¡(±§Ì÷ÎÏ·.P,Ö…*/ÏWHD8P3À™l¼}j,Ô\n¬dˆ\[È •%TŽ”`Ë‚òE)Š¥²Ï°Ì¼Í"ß[*—P)—QaK(ñý­€·2O“´Ì™ ÙõÂ`@+šh[S„1öi—ËP ËÅ8Uƒ¯¶@Ë ûBÀŠÏç’r&_)W˜eÅhØá/g¤Xb1=É$·niz‡Ï¿:‘k­Reë÷J]å ùÁÏ2yþmˆS< dŠÅpÙµ <™8Xu—DËŸ.°@~¨\ b7bË[!ápI,—*ðyÜH¥Òæ­Ž‡…h]ê3†X_Ï›$<’ÉÒét{ºýöÛ}áŽà@8¬`ßëßnœœõÒY²TbÁ@@\Œ]†(JìYÄzJ¹×˰´”¶k0b:+e_ЋkUùïeÞ¹vtDT&“ÝÞ‚Áah(VñeË‚*/³Ü«ä¼¼‚d*¯Û-V!Ë{œP˜å ä¯:ïr09N‚댱Àe™·&|•}‘îçú.ðâ‹/–ÎK ¥Õ˜R@"Ò¶‹qfbpY&‡I¯xE`+X‚Ûm Àâ °eÊæ—SþŠ8[©ˆÇîÈ«B& Zc$ëî鯹s_Ùó"‘yÁcþöüz<^üÙô¹¬Íub]1Øqz“æ`,›P¶:ùÒ3ss2ÙÞž>é .C\Aâÿ@º ³ E)ö”ã"8Ä<~vN}z †•II:"0@Ÿ·@ Nñþº×ãv¬ ÆAÏÎbA Ip„ÅÅEÙ³Õ«iE$“‹¤?Kt»„–ô¼”NK’?´TÈÙl]|¿<Ñq¸ÆYt³@Òú¨Ue‘‰K šhGD¢J¹Ü€Rª¶@q± fS<YÉ`¹ŒÉ™$Àñ(Ãñ¥Œ»"8CãH ©šÛ+èæàëÇôß××+Wvc©Hžï ÌJ¹tþ)(ì²Ò½³‚•F»%&4“â‰É™ƒ¿¤GVtûĨXŸR V=ž–íÈÜÜ<‹ë“¾Ï «cRëíí³ T+¡Èµ3Úéš«T&Û`Aj+›$‘â+VÚ„#m]þ ½A´ 1+›ÉH¬aJÑgÀ…f`’)û1Ç-q¬#Òi‰dCšü¹|v…åv²õ±µ°«eþÚÔp))p¹hßv^ÝýÇw÷ºÉðKZ„ÄË\KĽ§$ñ"ŠÈ½1…3R.oxZÅ„R&šIsŸäÜY”p»ì©Û +ä¬z§1õp*- ’­’KöDÔÅ©>Ê©>³.¼U5HJIó‰»á $íKÞ{¬Hñd/¿òNž<¢F r¹ ‰9\#Äl HÝ´´¸„§~ú䊒ફ®b^m®Eë¦M›pâäI{þÄŒvvZîfNxg]™0†|ôxÕ,(;¥xm×®ÝÅk¯½Æ™+%1çÜW3⚉D ¸Ò,Äq¯†éêò…"Þ9að8cØyã lµa8¥5’@݇wß}D$®I¤í6V_·@ 4Ä«ƒ€/ ¾ï²ú@lA’Áœ¡ ج{qàÀA?þÞyçWØrÙ>úølj»ˆ_\¦HÜ2xì¾^G2Ùž=7£­cäX´ö÷÷‹8¥RQŽ€@$ÏP’;Õĺc¹Ò­»9:BA,†‹5»Zbq×^»###8öú1y?Ð߇÷ŸD.›G“ÚirÛ˜ˆì÷pÓM7aÛ¶I4 v±~0¤ÍëìiH:‰èl>;±î~‚ŠF;•¡ ʪ€Kv¯¥YtðªÝyÇ]Ø·o¿T¶û¾5…ááAéM×êæ×ÒÔ$÷}gÿ^ns\†×]‡#GhIX.ÆoeW¹Æ»â.C©í눟1Úº’ØÂ´›Vâb-brr;î»ÿÆÆÆqÅö ì¿eJ:|\5¯`_o7nýî-rßèØî»ï~ìºq·´WZ[ Të,•XH®]¼È Œ¯[ "líˆFA÷²‹ú< ÖÉ`ßûÞ­¸í¶ÛÑ¿©ßýö͸òŠIh‚X »´XØÔîr|sçwá÷ný}Ù³$“esy+±((eÈNŸˆBÿý‹•–cÐÝwßw{ ƒd×@²ä Ùà|088ÄVñÞþÏ· ”š›O`dh ¼^vïÞíÛ/—k¤¢>ýÅiû{hÒèŒIªG¼æ[ˆ³g0!v†ý`ÒÞÝ£ w¹yï·0>6×^}…SuW^y5vîÜ)•z;‘Ëeáú—¿‘TÓ Zvõo4íbŠ˜£ì»r¾ZŽA1Vk9ûnÄüÝ{XâÌÔÔ”ˆÓnœ:u \QÛß DØÙHÛ£) RG×_½ßMzÜ((M+«(³?qâŽ}{÷îÅå—_a÷¬+“œ?kòßÍß+×ÕÇ:{öŒlrwìØa"ÀÅß7Ü47;ÅÐÐ5ª‘þZøGû|=Ú¤ËÙzL~ ‹ˆìXÀÇ?¸ó®»püƒðÆoàØ±cø‡ô®¹æZŒO,Ç4¿–zÎX˜_¸"ƇöíK)¥*Äpˆë”}F&c†êåj7 ²‹)>¼C6›mØW)(pÛä$*œöI)(@ØøZî=ß×û½R°¬é×VÜ‘ïaÁjµ() p™;è‹ÔëE5¦¹B Å»í6W4— @ÀÕ ¥Œ|!L&Ý õ`9×òù}àÞŠ,Çï8¤Ñ·´´hop9IXîInn˜Æ9Cϲåô¤ÓFÊ£ -’×ÍšìÁÒI…ëù¼»»GúÄ’xΖ@^d¿ô»­~ÇnÃYZ2V ÒDdyäü½ ”iˆßc~~Þ~ýùçŸáƒXO8’#! ­U‹•4Ù¿zçòÿ¢£iý¿Øum5HÁäF7Êö"CCÁ¸.Ø'§¹v :«Ì)P¢þÅŽ?öñ’•x¨ì«Uó#î3ÓÓ”7l–¶×F2¥óØÛÓ+›mù)N±ŸnW kVÒœº©`µ‚Òó©Å—‡ƒý>ûì³ÎdjphHì.Ôë&ÒKK˜›E.+^òešS¿éF+ibð&ѬeP5•ªÎ.,þ 7ýóÙÙÙ]œµ´—TP¸ ¡ õ‡ƒˆóÜ\"ùÓ:_O¹\Ó ·ÿ¯ÐÛµ+¨×\JŵaøˆÈØÝÀ'¡·J™|‘@“NóÀ+©Lî„&*“i.µÚÜñãÇ‹ÄpHÀ¿þt§Óé°özcÐ:¤U]Œ™LútF½žÏy½K;¶n-ð™ ,ã¿M9ÿ†#†LJIEND®B`‚transmission-2.92/qt/icons/hicolor/PaxHeaders.4960/16x160000644000000000000000000000013212442116605017565 xustar0030 mtime=1418239365.983274885 30 atime=1418239365.982274867 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/hicolor/16x16/0000755000175000017500000000000012442116605021267 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/hicolor/16x16/PaxHeaders.4960/transmission-qt.png0000644000000000000000000000013212442116605023523 xustar0030 mtime=1418239365.983274885 30 atime=1418239365.983274885 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/hicolor/16x16/transmission-qt.png0000644000175000017500000000126412442116605025153 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿa{IDATx’ùKTQÅo3@±û{@ÿAˆå ŽÎdlé8»‰¸M:Ž2¹½%sq«(""(Sr+ ¢JÒD ‚¤J°ÑÓ÷€>46Ï[î¹çÜ/ç=@ (U;`0lô Ñ}-»E% ufÓîAmÐ`øÖ¯T>½Š—°R;_L&|ßãkz:¼ÞB¬¯¯amí3Ct¬¦¦Bý©„”ŠFäqdÇF#¼bšû8‹óï kä‘ ‡nœ @FZ•ûa+d4n•ˆibzŒ0!Y§Æ=²wEÞ/éÄjË:.œ ¹yî˜boá¡€„LK µ}èÑìΜ»9öì!Jlvkôÿ€ìœ,j:ây!AÇx²QþvõvÂ_éƒÃeƒËãS!ƧFñlò)àpÛáÊÊKÑêæ¾ßâ=Å€“"ü CR±°<¥O‹pz\àÄîvb~i‹+ ð\v¡/Ü‹ü‚¼ ñ&2à_zúºP꿚ÉéØ8ÈdgÎÆƒ\¯ T££³>é¦hvd—W”m¶µ_Gk[¾ª Ä&$!.14“øó)``I¹Ý¡N4·h¨o¼º-Z *µúí&­wîÝFäIqIÉ0gZô€4‹©˜~5‡‘¨ Ô ½£ +¹„otuÀ_åÃèÄ8æØä(xªé‚)ii°:x7÷Ô^Î< ¾5È>¦”;×9ÞÓ× Ož of_ëð´”ô TjYž¾Î’YöÐÍA~­eN°Èqø )…bo¤t>ÿP6‡u£A«Cs«-Ø„k-F 6]çÅ€ûR”þñDÅ;ó“Ã:#:XÏIEND®B`‚transmission-2.92/qt/icons/hicolor/PaxHeaders.4960/scalable0000644000000000000000000000013112442116606020546 xustar0029 mtime=1418239366.17727821 30 atime=1418239366.112277096 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/hicolor/scalable/0000755000175000017500000000000012442116606022251 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/hicolor/scalable/PaxHeaders.4960/transmission-qt.svg0000644000000000000000000000013012442116606024516 xustar0029 mtime=1418239366.17727821 29 atime=1418239366.17727821 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/hicolor/scalable/transmission-qt.svg0000644000175000017500000004100012442116606026140 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/hicolor/PaxHeaders.4960/256x2560000644000000000000000000000013112442116605017740 xustar0029 mtime=1418239365.91827377 30 atime=1418239365.065259152 30 ctime=1457295917.246761086 transmission-2.92/qt/icons/hicolor/256x256/0000755000175000017500000000000012442116605021443 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/hicolor/256x256/PaxHeaders.4960/transmission-qt.png0000644000000000000000000000013012442116605023675 xustar0029 mtime=1418239365.91827377 29 atime=1418239365.91827377 30 ctime=1457295917.246761086 transmission-2.92/qt/icons/hicolor/256x256/transmission-qt.png0000644000175000017500000006515612442116605025341 0ustar00mikedldmikedld00000000000000‰PNG  IHDR\r¨fj5IDATxìØ± AEÑQ¬Ã&&5‘°`S ¨¢ˆZéXÆ‚ÿ<8 7ø- ÅŸ?@Xµ²3³e«;3KRà°HÒÌÌ  `ž €}ÓׇÓ~<Þ—ñúÞgñüÜÆùzÓn;ù“{ÖbÙQEWÕ9ç¾ú¾z¦'ŽL2éIÒy d4 "DÑK@@#êW@PgÕ/ˆ?B¿üòGAâœI„ü F j”ˆÉL™Ñt¦ßwºï©*÷âì¢Ë‹€ äŽíÙ°X{ïªâö9sתšº' ·u41 üúú½ØØØÀƃ‹?ûüùóX]½Ã¡‰M,4ʲ´)ËÖ[eÙŒÊò̬,ß%8?-ËG_yí°?Âx´ŒÑp¼ŒG5®ÿñê{®—å“òw½ß—å»MYnÎÉß¼V•åé­²î”eWž£ç2¸í£‰ÿi46Oƒ`E°6înY{6—žú™pnLßÖõ!Œ¤7²KɲsáG‚íp}k ívKÝl¶Myïá*ÁW¿µa VË:‚L`¡ÎžfzåʡО¶ ì ï8cv„™ïIo¿¶½¿¶ üùïÀõM`se29@Ü;ôãÀà,°2T/Y{_x¨ <öak0ÆäQšFa@ŽÙ´–ÑVßo€,ŠÕZ‹(â\YÙ«keJ¶ÊÆÚcñ+¬öLÂ6ŠA0 …sØ•~»ÕA·³„<_”xT³ í¢…¡Ñ™¢ÀеXÒg†÷µ˜É‰°½ö½ÖˆµÎa0wì+;í º²îÂ’÷Nq¾µðºæƒzº˜¿=ƒØ^}Ûû_¼&õp2yM4ðo>ÿ4ðÀYö¾å>&Bÿ¸Q¸™ =Kê<ö˜ sGduìÅq²!dÅͰ̣!èH‰)aŠàÀ9øÃCüm6C‘·Ðñeº~gZí6†ã1–{=¬JÞç;Г Å Ý9¡ â¯k0' ©Ô2t¾ ÉÈ3™ãéWÔcš{æ@[êÇ``Í<̱+WþºkÌ·¼ÿùUàåç7å¶; ‰ÆDôÙç€Gï±ö³"ø/[ ¨…l ˆ– 9S.L[ÈYç9K¦ˆÉ*næQü ë8XSì*ü8F°ö*á÷÷öÐÞÚ‚÷DÅá…DsÖé sÇXZ^Fi â@‘Þ$S˜<^Uäz­ìë˜#+8æ•ÝÑkyöŠ9M@Ç«ªóŠÚ 9̸Ž,¨ïïj‡pqlÌÅ{êÓ›o½ðÂwïýO~¼Þ˜Áÿ¡ðvúCÖ~õIk¿–cŠ4 ½­'Ež×c*ì¼ÕÅJΊ–h·kæ….¹¡¹FÂHLcˆžÁÞüŽîõK]ÉîߺyëÙ($šÀ‚â8yî\„ßZ[CwÖ"|/ì1'$wdš€ ÒùN1£aßò4‚#eâ(„»ï áÙ;yöÀ7^|ñÛßsî‡b3 ‰ü¤ïø_ʲO³ö¹ÜÚa›Âçå/³]h!âí¨ÐyÄ%g*r²¦Ð‰ùœG‘+(ìDôÉ @Ù˜Q]Ǭ;¦©*ä øÍö¶îÀ4» ‹@[Öï#_^F¶²‚BÌ€ïÏÆgKCŸ+ë0·ó³V3 à™ÿ³ b„þ˜kHç8YÇz&9a&ë‰#ç(~L½Ç!qïYïðc¾ñjY~~s2y¹1€ß,ŠçFÀ3{—Vy¢CÑ (øo×…m§ƒ\`†"Ovzæ†LH ØSÁ3b'@°ž}""U$Æ9~±ë»‡½=ðó{2Îåœû‡næ°¦>ýôz dbëäƒÏ<é3!2ÅŸYÍ Fr@4…(~áˆ0‰a2w‚êÖ-8š€Ì;’õ‡ÎáÀ{ï OÇŒùåëeùôµÉäGœÀè¿ôÒý£,{†»ûXD´,Âí º*úB8ëõjÁ+†L‘+(êTð主§âE¯@™‘€÷HEA6*h­ëULA €óýB €ÂÈ8{úØ›?å°Ö0jp }Öš“;­Í€L#H9ž tç"v!F@1'uGPÉ\šÂ-ᩬ٭*Üä¯+Þãœ1ß¾,úÈd2m àûŸúÄSçF++[²ƒDì§§]AÁÝ‹"—Ü*ÿKѧbgEÎ<=ò&ÿße/Îaç‘ãܺŸîˆš³ï«Š;]ü2K>ÃZï)(¿ ‚žN(6'ð<ð’{$&Àš1ÿ®ñÙYGŽ‘®ƒäüwMBŒ;ƒÕÓA& ‡Ä2¹8AKÐä4™{Xßœzï}ëŸÄêêåƒ76øË—/ÛK_¿´þȃ}æ‹—¾ð•ýݽ3¯Tů~Þ`€Ápˆž¿-à‘ÕPüÉÌù–< AA –¨ªZ#€c#PæZSÑ«ð䊞p®î)œÔ±ü¢ò€ƒ}ý"„wú ŸgÀÏwáý}ø¸V Ü]ù>CžGÁë;HÞ‰€ÌP>6IáÀD:9éÏ›ä?Ø»ÖÉŽêüÕ}tÏÌÎŒ_û0°‹±cl³ƒB‡qD2HQHB„Bþ!Œ’QE Ž,EäO(‰P‰<,„D@œMÌ3ƒq¼¯½¶÷1»óèî{oUÜ{tö¨TšNkĺ{fSŸõ¹êöíÛÓ}÷ž¯N:UE¡Pä94y*Ï9^CÝ¿£ˆºx*®ëN­¯³|Μc‘ø™ß|ûgÞø–;qúôÙÿ{C ÀÇ,Â*ÈñušoÀï7y΂Î9-Q–*ìD„¢­ªâû k±ÿÜxãÍ8tpøs7¾úÆ/\ÿê›N}ýáëÓ?|ú{IvAËÿÉ¿þä'ï¼óëÚk¯E¿×ã¾²­Ùmd·Ð~&?(u­$·îaÿ60z9Vêq–1MXo¹e뉀Ö5~éð°V3¢ÙØàþk–±ЖÙ,†™YV€œãïã67ÑO’@$‚z䳯‰€–Üú ƒ{^ÏÇ*áçeânAÒŒ‹®,ኂÀì²,¯¾òjû½Ç¾½^¶g~ñ»_í?üó?úè%ØÁø£{ï=ð¦[ny÷ýû1?7/φ…'/cê¶iPW û +D”ãRŽ¡;?ÌQ©­\Üâ CD]-ÁYË™pMÀêú±M£Y‚3˜  Y}Ü¢J~B3Àjk5÷AïÓ„{0Î )ãaCmñ¥d± [~€ßüóàîXÉp€r0ÜÀúÆ: ^^\ ¯º>ûá?ºûqàדì`Uu{c›|0€]ÅÌ ©¬¯¯a¸¹‰¹Á#" IÚnØÚs‹#“P`ŒºzhàQ=výA‹7öáZ³pDÀwÆßñb -MÐ ár†A@6¤ÍMÔl¿Ï÷+±ÿûÇ߃¸ÅE I}MºkˆÄÁ @L8ÁZî²0»:§u0†Ì"Gc›·ag# À™3«ù… kXë‚RN‚tŒF5ªÑà ú(³Lóú ˆƒu¡qÇnþÿ]ßÅ &°GÆà[r"KËf8ä—D´˜3'FÔgÛUÃ!{UÙv~säÄõÐØõõ¸Í=“ŽLp/e$F½Î è iàdRRQä-KýþÎ9ÎØX˜$;à †CþGγ\ûȽ²€!ð:ê@Sˆ…Æ èñøþ¾ÖÇz,*±[:)Ц©À®3.ç¸ëb [æ¬@α(U·QY³'al ô†"Ï Ž0âã 0T(d¢Q'®:ó°,ûX˜_€€à‚[ð`‡# À`00kë°Ö ñH”܃®KP55 k¹¥ªAÀu.ÆÎØÂXͤ׀qÃ[[‹@ˆñ‚Î…g÷´’®‹q™¡Àð ä@÷ýŠ… ‹šÉŒ©‡—ñ¹ø˜‹ð8> BǺ¥ëp9ªFØØÜÐÏòÎc½=^_[O°Ó±¾>0§_<§žú1æ!À Ï¿€óçWÑsŽ©Ð\ìB÷xƒÕ26Þí9&¯ €ú⤠¢Ø1Ï„ÀZTY†Rïéd„FîÄ÷)¶yM$:zo›@ž}ö$¾ÿØ÷ÃkÙøWW/$ØáèÜ4söÜ9;zE™C€sgÏam}{ý‡¶ò0˜Ð8'aûï™ü¹ÎëC*ßÙ£sNžú(ýKz®Qµ"ªÌöŒ?þüm½?:¿ÏÕ{ë8)O?ÿ<ž|òGPÀ ª*¬o®#K°³ÑT6kê’L¹œí«ì•€É ‹ItŒV¢í¶Z° a™,J66g¥¦Y òßgº(Æ ˜ÌOøùS€zò<¨äE^¯yµ잫~‘§Uw2œéÔz°9Ï™—‘Éšƒ @téŒeCt©¨æ‡'Nž ½óº8‡Ó{y‰~#0†/Ý¿™ ˜ÉПŒr`4a°1`ÑÛáH€“ˆîêêjD¿ßc5ßÜØ@ÝXuõ„ s‰Z“— ·RÄ€® 0‹T`ç¹  ÉU.0&ÃÜ X6øÕs«¨ëUU³û?U°Öý$;D´n-+5 Ày^>« ⬡ËxyÔ¢ÐÎXUT° @K7`·ß5\WQÝÅà‚.À©S§@‹‹šT–<0XÇÎFêôyhs8Z›[XÀË^~m·s ––Q”~X•nR¿»ç  ºâÓ¤µ–Ù°G ´¾›ï-ŒA¿ßÇ•W^—¿âeØß>C£ª†õî’ìp,//ëjô‡=ñC_Y‹ƒ¯<ˆ×~ ßz ®Þ{MÐRíNêƒê,\GÏåLhmOØí÷”évÛ®½þ·â¦Ÿ~5®Ù{5žk‡;yÂ{ÿçIv®^ZúøÙÕó¿ôð‘o¾øõ‡Á‰“ÏÁ GÙë]6kc\K;#6娸»».Þ\Õ¨ÆOü>ô5<öƒ=@õð¶}ËËO%Ø%Ø·´ôo«ÏŸ:tüè‰_ýÚ׎|þ_¿ôàæÿ=¿» ?ô40+r ¿ËEµ‰îïù¾øÏ_:ö­o~÷ÞÏœ9|åÂüJëYžÃîBZìàÁƒ5€û„ÀéÓrÆüEKͬ+â v¶«æ˜§±ŠL9X½O·þ ƒc¶Îd˜<ü(¥P>ùäí >‚²Àå…´*ðÉâµ1(ezhÖÒ„SH¥ ¢€’Î}O~Р±5<V s¶Ï×àz@2F¿r•d2r—¦iF¸üàd¯wß~ïÉ•¥©ò¹<åEðžIÑ\ôh"ÊØœu}ÏK,ìÁX Îpn&à¼C]Õ øû¼Ä€™4¿¢elðÈ2NçÖctpbü£¦Á€[O¶2æÇß úÁJ€Ëßüæç/9rwžeÍŠ‚g­5-{ a.4"¦e<§œÆ¼ñ(ÆŠÁ¸sDƒBzÏßÛÙ¦>öäfâÔM E%|<Ùš'u|~K×R¿N-3YÜE‡(eBUMÄ cCc0PÅË'zïå»CPê ºãŽ?{ò;ßy຦ùÛ¹<¿­ >ËŽyŽÒ]($1£}#6“¦¤Ž€ø½ãf°éßq-sYèÒÊbD4hš¦ed9¯¸›…nŒÊk,Œ5py=¬c²ORÆ[§Q°¯B° ±î0숸´2‚·%×¥t-7Ï=Nô{7¯¬<ËioÀ¥7¼á¿?{ÿýoú…¥¥·^åýo÷ùå’7ñd`-qàsÙÅRZ..;ÈCÏD\òm CK/ÆçPÖ5Šª‚³NrÓ ÞÏ"`¹ `ÊÅâ"ʹ9N¹ž“ûþv ê˜|BAÔß/ÂÆ.îe ñÀà%S‘\7m:Ê9¾ŽÈ‰>}ʹOXYùæÍ¸Ü‘@ѺyÀ}ƒ–9²÷@U½åJ¢öysže,]™bÉë²Ý73†LʰC6fU nåccˆV»µ€Acn…M†Ù”ÉzüT@YrÙ‡†oÐäU†™Ò‡ôžéºRŒWŽÁÆÔmð^{w,À/œóþož޼~eeóf/3ÄõwÜqÀçê–_¿ÿþ«~ª,o^n_~¥4æÎ<Ëru¿…ÖA’iB×X^cŒq™M$âld-*ï$èyÌ&è,¼_-ßkàï•ÇF/uŠºK^êÑsÉF»•¡óy+‹Š„¢ÖÆÈ˜/ ŒùòYç¾½pìèq|üÃ÷ ®e¥`1R&7 ƒ9øÊhщy: À^C2ÿi# @B]ª«ZÖ¬QU#TÝqݲ±"Ò-`z6Œ½)"O`‚7 Þ…K‰@iMÀY!y oÎ9UlØyQ Ï3dY®C€Šx½=Oˆ…€œ º[®Ö“g9 2ˆ L ÉH¨*Àq+O`¨F˜¨ZÖ5{°M£‹‡º`AÏ%EÁB.Cò{Æx:Š0m$$HèË2â†àéâ&5Çj.kðkÖ²PxÈBœ€À0õ?]ŸPÎ Bq00üY©0e$HèQψ»hKm­ÇØøØŽNw†Æ€ÐøÙÐ5{0“ÒdšZÌ„_Ï Ö  !Ë ò¼>˜Øc!à:S»L(ŒfnÁ0Ÿ€3hÿ’$ôz=c²eQ (/Š@¦ãúœ À-¿GX„` Ï¥ µk™ Ì IxÃ^‰²ìX ‰ t«± h{žI²©)0a‹*"8 I¦ cP°ñ÷P%׋¢@–gá~ƒ-½Š€³.HR`Š7A[ü„ fV@B€ Èd'ã‹^@Á" ûcÔÕ—e¼$XÈ¥Š€Æ(­ˆ¨èL–Á#%%H˜:*TðÎi´>ç]‹ ”EÇ’… ÏUB@'þ„yý:‘ˆÂ BˆðЄÿKH0]˜ÚPg´áÔ_#;çEBÈ"ÀBH‚Ä e˜ @H (dÐ &%$H¨Ð46píÅ…7™AQt,yà d"Ø"÷ŸK Åúå?Ä`û§dþ3A€” Ìëñ¸´Mg-0ˆ$Q‡ Ÿ»‹ÀŹ-‰¦³ÑÇ^€2†1-åú ! @‚wNWæm4óÏBºÐŒ½œ…@É]‚¬w :ŠñG ‹0¾W=€„$ Ó»ý0œ,Ó‚-¬® Þœ´Ã­¿ˆ€zñ¬Á8ß? r©þÿŒR’$T2'ƒ§x€$ütt²Ä02‚,cª(·úà2žÌ€H0uTb•yn` ‚¡=6þH4õWÓzÅ#PO€)Â-Ä€Ëü!ÎI’x¢-‡õœçEB•"º<¡¨˜Ìp©³þ"DAœ ’$L6ËmúaeÅ`¡×‰@ñ&"Ðà` ŒA Ç, ˆtHO 4ÒÔ_!¬ V öâÚC ^E äâ„„´&à®Äòòò ý_óžn"Ð!ƒü *Ëò sÞ{Ž®ƒÀ(ŠB÷Úkš†]pH¿ºÈ 5Œº©Õ=60<]·CS7aæâôól$Ïìë`eC ôgo“ö0Æ]7Á0sž³Œ@.ø1³ÿ´‹/¯máHw↯ÿìW.}ÖdeQêõÖÚ`±‘Œç*ðçÜj\–z ßW¬Ì3®³ YÎMÐ{k%)Jн®ŸY7õ:Ïø–ü‰¼(Ÿ±Î?Z ª/¯­­Õˆ‘³²²‚Ë×]w]Y×õ[Ë2{sô62Ô7dÔ¥•‡lÈU ‚¹<À]½á%¶¼œã8†Z…ñËМ Jf@"&<l¹z µ€ˆ[h¾fssƒ âýï?ן9y‚ÏÅPƒÖÒ Wþ‰7 Ñ­ÃdñÐpÐúüü<ñЃauõöíÛ×­QþLþM 5þR—³"ªlÿYÞ^Ç÷\îAÀSzNaÀºEšvkd}„,¼N…°×/UXmÝœõŽ>oûûÕWÁå$û÷_óž…=‹Ëób¯LÕ|VyàÀýi°ñó8 ØÈ¹%²“×ÙÕ»cÛØîœ>Üe¯§Fc­ƒ1, šŒC†@N–Ö6€Wö#gCÑ]~Ùé 6Ì çÏãä³'ñÜÕ À:N<3F&D ¸ BýÞã8?× À<Ø `ðªW½’¿;ˆ[wxG`M4Ä“2®|ÿ¼‡hЧ³.ð™¤.ó½kX<¡âDÚƒEštK4A‡F›&ð J½GuU…‚ë÷­®®~ Œ$—‘áïß“—Ù_.îY|_k°š1GDêæv­{f ×ëºæÖՈ˽°g¡;§Ûp5mÙðõlüÁƒ¤.¯ôÍ!k †ÆŸÉB84ôçÕE€Œ\1ÌÖèã®»>ˆNNßZ&A\1NæææY¾ò•¯ÀYC‡Î(ä‹õ3õœÞs î°ˆ§Ñî‹ó>òBôûëð¦Q›ŸC¯,X¨=ñjÉú¹íkÚ­ªêZ»Ú!Bm]=lþÁÿ²w&Pv–e‚~ï÷­vÈÊ–°I:‡T%$!h+:¨D”MÅF›»iÇvlÜzPeUÁ¡UÑnPTP”nÑAlGQpO„€B BªRû– ™ï9ßë{îüçzsoòߪ¿âýê¼çû—[wù¿ïÝ·ÁCi€DÏÏZ(u~«£½óØt*wòº¸˜;L’Æm¼ŽÉ¦ 4„–­¶mÛ3òØc™XËë4ÖEù:{?â0¹ä’KdtlTþð‡h€4@L5Éår’Íæå^GúÙ#<Ã8õM”l6++V!]Ý]’Τ$¥Rkq75¢Âþ0夤ɉÉ;·oßq¦{Ù–pT*m{¹íØ\6ë|Ú‰âÒ<÷F´@8?¼:“Îzõo~³YÄêèèpj… ëvuuI{{»ýo5$®~ÝÆ~ÿŸUåáG~æŠûK˜¸V%4¸ú÷„£3N<ñDžÍ¼zCX»ááaž‹ Ê3Ï<#<òs~‹,[¶LŽ9æHI¦Súûª¨Ž0p™¤©L6óŠîƒ;/ž¸¡EðÈçÓë³ùÂYÅbÐQö üæ*šIÅÅo yjÛ6yð1tÉš5kä”SNañJ©!$Ó¬™açO>ù¤Ûà…9÷ö *ÿ—ioô„×<§1}}}ròÉ'Ë<ãîHF´Nß±c‡<ôÐCò“ŸüDüqyê©§díº>G¸Û”1øº ¤>¶{ƒ‘˼ÏûÜúÞì~ßH‹,БH¥¯,ŠX™áêFC‘ö\^M B> ÎoÙü;ùío+Ç{¬œ}öÙ²víZééé‘R©d.¸f ¸×MLàv5íøŽçßg5…÷PC[íÁwÔ¬Ã|!D›Ø\åÊ•aºÿþûåî»ï–ÿßû¥·o,Z|0Üß2*½‹4aèÔäTO6Ÿ¾|r|ú}-°ð‘M'“Ï/òéŒc{·S ¸Vw†ó ˯~õ+ã_pÁrüñǃøaNÏf‰|sã½ Ë÷—„x—r3Måµ÷Þ_]ºªzÀ±~V̆}?¤´ÎÎNb=¾hÑ"¹ýöÛåᇑӖyûîAÜÖï ðÏQmˆ8/‘X€ƒ°Ú¹Ÿ2èþ‚ÅY@Z!Ç‚yÜ0«üæÍ›åÈ#”‹.ºHz{{1tÕ™Ãçs=ƒøî€ $µGXpXŠˆ¹x¨ú<$ÎU ÕmãÆÂ¸á†äñ­Oà¶TOÏ]¡‚îïC¢I°‚ÁñŽA”œ1p¬ ¼ÀF*“8N$’èöˆ÷ ?‹ çTöHåÇJì Gýò’—¼ÄŒŽ‘B¡v“Ù¾¾ïPý=ëSü. 6Êfs²hÕuŽø±'ö¼Ê岬Zµ [Žs™þAí Ë}Èd³V7qvfw"Ï-Y,fOhå,¼RŸà„7ßuðÄÃ×8ù'''¥X,ʦM›°øÛƉ~Ž„˜X}?€ ¢lÄÏV ? #?ÿh’Àdß)îD€u]·nú=ßC l™ …à+fžªb¤6µÀ¤¹ž˜Ï0ö± ˆónQ}þû¬G~€sîaT#`ȹùz@šH:¿s%ªÁΫé¬d3•á‘ŠÜ 6ï' Yû„“ }§xÖ™€%¾çäÔ” ÒTÐhD"E|NC._À8|r‹,¬(\N&ÓÇà@#¥|ŽÿÙäâ‚XPsÇ×e3é¿Èi¸–®`õ‡úÊ GäxxxD–/‡dƳHEýÆÁÊ|›>ˆß¿½_ô‹z5.¤ˆS€û+!`Ne¸ð:ë(¬ó>ŸéËI؆Í‹ WB`‚Hz“¨ê&áÊ ÎÔ)ž¿‡g^þÞ¾·ºEÈøÖ·¾•‚”3æ äaCbä±ä6.1Dâ˜L2"ÿ–.]7 ù”ùùùC|Ü–ûŸ7ÈåïøoV”ÿ@•«§€´½—˜×y ÀÿØÜ xäU÷/·|^Þûß? #££'!ä(×ÃÀãf>ÏÂ0ëÀ*†´PPŽØyÖüȿҊ÷¿KÎ<ç<¹õË·ù~~â«ö2+¢™tSÙ1W%Î*%+Z?hã¾ÿø9÷õo[ný"ï!ˆ¥ZB€ €ØOŠ"ÞN俯¦{ûP6Çs<‰kñ$-^˜„Óÿׂ'{P f°ö+÷JK¾P° agÓ"²Aö“ßT× ß),òÿæ·›å¿z‹üÓ?$ĺÛ÷ ,7r¸ã/Ýx@Ô@ò´$A|ƒ 3×+ИJ€ù<Ü+€,»Ï|î_äü ß$?úñý VjÖœï_)ö[y5µ-èmDé4 o"ÐRÀ† –RÑÇq6n.[õ[ìØ8'+¤’îîn|Ũ a n"5ב+?t•Cþ‹åW¿þu5¥Ö÷ö÷)ÆI à73û‡4€”‡dŠ{úZæ½ âS žéï—+Þ÷~¹üÞÉq¥}`ÞÕT=>=5Å÷PuEë ¨JÀàY”Ê%žÕ¡'tÒò?'",Pî䊹 Å<ˆ®2f ±Øˆžãˆxv}ttÄéÿKÕ˜!½èyóìa®ÏuÄüW½ö¹ó›ß¬ÉÇF®4`Ì€¾§YíÑõ+‡¦Ý±ƒTπεÀ·G©ñÝxðgòú7½Y>ñÉOñ=«©À\{ðóá—ϯðxf¡{‰àJöAV©MÜüs!ÁCþ8ë÷:JUa‡ûkĺ½UõÁÈà¤W`&¤÷zÞ°] 6„ßà§>(g¿î¹þc—q÷½j-Ý¥qI€÷3¿=ç*YpçT `漑x³0× þ—oÿŠœíì÷üï{‘æÓ>`1!¤uŒŒbôc•ý^Q7  õ ñ"ù`²dâGZ*@B!2é”3–ÐAt®È‚úVß×¢Ùˆ#Ã#f¬Îý£W ˆ¿}û³òŽw]!o½ômòØÖ­õVÇhï$WnüÔ§ñïK#C¿n@sÇ%5±Å€©¸=˜½ÁædU!º$ÂåCÏÙÿ÷{îqjÁrû_ùçÒ[`W Õ†ÔĦ,©âœù Q(…H¡&;z:6Pˆ‡ÐR Wh[‡/·X(øy«Q/p-.iqáÜ“þþ~Ío·jA¯«Dôêçõ¹ Ãn¾ÇŸø½üõeosÁ<ï”mO?½Ÿ-Â!¢«èŸt„Z~qÍCu‘>  6TF Éê‘€ZÏtŸÇÄĤÜpã?Ëý•<ôÈÏç,šP=p~¾C%a0‚³@˜uO³ì©RQr™Ì‰- žÆ? ȦÓëˆÿ' Ðwxdžž™ö¥·½ó•ÀtØþþí²dÉ‚@¸VûGbÐ9¯sƽלw>~rÙ¯¡' ãîÊé“zn.A òZed_‚Y= ÉÚX$àþcÂ\y³¿w.Ãw½÷}2¸s(M9à=É äsðT¦3Ø/N²òU‡a*•ÊØˆÔ"Ð’! ™Îdו'‡Z#¹ÆPr²¼¬)EÆg™T0¸s ˆÄ.p×7ï–Wœy–Üüù/xÛDC €T–̨J`ç@ºx0ÕÁ®Uý ?QÖúÁ䂈Þ(7ýëÍ0 ®…gÒi¢JQ…NpÉD™òÇ@ hÙç×uû%³º»» ½ñÎ!ø$~j[*¸<\…ÎÍ‘ȈŽU€Ú®Â_þú×Î~‘¼ûýÿ$ƒƒÝÐb¦p)ÏÂóÌIŽ“f´sÀüù+pμ7àuF ¢e„¬Dò¼ /”ï:Ibx‹ã˜kp|ƒtI}M-&Z‰;°tćגbèþ;üðÃË9 ïhïÀr-S“Ó>ùGëÿcàCtU•€{ )iÀDI­è¸?!»„îžÿ†7Ê#?ÿ…D<¬eÙsnÃRØÒŠƒz°Ößfä0Noƒv¬ç¼®ŽHÀæò ʯºFþÎÙIp‹6+$µ ‰È?ã"CżB@”w%ïš%®û„ƒÂÆ?Z@î? (” k‹Etµ"Ö[ãkÇsFÜ‚¾°gÂqþ)®›NŽ8¾dI¥ðÇæ™Öéܪrα„ÎFÝú˜œ´iP© ìoÏCº}ü¸sßú[c¼ØjóåMÚ\ÓßÅkûëþXïé1àÎþTuâÊïaó¾+Þ…jÀ÷¨§´9£îûÛŸ}d%b/RC ž€q\ä‹`ñgíu­@xƒP&¦&P‰„Q`üTÈþ´§EæÑý8æß§†jü£÷›¯œñÆCÆÑÑQâÿAH=ŒªD@& k{ûÌî £ò¼á2àaãâ§?s“L€üü&«ÓŸ¬x<úy¶CÁ9©z¼'tâPT”!WèëíåY«dµgJž×$K؈(gMMù9؉”žs¨HÉ·¤ÜÖ†GÀ»=ßgW¡žGRmˆ¤ µÅ½i@‰‚ææ 0@űYù+;ÖsÀU±ºj tã-ÒÂõÀ¶@µ`ÖuűîÐÔР1¼,H‰äNà.v†æe®ßÀ²– &À¹tJŽ¢U.µ!¢ì …ÿLî¦õÇfÆÀ  Rƒ"c;@ø\¢v64ëà÷pUË€ëg†÷¤I(çNVÌI5êqeJ±Þ$@=xT¸]’TóC‚qï‘:2<Š„G܃G~mϾá¹2C$KÅ¢äsYik+nˆ‘ e\ºtÑñŽÛíp|' ÏZbhŸýË–ã„öQšT•ûW?÷» ž÷઒ç|¶£vÚõR´8`†?››+€gUج™—ÑO›œ¢A1–R@E4_„窋Æïµ†¨dfrùõ!ÐrΡ0D{ na Å2:(”\å_­&œª3NôÂP­g5ˆBU t?²¬Â*ˆ¾¿;ìú«pÏ÷*çàÿ­¹môz-à5ö ¥µšÖ'¡ÙÅAÆÇ&$™IYpêŒW ü`F@j,–È4ÕÔàxÄ´lŽƒ÷•Ûˈhf“eA~ÍXÓ¤ <ÈAûogç¾ãKŒ„T€*ç׿þ×Çýª6~ƒß°Ìá׿Ÿ½—T¨æÔc›¹^;(ääõ Mû$45'€p`ÿ×(@Ñ0g¼iìùÔ žäóœ= REça´là¬Ï½í’/´Cì.ŒdÞ%åc,"«§ðÎ808€(==Ý„áþªÛôõdª‰"²ra…¨Ï6®œEg… Rêÿy/+°Òôb©Ñç¨'` ±ßgŠ*ö3ð00(SE˜AD`&›N.[¶xílŠÐÅñ÷d²™å9DF À­ƒÌ|ôî;¼uparj’õ•ÁB0²¹öÊ™é# ÑØؔ¡¶·©.¦›˜¯Ç ±9Ál`*Çõªb€'sÐ-r€Oœ^ׄ˜•&Q üž¢‘(Lƒ‚³Ùlnƒ¹¡@) X(@m}ù\Á¹tz؈äpCÑ ¯àXxxñ”†ÿr²sÈô«l[ˆÀU]ÜN¬P‹[Û}{}Åõêïa¯¯¨¯«·ˆÄÕü–h‘zpš+Pk æ @:€8ÐF5³­ÜF³<0í©”ÈåòkX¶¶2!±”Ѩ¯ ¼…_¼Ñû¢Ñk#Ãòê¸ã*‹€„%йÖØù¾ qQªœóù:7±sf ¨t[z\O0¾O­6à5 ¢‚=7‚&8Íy—ä(… ìÔ'_¨…cˆ,ÉA, Œ…ßÈëÛÚÛQÖ:u åú 욟ˆÀ– 2¹ìÚöŽvÁ:Kh/¢¿Ç_ÏMX¼Y‹`0ìP¢Š`DcÜ?®B n¸¬¸½ËÙ;0\‘Ü4U'П+ìý™§gLïO§“ JC¢DsTv̹ڃˆ®Ä}¬"¶¤ˆ‚ØC¥Å‹{ŽkÙæQ r™Üš®®n2ýdbrÂ!û.ëõ5WÎþAk¿SÊ©K°Ô0ÎEjˆªÚLKz•XuŸP{Â\þôýj×§§&‡Ñ‰ù|8d3[¤5˜'`|‚øÑP÷gX=‹õõ%æ‘f¥P,H>Ÿ“\¡tÀÆ Áè:½æD²În§ÃQÙ–¶ÏlJa‚è,à$^‘EE¾ÏÂùé ¨…t5âÙíLÏ›B"<$Qß›Ò YlH¦ö¦xva¨þÚiæˆªË pÜl/ÀÞ`Æc]gBɽ{U×ÂÀÀÎ1î˜ †ãb¡H8ùÆjñ-м P €|[éø ·g¼×rþÕ­ã]V =GÏ>;@€ Å ½>"îßüb8>a…+§g”cOMÎ LOðlQ?x´xÂqó:ïƒ'À—‡åw`+2¢žÑjÒ˜MMLB,a"‚Úé\˃ςx½Ù&'EØ|"€…oŸDŸƒ :O[Uò!|”ã6̘Z éÜ@5ËüEOw Âà ‰þ㸂Â'P À%¤8•óì´:€µãø· Ô°Dæ@ôÖ+D=‚Œ† &ŸÁ94ÙK\:b¡ (4XhÒú58©ÆgjÙpÑg¯Dh0KñYÜóØŠœäuŒÓÁòÝ=.Ÿ?Ÿ“gwôƒ pxô~M€ô5þ´:€ê`á+ýñŠpõûçÃçÊÝ9‰´Ú\)«ôÈÈV¦Õ5ØôTZÕ‡‘ˆ¥Ÿ˜ùñ Ôƒt5Ÿa3çz ÷ßÿcÉgóB‘€üVõX”0à Ä B=‰r©(ÙL&l< „1Ísÿr}´nîêì´¦ ¿qÇ„ H¤±ÜÔêD¼Cä#B°qNW!œ—MKT¶dÊs¬¹øc0)Çw X&*@d¢~ôvƒº%-‰î‘_×RTM@š„ØŒŽâu"1#¢&µls*àÿo+—5¶î£0dÿynh î+DUE@°úâÀmÐN  ²jC^@²)—Û@>bÐW­¸GÁZŠ¥Sú+H©\FFµšwQmfà>ÁNäYIû­Ü×ì>—„}$É ì F@²­«m®ƒZ6g]ÛÙÙ ò:0!À&Â'àŒˆrج00::†øOௌªÄ—ž×0FSmÈ$ôð§¶=%O<ñ¸<úèïd˖Ͳyóoç¶lÞ,¿{t‹<þøãòÔSOšû¬ÒÅn{¨ ‰;yhhR’ ß-ŸËá àX3Mw;Isƒ ”ÛʾPh*{À%qnâ¸^ÁéýÇtõøšnèÁ•5éàŽˆ«ˆq,šFÊ#òã T=‚TÞù !žU€ˆ$³pl}þ“M>‡Ï$ÄÁSSˆšE,')`xçI;pÿÀ×@Ä hITØšˆ€ùœ;ƒRq–\öÖê|6›ìq 46>ªºÿoÙ×6¥åÌIôµ`ß«þr½±°®ïc6Ô˜8 °KN^jƼï£úš„ >ö;2!ù\3‰ †"#ðîA¤ƒb¹ñ]«8sÀ$q.V(ø b©`i¸=žÊ¶fP®©¹Xvñ, ã\d®Âìp ²¾5@w¥Ê’`±kAvK B÷ÇÀŒ¤Ã“G%Ð~оd8R€û½H]N £cÐòå‹ç*1¨eÈds}p¿b±„þ LÒYJ€§áDÚ17Qœe¦  xûÇÏq#*A¸w$Õ†tìR €èµ€©VR¬qÿ/çÕæf#؈àìtH& QŸÏ5ƒ``ôd½!–öáÙ«Ph*Î6€L:Õ‡îI…Öi-þA;«™Y ”¨h†‘Îäl¡ŸÞö´Û°nÑJÚ$Rÿ<çU;°ûÕ Pa]T*Ϫ[Ð  TD)°ÔÛü£ž×q¬À3D’‹:ÎÀ<¼7cÙlÊý.ˆÈ¿G¥„´¹•§¦|Õ©R±L<€drÙpÇ YȪ@Wäwˆß•ÊdëìèÄ….¦ÑqXggŒ]b°Ñ~€šá5íb½(ª­À%rÿ¼"iEQͤÍác=7Ü×Þôzˆ A@x°ÂÇF†G4Tv·uóe°»è €hÌásfi­r®|}¥tuœµ '/`xhˆ,K¿Ž¬MÐ^Ž´gŽ5:p7ª˜8s´c*]’M771¨%(8ÐK€OgWú˜ LÀɈ3Üd“à£VNmý‡\Ý·£Ž:šÍUÓgܸºqŽ©jô ÇwÞu§ îàW™y“øŽ­ý¶"¸ «Ó'*a0á{v@ >hRT)TñÄ¿!D‘ {~_ùÚm(ÇÕï­ßÙGÖ\3BZ{äÅö,Üцu'Ê¡‡µqÀ£D–(I‰Ùµ[P†bѤú}ðƸ}Ø-]ݨK±|ûöí[;@*†ÀÈä2kp}ÑÏÅC˜˜ÇPã7b€K'mz¹oæï Œàyláë)ñ" 5U€¿|Á©rË>ç2Ǧ 9”#¢C2{¿²rÊ A71N¨ìý/Ú ’f't¨ûŒŒ Û{Çh¸ï7KFJiùïºÛ@Kjù™ßÕè@Ü>~uŸvèá¶v†C„Ͱ}{?R„K2)¯û³À>÷Á×™ä Ƕ·uP$T2ù v€Ç›Ó8´ €²½èÿ®¿±ñq_#ßÂ3Æ[àüÏi‹ppuxxÄbÍHåu ¹øÍí6k¯uË€€@½Èdô„à8܇ßÍb†ˆ˜´µµÇT¢òªLØÀEáŽ=œóš×ËÆõ›8kZH1¿£´˜¬38cÄž áÒuñq>ÇÄw ¢+u.¬D?Z6§×÷uuu •€'<£¡›*ªUôª›–Ý\×ÒàäÐscÉ’Å OSóûsOþOÏ—7¾þÍŽð˜Î‚@ÁYšCÑ×ë`fŒ9kõï¶l‰줢.Àýnan,HigåáGË›ßøVÇeÛ›™mh* btdD'ÌÚÍücAAHqYug¼€¢´Î¶ô§ƒ-MÐeŽJ÷t8K~&—’‘1 ¢H–óç·Ù4z‘s|ÿ@F#qüº !JpÇ·^|©¬8ì(Ä_vZ™CBà9Œuö1ŒëÌ´©–ƒ  F#Lb1fÓŸ¸V'òïÞ#¯>ãyá_¾8\Á¸i³EÏ÷ªR™ƒÙ™]Œú†›ßŠ1ïG!‡JÊžÌ>Ïr+8ú`-dûrù<::¿¯¸k·×³©æ*¾H&Ü~vb!Y¸ÁA·¸‹ólÑCH}Õ_5„ú¢—È/5…<*陟ìÕÌ4–©M) 33ñôê˜Añ…aÈ_/ïgý–,>D.¹ømÄkc®²Ù+Ä5Àù C"CˆšƒÆçÏëP*µXÈ,1(>Á,—O:BqbPK0È¥s½ø¾‹…<…T‡ ³x@ ˆ‚eˆØy婢¦§ò‚Ì=®nÁE^,m]ÎÏ !à†¾Ê ëJ‹¡l··øƒìFœ ô+Àó„Ø~·Ÿzuú^~ÚòÊ—a†Â¹Ì„«ƒüxwòXaóÔÀ|´Rˆo=a0Žp™Î¦ˆÄ T,K€å³}„c˜!‹ðÓt…1fÚ×qWæêã@ß l§lX¿^ €UGDE>ª» 9æ}OéËdÛÓÛä–[n–Ƕ>ª†=±Ù†¦5ëÌ{XçšÉ‰iÊXËÀމÃÀNhõ7ï¼[$0ʾ/çn²ãð€³¾äÅ/•Wq¦y?æºÁHØ8¸cBŒ qƾÄ÷Ô&3Óöz˜ŽÊ*H[{ªYõÄ V $Ã`©l:}<•€)„I­6 ÎSwŸC1Ù:w¡ˆ"%õFGG­X=£f7 ãüu» 9Öñœ,uIÿëÛß!wÿÛ¿É-Ÿ¿=²ñ‡Cp ‘€1DÏmß±CG~„\véÛÄ•xñtoF_mˆý¤øÀƒ?áõzÒrG H;Ücó¹,3e©(NJmBbPKœnv”£´Er¶Y¤i-Ê€†ÎÏ¢¨TŽXjH755C¥Dk(»Þ«=šÜ ÈŠ“ü—ÓO—뮹NV®XHùç¨1Žã¿J>ü¡«äÐC­DÜù,,Š£ð6€À{eÐû}ÃÔj Ç𤯡2³ª” ÏeK===«Z6€ˆK€9¤ï¥ÈG©T†ïhBÜ?ˆÕßúãù›T#4˜ÍF'`+ýŒ¸ÖèhVëp› $8ïÜóL—ÖxÀ£ÒXˆ1öª_-çŸ÷:kÍ“¬A¾¯e"‘tæC€“¸ü°X`öìì?º)Üʨ¨™Ô‚O JÅ®`&µñ¿T*HÂ?toñ§•7¨Ö‹mþžo 184äõ`ü¼,tt¢eíb=¯BÌðúîYg½FÖ­['×\w­lݺU&µìö0@‹áùË^!]tM5ö'Ç¿iv¾+}IN0 îqLÂÙž$Ÿ­MfÜ9mf÷ѧR,”p²Ï0~r!'±+–É­%ú¯­Üî7Ò¬arÒ7mTlJgR¶9Òü|;à´æh|ÔÎï¢ ïuÄ+äcù¸¼Æ5ŽÀoëîê–}ðÃréß\*¹l."Q?ú*C*¸¾ã©…4‰¤É¡rêý¼¤Òiß î¯Û”ýIÃ\¾°q¡'1+–KgÒÏ£“¶ÇÚ@ ¥ ö1¤¤F3,ìèˆnLÿ—¹t@‚¹ð ÊG¯¿Þùו¶àáÔž*7}æ&YÛ·Vq-¢®@óàe!&c³fiâ Äód¥Ø! wìöö²øFµ¹¥NrˆªcPKHçÓ«Ü¢¤¡ÊˆŽDj¡Ÿ±XšÄ¡bœ`ñ7ÿ-QmdtÌb¢ÍlÆ{{ìqòÏ7~R^ùŠWâÝÀú À‘øM±ýŽÔ]¸òÊÈW¼ÛM4;ÍŸìØ±ÏÜJÊ!½`@ ÇH¤SfŽe)BœI.èŽA©¸”²Él_©\äáZÈ®"¿‰™3ؼ+Ð 8°PD ² ¼6‚•«p¯©Å Õe—]&'t’\ùÁHÿ3Zÿ Þƒçÿüç¿@þñ]ÿ(]]û¤³ëhN-À:\¨Œ?üá-•›ÑO›Î²|ZkB|} ÷:Î9.·ãÌ`¸}ÿ‘¿å ðÇpö9où‡Ã'5+ B`$ Òsþ‹900ÀÂ9ÃNW#€ywV†÷õõÉ-ÿz³œöŸOã·Å ù‚¼çŠ÷ÈG®ûz¬kÖr"1j 9\~T_¢F ¢¾÷Ô$=÷§öÌG›Õ°çö/1¨e0ÜCî#þ?É‚ä&þó°ÕºŒ¡F+¸$X(Ëùß±ctkp’ØÚŒÀ@ÄÞýî+䪫®ÆÝË\Õí·}EÎpþýx‹úµg˜ ê&LdppHJ…’g{(É>kBS^%àuü~î±NT"v`A'q1:jÜîŒ*+Ð'ó9O¸S,ª6™D"Ðl-ÿlÁY€¾@:zи]…º“`:åä“åË_ºÍyAlŒ|¬ÃÛÿþíò™OßijF¬Û„Õž8>î@ʃQí—¬Ö=´8/X ñ]¨¥‘(X›t{wÝ~&µ$€\.½Æé ¬ÿañÇçª-¿ÉÓÖÂI8?©©XÒ0ŒY€æ¶‘n@ï½PX%@¸úê«íJ)–J„áÎ<ïyÇÉm·Ý.\pA¨ÂoQ¿FRÕܹÓâ1P´h e¶Ïf*r2é´ôÔCT ’Ä‚M âÒ •Ê_¶X.ûøk(HataàŽµ»K.Ë"yÿ¬™ #MMò „ÏýŒ4púé§ÉW¾r»l:ñD¬îs |‡K.¹D¾ô¥/ÊÊ•+«-}5¹u\gÍ  ’´Egj‘$Lµ1–}ª iÔ¢„(ûré…Ü~t jIs&—YÛî8^1Ÿ§ ‹ÖÍ NˆŸV}O§ÒS|ÃÝÔb¨4WÀœ¶ƒäÒŒo¼ñFyϻߋ>:'"? <·}ùv‚zpUo”zÑò4ßèïßn…\5ü×R d`MCx ÷ BÝžÅ؇Gm?\-€ÛԽр퀻yøpzQŒ㾕§æxÈYq¹N.>õÝæhDTm¨.»€y?^ûÚ³äë_ÿ†¸¦ùøœ /¼Pîºë²zõ_4Ú>=:m¾½À±âC„ûmŸá Ô}f*‰C öc» .¹Ñ@bP‹„€–8¿êâƒî‘R¹$õyðøÂQ¬]5”—sѦ»[Ô«w†œB;mqç‡4ÕUhÒÀ²eË][äÞùN’¢"Õõ;d¸õÖ[]PψÇûØ>…à´F! šÏ’î«5 6³JÂj0ôêgà“¹pQ··•) ‡´° ƒ‚y.élº· %Àÿyð$ùü%/nj‰­lOÅµÑ ý?kWaeƒÒ‹Þô&¹ëÎ;eÕªU‘pþ³Î:K¾óíoˆ ù̽öJ¬£wbÜ]ƒˆò–AºsçÙ–H ¢ Ù´JPB<òàðF‹eÇ|ˆÈ…ã-ÀÞ²ÿ˜³él/¢T¹­:xΟåð<ü¬ÓL$<ò‹¿Îâ@ä h”ú Bˆ÷Š„ˆêGu”|íŽ;äoßö·<Ð}ÊÙ'ŠïsŸýœ\Ýõp¹?£P/÷—ðy¬]ƒZ%Ø÷ èï7±Ÿ¡ƒ*Uö÷íÿ ÅzùñéÏŽ ‡‹»kkJ1ÜD2¯@u9¦\µuŽÁh KpC®ÂªH€8^~ùßÉ7¾ñ Yyä‘ ‰ü§vº|ï{÷É‹_|*ϽidžìÑ.ägžy†rž©µN€!¿Í[ÐÑÑålOÝìÝ¥NX¶Ðƒ‚” r¹üñ”GŸÕ"sñ ùìgo"¢-"eAسålÛö41%Þ`ðÃà÷‚xnÂ=ñÈOxp¡¤X*²ÿ64˜Ô’œñd…{pm%‡ì9ŸÄãE{µÖüŒOʰ:úÔk'[:îCƒCèf®ÂëÁÌ×ѬjCádlæ÷¿ÿýrç_§þ^U]ÿ”SN‘üàÿÈ«_}–!g•ïÓ€×"»Àü…[0@Â7hõÞàGì?i4è’i–ý†û5”¨@þgÁu b`ìËó¤‘Rw«ˆýZ›Œ JX3P÷ ­¤öàà Z6Y_ù…A$¤«Ž„ÀÆåûßÿ>‘{†øHH×^{ÜqÇWÙð&òGPø¤‰®ÂæÛ ØOØð,ŽŽ¨qÏÂÌ)LË1ÒS„g©¶€€tõtáÁ:±ÁÄ – Iez©²J0Á?èñøW¡¼>ôRìáþË}mÂ@UŠùhfµ!Ö¨„MüÑ~D¾úÕ¯ÊK_úR¸>eºš¸´ÐTšNR”ùÚÞ¿£DU€sÓ÷=a(rLB¯¬}–:R,Ž‘ƒZ€*@}¸`ò¹K€¥ÓÉ^¨.¢"X ^ìJˆ§Âšp¡Ö§+ò¸8¿÷ yòÉ'e|||¡ØèáÍ•FâoÀï?44#Áˆk™ý§ (åËÌÞ ¨žÚò½ÒV€4ÚÝÓƒç`m}‰A­HÀ ÎöQŒ`uždcàjõ”·P°B Ô ô‡aà:sGg›üò—¿”‰‰ –] a$Ü?¥ò=£wFïdìtµî¿ÿ~9ÿuçÉÄä$÷@xìQèýã!ݨ^-…Ó›­• G³Ñžn®Ѩ‘Ô²8×] @ÅB -f5Ùÿ¡ÂPd^®í›ká´[U‚¾µ½rïwï•Í›· ÆI F\« éyƒvT”h¥‘滑8~øa>SY~_$pëÁlP Þð¬¨H¬ìUÔUþ‰JTt†¡-¤Ä `¾Ò”œÿôȃ\U*…S.Ó™4Ç2«¡Á*úa0•@©õºõ½r— …ݲe ‰ñWšWm(@bà*ln1̆*R¿øÅ/ä~*§žú"ÒÏmŸ9æd^'8<ûL;RQsڼ㭂X -SA»1â6îù[€í×ä ùËiBÛf³0äZÓ†:¡x—gäóോRa+¤§»GNØÐ+ßþÎ=rß}ß•§Ÿ~iÀ8Úoh.'žÅžAQ€ö~0ˆ'žxB¾óïÈÀÀ9÷¼s5½\6áwŸ(“IšJp Éý@"@€ hD`ü‚RóỦIkðŸÂ類jt!íR 3 ß‘%`áÄÂ/‘¦&ÈÓö‹’p7³ùœQè+Ãrë¿ kûÖãDÁutS,˜Á÷­qî ¤ÕÏýA}çágbçöúf~¦ž×ó›Aâºg8=R$ q;Ñïÿ{g4“õë×cc¢€µ›O¦°úç!_x´ M]"Í FgŽ%«ÄÇŒPÈ“´Ü1 ­q—Ró%ÔÖÞÆÃæAr•‡há¼,”Gþ Ô¬ÁÙ ö ª Däæ|‹pŒ€’ 5SVõÿØ;—IŽ* Gf]zÜVÌXØÈ^!, 7<‚wÁ£°ã]Ì ™½€1 ðÚH0,½`òUb¦«z¦«:“øôǧ¥š™Ý0hÜ­TgWTDžŒˆóŸsþ¸½S.ËßþþWV –‹ÝådNL|ǼƒÎºÍ ½ˆÎcšãÅ2Ç--y _ägÿ|ÊTÝÁ™Òðâ|‹·¬#{%íL»Xç(]?>ìüçjPò˜æ³ M>i‹È מ÷b /#Nçç?)*²Êßoúaû¼ãLû®âæóŒÝþ9Lc!„ t`ƒÊÆ øÇÂðÍ/3ˆ„#WߣÍ|–Êͳz×å‚`ä@Ò(ò¼Qpò5e˜™¦LghÖ¸pK (^B¨K6)I îsà°‘2’ÞÈ$]ÍÑza7dåv!“ž¸wo²‘Ï:dÕ P(ÙöŠ2!ZÉÛj§ßίWpˆ­ÈÖö PË™±‰òÍ%JRéanrÓVPeWëö©VÖ‘¶ßç¼GÛ—¹ô*Ó~·ë|å.O´Ë—9ÒQ:”ŸˆåmC9$ÞYE®y1 †˜+¼I¾Zó=*®ûŸªŒg¸÷ÁbÒø¾ž‰ÀPß÷ è}ºq¨ÀÅ*Kˆ@äþiݧâ·ß€·Ïüöödûö½{÷h,WV9ƒ¬µsÆfý¯RñXºÕ¦qcOÆpñyÇÅ9xŠ—HäY-t ¼5£Ä~UŽMé(/“Žy@‰Ç~G"NÉ.ÅK:©“D“X°£:5FJä@ù£ä‘Јõ²â°’™E>:›µ~¤Ê€U›&d0B¦®yþ@6å'm 0Dñ¨?‡¿—|”6ÀºQb”(õθHÚÌ=áÛJOgæ8t€Co ^'1£üû*#ŸÈHÊ ÖŽõG¡kž;¾ëŒò£”I>Ùñ>Hc©8` é”Óöú RœGáÀûË=ßm“Ñ 8£jOá ¨_FÞxó ¼ÿ‹ƒÖÏ!þ_¸ÿÔå꜆`öß+§¢uÜ8V^ùSAB`ÀÒ¤Ñ)¡¬:®k 0ºW£\Á\C<‰4pÍ)W"`à~µîj±^ü†xœæÙCI×…ïÓq/÷ÙFŠ4ÝP¶“¦L@Åm¾±†º¹¤lP¢XÐËÇÙ5ßQù·t6dŽEú[ï/ ß|‚E.CÉiEY<§¤³£Xãz­ë÷y¾ŠÀ•!ØýÅi  këm*HÒé>£\óÑžx+ZkÞÙ-·Û]ò>õ’8p™³­û±$ Ù\ñãá˜á!»Þ÷|N_qØ×<Ô1åpª´u œ¸Ä\o‘çõ§3Ó4åÐË但[B‚Û¹ö|û­·Å…A_¿ÐüÒ»ï¾û<À­ÅÃF¯k…ÿúüüÇ¿úù/~V~TwŪH¬%QÁT¾!Š'W` wq±C¹_ìHçÍç3!g ¦ ‰tîæÒŽ”……åó€S·D–ÎÞÇéä/ ÂÝ{OÕá9¤9ÚƒuÇká²×ò¸/áç=€á™”„ .â½øKd%‹‚-°þ`¹0è sÞAÁ‰‘uiÈ¥…JH@ƒÅe,*Ý©JDž+<£Y¹‚kcû~^A‹‹\[=¹#Q€¡Ÿz` ߬8€%'N0´mÌ(ÀÍ%Oà ²­9ïÖo2Áë$ùˆ’çx4”I`à¢`sÁJÒ‘ñt$øÈC ×ôx7E¹Œµq­Q:¾k¸’X/"ÀgpM~Ô3÷È lÔµr ¦užN€!@㲨È(ß§ žOÝ‘‡Ð@`€T€üD¾û¨t=¨õÀ€GØ–eÞíwôåó Vþ ™Ý)ø¬…}W†&ÎÿÇ8†BWàñ$Ò /^}ÑÏŸŒ·«"cÑ–¥0Í$_rºÛnæ » c™Øm(¨^ojá7kb‘å*ÃlAŽ'1®(@Þ”çF¤’ˆ°æ³{$&¤ss/£žÎò‘2Óò+yF™ÈîÁÈ„9–mdç…/(s”ÜNŸýòN/ñBAÚ¡äŒRhYÉùŠk_AK%&- —›|ë_òÉì‡k¹ž§GVÀ "WIðÆôzv= Q…ßGv}îHê{2Öö(0ð7À@h`@nú ό첣X€~¡GcÜï;Ûsñ¹«5@·°ÿÔ=÷Wñ$)ï΋¾Gàú9n6ÊTv{TÁN´S÷£4ì2$ˆ%||0„±v˜ÐF–ôÛKúDÒŠ$b¦g`j…+—ütj‡Øè4á "ƒÖ‰4râIàèN’~`ÐíïdÌ× äõ{†%Üݱ¬[\êþôÆý 2  ëIfÎ yŠàeÏógGRwÔABšFÙfÜVJäеõàĽV|ÆÑ¸È!ΆÙÑ µÆÂSÚEæ -\˜Uü ë5²7£Î°î¢ä»žÏ¨Àÿ*¥Ä‚Ï…bHÀ;Q¤ÙS[¿Èž‹Ë=äðá%Wàü•tÕyû¢o2þ/v®}¸ª5ì¤É»……_†Oã T.‡¹<Úk¨’p2ËU†IãsÙq8ž+X¬AHGyì§ÙÌ„ÿ t Q”p¥ã âQÈgî8\é„%C-”À`‰e›b‘»`,’¦«žþÈø;€nu›»€õŒÒ]뇩Õ'|Xê„%±È-ßÑeŠ2 »‹n»ÞePçž·‡„vYþ ×? Ù¸‚ÔÄÇHaíQp‡á!#”×…¶%!íAx¦'į£)á v†’Ë!£ØÈ/W@YK®€Ï9¬æ°0|ƒ×ËÊX«Ãõa¨ÃOZ–Oe¿39çºwýûvrϼZ‚.ñ¥ŠŒ+¾öÄ×'ä‰ò7@ǹ>0žßsk¹ID.˜v†Û'ÜC·š ùP$îÃø÷\À08D×m|z’ï…+P9¬­®ÊŒ P?lZa!0ÊTÅjJ"O€•¦,üç"æWqw5 «kœ“.ŸȤ>ȇËpïªÈºÖ`–µCŽ›QFK1Iž’IEÈ!)é~È0°N_ô¶xÏ.$H=$$˜ G†%È,0ü×ÀѤx´}ˆbö³´}[H@½êÈÀÖþþ"‡ãó¶þ„Ìùâó/pfQ’&™·[×ÿ£Ï†›`¸m•!nºÀ€Ë(0 žI`XßΨ¨÷.<²<âjÒ$£¼·pžI/hÈ(Gw–ý¶Yx”Y>€«ç °†x³\ÁvË,¾ÆDáW'p4 Ųò#0L×<®LØÂꆼãUÊL]3Ü'0¤LC Òâ…tSŽ{®à #õÐMö‘+HÛó½ëx ‰Ç¥Aøu\Áì5#0tI{pÜ€#)yV¸¾W g–éÝ3‡8 .<ÖƒVÖ|Oëÿì…A/C°¨ŒýëŸ4ì°*S󜘰Ÿó>ŠçhXk‡Ä=`‹¢¨YȃŠ0` U~<aoH ‚3ŒjH€Ç0YŽáNÞ)À°“èä’ÀË”ÝÝ…ÞrHúÑîÔ“Šœ„Á<)Oä ç=Ȳ Y„xÜQŽóË„°üÝ܇€¡óM —9›âþýjþÓŠr$íï*ÿâ*/«°±X³ÿÁ‡ðoÝÚû;å{ßý~ýûfmÌÄâ·„2±O†§s¤én¯ä F¹’3z®àÊ)Å(Ÿ'ã¹`M†„(în·­yñÀ$íx¥ÙqÛ„S{·Ñ )'Ý„£ë£á²;÷>n·´)3é̸T®À1ÛáQ’ž'ØèVFà:(+À€‚Ç·ç ZþŒ³ë1L¬ü“+ JóÉk È¿ä ³(r7Ê€áMÇô{®ù{®` ³u\ïÅ=ßé3z ‚di!Aêæº\<ºh²çø/¿ü²|ò—OÊîÿ¾|ôÇûå³Ï?CÖº¿À×ä» ^ÈÑ€õsæœl%à6•+pHåë÷îÕ}ÕÞ,oT0ð$àýåŽÎ]­i¬¶n?ýËítYÐ\Òìob{sî[?sðÕÓ3î»p<×U9·ìën\ÊÕØç#eBm"å¥-ã2¾Æç²Ètb@!2ºBm½ÊRR-µ– Ú:¶VÿÀÄ“×\¸30¼èX{æí#Ç0•ízë6çûÈx3 §’dú-:òÀU:<<šÎ/¶^ñLÈ [×wá[XÖzÏ@æb¯qsÎ@2B’È@h7Dê÷x2\Qf½Ô'ô”Gk|^¨¸‘Š1@6fpÈˇ…D\µs_óÕ×_•yfrX7t<²Ótº¡ |`o ¹'W"§Ã~XvËç}€K~™ðhÇ…~ý‡½3룈¢ðém&&Hl‘ñÎ €Ÿ BüH YAȱo±“xì;±ÝÅÑÕ‘ru5ÕËfÏt>UÕíZ¦kj›êºÕUF1Ú<ƒ@fÄ™ÇÚ“5üøÓøîÛïñõ—_AÚ`Ck¤ªèCÏmõXOnÊ´ÿ\¶Éi{“Yœq25ȶ0A6î  Éü™&KÐv^;Ü_‹r¸øDéOê‡ü$KAÂ!Ÿ§Âû°ºÓP8¸|t]äâDbùXã÷¶:F¤VsQ¡ª ëôÔpu&Q‡+?ö_¶åIJ c~“SÕ+©lÒ”´:¦ïÈ8v¢°,ªÝؾRй~ PŠüÞXoúðáþ%ø+«+jpylïÜšžÓ&¥¡©¹l$奠[²JÓjÚ¤®)«jÔ•Ôy+³Iƒ¦©E“ÁÂYН4ˆÒµü”W¥=åæ/õ½Þ¯{н9¿d´»ñ¥€¿n’p ˆiÑVz2rËïâ ÅEÄ…qß¾Óõi…<áÂ+.?±J&[—•®“¹û i™¶`{{»ë4ê† Þç¿õvÆéÿ°£lZýëÍ_ðÇÛ¸¾xg¬Ý°=ÖœÎqF° é7¬a£0;S¹-m?âË­ÞÜWrhöðV¦ë¼›F2å¡;q#lëG-G:/—Lñ tZ?ê¶n4„Å]Z’IGrŒF]ŒûžŒ€d1â(e¡<23! ¹±œdÌ­ÑZ#´ür{[£½ìN¥àä´OeKfß&Øm2­MXµ§VZ×ÈWßëØøe+òüü¨É‚Üy£•úÇk«œ ,ëPŠc[d҂̸sã.\¦Æþ?ÊÌ3V&ùÄá&—É?UÙÅü&j„ž(»°0 Ñ¬Ðpàf(*Q8à׿a°R~WÜÑr½éÍ,›†\‰{ÄìÏ2? ¥ûïi\vÓ›Þĵšf¼Í¼=,‚»*šF…óÛ/§éMo|ýÕò‹Ÿ4ï«N@=m=2H)|öîUHÝê-¹„¦7ý¨¯š¦©5…Úýˆ¿˜×#Á*Î+îR³M'ê`hþ²˜Þô^ ß ;î|<Oʸ@>o¯Kb“Úb¦åu¨c•ªÊžÇûÂ$²ÏLϤœ“wk CŸé–¯¾R´y4Iq(=Ð’þÝ€*ˆSr”RZe™XPxνÓ:Ʀ`»NaZ?hÏå£(§S/ôH0lòªÐJm™:Øc½fý>°îNMš§ 9»oÈKò¸mÛ¾›X_ßÀþh§z;+ ÔíÀ3·ÑÔÙž¦i. ¥Ù¾G¤>cóï©#güMšˆ+oq–ïQwä_½HĦû£ÑÖÿÙÀöÖ¶)°QöÀ3òJõ¾õmb^fÉqJ^“ÙI)ýÆB:ÜcÁ­»ö)í% ƒO5ýœŸ&µJ`û@.áo]– N„(ƒúZѯýú-Qì:;Ÿùûš†Þ²t0¡Ïzê©tà,H^û­½7vASß Š.'½Wk௵«à»t8ðÖ+>‹à»~S¿õà% ïh_íeYô)cÌA’eY‡Õw;u@ èÿëv:B€ @€LÅ*î¼¶)k IEND®B`‚transmission-2.92/qt/icons/hicolor/PaxHeaders.4960/32x320000644000000000000000000000013212442116605017561 xustar0030 mtime=1418239365.920273805 30 atime=1418239365.919273787 30 ctime=1457295917.246761086 transmission-2.92/qt/icons/hicolor/32x32/0000755000175000017500000000000012442116605021263 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/hicolor/32x32/PaxHeaders.4960/transmission-qt.png0000644000000000000000000000013212442116605023517 xustar0030 mtime=1418239365.920273805 30 atime=1418239365.920273805 30 ctime=1457295917.246761086 transmission-2.92/qt/icons/hicolor/32x32/transmission-qt.png0000644000175000017500000000350012442116605025142 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzôIDATxµ•Ùo\WÇ?wͳzÆv¼6Nh»YÜ(U›”HH䉧ÂüT‚?€úT$$¤"ZºÔxBª*HR²× M’؉]ÇëxÏv·Ãù%½²Tå#Ý{ÆG÷ø÷ý­Ç€Íœ„‚¿4à ‚þJ ,!<ð<þ‰ï¡ÁCì>Äþð#`@hBÕ€CxXaÆI6Q¶`r×ÄDçÀÄ„“Èd°€¸Ò?• ì=tˆr¹Œ°¶¶Æ™S§øÁò*–â!Ðn4˜=>øôÌ™jû€9bØlfgÎuS‡FFœàý÷Qõ: ~þSž݃i}œýèo$Þx·Õ&Ž‘NÓ{ì˜=åJb±ÑØõ$ð”bê³Ï¨/, |Ÿ(¥YÇqÁ0¸^«a7[Ä1Ö×I_»F+"b€ˆ‘s\Óý†!p›Ž\–r¹‹¡¡ÁÌçŸ_ÿÙ&Úãxh;lj¤¨–¿˜Å¶-^xá릱È./UٜšC1c“c½^çâ¹KضKOw·Dd ##ÞÒ¶6JŒáT*åY¦‘<Ÿ£ß<®‘g‰³¼\eeéÂÆp ÐÓÓMœµÚ+úŒmÙ¸nÂÓiˆ$ˆ³]O?N ™t¹|–ܾ3K»íÑl´Y_¯#O£ÙÔ{mæï.°‘®® Úk0 Òé´|íq5°=—Íf$Œm¯M±Ø‰(W±â›››g¹ZeaiQ×È<‚ïG:2«$Ri6R(‰ÂË´Èåòîòò²ø`KºêG;::l)¨0) ˘B±¸¸Du¥Æ’^–ˆPÈ$\Y]%•Éà:. A‚J¹BK;c˜hÙ”iš£,Bý{$›ËÒl4ÉttHÎ1 ^ë÷î±R]åÊäUº+]˜À¤þ½¤óœ/ä›ñËÏÝ]]´tŠÄN>Ÿ'÷ÃÖñÌud©iÅbq“7mÏC:C¦à'Ú(ÈB©' "-Úµ­B%’I¼¶G±X;‰!á~Ð˦>Ü™Ôyôý€r¹ÇuAA¹³ ©…›·nPÌçˆú{Ø£½xk.“×Ñ“á¡w¾˜åRYŠ”L&#«KψlmèÓUêY¶åÈ„”Ш7ùÃ;o1sç¶x&ƒF·a•õZ8r¦¯ßä½w߆·311!ÞÓÓÛC½ÞÀ´,ÑÖwÆpkcë* $W6R©T¤¸š8ñý¼øâK8ŽÅ‚.>L“D*0l›–öRBþòËÇ9öíï꾁 úzûh·ZX¦I©T ã­hÇ[°T,Ú¦aâµÚ”:KÄÙ¿œÁÁ!Rù3wffùçù‹xž0ÐßËûØ=2ÊK÷…:ÄÙÖ³óçÎ!ÎuvVÜ›7o‰€¿ÆHn†‹¥RJŠ²Þ¬k¥l@ï•xå•ò¿Ÿ¢XÈóñùKŒ<»“þ¾^Ž?®£ÖÅVtuw³voûþkclSèõ¹B¡hj!¸N‚juY+ïa#òý‘£ß`ÇΤ3iöîÙËøøóȹG!›ã˜ò Eí˜mÛ[ÑÖ Ïær9Ù`·¾í~ýúëtd³( d[‰P‘Ì€IÞ|ó-ù ‘RñÖ–KN§è€ˆ§PÈËÞŽxrùâ'îž}cýF¥¥:©d’ÇH뀆’ ËËÞEUÞ²¢dý2­òÆ4 1Îì쌤I®ñò{ïüÑBû­ß¿mŒoÓ*ÅÅ-`‰ ”9PÑ¿åCCC|U¦¦§ÿ/m¬6Ƭwm€Èq@°voD2A«ÖâîÝ9„ùù»r¯Š¤AÚZZUp,+yùìYäï[zú}<=5ýÝ‘‘3?çi "æ´c:55_ÛÔQP¶¼’Q4·X­ýβ­gNŸ>-=ªxzxëõ毮ž;·` ccc®f››Iwk…<-Z~°PH&g€à?vY%36LWâIEND®B`‚transmission-2.92/qt/icons/hicolor/PaxHeaders.4960/24x240000644000000000000000000000013112442116605017562 xustar0029 mtime=1418239365.98127485 30 atime=1418239365.920273805 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/hicolor/24x24/0000755000175000017500000000000012442116605021265 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/hicolor/24x24/PaxHeaders.4960/transmission-qt.png0000644000000000000000000000013012442116605023517 xustar0029 mtime=1418239365.98127485 29 atime=1418239365.98127485 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/hicolor/24x24/transmission-qt.png0000644000175000017500000000211112442116605025141 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øIDATx^½”kLÓWÆÏ,~߇}™.[–eûBˆ©.Ù’ÍD\KK¹/…Ò‚¨€€£ZÚ‚Üi‹T1L“ÉT¦Â4`çÄ€€+3—¸‹Öå.q™Zúì='£ º`âI~ù·oßó<ÿsžsÊ^ú¨gì=cîFÆþn ñÛÃÂU©‹ÍNuŠ20_ç=ÔûætÓÜ·Ÿkàdì—þððÀ„V‹Yƒ³F#¦ […·oß‚×{S˜P#zxï%šÓÄØÀs èm†Ž08Í:ÿ£#46½s×+ ^Â{[›£¹½ÿg‹Þi`ì1CŸŸBCŸX­&Üøý7Ž0àõy¨wŠh§ÚšåB‚«¬fÿÕa°"!™üË×å ²³Ä1>OB¢|‚‹^¼Ä¼þwâÒÂgPƒe»jë#}™&³a´üÔãÕŒ ()-†2Iñ^2zY…2¾§äë"ì.ÈCúÖT¤}•"HÏH¢]îdÀëA²²U(+7 ow._™ëY^[¥ÊdMõpv r÷äÂDçN Ì#*«mâ·æƒäîÒb'‰ëËJA}ËûãºÆZ$¥(14Üd[V&²s4¨ª«¨s²áh¶{ÚN…Z“‰šújÈ•2ßr¿‘œšøOmC-4Ú,\»îÁçWâ• HrdjÔPe«!•Ë¡£œ†Gá!.\ìFjz2ZZñðý¤õÚR•zÇÌþšýb©S3“ࣨ*u&6ÆnBÔ'Ÿ bã6#/&&ÇpýÆ5 XŽo޶òLfIëý¥ EÌV¸œèíëѤG1…ž³Sƒ8éfÄÉâ°…ž[è¹OW½±”¶Êá«W ÖfÂÕââyÌVìR{­¿Þ¨CG籂›Þ?aw6€Ÿ¬èØ|öÅ|¾q2¶gÀb3£ëü9ŒŽß‡0•—¡ÁQƒIÿˆ´òÐ>ÒÔìD~ÑôôaúÁ”`rzg:éäX<qÞM øëÖÁBlµ¢ö¦FÐÅlYd@'çòñ“m°ƒW061†±qŸÀ7>ŠŸ=C¨ª©„ûBîûî-àÞè]|wât´eÇÚ¾×Zd˜œ0ÚíîFm}RÒ“@ßyã"è¤A–ˆ”´¤ ÛvdàÐáƒ8ÿc7¿Ñã Ä###Ãè‚Ìh?ŽÎ³¸ØÛ³ÄÜïO·ƒþræb6E¯ DDD¼EEhѾB篈½%p°ƒBž[ûñúwƒáÉ›d0k4ë)ÀÆc'识ø%Éš L&{5&6Æ&SHóå½\œîL;Ɇal§íƺ­}}òrJ33ûuŽ®‹}¶ßY–þ›ó~·ÇŒd’IÐ$“L2É$“L2;ªw'ƒýÔ>=õGAñ¨ª4  ¡  D $ȸ nÛë•ýœä½f CeÃT³Ù°ÎªSw@ÔG\O€::*û9999óÐŒzúûq s:áÍÈ€š’bÜ@@M !dÐPÞôtÙ·aNÀÀà F|>0¸Cˆuª¶h4›Å—óç‹cyyÍÍÕåˆÓ9åkh__èìºkdíÞýò½-Ë ô¶cJŸ¾âÿMKðÁì0Ae€Èáo¹%1p÷.z¸:îÞ»'ÏIŸÛ šŒ“ßã–ÐêD íþÊø½Þ¸ï?Aãäe_‡†Ð˾õñ[ÐÄø8ð›|HÐõ©Škë$þ®Ž¨1F ÜUÁÐÓs[Üîî7n^ ‹5²6ø V—;?öûjm®Þ _ÛÔ¤ôâÅ80¹€gÙȨ•:i”D<\¡ àÀvŠ®Û·ÄµëWÃb¬ N@ ' Þû“º]À´^jR Fáå?a¯gg b±'7w…6ò|ïè¼)Úÿ¼kdmóÞP½zUQ¬÷m»€9„/ lÛ¶miÚȽÙq]\io ‹5²¶io½œ€òêòB¢R¼¼$*„"?\E4OÁÄZÌ–(˜Ñ6ò“0kX›œÃÃa°–1É’;€ÖŸäˆú¢Ys™1;"Tþ„ÿ†£ÕžäåñóüzñÜ…çÉE§è’Q._m;:‚„ù@Ì•¶?Žئô9 F0ó±ÒÚ@ Œ?v¦ìmDÜ)ü%mâ `\VPUÓÛôÅL¸hƒÉdBvv6²²²`±Z (†Ï…¶²#N€¬0!˜¥O.Õÿ™ €‰É x< áþè};€ƒô ½?SGКàà/yb -^$'ÀawÀ–fÓÇZÙQ?ÈÚ`¬ii°ÛlQ°ÿ3»sçÌÅ‚G ??yyy`¿Á¼GoÌÔ¼Ip:ràMüñûàñz ºU}ÔÈh«?:S¾†z¹j‡U5 õsmÏQéýësÓu$î#@IXÅŒÁ`° ,¶cïÚfYãlþ ¼¥*yËK^R•M9»Én¹j_ü`W²‰ÁñVÁ–aÌ‚ è2ºÌ¹Í|ý«Þ®®¹è6Ò¸ÊÖGý˜3sæœéî_×î£Z@›‚0À=去Ý{vS_)ù'Fç·AÀkrôôcð}ß§B¡@Åb‘J¥’ ,`oʨR´`uà;†ÉI6ñûUÚþ1xoÛ QsK3±t1.5š€‰fVoÏõ¸“ …QH¦¬”Vhfzšþ|ÿÝ»{oSøêÞW¦ Z÷¶Ó}ýàá¦~ûÁƒ4;3kî~Àà/..ä&¯‰z{zIÉ•F0Æ 6¹;Lã"-xðð›$E8eÛ¶7-©N²Vá‹: µ6þ›¸÷ &ðÁŸ°[6ö'•( Cô»+ÛEJŽ5š€qI TâF™2—Ÿ£RR¢ÜÐ ½úúéí½Eo^üë ãÂk?¤zåèsGèâÛoÖÚV¿Eç/œ£‘}# cjj æ•”DQ„~·°ƒVθV¡Áh[äYÄQLËËËä8>ü,HÚlfšŸ£z%ŸŸ_Íg`ò”ƒ Ý­ô̳“tüÄ1uŸ¼î£ì¯Ä}´©©©IG¼ßŠaÁö !€¹¹95ó³䨷·wÓˆ`Úê“8.ÖÓîÇQêèè& “Kõy‰%,3Tžh¨ضd¿™H¤5 ŽIÊóÏ£¾¾Þº°\ð©^ °®6tuurÜßO,pȦË‚ü6—¡X“çÁשFaFp#AHGg>«?¡zefv®îvtwgup¡>ƒù²- IZ£MP;cÀu„ °ÿÂ8LÃûL&ê•G¦p?`ÝK’°ëúýìì,Õ+Ý=Ýʜź¯Ê€FkÀ%a Ì~Šˆ™ ³¿^ ÃÑÛp C|øAMø ù(Š)Žäu A„p¸A‹@@„~šýn… j¬€€–Ö¨"ŒùA@G†ê•o¾yŒPgT?ŒcÀÃJ0ˆ àkâ"ü›²©:5&Ä>¯-ˆ¨|¥±«Œ“Ò¨bJxe脬³³ï VU5U°ÿ–maöGŒ8Œ) ¤„~! À5 a âøZ ÎÌt]f޶©Éƒ‰å }C»S³h¦hœpœ,àŒ Ê!rÚ‰ÙŽMß«vþÉÔ4y®ƒY,Æà¾FÀì%@¹¶ÅŽ8OõJfˆp_ô×è{[{»ö Ñ¥z$pµTEãXÐU%š°ÍDZ¨<¯13'×q`Ç¥=ÂÌôšØÁ‡²™ÄÙ<"¡uke5éù‹#Ž"Ý_® á5ÓÖXÆ8ËE¦" FRcÆëAÆàW#IÝ …0Çuyc*2ÂHBj@HAXaÄ€€óFF>?7oh[U3ª®µŠhÚ¨P‹Ú¡1AcëzäyM°ÿPG@€õrSc²¨Úyçƒ0 ²ÝEö±Dˆ‚¤í÷«£@Kb†ÔÆbƒ€ååÛï•J²+ÍaÍïpV¬£3ÓY0Am Ó€} KÖIlÛ¢” ‚âïR šÁEªŠ_«óÆy8MäŽMq±@ÂP!@ø^ëëÛ†)››Ÿ¯Bº]ÙÆêZÉ Ö†‰Pn‚Ú3ZFöv€(ÓžÑÉH¹ùéìBTSÍÅ::?=›g\»ŠQ³™m/âð0DBU©<@™ 9@ snîi ÒÑε´’ À ˜4qúsJ &¨ÉkÆJ™²{·“€1TÎŒ…:æÎj\I‚¨Úù ‚€y®+³1~r˜s®ü€_>‹Y†24- M– r=‹éµ´RXöZZ Íæüv±gŽ<ȶ,dÿJ&¶]ÚÛ3¨”´À¬#8àlUs#jš¤ Ç XÐAdÁAD33³p€ý}ý”Ì1†ÊÁç¤ BØÉæ×ò=@æÂÓÅÚ¹†V …íBà†Ši#“jE m M²ÆrYØkÙY3Âlåé>Çô˜ÉwïÝ£ÇSSÈvkÕXSð{_݇¿ \‘áJ«käÚZ©Ñ×3„|ýFI¢„×L¦Apg°u„ÊBPž:a©Y ck†¾ïÙ;L€H¡c°ç‹‹Ëtûöº~ãsºñùÿ™àÏ®N·¿¼#ŸÚ×% K¤’L,+¢lnÚüõj¥4a–åÌÓfBQgƒdísö0)%hœ8?‚t£aÈÔ1|å’V¦Bå¼´Ù:©Ë´6Ó\åˆÚ;ç*‘O¶ ᡪդä|Êð@éec‘®¹3Oîõ÷c]E?Õw ·›°Mäž,ÂÙ2:Q‹íJ(ˆ¼r¼ŒÏ1øµ{F*$ñì…Íf“†;>6Bn“‹KÖ¹ãN%H„¨hzz÷÷˜Ô……EÔ©4á 4ABèó&È;T[t9¾C;aV[6£­&`D‡ zINèc¢ËiŽA„ÞnUAÒüÓ„%&XïrÀ`|ÎzD=ƒÞÉ?°´¤ý@µ†¡¸UœG.ÀÚ ªÀx¡.ŠrlB--þa[hïP¥Z £ DÃ9Fæ©g5Žô w¶ *g»¸° ਠÙëô“Y¾n³›{ û„8”‹KK4П#Ç®ÚmøžéÙǵž°ÁLïééVÉ` ³ž,8–ƒÉÇÀ ­—ks s ŠC½p±JX§Q 1ÞJˆÁ*Àÿe?è¦{„aG\X^&½so¥„W¨9•VVVMÈ´‚òµ`ú-×9Hí\·0XÚ!NW !¦©1U Nbúè7¿¦;ÍT+:»Ð ½=ÝXw®GüÉ,Rë0sÿáÿ¾†ÙØx{ôès˜•&‚¹7oÞ$¿PÐýç2 ŽÙ¿h¶# Ý+Í ;áŠa(zV ë=½üò+ôÖÅ·PA4f’&u SõelG¬IRb ¸? ”ËPnˆÞyç]zñôî_í:–` âšBÁ/×ì V²[4Às=Äz)Sb}¬½/ôÿ»†vÓåËW8†ÿŒ~ÿÅ(©þøò”ÏÏéùta‰‰ºòHØ }ú_¿¥Vž<öéšÌ^O¾p’†G`]kj®ùnP°\Švl£Æ0Çç¨t–¯„~ MÐ:…¶Nœ¤Kï]æ§ÚñÜ‘ghòdmEiCý›.§äø(½xò8_š˜<ð?ýéû42:ZsÆW«c €ìþ3’1LøGBƒŒÌVc4q˜…pËXüÀ׫F•÷Þ»D§N½ˆj(7HgNŸ„³[\.ÐÓ¥åMc¯ÏvgéÌ™S4²wçàÁCôÁ?£çØÖ;Ž»ÆÀÛ€ÐÁÑb7\Ë(-AÿÂVB~dÔ„öo%#j±½|Aw„ÚlB0{>Bï¿…vïÞƒ¤éèáI:ñü½¾Qd³ôÒéôÌäAÜo0—£K—~BgÏžC¼¾Ñö€#VZ`åpΰ[IÀ^Ø…ç_1wBÀyêGŠê´.^|›Î;mý}½tî•Ó´odX‡”k¦ìø±#tšÍ g§pö.¼Jïüø]Ôô·B´*èqP1¿1œ h?î*gýÂáàA¦«W¯ÒŸþôGzö¯Ñî]9úìÆïi¡ú&+˜ÆCöÓÄø>´ÍBÊ#‡Â4lhG 0K&*»=&H:®6V]!PöŸ (hû¿•ÂÎ3÷7ÞÄPw¶‹^=ÿMš@†«f<4cdx7½ñê9:81†™Ø?;ìØóü-Ã-•-OLß¶hÊЭmÊÖiÞzëhdïÞº2´‹~÷?×èÖÍ[ `Ïî!úßë_àü±#ÏèNô –Çm›h @¾¢ÆA̺¶ÅŒxž‡8Ú(A¾ Aaû¶I$ù/y™íø;XòìȰ]?wàÁÇÑùóè]ަ0øÛ+z‡DA™ Uë‚¶ªLº‹ÑW7:p=˜ s;: ²ámD2?¹ü>›–cÊÎÛ8þ›þ–&&&¨Q¢Ÿ0н>ŒàÄ´ûë"àÃû…àx7GDÍ\BÜÌ•?3$Óqï;w¨‚šÎñã/€ˆ+W~†cép(x‚’šgŽ…T”c> ÇAµ`­rÒšœœtù†ÛMº bRL `ç¤îÞ½K¿úÕ"ûÜ~ÁÚ3BÌ ž7øå/ã±Q8ý²§f„©?` u0Ñ7è„­ññq—§w[i%tUf–¡• ö?uê}úé§ôÑGÑÇŒdʲ„±(‚#y\öY­ÏõgkÜÇ[ü;x_íwï(óÍçpÙ m‚oàZ:Ä×´ñDöoݺUÄ7ÖA€à ¢Ž¶•`EV×ZêQœµû­\FGÇPEüÝo¯ñŠÖCã±LÛ”6QFi& šXñ¼l³m§gÏž•_L*àdÊ'Ÿ|"ØÎº¶fŠ®Ûi –?Ÿé OUÑu¾öúkX)ƒÍÂ`õëjÇú©¨<¦ÚçÂûõ݃DµcHÙ9üK å£Ýp¼JTDM‘ãsKˆ=VšfÏ‹Ysâk×®•ʵ@P™0!N>ŸdR×´§wlÏÐßq´ñâÛ„ðkfv¬·†ò–òq9Ù®,–Vþó…µxøÍ“×c?¸Çç¦9»/HîÈëòåËdbiiIxžc»Žã !En( `æË àJ!Žù;øÓ.£ûF¿ÓÊåŒ1@¿1Flôä[!rRŽá}×µgffƒLXåà¢Ö’`³c1Ãz Ç1 åÂrUøê‡õû €¬ßaTŒAAà¾Ö›H°&Xí¥’XwľÃ$ ÂÂKa¹P5Ô¼sû6™rýúuú¾IR,Q{+4¢(|,0¦õ¬ c×@))ÚAuF)A4´ÕK’zÖÃÃïHãþleJiBDP+d½;R]é-y[Eêî_ËÂÂSõ pWðrG<59·ÔÅÅâ}byòø "!™ý ætB²#0ˆwè}AÚªÉR*&I¸ApÃT‘#?¿øßl^Ö@îßû ›d:>Ä‹$@nèûäY¥ù¤¹yþöÕ«¾.Ä­N€^p›s¹–d¦ÐnÛQK”º»]Ú‘šà”ýc‰â‘_tœBg’7nÜHª-Èü?a2ëšY¹ä&IEND®B`‚transmission-2.92/qt/icons/hicolor/PaxHeaders.4960/192x1920000644000000000000000000000013212442116604017736 xustar0030 mtime=1418239364.603251234 30 atime=1418239364.392247618 30 ctime=1457295917.246761086 transmission-2.92/qt/icons/hicolor/192x192/0000755000175000017500000000000012442116604021440 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/hicolor/192x192/PaxHeaders.4960/transmission-qt.png0000644000000000000000000000013212442116604023674 xustar0030 mtime=1418239364.603251234 30 atime=1418239364.603251234 30 ctime=1457295917.246761086 transmission-2.92/qt/icons/hicolor/192x192/transmission-qt.png0000644000175000017500000002730612442116604025331 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÀÀRÜl.IDATxìÀ±°·½3µô’|¸éYöì6¦Ê2ŒøÿyáM0ˆÜú~€Ä™S?[ÆÖªÏ2r¦Ëµ5]nö!ÍêdÌWdŠÇfeå*7 âCmÎÖ|KL1PW¨ux;:<¼Y& œ«ÿ˜à¹w>ÙžÛíü·ß}ÃÙ¸žq=÷ý¼ì쎧×h+UÐGS¨˜ (35¦®XÌ«ÔN2ÍîÑûdb¢cp@,Qg}Ff.'hb‰*&b‰6Yäuá[õ·é-ÄMž¼;ÀЇÛÌTàEÈð4猉Yþ ΔˆÈpáʤÑ%‹ã–´´TÌJN†i°m›â`ÆcíFGÐ(ÀÈð0§ccc˜ˆÑßšµ·ôoÌLƨèΛ©Ó.øORÊ¡?/}xj¨D%[?PžÑ«¾9)ç.ü(/—†Æ+Òxýj4X£^ê~>?^óÔé襤t¯r<Ïœ§D£~Œx€Ÿ8ï¤—Š› 1šò/xãld;‰–â┟ÿÀ.üsã ÿצëSªáZ½\º|AŽó*Ç,ËÉ]ûãîrþžÞÀ 袙ƒ@š¨`ÓFItæIJTcéÁýríÆ/r³¥i:°vƒÿücu,ÌÕ¸GÊf¨£ÅØåÐ#`¦ïÆ»¤#,ñ³gcnN’23‘”‘„”$°É"SifÞH˜&¾…š”䘦…G‘ñçöPHð81 –­þ'–e³¶‰ð,yãu<ûòŠ{ gR¦¡‘ÜïéÁãà®Ï‡{@Xà*}là@‡Ó@êꔫ}’‘!§ ¤qß>i*-•;ÔAÝšh§ð«ñ¡Ãü¬Ý§¸}禴Üjþ_ø·õ¾üú å˜õJ´é‡Ÿ|ô;Ý ³6ÈW99wê; ¼Bp— `<|N”p•K—Jcq±ü¹k—ø) ¡V _ŒGÊË$ÐåŸätˆ¯õ¨øýJÍÊê“Ê1¯ìѪ'Š6úN¯^-^ˊ؇€ç.âà2ðŽÒªZ´HZ¶o—.êÖXûŽÊb,¯ðˆã'ƒÝtF…5”šÕ5•ê h§Ž½Q´ÒÙÂBñš¦ržé‚‹8¸Ì œQ®üééÒµy³ôlÙ¢økýzéÌÏ—6nßüùâËÊrÝ­çsÔ pÔ#ƒý“úzÅé F…5”š5µUÊ1/æ¯p³ŠÖ ¤cùréZµ*âü©nÙ2uPð Á%\TØlÂ}’ ¾¼<éÛ´é‘%›+m¦)m€Vn'%Fl€ÁÁI}ÒÛÛÖPjÖÔV+Ǭ[ÈÞÚéÌÌgÍå\:k×ʉÈ÷•·˜·ÌR¿±µiî¼y°††&…ΜÙÜŒ„P €n"""Ó ž8JÐ b¬¶Ö¿ÿ±w¾¡•\e~ÎÜ™{3›»É6Ý$›M³lÒlARµˆŠ¢ö›•"ˆ h)¨ˆPAQT*²*Z@üTТR),°J[-"lÁ‹»Ýf“Ü$÷Îÿ×ñ2àápÉ37÷LsžáÙevçœß¼çÌÌö©Æ’ YœÅ`Þ= T¡€`zšVS‰wím°ÔQ•ˆÔÐ4ð->7Áþ>ÞÆúxNÍÌ`–‘& iQITîG`­&Rû†¹¯C DïïëãI^.£â(Òµ{p1Á\® 5k’Ø€4ÕÇ“Ìà`’8Ö%‚fUѤž5¿~L¤a Mõñt8¢(Òld¨WŒý†U€(Iôñ$Ïs€ƒˆãX—H©æTA/HM¢‹4«d™6ž®Ü•~¯Ç Ѝ$ív›RŒ†µ¾»@ÚÖ¬@)Òv[Ïá2¨Â@ F#v·¶ˆâ˜Jdq‘8šÙˆÔ Íì”B––ˆ²Œj,ôûì—êDLJO€IéÃx›ÛÛèWŒ¸(P÷ÝGqö,iû¾Õ="cÔî {I§C>;‹·²B65…>–wîÜa ‚Ž‚« ˜”¾bâüx[ý>y‚Ù0¤…F§ƒ÷D°¼ÓÁDDô=cÿð˜·?AÇŸ›#8+P *Ò<‡Röó|<a‚ø3Y~ßIàcÀ2½­-¢4¥Ûns PØIÎ(sò ©Ôv5ò4%cl%öDìì yŽŽ‚Ï]a‚x—IšÂk|h3‡dw—í^ÛQÄv³_š–)I2þÀèL$K­:'yé ´WZŽ›{{ô·¶ÌÉÀ· øE)“Ô/˜< žx»‚ËÀ;©(Ò”¸4ñ

ð\¥·À?÷*˜§ÔƒYÆŒÌÎN?gÀ]Ž‘½áÒ7[}ù cƃ(ƒÛ-x-€Û@ŸpK z«Å­ÊcaëóOœû] þAXöЃWJÉÿ…Ãߪ÷ëÐŽ1Ü¢Ôш‡á¢+RƒæÇ\±Ǹ_‰„Fàà Ô{qpŒá0 ­ÅÀ!Hío„™‚½¸8Æý4¨ ØŒ €ëj׸4sRûf7.Ž1ÅUzñqØü0\5éi®8Æý] «qpŒñÓˆ®vp=€Õ¸À!BÍo„ u¸ ÐÄ &c:\ÜÃpû{ÜÃp.‡ãêÕ?…¥o+ýDéS¥OÛê‹/¾ôƒcÿ_" ®_ßxÂÒóóÝÒw—¶J±U¿üK¸|xS*SQ˜ÔûJ$b4M߃½|¸üxxè»  mà+ÀKÀϽöºznx xø3ðf€ÿ²¼| èÐ|1o çà ðq€g€7bÝÓ]¹pák«k¬¯¯[çÚÚ:‚ŒøAXqdщ ³´tŽêïÃ¥õKµ¹~xY]]eyy™…ÅfffhµZŒ ž~tNòžÞFy˜ŸŸçìüY¦¦¦P(l§(r=ˆ˜oHr4Œc"è0Ýí¢”²n˜¦IÓëõèíôØÝÝÅà“@|ú$V€Ç€Ï †!÷¯ßÏùåó„S! E)Æ*GEÕæèÍSv›ÓÝÓà ڹ¥s,,,Œ ê§€GNbø¢¹äY½xqx5;6cA¨ûÃXÆ1GOæÑ ˜4í ?ãÓòZ´;mnþë&Y–¡ñcà-ÀÍ“€‹ú¥+++æäEQ¥YžS” ‚M(¥8†è 5zÔºJ£?ç¹ç¢AÏóôìáµ<†=ßàÆ?oèçeø)ð¡“€G@_ÃN3wï(tˆ¢ˆÁ``N ë@0ÿÇÿuè<ÏIÓH’ØÇ÷}¦OM×þYžçÌÍͱ¹¹‰Æ‡?ž„àÃh,-.á)¥—òaÃÔï÷÷>€)ö“e;½ÑÀl:èv»Ã ^†&!C„k'¡ÁpÀ²ðBV{žyÀV}‘ÿ§J«kÓyæbcöŸ“‘AŸBˆÏ„<Ï'#ÍÆþî߸&ID0ÒY»¤#•œf:ðÜh4\µBÙMƒ2 EV€þϱÒâDÙ׋ÆúøË_ÿB»»Û˜M¤” Ò*Ë¡O(Íöô™Y=¿w76¬…VÐý?ƒ|8}”@ðÀ?ýô3¤¿G‡GXõ­Õjäjãñ˜ÿ?ó~¾0¨ 3I. ðÊ1}™0{@sòÖjmÑ·ÿü–„ÈÅôªÛàbHi·óó ct+ *Õ2°ÕÚ4…€è—_¥W/_óÆéÁÃ0lW@\«ÕÉRxßš$Ⱦ*ðÇ› h¥ñì2ðlæñÍ š­Û=] Ò)å-髯žÑß_üÍ•s#â6ó¿6ip”G¸dP P5¸Ç¸h€ Åó`KŸoþñ556êXzO}3Ði·Áp˜ÖßþÈx›ý~–5Ž\Zi,|F`’(ûxÌ«³Pñ™1 gSh¥R‰?y„ —6ÎÖ€Ãá(ÕkP)—‡1CÆXNÆçx“ƒ V„3N÷@¹Z¶.ŒžKÞŒÛÅE«Öj©£Û[0¥}= eŸÿyÖn'Á\àYä¨Uk޽áÙ&‚Ÿr)&@T4à$ªAy{ôøOë0ûc»ÛíQÊ Òqty•æµ·¶¶ˆ·`8ÇSF œþŸ<ÀN€( h©çn®°Ƕ·[T©”SÇùÅ€dRÊ ò±×;KýzìîíØçx*)g^—Ëe{aÇ`;Ëp©TŒ¥ ÔX qÂ^Bon6iÚû÷G´.íÈäåÓm˜˜l8ÇS*ÉC€ÈJ”uK¶.têE;ýY¯×iÚ»u"ÀQê€b3yì¹í1Å¢{_ˆteXá fR ¥"3t?ýßh6ð¼àð`•d´Z~q€=áÕ구Û §…38ñAÁf·°Ww7Ó—?¶À`ÊÊ ”BIA.†`èƒZ2h­™H[mÛ2ȵìòÇ®¹NY0ö•®Aƒá·É4¥œB†Œ9ÂÉ‚, ï0Fr©) ¤/.XXÃ8 a- ~­’ÙŽXHÈ?^D I‚ZCprÒ‰k—””1¤T Âa‰®A(ï¢à€´^—8[yOÆsR¡’„í2N;ŽÓR)<;€d=€C¥¦ÀÀ2d4 ÃD ˜¼ €X›LE€ñÄ9®R*þY ký†Á½ì€ymË[­y Ôö\ŸCqÁB€ìAß  ”R^GÅeGdi{€Ö,®®bŠ€ÂH¨Û dQ± /‚#'l°¹¹‰ ¸~áâ3<@•¡¢03&!2“ üA(g¡˜P*Þ´Ó6²,å†u¹\â±’Ah+Vý¹ìØ›B ,Vôé’È XÀÍsð(t’²C@èC€š3ð÷ˆ|ßq6èììl{€ë¢z=»à)_-¬âØs<ð‚`Ç#˜ù# ø÷w|t‚³.á /Ãìl mÞLamA€ yPŒ]qy!€N»»´¼ûì™ «±s|A^ö¨W뮉3Ÿ° PÌz¥4ž€°kMØ,î0Tçìïï 𸾯ãã?HH}NaÏÎa,žÂî“§AEÕµ@§{Šï˜fœÔÚnÙg¼:ÇWÎJ $F¬¢¸’ÁÃLI €ÀIÛ Ý n¨â†ÆÏ±8‘NÚÈÂ3³¿ž-…@ r ÆÏ%P”U1´F6 „äH+NÚÙÙñ‘@Hr€¸ÖØì*Š{–%€Ce€¥¤w €Üv#ã·‰ä‰v»yG ´kä¸R >g§Zyà-²@@§^Úqòù8ñoœŒÝ©P¥¢axŸ³ã€Ìy€J¹â±–$l¢e5¾E¤9ýaeóÇs~p–mü˜¥cL &/Ì]‹ƒj „Ê<3ðƒ±N{½µˆ“vq€O&¨±ÑÈîL£Ì<•©œ5@\§uP’”YbÐüû8i·Ùii‚ …$À4»ÞÁp0ýLh“ \#q0 R“lt5¾ò"ÀF}#sè©uƒk{ÜÜ 4"#ô¡3ð² x™Ù’I€ÕÖÈØT %a¨d]ÀïD°ŠáÉ ˆ Å"`ŸrÚqÒήE€Ë+í‘鬋UÉŸ\”ëeBFî'6“ŒŸAxþâD‚þGÎ, h=SÈà±€?¶Á+ @Êá™@€ã$7æÔIk-`Z&ÏÚCƒr&<@!èLHù§@}g2I†ïM$À"R»Ó`Á› ƒ$„ˆ€„1·—¢3 rÅÐ9¬Ÿž¦'»ph®G*´P,¢RÀ²ÏÇÙ @±@åJÙ­ÿ,ŒmXúŸ–¹!àUqÀWY@8¥@€V U ã±WÀÃ;çO$«Ñè’FWWüÈp 3þHÛÇq0ÿœÿÄ\©Â)pàT¨d RŠ“5A)ÆI±$kµì±KçX+…żf¶ÀÖåÈ;´Ýj1׻蠉ÏÚÔé &a*UyaÚ`4šêv 'r¸ý«Ÿî—6P7•/xö'åñÀ[kâ² Y 0 Ó‰“X»žq€]´Ñhd†Û-v¦'˜Â°$PËÐ’Ipc"u:§³ú}ÐlÚ3q\9o§µMîIwîÐýƒ ¸sp@_Þ¿t"'ÔÅ`€]b,ðX À ¤'ÅØÝÛF—5Aε€g·•Oìrf~mMÈú»ÀjéűÌâ*-y¶…Hó-‘± zxh§9ñùr©„tî•”‹e$Pûæß¿;ÄÏ<ð&R”#ÍS¡ @:q„wí@Øo-`#;ˆ¯ ¸a³oÒaX0¾‰¾ÙÜd¶ ĉÔ==…qBÖ¨ÅÖWR!†DùíÝ;Èv<Êb3@_oß¿ÃQèAhÇÅ™ ³ß?K%NâØ[ˆ4R¡Ö­§îlÜj`X¥Âgÿ¹)ЫñØÞƒ[ºb•W7îw6 ÐJáPßÐ2H3ÐHE¾yó†>œñ] .€PÎÏéÍÏ?öpm@¥¦À1äZi&ÎçO!N²$Оo*ÏiÅ­BáF•ª_lg€Z[-ç…^>§íßË Œ L`æBö…m†h2 ŒáÞ¯^ÿDÿùþúñÇWøùõ\¼ù?¾|IߛϾ|ýŠúg}ÜjÔdR8q µâcF˜:;;K%Nb}`ÿ+oŽe¡ýÓÇðÿ£ÑlºeЭõÅ"2@Éò°=êË—Íi'/Üøén`¤¿Ïd‹{cLˆE½ó‹ eß ×ïûEw&ÀÌ‚öç@ÿår $dA0¼†i+“ì>öö|e2f1šY#@1ZáËJ*<»0vÀþe»>ƒ¶8‘N»=n`pÛÓ¶Ój@‡{ŸMB¨¤ …ZÍ *äE¬£§q€V§Å­8Nbn49Çܶ‡f£që%PÝà N‘ágúf€° âeÄÞ[‹©×›IbÆî•õÅÈ!Ôê(Å÷Œ! ¨UʯiäaƒŸOÄaxœÇIíYFó={Ýl¬ÎVE•»£c, nßåæ6=çÜ¿Ê-tÓ\íêålñ Á)OïÞ¿¿IÏŸ@l­tT,÷y÷ÚjI¡K!pl$Ö&&\/B âì b÷uó½†9öKÖüû›K»Ùö°ÊT¨XÍ@Ñúò_Èù§â–¬|® ³iF `£ ÿ~ùèX¿ø„ ª6PŸ zZö, QWí°“Ødr/ebˆ+Œ“ÜýíïíûxÛ²ŽJlìÞFÀpjÕ*+¦y)P¼Ÿ@ßTÜR•‘Pj­bÃ"ÒñÁ¸ð ”Zƒ·a÷ç… ‹âÜ[y…qöä³·ÿ©pŒ½}>,&‡xv+ €¸VõÞ¯µæ®±C:9m rê¬Ø ÒC) „¡¤N·‡Œ ˜½B\]Ž!Í¢ï‚ì¤WDÔsæpCêR™JE?sñ</Þ$á@ÖLÞh4¸Ôqn’wØA°eЭ%ŠàðH¾!ÞÕ¥cö_´`Ë"ÁF­A{Ût°{w{ÉØÝÞ§r© ðrã øHR}4ÄK:>:B™Â*qÚíFÁ¸Æw™ŒÇˆ ¦›õÇ“1&”fc“îìÝ£ý;´¿ëÆw÷ïÑvkwé„Ãþ¾%ƒ†£9»ÃÔl ÜÌ  EªV+ì0\‰g°Ð³X(i²OõdØ‚z3àf£…Ûþ³m˜Á”Ҁȡ_LÊirAâï-ÖÅ\ ¨QGüE7iµJ ×09Nbð!Àh8·,š½ÆBÚm•@ƒ‡Üà®ð‹À¨†\¢` Ʊlë÷{  òti¾£ÒД~Óø.f}#R-Õ·T29NJ í8µRsaö@*ôvzž™E3@;ìb/\°ã½\Ð L‡×vN;(oæ«ÀÃáe<ãŽ'“ø>]i %J/â8àrÌlÁ†ãö.GH—rŒ¯Áp4¤£ã÷ð"Dú¦ ”w{€½n4 wÖž|rgGæ‚•Öüµ½TîôvKÌõ³œöÀÿwßýÛ\ôO«YŸp¿cŒF†ÖœˆúC¤@QÛÔÜh˜~ó”bÊp'CK\?¾ñõëWÀ J^¼ølÒÚIRÛ?Ø· àd‚Øû¥¨lœ­ Õ ¾0x·ÖÀ¾X=*ƒþ{×ûÓÔ…Ÿ@éfÛ!ým)­ VR€Rpâ@7, €û¿¶/Û`–eû¾ÍOÆàÃâ?ùa‰1Ód&‹€ŠÉ¸ãÉn㛓·p vím|š´µä^ï{ÞsÎs~¼ÚóÀ„è@²ÖYöö¬®®axø|±eÑ”·RðVHñ [UØiî¶lÜ0Û"QUá°n2¼¦÷uP‹ØÆÆÆP(,#Z&tâkó©JÉg¬õäùÁ f|¥ãg¥k€H…I?OÿÒ*Àá“ ,УÜùÇÆ2|˜²I£lìì¾R}>´æ% ^[2O|Öooo/nÞ\ÁÀÀ Ü¢ÛYš"åÿ?Ÿ£U&pPøb/¸6°P@¡@ÅYò@ Ê»ï6Ó—]ûSzT‡ËË7‘ÉŒ«î6-ÿæÍžVðø Øt¾Ýj/þ×¼®m^—AˆEpÚkç¿= ´–…B““SÜ´ÊŽ¹ä4:ÁY‹Œ}–šSøw΃²»4£å´K½Á2ÜŸV”ÆñRõ4Åéô¬¬¬¡££:G ÞÛüwïmª‚gÏŸó([ˆ¿”€*Õö*À@ñºpÿ·ê5ãÁÖï ò’÷UÒÏ¿|y‹‹WÑÚÚvòöH5d ¼c©AÞãöÚÒŠ«•’-®…ëÝ·œ`¬R`–ñóÏ—ÏÏ2Ð’ €Îhã™Qš`úÖRàó¦ÿ¿_}á„:Šz\ˆ‰x²™‹ð«EiŠu¦kÈÍ ëª@ÃQi ÒZÉðTP»Y€­\üTQm=®4z{û°¶¶x< Ö/^Fª¿‡Lêv0j\_{(€©‰ ºbQZ=­Ÿ¿¾~ çϧ…Ÿ¸à˜C´‚Áàq¨Pöð§Ü\jV$Êd†Á…/ú?uòŠ rÿØ„=?W®,èΩBG{“øý¾âîÊinäßéwW]¸ày-tÉñ¶ÚR¸˜ÌØI‡aX‹ª…P¨ 42FÒ‡&…ŠÁ>LŽ_šÂ<­ˆï,$H+³|ƒy0‚Í ‰c‚` [cí¡•Uá%µ%…uìÒ² :;cX[[G*5 fc³™ ÈMeÈØ” pù”{’ \[¸„D¼S¦ÿA˜e ·n}Éò ñ¹€½Ü K%,Ð]Ë€ ;¦”:ÊìÚÊÒ%Ц§s [âåà/õ³9rö¼_Qj?K§Hk3ÔëëÏŠÏmÂB^Zêf&Ùf€ðï&Ab„GI `GÐ-YYY%+£M ¦qyn ϰda6—ÅÌTgÌ¢Åÿ+VY£$:£l­Ö¨PA™óŒ{Äê0Ü–…Ú2ø³älWT}kŠ]ÁüYvU1ý/Ñv¶ —óX¼2‹PÐ NÑÎåf¨H¢gAÂþ.§VèÖ]fy€¶ÈÁP“Ü5kšXÁóà 0 fykõëÜÁ …˜˜˜”%­ƒÖÏÆÆÆ—èïOÉÏë\Ä’:Ö¼Ì*W¼•h»*Ð]K ÐB×]õ‰O] #ª@ånÏ¡®õÞ5ƒäH$ŠRˆF;™d£²ÈüB]AººêÈ|)¢r bT¨³"èé8Mí6 tûk„æM îXÇ,a=ü÷Õ«×Àúº8&0ó}¶#Ê@¯^@º{b=*TyÑ¢Öœ|wû{Å0 %fð)Ë E‰óôéSÔ#X¡ÉÌ-iÜíYq*-C=ãùóg–@¬­ d®?œDœÇü¢ƒÀ•'àèT T‡¾_¶üøã¨WÐåc)]#ÉÕ;îÞ½+â=oiH ٣¦‹+oÄ5.ü|>ï<·µÕQ•=­R ,@__?T<~ü?ÿüêððáC|õR/ ¶ÑK>ñ¤5ºµ¢º ¢WÀGz±`¥˜°~Ùe ÓžPn›Ã´¥Ýð¬È‰’çCx?Ñ5«úŒ8RSïèzçwɦ߯SX‰—fŽÂƾâ¡ÿFxÜëÀ¤Þe‘=“e¥s.?ÊóvMÀÛ¬xÓÔ'?…QZ‰H>0Ya€Yö*¯tG{­5œµŠÌ›koožÿï½÷~Ü÷þb¿Mh­ã °` [ÇvϾ¹i,ÄÊY»Öh°ÙîÕ7nÐh¹ä¬i”5F9få™"„â}×µ[»ž™c]›«!åɲ¼=¾>ëæÛ¡Ã;/´’ÞŠ/L¿"¢IúÙ„ˆ Ÿ‰÷ÜÆ¤Ë,ŒacLÌZDË÷VS‰sŽ|Y’ךµ)€ÐËÀX»VcšmwNF—¯º…w¯yñ±Í‘@`}•$®\½ ëž#Ƙn,ÅÏA!ÅÌ™yçØ ä^{vºÂ.´Ý)!Ñš°úrôðÞÁZ³Òö3€±v¥þß·«ÿç\ÒK ¦iÚôúÙñ`L7–âgH?åÀ:ó :<<ŒÍ;¬KÜ]¿þFÜïéâ¥VII1n¼q#6%×½Ô§ªæ˜…Xª›º¿(Þ|#PJÉ*øA–„ˆ+ŽOžþ·1öƒÞ,M0L¢Uûe{À&%Åx fô±Æ`bHD0Nû™ÇÇ«”I‚b|RP0ìÔz0¥T¼¹µÖYÐ5žOÿ `Ù}#üè³G8zr×â=‰‰=ÄcÚsüå1êe.1÷@$°6š ia¥dUyZvb€»·nIñð¡h­Û/ð¬”wÌÞ ‚•ûÚ\l±¬ÿÑnûøà1>?ø<ìãÿ4>jê‰DŸ~ÿàƒÇq䯪*¤ýÆ)Öºÿ~1ù7IÖ¹›Ëºöj2lmpÚ*¼r†°v¤™Çö„¹ @‹¯Ž¦é?¸ú§<Ó¿Âÿ;Gf:[·Q!‘Xg u]¯ÏŽkÐÔM4D/rôÙã' îS /z²•õ~†<Ÿ¿,Š¢0~ø¡ ç6@¬¾ d3`oèýÐ)5†ÈP˜K41+tN‰Ý¸våwƒ²ø=vâ‰ÄòËé韧§³û^Ä‘£Æ Än®œ›1suúúëËŸŽFöîªPîyR iuóæM<û=ç,CÌ 5VÊù@L…V îüûÓyõ ‰Ý ÆØ}~ô妓“û> "V` (ÖKiœsv9»6eÁ/Û§@¤AeÀÅÎ Èžö¾y"%)¥"ÏF—^½ð‹²È©˜o!‘Ø™;ïïŸÎª¿Mާ÷ãÚ“(?ˆŒYÑ”ªü|~6–owÒŸ »Á„u¬¾xqV,™ ì F£@EŒA×u‹Eô¢vØPuÖ1ávctj ù|^ÍyT–Ú,À›»‡†R“¯‰úz¤* M ac E˜” ã2^oÅç“Ö1 €u*B|ðá£n£Û_Þ¦pÒ:A뿽b6[¢’N¦éþ´¬—ð{E&J‡ªŽàe½¯…BBXàñxÙš+"À˜Š'h·ÛaͪЋ4„BT̶’Â%:’‰$örš"Ç|x€X È)HäR<Ìh?ƒîµWtDˆºO!Ÿ‡Eáˆx`èzëJ#ÐæpÔÈSät+ta €×%­&ß pÊ·Ü2}d"Qn¥t„Ïç§Vœ¢TtËúhii)ë–¦æfš)#œÜ…¸ äÔj¥–K€ÇoÒH³ªª g0”)dvÚ!íÑh ªb‘i2:6N÷‡JÉbŸ@,‘ Þî#’I¬]ËÎ0;¢‰††ü¹çO°nÇS‡ÃÜJ—M`­Ud;ËÑ€ .¤kXâ8¹¢œ“n]Žößwí’^—]KH¢2.§a)Ý&gˆ%‘hjlB&““º€£g%ÜJ¿XV¼Þã­×h‹ªráI¯R*–d’ ¯FÁrÚ©eª)0‹ )’±X±hŒßw òëÊ@I‰¿Wñ>Ba>Ò½Üàœëöz<¼?êu “1!C©›È¯¯B¾€i>›CÅq,UAŽú|SCkéy™¹¿%iAp¹­pjNJ]*d¸¸…+Ó—K€7>Éíq˸<æóûÓGˆ…_~ývÈÁLm6ÞJ?WM"ѨlËýÛúä~ÜéÎ<óLtuÌzcZ¤4Ê’ñB6’“–ý6JlÛ5®~U%”ÿ AÞœ ò5þ³Î: [¶ÜFEB–¼þÃOˆPzLœ« .à¿ö Iãׯ?‰ö¸§v:á”á'ÑÒ܆ Ï rN½×ËÎl¤N¤ÖŒÝ䤪×ìv{_׸¦åÄKßrËfê{ iuØ7<‚=î“*'kÈ—w1šššpÕ•W!@ý¾’´¶¶`pp&£ït:s”¢ö׊À:o}}–Ó‚_kóÜBCAT“®“OÆwÞ…Ë.½×lºœÛrD¾öî¥_€Ë.¹7\“®j\s͵+6ž÷Ó?ÒìY#m`ñûàVª”_èéé©§¢9«ôf¿qãüH›=òÈÃÐê4¤@a- ÁËâ1Dé@~BöÙ¨ÈGKk…]j<_“ÆŸsιÒò«låºa¬_þù< ‚ÄD »»Û¦8­Bí¬˜F÷âæ==§‘.9° ø M0c󚥴”×°8i!/›—®K<”…ãÅ!7??Ï$dÇÓ‹EŸ×ao;ûì³÷(˜Ð jJ×ýÄÞÆc<Y °aÃF¸œ.¬†d³YjË»¹Ùx°Ø œñxö"`Ÿ…€x,†™ƒ3|,W[¸‹²^Å¢•NTF¾²ÿ‰”û¯L PÔwÎÎÍ z”¹·úÆË{ù¢ÈbÃ(KÀápððÒã‰ä‡c£c¹x<†Ö–V´·µ¯*Ú<ÉÇ'Æ9… Š%[¶ÎÎÎv·;<‰ Øm¶—wý±ëŠ€H­ö¿Bð‹œJ¿£óáè«T¤á`"¡/Fˆ.,Îî±>«µ™ ů*ŠfwØÝX}áo’BZ7ŠaDŒLæÀÎ;Ó¥9ð`@¯ƒý¤[IEND®B`‚transmission-2.92/qt/icons/hicolor/PaxHeaders.4960/64x640000644000000000000000000000013112442116606017573 xustar0029 mtime=1418239366.24327934 30 atime=1418239366.242279324 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/hicolor/64x64/0000755000175000017500000000000012442116606021276 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/hicolor/64x64/PaxHeaders.4960/transmission-qt.png0000644000000000000000000000013012442116606023530 xustar0029 mtime=1418239366.24327934 29 atime=1418239366.24327934 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/hicolor/64x64/transmission-qt.png0000644000175000017500000000750012442116606025161 0ustar00mikedldmikedld00000000000000‰PNG  IHDR@@ªiqÞIDATxì—]H\G†ß³jwk€-šô²¨„úGHH¡´i£QBÒ éUn%›ÍnŽ6Ï‘`JHA"m©”ô¦¥%P(䮥¢11&Q÷O÷gtÓºR=;óuIáÐͺ§èBµ/<߇ï™ïe†™-'"ìd¹°Ã¥ý¿vºˆ¨dô‹AÝÿk°ÏÏÇeÝ?Ðý—pMÿ>€k@­ ¼>tK®À…¸ZWûm èC×Múòëýæ+ªvýÆ5 \¾H¡¦Æï6òL8+9hûJ€¸ À?d†vï¦áæfºÕÒb¶´¬Ýnnæ…>rXåpã¿Ñý©{4y܆ªMÜ£¾¾KôùûïŠüä7­‰ZÃg^/™@Ö††€·&@Ænx½ÖØ™34sáE}>ŠÉ]¿ô¾ÅçcŽÌÒÌìcáð¬êÑÀÕ~ºs©xߨdV2qî ××[&° îM`8l4wô(¥O¢Xc#…Ýî¢ùù@+õ÷èéÓ -.¦‰±” US=#ÔG?|Ó‘w´¡RÇŽÑüÉ“4¨i98½é˜@§„/utP¢©‰â€#îî‰TKF©t‚’©ª¦zFH§;¯½êØ¡¶–ÔÚnVU­ÀùbçrÁ¡R‰++X‘Áº8X‡çA€ü8öO¬®B­ ±5ïdhá¹9°êj$«ª@!„„ç @õ”~w8|²²¬¦±hZV€ì¦P |O@t:±2dÝn¬y½E“óxHpžÕ#Ü¡÷ŠôNe³x87ghEF6=€ÓDV9ð ÏåFÓKKg Æ„ü»šbŒc(Äòò2xîö_ß +‡ÙÈ/ÍÍËoGã1ÆZ\¤5Ëú)´ž%b[ú¼ T û à„Ä'¹m¿âÊÖ'º¼ã£±0=™™¦G§l¨šê…BºøôÐ[‘ üê±4 àeWŸ’>ƒõþ‡ghúÑšz8iCÕT/4пÔ}=¥Z— %n!¶ÿ¯Á·ÀŽ€ƒçe=¢mϹþ>´ý@þóÿ8½½½®ã'>8ÔÑÕîoïh 8!›ï  ÛàvTˆÊ’Éô;ŽüíÝ]]ïíÛ²äàG&LD \?Tìªø¤¦æ…'h.ím'.üŸx¶¦7œx»=Õ=. &§]‘ãmç5)©r¡îîî M” yj<{ëëàq»+¡”@Å}‹@PZöæÀ%v‘êA©®®¶|Ïž½åöÿ-,˲Ç‘L$ýmm·6md2ì#h¨ÿ«Z+kŽ£ºÂß½=‹f]´aY`˲,[¶¼€dlÀP ÁÆ@UB p™-©ü¼†ª¼æ?dyÊ;©$8T x0 8&ª,¬]£™Ñ,=KŸ|uŠéêŠ4Öhy°Nù¸»ïÌtŸóݳ·FGGM› r¥Ìµòùuä×óݰ–·~ Ø2 zú™ˆ R­Ëg­?”K¥¬upäÈd²X#¿ä¦…÷ ±æµþþ~DXӗຮ [¯×±²¼‚ùóÛò:Á"ùÊw „  E<øîÁCyqa‘Šo€¿ÓÝ/ 0à.=>ls8_\ýÙ¾` Édʸõ†©óù<¾ûV>0Ø¿-÷Äz Ô¡ü†2”Âzppà¡l‹…ùy|÷Ÿÿ*¢–SA"‘B’Ý¡yn_0$<‹E!Tž—ÚºrG19y/¾4ƒ³ç&·eQ!»hÎäÉsgÊÏ¿ð®¿ú2Bá–––A¹Ô"-‰dÂq&÷€Ùwg‡Dbñ8`Žã X*"âÒ3—044Ô7h=ÝR£Ùêæžôù'pí嫨”ËšY¬µ€ñÛlËŽQiôPañ>DÍþÐÐcèGoo®+.Ð_Ñev*Wª]ßwäØHh6*›x‚8‘ô7z÷cáp¸I¿Tt †º@&“ÙÑÌCM»Iå“›ð¹¡G*¡ÁP‡'ݾ³ŒF#T8†f£©²A] UζÆ÷K$``ŒÕtC itKkkëª`­êj:dÚbÔð÷×ü¬ZsÑpëLtI´„^Ô݆Ê&"ˆÇ0Æ´<ƒûA!£»oa­æÛ,ϭχl¶äLƒü•«Ò_+š¾Tñ—¸ë•J… Õ`¨Èââ2º¥¾þ>nJ]塃X¬§i`÷nÆš `!€cv½ŽÞ\NMŽkÊzî„ôè3×-yiy=‘0*Tn£\+—+©¦÷Y]YÝd'êíëk}^[Ît:d|殺‡hêr.×Ë…¶.TÁu1×ô·ÕªË]®RÙ2jn ÁD¹kq‰_eÌ((ˆ~í°ùJ"@_ŸZ%  l X ØÅ%;¹'f2;‚Yú¿šs6›Ñ£ H\_^Z!UÅb5îtÜh] ~GYËç;¬$þÐ?0ÀKÑ8HÄaxžN¥ÁÅc{r§áh ŒÅ ,ÏëôµT*fXßÔCd=W®êPóÞ(Wy]A¡¸dCp¸^­¸ªr±PêäVÊ\÷ŸÃ2]7í×tÍTF‰½ñþC»@S`$ñbѨ"îX«¦–£ÿÛ­ýÓz¡X"X!xžPñ23ÂÓVœæÓòø{ÖT¶ÆÆ§TÞ`œBdÛ÷>‹\„Ú•Üš«2BÉTº‰®3¾¼1šTÓ8NÛ´¢ë£Ï96°3,L…óª¬[wÕ¼¿¼{ ‹ $ïåó¾º{ŒÐzz¢ìôŠÁ*¿i}ppPïoy.0Oh¥ ±rb×1ÀŒ2šÚöî“(¸«Q×PM! xV`0‹r‡Ûˆyå ½<ÆÂƈ¦1ºALJ6U[0ÏQåOå£x´¸ñ]`Œc`Ò ­0£¸Z€^ ”– Å‚ö ZÁ¥é£€¦´N5—þ§í3݆1¡Ü!Ȧg Öíïóh¨³v­'w €K%Ó_²TeÚéWó Š …¨dAâCÍf“æY£b éjº£µýãA_nPw5¨v±ÄÊ’Ÿ3Á¡C‡ô7LÓÚ¨A h½Æ{fW1€DD<H¥SD­kî£îÀ¦ˆ_-Wµ©x½°®BÕœF{€fËÛ–[ºZƒî³NwYL†x̯iVù¿L €Ä8 ² ˆ¡ ä "á{÷þ~ÀýY€1ÞoÈ æ[‹-V˜U(«Í‘Ϙ˜8›7ßÁ±ÑQí—ðñ_?ÑhÎÀÇÁÅj7¬óÆïè._Üù 4i½÷SOMÓ*obüÄøuA;  Lh#~ÃÖ”ÐøŽ-À3f„¾äqj9jRS#Bšã_¾vs÷ïã/ß gw¾¼»“æF­izêr¬6ÇÆÆpùò³ |0êmJ††¸*«'‚c寻ní€?îÌ #éT¦i`üœ[«Vµêê†ŽŽŒàwßãØlOž?‹©'Ïëín'ny‚“ãc¸òÌÓ8~|¯¿>‹—^ºÖV>@[vÊeø^nuÏÃÎ-@ Žfs§Ý‘THµ€.)Žà…fh¶'ñÑGæosøâÿÄ¿¿¹`6°ÖЯGpnòâ,`žyöYœ¯SI(`^½þC‚L´¶×ÉP¶—œ{¤8“ÉêÀ•²ê \ê Ã‰£Q§c `ÛjD[)ú”Žªy“ èu›æ¾Ã#LºY|Mæ7gžãÙf£a »ÝßócÔ¬(«âÉÎæ¬ÉK_;¬ÔÔÏ(i ØÕXœc¬O˜åå%$IÍ­4ú§Òú2–1@q·-„ø#iZÛ*×k|S{gnnîÛ[ØDD@]´%fݲN‰ZœF}ãÐ$ÞºÒùóç[ˆ$+°’\/–móóÏožp8Â"}S(„ƒUˆHim½ô{*i×mu´VMõfCò͈ÄVÖ×ÿ–/:üXÿMþAÒ% yr­ZÿxµPüS¥^Ÿ7‘H>‰4:pûöí&+¥ÕÅRÝ3"YcmÏýù¥_ᓚ=P1T¾’Éî|øa ú¿§Û“‡Õ+~IEND®B`‚transmission-2.92/qt/icons/hicolor/PaxHeaders.4960/128x1280000644000000000000000000000013112442116606017735 xustar0030 mtime=1418239366.372281552 29 atime=1418239366.24327934 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/hicolor/128x128/0000755000175000017500000000000012442116606021440 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/hicolor/128x128/PaxHeaders.4960/transmission-qt.png0000644000000000000000000000013212442116606023674 xustar0030 mtime=1418239366.372281552 30 atime=1418239366.372281552 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/hicolor/128x128/transmission-qt.png0000644000175000017500000002010512442116606025317 0ustar00mikedldmikedld00000000000000‰PNG  IHDR€€Ã>aË IDATxìÀ 0£“ÁÄô`ÿ±È§ÜÕQHSaðÿæÜÝ@f¥˜R¡V¢! ñÅ^Ò§¢ * ¢0Ñ»¶;u¹«h…e*õ.D‰I‰–ŠU)AVæ´¬R¨§?_¸GQÜàß¹/ß9;gðyü†~ºýAýñZŒÚ‡ ~UéY„ÍjÓ^ŒK<ÅÅGIÖé¯ßð]!lF>À5ÀÑ d6ûLà[¯pzúÉ€¿f~y‰ O‚õþµP5¬i(:XÙxÏüoAØyp6Sâðòiaà¿­&0F¿Iâ-Tä-®­ý–ô>}$ýƒ}òjd@†G_®hhdP}ò¬Gºî·ÇúÔ?ªz[ JŸékv…Ézaà4¿Ã&°Hbµº³gþ/.¨Ë‹>y7öZÞ¿Y U38Ô/¡Æ:Õ+pé¢ê aà2i+Ù—˜,”OÏm@—…IN§=5'YÅÅØ]ZŠ\ÚOTH^*ŠƒÔÌí`Àn³#m[:\.74Í¥8É+ҜꜪIõlÛíZJJ\fóR! <ÚKÙ´£¤[ss‘ÌßadÛÆ•¶ˆ ”ÓI³Ã!Ýeeò¶ºZ& C"4k¡NC½ßê-LOÒW™ŠLÊlj«Á³_T Éí¶VÕË4|–Îø{À¿øC`Þ¿çFµƨ@P2FsvÒx×Û…ó`­K¯úóÍaŒk½—®!Ú$XN #aìˆôÊ—¤ºÿ 9¡"ü{Àà‹ÀwÀàoÁ¹’6@Ý9Ô‘"çüž» èûüsÖ¢CpÂÿå€àÓù!HäÉ0àïÖ±xÅÿ& hò‡úôö«Ž¤+è ð…þÀïÈuJøup:8_Ð!” ýI³7Vö%ÀŽ@`ÜÉU؋ۄz À=·:ÞÛâÊå¼{ûñÝü‚æ¡€Ë.†Ø¼{’+{¿ýû\Í#ëÈÏÏÿÊýòW?ßy¯¾ï;ÿá8üßþý/„¸ÛX¸&ÿ¹Û` ð,€µäÆ €oîf¸»áåöü¹mÞáØ¬%]›„Òm àŽ†KÿÀ9¸ pÞŸ»Û.V®ípÛÜpÖµMø?ßáØ€sd[£VßGÞÑØŽ,Ùö’0¸K°íl;¼û\À¶ @Û B]JÜØ.µc°l6~úÁO‡…Ó µ¶ìùÒµI(a‡ž¿GˆN± ÿɳ$ÿ·…¿#|H¸ ÂÚêšn¨€ºñvF´ã½þŠ" jF{\Fþ¨ ÿ·ðO„ÿM8'N? |Oxzëc«Á`›“Av«æ‚z…¯¥ü׿)üïw’ 8(ü3í|c zzz0::ŠÉ©ILïœÎ¥r9£Ðq} Ã\ŸybrÃÃÃ(˳{~Oø/…Á`ú„ÿ5}p®°gÏ ñ°†NÁÒ»ÛØzýtp!,`ïÞ½ùN] ã8Æêê*æ®ÎayyYoùGé¯ÿI·[€¿/ba~êßl é3h0ׯÌ^ö½‰Mpu“OéïïgvTî)Ç ¶ÏÐàE0<4 ù>´‚W„ýÂJ·Y€CB”J%2ªæ °!¯Ì^aççG²CÛ ¾/WT*ÌÌÌp dX º  "EIxD  P( ˜LÓíÚ5šB­9zOœ|§NŸÄɧž¼Ž§nN¾×§ Â\&•N?óÔMùô³§×å©SOâøÃb|lÌoˆVÔu€‡#Ýêhªc´Ñü4†Š^\XÔgžVî/c³qéâ,­ä&‚®ltt›ñ‰qì?°‹ó‹øñ‚(jÒä÷¯öû#íeL°¦ÒE7Z€’UFÿ†5t€’)šúÖ'O>Žþ¾>„A¸Ù¤ùÌÃÔªõÍ|N¦x_õëzÔ2’Z” ŒôtµègÉ{T­³ì|ŸLs´HtôØ o6Ù˜9LãòùhÓŸw|| =ô@jebŠ×o3g-¯[ѽª è6öëþưxMIª1Á‘#‡%`í{³¹ºVåsäžÚ±ÉÏËWbnF4ûJ$Öñ¶mwZ/,ŠRM`@Ó%We’ÄPŒI ¯¯7Î/,²±Éàg.--çòÌ“;|¿ïµÛ‘í)¤åÔ&Žw› JÅ"}V‹ `ÁGÁ¹úœpñâeä…Ë—¯ p@(Z]€µŒȾŒ@°û,€€î,¯JÖ¹½BM^˜¡´Ý:‘ùz^ gš—-ýY-€âH×  /êŽWeì[€|vÒe6Z'ˆ…"<ÍQD²»£FÄûÉ8Öù ,.]£‰Îcã£*¿Ý¿ødz“šÿô5³!¢ˆþÒ¥YZçͶP:‘D£ÙdÇúŒ(ŒúulŠ8Ô$ò^Ge¡âJ>`= ŸÍo;g-¯AJÐïÞfëàeåR™ÑªV¯”65ŸŒ°Xc„ôq¤¹ŽF©÷zÞàÞËbž‹…˜ŽZ OÈQÕ¨gP]ƒOŠ£ 2¡ €-—…ÍÍÍç´V~ûù™À@ô wu‹`ã”{J©Ï²žk͆Ùqd d{4ææÂðï÷DqåêŽR ÇNª)§_¿¡Éoø1;Ÿâ!#^[ZÌÏ-"H»hI˜î©5@`È–I¡£Ý#€¢ ”V­Ë2ÿÄÈð°¯îë;9 I_$ïÉ&ƒÀù%Z"X‡fºÒF3ÆQ}6”ro”f Ì RwbùÙhR„-‰T‘¶ïÞëdçý½ï–Z€€ìïï>†¦€l Ãð;ÙŸœ‘/iüN6JOÊLQ¼ÏçÜü"ÇQꜣïf˜ŽfZ€z´1Ò Ä` Ù”+Ó@ZvÆÊÊšo•t¤¶Z$2Ûµe»·1Æi-Ðï8Ê%uŽt‹`jGUgšžÕNö/[ʌѣ÷*¯Jp&#”L,Ó@aÂQLj àæT·A2¤˜~6ÝÀüâÍ­’' e¶(”†k)µžA7àg:+È@Ût˜ ¯ví³5<0@AoDµ0ó~RèêÜ<;G:Iëd7IZíäÆúŒM­’O7 [XXôÄ—m‘²Eá¹¶ ÷¶cÇ1ˆßüNråJk©·tƒçö½Y@ŸŒÀÕJÈ®–Ñë™D2Sz¯Ò{O@ÎÍ-0¥ °q³I6#’©]T'ýš@&™ F©Bˆm L¸¸´„à&)XϽeÇ<"€q(õFKàtà``pÐß…n¡t€S•:Ý:hÎé&ÓB6L+}_™!ŽÖûçççùE Aé¨UPoÉÔ"dR:¼ÑŒÉ¦ÆMZr‘`¶Eº÷¶c³õzK*˜è}¢ˆ¢ðÀ–[€B¡HtΩ, 3ð@s¯Æu‚ði®«3ÈÆ ŽÎ0¤¹¿G0i`2kþY M „Ì8-BÿcY,€ 2­RÛîÍ¿p`PçüQ«ÕZRA«1…X€ŒL`+-@±X@9{!GŸb”Àó~CdŠBÉ{•׉baa‰‚‘ÑÉk’XvZUquuÏ ›.%‚HWgÂþÞ>”Š¥t^k«-*ñYÄÍÈçÖ)Ž «Ô¶{k’º Ë@8 Bé"0dÃxuk%ý­BÖÀóµÌN”*ŸÙÂPAÌ/,¨†Cb)òŠ,AW+ óÜnµ;›üݰˆ´™$Ì佚 ÆÅBÈﺴtm«¤Ìrmëº7u|Þ$¡Ù' ®ìbÐVº>>(œËòÿÄèØ˜vtvnLú‚ð™y/9?¿ þ™.ȯäÍÎ^Áea½Þ`0¸Ò \™Åe¡†ÄMÄQÌÏÖTPÐbÅ2[¬¾k[ǽµfµZFI˜VŠpRÙ* ¦i }Rú{d¦€ºòÅ/‚´_8 2ç–Ô0XjªßV*Uœÿâ |ô³ŸáóóçqáâÅõÈ{>üè#œ;ÿnYS!9gàªÐ–®-g¸ª ÷fÚso““~ è·%Ÿï Cº­¶‡‚>){éŒB¶=oNá¤%Ò^’ Œ.zJ!ƒ7–ãFÕjEFôe|ñ›/×å¥Ë³¨Tk¨7ˆ˜$¼öö”´H._»¶žUò,Y{îmrbŠjF íä-«Û+ìÙ ²1úz{¬›êö¦!-„Ü^áĆŒNv®–€üg߇‡`Àß %hšÍ Ó¹C½*ÄpwS¦U2·çÞ&$PŸ_«Vý6‚³‰þÌý‚^ÞŠAû5,—{üu€P¨ó@‚~"㤠—þǃêÍY?.--ª?d:(`½|ï¾½lXúÍ0¸…•ÂIBASX²€bv,•±º¶ À Ðà2¾šoÞÅûɃ~³™äv±ªÀoÏÄjûÝ2îÇÿ·Óà€ŽlÉ]uÚ²5ê¥tÅËz¥\2Ȩ¨Ÿ~5ä:=-ëfÓþ~ZåµíÍ¡dú^Ãgâòmݹ[(0ãá¿í»‘™Jß½m`-„ Aøm὇Ö4#踨ØR¹“±<Џ>OQaÃe‘SË=eaÏ^²·LÒï_£™3b·Ö2+XZXÄÒâÒf»w¯][N LM–WV¸bppCƒ#&‡[).d…°¸a÷6Å@bó'…üý–´] €|ðŒ•@¬«+²,€¯n_£Ãc—ë 8B’ËËGU­^§™tÎ0“ `SX«Õ¤A˜‡:çÀÓ<&ǧÙñC…p‡‡Fù¬l— Ì LNNÈŒ,‚€{i}·\ƒ¬lt€_HÉÜ;§:[ƒ£Àc‹(6º_gìHgpÝžMœh¿-6•Î$‰åQE°V©03ØxßFÝ›"Ý€¿UÌ[(±‚t6Ñß²ÄhÙ&s» HïÀkV<Ä¢Ë÷¿ÿ§(‹©×ûÍ Ž‚»03âtëþÒ8Ün‹Á¦Â„qÈédçËß_þæ |÷?ÿ'Œ ¬·>“éh|åá¯p6Ôy£"]KÏ—¦§¦ýC$üvÕ×é2²N‚ ¦ÒþX锤ÇÁ° l‚Ì €õì Ðò½Z´@Ÿzâ«_ÅÇ,{çL?¸Â0àµZ©²cFÒUÇ9€#nnŽ£Rv7±Æ1sáy0vyôÄ =zT3^[á¼THVѼK¼Aøíª³‚î.n‰~Òàg½òd×êÒÕ.;6Zã§°yä+8{ö-ìܵ+kLŸ+««œ±[ߟ8Ç€m3™+Õ5^9ÁEJºš}<øàCü÷Ý{wLmpÊ›÷NLL¨àëJxq–¬¯¼í@°pû) î¯€¾Jsõ§ã†ËǾñÚëøôÓOð—ù#om¡‘¼|¿þüüu¢ºVA­RËmë™M,~ñË_AHë³ÿ>Ø¿>öîÛ‡'Ÿ<ékÓêï4²¿¾ðÁãá.]ºDk£))hô}CþçG¶DºÌÂòš!šÿÛÁý÷? |þì‡ÿçÏŸã÷ß»w·Œ’q|òóϘöé¨s0ì¨A+°sz GbÌáÏvž|ò÷ûg´œLa@ ¢«Öª~ÚGw† mB- ¸Ý@0k%MŽXMoÜûòË_ÇK/½Ìågê_OÂÎJ¬Ý:Šîž{ö)¿óE„{ñÖÙ·qúô3ìü͂ۯE«7<3`tD­+†…“°ÃÂ1eàBÙþ¿î ` y`×®Ý8+ðÁ?ÆG}Ȇ™”Ù´çÏ<ÅØàÜù/o= e™ÂCÜ ÐÜûÔ©Sü@~à j¶¯Gúíë§Ü#c#­qÀÕœ,@vÀ¨Oòɦïr«€O<ñ$Þøæ›˜Ø1­O—¸à™ÓOpb¨ÍQÏ.§O=†'Äš¤Ïu‚'OžÂ[o½ÍÎï4”’sK*èÚHó¤WSÀŒ½’¾än|ŒËRªo¾ñ&;),„é”|íÌiÜ/¾LáÖ!w?úðƒòž§DLãP?ß}÷ã[#‡þ ÅÕ)¨¨×ëÜœ¢m뜎Z¤ìT0o P  UÀëÏä$Jzj«…ùƒÅNzû­oa·ŠFÛ÷ßw/½ð´qä†~þÈá{ðêËÏáà=ûÔ¼²õægoð¤ÎŽ¢5\ˈÀ¥;mö§Ñ<Ò$3T>¹JGG‡Áüø·þúkxîÌó Á×ñµçNã«<„Bê¼?ýü«/‘òº5Ín^zñeHŠ–e« .@A¿}]êŠEÖ:ïÊ¥2]XxAËVmC Ø*»÷^¼ýö·pèÐa¤àHÿk¯ÒkãÃBÓh @#RŸF ÕêØ‚îçÅ_Â+¯¼Ê€¯õö2ÀÛ9= ÅÑ£Çðηþ}ôQ–]¿úÇÅ.~;ÇÚ;é¥Ù=½¹ ÀpIÒ ä’u&0ót:³ ÀÈ]¬ 7>¦ÅÌ~ó›oàùç_`µ±›P«UýÚGV @ŽŽŒÂÃÑ\ðþwÿ‹iFÍa£E¦€},o:¸Ö®ŒÒ ‰3ºÌ\ž~úY¼þßf€÷ _Ãë¿ýWàt!¸ ÍŸVöÛ-1JpëáØf‚ØùRq ×<¤ #{ctZæñ§/V…3’-S©nÁôÎ ðº,w·nªñ‘NJ*8 _Ò_GÞÜŒ›08sæL¸gf¦æ™jŒ_–ô)óùBñÞ{ïá§?ý`CU¹m0ï—UQßÇ_üÅŸCKî»wïimã4þƒXµ ÎáØ3gJÒg!s» ŸY˜JõBoâܱÐK1ÐA[15=ÅU0Ÿ}ö3‚wß}—AÍ¡C‡( jLżŸ³^ãm¼–Ççèkù|ŽÿšN£ûƒåøÃdzÚXp§&%–™½|™1@£Ñ·EuAôƒü ànEF> %P%S«õG&4‡A PB_z&ýPÄß>CWñ‘ìµsα¤ùá‡b.l±²yÿܧ·GÖ%RÆ`o1ã–†;{ö¬{ÿý÷-×®‚_7ʼnR©7 ‚Áи!cÌ>t—¬î¤u븚ãÇæÜ¶,äàAÎú¯†¨?ÓŸýk{¿÷ÿ_§¥½×nã÷Ù÷òµ\?«P(2·ß¹s'—†IG" Î:-{û)c88Ðwÿ5k?’êaòé§Ÿ&ëÅÙ0'Nœ(z×âxa8ZH’ÁÃ÷}G|ÍI©ðê+¯ðÆÅ¥Åmß¾5`1Nw ÿLv?ÿðÏÈŸW*Õ83·ø?zâx©Ùl®||ìXj6˜šåÉÉ`Ù9©4Ê–BÑд€+QôH5ñWÛÜ*ÖkÚœ›Q„A°3Œãž¤X,¥Oœ;´]ØS«™BµZhÅÄÄX?ªÔ¿˜K°jõú žh1È»þk“,uޜۜ˜œâ¤UkÛJÛk?p»‡ÀS€sEÉ(B¡`Ú€ø#)A˜$A`L(ªÒ`:j4HYú½9[ÕSæ¼ôµñÑ1-Ͻ7å6ûzzäµ¶m£^×~àQ¸Œ ‚ÐJßIÆ6öí3m[€(ŠŒµÖXézçœqž‚œµ<ùCH3´çæxÐÁââôµK³—¸À’Ÿq3n“ÿòúì•ÙŒöe’Ò_ð:g$† ’Dì·XóM]š8KÕiΪ;€³páÂÒÇÌÌ ¹ÛƒwEбE¡Î:=K—)Ê6·†‘w®qÜŒ;¹;ØÁWaWaù À;ü‘eáÿ¿°-pÛè.8¸ü`›À³qàœÎTm»­'ÕqÜ I’siŠÈS¬Ò5ø<ÿo…ñÿ)Ùt»|îhÆ€¦wz,ϯ—9A´ŽŒ|¶w‘î¬HÍߨveSVAàŒiž¿tmå‡ý½=@ÏÂÂä_éâq&r÷ìú'ƒm#—SJHE'XX˜GÝÛŒ»V­}fŒqB'Úµk4¸s@³éøa€«Ôꋵz㻺Cõó_Ž™‹3êô}\¿–·éw~3Špuî ×Yè4»sneu­r91ƉU`z{Û_"óNVôZÛ×—@œ¿ƸKWæÿøž½;Ÿ—Þ+£ç>?‡ÅÅELNNb0­ûÛȉMheeã Ï0”9í|ýÿÆ8#~ ,“úÊŠ-ùe›ë¸ìlC3h4ÆŠa8ê¬àJçL¹TÚ3=ùOÃ0x]ƒm4¢æyáÒ{‰1XiZ»8P(\ ]ûàƒâvÖ¸‰‰9ASTTO¬­› h8çbc•¿hå‹‹³¿+¡?q@ ÛØR8箬¬Uï¯:@Ó„aƒ}V(4bÁZÈÒ0!ZiøCÞ?Õ¥¥žjµ¿ …B}p®$ ‘Î–Š…ž‰±‘§Ä*l[ƒÎÂʼn½ÔhD¿^\^ù$±®n­MŒµ S±Æ,—­]©×ëµO>ù¤Ù® ÐE¡¡%}I’ ¸b±ßquŠ.´AèœÁ6¶‰1.°V.&J¬­» ¨˜z}mu|¼öØÄD“‹BÛ@†$ð(—J#=I±Y†sE›$D¤¶±¥0i´_°ÅDú?jˆÙ/Çq}ap°q“Î'þ3ÌÙòò3IEND®B`‚transmission-2.92/qt/icons/PaxHeaders.4960/Faenza0000644000000000000000000000013212544044705016551 xustar0030 mtime=1435519429.511526269 30 atime=1427460260.582246011 30 ctime=1457295917.269761477 transmission-2.92/qt/icons/Faenza/0000755000175000017500000000000012544044705020253 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/PaxHeaders.4960/index.theme0000644000000000000000000000013212505250245020754 xustar0030 mtime=1427460261.639264877 30 atime=1427460261.639264877 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/Faenza/index.theme0000644000175000017500000001221612505250245022403 0ustar00mikedldmikedld00000000000000[Icon Theme] Name=Faenza Inherits=gnome,hicolor Comment=Icon theme project with tilish style, by Tiheum Directories=emblems/8,actions/16,animations/16,apps/16,categories/16,devices/16,emblems/16,mimetypes/16,places/16,status/16,stock/16,actions/22,animations/22,apps/22,categories/22,devices/22,emblems/22,mimetypes/22,places/22,status/22,stock/22,actions/24,animations/24,apps/24,categories/24,devices/24,emblems/24,mimetypes/24,places/24,status/24,stock/24,actions/32,animations/32,apps/32,categories/32,devices/32,emblems/32,mimetypes/32,places/32,status/32,stock/32,actions/48,animations/48,apps/48,categories/48,devices/48,emblems/48,mimetypes/48,places/48,status/48,stock/48,actions/64,animations/64,apps/64,categories/64,devices/64,emblems/64,mimetypes/64,places/64,status/64,stock/64,actions/96,animations/96,apps/96,categories/96,devices/96,emblems/96,mimetypes/96,places/96,status/96,stock/96,actions/scalable,apps/scalable,categories/scalable,devices/scalable,emblems/scalable,mimetypes/scalable,places/scalable,status/scalable,stock/scalable [emblems/8] Size=8 Context=Emblems Type=fixed [actions/16] Size=16 Context=Actions Type=fixed [animations/16] Size=16 Context=Animations Type=fixed [apps/16] Size=16 Context=Apps Type=fixed [devices/16] Size=16 Context=Devices Type=fixed [categories/16] Size=16 Context=Categories Type=fixed [emblems/16] Size=16 Context=Emblems Type=fixed [mimetypes/16] Size=16 Context=Mimetypes Type=fixed [places/16] Size=16 Context=Places Type=fixed [status/16] Size=16 Context=Status Type=fixed [stock/16] Size=16 Context=Stock Type=fixed [actions/22] Size=22 Context=Actions Type=fixed [animations/22] Size=22 Context=Animations Type=fixed [apps/22] Size=22 Context=Apps Type=fixed [devices/22] Size=22 Context=Devices Type=fixed [categories/22] Size=22 Context=Categories Type=fixed [emblems/22] Size=22 Context=Emblems Type=fixed [mimetypes/22] Size=22 Context=Mimetypes Type=fixed [places/22] Size=22 Context=Places Type=fixed [status/22] Size=22 Context=Status Type=fixed [stock/22] Size=22 Context=Stock Type=fixed [actions/24] Size=24 Context=Actions Type=fixed [animations/24] Size=24 Context=Animations Type=fixed [apps/24] Size=24 Context=Apps Type=fixed [categories/24] Size=24 Context=Categories Type=fixed [devices/24] Size=24 Context=Devices Type=fixed [emblems/24] Size=24 Context=Emblems Type=fixed [mimetypes/24] Size=24 Context=Mimetypes Type=fixed [places/24] Size=24 Context=Places Type=fixed [status/24] Size=24 Context=Status Type=fixed [stock/24] Size=24 Context=Stock Type=fixed [actions/32] Size=32 Context=Actions Type=fixed [animations/32] Size=32 Context=Animations Type=fixed [apps/32] Size=32 Context=Apps Type=fixed [devices/32] Size=32 Context=Devices Type=fixed [categories/32] Size=32 Context=Categories Type=fixed [emblems/32] Size=32 Context=Emblems Type=fixed [mimetypes/32] Size=32 Context=Mimetypes Type=fixed [places/32] Size=32 Context=Places Type=fixed [status/32] Size=32 Context=Status Type=fixed [stock/32] Size=32 Context=Stock Type=fixed [actions/48] Size=48 Context=Actions Type=fixed [animations/48] Size=48 Context=Animations Type=fixed [apps/48] Size=48 Context=Apps Type=fixed [devices/48] Size=48 Context=Devices Type=fixed [categories/48] Size=48 Context=Categories Type=fixed [emblems/48] Size=48 Context=Emblems Type=fixed [mimetypes/48] Size=48 Context=Mimetypes Type=fixed [places/48] Size=48 Context=Places Type=fixed [status/48] Size=48 Context=Status Type=fixed [stock/48] Size=48 Context=Stock Type=fixed [actions/64] Size=64 Context=Actions Type=fixed [animations/64] Size=64 Context=Animations Type=fixed [apps/64] Size=64 Context=Apps Type=fixed [categories/64] Size=64 Context=Categories Type=fixed [devices/64] Size=64 Context=Devices Type=fixed [emblems/64] Size=64 Context=Emblems Type=fixed [mimetypes/64] Size=64 Context=Mimetypes Type=fixed [places/64] Size=64 Context=Places Type=fixed [status/64] Size=64 Context=Status Type=fixed [stock/64] Size=64 Context=Stock Type=fixed [actions/96] Size=96 Context=Actions Type=fixed [animations/96] Size=96 Context=Animations Type=fixed [apps/96] Size=96 Context=Apps Type=fixed [categories/96] Size=96 Context=Categories Type=fixed [devices/96] Size=96 Context=Devices Type=fixed [emblems/96] Size=96 Context=Emblems Type=fixed [mimetypes/96] Size=96 Context=Mimetypes Type=fixed [places/96] Size=96 Context=Places Type=fixed [status/96] Size=96 Context=Status Type=fixed [stock/96] Size=96 Context=Stock Type=fixed [actions/scalable] Size=96 Context=Actions Type=Scalable MinSize=8 MaxSize=512 [apps/scalable] Size=96 Context=Apps Type=Scalable MinSize=8 MaxSize=512 [categories/scalable] Size=96 Context=Categories Type=Scalable MinSize=8 MaxSize=512 [devices/scalable] Size=96 Context=Devices Type=Scalable MinSize=8 MaxSize=512 [emblems/scalable] Size=96 Context=Emblems Type=Scalable MinSize=8 MaxSize=512 [mimetypes/scalable] Size=96 Context=Mimetypes Type=Scalable MinSize=8 MaxSize=512 [places/scalable] Size=96 Context=Places Type=Scalable MinSize=8 MaxSize=512 [status/scalable] Size=96 Context=Status Type=Scalable MinSize=8 MaxSize=512 [stock/scalable] Size=96 Context=Stock Type=Scalable MinSize=8 MaxSize=512 transmission-2.92/qt/icons/Faenza/PaxHeaders.4960/AUTHORS0000644000000000000000000000013212505250245017671 xustar0030 mtime=1427460261.580263824 30 atime=1427460261.580263824 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/Faenza/AUTHORS0000644000175000017500000000035212505250245021316 0ustar00mikedldmikedld00000000000000Faenza is designed and developed by Matthieu James . Faenza icons are all licensed under the GPL. Thanks to Holger Seelig and clemyeats for their help for having some text preview inside icons in Nautilus. transmission-2.92/qt/icons/Faenza/PaxHeaders.4960/emblems0000644000000000000000000000013012505250245020166 xustar0030 mtime=1427460261.572263681 29 atime=1427460261.56826361 29 ctime=1457295917.26876146 transmission-2.92/qt/icons/Faenza/emblems/0000755000175000017500000000000012505250245021672 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/emblems/PaxHeaders.4960/scalable0000644000000000000000000000013112505250245021735 xustar0030 mtime=1427460261.575263735 30 atime=1427460261.572263681 29 ctime=1457295917.26876146 transmission-2.92/qt/icons/Faenza/emblems/scalable/0000755000175000017500000000000012505250245023440 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/emblems/scalable/PaxHeaders.4960/emblem-important.svg0000644000000000000000000000013112505250245026007 xustar0030 mtime=1427460261.575263735 30 atime=1427460261.574263717 29 ctime=1457295917.26876146 transmission-2.92/qt/icons/Faenza/emblems/scalable/emblem-important.svg0000644000175000017500000004361512505250245027446 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/emblems/scalable/PaxHeaders.4960/emblem-important.icon0000644000000000000000000000013112505250245026140 xustar0030 mtime=1427460261.575263735 30 atime=1427460261.575263735 29 ctime=1457295917.26876146 transmission-2.92/qt/icons/Faenza/emblems/scalable/emblem-important.icon0000644000175000017500000000454512505250245027576 0ustar00mikedldmikedld00000000000000 [Icon Data] DisplayName=Important DisplayName[af]=Belangrik DisplayName[am]=አስáˆáˆ‹áŒŠ DisplayName[ar]=مهمّ DisplayName[az]=Vacib DisplayName[be]=Важны DisplayName[be@latin]=Važny DisplayName[bg]=Важно DisplayName[bn]=গà§à¦°à§à¦¤à§à¦¬à¦ªà§‚রà§à¦£ DisplayName[bn_IN]=গà§à¦°à§à¦¤à§à¦¬à¦ªà§‚রà§à¦£ DisplayName[bs]=Važno DisplayName[ca]=Important DisplayName[cs]=Důležité DisplayName[cy]=Pwysig DisplayName[da]=Vigtig DisplayName[de]=Wichtig DisplayName[dz]=གལ་ཅན༠DisplayName[el]=Σημαντικό DisplayName[en_CA]=Important DisplayName[en_GB]=Important DisplayName[es]=Importante DisplayName[et]=Tähtis DisplayName[eu]=Garrantzitsua DisplayName[fa]=مهم DisplayName[fi]=Tärkeä DisplayName[fr]=Important DisplayName[fur]=Impuartant DisplayName[ga]=Tábhachtach DisplayName[gl]=Importante DisplayName[gu]=મહતà«àªµàª¨à« DisplayName[he]=חשוב DisplayName[hi]=महतà¥à¤µà¤ªà¥‚रà¥à¤£ DisplayName[hr]=Važno DisplayName[hu]=Fontos DisplayName[id]=Penting DisplayName[is]=Mikilvægt DisplayName[it]=Importante DisplayName[ja]=é‡è¦ DisplayName[ka]=მნიშვნელáƒáƒ•áƒáƒœáƒ˜ DisplayName[ko]=중요 DisplayName[li]=Wichtig DisplayName[lt]=Svarbu DisplayName[lv]=SvarÄ«gs DisplayName[mg]=Manan-danja DisplayName[mk]=Важно DisplayName[ml]=à´¸àµà´ªàµà´°à´§à´¾à´¨à´®à´¾à´¯ DisplayName[mn]=Чухал DisplayName[mr]=महतà¥à¤µà¤¾à¤šà¥‡ DisplayName[ms]=Penting DisplayName[nb]=Viktig DisplayName[ne]=महतà¥à¤µà¤ªà¥‚रà¥à¤£ DisplayName[nl]=Belangrijk DisplayName[nn]=Viktig DisplayName[oc]=Important DisplayName[or]=ଗà­à¬°à­à¬¤à­à¬¬à¬ªà­‚ରà­à¬£à­à¬£ DisplayName[pa]=ਖਾਸ DisplayName[pl]=Ważny DisplayName[pt]=Importante DisplayName[pt_BR]=Importante DisplayName[ro]=Important DisplayName[ru]=Важно DisplayName[rw]=By'ingirakamaro DisplayName[si]=à·€à·à¶¯à¶œà¶­à·Š DisplayName[sk]=Dôležitý DisplayName[sl]=Pomembno DisplayName[sq]=I rëndësishëm DisplayName[sr]=Важно DisplayName[sr@Latn]=Važno DisplayName[sv]=Viktig DisplayName[ta]=à®®à¯à®•à¯à®•ியம௠DisplayName[te]=à°®à±à°–à±à°¯à°®à±ˆà°¨ DisplayName[th]=สำคัภDisplayName[tk]=Möhüm DisplayName[tr]=Önemli DisplayName[uk]=Важливе DisplayName[vi]=Quan trá»ng DisplayName[wa]=Impôrtant DisplayName[xh]=Ibalulekile DisplayName[zh_CN]=é‡è¦ DisplayName[zh_HK]=é‡è¦ DisplayName[zh_TW]=é‡è¦ transmission-2.92/qt/icons/Faenza/emblems/PaxHeaders.4960/160000644000000000000000000000013012505250245020414 xustar0030 mtime=1427460261.571263663 29 atime=1427460261.56826361 29 ctime=1457295917.26876146 transmission-2.92/qt/icons/Faenza/emblems/16/0000755000175000017500000000000012505250245022120 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/emblems/16/PaxHeaders.4960/emblem-important.png0000644000000000000000000000013112505250245024454 xustar0030 mtime=1427460261.570263645 30 atime=1427460261.570263645 29 ctime=1457295917.26876146 transmission-2.92/qt/icons/Faenza/emblems/16/emblem-important.png0000644000175000017500000000103312505250245026077 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<˜IDAT8•ÏJ[AÆ¿¹÷d&5cÿ@•’âB,v]% í¶»î¥¯Ðl|.Ýú¾D¶mYJ T \‰E\\$ ™œs&®Ä$÷jõÀ9óýæã›cÚíö¦ª~M’¤GTŒñOš¦ßi2™´šÍæf­Vs1‡/ºÝn‹Tµà2ÏóÑ,Ðþøáý¿ãc¯66Ÿ~þ:šÕ+•Ê’ª6(„€ñx<÷–ÏÏükÿpu~æUuNWÕQá)1³™N§…ˆ/«öö  ŒafC!#"Ѻtn.cB†TÕÄ ¢³47—1ªjˆ™K ¬û¿3ßcð€ÌlAŒ±ÐÕ­Ü:‚u„êÖN^ƈHDJ¤ûßNQD„ã`P`Däî/üþò¹‘g™€çkkƒ7?f6w&xgF~õmp1ùq #"&¹I°Ø+Û»¹µk +Û»¥;`fCzY–=«×ë“Y÷‹½Ö_眀BÐ…ôû}  GιƒN§³¯ªë…Œ·e,Ï^¤izê½?¸ÎVï.kIEND®B`‚transmission-2.92/qt/icons/Faenza/emblems/16/PaxHeaders.4960/emblem-important.icon0000644000000000000000000000013112505250245024620 xustar0030 mtime=1427460261.571263663 30 atime=1427460261.571263663 29 ctime=1457295917.26876146 transmission-2.92/qt/icons/Faenza/emblems/16/emblem-important.icon0000644000175000017500000000454512505250245026256 0ustar00mikedldmikedld00000000000000 [Icon Data] DisplayName=Important DisplayName[af]=Belangrik DisplayName[am]=አስáˆáˆ‹áŒŠ DisplayName[ar]=مهمّ DisplayName[az]=Vacib DisplayName[be]=Важны DisplayName[be@latin]=Važny DisplayName[bg]=Важно DisplayName[bn]=গà§à¦°à§à¦¤à§à¦¬à¦ªà§‚রà§à¦£ DisplayName[bn_IN]=গà§à¦°à§à¦¤à§à¦¬à¦ªà§‚রà§à¦£ DisplayName[bs]=Važno DisplayName[ca]=Important DisplayName[cs]=Důležité DisplayName[cy]=Pwysig DisplayName[da]=Vigtig DisplayName[de]=Wichtig DisplayName[dz]=གལ་ཅན༠DisplayName[el]=Σημαντικό DisplayName[en_CA]=Important DisplayName[en_GB]=Important DisplayName[es]=Importante DisplayName[et]=Tähtis DisplayName[eu]=Garrantzitsua DisplayName[fa]=مهم DisplayName[fi]=Tärkeä DisplayName[fr]=Important DisplayName[fur]=Impuartant DisplayName[ga]=Tábhachtach DisplayName[gl]=Importante DisplayName[gu]=મહતà«àªµàª¨à« DisplayName[he]=חשוב DisplayName[hi]=महतà¥à¤µà¤ªà¥‚रà¥à¤£ DisplayName[hr]=Važno DisplayName[hu]=Fontos DisplayName[id]=Penting DisplayName[is]=Mikilvægt DisplayName[it]=Importante DisplayName[ja]=é‡è¦ DisplayName[ka]=მნიშვნელáƒáƒ•áƒáƒœáƒ˜ DisplayName[ko]=중요 DisplayName[li]=Wichtig DisplayName[lt]=Svarbu DisplayName[lv]=SvarÄ«gs DisplayName[mg]=Manan-danja DisplayName[mk]=Важно DisplayName[ml]=à´¸àµà´ªàµà´°à´§à´¾à´¨à´®à´¾à´¯ DisplayName[mn]=Чухал DisplayName[mr]=महतà¥à¤µà¤¾à¤šà¥‡ DisplayName[ms]=Penting DisplayName[nb]=Viktig DisplayName[ne]=महतà¥à¤µà¤ªà¥‚रà¥à¤£ DisplayName[nl]=Belangrijk DisplayName[nn]=Viktig DisplayName[oc]=Important DisplayName[or]=ଗà­à¬°à­à¬¤à­à¬¬à¬ªà­‚ରà­à¬£à­à¬£ DisplayName[pa]=ਖਾਸ DisplayName[pl]=Ważny DisplayName[pt]=Importante DisplayName[pt_BR]=Importante DisplayName[ro]=Important DisplayName[ru]=Важно DisplayName[rw]=By'ingirakamaro DisplayName[si]=à·€à·à¶¯à¶œà¶­à·Š DisplayName[sk]=Dôležitý DisplayName[sl]=Pomembno DisplayName[sq]=I rëndësishëm DisplayName[sr]=Важно DisplayName[sr@Latn]=Važno DisplayName[sv]=Viktig DisplayName[ta]=à®®à¯à®•à¯à®•ியம௠DisplayName[te]=à°®à±à°–à±à°¯à°®à±ˆà°¨ DisplayName[th]=สำคัภDisplayName[tk]=Möhüm DisplayName[tr]=Önemli DisplayName[uk]=Важливе DisplayName[vi]=Quan trá»ng DisplayName[wa]=Impôrtant DisplayName[xh]=Ibalulekile DisplayName[zh_CN]=é‡è¦ DisplayName[zh_HK]=é‡è¦ DisplayName[zh_TW]=é‡è¦ transmission-2.92/qt/icons/Faenza/PaxHeaders.4960/Faenza.qrc0000644000000000000000000000013212544044705020541 xustar0030 mtime=1435519429.511526269 30 atime=1435519429.511526269 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/Faenza/Faenza.qrc0000644000175000017500000000776312544044705022203 0ustar00mikedldmikedld00000000000000 index.theme actions/16/application-exit.png actions/16/dialog-ok.png actions/16/document-new.png actions/16/document-open.png actions/16/document-properties.png actions/16/edit-clear.png actions/16/edit-delete.png actions/16/edit-select-all.png actions/16/go-bottom.png actions/16/go-down.png actions/16/go-top.png actions/16/go-up.png actions/16/help-about.png actions/16/help-contents.png actions/16/list-add.png actions/16/list-remove.png actions/16/media-playback-pause.png actions/16/media-playback-start.png actions/16/process-stop.png actions/16/system-run.png actions/16/view-refresh.png actions/16/view-sort-ascending.png actions/22/application-exit.png actions/22/dialog-ok.png actions/22/document-new.png actions/22/document-open.png actions/22/document-properties.png actions/22/edit-clear.png actions/22/edit-delete.png actions/22/edit-select-all.png actions/22/go-bottom.png actions/22/go-down.png actions/22/go-top.png actions/22/go-up.png actions/22/help-about.png actions/22/help-contents.png actions/22/list-add.png actions/22/list-remove.png actions/22/media-playback-pause.png actions/22/media-playback-start.png actions/22/process-stop.png actions/22/system-run.png actions/22/view-refresh.png actions/22/view-sort-ascending.png actions/24/application-exit.png actions/24/dialog-ok.png actions/24/document-new.png actions/24/document-open.png actions/24/document-properties.png actions/24/edit-clear.png actions/24/edit-delete.png actions/24/edit-select-all.png actions/24/go-bottom.png actions/24/go-down.png actions/24/go-top.png actions/24/go-up.png actions/24/help-about.png actions/24/help-contents.png actions/24/list-add.png actions/24/list-remove.png actions/24/media-playback-pause.png actions/24/media-playback-start.png actions/24/process-stop.png actions/24/system-run.png actions/24/view-refresh.png actions/24/view-sort-ascending.png categories/16/preferences-system.png categories/22/preferences-system.png categories/24/preferences-system.png emblems/16/emblem-important.icon emblems/16/emblem-important.png status/16/network-error.png status/16/network-idle.png status/16/network-receive.png status/16/network-transmit-receive.png status/16/network-transmit.png status/22/network-error.png status/22/network-idle.png status/22/network-receive.png status/22/network-transmit-receive.png status/22/network-transmit.png status/24/network-error.png status/24/network-idle.png status/24/network-receive.png status/24/network-transmit-receive.png status/24/network-transmit.png transmission-2.92/qt/icons/Faenza/PaxHeaders.4960/categories0000644000000000000000000000013112505250245020670 xustar0030 mtime=1427460261.586263931 29 atime=1427460261.57726377 30 ctime=1457295917.269761477 transmission-2.92/qt/icons/Faenza/categories/0000755000175000017500000000000012505250245022373 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/categories/PaxHeaders.4960/scalable0000644000000000000000000000013212505250245022437 xustar0030 mtime=1427460261.602264216 30 atime=1427460261.586263931 30 ctime=1457295917.269761477 transmission-2.92/qt/icons/Faenza/categories/scalable/0000755000175000017500000000000012505250245024141 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/categories/scalable/PaxHeaders.4960/preferences-system.svg0000644000000000000000000000013212505250245027060 xustar0030 mtime=1427460261.601264199 30 atime=1427460261.600264181 30 ctime=1457295917.269761477 transmission-2.92/qt/icons/Faenza/categories/scalable/preferences-system.svg0000644000175000017500000026275612505250245030527 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/categories/scalable/PaxHeaders.4960/small0000644000000000000000000000013212505250245023547 xustar0030 mtime=1427460261.601264199 30 atime=1427460261.597264127 30 ctime=1457295917.269761477 transmission-2.92/qt/icons/Faenza/categories/scalable/small/0000755000175000017500000000000012505250245025251 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/categories/scalable/small/PaxHeaders.4960/preferences-system.svg0000644000000000000000000000013212505250245030170 xustar0030 mtime=1427460261.601264199 30 atime=1427460261.601264199 30 ctime=1457295917.269761477 transmission-2.92/qt/icons/Faenza/categories/scalable/small/preferences-system.svg0000644000175000017500000007422112505250245031623 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/categories/scalable/PaxHeaders.4960/extra small0000644000000000000000000000013212505250245024653 xustar0030 mtime=1427460261.636264823 30 atime=1427460261.602264216 30 ctime=1457295917.269761477 transmission-2.92/qt/icons/Faenza/categories/scalable/extra small/0000755000175000017500000000000012505250245026355 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/categories/scalable/extra small/PaxHeaders.4960/preferences-system0000644000000000000000000000013212505250245030476 xustar0030 mtime=1427460261.636264823 30 atime=1427460261.635264805 30 ctime=1457295917.269761477 transmission-2.92/qt/icons/Faenza/categories/scalable/extra small/preferences-system.svg0000644000175000017500000005552712505250245032737 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/categories/PaxHeaders.4960/240000644000000000000000000000013112505250245021115 xustar0030 mtime=1427460261.583263877 30 atime=1427460261.582263859 29 ctime=1457295917.26876146 transmission-2.92/qt/icons/Faenza/categories/24/0000755000175000017500000000000012505250245022620 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/categories/24/PaxHeaders.4960/preferences-system.png0000644000000000000000000000013112505250245025523 xustar0030 mtime=1427460261.583263877 30 atime=1427460261.583263877 29 ctime=1457295917.26876146 transmission-2.92/qt/icons/Faenza/categories/24/preferences-system.png0000644000175000017500000000272312505250245027155 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øgAMA± üasRGB®Îé cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs × ×B(›x£IDATHǵ•AhYÆ3™&“)$ZÛ4#µ%eKí¡ÒJ šƒ¢v¢×ºïD<éE<èMZYoî±+ÂB=Y!‚VEкZiØØ TÓ4u:“ɼÉÌìÁfhÚSwÙo†y3ó}ïû¾÷þç&m{ŽáÍqi—Xþf€½ƒàÙ³g¿ôõõ]‡Ãéÿ2c!ÄòÒÒÒõ\.÷ëV‚h¡PXl4>þL¡P Ñhì XQz{{Éd2(Šòwooo?`)MkE9°¾¾ÎÂÂ=Â4Íàçx<ÎÐÐ’$Q*•( ;ÚÛÛ™˜˜ •JÑÙÙy`Óî€@B „`ffI’ˆÇã?^È2'Ož¤»»›ÇS©TˆÅbHRkDŽã033C.—C @v!†a …‚>::J?]]]œ9s†H$‚¢(-ß4»a!p'ÀÞ¡Àó<<Ï#™L’ÍfÙ¿?ªª255…eYxžG"‘ \.388ÈÂÂ{÷îåÛ·oø¾Og;dÛ6BFFFèïï'N£i†aðêÕ+²Ù,Åb‘ÕÕUÆÇÇùôécccH’D6›ezzšD"Û¶ƒ$o'PU•x<Ž¢(äóy4MãéÓ§¼|ùUU¹|ù2œ>}š••Ž;F[[ãããD£Ñ- lÛF’$¦¦¦¸zõ*sss¼~ýY–¹víªªòñãGîß¿Ïòò2ápÇq8~ü8™L†D"AgA½^GA>Ÿ'‰pûömTU%™L’Ëå¨Õj¨ªŠëºÔëu:::‡Ã=z”‡òýûwNœ8A½^ßa‘\¯×q˲~F$‚ïû,..¢i¦i299‰¦i\¸pžžr¹§NâëׯT«Ut]Çqœ&AkÈ–eaÛ6¾ï+IUU®\¹B*•âÎ;(ŠÂÍ›7¹qã‡FUUJ¥ïß¿' !I¶m7'ÙrSAÜu]666¸{÷.¾ïS*•ð<MÓP…îîn666ÐuX,ÆÁƒñ|øÀ‹/˜%‹¡ë:ûöíCÑb‘²5d EªªLLLP©T˜œœDQæææx÷îÃÃÃ|ùò…ÑÑQÖÖÖxòä –e1<<ÜÜžZBn–7Ñh4ÈBÁôô4çΣ««‹{÷î“xûö-ccc‹Efggikk#8-,ÍÝPÁÙ³g‘eÓ4©ÕjD"òù<óóó •Z­Vyóæ år™F£A(âüùó[7;Ÿ€ž‹/ÎïÙ³§³££ƒd2‰,Ëì¦yžÇÊÊ kkk¬¯¯W^¡”@€ØÎ µR)å¥OŸ>ýåàÁƒ×Âápú;BJ¹²¼¼|m||üWD …ÂR³ÙÜ÷éÓ' …Íf󇀺®ÓßßO&“A×õ¿úûût ¢ëú¾ yøð!¶m·Åãq†††BP*•( ÿwvv299I*•¢»»{ÑMJ‰”’ÙÙY„Äãq4MãĉôööòèÑ#*• ±X !v–ÀóŸÇ4Mž image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/go-down.svg0000644000000000000000000000013212505250245024122 xustar0030 mtime=1427460261.070254721 30 atime=1427460261.070254721 30 ctime=1457295917.254761222 transmission-2.92/qt/icons/Faenza/actions/scalable/go-down.svg0000644000175000017500000010535012505250245025553 0ustar00mikedldmikedld00000000000000 image/svg+xml Shadow opacity : 30, 15, 10, (8) Bevel opacity : 30 / 10 Bevel opacity : 75 / 15 transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/go-up.svg0000644000000000000000000000013212505250245023577 xustar0030 mtime=1427460261.058254507 30 atime=1427460261.056254471 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/scalable/go-up.svg0000644000175000017500000010416112505250245025227 0ustar00mikedldmikedld00000000000000 image/svg+xml Shadow opacity : 30, 15, 10, (8) Bevel opacity : 30 / 10 Bevel opacity : 75 / 15 transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/go-top.svg0000644000000000000000000000013212505250245023755 xustar0030 mtime=1427460261.063254596 30 atime=1427460261.063254596 30 ctime=1457295917.251761171 transmission-2.92/qt/icons/Faenza/actions/scalable/go-top.svg0000644000175000017500000010673312505250245025414 0ustar00mikedldmikedld00000000000000 image/svg+xml Shadow opacity : 30, 15, 10, (8) Bevel opacity : 30 / 10 Bevel opacity : 75 / 15 transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/dialog-ok.svg0000644000000000000000000000013212505250245024416 xustar0030 mtime=1427460261.064254614 30 atime=1427460261.064254614 30 ctime=1457295917.251761171 transmission-2.92/qt/icons/Faenza/actions/scalable/dialog-ok.svg0000644000175000017500000010312612505250245026046 0ustar00mikedldmikedld00000000000000 image/svg+xml Shadow opacity : 30, 15, 10, (8) Bevel opacity : 30 / 10 Bevel opacity : 75 / 15 transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/small0000644000000000000000000000013212505250245023062 xustar0030 mtime=1427460261.085254989 30 atime=1427460260.935252312 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/0000755000175000017500000000000012505250245024564 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/media-playback-pause.svg0000644000000000000000000000013212505250245027636 xustar0030 mtime=1427460261.083254953 30 atime=1427460261.083254953 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/media-playback-pause.svg0000644000175000017500000001561312505250245031271 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/go-down.svg0000644000000000000000000000013212505250245025232 xustar0030 mtime=1427460261.081254918 30 atime=1427460261.081254918 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/go-down.svg0000644000175000017500000001521412505250245026662 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/go-up.svg0000644000000000000000000000013212505250245024707 xustar0030 mtime=1427460261.085254989 30 atime=1427460261.084254971 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/go-up.svg0000644000175000017500000001510012505250245026331 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/go-top.svg0000644000000000000000000000013012505250245025063 xustar0029 mtime=1427460261.07525481 29 atime=1427460261.07525481 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/go-top.svg0000644000175000017500000001700712505250245026517 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/dialog-ok.svg0000644000000000000000000000013212505250245025526 xustar0030 mtime=1427460261.076254828 30 atime=1427460261.076254828 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/dialog-ok.svg0000644000175000017500000001477612505250245027172 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/go-bottom.svg0000644000000000000000000000013212505250245025567 xustar0030 mtime=1427460261.077254846 30 atime=1427460261.077254846 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/go-bottom.svg0000644000175000017500000001726712505250245027231 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/help-contents.svg0000644000000000000000000000013212505250245026443 xustar0030 mtime=1427460261.083254953 30 atime=1427460261.083254953 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/help-contents.svg0000644000175000017500000005652312505250245030103 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/media-playback-start.svg0000644000000000000000000000013212505250245027656 xustar0030 mtime=1427460261.072254757 30 atime=1427460261.072254757 30 ctime=1457295917.254761222 transmission-2.92/qt/icons/Faenza/actions/scalable/small/media-playback-start.svg0000644000175000017500000001516112505250245031307 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/system-run.svg0000644000000000000000000000013212505250245026006 xustar0030 mtime=1427460261.084254971 30 atime=1427460261.084254971 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/system-run.svg0000644000175000017500000005653712505250245027453 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/list-remove.svg0000644000000000000000000000013212505250245026126 xustar0030 mtime=1427460261.077254846 30 atime=1427460261.077254846 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/list-remove.svg0000644000175000017500000001551112505250245027556 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/document-new.svg0000644000000000000000000000013212505250245026265 xustar0030 mtime=1427460261.074254793 30 atime=1427460261.074254793 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/document-new.svg0000644000175000017500000003207512505250245027721 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/edit-clear.svg0000644000000000000000000000012612505250245025674 xustar0028 mtime=1427460261.0802549 28 atime=1427460261.0802549 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/edit-clear.svg0000644000175000017500000002112212505250245027314 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/list-add.svg0000644000000000000000000000013212505250245025361 xustar0030 mtime=1427460261.074254793 30 atime=1427460261.073254775 30 ctime=1457295917.254761222 transmission-2.92/qt/icons/Faenza/actions/scalable/small/list-add.svg0000644000175000017500000001603012505250245027006 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/document-properties.svg0000644000000000000000000000013012505250245027666 xustar0028 mtime=1427460261.0802549 30 atime=1427460261.078254864 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/document-properties.svg0000644000175000017500000005045012505250245031321 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/view-refresh.svg0000644000000000000000000000013212505250245026266 xustar0030 mtime=1427460261.076254828 30 atime=1427460261.076254828 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/view-refresh.svg0000644000175000017500000002264112505250245027720 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/help-about.svg0000644000000000000000000000013212505250245025720 xustar0030 mtime=1427460261.073254775 30 atime=1427460261.072254757 30 ctime=1457295917.254761222 transmission-2.92/qt/icons/Faenza/actions/scalable/small/help-about.svg0000644000175000017500000012007012505250245027345 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/application-exit.svg0000644000000000000000000000013212505250245027132 xustar0030 mtime=1427460261.082254935 30 atime=1427460261.081254918 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/application-exit.svg0000644000175000017500000002672012505250245030566 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/document-open.svg0000644000000000000000000000013212505250245026435 xustar0030 mtime=1427460261.082254935 30 atime=1427460261.082254935 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/document-open.svg0000644000175000017500000004367512505250245030101 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/view-sort-ascending.svg0000644000000000000000000000013212505250245027550 xustar0030 mtime=1427460261.085254989 30 atime=1427460261.085254989 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/view-sort-ascending.svg0000644000175000017500000005050012505250245031175 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/process-stop.svg0000644000000000000000000000013212505250245026321 xustar0030 mtime=1427460261.073254775 30 atime=1427460261.073254775 30 ctime=1457295917.254761222 transmission-2.92/qt/icons/Faenza/actions/scalable/small/process-stop.svg0000644000175000017500000002231712505250245027753 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/edit-delete.svg0000644000000000000000000000013212505250245026045 xustar0030 mtime=1427460261.077254846 30 atime=1427460261.077254846 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/edit-delete.svg0000644000175000017500000000000012505250245045050 1transmission-2.92/qt/icons/Faenza/actions/scalable/small/list-remove.svgustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/actions/scalable/small/PaxHeaders.4960/edit-select-all.svg0000644000000000000000000000013212505250245026630 xustar0030 mtime=1427460261.078254864 30 atime=1427460261.078254864 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/small/edit-select-all.svg0000644000175000017500000004433112505250245030262 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/go-bottom.svg0000644000000000000000000000013112505250245024456 xustar0029 mtime=1427460261.06625465 30 atime=1427460261.065254632 30 ctime=1457295917.251761171 transmission-2.92/qt/icons/Faenza/actions/scalable/go-bottom.svg0000644000175000017500000011321612505250245026110 0ustar00mikedldmikedld00000000000000 image/svg+xml Shadow opacity : 30, 15, 10, (8) Bevel opacity : 30 / 10 Bevel opacity : 75 / 15 transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/help-contents.svg0000644000000000000000000000013212505250245025333 xustar0030 mtime=1427460261.243257809 30 atime=1427460261.243257809 30 ctime=1457295917.254761222 transmission-2.92/qt/icons/Faenza/actions/scalable/help-contents.svg0000644000175000017500000010257712505250245026774 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/media-playback-start.svg0000644000000000000000000000013212505250245026546 xustar0030 mtime=1427460261.060254543 30 atime=1427460261.059254525 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/scalable/media-playback-start.svg0000644000175000017500000020316512505250245030202 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/system-run.svg0000644000000000000000000000013212505250245024676 xustar0030 mtime=1427460261.245257845 30 atime=1427460261.244257827 30 ctime=1457295917.254761222 transmission-2.92/qt/icons/Faenza/actions/scalable/system-run.svg0000644000175000017500000021340212505250245026325 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/list-remove.svg0000644000000000000000000000013212505250245025016 xustar0030 mtime=1427460261.064254614 30 atime=1427460261.063254596 30 ctime=1457295917.251761171 transmission-2.92/qt/icons/Faenza/actions/scalable/list-remove.svg0000644000175000017500000013364012505250245026452 0ustar00mikedldmikedld00000000000000 image/svg+xml Shadow opacity : 30, 15, 10, (8) Bevel opacity : 20 / 10 Bevel opacity : 75 / 15 transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/document-new.svg0000644000000000000000000000013212505250245025155 xustar0030 mtime=1427460261.062254578 30 atime=1427460261.062254578 30 ctime=1457295917.251761171 transmission-2.92/qt/icons/Faenza/actions/scalable/document-new.svg0000644000175000017500000013755312505250245026620 0ustar00mikedldmikedld00000000000000 image/svg+xml Shadow opacity : 30, 15, 10, (8) Bevel opacity : 30 / 10 Bevel opacity : 75 / 15 transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/edit-clear.svg0000644000000000000000000000013212505250245024561 xustar0030 mtime=1427460261.069254703 30 atime=1427460261.069254703 30 ctime=1457295917.254761222 transmission-2.92/qt/icons/Faenza/actions/scalable/edit-clear.svg0000644000175000017500000011423612505250245026215 0ustar00mikedldmikedld00000000000000 image/svg+xml Shadow opacity : 30, 15, 10, (8) Bevel opacity : 30 / 10 Bevel opacity : 75 / 15 transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/list-add.svg0000644000000000000000000000013212505250245024251 xustar0030 mtime=1427460261.062254578 30 atime=1427460261.062254578 30 ctime=1457295917.251761171 transmission-2.92/qt/icons/Faenza/actions/scalable/list-add.svg0000644000175000017500000011000712505250245025675 0ustar00mikedldmikedld00000000000000 image/svg+xml Shadow opacity : 30, 15, 10, (8) Bevel opacity : 30 / 10 Bevel opacity : 75 / 15 transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/document-properties.svg0000644000000000000000000000013212505250245026560 xustar0030 mtime=1427460261.068254685 30 atime=1427460261.067254668 30 ctime=1457295917.254761222 transmission-2.92/qt/icons/Faenza/actions/scalable/document-properties.svg0000644000175000017500000024113712505250245030215 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/view-refresh.svg0000644000000000000000000000013212505250245025156 xustar0030 mtime=1427460261.065254632 30 atime=1427460261.065254632 30 ctime=1457295917.251761171 transmission-2.92/qt/icons/Faenza/actions/scalable/view-refresh.svg0000644000175000017500000012476312505250245026620 0ustar00mikedldmikedld00000000000000 image/svg+xml Shadow opacity : 30, 15, 10, (8) Bevel opacity : 30 / 10 Bevel opacity : 75 / 15 transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/help-about.svg0000644000000000000000000000013112505250245024607 xustar0029 mtime=1427460261.06125456 30 atime=1427460261.060254543 30 ctime=1457295917.251761171 transmission-2.92/qt/icons/Faenza/actions/scalable/help-about.svg0000644000175000017500000021432612505250245026245 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/application-exit.svg0000644000000000000000000000013212505250245026022 xustar0030 mtime=1427460261.071254739 30 atime=1427460261.071254739 30 ctime=1457295917.254761222 transmission-2.92/qt/icons/Faenza/actions/scalable/application-exit.svg0000644000175000017500000010053512505250245027453 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/extra small0000644000000000000000000000013112505250245024165 xustar0029 mtime=1427460261.23825772 30 atime=1427460261.091255096 30 ctime=1457295917.259761307 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/0000755000175000017500000000000012505250245025670 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/media-playback-pause.0000644000000000000000000000013212505250245030222 xustar0030 mtime=1427460261.236257684 30 atime=1427460261.236257684 30 ctime=1457295917.259761307 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/media-playback-pause.svg0000644000175000017500000001527012505250245032374 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/go-down.svg0000644000000000000000000000013212505250245026336 xustar0030 mtime=1427460261.234257648 30 atime=1427460261.234257648 30 ctime=1457295917.259761307 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/go-down.svg0000644000175000017500000001520512505250245027766 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/go-up.svg0000644000000000000000000000013212505250245026013 xustar0030 mtime=1427460261.237257702 30 atime=1427460261.237257702 30 ctime=1457295917.259761307 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/go-up.svg0000644000175000017500000001526612505250245027452 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/go-top.svg0000644000000000000000000000013212505250245026171 xustar0030 mtime=1427460261.230257577 30 atime=1427460261.230257577 30 ctime=1457295917.257761273 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/go-top.svg0000644000175000017500000002010412505250245027613 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/dialog-ok.svg0000644000000000000000000000013212505250245026632 xustar0030 mtime=1427460261.231257595 30 atime=1427460261.231257595 30 ctime=1457295917.257761273 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/dialog-ok.svg0000644000175000017500000001567612505250245030276 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/go-bottom.svg0000644000000000000000000000013212505250245026673 xustar0030 mtime=1427460261.232257613 30 atime=1427460261.232257613 30 ctime=1457295917.259761307 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/go-bottom.svg0000644000175000017500000002056312505250245030326 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/help-contents.svg0000644000000000000000000000013212505250245027547 xustar0030 mtime=1427460261.236257684 30 atime=1427460261.236257684 30 ctime=1457295917.259761307 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/help-contents.svg0000644000175000017500000005751112505250245031205 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/media-playback-start.0000644000000000000000000000013212505250245030242 xustar0030 mtime=1427460261.228257541 30 atime=1427460261.227257523 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/media-playback-start.svg0000644000175000017500000001514212505250245032412 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/system-run.svg0000644000000000000000000000013212505250245027112 xustar0030 mtime=1427460261.237257702 30 atime=1427460261.237257702 30 ctime=1457295917.259761307 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/system-run.svg0000644000175000017500000005705412505250245030552 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/list-remove.svg0000644000000000000000000000013212505250245027232 xustar0030 mtime=1427460261.231257595 30 atime=1427460261.231257595 30 ctime=1457295917.257761273 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/list-remove.svg0000644000175000017500000001616012505250245030663 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/document-new.svg0000644000000000000000000000013212505250245027371 xustar0030 mtime=1427460261.229257559 30 atime=1427460261.229257559 30 ctime=1457295917.257761273 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/document-new.svg0000644000175000017500000002606612505250245031030 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/edit-clear.svg0000644000000000000000000000013212505250245026775 xustar0030 mtime=1427460261.234257648 30 atime=1427460261.234257648 30 ctime=1457295917.259761307 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/edit-clear.svg0000644000175000017500000002045512505250245030430 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/list-add.svg0000644000000000000000000000013212505250245026465 xustar0030 mtime=1427460261.229257559 30 atime=1427460261.229257559 30 ctime=1457295917.257761273 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/list-add.svg0000644000175000017500000001524212505250245030116 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/document-properties.s0000644000000000000000000000013012505250245030435 xustar0029 mtime=1427460261.23325763 29 atime=1427460261.23325763 30 ctime=1457295917.259761307 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/document-properties.svg0000644000175000017500000006635212505250245032435 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/view-refresh.svg0000644000000000000000000000013212505250245027372 xustar0030 mtime=1427460261.230257577 30 atime=1427460261.230257577 30 ctime=1457295917.257761273 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/view-refresh.svg0000644000175000017500000002223112505250245031017 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/help-about.svg0000644000000000000000000000013212505250245027024 xustar0030 mtime=1427460261.228257541 30 atime=1427460261.228257541 30 ctime=1457295917.255761239 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/help-about.svg0000644000175000017500000005435712505250245030467 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/application-exit.svg0000644000000000000000000000013212505250245030236 xustar0030 mtime=1427460261.235257666 30 atime=1427460261.235257666 30 ctime=1457295917.259761307 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/application-exit.svg0000644000175000017500000001720612505250245031671 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/document-open.svg0000644000000000000000000000013212505250245027541 xustar0030 mtime=1427460261.235257666 30 atime=1427460261.235257666 30 ctime=1457295917.259761307 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/document-open.svg0000644000175000017500000003414512505250245031175 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/view-sort-ascending.s0000644000000000000000000000013012505250245030315 xustar0029 mtime=1427460261.23825772 29 atime=1427460261.23825772 30 ctime=1457295917.259761307 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/view-sort-ascending.svg0000644000175000017500000002630312505250245032305 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/process-stop.svg0000644000000000000000000000013212505250245027425 xustar0030 mtime=1427460261.229257559 30 atime=1427460261.228257541 30 ctime=1457295917.257761273 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/process-stop.svg0000644000175000017500000002225012505250245031053 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/edit-delete.svg0000644000000000000000000000013212505250245027151 xustar0030 mtime=1427460261.231257595 30 atime=1427460261.231257595 30 ctime=1457295917.257761273 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/edit-delete.svg0000644000175000017500000000000012505250245047260 1transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/list-remove.svgustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/PaxHeaders.4960/edit-select-all.svg0000644000000000000000000000013112505250245027733 xustar0029 mtime=1427460261.23325763 30 atime=1427460261.232257613 30 ctime=1457295917.259761307 transmission-2.92/qt/icons/Faenza/actions/scalable/extra small/edit-select-all.svg0000644000175000017500000005522512505250245031372 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/document-open.svg0000644000000000000000000000013212505250245025325 xustar0030 mtime=1427460261.225257488 30 atime=1427460261.223257452 30 ctime=1457295917.254761222 transmission-2.92/qt/icons/Faenza/actions/scalable/document-open.svg0000644000175000017500000023735212505250245026766 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/view-sort-ascending.svg0000644000000000000000000000013212505250245026440 xustar0030 mtime=1427460261.059254525 30 atime=1427460261.059254525 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/scalable/view-sort-ascending.svg0000644000175000017500000012425212505250245030073 0ustar00mikedldmikedld00000000000000 image/svg+xml Shadow opacity : 30, 15, 10, (8) Bevel opacity : 30 / 10 Bevel opacity : 75 / 15 transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/process-stop.svg0000644000000000000000000000013012505250245025207 xustar0029 mtime=1427460261.06125456 29 atime=1427460261.06125456 30 ctime=1457295917.251761171 transmission-2.92/qt/icons/Faenza/actions/scalable/process-stop.svg0000644000175000017500000013241712505250245026646 0ustar00mikedldmikedld00000000000000 image/svg+xml Shadow opacity : 30, 15, 10, (8) Bevel opacity : 30 / 10 Bevel opacity : 75 / 15 transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/edit-delete.svg0000644000000000000000000000013212505250245024735 xustar0030 mtime=1427460261.064254614 30 atime=1427460261.063254596 30 ctime=1457295917.251761171 transmission-2.92/qt/icons/Faenza/actions/scalable/edit-delete.svg0000644000175000017500000000000012505250245042630 1transmission-2.92/qt/icons/Faenza/actions/scalable/list-remove.svgustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/actions/scalable/PaxHeaders.4960/edit-select-all.svg0000644000000000000000000000013112505250245025517 xustar0030 mtime=1427460261.067254668 29 atime=1427460261.06625465 30 ctime=1457295917.251761171 transmission-2.92/qt/icons/Faenza/actions/scalable/edit-select-all.svg0000644000175000017500000023537712505250245027166 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/actions/PaxHeaders.4960/240000644000000000000000000000013112544044730020433 xustar0029 mtime=1435519448.92487405 30 atime=1427460261.334259433 30 ctime=1457295917.263761375 transmission-2.92/qt/icons/Faenza/actions/24/0000755000175000017500000000000012544044730022136 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/help-contents.png0000644000000000000000000000013212505250245023777 xustar0030 mtime=1427460261.371260093 30 atime=1427460261.371260093 30 ctime=1457295917.263761375 transmission-2.92/qt/icons/Faenza/actions/24/help-contents.png0000644000175000017500000000247312505250245025432 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦?IDATHǵ•ÏoTUÇ?ç¾™yó«?h*¿„B ÄHŒqmܸ$.Œ„¸aÇÞ•‰A] ‰[MŒ6Š,\c4Á ’4ª*ÐÒÚi§3oÞ½÷3L[§4Þä½sïÉ{ßï½ßóãÂÿ<äë(ýGÌè œûð›3Ïš¾P, ìBvF2ôyïo/ÌÏ\øì½SŸzþÊøžÉ‹ó‹ù‘F«Õg‘>¸Èænl ¸XoaÀHµplïžÉ‹Àe ý” •BéÈJ³ÙýJÀ‰àèZ‘MûT±®5C{ƒ•fdßXýHOî>ø1UèC!šë+4VWñ Ÿgˆs”Ó i¹ÂÐðåÚ0!f†¨áCìËß'>¢q"$‰·[Ì/Ü#Ë2 å:IR&©!Nð íÀÚú}*å”ññ}$ÅUCÍ~Àù 'ÐÉ6˜»=ƒK‡)ÖžCD8wê(¯½4N½œ0¿ØáÒ—³<^­á}›…sì?p—¤˜>F×u%RÌ”è;ÌÝ™AÒ!\¡Œš1±»Ê[¯ìf¼.ļÅñ)g_CM‘bIGx¸p‹3Å”Èû€˜²´øµ"×Ý ¦Líjóý¿òó9ÔUyÿü뜘¨¢ªˆ.)¤Èzc™ÚðÞ‡b#fJs½I¹Ÿz(\»Ñà»ëm^>9ÅÅwNcä‡_naZBJ»Õ¤:4Jˆ›1èK”û€©’µ[ˆK0 ³®l®X¦PãÝ7Q) ?]ÿO¯ÝG-¢¦¨EDYÖÂTÉw8Ë}$ªR«¤´CN" Ö+.QØ=Z ±œ¥åŒ¾˜!V"jŠ8!ÆœrZ&D%÷›A.l=‘Ñ‘aš‹«¸BÊÖÚ}¼Üâü¥käQé”!½šAbÞ"­W1{”(Ë#!(õ‘1Ds¢Ï0³þ3>Zå«ßæëOÎPMfÚ“G y‰µ¡aBP²|‡BË;ž Ê†%Ÿ~ÙÙÛD $¥ˆÐXm0{÷²,§Õî 8D 9ÖYãðÔaÖ²ˆ‹n ó¾×Ä5Çôñcܽó;™ÏpÅ”Ì œýà*⊔v hÞb¨RdÿÔAY$÷JPÛ–E›•""`*€ÑhB¹R£õ×:1_'EŠC8Šqz­Æ®ý{ÁUXnæ„hD}*)ƒAÖØ#ALñY‹¥¥%’D8:9A½>Œ˜réäÊJ3 Ú&ª¡j½ÔÞ¼F¶˜j/-…<R œ ”–YÝð¬¶Ö±^Ó73Œn‹6ëù¶€ËÚYûóIidïxT£à™•È7Ûhu/•.ʶ[¬K³Ý眯=zÒí›–n^þvß‹§ß?0æœ8G"ÝÄ ®7ˆ±Û–µ'M4úóõå+K7¯\m9 '€ÓÀô–úxÖ¡À p¸õ/1žmü .ãÆfs%tEXtdate:create2011-11-14T13:30:01+01:00+¯€½%tEXtdate:modify2011-11-14T13:30:01+01:00Zò8tEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/go-down.png0000644000000000000000000000013212505250245022566 xustar0030 mtime=1427460261.369260058 30 atime=1427460261.369260058 30 ctime=1457295917.262761358 transmission-2.92/qt/icons/Faenza/actions/24/go-down.png0000644000175000017500000000122612505250245024214 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦šIDATHÇ픿kÛ@Åß3Ŷ´µƒÁvzƒMê±hèÈßÑ5ƒ–¬‚Ìõ®![ñ9Øb²µhpCW«4‘‡öu¨'s²¯dh‡<¸A÷}ï>÷K<ê_‹û ’žjÊ?H~Ý•â0‰ ‚ÜVÇo%Ý’ÔC(ËòÖÖßjµ~îË:T¶Îf³©}AWÀÚÑçô@ËðJ|'ùm»h½E’^öz½ËåòV«Õ›¯Ýnlt:b±X¼'ùÙðl>Ÿ ‡Ã£ªªž¨Ûkzž·ÎóüÜsNònÛа¦È;cÌE’$ü9àuM«’$™c.lƒ×®`³Š€7ƒÁàÝl6ëØ<ý~9N?˜üeó4ê›ÀU–e×¾ï—Û³÷}¿Ì²ìÀUÝà;È}Eyš¦7Û€4Mo¢(ÊIÞã!’DI‡qŸ8pÇñ‰¤CI{ß2WˆWÅq†§ažEq,ÉsÉ:ýÉ$+I—£Ñ¨ Ýn÷’då”ý›­ðzóùi× ú¨ÿK¿½Ú¤z¡Éà%tEXtdate:create2011-11-14T13:29:21+01:00TsÊ%tEXtdate:modify2011-11-14T13:29:21+01:00%LËvtEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/go-top.png0000644000000000000000000000013212505250245022421 xustar0030 mtime=1427460261.362259933 30 atime=1427460261.362259933 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/24/go-top.png0000644000175000017500000000123012505250245024042 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦œIDATHÇíT½JäP=Ÿqï•I#ŠØ —€Ê>€–>€å<Çb‹4b¶ØrßÁ‡Xaíl,–íB --† ÃýÖì±™‘%ÜÉü¬……¾æä|çä|X ‘$÷l¯è5‘‡&¹9G¼-"7«¸“< ñ›-;xÌ “üÖà¤ßïÀ`0ø €Íµß‚¤ÉóüTDnEä6ÏóS’æ-‚¤ìc®\¸6Æ\‘ì’”EûKdì$IÒSÕ}UÝO’¤`ç¿HÚ,ËŽŠ¢8ðÀOç©(Šó,ËŽHÚ6i1]kíWUµê†$2Æxïý¥ˆ0äÓÖ`×9×SÕxzmÌDUcç\ÀîJ'"¹•¦éqY–gæ³y,Ëò,MÓc’[KŸˆd7ŽãKïýu]×QHEQ ²Ö~ªªêBDʦfÞ‡ö\UÕÏYKùF£»N§ów¶ÒDäÀ÷i›‡!Ýp8üáœû…´ý‹þ….©[;À‡Hc -¾‹c’Ã9Ϫuƒ?ðŠ ñ¬o%â®%tEXtdate:create2011-11-14T13:29:41+01:00’~zM%tEXtdate:modify2011-11-14T13:29:41+01:00ã#ÂñtEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/list-add.png0000644000000000000000000000013212505250245022715 xustar0030 mtime=1427460261.361259915 30 atime=1427460261.361259915 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/24/list-add.png0000644000175000017500000000110712505250245024341 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦KIDATHÇíU»NÃ@œq(‘,×X: $ ¾…߄ޠ ¢B¢ #´ÁXòÅ–ÁC]Î'Î1”YÉÅÝÎzng÷ö€ƒŒ}’v°$õo’ŽÄζ!¹üsŠ’&‹ÅâÀ›ýI:—4 ÅûÌf³ÀÇzL§S(†(à%hSßœn#C鎤m­Eò+H éÀÜó³Ê³wæÄv ?v0¢èVÒ‘íðbcIÞ9ëªiškI´[Ø+É'InŸÎúÙ‰1½k€Ÿ‚6ØÏÖûT¢= |5Ú% )Iåjµz°}Ƥizec³,{ôHXº#Ä—Ák’$76¦(ŠS6(I’{KvkæA‰Úlo­¤I]×%º÷ “t‹ÿ;ÏÚ›\õÁ%@Ǿ6 Žì ÉZÒ:ÏówÇe|£¡ß7Õ¡ÎÁ‚ö Oy†¥Ö¿/÷%tEXtdate:create2011-11-14T13:30:18+01:00rÅð%tEXtdate:modify2011-11-14T13:30:18+01:00À}LtEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/help-about.png0000644000000000000000000000013212505250245023254 xustar0030 mtime=1427460261.361259915 30 atime=1427460261.360259897 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/24/help-about.png0000644000175000017500000000244112505250245024702 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦%IDATHǵ•IŒ”Eǯ¾Þ¦§faèaaÙ£8HF–›ÌÁ#7F9`â“ÄKBâIãÁNÄFH\ˆ&¢ “¸o„‡A„a–f˜…îžïûjñÐÝßtOObÐø’—TÕ«úÿë-õ þg‘Yó$ø˜àל¸ðòÞ«—NÄ–ýó=*âêÑÃâ@ÿï·¿²ãä)€Xy½¡kyöȈ¹;ŸADjæ%X8çjæ±öe]ËWÎÅ A2óº'§†q¸XPˆ(œœ0eO<‡ˆC?ÆwŸaèþ-Œ1¤bzÖ"ËVŒ¬­ƒ[Õz)¿‹]ë"J)<Ï‹´³kë7® ÕŽÖ”R®uIù]XC5!Ò¾cóâ}$ã sås›öûç´%U›íã‹»o¦æ"Ð~ÑI´¡µ®9<61Ì©óÇþgŸÜÃîís“dmøECØXŸ ô4Å)Kë¼NŒ15šN5ñÚžã¤óó½Óuöжd:)NY=]ç u@¨-£c÷èh[:ë+rcC„ư"»¡ÎÊôßéC[KX•ä(D~èƒ2ô |G{sWÝá»WpÀÂôʨ²fË;?¡?œyQˆ|] –t\¼ö>…âÃ:÷G'î‚8l(¡_g›áûþeðua‚p§BlÓ0ÇϼJn|­u¤Vmceû¾¹ñ_ÿòamÚ/râÓƒHó(NBüp&•6¹äõOÖýYêCþ„ÂŒ´³wçQ·//µÏ£¥¥!ŸÏS(J¡¼Ê¹‹ïP˜Ìpb„7{®,nGItPnr–ļcôÝꥣµ”ð|qŠ 0V3|ÿ/s\êïåæD/™¬#9ß¡­+7?WŸdcl™¬ éÌ<ÁŽM{˜œzÀŽóÇè·xÄ1V#‰xZ‘Ê8š»·gAW·îYÍ8Œ±´ÚÇÙöÔ>Nž;Ê@îW’Ùm«Àš"" Ê!J—’.”ºpÕ¿ Uá¯Øƒ:×Ü_ }ÍÍÜeÞÝK,á‘z âiÁĶrCXWÎülJ<ƇtÊGÊëC?žÿìéÝÙžl×ÂÖ–ŒÂóâ(ÏC‰‡…àá)c5Ö™µ3ã‘;c?œÍ†ª«`=ð<°¦ª|U,p 8ôýKŒG“¿nBm]á;%tEXtdate:create2011-11-14T13:29:58+01:00ËL?%tEXtdate:modify2011-11-14T13:29:58+01:00º‡¼tEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/edit-select-all.png0000644000000000000000000000013212505250245024164 xustar0030 mtime=1427460261.366260004 30 atime=1427460261.366260004 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/24/edit-select-all.png0000644000175000017500000000125612505250245025615 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦²IDATHÇÕ•1kA…¿‘e:9‚ vþ€qXRå¤ ¤Œ1iü3$µª]§ vw†”)\„T!‘ MìV`Œ‹Ø:áœì¼^Á!¯N'޽™y3ïÝ1 ÷Ý,{´<¥±þgÀ©™]3$­Äq¼ô€Ó½Çñ–¤•<«föÉO£9Ô(Izif‡£—層p¨Óé¼sÎ ‹ w»ÝÅz½¾9j’•ù)€sî8–¦àŸ;ç–7¡àĞɒ™}ÎC—ôÂ禡x¨Á¸,GEd ÔMeЗ´;¸ToÃ`ÿ.TÍl/UÒ«@]á? 2˜K¢¾¤/S€ÿµy%‚±o`f3ò¼6³cIµyTÍì}pCÒ[3{*釟>T7ƒ¯FO¸ùw„Vò03͹¤_#÷mCÿ¬M¨Ëmi£ÑxÌõÚÏ8’v$ý–´ãÏk>7 ±¸±®£(Z eà9ð€böøV©T.“$ù·®ÏZ­V¯Ýn/'IrP€(Š®šÍæ ×·ÚD À3À‹³4ðúwï¯Ì{iÿ¤ÄRpù×%tEXtdate:create2011-11-14T13:28:23+01:00,L Ý%tEXtdate:modify2011-11-14T13:28:23+01:00]±atEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/view-refresh.png0000644000000000000000000000013212505250245023622 xustar0030 mtime=1427460261.363259951 30 atime=1427460261.363259951 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/24/view-refresh.png0000644000175000017500000000174112505250245025252 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦åIDATHÇí”?LÜuÆ?ïýêï”#pmiB pUð‚—8~½°.âÒ0hR!ª“ƒÑĺŒ‘ŽÅcщ\Šƒ‰¤é€æÒL4Gj œÒðƒC¯ÍyÀåºèÒ7y—ïŸçyÞ÷û|_xÿwX5‡$àL1 Ø|à/3Û?ín° ðß÷ÏÆb±«ÛÛÛ‰ÃÃÃINmmíj}}ýJ:þZÒ&ð§™é©Ê“tnppð ÇqîkÀïÀJ1ÖÌìn2™¼*©UÒ±ŽXððèèèk“““_JÚü®®®•D"±”Íf/,//¿,é ö<ïÃÅÅÅy3»_rÛØØ¸ C¡Ðüôôôû’Þ–4 ©OÒ›sss×#‘È·ÀOfv;“É$$¹Õ¼ÇGEàûT*uC’WTûD„¤—Þ1³yàÇH$rKÒ…JÀÏI:+©­±±ñc ÓÞÞþUQõÅR‚’Wúúún×u'$µUrQsOOÏë;;;îîînŒG6|F_D"±¥¥¥ °úäÍ$i«¹¹y¸tppÐÔJ²ÇŽ ”ø½½½ç××ׯ …ÀÏårmkkkW’Éd„GÞ?Vx.—ÛüP(ô ’qT#ér"‘øH=Îþþþ›Å7pN¸Ó‡?RÝÝÝ7%EK÷ÿU™Ùt:}ÏuÝ¿?ïLMMÝîšY¡¬ÿ熇‡»òùü‹€F7O©ò˜ªÎ±±±QàóT*u­T•$WÒyIÑ¡¡¡Çq¾¾hjjútkkk@R¨‚I—ÇÇÇß-mMQugKKË{®ëNß@à³ÙÙÙ·$5—cUúÉÏ=@ÖÌ×@§ã8Û­­­{333xž·üR>Nvf¶Ü>i¯££ãçx<^ð<ïáÈȈ_WWwøõ¤aWÕ¸.«ì"òÀ}`ÙÌòO‹ó,þ»ø²£v¨É„Åß%tEXtdate:create2011-11-14T13:32:57+01:00jkÞ%tEXtdate:modify2011-11-14T13:32:57+01:00u7ÓbtEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/dialog-ok.png0000644000000000000000000000013212505250245023062 xustar0030 mtime=1427460261.363259951 30 atime=1427460261.363259951 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/24/dialog-ok.png0000644000175000017500000000136312505250245024512 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦÷IDATHÇí’O‹Ra‡Ÿ÷ææºt££Ž‚»ñ DEPWm"iÛ&’¡«™9:©$$HºnÓ¢»vmj`’hE!BILŸÀ˜ñ´¹ÂU® –0›9ð[\Î9Ïï¼ç8“õ¿Q@ЀŸJ©£µM'"JD‚~¿ÿ±®ë/D$*"gÖ ¯߀¡®ëÏ×b2ƒƒÁGÀà­¥n·û™ˆ„fµ.‡f ð‡J©_Kv¾‡oÇãëÀ-=I¥R€óMD"§Çï‰HÀiòP(ôx¼²Ë4Í’ˆœ·†p„oz<ž§@†qwf2ƒG"‘m`¼´+›Ín‹ÈG¸z½Þ&ðèYꆱ%"ÙˆF£÷=[¾ôr¹ÜƒepÍþ‘L&§À`bi4o$‰k±Xìæh4º ŒlùI>Ÿï7›Í] ¯”’Ee{\J§ÓçºÝnb¡f˜ßíÍ…BáC£ÑØöœàsW¤”šŠÈn§Ó8êv»†­nÌJ¥Òçz½>ø|Î`ÑÄår¶Ûí³NM;;;_+•Ê»ãàKú¨Ë¦inOì*—Ëi¹¸ôZV4¹’Édî5 V­Vo¯ w-KXëzÝjµÐ4mêóù¦ÅbñÓªk9v’Ùu¿ýÚùiœhü\߸œeâ%tEXtdate:create2011-11-14T13:27:23+01:00ÝGRP%tEXtdate:modify2011-11-14T13:27:23+01:00¬êìtEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/view-sort-ascending.png0000644000000000000000000000013212505250245025104 xustar0030 mtime=1427460261.359259879 30 atime=1427460261.359259879 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/24/view-sort-ascending.png0000644000175000017500000000147612505250245026541 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦BIDATHÇÕUAhQ}³RH–´ûa%‘%4BA<…öà)ä$xó”ËBo¹ Á³ éµ·œm Ðˆ-ô$ô *ÉE(oB"ÁJu ›LDPÃóà¶a“¦­úà1ðÿìÌßyæW2º@R úNDd0âc˜ ,õEäËTIZJ© -¥Ô†ìjµÚmÞ$ÆÅÓBÖŒn·›ð÷ƨƒRjÀ çIÐwg/‹}vgÏ/Ó)D£Qøàô ©“\"éøVì Ii4·¼’äÂpo4^dLž:ÁÓ“¼¶µµ• Òét"Á“W*•9Kº®“ä'ù:é,˲ÖEäeYëC‘I¦LÓ|    àe€MÍÙÙÙM’×ÏÙó¼e’mÏó–"·ŽŽž¥Óé×>ø`3•JÕ[­Ösí3E. ûñxÜ- ûÃ2‰ÈÀ0ŒúÎÎΛ™™™oA‘#‘H¿Z­¾2M³&"¿/,²¿o—Ëåv‡\[[{HòÆyn‘E2ã[=Äg1ŸÏ?°ÍfŸ¼vƒÆŠœL&WE¤žL&WÃ:™¤Þëõîær¹ÇÇÇÇ÷IF§ îœÑ4mÀ¦¦iÛ$3cüâ$ï‘4'Å ¹X,Ö‰D§X,ÖÒÉ "ßEä…ˆt'%7MÜðÀáè4=¦îä‹"¬DʶíMÓʶm¯àïÛðO®ëΓ×îoÖÉ€«PÛ¶ƒ0 8̰m;"Qi,ÇìÀó¼#cL¤üiÆåᬡÆÀØzžwœ.ª-9M Àà~òe"r`ÿS£Ñè¦C¯ÕjN³Ù|ûè‡ÀçŰ;·ÑÛL€Û¥Réi;ÀC`/ƒžÐ2ÆÌ†Ãáñ ÊÊÁ"b=ÃÒïû'õzýf­¼cf¾ïŸƒôVÖHm_bj¢2hË•m~ ¶’ß‹ªÐ¹ˆ–h%tEXtdate:create2011-11-14T13:27:34+01:00ÔJl@%tEXtdate:modify2011-11-14T13:27:34+01:00¥ÔütEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/application-exit.png0000644000000000000000000000013212505250245024466 xustar0030 mtime=1427460261.369260058 30 atime=1427460261.369260058 30 ctime=1457295917.262761358 transmission-2.92/qt/icons/Faenza/actions/24/application-exit.png0000644000175000017500000000210212505250245026106 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦FIDATHǵ•Ïk]EÇ?3÷ýJ“¾@hh,Õ4¶Å…Fp‘•þ"¢;iýµh–¹í¾tó ¥¾]³-d—DRÐuÁE\(XPD©Jx…Pš¼{çœãâ¾wó~¥5J sgÎ=ßïù13^³¸žu(ýOÌhö<ú⃯ν9~«X)Ow»à^gÖµLš¿þ²³{ëãµV ­ý¡3c£·å·Ÿ¦’½Î{pþx¦˜*QulúÌ[çnëÀ~› \rnªù¬Îã¢"øèÕà$*˜¦è³åÓnª•î}ßNDHA=⋈/壸á']ë—ëŠõ„$äéÏ $IóˆEˆE(•¹›L,­Q™»‰u^]ÛNÌ#IÚGà%M5‡š£23q)`âRLå⢠•‹ ݺ¹8·IÓ»GÐLQó`3³œºw¥ùÔå˜'vøÝ«{¼ýîûG˜€4û#pi3‚Bc{“‡Kµ¾ZN^‰™¼÷í?\ªÑØÞ$(´9 ÚL¨:ÏèJ$½²±Tct¥NÕùÜ^EZÚúé¤óTÔÙ¸{4ÉÆÝÕuN¶ÀÛ¶¡ƒ ]Ÿ&)AÁ+8§0ì=o $˜*òÜ{‚fWÁTä°È}äž(Œ]]àÂü# .Ìß`ìjvºÚÞ÷FpHp"Á²£(0~m©ë1¯’©ë1ã×2p F8xŠBË73ËÙù~ðõ;5Öïô×äì|Œ›™Í¼H›ÉàÚa>ÝÚdm±hm±†_®ã—ëuO·6óôŠÀ‡ 5DŒaÜ¿Çj hu±†[®3â=#Þã–ë]:îßc‡ˆÔAsìösùöƈÿÝ øR_*ᢈ=3þ|ÿ#Nÿ¸MÕû.¯÷TuÎa"h’ I Ïžë;ÀùS‘ 8S¼¥8ETœãÝí- kSRC&‚¥)SúîþØð6.p©fMþuÃ1Ífü­ìÚI°³*|óe©üéä‰c.ŠpQ„ó®Ðš#‹¢ LÅT° Ù,ÙxòâEcuÿà[`§³ïŸç;Š\QàgàkàñÄ8žüšCâlŽZ%tEXtdate:create2011-11-14T13:27:04+01:00ZÅk£%tEXtdate:modify2011-11-14T13:27:04+01:00+˜ÓtEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/process-stop.png0000644000000000000000000000013212505250245023655 xustar0030 mtime=1427460261.361259915 30 atime=1427460261.361259915 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/24/process-stop.png0000644000175000017500000000234712505250245025310 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦ëIDATHÇí”mHeÇÿ÷Ëõ<Ïy<çx^<unóœ„ÍÙrÄ‚…’Íf5B+bLVIe_BpAq>ôEFÑ„á[RÌ WÒpC4‡¬œoDhMY–ºtºãy¿ûàÑiG×÷ý?Þ÷u_?þ÷}ÝྶÛª@)e0ôär@@1Üì¼Ü¤±à9[óÒ¿ô~W… £‰¸ˆ‹Ý0& *+Ú”R?X`ŒÅïÙRÊ‚p8÷³;o¯,¿âœLÆ`²ò R*…›ñD4#ÓñEýo×?†®ß`Œ­o PJ „ÃùŸz\Ý6†’<’àÉ=.åª*Ë€€¹h « £ 7B×MuÂñ_yZ |;tYâ7uh$ HijŽÕR>;ÿVÅüRCÙ¹ÞwÙžNü¦Žº,i)ð5ð¤6©ÚwôÈSá©ñ¶š‚CÆ¿:8øÐúìõÓùUúô¼í?åÖ¾<Ï~_»2ôd #¡â?'ÇO_mnnަs`.ö_ªö[-º$2´5I†&Qd·¸'ºÚ[N/KÖöå¿ý^‡c÷îNI~«E_ì¿Tœ¸´Wd8yܯ‘‘€ïýæÌm9ÃDV]âa‡éï:Ó:Ðp¼ €ÀxΑºn"œ<îOŽsZ€n•¼H@3ô5ï¡Úo ;{fîĦv9­î©Ž¶Ö¡ ˆ%빃“𩝠X%/Ä?åîì°g()9¸@B¬h^oOAǹ€‘“=,%‡U—xÄmuO}ÕÞ:ôΉ²È­[aΗ’ÃaÏP©ýRaÓíºF$À2ß8V ¢ey{ Μ Xî81zìÚ[¿?ôì œ+‘€év]ÃÆ/O ‘Ó5A$`Ñ%–‡úxÀªÈòöìüòë€%;{˜HÀnJ½vwðÆÜ‡M‚H€œ® lDHZ@ÐQ[7 um]’€]ªž.}Àv‘åíÉý¼;`xs†% Ø,„ÒœL.I@êÚº£¶n@0-€1´V±•ïo!xЕÈÂM]%¾S£ïÖW ö ƒ~ŒV¾x>AtûÎô ØÊ÷·X«¤†ßÝ£"Ûû×ëÏ7ÅççöÀÌJÓËA„b‰`ŒeÐwyí°kY)²ó.:[¾9 )/§FEú°‹Ç+ƒ¦}ÑË^C"a€hBp°2fúgïL__À'Ó×7A[Qù€û®h‚ª¾ŒŸ>°]Ú.?×ò,Ká> Ђ‘%tEXtdate:create2011-11-14T13:31:20+01:00 ?çJ%tEXtdate:modify2011-11-14T13:31:20+01:00Qb_ötEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/media-playback-start.png0000644000000000000000000000013212505250245025212 xustar0030 mtime=1427460261.360259897 30 atime=1427460261.360259897 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/24/media-playback-start.png0000644000175000017500000000120612505250245026636 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦ŠIDATHÇí“¿KBqÅÏ}=±zo(²@BŠ– ׂçhG…šsjhhrið­.…þ%áÜ?M‘࢙EéiI{þH߸Ë÷ çs¿ç{/ð¯~ER¬ðQ;ÜM‘p/"Oý”6Ý+t›Í– ‡ÃK$Ý$íVÆ£œPÔu}?“É,’œ$9d% àÀ•ˆ\z<ž-’³$ÇŠè›Þ¼¨‘|, 몪îƒÁe’3$G¬4ë@¹^¯ÛÒéô®¦i;©Tj¤‹dÛa1ůOž£|\D†Ýn÷A>Ÿ?²ÛíU³iûÍ Z«B²\*•V½^ï6€‰A#úQº®×âñøa.—;ð`f v¼›v¥(P(tH$îÇ9€ ùèðÖzà÷ûkÉdòÖçód»myϧÓùjF%‰ÔœˆÈ zP׈TUmD£Ñj,{Ö4í À¥ˆÔ{1o«æ&Íb±¸Ar…äè@¦&i’k$]–ÿëïéè.À­Ä‹%tEXtdate:create2011-11-14T13:31:23+01:00×ý×%tEXtdate:modify2011-11-14T13:31:23+01:00`ŠEktEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/document-new.png0000644000000000000000000000013212505250245023621 xustar0030 mtime=1427460261.362259933 30 atime=1427460261.362259933 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/24/document-new.png0000644000175000017500000000122612505250245025247 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦šIDATHÇÕ•±JA†¿ W]aq ´Œiò0"6Öyƒä!ò ‚…ø+ íLºt1ˆ`R„¿…›¸9.wÄåöfggæÿgnþ»XÞ¡$ rb¦­HŠ€]`§( @À›Ù"–¤r’$`¼¬a’$Iå Ž–Š™] —aÍ‘¤`¦+ʹ4Ôëõ®jµZ&ô~¿Õëõ3`@åIU  t%5$•œÞ_%I Ï®šÕQN¬¹{Î¥¡KZžÍs|äø ‚\`‚ H¶C`frrë©€—_ à efÖtª¦¤SI¶á‹ °tî^Óà$e…°’Ø;K¯âì¦ÀÈK¤¸È.óØÌ.½³‡Uêž^Ò9pÐjµö·­Áý»5½™]¸í xŠãxãHImÍ»å&ŽãE»Ý~&YM¹Œ$i*iäe¹çÑòîÝ‘oÇ÷@|ÆY™¬Í¯‹*fvìéo€nd¤gNÞ'Jº“%«y”ç°¨>]žzºÓeÐUHÁŸËï«à_TÙ)%tEXtdate:create2011-11-14T13:27:31+01:00†rCç%tEXtdate:modify2011-11-14T13:27:31+01:00÷/û[tEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/go-bottom.png0000644000000000000000000000013212505250245023123 xustar0030 mtime=1427460261.364259969 30 atime=1427460261.364259969 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/24/go-bottom.png0000644000175000017500000000132312505250245024547 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦×IDATHÇÕU¿oÓPþ.B‰dô”, UJÊà5o¢,ñÀÿ…?ÀRgÝSf¯ 0†µ&“Ó®,ñS0DITƒ‘àcqPeÞKvêI'YwßÝww~÷pÝEª€Hq"Â+¼ Àµ¸ˆÈ§Mñ7*Tî6›Í×&ÿh4z@ò‹ˆü¹ÁZ–Ëå7“])õû¢ØJ~šŒõzýÂP•àWE\5’w¨Š{$`%"_ËNã)"¹×ívŸN§Ó»°X,>˜p®ë´Ûí÷iš>‘wU n&Iò¨ßïò[‰FtEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/list-remove.png0000644000000000000000000000013212505250245023462 xustar0030 mtime=1427460261.364259969 30 atime=1427460261.364259969 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/24/list-remove.png0000644000175000017500000000165412505250245025115 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦°IDATHÇí”AH“qÆŸÿ¶oûüœ™æ,§¶h3•9.A«@d bɃB‡^¡“àÉC"*„rFH j;tèâ@Xadº­p¹¦c_ÛÜÞNÛÆ·-/uñÿéáý=¼¼ÿ÷Žõ¿Å²DÄ”àl2Æ~eø< ÀcŒ¤8²pͤ^gXl^—K—½.—nXl“z}M²&¿ˆˆQù”Á08*ð±™"F …EÏòB-ñDÄ{–jG …Å™"F>6e0 Q¹T“(³ÖÕô„|Þ‡:§`~ÆøO,Ý~ó¶ž\»b='—™NÊe k‘ØžºBû {åÃcƘ?•§h¢€WqmEŠƒôRÜ^ÜôÔ|Õ Õ…b +ž.ÆØzª'µ¢ùÞ}=›l ¢Ã™Fë<ýhv ~ÜíBbóOˆVÅE+{{Ø¿K¹•<FÑ6>h5E– öYÞí "ˆ ïvû,Ž€¥­¦ˆh""ãQï‘1b›Úíð_ ðn‡8ÐnØ&ŽÏ©'"K*<-dß«?2üXÿT¿ä?a?§Ò_%tEXtdate:create2011-11-14T13:30:21+01:00iЇÀ%tEXtdate:modify2011-11-14T13:30:21+01:00×?|tEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/edit-delete.png0000644000000000000000000000013212505250245023401 xustar0030 mtime=1427460261.371260093 30 atime=1427460261.371260093 30 ctime=1457295917.263761375 transmission-2.92/qt/icons/Faenza/actions/24/edit-delete.png0000644000175000017500000000165412505250245025034 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦°IDATHÇí”AH“qÆŸÿ¶oûüœ™æ,§¶h3•9.A«@d bɃB‡^¡“àÉC"*„rFH j;tèâ@Xadº­p¹¦c_ÛÜÞNÛÆ·-/uñÿéáý=¼¼ÿ÷Žõ¿Å²DÄ”àl2Æ~eø< ÀcŒ¤8²pͤ^gXl^—K—½.—nXl“z}M²&¿ˆˆQù”Á08*ð±™"F …EÏòB-ñDÄ{–jG …Å™"F>6e0 Q¹T“(³ÖÕô„|Þ‡:§`~ÆøO,Ý~ó¶ž\»b='—™NÊe k‘ØžºBû {åÃcƘ?•§h¢€WqmEŠƒôRÜ^ÜôÔ|Õ Õ…b +ž.ÆØzª'µ¢ùÞ}=›l ¢Ã™Fë<ýhv ~ÜíBbóOˆVÅE+{{Ø¿K¹•<FÑ6>h5E– öYÞí "ˆ ïvû,Ž€¥­¦ˆh""ãQï‘1b›Úíð_ ðn‡8ÐnØ&ŽÏ©'"K*<-dß«?2üXÿT¿ä?a?§Ò_%tEXtdate:create2011-11-14T13:30:21+01:00iЇÀ%tEXtdate:modify2011-11-14T13:30:21+01:00×?|tEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/edit-clear.png0000644000000000000000000000013212505250245023225 xustar0030 mtime=1427460261.366260004 30 atime=1427460261.366260004 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/24/edit-clear.png0000644000175000017500000000164412505250245024657 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦¨IDATHÇí”ÏkÓ`Ç¿ï–dŒ­­³ígg»Vp=¬êæIPƒÿÂd0ð"ˆ„]†xÜMØ«ô0\E™T »Î,2˜°u°‚Å27 Ý\h“T/ Ä]õâÁ}áðæ›Ï“ç}Þ÷Žõ¯ÅŽ2Q€.mÀ=`Œ€;Þ @–eùF±X¼  ©: ZÏÜoL<¹££ãV¹\¾ ø7[䘀ˆZt]?åõzïkš6`ü~çy£P(„,¯(ŠE·Û­mmm…XMðÖ\.wÆãñLjšð @U’¤Íl6;¯ªêBooï{ÕÎÎÎüÒÒÒ|6›M„Ãá5Õz8' ¢öD"éëë{¬ëº\ÿó*€ª _766ÖEQLe2™Åááá7Š¢<…BÉÝÝÝ5ÆØ7§v¸{jjêÇq‹’žŠWǽˆÇã1"òÑU"’UU='BÀkËKD‹Ël ‚¢(>*•J-*¿èY«ÏçÛÙÞÞ~È+QW0¼Ï磾ØXc¹Ã[TR%6m¥þ@ §ªê"€ Éj«««éþþþw‡¼?÷€1¶×ÓÓ“Pe%~ Û#‰|TeE’¤t*•ò{<ž;sss§].×Ût:­ äm~çcÊûLD ËËËÆÈÈH8™LvYïLÓä3™Ì¦Ëå:944t×0 allìža“±Xl}ÿ¢SƒGµ¸6::œ•ëËí<ÏŸP3M³`@Ïó^ÆXÕ0 @¹þý«Ž1V!¢—333Wº»»‰‰ €n𦠹‡m·à U`«¤Àåééé³ããã¾Z­†FDDO­ ™¦ Àyñ×µ`MÓcýú±<²uð>X%tEXtdate:create2011-11-14T13:28:03+01:00ni %tEXtdate:modify2011-11-14T13:28:03+01:004¶tEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/go-up.png0000644000000000000000000000013212505250245022243 xustar0030 mtime=1427460261.359259879 30 atime=1427460261.359259879 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/24/go-up.png0000644000175000017500000000116112505250245023667 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦uIDATHÇ픽JA…¿ëN~LÄB­ÒÌna³µ­/`£ø‹ÅV[û>†o –‚`-ƒ ‚«,™ÍµI@d7FÁ·šoî½ç0 üë·%uAU Œ€{Ñ:÷–æXf-Š¢ƒ(еoµ©ªí,˶EäZD®³,ÛVÕöw5U 1gÀ%piŒ9SÕpÛ­[k÷½÷=àxõÞ÷¬µûÀúBTµ¦iìœÛž€b\OιÝ4MãÏ¢’ͰFãÄ{¿”Àó<€Ûi¯j–ƒ kíž÷~xy·ý¤^¼÷«ÖÚ=`c®ˆTu9I’Ø9·Ïó‹‰KÙª‚ƒÁU§ÓMîT1•Dä8»Ùâ*®ßaxà ꩨÉý±Ífóӵ΀gU}˜r–ÕÙ¿~No¬{Ÿ¹äJR`%tEXtdate:create2011-11-14T13:29:45+01:00f1^^%tEXtdate:modify2011-11-14T13:29:45+01:00læâtEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/system-run.png0000644000000000000000000000013212505250245023342 xustar0030 mtime=1427460261.371260093 30 atime=1427460261.371260093 30 ctime=1457295917.263761375 transmission-2.92/qt/icons/Faenza/actions/24/system-run.png0000644000175000017500000000212412505250245024766 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦XIDATHÇÍUÏKcWþÎÜøž™V“‰fhˆ[šnRpQ$©Ýè…+ufëÆ…›vç¦Ý ó'Ä•¸’n„)¥ i+0Ìã1£Ö7Љq’ÚæÇKòÍ¢/Ãó5i•¡Ðî=÷Üïœû}çrÿ“‘’r›37 &9 Àç¸Ú*"rù.ÕÞ%9ìÌ£š¦í¸p¡iÚ.ɨ³§“ôÂñ ÌÍÍ¥B¡ÐŸ$h¶mûœ€3×H>XYYIT*•a’û"RºIå‘d2ùÀ€@ైäÈ;ã@Dò@à±÷k2™|D2òoàþl6û€ àûÎ<àgÏÈ;{ûN¬™ÍfzéòRÔM$m]×O›Íæ]Ç×PO À½…®ëµD"ÑИ@Dš$­B¡°·¹¹9{›¦XZZÚ[[[³D¤y ÓEÏ€ Íçó}ÓétFÜ£££ÕÅÅÅç°½½ýq­V º÷•R—ívûkçfÕ^ »Løýþo›ÍfŒd @Óþ{¥RÙUJ½€N§óQ8ž¯ÕjW]DFu]·êõúW"rwpàk4A’%WìÞÈd2¥Ôy*"O•RO2™LÁàŠd©Ñhøz/Þ+òE?~ øÐq¹:ޝõO¿½ˆ@;•J…B¡ª§2Û0ŒYÓ4ÇHÞ#yÏ4Í1Ã0f½q¡P¨šJ¥Ž´Ì¿‰ü€àÄÄħ–e¹EÔDä~8Þ€J¥2CòÌ}ƒX,V=991TüØù-EŽã;’Òéô{–e¹»È&yz~~þ™³>õÒ“N§-ß‹Èonÿ5 Hêëëë±\.7ãTâ6Û˯Ûr¹ÜL,{FòÂý¼"ßQJiJ©R·ÛÅmL)URJi=]û&‘:É—ÓÓÓÏ¢š¦quuµ¼µµõÁááᵇ755u¹¼¼üzccc¼ÕjÉÎÎNq~~þ¥ˆÔ¯aö«†ä'ÇÇÇŸ 1ø0‰DËåò0Œ7J¥RÀi±Xœ²m[&''Ó‹Õ÷?“dµÛk’Ñx<þ~¹\€x<þ ÀžˆI>à‘W}±n¯ÓÂ_¸ï¸ÎüðN_æ€D·þôÿs{n_š_é(%tEXtdate:create2011-11-14T13:32:26+01:00¨Øis%tEXtdate:modify2011-11-14T13:32:26+01:00Ù…ÑÏtEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/24/PaxHeaders.4960/document-properties.png0000644000000000000000000000013212505250245025224 xustar0030 mtime=1427460261.365259986 30 atime=1427460261.365259986 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/24/document-properties.png0000644000175000017500000000123612505250245026653 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYs Ö Öoyœ vpAgxL¥¦¢IDATHÇÕ•AkQ…¿›F… •0pßõ ¸ë¨;Á®+nüI¶Y÷¸³¸Tpg!Ô…¸+Mè²Û ˆ.&ÔÑéqáxÆ7ÉdpÓ Î9÷ÝwÎ…÷இ…‰¤ ­-÷º®ïfVD’zišsàÛ–kž¦é±¤Þ:{föÞŸF ÜhIzjfWåÇö ©ÜšN§¯œsyg³Ùý~¿ÿ²lþkGø9€sî øtcsY8çzÀ‹XóÊ^I×ÌN½}OÌìCdnž›×mðs%¿ªÀ›ê6*XHzãqà¿,v›*(€IO¨ŽF ºfö@Ò¡™½]%Kz©«Ýà¢oª«eÑBRiKà0Ê4²h›4RÐ5³IÏÍìõ*YÒQ¤®¶€Oø¿(XHº,í pkg»[r  |áįV€Ãµë¹yLÅ?×u’$GËå² ì¨?€ÏNçW–e'ë®ëëÑh4ǽ,Ë>ÖÜ€$IŠápø•?¯Z¥‚à1à€{Û4ð3˜ç•OæŒß×:¼÷˜+r%tEXtdate:create2011-11-14T13:27:48+01:00/-%tEXtdate:modify2011-11-14T13:27:48+01:00hr·‘tEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/PaxHeaders.4960/220000644000000000000000000000013112544044730020431 xustar0029 mtime=1435519448.92487405 30 atime=1427460261.245257845 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/22/0000755000175000017500000000000012544044730022134 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/help-contents.png0000644000000000000000000000013212505250245023775 xustar0030 mtime=1427460261.333259415 30 atime=1427460261.333259415 30 ctime=1457295917.260761324 transmission-2.92/qt/icons/Faenza/actions/22/help-contents.png0000644000175000017500000000226212505250245025424 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î</IDAT8¥•ÏoTUÇ?ç¾7óæW§¥© ˆE0Ƹ6n\¡ FBÜÈʽ1qaЉè_`XkbŒ²Y¸0Æh‚ Ä4ªü¨Jk§3yóî½ç¸˜é´Wz’—ssÞ½ßwÞ÷}Ï÷‰™ "PæÿEaf}13Μ»têéý³gK¥Ò‘îùw„a?O„÷þæâ¹³Þ?ñ¹Õ÷.üv}i]µºMŠ0ªÛ6P3Ø|cÆk)»švûã3Ï>—™¤åC«Î஀Á1È"[yL±A6C‡ƒÕNd÷d㥀ø1UBšö*­µ5|?Ç9╬JV©2Ö§Ro¢af(€>DI >¢q"$‰PôºÜY¼Kžç¤•IR!©!Nð ½ÀzûÕJÆÔÔn’R†ª¡f¿ì|Œ†èç,ÜœÃeMJõ§Þ~õ0¯¼0E£’pçQŸó_Îóp­Ž÷=ï/°gï\’aføœP¡˜)Ñ÷Y¸5‡dc¸´‚š1½³Æ/ídª!Ä¢Ëѽ§_žDM‘RÉÆy°x‹3ÅÝ¢Âû€˜²üèj%R7x:¦ÌìèñÝ¿ðÓµÔÕøà›®¡ªˆ.)¤D»µB½9‰÷aÇ1b¦tÚ-H*# ¡påZ‹o¯öxñø ½uœ#ßÿ|ÓT@ÒŒ^·Cml‚0 B …˜*y¯‹¸Ã0ÐãJÒÚ$ï¾~„jYøñê¯|våj5E-"âÈó.¦J±­cWøHT¥^Íè…‚Dl8¢°s"%±‚啜s_Ì«û5EœcA%«¢R TáÒÍŽ}ˆLŒ7éÇÌF×ÔD¯>y“¯?=E-s˜é%}$æÔÇš„ äŶ)úž Ê†%}†ùù›D $å:ˆÐZk1ûò¼ Ûë£8D Ö_çÀÌÖóˆ‹n 8÷~h.ŠšcöènßúÜç¸RFn)§?¼Œ¸åûÁZt«–Ø3³V)¼ÔFªL^ˆˆ€©F«•jî_mbÑ&EJc8JqF½ÎŽ=»ÀUYé„hDÝ¤Ž­§q,‚˜âó.ËËË$‰pøà4F1%">Ò/”ÕN@µGTCÕ†Yó€ SÊK(b “ÀáƒÓ”³ kžµnš®™a ¬ÒlXÛ*Û€µ¿þçãòø®©¨F깕)6ÛèÌ|pú‰¿ÆþÉšsB±¾ôÐXZ¾þÍ¥ÝÏŸ|­9µwÒ9!qŽDÅ n¸ˆq`:¤ £u{åþêòõ‹—%13Däp˜ÿ-˜.šÙ¿ŽÏn͇IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/go-down.png0000644000000000000000000000013012505250245022562 xustar0029 mtime=1427460261.33125938 29 atime=1427460261.33125938 30 ctime=1457295917.260761324 transmission-2.92/qt/icons/Faenza/actions/22/go-down.png0000644000175000017500000000103112505250245024204 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<–IDAT8Õ•1KóP†ŸˆÔò…6£…+è:ômµ£dÿÈ·:äœíž¿à"ÒÝTZ°‹›b¡Škóñi:èu°B©÷6Qèà —„ûžóä’s×RJ± ­,…ºLðjŠ¿8ï?ððS°ã8N¤3Z­Ö^½^´EJÇñ£n¿P(¼.ÊK‰n3—Ë-l§,àI†˜Là  ¼=}þžf K3 [årùd4mŒÇã;±X,nZ–µR*•îƒÁ_à6 ü§×ë6Ã$IÖ0T°òùü$Š¢S)å)ðòêùa@Ìèÿ4;Ú•Œª² =Û xÈ»Oä,€ŸCà]cÌç§PUõM7Ó}ú& ªú¾“3Óéô`6›}ºo|ñˆ¢ªCa‹¢83Æ\c®‹¢8SU;ä3ÛÍ/s39°ÖÖÞû)ð=Ðùƒ†¶Û^š¦9–ÀRDÓ4{ëŒëÀ.Ïó“²,/€[ÀßÇmY–yžŸ®ÏÜ7 9çÞ‰ˆÚN=²Özïý[ "0’¾Ž÷“$™ˆHÌݤK‰“$™û!@¼“eÙiUUçÀMºŠ›ªªÎ³,;v-90Š£8ޝ¼÷¿€¶mÛ(ÔQE-9ç^4MsÉÝH: ¿›¦ù´Z‘1æu<ŸÏ¿ŒF£?+O·ÿ>Ü_¿ŽCຮ?ŽÇ㯡Z¸+ù‡{6ûPÒZ»öÈþ·ŽªZ÷ÔšuÆ¡ÐÆÚÚ?ï/Z)Î ÏT½ÃIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/list-add.png0000644000000000000000000000013212505250245022713 xustar0030 mtime=1427460261.324259255 30 atime=1427460261.323259237 30 ctime=1457295917.260761324 transmission-2.92/qt/icons/Faenza/actions/22/list-add.png0000644000175000017500000000071612505250245024344 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<KIDAT8µ•ÁN„0†ÿ‚‹aÒ'‰Ñ›>‹¯©7ßÁ Ɠɼ©WDºÖއeMw(m=0ICfè|ü´3­ ",aÑ"T'óó½¿>±˜ðáÌ""×X•eyàÓDtED±+׫8MS àÛòŠ/Ï‘yÁI’€Ö7/jâñÙÍÌ;øqϬ-Þ»dþцš``EÑ25o&AñÈü^k}72ȦBˆW"âªwÌß°Å9¶5nhKÜeÛpÿ·údL0說z6ãJ)Eqk&ÕuýÂ8;ì+ç¯Õ¹âw)å½ùá¶m/\›“¤”OØW€YbÍœâƒj³ËVÃ0t˜Öq7‚ø¦Î‚'6vž­ŽF–e“r‚çèô‡<Ï·MÓ|±¸kan"ðjZä q[ìÎû¿“¼õµ?IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/help-about.png0000644000000000000000000000013212505250245023252 xustar0030 mtime=1427460261.323259237 30 atime=1427460261.323259237 30 ctime=1457295917.259761307 transmission-2.92/qt/icons/Faenza/actions/22/help-about.png0000644000175000017500000000223012505250245024674 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<IDAT8¥•KlUU†¿µÏ¹Þ^J”[J…*ò*Ñ $#ÈHéÀ#3F`‑„„„Ä‘$Æ Œˆ1ø š(&4ñý",­ ¥¥—Ò½·çœ½÷rp/·­­qàJV²÷YgÿçßÿÚû?¢ªˆHHóÿ"VÕ@T•“ç_Ú»jíŠ#éT݃óß•ÁÐù¨I¹¿ï·?¼¸ãÄ)êÎ º4î¯uNÙ‘ ˆÈœyNkÀª:g^¶²Ø¬xºóXWdÂ0蜘FÑ `1¨T\•y ˆ(€ªGñµL¸aZ­ë2! ‰‹pNAÁ`$Àņõõϳfé²­dÓy¦ã{LLpµxžËS§1iÁ«Cñ ¸ŠÄUàïA½ÐneçÚäÒ 8çðÞÇ1ªžÀdh©_Á¶†Ø?Çç}¯3h{ÀªJâb1€±6Æ{pV(°îõ‡É†yœscxûÓcxë †î àœ#æé^˜ÛpVð¬+KfC6ê`W×AÁCµlïXƆM«ÈÖåjÏŒ1®®ƒd£¼£Æ¸&…”-Ë÷‘IÕ-x¸žÙ¼Ø¿`-cêØ²lŸÝÆ·NÏ«ßϦ|;åIOl§kŒMbcë½E[ËÊ9LCqtˆÄ9V6ÎÛÑýè»Ñ‹õž¤Ú¼(‰À8zû¿¡µ±cÞ¢þ›—P`inuí¤ü3®Ýø“V¢$š‘"²%ÂŒráÊ;”Ê÷æmsdü&ˆâ!N¢yõÑñÛ|Û÷!b‘-ÍN¦Q“à†9þÞËdž°ÖÖrãší¬nÝÊW×>àËŸÞŸS›ŽÊœøø Ò8‚JB”T4`Å«uýQñ‰€hÜàn·²wçQ–·>@455!"LMMQ*•* ^æì…7)-¾J~ ¨8áµîK+CÀÄ6®š'½(MÌ(½=´5W9Už$Žcœ· ßù‹Áb?ûz¸>ÞC¾ d+ÖkÕ”t¦yÎù*0xMhÏ?ÂS›÷01y—w¿8Îï#_Ây‹¤R9C6¯4v &åqêÁζÐêñNÅ9O³˜ííãäÙ£ô&S(Ѳ¼+#b1¶ÒL¡âг|¹êÛþî -6¶¥–ØÈr½ø+oŒì%Ld€TNð¡âï3RÀku8ó'106d‹€¡ïÏŒ}òøîBw¡cisSÞ)L`$ÀˆAL€ó¯n&ýÌøöñÑïÎÏC¢ªˆÈàY``¼ÿ¸œUÕÞ¿ÖQ;T*Ô IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/edit-select-all.png0000644000000000000000000000013212505250245024162 xustar0030 mtime=1427460261.328259326 30 atime=1427460261.328259326 30 ctime=1457295917.260761324 transmission-2.92/qt/icons/Faenza/actions/22/edit-select-all.png0000644000175000017500000000106712505250245025613 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<´IDAT8µ•±jQ†¿³Ù ìl Œ$y±î"V¾€¥`©ˆ±»íÖ©Óˆ)$ÚRZDRˆ•è.بí‚ “ÅÌšü{&7³3;B.æ2÷œïþç/Î5I\Çjæö+À-à&ШɹN€_À9’²ØŒãxû„:1Žãx[ÒfƳœ·ÍìÀß^×’ßá² à ápøÒ97[†8V;΋ žýoy)€sî8Ö*¸§Î¹ àyxPöÊ×Ìì]UÒCŸ›†g!8lÿG¸¤n¡b€‰¤·À Ðæ?V€Õ•*n›Ù~MÒズJ0À—2pI]©Iï+€¿ujZÇfö&ÛKzüôàZŠÛfö:z&iÇÌîIúìÕÕ-¥øCAwÃNЇãq–»ýTÒ×,Ìì0óßõu…àH»Ýîó9q˜ $íJú&i×çßñ¹i¨úÒØŒ¢èét:m€a{ Öð±ÕjýM’d‚±yÒï÷ǃÁ`#I’£%¡DQtÞëõŽ™¿"W¯÷¬Ö3÷w|Â?Mv]é?æZÍöIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/view-refresh.png0000644000000000000000000000013212505250245023620 xustar0030 mtime=1427460261.327259308 30 atime=1427460261.327259308 30 ctime=1457295917.260761324 transmission-2.92/qt/icons/Faenza/actions/22/view-refresh.png0000644000175000017500000000154012505250245025245 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÝIDAT8Õ•Oh#eÆßLkL´2nºÓ ý³ÚBÀƒt nhe/Jñ"…BÖ†=xPO‚.‚ {)q=4=µ÷b)¥‚aé¡®¡VQ³ÔvsPiw’ºéãÁ©Ä4 õЃ¼ð1óÎ3ï¼ïo¾ÏHâ,d‰ëY·2§ðya€ Pxëã’Ô*:+•J$yÏçóÝ´,ë{c̦Ïçû" ]Ïd2qIŽ$Óøl+Ósããã/Û¶½l?w½ø Ø2Æl&“ÉW%u7𛍦R©æææ>“Tªw‰Ä}˲”ËåÎçóùç$ù€ ëºïg³Ù5à÷V­0;;;ÛÚÚ¾²@`maaáI¯K“ô¢¤WVWWßtç&ð­1æÖÊÊJB’¿U+žŒÅb) |•N§ß’äJòÕ¿\Ò³™Læ cÌðã8K:”SÛãÀS€S,Ã@©§§ç—©©©<ðkãÌGGGׇ‡‡oËårУæ”ŽŽÇã/•J%ÿîîn¿‡Ó£h4ú¼ã8ý+À½ób8¾\<88èópT}ÅÕ¡¡¡ÐöööåZ­ÖT …Â…­­­ËÉdÒ¡9¯* û@5”=ÓcÃk—t)‘H|¤bddäš×c»É<.ƒÁ€ôààà5IÑf=þÈ-..Þñûýj0,ÍÏÏß6Z]®ÎMNNìíí=T£Ñèý}U“*úfffRÀ'étúJ}N!Iщ‰‰1Û¶?>íêêú¨X,ŽI ´Â­]Ò¥ÙÙÙ« -0’ú"‘ÈÛ~¿ÿð%pò¬ëËË˯I ŸæÏ{ˆ9 ì]³€>Û¶ß=<<<~ëîîÞ_ZZúÃuÝ à¶G pòî¶Üjv£··÷»X,Vs]÷Ñôôtµ££cø¡Þ8±â“ô4öø{_È{ëcú¯Æ§Öÿïhú 徸ª|[IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/dialog-ok.png0000644000000000000000000000013112505250245023057 xustar0030 mtime=1427460261.327259308 29 atime=1427460261.32625929 30 ctime=1457295917.260761324 transmission-2.92/qt/icons/Faenza/actions/22/dialog-ok.png0000644000175000017500000000121712505250245024506 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< IDAT8Õ•1kSQÇï5K2’%éKš¤Â[òD¥ K'¡¸ºˆ¡˜ÄZÛFšØ  4³‹k77-ØbQ” Ð õDÚü|©·i¢¡¥ƒþÓ¹çÇ9çž{®%‰³0ûL¨g ö2Þ¢üNð;pÐwœ&c ˜ŒF£ó@ ĉC¯¤“È’äD"‘uà ÐòûýO%%%MH:Ø’ä8Žóø¼öô><‘“t¬Ç6ö£ÊÇã·:Îu`ÏðuçææöûldbKJƒÁúôôô=IÑa™Æb±‡À[๩l6[tÁ;‡ ƒ éºî]nIr‰Ä2О™ÊçóË’.ö¡&Ø …BUà%°åiÇuÝy>™L&ï¯ ÿ°µ°°ð`*éϸÍÎÎö€o@×S»ÕjÝH§Ó×R©ÔÍv»}hþîâââNµZÝöª<²,oWØÀL&“9ßh4Ò—5ô€¯fàÒÒÒ»J¥²ëUqláô§¢lonn4 ×8Ó , ËårsÔû|¾ýz½~nX@©Tú\,ßü } ¶¤ËÙlvØ0µººš‘tið¢†i”Öt%—ËÝÖõµµµÛãB‡½<³-/jµ¶m÷ÂápoeeåÃ?Ë7¬?£Ìf€ŸÀî¸ÐqÀ'¶ÿïkúòOÄê¥ò£IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/view-sort-ascending.png0000644000000000000000000000013212505250245025102 xustar0030 mtime=1427460261.322259219 30 atime=1427460261.320259183 30 ctime=1457295917.259761307 transmission-2.92/qt/icons/Faenza/actions/22/view-sort-ascending.png0000644000175000017500000000131512505250245026527 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<JIDAT8µ”?hSQÆ//$Є¶yð$‘ZA¡ÐN¡“³S—ݲ ÁQl¨H»eÖBÁŠ: D% ÅMH$X©>KÒ€ˆ^?}Þ¼B­í—˹|÷ÜóÝs,IœâÆÞ t= 0θÀhhß> (K Óugh:޳(É5âÔjµK@«OIçÍ3’ˆ÷¤;NøÒ[Óf"Žã€b$Lá®çykCCCï=Ï[ë=ó/$ ßBŒ†ñ[Ò¤$¯·Ú¡˜%ɪ×ë—}öJaõø[Ë4à-Ð6²=³¼¼\‚Àj·Ûñp¦KKK£À¤mÛò<ïð1*c×uÝ˲^¹®»2/—Édî  < ±4FFFîI:{¨y­VkJÒn«Õšây»ÛÛÛ …Â3à ð=ÄF.—Ûh6›ݾЀy¥Ri=•Jù¥Ri=TŽ No¬®®>O&“ŸÂæÅãñîÊÊÊÓL&S~Ç<$å«Õê5àQŸóóó×%3ÿq”°+i¼·šÂHš˜™™¹ Ü/‹·%]6D”°›Ífç,ËÚÈf³sQ'ÉÞßß¿2==}kgg窤DTçYÆ·mûÎÁÁÁ×X,– ‚àÐŒø’) ¼:ñAóÊårmxx¸].—kDt^ŸÇ‡‰ÛÀpx l18ÝŽ„£vÞ?Ã,…“Ïçgc±X5ŸÏÏòk6ŸˆpÚ÷ý1I[¾ï16+Ü­T*›ŽãìU*•Mþ£§fž)|bø 1ùãy¾mo0IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/document-open.png0000644000000000000000000000013212505250245023767 xustar0030 mtime=1427460261.332259397 30 atime=1427460261.332259397 30 ctime=1457295917.260761324 transmission-2.92/qt/icons/Faenza/actions/22/document-open.png0000644000175000017500000000113312505250245025412 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ØIDAT8í•¿oÓ@Ç?ç:ù""D,±ƒ#X˜abda`ê^ñO8±’°°ñOÀÄЉÌH(Yº U-RR)Jc“ŽCœÊ¹:µ+_étg뽞¿~w§DCÊx¾PFvfí.pˈYçÀ¼€µU@ìV*•q7¶lûx¹\¾)€_À @¥V(à‘Rê °0’ö;àE­V;Ço³lÅ yWØ¥ð¸ X@²ßw]÷p4½æºÇe5¯×럆Ãá{àL‰ˆZ–õQD@ò—`K)µŸ$Épre…ˆ\þ™“¶k¶+~ïJè÷ûŸ=Ï[™ïƒÁ^£Ñx™—“Ïv=Ïë?ØîUåyÞcàEø¦ 0K¡æ.œíÊ+ ¾IÿÁåÀâ8NE‘Tì8NLúƒ­t1ñ}ÿTk¥æ€uã›cžk­#ß÷OK@6§› <žd¾¥Ô]€f³ùµÓé ÍR[­–ÛívŸˆÈ8¾‰2n•™T«ÕWaîÏXŸ\¦f@Ok½šN§GÀÉÆ ÓSÉÌ“ .Úíö½0 {9P´Ö« .€I&³â¬ríÉQ |gmA\|S@Î…û$-·¨&ù€AIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/application-exit.png0000644000000000000000000000013212505250245024464 xustar0030 mtime=1427460261.329259344 30 atime=1427460261.329259344 30 ctime=1457295917.260761324 transmission-2.92/qt/icons/Faenza/actions/22/application-exit.png0000644000175000017500000000166212505250245026116 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î</IDAT8¥”ÏkTWÇ?ç¼ùG6˜Zê(*¥”ºÈ¦íPJ!»bj\˜eF÷î"œ¡;!»‰%B»¶4¸H¡”"TŠ…¶– #Ñ̼{ÏéâM&óòC+=p¹ï½ï;Ÿû½÷ޏ;"RJü¿èº{@Üï§'¿:óöØõb¥|:÷›È«1=S;‘nw~{´±yý“ÖOË ý1ûé/…¿ÕâVQÑ7»áf$ÕQÂ;g¿ûõý @¹$RëXce!XYh KMt©y öôÁZÿkF0'FgÛ·hõ­…²ÔdD•Ud©™Ó¸}‹a„`N ¼·:¢¿K¡€–Êh©„$ [îüùáÇœøyªjÎå–Ù®&‚Lju»X·ƒ‡ÀÏí¤'[CúXTÑB)‘äÍڦLj§)nÆôK«û;°9®>c@RËš=üçFï–5zÜùÇØ¬l´"ßN—ÊŸO92*I‚$ ¢ Rè͉f»€Ì]4Ü"b6Çl3 ¶V±6×}¹ÒgUã\‘—§Pd†›ª·57öœ:áO}ÛUðêë-ö;[§ðYU1×}¹Ie´BqÃ's Î) ßxómKn?çVÁp¯]Ó‡ÚÎ6öÔžð°Ê=RÓÎ9…Ì)Äð!iË °°2RÌ9…¬ˆeÏáꯋ[;š7 ÏÛV}´¥©±/ W]O‘5±È9…•‘bÜñúêáÙm“1Ba€ÒEÙãé(j¹Prsú#° †ût«>úescßk§üÑÛ·#D’cv›e•½ÒÁMwpNA$d÷¾t¼@Tvy:ŠÎž¨+ÊŽûÝ6ý§¶æÆo?þ4!fçšî@r+3ÀaîpsN¡ †…¾î£î°D]žŽmŸŸ ¨99ýœSØŽrMÞ˜z[•8§àç0’«žÚ«kz˜CŒSؘYqñ‘òc¶ˆR—§Ãûi{@ñäö3N‘¥r”çfÆ)˜CöꚤeGºcòÝ¥aó÷ëÌœøÕïTeLÎÌïøøƒÒøØÏsž=û„³·BQÙ½¶C¦’¼âuË£O|d;V{ÀÌ ,s¥ãñÝ·^Ñ^>s ”vbƒº£x 1xuW´£©Sc…‰ùÙ º{^߸\Y5HJwôøÿ26ÓË ÀÀ@OÝ͘0†d¯[ÿwmÚ?ï/Ë®OS^bàIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/media-playback-pause.png0000644000000000000000000000013212505250245025170 xustar0030 mtime=1427460261.332259397 30 atime=1427460261.332259397 30 ctime=1457295917.260761324 transmission-2.92/qt/icons/Faenza/actions/22/media-playback-pause.png0000644000175000017500000000042712505250245026620 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<”IDAT8í•A Â@ E_¤Ó{xß‹H×^ ¶qӎ혈CDèß^àÍE"ªJœªXkЇ 26ÍÕâ/ó´ÄœÞ8×6ã¸ærK€FDº5TÕ €ÃÃêaW¼¤/䛼…ü÷â{!ÿX|Œ"åEÊ×<QUo yn¾q.Èîµé‰wçÿNÓ¯ì>'@é²>IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/media-playback-start.png0000644000000000000000000000013212505250245025210 xustar0030 mtime=1427460261.322259219 30 atime=1427460261.322259219 30 ctime=1457295917.259761307 transmission-2.92/qt/icons/Faenza/actions/22/media-playback-start.png0000644000175000017500000000105312505250245026634 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<¨IDAT8Í•¿kSQ†Ÿs½!µ÷šÔB(Aé"!HÀIÁ!³SȘ€ÎÍÔ¡ƒS–Éš¥’ü$sÿÖ©J1Á„TèT±4…¦¯ƒÊåÞÛ›–мËÇ9ÏùÎá}9F7QÖPCÀæº`; ÿ˜ŸWûMln,k•J¥g@ ˆOM–ä•%iè×ußv:'’îIºå³ÞWaàMà#ðųN§—%=”t' 8ÌcàIúÑï÷_Ù¶½V(ž Àíißø"ø\GÀÎd2‰µÛíUÇqÞ´Z­ÇÀ} `|bŒ1õCïcfR©Ô»^¯÷!ïãqOÔ‰½Ú•´3_f2™`Îoº«€Ç®ëŽjµÚûn·»|÷n À‰_Ó²¬³b±øµÑh$‰OÀgàtðØÛÈår£f³¹—Ífûü±c`*#“Éäq½^ß-—Ë#`ø²ïRð‰mÛg•Je¿Z­þrg Ø&—Aàäåóù¥Á`ðZÒ I³Q£|.?ÌOÿ^{/Ò„ž _»þùòÿ‚+]'( .G®IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/document-new.png0000644000000000000000000000013212505250245023617 xustar0030 mtime=1427460261.325259272 30 atime=1427460261.325259272 30 ctime=1457295917.260761324 transmission-2.92/qt/icons/Faenza/actions/22/document-new.png0000644000175000017500000000102112505250245025236 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ŽIDAT8µ•±JAEÏ“­¶°X-cš?FÄÆÂÚ?H>Â_,ìİ­,´3éìTDP‹%JàZd_ÖIvD|0ìì»wÞ¼™¹k’øÈæŒY¢F4³˜p,‹ âÞW`8="UÛJQÀ=ð\Óî‹¢8´RÕ±J h˜ÙIÈ n È$mwž+…% ^¯wÜjµ†ý~?k·Û»À'±’U–`’šÀp!iSÒBÀ}[´éxÍ€O´fŠÏð„åÅJ2p¼1KøcÖ©¼ºŒë"9c’tæ°5àá¯Â˜™í‡÷}I;Õ9IØø>6ב ‰ˆ× ¯¹Ã«›ÒÏxtÍÝ<r3;røÕ$U‡KÚ6:ÎjJÆ—38S¸™†î¸Éó 3ÛrJ§|;—øi8µF?Ï"½_$ýËb7¯”ôæ°2UÌGÕè'xe²_ÇUà3n`IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/go-bottom.png0000644000000000000000000000013212505250245023121 xustar0030 mtime=1427460261.328259326 30 atime=1427460261.327259308 30 ctime=1457295917.260761324 transmission-2.92/qt/icons/Faenza/actions/22/go-bottom.png0000644000175000017500000000112512505250245024545 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÒIDAT8µ”?‹Ó`Ç?H‹‘¦Ò. rHzÙJ¤x·¹èà{pñnÎ;è¹8guÐE¨ëÅ’\ÖC[<ÿ ƒmiËU#èãÐÞ‘ Oz©â~>ùæ›'PJñ?âr‘“_«è"ðuÀÌ©}>þ XfµZ}­+öz½Ýv»ýø½)€ÙlöU—¯T*¿ÖÍñø‡.Y*•þÉc€Ÿz o•‚àíÕu|I„fo7'£ÑèÀt:=ÖMÓÜBˆz½þ~0<Þ]¾†áƒN§ó0I’2ùûU”Ëå$‚gRÊçÀIºxI3p"¥ \×=–VèVâºî”2ÈBóŸ>ð®”ò~E[º†V«õ! Ã@Í^Ö)fÕxèû~dÆ<«Ö0Œ¹ïûp¨ƒ®,lÛî{ž³´älyžÛ¶Ý¹ÓJ©uK(¥vÇÙö}Çqö”R;«ZîlžÇéíÊp8¼×l6ïÄqüƲ¬—,¡3}Y€î¹ é„eYGÝn÷ÚéýªçœmÀ§sÊ2Šp»V«=Õ½F^ŒÇãGÀÛ´ríY1™L^mÖE¬€…RêÛ†œŸ‹|¼"Qèãi7?‰›ØŸã¢ámIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/list-remove.png0000644000000000000000000000013012505250245023456 xustar0029 mtime=1427460261.32625929 29 atime=1427460261.32625929 30 ctime=1457295917.260761324 transmission-2.92/qt/icons/Faenza/actions/22/list-remove.png0000644000175000017500000000150612505250245025107 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÃIDAT8Õ•QHSaÇÿÛÝÝ®Ÿ3³ÀÔrÎm¦ é%(pˆLCAìAòA¡‡| „žŸ|HD…pBÎ(‰Am=ôâ@Xadº­pmMÇnws;=¨s»Þù>t༜Ã÷»çû眫""œ„©O„z’`Mž¸ @À&€?²¼ €` À=•*V(Ÿ4›ï 3æ x½¦}PðzMÃŒ9'Íæžý¨ŽPˆ(ÛUDT1e± Ž2!9SÄh¤-ú—j‰H "Á¿¼P;RÈgŠ2!9e± QÅþÙ K%ëŠ2G]MO,xlÒñ€ß©4¾¥ÒKwß½ï€g7®9.pjëiN °&%wõ•†GÝ+ŸžåÓ¸@Ðñm•Ešƒ»•àwSÖç¶ë¨xk‰†Ë¨Ñj4?u|gŽž²Š…T,Ö²d¿ÕŸØøjËN„“)ÀžËCk¼è±Î¿ãôú×Èzd9X*kþÐ~»_òoØäÉlÓU=µ/ߌqz½ @ü¸Šsà«Íý‰€2\k0zÌs.E(@ÒÛÁàêz8Z¬Õj äëáhñv0¸ ­P !ŸÏ4ßÒ4]"Fyžƒ’—ˆÑÆù–¦éÏ'ïsE)„ÐGŸÉ}§Ùqù”ÎZZ Ís¡=û!&ðy[ZºùÊÕ]v¥~ Ç<^õ\]Õì%=õË…rç H}äh¾OàK,¹Ð¹âï°~—÷±h{ðÐM/&ˆ(CV—QÕÛëÆÞÞ84…‘®ãC‘V«±7P´Ïî¦øN1"bßéˆöÙÝ{EZ­’è"¢zùHËÁ¸äœÚ]YЃ<£øN‡8Ðî’œŠP¥]‘Ñ@#Žö)`°` k3øŸíÿû5ý|“€Œ?RÎIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/edit-delete.png0000644000000000000000000000013212505250245023377 xustar0030 mtime=1427460261.333259415 30 atime=1427460261.333259415 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/22/edit-delete.png0000644000175000017500000000150612505250245025026 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÃIDAT8Õ•QHSaÇÿÛÝÝ®Ÿ3³ÀÔrÎm¦ é%(pˆLCAìAòA¡‡| „žŸ|HD…pBÎ(‰Am=ôâ@Xadº­pmMÇnws;=¨s»Þù>t༜Ã÷»çû眫""œ„©O„z’`Mž¸ @À&€?²¼ €` À=•*V(Ÿ4›ï 3æ x½¦}PðzMÃŒ9'Íæžý¨ŽPˆ(ÛUDT1e± Ž2!9SÄh¤-ú—j‰H "Á¿¼P;RÈgŠ2!9e± QÅþÙ K%ëŠ2G]MO,xlÒñ€ß©4¾¥ÒKwß½ï€g7®9.pjëiN °&%wõ•†GÝ+ŸžåÓ¸@Ðñm•Ešƒ»•àwSÖç¶ë¨xk‰†Ë¨Ñj4?u|gŽž²Š…T,Ö²d¿ÕŸØøjËN„“)ÀžËCk¼è±Î¿ãôú×Èzd9X*kþÐ~»_òoØäÉlÓU=µ/ߌqz½ @ü¸Šsà«Íý‰€2\k0zÌs.E(@ÒÛÁàêz8Z¬Õj äëáhñv0¸ ­P !ŸÏ4ßÒ4]"Fyžƒ’—ˆÑÆù–¦éÏ'ïsE)„ÐGŸÉ}§Ùqù”ÎZZ Ís¡=û!&ðy[ZºùÊÕ]v¥~ Ç<^õ\]Õì%=õË…rç H}äh¾OàK,¹Ð¹âï°~—÷±h{ðÐM/&ˆ(CV—QÕÛëÆÞÞ84…‘®ãC‘V«±7P´Ïî¦øN1"bßéˆöÙÝ{EZ­’è"¢zùHËÁ¸äœÚ]YЃ<£øN‡8Ðî’œŠP¥]‘Ñ@#Žö)`°` k3øŸíÿû5ý|“€Œ?RÎIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/edit-clear.png0000644000000000000000000000013212505250245023223 xustar0030 mtime=1427460261.329259344 30 atime=1427460261.329259344 30 ctime=1457295917.260761324 transmission-2.92/qt/icons/Faenza/actions/22/edit-clear.png0000644000175000017500000000144312505250245024652 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< IDAT8Õ•ßKSaÇ?'w&¢s™G¦;Ùlº¹ WI`WA!Bÿ‚!ÝÑM?.o$ºô.ðÇmx!¹(ŒÅ`МO:ÁA£aš ÖpçœÕÛE[l+»è ¼¼çËç}žç=¯$„ :Qj%Á¶#ÜÔƒù H®TUUo¦Óé[±:!D쟱 ¨ ····oécdÌ~àjÃ0N766>Èd2=À@sssJ–e3•JµŒŠ¢¤ëëë3kkk¾rHyy5‰Dâ¬ÓéÉd2Aà3u»Ý«ñx|Z×õ™ŽŽŽ@¶©©)9777ÇC>Ÿo Èæãp](òwvv>1 CÍgš²v»ýûÊÊʲ¢(‘X,6Û××÷VÓ´íííáÍÍÍ%I’~”ƒB „¨½l³Ùf0ð¼,^Ûl¶—SSSA!„KqM¡êº~Þn·Oo ^!„_”Ÿ<¯¢(·¶¶ª½}î£Æårm¬¯¯?R@‹×뽓L&À×¢D‰B+¶4M y<žÕ¢’JÂãñ$t]ŸÍ¬¹ÅÅÅhWW×û2oIwÚÚÚBš¦-€Q~¿ÿ“¦i n·;‰DšNçÝÉÉÉ3‡ã]4Õ»»»“E~ ôwû¢(ÊÌüü¼Ùßßï ‡Ã-…–eɱXlÕápœêíí½gš¦}ppð¾iš#Á`pyww÷RÉÅÁï—ô¸>00à˜˜Pó{u²,Ÿr–eí;@­,Ë’$eMÓ4í|Ÿ‰¿ Èðj||üjkk«9<<ì ˲ ~ùNÞWØ“ ÐÃ2.¨ ¸266vnhhÈ•Ëåöó•Hñ H€ ÀÅüú(šÒ‡ÿYÿß R1ðOä=*ôŒ§>]IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/go-up.png0000644000000000000000000000013212505250245022241 xustar0030 mtime=1427460261.334259433 30 atime=1427460261.334259433 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/22/go-up.png0000644000175000017500000000077612505250245023700 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<{IDAT8Õ•½J$A…¿²{þg5¸t`Ò™±©/`¢ÉâlÒtdбنû6Ëæ›K!ƒ0ØJÓ·­ vz‘±zZEY=p¡àÖù¸u(ªŒsŽ·ÐÚ›PߨÛÀæbýjà(Š>GQt l<Éáœk«~–e{ƘscÌy–e{ι~›Ï´Ü H§Óùªª›a^•eù¸ÍmQŒEäHU·€;àNU·Dä¯2®÷Ó4­µÀ5P,êÚZ{¦i ô›ÌMQÔœ©ê' ZêaÞ”eyBC$MODäPU×ÛÓÖu«ªë"rL|x$Il­Ýfh]3kí~’$10xtdO2²¢(ªÀ7Qôz½µ<ÏOùÉ?…æyþ£>‘1fמÏç?‡Ãá}íYîûÀ—À·Åzˆ}àétú]D~ùzMàeOØóÀÝnwå[оqÎýnè嫌mЋõßg릃¾y¾\Î×IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/system-run.png0000644000000000000000000000013212505250245023340 xustar0030 mtime=1427460261.333259415 30 atime=1427460261.333259415 30 ctime=1457295917.261761341 transmission-2.92/qt/icons/Faenza/actions/22/system-run.png0000644000175000017500000000167412505250245024775 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<9IDAT8••ÏoGÇ?ëÁ»!Å?‚Md© hUz¡·Ê‚¤ªêFôj,ù†rõ•K«½pIÿ€ü \}£K©ª¬¶Qu…œÚõK•Á8Ð '@ø1=°DÓ-mÈ“žvæ½7ßyó¾óv4)% Šæ|ZàY f+±# tÿw•”ržÞ”RÞpÆQ]×€+àJ×õ)eÔñRJï<Œ¥9{E¶¶¶¾ÚÝÝýXôápè.€ g¬ë{{{wvvv¾"oË8’N§ïÇÀs¿ßÿPÓ´*ð¨:úTÓ´ªßïèÄýžN§ïK)#*– ê- ÷€ð ðØWŸ]Zu|ØZ¡P¸§–E%o’J¥F†aœƒ›Ž­ÿÔ¼^Î&†atR©Ô˜ÌljÅbÑÎçó‡Àð]4ŸÏ‹EÌÀ4ç¯A@÷x<ÆãñŠš^ hoooìïïØét‚ª_ÑFß8'iÝð†×ëýv0Ĥ”uç@ ðg«Õ:B<Ç„Ãá/;Ž_Á64M †a÷z½¯Ó%¦åé÷ûA)e¸V™Ëåž !O€'BˆG¹\×RÊF¿ß2m$M%ïŠ9bYÖ50VLcÇöÚúB—˜öþ(“ɇB¡¶+“¡eYwkµÚ*p ¸U«ÕV-ËºëŽ …BíL&sÌ´å¥JÞ ¸±±ñ±mÛ*9º¦i·Ãáð!@«ÕÚ”R^¨Çb±öéé©Å”¸î¬]à;`=›Í¾gÛ¶z+†RÊóËËËOœù¹» ÙlÖ¾þPK1£T*ÅÊåò¦û˜NíÎ}éö—ËåÍR©Œ˜JÞ’BB4&“ ï"Bˆ†BWU3yV©TŽt]ïù|¾W¦iÚÉdò_„&“ɶiš¶Ïç{¥ëz¯R©™¦yôf`3òTùèäääÓååeFÞD"Ñf³y`mm­ßh4êÀy½^O‡C-ÿÄô§ôFæ½ µx<Þdzmþ¢‰DÂ×l6W‰Ä à¨G£Ñ_Œny»eø ¸íÌ/€xËÓ´ð›Xç»Ð‚¿t®¹2–_RZIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/22/PaxHeaders.4960/document-properties.png0000644000000000000000000000013212505250245025222 xustar0030 mtime=1427460261.328259326 30 atime=1427460261.328259326 30 ctime=1457295917.260761324 transmission-2.92/qt/icons/Faenza/actions/22/document-properties.png0000644000175000017500000000104612505250245026650 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<£IDAT8µ•1kA„¿'+ èp÷©W.? îNí&?CR«Úÿ ]ŒKÜ9 ⸠–HéVBRXœHÎ9O ïÁz}‡½…Ìî훸]“Äc ð žDkàø THªkçù°~%Ö2Ïó=IƒZÏ‚(^˜Ù‘ß=5:’Þp;ŠðÐ|>ÿèœ+¢¸X,ž‡Ãµx=ß֕ι¯À ïç¯iÎ}åœïãÂÞyß̾HÚ6³ã¸YÒk¿öÎébá«h|ÑÂcÄ}­ŽV’<¯bl’è¸fÁxF;’÷Íì3€¤·fv7KÚiè»W༅ÇHŠb%©>~ðuÆIQ¤dœä¸ofû’Þ™Ù§¸YÒnCß½ŽN[xŒäŒ¿{^Ÿï¥Íf[rÀR*åv»_Åb±G"rCDì͸f°+w9ŽYàØ²@ ø¤]`ßår½ŽÇã]"âj&ÐS©Ô]]×ÀF$ɬ®®–¶¶¶ÎFGG÷þ$°£ëúÛµµµ ˆ´h"rÝ0ŒçGGGOsL&ï;NU.—ëmmmîÎÎÎõB¡ð«A; Ø?<<|¡ÏéééM ÐHPÕu½611‘Ú¬T*u]וÍf3›>h1Móšµz½^gyy¹255u/ ú¦§§wóù|É*¾Rê+Т€J{{{¨]F(ò§ÓéüØØØöe®µµµ ÔPÞ·´wîîîÙ¾¾¾ù«¸þþþ,PÖDD+‹áÁÁÁ‡‰Dâ¶µÍD")‹Õ7V8þ¼²²òXW€x½Þõ………íñññš¦UšUjµšišæ…xv»½<22’™™É›€h–[PÀ㎎ŽétÚ£”:÷ûý5¯×[÷x[oÁ¹´´ô-“ÉØÝnwinnîKoooÕ"ÜIc+ËÖq¬·±h4ÍårÏD䎅û+¬#ø pìßùû ÁIÙ-±hÜIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/go-down.png0000644000000000000000000000013212505250244022566 xustar0030 mtime=1427460260.675247671 30 atime=1427460260.675247671 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/16/go-down.png0000644000175000017500000000077212505250244024221 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<wIDAT8¥“±JA†¿;ÖI–(ÚX¤ dW®Img#Øø ÷rb‘òžÂBÁÆ*v‰‰LI­R%›DÖM„€?óÏ?ûÏì^ "ü'Ôù}`ÇËM—•Jñ4xsÑjµŽD$ðë×:(•JŸÀ³›+—ËóMF€ —Ë 0s‰b±( àgqnƒƒn·»;Nƒñx¬€ÌmÐétr€- EÑðêïàÐZ{ Œ€!pëaŒ¬µ×"r¸ÔÎ5n÷ûý³Z­vžeY~ݼù|>k·ÛWƘà tøwcL3I’æÂþ ’$icšK1ðË@8ŸÏ­µ§ÃápÏ%*•ʸ×ëÝ*¥î¯çòK)õ˜¦éS†³åÉaÎÒ4}RJ=ºb‰.LÇÀ%pÇñ…ˆ˜uµþËØšL&'Õjµ0 ÚZë;àÃ/üë_øÐZ?Ôëõ=­õÃ:1¬.ñD‹ï.ÎëÛ´ÁFñ “‘Û có‹oIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/go-top.png0000644000000000000000000000012612505250244022424 xustar0028 mtime=1427460260.6712476 28 atime=1427460260.6712476 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/Faenza/actions/16/go-top.png0000644000175000017500000000101112505250244024037 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<†IDAT8’±jÛP…¿k „…6&PÉÓAC C–ô´åQ:˜î*:'C^B:xïÔ!¤Ci¸a£H¾ÒßåÚ¹|à,çÜsîÿs¯ >!§¡þ¸FP@¨”Zž’‘O&#nÇû{âG (EäÞ6çóùG€ÅbñÜÉ•&"bSziš^+¥–J©eš¦×"âYþ1Ó-8ð<‚à x ‚àADÎûÎzÖ ã8¾)Šâ x^‹¢¸Šãø†žWRÖ38Ûíör2™|ÓZ·Ç=A¹®;X¯×ŸÃ0ü4‡@w‚³(Šî´ÖTÀΰÒZKEwÀ™° ü$IfY–Ý9Pw˜gYv›$É ðûV¸ð}ÿKUUŽ=bÎp8lʲü ü†·°_­V?ÇiëºVãñ8²“yžÿô^Ìtº¯c´"Òš½0Úhm½[`£~Ç{· N§•ˆüëèU÷v€ÿ¢¯ß| .ÿmIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/list-add.png0000644000000000000000000000013112505250244022714 xustar0029 mtime=1427460260.68024776 30 atime=1427460260.679247743 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/16/list-add.png0000644000175000017500000000055312505250244024345 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<èIDAT8­“±nƒ@ †?ÓÀ€ºtÈ@¤H´[¤/ÑwëCô˜³5Š¢ Ú¬\&À]8t!\“ˆü’ugË÷Û>Û¢ªLA0é50óØçÀÓÀf€ï3OU“ øJ+yž¿ªª }}€Ð*I’Ô—JXŽ~t :dÝY?âtáYD>ç=à¶h HWö°fð5–f‡õ¥lÚ7ᮕª®¬†áK]×V7Ælâ8î}íE<£œ‰È;ÐEñ‘¦é–ÓõÏAǶm{‚(ŠF#ùª¦iJNwÅ £ÿWÂÕ˜¼ÙWc©m•‹+IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/help-about.png0000644000000000000000000000013212505250244023254 xustar0030 mtime=1427460260.679247743 30 atime=1427460260.679247743 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/16/help-about.png0000644000175000017500000000130112505250244024674 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<>IDAT8¥“?HqÇ?÷ËÝŤ1%Ä´hI0¸dp)•€ÁÍI(´"tºÉ-.g—‚àÜfÈ ‡.J7‡vk‰!mŠØBµ±Ôª‰‰W_‡^ä"–}ðåïû~ïñþ|5áL¿Áú<¯.€6ðèôD‹H~¹›ÉdžD"‘g†alu`_)U ƒÏóùüC¹íÆ""W …B!í÷û_ûÀG`(ï€2PöÀ‹B¡‘`7^*•’º®oºÞtQ,××׿išÖõ½vt]½½½]‘l6ûØqœ°Ûã9pnF;™Lú‰DŸÏçk»þÐpçÖôôô#`@BÇÇÇw€×f£år¹J­Vk9ŽÓ;88o4#@H|N§ß­pe¶m[ IÓ4}±Xlóúª”R‡€®€V<ßu×t…•••Ogš¦Éuh  8™™™ÙëöîE"‘¨V«›¸©©©]àL§¹\®699Yõ†ÑVJi–eæææb^n||¼²ººZŽ4÷”ý@v~~þþòòr\D4€t:ÝŸJ¥Âkkk_›Íæ/Ó4ÙÙÙÏKKKõÁÁÁW@GóhÁdFGG”ËåRê2¶Ãá° ….ÆÆÆš‹‹‹gÃÃÃÜ{hA¯Ì­­­£J¥bƒÁ“/mþÜ~WïŸ=ëðhÁ²,+oÛ¶]¯×ŸŠÈ=÷Wx[ˆ#À%°ãVü§ýˆí/XΰGIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/edit-select-all.png0000644000000000000000000000013212505250244024164 xustar0030 mtime=1427460260.674247653 30 atime=1427460260.674247653 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/16/edit-select-all.png0000644000175000017500000000053312505250244025612 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ØIDAT8¥“±n1Dß kš(EZ¾!¿€ø~+Qª4ùD‰®KO—" ˆ‚éÒ1)Ζé8ÉÇJ–×’gvvì•m‰*ä*Ä:Ì€i!A œªTy*黨¼ý (¶p,Tt-¸Ø~/Ä^GÍXjI› í%pŽ öcdv…ذÒO|ê{7%}åÜö ø®YAöà³l{mûCÒÜöûרBŽ¡Wh€—¾;:ZÛ‡¾•ZxþÒ^æFaï Ó3°ç-pê#ŠH~ø4.^ŠVG´IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/view-refresh.png0000644000000000000000000000013212505250244023622 xustar0030 mtime=1427460260.672247617 30 atime=1427460260.672247617 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/Faenza/actions/16/view-refresh.png0000644000175000017500000000121112505250244025242 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<IDAT8¥“OHÓaÆ?¯ïš¿9™c ŒÐƒèÀ$!O Ayñ°c7ç¡IŒb‡;yñ ¥ºÔañ`ÒÉSÄfÔ(ú{í`A+h –änÕàéò³ÆÈ|àå Ïû}^žï÷5’8<‡ð'€ àw{~u êÖ¿Ôzù|þt0¼m­}iŒ)ZkŸûýþl6›•t²¹¿UìO§ÓŒ1¯À¶Ïç+[ÀcÌû±±±D³I³ØÔëõ~Çóx3>>~ggg窤ËårùÊôôô‚1æ…1æíÒÒÒYIN«Ag,K…îîî•F£qQRŸ$[ãÉdrØ·$õH¢ èú€H©TŠ»‰D¢`­Ýö€ð È-..ncöjµZ'à„žœœ¼a­}<x½ÞGÃÃÃ÷$jÉèL8ÎXkW$õ¼àûÚÚÚ»ÞÞÞm`¨9ŽS^^^~ |k˜355©T*Ñhô3ð   h´··¿Z]]-Xk÷€ýL&óldddØwÅ@Ïúúú9 :88øøÑº±¹¹¹ôÌÌÌuI£’ŒË‡R©Ô„ã8wû]]]7‹Åbü_SðHš¨V«qIÞ&~ÀÍ& …æs¹\RRô°E²-b$ ]›M•J¥K’bÍ÷æŸ)œ¾›nÐpƒÿ¢íXjà7«gŸÑqS%IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/dialog-ok.png0000644000000000000000000000013212505250244023062 xustar0030 mtime=1427460260.672247617 30 atime=1427460260.672247617 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/Faenza/actions/16/dialog-ok.png0000644000175000017500000000100012505250244024476 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<}IDAT8¥“¿kZQÅ?·_r_j¤!Éæ !BëÒAPE@Ût¶ é½{–þn- -˜ÂÔþJ‚2X:wDœ’ådÑòxMCˆ¾ËÎçÞË9×HbÝ[È}@Xº+`9‚f³ùXý»•t›Yî÷ûãñx'‹ùFã‰$WÒ?€5I÷#»•™ÙÎÀZÛ–”‰6K¥Òóz½¾'éAÄ|ü>;Žó©ÕjKÚ6Êåò3cŒoŒùQ«Õö$mÍÌ/À™ã8ïÛíö+I;óƒç€L:~ œŒ1ߪÕêA"‘8<൶ÙívÂfI˜Y‘ÜÑhô4ŸÏ?‡[@È€‰µöÂó¼ X,~†áhæ€Ôx<Þ/ »ƒÁ`0€\×½ìt:¿r¹Ü÷¨ùºS“ÉäE6›} ¼I&“'¾ï¿Œ^;<×-SÓéô°R©÷z½š¤í›:~BXk@y–ûï›êù?À­µðo¼òu8Ô°£'pIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/view-sort-ascending.png0000644000000000000000000000013212505250244025104 xustar0030 mtime=1427460260.678247725 30 atime=1427460260.678247725 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/16/view-sort-ascending.png0000644000175000017500000000120012505250244026522 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ýIDAT8¥“?hSQÆ÷½×Bxá%ðÀÒAÄ¡ƒ)¸³9’]⦗,ÝŠC7ãЩK -‚ƒCKA‚à¤E(´U$`É3¨)Ķñs¹¯¼Fìâ—sνßùùFÿp@ ŒRw.¹”=º'–¤°X,.cvŠÅ⢤P–fccc è%”t)Çòý~ZÒ ßïOÛJö“¥Ri|ùW 0¨×ëë¹\®[¯××m‰'Èd2~¥x’\I7$ÕìéÚòIîöööàuBÛ‚c‰gu>Ùá%ÙÏ///G‡‡‡ÎÁÁ “„KKKàZ&“ù=;;ÛER†á¼1æm†óvˆå ž[ÀàyŠ[ÀV¡Px&©ìù8ާ$}Žãx*âÞÞÞZ¥Ri[aŠïËåò«ÝÝÝ5`ßF£íûþ×F£Ñ¶mù¾¿¹ººÚÉf³ßÓ?WVV:AlGg I[­Ö] •paaឤÉäN"Zg8&`$]¯Õj÷'333$Ý´þ0Š¢9cÌË(ŠæÆ6IÞp8¼]­Vôz½;’Î¥ãFÒ¤çyG£Ñ×uýãããÇÀÎØºä[ÀàÛ_›Øl6;AôšÍfg|-À‹ñÇF’ \.wœþgâ< Zl°IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/document-open.png0000644000000000000000000000013212505250244023771 xustar0030 mtime=1427460260.676247689 30 atime=1427460260.676247689 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/16/document-open.png0000644000175000017500000000077312505250244025425 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<xIDAT8­“½NA…¿Y”bY `y5±6±ÖF} CÇð´Лcmab4v&Ö-m„båoa¯…»¸•hâIn&gîÏ9ÉÜQ"rÀ*߯Àˆ%ÐÁ™K&“'“Édk–ÐúÁó¼Ò}Cà ¨ÀÁ†Rê|AmX‹UÕúÑó¼"ð¢ø"rµÌj R€¡B>Ÿ/u:Iý¦S)5Îf³ív»¦DdÝ0Œcþ/Õ ¥ÔªïûE (qâš›Íæ“mÛÉ·Z-¯P(lˆÈPá+ âdlÛ>î#|¨DkÂìº1|®6°tY0Wû/|Ó4û½^/ñ—étz ˆ¸µZ­kšf?H΢R©ØÀF£jµÚÞ•ˆ$€}`¯õŲ¬®ëº `'¼‹¨ße2™©ã8ÏÀ™¦ÀEÙF£qT.—µã8·‹þ-Ëòëõú¸üð3Ea‡Àî‚zÔÅ p L?ލ“! b°·IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/application-exit.png0000644000000000000000000000013212505250244024466 xustar0030 mtime=1427460260.675247671 30 atime=1427460260.675247671 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/16/application-exit.png0000644000175000017500000000116612505250244026117 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<óIDAT8•‘OhAƳ»MK«KDK…bÁµ¹h‚Q÷–zÖA¿}’•3|ÛsÙD¹²0fÂj‹ßè³C¬œáP]—òÁO.ݼÅëœÃ¯‡ïò¸'¢L_³xq?ƒÿj]…ü} âÑ(êzWÏ¿T­4“ÛEN‰û® f¥‰mnI‚x0ŒºªƒÞ?·ÿ†¼÷Á|*Õ€™sbð">°¯ PT !Yªi¬¹Š‹Çq`> ,ýäõJœ)VIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/process-stop.png0000644000000000000000000000013212505250244023655 xustar0030 mtime=1427460260.679247743 30 atime=1427460260.679247743 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/16/process-stop.png0000644000175000017500000000146012505250244025303 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<­IDAT8¥“]HSqÆŸ³sv>æ>ÜÙv,£9—¸Ü¤e¬D!ƒˆŠ(ºÉúB¤6$ºôB"%#$"0$¤°ºHŒ"úМƒ S)³Ä¾ Ô™º%ûðììßÍ6T¼‰žËçâ÷¾ÿ÷yþ!ÿ#f  àS^ @@À²‰+b±µ×íö³fgwÈÉd>¨Uª/:Q|Q;1q<ÿ @<3mɸ޺º²ÀÍmz …FZ¢QB0§$&øä9qª¦¢¥¥? I(Äby­k,=V5]¤£UHšÍƒ½‚¦“Á'=yó/_T‡åÿ]VFÏL÷€ç¿ „€bh/´5wçIŸÕLú¬fÒ™cHÞ+÷\#„l'„ì >~TÿÚ&E»s¤½ÐÖL1B J­/åH©EÃAkÏÅólÜ®¨Åñ±Ú;®‚ýÞ˜wW=³Tîì°h8åHiêÈ/ªË1ªöÝ·6\jä6î³(faÞÛévx„µn÷Ë1ÕŒ#P&“QOÈb Áá·sîÛ]~F¥ÂdkÓÅb–á>†æ½][Šà*)fY&-Ÿ¹|zƒ˜ ‰#,Ç`vt¤À´xädWFN`ã›$=ÅFBÞÏ~Ë1$q$Õ ªq8ý,Ë€–ãG{«VXÈ>|¼G:íkäx6îÎ1PyzÁɲ 4§?U¬%1&Û¦«w]Qf¦<þŸ!ÿ Ûjë3lÈ¢¿ŽÂ3[€2I©ãéy0̲¬HÊèà¡…&_M"8埋 Y`ŽGžA€Ê,´¾¦6º¨äîÊ"¥e€¢TÊ·.—)CÍÊïiÐ&é=íö¼S«ïM?Z­Ê€Àzæ”7à€Xñ™Vü“þÎFQ~ø™yIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/media-playback-pause.png0000644000000000000000000000013212505250244025172 xustar0030 mtime=1427460260.676247689 30 atime=1427460260.676247689 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/16/media-playback-pause.png0000644000175000017500000000034312505250244026617 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<`IDAT8í“1 €0 E_Ä­Gð0žÝ‹8:8§8~…P,:b–ðäm1IôÌÐu ŒO@ œ¯[-Ìl¹AÒ ðäj€µÑUG£ûß ¸¤=p(œÇ{ýO%3-ö üÛIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/media-playback-start.png0000644000000000000000000000013212505250244025212 xustar0030 mtime=1427460260.678247725 30 atime=1427460260.678247725 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/16/media-playback-start.png0000644000175000017500000000071212505250244026637 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<GIDAT8¥’±JQEÏ“]Ø]"•ml6`m‚þ€ßJ0MØÚø±ÐÞ:VÚú*ÆÆB–¤PDY׈ELª01_^$Á SÌãræ w”ˆðYZ¿ ¸À+ð5 `FëçlÛ>*•Jë€o0*® ÷©Tê°Ùl®ŠÈ¼æùU&À9pÜ*¥®Ã0Ü‘qL}€.Ð^D¤S¯×w]×Ý/—ËkÀ¢¾¶ÒRÈ(¥ PO)5ëûþiEÇžç=ÿ û½Z"òÇñf{ÀÂÀ<) kÛv»X,ž$Ir´fSL]ý!—Ë=ÖjµV7À ЛN§?«ÕjœÏçŸè§ó¡›Ë²z…B!©T*ïŽã\w__úd³ÙF£±-""bÿuD"2ã—ÀÛØ©CÒSËãTúõÖl§IEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/document-new.png0000644000000000000000000000012612505250244023624 xustar0028 mtime=1427460260.6712476 28 atime=1427460260.6712476 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/Faenza/actions/16/document-new.png0000644000175000017500000000067412505250244025255 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<9IDAT8“¿JAÆsŠp,R(XÉ•—÷ð ¬ì¬,¯Écäì´ñÄÎ"]RI® ±XXH@Í¿Ïb÷tMîˆúÁ°³3;ßÎÇî˜$¶ì õX¯À °@Remç\‡u6vÎõ$µ«:‹:84³@Áê`€I:¶£d¼FçyžOãʲ,w:Îi ù–IÈ€0”GñÊò(ŸUñ¸€÷•u5·o"hÂF‚ kù˜`)é:ø‹ÿt˜Ù€¤Û¿ì-üó CÜ€ ÿó€¢(ö›$´Ìì2ì‡fv:9©|` Ü¥i: Ä?$ôWˆûu~š¦ón·ûˆŸ‡/‚‰¤{±„›Ÿðßyrf@‰Ÿ ¯5š…ÌÌŽÁ6"~…‰¤çÊÿM1À'䥓õùRgIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/go-bottom.png0000644000000000000000000000013212505250244023123 xustar0030 mtime=1427460260.673247635 30 atime=1427460260.673247635 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/16/go-bottom.png0000644000175000017500000000102012505250244024541 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<IDAT8“1kÛ@ǧ6¥^"Ò¥˜‚0‚‚ÇdìèÐÚYK>‡!‹ôdíÞŽ­@ƒq5‡`ðHΣkÅÆéË"•ã¬!ܽûÿÿïÇ;%"´Ä!ðÆ©ýîö"â¦Êó<ìÌó<åâu[û^¯÷¯&ºµ½p |ßàÑ>¨kª1Þ&p4¶Û-Æ ll²,cÌÀ÷}†Ãá¸PÖ#žt»Ý‹ªª>ÖŽ»÷Nç÷z½N[Ï,‹¢¸ ‚`\×ìœA0)Šâ X6$[ Šã¸HÓ4o!o€Mš¦yÇPý4g^ív»Ó(Š>Ïçó·öA¿ßÿ3›Í¾i­Omž´Öe–eÏ󪦳çyU–e­ui“ÖABD¢$IÎKà2I’s‰Ú°îšð1ŸƒÁÀt:ý†á`ëí98^7›0 £Ñè°Yï,ìŠú_Ø>(¥¾¶ÙqCD¾7®€ï/°ÃX‰ˆy!oÕ,žžIÕ³òOQIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/list-remove.png0000644000000000000000000000013212505250244023462 xustar0030 mtime=1427460260.673247635 30 atime=1427460260.673247635 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/Faenza/actions/16/list-remove.png0000644000175000017500000000115012505250244025104 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<åIDAT8¥“ÏkÓpÆŸ.I÷Yj“, m·A™§Ò‹w™ŽEÁÌ“0a°Cû ƒzOÝe¡… ²Ë^$—9z˜1JZ­ÐE2Ú¦¯[ ‘"ÒÞËÃû|øò<|#D„qfb,÷€ @ hâ@Sþ˜ÙËeõí)V¾0ŒôÀ(^Fz{Š•÷rYÀLÐ d ÷rzãóYAåyVó}{åõ›çP~õòà6Ç%^ïZ¹»˜öñS @# HçS¦Ön-ràÊïã²Ó³ å“1n>uéæÙ‹ó/\†bÇ©¯TõûùnÃÉ@»ç$žŠjeJ QU+ø€Ôqœ‡öÓùηßáD㪕|û¾UÕ €ö¨}çÔ²kž7ÍàÖuéæÙ‹ó/\†bÇ©¯TõûùnÃÉ@»ç$žŠjeJ QU+ø€Ôqœ‡öÓùηßáD㪕|û¾UÕ €ö¨}çÔ²kž7ÍàÖøàÀ©®ë‡DT°mû ™L¶mQA×õÕ‡ˆr¨Õj÷9޳XZ+1Æ:ªª–ˆhÏ÷ý}"ÚSUµÄ묟ßEÑ·,ëD„iÈ.N·†Ãá ŸÏ  Ã(Š2Ð4MŽÇã/4M“E†1XDq¹\>*—ËÙv»€h4z­P(¼ït:ûD4aŒ¥ŠÅâë^¯÷Øó¼Á /Y(ʼïû+•Ên³ÙLÈ>ðDÜðÀyxÅÖnaÀƒjµº[¯×›BäyÞ›uðçŠr›Zþ©¸Í–¿×oFÞ5d²ƒIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/go-up.png0000644000000000000000000000013212505250244022243 xustar0030 mtime=1427460260.678247725 30 atime=1427460260.678247725 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/16/go-up.png0000644000175000017500000000075612505250244023700 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<kIDAT8¥“½JA…¿Ù#fbHAm„ÜBRYù[*ø>ÅâØŠï°ï`+¤°³±ˆ°‹-‚a÷Z¸Êf3QÄ—ù;÷ ÷Ì%"üΰ –㼺AœAp tW²DÄkI’ ”RC¥Ô0I’ˆ¬¹¸«vŒ17ÀpgŒ¹‘×UÂfEGÖÚð¼XkQ›KFÕ^Á›L&{½^ï*Ïs¿bœò}?ϲì¼Ýn?Å*·Â0<+“_·2^ó<÷Ã0<¶n¬Ì7â8Ò4=²R Yš¦ÇqÀ†«„]cÌÅt:]r‡7~³ÙœYk/'Xl¤÷ñx<ôûN~¿oEä¹¶=uqëôg|Œ+ɹ[=IöIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/system-run.png0000644000000000000000000000013212505250244023342 xustar0030 mtime=1427460260.677247707 30 atime=1427460260.677247707 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/16/system-run.png0000644000175000017500000000116312505250244024770 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ðIDAT8¥’OkaÆ®ŠUŠíÍ ²‡ˆ‡BMÆ*^£H$r7N?>€¶2Í}¹\þ kàV‘L” üR˜û§KL—J¥V«µ¥ H&“w•Jå@­V{7 ^4›Í­áp¸Óh4zÁüàhM Y­VDd[D¶«ÕêQW˜ ɈÈ_5Mû±X,BÁ¿Ýn€þŠ?Q©‰¦i?—uήëž†Ñ ævg_×õC]×ÇÙâ†at\×=S·±$èåóùÓl6{çóùÀ÷ý=ß÷÷æóyÐÁ$›Í^åóùSÔa=’1‘H|åÖ[<g4}bŒ·žç¹¹\®_¯×;¦ivy¸ƒ±išÝz½ÞÉår}Ïó\dåiÀ{ ë8NºX,¾8??ÿ^(zÀ ,wÁªeCù_Î:Ðsÿd ]ÙÿmIEND®B`‚transmission-2.92/qt/icons/Faenza/actions/16/PaxHeaders.4960/document-properties.png0000644000000000000000000000013212505250244025224 xustar0030 mtime=1427460260.674247653 30 atime=1427460260.674247653 30 ctime=1457295917.250761154 transmission-2.92/qt/icons/Faenza/actions/16/document-properties.png0000644000175000017500000000070712505250244026655 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<DIDAT8•“±NA†¿Á»CèL¨è´:z k;í-,lè ‚Š ³“FM|J‹K´¢k ÅN» ¿…K²\@`’Édgvþùv³k’B  ìÆzû&@Ž$$ÕÊåò=ð|®ñJ¥r#©& s‡f62@ìJ:^—0àÐh4º‹¢(_Ö5ƒz½~ ¤ó£^ý Š¢g3H:1³G_@Òpîç|©‹‰¤žkè oßJ̬-)6³v ÞH@Ò• ¶AÓ4·!H¼×~,Xâ/V4Acÿn™‹E[( Ón·[bW‹}wµéíü)‡ax‘çy 8v—LžA0˲ìï)'­Vë­ßïï§iú´¢ùïÌA N§3Á]¦yßù8vþfÀ 0ò_<¯´)Ú¶IEND®B`‚transmission-2.92/qt/icons/Faenza/PaxHeaders.4960/status0000644000000000000000000000013112505250245020066 xustar0030 mtime=1427460261.395260522 30 atime=1427460261.372260111 29 ctime=1457295917.26876146 transmission-2.92/qt/icons/Faenza/status/0000755000175000017500000000000012505250245021571 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/status/PaxHeaders.4960/scalable0000644000000000000000000000013112505250245021634 xustar0030 mtime=1427460261.567263592 30 atime=1427460261.395260522 29 ctime=1457295917.26876146 transmission-2.92/qt/icons/Faenza/status/scalable/0000755000175000017500000000000012505250245023337 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/status/scalable/PaxHeaders.4960/network-idle.svg0000644000000000000000000000013212505250245025037 xustar0030 mtime=1427460261.567263592 30 atime=1427460261.566263574 30 ctime=1457295917.265761409 transmission-2.92/qt/icons/Faenza/status/scalable/network-idle.svg0000644000175000017500000012172612505250245026475 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/status/scalable/PaxHeaders.4960/network-receive.svg0000644000000000000000000000012612505250245025547 xustar0028 mtime=1427460261.4892622 28 atime=1427460261.4892622 30 ctime=1457295917.265761409 transmission-2.92/qt/icons/Faenza/status/scalable/network-receive.svg0000644000175000017500000014040112505250245027171 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/status/scalable/PaxHeaders.4960/small0000644000000000000000000000013212505250245022745 xustar0030 mtime=1427460261.493262271 30 atime=1427460261.415260879 30 ctime=1457295917.265761409 transmission-2.92/qt/icons/Faenza/status/scalable/small/0000755000175000017500000000000012505250245024447 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/status/scalable/small/PaxHeaders.4960/network-idle.svg0000644000000000000000000000013012505250245026145 xustar0030 mtime=1427460261.490262218 28 atime=1427460261.4892622 30 ctime=1457295917.265761409 transmission-2.92/qt/icons/Faenza/status/scalable/small/network-idle.svg0000644000175000017500000007003212505250245027576 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/status/scalable/small/PaxHeaders.4960/network-receive.svg0000644000000000000000000000013212505250245026654 xustar0030 mtime=1427460261.492262253 30 atime=1427460261.492262253 30 ctime=1457295917.265761409 transmission-2.92/qt/icons/Faenza/status/scalable/small/network-receive.svg0000644000175000017500000010663312505250245030312 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/status/scalable/small/PaxHeaders.4960/network-error.svg0000644000000000000000000000013212505250245026363 xustar0030 mtime=1427460261.493262271 30 atime=1427460261.492262253 30 ctime=1457295917.265761409 transmission-2.92/qt/icons/Faenza/status/scalable/small/network-error.svg0000644000175000017500000011665112505250245030022 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/status/scalable/small/PaxHeaders.4960/network-transmit-receive.svg0000644000000000000000000000013212505250245030513 xustar0030 mtime=1427460261.491262235 30 atime=1427460261.490262218 30 ctime=1457295917.265761409 transmission-2.92/qt/icons/Faenza/status/scalable/small/network-transmit-receive.svg0000644000175000017500000012370112505250245032144 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/status/scalable/small/PaxHeaders.4960/network-transmit.svg0000644000000000000000000000013212505250245027073 xustar0030 mtime=1427460261.491262235 30 atime=1427460261.491262235 30 ctime=1457295917.265761409 transmission-2.92/qt/icons/Faenza/status/scalable/small/network-transmit.svg0000644000175000017500000010572612505250245030533 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/status/scalable/PaxHeaders.4960/network-error.svg0000644000000000000000000000013212505250245025253 xustar0030 mtime=1427460261.566263574 30 atime=1427460261.565263556 30 ctime=1457295917.265761409 transmission-2.92/qt/icons/Faenza/status/scalable/network-error.svg0000644000175000017500000014163312505250245026710 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/status/scalable/PaxHeaders.4960/network-transmit-receive.svg0000644000000000000000000000013212505250245027403 xustar0030 mtime=1427460261.488262182 30 atime=1427460261.486262146 30 ctime=1457295917.265761409 transmission-2.92/qt/icons/Faenza/status/scalable/network-transmit-receive.svg0000644000175000017500000014522612505250245031042 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/status/scalable/PaxHeaders.4960/extra small0000644000000000000000000000013112505250245024050 xustar0030 mtime=1427460261.527262878 30 atime=1427460261.493262271 29 ctime=1457295917.26876146 transmission-2.92/qt/icons/Faenza/status/scalable/extra small/0000755000175000017500000000000012505250245025553 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/status/scalable/extra small/PaxHeaders.4960/network-idle.svg0000644000000000000000000000013112505250245027252 xustar0030 mtime=1427460261.525262842 30 atime=1427460261.525262842 29 ctime=1457295917.26876146 transmission-2.92/qt/icons/Faenza/status/scalable/extra small/network-idle.svg0000644000175000017500000007534112505250245030712 0ustar00mikedldmikedld00000000000000 image/svg+xml Opacity : 50% Opacity : 30% Glow : 6Opacity : 50% transmission-2.92/qt/icons/Faenza/status/scalable/extra small/PaxHeaders.4960/network-receive.svg0000644000000000000000000000013112505250245027757 xustar0030 mtime=1427460261.527262878 30 atime=1427460261.527262878 29 ctime=1457295917.26876146 transmission-2.92/qt/icons/Faenza/status/scalable/extra small/network-receive.svg0000644000175000017500000011616012505250245031412 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/status/scalable/extra small/PaxHeaders.4960/network-error.svg0000644000000000000000000000013212505250245027467 xustar0030 mtime=1427460261.524262824 30 atime=1427460261.524262824 30 ctime=1457295917.265761409 transmission-2.92/qt/icons/Faenza/status/scalable/extra small/network-error.svg0000644000175000017500000010400412505250245031113 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/status/scalable/extra small/PaxHeaders.4960/network-transmit-recei0000644000000000000000000000013012505250245030464 xustar0029 mtime=1427460261.52626286 30 atime=1427460261.525262842 29 ctime=1457295917.26876146 transmission-2.92/qt/icons/Faenza/status/scalable/extra small/network-transmit-receive.svg0000644000175000017500000013356112505250245033255 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/status/scalable/extra small/PaxHeaders.4960/network-transmit.svg0000644000000000000000000000013012505250245030175 xustar0030 mtime=1427460261.527262878 29 atime=1427460261.52626286 29 ctime=1457295917.26876146 transmission-2.92/qt/icons/Faenza/status/scalable/extra small/network-transmit.svg0000644000175000017500000012220312505250245031624 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/status/scalable/PaxHeaders.4960/network-transmit.svg0000644000000000000000000000013212505250245025763 xustar0030 mtime=1427460261.488262182 30 atime=1427460261.488262182 30 ctime=1457295917.265761409 transmission-2.92/qt/icons/Faenza/status/scalable/network-transmit.svg0000644000175000017500000012242212505250245027413 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/qt/icons/Faenza/status/PaxHeaders.4960/240000644000000000000000000000013212505250245020314 xustar0030 mtime=1427460261.384260326 30 atime=1427460261.378260218 30 ctime=1457295917.263761375 transmission-2.92/qt/icons/Faenza/status/24/0000755000175000017500000000000012505250245022016 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/status/24/PaxHeaders.4960/network-idle.png0000644000000000000000000000013012505250245023501 xustar0029 mtime=1427460261.38226029 29 atime=1427460261.38226029 30 ctime=1457295917.263761375 transmission-2.92/qt/icons/Faenza/status/24/network-idle.png0000644000175000017500000000106012505250245025125 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øgAMA± üasRGB®Îé cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs × ×B(›xIDATHÇÝÔMKÃP…áÇÔØnÜ‰Ø E\‚þÿ_¡  Wõ£âBw "mÄEn µ¹1iÓ…Ìæ óž0s'üõØj™·ƒ ìá¶×ßEVˆm¤žâ7Eac ð+LV58B›3¹_vD'8ü¡MËà‚s“–À ƒIYCSƒƒˆžÅš¼Dô§XCCà Fè¢7Sa¼¬Á0d"¿ÎnC_Š;›Bcù_±Ûœù9Ÿµ g~S¼áº-øÿˆo ƒ/cŠ!›%tEXtdate:create2012-10-30T17:17:56+01:002v‰!%tEXtdate:modify2012-10-30T17:17:56+01:00C+1tEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/status/24/PaxHeaders.4960/network-error.png0000644000000000000000000000013012505250245023715 xustar0029 mtime=1427460261.38226029 29 atime=1427460261.38226029 30 ctime=1457295917.263761375 transmission-2.92/qt/icons/Faenza/status/24/network-error.png0000644000175000017500000000150512505250245025345 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øgAMA± üasRGB®Îé cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs × ×B(›xIDATHÇÕ”MkQ†Ÿ;3Iƒ‰+U4­´B±$qUE‚ bÅ¥+ÁȪâÿ¨âF" " .£ø’¶!Æ?’´¦Ø˜Ì丘 ŒÃ¤Áizà.î;—çsî¹þ÷ÐûÌ2@ø`ôqàÀꈛ5Ø šk­ïúa0 $<š ¼ZA OúÀ;-·Ô`wÝò A ¾uÑ?{… mZ¶Q—¶”ûevŸëØmY>m‚õÇF%Æ€°Ô@uÑ“À>×~ øèwPDRJ5ý¾ûµéˆ°Ç1õµF©”¼ŸNçD$."Ûï¥RÓ"2ìûfp{*z£¼rÿy£TJÎ{ó³ÝŽ&vÝË /Uªçc†^½¼º–VJ•ýfQ·{Yö–÷Ù¹3S;bу†F¡¾ràð`Œ/-sðQf<\õfr2ð–® |J”,L]ºµúôqÖ²ì)¡ë:ÛŽe_˜™»¨”ZpgÒ¼í, ûù—ºdõ£VøÐŒFChb£ÚJQ[œouøs\c?ýu übƒ-?9q}¹X>•ÚŠn ‚eY,”‹ÙüäÄ5o‰RN‰Þö‚w.¹U™ÏÔsWžSù‹?ý°mšáæË''µ]‰Z|öÁQ¥Ôû^œ^&†¬WÏšwfnˆÈ~5ïÞœ‘"tRÿ]ü¬<¸<t(Ž%tEXtdate:create2012-10-30T17:17:54+01:00¥é˜%tEXtdate:modify2012-10-30T17:17:54+01:00Ô´ ´tEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/status/24/PaxHeaders.4960/network-transmit.png0000644000000000000000000000013212505250245024427 xustar0030 mtime=1427460261.383260308 30 atime=1427460261.383260308 30 ctime=1457295917.263761375 transmission-2.92/qt/icons/Faenza/status/24/network-transmit.png0000644000175000017500000000140212505250245026051 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øgAMA± üasRGB®Îé cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs × ×B(›xÒIDATHÇÕ”1‹Q…¿™Iâ›8†ãˆ­µ´1!‚¿ •be¥„D´±Úb‹°;A–h£©"Ž ŒË±ÈDb6‘Ù¬àÛÜyï;óî»ïÂÿ.kɼCÀYàð upØ™$—e°ÁW€ïÀÛÉãà[Àh¿>PÌ©ØOZ¢ÓÀ±™ÜÏyp"ç8:9>1ÍÛ× ´ ¿³hÃ_ $™’ŽJªJ* …/ –~ˆm ÉŽ»®{Ó4Í®ã8·{½ÞÈuÝpfi|ŒUI–¤¹\îðžñ¾³mûé`08U,Ï—wR|Ir=Ï»ô€—S±å8Î}IÞ^Y‹Úôp†ç€ÁL~{8ú@–hÖ$50oŒç˪Õj/?ª=i×%KʶÛmølOG½^Õív__ã} Þjµ.X–Õž¤R©uÛ¶×òùüƒF£ÑtER²))Ûl6/Z–µ <.•Jwƒ ¸!麤«’ÎG­›¾ýùð°\.ßé÷û×$çøétz hW*•[A, þ»žÕjõM&“1;Nèûþ3Ã0>-ÃÀˆN`—Uà¹aᾨÿR¿XЫ~>Õ:%tEXtdate:create2012-10-30T17:18:01+01:00N:âF%tEXtdate:modify2012-10-30T17:18:01+01:00?gZútEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/status/24/PaxHeaders.4960/network-receive.png0000644000000000000000000000013212505250245024210 xustar0030 mtime=1427460261.384260326 30 atime=1427460261.384260326 30 ctime=1457295917.263761375 transmission-2.92/qt/icons/Faenza/status/24/network-receive.png0000644000175000017500000000140012505250245025630 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øgAMA± üasRGB®Îé cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs × ×B(›xÐIDATHÇÝ•1haÇïOLÁDr¹&-稛tŠvrNŽ:«Èq8tÌÚ=«›cW©[Ç„D(ÉÒ3Ö`Ìs0‘æLC.^¼å=¾ßÿ}ï½ÎÙ$I˜ª.0>ˆH?Iøeß÷o†Ñ4M󹪅{ž·)"-à0“É쨪“hå"ò 8( ;ívû®ª^Z¸¤ª–ª®©ªëyÞ¦aûÀ^±X|Á}U½²(<¥ª«–em*~ ´€]Çqžv»Ý{QøÜ[¤ª)ÀÉf³[aV€€Ãt:}Òét^Ú¶ýBD>>—Šq\.—{†á*p4Q¥ÈgÛ¶¢ð¸™^¯gÝhBDzÀi‡ŒߪÕj8‰ºïûGÀ—¬ [n”Ëåký~ÿv­V{l½^¯?VÕ USì[nŽÝuÝÊ`0¸ãûþ£|>¿Õh4¨ju|Ö­n4X*•Žƒ ¸:4Ed¸ˆÀpqJü;°?o fõméŒøûyá³.œ‘{q¦½X Gþ8ÞÆÃß3×ù½ã-àŸ>Ó&pH'‡É>W’†Ãä ÀWà0)øÿa¿òϱ¡8ãu™%tEXtdate:create2012-10-30T17:17:59+01:00Ä>ùÈ%tEXtdate:modify2012-10-30T17:17:59+01:00µcAttEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/status/24/PaxHeaders.4960/network-transmit-receive.png0000644000000000000000000000013212505250245026047 xustar0030 mtime=1427460261.383260308 30 atime=1427460261.383260308 30 ctime=1457295917.263761375 transmission-2.92/qt/icons/Faenza/status/24/network-transmit-receive.png0000644000175000017500000000163412505250245027500 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øgAMA± üasRGB®Îé cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs × ×B(›xlIDATHÇÅ”_HSqÅÏ÷wçÜ.›µ;·¸×ÛRŸ{ Š^’„ÁžêÅ‹žúCK0!Ÿ!†HF/ÐC,±zÊÞ  $²SÖã®.hœ¢Ss‹~ð{úòûœó=œ{|¤‘0’:À€‚ˆüi$<à8ÎE¥Ô¬×ëÍ4 O&“Ý"2`>Œ“´ê\Df|2Ms|aaá*I_½@EÒ ÙN²#™Lv+¥¦Lµµµ-//_#y¼^¸FòT8(;þ `À;Û¶Góù|/Éc»ßTÝ"’€“Á`°ÏuÝÓ~ € ]×W³Ùì{˲&D¤´û§†Z øíºn;€¥=.EV,Ëš®„×*Ð\*•Âò•ƒ2øÀΫ#bQ$[IvðvuuÍX­¼Žã,øUƒÙxÌ0Œ´ˆ|miiq]7‘H$îؾýýýwIž'Yý_a ŸÈb«-ßt]¹¶¶vÅqœ;Ñh´oxxøÉ $MB0"‘ȃB¡pÀÏ]£@(úX,ß8à €9Ù¨U ])õì µ•Rîúúú=ù^M‡µH¬h®Äãñ)¿«{_v$õt:ÅVíö´¥§§gfrrr@±Z}ð¡¡¡³š¦Móx<Ïý~ÿh(z’J¥R$/•¿èúàƒƒƒç4M{ à…išs¹ÜM’7Hö’<ó·¶÷—¿0bYÖ£ÅÅÅë$[ë `755HÛ¶ý0—Ë5 ¾Ó¢ÎÎÎyŸÏ§e2™B,{+"…FHyƒfÝtD¤¾–ü³ Ü(%wHûG%tEXtdate:create2012-10-30T17:18:03+01:00Ù¥óo%tEXtdate:modify2012-10-30T17:18:03+01:00¨øKÓtEXtSoftwarewww.inkscape.org›î<IEND®B`‚transmission-2.92/qt/icons/Faenza/status/PaxHeaders.4960/220000644000000000000000000000013212505250245020312 xustar0030 mtime=1427460261.377260201 30 atime=1427460261.372260111 30 ctime=1457295917.263761375 transmission-2.92/qt/icons/Faenza/status/22/0000755000175000017500000000000012505250245022014 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/status/22/PaxHeaders.4960/network-idle.png0000644000000000000000000000013212505250245023501 xustar0030 mtime=1427460261.376260183 30 atime=1427460261.376260183 30 ctime=1457295917.263761375 transmission-2.92/qt/icons/Faenza/status/22/network-idle.png0000644000175000017500000000062712505250245025133 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<IDAT8µÔÍJÃ@…á÷¨­U÷ŠZÿ‚`Áû¿ Š¡T[E\*H1ñ¸i3%©ãÀ,r˜<ù8!‘mþc­¤‚$­Kº’t°– À'%õÚÞ[øc5èÐö',1±¤C †úÙ%´5,é Ø¯ÄY…UH:©A²*Ú v#y^¶_#ù´.\ر¤`xî°]82²ýÔ …Ëc  ܳ€?ÚžDï¯ûW„IOkÎmbXqÅ:îGò&è"x5’?/ KêD8±=n —^ž¤.p௰s`jû¡)Z‚ èð\ÛžµÁ~Á›)P˜wy‘…yðܤ@!ò¤XßÈF`‰!Þ˜IEND®B`‚transmission-2.92/qt/icons/Faenza/status/22/PaxHeaders.4960/network-error.png0000644000000000000000000000013212505250245023715 xustar0030 mtime=1427460261.376260183 30 atime=1427460261.376260183 30 ctime=1457295917.263761375 transmission-2.92/qt/icons/Faenza/status/22/network-error.png0000644000175000017500000000122112505250245025336 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<IDAT8Í“ÁKTQÆgæ9Z¡•cÙT.¤p¤!!AµnÛ¦v‘Wý‚;KZ-¢•D‹ˆÚDAK #ˆ‘©IÆÅršyo¾ó”ñÍ ÄÓ  gq¿{ïïœûqŽIâ_¬È^̬ÕÌΛ٠€³GÐ6`h¼]Íì8ÐGõ×[Q>†›ÙÈ.ð^RBxlf‰Pw  m¢{µ›0àïMôåÝ‚SÀJ@KKÊÖ f@ÌÌ€“@ðMÒRÝÿ~ò‚«a›Ù1 ÈIú\g…ß§ý5RVÒçfï <Øa…_iàN¯Ÿ¬îm1“IÌ%“@pp.™¼GuÌmGÅf6´6€%½«­¡˜É$fÏ ~øU©´Ç{ºÉóbÙüê'ºz{½ ‚Giì{ZÒ×ÚjŸŸ,ä²ã‡œ©ÍªûZÉ•]:ħ¶ÁfÖŒí–$¥$K¤îÞz¸þêŘçU§9ÒyqìÍééÙ›ŽIZñÖ%e@~®¥>•ÚÛ[ˆ¨úÉŠkéÅ2°a’0³sÀ`˜—ô» lÛŠùk&3é¥ñ¡îýD$<ÏcáG¾¾f6Dµmþ `åüâðÆÄ×äW:Ú.]}VqÝXéíË+‘Ãñµ®™§£H Ž6W¯»§ïK:%iÀ}ò`FÒeI‘?PÕ‰z«–‰IEND®B`‚transmission-2.92/qt/icons/Faenza/status/22/PaxHeaders.4960/network-transmit.png0000644000000000000000000000013212505250245024425 xustar0030 mtime=1427460261.377260201 30 atime=1427460261.377260201 30 ctime=1457295917.263761375 transmission-2.92/qt/icons/Faenza/status/22/network-transmit.png0000644000175000017500000000115512505250245026054 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<êIDAT8µÔÁ‹qÀñï›fwXmIE³ÉŒ‚nEAuì’ôx)èÒ_ Q—:¢— 6êÒ©C‘ºDá5ˆÅºè! §$‹…ÜåuÈÆM]{ð.o~óáÍûý~#ªÊÿcYˆ¬ˆÈ)9`- N°½XDVGè*ðx{Eº¡ªCX cñܨ©ü ‘£ÀPy+ŒÂ£‘Ã(ÀV 2SêÛQÅÝ`H ›J¥¾NY÷iØzžwÝ0Œ†ëº7[­ÖÐó¼ ´®£ªŸ#U §©ª‡âñø:ðØÞ;Žó¸ÛíI§ÓÇ€s@.âÝqJÄ¿ÂK&“×z½ÞEàûD=æºî«~¿ èMùÒqD·}Aœº¡úæ`0ðØ¢°ô•ðƒb±ø’?—áŸÞ¼X­VÛü6'³T*½n4o€o³À“U«Õ3¦iÖG–e=pç~"‘¸[.—˪zAU­Ý6l2Çh¥R9kšæSàa&“¹Óét®ªêU½¤ª§G§e&t^uú¸—Ífo·Ûí˪ššŠ:n¾mÛ7†ÃáÏ\.×k6›óùü3àËL³œ@¡PxkÛ¶Q¯×ß÷ŸïUu€óÀð_Û…â7ƒ²Cõ^ËÇIEND®B`‚transmission-2.92/qt/icons/Faenza/status/22/PaxHeaders.4960/network-receive.png0000644000000000000000000000013212505250245024206 xustar0030 mtime=1427460261.377260201 30 atime=1427460261.377260201 30 ctime=1457295917.263761375 transmission-2.92/qt/icons/Faenza/status/22/network-receive.png0000644000175000017500000000113712505250245025635 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÜIDAT8­Ô?hSQÇñïIªÁ4)˜'‘üiHÉZÐIqŠvNŽ:«Ããeé˜-¸gqpsìè"qslAh„¢ˆô5>¬bÌÏ¡)M“kŽ•Ëå]àh¼=ÏÛ~̛٪™Ý,‹‰f³ù±R©Œ¢µZíC½^ô&‡¥XnŸt©TZï÷ûw=Ï{œN§7ÆCIeI‘i秦ÂÌVÒøz¡P8ô}ÿêðÒwÀ.Çÿ†I#¾Ħ|ÿ[Òö4h¼Âf Yÿ< :6³ !~’äÏ ŸÉ±™]® áÁ°ÿ‡’fEÏÀ#è2ÇqjIú36Ñë@|(œÎr}‘(œŽ¢üöBHŽQÿòŒ¿ò5¤IEND®B`‚transmission-2.92/qt/icons/Faenza/status/22/PaxHeaders.4960/network-transmit-receive.png0000644000000000000000000000013212505250245026045 xustar0030 mtime=1427460261.377260201 30 atime=1427460261.377260201 30 ctime=1457295917.263761375 transmission-2.92/qt/icons/Faenza/status/22/network-transmit-receive.png0000644000175000017500000000137712505250245027502 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<|IDAT8­•MHTQÇ÷½a>3Ö¼QcžÓ4ºn$m’„ÀUm\X´êƒžÁml‰0e¹ „¡2Õ*àD&øÁ´œ§^h‰ž£1Í‡ŽŒÎæž{ÎÿïU"Â…˜ÀÑŽêïééiÕu}Âãñ<BˆH­éÇãíJ©y`Áï÷‰ˆU3Ô¶í J©Yàc8[\\¼""ÞÂ41E$&"Íñx¼]Ó´`ª©©itmmíªˆÕEäT(êßíð0¼D"#étº[DŽííWUºBN^ÇqNßv ÃØXZZzgYÖ$Û;àªRõzÓ4o9ŽV J©u˲f ¡‡{r¹\H”R9àOñú~>Ö€z p·µµÍÅiÛö*ð³äô>êGMÓL*¥¾ÔÕÕ ;ŽÓÙÙÙyèß˾¾¾;"rNDT1£"4<–È«ÿÕ0Œ—›››—mÛ¾ÝØØØ;44tSDÎïî/á”s…ÙÐÐp?“É\~¬ûƒÁà‡l6;œ>“·ÛN¹9–Ç4M{&"ªdèšælooß¾Uf/ʹB뀧¸ÐÑÑ1ü> ¥®0’Éd#yûü§~WW×l*•š²Õ€ n žÕu}u¹\Ï}>ßH0|œH$"rq÷ZWõüƒ ´êºþx‡­¬¬Ü‘ë"Ò-"g*©¿Ø·Ûé+`ز¬‡ËËË×D¤¾–'U‰HÄív?ØÚÚú‰D2ÓÓÓéX,–2UͲB¸ZZZ¼^¯>>>ž‰F£oj…BÞÇ ügøžjU? þ)cМ¸ÊIEND®B`‚transmission-2.92/qt/icons/Faenza/status/PaxHeaders.4960/160000644000000000000000000000013212505250245020315 xustar0030 mtime=1427460261.395260522 30 atime=1427460261.385260343 30 ctime=1457295917.264761392 transmission-2.92/qt/icons/Faenza/status/16/0000755000175000017500000000000012505250245022017 5ustar00mikedldmikedld00000000000000transmission-2.92/qt/icons/Faenza/status/16/PaxHeaders.4960/network-idle.png0000644000000000000000000000013212505250245023504 xustar0030 mtime=1427460261.394260504 30 atime=1427460261.394260504 30 ctime=1457295917.264761392 transmission-2.92/qt/icons/Faenza/status/16/network-idle.png0000644000175000017500000000052112505250245025127 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÎIDAT8ÓAJA…á¯ÇAQÁµˆ!çþ£"èNTr…h¹i¶Õ&o×Uõ?ªŠê¦*¥”p ÍžðçØÍ&€ æ8Å:"G RJ¸ÆQ^GÄ= d¸Åaÿ‚ßÁ¢†k¼ÿ{)¿FÈËZ"p“kNrúÝúò2Üê¶Å W¹Û.">† ZWMm"¢óêÔ𨾠ò…ÕÚâvÈ`VÀó*÷†U=s­¤?Ï3<ã.&ü°ûÂôwð„‡©0|ÍND$tkŠÄIEND®B`‚transmission-2.92/qt/icons/Faenza/status/16/PaxHeaders.4960/network-error.png0000644000000000000000000000013212505250245023720 xustar0030 mtime=1427460261.394260504 30 atime=1427460261.394260504 30 ctime=1457295917.264761392 transmission-2.92/qt/icons/Faenza/status/16/network-error.png0000644000175000017500000000101212505250245025337 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<‡IDAT8•’MK[Q†Ÿ9$ñ†,n®-!~¬Uh„š•YÁµË"þñø/EHW]Ô©^7Y”¦~T½ˆ1 åVÇ…'r )Mf†yÞ9gÎUePfÌ€ ‘!`˜þ÷ ó€)ÿPÕ³ÿ X8¤£uUýý]a®ŽZ?Ï=j—ƒW‘ü ¨uéçEÄ9;°¦ª/=lãg@£H£ÃÛnmîÐ6]pø|ò¶æT+åÂz"^­VÊ©VÊÀy?ˆtਫj°é¦v313ýóOLŒÄÜ‹ðÅ_ î£Kì†;¬ìlod3^3ç%Ýœ—t³¯¹²³½ÆN—à PhìïÝ™x̤S Ò©&3ý½;±þ À¿ov‰“[3ÙÝYwt:á$›Oí‡ñ“àÑ_>ýµ0,ñöL¢ªt¹ÖK­Rñ ôkk¡_[k•Šaý°¤ªŽX_ÿý)Æ€à«Í;ñõ+yÉ•Ú^ºÕüIEND®B`‚transmission-2.92/qt/icons/Faenza/status/16/PaxHeaders.4960/network-transmit.png0000644000000000000000000000013212505250245024430 xustar0030 mtime=1427460261.393260486 30 atime=1427460261.393260486 30 ctime=1457295917.264761392 transmission-2.92/qt/icons/Faenza/status/16/network-transmit.png0000644000175000017500000000074312505250245026061 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<`IDAT8’ÁJQ†¿;Þ™1pQ# "í*C© |…V®|ƒÀUmz„Ö­“z_À7‚Û„Z&TAÚ¤0ÂiãÀdƒ¢Îæ?÷û¹ç¿W‰ó–RJ›Æ‚pH#=h ØR@WDf(¥bÀ.°’»"Ò˜j0†÷€•°À0;ƒÜ$ç_À¨ˆœît:Žã\0 cxU,ïú¾ño°Ùl674MÛÞzY*•nú¾_í°ã8ç•R;ÀS`{.ß÷/‹ˆ&"¬‰KâT4½1›ÍâÀ$\‘Û@ r hë€J§Ó=à àÎU(z€7¿|´ÙjµÒJ©J©û»»»,Ë: &˜X–uX«ÕÞŸÃã,vn·Ûç4MkûÀ¾aσÁUÛ¶7K¥Òæt:½¼Ê‚ {°®ëú=Ïó’À4ÈEc±ØÐuÝGÀ ª …Ϟ羆rn2™o€Çøµð@ÇãH`Ød®l6{Ðív_ü¶ó‘Ð5N¦R©ëür€\.÷©^¯¿Çã àûÒ¼åºn¶í×Õju‰D¦y|[H$nËåò–ïû—DD_åw’Éd*•JåÚÿÀ"ÂOM9 öëÉš–IEND®B`‚transmission-2.92/qt/icons/PaxHeaders.4960/ratio.png0000644000000000000000000000013212444412037017242 xustar0030 mtime=1418859551.382065253 30 atime=1418239366.438282682 30 ctime=1457295917.247761103 transmission-2.92/qt/icons/ratio.png0000644000175000017500000000142212444412037020666 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿaÙIDATxÚeKOSAÅÏLï£-…"¡ÁøVA#²S úDM`#ntA‚+£‰ŸãÆÀNwº"D#"Š‚nBÀ ¶ m•Ò×½sïÜ[gnAOò›G2çÌùSü£ÑñÑs>½Ÿ‹¿ÿ8Â$Þybô騨›öBä"µµUÒ‚Uú [Õ‘º¢ª„ ]תÁv˜»ººÌ8w^óìK*ŒÐ´ Eñ“ÉÊŠÐí¦Æ#~Ód$ñ#ŽïKK˜›ÅÔôWøµ½t±#P[[Û£êd€Ï  ùÕEÚÔÔi H$â`ƒ¦kPT¦iŠ)0ÆÐ|úœ?­ou‰Õ/ ̭Ü»wc±ƒÚÌ·i1JœsX–Ã0<“mÛÈf³p]…RÍÍgpÉ‚e¢eÎjh ­¯'Éd¤Aþè™K¥’Ä»ûun¹ì…Û"¼¹¥¥²lòû”3~½*\MÖÖVåC‰4ýljS'eâÂ`%ÔÕE©hy“b¦ªH§Ó;¿îîÅbÁ@íí—Q_ƒ#ÇO×t¦¥¢NyÛ´¯vSS#ºº»Ðy£ à8¶€ ‰f1Ê]'ùªj»æXC W¯ X„Íím8¸D„JËm‰»›¢fÉ|•N§Ê55Õ»õ[[σK“mI¤QÞåîµP|*VWV\ÆŒaÊŒÂãÅÅ…|$¢(ÞÜUáÊm£-ù{cHQJ119™+äÌ'”s%nìy2™´Ž?ŸÏ‡d2%kïëN(‚ÁFGÞ– …ü3âsT,ØØH>ÜØˆOårYëèÑc˜Ÿ÷~Ù‘ õë¯úðÐ177;ós=õHÒÝÝmi•‘àqIO},¦GcQÒváÂÕaäry¬,¯8_&>3^æ/¢÷ðæ!½½½Ø«ÍÍÍ3ªNû|T¹fY,Jª¨)çµkYƒ–°GRÿóaFÊáúIEND®B`‚transmission-2.92/qt/PaxHeaders.4960/TrackerModelFilter.h0000644000000000000000000000013212537301461020177 xustar0030 mtime=1434288945.173419268 30 atime=1434288945.173419268 30 ctime=1457295917.241761001 transmission-2.92/qt/TrackerModelFilter.h0000644000175000017500000000142312537301461021624 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: TrackerModelFilter.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_TRACKER_MODEL_FILTER_H #define QTR_TRACKER_MODEL_FILTER_H #include class TrackerModelFilter: public QSortFilterProxyModel { Q_OBJECT public: TrackerModelFilter (QObject * parent = nullptr); void setShowBackupTrackers (bool); bool showBackupTrackers () const { return myShowBackups; } protected: // QSortFilterProxyModel virtual bool filterAcceptsRow (int sourceRow, const QModelIndex& sourceParent) const; private: bool myShowBackups; }; #endif // QTR_TRACKER_MODEL_FILTER_H transmission-2.92/qt/PaxHeaders.4960/Utils.cc0000644000000000000000000000013212602050147015706 xustar0030 mtime=1443385447.729670561 30 atime=1443385447.729670561 30 ctime=1457295917.241761001 transmission-2.92/qt/Utils.cc0000644000175000017500000001624612602050147017344 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: Utils.cc 14564 2015-09-27 20:23:03Z mikedld $ */ #ifdef _WIN32 #include #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) #include #include #endif #include #include // tr_formatter #include "Utils.h" /*** **** ***/ #if defined(_WIN32) && QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) // Should be in QtWinExtras soon, but for now let's import it manually extern QPixmap qt_pixmapFromWinHICON(HICON icon); #endif #ifdef _WIN32 namespace { void addAssociatedFileIcon (const QFileInfo& fileInfo, UINT iconSize, QIcon& icon) { QString const pixmapCacheKey = QLatin1String ("tr_file_ext_") + QString::number (iconSize) + QLatin1Char ('_') + fileInfo.suffix (); QPixmap pixmap; if (!QPixmapCache::find (pixmapCacheKey, &pixmap)) { const QString filename = fileInfo.fileName (); SHFILEINFO shellFileInfo; if (::SHGetFileInfoW (reinterpret_cast (filename.utf16 ()), FILE_ATTRIBUTE_NORMAL, &shellFileInfo, sizeof(shellFileInfo), SHGFI_ICON | iconSize | SHGFI_USEFILEATTRIBUTES) != 0) { if (shellFileInfo.hIcon != NULL) { #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) pixmap = qt_pixmapFromWinHICON (shellFileInfo.hIcon); #else pixmap = QPixmap::fromWinHICON (shellFileInfo.hIcon); #endif ::DestroyIcon (shellFileInfo.hIcon); } } QPixmapCache::insert (pixmapCacheKey, pixmap); } if (!pixmap.isNull ()) icon.addPixmap (pixmap); } } // namespace #endif QIcon Utils::guessMimeIcon (const QString& filename) { static const QIcon fallback = qApp->style ()->standardIcon (QStyle::SP_FileIcon); #ifdef _WIN32 QIcon icon; if (!filename.isEmpty ()) { const QFileInfo fileInfo (filename); addAssociatedFileIcon (fileInfo, SHGFI_SMALLICON, icon); addAssociatedFileIcon (fileInfo, 0, icon); addAssociatedFileIcon (fileInfo, SHGFI_LARGEICON, icon); } if (!icon.isNull ()) return icon; #elif QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) QMimeDatabase mimeDb; QMimeType mimeType = mimeDb.mimeTypeForFile (filename, QMimeDatabase::MatchExtension); if (mimeType.isValid ()) return QIcon::fromTheme (mimeType.iconName (), QIcon::fromTheme (mimeType.genericIconName (), fallback)); #else enum { DISK, DOCUMENT, PICTURE, VIDEO, ARCHIVE, AUDIO, APP, TYPE_COUNT }; static QIcon fileIcons[TYPE_COUNT]; static QSet suffixes[TYPE_COUNT]; if (fileIcons[0].isNull ()) { suffixes[DISK] << QString::fromLatin1("iso"); fileIcons[DISK]= QIcon::fromTheme (QString::fromLatin1("media-optical"), fallback); const char * doc_types[] = { "abw", "csv", "doc", "dvi", "htm", "html", "ini", "log", "odp", "ods", "odt", "pdf", "ppt", "ps", "rtf", "tex", "txt", "xml" }; for (const char * t: doc_types) suffixes[DOCUMENT] << QString::fromLatin1(t); fileIcons[DOCUMENT] = QIcon::fromTheme (QString::fromLatin1("text-x-generic"), fallback); const char * pic_types[] = { "bmp", "gif", "jpg", "jpeg", "pcx", "png", "psd", "ras", "tga", "tiff" }; for (const char * t: pic_types) suffixes[PICTURE] << QString::fromLatin1(t); fileIcons[PICTURE] = QIcon::fromTheme (QString::fromLatin1("image-x-generic"), fallback); const char * vid_types[] = { "3gp", "asf", "avi", "mkv", "mov", "mpeg", "mpg", "mp4", "ogm", "ogv", "qt", "rm", "wmv" }; for (const char * t: vid_types) suffixes[VIDEO] << QString::fromLatin1(t); fileIcons[VIDEO] = QIcon::fromTheme (QString::fromLatin1("video-x-generic"), fallback); const char * arc_types[] = { "7z", "ace", "bz2", "cbz", "gz", "gzip", "lzma", "rar", "sft", "tar", "zip" }; for (const char * t: arc_types) suffixes[ARCHIVE] << QString::fromLatin1(t); fileIcons[ARCHIVE] = QIcon::fromTheme (QString::fromLatin1("package-x-generic"), fallback); const char * aud_types[] = { "aac", "ac3", "aiff", "ape", "au", "flac", "m3u", "m4a", "mid", "midi", "mp2", "mp3", "mpc", "nsf", "oga", "ogg", "ra", "ram", "shn", "voc", "wav", "wma" }; for (const char * t: aud_types) suffixes[AUDIO] << QString::fromLatin1(t); fileIcons[AUDIO] = QIcon::fromTheme (QString::fromLatin1("audio-x-generic"), fallback); const char * exe_types[] = { "bat", "cmd", "com", "exe" }; for (const char * t: exe_types) suffixes[APP] << QString::fromLatin1(t); fileIcons[APP] = QIcon::fromTheme (QString::fromLatin1("application-x-executable"), fallback); } QString suffix (QFileInfo (filename).suffix ().toLower ()); for (int i=0; ifont (); return view->style ()->sizeFromContents (QStyle::CT_ItemViewItem, &option, QSize (QWIDGETSIZE_MAX, QWIDGETSIZE_MAX), view).width (); } int Utils::measureHeaderItem (QHeaderView * view, const QString& text) { QStyleOptionHeader option; option.initFrom (view); option.text = text; option.sortIndicator = view->isSortIndicatorShown () ? QStyleOptionHeader::SortDown : QStyleOptionHeader::None; return view->style ()->sizeFromContents (QStyle::CT_HeaderSection, &option, QSize (), view).width (); } QColor Utils::getFadedColor (const QColor& color) { QColor fadedColor (color); fadedColor.setAlpha (128); return fadedColor; } transmission-2.92/qt/PaxHeaders.4960/MakeDialog.h0000644000000000000000000000013212571431256016456 xustar0030 mtime=1441149614.414176973 30 atime=1441149614.414176973 30 ctime=1457295917.240760984 transmission-2.92/qt/MakeDialog.h0000644000175000017500000000175012571431256020106 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: MakeDialog.h 14561 2015-09-01 20:19:26Z mikedld $ */ #ifndef QTR_MAKE_DIALOG_H #define QTR_MAKE_DIALOG_H #include #include "BaseDialog.h" #include "ui_MakeDialog.h" class QAbstractButton; class Session; extern "C" { struct tr_metainfo_builder; } class MakeDialog: public BaseDialog { Q_OBJECT public: MakeDialog (Session&, QWidget * parent = nullptr); virtual ~MakeDialog (); protected: // QWidget virtual void dragEnterEvent (QDragEnterEvent *); virtual void dropEvent (QDropEvent *); private: QString getSource () const; private slots: void onSourceChanged (); void makeTorrent (); private: Session& mySession; Ui::MakeDialog ui; std::unique_ptr myBuilder; }; #endif // QTR_MAKE_DIALOG_H transmission-2.92/qt/PaxHeaders.4960/transmission-qt.10000644000000000000000000000013212442116607017542 xustar0030 mtime=1418239367.914307977 30 atime=1418239367.914307977 30 ctime=1457295917.269761477 transmission-2.92/qt/transmission-qt.10000644000175000017500000000377012442116607021176 0ustar00mikedldmikedld00000000000000.Dd June 26, 2010 .Dt TRANSMISSION-QT 1 .Sh NAME .Nm transmission-qt .Nd a bittorrent client .Sh SYNOPSIS .Nm transmission-qt .Fl h .Nm .Op Nm options .Op Ar torrent-file ... .Sh DESCRIPTION .Nm is a fast and easy BitTorrent client. .Pp BitTorrent is a peer-to-peer file transfer protocol which uses a metainfo file (usually with the .torrent file extension) and a central tracker to distribute file data amongst a group of peers. For more information on the BitTorrent protocol see http://www.bittorrent.org/ .Sh OPTIONS .Bl -tag -width Ds .It Fl h Fl -help Show help options .It Fl g, Fl -config-dir Ar directory Where to look for configuration files. This can be used to swap between using the cli, daemon, gtk, and qt clients. See http://trac.transmissionbt.com/wiki/ConfigFiles for more information. .It Fl m Fl -minimized Start minimized in notification area .It Fl p, Fl -port Ar port Port to use when connecting to an existing session .It Fl r, Fl -remote Ar host Connect to an existing session at the specified hostname .It Fl u, Fl -username Ar username Username to use when connecting to an existing session .It Fl v, Fl -version Show version number and exit .It Fl w, Fl -password Ar password Password to use when connecting to an existing session .El .Pp Multiple .torrent files may be added at startup by appending them on the command line. If .Nm is already running, the torrents will be added to the running instance. .Sh ENVIRONMENT .Bl -tag -width Fl .It Ev TRANSMISSION_HOME Sets the default config-dir. .El .Sh FILES .Bl -tag -width Ds -compact .It ~/.config/transmission The config-dir used when neither .Op Ev TRANSMISSION_HOME nor .Op Fl g is specified. .El .Sh AUTHORS .An -nosplit .Nm was written by .An Jordan Lee , .An Josh Elsasser , .An Eric Petit , and .An Mitchell Livingston . .Sh SEE ALSO .Xr transmission-create 1 , .Xr transmission-daemon 1 , .Xr transmission-edit 1 , .Xr transmission-gtk 1 , .Xr transmission-qt 1 , .Xr transmission-remote 1 , .Xr transmission-show 1 .Pp http://www.transmissionbt.com/ transmission-2.92/qt/PaxHeaders.4960/Utils.h0000644000000000000000000000013212557166437015573 xustar0030 mtime=1438444831.672384565 30 atime=1438444831.672384565 30 ctime=1457295917.240760984 transmission-2.92/qt/Utils.h0000644000175000017500000000427412557166437017227 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: Utils.h 14554 2015-07-30 06:55:28Z mikedld $ */ #ifndef QTR_UTILS_H #define QTR_UTILS_H #include // isxdigit() #include #include #include class QAbstractItemView; class QColor; class QHeaderView; class QIcon; class Utils { public: static QIcon guessMimeIcon (const QString& filename); // Test if string is UTF-8 or not static bool isValidUtf8 (const char * s); static QString removeTrailingDirSeparator (const QString& path); static void narrowRect (QRect& rect, int dx1, int dx2, Qt::LayoutDirection direction) { if (direction == Qt::RightToLeft) qSwap (dx1, dx2); rect.adjust (dx1, 0, -dx2, 0); } static int measureViewItem (QAbstractItemView * view, const QString& text); static int measureHeaderItem (QHeaderView * view, const QString& text); static QColor getFadedColor (const QColor& color); template static void openDialog (QPointer& dialog, ArgsT&&... args) { if (dialog.isNull ()) { dialog = new DialogT (std::forward (args)...); dialog->setAttribute (Qt::WA_DeleteOnClose); dialog->show (); } else { dialog->raise (); dialog->activateWindow (); } } /// /// URLs /// static bool isMagnetLink (const QString& s) { return s.startsWith (QString::fromUtf8 ("magnet:?")); } static bool isHexHashcode (const QString& s) { if (s.length() != 40) return false; for (const QChar ch: s) if (!isxdigit (ch.unicode())) return false; return true; } static bool isUriWithSupportedScheme (const QString& s) { static const QString ftp = QString::fromUtf8 ("ftp://"); static const QString http = QString::fromUtf8 ("http://"); static const QString https = QString::fromUtf8 ("https://"); return s.startsWith(http) || s.startsWith(https) || s.startsWith(ftp); } }; #endif // QTR_UTILS_H transmission-2.92/qt/PaxHeaders.4960/Prefs.h0000644000000000000000000000013212537301461015534 xustar0030 mtime=1434288945.133418567 30 atime=1434288945.133418567 30 ctime=1457295917.244761052 transmission-2.92/qt/Prefs.h0000644000175000017500000001040712537301461017163 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: Prefs.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_PREFS_H #define QTR_PREFS_H #include #include #include #include #include #include "Filters.h" class QDateTime; extern "C" { struct tr_variant; } class Prefs: public QObject { Q_OBJECT public: enum { /* client prefs */ OPTIONS_PROMPT, OPEN_DIALOG_FOLDER, INHIBIT_HIBERNATION, DIR_WATCH, DIR_WATCH_ENABLED, SHOW_TRAY_ICON, START_MINIMIZED, SHOW_NOTIFICATION_ON_ADD, SHOW_NOTIFICATION_ON_COMPLETE, ASKQUIT, SORT_MODE, SORT_REVERSED, COMPACT_VIEW, FILTERBAR, STATUSBAR, STATUSBAR_STATS, SHOW_TRACKER_SCRAPES, SHOW_BACKUP_TRACKERS, TOOLBAR, BLOCKLIST_DATE, BLOCKLIST_UPDATES_ENABLED, MAIN_WINDOW_LAYOUT_ORDER, MAIN_WINDOW_HEIGHT, MAIN_WINDOW_WIDTH, MAIN_WINDOW_X, MAIN_WINDOW_Y, FILTER_MODE, FILTER_TRACKERS, FILTER_TEXT, SESSION_IS_REMOTE, SESSION_REMOTE_HOST, SESSION_REMOTE_PORT, SESSION_REMOTE_AUTH, SESSION_REMOTE_USERNAME, SESSION_REMOTE_PASSWORD, COMPLETE_SOUND_COMMAND, COMPLETE_SOUND_ENABLED, USER_HAS_GIVEN_INFORMED_CONSENT, /* core prefs */ FIRST_CORE_PREF, ALT_SPEED_LIMIT_UP = FIRST_CORE_PREF, ALT_SPEED_LIMIT_DOWN, ALT_SPEED_LIMIT_ENABLED, ALT_SPEED_LIMIT_TIME_BEGIN, ALT_SPEED_LIMIT_TIME_END, ALT_SPEED_LIMIT_TIME_ENABLED, ALT_SPEED_LIMIT_TIME_DAY, BLOCKLIST_ENABLED, BLOCKLIST_URL, DSPEED, DSPEED_ENABLED, DOWNLOAD_DIR, DOWNLOAD_QUEUE_ENABLED, DOWNLOAD_QUEUE_SIZE, ENCRYPTION, IDLE_LIMIT, IDLE_LIMIT_ENABLED, INCOMPLETE_DIR, INCOMPLETE_DIR_ENABLED, MSGLEVEL, PEER_LIMIT_GLOBAL, PEER_LIMIT_TORRENT, PEER_PORT, PEER_PORT_RANDOM_ON_START, PEER_PORT_RANDOM_LOW, PEER_PORT_RANDOM_HIGH, QUEUE_STALLED_MINUTES, SCRIPT_TORRENT_DONE_ENABLED, SCRIPT_TORRENT_DONE_FILENAME, SOCKET_TOS, START, TRASH_ORIGINAL, PEX_ENABLED, DHT_ENABLED, UTP_ENABLED, LPD_ENABLED, PORT_FORWARDING, PREALLOCATION, RATIO, RATIO_ENABLED, RENAME_PARTIAL_FILES, RPC_AUTH_REQUIRED, RPC_ENABLED, RPC_PASSWORD, RPC_PORT, RPC_USERNAME, RPC_WHITELIST_ENABLED, RPC_WHITELIST, USPEED_ENABLED, USPEED, UPLOAD_SLOTS_PER_TORRENT, LAST_CORE_PREF = UPLOAD_SLOTS_PER_TORRENT, PREFS_COUNT }; public: Prefs (const QString& configDir); virtual ~Prefs (); bool isCore (int key) const { return FIRST_CORE_PREF <= key && key <= LAST_CORE_PREF; } bool isClient (int key) const { return !isCore (key); } const char * keyStr (int i) const { return tr_quark_get_string (myItems[i].key,NULL); } tr_quark getKey (int i) const { return myItems[i].key; } int type (int i) const { return myItems[i].type; } const QVariant& variant (int i) const { return myValues[i]; } int getInt (int key) const; bool getBool (int key) const; QString getString (int key) const; double getDouble (int key) const; QDateTime getDateTime (int key) const; template T get (int key) const { return myValues[key].value(); } template void set (int key, const T& value) { QVariant& v (myValues[key]); const QVariant tmp = QVariant::fromValue (value); if (v.isNull() || v != tmp) { v = tmp; emit changed (key); } } void toggleBool (int key); signals: void changed (int key); private: struct PrefItem { int id; tr_quark key; int type; }; private: void initDefaults (tr_variant *); // Intentionally not implemented void set (int key, const char * value); private: const QString myConfigDir; QSet myTemporaryPrefs; mutable QVariant myValues[PREFS_COUNT]; static PrefItem myItems[]; }; #endif // QTR_PREFS_H transmission-2.92/qt/PaxHeaders.4960/Session.h0000644000000000000000000000013212544044705016103 xustar0030 mtime=1435519429.495525982 30 atime=1435519429.494525964 30 ctime=1457295917.237760933 transmission-2.92/qt/Session.h0000644000175000017500000001252212544044705017532 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: Session.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_SESSION_H #define QTR_SESSION_H #include #include #include #include #include #include #include "RpcClient.h" class AddData; class Prefs; extern "C" { struct tr_variant; } class FileAdded: public QObject { Q_OBJECT public: FileAdded (int64_t tag, const QString& name): myTag (tag), myName (name) {} virtual ~FileAdded () {} void setFileToDelete (const QString& file) { myDelFile = file; } public slots: void executed (int64_t tag, const QString& result, tr_variant * arguments); private: const int64_t myTag; const QString myName; QString myDelFile; }; class Session: public QObject { Q_OBJECT public: Session (const QString& configDir, Prefs& prefs); virtual ~Session (); void stop (); void restart (); const QUrl& getRemoteUrl () const { return myRpc.url (); } const tr_session_stats& getStats () const { return myStats; } const tr_session_stats& getCumulativeStats () const { return myCumulativeStats; } const QString& sessionVersion () const { return mySessionVersion; } int64_t blocklistSize () const { return myBlocklistSize; } void setBlocklistSize (int64_t i); void updateBlocklist (); void portTest (); void copyMagnetLinkToClipboard (int torrentId); /** returns true if the transmission session is being run inside this client */ bool isServer () const; /** returns true if isServer () is true or if the remote address is the localhost */ bool isLocal () const; void exec (tr_quark method, tr_variant * args, int64_t tag = -1); void exec (const char * method, tr_variant * args, int64_t tag = -1); int64_t getUniqueTag () { return nextUniqueTag++; } void torrentSet (const QSet& ids, const tr_quark key, bool val); void torrentSet (const QSet& ids, const tr_quark key, int val); void torrentSet (const QSet& ids, const tr_quark key, double val); void torrentSet (const QSet& ids, const tr_quark key, const QList& val); void torrentSet (const QSet& ids, const tr_quark key, const QStringList& val); void torrentSet (const QSet& ids, const tr_quark key, const QPair& val); void torrentSetLocation (const QSet& ids, const QString& path, bool doMove); void torrentRenamePath (const QSet& ids, const QString& oldpath, const QString& newname); void addTorrent (const AddData& addme, tr_variant * top, bool trashOriginal); public slots: void pauseTorrents (const QSet& torrentIds = QSet ()); void startTorrents (const QSet& torrentIds = QSet ()); void startTorrentsNow (const QSet& torrentIds = QSet ()); void queueMoveTop (const QSet& torrentIds = QSet ()); void queueMoveUp (const QSet& torrentIds = QSet ()); void queueMoveDown (const QSet& torrentIds = QSet ()); void queueMoveBottom (const QSet& torrentIds = QSet ()); void refreshSessionInfo (); void refreshSessionStats (); void refreshActiveTorrents (); void refreshAllTorrents (); void initTorrents (const QSet& ids = QSet ()); void addNewlyCreatedTorrent (const QString& filename, const QString& localPath); void addTorrent (const AddData& addme); void removeTorrents (const QSet& torrentIds, bool deleteFiles = false); void verifyTorrents (const QSet& torrentIds); void reannounceTorrents (const QSet& torrentIds); void launchWebInterface (); void updatePref (int key); /** request a refresh for statistics, including the ones only used by the properties dialog, for a specific torrent */ void refreshExtraStats (const QSet& ids); signals: void executed (int64_t tag, const QString& result, tr_variant * arguments); void sourceChanged (); void portTested (bool isOpen); void statsUpdated (); void sessionUpdated (); void blocklistUpdated (int); void torrentsUpdated (tr_variant * torrentList, bool completeList); void torrentsRemoved (tr_variant * torrentList); void dataReadProgress (); void dataSendProgress (); void error (QNetworkReply::NetworkError); void errorMessage (const QString&); void httpAuthenticationRequired (); private: void start (); void updateStats (tr_variant * args); void updateInfo (tr_variant * args); void sessionSet (const tr_quark key, const QVariant& variant); void pumpRequests (); void sendTorrentRequest (const char * request, const QSet& torrentIds); void refreshTorrents (const QSet& torrentIds); static void updateStats (tr_variant * d, tr_session_stats * stats); private slots: void responseReceived (int64_t tag, const QString& result, tr_variant * args); private: QString const myConfigDir; Prefs& myPrefs; int64_t nextUniqueTag; int64_t myBlocklistSize; tr_session * mySession; QStringList myIdleJSON; tr_session_stats myStats; tr_session_stats myCumulativeStats; QString mySessionVersion; RpcClient myRpc; }; #endif // QTR_SESSION_H transmission-2.92/qt/PaxHeaders.4960/DBusInteropHelper.cc0000644000000000000000000000013112665051427020156 xustar0029 mtime=1456755479.35379786 30 atime=1456755479.352797843 30 ctime=1457295917.246761086 transmission-2.92/qt/DBusInteropHelper.cc0000644000175000017500000000326712665051427021614 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: DBusInteropHelper.cc 14698 2016-02-29 14:16:55Z mikedld $ */ #include #include #include #include #include #include #include "DBusInteropHelper.h" #include "InteropObject.h" namespace { const QLatin1String DBUS_SERVICE ("com.transmissionbt.Transmission"); const QLatin1String DBUS_OBJECT_PATH ("/com/transmissionbt/Transmission"); const QLatin1String DBUS_INTERFACE ("com.transmissionbt.Transmission"); } bool DBusInteropHelper::isConnected () const { return QDBusConnection::sessionBus ().isConnected (); } QVariant DBusInteropHelper::addMetainfo (const QString& metainfo) { QDBusMessage request = QDBusMessage::createMethodCall (DBUS_SERVICE, DBUS_OBJECT_PATH, DBUS_INTERFACE, QLatin1String ("AddMetainfo")); request.setArguments (QVariantList () << metainfo); const QDBusReply response = QDBusConnection::sessionBus ().call (request); return response.isValid () ? QVariant (response.value ()) : QVariant (); } void DBusInteropHelper::registerObject (QObject * parent) { QDBusConnection bus = QDBusConnection::sessionBus (); if (!bus.isConnected ()) return; if (!bus.registerService (DBUS_SERVICE)) std::cerr << "couldn't register " << qPrintable (DBUS_SERVICE) << std::endl; if (!bus.registerObject (DBUS_OBJECT_PATH, new InteropObject (parent), QDBusConnection::ExportAllSlots)) std::cerr << "couldn't register " << qPrintable (DBUS_OBJECT_PATH) << std::endl; } transmission-2.92/qt/PaxHeaders.4960/OptionsDialog.ui0000644000000000000000000000013212536126416017422 xustar0030 mtime=1433971982.557590313 30 atime=1433971982.557590313 30 ctime=1457295917.244761052 transmission-2.92/qt/OptionsDialog.ui0000644000175000017500000000724312536126416021055 0ustar00mikedldmikedld00000000000000 OptionsDialog 0 0 418 379 &Source: sourceButton 0 0 &Destination folder: destinationButton 0 0 ... Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter &Priority: priorityCombo S&tart when added Mo&ve .torrent file to the trash Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Open FileTreeView QTreeView

FileTreeView.h
FreeSpaceLabel QLabel
FreeSpaceLabel.h
PathButton QToolButton
PathButton.h
transmission-2.92/qt/PaxHeaders.4960/transmission-qt.tlb.rc0000644000000000000000000000013212634376710020574 xustar0030 mtime=1450311112.716085615 30 atime=1450311112.716085615 30 ctime=1457295917.246761086 transmission-2.92/qt/transmission-qt.tlb.rc0000644000175000017500000000013612634376710022221 0ustar00mikedldmikedld00000000000000#include "winresrc.h" #pragma code_page(1252) LANGUAGE 0, 0 1 TYPELIB "transmission-qt.tlb" transmission-2.92/qt/PaxHeaders.4960/RelocateDialog.h0000644000000000000000000000013212571431256017337 xustar0030 mtime=1441149614.417177027 30 atime=1441149614.417177027 30 ctime=1457295917.240760984 transmission-2.92/qt/RelocateDialog.h0000644000175000017500000000156212571431256020770 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: RelocateDialog.h 14561 2015-09-01 20:19:26Z mikedld $ */ #ifndef QTR_RELOCATE_DIALOG_H #define QTR_RELOCATE_DIALOG_H #include #include "BaseDialog.h" #include "ui_RelocateDialog.h" class Session; class TorrentModel; class RelocateDialog: public BaseDialog { Q_OBJECT public: RelocateDialog (Session&, const TorrentModel&, const QSet& ids, QWidget * parent = nullptr); virtual ~RelocateDialog () {} private: QString newLocation () const; private slots: void onSetLocation (); void onMoveToggled (bool); private: Session& mySession; const QSet myIds; Ui::RelocateDialog ui; static bool myMoveFlag; }; #endif // QTR_RELOCATE_DIALOG_H transmission-2.92/qt/PaxHeaders.4960/TrackerDelegate.cc0000644000000000000000000000013212640354044017641 xustar0030 mtime=1451350052.463150614 30 atime=1451350052.463150614 30 ctime=1457295917.237760933 transmission-2.92/qt/TrackerDelegate.cc0000644000175000017500000002710012640354044021266 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: TrackerDelegate.cc 14633 2015-12-25 10:19:50Z mikedld $ */ #include #include #include #include #include #include #include #include "FaviconCache.h" #include "Formatter.h" #include "Torrent.h" #include "TrackerDelegate.h" #include "TrackerModel.h" #include "Utils.h" /*** **** ***/ namespace { const int mySpacing = 6; const QSize myMargin (10, 10); class ItemLayout { private: QTextDocument myTextDocument; public: QRect iconRect; QRect textRect; public: ItemLayout(const QString& text, bool suppressColors, Qt::LayoutDirection direction, const QPoint& topLeft, int width); QSize size () const { return (iconRect | textRect).size (); } QAbstractTextDocumentLayout * textLayout () const { return myTextDocument.documentLayout (); } }; ItemLayout::ItemLayout(const QString& text, bool suppressColors, Qt::LayoutDirection direction, const QPoint& topLeft, int width) { const QStyle * style (qApp->style ()); const QSize iconSize = FaviconCache::getIconSize (); QRect baseRect (topLeft, QSize (width, 0)); iconRect = style->alignedRect (direction, Qt::AlignLeft | Qt::AlignTop, iconSize, baseRect); Utils::narrowRect (baseRect, iconSize.width () + mySpacing, 0, direction); myTextDocument.setDocumentMargin (0); myTextDocument.setTextWidth (baseRect.width ()); QTextOption textOption; textOption.setTextDirection (direction); if (suppressColors) textOption.setFlags (QTextOption::SuppressColors); myTextDocument.setDefaultTextOption (textOption); myTextDocument.setHtml (text); textRect = baseRect; textRect.setSize (myTextDocument.size ().toSize ()); } } QSize TrackerDelegate::margin (const QStyle& style) const { Q_UNUSED (style); return myMargin; } /*** **** ***/ QSize TrackerDelegate::sizeHint (const QStyleOptionViewItem & option, const TrackerInfo & info) const { const ItemLayout layout (getText (info), true, option.direction, QPoint (0, 0), option.rect.width () - myMargin.width () * 2); return layout.size () + myMargin * 2; } QSize TrackerDelegate::sizeHint (const QStyleOptionViewItem & option, const QModelIndex & index) const { const TrackerInfo trackerInfo = index.data (TrackerModel::TrackerRole).value(); return sizeHint (option, trackerInfo); } void TrackerDelegate::paint (QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const { const TrackerInfo trackerInfo = index.data (TrackerModel::TrackerRole).value(); painter->save(); painter->setClipRect (option.rect); drawBackground (painter, option, index); drawTracker (painter, option, trackerInfo); drawFocus(painter, option, option.rect); painter->restore(); } void TrackerDelegate::drawTracker (QPainter * painter, const QStyleOptionViewItem & option, const TrackerInfo & inf) const { const bool isItemSelected ((option.state & QStyle::State_Selected) != 0); const bool isItemEnabled ((option.state & QStyle::State_Enabled) != 0); const bool isItemActive ((option.state & QStyle::State_Active) != 0); QIcon trackerIcon (inf.st.getFavicon()); const QRect contentRect (option.rect.adjusted (myMargin.width (), myMargin.height (), -myMargin.width (), -myMargin.height ())); const ItemLayout layout (getText (inf), isItemSelected, option.direction, contentRect.topLeft (), contentRect.width ()); painter->save(); if (isItemSelected) { QPalette::ColorGroup cg = isItemEnabled ? QPalette::Normal : QPalette::Disabled; if (cg == QPalette::Normal && !isItemActive) cg = QPalette::Inactive; painter->fillRect (option.rect, option.palette.brush (cg, QPalette::Highlight)); } trackerIcon.paint (painter, layout.iconRect, Qt::AlignCenter, isItemSelected ? QIcon::Selected : QIcon::Normal, QIcon::On); QAbstractTextDocumentLayout::PaintContext paintContext; paintContext.clip = layout.textRect.translated (-layout.textRect.topLeft ()); paintContext.palette.setColor (QPalette::Text, option.palette.color (isItemSelected ? QPalette::HighlightedText : QPalette::Text)); painter->translate (layout.textRect.topLeft()); layout.textLayout ()->draw (painter, paintContext); painter->restore(); } void TrackerDelegate::setShowMore (bool b) { myShowMore = b; } namespace { QString timeToStringRounded (int seconds) { if (seconds > 60) seconds -= (seconds % 60); return Formatter::timeToString (seconds); } } QString TrackerDelegate::getText (const TrackerInfo& inf) const { QString key; QString str; const time_t now (time (0)); const QString err_markup_begin = QLatin1String (""); const QString err_markup_end = QLatin1String (""); const QString timeout_markup_begin = QLatin1String (""); const QString timeout_markup_end = QLatin1String (""); const QString success_markup_begin = QLatin1String (""); const QString success_markup_end = QLatin1String (""); // hostname str += inf.st.isBackup ? QLatin1String ("") : QLatin1String (""); char * host = NULL; int port = 0; tr_urlParse (inf.st.announce.toUtf8().constData(), TR_BAD_SIZE, NULL, &host, &port, NULL); str += QString::fromLatin1 ("%1:%2").arg (QString::fromUtf8 (host)).arg (port); tr_free (host); if (!key.isEmpty()) str += QLatin1String (" - ") + key; str += inf.st.isBackup ? QLatin1String ("") : QLatin1String (""); // announce & scrape info if (!inf.st.isBackup) { if (inf.st.hasAnnounced && inf.st.announceState != TR_TRACKER_INACTIVE) { const QString tstr (timeToStringRounded (now - inf.st.lastAnnounceTime)); str += QLatin1String ("
\n"); if (inf.st.lastAnnounceSucceeded) { //: %1 and %2 are replaced with HTML markup, %3 is duration str += tr ("Got a list of%1 %Ln peer(s)%2 %3 ago", 0, inf.st.lastAnnouncePeerCount) .arg (success_markup_begin) .arg (success_markup_end) .arg (tstr); } else if (inf.st.lastAnnounceTimedOut) { //: %1 and %2 are replaced with HTML markup, %3 is duration str += tr ("Peer list request %1timed out%2 %3 ago; will retry") .arg (timeout_markup_begin) .arg (timeout_markup_end) .arg (tstr); } else { //: %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration str += tr ("Got an error %1\"%2\"%3 %4 ago") .arg (err_markup_begin) .arg (inf.st.lastAnnounceResult) .arg (err_markup_end) .arg (tstr); } } switch (inf.st.announceState) { case TR_TRACKER_INACTIVE: str += QLatin1String ("
\n"); str += tr ("No updates scheduled"); break; case TR_TRACKER_WAITING: { const QString tstr (timeToStringRounded (inf.st.nextAnnounceTime - now)); str += QLatin1String ("
\n"); //: %1 is duration str += tr ("Asking for more peers in %1").arg (tstr); break; } case TR_TRACKER_QUEUED: str += QLatin1String ("
\n"); str += tr ("Queued to ask for more peers"); break; case TR_TRACKER_ACTIVE: { const QString tstr (timeToStringRounded (now - inf.st.lastAnnounceStartTime)); str += QLatin1String ("
\n"); //: %1 is duration str += tr ("Asking for more peers now... %1").arg (tstr); break; } } if (myShowMore) { if (inf.st.hasScraped) { str += QLatin1String ("
\n"); const QString tstr (timeToStringRounded (now - inf.st.lastScrapeTime)); if (inf.st.lastScrapeSucceeded) { if (inf.st.seederCount >= 0 && inf.st.leecherCount >= 0) { //: First part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; //: %1 and %2 are replaced with HTML markup str += tr ("Tracker had%1 %Ln seeder(s)%2", 0, inf.st.seederCount) .arg (success_markup_begin) .arg (success_markup_end); //: Second part of phrase "Tracker had ... seeder(s) and ... leecher(s) ... ago"; //: %1 and %2 are replaced with HTML markup, %3 is duration; //: notice that leading space (before "and") is included here str += tr (" and%1 %Ln leecher(s)%2 %3 ago", 0, inf.st.leecherCount) .arg (success_markup_begin) .arg (success_markup_end) .arg (tstr); } else { //: %1 and %2 are replaced with HTML markup, %3 is duration str += tr ("Tracker had %1no information%2 on peer counts %3 ago") .arg (success_markup_begin) .arg (success_markup_end) .arg (tstr); } } else { //: %1 and %3 are replaced with HTML markup, %2 is error message, %4 is duration str += tr ("Got a scrape error %1\"%2\"%3 %4 ago") .arg (err_markup_begin) .arg (inf.st.lastScrapeResult) .arg (err_markup_end) .arg (tstr); } } switch (inf.st.scrapeState) { case TR_TRACKER_INACTIVE: break; case TR_TRACKER_WAITING: { str += QLatin1String ("
\n"); const QString tstr (timeToStringRounded (inf.st.nextScrapeTime - now)); //: %1 is duration str += tr ("Asking for peer counts in %1").arg (tstr); break; } case TR_TRACKER_QUEUED: { str += QLatin1String ("
\n"); str += tr ("Queued to ask for peer counts"); break; } case TR_TRACKER_ACTIVE: { str += QLatin1String ("
\n"); const QString tstr (timeToStringRounded (now - inf.st.lastScrapeStartTime)); //: %1 is duration str += tr ("Asking for peer counts now... %1").arg (tstr); break; } } } } return str; } transmission-2.92/qt/PaxHeaders.4960/OptionsDialog.cc0000644000000000000000000000013212571431256017372 xustar0030 mtime=1441149614.416177009 30 atime=1441149614.416177009 30 ctime=1457295917.237760933 transmission-2.92/qt/OptionsDialog.cc0000644000175000017500000003115712571431256021026 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: OptionsDialog.cc 14561 2015-09-01 20:19:26Z mikedld $ */ #include #include #include #include /* mime64 */ #include #include "AddData.h" #include "FreeSpaceLabel.h" #include "OptionsDialog.h" #include "Prefs.h" #include "Session.h" #include "Torrent.h" #include "Utils.h" /*** **** ***/ OptionsDialog::OptionsDialog (Session& session, const Prefs& prefs, const AddData& addme, QWidget * parent): BaseDialog (parent), mySession (session), myAdd (addme), myHaveInfo (false), myVerifyButton (nullptr), myVerifyFile (nullptr), myVerifyHash (QCryptographicHash::Sha1), myEditTimer (this) { ui.setupUi (this); QString title; if (myAdd.type == AddData::FILENAME) title = tr ("Open Torrent from File"); else title = tr ("Open Torrent from URL or Magnet Link"); setWindowTitle (title); myEditTimer.setInterval (2000); myEditTimer.setSingleShot (true); connect (&myEditTimer, SIGNAL (timeout ()), this, SLOT (onDestinationChanged ())); if (myAdd.type == AddData::FILENAME) { ui.sourceStack->setCurrentWidget (ui.sourceButton); ui.sourceButton->setMode (PathButton::FileMode); ui.sourceButton->setTitle (tr ("Open Torrent")); ui.sourceButton->setNameFilter (tr ("Torrent Files (*.torrent);;All Files (*.*)")); ui.sourceButton->setPath (myAdd.filename); connect (ui.sourceButton, SIGNAL (pathChanged (QString)), this, SLOT (onSourceChanged ())); } else { ui.sourceStack->setCurrentWidget (ui.sourceEdit); ui.sourceEdit->setText (myAdd.readableName ()); ui.sourceEdit->selectAll (); connect (ui.sourceEdit, SIGNAL (editingFinished ()), this, SLOT (onSourceChanged ())); } ui.sourceStack->setFixedHeight (ui.sourceStack->currentWidget ()->sizeHint ().height ()); ui.sourceLabel->setBuddy (ui.sourceStack->currentWidget ()); const QFontMetrics fontMetrics (font ()); const int width = fontMetrics.size (0, QString::fromUtf8 ("This is a pretty long torrent filename indeed.torrent")).width (); ui.sourceStack->setMinimumWidth (width); const QString downloadDir (Utils::removeTrailingDirSeparator (prefs.getString (Prefs::DOWNLOAD_DIR))); ui.freeSpaceLabel->setSession (mySession); ui.freeSpaceLabel->setPath (downloadDir); if (session.isLocal ()) { ui.destinationStack->setCurrentWidget (ui.destinationButton); ui.destinationButton->setMode (PathButton::DirectoryMode); ui.destinationButton->setTitle (tr ("Select Destination")); ui.destinationButton->setPath (downloadDir); myLocalDestination = downloadDir; connect (ui.destinationButton, SIGNAL (pathChanged (QString)), this, SLOT (onDestinationChanged ())); } else { ui.destinationStack->setCurrentWidget (ui.destinationEdit); ui.destinationEdit->setText (downloadDir); ui.freeSpaceLabel->setPath (downloadDir); connect (ui.destinationEdit, SIGNAL (textEdited (QString)), &myEditTimer, SLOT (start ())); connect (ui.destinationEdit, SIGNAL (editingFinished ()), this, SLOT (onDestinationChanged ())); } ui.destinationStack->setFixedHeight (ui.destinationStack->currentWidget ()->sizeHint ().height ()); ui.destinationLabel->setBuddy (ui.destinationStack->currentWidget ()); ui.filesView->setEditable (false); if (!session.isLocal ()) ui.filesView->hideColumn (2); // hide the % done, since we've no way of knowing ui.priorityCombo->addItem (tr ("High"), TR_PRI_HIGH); ui.priorityCombo->addItem (tr ("Normal"), TR_PRI_NORMAL); ui.priorityCombo->addItem (tr ("Low"), TR_PRI_LOW); ui.priorityCombo->setCurrentIndex (1); // Normal if (session.isLocal ()) { myVerifyButton = new QPushButton (tr ("&Verify Local Data"), this); ui.dialogButtons->addButton (myVerifyButton, QDialogButtonBox::ActionRole); connect (myVerifyButton, SIGNAL (clicked (bool)), this, SLOT (onVerify ())); } ui.startCheck->setChecked (prefs.getBool (Prefs::START)); ui.trashCheck->setChecked (prefs.getBool (Prefs::TRASH_ORIGINAL)); connect (ui.dialogButtons, SIGNAL (rejected ()), this, SLOT (deleteLater ())); connect (ui.dialogButtons, SIGNAL (accepted ()), this, SLOT (onAccepted ())); connect (ui.filesView, SIGNAL (priorityChanged (QSet, int)), this, SLOT (onPriorityChanged (QSet, int))); connect (ui.filesView, SIGNAL (wantedChanged (QSet, bool)), this, SLOT (onWantedChanged (QSet, bool))); connect (&myVerifyTimer, SIGNAL (timeout ()), this, SLOT (onTimeout ())); reload (); } OptionsDialog::~OptionsDialog () { clearInfo (); } /*** **** ***/ void OptionsDialog::clearInfo () { if (myHaveInfo) tr_metainfoFree (&myInfo); myHaveInfo = false; myFiles.clear (); } void OptionsDialog::reload () { clearInfo (); clearVerify (); tr_ctor * ctor = tr_ctorNew (0); switch (myAdd.type) { case AddData::MAGNET: tr_ctorSetMetainfoFromMagnetLink (ctor, myAdd.magnet.toUtf8 ().constData ()); break; case AddData::FILENAME: tr_ctorSetMetainfoFromFile (ctor, myAdd.filename.toUtf8 ().constData ()); break; case AddData::METAINFO: tr_ctorSetMetainfo (ctor, reinterpret_cast (myAdd.metainfo.constData ()), myAdd.metainfo.size ()); break; default: break; } const int err = tr_torrentParse (ctor, &myInfo); myHaveInfo = !err; tr_ctorFree (ctor); ui.filesView->clear (); myFiles.clear (); myPriorities.clear (); myWanted.clear (); const bool haveFilesToShow = myHaveInfo && myInfo.fileCount > 0; ui.filesView->setVisible (haveFilesToShow); if (myVerifyButton != nullptr) myVerifyButton->setVisible (haveFilesToShow); layout ()->setSizeConstraint (haveFilesToShow ? QLayout::SetDefaultConstraint : QLayout::SetFixedSize); if (myHaveInfo) { myPriorities.insert (0, myInfo.fileCount, TR_PRI_NORMAL); myWanted.insert (0, myInfo.fileCount, true); for (tr_file_index_t i = 0; i < myInfo.fileCount; ++i) { TorrentFile file; file.index = i; file.priority = myPriorities[i]; file.wanted = myWanted[i]; file.size = myInfo.files[i].length; file.have = 0; file.filename = QString::fromUtf8 (myInfo.files[i].name); myFiles.append (file); } } ui.filesView->update (myFiles); } void OptionsDialog::onPriorityChanged (const QSet& fileIndices, int priority) { for (const int i: fileIndices) myPriorities[i] = priority; } void OptionsDialog::onWantedChanged (const QSet& fileIndices, bool isWanted) { for (const int i: fileIndices) myWanted[i] = isWanted; } void OptionsDialog::onAccepted () { // rpc spec section 3.4 "adding a torrent" tr_variant args; tr_variantInitDict (&args, 10); QString downloadDir; // "download-dir" if (ui.destinationStack->currentWidget () == ui.destinationButton) downloadDir = myLocalDestination.absolutePath (); else downloadDir = ui.destinationEdit->text (); tr_variantDictAddStr (&args, TR_KEY_download_dir, downloadDir.toUtf8 ().constData ()); // paused tr_variantDictAddBool (&args, TR_KEY_paused, !ui.startCheck->isChecked ()); // priority const int index = ui.priorityCombo->currentIndex (); const int priority = ui.priorityCombo->itemData (index).toInt (); tr_variantDictAddInt (&args, TR_KEY_bandwidthPriority, priority); // files-unwanted int count = myWanted.count (false); if (count > 0) { tr_variant * l = tr_variantDictAddList (&args, TR_KEY_files_unwanted, count); for (int i = 0, n = myWanted.size (); i < n; ++i) { if (myWanted.at (i) == false) tr_variantListAddInt (l, i); } } // priority-low count = myPriorities.count (TR_PRI_LOW); if (count > 0) { tr_variant * l = tr_variantDictAddList (&args, TR_KEY_priority_low, count); for (int i = 0, n = myPriorities.size (); i < n; ++i) { if (myPriorities.at (i) == TR_PRI_LOW) tr_variantListAddInt (l, i); } } // priority-high count = myPriorities.count (TR_PRI_HIGH); if (count > 0) { tr_variant * l = tr_variantDictAddList (&args, TR_KEY_priority_high, count); for (int i = 0, n = myPriorities.size (); i < n; ++i) { if (myPriorities.at (i) == TR_PRI_HIGH) tr_variantListAddInt (l, i); } } mySession.addTorrent (myAdd, &args, ui.trashCheck->isChecked ()); deleteLater (); } void OptionsDialog::onSourceChanged () { if (ui.sourceStack->currentWidget () == ui.sourceButton) myAdd.set (ui.sourceButton->path ()); else myAdd.set (ui.sourceEdit->text ()); reload (); } void OptionsDialog::onDestinationChanged () { if (ui.destinationStack->currentWidget () == ui.destinationButton) { myLocalDestination = ui.destinationButton->path (); ui.freeSpaceLabel->setPath (myLocalDestination.absolutePath ()); } else { ui.freeSpaceLabel->setPath (ui.destinationEdit->text ()); } } /*** **** **** VERIFY **** ***/ void OptionsDialog::clearVerify () { myVerifyHash.reset (); myVerifyFile.close (); myVerifyFilePos = 0; myVerifyFlags.clear (); myVerifyFileIndex = 0; myVerifyPieceIndex = 0; myVerifyPiecePos = 0; myVerifyTimer.stop (); for (TorrentFile& f: myFiles) f.have = 0; ui.filesView->update (myFiles); } void OptionsDialog::onVerify () { clearVerify (); myVerifyFlags.insert (0, myInfo.pieceCount, false); myVerifyTimer.setSingleShot (false); myVerifyTimer.start (0); } namespace { uint64_t getPieceSize (const tr_info * info, tr_piece_index_t pieceIndex) { if (pieceIndex != info->pieceCount - 1) return info->pieceSize; return info->totalSize % info->pieceSize; } } void OptionsDialog::onTimeout () { if (myFiles.isEmpty ()) { myVerifyTimer.stop (); return; } const tr_file * file = &myInfo.files[myVerifyFileIndex]; if (!myVerifyFilePos && !myVerifyFile.isOpen ()) { const QFileInfo fileInfo (myLocalDestination, QString::fromUtf8 (file->name)); myVerifyFile.setFileName (fileInfo.absoluteFilePath ()); myVerifyFile.open (QIODevice::ReadOnly); } int64_t leftInPiece = getPieceSize (&myInfo, myVerifyPieceIndex) - myVerifyPiecePos; int64_t leftInFile = file->length - myVerifyFilePos; int64_t bytesThisPass = qMin (leftInFile, leftInPiece); bytesThisPass = qMin (bytesThisPass, static_cast (sizeof (myVerifyBuf))); if (myVerifyFile.isOpen () && myVerifyFile.seek (myVerifyFilePos)) { int64_t numRead = myVerifyFile.read (myVerifyBuf, bytesThisPass); if (numRead == bytesThisPass) myVerifyHash.addData (myVerifyBuf, numRead); } leftInPiece -= bytesThisPass; leftInFile -= bytesThisPass; myVerifyPiecePos += bytesThisPass; myVerifyFilePos += bytesThisPass; myVerifyBins[myVerifyFileIndex] += bytesThisPass; if (leftInPiece == 0) { const QByteArray result (myVerifyHash.result ()); const bool matches = !memcmp (result.constData (), myInfo.pieces[myVerifyPieceIndex].hash, SHA_DIGEST_LENGTH); myVerifyFlags[myVerifyPieceIndex] = matches; myVerifyPiecePos = 0; ++myVerifyPieceIndex; myVerifyHash.reset (); FileList changedFiles; if (matches) { for (auto i = myVerifyBins.begin (), end = myVerifyBins.end (); i != end; ++i) { TorrentFile& f (myFiles[i.key ()]); f.have += i.value (); changedFiles.append (f); } } ui.filesView->update (changedFiles); myVerifyBins.clear (); } if (leftInFile == 0) { myVerifyFile.close (); ++myVerifyFileIndex; myVerifyFilePos = 0; } bool done = myVerifyPieceIndex >= myInfo.pieceCount; if (done) { uint64_t have = 0; for (const TorrentFile& f: myFiles) have += f.have; if (!have) // everything failed { // did the user accidentally specify the child directory instead of the parent? const QStringList tokens = QString::fromUtf8 (file->name).split (QLatin1Char ('/')); if (!tokens.empty () && myLocalDestination.dirName () == tokens.at (0)) { // move up one directory and try again myLocalDestination.cdUp (); onVerify (); done = false; } } } if (done) myVerifyTimer.stop (); } transmission-2.92/qt/PaxHeaders.4960/TorrentDelegateMin.cc0000644000000000000000000000013212557166437020365 xustar0030 mtime=1438444831.677384652 30 atime=1438444831.677384652 30 ctime=1457295917.237760933 transmission-2.92/qt/TorrentDelegateMin.cc0000644000175000017500000001770512557166437022024 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: TorrentDelegateMin.cc 14554 2015-07-30 06:55:28Z mikedld $ */ #include #include #include #include #include #include #include #include #include #include #include #include #include "Torrent.h" #include "TorrentDelegateMin.h" #include "TorrentModel.h" #include "Utils.h" enum { GUI_PAD = 6, BAR_WIDTH = 50, BAR_HEIGHT = 16, LINE_SPACING = 4 }; /*** **** **** +---------+-----------------------------------------------+ **** | Icon | Title shortStatusString [Progressbar] | **** +-------- +-----------------------------------------------+ **** ***/ namespace { class ItemLayout { private: QString myNameText; QString myStatusText; public: QFont nameFont; QFont statusFont; QRect iconRect; QRect emblemRect; QRect nameRect; QRect statusRect; QRect barRect; public: ItemLayout(const QString& nameText, const QString& statusText, const QIcon& emblemIcon, const QFont& baseFont, Qt::LayoutDirection direction, const QPoint& topLeft, int width); QSize size () const { return (iconRect | nameRect | statusRect | barRect).size (); } QString nameText () const { return elidedText (nameFont, myNameText, nameRect.width ()); } QString statusText () const { return myStatusText; } private: QString elidedText (const QFont& font, const QString& text, int width) const { return QFontMetrics (font).elidedText (text, Qt::ElideRight, width); } }; ItemLayout::ItemLayout(const QString& nameText, const QString& statusText, const QIcon& emblemIcon, const QFont& baseFont, Qt::LayoutDirection direction, const QPoint& topLeft, int width): myNameText (nameText), myStatusText (statusText), nameFont (baseFont), statusFont (baseFont) { const QStyle * style (qApp->style ()); const int iconSize (style->pixelMetric (QStyle::PM_SmallIconSize)); const QFontMetrics nameFM (nameFont); const QSize nameSize (nameFM.size (0, myNameText)); statusFont.setPointSize (static_cast (statusFont.pointSize () * 0.85)); const QFontMetrics statusFM (statusFont); const QSize statusSize (statusFM.size (0, myStatusText)); QRect baseRect (topLeft, QSize (width, qMax (iconSize, qMax (nameSize.height (), qMax (statusSize.height (), static_cast(BAR_HEIGHT)))))); iconRect = style->alignedRect (direction, Qt::AlignLeft | Qt::AlignVCenter, QSize (iconSize, iconSize), baseRect); emblemRect = style->alignedRect (direction, Qt::AlignRight | Qt::AlignBottom, emblemIcon.actualSize (iconRect.size () / 2, QIcon::Normal, QIcon::On), iconRect); barRect = style->alignedRect (direction, Qt::AlignRight | Qt::AlignVCenter, QSize (BAR_WIDTH, BAR_HEIGHT), baseRect); Utils::narrowRect (baseRect, iconRect.width () + GUI_PAD, barRect.width () + GUI_PAD, direction); statusRect = style->alignedRect (direction, Qt::AlignRight | Qt::AlignVCenter, QSize (statusSize.width (), baseRect.height ()), baseRect); Utils::narrowRect (baseRect, 0, statusRect.width () + GUI_PAD, direction); nameRect = baseRect; } } QSize TorrentDelegateMin::sizeHint (const QStyleOptionViewItem & option, const Torrent & tor) const { const bool isMagnet (!tor.hasMetadata()); const QSize m (margin (*qApp->style())); const ItemLayout layout (isMagnet ? progressString (tor) : tor.name(), shortStatusString (tor), QIcon (), option.font, option.direction, QPoint (0, 0), option.rect.width () - m.width () * 2); return layout.size () + m * 2; } void TorrentDelegateMin::drawTorrent (QPainter * painter, const QStyleOptionViewItem & option, const Torrent & tor) const { const QStyle * style (qApp->style()); const bool isPaused (tor.isPaused()); const bool isMagnet (!tor.hasMetadata()); const bool isItemSelected ((option.state & QStyle::State_Selected) != 0); const bool isItemEnabled ((option.state & QStyle::State_Enabled) != 0); const bool isItemActive ((option.state & QStyle::State_Active) != 0); painter->save(); if (isItemSelected) { QPalette::ColorGroup cg = isItemEnabled ? QPalette::Normal : QPalette::Disabled; if (cg == QPalette::Normal && !isItemActive) cg = QPalette::Inactive; painter->fillRect(option.rect, option.palette.brush(cg, QPalette::Highlight)); } QIcon::Mode im; if (isPaused || !isItemEnabled) im = QIcon::Disabled; else if (isItemSelected) im = QIcon::Selected; else im = QIcon::Normal; QIcon::State qs; if (isPaused) qs = QIcon::Off; else qs = QIcon::On; QPalette::ColorGroup cg = QPalette::Normal; if (isPaused || !isItemEnabled) cg = QPalette::Disabled; if (cg == QPalette::Normal && !isItemActive) cg = QPalette::Inactive; QPalette::ColorRole cr; if (isItemSelected) cr = QPalette::HighlightedText; else cr = QPalette::Text; QStyle::State progressBarState (option.state); if (isPaused) progressBarState = QStyle::State_None; progressBarState |= QStyle::State_Small; const QIcon::Mode emblemIm = isItemSelected ? QIcon::Selected : QIcon::Normal; const QIcon emblemIcon = tor.hasError () ? QIcon::fromTheme (QLatin1String ("emblem-important"), style->standardIcon (QStyle::SP_MessageBoxWarning)) : QIcon (); // layout const QSize m (margin (*style)); const QRect contentRect (option.rect.adjusted (m.width(), m.height(), -m.width(), -m.height())); const ItemLayout layout (isMagnet ? progressString (tor) : tor.name(), shortStatusString (tor), emblemIcon, option.font, option.direction, contentRect.topLeft (), contentRect.width ()); // render if (tor.hasError() && !isItemSelected) painter->setPen (QColor ("red")); else painter->setPen (option.palette.color (cg, cr)); tor.getMimeTypeIcon().paint (painter, layout.iconRect, Qt::AlignCenter, im, qs); if (!emblemIcon.isNull ()) emblemIcon.paint (painter, layout.emblemRect, Qt::AlignCenter, emblemIm, qs); painter->setFont (layout.nameFont); painter->drawText (layout.nameRect, Qt::AlignLeft | Qt::AlignVCenter, layout.nameText ()); painter->setFont (layout.statusFont); painter->drawText (layout.statusRect, Qt::AlignLeft | Qt::AlignVCenter, layout.statusText ()); myProgressBarStyle->rect = layout.barRect; if (tor.isDownloading()) { myProgressBarStyle->palette.setBrush (QPalette::Highlight, blueBrush); myProgressBarStyle->palette.setColor (QPalette::Base, blueBack); myProgressBarStyle->palette.setColor (QPalette::Window, blueBack); } else if (tor.isSeeding()) { myProgressBarStyle->palette.setBrush (QPalette::Highlight, greenBrush); myProgressBarStyle->palette.setColor (QPalette::Base, greenBack); myProgressBarStyle->palette.setColor (QPalette::Window, greenBack); } else { myProgressBarStyle->palette.setBrush (QPalette::Highlight, silverBrush); myProgressBarStyle->palette.setColor (QPalette::Base, silverBack); myProgressBarStyle->palette.setColor (QPalette::Window, silverBack); } myProgressBarStyle->state = progressBarState; myProgressBarStyle->text = QString::fromLatin1 ("%1%").arg (static_cast (tr_truncd (100.0 * tor.percentDone (), 0))); myProgressBarStyle->textVisible = true; myProgressBarStyle->textAlignment = Qt::AlignCenter; setProgressBarPercentDone (option, tor); style->drawControl (QStyle::CE_ProgressBar, myProgressBarStyle, painter); painter->restore(); } transmission-2.92/qt/PaxHeaders.4960/SessionDialog.h0000644000000000000000000000013212571431256017224 xustar0030 mtime=1441149614.410176902 30 atime=1441149614.410176902 30 ctime=1457295917.240760984 transmission-2.92/qt/SessionDialog.h0000644000175000017500000000153612571431256020656 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: SessionDialog.h 14562 2015-09-01 20:39:34Z mikedld $ */ #ifndef QTR_SESSION_DIALOG_H #define QTR_SESSION_DIALOG_H #include #include "BaseDialog.h" #include "ui_SessionDialog.h" class Prefs; class Session; class SessionDialog: public BaseDialog { Q_OBJECT public: SessionDialog (Session& session, Prefs& prefs, QWidget * parent = nullptr); virtual ~SessionDialog () {} public slots: // QDialog virtual void accept (); private slots: void resensitize (); private: Session& mySession; Prefs& myPrefs; Ui::SessionDialog ui; QWidgetList myRemoteWidgets; QWidgetList myAuthWidgets; }; #endif // QTR_SESSION_DIALOG_H transmission-2.92/qt/PaxHeaders.4960/Torrent.h0000644000000000000000000000013212537301461016112 xustar0030 mtime=1434288945.178419356 30 atime=1434288945.178419356 30 ctime=1457295917.244761052 transmission-2.92/qt/Torrent.h0000644000175000017500000002603712537301461017547 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: Torrent.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_TORRENT_H #define QTR_TORRENT_H #include #include #include #include #include #include #include #include #include #include #include "CustomVariantType.h" #include "Speed.h" #ifdef ERROR #undef ERROR #endif class QPixmap; class Prefs; extern "C" { struct tr_variant; } struct Peer { bool clientIsChoked; bool clientIsInterested; bool isDownloadingFrom; bool isEncrypted; bool isIncoming; bool isUploadingTo; bool peerIsChoked; bool peerIsInterested; QString address; QString clientName; QString flagStr; int port; Speed rateToClient; Speed rateToPeer; double progress; }; Q_DECLARE_METATYPE(Peer) typedef QList PeerList; Q_DECLARE_METATYPE(PeerList) struct TrackerStat { QPixmap getFavicon () const; bool hasAnnounced; bool hasScraped; bool isBackup; bool lastAnnounceSucceeded; bool lastAnnounceTimedOut; bool lastScrapeSucceeded; bool lastScrapeTimedOut; int announceState; int downloadCount; int id; int lastAnnouncePeerCount; int lastAnnounceStartTime; int lastAnnounceTime; int lastScrapeStartTime; int lastScrapeTime; int leecherCount; int nextAnnounceTime; int nextScrapeTime; int scrapeState; int seederCount; int tier; QString announce; QString host; QString lastAnnounceResult; QString lastScrapeResult; }; Q_DECLARE_METATYPE(TrackerStat) typedef QList TrackerStatsList; Q_DECLARE_METATYPE(TrackerStatsList) struct TorrentFile { TorrentFile(): wanted (true), index (-1), priority (0), size (0), have (0) {} bool wanted; int index; int priority; QString filename; uint64_t size; uint64_t have; }; Q_DECLARE_METATYPE(TorrentFile) typedef QList FileList; Q_DECLARE_METATYPE(FileList) class Torrent: public QObject { Q_OBJECT public: enum { ID, UPLOAD_SPEED, DOWNLOAD_SPEED, DOWNLOAD_DIR, ACTIVITY, NAME, ERROR, ERROR_STRING, SIZE_WHEN_DONE, LEFT_UNTIL_DONE, HAVE_UNCHECKED, HAVE_VERIFIED, DESIRED_AVAILABLE, TOTAL_SIZE, PIECE_SIZE, PIECE_COUNT, PEERS_GETTING_FROM_US, PEERS_SENDING_TO_US, WEBSEEDS_SENDING_TO_US, PERCENT_DONE, METADATA_PERCENT_DONE, PERCENT_VERIFIED, DATE_ACTIVITY, DATE_ADDED, DATE_STARTED, DATE_CREATED, PEERS_CONNECTED, ETA, RATIO, DOWNLOADED_EVER, UPLOADED_EVER, FAILED_EVER, TRACKERS, HOSTS, TRACKERSTATS, MIME_ICON, SEED_RATIO_LIMIT, SEED_RATIO_MODE, SEED_IDLE_LIMIT, SEED_IDLE_MODE, DOWN_LIMIT, DOWN_LIMITED, UP_LIMIT, UP_LIMITED, HONORS_SESSION_LIMITS, PEER_LIMIT, HASH_STRING, IS_FINISHED, IS_PRIVATE, IS_STALLED, COMMENT, CREATOR, MANUAL_ANNOUNCE_TIME, PEERS, BANDWIDTH_PRIORITY, QUEUE_POSITION, PROPERTY_COUNT }; typedef QList KeyList; public: Torrent (const Prefs&, int id); virtual ~Torrent (); int getBandwidthPriority () const { return getInt (BANDWIDTH_PRIORITY); } int id () const { return getInt (ID); } QString name () const { return getString (NAME); } QString creator () const { return getString (CREATOR); } QString comment () const { return getString (COMMENT); } QString getPath () const { return getString (DOWNLOAD_DIR); } QString getError () const; QString hashString () const { return getString (HASH_STRING); } bool hasError () const { return !getError ().isEmpty (); } bool isDone () const { return getSize (LEFT_UNTIL_DONE) == 0; } bool isSeed () const { return haveVerified() >= totalSize(); } bool isPrivate () const { return getBool (IS_PRIVATE); } bool getSeedRatio (double& setme) const; uint64_t haveVerified () const { return getSize (HAVE_VERIFIED); } uint64_t haveUnverified () const { return getSize (HAVE_UNCHECKED); } uint64_t desiredAvailable () const { return getSize (DESIRED_AVAILABLE); } uint64_t haveTotal () const { return haveVerified () + haveUnverified(); } uint64_t totalSize () const { return getSize (TOTAL_SIZE); } uint64_t sizeWhenDone () const { return getSize (SIZE_WHEN_DONE); } uint64_t leftUntilDone () const { return getSize (LEFT_UNTIL_DONE); } uint64_t pieceSize () const { return getSize (PIECE_SIZE); } bool hasMetadata () const { return getDouble (METADATA_PERCENT_DONE) >= 1.0; } bool isMagnet () const { return magnetTorrent; } int pieceCount () const { return getInt (PIECE_COUNT); } double ratio () const { return getDouble (RATIO); } double percentComplete () const { return haveTotal() / static_cast (totalSize()); } double percentDone () const { return getDouble (PERCENT_DONE); } double metadataPercentDone () const { return getDouble (METADATA_PERCENT_DONE); } uint64_t downloadedEver () const { return getSize (DOWNLOADED_EVER); } uint64_t uploadedEver () const { return getSize (UPLOADED_EVER); } uint64_t failedEver () const { return getSize (FAILED_EVER); } int compareTracker (const Torrent&) const; int compareSeedRatio (const Torrent&) const; int compareRatio (const Torrent&) const; int compareETA (const Torrent&) const; bool hasETA () const { return getETA () >= 0; } int getETA () const { return getInt (ETA); } QDateTime lastActivity () const { return getDateTime (DATE_ACTIVITY); } QDateTime lastStarted () const { return getDateTime (DATE_STARTED); } QDateTime dateAdded () const { return getDateTime (DATE_ADDED); } QDateTime dateCreated () const { return getDateTime (DATE_CREATED); } QDateTime manualAnnounceTime () const { return getDateTime (MANUAL_ANNOUNCE_TIME); } bool canManualAnnounce () const { return isReadyToTransfer() && (manualAnnounceTime()<=QDateTime::currentDateTime()); } int peersWeAreDownloadingFrom () const { return getInt (PEERS_SENDING_TO_US); } int webseedsWeAreDownloadingFrom () const { return getInt (WEBSEEDS_SENDING_TO_US); } int peersWeAreUploadingTo () const { return getInt (PEERS_GETTING_FROM_US); } bool isUploading () const { return peersWeAreUploadingTo () > 0; } int connectedPeers () const { return getInt (PEERS_CONNECTED); } int connectedPeersAndWebseeds () const { return connectedPeers () + getInt (WEBSEEDS_SENDING_TO_US); } Speed downloadSpeed () const { return Speed::fromBps (getSize (DOWNLOAD_SPEED)); } Speed uploadSpeed () const { return Speed::fromBps (getSize (UPLOAD_SPEED)); } double getVerifyProgress () const { return getDouble (PERCENT_VERIFIED); } bool hasFileSubstring (const QString& substr) const; bool hasTrackerSubstring (const QString& substr) const; Speed uploadLimit () const { return Speed::fromKBps (getInt (UP_LIMIT)); } Speed downloadLimit () const { return Speed::fromKBps (getInt (DOWN_LIMIT)); } bool uploadIsLimited () const { return getBool (UP_LIMITED); } bool downloadIsLimited () const { return getBool (DOWN_LIMITED); } bool honorsSessionLimits () const { return getBool (HONORS_SESSION_LIMITS); } int peerLimit () const { return getInt (PEER_LIMIT); } double seedRatioLimit () const { return getDouble (SEED_RATIO_LIMIT); } tr_ratiolimit seedRatioMode () const { return static_cast (getInt (SEED_RATIO_MODE)); } int seedIdleLimit () const { return getInt (SEED_IDLE_LIMIT); } tr_idlelimit seedIdleMode () const { return static_cast (getInt (SEED_IDLE_MODE)); } TrackerStatsList trackerStats () const{ return myValues[TRACKERSTATS].value(); } QStringList trackers() const { return myValues[TRACKERS].value(); } QStringList hosts() const { return myValues[HOSTS].value(); } PeerList peers () const{ return myValues[PEERS].value(); } const FileList& files () const { return myFiles; } int queuePosition () const { return getInt (QUEUE_POSITION); } bool isStalled () const { return getBool (IS_STALLED); } QString activityString () const; tr_torrent_activity getActivity () const { return static_cast (getInt (ACTIVITY)); } bool isFinished () const { return getBool (IS_FINISHED); } bool isPaused () const { return getActivity () == TR_STATUS_STOPPED; } bool isWaitingToVerify () const { return getActivity () == TR_STATUS_CHECK_WAIT; } bool isVerifying () const { return getActivity () == TR_STATUS_CHECK; } bool isDownloading () const { return getActivity () == TR_STATUS_DOWNLOAD; } bool isWaitingToDownload () const { return getActivity () == TR_STATUS_DOWNLOAD_WAIT; } bool isSeeding () const { return getActivity () == TR_STATUS_SEED; } bool isWaitingToSeed () const { return getActivity () == TR_STATUS_SEED_WAIT; } bool isReadyToTransfer () const { return getActivity()==TR_STATUS_DOWNLOAD || getActivity()==TR_STATUS_SEED; } bool isQueued () const { return isWaitingToDownload() || isWaitingToSeed(); } void notifyComplete () const; void update (tr_variant * dict); void setMagnet (bool magnet) { magnetTorrent = magnet; } QIcon getMimeTypeIcon () const { return getIcon (MIME_ICON); } static const KeyList& getInfoKeys (); static const KeyList& getStatKeys (); static const KeyList& getExtraStatKeys (); signals: void torrentChanged (int id); void torrentCompleted (int id); private: enum Group { INFO, // info fields that only need to be loaded once STAT, // commonly-used stats that should be refreshed often STAT_EXTRA, // rarely used; only refresh if details dialog is open DERIVED // doesn't come from RPC }; struct Property { int id; tr_quark key; int type; int group; }; private: int getInt (int key) const; bool getBool (int key) const; QTime getTime (int key) const; QIcon getIcon (int key) const; double getDouble (int key) const; qulonglong getSize (int key) const; QString getString (int key) const; QDateTime getDateTime (int key) const; bool setInt (int key, int value); bool setBool (int key, bool value); bool setIcon (int key, const QIcon&); bool setDouble (int key, double); bool setString (int key, const char *); bool setSize (int key, qulonglong); bool setDateTime (int key, const QDateTime&); const char * getMimeTypeString () const; void updateMimeIcon (); static KeyList buildKeyList (Group group); private: const Prefs& myPrefs; QVariant myValues[PROPERTY_COUNT]; bool magnetTorrent; FileList myFiles; static Property myProperties[]; }; Q_DECLARE_METATYPE(const Torrent*) #endif // QTR_TORRENT_H transmission-2.92/qt/PaxHeaders.4960/CMakeLists.txt0000644000000000000000000000013212634721262017047 xustar0030 mtime=1450418866.416511238 30 atime=1450418866.416511238 30 ctime=1457295917.246761086 transmission-2.92/qt/CMakeLists.txt0000644000175000017500000001340112634721262020473 0ustar00mikedldmikedld00000000000000project(trqt) if(USE_QT5) macro(tr_qt_wrap_ui) qt5_wrap_ui(${ARGN}) endmacro() macro(tr_qt_add_resources) qt5_add_resources(${ARGN}) endmacro() macro(tr_qt_add_translation) qt5_add_translation(${ARGN}) endmacro() else() macro(tr_qt_wrap_ui) qt4_wrap_ui(${ARGN}) endmacro() macro(tr_qt_add_resources) qt4_add_resources(${ARGN}) endmacro() macro(tr_qt_add_translation) qt4_add_translation(${ARGN}) endmacro() endif() set(${PROJECT_NAME}_SOURCES AboutDialog.cc AddData.cc Application.cc ColumnResizer.cc ComInteropHelper.cc DBusInteropHelper.cc DetailsDialog.cc FaviconCache.cc FileTreeDelegate.cc FileTreeItem.cc FileTreeModel.cc FileTreeView.cc FilterBar.cc FilterBarComboBox.cc FilterBarComboBoxDelegate.cc FilterBarLineEdit.cc Filters.cc Formatter.cc FreeSpaceLabel.cc IconToolButton.cc InteropHelper.cc InteropObject.cc LicenseDialog.cc MainWindow.cc MakeDialog.cc OptionsDialog.cc PathButton.cc Prefs.cc PrefsDialog.cc RelocateDialog.cc RpcClient.cc Session.cc SessionDialog.cc SqueezeLabel.cc StatsDialog.cc Torrent.cc TorrentDelegate.cc TorrentDelegateMin.cc TorrentFilter.cc TorrentModel.cc TorrentView.cc TrackerDelegate.cc TrackerModel.cc TrackerModelFilter.cc Utils.cc WatchDir.cc ) if (NOT ENABLE_QT_COM_INTEROP) set_source_files_properties(ComInteropHelper.cc PROPERTIES HEADER_FILE_ONLY ON) endif() if (NOT ENABLE_QT_DBUS_INTEROP) set_source_files_properties(DBusInteropHelper.cc PROPERTIES HEADER_FILE_ONLY ON) endif() set(${PROJECT_NAME}_HEADERS AboutDialog.h AddData.h Application.h BaseDialog.h ColumnResizer.h ComInteropHelper.h CustomVariantType.h DBusInteropHelper.h DetailsDialog.h FaviconCache.h FileTreeDelegate.h FileTreeItem.h FileTreeModel.h FileTreeView.h FilterBar.h FilterBarComboBox.h FilterBarComboBoxDelegate.h FilterBarLineEdit.h Filters.h Formatter.h FreeSpaceLabel.h IconToolButton.h InteropHelper.h InteropObject.h LicenseDialog.h MainWindow.h MakeDialog.h OptionsDialog.h PathButton.h Prefs.h PrefsDialog.h RelocateDialog.h RpcClient.h Session.h SessionDialog.h Speed.h SqueezeLabel.h StatsDialog.h Torrent.h TorrentDelegate.h TorrentDelegateMin.h TorrentFilter.h TorrentModel.h TorrentView.h TrackerDelegate.h TrackerModel.h TrackerModelFilter.h Utils.h WatchDir.h ) tr_qt_wrap_ui(${PROJECT_NAME}_UI_SOURCES AboutDialog.ui DetailsDialog.ui LicenseDialog.ui MainWindow.ui MakeDialog.ui MakeProgressDialog.ui OptionsDialog.ui PrefsDialog.ui RelocateDialog.ui SessionDialog.ui StatsDialog.ui ) set(${PROJECT_NAME}_QRC_FILES application.qrc) if(WIN32 OR APPLE) list(APPEND ${PROJECT_NAME}_QRC_FILES icons/Faenza/Faenza.qrc) endif() tr_qt_add_resources(${PROJECT_NAME}_QRC_SOURCES ${${PROJECT_NAME}_QRC_FILES}) set(${PROJECT_NAME}_LINGUAS de en es eu fr hu id it_IT kk ko lt pl_PL pt_BR ru uk zh_CN ) if(ENABLE_NLS) set(${PROJECT_NAME}_ENABLED_LINGUAS ${${PROJECT_NAME}_LINGUAS}) else() set(${PROJECT_NAME}_ENABLED_LINGUAS) endif() set(${PROJECT_NAME}_TS_FILES) foreach(LANG ${${PROJECT_NAME}_ENABLED_LINGUAS}) list(APPEND ${PROJECT_NAME}_TS_FILES translations/transmission_${LANG}.ts) endforeach() if(${PROJECT_NAME}_TS_FILES) tr_qt_add_translation(${PROJECT_NAME}_QM_FILES ${${PROJECT_NAME}_TS_FILES}) endif() include_directories( ${CMAKE_SOURCE_DIR} ${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR} ${CURL_INCLUDE_DIRS} ${EVENT2_INCLUDE_DIRS} ) tr_win32_app_info(${PROJECT_NAME}_WIN32_RC_FILE "Transmission Qt Client" "transmission-qt" "transmission-qt.exe" "qtr.ico") if(ENABLE_QT_COM_INTEROP) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/transmission-qt.tlb COMMAND ${MIDL_EXECUTABLE} /tlb ${CMAKE_CURRENT_BINARY_DIR}/transmission-qt.tlb transmission-qt.idl DEPENDS transmission-qt.idl WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) list(APPEND ${PROJECT_NAME}_WIN32_RC_FILE transmission-qt.tlb.rc transmission-qt.idl ${CMAKE_CURRENT_BINARY_DIR}/transmission-qt.tlb) set_source_files_properties(transmission-qt.idl ${CMAKE_CURRENT_BINARY_DIR}/transmission-qt.tlb PROPERTIES HEADER_FILE_ONLY ON) endif() add_executable(${TR_NAME}-qt WIN32 ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_UI_SOURCES} ${${PROJECT_NAME}_QRC_SOURCES} ${${PROJECT_NAME}_HEADERS} ${${PROJECT_NAME}_QM_FILES} ${${PROJECT_NAME}_WIN32_RC_FILE} ) target_link_libraries(${TR_NAME}-qt ${TR_NAME} ${QT_TARGETS} ${CURL_LIBRARIES} ${EVENT2_LIBRARIES} ) target_compile_definitions(${TR_NAME}-qt PRIVATE "TRANSLATIONS_DIR=\"${CMAKE_INSTALL_FULL_DATADIR}/${TR_NAME}/translations\"" QT_NO_CAST_FROM_ASCII $<$:ENABLE_COM_INTEROP> $<$:ENABLE_DBUS_INTEROP>) if(MSVC) tr_append_target_property(${TR_NAME}-qt LINK_FLAGS "/ENTRY:mainCRTStartup") endif() set_target_properties(${TR_NAME}-qt PROPERTIES AUTOMOC TRUE) install(TARGETS ${TR_NAME}-qt DESTINATION ${CMAKE_INSTALL_BINDIR}) if(INSTALL_DOC) install(FILES ${TR_NAME}-qt.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) endif() install(FILES transmission-qt.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) if(ENABLE_NLS) install(FILES ${${PROJECT_NAME}_QM_FILES} DESTINATION ${CMAKE_INSTALL_DATADIR}/${TR_NAME}/translations) endif() transmission-2.92/qt/PaxHeaders.4960/FilterBarComboBox.h0000644000000000000000000000012612537301461017763 xustar0028 mtime=1434288945.1524189 28 atime=1434288945.1524189 30 ctime=1457295917.244761052 transmission-2.92/qt/FilterBarComboBox.h0000644000175000017500000000157312537301461021413 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FilterBarComboBox.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_FILTER_BAR_COMBO_BOX_H #define QTR_FILTER_BAR_COMBO_BOX_H #include class FilterBarComboBox: public QComboBox { Q_OBJECT public: enum { CountRole = Qt::UserRole + 1, CountStringRole, UserRole }; public: FilterBarComboBox (QWidget * parent = nullptr); int currentCount () const; // QWidget virtual QSize minimumSizeHint () const; virtual QSize sizeHint () const; protected: // QWidget virtual void paintEvent (QPaintEvent * e); private: QSize calculateSize (const QSize& textSize, const QSize& countSize) const; }; #endif // QTR_FILTER_BAR_COMBO_BOX_H transmission-2.92/qt/PaxHeaders.4960/Application.cc0000644000000000000000000000013212665050570017062 xustar0030 mtime=1456755064.417630584 30 atime=1450311112.717085633 30 ctime=1457295917.246761086 transmission-2.92/qt/Application.cc0000644000175000017500000004137312665050570020517 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: Application.cc 14624 2015-12-16 20:01:03Z mikedld $ */ #include #include #include #include #include #include #include #include #ifdef QT_DBUS_LIB #include #include #include #endif #include #include #include #include #include "AddData.h" #include "Application.h" #include "Formatter.h" #include "InteropHelper.h" #include "MainWindow.h" #include "OptionsDialog.h" #include "Prefs.h" #include "Session.h" #include "TorrentModel.h" #include "WatchDir.h" namespace { const QLatin1String MY_CONFIG_NAME ("transmission"); const QLatin1String MY_READABLE_NAME ("transmission-qt"); const tr_option opts[] = { { 'g', "config-dir", "Where to look for configuration files", "g", 1, "" }, { 'm', "minimized", "Start minimized in system tray", "m", 0, NULL }, { 'p', "port", "Port to use when connecting to an existing session", "p", 1, "" }, { 'r', "remote", "Connect to an existing session at the specified hostname", "r", 1, "" }, { 'u', "username", "Username to use when connecting to an existing session", "u", 1, "" }, { 'v', "version", "Show version number and exit", "v", 0, NULL }, { 'w', "password", "Password to use when connecting to an existing session", "w", 1, "" }, { 0, NULL, NULL, NULL, 0, NULL } }; const char* getUsage () { return "Usage:\n" " transmission [OPTIONS...] [torrent files]"; } enum { STATS_REFRESH_INTERVAL_MSEC = 3000, SESSION_REFRESH_INTERVAL_MSEC = 3000, MODEL_REFRESH_INTERVAL_MSEC = 3000 }; bool loadTranslation (QTranslator& translator, const QString& name, const QString& localeName, const QStringList& searchDirectories) { const QString filename = name + QLatin1Char ('_') + localeName; for (const QString& directory: searchDirectories) { if (translator.load (filename, directory)) return true; } return false; } } Application::Application (int& argc, char ** argv): QApplication (argc, argv), myPrefs(nullptr), mySession(nullptr), myModel(nullptr), myWindow(nullptr), myWatchDir(nullptr), myLastFullUpdateTime (0) { setApplicationName (MY_CONFIG_NAME); loadTranslations (); Formatter::initUnits (); #if QT_VERSION >= QT_VERSION_CHECK(5, 1, 0) setAttribute (Qt::AA_UseHighDpiPixmaps); #endif #if defined (_WIN32) || defined (__APPLE__) if (QIcon::themeName ().isEmpty ()) QIcon::setThemeName (QLatin1String ("Faenza")); #endif // set the default icon QIcon icon = QIcon::fromTheme (QLatin1String ("transmission")); if (icon.isNull ()) { QList sizes; sizes << 16 << 22 << 24 << 32 << 48 << 64 << 72 << 96 << 128 << 192 << 256; for (const int size: sizes) icon.addPixmap (QPixmap (QString::fromLatin1 (":/icons/transmission-%1.png").arg (size))); } setWindowIcon (icon); #ifdef __APPLE__ setAttribute (Qt::AA_DontShowIconsInMenus); #endif // parse the command-line arguments int c; bool minimized = false; const char * optarg; QString host; QString port; QString username; QString password; QString configDir; QStringList filenames; while ((c = tr_getopt (getUsage(), argc, const_cast (argv), opts, &optarg))) { switch (c) { case 'g': configDir = QString::fromUtf8 (optarg); break; case 'p': port = QString::fromUtf8 (optarg); break; case 'r': host = QString::fromUtf8 (optarg); break; case 'u': username = QString::fromUtf8 (optarg); break; case 'w': password = QString::fromUtf8 (optarg); break; case 'm': minimized = true; break; case 'v': std::cerr << MY_READABLE_NAME.latin1 () << ' ' << LONG_VERSION_STRING << std::endl; quitLater (); return; case TR_OPT_ERR: std::cerr << qPrintable(QObject::tr ("Invalid option")) << std::endl; tr_getopt_usage (MY_READABLE_NAME.latin1 (), getUsage (), opts); quitLater (); return; default: filenames.append (QString::fromUtf8 (optarg)); break; } } // try to delegate the work to an existing copy of Transmission // before starting ourselves... InteropHelper interopClient; if (interopClient.isConnected ()) { bool delegated = false; for (const QString& filename: filenames) { QString metainfo; AddData a (filename); switch (a.type) { case AddData::URL: metainfo = a.url.toString (); break; case AddData::MAGNET: metainfo = a.magnet; break; case AddData::FILENAME: metainfo = QString::fromLatin1 (a.toBase64 ()); break; case AddData::METAINFO: metainfo = QString::fromLatin1 (a.toBase64 ()); break; default: break; } if (!metainfo.isEmpty () && interopClient.addMetainfo (metainfo)) delegated = true; } if (delegated) { quitLater (); return; } } // set the fallback config dir if (configDir.isNull ()) configDir = QString::fromUtf8 (tr_getDefaultConfigDir ("transmission")); // ensure our config directory exists QDir dir (configDir); if (!dir.exists ()) dir.mkpath (configDir); // is this the first time we've run transmission? const bool firstTime = !dir.exists (QLatin1String ("settings.json")); // initialize the prefs myPrefs = new Prefs (configDir); if (!host.isNull ()) myPrefs->set (Prefs::SESSION_REMOTE_HOST, host); if (!port.isNull ()) myPrefs->set (Prefs::SESSION_REMOTE_PORT, port.toUInt ()); if (!username.isNull ()) myPrefs->set (Prefs::SESSION_REMOTE_USERNAME, username); if (!password.isNull ()) myPrefs->set (Prefs::SESSION_REMOTE_PASSWORD, password); if (!host.isNull () || !port.isNull () || !username.isNull () || !password.isNull ()) myPrefs->set (Prefs::SESSION_IS_REMOTE, true); if (myPrefs->getBool (Prefs::START_MINIMIZED)) minimized = true; // start as minimized only if the system tray present if (!myPrefs->getBool (Prefs::SHOW_TRAY_ICON)) minimized = false; mySession = new Session (configDir, *myPrefs); myModel = new TorrentModel (*myPrefs); myWindow = new MainWindow (*mySession, *myPrefs, *myModel, minimized); myWatchDir = new WatchDir (*myModel); // when the session gets torrent info, update the model connect (mySession, SIGNAL (torrentsUpdated (tr_variant*,bool)), myModel, SLOT (updateTorrents (tr_variant*,bool))); connect (mySession, SIGNAL (torrentsUpdated (tr_variant*,bool)), myWindow, SLOT (refreshActionSensitivity ())); connect (mySession, SIGNAL (torrentsRemoved (tr_variant*)), myModel, SLOT (removeTorrents (tr_variant*))); // when the session source gets changed, request a full refresh connect (mySession, SIGNAL (sourceChanged ()), this, SLOT (onSessionSourceChanged ())); // when the model sees a torrent for the first time, ask the session for full info on it connect (myModel, SIGNAL (torrentsAdded (QSet)), mySession, SLOT (initTorrents (QSet))); connect (myModel, SIGNAL (torrentsAdded (QSet)), this, SLOT (onTorrentsAdded (QSet))); mySession->initTorrents (); mySession->refreshSessionStats (); // when torrents are added to the watch directory, tell the session connect (myWatchDir, SIGNAL (torrentFileAdded (QString)), this, SLOT (addTorrent (QString))); // init from preferences QList initKeys; initKeys << Prefs::DIR_WATCH; for (const int key: initKeys) refreshPref (key); connect (myPrefs, SIGNAL (changed (int)), this, SLOT (refreshPref (const int))); QTimer * timer = &myModelTimer; connect (timer, SIGNAL (timeout ()), this, SLOT (refreshTorrents ())); timer->setSingleShot (false); timer->setInterval (MODEL_REFRESH_INTERVAL_MSEC); timer->start (); timer = &myStatsTimer; connect (timer, SIGNAL (timeout ()), mySession, SLOT (refreshSessionStats ())); timer->setSingleShot (false); timer->setInterval (STATS_REFRESH_INTERVAL_MSEC); timer->start (); timer = &mySessionTimer; connect (timer, SIGNAL (timeout ()), mySession, SLOT (refreshSessionInfo ())); timer->setSingleShot (false); timer->setInterval (SESSION_REFRESH_INTERVAL_MSEC); timer->start (); maybeUpdateBlocklist (); if (!firstTime) mySession->restart (); else myWindow->openSession (); if (!myPrefs->getBool (Prefs::USER_HAS_GIVEN_INFORMED_CONSENT)) { QMessageBox * dialog = new QMessageBox (QMessageBox::Information, QString (), tr ("Transmission is a file sharing program."), QMessageBox::Ok | QMessageBox::Cancel, myWindow); dialog->setInformativeText (tr ("When you run a torrent, its data will be made available to others by means of upload. " "Any content you share is your sole responsibility.")); dialog->button (QMessageBox::Ok)->setText (tr ("I &Agree")); dialog->setDefaultButton (QMessageBox::Ok); dialog->setModal (true); connect (dialog, SIGNAL (finished (int)), this, SLOT (consentGiven (int))); dialog->setAttribute (Qt::WA_DeleteOnClose); dialog->show (); } for (const QString& filename: filenames) addTorrent (filename); InteropHelper::registerObject (this); } void Application::loadTranslations () { const QStringList qtQmDirs = QStringList () << QLibraryInfo::location (QLibraryInfo::TranslationsPath) << #ifdef TRANSLATIONS_DIR QString::fromUtf8 (TRANSLATIONS_DIR) << #endif (applicationDirPath () + QLatin1String ("/translations")); const QStringList appQmDirs = QStringList () << #ifdef TRANSLATIONS_DIR QString::fromUtf8 (TRANSLATIONS_DIR) << #endif (applicationDirPath () + QLatin1String ("/translations")); QString localeName = QLocale ().name (); if (!loadTranslation (myAppTranslator, MY_CONFIG_NAME, localeName, appQmDirs)) { localeName = QLatin1String ("en"); loadTranslation (myAppTranslator, MY_CONFIG_NAME, localeName, appQmDirs); } if (loadTranslation (myQtTranslator, QLatin1String ("qt"), localeName, qtQmDirs)) installTranslator (&myQtTranslator); installTranslator (&myAppTranslator); } void Application::quitLater () { QTimer::singleShot (0, this, SLOT (quit ())); } /* these functions are for popping up desktop notifications */ void Application::onTorrentsAdded (const QSet& torrents) { if (!myPrefs->getBool (Prefs::SHOW_NOTIFICATION_ON_ADD)) return; for (const int id: torrents) { Torrent * tor = myModel->getTorrentFromId (id); if (tor->name ().isEmpty ()) // wait until the torrent's INFO fields are loaded { connect (tor, SIGNAL (torrentChanged (int)), this, SLOT (onNewTorrentChanged (int))); } else { onNewTorrentChanged (id); if (!tor->isSeed ()) connect (tor, SIGNAL (torrentCompleted (int)), this, SLOT (onTorrentCompleted (int))); } } } void Application::onTorrentCompleted (int id) { Torrent * tor = myModel->getTorrentFromId (id); if (tor) { if (myPrefs->getBool (Prefs::SHOW_NOTIFICATION_ON_COMPLETE)) notifyApp (tr ("Torrent Completed"), tor->name ()); if (myPrefs->getBool (Prefs::COMPLETE_SOUND_ENABLED)) { #if defined (Q_OS_WIN) || defined (Q_OS_MAC) beep (); #else QProcess::execute (myPrefs->getString (Prefs::COMPLETE_SOUND_COMMAND)); #endif } disconnect (tor, SIGNAL (torrentCompleted (int)), this, SLOT (onTorrentCompleted (int))); } } void Application::onNewTorrentChanged (int id) { Torrent * tor = myModel->getTorrentFromId (id); if (tor && !tor->name ().isEmpty ()) { const int age_secs = tor->dateAdded ().secsTo (QDateTime::currentDateTime ()); if (age_secs < 30) notifyApp (tr ("Torrent Added"), tor->name ()); disconnect (tor, SIGNAL (torrentChanged (int)), this, SLOT (onNewTorrentChanged (int))); if (!tor->isSeed ()) connect (tor, SIGNAL (torrentCompleted (int)), this, SLOT (onTorrentCompleted (int))); } } /*** **** ***/ void Application::consentGiven (int result) { if (result == QMessageBox::Ok) myPrefs->set (Prefs::USER_HAS_GIVEN_INFORMED_CONSENT, true); else quit (); } Application::~Application () { if (myPrefs != nullptr && myWindow != nullptr) { const QRect mainwinRect (myWindow->geometry ()); myPrefs->set (Prefs::MAIN_WINDOW_HEIGHT, std::max (100, mainwinRect.height ())); myPrefs->set (Prefs::MAIN_WINDOW_WIDTH, std::max (100, mainwinRect.width ())); myPrefs->set (Prefs::MAIN_WINDOW_X, mainwinRect.x ()); myPrefs->set (Prefs::MAIN_WINDOW_Y, mainwinRect.y ()); } delete myWatchDir; delete myWindow; delete myModel; delete mySession; delete myPrefs; } /*** **** ***/ void Application::refreshPref (int key) { switch (key) { case Prefs::BLOCKLIST_UPDATES_ENABLED: maybeUpdateBlocklist (); break; case Prefs::DIR_WATCH: case Prefs::DIR_WATCH_ENABLED: { const QString path (myPrefs->getString (Prefs::DIR_WATCH)); const bool isEnabled (myPrefs->getBool (Prefs::DIR_WATCH_ENABLED)); myWatchDir->setPath (path, isEnabled); break; } default: break; } } void Application::maybeUpdateBlocklist () { if (!myPrefs->getBool (Prefs::BLOCKLIST_UPDATES_ENABLED)) return; const QDateTime lastUpdatedAt = myPrefs->getDateTime (Prefs::BLOCKLIST_DATE); const QDateTime nextUpdateAt = lastUpdatedAt.addDays (7); const QDateTime now = QDateTime::currentDateTime (); if (now < nextUpdateAt) { mySession->updateBlocklist (); myPrefs->set (Prefs::BLOCKLIST_DATE, now); } } void Application::onSessionSourceChanged () { mySession->initTorrents (); mySession->refreshSessionStats (); mySession->refreshSessionInfo (); } void Application::refreshTorrents () { // usually we just poll the torrents that have shown recent activity, // but we also periodically ask for updates on the others to ensure // nothing's falling through the cracks. const time_t now = time (NULL); if (myLastFullUpdateTime + 60 >= now) { mySession->refreshActiveTorrents (); } else { myLastFullUpdateTime = now; mySession->refreshAllTorrents (); } } /*** **** ***/ void Application::addTorrent (const QString& key) { const AddData addme (key); if (addme.type != addme.NONE) addTorrent (addme); } void Application::addTorrent (const AddData& addme) { if (!myPrefs->getBool (Prefs::OPTIONS_PROMPT)) { mySession->addTorrent (addme); } else { OptionsDialog * o = new OptionsDialog (*mySession, *myPrefs, addme, myWindow); o->show (); } raise (); } /*** **** ***/ void Application::raise () { alert (myWindow); } bool Application::notifyApp (const QString& title, const QString& body) const { #ifdef QT_DBUS_LIB const QLatin1String dbusServiceName ("org.freedesktop.Notifications"); const QLatin1String dbusInterfaceName ("org.freedesktop.Notifications"); const QLatin1String dbusPath ("/org/freedesktop/Notifications"); QDBusConnection bus = QDBusConnection::sessionBus (); if (bus.isConnected ()) { QDBusMessage m = QDBusMessage::createMethodCall (dbusServiceName, dbusPath, dbusInterfaceName, QLatin1String ("Notify")); QVariantList args; args.append (QLatin1String ("Transmission")); // app_name args.append (0U); // replaces_id args.append (QLatin1String ("transmission")); // icon args.append (title); // summary args.append (body); // body args.append (QStringList ()); // actions - unused for plain passive popups args.append (QVariantMap ()); // hints - unused atm args.append (static_cast (-1)); // use the default timeout period m.setArguments (args); const QDBusReply replyMsg = bus.call (m); if (replyMsg.isValid () && replyMsg.value () > 0) return true; } #endif myWindow->trayIcon ().showMessage (title, body); return true; } FaviconCache& Application::faviconCache () { return myFavicons; } /*** **** ***/ int tr_main (int argc, char * argv[]) { InteropHelper::initialize (); Application app (argc, argv); return app.exec (); } transmission-2.92/qt/PaxHeaders.4960/FreeSpaceLabel.cc0000644000000000000000000000013212536126416017414 xustar0030 mtime=1433971982.556590295 30 atime=1433971982.556590295 30 ctime=1457295917.244761052 transmission-2.92/qt/FreeSpaceLabel.cc0000644000175000017500000000432312536126416021043 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FreeSpaceLabel.cc 14537 2015-06-10 21:27:11Z mikedld $ */ #include #include #include #include "Formatter.h" #include "FreeSpaceLabel.h" #include "Session.h" namespace { static const int INTERVAL_MSEC = 15000; } FreeSpaceLabel::FreeSpaceLabel (QWidget * parent): QLabel (parent), mySession (nullptr), myTag (-1), myTimer (this) { myTimer.setSingleShot (true); myTimer.setInterval (INTERVAL_MSEC); connect (&myTimer, SIGNAL (timeout ()), this, SLOT (onTimer ())); } void FreeSpaceLabel::setSession (Session& session) { if (mySession == &session) return; if (mySession != nullptr) disconnect (mySession, nullptr, this, nullptr); mySession = &session; connect (mySession, SIGNAL (executed (int64_t, QString, tr_variant *)), this, SLOT (onSessionExecuted (int64_t, QString, tr_variant *))); onTimer (); } void FreeSpaceLabel::setPath (const QString& path) { if (myPath != path) { setText (tr("Calculating Free Space...")); myPath = path; onTimer (); } } void FreeSpaceLabel::onTimer () { myTimer.stop (); if (mySession == nullptr || myPath.isEmpty ()) return; tr_variant args; tr_variantInitDict (&args, 1); tr_variantDictAddStr (&args, TR_KEY_path, myPath.toUtf8 ().constData()); myTag = mySession->getUniqueTag (); mySession->exec ("free-space", &args, myTag); } void FreeSpaceLabel::onSessionExecuted (int64_t tag, const QString& result, tr_variant * arguments) { Q_UNUSED (result); if (tag != myTag) return; QString str; // update the label int64_t bytes = -1; if (tr_variantDictFindInt (arguments, TR_KEY_size_bytes, &bytes) && bytes >= 0) setText (tr("%1 free").arg(Formatter::sizeToString (bytes))); else setText (QString ()); // update the tooltip size_t len = 0; const char * path = 0; tr_variantDictFindStr (arguments, TR_KEY_path, &path, &len); str = QString::fromUtf8 (path, len); setToolTip (QDir::toNativeSeparators (str)); myTimer.start (); } transmission-2.92/qt/PaxHeaders.4960/FilterBar.h0000644000000000000000000000013212613027544016331 xustar0030 mtime=1445736292.787076258 30 atime=1445736292.787076258 30 ctime=1457295917.241761001 transmission-2.92/qt/FilterBar.h0000644000175000017500000000273012613027544017760 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FilterBar.h 14590 2015-10-24 20:56:45Z mikedld $ */ #ifndef QTR_FILTER_BAR_H #define QTR_FILTER_BAR_H #include class QLabel; class QStandardItemModel; class QTimer; class FilterBarComboBox; class FilterBarLineEdit; class Prefs; class TorrentFilter; class TorrentModel; class FilterBar: public QWidget { Q_OBJECT public: FilterBar (Prefs& prefs, const TorrentModel& torrents, const TorrentFilter& filter, QWidget * parent = nullptr); virtual ~FilterBar (); public slots: void clear (); private: FilterBarComboBox * createTrackerCombo (QStandardItemModel *); FilterBarComboBox * createActivityCombo (); void refreshTrackers (); QString getCountString (int n) const; private slots: void recountSoon (); void recount (); void refreshPref (int key); void onActivityIndexChanged (int index); void onTrackerIndexChanged (int index); void onTextChanged (const QString&); private: Prefs& myPrefs; const TorrentModel& myTorrents; const TorrentFilter& myFilter; FilterBarComboBox * myActivityCombo; FilterBarComboBox * myTrackerCombo; QLabel * myCountLabel; QStandardItemModel * myTrackerModel; QTimer * myRecountTimer; bool myIsBootstrapping; FilterBarLineEdit * myLineEdit; }; #endif // QTR_FILTER_BAR_H transmission-2.92/qt/PaxHeaders.4960/Prefs.cc0000644000000000000000000000013212557166437015710 xustar0030 mtime=1438444831.677384652 30 atime=1438444831.677384652 30 ctime=1457295917.240760984 transmission-2.92/qt/Prefs.cc0000644000175000017500000003513312557166437017342 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: Prefs.cc 14554 2015-07-30 06:55:28Z mikedld $ */ #include #include #include #include #include #include #include #include #include "CustomVariantType.h" #include "Prefs.h" #include "Utils.h" /*** **** ***/ Prefs::PrefItem Prefs::myItems[] = { /* gui settings */ { OPTIONS_PROMPT, TR_KEY_show_options_window, QVariant::Bool }, { OPEN_DIALOG_FOLDER, TR_KEY_open_dialog_dir, QVariant::String }, { INHIBIT_HIBERNATION, TR_KEY_inhibit_desktop_hibernation, QVariant::Bool }, { DIR_WATCH, TR_KEY_watch_dir, QVariant::String }, { DIR_WATCH_ENABLED, TR_KEY_watch_dir_enabled, QVariant::Bool }, { SHOW_TRAY_ICON, TR_KEY_show_notification_area_icon, QVariant::Bool }, { START_MINIMIZED, TR_KEY_start_minimized, QVariant::Bool }, { SHOW_NOTIFICATION_ON_ADD, TR_KEY_torrent_added_notification_enabled, QVariant::Bool }, { SHOW_NOTIFICATION_ON_COMPLETE, TR_KEY_torrent_complete_notification_enabled, QVariant::Bool }, { ASKQUIT, TR_KEY_prompt_before_exit, QVariant::Bool }, { SORT_MODE, TR_KEY_sort_mode, CustomVariantType::SortModeType }, { SORT_REVERSED, TR_KEY_sort_reversed, QVariant::Bool }, { COMPACT_VIEW, TR_KEY_compact_view, QVariant::Bool }, { FILTERBAR, TR_KEY_show_filterbar, QVariant::Bool }, { STATUSBAR, TR_KEY_show_statusbar, QVariant::Bool }, { STATUSBAR_STATS, TR_KEY_statusbar_stats, QVariant::String }, { SHOW_TRACKER_SCRAPES, TR_KEY_show_extra_peer_details, QVariant::Bool }, { SHOW_BACKUP_TRACKERS, TR_KEY_show_backup_trackers, QVariant::Bool }, { TOOLBAR, TR_KEY_show_toolbar , QVariant::Bool }, { BLOCKLIST_DATE, TR_KEY_blocklist_date, QVariant::DateTime }, { BLOCKLIST_UPDATES_ENABLED, TR_KEY_blocklist_updates_enabled , QVariant::Bool }, { MAIN_WINDOW_LAYOUT_ORDER, TR_KEY_main_window_layout_order, QVariant::String }, { MAIN_WINDOW_HEIGHT, TR_KEY_main_window_height, QVariant::Int }, { MAIN_WINDOW_WIDTH, TR_KEY_main_window_width, QVariant::Int }, { MAIN_WINDOW_X, TR_KEY_main_window_x, QVariant::Int }, { MAIN_WINDOW_Y, TR_KEY_main_window_y, QVariant::Int }, { FILTER_MODE, TR_KEY_filter_mode, CustomVariantType::FilterModeType }, { FILTER_TRACKERS, TR_KEY_filter_trackers, QVariant::String }, { FILTER_TEXT, TR_KEY_filter_text, QVariant::String }, { SESSION_IS_REMOTE, TR_KEY_remote_session_enabled, QVariant::Bool }, { SESSION_REMOTE_HOST, TR_KEY_remote_session_host, QVariant::String }, { SESSION_REMOTE_PORT, TR_KEY_remote_session_port, QVariant::Int }, { SESSION_REMOTE_AUTH, TR_KEY_remote_session_requres_authentication, QVariant::Bool }, { SESSION_REMOTE_USERNAME, TR_KEY_remote_session_username, QVariant::String }, { SESSION_REMOTE_PASSWORD, TR_KEY_remote_session_password, QVariant::String }, { COMPLETE_SOUND_COMMAND, TR_KEY_torrent_complete_sound_command, QVariant::String }, { COMPLETE_SOUND_ENABLED, TR_KEY_torrent_complete_sound_enabled, QVariant::Bool }, { USER_HAS_GIVEN_INFORMED_CONSENT, TR_KEY_user_has_given_informed_consent, QVariant::Bool }, /* libtransmission settings */ { ALT_SPEED_LIMIT_UP, TR_KEY_alt_speed_up, QVariant::Int }, { ALT_SPEED_LIMIT_DOWN, TR_KEY_alt_speed_down, QVariant::Int }, { ALT_SPEED_LIMIT_ENABLED, TR_KEY_alt_speed_enabled, QVariant::Bool }, { ALT_SPEED_LIMIT_TIME_BEGIN, TR_KEY_alt_speed_time_begin, QVariant::Int }, { ALT_SPEED_LIMIT_TIME_END, TR_KEY_alt_speed_time_end, QVariant::Int }, { ALT_SPEED_LIMIT_TIME_ENABLED, TR_KEY_alt_speed_time_enabled, QVariant::Bool }, { ALT_SPEED_LIMIT_TIME_DAY, TR_KEY_alt_speed_time_day, QVariant::Int }, { BLOCKLIST_ENABLED, TR_KEY_blocklist_enabled, QVariant::Bool }, { BLOCKLIST_URL, TR_KEY_blocklist_url, QVariant::String }, { DSPEED, TR_KEY_speed_limit_down, QVariant::Int }, { DSPEED_ENABLED, TR_KEY_speed_limit_down_enabled, QVariant::Bool }, { DOWNLOAD_DIR, TR_KEY_download_dir, QVariant::String }, { DOWNLOAD_QUEUE_ENABLED, TR_KEY_download_queue_enabled, QVariant::Bool }, { DOWNLOAD_QUEUE_SIZE, TR_KEY_download_queue_size, QVariant::Int }, { ENCRYPTION, TR_KEY_encryption, QVariant::Int }, { IDLE_LIMIT, TR_KEY_idle_seeding_limit, QVariant::Int }, { IDLE_LIMIT_ENABLED, TR_KEY_idle_seeding_limit_enabled, QVariant::Bool }, { INCOMPLETE_DIR, TR_KEY_incomplete_dir, QVariant::String }, { INCOMPLETE_DIR_ENABLED, TR_KEY_incomplete_dir_enabled, QVariant::Bool }, { MSGLEVEL, TR_KEY_message_level, QVariant::Int }, { PEER_LIMIT_GLOBAL, TR_KEY_peer_limit_global, QVariant::Int }, { PEER_LIMIT_TORRENT, TR_KEY_peer_limit_per_torrent, QVariant::Int }, { PEER_PORT, TR_KEY_peer_port, QVariant::Int }, { PEER_PORT_RANDOM_ON_START, TR_KEY_peer_port_random_on_start, QVariant::Bool }, { PEER_PORT_RANDOM_LOW, TR_KEY_peer_port_random_low, QVariant::Int }, { PEER_PORT_RANDOM_HIGH, TR_KEY_peer_port_random_high, QVariant::Int }, { QUEUE_STALLED_MINUTES, TR_KEY_queue_stalled_minutes, QVariant::Int }, { SCRIPT_TORRENT_DONE_ENABLED, TR_KEY_script_torrent_done_enabled, QVariant::Bool }, { SCRIPT_TORRENT_DONE_FILENAME, TR_KEY_script_torrent_done_filename, QVariant::String }, { SOCKET_TOS, TR_KEY_peer_socket_tos, QVariant::Int }, { START, TR_KEY_start_added_torrents, QVariant::Bool }, { TRASH_ORIGINAL, TR_KEY_trash_original_torrent_files, QVariant::Bool }, { PEX_ENABLED, TR_KEY_pex_enabled, QVariant::Bool }, { DHT_ENABLED, TR_KEY_dht_enabled, QVariant::Bool }, { UTP_ENABLED, TR_KEY_utp_enabled, QVariant::Bool }, { LPD_ENABLED, TR_KEY_lpd_enabled, QVariant::Bool }, { PORT_FORWARDING, TR_KEY_port_forwarding_enabled, QVariant::Bool }, { PREALLOCATION, TR_KEY_preallocation, QVariant::Int }, { RATIO, TR_KEY_ratio_limit, QVariant::Double }, { RATIO_ENABLED, TR_KEY_ratio_limit_enabled, QVariant::Bool }, { RENAME_PARTIAL_FILES, TR_KEY_rename_partial_files, QVariant::Bool }, { RPC_AUTH_REQUIRED, TR_KEY_rpc_authentication_required, QVariant::Bool }, { RPC_ENABLED, TR_KEY_rpc_enabled, QVariant::Bool }, { RPC_PASSWORD, TR_KEY_rpc_password, QVariant::String }, { RPC_PORT, TR_KEY_rpc_port, QVariant::Int }, { RPC_USERNAME, TR_KEY_rpc_username, QVariant::String }, { RPC_WHITELIST_ENABLED, TR_KEY_rpc_whitelist_enabled, QVariant::Bool }, { RPC_WHITELIST, TR_KEY_rpc_whitelist, QVariant::String }, { USPEED_ENABLED, TR_KEY_speed_limit_up_enabled, QVariant::Bool }, { USPEED, TR_KEY_speed_limit_up, QVariant::Int }, { UPLOAD_SLOTS_PER_TORRENT, TR_KEY_upload_slots_per_torrent, QVariant::Int } }; /*** **** ***/ Prefs::Prefs (const QString& configDir): myConfigDir (configDir) { assert (sizeof(myItems) / sizeof(myItems[0]) == PREFS_COUNT); #ifndef NDEBUG for (int i=0; i (intVal)); break; case CustomVariantType::SortModeType: if (tr_variantGetStr (b, &str, NULL)) myValues[i] = QVariant::fromValue (SortMode (QString::fromUtf8 (str))); break; case CustomVariantType::FilterModeType: if (tr_variantGetStr (b, &str, NULL)) myValues[i] = QVariant::fromValue (FilterMode (QString::fromUtf8 (str))); break; case QVariant::String: if (tr_variantGetStr (b, &str, &strLen)) myValues[i].setValue (QString::fromUtf8 (str, strLen)); break; case QVariant::Bool: if (tr_variantGetBool (b, &boolVal)) myValues[i].setValue (static_cast (boolVal)); break; case QVariant::Double: if (tr_variantGetReal (b, &d)) myValues[i].setValue (d); break; case QVariant::DateTime: if (tr_variantGetInt (b, &intVal)) myValues[i].setValue (QDateTime::fromTime_t (intVal)); break; default: assert ("unhandled type" && 0); break; } } tr_variantFree (&top); } Prefs::~Prefs () { // make a dict from settings.json tr_variant current_settings; tr_variantInitDict (¤t_settings, PREFS_COUNT); for (int i=0; i().name().toUtf8().constData()); break; case CustomVariantType::FilterModeType: tr_variantDictAddStr (¤t_settings, key, val.value().name().toUtf8().constData()); break; case QVariant::String: { const QByteArray ba (val.toByteArray()); const char * s = ba.constData(); if (Utils::isValidUtf8 (s)) tr_variantDictAddStr (¤t_settings, key, s); else tr_variantDictAddStr (¤t_settings, key, val.toString().toUtf8().constData()); } break; case QVariant::Bool: tr_variantDictAddBool (¤t_settings, key, val.toBool()); break; case QVariant::Double: tr_variantDictAddReal (¤t_settings, key, val.toDouble()); break; case QVariant::DateTime: tr_variantDictAddInt (¤t_settings, key, val.toDateTime().toTime_t()); break; default: assert ("unhandled type" && 0); break; } } // update settings.json with our settings tr_variant file_settings; const QFile file (QDir(myConfigDir).absoluteFilePath(QLatin1String ("settings.json"))); if (!tr_variantFromFile (&file_settings, TR_VARIANT_FMT_JSON, file.fileName().toUtf8().constData(), NULL)) tr_variantInitDict (&file_settings, PREFS_COUNT); tr_variantMergeDicts (&file_settings, ¤t_settings); tr_variantToFile (&file_settings, TR_VARIANT_FMT_JSON, file.fileName().toUtf8().constData()); tr_variantFree (&file_settings); // cleanup tr_variantFree (¤t_settings); } /** * This is where we initialize the preferences file with the default values. * If you add a new preferences key, you /must/ add a default value here. */ void Prefs::initDefaults (tr_variant * d) { tr_variantDictReserve (d, 38); tr_variantDictAddBool (d, TR_KEY_blocklist_updates_enabled, true); tr_variantDictAddBool (d, TR_KEY_compact_view, false); tr_variantDictAddBool (d, TR_KEY_inhibit_desktop_hibernation, false); tr_variantDictAddBool (d, TR_KEY_prompt_before_exit, true); tr_variantDictAddBool (d, TR_KEY_remote_session_enabled, false); tr_variantDictAddBool (d, TR_KEY_remote_session_requres_authentication, false); tr_variantDictAddBool (d, TR_KEY_show_backup_trackers, false); tr_variantDictAddBool (d, TR_KEY_show_extra_peer_details, false), tr_variantDictAddBool (d, TR_KEY_show_filterbar, true); tr_variantDictAddBool (d, TR_KEY_show_notification_area_icon, false); tr_variantDictAddBool (d, TR_KEY_start_minimized, false); tr_variantDictAddBool (d, TR_KEY_show_options_window, true); tr_variantDictAddBool (d, TR_KEY_show_statusbar, true); tr_variantDictAddBool (d, TR_KEY_show_toolbar, true); tr_variantDictAddBool (d, TR_KEY_show_tracker_scrapes, false); tr_variantDictAddBool (d, TR_KEY_sort_reversed, false); tr_variantDictAddBool (d, TR_KEY_torrent_added_notification_enabled, true); tr_variantDictAddBool (d, TR_KEY_torrent_complete_notification_enabled, true); tr_variantDictAddStr (d, TR_KEY_torrent_complete_sound_command, "canberra-gtk-play -i complete-download -d 'transmission torrent downloaded'"); tr_variantDictAddBool (d, TR_KEY_torrent_complete_sound_enabled, true); tr_variantDictAddBool (d, TR_KEY_user_has_given_informed_consent, false); tr_variantDictAddBool (d, TR_KEY_watch_dir_enabled, false); tr_variantDictAddInt (d, TR_KEY_blocklist_date, 0); tr_variantDictAddInt (d, TR_KEY_main_window_height, 500); tr_variantDictAddInt (d, TR_KEY_main_window_width, 300); tr_variantDictAddInt (d, TR_KEY_main_window_x, 50); tr_variantDictAddInt (d, TR_KEY_main_window_y, 50); tr_variantDictAddInt (d, TR_KEY_remote_session_port, atoi(TR_DEFAULT_RPC_PORT_STR)); tr_variantDictAddStr (d, TR_KEY_download_dir, tr_getDefaultDownloadDir()); tr_variantDictAddStr (d, TR_KEY_filter_mode, "all"); tr_variantDictAddStr (d, TR_KEY_main_window_layout_order, "menu,toolbar,filter,list,statusbar"); tr_variantDictAddStr (d, TR_KEY_open_dialog_dir, QDir::home().absolutePath().toUtf8()); tr_variantDictAddStr (d, TR_KEY_remote_session_host, "localhost"); tr_variantDictAddStr (d, TR_KEY_remote_session_password, ""); tr_variantDictAddStr (d, TR_KEY_remote_session_username, ""); tr_variantDictAddStr (d, TR_KEY_sort_mode, "sort-by-name"); tr_variantDictAddStr (d, TR_KEY_statusbar_stats, "total-ratio"); tr_variantDictAddStr (d, TR_KEY_watch_dir, tr_getDefaultDownloadDir()); } /*** **** ***/ bool Prefs::getBool (int key) const { assert (myItems[key].type == QVariant::Bool); return myValues[key].toBool(); } QString Prefs::getString (int key) const { assert (myItems[key].type == QVariant::String); const QByteArray b = myValues[key].toByteArray(); if (Utils::isValidUtf8 (b.constData())) myValues[key].setValue (QString::fromUtf8 (b.constData())); return myValues[key].toString(); } int Prefs::getInt (int key) const { assert (myItems[key].type == QVariant::Int); return myValues[key].toInt(); } double Prefs::getDouble (int key) const { assert (myItems[key].type == QVariant::Double); return myValues[key].toDouble(); } QDateTime Prefs::getDateTime (int key) const { assert (myItems[key].type == QVariant::DateTime); return myValues[key].toDateTime(); } /*** **** ***/ void Prefs::toggleBool (int key) { set (key, !getBool(key)); } transmission-2.92/qt/PaxHeaders.4960/AboutDialog.h0000644000000000000000000000013012571431256016651 xustar0029 mtime=1441149614.42017708 29 atime=1441149614.42017708 30 ctime=1457295917.240760984 transmission-2.92/qt/AboutDialog.h0000644000175000017500000000127712571431256020307 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: AboutDialog.h 14561 2015-09-01 20:19:26Z mikedld $ */ #ifndef QTR_ABOUT_DIALOG_H #define QTR_ABOUT_DIALOG_H #include #include "BaseDialog.h" #include "ui_AboutDialog.h" class LicenseDialog; class AboutDialog: public BaseDialog { Q_OBJECT public: AboutDialog (QWidget * parent = nullptr); virtual ~AboutDialog () {} private slots: void showCredits (); void showLicense (); private: Ui::AboutDialog ui; QPointer myLicenseDialog; }; #endif // QTR_ABOUT_DIALOG_H transmission-2.92/qt/PaxHeaders.4960/MakeDialog.ui0000644000000000000000000000013212536126416016644 xustar0030 mtime=1433971982.526589734 30 atime=1433971982.526589734 30 ctime=1457295917.241761001 transmission-2.92/qt/MakeDialog.ui0000644000175000017500000001441012536126416020271 0ustar00mikedldmikedld00000000000000 MakeDialog 0 0 566 426 true New Torrent font-weight:bold Files 18 Sa&ve to: destinationButton Source f&older: false Source &file: true ... Qt::Vertical QSizePolicy::Fixed 1 10 font-weight:bold Properties 18 &Trackers: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop trackersEdit true QPlainTextEdit::NoWrap To add a backup URL, add it on the line after the primary URL. To add another primary URL, add it after a blank line. Co&mment: false &Private torrent Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Ok PathButton QToolButton
PathButton.h
commentCheck toggled(bool) commentEdit setEnabled(bool) 76 333 360 333 sourceFolderRadio toggled(bool) sourceFolderButton setEnabled(bool) 72 83 360 82 sourceFileRadio toggled(bool) sourceFileButton setEnabled(bool) 72 119 360 118
transmission-2.92/qt/PaxHeaders.4960/DetailsDialog.ui0000644000000000000000000000013212562200461017344 xustar0030 mtime=1439236401.248800025 30 atime=1439236401.248800025 30 ctime=1457295917.237760933 transmission-2.92/qt/DetailsDialog.ui0000644000175000017500000007374612562200461021012 0ustar00mikedldmikedld00000000000000 DetailsDialog 0 0 505 581 Torrent Properties 0 Qt::ElideNone false Information font-weight:bold Activity 18 Have: 0 0 ... Qt::PlainText Qt::NoTextInteraction Availability: 0 0 ... Qt::PlainText Qt::NoTextInteraction Uploaded: 0 0 ... Qt::PlainText Qt::NoTextInteraction Downloaded: 0 0 ... Qt::PlainText Qt::NoTextInteraction State: 0 0 ... Qt::PlainText Qt::NoTextInteraction Running time: 0 0 ... Qt::PlainText Qt::NoTextInteraction Remaining time: 0 0 ... Qt::PlainText Qt::NoTextInteraction Last activity: 0 0 ... Qt::PlainText Qt::NoTextInteraction Error: 0 0 ... Qt::PlainText Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse Qt::Vertical QSizePolicy::Fixed 1 10 font-weight:bold Details 18 0 0 ... Qt::PlainText Qt::NoTextInteraction 0 0 ... Qt::PlainText Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse Hash: Privacy: Origin: 0 0 ... Qt::PlainText Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse 0 0 ... Qt::PlainText Qt::NoTextInteraction Size: Location: 0 0 ... Qt::PlainText Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse Comment: commentBrowser Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse Peers true QAbstractItemView::ScrollPerPixel false true true 0 true Tracker Qt::ScrollBarAlwaysOff true QAbstractItemView::ExtendedSelection QAbstractItemView::ScrollPerPixel Add Tracker Qt::ToolButtonIconOnly Edit Tracker Qt::ToolButtonIconOnly Remove Trackers Qt::ToolButtonIconOnly Qt::Vertical 1 1 Show &more details Show &backup trackers Files Qt::ScrollBarAlwaysOff QAbstractItemView::EditKeyPressed true QAbstractItemView::ExtendedSelection QAbstractItemView::ScrollPerPixel true true Options font-weight:bold Speed 18 Honor global &limits Limit &download speed: false 999999999 5 Limit &upload speed: false 999999999 5 Torrent &priority: bandwidthPriorityCombo Qt::Vertical QSizePolicy::Fixed 1 10 font-weight:bold Seeding Limits 18 &Ratio: ratioCombo 999999999.000000000000000 0.500000000000000 18 &Idle: idleCombo minute(s) 1 9999 5 Qt::Vertical QSizePolicy::Fixed 1 10 font-weight:bold Peer Connections 18 &Maximum peers: peerLimitSpin 1 300 5 Qt::Vertical 1 1 Qt::Horizontal QDialogButtonBox::Close SqueezeLabel QLabel
SqueezeLabel.h
FileTreeView QTreeView
FileTreeView.h
dialogButtons accepted() DetailsDialog accept() 26 563 20 20 dialogButtons rejected() DetailsDialog reject() 26 563 20 20 singleDownCheck toggled(bool) singleDownSpin setEnabled(bool) 35 99 247 93 singleUpCheck toggled(bool) singleUpSpin setEnabled(bool) 35 131 247 125
transmission-2.92/qt/PaxHeaders.4960/StatsDialog.h0000644000000000000000000000013212571431256016677 xustar0030 mtime=1441149614.413176955 30 atime=1441149614.413176955 30 ctime=1457295917.240760984 transmission-2.92/qt/StatsDialog.h0000644000175000017500000000133012571431256020321 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: StatsDialog.h 14561 2015-09-01 20:19:26Z mikedld $ */ #ifndef QTR_STATS_DIALOG_H #define QTR_STATS_DIALOG_H #include "BaseDialog.h" #include "ui_StatsDialog.h" class QTimer; class Session; class StatsDialog: public BaseDialog { Q_OBJECT public: StatsDialog (Session&, QWidget * parent = nullptr); ~StatsDialog (); // QWidget virtual void setVisible (bool visible); private slots: void updateStats (); private: Session& mySession; Ui::StatsDialog ui; QTimer * myTimer; }; #endif // QTR_STATS_DIALOG_H transmission-2.92/qt/PaxHeaders.4960/TorrentDelegateMin.h0000644000000000000000000000013012537301461020207 xustar0029 mtime=1434288945.16441911 29 atime=1434288945.16441911 30 ctime=1457295917.244761052 transmission-2.92/qt/TorrentDelegateMin.h0000644000175000017500000000144612537301461021643 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: TorrentDelegateMin.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_TORRENT_DELEGATE_MIN_H #define QTR_TORRENT_DELEGATE_MIN_H #include "TorrentDelegate.h" class TorrentDelegateMin: public TorrentDelegate { Q_OBJECT public: explicit TorrentDelegateMin (QObject * parent = nullptr): TorrentDelegate (parent) {} virtual ~TorrentDelegateMin () {} protected: // TorrentDelegate virtual QSize sizeHint (const QStyleOptionViewItem&, const Torrent&) const; virtual void drawTorrent (QPainter * painter, const QStyleOptionViewItem& option, const Torrent&) const; }; #endif // QTR_TORRENT_DELEGATE_MIN_H transmission-2.92/qt/PaxHeaders.4960/ComInteropHelper.h0000644000000000000000000000013212634376710017703 xustar0030 mtime=1450311112.717085633 30 atime=1450311112.717085633 30 ctime=1457295917.244761052 transmission-2.92/qt/ComInteropHelper.h0000644000175000017500000000132412634376710021330 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: ComInteropHelper.h 14624 2015-12-16 20:01:03Z mikedld $ */ #ifndef QTR_COM_INTEROP_HELPER_H #define QTR_COM_INTEROP_HELPER_H #include class QAxObject; class QObject; class QString; class QVariant; class ComInteropHelper { public: ComInteropHelper (); ~ComInteropHelper (); bool isConnected () const; QVariant addMetainfo (const QString& metainfo); static void initialize (); static void registerObject (QObject * parent); private: std::unique_ptr m_client; }; #endif // QTR_COM_INTEROP_HELPER_H transmission-2.92/qt/PaxHeaders.4960/WatchDir.h0000644000000000000000000000013212537301461016162 xustar0030 mtime=1434288945.182419426 30 atime=1434288945.182419426 30 ctime=1457295917.244761052 transmission-2.92/qt/WatchDir.h0000644000175000017500000000201412537301461017604 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: WatchDir.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_WATCH_DIR_H #define QTR_WATCH_DIR_H #include #include #include class QFileSystemWatcher; class TorrentModel; class WatchDir: public QObject { Q_OBJECT public: WatchDir (const TorrentModel&); virtual ~WatchDir (); void setPath (const QString& path, bool isEnabled); signals: void torrentFileAdded (const QString& filename); private: enum { OK, DUPLICATE, ERROR }; private: int metainfoTest (const QString& filename) const; private slots: void watcherActivated (const QString& path); void onTimeout (); void rescanAllWatchedDirectories (); private: const TorrentModel& myModel; QSet myWatchDirFiles; QFileSystemWatcher * myWatcher; }; #endif // QTR_WATCH_DIR_H transmission-2.92/qt/PaxHeaders.4960/qtr.pro0000644000000000000000000000013212640354044015634 xustar0030 mtime=1451350052.464150631 30 atime=1451350052.464150631 30 ctime=1457295917.240760984 transmission-2.92/qt/qtr.pro0000644000175000017500000000713412640354044017266 0ustar00mikedldmikedld00000000000000TARGET = transmission-qt NAME = "Transmission" DESCRIPTION = "Transmission: a fast, easy, and free BitTorrent client" VERSION = 2.81 LICENSE = "GPL" target.path = /bin INSTALLS += target unix: INSTALLS += man man.path = /share/man/man1/ man.files = transmission-qt.1 CONFIG += qt thread debug link_pkgconfig c++11 warn_on QT += network dbus PKGCONFIG = fontconfig libcurl openssl libevent greaterThan(QT_MAJOR_VERSION, 4) { QT += widgets } DEFINES += QT_NO_CAST_FROM_ASCII ENABLE_DBUS_INTEROP win32:DEFINES += QT_DBUS TRANSMISSION_TOP = .. include(config.pri) INCLUDEPATH = $${EVENT_TOP}/include $${INCLUDEPATH} INCLUDEPATH += $${TRANSMISSION_TOP} LIBS += $${TRANSMISSION_TOP}/libtransmission/libtransmission.a LIBS += $${LIBUTP_LIBS} LIBS += $${DHT_LIBS} LIBS += $${LIBB64_LIBS} LIBS += $${LIBUPNP_LIBS} LIBS += $${LIBNATPMP_LIBS} unix: LIBS += -L$${EVENT_TOP}/lib -lz -lrt win32:LIBS += -levent-2.0 -lws2_32 -lintl win32:LIBS += -lidn -liconv -lwldap32 -liphlpapi lessThan(QT_MAJOR_VERSION, 5) : *-g++* | *-clang* : QMAKE_CXXFLAGS += -std=gnu++11 TRANSLATIONS += translations/transmission_de.ts \ translations/transmission_en.ts \ translations/transmission_es.ts \ translations/transmission_eu.ts \ translations/transmission_fr.ts \ translations/transmission_hu.ts \ translations/transmission_id.ts \ translations/transmission_it_IT.ts \ translations/transmission_kk.ts \ translations/transmission_ko.ts \ translations/transmission_lt.ts \ translations/transmission_pl_PL.ts \ translations/transmission_pt_BR.ts \ translations/transmission_ru.ts \ translations/transmission_uk.ts \ translations/transmission_zh_CN.ts FORMS += AboutDialog.ui \ DetailsDialog.ui \ LicenseDialog.ui \ MainWindow.ui \ MakeDialog.ui \ MakeProgressDialog.ui \ OptionsDialog.ui \ PrefsDialog.ui \ RelocateDialog.ui \ SessionDialog.ui \ StatsDialog.ui RESOURCES += application.qrc win32|macx:RESOURCES += icons/Faenza/Faenza.qrc SOURCES += AboutDialog.cc \ AddData.cc \ Application.cc \ ColumnResizer.cc \ DBusInteropHelper.cc \ DetailsDialog.cc \ FaviconCache.cc \ FileTreeDelegate.cc \ FileTreeItem.cc \ FileTreeModel.cc \ FileTreeView.cc \ FilterBar.cc \ FilterBarComboBox.cc \ FilterBarComboBoxDelegate.cc \ FilterBarLineEdit.cc \ Filters.cc \ Formatter.cc \ FreeSpaceLabel.cc \ IconToolButton.cc \ InteropHelper.cc \ InteropObject.cc \ LicenseDialog.cc \ MainWindow.cc \ MakeDialog.cc \ OptionsDialog.cc \ PathButton.cc \ Prefs.cc \ PrefsDialog.cc \ RelocateDialog.cc \ RpcClient.cc \ Session.cc \ SessionDialog.cc \ SqueezeLabel.cc \ StatsDialog.cc \ Torrent.cc \ TorrentDelegate.cc \ TorrentDelegateMin.cc \ TorrentFilter.cc \ TorrentModel.cc \ TorrentView.cc \ TrackerDelegate.cc \ TrackerModel.cc \ TrackerModelFilter.cc \ Utils.cc \ WatchDir.cc HEADERS += $$replace(SOURCES, .cc, .h) HEADERS += BaseDialog.h CustomVariantType.h Speed.h win32:RC_FILE = qtr.rc transmission-2.92/qt/PaxHeaders.4960/TorrentModel.cc0000644000000000000000000000013212557166437017247 xustar0030 mtime=1438444831.673384582 30 atime=1438444831.673384582 30 ctime=1457295917.237760933 transmission-2.92/qt/TorrentModel.cc0000644000175000017500000001361512557166437020702 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: TorrentModel.cc 14554 2015-07-30 06:55:28Z mikedld $ */ #include #include #include #include "Speed.h" #include "Torrent.h" #include "TorrentDelegate.h" #include "TorrentModel.h" void TorrentModel::clear () { beginResetModel (); myIdToRow.clear (); myIdToTorrent.clear (); qDeleteAll (myTorrents); myTorrents.clear (); endResetModel (); } int TorrentModel::rowCount (const QModelIndex& parent) const { Q_UNUSED (parent); return myTorrents.size (); } QVariant TorrentModel::data (const QModelIndex& index, int role) const { QVariant var; const Torrent * t = myTorrents.value (index.row(), 0); if (t != 0) { switch (role) { case Qt::DisplayRole: var.setValue (t->name()); break; case Qt::DecorationRole: var.setValue (t->getMimeTypeIcon()); break; case TorrentRole: var = qVariantFromValue(t); break; default: //std::cerr << "Unhandled role: " << role << std::endl; break; } } return var; } /*** **** ***/ void TorrentModel::addTorrent (Torrent * t) { myIdToTorrent.insert (t->id (), t); myIdToRow.insert (t->id (), myTorrents.size ()); myTorrents.append (t); } TorrentModel::TorrentModel (const Prefs& prefs): myPrefs (prefs) { } TorrentModel::~TorrentModel () { clear (); } /*** **** ***/ Torrent* TorrentModel::getTorrentFromId (int id) { id_to_torrent_t::iterator it (myIdToTorrent.find (id)); return it == myIdToTorrent.end() ? 0 : it.value (); } const Torrent* TorrentModel::getTorrentFromId (int id) const { id_to_torrent_t::const_iterator it (myIdToTorrent.find (id)); return it == myIdToTorrent.end() ? 0 : it.value (); } /*** **** ***/ void TorrentModel::onTorrentChanged (int torrentId) { const int row (myIdToRow.value (torrentId, -1)); if (row >= 0) { QModelIndex qmi (index (row, 0)); emit dataChanged (qmi, qmi); } } void TorrentModel::removeTorrents (tr_variant * torrents) { int i = 0; tr_variant * child; while( (child = tr_variantListChild (torrents, i++))) { int64_t intVal; if (tr_variantGetInt (child, &intVal)) removeTorrent (intVal); } } void TorrentModel::updateTorrents (tr_variant * torrents, bool isCompleteList) { QList newTorrents; QSet oldIds; QSet addIds; QSet newIds; if (isCompleteList) oldIds = getIds (); if (tr_variantIsList (torrents)) { size_t i (0); tr_variant * child; while( (child = tr_variantListChild (torrents, i++))) { int64_t id; if (tr_variantDictFindInt (child, TR_KEY_id, &id)) { newIds.insert (id); Torrent * tor = getTorrentFromId (id); if (tor == 0) { tor = new Torrent (myPrefs, id); tor->update (child); if (!tor->hasMetadata()) tor->setMagnet (true); newTorrents.append (tor); connect (tor, SIGNAL(torrentChanged(int)), this, SLOT(onTorrentChanged(int))); } else { tor->update (child); if (tor->isMagnet() && tor->hasMetadata()) { addIds.insert (tor->id()); tor->setMagnet (false); } } } } } if (!newTorrents.isEmpty ()) { const int oldCount (rowCount ()); const int newCount (oldCount + newTorrents.size ()); QSet ids; beginInsertRows (QModelIndex(), oldCount, newCount - 1); for (Torrent * const tor: newTorrents) { addTorrent (tor); addIds.insert (tor->id ()); } endInsertRows (); } if (!addIds.isEmpty()) emit torrentsAdded (addIds); if (isCompleteList) { QSet removedIds (oldIds); removedIds -= newIds; for (const int id: removedIds) removeTorrent (id); } } void TorrentModel::removeTorrent (int id) { const int row = myIdToRow.value (id, -1); if (row >= 0) { Torrent * tor = myIdToTorrent.value (id, 0); beginRemoveRows (QModelIndex(), row, row); // make the myIdToRow map consistent with list view/model for (auto i = myIdToRow.begin(); i != myIdToRow.end(); ++i) if (i.value() > row) --i.value(); myIdToRow.remove (id); myIdToTorrent.remove (id); myTorrents.remove (myTorrents.indexOf (tor)); endRemoveRows (); delete tor; } } void TorrentModel::getTransferSpeed (Speed & uploadSpeed, size_t & uploadPeerCount, Speed & downloadSpeed, size_t & downloadPeerCount) { Speed upSpeed, downSpeed; size_t upCount=0, downCount=0; for (const Torrent * const tor: myTorrents) { upSpeed += tor->uploadSpeed (); upCount += tor->peersWeAreUploadingTo (); downSpeed += tor->downloadSpeed (); downCount += tor->webseedsWeAreDownloadingFrom(); downCount += tor->peersWeAreDownloadingFrom(); } uploadSpeed = upSpeed; uploadPeerCount = upCount; downloadSpeed = downSpeed; downloadPeerCount = downCount; } QSet TorrentModel::getIds () const { QSet ids; ids.reserve (myTorrents.size()); for (const Torrent * const tor: myTorrents) ids.insert (tor->id()); return ids; } bool TorrentModel::hasTorrent (const QString& hashString) const { for (const Torrent * const tor: myTorrents) if (tor->hashString () == hashString) return true; return false; } transmission-2.92/qt/PaxHeaders.4960/FreeSpaceLabel.h0000644000000000000000000000013012537301461017250 xustar0029 mtime=1434288945.14841883 29 atime=1434288945.14841883 30 ctime=1457295917.244761052 transmission-2.92/qt/FreeSpaceLabel.h0000644000175000017500000000162012537301461020676 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2013-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FreeSpaceLabel.h 14540 2015-06-12 22:41:36Z mikedld $ */ #ifndef QTR_FREE_SPACE_LABEL_H #define QTR_FREE_SPACE_LABEL_H #include #include #include #include class Session; extern "C" { struct tr_variant; } class FreeSpaceLabel: public QLabel { Q_OBJECT public: FreeSpaceLabel (QWidget * parent = nullptr); virtual ~FreeSpaceLabel () {} void setSession (Session& session); void setPath (const QString& folder); private slots: void onSessionExecuted (int64_t tag, const QString& result, tr_variant * arguments); void onTimer (); private: Session * mySession; int64_t myTag; QString myPath; QTimer myTimer; }; #endif // QTR_FREE_SPACE_LABEL_H transmission-2.92/qt/PaxHeaders.4960/MainWindow.h0000644000000000000000000000013212611361001016516 xustar0030 mtime=1445323265.087746369 30 atime=1445323265.087746369 30 ctime=1457295917.240760984 transmission-2.92/qt/MainWindow.h0000644000175000017500000001067212611361001020151 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: MainWindow.h 14582 2015-10-19 20:30:26Z mikedld $ */ #ifndef QTR_MAIN_WINDOW_H #define QTR_MAIN_WINDOW_H #include #include #include #include #include #include #include #include #include "Filters.h" #include "TorrentFilter.h" #include "ui_MainWindow.h" class QAction; class QIcon; class QMenu; class AboutDialog; class AddData; class DetailsDialog; class Prefs; class PrefsDialog; class Session; class SessionDialog; class StatsDialog; class TorrentDelegate; class TorrentDelegateMin; class TorrentModel; extern "C" { struct tr_variant; } class MainWindow: public QMainWindow { Q_OBJECT public: MainWindow (Session&, Prefs&, TorrentModel&, bool minized); virtual ~MainWindow (); QSystemTrayIcon& trayIcon () { return myTrayIcon; } public slots: void startAll (); void startSelected (); void startSelectedNow (); void pauseAll (); void pauseSelected (); void removeSelected (); void deleteSelected (); void verifySelected (); void queueMoveTop (); void queueMoveUp (); void queueMoveDown (); void queueMoveBottom (); void reannounceSelected (); void onNetworkTimer (); void setToolbarVisible (bool); void setFilterbarVisible (bool); void setStatusbarVisible (bool); void setCompactView (bool); void refreshActionSensitivity (); void refreshActionSensitivitySoon (); void wrongAuthentication (); void openSession (); protected: // QWidget virtual void contextMenuEvent (QContextMenuEvent *); virtual void dragEnterEvent (QDragEnterEvent *); virtual void dropEvent (QDropEvent *); private: QIcon getStockIcon (const QString&, int fallback = -1); QSet getSelectedTorrents (bool withMetadataOnly = false) const; void updateNetworkIcon (); QMenu * createOptionsMenu (); QMenu * createStatsModeMenu (); void initStatusBar (); void clearSelection (); void addTorrent (const AddData& addMe, bool showOptions); // QWidget virtual void hideEvent (QHideEvent * event); virtual void showEvent (QShowEvent * event); private slots: void openPreferences (); void refreshTitle (); void refreshStatusBar (); void refreshTrayIcon (); void refreshTrayIconSoon (); void refreshTorrentViewHeader (); void openTorrent (); void openURL (); void newTorrent (); void trayActivated (QSystemTrayIcon::ActivationReason); void refreshPref (int key); void addTorrents (const QStringList& filenames); void removeTorrents (const bool deleteFiles); void openStats (); void openDonate (); void openAbout (); void openHelp (); void openFolder (); void copyMagnetLinkToClipboard (); void setLocation (); void openProperties (); void toggleSpeedMode (); void dataReadProgress (); void dataSendProgress (); void onError (QNetworkReply::NetworkError); void errorMessage (const QString&); void toggleWindows (bool doShow); void onSetPrefs (); void onSetPrefs (bool); void onSessionSourceChanged (); void onModelReset (); void setSortAscendingPref (bool); void onStatsModeChanged (QAction * action); void onSortModeChanged (QAction * action); private: Session& mySession; Prefs& myPrefs; TorrentModel& myModel; Ui_MainWindow ui; time_t myLastFullUpdateTime; QPointer mySessionDialog; QPointer myPrefsDialog; QPointer myAboutDialog; QPointer myStatsDialog; QPointer myDetailsDialog; QSystemTrayIcon myTrayIcon; TorrentFilter myFilterModel; TorrentDelegate * myTorrentDelegate; TorrentDelegateMin * myTorrentDelegateMin; time_t myLastSendTime; time_t myLastReadTime; QTimer myNetworkTimer; bool myNetworkError; QTimer myRefreshTrayIconTimer; QTimer myRefreshActionSensitivityTimer; QAction * myDlimitOffAction; QAction * myDlimitOnAction; QAction * myUlimitOffAction; QAction * myUlimitOnAction; QAction * myRatioOffAction; QAction * myRatioOnAction; QWidgetList myHidden; QWidget * myFilterBar; QAction * myAltSpeedAction; QString myErrorMessage; }; #endif // QTR_MAIN_WINDOW_H transmission-2.92/qt/PaxHeaders.4960/FaviconCache.cc0000644000000000000000000000013212536126416017130 xustar0030 mtime=1433971982.558590332 30 atime=1433971982.558590332 30 ctime=1457295917.244761052 transmission-2.92/qt/FaviconCache.cc0000644000175000017500000000714012536126416020557 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FaviconCache.cc 14537 2015-06-10 21:27:11Z mikedld $ */ #include #include #include #include #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #include #else #include #endif #include "FaviconCache.h" /*** **** ***/ FaviconCache::FaviconCache () { myNAM = new QNetworkAccessManager (); connect (myNAM, SIGNAL(finished(QNetworkReply*)), this, SLOT(onRequestFinished(QNetworkReply*))); } FaviconCache::~FaviconCache () { delete myNAM; } /*** **** ***/ QString FaviconCache::getCacheDir () { const QString base = #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) QDesktopServices::storageLocation (QDesktopServices::CacheLocation); #else QStandardPaths::writableLocation (QStandardPaths::CacheLocation); #endif return QDir(base).absoluteFilePath (QLatin1String ("favicons")); } void FaviconCache::ensureCacheDirHasBeenScanned () { static bool hasBeenScanned = false; if (!hasBeenScanned) { hasBeenScanned = true; QDir cacheDir (getCacheDir ()); cacheDir.mkpath (cacheDir.absolutePath ()); QStringList files = cacheDir.entryList (QDir::Files|QDir::Readable); for (const QString& file: files) { QPixmap pixmap; pixmap.load (cacheDir.absoluteFilePath (file)); if (!pixmap.isNull ()) myPixmaps.insert (file, pixmap); } } } QString FaviconCache::getHost (const QUrl& url) { QString host = url.host (); const int first_dot = host.indexOf (QLatin1Char ('.')); const int last_dot = host.lastIndexOf (QLatin1Char ('.')); if ((first_dot != -1) && (last_dot != -1) && (first_dot != last_dot)) host.remove (0, first_dot + 1); return host; } QSize FaviconCache::getIconSize () { return QSize (16, 16); } QPixmap FaviconCache::find (const QUrl& url) { return findFromHost (getHost (url)); } QPixmap FaviconCache::findFromHost (const QString& host) { ensureCacheDirHasBeenScanned (); const QPixmap pixmap = myPixmaps[host]; const QSize rightSize = getIconSize (); return pixmap.isNull () || pixmap.size () == rightSize ? pixmap : pixmap.scaled (rightSize); } void FaviconCache::add (const QUrl& url) { ensureCacheDirHasBeenScanned (); const QString host = getHost (url); if (!myPixmaps.contains (host)) { // add a placholder s.t. we only ping the server once per session myPixmaps.insert (host, QPixmap ()); // try to download the favicon const QString path = QLatin1String ("http://") + host + QLatin1String ("/favicon."); QStringList suffixes; suffixes << QLatin1String ("ico") << QLatin1String ("png") << QLatin1String ("gif") << QLatin1String ("jpg"); for (const QString& suffix: suffixes) myNAM->get (QNetworkRequest (path + suffix)); } } void FaviconCache::onRequestFinished (QNetworkReply * reply) { const QString host = reply->url().host(); QPixmap pixmap; const QByteArray content = reply->readAll (); if (!reply->error ()) pixmap.loadFromData (content); if (!pixmap.isNull ()) { // save it in memory... myPixmaps.insert (host, pixmap); // save it on disk... QDir cacheDir (getCacheDir ()); cacheDir.mkpath (cacheDir.absolutePath ()); QFile file (cacheDir.absoluteFilePath (host)); file.open (QIODevice::WriteOnly); file.write (content); file.close (); // notify listeners emit pixmapReady (host); } } transmission-2.92/qt/PaxHeaders.4960/FileTreeView.h0000644000000000000000000000013212571431256017013 xustar0030 mtime=1441149614.409176884 30 atime=1441149614.409176884 30 ctime=1457295917.240760984 transmission-2.92/qt/FileTreeView.h0000644000175000017500000000463512571431256020450 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FileTreeView.h 14559 2015-08-16 22:07:09Z mikedld $ */ #ifndef QTR_FILE_TREE_VIEW_H #define QTR_FILE_TREE_VIEW_H #include #include #include "Torrent.h" // FileList class QAction; class QMenu; class QSortFilterProxyModel; class FileTreeDelegate; class FileTreeModel; class FileTreeView: public QTreeView { Q_OBJECT public: FileTreeView (QWidget * parent = nullptr, bool editable = true); void clear (); void update (const FileList& files, bool updateProperties = true); void setEditable (bool editable); signals: void priorityChanged (const QSet& fileIndices, int priority); void wantedChanged (const QSet& fileIndices, bool wanted); void pathEdited (const QString& oldpath, const QString& newname); void openRequested (const QString& path); protected: // QWidget virtual void resizeEvent (QResizeEvent * event); virtual void keyPressEvent (QKeyEvent * event); virtual void mouseDoubleClickEvent (QMouseEvent * event); virtual void contextMenuEvent (QContextMenuEvent * event); // QAbstractItemView virtual bool edit (const QModelIndex& index, EditTrigger trigger, QEvent * event); private slots: void onClicked (const QModelIndex& index); void checkSelectedItems (); void uncheckSelectedItems (); void onlyCheckSelectedItems (); void setSelectedItemsPriority (); bool openSelectedItem (); void renameSelectedItem (); void refreshContextMenuActionsSensitivity (); private: void initContextMenu (); QModelIndexList selectedSourceRows (int column = 0) const; static Qt::CheckState getCumulativeCheckState (const QModelIndexList& indices); private: FileTreeModel * myModel; QSortFilterProxyModel * myProxy; FileTreeDelegate * myDelegate; QMenu * myContextMenu = nullptr; QMenu * myPriorityMenu = nullptr; QAction * myCheckSelectedAction = nullptr; QAction * myUncheckSelectedAction = nullptr; QAction * myOnlyCheckSelectedAction = nullptr; QAction * myHighPriorityAction = nullptr; QAction * myNormalPriorityAction = nullptr; QAction * myLowPriorityAction = nullptr; QAction * myOpenAction = nullptr; QAction * myRenameAction = nullptr; }; #endif // QTR_FILE_TREE_VIEW_H transmission-2.92/qt/PaxHeaders.4960/TorrentModel.h0000644000000000000000000000013212537301461017073 xustar0030 mtime=1434288945.132418549 30 atime=1434288945.132418549 30 ctime=1457295917.244761052 transmission-2.92/qt/TorrentModel.h0000644000175000017500000000345512537301461020527 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: TorrentModel.h 14540 2015-06-12 22:41:36Z mikedld $ */ #ifndef QTR_TORRENT_MODEL_H #define QTR_TORRENT_MODEL_H #include #include #include #include class Prefs; class Speed; class Torrent; extern "C" { struct tr_variant; } class TorrentModel: public QAbstractListModel { Q_OBJECT public: enum Role { TorrentRole = Qt::UserRole }; public: TorrentModel (const Prefs& prefs); virtual ~TorrentModel (); void clear (); bool hasTorrent (const QString& hashString) const; Torrent * getTorrentFromId (int id); const Torrent * getTorrentFromId (int id) const; void getTransferSpeed (Speed& uploadSpeed, size_t& uploadPeerCount, Speed& downloadSpeed, size_t& downloadPeerCount); // QAbstractItemModel virtual int rowCount (const QModelIndex& parent = QModelIndex ()) const; virtual QVariant data (const QModelIndex& index, int role = Qt::DisplayRole) const; public slots: void updateTorrents (tr_variant * torrentList, bool isCompleteList); void removeTorrents (tr_variant * torrentList); void removeTorrent (int id); signals: void torrentsAdded (QSet); private: typedef QMap id_to_row_t; typedef QMap id_to_torrent_t; typedef QVector torrents_t; private: void addTorrent (Torrent *); QSet getIds () const; private slots: void onTorrentChanged (int propertyId); private: const Prefs& myPrefs; id_to_row_t myIdToRow; id_to_torrent_t myIdToTorrent; torrents_t myTorrents; }; #endif // QTR_TORRENT_MODEL_H transmission-2.92/qt/PaxHeaders.4960/LicenseDialog.ui0000644000000000000000000000013212664476417017364 xustar0030 mtime=1456635151.982496283 30 atime=1456635151.982496283 30 ctime=1457295917.246761086 transmission-2.92/qt/LicenseDialog.ui0000644000175000017500000000361512664476417021016 0ustar00mikedldmikedld00000000000000 LicenseDialog 0 0 400 300 License true Copyright 2005-2016. All code is copyrighted by the respective authors. Transmission can be redistributed and/or modified under the terms of the GNU GPL versions 2 or 3 or by any future license endorsed by Mnemosyne LLC. In addition, linking to and/or using OpenSSL is allowed. 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. Some of Transmission's source files have more permissive licenses. Those files may, of course, be used on their own under their own terms. Qt::Horizontal QDialogButtonBox::Close dialogButtons rejected() LicenseDialog reject() 316 260 286 274 transmission-2.92/qt/PaxHeaders.4960/PrefsDialog.cc0000644000000000000000000000013212631124544017012 xustar0030 mtime=1449437540.251758075 30 atime=1449437540.251758075 30 ctime=1457295917.241761001 transmission-2.92/qt/PrefsDialog.cc0000644000175000017500000005205612631124544020447 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: PrefsDialog.cc 14607 2015-12-06 17:27:21Z jordan $ */ #ifdef _WIN32 #include // FD_SETSIZE #else #include // FD_SETSIZE #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ColumnResizer.h" #include "FreeSpaceLabel.h" #include "Formatter.h" #include "Prefs.h" #include "PrefsDialog.h" #include "Session.h" #include "Utils.h" /*** **** ***/ namespace { const char * PREF_KEY ("pref-key"); void setPrefKey (QObject * object, int key) { object->setProperty (PREF_KEY, key); } int getPrefKey (const QObject * object) { return object->property (PREF_KEY).toInt (); } int qtDayToTrDay (int day) { switch (day) { case Qt::Monday: return TR_SCHED_MON; case Qt::Tuesday: return TR_SCHED_TUES; case Qt::Wednesday: return TR_SCHED_WED; case Qt::Thursday: return TR_SCHED_THURS; case Qt::Friday: return TR_SCHED_FRI; case Qt::Saturday: return TR_SCHED_SAT; case Qt::Sunday: return TR_SCHED_SUN; default: assert (0 && "Invalid day of week"); return 0; } } QString qtDayName (int day) { switch (day) { case Qt::Monday: return PrefsDialog::tr ("Monday"); case Qt::Tuesday: return PrefsDialog::tr ("Tuesday"); case Qt::Wednesday: return PrefsDialog::tr ("Wednesday"); case Qt::Thursday: return PrefsDialog::tr ("Thursday"); case Qt::Friday: return PrefsDialog::tr ("Friday"); case Qt::Saturday: return PrefsDialog::tr ("Saturday"); case Qt::Sunday: return PrefsDialog::tr ("Sunday"); default: assert (0 && "Invalid day of week"); return QString (); } } } bool PrefsDialog::updateWidgetValue (QWidget * widget, int prefKey) { if (auto w = qobject_cast (widget)) w->setChecked (myPrefs.getBool (prefKey)); else if (auto w = qobject_cast (widget)) w->setValue (myPrefs.getInt (prefKey)); else if (auto w = qobject_cast (widget)) w->setValue (myPrefs.getDouble (prefKey)); else if (auto w = qobject_cast (widget)) w->setTime (QTime (0, 0).addSecs (myPrefs.getInt(prefKey) * 60)); else if (auto w = qobject_cast (widget)) w->setText (myPrefs.getString (prefKey)); else if (auto w = qobject_cast (widget)) w->setPath (myPrefs.getString (prefKey)); else return false; return true; } void PrefsDialog::linkWidgetToPref (QWidget * widget, int prefKey) { setPrefKey (widget, prefKey); updateWidgetValue (widget, prefKey); myWidgets.insert (prefKey, widget); if (widget->inherits ("QCheckBox")) connect (widget, SIGNAL (toggled (bool)), SLOT (checkBoxToggled (bool))); else if (widget->inherits ("QTimeEdit")) connect (widget, SIGNAL (editingFinished ()), SLOT (timeEditingFinished ())); else if (widget->inherits ("QLineEdit")) connect (widget, SIGNAL (editingFinished ()), SLOT (lineEditingFinished ())); else if (widget->inherits ("PathButton")) connect (widget, SIGNAL (pathChanged (QString)), SLOT (pathChanged (QString))); else if (widget->inherits ("QAbstractSpinBox")) connect (widget, SIGNAL (editingFinished ()), SLOT (spinBoxEditingFinished ())); } void PrefsDialog::checkBoxToggled (bool checked) { if (auto c = qobject_cast (sender ())) setPref (getPrefKey (c), checked); } void PrefsDialog::spinBoxEditingFinished () { const QObject * spin = sender(); const int key = getPrefKey (spin); if (auto e = qobject_cast (spin)) setPref (key, e->value ()); else if (auto e = qobject_cast (spin)) setPref (key, e->value ()); } void PrefsDialog::timeEditingFinished () { if (auto e = qobject_cast (sender ())) setPref(getPrefKey (e), QTime (0, 0).secsTo (e->time()) / 60); } void PrefsDialog::lineEditingFinished () { if (auto e = qobject_cast (sender ())) { if (e->isModified ()) setPref (getPrefKey (e), e->text()); } } void PrefsDialog::pathChanged (const QString& path) { if (auto b = qobject_cast (sender ())) setPref(getPrefKey (b), path); } /*** **** ***/ void PrefsDialog::initRemoteTab () { linkWidgetToPref (ui.enableRpcCheck, Prefs::RPC_ENABLED); linkWidgetToPref (ui.rpcPortSpin, Prefs::RPC_PORT); linkWidgetToPref (ui.requireRpcAuthCheck, Prefs::RPC_AUTH_REQUIRED); linkWidgetToPref (ui.rpcUsernameEdit, Prefs::RPC_USERNAME); linkWidgetToPref (ui.rpcPasswordEdit, Prefs::RPC_PASSWORD); linkWidgetToPref (ui.enableRpcWhitelistCheck, Prefs::RPC_WHITELIST_ENABLED); linkWidgetToPref (ui.rpcWhitelistEdit, Prefs::RPC_WHITELIST); myWebWidgets << ui.rpcPortLabel << ui.rpcPortSpin << ui.requireRpcAuthCheck << ui.enableRpcWhitelistCheck; myWebAuthWidgets << ui.rpcUsernameLabel << ui.rpcUsernameEdit << ui.rpcPasswordLabel << ui.rpcPasswordEdit; myWebWhitelistWidgets << ui.rpcWhitelistLabel << ui.rpcWhitelistEdit; myUnsupportedWhenRemote << ui.enableRpcCheck << myWebWidgets << myWebAuthWidgets << myWebWhitelistWidgets; connect (ui.openWebClientButton, SIGNAL (clicked ()), &mySession, SLOT (launchWebInterface ())); } /*** **** ***/ void PrefsDialog::altSpeedDaysEdited (int i) { const int value = qobject_cast(sender())->itemData(i).toInt(); setPref (Prefs::ALT_SPEED_LIMIT_TIME_DAY, value); } void PrefsDialog::initSpeedTab () { const QString speed_K_str = Formatter::unitStr (Formatter::SPEED, Formatter::KB); const QLocale locale; ui.uploadSpeedLimitSpin->setSuffix (QString::fromLatin1 (" %1").arg (speed_K_str)); ui.downloadSpeedLimitSpin->setSuffix (QString::fromLatin1 (" %1").arg (speed_K_str)); ui.altUploadSpeedLimitSpin->setSuffix (QString::fromLatin1 (" %1").arg (speed_K_str)); ui.altDownloadSpeedLimitSpin->setSuffix (QString::fromLatin1 (" %1").arg (speed_K_str)); ui.altSpeedLimitDaysCombo->addItem (tr ("Every Day"), QVariant (TR_SCHED_ALL)); ui.altSpeedLimitDaysCombo->addItem (tr ("Weekdays"), QVariant (TR_SCHED_WEEKDAY)); ui.altSpeedLimitDaysCombo->addItem (tr ("Weekends"), QVariant (TR_SCHED_WEEKEND)); ui.altSpeedLimitDaysCombo->insertSeparator (ui.altSpeedLimitDaysCombo->count ()); for (int i = locale.firstDayOfWeek (); i <= Qt::Sunday; ++i) ui.altSpeedLimitDaysCombo->addItem (qtDayName (i), qtDayToTrDay (i)); for (int i = Qt::Monday; i < locale.firstDayOfWeek (); ++i) ui.altSpeedLimitDaysCombo->addItem (qtDayName (i), qtDayToTrDay (i)); ui.altSpeedLimitDaysCombo->setCurrentIndex (ui.altSpeedLimitDaysCombo->findData (myPrefs.getInt (Prefs::ALT_SPEED_LIMIT_TIME_DAY))); linkWidgetToPref (ui.uploadSpeedLimitCheck, Prefs::USPEED_ENABLED); linkWidgetToPref (ui.uploadSpeedLimitSpin, Prefs::USPEED); linkWidgetToPref (ui.downloadSpeedLimitCheck, Prefs::DSPEED_ENABLED); linkWidgetToPref (ui.downloadSpeedLimitSpin, Prefs::DSPEED); linkWidgetToPref (ui.altUploadSpeedLimitSpin, Prefs::ALT_SPEED_LIMIT_UP); linkWidgetToPref (ui.altDownloadSpeedLimitSpin, Prefs::ALT_SPEED_LIMIT_DOWN); linkWidgetToPref (ui.altSpeedLimitScheduleCheck, Prefs::ALT_SPEED_LIMIT_TIME_ENABLED); linkWidgetToPref (ui.altSpeedLimitStartTimeEdit, Prefs::ALT_SPEED_LIMIT_TIME_BEGIN); linkWidgetToPref (ui.altSpeedLimitEndTimeEdit, Prefs::ALT_SPEED_LIMIT_TIME_END); mySchedWidgets << ui.altSpeedLimitStartTimeEdit << ui.altSpeedLimitToLabel << ui.altSpeedLimitEndTimeEdit << ui.altSpeedLimitDaysLabel << ui.altSpeedLimitDaysCombo; ColumnResizer * cr (new ColumnResizer (this)); cr->addLayout (ui.speedLimitsSectionLayout); cr->addLayout (ui.altSpeedLimitsSectionLayout); cr->update (); connect (ui.altSpeedLimitDaysCombo, SIGNAL (activated (int)), SLOT (altSpeedDaysEdited (int))); } /*** **** ***/ void PrefsDialog::initDesktopTab () { linkWidgetToPref (ui.showTrayIconCheck, Prefs::SHOW_TRAY_ICON); linkWidgetToPref (ui.startMinimizedCheck, Prefs::START_MINIMIZED); linkWidgetToPref (ui.notifyOnTorrentAddedCheck, Prefs::SHOW_NOTIFICATION_ON_ADD); linkWidgetToPref (ui.notifyOnTorrentCompletedCheck, Prefs::SHOW_NOTIFICATION_ON_COMPLETE); linkWidgetToPref (ui.playSoundOnTorrentCompletedCheck, Prefs::COMPLETE_SOUND_ENABLED); } /*** **** ***/ void PrefsDialog::onPortTested (bool isOpen) { ui.testPeerPortButton->setEnabled (true); myWidgets[Prefs::PEER_PORT]->setEnabled (true); ui.peerPortStatusLabel->setText (isOpen ? tr ("Port is open") : tr ("Port is closed")); } void PrefsDialog::onPortTest () { ui.peerPortStatusLabel->setText (tr ("Testing TCP Port...")); ui.testPeerPortButton->setEnabled (false); myWidgets[Prefs::PEER_PORT]->setEnabled (false); mySession.portTest (); } void PrefsDialog::initNetworkTab () { ui.torrentPeerLimitSpin->setRange (1, FD_SETSIZE); ui.globalPeerLimitSpin->setRange (1, FD_SETSIZE); linkWidgetToPref (ui.peerPortSpin, Prefs::PEER_PORT); linkWidgetToPref (ui.randomPeerPortCheck, Prefs::PEER_PORT_RANDOM_ON_START); linkWidgetToPref (ui.enablePortForwardingCheck, Prefs::PORT_FORWARDING); linkWidgetToPref (ui.torrentPeerLimitSpin, Prefs::PEER_LIMIT_TORRENT); linkWidgetToPref (ui.globalPeerLimitSpin, Prefs::PEER_LIMIT_GLOBAL); linkWidgetToPref (ui.enableUtpCheck, Prefs::UTP_ENABLED); linkWidgetToPref (ui.enablePexCheck, Prefs::PEX_ENABLED); linkWidgetToPref (ui.enableDhtCheck, Prefs::DHT_ENABLED); linkWidgetToPref (ui.enableLpdCheck, Prefs::LPD_ENABLED); ColumnResizer * cr (new ColumnResizer (this)); cr->addLayout (ui.incomingPeersSectionLayout); cr->addLayout (ui.peerLimitsSectionLayout); cr->update (); connect (ui.testPeerPortButton, SIGNAL (clicked ()), SLOT (onPortTest ())); connect (&mySession, SIGNAL (portTested (bool)), SLOT (onPortTested (bool))); } /*** **** ***/ void PrefsDialog::onBlocklistDialogDestroyed (QObject * o) { Q_UNUSED (o); myBlocklistDialog = 0; } void PrefsDialog::onUpdateBlocklistCancelled () { disconnect (&mySession, SIGNAL(blocklistUpdated(int)), this, SLOT(onBlocklistUpdated(int))); myBlocklistDialog->deleteLater (); } void PrefsDialog::onBlocklistUpdated (int n) { myBlocklistDialog->setText (tr ("Update succeeded!

Blocklist now has %Ln rule(s).", 0, n)); myBlocklistDialog->setTextFormat (Qt::RichText); } void PrefsDialog::onUpdateBlocklistClicked () { myBlocklistDialog = new QMessageBox (QMessageBox::Information, QString(), tr ("Update Blocklist

Getting new blocklist..."), QMessageBox::Close, this); connect (myBlocklistDialog, SIGNAL(rejected()), this, SLOT(onUpdateBlocklistCancelled())); connect (&mySession, SIGNAL(blocklistUpdated(int)), this, SLOT(onBlocklistUpdated(int))); myBlocklistDialog->show (); mySession.updateBlocklist (); } void PrefsDialog::encryptionEdited (int i) { const int value (qobject_cast(sender())->itemData(i).toInt ()); setPref (Prefs::ENCRYPTION, value); } void PrefsDialog::initPrivacyTab () { ui.encryptionModeCombo->addItem (tr ("Allow encryption"), 0); ui.encryptionModeCombo->addItem (tr ("Prefer encryption"), 1); ui.encryptionModeCombo->addItem (tr ("Require encryption"), 2); linkWidgetToPref (ui.encryptionModeCombo, Prefs::ENCRYPTION); linkWidgetToPref (ui.blocklistCheck, Prefs::BLOCKLIST_ENABLED); linkWidgetToPref (ui.blocklistEdit, Prefs::BLOCKLIST_URL); linkWidgetToPref (ui.autoUpdateBlocklistCheck, Prefs::BLOCKLIST_UPDATES_ENABLED); myBlockWidgets << ui.blocklistEdit << ui.blocklistStatusLabel << ui.updateBlocklistButton << ui.autoUpdateBlocklistCheck; ColumnResizer * cr (new ColumnResizer (this)); cr->addLayout (ui.encryptionSectionLayout); cr->addLayout (ui.blocklistSectionLayout); cr->update (); connect (ui.encryptionModeCombo, SIGNAL (activated (int)), SLOT (encryptionEdited (int))); connect (ui.updateBlocklistButton, SIGNAL (clicked ()), SLOT (onUpdateBlocklistClicked ())); updateBlocklistLabel (); } /*** **** ***/ void PrefsDialog::onIdleLimitChanged () { //: Spin box suffix, "Stop seeding if idle for: [ 5 minutes ]" (includes leading space after the number, if needed) const QString unitsSuffix = tr (" minute(s)", 0, ui.idleLimitSpin->value ()); if (ui.idleLimitSpin->suffix () != unitsSuffix) ui.idleLimitSpin->setSuffix (unitsSuffix); } void PrefsDialog::initSeedingTab () { linkWidgetToPref (ui.ratioLimitCheck, Prefs::RATIO_ENABLED); linkWidgetToPref (ui.ratioLimitSpin, Prefs::RATIO); linkWidgetToPref (ui.idleLimitCheck, Prefs::IDLE_LIMIT_ENABLED); linkWidgetToPref (ui.idleLimitSpin, Prefs::IDLE_LIMIT); connect (ui.idleLimitSpin, SIGNAL (valueChanged (int)), SLOT (onIdleLimitChanged ())); onIdleLimitChanged (); } void PrefsDialog::onQueueStalledMinutesChanged () { //: Spin box suffix, "Download is inactive if data sharing stopped: [ 5 minutes ago ]" (includes leading space after the number, if needed) const QString unitsSuffix = tr (" minute(s) ago", 0, ui.queueStalledMinutesSpin->value ()); if (ui.queueStalledMinutesSpin->suffix () != unitsSuffix) ui.queueStalledMinutesSpin->setSuffix (unitsSuffix); } void PrefsDialog::initDownloadingTab () { if (mySession.isLocal ()) { ui.watchDirStack->setCurrentWidget (ui.watchDirButton); ui.downloadDirStack->setCurrentWidget (ui.downloadDirButton); ui.incompleteDirStack->setCurrentWidget (ui.incompleteDirButton); ui.completionScriptStack->setCurrentWidget (ui.completionScriptButton); ui.watchDirButton->setMode (PathButton::DirectoryMode); ui.downloadDirButton->setMode (PathButton::DirectoryMode); ui.incompleteDirButton->setMode (PathButton::DirectoryMode); ui.completionScriptButton->setMode (PathButton::FileMode); ui.watchDirButton->setTitle (tr ("Select Watch Directory")); ui.downloadDirButton->setTitle (tr ("Select Destination")); ui.incompleteDirButton->setTitle (tr ("Select Incomplete Directory")); ui.completionScriptButton->setTitle (tr ("Select \"Torrent Done\" Script")); } else { ui.watchDirStack->setCurrentWidget (ui.watchDirEdit); ui.downloadDirStack->setCurrentWidget (ui.downloadDirEdit); ui.incompleteDirStack->setCurrentWidget (ui.incompleteDirEdit); ui.completionScriptStack->setCurrentWidget (ui.completionScriptEdit); } ui.watchDirStack->setFixedHeight (ui.watchDirStack->currentWidget ()->sizeHint ().height ()); ui.downloadDirStack->setFixedHeight (ui.downloadDirStack->currentWidget ()->sizeHint ().height ()); ui.incompleteDirStack->setFixedHeight (ui.incompleteDirStack->currentWidget ()->sizeHint ().height ()); ui.completionScriptStack->setFixedHeight (ui.completionScriptStack->currentWidget ()->sizeHint ().height ()); ui.watchDirStack->setMinimumWidth (200); ui.downloadDirLabel->setBuddy (ui.downloadDirStack->currentWidget ()); ui.downloadDirFreeSpaceLabel->setSession (mySession); ui.downloadDirFreeSpaceLabel->setPath (myPrefs.getString (Prefs::DOWNLOAD_DIR)); linkWidgetToPref (ui.watchDirCheck, Prefs::DIR_WATCH_ENABLED); linkWidgetToPref (ui.watchDirStack->currentWidget (), Prefs::DIR_WATCH); linkWidgetToPref (ui.showTorrentOptionsDialogCheck, Prefs::OPTIONS_PROMPT); linkWidgetToPref (ui.startAddedTorrentsCheck, Prefs::START); linkWidgetToPref (ui.trashTorrentFileCheck, Prefs::TRASH_ORIGINAL); linkWidgetToPref (ui.downloadDirStack->currentWidget (), Prefs::DOWNLOAD_DIR); linkWidgetToPref (ui.downloadQueueSizeSpin, Prefs::DOWNLOAD_QUEUE_SIZE); linkWidgetToPref (ui.queueStalledMinutesSpin, Prefs::QUEUE_STALLED_MINUTES); linkWidgetToPref (ui.renamePartialFilesCheck, Prefs::RENAME_PARTIAL_FILES); linkWidgetToPref (ui.incompleteDirCheck, Prefs::INCOMPLETE_DIR_ENABLED); linkWidgetToPref (ui.incompleteDirStack->currentWidget (), Prefs::INCOMPLETE_DIR); linkWidgetToPref (ui.completionScriptCheck, Prefs::SCRIPT_TORRENT_DONE_ENABLED); linkWidgetToPref (ui.completionScriptStack->currentWidget (), Prefs::SCRIPT_TORRENT_DONE_FILENAME); ColumnResizer * cr (new ColumnResizer (this)); cr->addLayout (ui.addingSectionLayout); cr->addLayout (ui.downloadQueueSectionLayout); cr->addLayout (ui.incompleteSectionLayout); cr->update (); connect (ui.queueStalledMinutesSpin, SIGNAL (valueChanged (int)), SLOT (onQueueStalledMinutesChanged ())); onQueueStalledMinutesChanged (); } /*** **** ***/ PrefsDialog::PrefsDialog (Session& session, Prefs& prefs, QWidget * parent): BaseDialog (parent), mySession (session), myPrefs (prefs), myIsServer (session.isServer ()) { ui.setupUi (this); initSpeedTab (); initDownloadingTab (); initSeedingTab (); initPrivacyTab (); initNetworkTab (); initDesktopTab (); initRemoteTab (); connect (&mySession, SIGNAL (sessionUpdated ()), SLOT (sessionUpdated ())); QList keys; keys << Prefs::RPC_ENABLED << Prefs::ALT_SPEED_LIMIT_ENABLED << Prefs::ALT_SPEED_LIMIT_TIME_ENABLED << Prefs::ENCRYPTION << Prefs::BLOCKLIST_ENABLED << Prefs::DIR_WATCH << Prefs::DOWNLOAD_DIR << Prefs::INCOMPLETE_DIR << Prefs::INCOMPLETE_DIR_ENABLED << Prefs::SCRIPT_TORRENT_DONE_FILENAME; for (const int key: keys) refreshPref (key); // if it's a remote session, disable the preferences // that don't work in remote sessions if (!myIsServer) { for (QWidget * const w: myUnsupportedWhenRemote) { w->setToolTip (tr ("Not supported by remote sessions")); w->setEnabled (false); } } adjustSize (); } PrefsDialog::~PrefsDialog () { } void PrefsDialog::setPref (int key, const QVariant& v) { myPrefs.set (key, v); refreshPref (key); } /*** **** ***/ void PrefsDialog::sessionUpdated () { updateBlocklistLabel (); } void PrefsDialog::updateBlocklistLabel () { const int n = mySession.blocklistSize (); ui.blocklistStatusLabel->setText (tr ("Blocklist contains %Ln rule(s)", 0, n)); } void PrefsDialog::refreshPref (int key) { switch (key) { case Prefs::RPC_ENABLED: case Prefs::RPC_WHITELIST_ENABLED: case Prefs::RPC_AUTH_REQUIRED: { const bool enabled (myPrefs.getBool (Prefs::RPC_ENABLED)); const bool whitelist (myPrefs.getBool (Prefs::RPC_WHITELIST_ENABLED)); const bool auth (myPrefs.getBool (Prefs::RPC_AUTH_REQUIRED)); for (QWidget * const w: myWebWhitelistWidgets) w->setEnabled (enabled && whitelist); for (QWidget * const w: myWebAuthWidgets) w->setEnabled (enabled && auth); for (QWidget * const w: myWebWidgets) w->setEnabled (enabled); break; } case Prefs::ALT_SPEED_LIMIT_TIME_ENABLED: { const bool enabled = myPrefs.getBool (key); for (QWidget * const w: mySchedWidgets) w->setEnabled (enabled); break; } case Prefs::BLOCKLIST_ENABLED: { const bool enabled = myPrefs.getBool (key); for (QWidget * const w: myBlockWidgets) w->setEnabled (enabled); break; } case Prefs::DIR_WATCH: ui.watchDirButton->setText (QFileInfo (myPrefs.getString (Prefs::DIR_WATCH)).fileName ()); break; case Prefs::SCRIPT_TORRENT_DONE_FILENAME: { const QString path (myPrefs.getString (key)); ui.completionScriptButton->setText (QFileInfo (path).fileName ()); break; } case Prefs::PEER_PORT: ui.peerPortStatusLabel->setText (tr ("Status unknown")); ui.testPeerPortButton->setEnabled (true); break; case Prefs::DOWNLOAD_DIR: { const QString path (myPrefs.getString (key)); ui.downloadDirButton->setText (QFileInfo (path).fileName ()); ui.downloadDirFreeSpaceLabel->setPath (path); break; } case Prefs::INCOMPLETE_DIR: { QString path (myPrefs.getString (key)); ui.incompleteDirButton->setText (QFileInfo (path).fileName ()); break; } default: break; } key2widget_t::iterator it (myWidgets.find (key)); if (it != myWidgets.end ()) { QWidget * w (it.value ()); if (!updateWidgetValue (w, key)) { if (key == Prefs::ENCRYPTION) { QComboBox * comboBox (qobject_cast (w)); const int index = comboBox->findData (myPrefs.getInt (key)); comboBox->setCurrentIndex (index); } } } } transmission-2.92/qt/PaxHeaders.4960/FileTreeItem.cc0000644000000000000000000000013212631124544017131 xustar0030 mtime=1449437540.253758111 30 atime=1449437540.253758111 30 ctime=1457295917.240760984 transmission-2.92/qt/FileTreeItem.cc0000644000175000017500000001736512631124544020572 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FileTreeItem.cc 14609 2015-12-06 17:39:18Z jordan $ */ #include #include #include #include #include // priorities #include "FileTreeItem.h" #include "FileTreeModel.h" #include "Formatter.h" #include "Utils.h" // mime icons const QHash& FileTreeItem::getMyChildRows () { const size_t n = childCount(); // ensure that all the rows are hashed while (myFirstUnhashedRow < n) { myChildRows.insert (myChildren[myFirstUnhashedRow]->name(), myFirstUnhashedRow); ++myFirstUnhashedRow; } return myChildRows; } FileTreeItem::~FileTreeItem () { assert(myChildren.isEmpty()); if (myParent != 0) { const int pos = row(); assert ((pos>=0) && "couldn't find child in parent's lookup"); myParent->myChildren.removeAt(pos); myParent->myChildRows.remove(name()); myParent->myFirstUnhashedRow = pos; } } void FileTreeItem::appendChild (FileTreeItem * child) { const size_t n = childCount(); child->myParent = this; myChildren.append (child); myFirstUnhashedRow = n; } FileTreeItem * FileTreeItem::child (const QString& filename) { FileTreeItem * item(0); const int row = getMyChildRows().value (filename, -1); if (row != -1) { item = child (row); assert (filename == item->name()); } return item; } int FileTreeItem::row () const { int i(-1); if(myParent) { i = myParent->getMyChildRows().value (name(), -1); assert (this == myParent->myChildren[i]); } return i; } QVariant FileTreeItem::data (int column, int role) const { QVariant value; switch (role) { case FileTreeModel::FileIndexRole: value.setValue (myFileIndex); break; case FileTreeModel::WantedRole: value.setValue (isSubtreeWanted ()); break; case FileTreeModel::CompleteRole: value.setValue (isComplete ()); break; case Qt::EditRole: if (column == FileTreeModel::COL_NAME) value.setValue (name ()); break; case Qt::TextAlignmentRole: if (column == FileTreeModel::COL_SIZE) value = Qt::AlignRight + Qt::AlignVCenter; break; case Qt::DisplayRole: case FileTreeModel::SortRole: switch (column) { case FileTreeModel::COL_NAME: value.setValue (name ()); break; case FileTreeModel::COL_SIZE: if (role == Qt::DisplayRole) value.setValue (sizeString ()); else value.setValue (size ()); break; case FileTreeModel::COL_PROGRESS: value.setValue (progress ()); break; case FileTreeModel::COL_WANTED: value.setValue (isSubtreeWanted ()); break; case FileTreeModel::COL_PRIORITY: if (role == Qt::DisplayRole) value.setValue (priorityString ()); else value.setValue (priority ()); break; } break; case Qt::DecorationRole: if (column == FileTreeModel::COL_NAME) { if (myFileIndex < 0) value = qApp->style ()->standardIcon (QStyle::SP_DirOpenIcon); else value = Utils::guessMimeIcon (name ()); } break; } return value; } void FileTreeItem::getSubtreeWantedSize (uint64_t& have, uint64_t& total) const { if (myIsWanted) { have += myHaveSize; total += myTotalSize; } for (const FileTreeItem * const i: myChildren) i->getSubtreeWantedSize(have, total); } double FileTreeItem::progress () const { double d(0); uint64_t have(0), total(0); getSubtreeWantedSize (have, total); if (total) d = have / double(total); return d; } QString FileTreeItem::sizeString () const { return Formatter::sizeToString (size ()); } uint64_t FileTreeItem::size () const { if (myChildren.isEmpty()) return myTotalSize; uint64_t have = 0; uint64_t total = 0; getSubtreeWantedSize (have, total); return total; } std::pair FileTreeItem::update (const QString& name, bool wanted, int priority, uint64_t haveSize, bool updateFields) { int changed_count = 0; int changed_columns[4]; if (myName != name) { if (myParent) myParent->myFirstUnhashedRow = row(); myName = name; changed_columns[changed_count++] = FileTreeModel::COL_NAME; } if (fileIndex () != -1) { if (myHaveSize != haveSize) { myHaveSize = haveSize; changed_columns[changed_count++] = FileTreeModel::COL_PROGRESS; } if (updateFields) { if (myIsWanted != wanted) { myIsWanted = wanted; changed_columns[changed_count++] = FileTreeModel::COL_WANTED; } if (myPriority != priority) { myPriority = priority; changed_columns[changed_count++] = FileTreeModel::COL_PRIORITY; } } } std::pair changed (-1, -1); if (changed_count > 0) { std::sort (changed_columns, changed_columns+changed_count); changed.first = changed_columns[0]; changed.second = changed_columns[changed_count-1]; } return changed; } QString FileTreeItem::priorityString () const { const int i = priority(); switch (i) { case LOW: return tr("Low"); case HIGH: return tr("High"); case NORMAL: return tr("Normal"); default: return tr("Mixed"); } } int FileTreeItem::priority () const { int i(0); if (myChildren.isEmpty()) { switch (myPriority) { case TR_PRI_LOW: i |= LOW; break; case TR_PRI_HIGH: i |= HIGH; break; default: i |= NORMAL; break; } } for (const FileTreeItem * const child: myChildren) i |= child->priority(); return i; } void FileTreeItem::setSubtreePriority (int i, QSet& ids) { if (myPriority != i) { myPriority = i; if (myFileIndex >= 0) ids.insert (myFileIndex); } for (FileTreeItem * const child: myChildren) child->setSubtreePriority (i, ids); } int FileTreeItem::isSubtreeWanted () const { if(myChildren.isEmpty()) return myIsWanted ? Qt::Checked : Qt::Unchecked; int wanted(-1); for (const FileTreeItem * const child: myChildren) { const int childWanted = child->isSubtreeWanted(); if (wanted == -1) wanted = childWanted; if (wanted != childWanted) wanted = Qt::PartiallyChecked; if (wanted == Qt::PartiallyChecked) return wanted; } return wanted; } void FileTreeItem::setSubtreeWanted (bool b, QSet& ids) { if (myIsWanted != b) { myIsWanted = b; if (myFileIndex >= 0) ids.insert(myFileIndex); } for (FileTreeItem * const child: myChildren) child->setSubtreeWanted (b, ids); } QString FileTreeItem::path () const { QString itemPath; const FileTreeItem * item = this; while (item != NULL && !item->name().isEmpty()) { if (itemPath.isEmpty()) itemPath = item->name(); else itemPath = item->name() + QLatin1Char ('/') + itemPath; item = item->parent (); } return itemPath; } bool FileTreeItem::isComplete () const { return myHaveSize == totalSize (); } transmission-2.92/qt/PaxHeaders.4960/Formatter.cc0000644000000000000000000000013212557166437016574 xustar0030 mtime=1438444831.675384617 30 atime=1438444831.675384617 30 ctime=1457295917.240760984 transmission-2.92/qt/Formatter.cc0000644000175000017500000001062712557166437020227 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: Formatter.cc 14554 2015-07-30 06:55:28Z mikedld $ */ #include #include // tr_formatter #include "Formatter.h" #include "Speed.h" /*** **** Constants ***/ namespace { unsigned int speed_K; unsigned int mem_K; unsigned int size_K; } QString Formatter::unitStrings[3][5]; void Formatter::initUnits () { speed_K = 1000; unitStrings[SPEED][B] = tr ( "B/s"); unitStrings[SPEED][KB] = tr ("kB/s"); unitStrings[SPEED][MB] = tr ("MB/s"); unitStrings[SPEED][GB] = tr ("GB/s"); unitStrings[SPEED][TB] = tr ("TB/s"); tr_formatter_speed_init (speed_K, unitStrings[SPEED][KB].toUtf8().constData(), unitStrings[SPEED][MB].toUtf8().constData(), unitStrings[SPEED][GB].toUtf8().constData(), unitStrings[SPEED][TB].toUtf8().constData()); size_K = 1000; unitStrings[SIZE][B] = tr ( "B"); unitStrings[SIZE][KB] = tr ("kB"); unitStrings[SIZE][MB] = tr ("MB"); unitStrings[SIZE][GB] = tr ("GB"); unitStrings[SIZE][TB] = tr ("TB"); tr_formatter_size_init (size_K, unitStrings[SIZE][KB].toUtf8().constData(), unitStrings[SIZE][MB].toUtf8().constData(), unitStrings[SIZE][GB].toUtf8().constData(), unitStrings[SIZE][TB].toUtf8().constData()); mem_K = 1024; unitStrings[MEM][B] = tr ( "B"); unitStrings[MEM][KB] = tr ("KiB"); unitStrings[MEM][MB] = tr ("MiB"); unitStrings[MEM][GB] = tr ("GiB"); unitStrings[MEM][TB] = tr ("TiB"); tr_formatter_mem_init (mem_K, unitStrings[MEM][KB].toUtf8().constData(), unitStrings[MEM][MB].toUtf8().constData(), unitStrings[MEM][GB].toUtf8().constData(), unitStrings[MEM][TB].toUtf8().constData()); } /*** **** ***/ double Speed::KBps () const { return _Bps / static_cast (speed_K); } Speed Speed::fromKBps (double KBps) { return static_cast (KBps * speed_K); } /*** **** ***/ QString Formatter::memToString (int64_t bytes) { if (bytes < 0) return tr ("Unknown"); if (!bytes) return tr ("None"); char buf[128]; tr_formatter_mem_B (buf, bytes, sizeof (buf)); return QString::fromUtf8 (buf); } QString Formatter::sizeToString (int64_t bytes) { if (bytes < 0) return tr ("Unknown"); if (!bytes) return tr ("None"); char buf[128]; tr_formatter_size_B (buf, bytes, sizeof (buf)); return QString::fromUtf8 (buf); } QString Formatter::speedToString (const Speed& speed) { char buf[128]; tr_formatter_speed_KBps (buf, speed.KBps (), sizeof (buf)); return QString::fromUtf8 (buf); } QString Formatter::uploadSpeedToString (const Speed& uploadSpeed) { static const QChar uploadSymbol (0x25B4); return tr ("%1 %2").arg (speedToString (uploadSpeed)).arg (uploadSymbol); } QString Formatter::downloadSpeedToString (const Speed& downloadSpeed) { static const QChar downloadSymbol (0x25BE); return tr ("%1 %2").arg (speedToString (downloadSpeed)).arg (downloadSymbol); } QString Formatter::percentToString (double x) { char buf[128]; return QString::fromUtf8 (tr_strpercent (buf, x, sizeof (buf))); } QString Formatter::ratioToString (double ratio) { char buf[128]; return QString::fromUtf8 (tr_strratio (buf, sizeof (buf), ratio, "\xE2\x88\x9E")); } QString Formatter::timeToString (int seconds) { int days, hours, minutes; QString d, h, m, s; QString str; if (seconds < 0) seconds = 0; days = seconds / 86400; hours = (seconds % 86400) / 3600; minutes = (seconds % 3600) / 60; seconds %= 60; d = tr ("%Ln day(s)", 0, days); h = tr ("%Ln hour(s)", 0, hours); m = tr ("%Ln minute(s)", 0, minutes); s = tr ("%Ln second(s)", 0, seconds); if (days) { if (days >= 4 || !hours) str = d; else str = tr ("%1, %2").arg (d).arg (h); } else if (hours) { if (hours >= 4 || !minutes) str = h; else str = tr ("%1, %2").arg (h).arg (m); } else if (minutes) { if (minutes >= 4 || !seconds) str = m; else str = tr ("%1, %2").arg (m).arg (s); } else { str = s; } return str; } transmission-2.92/qt/PaxHeaders.4960/WatchDir.cc0000644000000000000000000000013212536126416016324 xustar0030 mtime=1433971982.558590332 30 atime=1433971982.558590332 30 ctime=1457295917.244761052 transmission-2.92/qt/WatchDir.cc0000644000175000017500000000673312536126416017762 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: WatchDir.cc 14537 2015-06-10 21:27:11Z mikedld $ */ #include #include #include #include #include #include "Prefs.h" #include "TorrentModel.h" #include "WatchDir.h" /*** **** ***/ WatchDir::WatchDir (const TorrentModel& model): myModel (model), myWatcher (0) { } WatchDir::~WatchDir () { } /*** **** ***/ int WatchDir::metainfoTest (const QString& filename) const { int ret; tr_info inf; tr_ctor * ctor = tr_ctorNew (0); // parse tr_ctorSetMetainfoFromFile (ctor, filename.toUtf8().constData()); const int err = tr_torrentParse( ctor, &inf ); if (err) ret = ERROR; else if (myModel.hasTorrent (QString::fromUtf8 (inf.hashString))) ret = DUPLICATE; else ret = OK; // cleanup if (!err) tr_metainfoFree (&inf); tr_ctorFree (ctor); return ret; } void WatchDir::onTimeout () { QTimer * t = qobject_cast(sender()); const QString filename = t->objectName (); if (metainfoTest (filename) == OK) emit torrentFileAdded( filename ); t->deleteLater( ); } void WatchDir::setPath (const QString& path, bool isEnabled) { // clear out any remnants of the previous watcher, if any myWatchDirFiles.clear (); if (myWatcher) { delete myWatcher; myWatcher = 0; } // maybe create a new watcher if (isEnabled) { myWatcher = new QFileSystemWatcher (); myWatcher->addPath( path ); connect (myWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(watcherActivated(QString))); //std::cerr << "watching " << qPrintable(path) << " for new .torrent files" << std::endl; QTimer::singleShot (0, this, SLOT (rescanAllWatchedDirectories ())); // trigger the watchdir for .torrent files in there already } } void WatchDir::watcherActivated (const QString& path) { const QDir dir(path); // get the list of files currently in the watch directory QSet files; for (const QString& str: dir.entryList (QDir::Readable|QDir::Files)) files.insert (str); // try to add any new files which end in .torrent const QSet newFiles (files - myWatchDirFiles); const QString torrentSuffix = QString::fromUtf8 (".torrent"); for (const QString& name: newFiles) { if (name.endsWith (torrentSuffix, Qt::CaseInsensitive)) { const QString filename = dir.absoluteFilePath (name); switch (metainfoTest (filename)) { case OK: emit torrentFileAdded (filename); break; case DUPLICATE: break; case ERROR: { // give the .torrent a few seconds to finish downloading QTimer * t = new QTimer (this); t->setObjectName (dir.absoluteFilePath (name)); t->setSingleShot (true); connect( t, SIGNAL(timeout()), this, SLOT(onTimeout())); t->start (5000); } } } } // update our file list so that we can use it // for comparison the next time around myWatchDirFiles = files; } void WatchDir::rescanAllWatchedDirectories () { if (myWatcher == nullptr) return; for (const QString& path: myWatcher->directories ()) watcherActivated (path); } transmission-2.92/qt/PaxHeaders.4960/MainWindow.cc0000644000000000000000000000013212634073014016665 xustar0030 mtime=1450210828.828138599 30 atime=1450210828.828138599 30 ctime=1457295917.244761052 transmission-2.92/qt/MainWindow.cc0000644000175000017500000013123512634073014020317 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: MainWindow.cc 14599 2015-11-14 14:22:57Z mikedld $ */ #include #include #include #include #include #include #include #include #include #include #include "AboutDialog.h" #include "AddData.h" #include "Application.h" #include "DetailsDialog.h" #include "FilterBar.h" #include "Filters.h" #include "Formatter.h" #include "MainWindow.h" #include "MakeDialog.h" #include "OptionsDialog.h" #include "Prefs.h" #include "PrefsDialog.h" #include "RelocateDialog.h" #include "Session.h" #include "SessionDialog.h" #include "Speed.h" #include "StatsDialog.h" #include "TorrentDelegate.h" #include "TorrentDelegateMin.h" #include "TorrentFilter.h" #include "TorrentModel.h" #include "Utils.h" #define PREF_VARIANTS_KEY "pref-variants-list" #define STATS_MODE_KEY "stats-mode" #define SORT_MODE_KEY "sort-mode" namespace { const QLatin1String TotalRatioStatsModeName ("total-ratio"); const QLatin1String TotalTransferStatsModeName ("total-transfer"); const QLatin1String SessionRatioStatsModeName ("session-ratio"); const QLatin1String SessionTransferStatsModeName ("session-transfer"); } /** * This is a proxy-style for that forces it to be always disabled. * We use this to make our torrent list view behave consistently on * both GTK and Qt implementations. */ class ListViewProxyStyle: public QProxyStyle { public: int styleHint (StyleHint hint, const QStyleOption * option = 0, const QWidget * widget = 0, QStyleHintReturn * returnData = 0) const { if (hint == QStyle::SH_ItemView_ActivateItemOnSingleClick) return 0; return QProxyStyle::styleHint (hint, option, widget, returnData); } }; QIcon MainWindow::getStockIcon (const QString& name, int fallback) { QIcon icon = QIcon::fromTheme (name); if (icon.isNull () && (fallback >= 0)) icon = style ()->standardIcon (QStyle::StandardPixmap (fallback), 0, this); return icon; } MainWindow::MainWindow (Session& session, Prefs& prefs, TorrentModel& model, bool minimized): mySession (session), myPrefs (prefs), myModel (model), myLastFullUpdateTime (0), mySessionDialog (), myPrefsDialog (), myAboutDialog (), myStatsDialog (), myDetailsDialog (), myFilterModel (prefs), myTorrentDelegate (new TorrentDelegate (this)), myTorrentDelegateMin (new TorrentDelegateMin (this)), myLastSendTime (0), myLastReadTime (0), myNetworkTimer (this), myNetworkError (false), myRefreshTrayIconTimer (this), myRefreshActionSensitivityTimer (this) { setAcceptDrops (true); QAction * sep = new QAction (this); sep->setSeparator (true); ui.setupUi (this); QStyle * style = this->style (); int i = style->pixelMetric (QStyle::PM_SmallIconSize, 0, this); const QSize smallIconSize (i, i); ui.listView->setStyle (new ListViewProxyStyle); ui.listView->setAttribute (Qt::WA_MacShowFocusRect, false); // icons ui.action_OpenFile->setIcon (getStockIcon (QLatin1String ("document-open"), QStyle::SP_DialogOpenButton)); ui.action_New->setIcon (getStockIcon (QLatin1String ("document-new"), QStyle::SP_DesktopIcon)); ui.action_Properties->setIcon (getStockIcon (QLatin1String ("document-properties"), QStyle::SP_DesktopIcon)); ui.action_OpenFolder->setIcon (getStockIcon (QLatin1String ("folder-open"), QStyle::SP_DirOpenIcon)); ui.action_Start->setIcon (getStockIcon (QLatin1String ("media-playback-start"), QStyle::SP_MediaPlay)); ui.action_StartNow->setIcon (getStockIcon (QLatin1String ("media-playback-start"), QStyle::SP_MediaPlay)); ui.action_Announce->setIcon (getStockIcon (QLatin1String ("network-transmit-receive"))); ui.action_Pause->setIcon (getStockIcon (QLatin1String ("media-playback-pause"), QStyle::SP_MediaPause)); ui.action_Remove->setIcon (getStockIcon (QLatin1String ("list-remove"), QStyle::SP_TrashIcon)); ui.action_Delete->setIcon (getStockIcon (QLatin1String ("edit-delete"), QStyle::SP_TrashIcon)); ui.action_StartAll->setIcon (getStockIcon (QLatin1String ("media-playback-start"), QStyle::SP_MediaPlay)); ui.action_PauseAll->setIcon (getStockIcon (QLatin1String ("media-playback-pause"), QStyle::SP_MediaPause)); ui.action_Quit->setIcon (getStockIcon (QLatin1String ("application-exit"))); ui.action_SelectAll->setIcon (getStockIcon (QLatin1String ("edit-select-all"))); ui.action_ReverseSortOrder->setIcon (getStockIcon (QLatin1String ("view-sort-ascending"), QStyle::SP_ArrowDown)); ui.action_Preferences->setIcon (getStockIcon (QLatin1String ("preferences-system"))); ui.action_Contents->setIcon (getStockIcon (QLatin1String ("help-contents"), QStyle::SP_DialogHelpButton)); ui.action_About->setIcon (getStockIcon (QLatin1String ("help-about"))); ui.action_QueueMoveTop->setIcon (getStockIcon (QLatin1String ("go-top"))); ui.action_QueueMoveUp->setIcon (getStockIcon (QLatin1String ("go-up"), QStyle::SP_ArrowUp)); ui.action_QueueMoveDown->setIcon (getStockIcon (QLatin1String ("go-down"), QStyle::SP_ArrowDown)); ui.action_QueueMoveBottom->setIcon (getStockIcon (QLatin1String ("go-bottom"))); // ui signals connect (ui.action_Toolbar, SIGNAL (toggled (bool)), this, SLOT (setToolbarVisible (bool))); connect (ui.action_Filterbar, SIGNAL (toggled (bool)), this, SLOT (setFilterbarVisible (bool))); connect (ui.action_Statusbar, SIGNAL (toggled (bool)), this, SLOT (setStatusbarVisible (bool))); connect (ui.action_CompactView, SIGNAL (toggled (bool)), this, SLOT (setCompactView (bool))); connect (ui.action_ReverseSortOrder, SIGNAL (toggled (bool)), this, SLOT (setSortAscendingPref (bool))); connect (ui.action_Start, SIGNAL (triggered ()), this, SLOT (startSelected ())); connect (ui.action_QueueMoveTop, SIGNAL (triggered ()), this, SLOT (queueMoveTop ())); connect (ui.action_QueueMoveUp, SIGNAL (triggered ()), this, SLOT (queueMoveUp ())); connect (ui.action_QueueMoveDown, SIGNAL (triggered ()), this, SLOT (queueMoveDown ())); connect (ui.action_QueueMoveBottom, SIGNAL (triggered ()), this, SLOT (queueMoveBottom ())); connect (ui.action_StartNow, SIGNAL (triggered ()), this, SLOT (startSelectedNow ())); connect (ui.action_Pause, SIGNAL (triggered ()), this, SLOT (pauseSelected ())); connect (ui.action_Remove, SIGNAL (triggered ()), this, SLOT (removeSelected ())); connect (ui.action_Delete, SIGNAL (triggered ()), this, SLOT (deleteSelected ())); connect (ui.action_Verify, SIGNAL (triggered ()), this, SLOT (verifySelected ())); connect (ui.action_Announce, SIGNAL (triggered ()), this, SLOT (reannounceSelected ())); connect (ui.action_StartAll, SIGNAL (triggered ()), this, SLOT (startAll ())); connect (ui.action_PauseAll, SIGNAL (triggered ()), this, SLOT (pauseAll ())); connect (ui.action_OpenFile, SIGNAL (triggered ()), this, SLOT (openTorrent ())); connect (ui.action_AddURL, SIGNAL (triggered ()), this, SLOT (openURL ())); connect (ui.action_New, SIGNAL (triggered ()), this, SLOT (newTorrent ())); connect (ui.action_Preferences, SIGNAL (triggered ()), this, SLOT (openPreferences ())); connect (ui.action_Statistics, SIGNAL (triggered ()), this, SLOT (openStats ())); connect (ui.action_Donate, SIGNAL (triggered ()), this, SLOT (openDonate ())); connect (ui.action_About, SIGNAL (triggered ()), this, SLOT (openAbout ())); connect (ui.action_Contents, SIGNAL (triggered ()), this, SLOT (openHelp ())); connect (ui.action_OpenFolder, SIGNAL (triggered ()), this, SLOT (openFolder ())); connect (ui.action_CopyMagnetToClipboard, SIGNAL (triggered ()), this, SLOT (copyMagnetLinkToClipboard ())); connect (ui.action_SetLocation, SIGNAL (triggered ()), this, SLOT (setLocation ())); connect (ui.action_Properties, SIGNAL (triggered ()), this, SLOT (openProperties ())); connect (ui.action_SessionDialog, SIGNAL (triggered ()), this, SLOT (openSession ())); connect (ui.listView, SIGNAL (activated (QModelIndex)), ui.action_Properties, SLOT (trigger ())); // signals connect (ui.action_SelectAll, SIGNAL (triggered ()), ui.listView, SLOT (selectAll ())); connect (ui.action_DeselectAll, SIGNAL (triggered ()), ui.listView, SLOT (clearSelection ())); connect (&myFilterModel, SIGNAL (rowsInserted (QModelIndex, int, int)), this, SLOT (refreshActionSensitivitySoon ())); connect (&myFilterModel, SIGNAL (rowsRemoved (QModelIndex, int, int)), this, SLOT (refreshActionSensitivitySoon ())); connect (ui.action_Quit, SIGNAL (triggered ()), qApp, SLOT (quit ())); // torrent view myFilterModel.setSourceModel (&myModel); connect (&myModel, SIGNAL (modelReset ()), this, SLOT (onModelReset ())); connect (&myModel, SIGNAL (rowsRemoved (QModelIndex, int, int)), this, SLOT (onModelReset ())); connect (&myModel, SIGNAL (rowsInserted (QModelIndex, int, int)), this, SLOT (onModelReset ())); connect (&myModel, SIGNAL (dataChanged (QModelIndex, QModelIndex)), this, SLOT (refreshTrayIconSoon ())); ui.listView->setModel (&myFilterModel); connect (ui.listView->selectionModel (), SIGNAL (selectionChanged (QItemSelection, QItemSelection)), this, SLOT (refreshActionSensitivitySoon ())); const QPair sortModes[] = { qMakePair (ui.action_SortByActivity, static_cast (SortMode::SORT_BY_ACTIVITY)), qMakePair (ui.action_SortByAge, static_cast (SortMode::SORT_BY_AGE)), qMakePair (ui.action_SortByETA, static_cast (SortMode::SORT_BY_ETA)), qMakePair (ui.action_SortByName, static_cast (SortMode::SORT_BY_NAME)), qMakePair (ui.action_SortByProgress, static_cast (SortMode::SORT_BY_PROGRESS)), qMakePair (ui.action_SortByQueue, static_cast (SortMode::SORT_BY_QUEUE)), qMakePair (ui.action_SortByRatio, static_cast (SortMode::SORT_BY_RATIO)), qMakePair (ui.action_SortBySize, static_cast (SortMode::SORT_BY_SIZE)), qMakePair (ui.action_SortByState, static_cast (SortMode::SORT_BY_STATE)) }; QActionGroup * actionGroup = new QActionGroup (this); for (const auto& mode: sortModes) { mode.first->setProperty (SORT_MODE_KEY, mode.second); actionGroup->addAction (mode.first); } connect (actionGroup, SIGNAL (triggered (QAction *)), this, SLOT (onSortModeChanged (QAction *))); myAltSpeedAction = new QAction (tr ("Speed Limits"), this); myAltSpeedAction->setIcon (ui.altSpeedButton->icon ()); myAltSpeedAction->setCheckable (true); connect (myAltSpeedAction, SIGNAL (triggered ()), this, SLOT (toggleSpeedMode ())); QMenu * menu = new QMenu (this); menu->addAction (ui.action_OpenFile); menu->addAction (ui.action_AddURL); menu->addSeparator (); menu->addAction (ui.action_ShowMainWindow); menu->addAction (ui.action_ShowMessageLog); menu->addAction (ui.action_About); menu->addSeparator (); menu->addAction (ui.action_StartAll); menu->addAction (ui.action_PauseAll); menu->addAction (myAltSpeedAction); menu->addSeparator (); menu->addAction (ui.action_Quit); myTrayIcon.setContextMenu (menu); myTrayIcon.setIcon (QIcon::fromTheme (QLatin1String ("transmission-tray-icon"), qApp->windowIcon ())); connect (&myPrefs, SIGNAL (changed (int)), this, SLOT (refreshPref (int))); connect (ui.action_ShowMainWindow, SIGNAL (triggered (bool)), this, SLOT (toggleWindows (bool))); connect (&myTrayIcon, SIGNAL (activated (QSystemTrayIcon::ActivationReason)), this, SLOT (trayActivated (QSystemTrayIcon::ActivationReason))); toggleWindows (!minimized); ui.action_TrayIcon->setChecked (minimized || prefs.getBool (Prefs::SHOW_TRAY_ICON)); initStatusBar (); ui.verticalLayout->insertWidget (0, myFilterBar = new FilterBar (myPrefs, myModel, myFilterModel)); connect (&myModel, SIGNAL (rowsInserted (QModelIndex, int, int)), SLOT (refreshTorrentViewHeader ())); connect (&myModel, SIGNAL (rowsRemoved (QModelIndex, int, int)), SLOT (refreshTorrentViewHeader ())); connect (&myFilterModel, SIGNAL (rowsInserted (QModelIndex, int, int)), SLOT (refreshTorrentViewHeader ())); connect (&myFilterModel, SIGNAL (rowsRemoved (QModelIndex, int, int)), SLOT (refreshTorrentViewHeader ())); connect (ui.listView, SIGNAL (headerDoubleClicked ()), myFilterBar, SLOT (clear ())); QList initKeys; initKeys << Prefs::MAIN_WINDOW_X << Prefs::SHOW_TRAY_ICON << Prefs::SORT_REVERSED << Prefs::SORT_MODE << Prefs::FILTERBAR << Prefs::STATUSBAR << Prefs::STATUSBAR_STATS << Prefs::TOOLBAR << Prefs::ALT_SPEED_LIMIT_ENABLED << Prefs::COMPACT_VIEW << Prefs::DSPEED << Prefs::DSPEED_ENABLED << Prefs::USPEED << Prefs::USPEED_ENABLED << Prefs::RATIO << Prefs::RATIO_ENABLED; for (const int key: initKeys) refreshPref (key); connect (&mySession, SIGNAL (sourceChanged ()), this, SLOT (onSessionSourceChanged ())); connect (&mySession, SIGNAL (statsUpdated ()), this, SLOT (refreshStatusBar ())); connect (&mySession, SIGNAL (dataReadProgress ()), this, SLOT (dataReadProgress ())); connect (&mySession, SIGNAL (dataSendProgress ()), this, SLOT (dataSendProgress ())); connect (&mySession, SIGNAL (httpAuthenticationRequired ()), this, SLOT (wrongAuthentication ())); connect (&mySession, SIGNAL (error (QNetworkReply::NetworkError)), this, SLOT (onError (QNetworkReply::NetworkError))); connect (&mySession, SIGNAL (errorMessage (QString)), this, SLOT (errorMessage(QString))); if (mySession.isServer ()) { ui.networkLabel->hide (); } else { connect (&myNetworkTimer, SIGNAL (timeout ()), this, SLOT (onNetworkTimer ())); myNetworkTimer.start (1000); } connect (&myRefreshTrayIconTimer, SIGNAL (timeout ()), this, SLOT (refreshTrayIcon ())); connect (&myRefreshActionSensitivityTimer, SIGNAL (timeout ()), this, SLOT (refreshActionSensitivity ())); refreshActionSensitivitySoon (); refreshTrayIconSoon (); refreshStatusBar (); refreshTitle (); refreshTorrentViewHeader (); } MainWindow::~MainWindow () { } /**** ***** ****/ void MainWindow::onSessionSourceChanged () { myModel.clear (); } void MainWindow::onModelReset () { refreshTitle (); refreshActionSensitivitySoon (); refreshStatusBar (); refreshTrayIconSoon (); } /**** ***** ****/ void MainWindow::onSetPrefs () { const QVariantList p = sender ()->property (PREF_VARIANTS_KEY).toList (); assert ( (p.size () % 2) == 0); for (int i=0, n=p.size (); isetMenu (createOptionsMenu ()); const int minimumSpeedWidth = ui.downloadSpeedLabel->fontMetrics ().width (Formatter::uploadSpeedToString (Speed::fromKBps (999.99))); ui.downloadSpeedLabel->setMinimumWidth (minimumSpeedWidth); ui.uploadSpeedLabel->setMinimumWidth (minimumSpeedWidth); ui.statsModeButton->setMenu (createStatsModeMenu ()); connect (ui.altSpeedButton, SIGNAL (clicked ()), this, SLOT (toggleSpeedMode ())); } QMenu * MainWindow::createOptionsMenu () { const auto initSpeedSubMenu = [this] (QMenu * menu, QAction *& offAction, QAction *& onAction, int pref, int enabledPref) { const int stockSpeeds[] = {5, 10, 20, 30, 40, 50, 75, 100, 150, 200, 250, 500, 750}; const int currentValue = myPrefs.get (pref); QActionGroup * actionGroup = new QActionGroup (this); offAction = menu->addAction (tr ("Unlimited")); offAction->setCheckable (true); offAction->setProperty (PREF_VARIANTS_KEY, QVariantList () << enabledPref << false); actionGroup->addAction (offAction); connect (offAction, SIGNAL (triggered (bool)), this, SLOT (onSetPrefs (bool))); onAction = menu->addAction (tr ("Limited at %1").arg (Formatter::speedToString (Speed::fromKBps (currentValue)))); onAction->setCheckable (true); onAction->setProperty (PREF_VARIANTS_KEY, QVariantList () << pref << currentValue << enabledPref << true); actionGroup->addAction (onAction); connect (onAction, SIGNAL (triggered (bool)), this, SLOT (onSetPrefs (bool))); menu->addSeparator (); for (const int i: stockSpeeds) { QAction * action = menu->addAction (Formatter::speedToString (Speed::fromKBps (i))); action->setProperty (PREF_VARIANTS_KEY, QVariantList () << pref << i << enabledPref << true); connect (action, SIGNAL (triggered (bool)), this, SLOT (onSetPrefs ())); } }; const auto initSeedRatioSubMenu = [this] (QMenu * menu, QAction *& offAction, QAction *& onAction, int pref, int enabledPref) { const double stockRatios[] = {0.25, 0.50, 0.75, 1, 1.5, 2, 3}; const double currentValue = myPrefs.get (pref); QActionGroup * actionGroup = new QActionGroup (this); offAction = menu->addAction (tr ("Seed Forever")); offAction->setCheckable (true); offAction->setProperty (PREF_VARIANTS_KEY, QVariantList () << enabledPref << false); actionGroup->addAction (offAction); connect (offAction, SIGNAL (triggered (bool)), this, SLOT (onSetPrefs (bool))); onAction = menu->addAction (tr ("Stop at Ratio (%1)").arg (Formatter::ratioToString (currentValue))); onAction->setCheckable (true); onAction->setProperty (PREF_VARIANTS_KEY, QVariantList () << pref << currentValue << enabledPref << true); actionGroup->addAction (onAction); connect (onAction, SIGNAL (triggered (bool)), this, SLOT (onSetPrefs (bool))); menu->addSeparator (); for (const double i: stockRatios) { QAction * action = menu->addAction (Formatter::ratioToString (i)); action->setProperty (PREF_VARIANTS_KEY, QVariantList () << pref << i << enabledPref << true); connect (action, SIGNAL (triggered (bool)), this, SLOT (onSetPrefs ())); } }; QMenu * menu = new QMenu (this); initSpeedSubMenu (menu->addMenu (tr ("Limit Download Speed")), myDlimitOffAction, myDlimitOnAction, Prefs::DSPEED, Prefs::DSPEED_ENABLED); initSpeedSubMenu (menu->addMenu (tr ("Limit Upload Speed")), myUlimitOffAction, myUlimitOnAction, Prefs::USPEED, Prefs::USPEED_ENABLED); menu->addSeparator (); initSeedRatioSubMenu (menu->addMenu (tr ("Stop Seeding at Ratio")), myRatioOffAction, myRatioOnAction, Prefs::RATIO, Prefs::RATIO_ENABLED); return menu; } QMenu * MainWindow::createStatsModeMenu () { const QPair statsModes[] = { qMakePair (ui.action_TotalRatio, TotalRatioStatsModeName), qMakePair (ui.action_TotalTransfer, TotalTransferStatsModeName), qMakePair (ui.action_SessionRatio, SessionRatioStatsModeName), qMakePair (ui.action_SessionTransfer, SessionTransferStatsModeName) }; QActionGroup * actionGroup = new QActionGroup (this); QMenu * menu = new QMenu (this); for (const auto& mode: statsModes) { mode.first->setProperty (STATS_MODE_KEY, QString (mode.second)); actionGroup->addAction (mode.first); menu->addAction (mode.first); } connect (actionGroup, SIGNAL (triggered (QAction *)), this, SLOT (onStatsModeChanged (QAction *))); return menu; } /**** ***** ****/ void MainWindow::onSortModeChanged (QAction * action) { myPrefs.set (Prefs::SORT_MODE, SortMode (action->property (SORT_MODE_KEY).toInt ())); } void MainWindow::setSortAscendingPref (bool b) { myPrefs.set (Prefs::SORT_REVERSED, b); } /**** ***** ****/ void MainWindow::showEvent (QShowEvent * event) { Q_UNUSED (event); ui.action_ShowMainWindow->setChecked (true); } /**** ***** ****/ void MainWindow::hideEvent (QHideEvent * event) { Q_UNUSED (event); if (!isVisible ()) ui.action_ShowMainWindow->setChecked (false); } /**** ***** ****/ void MainWindow::openSession () { Utils::openDialog (mySessionDialog, mySession, myPrefs, this); } void MainWindow::openPreferences () { Utils::openDialog (myPrefsDialog, mySession, myPrefs, this); } void MainWindow::openProperties () { Utils::openDialog (myDetailsDialog, mySession, myPrefs, myModel, this); myDetailsDialog->setIds (getSelectedTorrents ()); } void MainWindow::setLocation () { RelocateDialog * d = new RelocateDialog (mySession, myModel, getSelectedTorrents (), this); d->setAttribute (Qt::WA_DeleteOnClose, true); d->show (); } // Open Folder & select torrent's file or top folder #undef HAVE_OPEN_SELECT #if defined (Q_OS_WIN) # define HAVE_OPEN_SELECT static void openSelect (const QString& path) { const QString explorer = QLatin1String ("explorer"); QString param; if (!QFileInfo (path).isDir ()) param = QLatin1String ("/select,"); param += QDir::toNativeSeparators (path); QProcess::startDetached (explorer, QStringList (param)); } #elif defined (Q_OS_MAC) # define HAVE_OPEN_SELECT static void openSelect (const QString& path) { QStringList scriptArgs; scriptArgs << QLatin1String ("-e") << QString::fromLatin1 ("tell application \"Finder\" to reveal POSIX file \"%1\"").arg (path); QProcess::execute (QLatin1String ("/usr/bin/osascript"), scriptArgs); scriptArgs.clear (); scriptArgs << QLatin1String ("-e") << QLatin1String ("tell application \"Finder\" to activate"); QProcess::execute (QLatin1String ("/usr/bin/osascript"), scriptArgs); } #endif void MainWindow::openFolder () { const QSet selectedTorrents = getSelectedTorrents (); if (selectedTorrents.size () != 1) return; const int torrentId (*selectedTorrents.begin ()); const Torrent * tor (myModel.getTorrentFromId (torrentId)); if (tor == nullptr) return; QString path (tor->getPath ()); const FileList& files = tor->files (); if (files.isEmpty ()) return; const QString firstfile = files.at (0).filename; int slashIndex = firstfile.indexOf (QLatin1Char ('/')); if (slashIndex > -1) { path = path + QLatin1Char ('/') + firstfile.left (slashIndex); } #ifdef HAVE_OPEN_SELECT else { openSelect (path + QLatin1Char ('/') + firstfile); return; } #endif QDesktopServices::openUrl (QUrl::fromLocalFile (path)); } void MainWindow::copyMagnetLinkToClipboard () { const int id (*getSelectedTorrents ().begin ()); mySession.copyMagnetLinkToClipboard (id); } void MainWindow::openStats () { Utils::openDialog (myStatsDialog, mySession, this); } void MainWindow::openDonate () { QDesktopServices::openUrl (QUrl (QLatin1String ("http://www.transmissionbt.com/donate.php"))); } void MainWindow::openAbout () { Utils::openDialog (myAboutDialog, this); } void MainWindow::openHelp () { QDesktopServices::openUrl (QUrl (QString::fromLatin1 ("http://www.transmissionbt.com/help/gtk/%1.%2x"). arg (MAJOR_VERSION).arg (MINOR_VERSION / 10))); } void MainWindow::refreshTitle () { QString title (QLatin1String ("Transmission")); const QUrl url (mySession.getRemoteUrl ()); if (!url.isEmpty ()) //: Second (optional) part of main window title "Transmission - host:port" (added when connected to remote session); //: notice that leading space (before the dash) is included here title += tr (" - %1:%2").arg (url.host ()).arg (url.port ()); setWindowTitle (title); } void MainWindow::refreshTrayIconSoon () { if (!myRefreshTrayIconTimer.isActive ()) { myRefreshTrayIconTimer.setSingleShot (true); myRefreshTrayIconTimer.start (100); } } void MainWindow::refreshTrayIcon () { Speed upSpeed, downSpeed; size_t upCount, downCount; QString tip; myModel.getTransferSpeed (upSpeed, upCount, downSpeed, downCount); if (myNetworkError) { tip = tr ("Network Error"); } else if (!upCount && !downCount) { tip = tr ("Idle"); } else if (downCount) { tip = Formatter::downloadSpeedToString(downSpeed) + QLatin1String (" ") + Formatter::uploadSpeedToString(upSpeed); } else if (upCount) { tip = Formatter::uploadSpeedToString(upSpeed); } myTrayIcon.setToolTip (tip); } void MainWindow::refreshStatusBar () { Speed upSpeed, downSpeed; size_t upCount, downCount; myModel.getTransferSpeed (upSpeed, upCount, downSpeed, downCount); ui.uploadSpeedLabel->setText (Formatter::uploadSpeedToString (upSpeed)); ui.uploadSpeedLabel->setVisible (downCount || upCount); ui.downloadSpeedLabel->setText (Formatter::downloadSpeedToString (downSpeed)); ui.downloadSpeedLabel->setVisible (downCount); ui.networkLabel->setVisible (!mySession.isServer ()); const QString mode (myPrefs.getString (Prefs::STATUSBAR_STATS)); QString str; if (mode == SessionRatioStatsModeName) { str = tr ("Ratio: %1").arg (Formatter::ratioToString (mySession.getStats ().ratio)); } else if (mode == SessionTransferStatsModeName) { const tr_session_stats& stats (mySession.getStats ()); str = tr ("Down: %1, Up: %2").arg (Formatter::sizeToString (stats.downloadedBytes)) .arg (Formatter::sizeToString (stats.uploadedBytes)); } else if (mode == TotalTransferStatsModeName) { const tr_session_stats& stats (mySession.getCumulativeStats ()); str = tr ("Down: %1, Up: %2").arg (Formatter::sizeToString (stats.downloadedBytes)) .arg (Formatter::sizeToString (stats.uploadedBytes)); } else // default is "total-ratio" { assert (mode == TotalRatioStatsModeName); str = tr ("Ratio: %1").arg (Formatter::ratioToString (mySession.getCumulativeStats ().ratio)); } ui.statsLabel->setText (str); } void MainWindow::refreshTorrentViewHeader () { const int totalCount = myModel.rowCount (); const int visibleCount = myFilterModel.rowCount (); if (visibleCount == totalCount) ui.listView->setHeaderText (QString ()); else ui.listView->setHeaderText (tr ("Showing %L1 of %Ln torrent(s)", 0, totalCount).arg (visibleCount)); } void MainWindow::refreshActionSensitivitySoon () { if (!myRefreshActionSensitivityTimer.isActive ()) { myRefreshActionSensitivityTimer.setSingleShot (true); myRefreshActionSensitivityTimer.start (100); } } void MainWindow::refreshActionSensitivity () { int selected (0); int paused (0); int queued (0); int selectedAndPaused (0); int selectedAndQueued (0); int selectedWithMetadata (0); int canAnnounce (0); const QAbstractItemModel * model (ui.listView->model ()); const QItemSelectionModel * selectionModel (ui.listView->selectionModel ()); const int rowCount (model->rowCount ()); // count how many torrents are selected, paused, etc for (int row=0; rowindex (row, 0)); assert (model == modelIndex.model ()); const Torrent * tor (model->data (modelIndex, TorrentModel::TorrentRole).value ()); if (tor) { const bool isSelected (selectionModel->isSelected (modelIndex)); const bool isPaused (tor->isPaused ()); const bool isQueued (tor->isQueued ()); if (isSelected) ++selected; if (isQueued) ++queued; if (isPaused) ++ paused; if (isSelected && isPaused) ++selectedAndPaused; if (isSelected && isQueued) ++selectedAndQueued; if (isSelected && tor->hasMetadata ()) ++selectedWithMetadata; if (tor->canManualAnnounce ()) ++canAnnounce; } } const bool haveSelection (selected > 0); const bool haveSelectionWithMetadata = selectedWithMetadata > 0; const bool oneSelection (selected == 1); ui.action_Verify->setEnabled (haveSelectionWithMetadata); ui.action_Remove->setEnabled (haveSelection); ui.action_Delete->setEnabled (haveSelection); ui.action_Properties->setEnabled (haveSelection); ui.action_DeselectAll->setEnabled (haveSelection); ui.action_SetLocation->setEnabled (haveSelection); ui.action_OpenFolder->setEnabled (oneSelection && haveSelectionWithMetadata && mySession.isLocal ()); ui.action_CopyMagnetToClipboard->setEnabled (oneSelection); ui.action_SelectAll->setEnabled (selected < rowCount); ui.action_StartAll->setEnabled (paused > 0); ui.action_PauseAll->setEnabled (paused < rowCount); ui.action_Start->setEnabled (selectedAndPaused > 0); ui.action_StartNow->setEnabled (selectedAndPaused + selectedAndQueued > 0); ui.action_Pause->setEnabled (selectedAndPaused < selected); ui.action_Announce->setEnabled (selected > 0 && (canAnnounce == selected)); ui.action_QueueMoveTop->setEnabled (haveSelection); ui.action_QueueMoveUp->setEnabled (haveSelection); ui.action_QueueMoveDown->setEnabled (haveSelection); ui.action_QueueMoveBottom->setEnabled (haveSelection); if (!myDetailsDialog.isNull ()) myDetailsDialog->setIds (getSelectedTorrents ()); } /** *** **/ void MainWindow::clearSelection () { ui.action_DeselectAll->trigger (); } QSet MainWindow::getSelectedTorrents (bool withMetadataOnly) const { QSet ids; for (const QModelIndex& index: ui.listView->selectionModel ()->selectedRows ()) { const Torrent * tor (index.data (TorrentModel::TorrentRole).value ()); if (tor != nullptr && (!withMetadataOnly || tor->hasMetadata ())) ids.insert (tor->id ()); } return ids; } void MainWindow::startSelected () { mySession.startTorrents (getSelectedTorrents ()); } void MainWindow::startSelectedNow () { mySession.startTorrentsNow (getSelectedTorrents ()); } void MainWindow::pauseSelected () { mySession.pauseTorrents (getSelectedTorrents ()); } void MainWindow::queueMoveTop () { mySession.queueMoveTop (getSelectedTorrents ()); } void MainWindow::queueMoveUp () { mySession.queueMoveUp (getSelectedTorrents ()); } void MainWindow::queueMoveDown () { mySession.queueMoveDown (getSelectedTorrents ()); } void MainWindow::queueMoveBottom () { mySession.queueMoveBottom (getSelectedTorrents ()); } void MainWindow::startAll () { mySession.startTorrents (); } void MainWindow::pauseAll () { mySession.pauseTorrents (); } void MainWindow::removeSelected () { removeTorrents (false); } void MainWindow::deleteSelected () { removeTorrents (true); } void MainWindow::verifySelected () { mySession.verifyTorrents (getSelectedTorrents (true)); } void MainWindow::reannounceSelected () { mySession.reannounceTorrents (getSelectedTorrents ()); } /** *** **/ void MainWindow::onStatsModeChanged (QAction * action) { myPrefs.set (Prefs::STATUSBAR_STATS, action->property (STATS_MODE_KEY).toString ()); } /** *** **/ void MainWindow::setCompactView (bool visible) { myPrefs.set (Prefs::COMPACT_VIEW, visible); } void MainWindow::toggleSpeedMode () { myPrefs.toggleBool (Prefs::ALT_SPEED_LIMIT_ENABLED); const bool mode = myPrefs.get (Prefs::ALT_SPEED_LIMIT_ENABLED); myAltSpeedAction->setChecked (mode); } void MainWindow::setToolbarVisible (bool visible) { myPrefs.set (Prefs::TOOLBAR, visible); } void MainWindow::setFilterbarVisible (bool visible) { myPrefs.set (Prefs::FILTERBAR, visible); } void MainWindow::setStatusbarVisible (bool visible) { myPrefs.set (Prefs::STATUSBAR, visible); } /** *** **/ void MainWindow::toggleWindows (bool doShow) { if (!doShow) { hide (); } else { if (!isVisible ()) show (); if (isMinimized ()) showNormal (); //activateWindow (); raise (); qApp->setActiveWindow (this); } } void MainWindow::trayActivated (QSystemTrayIcon::ActivationReason reason) { if ((reason == QSystemTrayIcon::Trigger) || (reason == QSystemTrayIcon::DoubleClick)) { if (isMinimized ()) toggleWindows (true); else toggleWindows (!isVisible ()); } } void MainWindow::refreshPref (int key) { bool b; int i; QString str; QActionGroup * actionGroup; switch (key) { case Prefs::STATUSBAR_STATS: str = myPrefs.getString (key); actionGroup = ui.action_TotalRatio->actionGroup (); assert (actionGroup != nullptr); for (QAction * action: actionGroup->actions ()) action->setChecked (str == action->property (STATS_MODE_KEY).toString ()); refreshStatusBar (); break; case Prefs::SORT_REVERSED: ui.action_ReverseSortOrder->setChecked (myPrefs.getBool (key)); break; case Prefs::SORT_MODE: i = myPrefs.get (key).mode (); actionGroup = ui.action_SortByActivity->actionGroup (); assert (actionGroup != nullptr); for (QAction * action: actionGroup->actions ()) action->setChecked (i == action->property (SORT_MODE_KEY).toInt ()); break; case Prefs::DSPEED_ENABLED: (myPrefs.get (key) ? myDlimitOnAction : myDlimitOffAction)->setChecked (true); break; case Prefs::DSPEED: myDlimitOnAction->setText (tr ("Limited at %1").arg (Formatter::speedToString (Speed::fromKBps (myPrefs.get (key))))); break; case Prefs::USPEED_ENABLED: (myPrefs.get (key) ? myUlimitOnAction : myUlimitOffAction)->setChecked (true); break; case Prefs::USPEED: myUlimitOnAction->setText (tr ("Limited at %1").arg (Formatter::speedToString (Speed::fromKBps (myPrefs.get (key))))); break; case Prefs::RATIO_ENABLED: (myPrefs.get (key) ? myRatioOnAction : myRatioOffAction)->setChecked (true); break; case Prefs::RATIO: myRatioOnAction->setText (tr ("Stop at Ratio (%1)").arg (Formatter::ratioToString (myPrefs.get (key)))); break; case Prefs::FILTERBAR: b = myPrefs.getBool (key); myFilterBar->setVisible (b); ui.action_Filterbar->setChecked (b); break; case Prefs::STATUSBAR: b = myPrefs.getBool (key); ui.statusBar->setVisible (b); ui.action_Statusbar->setChecked (b); break; case Prefs::TOOLBAR: b = myPrefs.getBool (key); ui.toolBar->setVisible (b); ui.action_Toolbar->setChecked (b); break; case Prefs::SHOW_TRAY_ICON: b = myPrefs.getBool (key); ui.action_TrayIcon->setChecked (b); myTrayIcon.setVisible (b); qApp->setQuitOnLastWindowClosed (!b); refreshTrayIconSoon (); break; case Prefs::COMPACT_VIEW: { #if QT_VERSION < QT_VERSION_CHECK(5, 4, 0) // QTBUG-33537 QItemSelectionModel * selectionModel (ui.listView->selectionModel ()); const QItemSelection selection (selectionModel->selection ()); const QModelIndex currentIndex (selectionModel->currentIndex ()); #endif b = myPrefs.getBool (key); ui.action_CompactView->setChecked (b); ui.listView->setItemDelegate (b ? myTorrentDelegateMin : myTorrentDelegate); #if QT_VERSION < QT_VERSION_CHECK(5, 4, 0) // QTBUG-33537 selectionModel->clear (); ui.listView->reset (); // force the rows to resize selectionModel->select (selection, QItemSelectionModel::Select); selectionModel->setCurrentIndex (currentIndex, QItemSelectionModel::NoUpdate); #endif break; } case Prefs::MAIN_WINDOW_X: case Prefs::MAIN_WINDOW_Y: case Prefs::MAIN_WINDOW_WIDTH: case Prefs::MAIN_WINDOW_HEIGHT: setGeometry (myPrefs.getInt (Prefs::MAIN_WINDOW_X), myPrefs.getInt (Prefs::MAIN_WINDOW_Y), myPrefs.getInt (Prefs::MAIN_WINDOW_WIDTH), myPrefs.getInt (Prefs::MAIN_WINDOW_HEIGHT)); break; case Prefs::ALT_SPEED_LIMIT_ENABLED: case Prefs::ALT_SPEED_LIMIT_UP: case Prefs::ALT_SPEED_LIMIT_DOWN: { b = myPrefs.getBool (Prefs::ALT_SPEED_LIMIT_ENABLED); myAltSpeedAction->setChecked (b); ui.altSpeedButton->setChecked (b); const QString fmt = b ? tr ("Click to disable Temporary Speed Limits\n (%1 down, %2 up)") : tr ("Click to enable Temporary Speed Limits\n (%1 down, %2 up)"); const Speed d = Speed::fromKBps (myPrefs.getInt (Prefs::ALT_SPEED_LIMIT_DOWN)); const Speed u = Speed::fromKBps (myPrefs.getInt (Prefs::ALT_SPEED_LIMIT_UP)); ui.altSpeedButton->setToolTip (fmt.arg (Formatter::speedToString (d)) .arg (Formatter::speedToString (u))); break; } default: break; } } /*** **** ***/ namespace { const QLatin1String SHOW_OPTIONS_CHECKBOX_NAME ("show-options-checkbox"); } void MainWindow::newTorrent () { MakeDialog * dialog = new MakeDialog (mySession, this); dialog->setAttribute (Qt::WA_DeleteOnClose); dialog->show (); } void MainWindow::openTorrent () { QFileDialog * d; d = new QFileDialog (this, tr ("Open Torrent"), myPrefs.getString (Prefs::OPEN_DIALOG_FOLDER), tr ("Torrent Files (*.torrent);;All Files (*.*)")); d->setFileMode (QFileDialog::ExistingFiles); d->setAttribute (Qt::WA_DeleteOnClose); const auto l = qobject_cast (d->layout ()); if (l != nullptr) { QCheckBox * b = new QCheckBox (tr ("Show &options dialog")); b->setChecked (myPrefs.getBool (Prefs::OPTIONS_PROMPT)); b->setObjectName (SHOW_OPTIONS_CHECKBOX_NAME); l->addWidget (b, l->rowCount(), 0, 1, -1, Qt::AlignLeft); } connect (d, SIGNAL (filesSelected (QStringList)), this, SLOT (addTorrents (QStringList))); d->open (); } void MainWindow::openURL () { QString str = qApp->clipboard ()->text (QClipboard::Selection); if (!AddData::isSupported (str)) str = qApp->clipboard ()->text (QClipboard::Clipboard); if (!AddData::isSupported (str)) str.clear (); addTorrent (str, true); } void MainWindow::addTorrents (const QStringList& filenames) { bool showOptions = myPrefs.getBool (Prefs::OPTIONS_PROMPT); const QFileDialog * const fileDialog = qobject_cast (sender ()); if (fileDialog != NULL) { const QCheckBox * const b = fileDialog->findChild (SHOW_OPTIONS_CHECKBOX_NAME); if (b != NULL) showOptions = b->isChecked (); } for (const QString& filename: filenames) addTorrent (filename, showOptions); } void MainWindow::addTorrent (const AddData& addMe, bool showOptions) { if (showOptions) { OptionsDialog * o = new OptionsDialog (mySession, myPrefs, addMe, this); o->show (); qApp->alert (o); } else { mySession.addTorrent (addMe); qApp->alert (this); } } void MainWindow::removeTorrents (const bool deleteFiles) { QSet ids; QMessageBox msgBox (this); QString primary_text, secondary_text; int incomplete = 0; int connected = 0; int count; for (const QModelIndex& index: ui.listView->selectionModel ()->selectedRows ()) { const Torrent * tor (index.data (TorrentModel::TorrentRole).value ()); ids.insert (tor->id ()); if (tor->connectedPeers ()) ++connected; if (!tor->isDone ()) ++incomplete; } if (ids.isEmpty ()) return; count = ids.size (); if (!deleteFiles) { primary_text = (count == 1) ? tr ("Remove torrent?") : tr ("Remove %Ln torrent(s)?", 0, count); } else { primary_text = (count == 1) ? tr ("Delete this torrent's downloaded files?") : tr ("Delete these %Ln torrent(s)' downloaded files?", 0, count); } if (!incomplete && !connected) { secondary_text = (count == 1) ? tr ("Once removed, continuing the transfer will require the torrent file or magnet link.") : tr ("Once removed, continuing the transfers will require the torrent files or magnet links."); } else if (count == incomplete) { secondary_text = (count == 1) ? tr ("This torrent has not finished downloading.") : tr ("These torrents have not finished downloading."); } else if (count == connected) { secondary_text = (count == 1) ? tr ("This torrent is connected to peers.") : tr ("These torrents are connected to peers."); } else { if (connected) { secondary_text = (connected == 1) ? tr ("One of these torrents is connected to peers.") : tr ("Some of these torrents are connected to peers."); } if (connected && incomplete) { secondary_text += QLatin1Char ('\n'); } if (incomplete) { secondary_text += (incomplete == 1) ? tr ("One of these torrents has not finished downloading.") : tr ("Some of these torrents have not finished downloading."); } } msgBox.setWindowTitle (QLatin1String (" ")); msgBox.setText (QString::fromLatin1 ("%1").arg (primary_text)); msgBox.setInformativeText (secondary_text); msgBox.setStandardButtons (QMessageBox::Ok | QMessageBox::Cancel); msgBox.setDefaultButton (QMessageBox::Cancel); msgBox.setIcon (QMessageBox::Question); // hack needed to keep the dialog from being too narrow auto layout = qobject_cast (msgBox.layout ()); if (layout == nullptr) { layout = new QGridLayout; msgBox.setLayout (layout); } QSpacerItem* spacer = new QSpacerItem (450, 0, QSizePolicy::Minimum, QSizePolicy::Expanding); layout->addItem (spacer, layout->rowCount (), 0, 1, layout->columnCount ()); if (msgBox.exec () == QMessageBox::Ok) { ui.listView->selectionModel ()->clear (); mySession.removeTorrents (ids, deleteFiles); } } /*** **** ***/ void MainWindow::updateNetworkIcon () { const time_t now = time (NULL); const int period = 3; const time_t secondsSinceLastSend = now - myLastSendTime; const time_t secondsSinceLastRead = now - myLastReadTime; const bool isSending = secondsSinceLastSend <= period; const bool isReading = secondsSinceLastRead <= period; const char * key; if (myNetworkError) key = "network-error"; else if (isSending && isReading) key = "network-transmit-receive"; else if (isSending) key = "network-transmit"; else if (isReading) key = "network-receive"; else key = "network-idle"; const QIcon icon = getStockIcon (QLatin1String (key), QStyle::SP_DriveNetIcon); const QPixmap pixmap = icon.pixmap (16, 16); QString tip; const QString url = mySession.getRemoteUrl ().host (); if (!myLastReadTime) tip = tr ("%1 has not responded yet").arg (url); else if (myNetworkError) tip = tr (myErrorMessage.toLatin1 ().constData ()); else if (secondsSinceLastRead < 30) tip = tr ("%1 is responding").arg (url); else if (secondsSinceLastRead < (60*2)) tip = tr ("%1 last responded %2 ago").arg (url).arg (Formatter::timeToString (secondsSinceLastRead)); else tip = tr ("%1 is not responding").arg (url); ui.networkLabel->setPixmap (pixmap); ui.networkLabel->setToolTip (tip); } void MainWindow::onNetworkTimer () { updateNetworkIcon (); } void MainWindow::dataReadProgress () { if (!myNetworkError) myLastReadTime = time (NULL); } void MainWindow::dataSendProgress () { myLastSendTime = time (NULL); } void MainWindow::onError (QNetworkReply::NetworkError code) { const bool hadError = myNetworkError; const bool haveError = (code != QNetworkReply::NoError) && (code != QNetworkReply::UnknownContentError); myNetworkError = haveError; refreshTrayIconSoon(); updateNetworkIcon(); // Refresh our model if we've just gotten a clean connection to the session. // That way we can rebuild after a restart of transmission-daemon if (hadError && !haveError) myModel.clear(); } void MainWindow::errorMessage (const QString& msg) { myErrorMessage = msg; } void MainWindow::wrongAuthentication () { mySession.stop (); openSession (); } /*** **** ***/ void MainWindow::dragEnterEvent (QDragEnterEvent * event) { const QMimeData * mime = event->mimeData (); if (mime->hasFormat (QLatin1String ("application/x-bittorrent")) || mime->hasUrls() || mime->text ().trimmed ().endsWith (QLatin1String (".torrent"), Qt::CaseInsensitive) || mime->text ().startsWith (QLatin1String ("magnet:"), Qt::CaseInsensitive)) event->acceptProposedAction (); } void MainWindow::dropEvent (QDropEvent * event) { QStringList list; if (event->mimeData()->hasText()) { list = event->mimeData()->text().trimmed().split(QLatin1Char ('\n')); } else if (event->mimeData()->hasUrls()) { for (const QUrl& url: event->mimeData()->urls()) list.append(url.toLocalFile()); } for (const QString& entry: list) { QString key = entry.trimmed(); if (!key.isEmpty()) { const QUrl url (key); if (url.scheme () == QLatin1String ("file")) key = QUrl::fromPercentEncoding (url.path().toUtf8()); qApp->addTorrent (key); } } } /*** **** ***/ void MainWindow::contextMenuEvent (QContextMenuEvent * event) { ui.menuTorrent->popup (event->globalPos ()); } transmission-2.92/qt/PaxHeaders.4960/FileTreeDelegate.h0000644000000000000000000000013212537301461017607 xustar0030 mtime=1434288945.122418374 30 atime=1434288945.122418374 30 ctime=1457295917.244761052 transmission-2.92/qt/FileTreeDelegate.h0000644000175000017500000000137512537301461021242 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FileTreeDelegate.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_FILE_TREE_DELEGATE_H #define QTR_FILE_TREE_DELEGATE_H #include class FileTreeDelegate: public QItemDelegate { Q_OBJECT public: FileTreeDelegate (QObject * parent = nullptr): QItemDelegate (parent) {} virtual ~FileTreeDelegate () {} public: // QAbstractItemDelegate virtual QSize sizeHint (const QStyleOptionViewItem&, const QModelIndex&) const; virtual void paint (QPainter *, const QStyleOptionViewItem&, const QModelIndex&) const; }; #endif // QTR_FILE_TREE_DELEGATE_H transmission-2.92/qt/PaxHeaders.4960/transmission-qt.idl0000644000000000000000000000013212634376710020160 xustar0030 mtime=1450311112.717085633 30 atime=1450311112.717085633 30 ctime=1457295917.246761086 transmission-2.92/qt/transmission-qt.idl0000644000175000017500000000112712634376710021606 0ustar00mikedldmikedld00000000000000import "ocidl.idl"; [ uuid(1E405FC2-1A3A-468B-8BD6-BFBB58770390), version(1.0), helpstring("Transmission Qt Client Type Library 1.0") ] library TransmissionLib { [ uuid(9402F54F-4906-4F20-AD73-AFCFEB5B228D), helpstring("QtClient Interface") ] dispinterface IQtClient { properties: methods: [id(1)] VARIANT_BOOL PresentWindow(); [id(2)] VARIANT_BOOL AddMetainfo([in] BSTR p_metainfo); }; [ aggregatable, appobject, helpstring("Transmission Qt Client Class"), uuid(0E2C952C-0597-491F-BA26-249D7E6FAB49) ] coclass QtClient { [default] dispinterface IQtClient; }; }; transmission-2.92/qt/PaxHeaders.4960/Filters.cc0000644000000000000000000000013212536126416016227 xustar0030 mtime=1433971982.530589808 30 atime=1433971982.530589808 30 ctime=1457295917.241761001 transmission-2.92/qt/Filters.cc0000644000175000017500000000246712536126416017665 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: Filters.cc 14537 2015-06-10 21:27:11Z mikedld $ */ #include "Filters.h" const QString FilterMode::names[NUM_MODES] = { QLatin1String ("show-all"), QLatin1String ("show-active"), QLatin1String ("show-downloading"), QLatin1String ("show-seeding"), QLatin1String ("show-paused"), QLatin1String ("show-finished"), QLatin1String ("show-verifying"), QLatin1String ("show-error") }; int FilterMode::modeFromName (const QString& name) { for (int i=0; i class IconToolButton: public QToolButton { Q_OBJECT public: IconToolButton (QWidget * parent = nullptr); // QWidget virtual QSize sizeHint () const; protected: // QWidget virtual void paintEvent (QPaintEvent * event); }; #endif // QTR_ICON_TOOL_BUTTON_H transmission-2.92/qt/PaxHeaders.4960/FilterBarLineEdit.cc0000644000000000000000000000013212536126416020107 xustar0030 mtime=1433971982.534589883 30 atime=1433971982.534589883 30 ctime=1457295917.241761001 transmission-2.92/qt/FilterBarLineEdit.cc0000644000175000017500000000500712536126416021536 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FilterBarLineEdit.cc 14537 2015-06-10 21:27:11Z mikedld $ */ #include #include #include "FilterBarLineEdit.h" FilterBarLineEdit::FilterBarLineEdit (QWidget * parent): QLineEdit (parent), myClearButton (nullptr) { #if QT_VERSION < QT_VERSION_CHECK(5, 2, 0) const QIcon icon = QIcon::fromTheme (QLatin1String ("edit-clear"), style ()->standardIcon (QStyle::SP_DialogCloseButton)); const int iconSize = style ()->pixelMetric (QStyle::PM_SmallIconSize); myClearButton = new QToolButton (this); myClearButton->setStyleSheet (QLatin1String ("QToolButton{border:0;padding:0;margin:0}")); myClearButton->setToolButtonStyle (Qt::ToolButtonIconOnly); myClearButton->setFocusPolicy (Qt::NoFocus); myClearButton->setCursor (Qt::ArrowCursor); myClearButton->setIconSize (QSize (iconSize, iconSize)); myClearButton->setIcon (icon); myClearButton->setFixedSize (myClearButton->iconSize () + QSize (2, 2)); myClearButton->hide (); const int frameWidth = style ()->pixelMetric (QStyle::PM_DefaultFrameWidth); const QSize minSizeHint = minimumSizeHint (); const QSize buttonSize = myClearButton->size (); setStyleSheet (QString::fromLatin1 ("QLineEdit{padding-right:%1px}").arg (buttonSize.width () + frameWidth + 1)); setMinimumSize (qMax (minSizeHint.width (), buttonSize.width () + frameWidth * 2 + 2), qMax (minSizeHint.height (), buttonSize.height () + frameWidth * 2 + 2)); connect (this, SIGNAL (textChanged (QString)), this, SLOT (updateClearButtonVisibility ())); connect (myClearButton, SIGNAL (clicked ()), this, SLOT (clear ())); #else setClearButtonEnabled (true); #endif #if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0) setPlaceholderText (tr ("Search...")); #endif } void FilterBarLineEdit::resizeEvent (QResizeEvent * event) { QLineEdit::resizeEvent (event); #if QT_VERSION < QT_VERSION_CHECK(5, 2, 0) const int frameWidth = style ()->pixelMetric (QStyle::PM_DefaultFrameWidth); const QRect editRect = rect(); const QSize buttonSize = myClearButton->size (); myClearButton->move (editRect.right () - frameWidth - buttonSize.width (), editRect.top () + (editRect.height () - buttonSize.height ()) / 2); #endif } void FilterBarLineEdit::updateClearButtonVisibility () { #if QT_VERSION < QT_VERSION_CHECK(5, 2, 0) myClearButton->setVisible (!text ().isEmpty ()); #endif } transmission-2.92/qt/PaxHeaders.4960/AboutDialog.ui0000644000000000000000000000013212536126416017041 xustar0030 mtime=1433971982.533589864 30 atime=1433971982.533589864 30 ctime=1457295917.241761001 transmission-2.92/qt/AboutDialog.ui0000644000175000017500000000642012536126416020470 0ustar00mikedldmikedld00000000000000 AboutDialog 0 0 249 191 About Transmission QLayout::SetFixedSize Qt::AlignCenter Qt::AlignCenter 8 A fast and easy BitTorrent client Qt::AlignCenter Copyright (c) The Transmission Project Qt::AlignCenter <a href="http://www.transmissionbt.com/">http://www.transmissionbt.com/</a> Qt::AlignCenter true Qt::Vertical QSizePolicy::Fixed 1 12 Qt::Horizontal QDialogButtonBox::Close true dialogButtons accepted() AboutDialog accept() 248 254 157 274 dialogButtons rejected() AboutDialog reject() 316 260 286 274 transmission-2.92/qt/PaxHeaders.4960/config.pri.in0000644000000000000000000000013212505250244016667 xustar0030 mtime=1427460260.647247171 30 atime=1427460260.647247171 30 ctime=1457295917.241761001 transmission-2.92/qt/config.pri.in0000644000175000017500000000023512505250244020314 0ustar00mikedldmikedld00000000000000DHT_LIBS = @DHT_LIBS_QT@ LIBB64_LIBS = @LIBB64_LIBS_QT@ LIBUTP_LIBS = @LIBUTP_LIBS_QT@ LIBUPNP_LIBS = @LIBUPNP_LIBS_QT@ LIBNATPMP_LIBS = @LIBNATPMP_LIBS_QT@ transmission-2.92/qt/PaxHeaders.4960/CustomVariantType.h0000644000000000000000000000013212537301461020116 xustar0030 mtime=1434288945.124418409 30 atime=1434288945.124418409 30 ctime=1457295917.241761001 transmission-2.92/qt/CustomVariantType.h0000644000175000017500000000100712537301461021541 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: CustomVariantType.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_TYPES_H #define QTR_TYPES_H #include class CustomVariantType { public: enum { TrackerStatsList = QVariant::UserType, PeerList = QVariant::UserType, FileList, FilterModeType, SortModeType }; }; #endif // QTR_TYPES_H transmission-2.92/qt/PaxHeaders.4960/SqueezeLabel.h0000644000000000000000000000013212537301461017036 xustar0030 mtime=1434288945.139418672 30 atime=1434288945.139418672 30 ctime=1457295917.244761052 transmission-2.92/qt/SqueezeLabel.h0000644000175000017500000000443612537301461020472 0ustar00mikedldmikedld00000000000000/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** ** This file is part of the demonstration applications of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QTR_SQUEEZE_LABEL_H #define QTR_SQUEEZE_LABEL_H #include class SqueezeLabel: public QLabel { Q_OBJECT public: SqueezeLabel (QWidget * parent = nullptr); SqueezeLabel (const QString& text, QWidget * parent = nullptr); protected: // QWidget virtual void paintEvent (QPaintEvent * paintEvent); }; #endif // QTR_SQUEEZE_LABEL_H transmission-2.92/qt/PaxHeaders.4960/FilterBarComboBox.cc0000644000000000000000000000013212536126416020122 xustar0030 mtime=1433971982.547590126 30 atime=1433971982.547590126 30 ctime=1457295917.244761052 transmission-2.92/qt/FilterBarComboBox.cc0000644000175000017500000001132612536126416021552 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FilterBarComboBox.cc 14537 2015-06-10 21:27:11Z mikedld $ */ #include #include #include #include "FilterBarComboBox.h" #include "Utils.h" namespace { int getHSpacing (const QWidget * w) { return qMax (3, w->style ()->pixelMetric (QStyle::PM_LayoutHorizontalSpacing, 0, w)); } } FilterBarComboBox::FilterBarComboBox (QWidget * parent): QComboBox (parent) { setSizeAdjustPolicy (QComboBox::AdjustToContents); } int FilterBarComboBox::currentCount () const { int count = 0; const QModelIndex modelIndex = model ()->index (currentIndex (), 0, rootModelIndex ()); if (modelIndex.isValid ()) count = modelIndex.data (CountRole).toInt (); return count; } QSize FilterBarComboBox::minimumSizeHint () const { QFontMetrics fm (fontMetrics ()); const QSize textSize = fm.boundingRect (itemText (0)).size (); const QSize countSize = fm.boundingRect (itemData (0, CountStringRole).toString ()).size (); return calculateSize (textSize, countSize); } QSize FilterBarComboBox::sizeHint () const { QFontMetrics fm (fontMetrics ()); QSize maxTextSize (0, 0); QSize maxCountSize (0, 0); for (int i = 0, n = count (); i < n; ++i) { const QSize textSize = fm.boundingRect (itemText (i)).size (); maxTextSize.setHeight (qMax (maxTextSize.height (), textSize.height ())); maxTextSize.setWidth (qMax (maxTextSize.width (), textSize.width ())); const QSize countSize = fm.boundingRect (itemData (i, CountStringRole).toString ()).size (); maxCountSize.setHeight (qMax (maxCountSize.height (), countSize.height ())); maxCountSize.setWidth (qMax (maxCountSize.width (), countSize.width ())); } return calculateSize (maxTextSize, maxCountSize); } QSize FilterBarComboBox::calculateSize (const QSize& textSize, const QSize& countSize) const { const int hmargin = getHSpacing (this); QStyleOptionComboBox option; initStyleOption (&option); QSize contentSize = iconSize () + QSize (4, 2); contentSize.setHeight (qMax (contentSize.height (), textSize.height ())); contentSize.rwidth () += hmargin + textSize.width (); contentSize.rwidth () += hmargin + countSize.width (); return style ()->sizeFromContents (QStyle::CT_ComboBox, &option, contentSize, this).expandedTo (qApp->globalStrut ()); } void FilterBarComboBox::paintEvent (QPaintEvent * e) { Q_UNUSED (e); QStylePainter painter (this); painter.setPen (palette ().color (QPalette::Text)); // draw the combobox frame, focusrect and selected etc. QStyleOptionComboBox opt; initStyleOption (&opt); painter.drawComplexControl (QStyle::CC_ComboBox, opt); // draw the icon and text const QModelIndex modelIndex = model ()->index (currentIndex (), 0, rootModelIndex ()); if (modelIndex.isValid ()) { QStyle * s = style (); const int hmargin = getHSpacing (this); QRect rect = s->subControlRect (QStyle::CC_ComboBox, &opt, QStyle::SC_ComboBoxEditField, this); rect.adjust (2, 1, -2, -1); // draw the icon QPixmap pixmap; QVariant variant = modelIndex.data (Qt::DecorationRole); switch (variant.type ()) { case QVariant::Pixmap: pixmap = qvariant_cast (variant); break; case QVariant::Icon: pixmap = qvariant_cast (variant).pixmap (iconSize ()); break; default: break; } if (!pixmap.isNull ()) { const QRect iconRect = QStyle::alignedRect(opt.direction, Qt::AlignLeft | Qt::AlignVCenter, opt.iconSize, rect); painter.drawPixmap (iconRect.topLeft (), pixmap); Utils::narrowRect (rect, iconRect.width () + hmargin, 0, opt.direction); } // draw the count QString text = modelIndex.data (CountStringRole).toString (); if (!text.isEmpty ()) { const QPen pen = painter.pen (); painter.setPen (Utils::getFadedColor (pen.color ())); const QRect textRect = QStyle::alignedRect(opt.direction, Qt::AlignRight | Qt::AlignVCenter, QSize (opt.fontMetrics.width (text), rect.height ()), rect); painter.drawText (textRect, Qt::AlignRight | Qt::AlignVCenter, text); Utils::narrowRect (rect, 0, textRect.width () + hmargin, opt.direction); painter.setPen (pen); } // draw the text text = modelIndex.data (Qt::DisplayRole).toString (); text = painter.fontMetrics ().elidedText (text, Qt::ElideRight, rect.width ()); painter.drawText (rect, Qt::AlignLeft | Qt::AlignVCenter, text); } } transmission-2.92/qt/PaxHeaders.4960/Formatter.h0000644000000000000000000000013212537301461016420 xustar0030 mtime=1434288945.182419426 30 atime=1434288945.182419426 30 ctime=1457295917.241761001 transmission-2.92/qt/Formatter.h0000644000175000017500000000224112537301461020044 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: Formatter.h 14540 2015-06-12 22:41:36Z mikedld $ */ #ifndef QTR_FORMATTER_H #define QTR_FORMATTER_H #include // int64_t #include #include class Speed; class Formatter { Q_DECLARE_TR_FUNCTIONS (Formatter) public: enum Size { B, KB, MB, GB, TB }; enum Type { SPEED, SIZE, MEM }; public: static QString memToString (int64_t bytes); static QString sizeToString (int64_t bytes); static QString speedToString (const Speed& speed); static QString percentToString (double x); static QString ratioToString (double ratio); static QString timeToString (int seconds); static QString uploadSpeedToString (const Speed& up); static QString downloadSpeedToString (const Speed& down); static QString unitStr (Type t, Size s) { return unitStrings[t][s]; } static void initUnits (); private: static QString unitStrings[3][5]; }; #endif // QTR_FORMATTER_H transmission-2.92/qt/PaxHeaders.4960/TorrentView.cc0000644000000000000000000000013212613027544017105 xustar0030 mtime=1445736292.787076258 30 atime=1445736292.787076258 30 ctime=1457295917.241761001 transmission-2.92/qt/TorrentView.cc0000644000175000017500000000477412613027544020546 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: TorrentView.cc 14590 2015-10-24 20:56:45Z mikedld $ */ #include #include #include #include "TorrentView.h" class TorrentView::HeaderWidget: public QWidget { public: HeaderWidget (TorrentView * parent): QWidget (parent), myText () { setFont (qApp->font ("QMiniFont")); } void setText (const QString& text) { myText = text; update (); } // QWidget virtual QSize sizeHint () const { QStyleOptionHeader option; option.rect = QRect (0, 0, 100, 100); const QRect labelRect = style ()->subElementRect (QStyle::SE_HeaderLabel, &option, this); return QSize (100, fontMetrics ().height () + (option.rect.height () - labelRect.height ())); } protected: // QWidget virtual void paintEvent (QPaintEvent * /*event*/) { QStyleOptionHeader option; option.initFrom (this); option.state = QStyle::State_Enabled; option.position = QStyleOptionHeader::OnlyOneSection; QStylePainter painter (this); painter.drawControl (QStyle::CE_HeaderSection, option); option.rect = style ()->subElementRect (QStyle::SE_HeaderLabel, &option, this); painter.drawItemText (option.rect, Qt::AlignCenter, option.palette, true, myText, QPalette::ButtonText); } virtual void mouseDoubleClickEvent (QMouseEvent * /*event*/) { emit static_cast (parent ())->headerDoubleClicked (); } private: QString myText; }; TorrentView::TorrentView (QWidget * parent): QListView (parent), myHeaderWidget (new HeaderWidget (this)) { } void TorrentView::setHeaderText (const QString& text) { const bool headerVisible = !text.isEmpty (); myHeaderWidget->setText (text); myHeaderWidget->setVisible (headerVisible); if (headerVisible) adjustHeaderPosition (); setViewportMargins (0, headerVisible ? myHeaderWidget->height () : 0, 0, 0); } void TorrentView::resizeEvent (QResizeEvent * event) { QListView::resizeEvent (event); if (myHeaderWidget->isVisible ()) adjustHeaderPosition (); } void TorrentView::adjustHeaderPosition () { QRect headerWidgetRect = contentsRect (); headerWidgetRect.setWidth (viewport ()->width ()); headerWidgetRect.setHeight (myHeaderWidget->sizeHint ().height ()); myHeaderWidget->setGeometry (headerWidgetRect); } transmission-2.92/qt/PaxHeaders.4960/TorrentFilter.h0000644000000000000000000000012612537301461017263 xustar0028 mtime=1434288945.1524189 28 atime=1434288945.1524189 30 ctime=1457295917.241761001 transmission-2.92/qt/TorrentFilter.h0000644000175000017500000000232412537301461020706 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: TorrentFilter.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_TORRENT_FILTER_H #define QTR_TORRENT_FILTER_H #include class QString; class FilterMode; class Prefs; class Torrent; class TorrentFilter: public QSortFilterProxyModel { Q_OBJECT public: enum TextMode { FILTER_BY_NAME, FILTER_BY_FILES, FILTER_BY_TRACKER }; public: TorrentFilter (const Prefs& prefs); virtual ~TorrentFilter (); int hiddenRowCount () const; void countTorrentsPerMode (int * setmeCounts) const; protected: // QSortFilterProxyModel virtual bool filterAcceptsRow (int, const QModelIndex&) const; virtual bool lessThan (const QModelIndex&, const QModelIndex&) const; private: bool activityFilterAcceptsTorrent (const Torrent * tor, const FilterMode& mode) const; bool trackerFilterAcceptsTorrent (const Torrent * tor, const QString& tracker) const; private slots: void refreshPref (int key); private: const Prefs& myPrefs; }; #endif // QTR_TORRENT_FILTER_H transmission-2.92/qt/PaxHeaders.4960/qtr.ico0000644000000000000000000000013212442116607015607 xustar0030 mtime=1418239367.916308012 30 atime=1418239367.916308012 30 ctime=1457295917.269761477 transmission-2.92/qt/qtr.ico0000644000175000017500000002267612442116607017251 0ustar00mikedldmikedld0000000000000000 ¨%(0` ÿÿÿÿÿÿ77$;;4'7728885A>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M>?;M;<9H99/6770%... ÿÿÿÿÿÿÿÿÿÿÿÿ+++771*66.BJLI‹TXVóW[YøY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øY][øX\ZøTXVûSWUÛBDAd770%333ÿÿÿÿÿÿÿÿÿÿÿÿ@@@77/2*333ÿÿÿÿÿÿÿÿÿÿÿÿ---Y\Z˯²°ÿ¸»¹ÿ¸»¹ÿ®²°ÿw{yÿ[_]ÿdgfÿbgeÿcfdÿbedÿafcÿadbÿadbÿ`cbÿ_daÿ_caÿ^baÿ^caÿ]a_ÿ]a_ÿ]a_ÿ]a_ÿ[_]ÿ[`^ÿ[_]ÿY][ÿZ^\ÿY][ÿY][ÿY][ÿY][ÿX\ZÿVZXÿlomÿ¡£¡ÿ¸»¹ÿ»½»ÿ»½»ÿX\Yí77$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿVZX™¡¤£ÿ·º¸ÿµ¸¶ÿˆ‹‰ÿ…‰†ÿèëéÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿçêèÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿîñïÿª®¬ÿrusÿµ¸¶ÿ¹¼ºÿª¬«ÿZ^\ÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSWUn”’øµ¸¶ÿ±´²ÿospÿÁÄÁÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿéíêÿª®¬ÿ…Šˆÿ¨¬ªÿåèæÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿáåâÿ\`^ÿ±´²ÿ¹¼ºÿ˜œšÿW[YšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSWUM~‚€ò¶¹·ÿ®±¯ÿuwvÿ¾ÁÀÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿÏÒÑÿŠŽŒÿjmiÿ@>9ÿgieÿ†‹ˆÿ¼¿½ÿìïíÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿ×ÛÙÿafcÿ®±¯ÿ¹»ºÿ„ˆ†øSWUmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSWU+ospó´·µÿª®«ÿ|€}ÿ«¯­ÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿåèæÿ¢¦¤ÿ…‚ÿLLGÿ:93ÿ:93ÿ:93ÿEE@ÿwzwÿ‹ÿÎÑÐÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿÁÄÁÿosqÿª®«ÿ¸¼¹ÿpsrñSWUGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSWU `dbû³¶´ÿ§ª¨ÿ…ƒÿ˜›šÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿÆÉÈÿ‡ŒŠÿfieÿAA<ÿ??:ÿ??:ÿ??:ÿ??:ÿ??:ÿ??:ÿRTPÿ…ƒÿ™›ÿÜßÞÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿïòðÿ¨¬ªÿy}{ÿ§ª¨ÿ¸º¹ÿ^b`ôSWU"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]a_ò¬°®ÿ£§¥ÿˆ‹ÿ‚‡ƒÿïòðÿïòðÿïòðÿïòðÿïòðÿáäâÿ™›ÿƒÿOQMÿEFBÿNOLÿNOLÿNOLÿNOLÿNOLÿNOLÿNOLÿNOLÿFGDÿad`ÿ…Šˆÿª®¬ÿãçåÿëïíÿëïíÿëïìÿëîìÿëîìÿŽ‘ÿ…ƒÿ¤¨¦ÿ³¶µÿTXVûSWUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿZ^\Õ¤¨¥ÿ ¤¡ÿ“‘ÿorpÿíðîÿìðîÿìïíÿêíëÿ½À¾ÿˆ‹ÿ…Šˆÿ†‹‰ÿ‚‡…ÿSUSÿbedÿbedÿbedÿbedÿbedÿbedÿbedÿbedÿRUSÿ…‰‡ÿ†Šˆÿ…Šˆÿ‹Žÿ¼Á¿ÿåéçÿçëéÿæëèÿæëèÿrxuÿ‹Œÿ£§¤ÿ¥¨¦ÿX\ZäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿX\Z°˜›™ÿž¢ ÿ•™—ÿ^a`ÿèìêÿèìêÿèìêÿèìéÿýýýÿÿÿÿÿÿÿÿÿûüûÿ~‚€ÿRUSÿVXXÿWYXÿWYXÿWYXÿWYXÿWYXÿWYXÿVXXÿW[Yÿˆ‹ÿûûûÿýýýÿýýýÿûûûÿâçäÿâçåÿâçäÿâçäÿ_baÿ“˜•ÿ¤§¦ÿ”˜–ÿX\Z¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿTXV…‹Ž‹þž¡Ÿÿ˜œ™ÿVZXÿàåâÿäèæÿäèæÿãèæÿãèåÿãèåÿãçåÿâçåÿƒˆ…ÿ]`^ÿnsqÿrwtÿrwuÿrwuÿrwuÿrwuÿrwtÿmrpÿ_caÿ‘•’ÿàæãÿáçäÿáæäÿàåâÿÞäáÿÞäáÿÞäáÿ×ÛÙÿUYWÿ™šÿ£§¤ÿ†‰‡þUYWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSWUa|€~õ Ÿÿ•™—ÿ`dbÿËÐÍÿàåâÿßåâÿßäâÿßäáÿßäáÿÞäáÿÞäáÿ“–”ÿ]`^ÿGGCÿ<;5ÿ>=7ÿ?>8ÿ?=8ÿ><7ÿ<:5ÿED@ÿ`daÿ ¥¡ÿÛáÞÿÛáÞÿÛáÞÿÚáÝÿÚàÝÿÚàÝÿÚàÝÿ¿ÄÂÿcfdÿ•™—ÿ£¦¥ÿvywõSWUeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSWU@nqoñ žÿ’–”ÿhmiÿ·¼ºÿÛáÞÿÛáÞÿÛáÞÿÛáÞÿÚàÝÿÚàÝÿÚàÝÿ¥©¦ÿ`a_ÿGGAÿgfbÿxwsÿwwrÿwwrÿxwsÿggaÿGF@ÿdfbÿ­²­ÿ×ÞÚÿ×ÝÚÿÖÝÚÿÖÝÚÿÖÝÙÿÖÝÙÿÕÜÙÿ§­ªÿjomÿ’–”ÿ£¦¤ÿeigñSWU@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSWUcfdöœŸÿ“ÿmrnÿ¤ª§ÿ×ÞÚÿ×ÝÚÿ×ÝÚÿÖÝÚÿÖÝÚÿÖÝÙÿÖÜÙÿ´¹¶ÿ^`\ÿRSNÿ……‚ÿde`ÿbc^ÿbc^ÿde`ÿ„…ÿTSOÿ`b^ÿ¹À¼ÿÓÚÖÿÒÚÖÿÒÙÖÿÒÙÖÿÒÙÖÿÑÙÕÿÑÙÕÿ’˜•ÿqtrÿ“ÿ£¦¤ÿX\ZöSWUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSWU[_]ûš›ÿ‹ÿosqÿ’˜•ÿÓÚ×ÿÓÚÖÿÒÚÖÿÒÙÖÿÒÙÖÿÒÙÖÿÑÙÕÿÅÌÉÿRSOÿ_a]ÿ’”ÿtvrÿtvrÿsuqÿsuqÿ’ÿ_a]ÿVVQÿÈÏÌÿÎÖÓÿÎÖÒÿÎÖÒÿÎÖÒÿÍÕÒÿÍÕÒÿÍÕÑÿy}ÿvzxÿŽ’ÿ›žœÿTXVøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿX\Zè”—•ÿˆŒ‰ÿtwtÿ~„€ÿÎÖÓÿÎÖÓÿÎÖÒÿÎÖÒÿÎÖÒÿÍÕÒÿÍÕÒÿÍÕÑÿMLHÿilgÿ ¢Ÿÿ…ˆ…ÿ…ˆ…ÿ…ˆ…ÿ…ˆ…ÿž¡žÿjliÿTTPÿÊÓÏÿÊÓÏÿÊÒÏÿÊÒÎÿÉÒÎÿÉÒÎÿÉÒÎÿÉÑÎÿfliÿ|€}ÿŽ‘ŽÿŽ‘ÿW[XÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿW[YÈ‹ŽŒÿ†‹ˆÿw{xÿnspÿÊÓÏÿÊÓÏÿÊÒÏÿÊÒÎÿÉÒÎÿÉÒÎÿÉÒÎÿÉÑÍÿWXRÿswsÿ­±­ÿ–›—ÿ–›—ÿ–›—ÿ–›—ÿ¬°­ÿuxvÿ^^ZÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿW\Zÿ…‚ÿŒ’ÿ€„‚ÿV[X¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUYW €ƒÿ†Šˆÿz~{ÿ`daÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿqtpÿ~‚€ÿº¿¼ÿ§®ªÿ§®ªÿ§®ªÿ§­©ÿ¹¾»ÿ~ƒ€ÿrtoÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿ¼ÅÁÿX\Zÿ…ƒÿ‘ÿtxvýTXV…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSWUvuxwû„‰†ÿ{€}ÿUZWÿÇÐÌÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿŽ‘ÿ‡ŒŠÿÆËÉÿ¶½ºÿ¶½ºÿ¶½ºÿ¶½ºÿÅËÈÿ‡ŒŠÿŠŽ‰ÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿÈÑÍÿª²¯ÿadcÿ}‚ÿŒ‘ŽÿhljôSWU]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSWUTkolòƒ‰†ÿz|ÿZ][ÿ¬´°ÿ¼ÅÁÿ¼ÅÁÿ¼ÅÁÿ¼ÅÁÿ¼ÅÁÿ¼ÅÁÿ¼ÅÁÿœ¢ÿ‡ŒŠÿÆËÉÿ¶½ºÿ¶½ºÿ¶½ºÿ¶½ºÿÅËÈÿ‡ŒŠÿ—š—ÿ¼ÅÁÿ¼ÅÁÿ¼ÅÁÿ¼ÅÁÿ¼ÅÁÿ¼ÅÁÿ¼ÅÁÿ’™–ÿeigÿz|ÿŒ‘Žÿ]a_ñSWU8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSWU2afcòƒˆ…ÿv{xÿgliÿkpmÿœ£ ÿž¦¢ÿž¦¢ÿž¦¢ÿž¦¢ÿž¦¢ÿž¦¢ÿ–šÿ‡‹‰ÿÆËÉÿ¶½ºÿ¶½ºÿ¶½ºÿ¶½ºÿÅËÈÿ‡‹‰ÿ‘—”ÿŸ¦£ÿŸ¦£ÿŸ¦£ÿŸ¦£ÿŸ¦£ÿ¤¡ÿ•‘ÿZ^\ÿnspÿw|yÿŠŒÿUYWúSWUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSWUX\Zú‡‹‰ÿv{xÿuzwÿfjhÿW\ZÿSWUÿSWUÿSWUÿSWUÿSWUÿSWUÿTXVÿ‡ŒŠÿÆËÉÿ¶½ºÿ¶½ºÿ¶½ºÿ¶½ºÿÅËÈÿˆ‹ÿX\ZÿSWUÿSWUÿSWUÿSWUÿSWUÿSWUÿ_cbÿkomÿv{xÿ€„‚ÿ~ƒ€ÿTXVðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUYWã|~ÿ…ƒÿy~{ÿw|yÿw|yÿw|yÿw|yÿw|yÿw|yÿw|yÿw|yÿw|yÿ‡ŒŠÿÈÎËÿ¹À½ÿ¹À½ÿ¹À½ÿ¹À½ÿÈÍËÿ‰ŽŒÿy}{ÿw|yÿw|yÿw|yÿw|yÿw|yÿw|yÿw|yÿx}zÿ€…ƒÿ‡Œ‰ÿafcõTXV|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSWUYZ^\ôvzxÿ„ˆ…ÿ…‰†ÿ…‰†ÿ…‰†ÿ…‰†ÿ…‰†ÿ…‰†ÿ…‰†ÿ…‰†ÿ…‰†ÿˆ‹ÿËÑÎÿ½ÄÁÿ½ÄÁÿ½ÄÁÿ½ÄÁÿËÐÎÿŠÿ…‰†ÿ„‰†ÿ„‰†ÿ„‰†ÿ„‰†ÿ„Їÿ„Їÿ„Їÿ„‰†ÿ{€~ÿ_daôTXVçSWU ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSWUSWU_UYWÍTXVñTXVñTXVñTXVñTXVñTXVñTXVñTXVñTXVñUYWñ‡ŒŠÿÏÓÒÿÂÇÅÿÂÇÅÿÂÇÅÿÂÇÅÿÏÓÑÿˆŽŒÿY][òTXVñTXVñTXVñTXVñTXVñTXVñTXVñTXVñUYWéTXVsSWUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ˆ‹üÒÖÕÿÆËÉÿÆËÉÿÆËÉÿÆËÉÿÒÖÔÿ‹ŽöŠŠŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ˆ‹üÕÙØÿÊÏÍÿÊÏÍÿÊÏÍÿÊÏÍÿÕÙ×ÿ‹ŽöŠŠŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ˆ‹üÙÜÛÿÎÓÑÿÎÓÑÿÎÓÑÿÎÓÑÿØÜÛÿ‹ŽöŠŠŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ˆ‹üÜßÞÿÒÖÕÿÒÖÕÿÒÖÕÿÒÖÕÿÛßÞÿ‹‘ŽöŠŠŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ• ++Ї‹üßâáÿÖÚÙÿÖÚÙÿÖÚÙÿÖÚÙÿßâáÿŒ‘÷VVŒ&‰ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“N”¢•Ñ“ó”ú”ø”ø”ø”ø”ø“ø†‹‹ÿâåäÿÚÞÝÿÚÞÝÿÚÞÝÿÚÞÝÿâåäÿ‡Œÿ “ù”ø”ø”ø”ø”ø“ú”õ•Ô–§“Wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•—˜ô ¥ÿ©ÿ­ÿ¯ÿ¯ÿ¯ÿ¯ÿ¯ÿ¯ÿ®ÿ†‹‹ÿåççÿÞááÿÞááÿÞááÿÞááÿåççÿˆÿ¬ÿ¯ÿ¯ÿ¯ÿ¯ÿ¯ÿ¯ÿ®ÿ©ÿ ¥ÿšô•°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“ý((Âÿ¾ÿºÿºÿºÿºÿºÿºÿºÿºÿ¸ÿ†‹‹ÿèëêÿâåäÿâåäÿâåäÿâåäÿèêêÿ‡Œ‘ÿ µÿºÿºÿºÿºÿºÿºÿºÿºÿ ½ÿ))Äÿ”ùŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“ÿKKåÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿ×ÿ†‹Œÿëîíÿæéèÿæéèÿæéèÿæéèÿëîíÿ‡’ÿ ÒÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿÚÿDDäÿšö•ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“û[[èÿ--éÿ åÿåÿåÿåÿåÿåÿåÿåÿ âÿ†‹Œÿïððÿêììÿêììÿêììÿêììÿîððÿˆ“ÿÜÿåÿåÿåÿåÿåÿåÿåÿ åÿ((èÿ^^ëÿ—ø™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–…¢÷``Íþ~~Üÿáÿåÿåÿåÿåÿåÿåÿâÿ†‹‹ÿáäãÿÛßÞÿÚÞÝÿÚÞÝÿÛßÞÿáäãÿŠ‘ÿ€€Üÿåÿåÿåÿåÿåÿåÿáÿ~~ÜÿccÎþ##§õ–œÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”9”ƒ—¸—â”ü“ÿ“ÿ“ÿ“ÿ“ÿ“ÿ‚†Šÿ¸¼»ÿÆËÊÿÇÌÊÿÇÌÊÿÆËÊÿº¿½ÿƒ‡Šÿ’ÿ“ÿ“ÿ“ÿ“ÿ“ÿ”ü˜ã™»”ˆ‘Aÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰‹‹a‡‹æ‡‹ñ‡‹ñ‡‹ñ‡‹ñˆŠè‰‹nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøðððððððøøøøøøøøü?ü?ü?ü?ü?ü?ü?þþþþþÿÿÿÿ€ÿÿÿðÿÿÿÿðÿÿÿÿðÿÿÿÿðÿÿÿÿðÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtransmission-2.92/qt/PaxHeaders.4960/MakeProgressDialog.ui0000644000000000000000000000013212536126416020371 xustar0030 mtime=1433971982.541590014 30 atime=1433971982.541590014 30 ctime=1457295917.241761001 transmission-2.92/qt/MakeProgressDialog.ui0000644000175000017500000000235012536126416022016 0ustar00mikedldmikedld00000000000000 MakeProgressDialog 0 0 424 101 New Torrent QLayout::SetFixedSize 400 0 ... Qt::Horizontal QDialogButtonBox::Abort|QDialogButtonBox::Ok|QDialogButtonBox::Open transmission-2.92/qt/PaxHeaders.4960/TorrentDelegate.cc0000644000000000000000000000013212557755321017715 xustar0030 mtime=1438636753.453559824 30 atime=1438636753.453559824 30 ctime=1457295917.237760933 transmission-2.92/qt/TorrentDelegate.cc0000644000175000017500000004416412557755321021353 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: TorrentDelegate.cc 14555 2015-08-01 16:05:02Z mikedld $ */ #include #include #include #include #include #include #include #include #include #include "Formatter.h" #include "Torrent.h" #include "TorrentDelegate.h" #include "TorrentModel.h" #include "Utils.h" enum { GUI_PAD = 6, BAR_HEIGHT = 12 }; QColor TorrentDelegate::greenBrush; QColor TorrentDelegate::blueBrush; QColor TorrentDelegate::silverBrush; QColor TorrentDelegate::greenBack; QColor TorrentDelegate::blueBack; QColor TorrentDelegate::silverBack; namespace { class ItemLayout { private: QString myNameText; QString myStatusText; QString myProgressText; public: QFont nameFont; QFont statusFont; QFont progressFont; QRect iconRect; QRect emblemRect; QRect nameRect; QRect statusRect; QRect barRect; QRect progressRect; public: ItemLayout(const QString& nameText, const QString& statusText, const QString& progressText, const QIcon& emblemIcon, const QFont& baseFont, Qt::LayoutDirection direction, const QPoint& topLeft, int width); QSize size () const { return (iconRect | nameRect | statusRect | barRect | progressRect).size (); } QString nameText () const { return elidedText (nameFont, myNameText, nameRect.width ()); } QString statusText () const { return elidedText (statusFont, myStatusText, statusRect.width ()); } QString progressText () const { return elidedText (progressFont, myProgressText, progressRect.width ()); } private: QString elidedText (const QFont& font, const QString& text, int width) const { return QFontMetrics (font).elidedText (text, Qt::ElideRight, width); } }; ItemLayout::ItemLayout(const QString& nameText, const QString& statusText, const QString& progressText, const QIcon& emblemIcon, const QFont& baseFont, Qt::LayoutDirection direction, const QPoint& topLeft, int width): myNameText (nameText), myStatusText (statusText), myProgressText (progressText), nameFont (baseFont), statusFont (baseFont), progressFont (baseFont) { const QStyle * style (qApp->style ()); const int iconSize (style->pixelMetric (QStyle::PM_LargeIconSize)); nameFont.setWeight (QFont::Bold); const QFontMetrics nameFM (nameFont); const QSize nameSize (nameFM.size (0, myNameText)); statusFont.setPointSize (static_cast (statusFont.pointSize () * 0.9)); const QFontMetrics statusFM (statusFont); const QSize statusSize (statusFM.size (0, myStatusText)); progressFont.setPointSize (static_cast (progressFont.pointSize () * 0.9)); const QFontMetrics progressFM (progressFont); const QSize progressSize (progressFM.size (0, myProgressText)); QRect baseRect (topLeft, QSize (width, 0)); Utils::narrowRect (baseRect, iconSize + GUI_PAD, 0, direction); nameRect = baseRect.adjusted(0, 0, 0, nameSize.height ()); statusRect = nameRect.adjusted(0, nameRect.height () + 1, 0, statusSize.height () + 1); barRect = statusRect.adjusted(0, statusRect.height () + 1, 0, BAR_HEIGHT + 1); progressRect = barRect.adjusted (0, barRect.height () + 1, 0, progressSize.height () + 1); iconRect = style->alignedRect (direction, Qt::AlignLeft | Qt::AlignVCenter, QSize (iconSize, iconSize), QRect (topLeft, QSize (width, progressRect.bottom () - nameRect.top ()))); emblemRect = style->alignedRect (direction, Qt::AlignRight | Qt::AlignBottom, emblemIcon.actualSize (iconRect.size () / 2, QIcon::Normal, QIcon::On), iconRect); } } TorrentDelegate::TorrentDelegate (QObject * parent): QStyledItemDelegate (parent), myProgressBarStyle (new QStyleOptionProgressBar) { myProgressBarStyle->minimum = 0; myProgressBarStyle->maximum = 1000; greenBrush = QColor ("forestgreen"); greenBack = QColor ("darkseagreen"); blueBrush = QColor ("steelblue"); blueBack = QColor ("lightgrey"); silverBrush = QColor ("silver"); silverBack = QColor ("grey"); } TorrentDelegate::~TorrentDelegate () { delete myProgressBarStyle; } /*** **** ***/ QSize TorrentDelegate::margin (const QStyle& style) const { Q_UNUSED (style); return QSize (4, 4); } QString TorrentDelegate::progressString (const Torrent& tor) { const bool isMagnet (!tor.hasMetadata()); const bool isDone (tor.isDone ()); const bool isSeed (tor.isSeed ()); const uint64_t haveTotal (tor.haveTotal()); QString str; double seedRatio; const bool hasSeedRatio (tor.getSeedRatio (seedRatio)); if (isMagnet) // magnet link with no metadata { //: First part of torrent progress string; //: %1 is the percentage of torrent metadata downloaded str = tr ("Magnetized transfer - retrieving metadata (%1%)") .arg (Formatter::percentToString (tor.metadataPercentDone() * 100.0)); } else if (!isDone) // downloading { //: First part of torrent progress string; //: %1 is how much we've got, //: %2 is how much we'll have when done, //: %3 is a percentage of the two str = tr ("%1 of %2 (%3%)") .arg (Formatter::sizeToString (haveTotal)) .arg (Formatter::sizeToString (tor.sizeWhenDone())) .arg (Formatter::percentToString (tor.percentDone() * 100.0)); } else if (!isSeed) // partial seed { if (hasSeedRatio) { //: First part of torrent progress string; //: %1 is how much we've got, //: %2 is the torrent's total size, //: %3 is a percentage of the two, //: %4 is how much we've uploaded, //: %5 is our upload-to-download ratio, //: %6 is the ratio we want to reach before we stop uploading str = tr ("%1 of %2 (%3%), uploaded %4 (Ratio: %5 Goal: %6)") .arg (Formatter::sizeToString (haveTotal)) .arg (Formatter::sizeToString (tor.totalSize())) .arg (Formatter::percentToString (tor.percentComplete() * 100.0)) .arg (Formatter::sizeToString (tor.uploadedEver())) .arg (Formatter::ratioToString (tor.ratio())) .arg (Formatter::ratioToString (seedRatio)); } else { //: First part of torrent progress string; //: %1 is how much we've got, //: %2 is the torrent's total size, //: %3 is a percentage of the two, //: %4 is how much we've uploaded, //: %5 is our upload-to-download ratio str = tr ("%1 of %2 (%3%), uploaded %4 (Ratio: %5)") .arg (Formatter::sizeToString (haveTotal)) .arg (Formatter::sizeToString (tor.totalSize())) .arg (Formatter::percentToString (tor.percentComplete() * 100.0)) .arg (Formatter::sizeToString (tor.uploadedEver())) .arg (Formatter::ratioToString (tor.ratio())); } } else // seeding { if (hasSeedRatio) { //: First part of torrent progress string; //: %1 is the torrent's total size, //: %2 is how much we've uploaded, //: %3 is our upload-to-download ratio, //: %4 is the ratio we want to reach before we stop uploading str = tr ("%1, uploaded %2 (Ratio: %3 Goal: %4)") .arg (Formatter::sizeToString (haveTotal)) .arg (Formatter::sizeToString (tor.uploadedEver())) .arg (Formatter::ratioToString (tor.ratio())) .arg (Formatter::ratioToString (seedRatio)); } else // seeding w/o a ratio { //: First part of torrent progress string; //: %1 is the torrent's total size, //: %2 is how much we've uploaded, //: %3 is our upload-to-download ratio str = tr ("%1, uploaded %2 (Ratio: %3)") .arg (Formatter::sizeToString (haveTotal)) .arg (Formatter::sizeToString (tor.uploadedEver())) .arg (Formatter::ratioToString (tor.ratio())); } } // add time when downloading if ((hasSeedRatio && tor.isSeeding()) || tor.isDownloading()) { if (tor.hasETA ()) //: Second (optional) part of torrent progress string; //: %1 is duration; //: notice that leading space (before the dash) is included here str += tr (" - %1 left").arg (Formatter::timeToString (tor.getETA ())); else //: Second (optional) part of torrent progress string; //: notice that leading space (before the dash) is included here str += tr (" - Remaining time unknown"); } return str.trimmed (); } QString TorrentDelegate::shortTransferString (const Torrent& tor) { QString str; const bool haveMeta (tor.hasMetadata()); const bool haveDown (haveMeta && ((tor.webseedsWeAreDownloadingFrom()>0) || (tor.peersWeAreDownloadingFrom()>0))); const bool haveUp (haveMeta && tor.peersWeAreUploadingTo()>0); if (haveDown) str = Formatter::downloadSpeedToString(tor.downloadSpeed()) + QLatin1String (" ") + Formatter::uploadSpeedToString(tor.uploadSpeed()); else if (haveUp) str = Formatter::uploadSpeedToString(tor.uploadSpeed()); return str.trimmed (); } QString TorrentDelegate::shortStatusString (const Torrent& tor) { QString str; switch (tor.getActivity ()) { case TR_STATUS_CHECK: str = tr ("Verifying local data (%1% tested)").arg (Formatter::percentToString (tor.getVerifyProgress()*100.0)); break; case TR_STATUS_DOWNLOAD: case TR_STATUS_SEED: str = shortTransferString(tor) + QLatin1String (" ") + tr("Ratio: %1").arg(Formatter::ratioToString(tor.ratio())); break; default: str = tor.activityString (); break; } return str.trimmed (); } QString TorrentDelegate::statusString (const Torrent& tor) { QString str; if (tor.hasError ()) { str = tor.getError (); } else switch (tor.getActivity ()) { case TR_STATUS_STOPPED: case TR_STATUS_CHECK_WAIT: case TR_STATUS_CHECK: case TR_STATUS_DOWNLOAD_WAIT: case TR_STATUS_SEED_WAIT: str = shortStatusString (tor); break; case TR_STATUS_DOWNLOAD: if (!tor.hasMetadata()) { str = tr ("Downloading metadata from %Ln peer(s) (%1% done)", 0, tor.peersWeAreDownloadingFrom ()) .arg (Formatter::percentToString (100.0 * tor.metadataPercentDone ())); } else { /* it would be nicer for translation if this was all one string, but I don't see how to do multiple %n's in tr() */ if (tor.connectedPeersAndWebseeds () == 0) //: First part of phrase "Downloading from ... peer(s) and ... web seed(s)" str = tr ("Downloading from %Ln peer(s)", 0, tor.peersWeAreDownloadingFrom ()); else //: First part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)" str = tr ("Downloading from %1 of %Ln connected peer(s)", 0, tor.connectedPeersAndWebseeds ()) .arg (tor.peersWeAreDownloadingFrom ()); if (tor.webseedsWeAreDownloadingFrom()) //: Second (optional) part of phrase "Downloading from ... of ... connected peer(s) and ... web seed(s)"; //: notice that leading space (before "and") is included here str += tr(" and %Ln web seed(s)", 0, tor.webseedsWeAreDownloadingFrom()); } break; case TR_STATUS_SEED: if (tor.connectedPeers () == 0) str = tr ("Seeding to %Ln peer(s)", 0, tor.peersWeAreUploadingTo ()); else str = tr ("Seeding to %1 of %Ln connected peer(s)", 0, tor.connectedPeers ()) .arg (tor.peersWeAreUploadingTo ()); break; default: str = tr ("Error"); break; } if (tor.isReadyToTransfer ()) { QString s = shortTransferString (tor); if (!s.isEmpty ()) str += tr (" - ") + s; } return str.trimmed (); } /*** **** ***/ QSize TorrentDelegate::sizeHint (const QStyleOptionViewItem& option, const Torrent& tor) const { const QSize m (margin (*qApp->style ())); const ItemLayout layout (tor.name (), progressString (tor), statusString (tor), QIcon (), option.font, option.direction, QPoint (0, 0), option.rect.width () - m.width () * 2); return layout.size () + m * 2; } QSize TorrentDelegate::sizeHint (const QStyleOptionViewItem & option, const QModelIndex & index) const { const Torrent * tor (index.data (TorrentModel::TorrentRole).value()); return sizeHint (option, *tor); } void TorrentDelegate::paint (QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const { const Torrent * tor (index.data (TorrentModel::TorrentRole).value()); painter->save (); painter->setClipRect (option.rect); drawTorrent (painter, option, *tor); painter->restore (); } void TorrentDelegate::setProgressBarPercentDone (const QStyleOptionViewItem & option, const Torrent & tor) const { double seedRatioLimit; if (tor.isSeeding() && tor.getSeedRatio(seedRatioLimit)) { const double seedRateRatio = tor.ratio() / seedRatioLimit; const int scaledProgress = seedRateRatio * (myProgressBarStyle->maximum - myProgressBarStyle->minimum); myProgressBarStyle->progress = myProgressBarStyle->minimum + scaledProgress; } else { const bool isMagnet (!tor.hasMetadata ()); myProgressBarStyle->direction = option.direction; myProgressBarStyle->progress = static_cast (myProgressBarStyle->minimum + (((isMagnet ? tor.metadataPercentDone() : tor.percentDone()) * (myProgressBarStyle->maximum - myProgressBarStyle->minimum)))); } } void TorrentDelegate::drawTorrent (QPainter * painter, const QStyleOptionViewItem & option, const Torrent & tor) const { const QStyle * style (qApp->style ()); const bool isPaused (tor.isPaused ()); const bool isItemSelected ((option.state & QStyle::State_Selected) != 0); const bool isItemEnabled ((option.state & QStyle::State_Enabled) != 0); const bool isItemActive ((option.state & QStyle::State_Active) != 0); painter->save (); if (isItemSelected) { QPalette::ColorGroup cg = isItemEnabled ? QPalette::Normal : QPalette::Disabled; if (cg == QPalette::Normal && !isItemActive) cg = QPalette::Inactive; painter->fillRect(option.rect, option.palette.brush(cg, QPalette::Highlight)); } QIcon::Mode im; if (isPaused || !isItemEnabled) im = QIcon::Disabled; else if (isItemSelected) im = QIcon::Selected; else im = QIcon::Normal; QIcon::State qs; if (isPaused) qs = QIcon::Off; else qs = QIcon::On; QPalette::ColorGroup cg = QPalette::Normal; if (isPaused || !isItemEnabled) cg = QPalette::Disabled; if (cg == QPalette::Normal && !isItemActive) cg = QPalette::Inactive; QPalette::ColorRole cr; if (isItemSelected) cr = QPalette::HighlightedText; else cr = QPalette::Text; QStyle::State progressBarState (option.state); if (isPaused) progressBarState = QStyle::State_None; progressBarState |= QStyle::State_Small; const QIcon::Mode emblemIm = isItemSelected ? QIcon::Selected : QIcon::Normal; const QIcon emblemIcon = tor.hasError () ? QIcon::fromTheme (QLatin1String ("emblem-important"), style->standardIcon (QStyle::SP_MessageBoxWarning)) : QIcon (); // layout const QSize m (margin (*style)); const QRect contentRect (option.rect.adjusted (m.width(), m.height(), -m.width(), -m.height())); const ItemLayout layout (tor.name (), progressString (tor), statusString (tor), emblemIcon, option.font, option.direction, contentRect.topLeft (), contentRect.width ()); // render if (tor.hasError () && !isItemSelected) painter->setPen (QColor ("red")); else painter->setPen (option.palette.color (cg, cr)); tor.getMimeTypeIcon().paint (painter, layout.iconRect, Qt::AlignCenter, im, qs); if (!emblemIcon.isNull ()) emblemIcon.paint (painter, layout.emblemRect, Qt::AlignCenter, emblemIm, qs); painter->setFont (layout.nameFont); painter->drawText (layout.nameRect, Qt::AlignLeft | Qt::AlignVCenter, layout.nameText ()); painter->setFont (layout.statusFont); painter->drawText (layout.statusRect, Qt::AlignLeft | Qt::AlignVCenter, layout.statusText ()); painter->setFont (layout.progressFont); painter->drawText (layout.progressRect, Qt::AlignLeft | Qt::AlignVCenter, layout.progressText ()); myProgressBarStyle->rect = layout.barRect; if (tor.isDownloading()) { myProgressBarStyle->palette.setBrush (QPalette::Highlight, blueBrush); myProgressBarStyle->palette.setColor (QPalette::Base, blueBack); myProgressBarStyle->palette.setColor (QPalette::Window, blueBack); } else if (tor.isSeeding()) { myProgressBarStyle->palette.setBrush (QPalette::Highlight, greenBrush); myProgressBarStyle->palette.setColor (QPalette::Base, greenBack); myProgressBarStyle->palette.setColor (QPalette::Window, greenBack); } else { myProgressBarStyle->palette.setBrush (QPalette::Highlight, silverBrush); myProgressBarStyle->palette.setColor (QPalette::Base, silverBack); myProgressBarStyle->palette.setColor (QPalette::Window, silverBack); } myProgressBarStyle->state = progressBarState; setProgressBarPercentDone (option, tor); style->drawControl (QStyle::CE_ProgressBar, myProgressBarStyle, painter); painter->restore (); } transmission-2.92/qt/PaxHeaders.4960/DBusInteropHelper.h0000644000000000000000000000013212634330106020007 xustar0030 mtime=1450291270.036772309 30 atime=1450291270.036772309 30 ctime=1457295917.244761052 transmission-2.92/qt/DBusInteropHelper.h0000644000175000017500000000105512634330106021435 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: DBusInteropHelper.h 14621 2015-12-16 17:57:05Z mikedld $ */ #ifndef QTR_DBUS_INTEROP_HELPER_H #define QTR_DBUS_INTEROP_HELPER_H class QObject; class QString; class QVariant; class DBusInteropHelper { public: bool isConnected () const; QVariant addMetainfo (const QString& metainfo); static void registerObject (QObject * parent); }; #endif // QTR_DBUS_INTEROP_HELPER_H transmission-2.92/qt/PaxHeaders.4960/TorrentFilter.cc0000644000000000000000000000013212560567042017423 xustar0030 mtime=1438838306.601593529 30 atime=1438838306.601593529 30 ctime=1457295917.240760984 transmission-2.92/qt/TorrentFilter.cc0000644000175000017500000001512212560567042021051 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: TorrentFilter.cc 14554 2015-07-30 06:55:28Z mikedld $ */ #include #include "Filters.h" #include "Prefs.h" #include "Torrent.h" #include "TorrentFilter.h" #include "TorrentModel.h" #include "Utils.h" TorrentFilter::TorrentFilter (const Prefs& prefs): myPrefs (prefs) { // listen for changes to the preferences to know when to refilter / resort connect (&myPrefs, SIGNAL(changed(int)), this, SLOT(refreshPref(int))); setDynamicSortFilter (true); // initialize our state from the current prefs QList initKeys; initKeys << Prefs::SORT_MODE << Prefs::FILTER_MODE << Prefs::FILTER_TRACKERS << Prefs::FILTER_TEXT; for (const int key: initKeys) refreshPref (key); } TorrentFilter::~TorrentFilter () { } void TorrentFilter::refreshPref (int key) { switch (key) { case Prefs::FILTER_TEXT: case Prefs::FILTER_MODE: case Prefs::FILTER_TRACKERS: invalidateFilter (); /* force a re-sort */ sort (0, !myPrefs.getBool(Prefs::SORT_REVERSED) ? Qt::AscendingOrder : Qt::DescendingOrder); case Prefs::SORT_MODE: case Prefs::SORT_REVERSED: sort (0, myPrefs.getBool(Prefs::SORT_REVERSED) ? Qt::AscendingOrder : Qt::DescendingOrder); invalidate (); break; } } /*** **** ***/ namespace { template int compare (const T a, const T b) { if (a < b) return -1; if (b < a) return 1; return 0; } } bool TorrentFilter::lessThan (const QModelIndex& left, const QModelIndex& right) const { int val = 0; const Torrent * a = sourceModel()->data (left, TorrentModel::TorrentRole).value(); const Torrent * b = sourceModel()->data (right, TorrentModel::TorrentRole).value(); switch (myPrefs.get(Prefs::SORT_MODE).mode()) { case SortMode::SORT_BY_QUEUE: if (!val) val = -compare (a->queuePosition(), b->queuePosition()); break; case SortMode::SORT_BY_SIZE: if (!val) val = compare (a->sizeWhenDone(), b->sizeWhenDone()); break; case SortMode::SORT_BY_AGE: val = compare (a->dateAdded().toTime_t(), b->dateAdded().toTime_t()); break; case SortMode::SORT_BY_ID: if (!val) val = compare (a->id(), b->id()); break; case SortMode::SORT_BY_ACTIVITY: if (!val) val = compare (a->downloadSpeed() + a->uploadSpeed(), b->downloadSpeed() + b->uploadSpeed()); if (!val) val = compare (a->peersWeAreUploadingTo() + a->webseedsWeAreDownloadingFrom(), b->peersWeAreUploadingTo() + b->webseedsWeAreDownloadingFrom()); // fall through case SortMode::SORT_BY_STATE: if (!val) val = -compare (a->isPaused(), b->isPaused()); if (!val) val = compare (a->getActivity(), b->getActivity()); if (!val) val = -compare (a->queuePosition(), b->queuePosition()); if (!val) val = compare (a->hasError(), b->hasError()); // fall through case SortMode::SORT_BY_PROGRESS: if (!val) val = compare (a->percentComplete(), b->percentComplete()); if (!val) val = a->compareSeedRatio (*b); if (!val) val = -compare (a->queuePosition(), b->queuePosition()); // fall through case SortMode::SORT_BY_RATIO: if (!val) val = a->compareRatio (*b); break; case SortMode::SORT_BY_ETA: if (!val) val = a->compareETA (*b); break; default: break; } if (val == 0) val = -a->name().compare (b->name(), Qt::CaseInsensitive); if (val == 0) val = compare (a->hashString(), b->hashString()); return val < 0; } /*** **** ***/ bool TorrentFilter::trackerFilterAcceptsTorrent (const Torrent * tor, const QString& tracker) const { return tracker.isEmpty() || tor->hasTrackerSubstring (tracker); } bool TorrentFilter::activityFilterAcceptsTorrent (const Torrent * tor, const FilterMode& m) const { bool accepts; switch (m.mode ()) { case FilterMode::SHOW_ACTIVE: accepts = tor->peersWeAreUploadingTo () > 0 || tor->peersWeAreDownloadingFrom () > 0 || tor->isVerifying (); break; case FilterMode::SHOW_DOWNLOADING: accepts = tor->isDownloading () || tor->isWaitingToDownload (); break; case FilterMode::SHOW_SEEDING: accepts = tor->isSeeding () || tor->isWaitingToSeed (); break; case FilterMode::SHOW_PAUSED: accepts = tor->isPaused (); break; case FilterMode::SHOW_FINISHED: accepts = tor->isFinished (); break; case FilterMode::SHOW_VERIFYING: accepts = tor->isVerifying () || tor->isWaitingToVerify (); break; case FilterMode::SHOW_ERROR: accepts = tor->hasError (); break; default: // FilterMode::SHOW_ALL accepts = true; break; } return accepts; } bool TorrentFilter::filterAcceptsRow (int sourceRow, const QModelIndex& sourceParent) const { QModelIndex childIndex = sourceModel()->index (sourceRow, 0, sourceParent); const Torrent * tor = childIndex.model()->data (childIndex, TorrentModel::TorrentRole).value(); bool accepts = true; if (accepts) { const FilterMode m = myPrefs.get(Prefs::FILTER_MODE); accepts = activityFilterAcceptsTorrent (tor, m); } if (accepts) { const QString trackers = myPrefs.getString(Prefs::FILTER_TRACKERS); accepts = trackerFilterAcceptsTorrent (tor, trackers); } if (accepts) { const QString text = myPrefs.getString (Prefs::FILTER_TEXT); if (!text.isEmpty ()) accepts = tor->name().contains (text, Qt::CaseInsensitive); } return accepts; } int TorrentFilter::hiddenRowCount () const { return sourceModel()->rowCount () - rowCount (); } void TorrentFilter::countTorrentsPerMode (int * setmeCounts) const { std::fill_n (setmeCounts, static_cast(FilterMode::NUM_MODES), 0); for (int row(0); ; ++row) { QModelIndex index (sourceModel()->index(row, 0)); if (!index.isValid()) break; const Torrent * tor (index.data (TorrentModel::TorrentRole).value()); for (int mode(0); mode icons/hicolor/16x16/transmission-qt.png icons/hicolor/22x22/transmission-qt.png icons/hicolor/24x24/transmission-qt.png icons/hicolor/32x32/transmission-qt.png icons/hicolor/48x48/transmission-qt.png icons/hicolor/64x64/transmission-qt.png icons/hicolor/72x72/transmission-qt.png icons/hicolor/96x96/transmission-qt.png icons/hicolor/128x128/transmission-qt.png icons/hicolor/192x192/transmission-qt.png icons/hicolor/256x256/transmission-qt.png icons/hicolor/scalable/transmission-qt.svg icons/ratio.png icons/turtle-grey.png icons/turtle-blue.png icons/lock.png icons/utilities.png transmission-2.92/qt/PaxHeaders.4960/FilterBarComboBoxDelegate.h0000644000000000000000000000013212537301461021413 xustar0030 mtime=1434288945.151418882 30 atime=1434288945.151418882 30 ctime=1457295917.241761001 transmission-2.92/qt/FilterBarComboBoxDelegate.h0000644000175000017500000000175412537301461023047 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: FilterBarComboBoxDelegate.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_FILTER_BAR_COMBO_BOX_DELEGATE_H #define QTR_FILTER_BAR_COMBO_BOX_DELEGATE_H #include class QAbstractItemModel; class QComboBox; class FilterBarComboBoxDelegate: public QItemDelegate { Q_OBJECT public: FilterBarComboBoxDelegate (QObject * parent, QComboBox * combo); static bool isSeparator (const QModelIndex &index); static void setSeparator (QAbstractItemModel * model, const QModelIndex& index); protected: // QAbstractItemDelegate virtual void paint (QPainter *, const QStyleOptionViewItem&, const QModelIndex&) const; virtual QSize sizeHint (const QStyleOptionViewItem&, const QModelIndex&) const; private: QComboBox * const myCombo; }; #endif // QTR_FILTER_BAR_COMBO_BOX_DELEGATE_H transmission-2.92/qt/PaxHeaders.4960/PathButton.cc0000644000000000000000000000013112604017324016677 xustar0029 mtime=1443897044.89425178 30 atime=1439229725.400814833 30 ctime=1457295917.237760933 transmission-2.92/qt/PathButton.cc0000644000175000017500000001026712604017324020333 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2014-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: PathButton.cc 14537 2015-06-10 21:27:11Z mikedld $ */ #include #include #include #include #include #include #include #include #include "PathButton.h" #include "Utils.h" PathButton::PathButton (QWidget * parent): QToolButton (parent), myMode (DirectoryMode), myTitle (), myNameFilter (), myPath () { setSizePolicy(QSizePolicy (QSizePolicy::Preferred, QSizePolicy::Fixed)); setToolButtonStyle (Qt::ToolButtonTextBesideIcon); setText (tr ("(None)")); // for minimum width updateAppearance (); connect (this, SIGNAL (clicked ()), this, SLOT (onClicked ())); } void PathButton::setMode (Mode mode) { if (myMode == mode) return; myMode = mode; updateAppearance (); } void PathButton::setTitle (const QString& title) { myTitle = title; } void PathButton::setNameFilter (const QString& nameFilter) { myNameFilter = nameFilter; } void PathButton::setPath (const QString& path) { if (myPath == path) return; myPath = QDir::toNativeSeparators (Utils::removeTrailingDirSeparator (path)); updateAppearance (); emit pathChanged (myPath); } const QString& PathButton::path () const { return myPath; } QSize PathButton::sizeHint () const { const QSize sh (QToolButton::sizeHint ()); return QSize (qMin (sh.width (), 150), sh.height ()); } void PathButton::paintEvent (QPaintEvent * /*event*/) { QStylePainter painter(this); QStyleOptionToolButton option; initStyleOption (&option); const QSize fakeContentSize (qMax (100, qApp->globalStrut ().width ()), qMax (100, qApp->globalStrut ().height ())); const QSize fakeSizeHint = style ()->sizeFromContents (QStyle::CT_ToolButton, &option, fakeContentSize, this); int textWidth = width () - (fakeSizeHint.width () - fakeContentSize.width ()) - iconSize ().width () - 6; if (popupMode () == MenuButtonPopup) textWidth -= style ()->pixelMetric (QStyle::PM_MenuButtonIndicator, &option, this); const QFileInfo pathInfo (myPath); option.text = myPath.isEmpty () ? tr ("(None)") : (pathInfo.fileName ().isEmpty () ? myPath : pathInfo.fileName ()); option.text = fontMetrics ().elidedText (option.text, Qt::ElideMiddle, textWidth); painter.drawComplexControl(QStyle::CC_ToolButton, option); } void PathButton::onClicked () { QFileDialog * dialog = new QFileDialog (window (), effectiveTitle ()); dialog->setFileMode (isDirMode () ? QFileDialog::Directory : QFileDialog::ExistingFile); if (isDirMode ()) dialog->setOption (QFileDialog::ShowDirsOnly); if (!myNameFilter.isEmpty ()) dialog->setNameFilter (myNameFilter); const QFileInfo pathInfo (myPath); if (!myPath.isEmpty () && pathInfo.exists ()) { if (pathInfo.isDir ()) { dialog->setDirectory (pathInfo.absoluteFilePath ()); } else { dialog->setDirectory (pathInfo.absolutePath ()); dialog->selectFile (pathInfo.fileName ()); } } connect (dialog, SIGNAL (fileSelected (QString)), this, SLOT (onFileSelected (QString))); dialog->setAttribute (Qt::WA_DeleteOnClose); dialog->open (); } void PathButton::onFileSelected (const QString& path) { if (!path.isEmpty ()) setPath (path); } void PathButton::updateAppearance () { const QFileInfo pathInfo (myPath); const int iconSize (style ()->pixelMetric (QStyle::PM_SmallIconSize)); const QFileIconProvider iconProvider; QIcon icon; if (!myPath.isEmpty () && pathInfo.exists ()) icon = iconProvider.icon (myPath); if (icon.isNull ()) icon = iconProvider.icon (isDirMode () ? QFileIconProvider::Folder : QFileIconProvider::File); setIconSize (QSize (iconSize, iconSize)); setIcon (icon); setToolTip (myPath == text () ? QString () : myPath); update (); } bool PathButton::isDirMode () const { return myMode == DirectoryMode; } QString PathButton::effectiveTitle () const { if (!myTitle.isEmpty ()) return myTitle; return isDirMode () ? tr ("Select Folder") : tr ("Select File"); } transmission-2.92/qt/PaxHeaders.4960/config.pri0000644000000000000000000000013212667111043016264 xustar0030 mtime=1457295907.548596174 30 atime=1457295907.537595987 30 ctime=1457295917.277761613 transmission-2.92/qt/config.pri0000644000175000017500000000043712667111043017715 0ustar00mikedldmikedld00000000000000DHT_LIBS = $${TRANSMISSION_TOP}/third-party/dht/libdht.a LIBB64_LIBS = $${TRANSMISSION_TOP}/third-party/libb64/libb64.a LIBUTP_LIBS = $${TRANSMISSION_TOP}/third-party/libutp/libutp.a -lrt LIBUPNP_LIBS = -lminiupnpc LIBNATPMP_LIBS = $${TRANSMISSION_TOP}/third-party/libnatpmp/libnatpmp.a transmission-2.92/qt/PaxHeaders.4960/transmission_en.qm0000644000000000000000000000013212442116604020054 xustar0030 mtime=1418239364.590251011 30 atime=1418239364.590251011 30 ctime=1457295917.269761477 transmission-2.92/qt/transmission_en.qm0000644000175000017500000000367412442116604021513 0ustar00mikedldmikedld00000000000000<¸dÊÍ!¿`¡½ÝB€0 K6‰¤Q„ƒtÉÅrO9ðªYÜMÛ¾” O9 Õr¹© ÀÛi. èOí z9>É|Yñ:¶9F9#ú ¹oi&%1 (%Ln piece @ %2)(%1 (%Ln pieces @ %2)%1 (%Ln pieces @ %2)Details%1 (%Ln piece)%1 (%Ln pieces)%1 (%Ln pieces)Details%Ln File%Ln Files %Ln File(s) MakeDialog%Ln Piece%Ln Pieces %Ln Piece(s) MakeDialogÿÿÿÿÿÿÿÿ7Update succeeded!

Blocklist now has %Ln rules. PrefsDialog8Enable &blocklist (%Ln rule):Enable &blocklist (%Ln rules)Enable &blocklist (%Ln rules) PrefsDialog Started one time Started %n timesStarted %n time(s) StatsDialog0Downloading from %1 peerRDownloading from %1 of %n connected peers+Downloading from %1 of %n connected peer(s)TorrentDelegate$Seeding to %1 peerFSeeding to %1 of %n connected peers%Seeding to %1 of %n connected peer(s)TorrentDelegate$%L1 of %Ln Torrent&%L1 of %Ln Torrents%L1 of %Ln Torrent(s) TrMainWindow%Ln Torrent%Ln Torrents%Ln Torrent(s) TrMainWindow%Ln byte%Ln bytes %Ln byte(s)Utils%Ln day%Ln days %Ln day(s)Utils%Ln hour%Ln hours %Ln hour(s)Utils%Ln minute%Ln minutes %Ln minute(s)Utils%Ln second%Ln seconds %Ln second(s)Utilsˆtransmission-2.92/qt/PaxHeaders.4960/RpcClient.h0000644000000000000000000000013212631124544016340 xustar0030 mtime=1449437540.254758128 30 atime=1449437540.254758128 30 ctime=1457295917.241761001 transmission-2.92/qt/RpcClient.h0000644000175000017500000000356312631124544017774 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2014-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: RpcClient.h 14608 2015-12-06 17:28:54Z jordan $ */ #ifndef QTR_RPC_CLIENT_H #define QTR_RPC_CLIENT_H #include #include #include #include #include #include #include #include class QByteArray; class QNetworkAccessManager; typedef std::shared_ptr TrVariantPtr; Q_DECLARE_METATYPE (TrVariantPtr) extern "C" { struct evbuffer; struct tr_session; } class RpcClient: public QObject { Q_OBJECT public: RpcClient (QObject * parent = nullptr); virtual ~RpcClient () {} void stop (); void start (tr_session * session); void start (const QUrl& url); bool isLocal () const; const QUrl& url () const; void exec (tr_quark method, tr_variant * args, int64_t tag = -1); void exec (const char* method, tr_variant * args, int64_t tag = -1); signals: void httpAuthenticationRequired (); void dataReadProgress (); void dataSendProgress (); void error (QNetworkReply::NetworkError code); void errorMessage (const QString& message); void executed (int64_t tag, const QString& result, tr_variant * args); // private void responseReceived (TrVariantPtr json); private: void sendRequest (TrVariantPtr json); QNetworkAccessManager * networkAccessManager (); static void localSessionCallback (tr_session * s, tr_variant * response, void * vself); private slots: void onFinished (QNetworkReply * reply); void parseResponse (TrVariantPtr json); private: tr_session * mySession; QString mySessionId; QUrl myUrl; QNetworkAccessManager * myNAM; }; #endif // QTR_RPC_CLIENT_H transmission-2.92/qt/PaxHeaders.4960/PrefsDialog.ui0000644000000000000000000000013212536126416017046 xustar0030 mtime=1433971982.553590239 30 atime=1433971982.553590239 30 ctime=1457295917.244761052 transmission-2.92/qt/PrefsDialog.ui0000644000175000017500000012607612536126416020507 0ustar00mikedldmikedld00000000000000 PrefsDialog 0 0 545 547 Transmission Preferences 0 Qt::ElideNone false Speed font-weight:bold Speed Limits 18 &Upload: true 999999999 5 &Download: true 999999999 5 Qt::Vertical QSizePolicy::Fixed 1 10 2 :/icons/alt-limit-off.png font-weight:bold Alternative Speed Limits 18 <small>Override normal speed limits manually or at scheduled times</small> U&pload: altUploadSpeedLimitSpin 999999999 5 Do&wnload: altDownloadSpeedLimitSpin 999999999 5 &Scheduled times: true hh:mm 0 0 &to altSpeedLimitEndTimeEdit hh:mm &On days: altSpeedLimitDaysCombo Qt::Vertical 1 1 Downloading font-weight:bold Adding 18 Automatically add .torrent files &from: true 0 0 Show the Torrent Options &dialog &Start added torrents Mo&ve the .torrent file to the trash Save to &Location: 0 0 ... Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Vertical QSizePolicy::Fixed 1 10 font-weight:bold Download Queue 18 Ma&ximum active downloads: downloadQueueSizeSpin 1 999999999 Download is i&nactive if data sharing stopped: queueStalledMinutesSpin minute(s) ago 1 9999 5 Qt::Vertical QSizePolicy::Fixed 1 10 font-weight:bold Incomplete 18 Append ".&part" to incomplete files' names Keep &incomplete files in: true 0 0 Call scrip&t when torrent is completed: true 0 0 Qt::Vertical 1 1 Seeding font-weight:bold Limits 18 Stop seeding at &ratio: true 999999999.000000000000000 0.500000000000000 Stop seedi&ng if idle for: true minute(s) 1 9999 5 Qt::Vertical 1 1 Privacy font-weight:bold Encryption 18 &Encryption mode: encryptionModeCombo Qt::Vertical QSizePolicy::Fixed 1 10 font-weight:bold Blocklist 18 Enable &blocklist: true ... &Update false Enable &automatic updates Qt::Vertical 1 1 Network font-weight:bold Incoming Peers 18 &Port for incoming connections: peerPortSpin 1 65535 Status unknown Te&st Port false Pick a &random port every time Transmission is started Use UPnP or NAT-PMP port &forwarding from my router Qt::Vertical QSizePolicy::Fixed 1 10 font-weight:bold Peer Limits 18 Maximum peers per &torrent: torrentPeerLimitSpin 1 1024 5 Maximum peers &overall: globalPeerLimitSpin 1 1024 5 Qt::Vertical QSizePolicy::Fixed 1 10 font-weight:bold Options 18 uTP is a tool for reducing network congestion. Enable &uTP for peer connections PEX is a tool for exchanging peer lists with the peers you're connected to. Use PE&X to find more peers DHT is a tool for finding peers without a tracker. Use &DHT to find more peers LPD is a tool for finding peers on your local network. Use &Local Peer Discovery to find more peers Qt::Vertical 1 1 Desktop font-weight:bold Desktop 18 Show Transmission icon in the &notification area Start &minimized in notification area Qt::Vertical QSizePolicy::Fixed 1 10 font-weight:bold Notification 18 Show a notification when torrents are a&dded Show a notification when torrents &finish Play a &sound when torrents finish Qt::Vertical 1 1 Remote font-weight:bold Remote Control 18 Allow &remote access true &Open web client false HTTP &port: rpcPortSpin 1 65535 Use &authentication true &Username: rpcUsernameEdit Pass&word: rpcPasswordEdit QLineEdit::Password Only allow these IP a&ddresses: true Addresses: rpcWhitelistEdit Qt::Vertical 1 1 Qt::Horizontal QDialogButtonBox::Close PathButton QToolButton

PathButton.h
FreeSpaceLabel QLabel
FreeSpaceLabel.h
dialogButtons rejected() PrefsDialog reject() 316 260 286 274 uploadSpeedLimitCheck toggled(bool) uploadSpeedLimitSpin setEnabled(bool) 94 79 323 79 downloadSpeedLimitCheck toggled(bool) downloadSpeedLimitSpin setEnabled(bool) 94 113 323 113 ratioLimitCheck toggled(bool) ratioLimitSpin setEnabled(bool) 129 79 359 79 idleLimitCheck toggled(bool) idleLimitSpin setEnabled(bool) 129 113 359 113 watchDirCheck toggled(bool) watchDirStack setEnabled(bool) 167 80 392 80 incompleteDirCheck toggled(bool) incompleteDirStack setEnabled(bool) 169 411 395 411 completionScriptCheck toggled(bool) completionScriptStack setEnabled(bool) 169 447 395 447 transmission-2.92/qt/PaxHeaders.4960/TrackerModel.cc0000644000000000000000000000013212561752356017201 xustar0030 mtime=1439159534.934344494 30 atime=1439159534.934344494 30 ctime=1457295917.240760984 transmission-2.92/qt/TrackerModel.cc0000644000175000017500000000704212561752356020631 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: TrackerModel.cc 14556 2015-08-06 20:28:44Z mikedld $ */ #include // std::sort() #include #include "Application.h" // Application #include "TorrentModel.h" #include "TrackerModel.h" int TrackerModel::rowCount (const QModelIndex& parent) const { Q_UNUSED (parent); return parent.isValid() ? 0 : myRows.size(); } QVariant TrackerModel::data (const QModelIndex& index, int role) const { QVariant var; const int row = index.row (); if ((0<=row) && (row& ids) { // build a list of the TrackerInfos QVector trackers; for (const int id: ids) { const Torrent * tor = torrentModel.getTorrentFromId (id); if (tor != 0) { const TrackerStatsList trackerList = tor->trackerStats (); for (const TrackerStat& st: trackerList) { TrackerInfo trackerInfo; trackerInfo.st = st; trackerInfo.torrentId = id; trackers.append (trackerInfo); } } } // sort 'em CompareTrackers comp; std::sort (trackers.begin(), trackers.end(), comp); // merge 'em with the existing list int oldIndex = 0; int newIndex = 0; while (oldIndex < myRows.size () || newIndex < trackers.size ()) { const bool isEndOfOld = oldIndex == myRows.size (); const bool isEndOfNew = newIndex == trackers.size (); if (isEndOfOld || (!isEndOfNew && comp (trackers.at (newIndex), myRows.at (oldIndex)))) { // add this new row beginInsertRows (QModelIndex (), oldIndex, oldIndex); myRows.insert (oldIndex, trackers.at (newIndex)); endInsertRows (); ++oldIndex; ++newIndex; } else if (isEndOfNew || (!isEndOfOld && comp (myRows.at (oldIndex), trackers.at (newIndex)))) { // remove this old row beginRemoveRows (QModelIndex (), oldIndex, oldIndex); myRows.remove (oldIndex); endRemoveRows (); } else // update existing row { myRows[oldIndex].st = trackers.at (newIndex).st; emit dataChanged (index (oldIndex, 0), index (oldIndex, 0)); ++oldIndex; ++newIndex; } } } int TrackerModel::find (int torrentId, const QString& url) const { for (int i=0, n=myRows.size(); i #include #include #include #include "IconToolButton.h" IconToolButton::IconToolButton (QWidget * parent): QToolButton (parent) { } QSize IconToolButton::sizeHint () const { QStyleOptionToolButton option; initStyleOption (&option); option.features = QStyleOptionToolButton::None; option.toolButtonStyle = Qt::ToolButtonIconOnly; const QSize size = style ()->sizeFromContents (QStyle::CT_ToolButton, &option, iconSize (), this); return size.expandedTo (iconSize () + QSize (8, 8)); } void IconToolButton::paintEvent (QPaintEvent * /*event*/) { QStylePainter painter(this); QStyleOptionToolButton option; initStyleOption (&option); option.features = QStyleOptionToolButton::None; option.toolButtonStyle = Qt::ToolButtonIconOnly; painter.drawComplexControl(QStyle::CC_ToolButton, option); } transmission-2.92/qt/PaxHeaders.4960/MainWindow.ui0000644000000000000000000000013212611361001016704 xustar0030 mtime=1445323265.089746404 30 atime=1445323265.089746404 30 ctime=1457295917.237760933 transmission-2.92/qt/MainWindow.ui0000644000175000017500000005305512611361001020341 0ustar00mikedldmikedld00000000000000 MainWindow 0 0 472 427 Transmission true 0 0 0 0 Qt::ScrollBarAlwaysOff true QAbstractItemView::ExtendedSelection QAbstractItemView::ScrollPerPixel false QLabel { margin: 3px 0; } 3 3 :/icons/utilities.png:/icons/utilities.png 16 16 QToolButton::InstantPopup Qt::ToolButtonIconOnly true :/icons/alt-limit-off.png :/icons/alt-limit-on.png:/icons/alt-limit-off.png 16 16 true Qt::ToolButtonIconOnly true Qt::Horizontal 1 1 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter :/icons/ratio.png:/icons/ratio.png 16 16 QToolButton::InstantPopup Qt::ToolButtonIconOnly true 0 0 472 24 0 0 &Torrent Queue &Edit &Help &View &File false Qt::TopToolBarArea 24 24 Qt::ToolButtonFollowStyle false TopToolBarArea false &Open... Open Open a torrent Ctrl+O &New... Create a new torrent Ctrl+N &Properties Show torrent properties Alt+Enter Open Fold&er Open the torrent's folder Ctrl+E &Start Start torrent Ctrl+S QAction::LowPriority Ask Tracker for &More Peers Ask tracker for more peers &Pause Pause torrent Ctrl+P QAction::LowPriority &Verify Local Data Verify local data Ctrl+V &Remove Remove torrent Del QAction::LowPriority &Delete Files and Remove Remove torrent and delete its files Shift+Del &Start All &Pause All &Quit Ctrl+Q QAction::QuitRole &Select All Ctrl+A &Deselect All Ctrl+Shift+A &Preferences QAction::PreferencesRole true &Compact View Compact View Compact View Alt+C true &Toolbar true &Filterbar true &Statusbar true Sort by &Activity true Sort by A&ge true Sort by Time &Left true Sort by &Name true Sort by &Progress true Sort by Rati&o true Sort by Si&ze true Sort by Stat&e true Sort by T&racker false Message &Log false &Statistics &Contents F1 &About QAction::AboutRole true Re&verse Sort Order true &Name true &Files true &Tracker true Total Ratio true Session Ratio true Total Transfer true Session Transfer true &Main Window true Tray &Icon &Change Session... Choose Session Set &Location... &Copy Magnet Link to Clipboard Open &URL... Ctrl+U &Donate Start &Now Bypass the queue and start now Ctrl+Shift+S QAction::LowPriority Move to &Top Move &Up Move &Down Move to &Bottom true Sort by &Queue IconToolButton QToolButton
IconToolButton.h
TorrentView QListView
TorrentView.h
transmission-2.92/qt/PaxHeaders.4960/AddData.h0000644000000000000000000000013212537301461015737 xustar0030 mtime=1434288945.139418672 30 atime=1434288945.139418672 30 ctime=1457295917.241761001 transmission-2.92/qt/AddData.h0000644000175000017500000000153412537301461017367 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: AddData.h 14539 2015-06-12 22:12:12Z mikedld $ */ #ifndef QTR_ADD_DATA_H #define QTR_ADD_DATA_H #include #include #include class AddData { public: enum { NONE, MAGNET, URL, FILENAME, METAINFO }; public: AddData (): type (NONE) {} AddData (const QString& str) { set (str); } int set (const QString&); QByteArray toBase64 () const; QString readableName () const; static bool isSupported (const QString& str) { return AddData (str).type != NONE; } public: int type; QByteArray metainfo; QString filename; QString magnet; QUrl url; }; #endif // QTR_ADD_DATA_H transmission-2.92/qt/PaxHeaders.4960/Session.cc0000644000000000000000000000013212662757235016253 xustar0030 mtime=1456201373.077756793 30 atime=1456201373.076756775 30 ctime=1457295917.241761001 transmission-2.92/qt/Session.cc0000644000175000017500000006603212662757235017707 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2015 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: Session.cc 14581 2015-10-18 18:39:14Z mikedld $ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // tr_free #include #include "AddData.h" #include "Prefs.h" #include "Session.h" #include "SessionDialog.h" #include "Torrent.h" #include "Utils.h" namespace { enum { TAG_SOME_TORRENTS, TAG_ALL_TORRENTS, TAG_SESSION_STATS, TAG_SESSION_INFO, TAG_BLOCKLIST_UPDATE, TAG_ADD_TORRENT, TAG_PORT_TEST, TAG_MAGNET_LINK, TAG_RENAME_PATH, FIRST_UNIQUE_TAG }; } /*** **** ***/ namespace { typedef Torrent::KeyList KeyList; const KeyList& getInfoKeys () { return Torrent::getInfoKeys (); } const KeyList& getStatKeys () { return Torrent::getStatKeys (); } const KeyList& getExtraStatKeys () { return Torrent::getExtraStatKeys (); } void addList (tr_variant * list, const KeyList& keys) { tr_variantListReserve (list, keys.size ()); for (const tr_quark key: keys) tr_variantListAddQuark (list, key); } } /*** **** ***/ void FileAdded::executed (int64_t tag, const QString& result, tr_variant * arguments) { if (tag != myTag) return; if (result == QLatin1String ("success")) { tr_variant * dup; const char * str; if (tr_variantDictFindDict (arguments, TR_KEY_torrent_duplicate, &dup) && tr_variantDictFindStr (dup, TR_KEY_name, &str, NULL)) { const QString myFilename = QFileInfo (myName).fileName (); const QString name = QString::fromUtf8 (str); QMessageBox::warning (qApp->activeWindow (), tr ("Add Torrent"), tr ("

Unable to add \"%1\".

It is a duplicate of \"%2\" which is already added.

").arg (myFilename).arg (name)); } if (!myDelFile.isEmpty ()) { QFile file (myDelFile); file.setPermissions (QFile::ReadOwner | QFile::WriteOwner); file.remove (); } } else { QString text = result; for (int i=0, n=text.size (); iactiveWindow (), tr ("Error Adding Torrent"), QString::fromLatin1 ("

%1

%2

").arg (text).arg (myName)); } deleteLater (); } /*** **** ***/ void Session::sessionSet (const tr_quark key, const QVariant& value) { tr_variant args; tr_variantInitDict (&args, 1); switch (value.type ()) { case QVariant::Bool: tr_variantDictAddBool (&args, key, value.toBool ()); break; case QVariant::Int: tr_variantDictAddInt (&args, key, value.toInt ()); break; case QVariant::Double: tr_variantDictAddReal (&args, key, value.toDouble ()); break; case QVariant::String: tr_variantDictAddStr (&args, key, value.toString ().toUtf8 ().constData ()); break; default: assert ("unknown type"); } exec ("session-set", &args); } void Session::portTest () { exec ("port-test", nullptr, TAG_PORT_TEST); } void Session::copyMagnetLinkToClipboard (int torrentId) { tr_variant args; tr_variantInitDict (&args, 2); tr_variantListAddInt (tr_variantDictAddList (&args, TR_KEY_ids, 1), torrentId); tr_variantListAddStr (tr_variantDictAddList (&args, TR_KEY_fields, 1), "magnetLink"); exec (TR_KEY_torrent_get, &args, TAG_MAGNET_LINK); } void Session::updatePref (int key) { if (myPrefs.isCore (key)) switch (key) { case Prefs::ALT_SPEED_LIMIT_DOWN: case Prefs::ALT_SPEED_LIMIT_ENABLED: case Prefs::ALT_SPEED_LIMIT_TIME_BEGIN: case Prefs::ALT_SPEED_LIMIT_TIME_DAY: case Prefs::ALT_SPEED_LIMIT_TIME_ENABLED: case Prefs::ALT_SPEED_LIMIT_TIME_END: case Prefs::ALT_SPEED_LIMIT_UP: case Prefs::BLOCKLIST_DATE: case Prefs::BLOCKLIST_ENABLED: case Prefs::BLOCKLIST_URL: case Prefs::DHT_ENABLED: case Prefs::DOWNLOAD_QUEUE_ENABLED: case Prefs::DOWNLOAD_QUEUE_SIZE: case Prefs::DSPEED: case Prefs::DSPEED_ENABLED: case Prefs::IDLE_LIMIT: case Prefs::IDLE_LIMIT_ENABLED: case Prefs::INCOMPLETE_DIR: case Prefs::INCOMPLETE_DIR_ENABLED: case Prefs::LPD_ENABLED: case Prefs::PEER_LIMIT_GLOBAL: case Prefs::PEER_LIMIT_TORRENT: case Prefs::PEER_PORT: case Prefs::PEER_PORT_RANDOM_ON_START: case Prefs::QUEUE_STALLED_MINUTES: case Prefs::PEX_ENABLED: case Prefs::PORT_FORWARDING: case Prefs::RENAME_PARTIAL_FILES: case Prefs::SCRIPT_TORRENT_DONE_ENABLED: case Prefs::SCRIPT_TORRENT_DONE_FILENAME: case Prefs::START: case Prefs::TRASH_ORIGINAL: case Prefs::USPEED: case Prefs::USPEED_ENABLED: case Prefs::UTP_ENABLED: sessionSet (myPrefs.getKey (key), myPrefs.variant (key)); break; case Prefs::DOWNLOAD_DIR: sessionSet (myPrefs.getKey (key), myPrefs.variant (key)); /* this will change the 'freespace' argument, so refresh */ refreshSessionInfo (); break; case Prefs::RATIO: sessionSet (TR_KEY_seedRatioLimit, myPrefs.variant (key)); break; case Prefs::RATIO_ENABLED: sessionSet (TR_KEY_seedRatioLimited, myPrefs.variant (key)); break; case Prefs::ENCRYPTION: { const int i = myPrefs.variant (key).toInt (); switch (i) { case 0: sessionSet (myPrefs.getKey (key), QLatin1String ("tolerated")); break; case 1: sessionSet (myPrefs.getKey (key), QLatin1String ("preferred")); break; case 2: sessionSet (myPrefs.getKey (key), QLatin1String ("required")); break; } break; } case Prefs::RPC_AUTH_REQUIRED: if (mySession) tr_sessionSetRPCPasswordEnabled (mySession, myPrefs.getBool (key)); break; case Prefs::RPC_ENABLED: if (mySession) tr_sessionSetRPCEnabled (mySession, myPrefs.getBool (key)); break; case Prefs::RPC_PASSWORD: if (mySession) tr_sessionSetRPCPassword (mySession, myPrefs.getString (key).toUtf8 ().constData ()); break; case Prefs::RPC_PORT: if (mySession) tr_sessionSetRPCPort (mySession, myPrefs.getInt (key)); break; case Prefs::RPC_USERNAME: if (mySession) tr_sessionSetRPCUsername (mySession, myPrefs.getString (key).toUtf8 ().constData ()); break; case Prefs::RPC_WHITELIST_ENABLED: if (mySession) tr_sessionSetRPCWhitelistEnabled (mySession, myPrefs.getBool (key)); break; case Prefs::RPC_WHITELIST: if (mySession) tr_sessionSetRPCWhitelist (mySession, myPrefs.getString (key).toUtf8 ().constData ()); break; default: std::cerr << "unhandled pref: " << key << std::endl; } } /*** **** ***/ Session::Session (const QString& configDir, Prefs& prefs): myConfigDir (configDir), myPrefs (prefs), nextUniqueTag (FIRST_UNIQUE_TAG), myBlocklistSize (-1), mySession (0) { myStats.ratio = TR_RATIO_NA; myStats.uploadedBytes = 0; myStats.downloadedBytes = 0; myStats.filesAdded = 0; myStats.sessionCount = 0; myStats.secondsActive = 0; myCumulativeStats = myStats; connect (&myPrefs, SIGNAL (changed (int)), this, SLOT (updatePref (int))); connect (&myRpc, SIGNAL (executed (int64_t, QString, tr_variant *)), this, SLOT (responseReceived (int64_t, QString, tr_variant *))); connect (&myRpc, SIGNAL (httpAuthenticationRequired ()), this, SIGNAL (httpAuthenticationRequired ())); connect (&myRpc, SIGNAL (dataReadProgress ()), this, SIGNAL (dataReadProgress ())); connect (&myRpc, SIGNAL (dataSendProgress ()), this, SIGNAL (dataSendProgress ())); connect (&myRpc, SIGNAL (error (QNetworkReply::NetworkError)), this, SIGNAL (error (QNetworkReply::NetworkError))); connect (&myRpc, SIGNAL (errorMessage (QString)), this, SIGNAL (errorMessage (QString))); } Session::~Session () { stop (); } /*** **** ***/ void Session::stop () { myRpc.stop (); if (mySession) { tr_sessionClose (mySession); mySession = 0; } } void Session::restart () { stop (); start (); } void Session::start () { if (myPrefs.get (Prefs::SESSION_IS_REMOTE)) { QUrl url; url.setScheme (QLatin1String ("http")); url.setHost (myPrefs.get (Prefs::SESSION_REMOTE_HOST)); url.setPort (myPrefs.get (Prefs::SESSION_REMOTE_PORT)); url.setPath (QLatin1String ("/transmission/rpc")); if (myPrefs.get (Prefs::SESSION_REMOTE_AUTH)) { url.setUserName (myPrefs.get (Prefs::SESSION_REMOTE_USERNAME)); url.setPassword (myPrefs.get (Prefs::SESSION_REMOTE_PASSWORD)); } myRpc.start (url); } else { tr_variant settings; tr_variantInitDict (&settings, 0); tr_sessionLoadSettings (&settings, myConfigDir.toUtf8 ().constData (), "qt"); mySession = tr_sessionInit (myConfigDir.toUtf8 ().constData (), true, &settings); tr_variantFree (&settings); myRpc.start (mySession); tr_ctor * ctor = tr_ctorNew (mySession); int torrentCount; tr_torrent ** torrents = tr_sessionLoadTorrents (mySession, ctor, &torrentCount); tr_free (torrents); tr_ctorFree (ctor); } emit sourceChanged (); } bool Session::isServer () const { return mySession != 0; } bool Session::isLocal () const { return myRpc.isLocal (); } /*** **** ***/ namespace { void addOptionalIds (tr_variant * args, const QSet& ids) { if (!ids.isEmpty ()) { tr_variant * idList (tr_variantDictAddList (args, TR_KEY_ids, ids.size ())); for (const int i: ids) tr_variantListAddInt (idList, i); } } } void Session::torrentSet (const QSet& ids, const tr_quark key, double value) { tr_variant args; tr_variantInitDict (&args, 2); tr_variantDictAddReal (&args, key, value); addOptionalIds (&args, ids); exec (TR_KEY_torrent_set, &args); } void Session::torrentSet (const QSet& ids, const tr_quark key, int value) { tr_variant args; tr_variantInitDict (&args, 2); tr_variantDictAddInt (&args, key, value); addOptionalIds (&args, ids); exec (TR_KEY_torrent_set, &args); } void Session::torrentSet (const QSet& ids, const tr_quark key, bool value) { tr_variant args; tr_variantInitDict (&args, 2); tr_variantDictAddBool (&args, key, value); addOptionalIds (&args, ids); exec (TR_KEY_torrent_set, &args); } void Session::torrentSet (const QSet& ids, const tr_quark key, const QStringList& value) { tr_variant args; tr_variantInitDict (&args, 2); addOptionalIds (&args, ids); tr_variant * list (tr_variantDictAddList (&args, key, value.size ())); for (const QString& str: value) tr_variantListAddStr (list, str.toUtf8 ().constData ()); exec(TR_KEY_torrent_set, &args); } void Session::torrentSet (const QSet& ids, const tr_quark key, const QList& value) { tr_variant args; tr_variantInitDict (&args, 2); addOptionalIds (&args, ids); tr_variant * list (tr_variantDictAddList (&args, key, value.size ())); for (const int i: value) tr_variantListAddInt (list, i); exec (TR_KEY_torrent_set, &args); } void Session::torrentSet (const QSet& ids, const tr_quark key, const QPair& value) { tr_variant args; tr_variantInitDict (&args, 2); addOptionalIds (&args, ids); tr_variant * list (tr_variantDictAddList (&args, key, 2)); tr_variantListAddInt (list, value.first); tr_variantListAddStr (list, value.second.toUtf8 ().constData ()); exec (TR_KEY_torrent_set, &args); } void Session::torrentSetLocation (const QSet& ids, const QString& location, bool doMove) { tr_variant args; tr_variantInitDict (&args, 3); addOptionalIds (&args, ids); tr_variantDictAddStr (&args, TR_KEY_location, location.toUtf8 ().constData ()); tr_variantDictAddBool (&args, TR_KEY_move, doMove); exec (TR_KEY_torrent_set_location, &args); } void Session::torrentRenamePath (const QSet& ids, const QString& oldpath, const QString& newname) { tr_variant args; tr_variantInitDict (&args, 2); addOptionalIds (&args, ids); tr_variantDictAddStr (&args, TR_KEY_path, oldpath.toUtf8 ().constData ()); tr_variantDictAddStr (&args, TR_KEY_name, newname.toUtf8 ().constData ()); exec ("torrent-rename-path", &args, TAG_RENAME_PATH); } void Session::refreshTorrents (const QSet& ids) { if (ids.empty ()) { refreshAllTorrents (); } else { tr_variant args; tr_variantInitDict (&args, 2); addList (tr_variantDictAddList (&args, TR_KEY_fields, 0), getStatKeys ()); addOptionalIds (&args, ids); exec (TR_KEY_torrent_get, &args, TAG_SOME_TORRENTS); } } void Session::refreshExtraStats (const QSet& ids) { tr_variant args; tr_variantInitDict (&args, 3); addOptionalIds (&args, ids); addList (tr_variantDictAddList (&args, TR_KEY_fields, 0), getStatKeys () + getExtraStatKeys ()); exec (TR_KEY_torrent_get, &args, TAG_SOME_TORRENTS); } void Session::sendTorrentRequest (const char * request, const QSet& ids) { tr_variant args; tr_variantInitDict (&args, 1); addOptionalIds (&args, ids); exec (request, &args); refreshTorrents (ids); } void Session::pauseTorrents (const QSet& ids) { sendTorrentRequest ("torrent-stop", ids); } void Session::startTorrents (const QSet& ids) { sendTorrentRequest ("torrent-start", ids); } void Session::startTorrentsNow (const QSet& ids) { sendTorrentRequest ("torrent-start-now", ids); } void Session::queueMoveTop (const QSet& ids) { sendTorrentRequest ("queue-move-top", ids); } void Session::queueMoveUp (const QSet& ids) { sendTorrentRequest ("queue-move-up", ids); } void Session::queueMoveDown (const QSet& ids) { sendTorrentRequest ("queue-move-down", ids); } void Session::queueMoveBottom (const QSet& ids) { sendTorrentRequest ("queue-move-bottom", ids); } void Session::refreshActiveTorrents () { tr_variant args; tr_variantInitDict (&args, 2); tr_variantDictAddStr (&args, TR_KEY_ids, "recently-active"); addList (tr_variantDictAddList (&args, TR_KEY_fields, 0), getStatKeys ()); exec (TR_KEY_torrent_get, &args, TAG_SOME_TORRENTS); } void Session::refreshAllTorrents () { tr_variant args; tr_variantInitDict (&args, 1); addList (tr_variantDictAddList (&args, TR_KEY_fields, 0), getStatKeys ()); exec (TR_KEY_torrent_get, &args, TAG_ALL_TORRENTS); } void Session::initTorrents (const QSet& ids) { tr_variant args; tr_variantInitDict (&args, 2); addOptionalIds (&args, ids); addList (tr_variantDictAddList (&args, TR_KEY_fields, 0), getStatKeys ()+getInfoKeys ()); exec ("torrent-get", &args, ids.isEmpty () ? TAG_ALL_TORRENTS : TAG_SOME_TORRENTS); } void Session::refreshSessionStats () { exec ("session-stats", nullptr, TAG_SESSION_STATS); } void Session::refreshSessionInfo () { exec ("session-get", nullptr, TAG_SESSION_INFO); } void Session::updateBlocklist () { exec ("blocklist-update", nullptr, TAG_BLOCKLIST_UPDATE); } /*** **** ***/ void Session::exec (tr_quark method, tr_variant * args, int64_t tag) { myRpc.exec (method, args, tag); } void Session::exec (const char* method, tr_variant * args, int64_t tag) { myRpc.exec (method, args, tag); } void Session::responseReceived (int64_t tag, const QString& result, tr_variant * args) { emit executed (tag, result, args); if (tag < 0) return; switch (tag) { case TAG_SOME_TORRENTS: case TAG_ALL_TORRENTS: if (args != nullptr) { tr_variant * torrents; if (tr_variantDictFindList (args, TR_KEY_torrents, &torrents)) emit torrentsUpdated (torrents, tag==TAG_ALL_TORRENTS); if (tr_variantDictFindList (args, TR_KEY_removed, &torrents)) emit torrentsRemoved (torrents); } break; case TAG_SESSION_STATS: if (args != nullptr) updateStats (args); break; case TAG_SESSION_INFO: if (args != nullptr) updateInfo (args); break; case TAG_BLOCKLIST_UPDATE: { int64_t intVal = 0; if (args != nullptr) { if (tr_variantDictFindInt (args, TR_KEY_blocklist_size, &intVal)) setBlocklistSize (intVal); } break; } case TAG_RENAME_PATH: { int64_t id = 0; if (result != QLatin1String ("success")) { const char * path = ""; const char * name = ""; tr_variantDictFindStr (args, TR_KEY_path, &path, 0); tr_variantDictFindStr (args, TR_KEY_name, &name, 0); const QString title = tr ("Error Renaming Path"); const QString text = tr ("

Unable to rename \"%1\" as \"%2\": %3.

Please correct the errors and try again.

").arg (QString::fromUtf8 (path)).arg (QString::fromUtf8 (name)).arg (result); QMessageBox * d = new QMessageBox (QMessageBox::Information, title, text, QMessageBox::Close, qApp->activeWindow ()); connect (d, SIGNAL (rejected ()), d, SLOT (deleteLater ())); d->show (); } else if (tr_variantDictFindInt (args, TR_KEY_id, &id) && id) { tr_variant args; tr_variantInitDict (&args, 2); tr_variantDictAddInt (&args, TR_KEY_ids, id); addList (tr_variantDictAddList (&args, TR_KEY_fields, 0), KeyList () << TR_KEY_fileStats << TR_KEY_files << TR_KEY_id << TR_KEY_name); exec ("torrent-get", &args, TAG_SOME_TORRENTS); } break; } case TAG_PORT_TEST: { bool isOpen; if (args == nullptr || !tr_variantDictFindBool (args, TR_KEY_port_is_open, &isOpen)) isOpen = false; emit portTested (isOpen); break; } case TAG_MAGNET_LINK: { tr_variant * torrents; tr_variant * child; const char * str; if (args != nullptr && tr_variantDictFindList (args, TR_KEY_torrents, &torrents) && ( (child = tr_variantListChild (torrents, 0))) && tr_variantDictFindStr (child, TR_KEY_magnetLink, &str, NULL)) qApp->clipboard ()->setText (QString::fromUtf8 (str)); break; } case TAG_ADD_TORRENT: { const char * str = ""; if (result != QLatin1String ("success")) { QMessageBox * d = new QMessageBox (QMessageBox::Information, tr ("Add Torrent"), QString::fromUtf8 (str), QMessageBox::Close, qApp->activeWindow ()); connect (d, SIGNAL (rejected ()), d, SLOT (deleteLater ())); d->show (); } break; } } } void Session::updateStats (tr_variant * d, tr_session_stats * stats) { int64_t i; if (tr_variantDictFindInt (d, TR_KEY_uploadedBytes, &i)) stats->uploadedBytes = i; if (tr_variantDictFindInt (d, TR_KEY_downloadedBytes, &i)) stats->downloadedBytes = i; if (tr_variantDictFindInt (d, TR_KEY_filesAdded, &i)) stats->filesAdded = i; if (tr_variantDictFindInt (d, TR_KEY_sessionCount, &i)) stats->sessionCount = i; if (tr_variantDictFindInt (d, TR_KEY_secondsActive, &i)) stats->secondsActive = i; stats->ratio = tr_getRatio (stats->uploadedBytes, stats->downloadedBytes); } void Session::updateStats (tr_variant * d) { tr_variant * c; if (tr_variantDictFindDict (d, TR_KEY_current_stats, &c)) updateStats (c, &myStats); if (tr_variantDictFindDict (d, TR_KEY_cumulative_stats, &c)) updateStats (c, &myCumulativeStats); emit statsUpdated (); } void Session::updateInfo (tr_variant * d) { int64_t i; const char * str; disconnect (&myPrefs, SIGNAL (changed (int)), this, SLOT (updatePref (int))); for (int i=Prefs::FIRST_CORE_PREF; i<=Prefs::LAST_CORE_PREF; ++i) { const tr_variant * b (tr_variantDictFind (d, myPrefs.getKey (i))); if (!b) continue; if (i == Prefs::ENCRYPTION) { const char * val; if (tr_variantGetStr (b, &val, NULL)) { if (!qstrcmp (val , "required")) myPrefs.set (i, 2); else if (!qstrcmp (val , "preferred")) myPrefs.set (i, 1); else if (!qstrcmp (val , "tolerated")) myPrefs.set (i, 0); } continue; } switch (myPrefs.type (i)) { case QVariant::Int: { int64_t val; if (tr_variantGetInt (b, &val)) myPrefs.set (i, static_cast(val)); break; } case QVariant::Double: { double val; if (tr_variantGetReal (b, &val)) myPrefs.set (i, val); break; } case QVariant::Bool: { bool val; if (tr_variantGetBool (b, &val)) myPrefs.set (i, val); break; } case CustomVariantType::FilterModeType: case CustomVariantType::SortModeType: case QVariant::String: { const char * val; if (tr_variantGetStr (b, &val, NULL)) myPrefs.set (i, QString::fromUtf8 (val)); break; } default: break; } } bool b; double x; if (tr_variantDictFindBool (d, TR_KEY_seedRatioLimited, &b)) myPrefs.set (Prefs::RATIO_ENABLED, b); if (tr_variantDictFindReal (d, TR_KEY_seedRatioLimit, &x)) myPrefs.set (Prefs::RATIO, x); /* Use the C API to get settings that, for security reasons, aren't supported by RPC */ if (mySession != 0) { myPrefs.set (Prefs::RPC_ENABLED, tr_sessionIsRPCEnabled (mySession)); myPrefs.set (Prefs::RPC_AUTH_REQUIRED, tr_sessionIsRPCPasswordEnabled (mySession)); myPrefs.set (Prefs::RPC_PASSWORD, QString::fromUtf8 (tr_sessionGetRPCPassword (mySession))); myPrefs.set (Prefs::RPC_PORT, tr_sessionGetRPCPort (mySession)); myPrefs.set (Prefs::RPC_USERNAME, QString::fromUtf8 (tr_sessionGetRPCUsername (mySession))); myPrefs.set (Prefs::RPC_WHITELIST_ENABLED, tr_sessionGetRPCWhitelistEnabled (mySession)); myPrefs.set (Prefs::RPC_WHITELIST, QString::fromUtf8 (tr_sessionGetRPCWhitelist (mySession))); } if (tr_variantDictFindInt (d, TR_KEY_blocklist_size, &i) && i!=blocklistSize ()) setBlocklistSize (i); if (tr_variantDictFindStr (d, TR_KEY_version, &str, NULL) && (mySessionVersion != QString::fromUtf8 (str))) mySessionVersion = QString::fromUtf8 (str); //std::cerr << "Session::updateInfo end" << std::endl; connect (&myPrefs, SIGNAL (changed (int)), this, SLOT (updatePref (int))); emit sessionUpdated (); } void Session::setBlocklistSize (int64_t i) { myBlocklistSize = i; emit blocklistUpdated (i); } void Session::addTorrent (const AddData& addMe, tr_variant * args, bool trashOriginal) { assert (tr_variantDictFind (args, TR_KEY_filename) == nullptr); assert (tr_variantDictFind (args, TR_KEY_metainfo) == nullptr); if (tr_variantDictFind (args, TR_KEY_paused) == nullptr) tr_variantDictAddBool (args, TR_KEY_paused, !myPrefs.getBool (Prefs::START)); switch (addMe.type) { case AddData::MAGNET: tr_variantDictAddStr (args, TR_KEY_filename, addMe.magnet.toUtf8 ().constData ()); break; case AddData::URL: tr_variantDictAddStr (args, TR_KEY_filename, addMe.url.toString ().toUtf8 ().constData ()); break; case AddData::FILENAME: /* fall-through */ case AddData::METAINFO: { const QByteArray b64 = addMe.toBase64 (); tr_variantDictAddRaw (args, TR_KEY_metainfo, b64.constData (), b64.size ()); break; } default: qWarning() << "Unhandled AddData type: " << addMe.type; break; } const int64_t tag = getUniqueTag (); // maybe delete the source .torrent FileAdded * fileAdded = new FileAdded (tag, addMe.readableName ()); if (trashOriginal && addMe.type == AddData::FILENAME) fileAdded->setFileToDelete (addMe.filename); connect (this, SIGNAL (executed (int64_t, QString, tr_variant *)), fileAdded, SLOT (executed (int64_t, QString, tr_variant *))); exec ("torrent-add", args, tag); } void Session::addTorrent (const AddData& addMe) { tr_variant args; tr_variantInitDict (&args, 3); addTorrent (addMe, &args, myPrefs.getBool (Prefs::TRASH_ORIGINAL)); } void Session::addNewlyCreatedTorrent (const QString& filename, const QString& localPath) { const QByteArray b64 = AddData (filename).toBase64 (); tr_variant args; tr_variantInitDict (&args, 3); tr_variantDictAddStr (&args, TR_KEY_download_dir, localPath.toUtf8 ().constData ()); tr_variantDictAddBool (&args, TR_KEY_paused, !myPrefs.getBool (Prefs::START)); tr_variantDictAddRaw (&args, TR_KEY_metainfo, b64.constData (), b64.size ()); exec ("torrent-add", &args); } void Session::removeTorrents (const QSet& ids, bool deleteFiles) { if (!ids.isEmpty ()) { tr_variant args; tr_variantInitDict (&args, 2); addOptionalIds (&args, ids); tr_variantDictAddInt (&args, TR_KEY_delete_local_data, deleteFiles); exec ("torrent-remove", &args); } } void Session::verifyTorrents (const QSet& ids) { if (!ids.isEmpty ()) { tr_variant args; tr_variantInitDict (&args, 1); addOptionalIds (&args, ids); exec ("torrent-verify", &args); } } void Session::reannounceTorrents (const QSet& ids) { if (!ids.isEmpty ()) { tr_variant args; tr_variantInitDict (&args, 1); addOptionalIds (&args, ids); exec ("torrent-reannounce", &args); } } /*** **** ***/ void Session::launchWebInterface () { QUrl url; if (!mySession) // remote session { url = myRpc.url (); url.setPath (QLatin1String ("/transmission/web/")); } else // local session { url.setScheme (QLatin1String ("http")); url.setHost (QLatin1String ("localhost")); url.setPort (myPrefs.getInt (Prefs::RPC_PORT)); } QDesktopServices::openUrl (url); } transmission-2.92/qt/PaxHeaders.4960/my-valgrind.sh0000644000000000000000000000012612442116604017072 xustar0028 mtime=1418239364.6012512 28 atime=1418239364.6012512 30 ctime=1457295917.269761477 transmission-2.92/qt/my-valgrind.sh0000755000175000017500000000046612442116604020525 0ustar00mikedldmikedld00000000000000#/bin/sh #valgrind --tool=cachegrind ./transmission-qt 2>&1 | tee runlog #valgrind --tool=massif --threshold=0.2 ./transmission-qt 2>&1 | tee runlog valgrind --tool=memcheck --leak-check=full --leak-resolution=high --num-callers=16 --log-file=x-valgrind --show-reachable=no ./transmission-qt 2>&1 | tee runlog transmission-2.92/qt/PaxHeaders.4960/StatsDialog.ui0000644000000000000000000000013212556344513017067 xustar0030 mtime=1438239051.873515916 30 atime=1438239051.873515916 30 ctime=1457295917.237760933 transmission-2.92/qt/StatsDialog.ui0000644000175000017500000001356512556344513020526 0ustar00mikedldmikedld00000000000000 StatsDialog 0 0 138 315 Statistics QLayout::SetFixedSize font-weight:bold Current Session 18 Uploaded: ... Downloaded: ... Ratio: ... Duration: ... Qt::Vertical QSizePolicy::Fixed 1 10 font-weight:bold Total 18 ... Uploaded: ... Downloaded: ... Ratio: ... Duration: ... Qt::Horizontal QDialogButtonBox::Close dialogButtons rejected() StatsDialog reject() 71 282 71 151 transmission-2.92/PaxHeaders.4960/INSTALL0000644000000000000000000000013212667111006014707 xustar0030 mtime=1457295878.722106023 30 atime=1457295878.719105972 30 ctime=1457295917.163759674 transmission-2.92/INSTALL0000644000175000017500000003661012667111006016342 0ustar00mikedldmikedld00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell command `./configure && make && make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. transmission-2.92/PaxHeaders.4960/missing0000644000000000000000000000013212667111006015252 xustar0030 mtime=1457295878.677105258 30 atime=1457295878.677105258 30 ctime=1457295917.212760508 transmission-2.92/missing0000755000175000017500000001533012667111006016704 0ustar00mikedldmikedld00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2014 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: transmission-2.92/PaxHeaders.4960/compile0000644000000000000000000000013212667111006015231 xustar0030 mtime=1457295878.652104833 30 atime=1457295878.652104833 30 ctime=1457295917.183760014 transmission-2.92/compile0000755000175000017500000001624512667111006016671 0ustar00mikedldmikedld00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2014 Free Software Foundation, Inc. # Written by Tom Tromey . # # 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: transmission-2.92/PaxHeaders.4960/update-version-h.sh0000644000000000000000000000013012516512263017405 xustar0030 mtime=1429902515.010430697 30 atime=1429902515.010430697 28 ctime=1457295917.2887618 transmission-2.92/update-version-h.sh0000755000175000017500000000471312516512263021044 0ustar00mikedldmikedld00000000000000#!/bin/sh # Generate files to be included: only overwrite them if changed so make # won't rebuild everything unless necessary replace_if_differs () { if cmp $1 $2 > /dev/null 2>&1; then rm -f $1 else mv -f $1 $2 fi } echo "creating libtransmission/version.h" user_agent_prefix=`grep m4_define configure.ac | sed "s/[][)(]/,/g" | grep user_agent_prefix | cut -d , -f 6` peer_id_prefix=`grep m4_define configure.ac | sed "s/[][)(]/,/g" | grep peer_id_prefix | cut -d , -f 6` major_version=`echo ${user_agent_prefix} | awk -F . '{print $1}'` minor_version=`echo ${user_agent_prefix} | awk -F . '{print $2 + 0}'` svn_revision_file=REVISION svn_revision_reliable=true if [ -n "$JENKINS_URL" -a -n "$SVN_REVISION" ]; then # Jenkins automated build, use the set environment variables to avoid # version mismatches between java's svn and command line's svn svn_revision=$SVN_REVISION elif [ -d ".svn" ] && type svnversion >/dev/null 2>&1; then # If this is a svn tree, and svnversion is available in PATH, use it to # grab the version. svn_revision=`svnversion -n . | cut -d: -f1 | cut -dM -f1 | cut -dS -f1` elif [ -f "$svn_revision_file" ]; then svn_revision=`cat "$svn_revision_file"` else # Give up and check the source files svn_revision=`awk '/\\$Id: /{ if ($4>i) i=$4 } END {print i}' */*.cc */*.[chm] */*.po` svn_revision_reliable=false fi if $svn_revision_reliable; then [ -f "$svn_revision_file" ] && [ "`cat "$svn_revision_file"`" -eq "$svn_revision" ] || echo "$svn_revision" > "$svn_revision_file" else rm -f "$svn_revision_file" fi cat > libtransmission/version.h.new << EOF #define PEERID_PREFIX "${peer_id_prefix}" #define USERAGENT_PREFIX "${user_agent_prefix}" #define SVN_REVISION "${svn_revision}" #define SVN_REVISION_NUM ${svn_revision} #define SHORT_VERSION_STRING "${user_agent_prefix}" #define LONG_VERSION_STRING "${user_agent_prefix} (${svn_revision})" #define VERSION_STRING_INFOPLIST ${user_agent_prefix} #define MAJOR_VERSION ${major_version} #define MINOR_VERSION ${minor_version} EOF # Add a release definition case "${peer_id_prefix}" in *X-) echo '#define TR_BETA_RELEASE 1' ;; *Z-) echo '#define TR_NIGHTLY_RELEASE 1' ;; *) echo '#define TR_STABLE_RELEASE 1' ;; esac >> "libtransmission/version.h.new" replace_if_differs libtransmission/version.h.new libtransmission/version.h transmission-2.92/PaxHeaders.4960/third-party0000644000000000000000000000013212667111057016056 xustar0030 mtime=1457295919.048791729 30 atime=1457295917.037757532 30 ctime=1457295919.048791729 transmission-2.92/third-party/0000755000175000017500000000000012667111057017560 5ustar00mikedldmikedld00000000000000transmission-2.92/third-party/PaxHeaders.4960/event2.cmake0000644000000000000000000000013212505250244020331 xustar0030 mtime=1427460260.072236909 30 atime=1427460260.072236909 30 ctime=1457295917.384763432 transmission-2.92/third-party/event2.cmake0000644000175000017500000000144712505250244021764 0ustar00mikedldmikedld00000000000000cmake_minimum_required(VERSION 2.8) project(event C) set(${PROJECT_NAME}_ADD_SOURCES win32select.c evthread_win32.c buffer_iocp.c event_iocp.c bufferevent_async.c ) add_definitions(-DHAVE_CONFIG_H) include_directories(include compat WIN32-Code) add_library(${PROJECT_NAME} STATIC event.c buffer.c bufferevent.c bufferevent_sock.c bufferevent_pair.c listener.c evmap.c log.c evutil.c strlcpy.c signal.c bufferevent_filter.c evthread.c bufferevent_ratelim.c evutil_rand.c event_tagging.c http.c evdns.c evrpc.c ${${PROJECT_NAME}_ADD_SOURCES} ) install(TARGETS ${PROJECT_NAME} DESTINATION lib) install(DIRECTORY include/event2 DESTINATION include) install(DIRECTORY WIN32-Code/event2 DESTINATION include) transmission-2.92/third-party/PaxHeaders.4960/dht0000644000000000000000000000013212667111056016634 xustar0030 mtime=1457295918.102775642 30 atime=1457295917.862771561 30 ctime=1457295918.102775642 transmission-2.92/third-party/dht/0000755000175000017500000000000012667111056020336 5ustar00mikedldmikedld00000000000000transmission-2.92/third-party/dht/PaxHeaders.4960/README0000644000000000000000000000013212442116701017562 xustar0030 mtime=1418239425.736298867 30 atime=1418239425.736298867 30 ctime=1457295918.075775183 transmission-2.92/third-party/dht/README0000644000175000017500000001666312442116701021223 0ustar00mikedldmikedld00000000000000The files dht.c and dht.h implement the variant of the Kademlia Distributed Hash Table (DHT) used in the Bittorrent network (``mainline'' variant). The file dht-example.c is a stand-alone program that participates in the DHT. Another example is a patch against Transmission, which you might or might not be able to find somewhere. The code is designed to work well in both event-driven and threaded code. The caller, which is either an event-loop or a dedicated thread, must periodically call the function dht_periodic. In addition, it must call dht_periodic whenever any data has arrived from the network. All functions return -1 in case of failure, in which case errno is set, or a positive value in case of success. Initialisation ************** * dht_init This must be called before using the library. You pass it a bound IPv4 datagram socket, a bound IPv6 datagram socket, and your node id, a 20-octet array that should be globally unique. If you're on a multi-homed host, you should bind the sockets to one of your addresses. Node ids must be well distributed, so you cannot just use your Bittorrent id; you should either generate a truly random value (using plenty of entropy), or at least take the SHA-1 of something. However, it is a good idea to keep the id stable, so you may want to store it in stable storage at client shutdown. * dht_uninit This may be called at the end of the session. Bootstrapping ************* The DHT needs to be taught a small number of contacts to begin functioning. You can hard-wire a small number of stable nodes in your application, but this obviously fails to scale. You may save the list of known good nodes at shutdown, and restore it at restart. You may also grab nodes from torrent files (the nodes field), and you may exchange contacts with other Bittorrent peers using the PORT extension. * dht_ping This is the main bootstrapping primitive. You pass it an address at which you believe that a DHT node may be living, and a query will be sent. If a node replies, and if there is space in the routing table, it will be inserted. * dht_insert_node This is a softer bootstrapping method, which doesn't actually send a query -- it only stores the node in the routing table for later use. It is a good idea to use that when e.g. restoring your routing table from disk. Note that dht_insert_node requires that you supply a node id. If the id turns out to be wrong, the DHT will eventually recover; still, inserting massive amounts of incorrect information into your routing table is certainly not a good idea. An additionaly difficulty with dht_insert_node is that, for various reasons, a Kademlia routing table cannot absorb nodes faster than a certain rate. Dumping a large number of nodes into a table using dht_insert_node will probably cause most of these nodes to be discarded straight away. (The tolerable rate is difficult to estimate; it is probably on the order of one node every few seconds per node already in the table divided by 8, for some suitable value of 8.) Doing some work *************** * dht_periodic This function should be called by your main loop periodically, and also whenever data is available on the socket. The time after which dht_periodic should be called if no data is available is returned in the parameter tosleep. (You do not need to be particularly accurate; actually, it is a good idea to be late by a random value.) The parameters buf, buflen, from and fromlen optionally carry a received message. If buflen is 0, then no message was received. Dht_periodic also takes a callback, which will be called whenever something interesting happens (see below). * dht_search This schedules a search for information about the info-hash specified in id. If port is not 0, it specifies the TCP port on which the current peer is listening; in that case, when the search is complete it will be announced to the network. The port is in host order, beware if you got it from a struct sockaddr_in. In either case, data is passed to the callback function as soon as it is available, possibly in multiple pieces. The callback function will additionally be called when the search is complete. Up to DHT_MAX_SEARCHES (1024) searches can be in progress at a given time; any more, and dht_search will return -1. If you specify a new search for the same info hash as a search still in progress, the previous search is combined with the new one -- you will only receive a completion indication once. Information queries ******************* * dht_nodes This returns the number of known good, dubious and cached nodes in our routing table. This can be used to decide whether it's reasonable to start a search; a search is likely to be successful as long as we have a few good nodes; however, in order to avoid overloading your bootstrap nodes, you may want to wait until good is at least 4 and good + doubtful is at least 30 or so. It also includes the number of nodes that recently send us an unsolicited request; this can be used to determine if the UDP port used for the DHT is firewalled. If you want to display a single figure to the user, you should display good + doubtful, which is the total number of nodes in your routing table. Some clients try to estimate the total number of nodes, but this doesn't make much sense -- since the result is exponential in the number of nodes in the routing table, small variations in the latter cause huge jumps in the former. * dht_get_nodes This retrieves the list of known good nodes, starting with the nodes in our own bucket. It is a good idea to save the list of known good nodes at shutdown, and ping them at startup. * dht_dump_tables * dht_debug These are debugging aids. Functions provided by you ************************* * The callback function The callback function is called with 5 arguments. Closure is simply the value that you passed to dht_periodic. Event is one of DHT_EVENT_VALUES or DHT_EVENT_VALUES6, which indicates that we have new values, or DHT_EVENT_SEARCH_DONE or DHT_EVENT_SEARCH_DONE6, which indicates that a search has completed. In either case, info_hash is set to the info-hash of the search. In the case of DHT_EVENT_VALUES, data is a list of nodes in ``compact'' format -- 6 or 18 bytes per node. Its length in bytes is in data_len. * dht_blacklisted This is a function that takes an IP address and returns true if this address should be silently ignored. Do not use this feature unless you really must -- Kademlia supposes transitive reachability. * dht_hash This should compute a reasonably strong cryptographic hash of the passed values. It should map cleanly to your favourite crypto toolkit's MD5 or SHA-1 function. * dht_random_bytes This should fill the supplied buffer with true random bytes. Final notes *********** * NAT Nothing works well across NATs, but Kademlia is somewhat less impacted than many other protocols. The implementation takes care to distinguish between unidirectional and bidirectional reachability, and NATed nodes will eventually fall out from other nodes' routing tables. While there is no periodic pinging in this implementation, maintaining a full routing table requires slightly more than one packet exchange per minute, even in a completely idle network; this should be sufficient to make most full cone NATs happy. * Missing functionality Some of the code has had very little testing. If it breaks, you get to keep both pieces. Juliusz Chroboczek transmission-2.92/third-party/dht/PaxHeaders.4960/dht.h0000644000000000000000000000013212442116701017632 xustar0030 mtime=1418239425.734298833 30 atime=1418239425.734298833 30 ctime=1457295918.055774843 transmission-2.92/third-party/dht/dht.h0000644000175000017500000000471512442116701021266 0ustar00mikedldmikedld00000000000000/* Copyright (c) 2009-2011 by Juliusz Chroboczek 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. */ typedef void dht_callback(void *closure, int event, const unsigned char *info_hash, const void *data, size_t data_len); #define DHT_EVENT_NONE 0 #define DHT_EVENT_VALUES 1 #define DHT_EVENT_VALUES6 2 #define DHT_EVENT_SEARCH_DONE 3 #define DHT_EVENT_SEARCH_DONE6 4 extern FILE *dht_debug; int dht_init(int s, int s6, const unsigned char *id, const unsigned char *v); int dht_insert_node(const unsigned char *id, struct sockaddr *sa, int salen); int dht_ping_node(struct sockaddr *sa, int salen); int dht_periodic(const void *buf, size_t buflen, const struct sockaddr *from, int fromlen, time_t *tosleep, dht_callback *callback, void *closure); int dht_search(const unsigned char *id, int port, int af, dht_callback *callback, void *closure); int dht_nodes(int af, int *good_return, int *dubious_return, int *cached_return, int *incoming_return); void dht_dump_tables(FILE *f); int dht_get_nodes(struct sockaddr_in *sin, int *num, struct sockaddr_in6 *sin6, int *num6); int dht_uninit(void); /* This must be provided by the user. */ int dht_blacklisted(const struct sockaddr *sa, int salen); void dht_hash(void *hash_return, int hash_size, const void *v1, int len1, const void *v2, int len2, const void *v3, int len3); int dht_random_bytes(void *buf, size_t size); transmission-2.92/third-party/dht/PaxHeaders.4960/dht-example.c0000644000000000000000000000013012442116701021254 xustar0029 mtime=1418239425.73529885 29 atime=1418239425.73529885 30 ctime=1457295918.095775523 transmission-2.92/third-party/dht/dht-example.c0000644000175000017500000002757412442116701022722 0ustar00mikedldmikedld00000000000000/* This example code was written by Juliusz Chroboczek. You are free to cut'n'paste from it to your heart's content. */ /* For crypt */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include "dht.h" #define MAX_BOOTSTRAP_NODES 20 static struct sockaddr_storage bootstrap_nodes[MAX_BOOTSTRAP_NODES]; static int num_bootstrap_nodes = 0; static volatile sig_atomic_t dumping = 0, searching = 0, exiting = 0; static void sigdump(int signo) { dumping = 1; } static void sigtest(int signo) { searching = 1; } static void sigexit(int signo) { exiting = 1; } static void init_signals(void) { struct sigaction sa; sigset_t ss; sigemptyset(&ss); sa.sa_handler = sigdump; sa.sa_mask = ss; sa.sa_flags = 0; sigaction(SIGUSR1, &sa, NULL); sigemptyset(&ss); sa.sa_handler = sigtest; sa.sa_mask = ss; sa.sa_flags = 0; sigaction(SIGUSR2, &sa, NULL); sigemptyset(&ss); sa.sa_handler = sigexit; sa.sa_mask = ss; sa.sa_flags = 0; sigaction(SIGINT, &sa, NULL); } const unsigned char hash[20] = { 0x54, 0x57, 0x87, 0x89, 0xdf, 0xc4, 0x23, 0xee, 0xf6, 0x03, 0x1f, 0x81, 0x94, 0xa9, 0x3a, 0x16, 0x98, 0x8b, 0x72, 0x7b }; /* The call-back function is called by the DHT whenever something interesting happens. Right now, it only happens when we get a new value or when a search completes, but this may be extended in future versions. */ static void callback(void *closure, int event, const unsigned char *info_hash, const void *data, size_t data_len) { if(event == DHT_EVENT_SEARCH_DONE) printf("Search done.\n"); else if(event == DHT_EVENT_VALUES) printf("Received %d values.\n", (int)(data_len / 6)); } static unsigned char buf[4096]; int main(int argc, char **argv) { int i, rc, fd; int s = -1, s6 = -1, port; int have_id = 0; unsigned char myid[20]; time_t tosleep = 0; char *id_file = "dht-example.id"; int opt; int quiet = 0, ipv4 = 1, ipv6 = 1; struct sockaddr_in sin; struct sockaddr_in6 sin6; struct sockaddr_storage from; socklen_t fromlen; memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; memset(&sin6, 0, sizeof(sin6)); sin6.sin6_family = AF_INET6; while(1) { opt = getopt(argc, argv, "q46b:i:"); if(opt < 0) break; switch(opt) { case 'q': quiet = 1; break; case '4': ipv6 = 0; break; case '6': ipv4 = 0; break; case 'b': { char buf[16]; int rc; rc = inet_pton(AF_INET, optarg, buf); if(rc == 1) { memcpy(&sin.sin_addr, buf, 4); break; } rc = inet_pton(AF_INET6, optarg, buf); if(rc == 1) { memcpy(&sin6.sin6_addr, buf, 16); break; } goto usage; } break; case 'i': id_file = optarg; break; default: goto usage; } } /* Ids need to be distributed evenly, so you cannot just use your bittorrent id. Either generate it randomly, or take the SHA-1 of something. */ fd = open(id_file, O_RDONLY); if(fd >= 0) { rc = read(fd, myid, 20); if(rc == 20) have_id = 1; close(fd); } fd = open("/dev/urandom", O_RDONLY); if(fd < 0) { perror("open(random)"); exit(1); } if(!have_id) { int ofd; rc = read(fd, myid, 20); if(rc < 0) { perror("read(random)"); exit(1); } have_id = 1; close(fd); ofd = open(id_file, O_WRONLY | O_CREAT | O_TRUNC, 0666); if(ofd >= 0) { rc = write(ofd, myid, 20); if(rc < 20) unlink(id_file); close(ofd); } } { unsigned seed; read(fd, &seed, sizeof(seed)); srandom(seed); } close(fd); if(argc < 2) goto usage; i = optind; if(argc < i + 1) goto usage; port = atoi(argv[i++]); if(port <= 0 || port >= 0x10000) goto usage; while(i < argc) { struct addrinfo hints, *info, *infop; memset(&hints, 0, sizeof(hints)); hints.ai_socktype = SOCK_DGRAM; if(!ipv6) hints.ai_family = AF_INET; else if(!ipv4) hints.ai_family = AF_INET6; else hints.ai_family = 0; rc = getaddrinfo(argv[i], argv[i + 1], &hints, &info); if(rc != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rc)); exit(1); } i++; if(i >= argc) goto usage; infop = info; while(infop) { memcpy(&bootstrap_nodes[num_bootstrap_nodes], infop->ai_addr, infop->ai_addrlen); infop = infop->ai_next; num_bootstrap_nodes++; } freeaddrinfo(info); i++; } /* If you set dht_debug to a stream, every action taken by the DHT will be logged. */ if(!quiet) dht_debug = stdout; /* We need an IPv4 and an IPv6 socket, bound to a stable port. Rumour has it that uTorrent works better when it is the same as your Bittorrent port. */ if(ipv4) { s = socket(PF_INET, SOCK_DGRAM, 0); if(s < 0) { perror("socket(IPv4)"); } } if(ipv6) { s6 = socket(PF_INET6, SOCK_DGRAM, 0); if(s6 < 0) { perror("socket(IPv6)"); } } if(s < 0 && s6 < 0) { fprintf(stderr, "Eek!"); exit(1); } if(s >= 0) { sin.sin_port = htons(port); rc = bind(s, (struct sockaddr*)&sin, sizeof(sin)); if(rc < 0) { perror("bind(IPv4)"); exit(1); } } if(s6 >= 0) { int rc; int val = 1; rc = setsockopt(s6, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&val, sizeof(val)); if(rc < 0) { perror("setsockopt(IPV6_V6ONLY)"); exit(1); } /* BEP-32 mandates that we should bind this socket to one of our global IPv6 addresses. In this simple example, this only happens if the user used the -b flag. */ sin6.sin6_port = htons(port); rc = bind(s6, (struct sockaddr*)&sin6, sizeof(sin6)); if(rc < 0) { perror("bind(IPv6)"); exit(1); } } /* Init the dht. This sets the socket into non-blocking mode. */ rc = dht_init(s, s6, myid, (unsigned char*)"JC\0\0"); if(rc < 0) { perror("dht_init"); exit(1); } init_signals(); /* For bootstrapping, we need an initial list of nodes. This could be hard-wired, but can also be obtained from the nodes key of a torrent file, or from the PORT bittorrent message. Dht_ping_node is the brutal way of bootstrapping -- it actually sends a message to the peer. If you're going to bootstrap from a massive number of nodes (for example because you're restoring from a dump) and you already know their ids, it's better to use dht_insert_node. If the ids are incorrect, the DHT will recover. */ for(i = 0; i < num_bootstrap_nodes; i++) { dht_ping_node((struct sockaddr*)&bootstrap_nodes[i], sizeof(bootstrap_nodes[i])); usleep(random() % 100000); } while(1) { struct timeval tv; fd_set readfds; tv.tv_sec = tosleep; tv.tv_usec = random() % 1000000; FD_ZERO(&readfds); if(s >= 0) FD_SET(s, &readfds); if(s6 >= 0) FD_SET(s6, &readfds); rc = select(s > s6 ? s + 1 : s6 + 1, &readfds, NULL, NULL, &tv); if(rc < 0) { if(errno != EINTR) { perror("select"); sleep(1); } } if(exiting) break; if(rc > 0) { fromlen = sizeof(from); if(s >= 0 && FD_ISSET(s, &readfds)) rc = recvfrom(s, buf, sizeof(buf) - 1, 0, (struct sockaddr*)&from, &fromlen); else if(s6 >= 0 && FD_ISSET(s6, &readfds)) rc = recvfrom(s6, buf, sizeof(buf) - 1, 0, (struct sockaddr*)&from, &fromlen); else abort(); } if(rc > 0) { buf[rc] = '\0'; rc = dht_periodic(buf, rc, (struct sockaddr*)&from, fromlen, &tosleep, callback, NULL); } else { rc = dht_periodic(NULL, 0, NULL, 0, &tosleep, callback, NULL); } if(rc < 0) { if(errno == EINTR) { continue; } else { perror("dht_periodic"); if(rc == EINVAL || rc == EFAULT) abort(); tosleep = 1; } } /* This is how you trigger a search for a torrent hash. If port (the second argument) is non-zero, it also performs an announce. Since peers expire announced data after 30 minutes, it's a good idea to reannounce every 28 minutes or so. */ if(searching) { if(s >= 0) dht_search(hash, 0, AF_INET, callback, NULL); if(s6 >= 0) dht_search(hash, 0, AF_INET6, callback, NULL); searching = 0; } /* For debugging, or idle curiosity. */ if(dumping) { dht_dump_tables(stdout); dumping = 0; } } { struct sockaddr_in sin[500]; struct sockaddr_in6 sin6[500]; int num = 500, num6 = 500; int i; i = dht_get_nodes(sin, &num, sin6, &num6); printf("Found %d (%d + %d) good nodes.\n", i, num, num6); } dht_uninit(); return 0; usage: printf("Usage: dht-example [-q] [-4] [-6] [-i filename] [-b address]...\n" " port [address port]...\n"); exit(1); } /* Functions called by the DHT. */ int dht_blacklisted(const struct sockaddr *sa, int salen) { return 0; } /* We need to provide a reasonably strong cryptographic hashing function. Here's how we'd do it if we had RSA's MD5 code. */ #if 0 void dht_hash(void *hash_return, int hash_size, const void *v1, int len1, const void *v2, int len2, const void *v3, int len3) { static MD5_CTX ctx; MD5Init(&ctx); MD5Update(&ctx, v1, len1); MD5Update(&ctx, v2, len2); MD5Update(&ctx, v3, len3); MD5Final(&ctx); if(hash_size > 16) memset((char*)hash_return + 16, 0, hash_size - 16); memcpy(hash_return, ctx.digest, hash_size > 16 ? 16 : hash_size); } #else /* But for this example, we might as well use something weaker. */ void dht_hash(void *hash_return, int hash_size, const void *v1, int len1, const void *v2, int len2, const void *v3, int len3) { const char *c1 = v1, *c2 = v2, *c3 = v3; char key[9]; /* crypt is limited to 8 characters */ int i; memset(key, 0, 9); #define CRYPT_HAPPY(c) ((c % 0x60) + 0x20) for(i = 0; i < 2 && i < len1; i++) key[i] = CRYPT_HAPPY(c1[i]); for(i = 0; i < 4 && i < len1; i++) key[2 + i] = CRYPT_HAPPY(c2[i]); for(i = 0; i < 2 && i < len1; i++) key[6 + i] = CRYPT_HAPPY(c3[i]); strncpy(hash_return, crypt(key, "jc"), hash_size); } #endif int dht_random_bytes(void *buf, size_t size) { int fd, rc, save; fd = open("/dev/urandom", O_RDONLY); if(fd < 0) return -1; rc = read(fd, buf, size); save = errno; close(fd); errno = save; return rc; } transmission-2.92/third-party/dht/PaxHeaders.4960/Makefile.in0000644000000000000000000000013212667111010020744 xustar0030 mtime=1457295880.442135268 30 atime=1457295880.441135251 30 ctime=1457295918.062774962 transmission-2.92/third-party/dht/Makefile.in0000644000175000017500000004756712667111010022414 0ustar00mikedldmikedld00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = third-party/dht ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx-pthread.m4 \ $(top_srcdir)/m4/glib-gettext.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libdht_a_AR = $(AR) $(ARFLAGS) libdht_a_LIBADD = am_libdht_a_OBJECTS = dht.$(OBJEXT) libdht_a_OBJECTS = $(am_libdht_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libdht_a_SOURCES) DIST_SOURCES = $(libdht_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTO_CFLAGS = @CRYPTO_CFLAGS@ CRYPTO_LIBS = @CRYPTO_LIBS@ CRYPTO_PKG = @CRYPTO_PKG@ CURL_MINIMUM = @CURL_MINIMUM@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYASSL_CFLAGS = @CYASSL_CFLAGS@ CYASSL_LIBS = @CYASSL_LIBS@ CYASSL_MINIMUM = @CYASSL_MINIMUM@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DHT_CFLAGS = @DHT_CFLAGS@ DHT_LIBS = @DHT_LIBS@ DHT_LIBS_QT = @DHT_LIBS_QT@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_MINIMUM = @GIO_MINIMUM@ GLIB_MINIMUM = @GLIB_MINIMUM@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MINIMUM = @GTK_MINIMUM@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAPPINDICATOR_CFLAGS = @LIBAPPINDICATOR_CFLAGS@ LIBAPPINDICATOR_LIBS = @LIBAPPINDICATOR_LIBS@ LIBAPPINDICATOR_MINIMUM = @LIBAPPINDICATOR_MINIMUM@ LIBB64_CFLAGS = @LIBB64_CFLAGS@ LIBB64_LIBS = @LIBB64_LIBS@ LIBB64_LIBS_QT = @LIBB64_LIBS_QT@ LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ LIBEVENT_CFLAGS = @LIBEVENT_CFLAGS@ LIBEVENT_LIBS = @LIBEVENT_LIBS@ LIBEVENT_MINIMUM = @LIBEVENT_MINIMUM@ LIBM = @LIBM@ LIBNATPMP_CFLAGS = @LIBNATPMP_CFLAGS@ LIBNATPMP_LIBS = @LIBNATPMP_LIBS@ LIBNATPMP_LIBS_QT = @LIBNATPMP_LIBS_QT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LIBUPNP_LIBS_QT = @LIBUPNP_LIBS_QT@ LIBUTP_CFLAGS = @LIBUTP_CFLAGS@ LIBUTP_LIBS = @LIBUTP_LIBS@ LIBUTP_LIBS_QT = @LIBUTP_LIBS_QT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENSSL_CFLAGS = @OPENSSL_CFLAGS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OPENSSL_MINIMUM = @OPENSSL_MINIMUM@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PEERID_PREFIX = @PEERID_PREFIX@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POLARSSL_MINIMUM = @POLARSSL_MINIMUM@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SYSTEMD_DAEMON_CFLAGS = @SYSTEMD_DAEMON_CFLAGS@ SYSTEMD_DAEMON_LIBS = @SYSTEMD_DAEMON_LIBS@ USERAGENT_PREFIX = @USERAGENT_PREFIX@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ WOLFSSL_CFLAGS = @WOLFSSL_CFLAGS@ WOLFSSL_LIBS = @WOLFSSL_LIBS@ XGETTEXT = @XGETTEXT@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ ZLIB_MINIMUM = @ZLIB_MINIMUM@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ transmissionlocaledir = @transmissionlocaledir@ AM_CFLAGS = @PTHREAD_CFLAGS@ noinst_LIBRARIES = libdht.a libdht_a_SOURCES = dht.c noinst_HEADERS = dht.h EXTRA_DIST = CHANGES dht-example.c LICENCE README all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu third-party/dht/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu third-party/dht/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libdht.a: $(libdht_a_OBJECTS) $(libdht_a_DEPENDENCIES) $(EXTRA_libdht_a_DEPENDENCIES) $(AM_V_at)-rm -f libdht.a $(AM_V_AR)$(libdht_a_AR) libdht.a $(libdht_a_OBJECTS) $(libdht_a_LIBADD) $(AM_V_at)$(RANLIB) libdht.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dht.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: transmission-2.92/third-party/dht/PaxHeaders.4960/dht.c0000644000000000000000000000013212442116701017625 xustar0030 mtime=1418239425.734298833 30 atime=1418239425.734298833 30 ctime=1457295918.082775302 transmission-2.92/third-party/dht/dht.c0000644000175000017500000024643512442116701021270 0ustar00mikedldmikedld00000000000000/* Copyright (c) 2009-2011 by Juliusz Chroboczek 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. */ /* Please, please, please. You are welcome to integrate this code in your favourite Bittorrent client. Please remember, however, that it is meant to be usable by others, including myself. This means no C++, no relicensing, and no gratuitious changes to the coding style. And please send back any improvements to the author. */ /* For memmem. */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #ifndef WIN32 #include #include #include #include #else #include #define WINVER WindowsXP #include #endif #include "dht.h" #ifndef HAVE_MEMMEM #ifdef __GLIBC__ #define HAVE_MEMMEM #endif #endif #ifndef MSG_CONFIRM #define MSG_CONFIRM 0 #endif #ifdef WIN32 #define EAFNOSUPPORT WSAEAFNOSUPPORT static int set_nonblocking(int fd, int nonblocking) { int rc; unsigned long mode = !!nonblocking; rc = ioctlsocket(fd, FIONBIO, &mode); if(rc != 0) errno = WSAGetLastError(); return (rc == 0 ? 0 : -1); } static int random(void) { return rand(); } extern const char *inet_ntop(int, const void *, char *, socklen_t); #else static int set_nonblocking(int fd, int nonblocking) { int rc; rc = fcntl(fd, F_GETFL, 0); if(rc < 0) return -1; rc = fcntl(fd, F_SETFL, nonblocking?(rc | O_NONBLOCK):(rc & ~O_NONBLOCK)); if(rc < 0) return -1; return 0; } #endif /* We set sin_family to 0 to mark unused slots. */ #if AF_INET == 0 || AF_INET6 == 0 #error You lose #endif #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* nothing */ #elif defined(__GNUC__) #define inline __inline #if (__GNUC__ >= 3) #define restrict __restrict #else #define restrict /**/ #endif #else #define inline /**/ #define restrict /**/ #endif #define MAX(x, y) ((x) >= (y) ? (x) : (y)) #define MIN(x, y) ((x) <= (y) ? (x) : (y)) struct node { unsigned char id[20]; struct sockaddr_storage ss; int sslen; time_t time; /* time of last message received */ time_t reply_time; /* time of last correct reply received */ time_t pinged_time; /* time of last request */ int pinged; /* how many requests we sent since last reply */ struct node *next; }; struct bucket { int af; unsigned char first[20]; int count; /* number of nodes */ int time; /* time of last reply in this bucket */ struct node *nodes; struct sockaddr_storage cached; /* the address of a likely candidate */ int cachedlen; struct bucket *next; }; struct search_node { unsigned char id[20]; struct sockaddr_storage ss; int sslen; time_t request_time; /* the time of the last unanswered request */ time_t reply_time; /* the time of the last reply */ int pinged; unsigned char token[40]; int token_len; int replied; /* whether we have received a reply */ int acked; /* whether they acked our announcement */ }; /* When performing a search, we search for up to SEARCH_NODES closest nodes to the destination, and use the additional ones to backtrack if any of the target 8 turn out to be dead. */ #define SEARCH_NODES 14 struct search { unsigned short tid; int af; time_t step_time; /* the time of the last search_step */ unsigned char id[20]; unsigned short port; /* 0 for pure searches */ int done; struct search_node nodes[SEARCH_NODES]; int numnodes; struct search *next; }; struct peer { time_t time; unsigned char ip[16]; unsigned short len; unsigned short port; }; /* The maximum number of peers we store for a given hash. */ #ifndef DHT_MAX_PEERS #define DHT_MAX_PEERS 2048 #endif /* The maximum number of hashes we're willing to track. */ #ifndef DHT_MAX_HASHES #define DHT_MAX_HASHES 16384 #endif /* The maximum number of searches we keep data about. */ #ifndef DHT_MAX_SEARCHES #define DHT_MAX_SEARCHES 1024 #endif /* The time after which we consider a search to be expirable. */ #ifndef DHT_SEARCH_EXPIRE_TIME #define DHT_SEARCH_EXPIRE_TIME (62 * 60) #endif struct storage { unsigned char id[20]; int numpeers, maxpeers; struct peer *peers; struct storage *next; }; static struct storage * find_storage(const unsigned char *id); static void flush_search_node(struct search_node *n, struct search *sr); static int send_ping(const struct sockaddr *sa, int salen, const unsigned char *tid, int tid_len); static int send_pong(const struct sockaddr *sa, int salen, const unsigned char *tid, int tid_len); static int send_find_node(const struct sockaddr *sa, int salen, const unsigned char *tid, int tid_len, const unsigned char *target, int want, int confirm); static int send_nodes_peers(const struct sockaddr *sa, int salen, const unsigned char *tid, int tid_len, const unsigned char *nodes, int nodes_len, const unsigned char *nodes6, int nodes6_len, int af, struct storage *st, const unsigned char *token, int token_len); static int send_closest_nodes(const struct sockaddr *sa, int salen, const unsigned char *tid, int tid_len, const unsigned char *id, int want, int af, struct storage *st, const unsigned char *token, int token_len); static int send_get_peers(const struct sockaddr *sa, int salen, unsigned char *tid, int tid_len, unsigned char *infohash, int want, int confirm); static int send_announce_peer(const struct sockaddr *sa, int salen, unsigned char *tid, int tid_len, unsigned char *infohas, unsigned short port, unsigned char *token, int token_len, int confirm); static int send_peer_announced(const struct sockaddr *sa, int salen, unsigned char *tid, int tid_len); static int send_error(const struct sockaddr *sa, int salen, unsigned char *tid, int tid_len, int code, const char *message); #define ERROR 0 #define REPLY 1 #define PING 2 #define FIND_NODE 3 #define GET_PEERS 4 #define ANNOUNCE_PEER 5 #define WANT4 1 #define WANT6 2 static int parse_message(const unsigned char *buf, int buflen, unsigned char *tid_return, int *tid_len, unsigned char *id_return, unsigned char *info_hash_return, unsigned char *target_return, unsigned short *port_return, unsigned char *token_return, int *token_len, unsigned char *nodes_return, int *nodes_len, unsigned char *nodes6_return, int *nodes6_len, unsigned char *values_return, int *values_len, unsigned char *values6_return, int *values6_len, int *want_return); static const unsigned char zeroes[20] = {0}; static const unsigned char ones[20] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; static const unsigned char v4prefix[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0, 0, 0, 0 }; static int dht_socket = -1; static int dht_socket6 = -1; static time_t search_time; static time_t confirm_nodes_time; static time_t rotate_secrets_time; static unsigned char myid[20]; static int have_v = 0; static unsigned char my_v[9]; static unsigned char secret[8]; static unsigned char oldsecret[8]; static struct bucket *buckets = NULL; static struct bucket *buckets6 = NULL; static struct storage *storage; static int numstorage; static struct search *searches = NULL; static int numsearches; static unsigned short search_id; /* The maximum number of nodes that we snub. There is probably little reason to increase this value. */ #ifndef DHT_MAX_BLACKLISTED #define DHT_MAX_BLACKLISTED 10 #endif static struct sockaddr_storage blacklist[DHT_MAX_BLACKLISTED]; int next_blacklisted; static struct timeval now; static time_t mybucket_grow_time, mybucket6_grow_time; static time_t expire_stuff_time; #define MAX_TOKEN_BUCKET_TOKENS 400 static time_t token_bucket_time; static int token_bucket_tokens; FILE *dht_debug = NULL; #ifdef __GNUC__ __attribute__ ((format (printf, 1, 2))) #endif static void debugf(const char *format, ...) { va_list args; va_start(args, format); if(dht_debug) vfprintf(dht_debug, format, args); va_end(args); if(dht_debug) fflush(dht_debug); } static void debug_printable(const unsigned char *buf, int buflen) { int i; if(dht_debug) { for(i = 0; i < buflen; i++) putc(buf[i] >= 32 && buf[i] <= 126 ? buf[i] : '.', dht_debug); } } static void print_hex(FILE *f, const unsigned char *buf, int buflen) { int i; for(i = 0; i < buflen; i++) fprintf(f, "%02x", buf[i]); } static int is_martian(const struct sockaddr *sa) { switch(sa->sa_family) { case AF_INET: { struct sockaddr_in *sin = (struct sockaddr_in*)sa; const unsigned char *address = (const unsigned char*)&sin->sin_addr; return sin->sin_port == 0 || (address[0] == 0) || (address[0] == 127) || ((address[0] & 0xE0) == 0xE0); } case AF_INET6: { struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)sa; const unsigned char *address = (const unsigned char*)&sin6->sin6_addr; return sin6->sin6_port == 0 || (address[0] == 0xFF) || (address[0] == 0xFE && (address[1] & 0xC0) == 0x80) || (memcmp(address, zeroes, 15) == 0 && (address[15] == 0 || address[15] == 1)) || (memcmp(address, v4prefix, 12) == 0); } default: return 0; } } /* Forget about the ``XOR-metric''. An id is just a path from the root of the tree, so bits are numbered from the start. */ static int id_cmp(const unsigned char *restrict id1, const unsigned char *restrict id2) { /* Memcmp is guaranteed to perform an unsigned comparison. */ return memcmp(id1, id2, 20); } /* Find the lowest 1 bit in an id. */ static int lowbit(const unsigned char *id) { int i, j; for(i = 19; i >= 0; i--) if(id[i] != 0) break; if(i < 0) return -1; for(j = 7; j >= 0; j--) if((id[i] & (0x80 >> j)) != 0) break; return 8 * i + j; } /* Find how many bits two ids have in common. */ static int common_bits(const unsigned char *id1, const unsigned char *id2) { int i, j; unsigned char xor; for(i = 0; i < 20; i++) { if(id1[i] != id2[i]) break; } if(i == 20) return 160; xor = id1[i] ^ id2[i]; j = 0; while((xor & 0x80) == 0) { xor <<= 1; j++; } return 8 * i + j; } /* Determine whether id1 or id2 is closer to ref */ static int xorcmp(const unsigned char *id1, const unsigned char *id2, const unsigned char *ref) { int i; for(i = 0; i < 20; i++) { unsigned char xor1, xor2; if(id1[i] == id2[i]) continue; xor1 = id1[i] ^ ref[i]; xor2 = id2[i] ^ ref[i]; if(xor1 < xor2) return -1; else return 1; } return 0; } /* We keep buckets in a sorted linked list. A bucket b ranges from b->first inclusive up to b->next->first exclusive. */ static int in_bucket(const unsigned char *id, struct bucket *b) { return id_cmp(b->first, id) <= 0 && (b->next == NULL || id_cmp(id, b->next->first) < 0); } static struct bucket * find_bucket(unsigned const char *id, int af) { struct bucket *b = af == AF_INET ? buckets : buckets6; if(b == NULL) return NULL; while(1) { if(b->next == NULL) return b; if(id_cmp(id, b->next->first) < 0) return b; b = b->next; } } static struct bucket * previous_bucket(struct bucket *b) { struct bucket *p = b->af == AF_INET ? buckets : buckets6; if(b == p) return NULL; while(1) { if(p->next == NULL) return NULL; if(p->next == b) return p; p = p->next; } } /* Every bucket contains an unordered list of nodes. */ static struct node * find_node(const unsigned char *id, int af) { struct bucket *b = find_bucket(id, af); struct node *n; if(b == NULL) return NULL; n = b->nodes; while(n) { if(id_cmp(n->id, id) == 0) return n; n = n->next; } return NULL; } /* Return a random node in a bucket. */ static struct node * random_node(struct bucket *b) { struct node *n; int nn; if(b->count == 0) return NULL; nn = random() % b->count; n = b->nodes; while(nn > 0 && n) { n = n->next; nn--; } return n; } /* Return the middle id of a bucket. */ static int bucket_middle(struct bucket *b, unsigned char *id_return) { int bit1 = lowbit(b->first); int bit2 = b->next ? lowbit(b->next->first) : -1; int bit = MAX(bit1, bit2) + 1; if(bit >= 160) return -1; memcpy(id_return, b->first, 20); id_return[bit / 8] |= (0x80 >> (bit % 8)); return 1; } /* Return a random id within a bucket. */ static int bucket_random(struct bucket *b, unsigned char *id_return) { int bit1 = lowbit(b->first); int bit2 = b->next ? lowbit(b->next->first) : -1; int bit = MAX(bit1, bit2) + 1; int i; if(bit >= 160) { memcpy(id_return, b->first, 20); return 1; } memcpy(id_return, b->first, bit / 8); id_return[bit / 8] = b->first[bit / 8] & (0xFF00 >> (bit % 8)); id_return[bit / 8] |= random() & 0xFF >> (bit % 8); for(i = bit / 8 + 1; i < 20; i++) id_return[i] = random() & 0xFF; return 1; } /* Insert a new node into a bucket. */ static struct node * insert_node(struct node *node) { struct bucket *b = find_bucket(node->id, node->ss.ss_family); if(b == NULL) return NULL; node->next = b->nodes; b->nodes = node; b->count++; return node; } /* This is our definition of a known-good node. */ static int node_good(struct node *node) { return node->pinged <= 2 && node->reply_time >= now.tv_sec - 7200 && node->time >= now.tv_sec - 900; } /* Our transaction-ids are 4-bytes long, with the first two bytes identi- fying the kind of request, and the remaining two a sequence number in host order. */ static void make_tid(unsigned char *tid_return, const char *prefix, unsigned short seqno) { tid_return[0] = prefix[0] & 0xFF; tid_return[1] = prefix[1] & 0xFF; memcpy(tid_return + 2, &seqno, 2); } static int tid_match(const unsigned char *tid, const char *prefix, unsigned short *seqno_return) { if(tid[0] == (prefix[0] & 0xFF) && tid[1] == (prefix[1] & 0xFF)) { if(seqno_return) memcpy(seqno_return, tid + 2, 2); return 1; } else return 0; } /* Every bucket caches the address of a likely node. Ping it. */ static int send_cached_ping(struct bucket *b) { unsigned char tid[4]; int rc; /* We set family to 0 when there's no cached node. */ if(b->cached.ss_family == 0) return 0; debugf("Sending ping to cached node.\n"); make_tid(tid, "pn", 0); rc = send_ping((struct sockaddr*)&b->cached, b->cachedlen, tid, 4); b->cached.ss_family = 0; b->cachedlen = 0; return rc; } /* Called whenever we send a request to a node, increases the ping count and, if that reaches 3, sends a ping to a new candidate. */ static void pinged(struct node *n, struct bucket *b) { n->pinged++; n->pinged_time = now.tv_sec; if(n->pinged >= 3) send_cached_ping(b ? b : find_bucket(n->id, n->ss.ss_family)); } /* The internal blacklist is an LRU cache of nodes that have sent incorrect messages. */ static void blacklist_node(const unsigned char *id, const struct sockaddr *sa, int salen) { int i; debugf("Blacklisting broken node.\n"); if(id) { struct node *n; struct search *sr; /* Make the node easy to discard. */ n = find_node(id, sa->sa_family); if(n) { n->pinged = 3; pinged(n, NULL); } /* Discard it from any searches in progress. */ sr = searches; while(sr) { for(i = 0; i < sr->numnodes; i++) if(id_cmp(sr->nodes[i].id, id) == 0) flush_search_node(&sr->nodes[i], sr); sr = sr->next; } } /* And make sure we don't hear from it again. */ memcpy(&blacklist[next_blacklisted], sa, salen); next_blacklisted = (next_blacklisted + 1) % DHT_MAX_BLACKLISTED; } static int node_blacklisted(const struct sockaddr *sa, int salen) { int i; if((unsigned)salen > sizeof(struct sockaddr_storage)) abort(); if(dht_blacklisted(sa, salen)) return 1; for(i = 0; i < DHT_MAX_BLACKLISTED; i++) { if(memcmp(&blacklist[i], sa, salen) == 0) return 1; } return 0; } /* Split a bucket into two equal parts. */ static struct bucket * split_bucket(struct bucket *b) { struct bucket *new; struct node *nodes; int rc; unsigned char new_id[20]; rc = bucket_middle(b, new_id); if(rc < 0) return NULL; new = calloc(1, sizeof(struct bucket)); if(new == NULL) return NULL; new->af = b->af; send_cached_ping(b); memcpy(new->first, new_id, 20); new->time = b->time; nodes = b->nodes; b->nodes = NULL; b->count = 0; new->next = b->next; b->next = new; while(nodes) { struct node *n; n = nodes; nodes = nodes->next; insert_node(n); } return b; } /* We just learnt about a node, not necessarily a new one. Confirm is 1 if the node sent a message, 2 if it sent us a reply. */ static struct node * new_node(const unsigned char *id, const struct sockaddr *sa, int salen, int confirm) { struct bucket *b = find_bucket(id, sa->sa_family); struct node *n; int mybucket, split; if(b == NULL) return NULL; if(id_cmp(id, myid) == 0) return NULL; if(is_martian(sa) || node_blacklisted(sa, salen)) return NULL; mybucket = in_bucket(myid, b); if(confirm == 2) b->time = now.tv_sec; n = b->nodes; while(n) { if(id_cmp(n->id, id) == 0) { if(confirm || n->time < now.tv_sec - 15 * 60) { /* Known node. Update stuff. */ memcpy((struct sockaddr*)&n->ss, sa, salen); if(confirm) n->time = now.tv_sec; if(confirm >= 2) { n->reply_time = now.tv_sec; n->pinged = 0; n->pinged_time = 0; } } return n; } n = n->next; } /* New node. */ if(mybucket) { if(sa->sa_family == AF_INET) mybucket_grow_time = now.tv_sec; else mybucket6_grow_time = now.tv_sec; } /* First, try to get rid of a known-bad node. */ n = b->nodes; while(n) { if(n->pinged >= 3 && n->pinged_time < now.tv_sec - 15) { memcpy(n->id, id, 20); memcpy((struct sockaddr*)&n->ss, sa, salen); n->time = confirm ? now.tv_sec : 0; n->reply_time = confirm >= 2 ? now.tv_sec : 0; n->pinged_time = 0; n->pinged = 0; return n; } n = n->next; } if(b->count >= 8) { /* Bucket full. Ping a dubious node */ int dubious = 0; n = b->nodes; while(n) { /* Pick the first dubious node that we haven't pinged in the last 15 seconds. This gives nodes the time to reply, but tends to concentrate on the same nodes, so that we get rid of bad nodes fast. */ if(!node_good(n)) { dubious = 1; if(n->pinged_time < now.tv_sec - 15) { unsigned char tid[4]; debugf("Sending ping to dubious node.\n"); make_tid(tid, "pn", 0); send_ping((struct sockaddr*)&n->ss, n->sslen, tid, 4); n->pinged++; n->pinged_time = now.tv_sec; break; } } n = n->next; } split = 0; if(mybucket) { if(!dubious) split = 1; /* If there's only one bucket, split eagerly. This is incorrect unless there's more than 8 nodes in the DHT. */ else if(b->af == AF_INET && buckets->next == NULL) split = 1; else if(b->af == AF_INET6 && buckets6->next == NULL) split = 1; } if(split) { debugf("Splitting.\n"); b = split_bucket(b); return new_node(id, sa, salen, confirm); } /* No space for this node. Cache it away for later. */ if(confirm || b->cached.ss_family == 0) { memcpy(&b->cached, sa, salen); b->cachedlen = salen; } return NULL; } /* Create a new node. */ n = calloc(1, sizeof(struct node)); if(n == NULL) return NULL; memcpy(n->id, id, 20); memcpy(&n->ss, sa, salen); n->sslen = salen; n->time = confirm ? now.tv_sec : 0; n->reply_time = confirm >= 2 ? now.tv_sec : 0; n->next = b->nodes; b->nodes = n; b->count++; return n; } /* Called periodically to purge known-bad nodes. Note that we're very conservative here: broken nodes in the table don't do much harm, we'll recover as soon as we find better ones. */ static int expire_buckets(struct bucket *b) { while(b) { struct node *n, *p; int changed = 0; while(b->nodes && b->nodes->pinged >= 4) { n = b->nodes; b->nodes = n->next; b->count--; changed = 1; free(n); } p = b->nodes; while(p) { while(p->next && p->next->pinged >= 4) { n = p->next; p->next = n->next; b->count--; changed = 1; free(n); } p = p->next; } if(changed) send_cached_ping(b); b = b->next; } expire_stuff_time = now.tv_sec + 120 + random() % 240; return 1; } /* While a search is in progress, we don't necessarily keep the nodes being walked in the main bucket table. A search in progress is identified by a unique transaction id, a short (and hence small enough to fit in the transaction id of the protocol packets). */ static struct search * find_search(unsigned short tid, int af) { struct search *sr = searches; while(sr) { if(sr->tid == tid && sr->af == af) return sr; sr = sr->next; } return NULL; } /* A search contains a list of nodes, sorted by decreasing distance to the target. We just got a new candidate, insert it at the right spot or discard it. */ static int insert_search_node(unsigned char *id, const struct sockaddr *sa, int salen, struct search *sr, int replied, unsigned char *token, int token_len) { struct search_node *n; int i, j; if(sa->sa_family != sr->af) { debugf("Attempted to insert node in the wrong family.\n"); return 0; } for(i = 0; i < sr->numnodes; i++) { if(id_cmp(id, sr->nodes[i].id) == 0) { n = &sr->nodes[i]; goto found; } if(xorcmp(id, sr->nodes[i].id, sr->id) < 0) break; } if(i == SEARCH_NODES) return 0; if(sr->numnodes < SEARCH_NODES) sr->numnodes++; for(j = sr->numnodes - 1; j > i; j--) { sr->nodes[j] = sr->nodes[j - 1]; } n = &sr->nodes[i]; memset(n, 0, sizeof(struct search_node)); memcpy(n->id, id, 20); found: memcpy(&n->ss, sa, salen); n->sslen = salen; if(replied) { n->replied = 1; n->reply_time = now.tv_sec; n->request_time = 0; n->pinged = 0; } if(token) { if(token_len >= 40) { debugf("Eek! Overlong token.\n"); } else { memcpy(n->token, token, token_len); n->token_len = token_len; } } return 1; } static void flush_search_node(struct search_node *n, struct search *sr) { int i = n - sr->nodes, j; for(j = i; j < sr->numnodes - 1; j++) sr->nodes[j] = sr->nodes[j + 1]; sr->numnodes--; } static void expire_searches(void) { struct search *sr = searches, *previous = NULL; while(sr) { struct search *next = sr->next; if(sr->step_time < now.tv_sec - DHT_SEARCH_EXPIRE_TIME) { if(previous) previous->next = next; else searches = next; free(sr); numsearches--; } else { previous = sr; } sr = next; } } /* This must always return 0 or 1, never -1, not even on failure (see below). */ static int search_send_get_peers(struct search *sr, struct search_node *n) { struct node *node; unsigned char tid[4]; if(n == NULL) { int i; for(i = 0; i < sr->numnodes; i++) { if(sr->nodes[i].pinged < 3 && !sr->nodes[i].replied && sr->nodes[i].request_time < now.tv_sec - 15) n = &sr->nodes[i]; } } if(!n || n->pinged >= 3 || n->replied || n->request_time >= now.tv_sec - 15) return 0; debugf("Sending get_peers.\n"); make_tid(tid, "gp", sr->tid); send_get_peers((struct sockaddr*)&n->ss, n->sslen, tid, 4, sr->id, -1, n->reply_time >= now.tv_sec - 15); n->pinged++; n->request_time = now.tv_sec; /* If the node happens to be in our main routing table, mark it as pinged. */ node = find_node(n->id, n->ss.ss_family); if(node) pinged(node, NULL); return 1; } /* When a search is in progress, we periodically call search_step to send further requests. */ static void search_step(struct search *sr, dht_callback *callback, void *closure) { int i, j; int all_done = 1; /* Check if the first 8 live nodes have replied. */ j = 0; for(i = 0; i < sr->numnodes && j < 8; i++) { struct search_node *n = &sr->nodes[i]; if(n->pinged >= 3) continue; if(!n->replied) { all_done = 0; break; } j++; } if(all_done) { if(sr->port == 0) { goto done; } else { int all_acked = 1; j = 0; for(i = 0; i < sr->numnodes && j < 8; i++) { struct search_node *n = &sr->nodes[i]; struct node *node; unsigned char tid[4]; if(n->pinged >= 3) continue; /* A proposed extension to the protocol consists in omitting the token when storage tables are full. While I don't think this makes a lot of sense -- just sending a positive reply is just as good --, let's deal with it. */ if(n->token_len == 0) n->acked = 1; if(!n->acked) { all_acked = 0; debugf("Sending announce_peer.\n"); make_tid(tid, "ap", sr->tid); send_announce_peer((struct sockaddr*)&n->ss, sizeof(struct sockaddr_storage), tid, 4, sr->id, sr->port, n->token, n->token_len, n->reply_time >= now.tv_sec - 15); n->pinged++; n->request_time = now.tv_sec; node = find_node(n->id, n->ss.ss_family); if(node) pinged(node, NULL); } j++; } if(all_acked) goto done; } sr->step_time = now.tv_sec; return; } if(sr->step_time + 15 >= now.tv_sec) return; j = 0; for(i = 0; i < sr->numnodes; i++) { j += search_send_get_peers(sr, &sr->nodes[i]); if(j >= 3) break; } sr->step_time = now.tv_sec; return; done: sr->done = 1; if(callback) (*callback)(closure, sr->af == AF_INET ? DHT_EVENT_SEARCH_DONE : DHT_EVENT_SEARCH_DONE6, sr->id, NULL, 0); sr->step_time = now.tv_sec; } static struct search * new_search(void) { struct search *sr, *oldest = NULL; /* Find the oldest done search */ sr = searches; while(sr) { if(sr->done && (oldest == NULL || oldest->step_time > sr->step_time)) oldest = sr; sr = sr->next; } /* The oldest slot is expired. */ if(oldest && oldest->step_time < now.tv_sec - DHT_SEARCH_EXPIRE_TIME) return oldest; /* Allocate a new slot. */ if(numsearches < DHT_MAX_SEARCHES) { sr = calloc(1, sizeof(struct search)); if(sr != NULL) { sr->next = searches; searches = sr; numsearches++; return sr; } } /* Oh, well, never mind. Reuse the oldest slot. */ return oldest; } /* Insert the contents of a bucket into a search structure. */ static void insert_search_bucket(struct bucket *b, struct search *sr) { struct node *n; n = b->nodes; while(n) { insert_search_node(n->id, (struct sockaddr*)&n->ss, n->sslen, sr, 0, NULL, 0); n = n->next; } } /* Start a search. If port is non-zero, perform an announce when the search is complete. */ int dht_search(const unsigned char *id, int port, int af, dht_callback *callback, void *closure) { struct search *sr; struct storage *st; struct bucket *b = find_bucket(id, af); if(b == NULL) { errno = EAFNOSUPPORT; return -1; } /* Try to answer this search locally. In a fully grown DHT this is very unlikely, but people are running modified versions of this code in private DHTs with very few nodes. What's wrong with flooding? */ if(callback) { st = find_storage(id); if(st) { unsigned short swapped; unsigned char buf[18]; int i; debugf("Found local data (%d peers).\n", st->numpeers); for(i = 0; i < st->numpeers; i++) { swapped = htons(st->peers[i].port); if(st->peers[i].len == 4) { memcpy(buf, st->peers[i].ip, 4); memcpy(buf + 4, &swapped, 2); (*callback)(closure, DHT_EVENT_VALUES, id, (void*)buf, 6); } else if(st->peers[i].len == 16) { memcpy(buf, st->peers[i].ip, 16); memcpy(buf + 16, &swapped, 2); (*callback)(closure, DHT_EVENT_VALUES6, id, (void*)buf, 18); } } } } sr = searches; while(sr) { if(sr->af == af && id_cmp(sr->id, id) == 0) break; sr = sr->next; } if(sr) { /* We're reusing data from an old search. Reusing the same tid means that we can merge replies for both searches. */ int i; sr->done = 0; again: for(i = 0; i < sr->numnodes; i++) { struct search_node *n; n = &sr->nodes[i]; /* Discard any doubtful nodes. */ if(n->pinged >= 3 || n->reply_time < now.tv_sec - 7200) { flush_search_node(n, sr); goto again; } n->pinged = 0; n->token_len = 0; n->replied = 0; n->acked = 0; } } else { sr = new_search(); if(sr == NULL) { errno = ENOSPC; return -1; } sr->af = af; sr->tid = search_id++; sr->step_time = 0; memcpy(sr->id, id, 20); sr->done = 0; sr->numnodes = 0; } sr->port = port; insert_search_bucket(b, sr); if(sr->numnodes < SEARCH_NODES) { struct bucket *p = previous_bucket(b); if(b->next) insert_search_bucket(b->next, sr); if(p) insert_search_bucket(p, sr); } if(sr->numnodes < SEARCH_NODES) insert_search_bucket(find_bucket(myid, af), sr); search_step(sr, callback, closure); search_time = now.tv_sec; return 1; } /* A struct storage stores all the stored peer addresses for a given info hash. */ static struct storage * find_storage(const unsigned char *id) { struct storage *st = storage; while(st) { if(id_cmp(id, st->id) == 0) break; st = st->next; } return st; } static int storage_store(const unsigned char *id, const struct sockaddr *sa, unsigned short port) { int i, len; struct storage *st; unsigned char *ip; if(sa->sa_family == AF_INET) { struct sockaddr_in *sin = (struct sockaddr_in*)sa; ip = (unsigned char*)&sin->sin_addr; len = 4; } else if(sa->sa_family == AF_INET6) { struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)sa; ip = (unsigned char*)&sin6->sin6_addr; len = 16; } else { return -1; } st = find_storage(id); if(st == NULL) { if(numstorage >= DHT_MAX_HASHES) return -1; st = calloc(1, sizeof(struct storage)); if(st == NULL) return -1; memcpy(st->id, id, 20); st->next = storage; storage = st; numstorage++; } for(i = 0; i < st->numpeers; i++) { if(st->peers[i].port == port && st->peers[i].len == len && memcmp(st->peers[i].ip, ip, len) == 0) break; } if(i < st->numpeers) { /* Already there, only need to refresh */ st->peers[i].time = now.tv_sec; return 0; } else { struct peer *p; if(i >= st->maxpeers) { /* Need to expand the array. */ struct peer *new_peers; int n; if(st->maxpeers >= DHT_MAX_PEERS) return 0; n = st->maxpeers == 0 ? 2 : 2 * st->maxpeers; n = MIN(n, DHT_MAX_PEERS); new_peers = realloc(st->peers, n * sizeof(struct peer)); if(new_peers == NULL) return -1; st->peers = new_peers; st->maxpeers = n; } p = &st->peers[st->numpeers++]; p->time = now.tv_sec; p->len = len; memcpy(p->ip, ip, len); p->port = port; return 1; } } static int expire_storage(void) { struct storage *st = storage, *previous = NULL; while(st) { int i = 0; while(i < st->numpeers) { if(st->peers[i].time < now.tv_sec - 32 * 60) { if(i != st->numpeers - 1) st->peers[i] = st->peers[st->numpeers - 1]; st->numpeers--; } else { i++; } } if(st->numpeers == 0) { free(st->peers); if(previous) previous->next = st->next; else storage = st->next; free(st); if(previous) st = previous->next; else st = storage; numstorage--; if(numstorage < 0) { debugf("Eek... numstorage became negative.\n"); numstorage = 0; } } else { previous = st; st = st->next; } } return 1; } static int rotate_secrets(void) { int rc; rotate_secrets_time = now.tv_sec + 900 + random() % 1800; memcpy(oldsecret, secret, sizeof(secret)); rc = dht_random_bytes(secret, sizeof(secret)); if(rc < 0) return -1; return 1; } #ifndef TOKEN_SIZE #define TOKEN_SIZE 8 #endif static void make_token(const struct sockaddr *sa, int old, unsigned char *token_return) { void *ip; int iplen; unsigned short port; if(sa->sa_family == AF_INET) { struct sockaddr_in *sin = (struct sockaddr_in*)sa; ip = &sin->sin_addr; iplen = 4; port = htons(sin->sin_port); } else if(sa->sa_family == AF_INET6) { struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)sa; ip = &sin6->sin6_addr; iplen = 16; port = htons(sin6->sin6_port); } else { abort(); } dht_hash(token_return, TOKEN_SIZE, old ? oldsecret : secret, sizeof(secret), ip, iplen, (unsigned char*)&port, 2); } static int token_match(const unsigned char *token, int token_len, const struct sockaddr *sa) { unsigned char t[TOKEN_SIZE]; if(token_len != TOKEN_SIZE) return 0; make_token(sa, 0, t); if(memcmp(t, token, TOKEN_SIZE) == 0) return 1; make_token(sa, 1, t); if(memcmp(t, token, TOKEN_SIZE) == 0) return 1; return 0; } int dht_nodes(int af, int *good_return, int *dubious_return, int *cached_return, int *incoming_return) { int good = 0, dubious = 0, cached = 0, incoming = 0; struct bucket *b = af == AF_INET ? buckets : buckets6; while(b) { struct node *n = b->nodes; while(n) { if(node_good(n)) { good++; if(n->time > n->reply_time) incoming++; } else { dubious++; } n = n->next; } if(b->cached.ss_family > 0) cached++; b = b->next; } if(good_return) *good_return = good; if(dubious_return) *dubious_return = dubious; if(cached_return) *cached_return = cached; if(incoming_return) *incoming_return = incoming; return good + dubious; } static void dump_bucket(FILE *f, struct bucket *b) { struct node *n = b->nodes; fprintf(f, "Bucket "); print_hex(f, b->first, 20); fprintf(f, " count %d age %d%s%s:\n", b->count, (int)(now.tv_sec - b->time), in_bucket(myid, b) ? " (mine)" : "", b->cached.ss_family ? " (cached)" : ""); while(n) { char buf[512]; unsigned short port; fprintf(f, " Node "); print_hex(f, n->id, 20); if(n->ss.ss_family == AF_INET) { struct sockaddr_in *sin = (struct sockaddr_in*)&n->ss; inet_ntop(AF_INET, &sin->sin_addr, buf, 512); port = ntohs(sin->sin_port); } else if(n->ss.ss_family == AF_INET6) { struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)&n->ss; inet_ntop(AF_INET6, &sin6->sin6_addr, buf, 512); port = ntohs(sin6->sin6_port); } else { snprintf(buf, 512, "unknown(%d)", n->ss.ss_family); port = 0; } if(n->ss.ss_family == AF_INET6) fprintf(f, " [%s]:%d ", buf, port); else fprintf(f, " %s:%d ", buf, port); if(n->time != n->reply_time) fprintf(f, "age %ld, %ld", (long)(now.tv_sec - n->time), (long)(now.tv_sec - n->reply_time)); else fprintf(f, "age %ld", (long)(now.tv_sec - n->time)); if(n->pinged) fprintf(f, " (%d)", n->pinged); if(node_good(n)) fprintf(f, " (good)"); fprintf(f, "\n"); n = n->next; } } void dht_dump_tables(FILE *f) { int i; struct bucket *b; struct storage *st = storage; struct search *sr = searches; fprintf(f, "My id "); print_hex(f, myid, 20); fprintf(f, "\n"); b = buckets; while(b) { dump_bucket(f, b); b = b->next; } fprintf(f, "\n"); b = buckets6; while(b) { dump_bucket(f, b); b = b->next; } while(sr) { fprintf(f, "\nSearch%s id ", sr->af == AF_INET6 ? " (IPv6)" : ""); print_hex(f, sr->id, 20); fprintf(f, " age %d%s\n", (int)(now.tv_sec - sr->step_time), sr->done ? " (done)" : ""); for(i = 0; i < sr->numnodes; i++) { struct search_node *n = &sr->nodes[i]; fprintf(f, "Node %d id ", i); print_hex(f, n->id, 20); fprintf(f, " bits %d age ", common_bits(sr->id, n->id)); if(n->request_time) fprintf(f, "%d, ", (int)(now.tv_sec - n->request_time)); fprintf(f, "%d", (int)(now.tv_sec - n->reply_time)); if(n->pinged) fprintf(f, " (%d)", n->pinged); fprintf(f, "%s%s.\n", find_node(n->id, AF_INET) ? " (known)" : "", n->replied ? " (replied)" : ""); } sr = sr->next; } while(st) { fprintf(f, "\nStorage "); print_hex(f, st->id, 20); fprintf(f, " %d/%d nodes:", st->numpeers, st->maxpeers); for(i = 0; i < st->numpeers; i++) { char buf[100]; if(st->peers[i].len == 4) { inet_ntop(AF_INET, st->peers[i].ip, buf, 100); } else if(st->peers[i].len == 16) { buf[0] = '['; inet_ntop(AF_INET6, st->peers[i].ip, buf + 1, 98); strcat(buf, "]"); } else { strcpy(buf, "???"); } fprintf(f, " %s:%u (%ld)", buf, st->peers[i].port, (long)(now.tv_sec - st->peers[i].time)); } st = st->next; } fprintf(f, "\n\n"); fflush(f); } int dht_init(int s, int s6, const unsigned char *id, const unsigned char *v) { int rc; if(dht_socket >= 0 || dht_socket6 >= 0 || buckets || buckets6) { errno = EBUSY; return -1; } searches = NULL; numsearches = 0; storage = NULL; numstorage = 0; if(s >= 0) { buckets = calloc(sizeof(struct bucket), 1); if(buckets == NULL) return -1; buckets->af = AF_INET; rc = set_nonblocking(s, 1); if(rc < 0) goto fail; } if(s6 >= 0) { buckets6 = calloc(sizeof(struct bucket), 1); if(buckets6 == NULL) return -1; buckets6->af = AF_INET6; rc = set_nonblocking(s6, 1); if(rc < 0) goto fail; } memcpy(myid, id, 20); if(v) { memcpy(my_v, "1:v4:", 5); memcpy(my_v + 5, v, 4); have_v = 1; } else { have_v = 0; } gettimeofday(&now, NULL); mybucket_grow_time = now.tv_sec; mybucket6_grow_time = now.tv_sec; confirm_nodes_time = now.tv_sec + random() % 3; search_id = random() & 0xFFFF; search_time = 0; next_blacklisted = 0; token_bucket_time = now.tv_sec; token_bucket_tokens = MAX_TOKEN_BUCKET_TOKENS; memset(secret, 0, sizeof(secret)); rc = rotate_secrets(); if(rc < 0) goto fail; dht_socket = s; dht_socket6 = s6; expire_buckets(buckets); expire_buckets(buckets6); return 1; fail: free(buckets); buckets = NULL; return -1; } int dht_uninit() { if(dht_socket < 0 && dht_socket6 < 0) { errno = EINVAL; return -1; } dht_socket = -1; dht_socket6 = -1; while(buckets) { struct bucket *b = buckets; buckets = b->next; while(b->nodes) { struct node *n = b->nodes; b->nodes = n->next; free(n); } free(b); } while(buckets6) { struct bucket *b = buckets6; buckets6 = b->next; while(b->nodes) { struct node *n = b->nodes; b->nodes = n->next; free(n); } free(b); } while(storage) { struct storage *st = storage; storage = storage->next; free(st->peers); free(st); } while(searches) { struct search *sr = searches; searches = searches->next; free(sr); } return 1; } /* Rate control for requests we receive. */ static int token_bucket(void) { if(token_bucket_tokens == 0) { token_bucket_tokens = MIN(MAX_TOKEN_BUCKET_TOKENS, 100 * (now.tv_sec - token_bucket_time)); token_bucket_time = now.tv_sec; } if(token_bucket_tokens == 0) return 0; token_bucket_tokens--; return 1; } static int neighbourhood_maintenance(int af) { unsigned char id[20]; struct bucket *b = find_bucket(myid, af); struct bucket *q; struct node *n; if(b == NULL) return 0; memcpy(id, myid, 20); id[19] = random() & 0xFF; q = b; if(q->next && (q->count == 0 || (random() & 7) == 0)) q = b->next; if(q->count == 0 || (random() & 7) == 0) { struct bucket *r; r = previous_bucket(b); if(r && r->count > 0) q = r; } if(q) { /* Since our node-id is the same in both DHTs, it's probably profitable to query both families. */ int want = dht_socket >= 0 && dht_socket6 >= 0 ? (WANT4 | WANT6) : -1; n = random_node(q); if(n) { unsigned char tid[4]; debugf("Sending find_node for%s neighborhood maintenance.\n", af == AF_INET6 ? " IPv6" : ""); make_tid(tid, "fn", 0); send_find_node((struct sockaddr*)&n->ss, n->sslen, tid, 4, id, want, n->reply_time >= now.tv_sec - 15); pinged(n, q); } return 1; } return 0; } static int bucket_maintenance(int af) { struct bucket *b; b = af == AF_INET ? buckets : buckets6; while(b) { struct bucket *q; if(b->time < now.tv_sec - 600) { /* This bucket hasn't seen any positive confirmation for a long time. Pick a random id in this bucket's range, and send a request to a random node. */ unsigned char id[20]; struct node *n; int rc; rc = bucket_random(b, id); if(rc < 0) memcpy(id, b->first, 20); q = b; /* If the bucket is empty, we try to fill it from a neighbour. We also sometimes do it gratuitiously to recover from buckets full of broken nodes. */ if(q->next && (q->count == 0 || (random() & 7) == 0)) q = b->next; if(q->count == 0 || (random() & 7) == 0) { struct bucket *r; r = previous_bucket(b); if(r && r->count > 0) q = r; } if(q) { n = random_node(q); if(n) { unsigned char tid[4]; int want = -1; if(dht_socket >= 0 && dht_socket6 >= 0) { struct bucket *otherbucket; otherbucket = find_bucket(id, af == AF_INET ? AF_INET6 : AF_INET); if(otherbucket && otherbucket->count < 8) /* The corresponding bucket in the other family is emptyish -- querying both is useful. */ want = WANT4 | WANT6; else if(random() % 37 == 0) /* Most of the time, this just adds overhead. However, it might help stitch back one of the DHTs after a network collapse, so query both, but only very occasionally. */ want = WANT4 | WANT6; } debugf("Sending find_node for%s bucket maintenance.\n", af == AF_INET6 ? " IPv6" : ""); make_tid(tid, "fn", 0); send_find_node((struct sockaddr*)&n->ss, n->sslen, tid, 4, id, want, n->reply_time >= now.tv_sec - 15); pinged(n, q); /* In order to avoid sending queries back-to-back, give up for now and reschedule us soon. */ return 1; } } } b = b->next; } return 0; } int dht_periodic(const void *buf, size_t buflen, const struct sockaddr *from, int fromlen, time_t *tosleep, dht_callback *callback, void *closure) { gettimeofday(&now, NULL); if(buflen > 0) { int message; unsigned char tid[16], id[20], info_hash[20], target[20]; unsigned char nodes[256], nodes6[1024], token[128]; int tid_len = 16, token_len = 128; int nodes_len = 256, nodes6_len = 1024; unsigned short port; unsigned char values[2048], values6[2048]; int values_len = 2048, values6_len = 2048; int want; unsigned short ttid; if(is_martian(from)) goto dontread; if(node_blacklisted(from, fromlen)) { debugf("Received packet from blacklisted node.\n"); goto dontread; } if(((char*)buf)[buflen] != '\0') { debugf("Unterminated message.\n"); errno = EINVAL; return -1; } message = parse_message(buf, buflen, tid, &tid_len, id, info_hash, target, &port, token, &token_len, nodes, &nodes_len, nodes6, &nodes6_len, values, &values_len, values6, &values6_len, &want); if(message < 0 || message == ERROR || id_cmp(id, zeroes) == 0) { debugf("Unparseable message: "); debug_printable(buf, buflen); debugf("\n"); goto dontread; } if(id_cmp(id, myid) == 0) { debugf("Received message from self.\n"); goto dontread; } if(message > REPLY) { /* Rate limit requests. */ if(!token_bucket()) { debugf("Dropping request due to rate limiting.\n"); goto dontread; } } switch(message) { case REPLY: if(tid_len != 4) { debugf("Broken node truncates transaction ids: "); debug_printable(buf, buflen); debugf("\n"); /* This is really annoying, as it means that we will time-out all our searches that go through this node. Kill it. */ blacklist_node(id, from, fromlen); goto dontread; } if(tid_match(tid, "pn", NULL)) { debugf("Pong!\n"); new_node(id, from, fromlen, 2); } else if(tid_match(tid, "fn", NULL) || tid_match(tid, "gp", NULL)) { int gp = 0; struct search *sr = NULL; if(tid_match(tid, "gp", &ttid)) { gp = 1; sr = find_search(ttid, from->sa_family); } debugf("Nodes found (%d+%d)%s!\n", nodes_len/26, nodes6_len/38, gp ? " for get_peers" : ""); if(nodes_len % 26 != 0 || nodes6_len % 38 != 0) { debugf("Unexpected length for node info!\n"); blacklist_node(id, from, fromlen); } else if(gp && sr == NULL) { debugf("Unknown search!\n"); new_node(id, from, fromlen, 1); } else { int i; new_node(id, from, fromlen, 2); for(i = 0; i < nodes_len / 26; i++) { unsigned char *ni = nodes + i * 26; struct sockaddr_in sin; if(id_cmp(ni, myid) == 0) continue; memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; memcpy(&sin.sin_addr, ni + 20, 4); memcpy(&sin.sin_port, ni + 24, 2); new_node(ni, (struct sockaddr*)&sin, sizeof(sin), 0); if(sr && sr->af == AF_INET) { insert_search_node(ni, (struct sockaddr*)&sin, sizeof(sin), sr, 0, NULL, 0); } } for(i = 0; i < nodes6_len / 38; i++) { unsigned char *ni = nodes6 + i * 38; struct sockaddr_in6 sin6; if(id_cmp(ni, myid) == 0) continue; memset(&sin6, 0, sizeof(sin6)); sin6.sin6_family = AF_INET6; memcpy(&sin6.sin6_addr, ni + 20, 16); memcpy(&sin6.sin6_port, ni + 36, 2); new_node(ni, (struct sockaddr*)&sin6, sizeof(sin6), 0); if(sr && sr->af == AF_INET6) { insert_search_node(ni, (struct sockaddr*)&sin6, sizeof(sin6), sr, 0, NULL, 0); } } if(sr) /* Since we received a reply, the number of requests in flight has decreased. Let's push another request. */ search_send_get_peers(sr, NULL); } if(sr) { insert_search_node(id, from, fromlen, sr, 1, token, token_len); if(values_len > 0 || values6_len > 0) { debugf("Got values (%d+%d)!\n", values_len / 6, values6_len / 18); if(callback) { if(values_len > 0) (*callback)(closure, DHT_EVENT_VALUES, sr->id, (void*)values, values_len); if(values6_len > 0) (*callback)(closure, DHT_EVENT_VALUES6, sr->id, (void*)values6, values6_len); } } } } else if(tid_match(tid, "ap", &ttid)) { struct search *sr; debugf("Got reply to announce_peer.\n"); sr = find_search(ttid, from->sa_family); if(!sr) { debugf("Unknown search!\n"); new_node(id, from, fromlen, 1); } else { int i; new_node(id, from, fromlen, 2); for(i = 0; i < sr->numnodes; i++) if(id_cmp(sr->nodes[i].id, id) == 0) { sr->nodes[i].request_time = 0; sr->nodes[i].reply_time = now.tv_sec; sr->nodes[i].acked = 1; sr->nodes[i].pinged = 0; break; } /* See comment for gp above. */ search_send_get_peers(sr, NULL); } } else { debugf("Unexpected reply: "); debug_printable(buf, buflen); debugf("\n"); } break; case PING: debugf("Ping (%d)!\n", tid_len); new_node(id, from, fromlen, 1); debugf("Sending pong.\n"); send_pong(from, fromlen, tid, tid_len); break; case FIND_NODE: debugf("Find node!\n"); new_node(id, from, fromlen, 1); debugf("Sending closest nodes (%d).\n", want); send_closest_nodes(from, fromlen, tid, tid_len, target, want, 0, NULL, NULL, 0); break; case GET_PEERS: debugf("Get_peers!\n"); new_node(id, from, fromlen, 1); if(id_cmp(info_hash, zeroes) == 0) { debugf("Eek! Got get_peers with no info_hash.\n"); send_error(from, fromlen, tid, tid_len, 203, "Get_peers with no info_hash"); break; } else { struct storage *st = find_storage(info_hash); unsigned char token[TOKEN_SIZE]; make_token(from, 0, token); if(st && st->numpeers > 0) { debugf("Sending found%s peers.\n", from->sa_family == AF_INET6 ? " IPv6" : ""); send_closest_nodes(from, fromlen, tid, tid_len, info_hash, want, from->sa_family, st, token, TOKEN_SIZE); } else { debugf("Sending nodes for get_peers.\n"); send_closest_nodes(from, fromlen, tid, tid_len, info_hash, want, 0, NULL, token, TOKEN_SIZE); } } break; case ANNOUNCE_PEER: debugf("Announce peer!\n"); new_node(id, from, fromlen, 1); if(id_cmp(info_hash, zeroes) == 0) { debugf("Announce_peer with no info_hash.\n"); send_error(from, fromlen, tid, tid_len, 203, "Announce_peer with no info_hash"); break; } if(!token_match(token, token_len, from)) { debugf("Incorrect token for announce_peer.\n"); send_error(from, fromlen, tid, tid_len, 203, "Announce_peer with wrong token"); break; } if(port == 0) { debugf("Announce_peer with forbidden port %d.\n", port); send_error(from, fromlen, tid, tid_len, 203, "Announce_peer with forbidden port number"); break; } storage_store(info_hash, from, port); /* Note that if storage_store failed, we lie to the requestor. This is to prevent them from backtracking, and hence polluting the DHT. */ debugf("Sending peer announced.\n"); send_peer_announced(from, fromlen, tid, tid_len); } } dontread: if(now.tv_sec >= rotate_secrets_time) rotate_secrets(); if(now.tv_sec >= expire_stuff_time) { expire_buckets(buckets); expire_buckets(buckets6); expire_storage(); expire_searches(); } if(search_time > 0 && now.tv_sec >= search_time) { struct search *sr; sr = searches; while(sr) { if(!sr->done && sr->step_time + 5 <= now.tv_sec) { search_step(sr, callback, closure); } sr = sr->next; } search_time = 0; sr = searches; while(sr) { if(!sr->done) { time_t tm = sr->step_time + 15 + random() % 10; if(search_time == 0 || search_time > tm) search_time = tm; } sr = sr->next; } } if(now.tv_sec >= confirm_nodes_time) { int soon = 0; soon |= bucket_maintenance(AF_INET); soon |= bucket_maintenance(AF_INET6); if(!soon) { if(mybucket_grow_time >= now.tv_sec - 150) soon |= neighbourhood_maintenance(AF_INET); if(mybucket6_grow_time >= now.tv_sec - 150) soon |= neighbourhood_maintenance(AF_INET6); } /* In order to maintain all buckets' age within 600 seconds, worst case is roughly 27 seconds, assuming the table is 22 bits deep. We want to keep a margin for neighborhood maintenance, so keep this within 25 seconds. */ if(soon) confirm_nodes_time = now.tv_sec + 5 + random() % 20; else confirm_nodes_time = now.tv_sec + 60 + random() % 120; } if(confirm_nodes_time > now.tv_sec) *tosleep = confirm_nodes_time - now.tv_sec; else *tosleep = 0; if(search_time > 0) { if(search_time <= now.tv_sec) *tosleep = 0; else if(*tosleep > search_time - now.tv_sec) *tosleep = search_time - now.tv_sec; } return 1; } int dht_get_nodes(struct sockaddr_in *sin, int *num, struct sockaddr_in6 *sin6, int *num6) { int i, j; struct bucket *b; struct node *n; i = 0; /* For restoring to work without discarding too many nodes, the list must start with the contents of our bucket. */ b = find_bucket(myid, AF_INET); if(b == NULL) goto no_ipv4; n = b->nodes; while(n && i < *num) { if(node_good(n)) { sin[i] = *(struct sockaddr_in*)&n->ss; i++; } n = n->next; } b = buckets; while(b && i < *num) { if(!in_bucket(myid, b)) { n = b->nodes; while(n && i < *num) { if(node_good(n)) { sin[i] = *(struct sockaddr_in*)&n->ss; i++; } n = n->next; } } b = b->next; } no_ipv4: j = 0; b = find_bucket(myid, AF_INET6); if(b == NULL) goto no_ipv6; n = b->nodes; while(n && j < *num6) { if(node_good(n)) { sin6[j] = *(struct sockaddr_in6*)&n->ss; j++; } n = n->next; } b = buckets6; while(b && j < *num6) { if(!in_bucket(myid, b)) { n = b->nodes; while(n && j < *num6) { if(node_good(n)) { sin6[j] = *(struct sockaddr_in6*)&n->ss; j++; } n = n->next; } } b = b->next; } no_ipv6: *num = i; *num6 = j; return i + j; } int dht_insert_node(const unsigned char *id, struct sockaddr *sa, int salen) { struct node *n; if(sa->sa_family != AF_INET) { errno = EAFNOSUPPORT; return -1; } n = new_node(id, (struct sockaddr*)sa, salen, 0); return !!n; } int dht_ping_node(struct sockaddr *sa, int salen) { unsigned char tid[4]; debugf("Sending ping.\n"); make_tid(tid, "pn", 0); return send_ping(sa, salen, tid, 4); } /* We could use a proper bencoding printer and parser, but the format of DHT messages is fairly stylised, so this seemed simpler. */ #define CHECK(offset, delta, size) \ if(delta < 0 || offset + delta > size) goto fail #define INC(offset, delta, size) \ CHECK(offset, delta, size); \ offset += delta #define COPY(buf, offset, src, delta, size) \ CHECK(offset, delta, size); \ memcpy(buf + offset, src, delta); \ offset += delta; #define ADD_V(buf, offset, size) \ if(have_v) { \ COPY(buf, offset, my_v, sizeof(my_v), size); \ } static int dht_send(const void *buf, size_t len, int flags, const struct sockaddr *sa, int salen) { int s; if(salen == 0) abort(); if(node_blacklisted(sa, salen)) { debugf("Attempting to send to blacklisted node.\n"); errno = EPERM; return -1; } if(sa->sa_family == AF_INET) s = dht_socket; else if(sa->sa_family == AF_INET6) s = dht_socket6; else s = -1; if(s < 0) { errno = EAFNOSUPPORT; return -1; } return sendto(s, buf, len, flags, sa, salen); } int send_ping(const struct sockaddr *sa, int salen, const unsigned char *tid, int tid_len) { char buf[512]; int i = 0, rc; rc = snprintf(buf + i, 512 - i, "d1:ad2:id20:"); INC(i, rc, 512); COPY(buf, i, myid, 20, 512); rc = snprintf(buf + i, 512 - i, "e1:q4:ping1:t%d:", tid_len); INC(i, rc, 512); COPY(buf, i, tid, tid_len, 512); ADD_V(buf, i, 512); rc = snprintf(buf + i, 512 - i, "1:y1:qe"); INC(i, rc, 512); return dht_send(buf, i, 0, sa, salen); fail: errno = ENOSPC; return -1; } int send_pong(const struct sockaddr *sa, int salen, const unsigned char *tid, int tid_len) { char buf[512]; int i = 0, rc; rc = snprintf(buf + i, 512 - i, "d1:rd2:id20:"); INC(i, rc, 512); COPY(buf, i, myid, 20, 512); rc = snprintf(buf + i, 512 - i, "e1:t%d:", tid_len); INC(i, rc, 512); COPY(buf, i, tid, tid_len, 512); ADD_V(buf, i, 512); rc = snprintf(buf + i, 512 - i, "1:y1:re"); INC(i, rc, 512); return dht_send(buf, i, 0, sa, salen); fail: errno = ENOSPC; return -1; } int send_find_node(const struct sockaddr *sa, int salen, const unsigned char *tid, int tid_len, const unsigned char *target, int want, int confirm) { char buf[512]; int i = 0, rc; rc = snprintf(buf + i, 512 - i, "d1:ad2:id20:"); INC(i, rc, 512); COPY(buf, i, myid, 20, 512); rc = snprintf(buf + i, 512 - i, "6:target20:"); INC(i, rc, 512); COPY(buf, i, target, 20, 512); if(want > 0) { rc = snprintf(buf + i, 512 - i, "4:wantl%s%se", (want & WANT4) ? "2:n4" : "", (want & WANT6) ? "2:n6" : ""); INC(i, rc, 512); } rc = snprintf(buf + i, 512 - i, "e1:q9:find_node1:t%d:", tid_len); INC(i, rc, 512); COPY(buf, i, tid, tid_len, 512); ADD_V(buf, i, 512); rc = snprintf(buf + i, 512 - i, "1:y1:qe"); INC(i, rc, 512); return dht_send(buf, i, confirm ? MSG_CONFIRM : 0, sa, salen); fail: errno = ENOSPC; return -1; } int send_nodes_peers(const struct sockaddr *sa, int salen, const unsigned char *tid, int tid_len, const unsigned char *nodes, int nodes_len, const unsigned char *nodes6, int nodes6_len, int af, struct storage *st, const unsigned char *token, int token_len) { char buf[2048]; int i = 0, rc, j0, j, k, len; rc = snprintf(buf + i, 2048 - i, "d1:rd2:id20:"); INC(i, rc, 2048); COPY(buf, i, myid, 20, 2048); if(nodes_len > 0) { rc = snprintf(buf + i, 2048 - i, "5:nodes%d:", nodes_len); INC(i, rc, 2048); COPY(buf, i, nodes, nodes_len, 2048); } if(nodes6_len > 0) { rc = snprintf(buf + i, 2048 - i, "6:nodes6%d:", nodes6_len); INC(i, rc, 2048); COPY(buf, i, nodes6, nodes6_len, 2048); } if(token_len > 0) { rc = snprintf(buf + i, 2048 - i, "5:token%d:", token_len); INC(i, rc, 2048); COPY(buf, i, token, token_len, 2048); } if(st && st->numpeers > 0) { /* We treat the storage as a circular list, and serve a randomly chosen slice. In order to make sure we fit within 1024 octets, we limit ourselves to 50 peers. */ len = af == AF_INET ? 4 : 16; j0 = random() % st->numpeers; j = j0; k = 0; rc = snprintf(buf + i, 2048 - i, "6:valuesl"); INC(i, rc, 2048); do { if(st->peers[j].len == len) { unsigned short swapped; swapped = htons(st->peers[j].port); rc = snprintf(buf + i, 2048 - i, "%d:", len + 2); INC(i, rc, 2048); COPY(buf, i, st->peers[j].ip, len, 2048); COPY(buf, i, &swapped, 2, 2048); k++; } j = (j + 1) % st->numpeers; } while(j != j0 && k < 50); rc = snprintf(buf + i, 2048 - i, "e"); INC(i, rc, 2048); } rc = snprintf(buf + i, 2048 - i, "e1:t%d:", tid_len); INC(i, rc, 2048); COPY(buf, i, tid, tid_len, 2048); ADD_V(buf, i, 2048); rc = snprintf(buf + i, 2048 - i, "1:y1:re"); INC(i, rc, 2048); return dht_send(buf, i, 0, sa, salen); fail: errno = ENOSPC; return -1; } static int insert_closest_node(unsigned char *nodes, int numnodes, const unsigned char *id, struct node *n) { int i, size; if(n->ss.ss_family == AF_INET) size = 26; else if(n->ss.ss_family == AF_INET6) size = 38; else abort(); for(i = 0; i< numnodes; i++) { if(id_cmp(n->id, nodes + size * i) == 0) return numnodes; if(xorcmp(n->id, nodes + size * i, id) < 0) break; } if(i == 8) return numnodes; if(numnodes < 8) numnodes++; if(i < numnodes - 1) memmove(nodes + size * (i + 1), nodes + size * i, size * (numnodes - i - 1)); if(n->ss.ss_family == AF_INET) { struct sockaddr_in *sin = (struct sockaddr_in*)&n->ss; memcpy(nodes + size * i, n->id, 20); memcpy(nodes + size * i + 20, &sin->sin_addr, 4); memcpy(nodes + size * i + 24, &sin->sin_port, 2); } else if(n->ss.ss_family == AF_INET6) { struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)&n->ss; memcpy(nodes + size * i, n->id, 20); memcpy(nodes + size * i + 20, &sin6->sin6_addr, 16); memcpy(nodes + size * i + 36, &sin6->sin6_port, 2); } else { abort(); } return numnodes; } static int buffer_closest_nodes(unsigned char *nodes, int numnodes, const unsigned char *id, struct bucket *b) { struct node *n = b->nodes; while(n) { if(node_good(n)) numnodes = insert_closest_node(nodes, numnodes, id, n); n = n->next; } return numnodes; } int send_closest_nodes(const struct sockaddr *sa, int salen, const unsigned char *tid, int tid_len, const unsigned char *id, int want, int af, struct storage *st, const unsigned char *token, int token_len) { unsigned char nodes[8 * 26]; unsigned char nodes6[8 * 38]; int numnodes = 0, numnodes6 = 0; struct bucket *b; if(want < 0) want = sa->sa_family == AF_INET ? WANT4 : WANT6; if((want & WANT4)) { b = find_bucket(id, AF_INET); if(b) { numnodes = buffer_closest_nodes(nodes, numnodes, id, b); if(b->next) numnodes = buffer_closest_nodes(nodes, numnodes, id, b->next); b = previous_bucket(b); if(b) numnodes = buffer_closest_nodes(nodes, numnodes, id, b); } } if((want & WANT6)) { b = find_bucket(id, AF_INET6); if(b) { numnodes6 = buffer_closest_nodes(nodes6, numnodes6, id, b); if(b->next) numnodes6 = buffer_closest_nodes(nodes6, numnodes6, id, b->next); b = previous_bucket(b); if(b) numnodes6 = buffer_closest_nodes(nodes6, numnodes6, id, b); } } debugf(" (%d+%d nodes.)\n", numnodes, numnodes6); return send_nodes_peers(sa, salen, tid, tid_len, nodes, numnodes * 26, nodes6, numnodes6 * 38, af, st, token, token_len); } int send_get_peers(const struct sockaddr *sa, int salen, unsigned char *tid, int tid_len, unsigned char *infohash, int want, int confirm) { char buf[512]; int i = 0, rc; rc = snprintf(buf + i, 512 - i, "d1:ad2:id20:"); INC(i, rc, 512); COPY(buf, i, myid, 20, 512); rc = snprintf(buf + i, 512 - i, "9:info_hash20:"); INC(i, rc, 512); COPY(buf, i, infohash, 20, 512); if(want > 0) { rc = snprintf(buf + i, 512 - i, "4:wantl%s%se", (want & WANT4) ? "2:n4" : "", (want & WANT6) ? "2:n6" : ""); INC(i, rc, 512); } rc = snprintf(buf + i, 512 - i, "e1:q9:get_peers1:t%d:", tid_len); INC(i, rc, 512); COPY(buf, i, tid, tid_len, 512); ADD_V(buf, i, 512); rc = snprintf(buf + i, 512 - i, "1:y1:qe"); INC(i, rc, 512); return dht_send(buf, i, confirm ? MSG_CONFIRM : 0, sa, salen); fail: errno = ENOSPC; return -1; } int send_announce_peer(const struct sockaddr *sa, int salen, unsigned char *tid, int tid_len, unsigned char *infohash, unsigned short port, unsigned char *token, int token_len, int confirm) { char buf[512]; int i = 0, rc; rc = snprintf(buf + i, 512 - i, "d1:ad2:id20:"); INC(i, rc, 512); COPY(buf, i, myid, 20, 512); rc = snprintf(buf + i, 512 - i, "9:info_hash20:"); INC(i, rc, 512); COPY(buf, i, infohash, 20, 512); rc = snprintf(buf + i, 512 - i, "4:porti%ue5:token%d:", (unsigned)port, token_len); INC(i, rc, 512); COPY(buf, i, token, token_len, 512); rc = snprintf(buf + i, 512 - i, "e1:q13:announce_peer1:t%d:", tid_len); INC(i, rc, 512); COPY(buf, i, tid, tid_len, 512); ADD_V(buf, i, 512); rc = snprintf(buf + i, 512 - i, "1:y1:qe"); INC(i, rc, 512); return dht_send(buf, i, confirm ? 0 : MSG_CONFIRM, sa, salen); fail: errno = ENOSPC; return -1; } static int send_peer_announced(const struct sockaddr *sa, int salen, unsigned char *tid, int tid_len) { char buf[512]; int i = 0, rc; rc = snprintf(buf + i, 512 - i, "d1:rd2:id20:"); INC(i, rc, 512); COPY(buf, i, myid, 20, 512); rc = snprintf(buf + i, 512 - i, "e1:t%d:", tid_len); INC(i, rc, 512); COPY(buf, i, tid, tid_len, 512); ADD_V(buf, i, 512); rc = snprintf(buf + i, 512 - i, "1:y1:re"); INC(i, rc, 512); return dht_send(buf, i, 0, sa, salen); fail: errno = ENOSPC; return -1; } static int send_error(const struct sockaddr *sa, int salen, unsigned char *tid, int tid_len, int code, const char *message) { char buf[512]; int i = 0, rc; rc = snprintf(buf + i, 512 - i, "d1:eli%de%d:", code, (int)strlen(message)); INC(i, rc, 512); COPY(buf, i, message, (int)strlen(message), 512); rc = snprintf(buf + i, 512 - i, "e1:t%d:", tid_len); INC(i, rc, 512); COPY(buf, i, tid, tid_len, 512); ADD_V(buf, i, 512); rc = snprintf(buf + i, 512 - i, "1:y1:ee"); INC(i, rc, 512); return dht_send(buf, i, 0, sa, salen); fail: errno = ENOSPC; return -1; } #undef CHECK #undef INC #undef COPY #undef ADD_V #ifdef HAVE_MEMMEM static void * dht_memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) { return memmem(haystack, haystacklen, needle, needlelen); } #else static void * dht_memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) { const char *h = haystack; const char *n = needle; size_t i; /* size_t is unsigned */ if(needlelen > haystacklen) return NULL; for(i = 0; i <= haystacklen - needlelen; i++) { if(memcmp(h + i, n, needlelen) == 0) return (void*)(h + i); } return NULL; } #endif static int parse_message(const unsigned char *buf, int buflen, unsigned char *tid_return, int *tid_len, unsigned char *id_return, unsigned char *info_hash_return, unsigned char *target_return, unsigned short *port_return, unsigned char *token_return, int *token_len, unsigned char *nodes_return, int *nodes_len, unsigned char *nodes6_return, int *nodes6_len, unsigned char *values_return, int *values_len, unsigned char *values6_return, int *values6_len, int *want_return) { const unsigned char *p; /* This code will happily crash if the buffer is not NUL-terminated. */ if(buf[buflen] != '\0') { debugf("Eek! parse_message with unterminated buffer.\n"); return -1; } #define CHECK(ptr, len) \ if(((unsigned char*)ptr) + (len) > (buf) + (buflen)) goto overflow; if(tid_return) { p = dht_memmem(buf, buflen, "1:t", 3); if(p) { long l; char *q; l = strtol((char*)p + 3, &q, 10); if(q && *q == ':' && l > 0 && l < *tid_len) { CHECK(q + 1, l); memcpy(tid_return, q + 1, l); *tid_len = l; } else *tid_len = 0; } } if(id_return) { p = dht_memmem(buf, buflen, "2:id20:", 7); if(p) { CHECK(p + 7, 20); memcpy(id_return, p + 7, 20); } else { memset(id_return, 0, 20); } } if(info_hash_return) { p = dht_memmem(buf, buflen, "9:info_hash20:", 14); if(p) { CHECK(p + 14, 20); memcpy(info_hash_return, p + 14, 20); } else { memset(info_hash_return, 0, 20); } } if(port_return) { p = dht_memmem(buf, buflen, "porti", 5); if(p) { long l; char *q; l = strtol((char*)p + 5, &q, 10); if(q && *q == 'e' && l > 0 && l < 0x10000) *port_return = l; else *port_return = 0; } else *port_return = 0; } if(target_return) { p = dht_memmem(buf, buflen, "6:target20:", 11); if(p) { CHECK(p + 11, 20); memcpy(target_return, p + 11, 20); } else { memset(target_return, 0, 20); } } if(token_return) { p = dht_memmem(buf, buflen, "5:token", 7); if(p) { long l; char *q; l = strtol((char*)p + 7, &q, 10); if(q && *q == ':' && l > 0 && l < *token_len) { CHECK(q + 1, l); memcpy(token_return, q + 1, l); *token_len = l; } else *token_len = 0; } else *token_len = 0; } if(nodes_len) { p = dht_memmem(buf, buflen, "5:nodes", 7); if(p) { long l; char *q; l = strtol((char*)p + 7, &q, 10); if(q && *q == ':' && l > 0 && l < *nodes_len) { CHECK(q + 1, l); memcpy(nodes_return, q + 1, l); *nodes_len = l; } else *nodes_len = 0; } else *nodes_len = 0; } if(nodes6_len) { p = dht_memmem(buf, buflen, "6:nodes6", 8); if(p) { long l; char *q; l = strtol((char*)p + 8, &q, 10); if(q && *q == ':' && l > 0 && l < *nodes6_len) { CHECK(q + 1, l); memcpy(nodes6_return, q + 1, l); *nodes6_len = l; } else *nodes6_len = 0; } else *nodes6_len = 0; } if(values_len || values6_len) { p = dht_memmem(buf, buflen, "6:valuesl", 9); if(p) { int i = p - buf + 9; int j = 0, j6 = 0; while(1) { long l; char *q; l = strtol((char*)buf + i, &q, 10); if(q && *q == ':' && l > 0) { CHECK(q + 1, l); i = q + 1 + l - (char*)buf; if(l == 6) { if(j + l > *values_len) continue; memcpy((char*)values_return + j, q + 1, l); j += l; } else if(l == 18) { if(j6 + l > *values6_len) continue; memcpy((char*)values6_return + j6, q + 1, l); j6 += l; } else { debugf("Received weird value -- %d bytes.\n", (int)l); } } else { break; } } if(i >= buflen || buf[i] != 'e') debugf("eek... unexpected end for values.\n"); if(values_len) *values_len = j; if(values6_len) *values6_len = j6; } else { if(values_len) *values_len = 0; if(values6_len) *values6_len = 0; } } if(want_return) { p = dht_memmem(buf, buflen, "4:wantl", 7); if(p) { int i = p - buf + 7; *want_return = 0; while(buf[i] > '0' && buf[i] <= '9' && buf[i + 1] == ':' && i + 2 + buf[i] - '0' < buflen) { CHECK(buf + i + 2, buf[i] - '0'); if(buf[i] == '2' && memcmp(buf + i + 2, "n4", 2) == 0) *want_return |= WANT4; else if(buf[i] == '2' && memcmp(buf + i + 2, "n6", 2) == 0) *want_return |= WANT6; else debugf("eek... unexpected want flag (%c)\n", buf[i]); i += 2 + buf[i] - '0'; } if(i >= buflen || buf[i] != 'e') debugf("eek... unexpected end for want.\n"); } else { *want_return = -1; } } #undef CHECK if(dht_memmem(buf, buflen, "1:y1:r", 6)) return REPLY; if(dht_memmem(buf, buflen, "1:y1:e", 6)) return ERROR; if(!dht_memmem(buf, buflen, "1:y1:q", 6)) return -1; if(dht_memmem(buf, buflen, "1:q4:ping", 9)) return PING; if(dht_memmem(buf, buflen, "1:q9:find_node", 14)) return FIND_NODE; if(dht_memmem(buf, buflen, "1:q9:get_peers", 14)) return GET_PEERS; if(dht_memmem(buf, buflen, "1:q13:announce_peer", 19)) return ANNOUNCE_PEER; return -1; overflow: debugf("Truncated message.\n"); return -1; } transmission-2.92/third-party/dht/PaxHeaders.4960/CHANGES0000644000000000000000000000013012442116701017673 xustar0029 mtime=1418239425.73529885 29 atime=1418239425.73529885 30 ctime=1457295918.088775404 transmission-2.92/third-party/dht/CHANGES0000644000175000017500000001065412442116701021330 0ustar00mikedldmikedld000000000000003 May 2014: dht-0.22 * INCOMPATIBLE CHANGE: the callback now takes const arguments. * Consult the local storage when performing a search, which should make bootstrapping of tiny DHTs easier. Note that we're still not performing local stores, since that would require knowing our IP address. * Don't attempt to flush the debug stream if debugging is disabled. This appears to work around a bug in Transmission. 25 July 2011: dht-0.21 * Blacklisting support. 7 July 2011: dht-0.20 * Fix compilation on systems that have memmem but don't define HAVE_MEMMEM. 30 April 2011: dht-0.19 * Fix incorrect parsing of announces. Thanks to cjdelisle. * Relax rate limiting slightly. 20 January 2011: dht-0.18 * Fix a bug that could cause parse_message to enter an infinite loop on overflow. Thanks to Jordan Lee. 9 January 2011: dht-0.17: * Fix a bug that prevented calling dht_init after dht_uninit. * Remove the "dofree" parameter to dht_uninit. 23 December 2010: dht-0.16: * Change the interface to allow sharing of the UDP socket e.g. with uTP. 1 July 2010: dht-0.15 * Port to Windows, for the needs of Transmission. 25 March 2010: dht-0.14 * Fixed ordering of entries in parameter dictionaries. 15 December 2009: dht-0.13 * Implemented protection against incorrect addresses in the DHT. * Tweaked neighborhood maintenance to wake up less often. 11 December 2009: dht-0.12 * Fixed slightly incorrect formatting of DHT messages. * Fixed incorrect debugging message. 22 November 2009: dht-0.11 * Implemented IPv6 support (BEP-32). * Fixed a bug which could cause us to never mark a search as finished. * Fixed a bug that could cause us to send incomplete lists in response to find_nodes. * Limit the number of hashes that we're willing to track. * Made bucket maintenance slightly more aggressive. * Produce on-the-wire error messages to give a hint to the other side. * Added a bunch of options to dht-example to make it useful as a bootstrap node. * Send version "JC\0\0" when using dht-example. 18 October 2009: dht-0.10 * Send nodes even when sending values. This is a violation of the protocol, but I have been assured that it doesn't break any deployed implementation. This is also what both libtorrent and uTorrent do. * Give up immediately on a search peer when no token was provided. This is a very reasonable extension to the protocol, and certainly doesn't break anything. * Parse heterogeneous values lists correctly. This is mandated by BEP 32. 20 September 2009: dht-0.9 * Fixed incorrect computation of number of nodes. * Made the initial bucket split eagerly (speeds up bootstrapping). * Fixed initial filling of search buckets (speeds up searches). 28 July 2009: dht-0.8 * Fixed a crash when expiring the first search on the list. * Fixed freeing of the search list when uniniting with dofree = 1. 24 June 2009: dht-0.7 * Removed the fixed limit on the number of concurrent searches, we now use a linked list. * Fixed build on FreeBSD (thanks to Humihara and Charles Kerr). 22 May 2009: dht-0.6 * Fixed a buffer overflow (when reading) in parse_message. * Fixed slightly inacurrate metric computation when searching. * Removed a slightly inaccurate shortcut when responding to find_nodes. * Relaxed the rate-limiting parameters to 4 requests per second. 19 May 2009: dht-0.5 * Made reading of /dev/urandom a function provided by the user. * Implemented the ``v'' extension that identifies node implementations. 18 May 2009: dht-0.4 * Fixed the handling of tokens in announce_peer messages. * Implemented backtracking during search when nodes turn out to be dead. 17 May 2009: dht-0.3 * Fixed a number of incorrectly formatted messages. * Changed reply to find_peers to spread the load more uniformly. * Fixed a bug that could cause premature splitting. * Implemented rate limiting. * Changed some time constants to be less chatty. * When determining if a bucket is fresh enough, we now only take replies into account. * dht_get_nodes now returns nodes starting with our own bucket. * Tweaked the memory allocation strategy for stored peers. 17 May 2009: dht-0.2 * Fixed a crash in dht_uninit. * Added support for saving the list of known-good nodes. * Changed the interface of dht_nodes to provide the number of nodes that recently sent incoming requests. 13 May 2009: dht-0.1 * Initial public release. transmission-2.92/third-party/dht/PaxHeaders.4960/Makefile.am0000644000000000000000000000013012442116701020734 xustar0029 mtime=1418239425.73529885 29 atime=1418239425.73529885 30 ctime=1457295918.048774724 transmission-2.92/third-party/dht/Makefile.am0000644000175000017500000000023512442116701022363 0ustar00mikedldmikedld00000000000000AM_CFLAGS = @PTHREAD_CFLAGS@ noinst_LIBRARIES = libdht.a libdht_a_SOURCES = dht.c noinst_HEADERS = dht.h EXTRA_DIST = CHANGES dht-example.c LICENCE README transmission-2.92/third-party/dht/PaxHeaders.4960/LICENCE0000644000000000000000000000013212442116701017667 xustar0030 mtime=1418239425.734298833 30 atime=1418239425.734298833 30 ctime=1457295918.102775642 transmission-2.92/third-party/dht/LICENCE0000644000175000017500000000206012442116701021312 0ustar00mikedldmikedld00000000000000Copyright (c) 2009, 2010 by Juliusz Chroboczek 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. transmission-2.92/third-party/PaxHeaders.4960/utp-01-ticket-5002.patch0000644000000000000000000000013212510034541022034 xustar0030 mtime=1428175201.483866627 30 atime=1428175201.483866627 30 ctime=1457295917.406763807 transmission-2.92/third-party/utp-01-ticket-5002.patch0000644000175000017500000000352012510034541023461 0ustar00mikedldmikedld00000000000000diff --git a/utp.cpp b/utp.cpp --- a/utp.cpp +++ b/utp.cpp @@ -1487,6 +1487,8 @@ return acked_bytes; } +enum { MAX_EACK = 128 }; + void UTPSocket::selective_ack(uint base, const byte *mask, byte len) { if (cur_window_packets == 0) return; @@ -1499,7 +1501,7 @@ // resends is a stack of sequence numbers we need to resend. Since we // iterate in reverse over the acked packets, at the end, the top packets // are the ones we want to resend - int resends[32]; + int resends[MAX_EACK]; int nr = 0; LOG_UTPV("0x%08x: Got EACK [%032b] base:%u", this, *(uint32*)mask, base); @@ -1572,6 +1574,12 @@ if (((v - fast_resend_seq_nr) & ACK_NR_MASK) <= OUTGOING_BUFFER_MAX_SIZE && count >= DUPLICATE_ACKS_BEFORE_RESEND && duplicate_ack < DUPLICATE_ACKS_BEFORE_RESEND) { + // resends is a stack, and we're mostly interested in the top of it + // if we're full, just throw away the lower half + if (nr >= MAX_EACK - 2) { + memmove(resends, &resends[MAX_EACK/2], MAX_EACK/2 * sizeof(resends[0])); + nr -= MAX_EACK / 2; + } resends[nr++] = v; LOG_UTPV("0x%08x: no ack for %u", this, v); } else { @@ -1580,13 +1588,12 @@ } } while (--bits >= -1); - if (((base - 1 - fast_resend_seq_nr) & ACK_NR_MASK) < 256 && - count >= DUPLICATE_ACKS_BEFORE_RESEND && - duplicate_ack < DUPLICATE_ACKS_BEFORE_RESEND) { + if (((base - 1 - fast_resend_seq_nr) & ACK_NR_MASK) <= OUTGOING_BUFFER_MAX_SIZE && + count >= DUPLICATE_ACKS_BEFORE_RESEND) { // if we get enough duplicate acks to start // resending, the first packet we should resend // is base-1 - resends[nr++] = base - 1; + resends[nr++] = (base - 1) & ACK_NR_MASK; } else { LOG_UTPV("0x%08x: not resending %u count:%d dup_ack:%u fast_resend_seq_nr:%u", this, base - 1, count, duplicate_ack, fast_resend_seq_nr); transmission-2.92/third-party/PaxHeaders.4960/natpmp.cmake0000644000000000000000000000013212505250244020425 xustar0030 mtime=1427460260.072236909 30 atime=1427460260.072236909 30 ctime=1457295917.399763688 transmission-2.92/third-party/natpmp.cmake0000644000175000017500000000063012505250244022051 0ustar00mikedldmikedld00000000000000cmake_minimum_required(VERSION 2.8) project(natpmp C) add_definitions(-DNATPMP_STATICLIB -DENABLE_STRNATPMPERR) if(WIN32) set(${PROJECT_NAME}_ADD_SOURCES wingettimeofday.c ) endif() add_library(${PROJECT_NAME} STATIC getgateway.c natpmp.c ${${PROJECT_NAME}_ADD_SOURCES} ) install(TARGETS ${PROJECT_NAME} DESTINATION lib) install(FILES declspec.h natpmp.h DESTINATION include) transmission-2.92/third-party/PaxHeaders.4960/b64-01-newline.patch0000644000000000000000000000013212505250244021415 xustar0030 mtime=1427460260.070236873 30 atime=1427460260.070236873 30 ctime=1457295917.363763075 transmission-2.92/third-party/b64-01-newline.patch0000644000175000017500000000155612505250244023051 0ustar00mikedldmikedld00000000000000diff --git a/src/cencode.c b/src/cencode.c --- a/src/cencode.c +++ b/src/cencode.c @@ -7,7 +7,9 @@ For details, see http://sourceforge.net/projects/libb64 #include +/* const int CHARS_PER_LINE = 72; +*/ void base64_init_encodestate(base64_encodestate* state_in) { @@ -72,12 +74,14 @@ int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, result = (fragment & 0x03f) >> 0; *codechar++ = base64_encode_value(result); + /* ++(state_in->stepcount); if (state_in->stepcount == CHARS_PER_LINE/4) { *codechar++ = '\n'; state_in->stepcount = 0; } + */ } } /* control should not reach here */ @@ -102,7 +106,9 @@ int base64_encode_blockend(char* code_out, base64_encodestate* state_in) case step_A: break; } + /* *codechar++ = '\n'; + */ return codechar - code_out; } transmission-2.92/third-party/PaxHeaders.4960/libb640000644000000000000000000000013212667111056017137 xustar0030 mtime=1457295918.376780301 30 atime=1457295918.114775846 30 ctime=1457295918.376780301 transmission-2.92/third-party/libb64/0000755000175000017500000000000012667111056020641 5ustar00mikedldmikedld00000000000000transmission-2.92/third-party/libb64/PaxHeaders.4960/README0000644000000000000000000000013212505250244020066 xustar0030 mtime=1427460260.116237694 30 atime=1427460260.115237676 30 ctime=1457295918.354779927 transmission-2.92/third-party/libb64/README0000644000175000017500000001162612505250244021521 0ustar00mikedldmikedld00000000000000b64: Base64 Encoding/Decoding Routines ====================================== Overview: -------- libb64 is a library of ANSI C routines for fast encoding/decoding data into and from a base64-encoded format. C++ wrappers are included, as well as the source code for standalone encoding and decoding executables. base64 consists of ASCII text, and is therefore a useful encoding for storing binary data in a text file, such as xml, or sending binary data over text-only email. References: ---------- * Wikipedia article: http://en.wikipedia.org/wiki/Base64 * base64, another implementation of a commandline en/decoder: http://www.fourmilab.ch/webtools/base64/ Why? --- I did this because I need an implementation of base64 encoding and decoding, without any licensing problems. Most OS implementations are released under either the GNU/GPL, or a BSD-variant, which is not what I require. Also, the chance to actually use the co-routine implementation in code is rare, and its use here is fitting. I couldn't pass up the chance. For more information on this technique, see "Coroutines in C", by Simon Tatham, which can be found online here: http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html So then, under which license do I release this code? On to the next section... License: ------- This work is released under into the Public Domain. It basically boils down to this: I put this work in the public domain, and you can take it and do whatever you want with it. An example of this "license" is the Creative Commons Public Domain License, a copy of which can be found in the LICENSE file, and also online at http://creativecommons.org/licenses/publicdomain/ Commandline Use: --------------- There is a new executable available, it is simply called base64. It can encode and decode files, as instructed by the user. To encode a file: $ ./base64 -e filea fileb fileb will now be the base64-encoded version of filea. To decode a file: $ ./base64 -d fileb filec filec will now be identical to filea. Programming: ----------- Some C++ wrappers are provided as well, so you don't have to get your hands dirty. Encoding from standard input to standard output is as simple as #include #include int main() { base64::encoder E; E.encode(std::cin, std::cout); return 0; } Both standalone executables and a static library is provided in the package, Example code: ------------ The 'examples' directory contains some simple example C code, that demonstrates how to use the C interface of the library. Implementation: -------------- It is DAMN fast, if I may say so myself. The C code uses a little trick which has been used to implement coroutines, of which one can say that this implementation is an example. (To see how the libb64 codebase compares with some other BASE64 implementations available, see the BENCHMARKS file) The trick involves the fact that a switch-statement may legally cross into sub-blocks. A very thorough and enlightening essay on co-routines in C, using this method, can be found in the above mentioned "Coroutines in C", by Simon Tatham: http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html For example, an RLE decompressing routine, adapted from the article: 1 static int STATE = 0; 2 static int len, c; 3 switch (STATE) 4 { 5 while (1) 6 { 7 c = getchar(); 8 if (c == EOF) return EOF; 9 if (c == 0xFF) { 10 len = getchar(); 11 c = getchar(); 12 while (len--) 13 { 14 STATE = 0; 15 return c; 16 case 0: 17 } 18 } else 19 STATE = 1; 20 return c; 21 case 1: 22 } 23 } 24 } As can be seen from this example, a coroutine depends on a state variable, which it sets directly before exiting (lines 14 and 119). The next time the routine is entered, the switch moves control to the specific point directly after the previous exit (lines 16 and 21).hands (As an aside, in the mentioned article the combination of the top-level switch, the various setting of the state, the return of a value, and the labelling of the exit point is wrapped in #define macros, making the structure of the routine even clearer.) The obvious problem with any such routine is the static keyword. Any static variables in a function spell doom for multithreaded applications. Also, in situations where this coroutine is used by more than one other coroutines, the consistency is disturbed. What is needed is a structure for storing these variabled, which is passed to the routine seperately. This obviously breaks the modularity of the function, since now the caller has to worry about and care for the internal state of the routine (the callee). This allows for a fast, multithreading-enabled implementation, which may (obviously) be wrapped in a C++ object for ease of use. The base64 encoding and decoding functionality in this package is implemented in exactly this way, providing both a high-speed high-maintanence C interface, and a wrapped C++ which is low-maintanence and only slightly less performant. transmission-2.92/third-party/libb64/PaxHeaders.4960/AUTHORS0000644000000000000000000000013112505250244020255 xustar0030 mtime=1427460260.117237712 30 atime=1427460260.117237712 29 ctime=1457295918.34377974 transmission-2.92/third-party/libb64/AUTHORS0000644000175000017500000000034712505250244021707 0ustar00mikedldmikedld00000000000000libb64: Base64 Encoding/Decoding Routines ====================================== Authors: ------- Chris Venter chris.venter@gmail.com http://controlaltfire.com Contributors: ------------ Mario Rugiero Shlok Datye Peter K. Lee transmission-2.92/third-party/libb64/PaxHeaders.4960/INSTALL0000644000000000000000000000013012505250244020235 xustar0029 mtime=1427460260.11823773 29 atime=1427460260.11823773 30 ctime=1457295918.348779825 transmission-2.92/third-party/libb64/INSTALL0000644000175000017500000000234112505250244021664 0ustar00mikedldmikedld00000000000000libb64: Base64 Encoding/Decoding Routines ====================================== Requirements: ------------ This piece of software has minimal requirements. I have tested it on the following systems: - a Linux machine, with the following specs: (this was the original development machine) * FedoraCore 4 * kernel v. 2.6.11 (stock FC4 kernel) * gcc version 4.0.1 20050727 (Red Hat 4.0.1-5) * glibc-2.3.5-10 * make v. 3.80 * some arb version of makedepend - Windows XP machine * MSYS 1.0 * MinGW 5.1.4 * gcc version 3.4.5 (mingw-vista special r3) - Windows XP machine (same as above) * Microsoft Visual Studio 2010, Version 10.0.30319.1 RTMRel Barring any serious screwups on my part, this code should compile and run sweetly under Cygwin and other systems too. If you DO get it running under some weird arch/os setup, send me a mail, please. Compiling: --------- There is no configure. It would be overkill for something so simple... Run make in the root directory. Installing: ---------- Since the current targets are a standalone executable and a static library (fancy name for archive) with some headers, an install script has not been implemented yet. Simply copy the executable into your path, and use it. -- peace out Chris transmission-2.92/third-party/libb64/PaxHeaders.4960/Makefile.in0000644000000000000000000000013212667111010021247 xustar0030 mtime=1457295880.534136833 30 atime=1457295880.534136833 30 ctime=1457295918.334779587 transmission-2.92/third-party/libb64/Makefile.in0000644000175000017500000004777612667111010022721 0ustar00mikedldmikedld00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = third-party/libb64 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx-pthread.m4 \ $(top_srcdir)/m4/glib-gettext.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libb64_a_AR = $(AR) $(ARFLAGS) libb64_a_LIBADD = am_libb64_a_OBJECTS = cdecode.$(OBJEXT) cencode.$(OBJEXT) libb64_a_OBJECTS = $(am_libb64_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libb64_a_SOURCES) DIST_SOURCES = $(libb64_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp AUTHORS \ INSTALL README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTO_CFLAGS = @CRYPTO_CFLAGS@ CRYPTO_LIBS = @CRYPTO_LIBS@ CRYPTO_PKG = @CRYPTO_PKG@ CURL_MINIMUM = @CURL_MINIMUM@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYASSL_CFLAGS = @CYASSL_CFLAGS@ CYASSL_LIBS = @CYASSL_LIBS@ CYASSL_MINIMUM = @CYASSL_MINIMUM@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DHT_CFLAGS = @DHT_CFLAGS@ DHT_LIBS = @DHT_LIBS@ DHT_LIBS_QT = @DHT_LIBS_QT@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_MINIMUM = @GIO_MINIMUM@ GLIB_MINIMUM = @GLIB_MINIMUM@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MINIMUM = @GTK_MINIMUM@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAPPINDICATOR_CFLAGS = @LIBAPPINDICATOR_CFLAGS@ LIBAPPINDICATOR_LIBS = @LIBAPPINDICATOR_LIBS@ LIBAPPINDICATOR_MINIMUM = @LIBAPPINDICATOR_MINIMUM@ LIBB64_CFLAGS = @LIBB64_CFLAGS@ LIBB64_LIBS = @LIBB64_LIBS@ LIBB64_LIBS_QT = @LIBB64_LIBS_QT@ LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ LIBEVENT_CFLAGS = @LIBEVENT_CFLAGS@ LIBEVENT_LIBS = @LIBEVENT_LIBS@ LIBEVENT_MINIMUM = @LIBEVENT_MINIMUM@ LIBM = @LIBM@ LIBNATPMP_CFLAGS = @LIBNATPMP_CFLAGS@ LIBNATPMP_LIBS = @LIBNATPMP_LIBS@ LIBNATPMP_LIBS_QT = @LIBNATPMP_LIBS_QT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LIBUPNP_LIBS_QT = @LIBUPNP_LIBS_QT@ LIBUTP_CFLAGS = @LIBUTP_CFLAGS@ LIBUTP_LIBS = @LIBUTP_LIBS@ LIBUTP_LIBS_QT = @LIBUTP_LIBS_QT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENSSL_CFLAGS = @OPENSSL_CFLAGS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OPENSSL_MINIMUM = @OPENSSL_MINIMUM@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PEERID_PREFIX = @PEERID_PREFIX@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POLARSSL_MINIMUM = @POLARSSL_MINIMUM@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SYSTEMD_DAEMON_CFLAGS = @SYSTEMD_DAEMON_CFLAGS@ SYSTEMD_DAEMON_LIBS = @SYSTEMD_DAEMON_LIBS@ USERAGENT_PREFIX = @USERAGENT_PREFIX@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ WOLFSSL_CFLAGS = @WOLFSSL_CFLAGS@ WOLFSSL_LIBS = @WOLFSSL_LIBS@ XGETTEXT = @XGETTEXT@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ ZLIB_MINIMUM = @ZLIB_MINIMUM@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ transmissionlocaledir = @transmissionlocaledir@ noinst_LIBRARIES = libb64.a libb64_a_SOURCES = cdecode.c cencode.c noinst_HEADERS = b64/cdecode.h b64/cencode.h EXTRA_DIST = AUTHORS CHANGELOG INSTALL LICENSE README all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu third-party/libb64/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu third-party/libb64/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libb64.a: $(libb64_a_OBJECTS) $(libb64_a_DEPENDENCIES) $(EXTRA_libb64_a_DEPENDENCIES) $(AM_V_at)-rm -f libb64.a $(AM_V_AR)$(libb64_a_AR) libb64.a $(libb64_a_OBJECTS) $(libb64_a_LIBADD) $(AM_V_at)$(RANLIB) libb64.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdecode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cencode.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: transmission-2.92/third-party/libb64/PaxHeaders.4960/CHANGELOG0000644000000000000000000000013012505250244020416 xustar0029 mtime=1427460260.11823773 29 atime=1427460260.11823773 30 ctime=1457295918.375780284 transmission-2.92/third-party/libb64/CHANGELOG0000644000175000017500000000203512505250244022045 0ustar00mikedldmikedld00000000000000libb64: Base64 Encoding/Decoding Routines ====================================== ## Changelog ## Version 1.2.1 Release --------------------- Fixed a long-standing bug in src/cdecode.c where value_in was not correctly checked against the bounds [0..decoding_size) Thanks to both Mario Rugiero and Shlok Datye for pointing this out. Added some simple example code to answer some of the most common misconceptions people have about the library usage. Version 1.2 Release ------------------- Removed the b64dec, b64enc, encoder and decoder programs in favour of a better example, called base64, which encodes and decodes depending on its arguments. Created a solution for Microsoft Visual Studio C++ Express 2010 edition, which simply builds the base64 example as a console application. Version 1.1 Release ------------------- Modified encode.h to (correctly) read from the iostream argument, instead of std::cin. Thanks to Peter K. Lee for the heads-up. No API changes. Version 1.0 Release ------------------- The current content is the changeset. transmission-2.92/third-party/libb64/PaxHeaders.4960/LICENSE0000644000000000000000000000013212505250244020213 xustar0030 mtime=1427460260.117237712 30 atime=1427460260.117237712 30 ctime=1457295918.376780301 transmission-2.92/third-party/libb64/LICENSE0000644000175000017500000000321712505250244021643 0ustar00mikedldmikedld00000000000000Copyright-Only Dedication (based on United States law) or Public Domain Certification The person or persons who have associated work with this document (the "Dedicator" or "Certifier") hereby either (a) certifies that, to the best of his knowledge, the work of authorship identified is in the public domain of the country from which the work is published, or (b) hereby dedicates whatever copyright the dedicators holds in the work of authorship identified below (the "Work") to the public domain. A certifier, moreover, dedicates any copyright interest he may have in the associated work, and for these purposes, is described as a "dedicator" below. A certifier has taken reasonable steps to verify the copyright status of this work. Certifier recognizes that his good faith efforts may not shield him from liability if in fact the work certified is not in the public domain. Dedicator makes this dedication for the benefit of the public at large and to the detriment of the Dedicator's heirs and successors. Dedicator intends this dedication to be an overt act of relinquishment in perpetuity of all present and future rights under copyright law, whether vested or contingent, in the Work. Dedicator understands that such relinquishment of all rights includes the relinquishment of all rights to enforce (by lawsuit or otherwise) those copyrights in the Work. Dedicator recognizes that, once placed in the public domain, the Work may be freely reproduced, distributed, transmitted, used, modified, built upon, or otherwise exploited by anyone for any purpose, commercial or non-commercial, and in any way, including by methods that have not yet been invented or conceived.transmission-2.92/third-party/libb64/PaxHeaders.4960/b640000644000000000000000000000013212667111056017532 xustar0030 mtime=1457295918.329779502 30 atime=1457295918.310779179 30 ctime=1457295918.329779502 transmission-2.92/third-party/libb64/b64/0000755000175000017500000000000012667111056021234 5ustar00mikedldmikedld00000000000000transmission-2.92/third-party/libb64/b64/PaxHeaders.4960/cencode.h0000644000000000000000000000013212505250244021352 xustar0030 mtime=1427460260.073236926 30 atime=1427460260.073236926 30 ctime=1457295918.329779502 transmission-2.92/third-party/libb64/b64/cencode.h0000644000175000017500000000132412505250244022777 0ustar00mikedldmikedld00000000000000/* cencode.h - c header for a base64 encoding algorithm This is part of the libb64 project, and has been placed in the public domain. For details, see http://sourceforge.net/projects/libb64 */ #ifndef BASE64_CENCODE_H #define BASE64_CENCODE_H typedef enum { step_A, step_B, step_C } base64_encodestep; typedef struct { base64_encodestep step; char result; int stepcount; } base64_encodestate; void base64_init_encodestate(base64_encodestate* state_in); char base64_encode_value(char value_in); int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in); int base64_encode_blockend(char* code_out, base64_encodestate* state_in); #endif /* BASE64_CENCODE_H */ transmission-2.92/third-party/libb64/b64/PaxHeaders.4960/cdecode.h0000644000000000000000000000013012505250244021336 xustar0030 mtime=1427460260.073236926 30 atime=1427460260.073236926 28 ctime=1457295918.3237794 transmission-2.92/third-party/libb64/b64/cdecode.h0000644000175000017500000000121112505250244022760 0ustar00mikedldmikedld00000000000000/* cdecode.h - c header for a base64 decoding algorithm This is part of the libb64 project, and has been placed in the public domain. For details, see http://sourceforge.net/projects/libb64 */ #ifndef BASE64_CDECODE_H #define BASE64_CDECODE_H typedef enum { step_a, step_b, step_c, step_d } base64_decodestep; typedef struct { base64_decodestep step; char plainchar; } base64_decodestate; void base64_init_decodestate(base64_decodestate* state_in); int base64_decode_value(char value_in); int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in); #endif /* BASE64_CDECODE_H */ transmission-2.92/third-party/libb64/PaxHeaders.4960/Makefile.am0000644000000000000000000000013212505250244021242 xustar0030 mtime=1427460260.120237765 30 atime=1427460260.120237765 30 ctime=1457295918.318779315 transmission-2.92/third-party/libb64/Makefile.am0000644000175000017500000000024612505250244022671 0ustar00mikedldmikedld00000000000000noinst_LIBRARIES = libb64.a libb64_a_SOURCES = cdecode.c cencode.c noinst_HEADERS = b64/cdecode.h b64/cencode.h EXTRA_DIST = AUTHORS CHANGELOG INSTALL LICENSE README transmission-2.92/third-party/libb64/PaxHeaders.4960/cencode.c0000644000000000000000000000013212505250244020752 xustar0030 mtime=1427460260.116237694 30 atime=1427460260.116237694 30 ctime=1457295918.367780148 transmission-2.92/third-party/libb64/cencode.c0000644000175000017500000000502712505250244022403 0ustar00mikedldmikedld00000000000000/* cencoder.c - c source to a base64 encoding algorithm implementation This is part of the libb64 project, and has been placed in the public domain. For details, see http://sourceforge.net/projects/libb64 */ #include /* const int CHARS_PER_LINE = 72; */ void base64_init_encodestate(base64_encodestate* state_in) { state_in->step = step_A; state_in->result = 0; state_in->stepcount = 0; } char base64_encode_value(char value_in) { static const char* encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; if (value_in > 63) return '='; return encoding[(int)value_in]; } int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in) { const char* plainchar = plaintext_in; const char* const plaintextend = plaintext_in + length_in; char* codechar = code_out; char result; char fragment; result = state_in->result; switch (state_in->step) { while (1) { case step_A: if (plainchar == plaintextend) { state_in->result = result; state_in->step = step_A; return codechar - code_out; } fragment = *plainchar++; result = (fragment & 0x0fc) >> 2; *codechar++ = base64_encode_value(result); result = (fragment & 0x003) << 4; case step_B: if (plainchar == plaintextend) { state_in->result = result; state_in->step = step_B; return codechar - code_out; } fragment = *plainchar++; result |= (fragment & 0x0f0) >> 4; *codechar++ = base64_encode_value(result); result = (fragment & 0x00f) << 2; case step_C: if (plainchar == plaintextend) { state_in->result = result; state_in->step = step_C; return codechar - code_out; } fragment = *plainchar++; result |= (fragment & 0x0c0) >> 6; *codechar++ = base64_encode_value(result); result = (fragment & 0x03f) >> 0; *codechar++ = base64_encode_value(result); /* ++(state_in->stepcount); if (state_in->stepcount == CHARS_PER_LINE/4) { *codechar++ = '\n'; state_in->stepcount = 0; } */ } } /* control should not reach here */ return codechar - code_out; } int base64_encode_blockend(char* code_out, base64_encodestate* state_in) { char* codechar = code_out; switch (state_in->step) { case step_B: *codechar++ = base64_encode_value(state_in->result); *codechar++ = '='; *codechar++ = '='; break; case step_C: *codechar++ = base64_encode_value(state_in->result); *codechar++ = '='; break; case step_A: break; } /* *codechar++ = '\n'; */ return codechar - code_out; } transmission-2.92/third-party/libb64/PaxHeaders.4960/cdecode.c0000644000000000000000000000013212505250244020740 xustar0030 mtime=1427460260.119237747 30 atime=1427460260.119237747 30 ctime=1457295918.360780029 transmission-2.92/third-party/libb64/cdecode.c0000644000175000017500000000466512505250244022400 0ustar00mikedldmikedld00000000000000/* cdecoder.c - c source to a base64 decoding algorithm implementation This is part of the libb64 project, and has been placed in the public domain. For details, see http://sourceforge.net/projects/libb64 */ #include int base64_decode_value(char value_in) { static const signed char decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,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,-1,-1,-1,-1,-1,-1,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}; static const char decoding_size = sizeof(decoding); value_in -= 43; if (value_in < 0 || value_in >= decoding_size) return -1; return decoding[(int)value_in]; } void base64_init_decodestate(base64_decodestate* state_in) { state_in->step = step_a; state_in->plainchar = 0; } int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in) { const char* codechar = code_in; char* plainchar = plaintext_out; int fragment; *plainchar = state_in->plainchar; switch (state_in->step) { while (1) { case step_a: do { if (codechar == code_in+length_in) { state_in->step = step_a; state_in->plainchar = *plainchar; return plainchar - plaintext_out; } fragment = base64_decode_value(*codechar++); } while (fragment < 0); *plainchar = (fragment & 0x03f) << 2; case step_b: do { if (codechar == code_in+length_in) { state_in->step = step_b; state_in->plainchar = *plainchar; return plainchar - plaintext_out; } fragment = base64_decode_value(*codechar++); } while (fragment < 0); *plainchar++ |= (fragment & 0x030) >> 4; *plainchar = (fragment & 0x00f) << 4; case step_c: do { if (codechar == code_in+length_in) { state_in->step = step_c; state_in->plainchar = *plainchar; return plainchar - plaintext_out; } fragment = base64_decode_value(*codechar++); } while (fragment < 0); *plainchar++ |= (fragment & 0x03c) >> 2; *plainchar = (fragment & 0x003) << 6; case step_d: do { if (codechar == code_in+length_in) { state_in->step = step_d; state_in->plainchar = *plainchar; return plainchar - plaintext_out; } fragment = base64_decode_value(*codechar++); } while (fragment < 0); *plainchar++ |= (fragment & 0x03f); } } /* control should not reach here */ return plainchar - plaintext_out; } transmission-2.92/third-party/PaxHeaders.4960/event2-02-win32.patch0000644000000000000000000000013212641272401021527 xustar0030 mtime=1451586817.595878853 30 atime=1451586817.595878853 30 ctime=1457295917.394763603 transmission-2.92/third-party/event2-02-win32.patch0000644000175000017500000000060512641272401023155 0ustar00mikedldmikedld00000000000000diff --git a/evutil.c b/evutil.c --- a/evutil.c +++ b/evutil.c @@ -1562,7 +1562,7 @@ int r; if (!buflen) return 0; -#if defined(_MSC_VER) || defined(WIN32) +#if (defined(_MSC_VER) && _MSC_VER < 1900) || (defined(WIN32) && (!defined(__USE_MINGW_ANSI_STDIO) || (__USE_MINGW_ANSI_STDIO + 0) == 0)) r = _vsnprintf(buf, buflen, format, ap); if (r < 0) r = _vscprintf(format, ap); transmission-2.92/third-party/PaxHeaders.4960/b64-02-unsigned-char.patch0000644000000000000000000000013112505250244022503 xustar0030 mtime=1427460260.060236694 30 atime=1427460260.060236694 29 ctime=1457295917.36876316 transmission-2.92/third-party/b64-02-unsigned-char.patch0000644000175000017500000000425712505250244024141 0ustar00mikedldmikedld00000000000000diff --git a/src/cdecode.c b/src/cdecode.c --- a/src/cdecode.c +++ b/src/cdecode.c @@ -9,7 +9,7 @@ int base64_decode_value(char value_in) { - static const char decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,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,-1,-1,-1,-1,-1,-1,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}; + static const signed char decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,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,-1,-1,-1,-1,-1,-1,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}; static const char decoding_size = sizeof(decoding); value_in -= 43; if (value_in < 0 || value_in >= decoding_size) return -1; @@ -26,7 +26,7 @@ { const char* codechar = code_in; char* plainchar = plaintext_out; - char fragment; + int fragment; *plainchar = state_in->plainchar; @@ -42,7 +42,7 @@ state_in->plainchar = *plainchar; return plainchar - plaintext_out; } - fragment = (char)base64_decode_value(*codechar++); + fragment = base64_decode_value(*codechar++); } while (fragment < 0); *plainchar = (fragment & 0x03f) << 2; case step_b: @@ -53,7 +53,7 @@ state_in->plainchar = *plainchar; return plainchar - plaintext_out; } - fragment = (char)base64_decode_value(*codechar++); + fragment = base64_decode_value(*codechar++); } while (fragment < 0); *plainchar++ |= (fragment & 0x030) >> 4; *plainchar = (fragment & 0x00f) << 4; @@ -65,7 +65,7 @@ state_in->plainchar = *plainchar; return plainchar - plaintext_out; } - fragment = (char)base64_decode_value(*codechar++); + fragment = base64_decode_value(*codechar++); } while (fragment < 0); *plainchar++ |= (fragment & 0x03c) >> 2; *plainchar = (fragment & 0x003) << 6; @@ -77,7 +77,7 @@ state_in->plainchar = *plainchar; return plainchar - plaintext_out; } - fragment = (char)base64_decode_value(*codechar++); + fragment = base64_decode_value(*codechar++); } while (fragment < 0); *plainchar++ |= (fragment & 0x03f); } transmission-2.92/third-party/PaxHeaders.4960/utp.cmake0000644000000000000000000000013212512314245017736 xustar0030 mtime=1428789413.068287251 30 atime=1428789413.068287251 30 ctime=1457295917.423764096 transmission-2.92/third-party/utp.cmake0000644000175000017500000000063412512314245021366 0ustar00mikedldmikedld00000000000000cmake_minimum_required(VERSION 2.8) project(utp CXX) if(WIN32) set(${PROJECT_NAME}_ADD_SOURCES win32_inet_ntop.cpp ) else() add_definitions(-DPOSIX) endif() include_directories(.) add_library(${PROJECT_NAME} STATIC utp.cpp utp_utils.cpp ${${PROJECT_NAME}_ADD_SOURCES} ) install(TARGETS ${PROJECT_NAME} DESTINATION lib) install(FILES utp.h utypes.h DESTINATION include/libutp) transmission-2.92/third-party/PaxHeaders.4960/event2-01-win32.patch0000644000000000000000000000013012617217203021526 xustar0029 mtime=1446846083.21174331 29 atime=1446846083.21174331 30 ctime=1457295917.388763501 transmission-2.92/third-party/event2-01-win32.patch0000644000175000017500000000075112617217203023160 0ustar00mikedldmikedld00000000000000diff --git a/WIN32-Code/event2/event-config.h b/WIN32-Code/event2/event-config.h --- a/WIN32-Code/event2/event-config.h +++ b/WIN32-Code/event2/event-config.h @@ -167,7 +167,9 @@ /* #undef _EVENT_HAVE_STRSEP */ /* Define to 1 if you have the `strtok_r' function. */ -/* #undef _EVENT_HAVE_STRTOK_R */ +#if defined(__MINGW32__) || defined(__MINGW64__) +#define _EVENT_HAVE_STRTOK_R 1 +#endif /* Define to 1 if you have the `strtoll' function. */ /* #define _EVENT_HAVE_STRTOLL 1 */ transmission-2.92/third-party/PaxHeaders.4960/Makefile.in0000644000000000000000000000013212667111010020165 xustar0030 mtime=1457295880.305132939 30 atime=1457295880.305132939 30 ctime=1457295917.828770983 transmission-2.92/third-party/Makefile.in0000644000175000017500000005204212667111010021615 0ustar00mikedldmikedld00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = third-party ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx-pthread.m4 \ $(top_srcdir)/m4/glib-gettext.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = dht libb64 libnatpmp miniupnp libutp am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTO_CFLAGS = @CRYPTO_CFLAGS@ CRYPTO_LIBS = @CRYPTO_LIBS@ CRYPTO_PKG = @CRYPTO_PKG@ CURL_MINIMUM = @CURL_MINIMUM@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYASSL_CFLAGS = @CYASSL_CFLAGS@ CYASSL_LIBS = @CYASSL_LIBS@ CYASSL_MINIMUM = @CYASSL_MINIMUM@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DHT_CFLAGS = @DHT_CFLAGS@ DHT_LIBS = @DHT_LIBS@ DHT_LIBS_QT = @DHT_LIBS_QT@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_MINIMUM = @GIO_MINIMUM@ GLIB_MINIMUM = @GLIB_MINIMUM@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MINIMUM = @GTK_MINIMUM@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAPPINDICATOR_CFLAGS = @LIBAPPINDICATOR_CFLAGS@ LIBAPPINDICATOR_LIBS = @LIBAPPINDICATOR_LIBS@ LIBAPPINDICATOR_MINIMUM = @LIBAPPINDICATOR_MINIMUM@ LIBB64_CFLAGS = @LIBB64_CFLAGS@ LIBB64_LIBS = @LIBB64_LIBS@ LIBB64_LIBS_QT = @LIBB64_LIBS_QT@ LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ LIBEVENT_CFLAGS = @LIBEVENT_CFLAGS@ LIBEVENT_LIBS = @LIBEVENT_LIBS@ LIBEVENT_MINIMUM = @LIBEVENT_MINIMUM@ LIBM = @LIBM@ LIBNATPMP_CFLAGS = @LIBNATPMP_CFLAGS@ LIBNATPMP_LIBS = @LIBNATPMP_LIBS@ LIBNATPMP_LIBS_QT = @LIBNATPMP_LIBS_QT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LIBUPNP_LIBS_QT = @LIBUPNP_LIBS_QT@ LIBUTP_CFLAGS = @LIBUTP_CFLAGS@ LIBUTP_LIBS = @LIBUTP_LIBS@ LIBUTP_LIBS_QT = @LIBUTP_LIBS_QT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENSSL_CFLAGS = @OPENSSL_CFLAGS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OPENSSL_MINIMUM = @OPENSSL_MINIMUM@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PEERID_PREFIX = @PEERID_PREFIX@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POLARSSL_MINIMUM = @POLARSSL_MINIMUM@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SYSTEMD_DAEMON_CFLAGS = @SYSTEMD_DAEMON_CFLAGS@ SYSTEMD_DAEMON_LIBS = @SYSTEMD_DAEMON_LIBS@ USERAGENT_PREFIX = @USERAGENT_PREFIX@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ WOLFSSL_CFLAGS = @WOLFSSL_CFLAGS@ WOLFSSL_LIBS = @WOLFSSL_LIBS@ XGETTEXT = @XGETTEXT@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ ZLIB_MINIMUM = @ZLIB_MINIMUM@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ transmissionlocaledir = @transmissionlocaledir@ @BUILD_DHT_TRUE@DHT_DIR = dht @BUILD_B64_TRUE@B64_DIR = libb64 @BUILD_UTP_TRUE@UTP_DIR = libutp @BUILD_MINIUPNP_TRUE@MINIUPNP_DIR = miniupnp @BUILD_NATPMP_TRUE@NATPMP_DIR = libnatpmp SUBDIRS = \ $(DHT_DIR) \ $(B64_DIR) \ $(NATPMP_DIR) \ $(MINIUPNP_DIR) \ $(UTP_DIR) EXTRA_DIST = \ macosx-libevent-config.h \ macosx-libevent-event-config.h all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu third-party/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu third-party/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: transmission-2.92/third-party/PaxHeaders.4960/macosx-libevent-event-config.h0000644000000000000000000000013112442116705023761 xustar0030 mtime=1418239429.300359942 30 atime=1418239429.300359942 29 ctime=1457295917.83977117 transmission-2.92/third-party/macosx-libevent-event-config.h0000644000175000017500000003213712442116705025415 0ustar00mikedldmikedld00000000000000/* event-config.h * Generated by autoconf; post-processed by libevent. * Do not edit this file. * Do not rely on macros in this file existing in later versions. */ #ifndef _EVENT_CONFIG_H_ #define _EVENT_CONFIG_H_ /* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.in by autoheader. */ /* Define if libevent should build without support for a debug mode */ /* #undef _EVENT_DISABLE_DEBUG_MODE */ /* Define if libevent should not allow replacing the mm functions */ /* #undef _EVENT_DISABLE_MM_REPLACEMENT */ /* Define if libevent should not be compiled with thread support */ /* #undef _EVENT_DISABLE_THREAD_SUPPORT */ /* Define to 1 if you have the `arc4random' function. */ #define _EVENT_HAVE_ARC4RANDOM 1 /* Define to 1 if you have the `arc4random_buf' function. */ /* #undef _EVENT_HAVE_ARC4RANDOM_BUF */ /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_ARPA_INET_H 1 /* Define to 1 if you have the `clock_gettime' function. */ /* #undef _EVENT_HAVE_CLOCK_GETTIME */ /* Define to 1 if you have the declaration of `CTL_KERN', and to 0 if you don't. */ #define _EVENT_HAVE_DECL_CTL_KERN 1 /* Define to 1 if you have the declaration of `KERN_ARND', and to 0 if you don't. */ #define _EVENT_HAVE_DECL_KERN_ARND 0 /* Define to 1 if you have the declaration of `KERN_RANDOM', and to 0 if you don't. */ #define _EVENT_HAVE_DECL_KERN_RANDOM 0 /* Define to 1 if you have the declaration of `RANDOM_UUID', and to 0 if you don't. */ #define _EVENT_HAVE_DECL_RANDOM_UUID 0 /* Define if /dev/poll is available */ /* #undef _EVENT_HAVE_DEVPOLL */ /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_DLFCN_H 1 /* Define if your system supports the epoll system calls */ /* #undef _EVENT_HAVE_EPOLL */ /* Define to 1 if you have the `epoll_ctl' function. */ /* #undef _EVENT_HAVE_EPOLL_CTL */ /* Define to 1 if you have the `eventfd' function. */ /* #undef _EVENT_HAVE_EVENTFD */ /* Define if your system supports event ports */ /* #undef _EVENT_HAVE_EVENT_PORTS */ /* Define to 1 if you have the `fcntl' function. */ #define _EVENT_HAVE_FCNTL 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_FCNTL_H 1 /* Define to 1 if the system has the type `fd_mask'. */ #define _EVENT_HAVE_FD_MASK 1 /* Define to 1 if you have the `getaddrinfo' function. */ #define _EVENT_HAVE_GETADDRINFO 1 /* Define to 1 if you have the `getegid' function. */ #define _EVENT_HAVE_GETEGID 1 /* Define to 1 if you have the `geteuid' function. */ #define _EVENT_HAVE_GETEUID 1 /* Define this if you have any gethostbyname_r() */ /* #undef _EVENT_HAVE_GETHOSTBYNAME_R */ /* Define this if gethostbyname_r takes 3 arguments */ /* #undef _EVENT_HAVE_GETHOSTBYNAME_R_3_ARG */ /* Define this if gethostbyname_r takes 5 arguments */ /* #undef _EVENT_HAVE_GETHOSTBYNAME_R_5_ARG */ /* Define this if gethostbyname_r takes 6 arguments */ /* #undef _EVENT_HAVE_GETHOSTBYNAME_R_6_ARG */ /* Define to 1 if you have the `getnameinfo' function. */ #define _EVENT_HAVE_GETNAMEINFO 1 /* Define to 1 if you have the `getprotobynumber' function. */ #define _EVENT_HAVE_GETPROTOBYNUMBER 1 /* Define to 1 if you have the `getservbyname' function. */ #define _EVENT_HAVE_GETSERVBYNAME 1 /* Define to 1 if you have the `gettimeofday' function. */ #define _EVENT_HAVE_GETTIMEOFDAY 1 /* Define to 1 if you have the `inet_aton' function. */ #define _EVENT_HAVE_INET_ATON 1 /* Define to 1 if you have the `inet_ntop' function. */ #define _EVENT_HAVE_INET_NTOP 1 /* Define to 1 if you have the `inet_pton' function. */ #define _EVENT_HAVE_INET_PTON 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_INTTYPES_H 1 /* Define to 1 if you have the `issetugid' function. */ #define _EVENT_HAVE_ISSETUGID 1 /* Define to 1 if you have the `kqueue' function. */ #define _EVENT_HAVE_KQUEUE 1 /* Define if the system has zlib */ #define _EVENT_HAVE_LIBZ 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_MEMORY_H 1 /* Define to 1 if you have the `mmap' function. */ #define _EVENT_HAVE_MMAP 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_NETDB_H 1 /* Define to 1 if you have the header file. */ /* #undef _EVENT_HAVE_NETINET_IN6_H */ /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_NETINET_IN_H 1 /* Define if the system has openssl */ #define _EVENT_HAVE_OPENSSL 1 /* Define to 1 if you have the `pipe' function. */ #define _EVENT_HAVE_PIPE 1 /* Define to 1 if you have the `poll' function. */ #define _EVENT_HAVE_POLL 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_POLL_H 1 /* Define to 1 if you have the `port_create' function. */ /* #undef _EVENT_HAVE_PORT_CREATE */ /* Define to 1 if you have the header file. */ /* #undef _EVENT_HAVE_PORT_H */ /* Define if you have POSIX threads libraries and header files. */ /* #undef _EVENT_HAVE_PTHREAD */ /* Define if we have pthreads on this system */ #define _EVENT_HAVE_PTHREADS 1 /* Define to 1 if you have the `putenv' function. */ #define _EVENT_HAVE_PUTENV 1 /* Define to 1 if the system has the type `sa_family_t'. */ #define _EVENT_HAVE_SA_FAMILY_T 1 /* Define to 1 if you have the `select' function. */ #define _EVENT_HAVE_SELECT 1 /* Define to 1 if you have the `sendfile' function. */ #define _EVENT_HAVE_SENDFILE 1 /* Define to 1 if you have the `setenv' function. */ #define _EVENT_HAVE_SETENV 1 /* Define if F_SETFD is defined in */ #define _EVENT_HAVE_SETFD 1 /* Define to 1 if you have the `sigaction' function. */ #define _EVENT_HAVE_SIGACTION 1 /* Define to 1 if you have the `signal' function. */ #define _EVENT_HAVE_SIGNAL 1 /* Define to 1 if you have the `splice' function. */ /* #undef _EVENT_HAVE_SPLICE */ /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_STDARG_H 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_STDDEF_H 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_STRING_H 1 /* Define to 1 if you have the `strlcpy' function. */ #define _EVENT_HAVE_STRLCPY 1 /* Define to 1 if you have the `strsep' function. */ #define _EVENT_HAVE_STRSEP 1 /* Define to 1 if you have the `strtok_r' function. */ #define _EVENT_HAVE_STRTOK_R 1 /* Define to 1 if you have the `strtoll' function. */ #define _EVENT_HAVE_STRTOLL 1 /* Define to 1 if the system has the type `struct addrinfo'. */ #define _EVENT_HAVE_STRUCT_ADDRINFO 1 /* Define to 1 if the system has the type `struct in6_addr'. */ #define _EVENT_HAVE_STRUCT_IN6_ADDR 1 /* Define to 1 if `s6_addr16' is a member of `struct in6_addr'. */ /* #undef _EVENT_HAVE_STRUCT_IN6_ADDR_S6_ADDR16 */ /* Define to 1 if `s6_addr32' is a member of `struct in6_addr'. */ /* #undef _EVENT_HAVE_STRUCT_IN6_ADDR_S6_ADDR32 */ /* Define to 1 if the system has the type `struct sockaddr_in6'. */ #define _EVENT_HAVE_STRUCT_SOCKADDR_IN6 1 /* Define to 1 if `sin6_len' is a member of `struct sockaddr_in6'. */ #define _EVENT_HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN 1 /* Define to 1 if `sin_len' is a member of `struct sockaddr_in'. */ #define _EVENT_HAVE_STRUCT_SOCKADDR_IN_SIN_LEN 1 /* Define to 1 if the system has the type `struct sockaddr_storage'. */ #define _EVENT_HAVE_STRUCT_SOCKADDR_STORAGE 1 /* Define to 1 if `ss_family' is a member of `struct sockaddr_storage'. */ #define _EVENT_HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1 /* Define to 1 if `__ss_family' is a member of `struct sockaddr_storage'. */ /* #undef _EVENT_HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY */ /* Define to 1 if you have the header file. */ /* #undef _EVENT_HAVE_SYS_DEVPOLL_H */ /* Define to 1 if you have the header file. */ /* #undef _EVENT_HAVE_SYS_EPOLL_H */ /* Define to 1 if you have the header file. */ /* #undef _EVENT_HAVE_SYS_EVENTFD_H */ /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_SYS_EVENT_H 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_SYS_IOCTL_H 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_SYS_MMAN_H 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_SYS_PARAM_H 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_SYS_QUEUE_H 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_SYS_SELECT_H 1 /* Define to 1 if you have the header file. */ /* #undef _EVENT_HAVE_SYS_SENDFILE_H */ /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_SYS_SOCKET_H 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_SYS_SYSCTL_H 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_SYS_TIME_H 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_SYS_UIO_H 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_SYS_WAIT_H 1 /* Define if TAILQ_FOREACH is defined in */ #define _EVENT_HAVE_TAILQFOREACH 1 /* Define if timeradd is defined in */ #define _EVENT_HAVE_TIMERADD 1 /* Define if timerclear is defined in */ #define _EVENT_HAVE_TIMERCLEAR 1 /* Define if timercmp is defined in */ #define _EVENT_HAVE_TIMERCMP 1 /* Define if timerisset is defined in */ #define _EVENT_HAVE_TIMERISSET 1 /* Define to 1 if the system has the type `uint16_t'. */ #define _EVENT_HAVE_UINT16_T 1 /* Define to 1 if the system has the type `uint32_t'. */ #define _EVENT_HAVE_UINT32_T 1 /* Define to 1 if the system has the type `uint64_t'. */ #define _EVENT_HAVE_UINT64_T 1 /* Define to 1 if the system has the type `uint8_t'. */ #define _EVENT_HAVE_UINT8_T 1 /* Define to 1 if the system has the type `uintptr_t'. */ #define _EVENT_HAVE_UINTPTR_T 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_UNISTD_H 1 /* Define to 1 if you have the `unsetenv' function. */ #define _EVENT_HAVE_UNSETENV 1 /* Define to 1 if you have the `vasprintf' function. */ #define _EVENT_HAVE_VASPRINTF 1 /* Define if kqueue works correctly with pipes */ #define _EVENT_HAVE_WORKING_KQUEUE 1 /* Define to 1 if you have the header file. */ #define _EVENT_HAVE_ZLIB_H 1 /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #define _EVENT_LT_OBJDIR ".libs/" /* Numeric representation of the version */ #define _EVENT_NUMERIC_VERSION 0x02000b01 /* Name of package */ #define _EVENT_PACKAGE "libevent" /* Define to the address where bug reports for this package should be sent. */ #define _EVENT_PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define _EVENT_PACKAGE_NAME "" /* Define to the full name and version of this package. */ #define _EVENT_PACKAGE_STRING "" /* Define to the one symbol short name of this package. */ #define _EVENT_PACKAGE_TARNAME "" /* Define to the version of this package. */ #define _EVENT_PACKAGE_VERSION "" /* Define to necessary symbol if this constant uses a non-standard name on your system. */ /* #undef _EVENT_PTHREAD_CREATE_JOINABLE */ /* The size of `int', as computed by sizeof. */ #define _EVENT_SIZEOF_INT 4 /* The size of `long', as computed by sizeof. */ #define _EVENT_SIZEOF_LONG 8 /* The size of `long long', as computed by sizeof. */ #define _EVENT_SIZEOF_LONG_LONG 8 /* The size of `pthread_t', as computed by sizeof. */ #define _EVENT_SIZEOF_PTHREAD_T 8 /* The size of `short', as computed by sizeof. */ #define _EVENT_SIZEOF_SHORT 2 /* The size of `size_t', as computed by sizeof. */ #define _EVENT_SIZEOF_SIZE_T 8 /* The size of `void *', as computed by sizeof. */ #define _EVENT_SIZEOF_VOID_P 8 /* Define to 1 if you have the ANSI C header files. */ #define _EVENT_STDC_HEADERS 1 /* Define to 1 if you can safely include both and . */ #define _EVENT_TIME_WITH_SYS_TIME 1 /* Version number of package */ #define _EVENT_VERSION "2.0.11-stable-dev" /* Define to appropriate substitue if compiler doesnt have __func__ */ /* #undef _EVENT___func__ */ /* Define to empty if `const' does not conform to ANSI C. */ /* #undef _EVENT_const */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus /* #undef _EVENT_inline */ #endif /* Define to `int' if does not define. */ /* #undef _EVENT_pid_t */ /* Define to `unsigned int' if does not define. */ /* #undef _EVENT_size_t */ /* Define to unsigned int if you dont have it */ /* #undef _EVENT_socklen_t */ /* Define to `int' if does not define. */ /* #undef _EVENT_ssize_t */ #endif transmission-2.92/third-party/PaxHeaders.4960/miniupnp0000644000000000000000000000013212667111057017715 xustar0030 mtime=1457295919.035791508 30 atime=1457295918.648784927 30 ctime=1457295919.035791508 transmission-2.92/third-party/miniupnp/0000755000175000017500000000000012667111057021417 5ustar00mikedldmikedld00000000000000transmission-2.92/third-party/miniupnp/PaxHeaders.4960/upnpreplyparse.h0000644000000000000000000000013212442116703023226 xustar0030 mtime=1418239427.480328753 30 atime=1418239427.480328753 30 ctime=1457295918.942789926 transmission-2.92/third-party/miniupnp/upnpreplyparse.h0000644000175000017500000000275612442116703024665 0ustar00mikedldmikedld00000000000000/* $Id: upnpreplyparse.h,v 1.17 2013/06/06 21:36:40 nanard Exp $ */ /* MiniUPnP project * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * (c) 2006-2013 Thomas Bernard * This software is subject to the conditions detailed * in the LICENCE file provided within the distribution */ #ifndef UPNPREPLYPARSE_H_INCLUDED #define UPNPREPLYPARSE_H_INCLUDED #if defined(NO_SYS_QUEUE_H) || defined(_WIN32) || defined(__HAIKU__) #include "bsdqueue.h" #else #include #endif #ifdef __cplusplus extern "C" { #endif struct NameValue { LIST_ENTRY(NameValue) entries; char name[64]; char value[128]; }; struct NameValueParserData { LIST_HEAD(listhead, NameValue) head; char curelt[64]; char * portListing; int portListingLength; int topelt; const char * cdata; int cdatalen; }; /* ParseNameValue() */ void ParseNameValue(const char * buffer, int bufsize, struct NameValueParserData * data); /* ClearNameValueList() */ void ClearNameValueList(struct NameValueParserData * pdata); /* GetValueFromNameValueList() */ char * GetValueFromNameValueList(struct NameValueParserData * pdata, const char * Name); #if 0 /* GetValueFromNameValueListIgnoreNS() */ char * GetValueFromNameValueListIgnoreNS(struct NameValueParserData * pdata, const char * Name); #endif /* DisplayNameValueList() */ #ifdef DEBUG void DisplayNameValueList(char * buffer, int bufsize); #endif #ifdef __cplusplus } #endif #endif transmission-2.92/third-party/miniupnp/PaxHeaders.4960/minisoap.h0000644000000000000000000000013212442116703021754 xustar0030 mtime=1418239427.479328736 30 atime=1418239427.479328736 30 ctime=1457295918.888789008 transmission-2.92/third-party/miniupnp/minisoap.h0000644000175000017500000000076212442116703023406 0ustar00mikedldmikedld00000000000000/* $Id: minisoap.h,v 1.5 2012/09/27 15:42:10 nanard Exp $ */ /* Project : miniupnp * Author : Thomas Bernard * Copyright (c) 2005 Thomas Bernard * This software is subject to the conditions detailed in the * LICENCE file provided in this distribution. */ #ifndef MINISOAP_H_INCLUDED #define MINISOAP_H_INCLUDED /*int httpWrite(int, const char *, int, const char *);*/ int soapPostSubmit(int, const char *, const char *, unsigned short, const char *, const char *, const char *); #endif transmission-2.92/third-party/miniupnp/PaxHeaders.4960/igd_desc_parse.h0000644000000000000000000000013012442116703023066 xustar0029 mtime=1418239427.48132877 29 atime=1418239427.48132877 30 ctime=1457295918.882788906 transmission-2.92/third-party/miniupnp/igd_desc_parse.h0000644000175000017500000000303612442116703024517 0ustar00mikedldmikedld00000000000000/* $Id: igd_desc_parse.h,v 1.11 2012/10/16 16:49:02 nanard Exp $ */ /* Project : miniupnp * http://miniupnp.free.fr/ * Author : Thomas Bernard * Copyright (c) 2005-2010 Thomas Bernard * This software is subject to the conditions detailed in the * LICENCE file provided in this distribution. * */ #ifndef IGD_DESC_PARSE_H_INCLUDED #define IGD_DESC_PARSE_H_INCLUDED /* Structure to store the result of the parsing of UPnP * descriptions of Internet Gateway Devices */ #define MINIUPNPC_URL_MAXSIZE (128) struct IGDdatas_service { char controlurl[MINIUPNPC_URL_MAXSIZE]; char eventsuburl[MINIUPNPC_URL_MAXSIZE]; char scpdurl[MINIUPNPC_URL_MAXSIZE]; char servicetype[MINIUPNPC_URL_MAXSIZE]; /*char devicetype[MINIUPNPC_URL_MAXSIZE];*/ }; struct IGDdatas { char cureltname[MINIUPNPC_URL_MAXSIZE]; char urlbase[MINIUPNPC_URL_MAXSIZE]; char presentationurl[MINIUPNPC_URL_MAXSIZE]; int level; /*int state;*/ /* "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1" */ struct IGDdatas_service CIF; /* "urn:schemas-upnp-org:service:WANIPConnection:1" * "urn:schemas-upnp-org:service:WANPPPConnection:1" */ struct IGDdatas_service first; /* if both WANIPConnection and WANPPPConnection are present */ struct IGDdatas_service second; /* "urn:schemas-upnp-org:service:WANIPv6FirewallControl:1" */ struct IGDdatas_service IPv6FC; /* tmp */ struct IGDdatas_service tmp; }; void IGDstartelt(void *, const char *, int); void IGDendelt(void *, const char *, int); void IGDdata(void *, const char *, int); void printIGD(struct IGDdatas *); #endif transmission-2.92/third-party/miniupnp/PaxHeaders.4960/upnpcommands.h0000644000000000000000000000013212442116703022641 xustar0030 mtime=1418239427.483328805 30 atime=1418239427.483328805 30 ctime=1457295918.935789807 transmission-2.92/third-party/miniupnp/upnpcommands.h0000644000175000017500000002526512442116703024300 0ustar00mikedldmikedld00000000000000/* $Id: upnpcommands.h,v 1.27 2014/02/17 15:38:26 nanard Exp $ */ /* Miniupnp project : http://miniupnp.free.fr/ * Author : Thomas Bernard * Copyright (c) 2005-2014 Thomas Bernard * This software is subject to the conditions detailed in the * LICENCE file provided within this distribution */ #ifndef UPNPCOMMANDS_H_INCLUDED #define UPNPCOMMANDS_H_INCLUDED #include "upnpreplyparse.h" #include "portlistingparse.h" #include "declspec.h" #include "miniupnpctypes.h" /* MiniUPnPc return codes : */ #define UPNPCOMMAND_SUCCESS (0) #define UPNPCOMMAND_UNKNOWN_ERROR (-1) #define UPNPCOMMAND_INVALID_ARGS (-2) #define UPNPCOMMAND_HTTP_ERROR (-3) #ifdef __cplusplus extern "C" { #endif LIBSPEC UNSIGNED_INTEGER UPNP_GetTotalBytesSent(const char * controlURL, const char * servicetype); LIBSPEC UNSIGNED_INTEGER UPNP_GetTotalBytesReceived(const char * controlURL, const char * servicetype); LIBSPEC UNSIGNED_INTEGER UPNP_GetTotalPacketsSent(const char * controlURL, const char * servicetype); LIBSPEC UNSIGNED_INTEGER UPNP_GetTotalPacketsReceived(const char * controlURL, const char * servicetype); /* UPNP_GetStatusInfo() * status and lastconnerror are 64 byte buffers * Return values : * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR * or a UPnP Error code */ LIBSPEC int UPNP_GetStatusInfo(const char * controlURL, const char * servicetype, char * status, unsigned int * uptime, char * lastconnerror); /* UPNP_GetConnectionTypeInfo() * argument connectionType is a 64 character buffer * Return Values : * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR * or a UPnP Error code */ LIBSPEC int UPNP_GetConnectionTypeInfo(const char * controlURL, const char * servicetype, char * connectionType); /* UPNP_GetExternalIPAddress() call the corresponding UPNP method. * if the third arg is not null the value is copied to it. * at least 16 bytes must be available * * Return values : * 0 : SUCCESS * NON ZERO : ERROR Either an UPnP error code or an unknown error. * * possible UPnP Errors : * 402 Invalid Args - See UPnP Device Architecture section on Control. * 501 Action Failed - See UPnP Device Architecture section on Control. */ LIBSPEC int UPNP_GetExternalIPAddress(const char * controlURL, const char * servicetype, char * extIpAdd); /* UPNP_GetLinkLayerMaxBitRates() * call WANCommonInterfaceConfig:1#GetCommonLinkProperties * * return values : * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR * or a UPnP Error Code. */ LIBSPEC int UPNP_GetLinkLayerMaxBitRates(const char* controlURL, const char* servicetype, unsigned int * bitrateDown, unsigned int * bitrateUp); /* UPNP_AddPortMapping() * if desc is NULL, it will be defaulted to "libminiupnpc" * remoteHost is usually NULL because IGD don't support it. * * Return values : * 0 : SUCCESS * NON ZERO : ERROR. Either an UPnP error code or an unknown error. * * List of possible UPnP errors for AddPortMapping : * errorCode errorDescription (short) - Description (long) * 402 Invalid Args - See UPnP Device Architecture section on Control. * 501 Action Failed - See UPnP Device Architecture section on Control. * 606 Action not authorized - The action requested REQUIRES authorization and * the sender was not authorized. * 715 WildCardNotPermittedInSrcIP - The source IP address cannot be * wild-carded * 716 WildCardNotPermittedInExtPort - The external port cannot be wild-carded * 718 ConflictInMappingEntry - The port mapping entry specified conflicts * with a mapping assigned previously to another client * 724 SamePortValuesRequired - Internal and External port values * must be the same * 725 OnlyPermanentLeasesSupported - The NAT implementation only supports * permanent lease times on port mappings * 726 RemoteHostOnlySupportsWildcard - RemoteHost must be a wildcard * and cannot be a specific IP address or DNS name * 727 ExternalPortOnlySupportsWildcard - ExternalPort must be a wildcard and * cannot be a specific port value * 728 NoPortMapsAvailable - There are not enough free ports available to * complete port mapping. * 729 ConflictWithOtherMechanisms - Attempted port mapping is not allowed * due to conflict with other mechanisms. * 732 WildCardNotPermittedInIntPort - The internal port cannot be wild-carded */ LIBSPEC int UPNP_AddPortMapping(const char * controlURL, const char * servicetype, const char * extPort, const char * inPort, const char * inClient, const char * desc, const char * proto, const char * remoteHost, const char * leaseDuration); /* UPNP_DeletePortMapping() * Use same argument values as what was used for AddPortMapping(). * remoteHost is usually NULL because IGD don't support it. * Return Values : * 0 : SUCCESS * NON ZERO : error. Either an UPnP error code or an undefined error. * * List of possible UPnP errors for DeletePortMapping : * 402 Invalid Args - See UPnP Device Architecture section on Control. * 606 Action not authorized - The action requested REQUIRES authorization * and the sender was not authorized. * 714 NoSuchEntryInArray - The specified value does not exist in the array */ LIBSPEC int UPNP_DeletePortMapping(const char * controlURL, const char * servicetype, const char * extPort, const char * proto, const char * remoteHost); /* UPNP_GetPortMappingNumberOfEntries() * not supported by all routers */ LIBSPEC int UPNP_GetPortMappingNumberOfEntries(const char* controlURL, const char* servicetype, unsigned int * num); /* UPNP_GetSpecificPortMappingEntry() * retrieves an existing port mapping * params : * in extPort * in proto * in remoteHost * out intClient (16 bytes) * out intPort (6 bytes) * out desc (80 bytes) * out enabled (4 bytes) * out leaseDuration (16 bytes) * * return value : * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR * or a UPnP Error Code. * * List of possible UPnP errors for _GetSpecificPortMappingEntry : * 402 Invalid Args - See UPnP Device Architecture section on Control. * 501 Action Failed - See UPnP Device Architecture section on Control. * 606 Action not authorized - The action requested REQUIRES authorization * and the sender was not authorized. * 714 NoSuchEntryInArray - The specified value does not exist in the array. */ LIBSPEC int UPNP_GetSpecificPortMappingEntry(const char * controlURL, const char * servicetype, const char * extPort, const char * proto, const char * remoteHost, char * intClient, char * intPort, char * desc, char * enabled, char * leaseDuration); /* UPNP_GetGenericPortMappingEntry() * params : * in index * out extPort (6 bytes) * out intClient (16 bytes) * out intPort (6 bytes) * out protocol (4 bytes) * out desc (80 bytes) * out enabled (4 bytes) * out rHost (64 bytes) * out duration (16 bytes) * * return value : * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR * or a UPnP Error Code. * * Possible UPNP Error codes : * 402 Invalid Args - See UPnP Device Architecture section on Control. * 606 Action not authorized - The action requested REQUIRES authorization * and the sender was not authorized. * 713 SpecifiedArrayIndexInvalid - The specified array index is out of bounds */ LIBSPEC int UPNP_GetGenericPortMappingEntry(const char * controlURL, const char * servicetype, const char * index, char * extPort, char * intClient, char * intPort, char * protocol, char * desc, char * enabled, char * rHost, char * duration); /* UPNP_GetListOfPortMappings() Available in IGD v2 * * * Possible UPNP Error codes : * 606 Action not Authorized * 730 PortMappingNotFound - no port mapping is found in the specified range. * 733 InconsistantParameters - NewStartPort and NewEndPort values are not * consistent. */ LIBSPEC int UPNP_GetListOfPortMappings(const char * controlURL, const char * servicetype, const char * startPort, const char * endPort, const char * protocol, const char * numberOfPorts, struct PortMappingParserData * data); /* IGD:2, functions for service WANIPv6FirewallControl:1 */ LIBSPEC int UPNP_GetFirewallStatus(const char * controlURL, const char * servicetype, int * firewallEnabled, int * inboundPinholeAllowed); LIBSPEC int UPNP_GetOutboundPinholeTimeout(const char * controlURL, const char * servicetype, const char * remoteHost, const char * remotePort, const char * intClient, const char * intPort, const char * proto, int * opTimeout); LIBSPEC int UPNP_AddPinhole(const char * controlURL, const char * servicetype, const char * remoteHost, const char * remotePort, const char * intClient, const char * intPort, const char * proto, const char * leaseTime, char * uniqueID); LIBSPEC int UPNP_UpdatePinhole(const char * controlURL, const char * servicetype, const char * uniqueID, const char * leaseTime); LIBSPEC int UPNP_DeletePinhole(const char * controlURL, const char * servicetype, const char * uniqueID); LIBSPEC int UPNP_CheckPinholeWorking(const char * controlURL, const char * servicetype, const char * uniqueID, int * isWorking); LIBSPEC int UPNP_GetPinholePackets(const char * controlURL, const char * servicetype, const char * uniqueID, int * packets); #ifdef __cplusplus } #endif #endif transmission-2.92/third-party/miniupnp/PaxHeaders.4960/README0000644000000000000000000000013212442116703020644 xustar0030 mtime=1418239427.483328805 30 atime=1418239427.483328805 30 ctime=1457295918.949790046 transmission-2.92/third-party/miniupnp/README0000644000175000017500000000413112442116703022270 0ustar00mikedldmikedld00000000000000Project: miniupnp Project web page: http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ github: https://github.com/miniupnp/miniupnp freecode: http://freecode.com/projects/miniupnp Author: Thomas Bernard Copyright (c) 2005-2012 Thomas Bernard This software is subject to the conditions detailed in the LICENSE file provided within this distribution. For the comfort of Win32 users, bsdqueue.h is included in the distribution. Its licence is included in the header of the file. bsdqueue.h is a copy of the sys/queue.h of an OpenBSD system. * miniUPnP Client - miniUPnPc * To compile, simply run 'gmake' (could be 'make' on your system). Under win32, to compile with MinGW, type "mingw32make.bat". MS Visual C solution and project files are supplied in the msvc/ subdirectory. The compilation is known to work under linux, FreeBSD, OpenBSD, MacOS X, AmigaOS and cygwin. The official AmigaOS4.1 SDK was used for AmigaOS4 and GeekGadgets for AmigaOS3. upx (http://upx.sourceforge.net) is used to compress the win32 .exe files. To install the library and headers on the system use : > su > make install > exit alternatively, to install into a specific location, use : > INSTALLPREFIX=/usr/local make install upnpc.c is a sample client using the libminiupnpc. To use the libminiupnpc in your application, link it with libminiupnpc.a (or .so) and use the following functions found in miniupnpc.h, upnpcommands.h and miniwget.h : - upnpDiscover() - miniwget() - parserootdesc() - GetUPNPUrls() - UPNP_* (calling UPNP methods) Note : use #include etc... for the includes and -lminiupnpc for the link Discovery process is speeded up when MiniSSDPd is running on the machine. * Python module * you can build a python module with 'make pythonmodule' and install it with 'make installpythonmodule'. setup.py (and setupmingw32.py) are included in the distribution. Feel free to contact me if you have any problem : e-mail : miniupnp@free.fr If you are using libminiupnpc in your application, please send me an email ! For any question, you can use the web forum : http://miniupnp.tuxfamily.org/forum/ transmission-2.92/third-party/miniupnp/PaxHeaders.4960/minixml.h0000644000000000000000000000013212442116703021612 xustar0030 mtime=1418239427.484328822 30 atime=1418239427.484328822 30 ctime=1457295918.913789433 transmission-2.92/third-party/miniupnp/minixml.h0000644000175000017500000000223312442116703023237 0ustar00mikedldmikedld00000000000000/* $Id: minixml.h,v 1.7 2012/09/27 15:42:10 nanard Exp $ */ /* minimal xml parser * * Project : miniupnp * Website : http://miniupnp.free.fr/ * Author : Thomas Bernard * Copyright (c) 2005 Thomas Bernard * This software is subject to the conditions detailed in the * LICENCE file provided in this distribution. * */ #ifndef MINIXML_H_INCLUDED #define MINIXML_H_INCLUDED #define IS_WHITE_SPACE(c) ((c==' ') || (c=='\t') || (c=='\r') || (c=='\n')) /* if a callback function pointer is set to NULL, * the function is not called */ struct xmlparser { const char *xmlstart; const char *xmlend; const char *xml; /* pointer to current character */ int xmlsize; void * data; void (*starteltfunc) (void *, const char *, int); void (*endeltfunc) (void *, const char *, int); void (*datafunc) (void *, const char *, int); void (*attfunc) (void *, const char *, int, const char *, int); }; /* parsexml() * the xmlparser structure must be initialized before the call * the following structure members have to be initialized : * xmlstart, xmlsize, data, *func * xml is for internal usage, xmlend is computed automatically */ void parsexml(struct xmlparser *); #endif transmission-2.92/third-party/miniupnp/PaxHeaders.4960/minissdpc.c0000644000000000000000000000013212442116703022121 xustar0030 mtime=1418239427.485328839 30 atime=1418239427.485328839 30 ctime=1457295918.978790539 transmission-2.92/third-party/miniupnp/minissdpc.c0000644000175000017500000000612112442116703023546 0ustar00mikedldmikedld00000000000000/* $Id: minissdpc.c,v 1.16 2012/03/05 19:42:46 nanard Exp $ */ /* Project : miniupnp * Web : http://miniupnp.free.fr/ * Author : Thomas BERNARD * copyright (c) 2005-2012 Thomas Bernard * This software is subjet to the conditions detailed in the * provided LICENCE file. */ /*#include */ #include #include #include #include #include #if defined(_WIN32) || defined(__amigaos__) || defined(__amigaos4__) #ifdef _WIN32 #include #include #include #include #include #endif #if defined(__amigaos__) || defined(__amigaos4__) #include #endif #if defined(__amigaos__) #define uint16_t unsigned short #endif /* Hack */ #define UNIX_PATH_LEN 108 struct sockaddr_un { uint16_t sun_family; char sun_path[UNIX_PATH_LEN]; }; #else #include #include #endif #include "minissdpc.h" #include "miniupnpc.h" #include "codelength.h" struct UPNPDev * getDevicesFromMiniSSDPD(const char * devtype, const char * socketpath) { struct UPNPDev * tmp; struct UPNPDev * devlist = NULL; unsigned char buffer[2048]; ssize_t n; unsigned char * p; unsigned char * url; unsigned int i; unsigned int urlsize, stsize, usnsize, l; int s; struct sockaddr_un addr; s = socket(AF_UNIX, SOCK_STREAM, 0); if(s < 0) { /*syslog(LOG_ERR, "socket(unix): %m");*/ perror("socket(unix)"); return NULL; } addr.sun_family = AF_UNIX; strncpy(addr.sun_path, socketpath, sizeof(addr.sun_path)); /* TODO : check if we need to handle the EINTR */ if(connect(s, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) < 0) { /*syslog(LOG_WARNING, "connect(\"%s\"): %m", socketpath);*/ close(s); return NULL; } stsize = strlen(devtype); buffer[0] = 1; /* request type 1 : request devices/services by type */ p = buffer + 1; l = stsize; CODELENGTH(l, p); if(p + stsize > buffer + sizeof(buffer)) { /* devtype is too long ! */ close(s); return NULL; } memcpy(p, devtype, stsize); p += stsize; if(write(s, buffer, p - buffer) < 0) { /*syslog(LOG_ERR, "write(): %m");*/ perror("minissdpc.c: write()"); close(s); return NULL; } n = read(s, buffer, sizeof(buffer)); if(n<=0) { perror("minissdpc.c: read()"); close(s); return NULL; } p = buffer + 1; for(i = 0; i < buffer[0]; i++) { if(p+2>=buffer+sizeof(buffer)) break; DECODELENGTH(urlsize, p); if(p+urlsize+2>=buffer+sizeof(buffer)) break; url = p; p += urlsize; DECODELENGTH(stsize, p); if(p+stsize+2>=buffer+sizeof(buffer)) break; tmp = (struct UPNPDev *)malloc(sizeof(struct UPNPDev)+urlsize+stsize); tmp->pNext = devlist; tmp->descURL = tmp->buffer; tmp->st = tmp->buffer + 1 + urlsize; memcpy(tmp->buffer, url, urlsize); tmp->buffer[urlsize] = '\0'; memcpy(tmp->buffer + urlsize + 1, p, stsize); p += stsize; tmp->buffer[urlsize+1+stsize] = '\0'; devlist = tmp; /* added for compatibility with recent versions of MiniSSDPd * >= 2007/12/19 */ DECODELENGTH(usnsize, p); p += usnsize; if(p>buffer + sizeof(buffer)) break; } close(s); return devlist; } transmission-2.92/third-party/miniupnp/PaxHeaders.4960/minixml.c0000644000000000000000000000013212442116703021605 xustar0030 mtime=1418239427.484328822 30 atime=1418239427.483328805 30 ctime=1457295918.996790845 transmission-2.92/third-party/miniupnp/minixml.c0000644000175000017500000001300412442116703023230 0ustar00mikedldmikedld00000000000000/* $Id: minixml.c,v 1.11 2014/02/03 15:54:12 nanard Exp $ */ /* minixml.c : the minimum size a xml parser can be ! */ /* Project : miniupnp * webpage: http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * Author : Thomas Bernard Copyright (c) 2005-2014, Thomas BERNARD 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. * The name of the author may not 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 "minixml.h" /* parseatt : used to parse the argument list * return 0 (false) in case of success and -1 (true) if the end * of the xmlbuffer is reached. */ static int parseatt(struct xmlparser * p) { const char * attname; int attnamelen; const char * attvalue; int attvaluelen; while(p->xml < p->xmlend) { if(*p->xml=='/' || *p->xml=='>') return 0; if( !IS_WHITE_SPACE(*p->xml) ) { char sep; attname = p->xml; attnamelen = 0; while(*p->xml!='=' && !IS_WHITE_SPACE(*p->xml) ) { attnamelen++; p->xml++; if(p->xml >= p->xmlend) return -1; } while(*(p->xml++) != '=') { if(p->xml >= p->xmlend) return -1; } while(IS_WHITE_SPACE(*p->xml)) { p->xml++; if(p->xml >= p->xmlend) return -1; } sep = *p->xml; if(sep=='\'' || sep=='\"') { p->xml++; if(p->xml >= p->xmlend) return -1; attvalue = p->xml; attvaluelen = 0; while(*p->xml != sep) { attvaluelen++; p->xml++; if(p->xml >= p->xmlend) return -1; } } else { attvalue = p->xml; attvaluelen = 0; while( !IS_WHITE_SPACE(*p->xml) && *p->xml != '>' && *p->xml != '/') { attvaluelen++; p->xml++; if(p->xml >= p->xmlend) return -1; } } /*printf("%.*s='%.*s'\n", attnamelen, attname, attvaluelen, attvalue);*/ if(p->attfunc) p->attfunc(p->data, attname, attnamelen, attvalue, attvaluelen); } p->xml++; } return -1; } /* parseelt parse the xml stream and * call the callback functions when needed... */ static void parseelt(struct xmlparser * p) { int i; const char * elementname; while(p->xml < (p->xmlend - 1)) { if((p->xml + 4) <= p->xmlend && (0 == memcmp(p->xml, "", 3) != 0); p->xml += 3; } else if((p->xml)[0]=='<' && (p->xml)[1]!='?') { i = 0; elementname = ++p->xml; while( !IS_WHITE_SPACE(*p->xml) && (*p->xml!='>') && (*p->xml!='/') ) { i++; p->xml++; if (p->xml >= p->xmlend) return; /* to ignore namespace : */ if(*p->xml==':') { i = 0; elementname = ++p->xml; } } if(i>0) { if(p->starteltfunc) p->starteltfunc(p->data, elementname, i); if(parseatt(p)) return; if(*p->xml!='/') { const char * data; i = 0; data = ++p->xml; if (p->xml >= p->xmlend) return; while( IS_WHITE_SPACE(*p->xml) ) { i++; p->xml++; if (p->xml >= p->xmlend) return; } if(memcmp(p->xml, "xml += 9; data = p->xml; i = 0; while(memcmp(p->xml, "]]>", 3) != 0) { i++; p->xml++; if ((p->xml + 3) >= p->xmlend) return; } if(i>0 && p->datafunc) p->datafunc(p->data, data, i); while(*p->xml!='<') { p->xml++; if (p->xml >= p->xmlend) return; } } else { while(*p->xml!='<') { i++; p->xml++; if ((p->xml + 1) >= p->xmlend) return; } if(i>0 && p->datafunc && *(p->xml + 1) == '/') p->datafunc(p->data, data, i); } } } else if(*p->xml == '/') { i = 0; elementname = ++p->xml; if (p->xml >= p->xmlend) return; while((*p->xml != '>')) { i++; p->xml++; if (p->xml >= p->xmlend) return; } if(p->endeltfunc) p->endeltfunc(p->data, elementname, i); p->xml++; } } else { p->xml++; } } } /* the parser must be initialized before calling this function */ void parsexml(struct xmlparser * parser) { parser->xml = parser->xmlstart; parser->xmlend = parser->xmlstart + parser->xmlsize; parseelt(parser); } transmission-2.92/third-party/miniupnp/PaxHeaders.4960/miniwget.h0000644000000000000000000000013212442116703021760 xustar0030 mtime=1418239427.479328736 30 atime=1418239427.479328736 30 ctime=1457295918.908789348 transmission-2.92/third-party/miniupnp/miniwget.h0000644000175000017500000000127412442116703023411 0ustar00mikedldmikedld00000000000000/* $Id: miniwget.h,v 1.8 2012/09/27 15:42:10 nanard Exp $ */ /* Project : miniupnp * Author : Thomas Bernard * Copyright (c) 2005-2012 Thomas Bernard * This software is subject to the conditions detailed in the * LICENCE file provided in this distribution. * */ #ifndef MINIWGET_H_INCLUDED #define MINIWGET_H_INCLUDED #include "declspec.h" #ifdef __cplusplus extern "C" { #endif LIBSPEC void * getHTTPResponse(int s, int * size); LIBSPEC void * miniwget(const char *, int *, unsigned int); LIBSPEC void * miniwget_getaddr(const char *, int *, char *, int, unsigned int); int parseURL(const char *, char *, unsigned short *, char * *, unsigned int *); #ifdef __cplusplus } #endif #endif transmission-2.92/third-party/miniupnp/PaxHeaders.4960/igd_desc_parse.c0000644000000000000000000000013212442116703023063 xustar0030 mtime=1418239427.480328753 30 atime=1418239427.480328753 30 ctime=1457295918.962790266 transmission-2.92/third-party/miniupnp/igd_desc_parse.c0000644000175000017500000001101212442116703024503 0ustar00mikedldmikedld00000000000000/* $Id: igd_desc_parse.c,v 1.14 2011/04/11 09:19:24 nanard Exp $ */ /* Project : miniupnp * http://miniupnp.free.fr/ * Author : Thomas Bernard * Copyright (c) 2005-2010 Thomas Bernard * This software is subject to the conditions detailed in the * LICENCE file provided in this distribution. */ #include "igd_desc_parse.h" #include #include /* Start element handler : * update nesting level counter and copy element name */ void IGDstartelt(void * d, const char * name, int l) { struct IGDdatas * datas = (struct IGDdatas *)d; memcpy( datas->cureltname, name, l); datas->cureltname[l] = '\0'; datas->level++; if( (l==7) && !memcmp(name, "service", l) ) { datas->tmp.controlurl[0] = '\0'; datas->tmp.eventsuburl[0] = '\0'; datas->tmp.scpdurl[0] = '\0'; datas->tmp.servicetype[0] = '\0'; } } /* End element handler : * update nesting level counter and update parser state if * service element is parsed */ void IGDendelt(void * d, const char * name, int l) { struct IGDdatas * datas = (struct IGDdatas *)d; datas->level--; /*printf("endelt %2d %.*s\n", datas->level, l, name);*/ if( (l==7) && !memcmp(name, "service", l) ) { /* if( datas->state < 1 && !strcmp(datas->servicetype, // "urn:schemas-upnp-org:service:WANIPConnection:1") ) "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1")) datas->state ++; */ if(0==strcmp(datas->tmp.servicetype, "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1")) { memcpy(&datas->CIF, &datas->tmp, sizeof(struct IGDdatas_service)); } else if(0==strcmp(datas->tmp.servicetype, "urn:schemas-upnp-org:service:WANIPv6FirewallControl:1")) { memcpy(&datas->IPv6FC, &datas->tmp, sizeof(struct IGDdatas_service)); } else if(0==strcmp(datas->tmp.servicetype, "urn:schemas-upnp-org:service:WANIPConnection:1") || 0==strcmp(datas->tmp.servicetype, "urn:schemas-upnp-org:service:WANPPPConnection:1") ) { if(datas->first.servicetype[0] == '\0') { memcpy(&datas->first, &datas->tmp, sizeof(struct IGDdatas_service)); } else { memcpy(&datas->second, &datas->tmp, sizeof(struct IGDdatas_service)); } } } } /* Data handler : * copy data depending on the current element name and state */ void IGDdata(void * d, const char * data, int l) { struct IGDdatas * datas = (struct IGDdatas *)d; char * dstmember = 0; /*printf("%2d %s : %.*s\n", datas->level, datas->cureltname, l, data); */ if( !strcmp(datas->cureltname, "URLBase") ) dstmember = datas->urlbase; else if( !strcmp(datas->cureltname, "presentationURL") ) dstmember = datas->presentationurl; else if( !strcmp(datas->cureltname, "serviceType") ) dstmember = datas->tmp.servicetype; else if( !strcmp(datas->cureltname, "controlURL") ) dstmember = datas->tmp.controlurl; else if( !strcmp(datas->cureltname, "eventSubURL") ) dstmember = datas->tmp.eventsuburl; else if( !strcmp(datas->cureltname, "SCPDURL") ) dstmember = datas->tmp.scpdurl; /* else if( !strcmp(datas->cureltname, "deviceType") ) dstmember = datas->devicetype_tmp;*/ if(dstmember) { if(l>=MINIUPNPC_URL_MAXSIZE) l = MINIUPNPC_URL_MAXSIZE-1; memcpy(dstmember, data, l); dstmember[l] = '\0'; } } void printIGD(struct IGDdatas * d) { printf("urlbase = '%s'\n", d->urlbase); printf("WAN Device (Common interface config) :\n"); /*printf(" deviceType = '%s'\n", d->CIF.devicetype);*/ printf(" serviceType = '%s'\n", d->CIF.servicetype); printf(" controlURL = '%s'\n", d->CIF.controlurl); printf(" eventSubURL = '%s'\n", d->CIF.eventsuburl); printf(" SCPDURL = '%s'\n", d->CIF.scpdurl); printf("primary WAN Connection Device (IP or PPP Connection):\n"); /*printf(" deviceType = '%s'\n", d->first.devicetype);*/ printf(" servicetype = '%s'\n", d->first.servicetype); printf(" controlURL = '%s'\n", d->first.controlurl); printf(" eventSubURL = '%s'\n", d->first.eventsuburl); printf(" SCPDURL = '%s'\n", d->first.scpdurl); printf("secondary WAN Connection Device (IP or PPP Connection):\n"); /*printf(" deviceType = '%s'\n", d->second.devicetype);*/ printf(" servicetype = '%s'\n", d->second.servicetype); printf(" controlURL = '%s'\n", d->second.controlurl); printf(" eventSubURL = '%s'\n", d->second.eventsuburl); printf(" SCPDURL = '%s'\n", d->second.scpdurl); printf("WAN IPv6 Firewall Control :\n"); /*printf(" deviceType = '%s'\n", d->IPv6FC.devicetype);*/ printf(" servicetype = '%s'\n", d->IPv6FC.servicetype); printf(" controlURL = '%s'\n", d->IPv6FC.controlurl); printf(" eventSubURL = '%s'\n", d->IPv6FC.eventsuburl); printf(" SCPDURL = '%s'\n", d->IPv6FC.scpdurl); } transmission-2.92/third-party/miniupnp/PaxHeaders.4960/minissdpc.h0000644000000000000000000000013212442116703022126 xustar0030 mtime=1418239427.475328667 30 atime=1418239427.475328667 30 ctime=1457295918.895789127 transmission-2.92/third-party/miniupnp/minissdpc.h0000644000175000017500000000074612442116703023562 0ustar00mikedldmikedld00000000000000/* $Id: minissdpc.h,v 1.2 2012/09/27 15:42:10 nanard Exp $ */ /* Project: miniupnp * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * Author: Thomas Bernard * Copyright (c) 2005-2007 Thomas Bernard * This software is subjects to the conditions detailed * in the LICENCE file provided within this distribution */ #ifndef MINISSDPC_H_INCLUDED #define MINISSDPC_H_INCLUDED struct UPNPDev * getDevicesFromMiniSSDPD(const char * devtype, const char * socketpath); #endif transmission-2.92/third-party/miniupnp/PaxHeaders.4960/receivedata.h0000644000000000000000000000013212442116703022411 xustar0030 mtime=1418239427.477328702 30 atime=1418239427.477328702 30 ctime=1457295918.926789654 transmission-2.92/third-party/miniupnp/receivedata.h0000644000175000017500000000131012442116703024031 0ustar00mikedldmikedld00000000000000/* $Id: receivedata.h,v 1.4 2012/09/27 15:42:10 nanard Exp $ */ /* Project: miniupnp * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * Author: Thomas Bernard * Copyright (c) 2011-2012 Thomas Bernard * This software is subjects to the conditions detailed * in the LICENCE file provided within this distribution */ #ifndef RECEIVEDATA_H_INCLUDED #define RECEIVEDATA_H_INCLUDED /* Reads data from the specified socket. * Returns the number of bytes read if successful, zero if no bytes were * read or if we timed out. Returns negative if there was an error. */ int receivedata(int socket, char * data, int length, int timeout, unsigned int * scope_id); #endif transmission-2.92/third-party/miniupnp/PaxHeaders.4960/miniupnpcstrings.h.in0000644000000000000000000000013212442116703024156 xustar0030 mtime=1418239427.479328736 30 atime=1418239427.479328736 30 ctime=1457295919.028791389 transmission-2.92/third-party/miniupnp/miniupnpcstrings.h.in0000644000175000017500000000075712442116703025614 0ustar00mikedldmikedld00000000000000/* $Id: miniupnpcstrings.h.in,v 1.5 2012/10/16 16:48:26 nanard Exp $ */ /* Project: miniupnp * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * Author: Thomas Bernard * Copyright (c) 2005-2011 Thomas Bernard * This software is subjects to the conditions detailed * in the LICENCE file provided within this distribution */ #ifndef MINIUPNPCSTRINGS_H_INCLUDED #define MINIUPNPCSTRINGS_H_INCLUDED #define OS_STRING "OS/version" #define MINIUPNPC_VERSION_STRING "version" #endif transmission-2.92/third-party/miniupnp/PaxHeaders.4960/Makefile.in0000644000000000000000000000013212667111011022025 xustar0030 mtime=1457295881.036145368 30 atime=1457295881.036145368 30 ctime=1457295918.943789943 transmission-2.92/third-party/miniupnp/Makefile.in0000644000175000017500000005375312667111011023467 0ustar00mikedldmikedld00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = third-party/miniupnp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx-pthread.m4 \ $(top_srcdir)/m4/glib-gettext.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libminiupnp_a_AR = $(AR) $(ARFLAGS) libminiupnp_a_LIBADD = am_libminiupnp_a_OBJECTS = connecthostport.$(OBJEXT) \ igd_desc_parse.$(OBJEXT) minisoap.$(OBJEXT) \ minissdpc.$(OBJEXT) miniupnpc.$(OBJEXT) miniwget.$(OBJEXT) \ minixml.$(OBJEXT) portlistingparse.$(OBJEXT) \ receivedata.$(OBJEXT) upnpcommands.$(OBJEXT) \ upnpreplyparse.$(OBJEXT) libminiupnp_a_OBJECTS = $(am_libminiupnp_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libminiupnp_a_SOURCES) DIST_SOURCES = $(libminiupnp_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTO_CFLAGS = @CRYPTO_CFLAGS@ CRYPTO_LIBS = @CRYPTO_LIBS@ CRYPTO_PKG = @CRYPTO_PKG@ CURL_MINIMUM = @CURL_MINIMUM@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYASSL_CFLAGS = @CYASSL_CFLAGS@ CYASSL_LIBS = @CYASSL_LIBS@ CYASSL_MINIMUM = @CYASSL_MINIMUM@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DHT_CFLAGS = @DHT_CFLAGS@ DHT_LIBS = @DHT_LIBS@ DHT_LIBS_QT = @DHT_LIBS_QT@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_MINIMUM = @GIO_MINIMUM@ GLIB_MINIMUM = @GLIB_MINIMUM@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MINIMUM = @GTK_MINIMUM@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAPPINDICATOR_CFLAGS = @LIBAPPINDICATOR_CFLAGS@ LIBAPPINDICATOR_LIBS = @LIBAPPINDICATOR_LIBS@ LIBAPPINDICATOR_MINIMUM = @LIBAPPINDICATOR_MINIMUM@ LIBB64_CFLAGS = @LIBB64_CFLAGS@ LIBB64_LIBS = @LIBB64_LIBS@ LIBB64_LIBS_QT = @LIBB64_LIBS_QT@ LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ LIBEVENT_CFLAGS = @LIBEVENT_CFLAGS@ LIBEVENT_LIBS = @LIBEVENT_LIBS@ LIBEVENT_MINIMUM = @LIBEVENT_MINIMUM@ LIBM = @LIBM@ LIBNATPMP_CFLAGS = @LIBNATPMP_CFLAGS@ LIBNATPMP_LIBS = @LIBNATPMP_LIBS@ LIBNATPMP_LIBS_QT = @LIBNATPMP_LIBS_QT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LIBUPNP_LIBS_QT = @LIBUPNP_LIBS_QT@ LIBUTP_CFLAGS = @LIBUTP_CFLAGS@ LIBUTP_LIBS = @LIBUTP_LIBS@ LIBUTP_LIBS_QT = @LIBUTP_LIBS_QT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENSSL_CFLAGS = @OPENSSL_CFLAGS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OPENSSL_MINIMUM = @OPENSSL_MINIMUM@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PEERID_PREFIX = @PEERID_PREFIX@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POLARSSL_MINIMUM = @POLARSSL_MINIMUM@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SYSTEMD_DAEMON_CFLAGS = @SYSTEMD_DAEMON_CFLAGS@ SYSTEMD_DAEMON_LIBS = @SYSTEMD_DAEMON_LIBS@ USERAGENT_PREFIX = @USERAGENT_PREFIX@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ WOLFSSL_CFLAGS = @WOLFSSL_CFLAGS@ WOLFSSL_LIBS = @WOLFSSL_LIBS@ XGETTEXT = @XGETTEXT@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ ZLIB_MINIMUM = @ZLIB_MINIMUM@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ transmissionlocaledir = @transmissionlocaledir@ noinst_LIBRARIES = libminiupnp.a AM_CFLAGS = @PTHREAD_CFLAGS@ -DNDEBUG -D_GNU_SOURCE libminiupnp_a_SOURCES = \ connecthostport.c \ igd_desc_parse.c \ minisoap.c \ minissdpc.c \ miniupnpc.c \ miniwget.c \ minixml.c \ portlistingparse.c \ receivedata.c \ upnpcommands.c \ upnpreplyparse.c noinst_HEADERS = \ bsdqueue.h \ codelength.h \ connecthostport.h \ declspec.h \ igd_desc_parse.h \ minisoap.h \ minissdpc.h \ miniupnpc.h \ miniupnpctypes.h \ miniwget.h \ minixml.h \ portlistingparse.h \ receivedata.h \ upnpcommands.h \ upnpreplyparse.h EXTRA_DIST = \ README \ LICENSE \ miniupnpcstrings.h.in \ updateminiupnpcstrings.sh BUILT_SOURCES = \ miniupnpcstrings.h DISTCLEANFILES = $(builddir)/miniupnpcstrings.h all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu third-party/miniupnp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu third-party/miniupnp/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libminiupnp.a: $(libminiupnp_a_OBJECTS) $(libminiupnp_a_DEPENDENCIES) $(EXTRA_libminiupnp_a_DEPENDENCIES) $(AM_V_at)-rm -f libminiupnp.a $(AM_V_AR)$(libminiupnp_a_AR) libminiupnp.a $(libminiupnp_a_OBJECTS) $(libminiupnp_a_LIBADD) $(AM_V_at)$(RANLIB) libminiupnp.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connecthostport.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/igd_desc_parse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minisoap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minissdpc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/miniupnpc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/miniwget.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minixml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/portlistingparse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/receivedata.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upnpcommands.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upnpreplyparse.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile miniupnpcstrings.h: Makefile $(srcdir)/updateminiupnpcstrings.sh $(srcdir)/VERSION $(srcdir)/miniupnpcstrings.h.in $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: transmission-2.92/third-party/miniupnp/PaxHeaders.4960/connecthostport.h0000644000000000000000000000012712442116703023375 xustar0029 mtime=1418239427.48132877 29 atime=1418239427.48132877 29 ctime=1457295918.87478877 transmission-2.92/third-party/miniupnp/connecthostport.h0000644000175000017500000000111712442116703025016 0ustar00mikedldmikedld00000000000000/* $Id: connecthostport.h,v 1.3 2012/09/27 15:42:10 nanard Exp $ */ /* Project: miniupnp * http://miniupnp.free.fr/ * Author: Thomas Bernard * Copyright (c) 2010-2012 Thomas Bernard * This software is subjects to the conditions detailed * in the LICENCE file provided within this distribution */ #ifndef CONNECTHOSTPORT_H_INCLUDED #define CONNECTHOSTPORT_H_INCLUDED /* connecthostport() * return a socket connected (TCP) to the host and port * or -1 in case of error */ int connecthostport(const char * host, unsigned short port, unsigned int scope_id); #endif transmission-2.92/third-party/miniupnp/PaxHeaders.4960/connecthostport.c0000644000000000000000000000013212442116703023364 xustar0030 mtime=1418239427.480328753 30 atime=1418239427.480328753 30 ctime=1457295918.957790182 transmission-2.92/third-party/miniupnp/connecthostport.c0000644000175000017500000001515412442116703025017 0ustar00mikedldmikedld00000000000000/* $Id: connecthostport.c,v 1.13 2014/03/31 12:36:36 nanard Exp $ */ /* Project : miniupnp * Author : Thomas Bernard * Copyright (c) 2010-2014 Thomas Bernard * This software is subject to the conditions detailed in the * LICENCE file provided in this distribution. */ /* use getaddrinfo() or gethostbyname() * uncomment the following line in order to use gethostbyname() */ #ifdef NO_GETADDRINFO #define USE_GETHOSTBYNAME #endif #include #include #ifdef _WIN32 #include #include #include #define MAXHOSTNAMELEN 64 #define snprintf _snprintf #define herror #define socklen_t int #else /* #ifdef _WIN32 */ #include #include #include #include #define closesocket close #include #include /* defining MINIUPNPC_IGNORE_EINTR enable the ignore of interruptions * during the connect() call */ #define MINIUPNPC_IGNORE_EINTR #ifndef USE_GETHOSTBYNAME #include #include #include #endif /* #ifndef USE_GETHOSTBYNAME */ #endif /* #else _WIN32 */ /* definition of PRINT_SOCKET_ERROR */ #ifdef _WIN32 #define PRINT_SOCKET_ERROR(x) printf("Socket error: %s, %d\n", x, WSAGetLastError()); #else #define PRINT_SOCKET_ERROR(x) perror(x) #endif #if defined(__amigaos__) || defined(__amigaos4__) #define herror(A) printf("%s\n", A) #endif #include "connecthostport.h" #ifndef MAXHOSTNAMELEN #define MAXHOSTNAMELEN 64 #endif /* connecthostport() * return a socket connected (TCP) to the host and port * or -1 in case of error */ int connecthostport(const char * host, unsigned short port, unsigned int scope_id) { int s, n; #ifdef USE_GETHOSTBYNAME struct sockaddr_in dest; struct hostent *hp; #else /* #ifdef USE_GETHOSTBYNAME */ char tmp_host[MAXHOSTNAMELEN+1]; char port_str[8]; struct addrinfo *ai, *p; struct addrinfo hints; #endif /* #ifdef USE_GETHOSTBYNAME */ #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT struct timeval timeout; #endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */ #ifdef USE_GETHOSTBYNAME hp = gethostbyname(host); if(hp == NULL) { herror(host); return -1; } memcpy(&dest.sin_addr, hp->h_addr, sizeof(dest.sin_addr)); memset(dest.sin_zero, 0, sizeof(dest.sin_zero)); s = socket(PF_INET, SOCK_STREAM, 0); if(s < 0) { PRINT_SOCKET_ERROR("socket"); return -1; } #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT /* setting a 3 seconds timeout for the connect() call */ timeout.tv_sec = 3; timeout.tv_usec = 0; if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval)) < 0) { PRINT_SOCKET_ERROR("setsockopt"); } timeout.tv_sec = 3; timeout.tv_usec = 0; if(setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(struct timeval)) < 0) { PRINT_SOCKET_ERROR("setsockopt"); } #endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */ dest.sin_family = AF_INET; dest.sin_port = htons(port); n = connect(s, (struct sockaddr *)&dest, sizeof(struct sockaddr_in)); #ifdef MINIUPNPC_IGNORE_EINTR /* EINTR The system call was interrupted by a signal that was caught * EINPROGRESS The socket is nonblocking and the connection cannot * be completed immediately. */ while(n < 0 && (errno == EINTR || errno = EINPROGRESS)) { socklen_t len; fd_set wset; int err; FD_ZERO(&wset); FD_SET(s, &wset); if((n = select(s + 1, NULL, &wset, NULL, NULL)) == -1 && errno == EINTR) continue; /*len = 0;*/ /*n = getpeername(s, NULL, &len);*/ len = sizeof(err); if(getsockopt(s, SOL_SOCKET, SO_ERROR, &err, &len) < 0) { PRINT_SOCKET_ERROR("getsockopt"); closesocket(s); return -1; } if(err != 0) { errno = err; n = -1; } } #endif /* #ifdef MINIUPNPC_IGNORE_EINTR */ if(n<0) { PRINT_SOCKET_ERROR("connect"); closesocket(s); return -1; } #else /* #ifdef USE_GETHOSTBYNAME */ /* use getaddrinfo() instead of gethostbyname() */ memset(&hints, 0, sizeof(hints)); /* hints.ai_flags = AI_ADDRCONFIG; */ #ifdef AI_NUMERICSERV hints.ai_flags = AI_NUMERICSERV; #endif hints.ai_socktype = SOCK_STREAM; hints.ai_family = AF_UNSPEC; /* AF_INET, AF_INET6 or AF_UNSPEC */ /* hints.ai_protocol = IPPROTO_TCP; */ snprintf(port_str, sizeof(port_str), "%hu", port); if(host[0] == '[') { /* literal ip v6 address */ int i, j; for(i = 0, j = 1; host[j] && (host[j] != ']') && i < MAXHOSTNAMELEN; i++, j++) { tmp_host[i] = host[j]; if(0 == memcmp(host+j, "%25", 3)) /* %25 is just url encoding for '%' */ j+=2; /* skip "25" */ } tmp_host[i] = '\0'; } else { strncpy(tmp_host, host, MAXHOSTNAMELEN); } tmp_host[MAXHOSTNAMELEN] = '\0'; n = getaddrinfo(tmp_host, port_str, &hints, &ai); if(n != 0) { #ifdef _WIN32 fprintf(stderr, "getaddrinfo() error : %d\n", n); #else fprintf(stderr, "getaddrinfo() error : %s\n", gai_strerror(n)); #endif return -1; } s = -1; for(p = ai; p; p = p->ai_next) { s = socket(p->ai_family, p->ai_socktype, p->ai_protocol); if(s < 0) continue; if(p->ai_addr->sa_family == AF_INET6 && scope_id > 0) { struct sockaddr_in6 * addr6 = (struct sockaddr_in6 *)p->ai_addr; addr6->sin6_scope_id = scope_id; } #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT /* setting a 3 seconds timeout for the connect() call */ timeout.tv_sec = 3; timeout.tv_usec = 0; if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval)) < 0) { PRINT_SOCKET_ERROR("setsockopt"); } timeout.tv_sec = 3; timeout.tv_usec = 0; if(setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(struct timeval)) < 0) { PRINT_SOCKET_ERROR("setsockopt"); } #endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */ n = connect(s, p->ai_addr, p->ai_addrlen); #ifdef MINIUPNPC_IGNORE_EINTR /* EINTR The system call was interrupted by a signal that was caught * EINPROGRESS The socket is nonblocking and the connection cannot * be completed immediately. */ while(n < 0 && (errno == EINTR || errno == EINPROGRESS)) { socklen_t len; fd_set wset; int err; FD_ZERO(&wset); FD_SET(s, &wset); if((n = select(s + 1, NULL, &wset, NULL, NULL)) == -1 && errno == EINTR) continue; /*len = 0;*/ /*n = getpeername(s, NULL, &len);*/ len = sizeof(err); if(getsockopt(s, SOL_SOCKET, SO_ERROR, &err, &len) < 0) { PRINT_SOCKET_ERROR("getsockopt"); closesocket(s); freeaddrinfo(ai); return -1; } if(err != 0) { errno = err; n = -1; } } #endif /* #ifdef MINIUPNPC_IGNORE_EINTR */ if(n < 0) { closesocket(s); continue; } else { break; } } freeaddrinfo(ai); if(s < 0) { PRINT_SOCKET_ERROR("socket"); return -1; } if(n < 0) { PRINT_SOCKET_ERROR("connect"); return -1; } #endif /* #ifdef USE_GETHOSTBYNAME */ return s; } transmission-2.92/third-party/miniupnp/PaxHeaders.4960/upnpcommands.c0000644000000000000000000000013212442116703022634 xustar0030 mtime=1418239427.482328787 30 atime=1418239427.482328787 30 ctime=1457295919.015791168 transmission-2.92/third-party/miniupnp/upnpcommands.c0000644000175000017500000007434012442116703024271 0ustar00mikedldmikedld00000000000000/* $Id: upnpcommands.c,v 1.42 2014/01/31 13:18:25 nanard Exp $ */ /* Project : miniupnp * Author : Thomas Bernard * Copyright (c) 2005-2012 Thomas Bernard * This software is subject to the conditions detailed in the * LICENCE file provided in this distribution. * */ #include #include #include #include "upnpcommands.h" #include "miniupnpc.h" #include "portlistingparse.h" static UNSIGNED_INTEGER my_atoui(const char * s) { return s ? ((UNSIGNED_INTEGER)STRTOUI(s, NULL, 0)) : 0; } /* * */ LIBSPEC UNSIGNED_INTEGER UPNP_GetTotalBytesSent(const char * controlURL, const char * servicetype) { struct NameValueParserData pdata; char * buffer; int bufsize; unsigned int r = 0; char * p; if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype, "GetTotalBytesSent", 0, &bufsize))) { return UPNPCOMMAND_HTTP_ERROR; } ParseNameValue(buffer, bufsize, &pdata); /*DisplayNameValueList(buffer, bufsize);*/ free(buffer); buffer = NULL; p = GetValueFromNameValueList(&pdata, "NewTotalBytesSent"); r = my_atoui(p); ClearNameValueList(&pdata); return r; } /* * */ LIBSPEC UNSIGNED_INTEGER UPNP_GetTotalBytesReceived(const char * controlURL, const char * servicetype) { struct NameValueParserData pdata; char * buffer; int bufsize; unsigned int r = 0; char * p; if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype, "GetTotalBytesReceived", 0, &bufsize))) { return UPNPCOMMAND_HTTP_ERROR; } ParseNameValue(buffer, bufsize, &pdata); /*DisplayNameValueList(buffer, bufsize);*/ free(buffer); buffer = NULL; p = GetValueFromNameValueList(&pdata, "NewTotalBytesReceived"); r = my_atoui(p); ClearNameValueList(&pdata); return r; } /* * */ LIBSPEC UNSIGNED_INTEGER UPNP_GetTotalPacketsSent(const char * controlURL, const char * servicetype) { struct NameValueParserData pdata; char * buffer; int bufsize; unsigned int r = 0; char * p; if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype, "GetTotalPacketsSent", 0, &bufsize))) { return UPNPCOMMAND_HTTP_ERROR; } ParseNameValue(buffer, bufsize, &pdata); /*DisplayNameValueList(buffer, bufsize);*/ free(buffer); buffer = NULL; p = GetValueFromNameValueList(&pdata, "NewTotalPacketsSent"); r = my_atoui(p); ClearNameValueList(&pdata); return r; } /* * */ LIBSPEC UNSIGNED_INTEGER UPNP_GetTotalPacketsReceived(const char * controlURL, const char * servicetype) { struct NameValueParserData pdata; char * buffer; int bufsize; unsigned int r = 0; char * p; if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype, "GetTotalPacketsReceived", 0, &bufsize))) { return UPNPCOMMAND_HTTP_ERROR; } ParseNameValue(buffer, bufsize, &pdata); /*DisplayNameValueList(buffer, bufsize);*/ free(buffer); buffer = NULL; p = GetValueFromNameValueList(&pdata, "NewTotalPacketsReceived"); r = my_atoui(p); ClearNameValueList(&pdata); return r; } /* UPNP_GetStatusInfo() call the corresponding UPNP method * returns the current status and uptime */ LIBSPEC int UPNP_GetStatusInfo(const char * controlURL, const char * servicetype, char * status, unsigned int * uptime, char * lastconnerror) { struct NameValueParserData pdata; char * buffer; int bufsize; char * p; char * up; char * err; int ret = UPNPCOMMAND_UNKNOWN_ERROR; if(!status && !uptime) return UPNPCOMMAND_INVALID_ARGS; if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype, "GetStatusInfo", 0, &bufsize))) { return UPNPCOMMAND_HTTP_ERROR; } ParseNameValue(buffer, bufsize, &pdata); /*DisplayNameValueList(buffer, bufsize);*/ free(buffer); buffer = NULL; up = GetValueFromNameValueList(&pdata, "NewUptime"); p = GetValueFromNameValueList(&pdata, "NewConnectionStatus"); err = GetValueFromNameValueList(&pdata, "NewLastConnectionError"); if(p && up) ret = UPNPCOMMAND_SUCCESS; if(status) { if(p){ strncpy(status, p, 64 ); status[63] = '\0'; }else status[0]= '\0'; } if(uptime) { if(up) sscanf(up,"%u",uptime); else uptime = 0; } if(lastconnerror) { if(err) { strncpy(lastconnerror, err, 64 ); lastconnerror[63] = '\0'; } else lastconnerror[0] = '\0'; } p = GetValueFromNameValueList(&pdata, "errorCode"); if(p) { ret = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(p, "%d", &ret); } ClearNameValueList(&pdata); return ret; } /* UPNP_GetConnectionTypeInfo() call the corresponding UPNP method * returns the connection type */ LIBSPEC int UPNP_GetConnectionTypeInfo(const char * controlURL, const char * servicetype, char * connectionType) { struct NameValueParserData pdata; char * buffer; int bufsize; char * p; int ret = UPNPCOMMAND_UNKNOWN_ERROR; if(!connectionType) return UPNPCOMMAND_INVALID_ARGS; if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype, "GetConnectionTypeInfo", 0, &bufsize))) { return UPNPCOMMAND_HTTP_ERROR; } ParseNameValue(buffer, bufsize, &pdata); free(buffer); buffer = NULL; p = GetValueFromNameValueList(&pdata, "NewConnectionType"); /*p = GetValueFromNameValueList(&pdata, "NewPossibleConnectionTypes");*/ /* PossibleConnectionTypes will have several values.... */ if(p) { strncpy(connectionType, p, 64 ); connectionType[63] = '\0'; ret = UPNPCOMMAND_SUCCESS; } else connectionType[0] = '\0'; p = GetValueFromNameValueList(&pdata, "errorCode"); if(p) { ret = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(p, "%d", &ret); } ClearNameValueList(&pdata); return ret; } /* UPNP_GetLinkLayerMaxBitRate() call the corresponding UPNP method. * Returns 2 values: Downloadlink bandwidth and Uplink bandwidth. * One of the values can be null * Note : GetLinkLayerMaxBitRates belongs to WANPPPConnection:1 only * We can use the GetCommonLinkProperties from WANCommonInterfaceConfig:1 */ LIBSPEC int UPNP_GetLinkLayerMaxBitRates(const char * controlURL, const char * servicetype, unsigned int * bitrateDown, unsigned int * bitrateUp) { struct NameValueParserData pdata; char * buffer; int bufsize; int ret = UPNPCOMMAND_UNKNOWN_ERROR; char * down; char * up; char * p; if(!bitrateDown && !bitrateUp) return UPNPCOMMAND_INVALID_ARGS; /* shouldn't we use GetCommonLinkProperties ? */ if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype, "GetCommonLinkProperties", 0, &bufsize))) { /*"GetLinkLayerMaxBitRates", 0, &bufsize);*/ return UPNPCOMMAND_HTTP_ERROR; } /*DisplayNameValueList(buffer, bufsize);*/ ParseNameValue(buffer, bufsize, &pdata); free(buffer); buffer = NULL; /*down = GetValueFromNameValueList(&pdata, "NewDownstreamMaxBitRate");*/ /*up = GetValueFromNameValueList(&pdata, "NewUpstreamMaxBitRate");*/ down = GetValueFromNameValueList(&pdata, "NewLayer1DownstreamMaxBitRate"); up = GetValueFromNameValueList(&pdata, "NewLayer1UpstreamMaxBitRate"); /*GetValueFromNameValueList(&pdata, "NewWANAccessType");*/ /*GetValueFromNameValueList(&pdata, "NewPhysicalLinkStatus");*/ if(down && up) ret = UPNPCOMMAND_SUCCESS; if(bitrateDown) { if(down) sscanf(down,"%u",bitrateDown); else *bitrateDown = 0; } if(bitrateUp) { if(up) sscanf(up,"%u",bitrateUp); else *bitrateUp = 0; } p = GetValueFromNameValueList(&pdata, "errorCode"); if(p) { ret = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(p, "%d", &ret); } ClearNameValueList(&pdata); return ret; } /* UPNP_GetExternalIPAddress() call the corresponding UPNP method. * if the third arg is not null the value is copied to it. * at least 16 bytes must be available * * Return values : * 0 : SUCCESS * NON ZERO : ERROR Either an UPnP error code or an unknown error. * * 402 Invalid Args - See UPnP Device Architecture section on Control. * 501 Action Failed - See UPnP Device Architecture section on Control. */ LIBSPEC int UPNP_GetExternalIPAddress(const char * controlURL, const char * servicetype, char * extIpAdd) { struct NameValueParserData pdata; char * buffer; int bufsize; char * p; int ret = UPNPCOMMAND_UNKNOWN_ERROR; if(!extIpAdd || !controlURL || !servicetype) return UPNPCOMMAND_INVALID_ARGS; if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype, "GetExternalIPAddress", 0, &bufsize))) { return UPNPCOMMAND_HTTP_ERROR; } /*DisplayNameValueList(buffer, bufsize);*/ ParseNameValue(buffer, bufsize, &pdata); free(buffer); buffer = NULL; /*printf("external ip = %s\n", GetValueFromNameValueList(&pdata, "NewExternalIPAddress") );*/ p = GetValueFromNameValueList(&pdata, "NewExternalIPAddress"); if(p) { strncpy(extIpAdd, p, 16 ); extIpAdd[15] = '\0'; ret = UPNPCOMMAND_SUCCESS; } else extIpAdd[0] = '\0'; p = GetValueFromNameValueList(&pdata, "errorCode"); if(p) { ret = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(p, "%d", &ret); } ClearNameValueList(&pdata); return ret; } LIBSPEC int UPNP_AddPortMapping(const char * controlURL, const char * servicetype, const char * extPort, const char * inPort, const char * inClient, const char * desc, const char * proto, const char * remoteHost, const char * leaseDuration) { struct UPNParg * AddPortMappingArgs; char * buffer; int bufsize; struct NameValueParserData pdata; const char * resVal; int ret; if(!inPort || !inClient || !proto || !extPort) return UPNPCOMMAND_INVALID_ARGS; AddPortMappingArgs = calloc(9, sizeof(struct UPNParg)); AddPortMappingArgs[0].elt = "NewRemoteHost"; AddPortMappingArgs[0].val = remoteHost; AddPortMappingArgs[1].elt = "NewExternalPort"; AddPortMappingArgs[1].val = extPort; AddPortMappingArgs[2].elt = "NewProtocol"; AddPortMappingArgs[2].val = proto; AddPortMappingArgs[3].elt = "NewInternalPort"; AddPortMappingArgs[3].val = inPort; AddPortMappingArgs[4].elt = "NewInternalClient"; AddPortMappingArgs[4].val = inClient; AddPortMappingArgs[5].elt = "NewEnabled"; AddPortMappingArgs[5].val = "1"; AddPortMappingArgs[6].elt = "NewPortMappingDescription"; AddPortMappingArgs[6].val = desc?desc:"libminiupnpc"; AddPortMappingArgs[7].elt = "NewLeaseDuration"; AddPortMappingArgs[7].val = leaseDuration?leaseDuration:"0"; if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype, "AddPortMapping", AddPortMappingArgs, &bufsize))) { free(AddPortMappingArgs); return UPNPCOMMAND_HTTP_ERROR; } /*DisplayNameValueList(buffer, bufsize);*/ /*buffer[bufsize] = '\0';*/ /*puts(buffer);*/ ParseNameValue(buffer, bufsize, &pdata); free(buffer); buffer = NULL; resVal = GetValueFromNameValueList(&pdata, "errorCode"); if(resVal) { /*printf("AddPortMapping errorCode = '%s'\n", resVal); */ ret = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(resVal, "%d", &ret); } else { ret = UPNPCOMMAND_SUCCESS; } ClearNameValueList(&pdata); free(AddPortMappingArgs); return ret; } LIBSPEC int UPNP_DeletePortMapping(const char * controlURL, const char * servicetype, const char * extPort, const char * proto, const char * remoteHost) { /*struct NameValueParserData pdata;*/ struct UPNParg * DeletePortMappingArgs; char * buffer; int bufsize; struct NameValueParserData pdata; const char * resVal; int ret; if(!extPort || !proto) return UPNPCOMMAND_INVALID_ARGS; DeletePortMappingArgs = calloc(4, sizeof(struct UPNParg)); DeletePortMappingArgs[0].elt = "NewRemoteHost"; DeletePortMappingArgs[0].val = remoteHost; DeletePortMappingArgs[1].elt = "NewExternalPort"; DeletePortMappingArgs[1].val = extPort; DeletePortMappingArgs[2].elt = "NewProtocol"; DeletePortMappingArgs[2].val = proto; if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype, "DeletePortMapping", DeletePortMappingArgs, &bufsize))) { free(DeletePortMappingArgs); return UPNPCOMMAND_HTTP_ERROR; } /*DisplayNameValueList(buffer, bufsize);*/ ParseNameValue(buffer, bufsize, &pdata); free(buffer); buffer = NULL; resVal = GetValueFromNameValueList(&pdata, "errorCode"); if(resVal) { ret = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(resVal, "%d", &ret); } else { ret = UPNPCOMMAND_SUCCESS; } ClearNameValueList(&pdata); free(DeletePortMappingArgs); return ret; } LIBSPEC int UPNP_GetGenericPortMappingEntry(const char * controlURL, const char * servicetype, const char * index, char * extPort, char * intClient, char * intPort, char * protocol, char * desc, char * enabled, char * rHost, char * duration) { struct NameValueParserData pdata; struct UPNParg * GetPortMappingArgs; char * buffer; int bufsize; char * p; int r = UPNPCOMMAND_UNKNOWN_ERROR; if(!index) return UPNPCOMMAND_INVALID_ARGS; intClient[0] = '\0'; intPort[0] = '\0'; GetPortMappingArgs = calloc(2, sizeof(struct UPNParg)); GetPortMappingArgs[0].elt = "NewPortMappingIndex"; GetPortMappingArgs[0].val = index; if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype, "GetGenericPortMappingEntry", GetPortMappingArgs, &bufsize))) { free(GetPortMappingArgs); return UPNPCOMMAND_HTTP_ERROR; } ParseNameValue(buffer, bufsize, &pdata); free(buffer); buffer = NULL; p = GetValueFromNameValueList(&pdata, "NewRemoteHost"); if(p && rHost) { strncpy(rHost, p, 64); rHost[63] = '\0'; } p = GetValueFromNameValueList(&pdata, "NewExternalPort"); if(p && extPort) { strncpy(extPort, p, 6); extPort[5] = '\0'; r = UPNPCOMMAND_SUCCESS; } p = GetValueFromNameValueList(&pdata, "NewProtocol"); if(p && protocol) { strncpy(protocol, p, 4); protocol[3] = '\0'; } p = GetValueFromNameValueList(&pdata, "NewInternalClient"); if(p && intClient) { strncpy(intClient, p, 16); intClient[15] = '\0'; r = 0; } p = GetValueFromNameValueList(&pdata, "NewInternalPort"); if(p && intPort) { strncpy(intPort, p, 6); intPort[5] = '\0'; } p = GetValueFromNameValueList(&pdata, "NewEnabled"); if(p && enabled) { strncpy(enabled, p, 4); enabled[3] = '\0'; } p = GetValueFromNameValueList(&pdata, "NewPortMappingDescription"); if(p && desc) { strncpy(desc, p, 80); desc[79] = '\0'; } p = GetValueFromNameValueList(&pdata, "NewLeaseDuration"); if(p && duration) { strncpy(duration, p, 16); duration[15] = '\0'; } p = GetValueFromNameValueList(&pdata, "errorCode"); if(p) { r = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(p, "%d", &r); } ClearNameValueList(&pdata); free(GetPortMappingArgs); return r; } LIBSPEC int UPNP_GetPortMappingNumberOfEntries(const char * controlURL, const char * servicetype, unsigned int * numEntries) { struct NameValueParserData pdata; char * buffer; int bufsize; char* p; int ret = UPNPCOMMAND_UNKNOWN_ERROR; if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype, "GetPortMappingNumberOfEntries", 0, &bufsize))) { return UPNPCOMMAND_HTTP_ERROR; } #ifdef DEBUG DisplayNameValueList(buffer, bufsize); #endif ParseNameValue(buffer, bufsize, &pdata); free(buffer); buffer = NULL; p = GetValueFromNameValueList(&pdata, "NewPortMappingNumberOfEntries"); if(numEntries && p) { *numEntries = 0; sscanf(p, "%u", numEntries); ret = UPNPCOMMAND_SUCCESS; } p = GetValueFromNameValueList(&pdata, "errorCode"); if(p) { ret = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(p, "%d", &ret); } ClearNameValueList(&pdata); return ret; } /* UPNP_GetSpecificPortMappingEntry retrieves an existing port mapping * the result is returned in the intClient and intPort strings * please provide 16 and 6 bytes of data */ LIBSPEC int UPNP_GetSpecificPortMappingEntry(const char * controlURL, const char * servicetype, const char * extPort, const char * proto, const char * remoteHost, char * intClient, char * intPort, char * desc, char * enabled, char * leaseDuration) { struct NameValueParserData pdata; struct UPNParg * GetPortMappingArgs; char * buffer; int bufsize; char * p; int ret = UPNPCOMMAND_UNKNOWN_ERROR; if(!intPort || !intClient || !extPort || !proto) return UPNPCOMMAND_INVALID_ARGS; GetPortMappingArgs = calloc(4, sizeof(struct UPNParg)); GetPortMappingArgs[0].elt = "NewRemoteHost"; GetPortMappingArgs[0].val = remoteHost; GetPortMappingArgs[1].elt = "NewExternalPort"; GetPortMappingArgs[1].val = extPort; GetPortMappingArgs[2].elt = "NewProtocol"; GetPortMappingArgs[2].val = proto; if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype, "GetSpecificPortMappingEntry", GetPortMappingArgs, &bufsize))) { free(GetPortMappingArgs); return UPNPCOMMAND_HTTP_ERROR; } /*DisplayNameValueList(buffer, bufsize);*/ ParseNameValue(buffer, bufsize, &pdata); free(buffer); buffer = NULL; p = GetValueFromNameValueList(&pdata, "NewInternalClient"); if(p) { strncpy(intClient, p, 16); intClient[15] = '\0'; ret = UPNPCOMMAND_SUCCESS; } else intClient[0] = '\0'; p = GetValueFromNameValueList(&pdata, "NewInternalPort"); if(p) { strncpy(intPort, p, 6); intPort[5] = '\0'; } else intPort[0] = '\0'; p = GetValueFromNameValueList(&pdata, "NewEnabled"); if(p && enabled) { strncpy(enabled, p, 4); enabled[3] = '\0'; } p = GetValueFromNameValueList(&pdata, "NewPortMappingDescription"); if(p && desc) { strncpy(desc, p, 80); desc[79] = '\0'; } p = GetValueFromNameValueList(&pdata, "NewLeaseDuration"); if(p && leaseDuration) { strncpy(leaseDuration, p, 16); leaseDuration[15] = '\0'; } p = GetValueFromNameValueList(&pdata, "errorCode"); if(p) { ret = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(p, "%d", &ret); } ClearNameValueList(&pdata); free(GetPortMappingArgs); return ret; } /* UPNP_GetListOfPortMappings() * * Possible UPNP Error codes : * 606 Action not Authorized * 730 PortMappingNotFound - no port mapping is found in the specified range. * 733 InconsistantParameters - NewStartPort and NewEndPort values are not * consistent. */ LIBSPEC int UPNP_GetListOfPortMappings(const char * controlURL, const char * servicetype, const char * startPort, const char * endPort, const char * protocol, const char * numberOfPorts, struct PortMappingParserData * data) { struct NameValueParserData pdata; struct UPNParg * GetListOfPortMappingsArgs; const char * p; char * buffer; int bufsize; int ret = UPNPCOMMAND_UNKNOWN_ERROR; if(!startPort || !endPort || !protocol) return UPNPCOMMAND_INVALID_ARGS; GetListOfPortMappingsArgs = calloc(6, sizeof(struct UPNParg)); GetListOfPortMappingsArgs[0].elt = "NewStartPort"; GetListOfPortMappingsArgs[0].val = startPort; GetListOfPortMappingsArgs[1].elt = "NewEndPort"; GetListOfPortMappingsArgs[1].val = endPort; GetListOfPortMappingsArgs[2].elt = "NewProtocol"; GetListOfPortMappingsArgs[2].val = protocol; GetListOfPortMappingsArgs[3].elt = "NewManage"; GetListOfPortMappingsArgs[3].val = "1"; GetListOfPortMappingsArgs[4].elt = "NewNumberOfPorts"; GetListOfPortMappingsArgs[4].val = numberOfPorts?numberOfPorts:"1000"; if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype, "GetListOfPortMappings", GetListOfPortMappingsArgs, &bufsize))) { free(GetListOfPortMappingsArgs); return UPNPCOMMAND_HTTP_ERROR; } free(GetListOfPortMappingsArgs); /*DisplayNameValueList(buffer, bufsize);*/ ParseNameValue(buffer, bufsize, &pdata); free(buffer); buffer = NULL; /*p = GetValueFromNameValueList(&pdata, "NewPortListing");*/ /*if(p) { printf("NewPortListing : %s\n", p); }*/ /*printf("NewPortListing(%d chars) : %s\n", pdata.portListingLength, pdata.portListing);*/ if(pdata.portListing) { /*struct PortMapping * pm; int i = 0;*/ ParsePortListing(pdata.portListing, pdata.portListingLength, data); ret = UPNPCOMMAND_SUCCESS; /* for(pm = data->head.lh_first; pm != NULL; pm = pm->entries.le_next) { printf("%2d %s %5hu->%s:%-5hu '%s' '%s'\n", i, pm->protocol, pm->externalPort, pm->internalClient, pm->internalPort, pm->description, pm->remoteHost); i++; } */ /*FreePortListing(&data);*/ } p = GetValueFromNameValueList(&pdata, "errorCode"); if(p) { ret = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(p, "%d", &ret); } ClearNameValueList(&pdata); /*printf("%.*s", bufsize, buffer);*/ return ret; } /* IGD:2, functions for service WANIPv6FirewallControl:1 */ LIBSPEC int UPNP_GetFirewallStatus(const char * controlURL, const char * servicetype, int * firewallEnabled, int * inboundPinholeAllowed) { struct NameValueParserData pdata; char * buffer; int bufsize; char * fe, *ipa, *p; int ret = UPNPCOMMAND_UNKNOWN_ERROR; if(!firewallEnabled || !inboundPinholeAllowed) return UPNPCOMMAND_INVALID_ARGS; buffer = simpleUPnPcommand(-1, controlURL, servicetype, "GetFirewallStatus", 0, &bufsize); if(!buffer) { return UPNPCOMMAND_HTTP_ERROR; } ParseNameValue(buffer, bufsize, &pdata); free(buffer); buffer = NULL; fe = GetValueFromNameValueList(&pdata, "FirewallEnabled"); ipa = GetValueFromNameValueList(&pdata, "InboundPinholeAllowed"); if(ipa && fe) ret = UPNPCOMMAND_SUCCESS; if(fe) *firewallEnabled = my_atoui(fe); /*else *firewallEnabled = 0;*/ if(ipa) *inboundPinholeAllowed = my_atoui(ipa); /*else *inboundPinholeAllowed = 0;*/ p = GetValueFromNameValueList(&pdata, "errorCode"); if(p) { ret = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(p, "%d", &ret); } ClearNameValueList(&pdata); return ret; } LIBSPEC int UPNP_GetOutboundPinholeTimeout(const char * controlURL, const char * servicetype, const char * remoteHost, const char * remotePort, const char * intClient, const char * intPort, const char * proto, int * opTimeout) { struct UPNParg * GetOutboundPinholeTimeoutArgs; char * buffer; int bufsize; struct NameValueParserData pdata; const char * resVal; char * p; int ret; if(!intPort || !intClient || !proto || !remotePort || !remoteHost) return UPNPCOMMAND_INVALID_ARGS; GetOutboundPinholeTimeoutArgs = calloc(6, sizeof(struct UPNParg)); GetOutboundPinholeTimeoutArgs[0].elt = "RemoteHost"; GetOutboundPinholeTimeoutArgs[0].val = remoteHost; GetOutboundPinholeTimeoutArgs[1].elt = "RemotePort"; GetOutboundPinholeTimeoutArgs[1].val = remotePort; GetOutboundPinholeTimeoutArgs[2].elt = "Protocol"; GetOutboundPinholeTimeoutArgs[2].val = proto; GetOutboundPinholeTimeoutArgs[3].elt = "InternalPort"; GetOutboundPinholeTimeoutArgs[3].val = intPort; GetOutboundPinholeTimeoutArgs[4].elt = "InternalClient"; GetOutboundPinholeTimeoutArgs[4].val = intClient; buffer = simpleUPnPcommand(-1, controlURL, servicetype, "GetOutboundPinholeTimeout", GetOutboundPinholeTimeoutArgs, &bufsize); if(!buffer) return UPNPCOMMAND_HTTP_ERROR; ParseNameValue(buffer, bufsize, &pdata); free(buffer); buffer = NULL; resVal = GetValueFromNameValueList(&pdata, "errorCode"); if(resVal) { ret = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(resVal, "%d", &ret); } else { ret = UPNPCOMMAND_SUCCESS; p = GetValueFromNameValueList(&pdata, "OutboundPinholeTimeout"); if(p) *opTimeout = my_atoui(p); } ClearNameValueList(&pdata); free(GetOutboundPinholeTimeoutArgs); return ret; } LIBSPEC int UPNP_AddPinhole(const char * controlURL, const char * servicetype, const char * remoteHost, const char * remotePort, const char * intClient, const char * intPort, const char * proto, const char * leaseTime, char * uniqueID) { struct UPNParg * AddPinholeArgs; char * buffer; int bufsize; struct NameValueParserData pdata; const char * resVal; char * p; int ret; if(!intPort || !intClient || !proto || !remoteHost || !remotePort || !leaseTime) return UPNPCOMMAND_INVALID_ARGS; AddPinholeArgs = calloc(7, sizeof(struct UPNParg)); /* RemoteHost can be wilcarded */ if(strncmp(remoteHost, "empty", 5)==0) { AddPinholeArgs[0].elt = "RemoteHost"; AddPinholeArgs[0].val = ""; } else { AddPinholeArgs[0].elt = "RemoteHost"; AddPinholeArgs[0].val = remoteHost; } AddPinholeArgs[1].elt = "RemotePort"; AddPinholeArgs[1].val = remotePort; AddPinholeArgs[2].elt = "Protocol"; AddPinholeArgs[2].val = proto; AddPinholeArgs[3].elt = "InternalPort"; AddPinholeArgs[3].val = intPort; if(strncmp(intClient, "empty", 5)==0) { AddPinholeArgs[4].elt = "InternalClient"; AddPinholeArgs[4].val = ""; } else { AddPinholeArgs[4].elt = "InternalClient"; AddPinholeArgs[4].val = intClient; } AddPinholeArgs[5].elt = "LeaseTime"; AddPinholeArgs[5].val = leaseTime; buffer = simpleUPnPcommand(-1, controlURL, servicetype, "AddPinhole", AddPinholeArgs, &bufsize); if(!buffer) return UPNPCOMMAND_HTTP_ERROR; ParseNameValue(buffer, bufsize, &pdata); free(buffer); buffer = NULL; p = GetValueFromNameValueList(&pdata, "UniqueID"); if(p) { strncpy(uniqueID, p, 8); uniqueID[7] = '\0'; } resVal = GetValueFromNameValueList(&pdata, "errorCode"); if(resVal) { /*printf("AddPortMapping errorCode = '%s'\n", resVal);*/ ret = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(resVal, "%d", &ret); } else { ret = UPNPCOMMAND_SUCCESS; } ClearNameValueList(&pdata); free(AddPinholeArgs); return ret; } LIBSPEC int UPNP_UpdatePinhole(const char * controlURL, const char * servicetype, const char * uniqueID, const char * leaseTime) { struct UPNParg * UpdatePinholeArgs; char * buffer; int bufsize; struct NameValueParserData pdata; const char * resVal; int ret; if(!uniqueID || !leaseTime) return UPNPCOMMAND_INVALID_ARGS; UpdatePinholeArgs = calloc(3, sizeof(struct UPNParg)); UpdatePinholeArgs[0].elt = "UniqueID"; UpdatePinholeArgs[0].val = uniqueID; UpdatePinholeArgs[1].elt = "NewLeaseTime"; UpdatePinholeArgs[1].val = leaseTime; buffer = simpleUPnPcommand(-1, controlURL, servicetype, "UpdatePinhole", UpdatePinholeArgs, &bufsize); if(!buffer) return UPNPCOMMAND_HTTP_ERROR; ParseNameValue(buffer, bufsize, &pdata); free(buffer); buffer = NULL; resVal = GetValueFromNameValueList(&pdata, "errorCode"); if(resVal) { /*printf("AddPortMapping errorCode = '%s'\n", resVal); */ ret = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(resVal, "%d", &ret); } else { ret = UPNPCOMMAND_SUCCESS; } ClearNameValueList(&pdata); free(UpdatePinholeArgs); return ret; } LIBSPEC int UPNP_DeletePinhole(const char * controlURL, const char * servicetype, const char * uniqueID) { /*struct NameValueParserData pdata;*/ struct UPNParg * DeletePinholeArgs; char * buffer; int bufsize; struct NameValueParserData pdata; const char * resVal; int ret; if(!uniqueID) return UPNPCOMMAND_INVALID_ARGS; DeletePinholeArgs = calloc(2, sizeof(struct UPNParg)); DeletePinholeArgs[0].elt = "UniqueID"; DeletePinholeArgs[0].val = uniqueID; buffer = simpleUPnPcommand(-1, controlURL, servicetype, "DeletePinhole", DeletePinholeArgs, &bufsize); if(!buffer) return UPNPCOMMAND_HTTP_ERROR; /*DisplayNameValueList(buffer, bufsize);*/ ParseNameValue(buffer, bufsize, &pdata); free(buffer); buffer = NULL; resVal = GetValueFromNameValueList(&pdata, "errorCode"); if(resVal) { ret = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(resVal, "%d", &ret); } else { ret = UPNPCOMMAND_SUCCESS; } ClearNameValueList(&pdata); free(DeletePinholeArgs); return ret; } LIBSPEC int UPNP_CheckPinholeWorking(const char * controlURL, const char * servicetype, const char * uniqueID, int * isWorking) { struct NameValueParserData pdata; struct UPNParg * CheckPinholeWorkingArgs; char * buffer; int bufsize; char * p; int ret = UPNPCOMMAND_UNKNOWN_ERROR; if(!uniqueID) return UPNPCOMMAND_INVALID_ARGS; CheckPinholeWorkingArgs = calloc(4, sizeof(struct UPNParg)); CheckPinholeWorkingArgs[0].elt = "UniqueID"; CheckPinholeWorkingArgs[0].val = uniqueID; buffer = simpleUPnPcommand(-1, controlURL, servicetype, "CheckPinholeWorking", CheckPinholeWorkingArgs, &bufsize); if(!buffer) return UPNPCOMMAND_HTTP_ERROR; ParseNameValue(buffer, bufsize, &pdata); free(buffer); buffer = NULL; p = GetValueFromNameValueList(&pdata, "IsWorking"); if(p) { *isWorking=my_atoui(p); ret = UPNPCOMMAND_SUCCESS; } else *isWorking = 0; p = GetValueFromNameValueList(&pdata, "errorCode"); if(p) { ret = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(p, "%d", &ret); } ClearNameValueList(&pdata); free(CheckPinholeWorkingArgs); return ret; } LIBSPEC int UPNP_GetPinholePackets(const char * controlURL, const char * servicetype, const char * uniqueID, int * packets) { struct NameValueParserData pdata; struct UPNParg * GetPinholePacketsArgs; char * buffer; int bufsize; char * p; int ret = UPNPCOMMAND_UNKNOWN_ERROR; if(!uniqueID) return UPNPCOMMAND_INVALID_ARGS; GetPinholePacketsArgs = calloc(4, sizeof(struct UPNParg)); GetPinholePacketsArgs[0].elt = "UniqueID"; GetPinholePacketsArgs[0].val = uniqueID; buffer = simpleUPnPcommand(-1, controlURL, servicetype, "GetPinholePackets", GetPinholePacketsArgs, &bufsize); if(!buffer) return UPNPCOMMAND_HTTP_ERROR; ParseNameValue(buffer, bufsize, &pdata); free(buffer); buffer = NULL; p = GetValueFromNameValueList(&pdata, "PinholePackets"); if(p) { *packets=my_atoui(p); ret = UPNPCOMMAND_SUCCESS; } p = GetValueFromNameValueList(&pdata, "errorCode"); if(p) { ret = UPNPCOMMAND_UNKNOWN_ERROR; sscanf(p, "%d", &ret); } ClearNameValueList(&pdata); free(GetPinholePacketsArgs); return ret; } transmission-2.92/third-party/miniupnp/PaxHeaders.4960/miniupnpc.h0000644000000000000000000000013212442116703022137 xustar0030 mtime=1418239427.483328805 30 atime=1418239427.483328805 30 ctime=1457295918.902789246 transmission-2.92/third-party/miniupnp/miniupnpc.h0000644000175000017500000000740012442116703023565 0ustar00mikedldmikedld00000000000000/* $Id: miniupnpc.h,v 1.35 2014/01/31 13:26:34 nanard Exp $ */ /* Project: miniupnp * http://miniupnp.free.fr/ * Author: Thomas Bernard * Copyright (c) 2005-2012 Thomas Bernard * This software is subjects to the conditions detailed * in the LICENCE file provided within this distribution */ #ifndef MINIUPNPC_H_INCLUDED #define MINIUPNPC_H_INCLUDED #include "declspec.h" #include "igd_desc_parse.h" /* error codes : */ #define UPNPDISCOVER_SUCCESS (0) #define UPNPDISCOVER_UNKNOWN_ERROR (-1) #define UPNPDISCOVER_SOCKET_ERROR (-101) #define UPNPDISCOVER_MEMORY_ERROR (-102) /* versions : */ #define MINIUPNPC_VERSION "1.9.20140401" #define MINIUPNPC_API_VERSION 10 #ifdef __cplusplus extern "C" { #endif /* Structures definitions : */ struct UPNParg { const char * elt; const char * val; }; char * simpleUPnPcommand(int, const char *, const char *, const char *, struct UPNParg *, int *); struct UPNPDev { struct UPNPDev * pNext; char * descURL; char * st; unsigned int scope_id; char buffer[2]; }; /* upnpDiscover() * discover UPnP devices on the network. * The discovered devices are returned as a chained list. * It is up to the caller to free the list with freeUPNPDevlist(). * delay (in millisecond) is the maximum time for waiting any device * response. * If available, device list will be obtained from MiniSSDPd. * Default path for minissdpd socket will be used if minissdpdsock argument * is NULL. * If multicastif is not NULL, it will be used instead of the default * multicast interface for sending SSDP discover packets. * If sameport is not null, SSDP packets will be sent from the source port * 1900 (same as destination port) otherwise system assign a source port. */ LIBSPEC struct UPNPDev * upnpDiscover(int delay, const char * multicastif, const char * minissdpdsock, int sameport, int ipv6, int * error); /* freeUPNPDevlist() * free list returned by upnpDiscover() */ LIBSPEC void freeUPNPDevlist(struct UPNPDev * devlist); /* parserootdesc() : * parse root XML description of a UPnP device and fill the IGDdatas * structure. */ LIBSPEC void parserootdesc(const char *, int, struct IGDdatas *); /* structure used to get fast access to urls * controlURL: controlURL of the WANIPConnection * ipcondescURL: url of the description of the WANIPConnection * controlURL_CIF: controlURL of the WANCommonInterfaceConfig * controlURL_6FC: controlURL of the WANIPv6FirewallControl */ struct UPNPUrls { char * controlURL; char * ipcondescURL; char * controlURL_CIF; char * controlURL_6FC; char * rootdescURL; }; /* UPNP_GetValidIGD() : * return values : * 0 = NO IGD found * 1 = A valid connected IGD has been found * 2 = A valid IGD has been found but it reported as * not connected * 3 = an UPnP device has been found but was not recognized as an IGD * * In any non zero return case, the urls and data structures * passed as parameters are set. Donc forget to call FreeUPNPUrls(urls) to * free allocated memory. */ LIBSPEC int UPNP_GetValidIGD(struct UPNPDev * devlist, struct UPNPUrls * urls, struct IGDdatas * data, char * lanaddr, int lanaddrlen); /* UPNP_GetIGDFromUrl() * Used when skipping the discovery process. * return value : * 0 - Not ok * 1 - OK */ LIBSPEC int UPNP_GetIGDFromUrl(const char * rootdescurl, struct UPNPUrls * urls, struct IGDdatas * data, char * lanaddr, int lanaddrlen); LIBSPEC void GetUPNPUrls(struct UPNPUrls *, struct IGDdatas *, const char *, unsigned int); LIBSPEC void FreeUPNPUrls(struct UPNPUrls *); /* return 0 or 1 */ LIBSPEC int UPNPIGD_IsConnected(struct UPNPUrls *, struct IGDdatas *); #ifdef __cplusplus } #endif #endif transmission-2.92/third-party/miniupnp/PaxHeaders.4960/bsdqueue.h0000644000000000000000000000013212442116703021752 xustar0030 mtime=1418239427.484328822 30 atime=1418239427.484328822 30 ctime=1457295918.862788566 transmission-2.92/third-party/miniupnp/bsdqueue.h0000644000175000017500000004326712442116703023413 0ustar00mikedldmikedld00000000000000/* $OpenBSD: queue.h,v 1.31 2005/11/25 08:06:25 otto Exp $ */ /* $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $ */ /* * Copyright (c) 1991, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)queue.h 8.5 (Berkeley) 8/20/94 */ #ifndef _SYS_QUEUE_H_ #define _SYS_QUEUE_H_ /* * This file defines five types of data structures: singly-linked lists, * lists, simple queues, tail queues, and circular queues. * * * A singly-linked list is headed by a single forward pointer. The elements * are singly linked for minimum space and pointer manipulation overhead at * the expense of O(n) removal for arbitrary elements. New elements can be * added to the list after an existing element or at the head of the list. * Elements being removed from the head of the list should use the explicit * macro for this purpose for optimum efficiency. A singly-linked list may * only be traversed in the forward direction. Singly-linked lists are ideal * for applications with large datasets and few or no removals or for * implementing a LIFO queue. * * A list is headed by a single forward pointer (or an array of forward * pointers for a hash table header). The elements are doubly linked * so that an arbitrary element can be removed without a need to * traverse the list. New elements can be added to the list before * or after an existing element or at the head of the list. A list * may only be traversed in the forward direction. * * A simple queue is headed by a pair of pointers, one the head of the * list and the other to the tail of the list. The elements are singly * linked to save space, so elements can only be removed from the * head of the list. New elements can be added to the list before or after * an existing element, at the head of the list, or at the end of the * list. A simple queue may only be traversed in the forward direction. * * A tail queue is headed by a pair of pointers, one to the head of the * list and the other to the tail of the list. The elements are doubly * linked so that an arbitrary element can be removed without a need to * traverse the list. New elements can be added to the list before or * after an existing element, at the head of the list, or at the end of * the list. A tail queue may be traversed in either direction. * * A circle queue is headed by a pair of pointers, one to the head of the * list and the other to the tail of the list. The elements are doubly * linked so that an arbitrary element can be removed without a need to * traverse the list. New elements can be added to the list before or after * an existing element, at the head of the list, or at the end of the list. * A circle queue may be traversed in either direction, but has a more * complex end of list detection. * * For details on the use of these macros, see the queue(3) manual page. */ #ifdef QUEUE_MACRO_DEBUG #define _Q_INVALIDATE(a) (a) = ((void *)-1) #else #define _Q_INVALIDATE(a) #endif /* * Singly-linked List definitions. */ #define SLIST_HEAD(name, type) \ struct name { \ struct type *slh_first; /* first element */ \ } #define SLIST_HEAD_INITIALIZER(head) \ { NULL } #ifdef SLIST_ENTRY #undef SLIST_ENTRY #endif #define SLIST_ENTRY(type) \ struct { \ struct type *sle_next; /* next element */ \ } /* * Singly-linked List access methods. */ #define SLIST_FIRST(head) ((head)->slh_first) #define SLIST_END(head) NULL #define SLIST_EMPTY(head) (SLIST_FIRST(head) == SLIST_END(head)) #define SLIST_NEXT(elm, field) ((elm)->field.sle_next) #define SLIST_FOREACH(var, head, field) \ for((var) = SLIST_FIRST(head); \ (var) != SLIST_END(head); \ (var) = SLIST_NEXT(var, field)) #define SLIST_FOREACH_PREVPTR(var, varp, head, field) \ for ((varp) = &SLIST_FIRST((head)); \ ((var) = *(varp)) != SLIST_END(head); \ (varp) = &SLIST_NEXT((var), field)) /* * Singly-linked List functions. */ #define SLIST_INIT(head) { \ SLIST_FIRST(head) = SLIST_END(head); \ } #define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ (elm)->field.sle_next = (slistelm)->field.sle_next; \ (slistelm)->field.sle_next = (elm); \ } while (0) #define SLIST_INSERT_HEAD(head, elm, field) do { \ (elm)->field.sle_next = (head)->slh_first; \ (head)->slh_first = (elm); \ } while (0) #define SLIST_REMOVE_NEXT(head, elm, field) do { \ (elm)->field.sle_next = (elm)->field.sle_next->field.sle_next; \ } while (0) #define SLIST_REMOVE_HEAD(head, field) do { \ (head)->slh_first = (head)->slh_first->field.sle_next; \ } while (0) #define SLIST_REMOVE(head, elm, type, field) do { \ if ((head)->slh_first == (elm)) { \ SLIST_REMOVE_HEAD((head), field); \ } else { \ struct type *curelm = (head)->slh_first; \ \ while (curelm->field.sle_next != (elm)) \ curelm = curelm->field.sle_next; \ curelm->field.sle_next = \ curelm->field.sle_next->field.sle_next; \ _Q_INVALIDATE((elm)->field.sle_next); \ } \ } while (0) /* * List definitions. */ #define LIST_HEAD(name, type) \ struct name { \ struct type *lh_first; /* first element */ \ } #define LIST_HEAD_INITIALIZER(head) \ { NULL } #define LIST_ENTRY(type) \ struct { \ struct type *le_next; /* next element */ \ struct type **le_prev; /* address of previous next element */ \ } /* * List access methods */ #define LIST_FIRST(head) ((head)->lh_first) #define LIST_END(head) NULL #define LIST_EMPTY(head) (LIST_FIRST(head) == LIST_END(head)) #define LIST_NEXT(elm, field) ((elm)->field.le_next) #define LIST_FOREACH(var, head, field) \ for((var) = LIST_FIRST(head); \ (var)!= LIST_END(head); \ (var) = LIST_NEXT(var, field)) /* * List functions. */ #define LIST_INIT(head) do { \ LIST_FIRST(head) = LIST_END(head); \ } while (0) #define LIST_INSERT_AFTER(listelm, elm, field) do { \ if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ (listelm)->field.le_next->field.le_prev = \ &(elm)->field.le_next; \ (listelm)->field.le_next = (elm); \ (elm)->field.le_prev = &(listelm)->field.le_next; \ } while (0) #define LIST_INSERT_BEFORE(listelm, elm, field) do { \ (elm)->field.le_prev = (listelm)->field.le_prev; \ (elm)->field.le_next = (listelm); \ *(listelm)->field.le_prev = (elm); \ (listelm)->field.le_prev = &(elm)->field.le_next; \ } while (0) #define LIST_INSERT_HEAD(head, elm, field) do { \ if (((elm)->field.le_next = (head)->lh_first) != NULL) \ (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ (head)->lh_first = (elm); \ (elm)->field.le_prev = &(head)->lh_first; \ } while (0) #define LIST_REMOVE(elm, field) do { \ if ((elm)->field.le_next != NULL) \ (elm)->field.le_next->field.le_prev = \ (elm)->field.le_prev; \ *(elm)->field.le_prev = (elm)->field.le_next; \ _Q_INVALIDATE((elm)->field.le_prev); \ _Q_INVALIDATE((elm)->field.le_next); \ } while (0) #define LIST_REPLACE(elm, elm2, field) do { \ if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \ (elm2)->field.le_next->field.le_prev = \ &(elm2)->field.le_next; \ (elm2)->field.le_prev = (elm)->field.le_prev; \ *(elm2)->field.le_prev = (elm2); \ _Q_INVALIDATE((elm)->field.le_prev); \ _Q_INVALIDATE((elm)->field.le_next); \ } while (0) /* * Simple queue definitions. */ #define SIMPLEQ_HEAD(name, type) \ struct name { \ struct type *sqh_first; /* first element */ \ struct type **sqh_last; /* addr of last next element */ \ } #define SIMPLEQ_HEAD_INITIALIZER(head) \ { NULL, &(head).sqh_first } #define SIMPLEQ_ENTRY(type) \ struct { \ struct type *sqe_next; /* next element */ \ } /* * Simple queue access methods. */ #define SIMPLEQ_FIRST(head) ((head)->sqh_first) #define SIMPLEQ_END(head) NULL #define SIMPLEQ_EMPTY(head) (SIMPLEQ_FIRST(head) == SIMPLEQ_END(head)) #define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) #define SIMPLEQ_FOREACH(var, head, field) \ for((var) = SIMPLEQ_FIRST(head); \ (var) != SIMPLEQ_END(head); \ (var) = SIMPLEQ_NEXT(var, field)) /* * Simple queue functions. */ #define SIMPLEQ_INIT(head) do { \ (head)->sqh_first = NULL; \ (head)->sqh_last = &(head)->sqh_first; \ } while (0) #define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \ if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ (head)->sqh_last = &(elm)->field.sqe_next; \ (head)->sqh_first = (elm); \ } while (0) #define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \ (elm)->field.sqe_next = NULL; \ *(head)->sqh_last = (elm); \ (head)->sqh_last = &(elm)->field.sqe_next; \ } while (0) #define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\ (head)->sqh_last = &(elm)->field.sqe_next; \ (listelm)->field.sqe_next = (elm); \ } while (0) #define SIMPLEQ_REMOVE_HEAD(head, field) do { \ if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \ (head)->sqh_last = &(head)->sqh_first; \ } while (0) /* * Tail queue definitions. */ #define TAILQ_HEAD(name, type) \ struct name { \ struct type *tqh_first; /* first element */ \ struct type **tqh_last; /* addr of last next element */ \ } #define TAILQ_HEAD_INITIALIZER(head) \ { NULL, &(head).tqh_first } #define TAILQ_ENTRY(type) \ struct { \ struct type *tqe_next; /* next element */ \ struct type **tqe_prev; /* address of previous next element */ \ } /* * tail queue access methods */ #define TAILQ_FIRST(head) ((head)->tqh_first) #define TAILQ_END(head) NULL #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) #define TAILQ_LAST(head, headname) \ (*(((struct headname *)((head)->tqh_last))->tqh_last)) /* XXX */ #define TAILQ_PREV(elm, headname, field) \ (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) #define TAILQ_EMPTY(head) \ (TAILQ_FIRST(head) == TAILQ_END(head)) #define TAILQ_FOREACH(var, head, field) \ for((var) = TAILQ_FIRST(head); \ (var) != TAILQ_END(head); \ (var) = TAILQ_NEXT(var, field)) #define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ for((var) = TAILQ_LAST(head, headname); \ (var) != TAILQ_END(head); \ (var) = TAILQ_PREV(var, headname, field)) /* * Tail queue functions. */ #define TAILQ_INIT(head) do { \ (head)->tqh_first = NULL; \ (head)->tqh_last = &(head)->tqh_first; \ } while (0) #define TAILQ_INSERT_HEAD(head, elm, field) do { \ if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ (head)->tqh_first->field.tqe_prev = \ &(elm)->field.tqe_next; \ else \ (head)->tqh_last = &(elm)->field.tqe_next; \ (head)->tqh_first = (elm); \ (elm)->field.tqe_prev = &(head)->tqh_first; \ } while (0) #define TAILQ_INSERT_TAIL(head, elm, field) do { \ (elm)->field.tqe_next = NULL; \ (elm)->field.tqe_prev = (head)->tqh_last; \ *(head)->tqh_last = (elm); \ (head)->tqh_last = &(elm)->field.tqe_next; \ } while (0) #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ (elm)->field.tqe_next->field.tqe_prev = \ &(elm)->field.tqe_next; \ else \ (head)->tqh_last = &(elm)->field.tqe_next; \ (listelm)->field.tqe_next = (elm); \ (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ } while (0) #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ (elm)->field.tqe_next = (listelm); \ *(listelm)->field.tqe_prev = (elm); \ (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ } while (0) #define TAILQ_REMOVE(head, elm, field) do { \ if (((elm)->field.tqe_next) != NULL) \ (elm)->field.tqe_next->field.tqe_prev = \ (elm)->field.tqe_prev; \ else \ (head)->tqh_last = (elm)->field.tqe_prev; \ *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ _Q_INVALIDATE((elm)->field.tqe_prev); \ _Q_INVALIDATE((elm)->field.tqe_next); \ } while (0) #define TAILQ_REPLACE(head, elm, elm2, field) do { \ if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL) \ (elm2)->field.tqe_next->field.tqe_prev = \ &(elm2)->field.tqe_next; \ else \ (head)->tqh_last = &(elm2)->field.tqe_next; \ (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \ *(elm2)->field.tqe_prev = (elm2); \ _Q_INVALIDATE((elm)->field.tqe_prev); \ _Q_INVALIDATE((elm)->field.tqe_next); \ } while (0) /* * Circular queue definitions. */ #define CIRCLEQ_HEAD(name, type) \ struct name { \ struct type *cqh_first; /* first element */ \ struct type *cqh_last; /* last element */ \ } #define CIRCLEQ_HEAD_INITIALIZER(head) \ { CIRCLEQ_END(&head), CIRCLEQ_END(&head) } #define CIRCLEQ_ENTRY(type) \ struct { \ struct type *cqe_next; /* next element */ \ struct type *cqe_prev; /* previous element */ \ } /* * Circular queue access methods */ #define CIRCLEQ_FIRST(head) ((head)->cqh_first) #define CIRCLEQ_LAST(head) ((head)->cqh_last) #define CIRCLEQ_END(head) ((void *)(head)) #define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next) #define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev) #define CIRCLEQ_EMPTY(head) \ (CIRCLEQ_FIRST(head) == CIRCLEQ_END(head)) #define CIRCLEQ_FOREACH(var, head, field) \ for((var) = CIRCLEQ_FIRST(head); \ (var) != CIRCLEQ_END(head); \ (var) = CIRCLEQ_NEXT(var, field)) #define CIRCLEQ_FOREACH_REVERSE(var, head, field) \ for((var) = CIRCLEQ_LAST(head); \ (var) != CIRCLEQ_END(head); \ (var) = CIRCLEQ_PREV(var, field)) /* * Circular queue functions. */ #define CIRCLEQ_INIT(head) do { \ (head)->cqh_first = CIRCLEQ_END(head); \ (head)->cqh_last = CIRCLEQ_END(head); \ } while (0) #define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ (elm)->field.cqe_next = (listelm)->field.cqe_next; \ (elm)->field.cqe_prev = (listelm); \ if ((listelm)->field.cqe_next == CIRCLEQ_END(head)) \ (head)->cqh_last = (elm); \ else \ (listelm)->field.cqe_next->field.cqe_prev = (elm); \ (listelm)->field.cqe_next = (elm); \ } while (0) #define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ (elm)->field.cqe_next = (listelm); \ (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ if ((listelm)->field.cqe_prev == CIRCLEQ_END(head)) \ (head)->cqh_first = (elm); \ else \ (listelm)->field.cqe_prev->field.cqe_next = (elm); \ (listelm)->field.cqe_prev = (elm); \ } while (0) #define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ (elm)->field.cqe_next = (head)->cqh_first; \ (elm)->field.cqe_prev = CIRCLEQ_END(head); \ if ((head)->cqh_last == CIRCLEQ_END(head)) \ (head)->cqh_last = (elm); \ else \ (head)->cqh_first->field.cqe_prev = (elm); \ (head)->cqh_first = (elm); \ } while (0) #define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ (elm)->field.cqe_next = CIRCLEQ_END(head); \ (elm)->field.cqe_prev = (head)->cqh_last; \ if ((head)->cqh_first == CIRCLEQ_END(head)) \ (head)->cqh_first = (elm); \ else \ (head)->cqh_last->field.cqe_next = (elm); \ (head)->cqh_last = (elm); \ } while (0) #define CIRCLEQ_REMOVE(head, elm, field) do { \ if ((elm)->field.cqe_next == CIRCLEQ_END(head)) \ (head)->cqh_last = (elm)->field.cqe_prev; \ else \ (elm)->field.cqe_next->field.cqe_prev = \ (elm)->field.cqe_prev; \ if ((elm)->field.cqe_prev == CIRCLEQ_END(head)) \ (head)->cqh_first = (elm)->field.cqe_next; \ else \ (elm)->field.cqe_prev->field.cqe_next = \ (elm)->field.cqe_next; \ _Q_INVALIDATE((elm)->field.cqe_prev); \ _Q_INVALIDATE((elm)->field.cqe_next); \ } while (0) #define CIRCLEQ_REPLACE(head, elm, elm2, field) do { \ if (((elm2)->field.cqe_next = (elm)->field.cqe_next) == \ CIRCLEQ_END(head)) \ (head).cqh_last = (elm2); \ else \ (elm2)->field.cqe_next->field.cqe_prev = (elm2); \ if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) == \ CIRCLEQ_END(head)) \ (head).cqh_first = (elm2); \ else \ (elm2)->field.cqe_prev->field.cqe_next = (elm2); \ _Q_INVALIDATE((elm)->field.cqe_prev); \ _Q_INVALIDATE((elm)->field.cqe_next); \ } while (0) #endif /* !_SYS_QUEUE_H_ */ transmission-2.92/third-party/miniupnp/PaxHeaders.4960/portlistingparse.h0000644000000000000000000000013212442116703023546 xustar0030 mtime=1418239427.477328702 30 atime=1418239427.477328702 30 ctime=1457295918.920789552 transmission-2.92/third-party/miniupnp/portlistingparse.h0000644000175000017500000000357212442116703025202 0ustar00mikedldmikedld00000000000000/* $Id: portlistingparse.h,v 1.7 2012/09/27 15:42:10 nanard Exp $ */ /* MiniUPnP project * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * (c) 2011-2012 Thomas Bernard * This software is subject to the conditions detailed * in the LICENCE file provided within the distribution */ #ifndef PORTLISTINGPARSE_H_INCLUDED #define PORTLISTINGPARSE_H_INCLUDED #include "declspec.h" /* for the definition of UNSIGNED_INTEGER */ #include "miniupnpctypes.h" #if defined(NO_SYS_QUEUE_H) || defined(_WIN32) || defined(__HAIKU__) #include "bsdqueue.h" #else #include #endif #ifdef __cplusplus extern "C" { #endif /* sample of PortMappingEntry : 202.233.2.1 2345 TCP 2345 192.168.1.137 1 dooom 345 */ typedef enum { PortMappingEltNone, PortMappingEntry, NewRemoteHost, NewExternalPort, NewProtocol, NewInternalPort, NewInternalClient, NewEnabled, NewDescription, NewLeaseTime } portMappingElt; struct PortMapping { LIST_ENTRY(PortMapping) entries; UNSIGNED_INTEGER leaseTime; unsigned short externalPort; unsigned short internalPort; char remoteHost[64]; char internalClient[64]; char description[64]; char protocol[4]; unsigned char enabled; }; struct PortMappingParserData { LIST_HEAD(portmappinglisthead, PortMapping) head; portMappingElt curelt; }; LIBSPEC void ParsePortListing(const char * buffer, int bufsize, struct PortMappingParserData * pdata); LIBSPEC void FreePortListing(struct PortMappingParserData * pdata); #ifdef __cplusplus } #endif #endif transmission-2.92/third-party/miniupnp/PaxHeaders.4960/minisoap.c0000644000000000000000000000013212442116703021747 xustar0030 mtime=1418239427.477328702 30 atime=1418239427.477328702 30 ctime=1457295918.968790368 transmission-2.92/third-party/miniupnp/minisoap.c0000644000175000017500000000670712442116703023406 0ustar00mikedldmikedld00000000000000/* $Id: minisoap.c,v 1.22 2012/01/21 13:30:31 nanard Exp $ */ /* Project : miniupnp * Author : Thomas Bernard * Copyright (c) 2005-2012 Thomas Bernard * This software is subject to the conditions detailed in the * LICENCE file provided in this distribution. * * Minimal SOAP implementation for UPnP protocol. */ #include #include #ifdef _WIN32 #include #include #define snprintf _snprintf #else #include #include #include #endif #include "minisoap.h" #include "miniupnpcstrings.h" /* only for malloc */ #include #ifdef _WIN32 #define PRINT_SOCKET_ERROR(x) printf("Socket error: %s, %d\n", x, WSAGetLastError()); #else #define PRINT_SOCKET_ERROR(x) perror(x) #endif /* httpWrite sends the headers and the body to the socket * and returns the number of bytes sent */ static int httpWrite(int fd, const char * body, int bodysize, const char * headers, int headerssize) { int n = 0; /*n = write(fd, headers, headerssize);*/ /*if(bodysize>0) n += write(fd, body, bodysize);*/ /* Note : my old linksys router only took into account * soap request that are sent into only one packet */ char * p; /* TODO: AVOID MALLOC */ p = malloc(headerssize+bodysize); if(!p) return 0; memcpy(p, headers, headerssize); memcpy(p+headerssize, body, bodysize); /*n = write(fd, p, headerssize+bodysize);*/ n = send(fd, p, headerssize+bodysize, 0); if(n<0) { PRINT_SOCKET_ERROR("send"); } /* disable send on the socket */ /* draytek routers dont seems to like that... */ #if 0 #ifdef _WIN32 if(shutdown(fd, SD_SEND)<0) { #else if(shutdown(fd, SHUT_WR)<0) { /*SD_SEND*/ #endif PRINT_SOCKET_ERROR("shutdown"); } #endif free(p); return n; } /* self explanatory */ int soapPostSubmit(int fd, const char * url, const char * host, unsigned short port, const char * action, const char * body, const char * httpversion) { int bodysize; char headerbuf[512]; int headerssize; char portstr[8]; bodysize = (int)strlen(body); /* We are not using keep-alive HTTP connections. * HTTP/1.1 needs the header Connection: close to do that. * This is the default with HTTP/1.0 * Using HTTP/1.1 means we need to support chunked transfer-encoding : * When using HTTP/1.1, the router "BiPAC 7404VNOX" always use chunked * transfer encoding. */ /* Connection: Close is normally there only in HTTP/1.1 but who knows */ portstr[0] = '\0'; if(port != 80) snprintf(portstr, sizeof(portstr), ":%hu", port); headerssize = snprintf(headerbuf, sizeof(headerbuf), "POST %s HTTP/%s\r\n" "Host: %s%s\r\n" "User-Agent: " OS_STRING ", UPnP/1.0, MiniUPnPc/" MINIUPNPC_VERSION_STRING "\r\n" "Content-Length: %d\r\n" "Content-Type: text/xml\r\n" "SOAPAction: \"%s\"\r\n" "Connection: Close\r\n" "Cache-Control: no-cache\r\n" /* ??? */ "Pragma: no-cache\r\n" "\r\n", url, httpversion, host, portstr, bodysize, action); #ifdef DEBUG /*printf("SOAP request : headersize=%d bodysize=%d\n", headerssize, bodysize); */ printf("SOAP request : POST %s HTTP/%s - Host: %s%s\n", url, httpversion, host, portstr); printf("SOAPAction: \"%s\" - Content-Length: %d\n", action, bodysize); printf("Headers :\n%s", headerbuf); printf("Body :\n%s\n", body); #endif return httpWrite(fd, body, bodysize, headerbuf, headerssize); } transmission-2.92/third-party/miniupnp/PaxHeaders.4960/updateminiupnpcstrings.sh0000644000000000000000000000013212666747213025155 xustar0030 mtime=1457245835.410000263 30 atime=1457245835.410000263 30 ctime=1457295919.035791508 transmission-2.92/third-party/miniupnp/updateminiupnpcstrings.sh0000755000175000017500000000272612666747213026614 0ustar00mikedldmikedld00000000000000#! /bin/sh # $Id: updateminiupnpcstrings.sh,v 1.7 2011/01/04 11:41:53 nanard Exp $ # project miniupnp : http://miniupnp.free.fr/ # (c) 2009 Thomas Bernard VERSION_FILE="$1" TEMPLATE_FILE="$2" FILE="$3" TMPFILE="$3.tmp" # detecting the OS name and version OS_NAME=`uname -s` OS_VERSION=`uname -r` if [ -f /etc/debian_version ]; then OS_NAME=Debian OS_VERSION=`cat /etc/debian_version` fi # use lsb_release (Linux Standard Base) when available LSB_RELEASE=`which lsb_release` if [ 0 -eq $? -a -x "${LSB_RELEASE}" ]; then OS_NAME=`${LSB_RELEASE} -i -s` OS_VERSION=`${LSB_RELEASE} -r -s` case $OS_NAME in Debian) #OS_VERSION=`${LSB_RELEASE} -c -s` ;; Ubuntu) #OS_VERSION=`${LSB_RELEASE} -c -s` ;; esac fi # on AmigaOS 3, uname -r returns "unknown", so we use uname -v if [ "$OS_NAME" = "AmigaOS" ]; then if [ "$OS_VERSION" = "unknown" ]; then OS_VERSION=`uname -v` fi fi echo "Detected OS [$OS_NAME] version [$OS_VERSION]" MINIUPNPC_VERSION=`cat "${VERSION_FILE}"` echo "MiniUPnPc version [${MINIUPNPC_VERSION}]" EXPR="s|OS_STRING \".*\"|OS_STRING \"${OS_NAME}/${OS_VERSION}\"|" #echo $EXPR test -f "${FILE}.in" echo "setting OS_STRING macro value to ${OS_NAME}/${OS_VERSION} in $FILE." sed -e "$EXPR" < "$TEMPLATE_FILE" > "$TMPFILE" EXPR="s|MINIUPNPC_VERSION_STRING \".*\"|MINIUPNPC_VERSION_STRING \"${MINIUPNPC_VERSION}\"|" echo "setting MINIUPNPC_VERSION_STRING macro value to ${MINIUPNPC_VERSION} in $FILE." sed -e "$EXPR" < "$TMPFILE" > "$FILE" rm "$TMPFILE" transmission-2.92/third-party/miniupnp/PaxHeaders.4960/upnpreplyparse.c0000644000000000000000000000013212442116703023221 xustar0030 mtime=1418239427.479328736 30 atime=1418239427.479328736 30 ctime=1457295919.016791185 transmission-2.92/third-party/miniupnp/upnpreplyparse.c0000644000175000017500000001017212442116703024647 0ustar00mikedldmikedld00000000000000/* $Id: upnpreplyparse.c,v 1.15 2013/06/06 21:36:40 nanard Exp $ */ /* MiniUPnP project * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * (c) 2006-2013 Thomas Bernard * This software is subject to the conditions detailed * in the LICENCE file provided within the distribution */ #include #include #include #include "upnpreplyparse.h" #include "minixml.h" static void NameValueParserStartElt(void * d, const char * name, int l) { struct NameValueParserData * data = (struct NameValueParserData *)d; data->topelt = 1; if(l>63) l = 63; memcpy(data->curelt, name, l); data->curelt[l] = '\0'; data->cdata = NULL; data->cdatalen = 0; } static void NameValueParserEndElt(void * d, const char * name, int l) { struct NameValueParserData * data = (struct NameValueParserData *)d; struct NameValue * nv; (void)name; (void)l; if(!data->topelt) return; if(strcmp(data->curelt, "NewPortListing") != 0) { int l; /* standard case. Limited to n chars strings */ l = data->cdatalen; nv = malloc(sizeof(struct NameValue)); if(l>=(int)sizeof(nv->value)) l = sizeof(nv->value) - 1; strncpy(nv->name, data->curelt, 64); nv->name[63] = '\0'; if(data->cdata != NULL) { memcpy(nv->value, data->cdata, l); nv->value[l] = '\0'; } else { nv->value[0] = '\0'; } LIST_INSERT_HEAD( &(data->head), nv, entries); } data->cdata = NULL; data->cdatalen = 0; data->topelt = 0; } static void NameValueParserGetData(void * d, const char * datas, int l) { struct NameValueParserData * data = (struct NameValueParserData *)d; if(strcmp(data->curelt, "NewPortListing") == 0) { /* specific case for NewPortListing which is a XML Document */ data->portListing = malloc(l + 1); if(!data->portListing) { /* malloc error */ return; } memcpy(data->portListing, datas, l); data->portListing[l] = '\0'; data->portListingLength = l; } else { /* standard case. */ data->cdata = datas; data->cdatalen = l; } } void ParseNameValue(const char * buffer, int bufsize, struct NameValueParserData * data) { struct xmlparser parser; LIST_INIT(&(data->head)); data->portListing = NULL; data->portListingLength = 0; /* init xmlparser object */ parser.xmlstart = buffer; parser.xmlsize = bufsize; parser.data = data; parser.starteltfunc = NameValueParserStartElt; parser.endeltfunc = NameValueParserEndElt; parser.datafunc = NameValueParserGetData; parser.attfunc = 0; parsexml(&parser); } void ClearNameValueList(struct NameValueParserData * pdata) { struct NameValue * nv; if(pdata->portListing) { free(pdata->portListing); pdata->portListing = NULL; pdata->portListingLength = 0; } while((nv = pdata->head.lh_first) != NULL) { LIST_REMOVE(nv, entries); free(nv); } } char * GetValueFromNameValueList(struct NameValueParserData * pdata, const char * Name) { struct NameValue * nv; char * p = NULL; for(nv = pdata->head.lh_first; (nv != NULL) && (p == NULL); nv = nv->entries.le_next) { if(strcmp(nv->name, Name) == 0) p = nv->value; } return p; } #if 0 /* useless now that minixml ignores namespaces by itself */ char * GetValueFromNameValueListIgnoreNS(struct NameValueParserData * pdata, const char * Name) { struct NameValue * nv; char * p = NULL; char * pname; for(nv = pdata->head.lh_first; (nv != NULL) && (p == NULL); nv = nv->entries.le_next) { pname = strrchr(nv->name, ':'); if(pname) pname++; else pname = nv->name; if(strcmp(pname, Name)==0) p = nv->value; } return p; } #endif /* debug all-in-one function * do parsing then display to stdout */ #ifdef DEBUG void DisplayNameValueList(char * buffer, int bufsize) { struct NameValueParserData pdata; struct NameValue * nv; ParseNameValue(buffer, bufsize, &pdata); for(nv = pdata.head.lh_first; nv != NULL; nv = nv->entries.le_next) { printf("%s = %s\n", nv->name, nv->value); } ClearNameValueList(&pdata); } #endif transmission-2.92/third-party/miniupnp/PaxHeaders.4960/miniupnpc.c0000644000000000000000000000013212505250244022131 xustar0030 mtime=1427460260.061236712 30 atime=1427460260.061236712 30 ctime=1457295918.984790641 transmission-2.92/third-party/miniupnp/miniupnpc.c0000644000175000017500000007033412505250244023565 0ustar00mikedldmikedld00000000000000/* $Id: miniupnpc.c,v 1.117 2014/01/31 14:19:13 nanard Exp $ */ /* Project : miniupnp * Web : http://miniupnp.free.fr/ * Author : Thomas BERNARD * copyright (c) 2005-2014 Thomas Bernard * This software is subjet to the conditions detailed in the * provided LICENSE file. */ #define __EXTENSIONS__ 1 #if !defined(__APPLE__) && !defined(__sun) #if !defined(_XOPEN_SOURCE) && !defined(__OpenBSD__) && !defined(__NetBSD__) #ifndef __cplusplus #define _XOPEN_SOURCE 600 #endif #endif #ifndef __BSD_VISIBLE #define __BSD_VISIBLE 1 #endif #endif #if !defined(__DragonFly__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__APPLE__) && !defined(_WIN32) && !defined(__CYGWIN__) && !defined(__sun) #define HAS_IP_MREQN #endif #include #include #include #ifdef _WIN32 /* Win32 Specific includes and defines */ #include #include #include #include #define snprintf _snprintf #define strdup _strdup #ifndef strncasecmp #if defined(_MSC_VER) && (_MSC_VER >= 1400) #define strncasecmp _memicmp #else /* defined(_MSC_VER) && (_MSC_VER >= 1400) */ #define strncasecmp memicmp #endif /* defined(_MSC_VER) && (_MSC_VER >= 1400) */ #endif /* #ifndef strncasecmp */ #define MAXHOSTNAMELEN 64 #else /* #ifdef _WIN32 */ /* Standard POSIX includes */ #include #if defined(__amigaos__) && !defined(__amigaos4__) /* Amiga OS 3 specific stuff */ #define socklen_t int #else #include #endif #include #include #include #include #include #include #include #if !defined(__amigaos__) && !defined(__amigaos4__) #include #endif #include #include #define closesocket close #endif /* #else _WIN32 */ #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT #include #endif #if defined(__amigaos__) || defined(__amigaos4__) /* Amiga OS specific stuff */ #define TIMEVAL struct timeval #endif #if defined(HAS_IP_MREQN) && defined(NEED_STRUCT_IP_MREQN) /* Several versions of glibc don't define this structure, define it here and compile with CFLAGS NEED_STRUCT_IP_MREQN */ struct ip_mreqn { struct in_addr imr_multiaddr; /* IP multicast address of group */ struct in_addr imr_address; /* local IP address of interface */ int imr_ifindex; /* Interface index */ }; #endif #include "miniupnpc.h" #include "minissdpc.h" #include "miniwget.h" #include "minisoap.h" #include "minixml.h" #include "upnpcommands.h" #include "connecthostport.h" #include "receivedata.h" #ifdef _WIN32 #define PRINT_SOCKET_ERROR(x) printf("Socket error: %s, %d\n", x, WSAGetLastError()); #else #define PRINT_SOCKET_ERROR(x) perror(x) #endif #ifndef MAXHOSTNAMELEN #define MAXHOSTNAMELEN 64 #endif #define SOAPPREFIX "s" #define SERVICEPREFIX "u" #define SERVICEPREFIX2 'u' /* root description parsing */ LIBSPEC void parserootdesc(const char * buffer, int bufsize, struct IGDdatas * data) { struct xmlparser parser; /* xmlparser object */ parser.xmlstart = buffer; parser.xmlsize = bufsize; parser.data = data; parser.starteltfunc = IGDstartelt; parser.endeltfunc = IGDendelt; parser.datafunc = IGDdata; parser.attfunc = 0; parsexml(&parser); #ifdef DEBUG printIGD(data); #endif } /* simpleUPnPcommand2 : * not so simple ! * return values : * pointer - OK * NULL - error */ static char * simpleUPnPcommand2(int s, const char * url, const char * service, const char * action, struct UPNParg * args, int * bufsize, const char * httpversion) { char hostname[MAXHOSTNAMELEN+1]; unsigned short port = 0; char * path; char soapact[128]; char soapbody[2048]; char * buf; int n; *bufsize = 0; snprintf(soapact, sizeof(soapact), "%s#%s", service, action); if(args==NULL) { /*soapbodylen = */snprintf(soapbody, sizeof(soapbody), "\r\n" "<" SOAPPREFIX ":Envelope " "xmlns:" SOAPPREFIX "=\"http://schemas.xmlsoap.org/soap/envelope/\" " SOAPPREFIX ":encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" "<" SOAPPREFIX ":Body>" "<" SERVICEPREFIX ":%s xmlns:" SERVICEPREFIX "=\"%s\">" "" "" "\r\n", action, service, action); } else { char * p; const char * pe, * pv; int soapbodylen; soapbodylen = snprintf(soapbody, sizeof(soapbody), "\r\n" "<" SOAPPREFIX ":Envelope " "xmlns:" SOAPPREFIX "=\"http://schemas.xmlsoap.org/soap/envelope/\" " SOAPPREFIX ":encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" "<" SOAPPREFIX ":Body>" "<" SERVICEPREFIX ":%s xmlns:" SERVICEPREFIX "=\"%s\">", action, service); p = soapbody + soapbodylen; while(args->elt) { /* check that we are never overflowing the string... */ if(soapbody + sizeof(soapbody) <= p + 100) { /* we keep a margin of at least 100 bytes */ return NULL; } *(p++) = '<'; pe = args->elt; while(*pe) *(p++) = *(pe++); *(p++) = '>'; if((pv = args->val)) { while(*pv) *(p++) = *(pv++); } *(p++) = '<'; *(p++) = '/'; pe = args->elt; while(*pe) *(p++) = *(pe++); *(p++) = '>'; args++; } *(p++) = '<'; *(p++) = '/'; *(p++) = SERVICEPREFIX2; *(p++) = ':'; pe = action; while(*pe) *(p++) = *(pe++); strncpy(p, ">\r\n", soapbody + sizeof(soapbody) - p); } if(!parseURL(url, hostname, &port, &path, NULL)) return NULL; if(s < 0) { s = connecthostport(hostname, port, 0); if(s < 0) { /* failed to connect */ return NULL; } } n = soapPostSubmit(s, path, hostname, port, soapact, soapbody, httpversion); if(n<=0) { #ifdef DEBUG printf("Error sending SOAP request\n"); #endif closesocket(s); return NULL; } buf = getHTTPResponse(s, bufsize); #ifdef DEBUG if(*bufsize > 0 && buf) { printf("SOAP Response :\n%.*s\n", *bufsize, buf); } #endif closesocket(s); return buf; } /* simpleUPnPcommand : * not so simple ! * return values : * pointer - OK * NULL - error */ char * simpleUPnPcommand(int s, const char * url, const char * service, const char * action, struct UPNParg * args, int * bufsize) { char * buf; #if 1 buf = simpleUPnPcommand2(s, url, service, action, args, bufsize, "1.1"); #else buf = simpleUPnPcommand2(s, url, service, action, args, bufsize, "1.0"); if (!buf || *bufsize == 0) { #if DEBUG printf("Error or no result from SOAP request; retrying with HTTP/1.1\n"); #endif buf = simpleUPnPcommand2(s, url, service, action, args, bufsize, "1.1"); } #endif return buf; } /* parseMSEARCHReply() * the last 4 arguments are filled during the parsing : * - location/locationsize : "location:" field of the SSDP reply packet * - st/stsize : "st:" field of the SSDP reply packet. * The strings are NOT null terminated */ static void parseMSEARCHReply(const char * reply, int size, const char * * location, int * locationsize, const char * * st, int * stsize) { int a, b, i; i = 0; a = i; /* start of the line */ b = 0; /* end of the "header" (position of the colon) */ while(isin6_family = AF_INET6; if(sameport) p->sin6_port = htons(PORT); p->sin6_addr = in6addr_any; /* in6addr_any is not available with MinGW32 3.4.2 */ } else { struct sockaddr_in * p = (struct sockaddr_in *)&sockudp_r; p->sin_family = AF_INET; if(sameport) p->sin_port = htons(PORT); p->sin_addr.s_addr = INADDR_ANY; } #ifdef _WIN32 /* This code could help us to use the right Network interface for * SSDP multicast traffic */ /* Get IP associated with the index given in the ip_forward struct * in order to give this ip to setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF) */ if(!ipv6 && (GetBestRoute(inet_addr("223.255.255.255"), 0, &ip_forward) == NO_ERROR)) { DWORD dwRetVal = 0; PMIB_IPADDRTABLE pIPAddrTable; DWORD dwSize = 0; #ifdef DEBUG IN_ADDR IPAddr; #endif int i; #ifdef DEBUG printf("ifIndex=%lu nextHop=%lx \n", ip_forward.dwForwardIfIndex, ip_forward.dwForwardNextHop); #endif pIPAddrTable = (MIB_IPADDRTABLE *) malloc(sizeof (MIB_IPADDRTABLE)); if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { free(pIPAddrTable); pIPAddrTable = (MIB_IPADDRTABLE *) malloc(dwSize); } if(pIPAddrTable) { dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 ); #ifdef DEBUG printf("\tNum Entries: %ld\n", pIPAddrTable->dwNumEntries); #endif for (i=0; i < (int) pIPAddrTable->dwNumEntries; i++) { #ifdef DEBUG printf("\n\tInterface Index[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwIndex); IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwAddr; printf("\tIP Address[%d]: \t%s\n", i, inet_ntoa(IPAddr) ); IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwMask; printf("\tSubnet Mask[%d]: \t%s\n", i, inet_ntoa(IPAddr) ); IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwBCastAddr; printf("\tBroadCast[%d]: \t%s (%ld)\n", i, inet_ntoa(IPAddr), pIPAddrTable->table[i].dwBCastAddr); printf("\tReassembly size[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwReasmSize); printf("\tType and State[%d]:", i); printf("\n"); #endif if (pIPAddrTable->table[i].dwIndex == ip_forward.dwForwardIfIndex) { /* Set the address of this interface to be used */ struct in_addr mc_if; memset(&mc_if, 0, sizeof(mc_if)); mc_if.s_addr = pIPAddrTable->table[i].dwAddr; if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&mc_if, sizeof(mc_if)) < 0) { PRINT_SOCKET_ERROR("setsockopt"); } ((struct sockaddr_in *)&sockudp_r)->sin_addr.s_addr = pIPAddrTable->table[i].dwAddr; #ifndef DEBUG break; #endif } } free(pIPAddrTable); pIPAddrTable = NULL; } } #endif #ifdef _WIN32 if (setsockopt(sudp, SOL_SOCKET, SO_REUSEADDR, (const char *)&opt, sizeof (opt)) < 0) #else if (setsockopt(sudp, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)) < 0) #endif { if(error) *error = UPNPDISCOVER_SOCKET_ERROR; PRINT_SOCKET_ERROR("setsockopt"); return NULL; } if(multicastif) { if(ipv6) { #if !defined(_WIN32) /* according to MSDN, if_nametoindex() is supported since * MS Windows Vista and MS Windows Server 2008. * http://msdn.microsoft.com/en-us/library/bb408409%28v=vs.85%29.aspx */ unsigned int ifindex = if_nametoindex(multicastif); /* eth0, etc. */ if(setsockopt(sudp, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifindex, sizeof(&ifindex)) < 0) { PRINT_SOCKET_ERROR("setsockopt"); } #else #ifdef DEBUG printf("Setting of multicast interface not supported in IPv6 under Windows.\n"); #endif #endif } else { struct in_addr mc_if; mc_if.s_addr = inet_addr(multicastif); /* ex: 192.168.x.x */ if(mc_if.s_addr != INADDR_NONE) { ((struct sockaddr_in *)&sockudp_r)->sin_addr.s_addr = mc_if.s_addr; if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&mc_if, sizeof(mc_if)) < 0) { PRINT_SOCKET_ERROR("setsockopt"); } } else { #ifdef HAS_IP_MREQN /* was not an ip address, try with an interface name */ struct ip_mreqn reqn; /* only defined with -D_BSD_SOURCE or -D_GNU_SOURCE */ memset(&reqn, 0, sizeof(struct ip_mreqn)); reqn.imr_ifindex = if_nametoindex(multicastif); if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&reqn, sizeof(reqn)) < 0) { PRINT_SOCKET_ERROR("setsockopt"); } #else #ifdef DEBUG printf("Setting of multicast interface not supported with interface name.\n"); #endif #endif } } } /* Before sending the packed, we first "bind" in order to be able * to receive the response */ if (bind(sudp, (const struct sockaddr *)&sockudp_r, ipv6 ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)) != 0) { if(error) *error = UPNPDISCOVER_SOCKET_ERROR; PRINT_SOCKET_ERROR("bind"); closesocket(sudp); return NULL; } if(error) *error = UPNPDISCOVER_SUCCESS; /* Calculating maximum response time in seconds */ mx = ((unsigned int)delay) / 1000u; if(mx == 0) { mx = 1; delay = 1000; } /* receiving SSDP response packet */ for(n = 0; deviceList[deviceIndex]; deviceIndex++) { if(n == 0) { /* sending the SSDP M-SEARCH packet */ n = snprintf(bufr, sizeof(bufr), MSearchMsgFmt, ipv6 ? (linklocal ? "[" UPNP_MCAST_LL_ADDR "]" : "[" UPNP_MCAST_SL_ADDR "]") : UPNP_MCAST_ADDR, deviceList[deviceIndex], mx); #ifdef DEBUG printf("Sending %s", bufr); #endif #ifdef NO_GETADDRINFO /* the following code is not using getaddrinfo */ /* emission */ memset(&sockudp_w, 0, sizeof(struct sockaddr_storage)); if(ipv6) { struct sockaddr_in6 * p = (struct sockaddr_in6 *)&sockudp_w; p->sin6_family = AF_INET6; p->sin6_port = htons(PORT); inet_pton(AF_INET6, linklocal ? UPNP_MCAST_LL_ADDR : UPNP_MCAST_SL_ADDR, &(p->sin6_addr)); } else { struct sockaddr_in * p = (struct sockaddr_in *)&sockudp_w; p->sin_family = AF_INET; p->sin_port = htons(PORT); p->sin_addr.s_addr = inet_addr(UPNP_MCAST_ADDR); } n = sendto(sudp, bufr, n, 0, &sockudp_w, ipv6 ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)); if (n < 0) { if(error) *error = UPNPDISCOVER_SOCKET_ERROR; PRINT_SOCKET_ERROR("sendto"); break; } #else /* #ifdef NO_GETADDRINFO */ memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; /* AF_INET6 or AF_INET */ hints.ai_socktype = SOCK_DGRAM; /*hints.ai_flags = */ if ((rv = getaddrinfo(ipv6 ? (linklocal ? UPNP_MCAST_LL_ADDR : UPNP_MCAST_SL_ADDR) : UPNP_MCAST_ADDR, XSTR(PORT), &hints, &servinfo)) != 0) { if(error) *error = UPNPDISCOVER_SOCKET_ERROR; #ifdef _WIN32 fprintf(stderr, "getaddrinfo() failed: %d\n", rv); #else fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); #endif break; } for(p = servinfo; p; p = p->ai_next) { n = sendto(sudp, bufr, n, 0, p->ai_addr, p->ai_addrlen); if (n < 0) { #ifdef DEBUG char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; if (getnameinfo(p->ai_addr, p->ai_addrlen, hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) == 0) { fprintf(stderr, "host:%s port:%s\n", hbuf, sbuf); } #endif PRINT_SOCKET_ERROR("sendto"); continue; } } freeaddrinfo(servinfo); if(n < 0) { if(error) *error = UPNPDISCOVER_SOCKET_ERROR; break; } #endif /* #ifdef NO_GETADDRINFO */ } /* Waiting for SSDP REPLY packet to M-SEARCH */ n = receivedata(sudp, bufr, sizeof(bufr), delay, &scope_id); if (n < 0) { /* error */ if(error) *error = UPNPDISCOVER_SOCKET_ERROR; break; } else if (n == 0) { /* no data or Time Out */ if (devlist) { /* no more device type to look for... */ if(error) *error = UPNPDISCOVER_SUCCESS; break; } if(ipv6) { if(linklocal) { linklocal = 0; --deviceIndex; } else { linklocal = 1; } } } else { const char * descURL=NULL; int urlsize=0; const char * st=NULL; int stsize=0; /*printf("%d byte(s) :\n%s\n", n, bufr);*/ /* affichage du message */ parseMSEARCHReply(bufr, n, &descURL, &urlsize, &st, &stsize); if(st&&descURL) { #ifdef DEBUG printf("M-SEARCH Reply:\nST: %.*s\nLocation: %.*s\n", stsize, st, urlsize, descURL); #endif for(tmp=devlist; tmp; tmp = tmp->pNext) { if(memcmp(tmp->descURL, descURL, urlsize) == 0 && tmp->descURL[urlsize] == '\0' && memcmp(tmp->st, st, stsize) == 0 && tmp->st[stsize] == '\0') break; } /* at the exit of the loop above, tmp is null if * no duplicate device was found */ if(tmp) continue; tmp = (struct UPNPDev *)malloc(sizeof(struct UPNPDev)+urlsize+stsize); if(!tmp) { /* memory allocation error */ if(error) *error = UPNPDISCOVER_MEMORY_ERROR; break; } tmp->pNext = devlist; tmp->descURL = tmp->buffer; tmp->st = tmp->buffer + 1 + urlsize; memcpy(tmp->buffer, descURL, urlsize); tmp->buffer[urlsize] = '\0'; memcpy(tmp->buffer + urlsize + 1, st, stsize); tmp->buffer[urlsize+1+stsize] = '\0'; tmp->scope_id = scope_id; devlist = tmp; } } } closesocket(sudp); return devlist; } /* freeUPNPDevlist() should be used to * free the chained list returned by upnpDiscover() */ LIBSPEC void freeUPNPDevlist(struct UPNPDev * devlist) { struct UPNPDev * next; while(devlist) { next = devlist->pNext; free(devlist); devlist = next; } } static void url_cpy_or_cat(char * dst, const char * src, int n) { if( (src[0] == 'h') &&(src[1] == 't') &&(src[2] == 't') &&(src[3] == 'p') &&(src[4] == ':') &&(src[5] == '/') &&(src[6] == '/')) { strncpy(dst, src, n); } else { int l = strlen(dst); if(src[0] != '/') dst[l++] = '/'; if(l<=n) strncpy(dst + l, src, n - l); } } /* Prepare the Urls for usage... */ LIBSPEC void GetUPNPUrls(struct UPNPUrls * urls, struct IGDdatas * data, const char * descURL, unsigned int scope_id) { char * p; int n1, n2, n3, n4; #ifdef IF_NAMESIZE char ifname[IF_NAMESIZE]; #else char scope_str[8]; #endif n1 = strlen(data->urlbase); if(n1==0) n1 = strlen(descURL); if(scope_id != 0) { #ifdef IF_NAMESIZE if(if_indextoname(scope_id, ifname)) { n1 += 3 + strlen(ifname); /* 3 == strlen(%25) */ } #else /* under windows, scope is numerical */ snprintf(scope_str, sizeof(scope_str), "%u", scope_id); #endif } n1 += 2; /* 1 byte more for Null terminator, 1 byte for '/' if needed */ n2 = n1; n3 = n1; n4 = n1; n1 += strlen(data->first.scpdurl); n2 += strlen(data->first.controlurl); n3 += strlen(data->CIF.controlurl); n4 += strlen(data->IPv6FC.controlurl); /* allocate memory to store URLs */ urls->ipcondescURL = (char *)malloc(n1); urls->controlURL = (char *)malloc(n2); urls->controlURL_CIF = (char *)malloc(n3); urls->controlURL_6FC = (char *)malloc(n4); /* strdup descURL */ urls->rootdescURL = strdup(descURL); /* get description of WANIPConnection */ if(data->urlbase[0] != '\0') strncpy(urls->ipcondescURL, data->urlbase, n1); else strncpy(urls->ipcondescURL, descURL, n1); p = strchr(urls->ipcondescURL+7, '/'); if(p) p[0] = '\0'; if(scope_id != 0) { if(0 == memcmp(urls->ipcondescURL, "http://[fe80:", 13)) { /* this is a linklocal IPv6 address */ p = strchr(urls->ipcondescURL, ']'); if(p) { /* insert %25 into URL */ #ifdef IF_NAMESIZE memmove(p + 3 + strlen(ifname), p, strlen(p) + 1); memcpy(p, "%25", 3); memcpy(p + 3, ifname, strlen(ifname)); #else memmove(p + 3 + strlen(scope_str), p, strlen(p) + 1); memcpy(p, "%25", 3); memcpy(p + 3, scope_str, strlen(scope_str)); #endif } } } strncpy(urls->controlURL, urls->ipcondescURL, n2); strncpy(urls->controlURL_CIF, urls->ipcondescURL, n3); strncpy(urls->controlURL_6FC, urls->ipcondescURL, n4); url_cpy_or_cat(urls->ipcondescURL, data->first.scpdurl, n1); url_cpy_or_cat(urls->controlURL, data->first.controlurl, n2); url_cpy_or_cat(urls->controlURL_CIF, data->CIF.controlurl, n3); url_cpy_or_cat(urls->controlURL_6FC, data->IPv6FC.controlurl, n4); #ifdef DEBUG printf("urls->ipcondescURL='%s' %u n1=%d\n", urls->ipcondescURL, (unsigned)strlen(urls->ipcondescURL), n1); printf("urls->controlURL='%s' %u n2=%d\n", urls->controlURL, (unsigned)strlen(urls->controlURL), n2); printf("urls->controlURL_CIF='%s' %u n3=%d\n", urls->controlURL_CIF, (unsigned)strlen(urls->controlURL_CIF), n3); printf("urls->controlURL_6FC='%s' %u n4=%d\n", urls->controlURL_6FC, (unsigned)strlen(urls->controlURL_6FC), n4); #endif } LIBSPEC void FreeUPNPUrls(struct UPNPUrls * urls) { if(!urls) return; free(urls->controlURL); urls->controlURL = 0; free(urls->ipcondescURL); urls->ipcondescURL = 0; free(urls->controlURL_CIF); urls->controlURL_CIF = 0; free(urls->controlURL_6FC); urls->controlURL_6FC = 0; free(urls->rootdescURL); urls->rootdescURL = 0; } int UPNPIGD_IsConnected(struct UPNPUrls * urls, struct IGDdatas * data) { char status[64]; unsigned int uptime; status[0] = '\0'; UPNP_GetStatusInfo(urls->controlURL, data->first.servicetype, status, &uptime, NULL); if(0 == strcmp("Connected", status)) { return 1; } else return 0; } /* UPNP_GetValidIGD() : * return values : * -1 = Internal error * 0 = NO IGD found * 1 = A valid connected IGD has been found * 2 = A valid IGD has been found but it reported as * not connected * 3 = an UPnP device has been found but was not recognized as an IGD * * In any positive non zero return case, the urls and data structures * passed as parameters are set. Donc forget to call FreeUPNPUrls(urls) to * free allocated memory. */ LIBSPEC int UPNP_GetValidIGD(struct UPNPDev * devlist, struct UPNPUrls * urls, struct IGDdatas * data, char * lanaddr, int lanaddrlen) { struct xml_desc { char * xml; int size; int is_igd; } * desc = NULL; struct UPNPDev * dev; int ndev = 0; int i; int state = -1; /* state 1 : IGD connected. State 2 : IGD. State 3 : anything */ int n_igd = 0; char extIpAddr[16]; if(!devlist) { #ifdef DEBUG printf("Empty devlist\n"); #endif return 0; } /* counting total number of devices in the list */ for(dev = devlist; dev; dev = dev->pNext) ndev++; if(ndev > 0) { desc = calloc(ndev, sizeof(struct xml_desc)); if(!desc) return -1; /* memory allocation error */ } /* Step 1 : downloading descriptions and testing type */ for(dev = devlist, i = 0; dev; dev = dev->pNext, i++) { /* we should choose an internet gateway device. * with st == urn:schemas-upnp-org:device:InternetGatewayDevice:1 */ desc[i].xml = miniwget_getaddr(dev->descURL, &(desc[i].size), lanaddr, lanaddrlen, dev->scope_id); #ifdef DEBUG if(!desc[i].xml) { printf("error getting XML description %s\n", dev->descURL); } #endif if(desc[i].xml) { memset(data, 0, sizeof(struct IGDdatas)); memset(urls, 0, sizeof(struct UPNPUrls)); parserootdesc(desc[i].xml, desc[i].size, data); if(0==strcmp(data->CIF.servicetype, "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1")) { desc[i].is_igd = 1; n_igd++; } } } /* iterate the list to find a device depending on state */ for(state = 1; state <= 3; state++) { for(dev = devlist, i = 0; dev; dev = dev->pNext, i++) { if(desc[i].xml) { memset(data, 0, sizeof(struct IGDdatas)); memset(urls, 0, sizeof(struct UPNPUrls)); parserootdesc(desc[i].xml, desc[i].size, data); if(desc[i].is_igd || state >= 3 ) { GetUPNPUrls(urls, data, dev->descURL, dev->scope_id); /* in state 2 and 3 we dont test if device is connected ! */ if(state >= 2) goto free_and_return; #ifdef DEBUG printf("UPNPIGD_IsConnected(%s) = %d\n", urls->controlURL, UPNPIGD_IsConnected(urls, data)); #endif /* checks that status is connected AND there is a external IP address assigned */ if(UPNPIGD_IsConnected(urls, data) && (UPNP_GetExternalIPAddress(urls->controlURL, data->first.servicetype, extIpAddr) == 0)) goto free_and_return; FreeUPNPUrls(urls); if(data->second.servicetype[0] != '\0') { #ifdef DEBUG printf("We tried %s, now we try %s !\n", data->first.servicetype, data->second.servicetype); #endif /* swaping WANPPPConnection and WANIPConnection ! */ memcpy(&data->tmp, &data->first, sizeof(struct IGDdatas_service)); memcpy(&data->first, &data->second, sizeof(struct IGDdatas_service)); memcpy(&data->second, &data->tmp, sizeof(struct IGDdatas_service)); GetUPNPUrls(urls, data, dev->descURL, dev->scope_id); #ifdef DEBUG printf("UPNPIGD_IsConnected(%s) = %d\n", urls->controlURL, UPNPIGD_IsConnected(urls, data)); #endif if(UPNPIGD_IsConnected(urls, data) && (UPNP_GetExternalIPAddress(urls->controlURL, data->first.servicetype, extIpAddr) == 0)) goto free_and_return; FreeUPNPUrls(urls); } } memset(data, 0, sizeof(struct IGDdatas)); } } } state = 0; free_and_return: if(desc) { for(i = 0; i < ndev; i++) { if(desc[i].xml) { free(desc[i].xml); } } free(desc); } return state; } /* UPNP_GetIGDFromUrl() * Used when skipping the discovery process. * return value : * 0 - Not ok * 1 - OK */ int UPNP_GetIGDFromUrl(const char * rootdescurl, struct UPNPUrls * urls, struct IGDdatas * data, char * lanaddr, int lanaddrlen) { char * descXML; int descXMLsize = 0; descXML = miniwget_getaddr(rootdescurl, &descXMLsize, lanaddr, lanaddrlen, 0); if(descXML) { memset(data, 0, sizeof(struct IGDdatas)); memset(urls, 0, sizeof(struct UPNPUrls)); parserootdesc(descXML, descXMLsize, data); free(descXML); descXML = NULL; GetUPNPUrls(urls, data, rootdescurl, 0); return 1; } else { return 0; } } transmission-2.92/third-party/miniupnp/PaxHeaders.4960/codelength.h0000644000000000000000000000013212442116703022251 xustar0030 mtime=1418239427.478328719 30 atime=1418239427.478328719 30 ctime=1457295918.868788668 transmission-2.92/third-party/miniupnp/codelength.h0000644000175000017500000000212512442116703023676 0ustar00mikedldmikedld00000000000000/* $Id: codelength.h,v 1.4 2012/09/27 15:40:29 nanard Exp $ */ /* Project : miniupnp * Author : Thomas BERNARD * copyright (c) 2005-2011 Thomas Bernard * This software is subjet to the conditions detailed in the * provided LICENCE file. */ #ifndef CODELENGTH_H_INCLUDED #define CODELENGTH_H_INCLUDED /* Encode length by using 7bit per Byte : * Most significant bit of each byte specifies that the * following byte is part of the code */ #define DECODELENGTH(n, p) n = 0; \ do { n = (n << 7) | (*p & 0x7f); } \ while((*(p++)&0x80) && (n<(1<<25))); #define DECODELENGTH_CHECKLIMIT(n, p, p_limit) \ n = 0; \ do { \ if((p) >= (p_limit)) break; \ n = (n << 7) | (*(p) & 0x7f); \ } while((*((p)++)&0x80) && (n<(1<<25))); #define CODELENGTH(n, p) if(n>=268435456) *(p++) = (n >> 28) | 0x80; \ if(n>=2097152) *(p++) = (n >> 21) | 0x80; \ if(n>=16384) *(p++) = (n >> 14) | 0x80; \ if(n>=128) *(p++) = (n >> 7) | 0x80; \ *(p++) = n & 0x7f; #endif transmission-2.92/third-party/miniupnp/PaxHeaders.4960/receivedata.c0000644000000000000000000000013212442116703022404 xustar0030 mtime=1418239427.476328685 30 atime=1418239427.476328685 30 ctime=1457295919.005790998 transmission-2.92/third-party/miniupnp/receivedata.c0000644000175000017500000000546012442116703024036 0ustar00mikedldmikedld00000000000000/* $Id: receivedata.c,v 1.5 2013/10/07 09:48:36 nanard Exp $ */ /* Project : miniupnp * Website : http://miniupnp.free.fr/ * Author : Thomas Bernard * Copyright (c) 2011-2012 Thomas Bernard * This software is subject to the conditions detailed in the * LICENCE file provided in this distribution. */ #include #ifdef _WIN32 #include #include #else #include #if defined(__amigaos__) && !defined(__amigaos4__) #define socklen_t int #else /* #if defined(__amigaos__) && !defined(__amigaos4__) */ #include #endif /* #else defined(__amigaos__) && !defined(__amigaos4__) */ #include #include #if !defined(__amigaos__) && !defined(__amigaos4__) #include #endif #include #define MINIUPNPC_IGNORE_EINTR #endif #ifdef _WIN32 #define PRINT_SOCKET_ERROR(x) printf("Socket error: %s, %d\n", x, WSAGetLastError()); #else #define PRINT_SOCKET_ERROR(x) perror(x) #endif #include "receivedata.h" int receivedata(int socket, char * data, int length, int timeout, unsigned int * scope_id) { #ifdef MINIUPNPC_GET_SRC_ADDR #ifdef DEBUG /* to shut up valgrind about uninit value */ struct sockaddr_storage src_addr = {0}; #else struct sockaddr_storage src_addr; #endif socklen_t src_addr_len = sizeof(src_addr); #endif int n; #if !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) /* using poll */ struct pollfd fds[1]; /* for the poll */ #ifdef MINIUPNPC_IGNORE_EINTR do { #endif fds[0].fd = socket; fds[0].events = POLLIN; n = poll(fds, 1, timeout); #ifdef MINIUPNPC_IGNORE_EINTR } while(n < 0 && errno == EINTR); #endif if(n < 0) { PRINT_SOCKET_ERROR("poll"); return -1; } else if(n == 0) { /* timeout */ return 0; } #else /* !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) */ /* using select under _WIN32 and amigaos */ fd_set socketSet; TIMEVAL timeval; FD_ZERO(&socketSet); FD_SET(socket, &socketSet); timeval.tv_sec = timeout / 1000; timeval.tv_usec = (timeout % 1000) * 1000; n = select(FD_SETSIZE, &socketSet, NULL, NULL, &timeval); if(n < 0) { PRINT_SOCKET_ERROR("select"); return -1; } else if(n == 0) { return 0; } #endif #ifdef MINIUPNPC_GET_SRC_ADDR n = recvfrom(socket, data, length, 0, (struct sockaddr *)&src_addr, &src_addr_len); #else n = recv(socket, data, length, 0); #endif if(n<0) { PRINT_SOCKET_ERROR("recv"); } #ifdef MINIUPNPC_GET_SRC_ADDR if (src_addr.ss_family == AF_INET6) { const struct sockaddr_in6 * src_addr6 = (struct sockaddr_in6 *)&src_addr; #ifdef DEBUG printf("scope_id=%u\n", src_addr6->sin6_scope_id); #endif if(scope_id) *scope_id = src_addr6->sin6_scope_id; } #endif return n; } transmission-2.92/third-party/miniupnp/PaxHeaders.4960/miniwget.c0000644000000000000000000000013212442116703021753 xustar0030 mtime=1418239427.478328719 30 atime=1418239427.478328719 30 ctime=1457295918.988790709 transmission-2.92/third-party/miniupnp/miniwget.c0000644000175000017500000003455112442116703023410 0ustar00mikedldmikedld00000000000000/* $Id: miniwget.c,v 1.61 2014/02/05 17:27:48 nanard Exp $ */ /* Project : miniupnp * Website : http://miniupnp.free.fr/ * Author : Thomas Bernard * Copyright (c) 2005-2014 Thomas Bernard * This software is subject to the conditions detailed in the * LICENCE file provided in this distribution. */ #include #include #include #include #ifdef _WIN32 #include #include #include #define MAXHOSTNAMELEN 64 #define MIN(x,y) (((x)<(y))?(x):(y)) #define snprintf _snprintf #define socklen_t int #ifndef strncasecmp #if defined(_MSC_VER) && (_MSC_VER >= 1400) #define strncasecmp _memicmp #else /* defined(_MSC_VER) && (_MSC_VER >= 1400) */ #define strncasecmp memicmp #endif /* defined(_MSC_VER) && (_MSC_VER >= 1400) */ #endif /* #ifndef strncasecmp */ #else /* #ifdef _WIN32 */ #include #include #if defined(__amigaos__) && !defined(__amigaos4__) #define socklen_t int #else /* #if defined(__amigaos__) && !defined(__amigaos4__) */ #include #endif /* #else defined(__amigaos__) && !defined(__amigaos4__) */ #include #include #include #include #include #define closesocket close #endif /* #else _WIN32 */ #if defined(__sun) || defined(sun) #define MIN(x,y) (((x)<(y))?(x):(y)) #endif #include "miniupnpcstrings.h" #include "miniwget.h" #include "connecthostport.h" #include "receivedata.h" #ifndef MAXHOSTNAMELEN #define MAXHOSTNAMELEN 64 #endif /* * Read a HTTP response from a socket. * Process Content-Length and Transfer-encoding headers. * return a pointer to the content buffer, which length is saved * to the length parameter. */ void * getHTTPResponse(int s, int * size) { char buf[2048]; int n; int endofheaders = 0; int chunked = 0; int content_length = -1; unsigned int chunksize = 0; unsigned int bytestocopy = 0; /* buffers : */ char * header_buf; unsigned int header_buf_len = 2048; unsigned int header_buf_used = 0; char * content_buf; unsigned int content_buf_len = 2048; unsigned int content_buf_used = 0; char chunksize_buf[32]; unsigned int chunksize_buf_index; header_buf = malloc(header_buf_len); content_buf = malloc(content_buf_len); chunksize_buf[0] = '\0'; chunksize_buf_index = 0; while((n = receivedata(s, buf, 2048, 5000, NULL)) > 0) { if(endofheaders == 0) { int i; int linestart=0; int colon=0; int valuestart=0; if(header_buf_used + n > header_buf_len) { header_buf = realloc(header_buf, header_buf_used + n); header_buf_len = header_buf_used + n; } memcpy(header_buf + header_buf_used, buf, n); header_buf_used += n; /* search for CR LF CR LF (end of headers) * recognize also LF LF */ i = 0; while(i < ((int)header_buf_used-1) && (endofheaders == 0)) { if(header_buf[i] == '\r') { i++; if(header_buf[i] == '\n') { i++; if(i < (int)header_buf_used && header_buf[i] == '\r') { i++; if(i < (int)header_buf_used && header_buf[i] == '\n') { endofheaders = i+1; } } } } else if(header_buf[i] == '\n') { i++; if(header_buf[i] == '\n') { endofheaders = i+1; } } i++; } if(endofheaders == 0) continue; /* parse header lines */ for(i = 0; i < endofheaders - 1; i++) { if(colon <= linestart && header_buf[i]==':') { colon = i; while(i < (endofheaders-1) && (header_buf[i+1] == ' ' || header_buf[i+1] == '\t')) i++; valuestart = i + 1; } /* detecting end of line */ else if(header_buf[i]=='\r' || header_buf[i]=='\n') { if(colon > linestart && valuestart > colon) { #ifdef DEBUG printf("header='%.*s', value='%.*s'\n", colon-linestart, header_buf+linestart, i-valuestart, header_buf+valuestart); #endif if(0==strncasecmp(header_buf+linestart, "content-length", colon-linestart)) { content_length = atoi(header_buf+valuestart); #ifdef DEBUG printf("Content-Length: %d\n", content_length); #endif } else if(0==strncasecmp(header_buf+linestart, "transfer-encoding", colon-linestart) && 0==strncasecmp(header_buf+valuestart, "chunked", 7)) { #ifdef DEBUG printf("chunked transfer-encoding!\n"); #endif chunked = 1; } } while((i < (int)header_buf_used) && (header_buf[i]=='\r' || header_buf[i] == '\n')) i++; linestart = i; colon = linestart; valuestart = 0; } } /* copy the remaining of the received data back to buf */ n = header_buf_used - endofheaders; memcpy(buf, header_buf + endofheaders, n); /* if(headers) */ } if(endofheaders) { /* content */ if(chunked) { int i = 0; while(i < n) { if(chunksize == 0) { /* reading chunk size */ if(chunksize_buf_index == 0) { /* skipping any leading CR LF */ if(i= '0' && chunksize_buf[j] <= '9') chunksize = (chunksize << 4) + (chunksize_buf[j] - '0'); else chunksize = (chunksize << 4) + ((chunksize_buf[j] | 32) - 'a' + 10); } chunksize_buf[0] = '\0'; chunksize_buf_index = 0; i++; } else { /* not finished to get chunksize */ continue; } #ifdef DEBUG printf("chunksize = %u (%x)\n", chunksize, chunksize); #endif if(chunksize == 0) { #ifdef DEBUG printf("end of HTTP content - %d %d\n", i, n); /*printf("'%.*s'\n", n-i, buf+i);*/ #endif goto end_of_stream; } } bytestocopy = ((int)chunksize < (n - i))?chunksize:(unsigned int)(n - i); if((content_buf_used + bytestocopy) > content_buf_len) { if(content_length >= (int)(content_buf_used + bytestocopy)) { content_buf_len = content_length; } else { content_buf_len = content_buf_used + bytestocopy; } content_buf = (char *)realloc((void *)content_buf, content_buf_len); } memcpy(content_buf + content_buf_used, buf + i, bytestocopy); content_buf_used += bytestocopy; i += bytestocopy; chunksize -= bytestocopy; } } else { /* not chunked */ if(content_length > 0 && (int)(content_buf_used + n) > content_length) { /* skipping additional bytes */ n = content_length - content_buf_used; } if(content_buf_used + n > content_buf_len) { if(content_length >= (int)(content_buf_used + n)) { content_buf_len = content_length; } else { content_buf_len = content_buf_used + n; } content_buf = (char *)realloc((void *)content_buf, content_buf_len); } memcpy(content_buf + content_buf_used, buf, n); content_buf_used += n; } } /* use the Content-Length header value if available */ if(content_length > 0 && (int)content_buf_used >= content_length) { #ifdef DEBUG printf("End of HTTP content\n"); #endif break; } } end_of_stream: free(header_buf); header_buf = NULL; *size = content_buf_used; if(content_buf_used == 0) { free(content_buf); content_buf = NULL; } return content_buf; } /* miniwget3() : * do all the work. * Return NULL if something failed. */ static void * miniwget3(const char * host, unsigned short port, const char * path, int * size, char * addr_str, int addr_str_len, const char * httpversion, unsigned int scope_id) { char buf[2048]; int s; int n; int len; int sent; void * content; *size = 0; s = connecthostport(host, port, scope_id); if(s < 0) return NULL; /* get address for caller ! */ if(addr_str) { struct sockaddr_storage saddr; socklen_t saddrlen; saddrlen = sizeof(saddr); if(getsockname(s, (struct sockaddr *)&saddr, &saddrlen) < 0) { perror("getsockname"); } else { #if defined(__amigaos__) && !defined(__amigaos4__) /* using INT WINAPI WSAAddressToStringA(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOA, LPSTR, LPDWORD); * But his function make a string with the port : nn.nn.nn.nn:port */ /* if(WSAAddressToStringA((SOCKADDR *)&saddr, sizeof(saddr), NULL, addr_str, (DWORD *)&addr_str_len)) { printf("WSAAddressToStringA() failed : %d\n", WSAGetLastError()); }*/ /* the following code is only compatible with ip v4 addresses */ strncpy(addr_str, inet_ntoa(((struct sockaddr_in *)&saddr)->sin_addr), addr_str_len); #else #if 0 if(saddr.sa_family == AF_INET6) { inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)&saddr)->sin6_addr), addr_str, addr_str_len); } else { inet_ntop(AF_INET, &(((struct sockaddr_in *)&saddr)->sin_addr), addr_str, addr_str_len); } #endif /* getnameinfo return ip v6 address with the scope identifier * such as : 2a01:e35:8b2b:7330::%4281128194 */ n = getnameinfo((const struct sockaddr *)&saddr, saddrlen, addr_str, addr_str_len, NULL, 0, NI_NUMERICHOST | NI_NUMERICSERV); if(n != 0) { #ifdef _WIN32 fprintf(stderr, "getnameinfo() failed : %d\n", n); #else fprintf(stderr, "getnameinfo() failed : %s\n", gai_strerror(n)); #endif } #endif } #ifdef DEBUG printf("address miniwget : %s\n", addr_str); #endif } len = snprintf(buf, sizeof(buf), "GET %s HTTP/%s\r\n" "Host: %s:%d\r\n" "Connection: Close\r\n" "User-Agent: " OS_STRING ", UPnP/1.0, MiniUPnPc/" MINIUPNPC_VERSION_STRING "\r\n" "\r\n", path, httpversion, host, port); sent = 0; /* sending the HTTP request */ while(sent < len) { n = send(s, buf+sent, len-sent, 0); if(n < 0) { perror("send"); closesocket(s); return NULL; } else { sent += n; } } content = getHTTPResponse(s, size); closesocket(s); return content; } /* miniwget2() : * Call miniwget3(); retry with HTTP/1.1 if 1.0 fails. */ static void * miniwget2(const char * host, unsigned short port, const char * path, int * size, char * addr_str, int addr_str_len, unsigned int scope_id) { char * respbuffer; #if 1 respbuffer = miniwget3(host, port, path, size, addr_str, addr_str_len, "1.1", scope_id); #else respbuffer = miniwget3(host, port, path, size, addr_str, addr_str_len, "1.0", scope_id); if (*size == 0) { #ifdef DEBUG printf("Retrying with HTTP/1.1\n"); #endif free(respbuffer); respbuffer = miniwget3(host, port, path, size, addr_str, addr_str_len, "1.1", scope_id); } #endif return respbuffer; } /* parseURL() * arguments : * url : source string not modified * hostname : hostname destination string (size of MAXHOSTNAMELEN+1) * port : port (destination) * path : pointer to the path part of the URL * * Return values : * 0 - Failure * 1 - Success */ int parseURL(const char * url, char * hostname, unsigned short * port, char * * path, unsigned int * scope_id) { char * p1, *p2, *p3; if(!url) return 0; p1 = strstr(url, "://"); if(!p1) return 0; p1 += 3; if( (url[0]!='h') || (url[1]!='t') ||(url[2]!='t') || (url[3]!='p')) return 0; memset(hostname, 0, MAXHOSTNAMELEN + 1); if(*p1 == '[') { /* IP v6 : http://[2a00:1450:8002::6a]/path/abc */ char * scope; scope = strchr(p1, '%'); p2 = strchr(p1, ']'); if(p2 && scope && scope < p2 && scope_id) { /* parse scope */ #ifdef IF_NAMESIZE char tmp[IF_NAMESIZE]; int l; scope++; /* "%25" is just '%' in URL encoding */ if(scope[0] == '2' && scope[1] == '5') scope += 2; /* skip "25" */ l = p2 - scope; if(l >= IF_NAMESIZE) l = IF_NAMESIZE - 1; memcpy(tmp, scope, l); tmp[l] = '\0'; *scope_id = if_nametoindex(tmp); if(*scope_id == 0) { *scope_id = (unsigned int)strtoul(tmp, NULL, 10); } #else /* under windows, scope is numerical */ char tmp[8]; int l; scope++; /* "%25" is just '%' in URL encoding */ if(scope[0] == '2' && scope[1] == '5') scope += 2; /* skip "25" */ l = p2 - scope; if(l >= sizeof(tmp)) l = sizeof(tmp) - 1; memcpy(tmp, scope, l); tmp[l] = '\0'; *scope_id = (unsigned int)strtoul(tmp, NULL, 10); #endif } p3 = strchr(p1, '/'); if(p2 && p3) { p2++; strncpy(hostname, p1, MIN(MAXHOSTNAMELEN, (int)(p2-p1))); if(*p2 == ':') { *port = 0; p2++; while( (*p2 >= '0') && (*p2 <= '9')) { *port *= 10; *port += (unsigned short)(*p2 - '0'); p2++; } } else { *port = 80; } *path = p3; return 1; } } p2 = strchr(p1, ':'); p3 = strchr(p1, '/'); if(!p3) return 0; if(!p2 || (p2>p3)) { strncpy(hostname, p1, MIN(MAXHOSTNAMELEN, (int)(p3-p1))); *port = 80; } else { strncpy(hostname, p1, MIN(MAXHOSTNAMELEN, (int)(p2-p1))); *port = 0; p2++; while( (*p2 >= '0') && (*p2 <= '9')) { *port *= 10; *port += (unsigned short)(*p2 - '0'); p2++; } } *path = p3; return 1; } void * miniwget(const char * url, int * size, unsigned int scope_id) { unsigned short port; char * path; /* protocol://host:port/chemin */ char hostname[MAXHOSTNAMELEN+1]; *size = 0; if(!parseURL(url, hostname, &port, &path, &scope_id)) return NULL; #ifdef DEBUG printf("parsed url : hostname='%s' port=%hu path='%s' scope_id=%u\n", hostname, port, path, scope_id); #endif return miniwget2(hostname, port, path, size, 0, 0, scope_id); } void * miniwget_getaddr(const char * url, int * size, char * addr, int addrlen, unsigned int scope_id) { unsigned short port; char * path; /* protocol://host:port/path */ char hostname[MAXHOSTNAMELEN+1]; *size = 0; if(addr) addr[0] = '\0'; if(!parseURL(url, hostname, &port, &path, &scope_id)) return NULL; #ifdef DEBUG printf("parsed url : hostname='%s' port=%hu path='%s' scope_id=%u\n", hostname, port, path, scope_id); #endif return miniwget2(hostname, port, path, size, addr, addrlen, scope_id); } transmission-2.92/third-party/miniupnp/PaxHeaders.4960/LICENSE0000644000000000000000000000013212442116703020771 xustar0030 mtime=1418239427.482328787 30 atime=1418239427.482328787 30 ctime=1457295919.023791304 transmission-2.92/third-party/miniupnp/LICENSE0000644000175000017500000000271012442116703022416 0ustar00mikedldmikedld00000000000000MiniUPnPc Copyright (c) 2005-2011, Thomas BERNARD 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. * The name of the author may not 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. transmission-2.92/third-party/miniupnp/PaxHeaders.4960/miniupnpctypes.h0000644000000000000000000000013212442116703023224 xustar0030 mtime=1418239427.485328839 30 atime=1418239427.485328839 30 ctime=1457295918.903789263 transmission-2.92/third-party/miniupnp/miniupnpctypes.h0000644000175000017500000000114212442116703024647 0ustar00mikedldmikedld00000000000000/* $Id: miniupnpctypes.h,v 1.2 2012/09/27 15:42:10 nanard Exp $ */ /* Miniupnp project : http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org * Author : Thomas Bernard * Copyright (c) 2011 Thomas Bernard * This software is subject to the conditions detailed in the * LICENCE file provided within this distribution */ #ifndef MINIUPNPCTYPES_H_INCLUDED #define MINIUPNPCTYPES_H_INCLUDED #if (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) #define UNSIGNED_INTEGER unsigned long long #define STRTOUI strtoull #else #define UNSIGNED_INTEGER unsigned int #define STRTOUI strtoul #endif #endif transmission-2.92/third-party/miniupnp/PaxHeaders.4960/Makefile.am0000644000000000000000000000013212442116703022020 xustar0030 mtime=1418239427.485328839 30 atime=1418239427.485328839 30 ctime=1457295918.855788447 transmission-2.92/third-party/miniupnp/Makefile.am0000644000175000017500000000170112442116703023444 0ustar00mikedldmikedld00000000000000noinst_LIBRARIES = libminiupnp.a AM_CFLAGS = @PTHREAD_CFLAGS@ -DNDEBUG -D_GNU_SOURCE libminiupnp_a_SOURCES = \ connecthostport.c \ igd_desc_parse.c \ minisoap.c \ minissdpc.c \ miniupnpc.c \ miniwget.c \ minixml.c \ portlistingparse.c \ receivedata.c \ upnpcommands.c \ upnpreplyparse.c noinst_HEADERS = \ bsdqueue.h \ codelength.h \ connecthostport.h \ declspec.h \ igd_desc_parse.h \ minisoap.h \ minissdpc.h \ miniupnpc.h \ miniupnpctypes.h \ miniwget.h \ minixml.h \ portlistingparse.h \ receivedata.h \ upnpcommands.h \ upnpreplyparse.h EXTRA_DIST = \ README \ LICENSE \ miniupnpcstrings.h.in \ updateminiupnpcstrings.sh BUILT_SOURCES = \ miniupnpcstrings.h miniupnpcstrings.h: Makefile $(srcdir)/updateminiupnpcstrings.sh $(srcdir)/VERSION $(srcdir)/miniupnpcstrings.h.in $@ DISTCLEANFILES = $(builddir)/miniupnpcstrings.h transmission-2.92/third-party/miniupnp/PaxHeaders.4960/portlistingparse.c0000644000000000000000000000013212442116703023541 xustar0030 mtime=1418239427.476328685 30 atime=1418239427.476328685 30 ctime=1457295919.004790981 transmission-2.92/third-party/miniupnp/portlistingparse.c0000644000175000017500000000672612442116703025201 0ustar00mikedldmikedld00000000000000/* $Id: portlistingparse.c,v 1.6 2012/05/29 10:26:51 nanard Exp $ */ /* MiniUPnP project * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * (c) 2011 Thomas Bernard * This software is subject to the conditions detailed * in the LICENCE file provided within the distribution */ #include #include #include "portlistingparse.h" #include "minixml.h" /* list of the elements */ static const struct { const portMappingElt code; const char * const str; } elements[] = { { PortMappingEntry, "PortMappingEntry"}, { NewRemoteHost, "NewRemoteHost"}, { NewExternalPort, "NewExternalPort"}, { NewProtocol, "NewProtocol"}, { NewInternalPort, "NewInternalPort"}, { NewInternalClient, "NewInternalClient"}, { NewEnabled, "NewEnabled"}, { NewDescription, "NewDescription"}, { NewLeaseTime, "NewLeaseTime"}, { PortMappingEltNone, NULL} }; /* Helper function */ static UNSIGNED_INTEGER atoui(const char * p, int l) { UNSIGNED_INTEGER r = 0; while(l > 0 && *p) { if(*p >= '0' && *p <= '9') r = r*10 + (*p - '0'); else break; p++; l--; } return r; } /* Start element handler */ static void startelt(void * d, const char * name, int l) { int i; struct PortMappingParserData * pdata = (struct PortMappingParserData *)d; pdata->curelt = PortMappingEltNone; for(i = 0; elements[i].str; i++) { if(memcmp(name, elements[i].str, l) == 0) { pdata->curelt = elements[i].code; break; } } if(pdata->curelt == PortMappingEntry) { struct PortMapping * pm; pm = calloc(1, sizeof(struct PortMapping)); LIST_INSERT_HEAD( &(pdata->head), pm, entries); } } /* End element handler */ static void endelt(void * d, const char * name, int l) { struct PortMappingParserData * pdata = (struct PortMappingParserData *)d; (void)name; (void)l; pdata->curelt = PortMappingEltNone; } /* Data handler */ static void data(void * d, const char * data, int l) { struct PortMapping * pm; struct PortMappingParserData * pdata = (struct PortMappingParserData *)d; pm = pdata->head.lh_first; if(!pm) return; if(l > 63) l = 63; switch(pdata->curelt) { case NewRemoteHost: memcpy(pm->remoteHost, data, l); pm->remoteHost[l] = '\0'; break; case NewExternalPort: pm->externalPort = (unsigned short)atoui(data, l); break; case NewProtocol: if(l > 3) l = 3; memcpy(pm->protocol, data, l); pm->protocol[l] = '\0'; break; case NewInternalPort: pm->internalPort = (unsigned short)atoui(data, l); break; case NewInternalClient: memcpy(pm->internalClient, data, l); pm->internalClient[l] = '\0'; break; case NewEnabled: pm->enabled = (unsigned char)atoui(data, l); break; case NewDescription: memcpy(pm->description, data, l); pm->description[l] = '\0'; break; case NewLeaseTime: pm->leaseTime = atoui(data, l); break; default: break; } } /* Parse the PortMappingList XML document for IGD version 2 */ void ParsePortListing(const char * buffer, int bufsize, struct PortMappingParserData * pdata) { struct xmlparser parser; memset(pdata, 0, sizeof(struct PortMappingParserData)); LIST_INIT(&(pdata->head)); /* init xmlparser */ parser.xmlstart = buffer; parser.xmlsize = bufsize; parser.data = pdata; parser.starteltfunc = startelt; parser.endeltfunc = endelt; parser.datafunc = data; parser.attfunc = 0; parsexml(&parser); } void FreePortListing(struct PortMappingParserData * pdata) { struct PortMapping * pm; while((pm = pdata->head.lh_first) != NULL) { LIST_REMOVE(pm, entries); free(pm); } } transmission-2.92/third-party/miniupnp/PaxHeaders.4960/declspec.h0000644000000000000000000000013212442116703021717 xustar0030 mtime=1418239427.484328822 30 atime=1418239427.484328822 30 ctime=1457295918.875788787 transmission-2.92/third-party/miniupnp/declspec.h0000644000175000017500000000071312442116703023345 0ustar00mikedldmikedld00000000000000#ifndef DECLSPEC_H_INCLUDED #define DECLSPEC_H_INCLUDED #if defined(_WIN32) && !defined(STATICLIB) /* for windows dll */ #ifdef MINIUPNP_EXPORTS #define LIBSPEC __declspec(dllexport) #else #define LIBSPEC __declspec(dllimport) #endif #else #if defined(__GNUC__) && __GNUC__ >= 4 /* fix dynlib for OS X 10.9.2 and Apple LLVM version 5.0 */ #define LIBSPEC __attribute__ ((visibility ("default"))) #else #define LIBSPEC #endif #endif #endif transmission-2.92/third-party/PaxHeaders.4960/libutp0000644000000000000000000000013212667111057017355 xustar0030 mtime=1457295919.314796252 30 atime=1457295919.048791729 30 ctime=1457295919.314796252 transmission-2.92/third-party/libutp/0000755000175000017500000000000012667111057021057 5ustar00mikedldmikedld00000000000000transmission-2.92/third-party/libutp/PaxHeaders.4960/utp.h0000644000000000000000000000006212610255563020414 xustar0020 atime=1445026675 30 ctime=1457295919.262795368 transmission-2.92/third-party/libutp/utp.h0000644000175000017500000001353112610255563022042 0ustar00mikedldmikedld00000000000000#ifndef __UTP_H__ #define __UTP_H__ #include "utypes.h" #ifdef WIN32 #define _CRT_SECURE_NO_DEPRECATE #define WIN32_LEAN_AND_MEAN #include #include #include #pragma comment(lib,"ws2_32.lib") #else #include #include #include #include #include #endif #ifdef __cplusplus extern "C" { #endif struct UTPSocket; // Used to set sockopt on a uTP socket to set the version of uTP // to use for outgoing connections. This can only be called before // the uTP socket is connected #define SO_UTPVERSION 99 enum { // socket has reveived syn-ack (notification only for outgoing connection completion) // this implies writability UTP_STATE_CONNECT = 1, // socket is able to send more data UTP_STATE_WRITABLE = 2, // connection closed UTP_STATE_EOF = 3, // socket is being destroyed, meaning all data has been sent if possible. // it is not valid to refer to the socket after this state change occurs UTP_STATE_DESTROYING = 4, }; // Callbacks called by a uTP socket (register with UTP_SetCallbacks) // The uTP socket layer calls this when bytes have been received from the network. typedef void UTPOnReadProc(void *userdata, const byte *bytes, size_t count); // The uTP socket layer calls this to fill the outgoing buffer with bytes. // The uTP layer takes responsibility that those bytes will be delivered. typedef void UTPOnWriteProc(void *userdata, byte *bytes, size_t count); // The uTP socket layer calls this to retrieve number of bytes currently in read buffer typedef size_t UTPGetRBSize(void *userdata); // The uTP socket layer calls this whenever the socket becomes writable. typedef void UTPOnStateChangeProc(void *userdata, int state); // The uTP socket layer calls this when an error occurs on the socket. // These errors currently include ECONNREFUSED, ECONNRESET and ETIMEDOUT, but // could eventually include any BSD socket error. typedef void UTPOnErrorProc(void *userdata, int errcode); // The uTP socket layer calls this to report overhead statistics typedef void UTPOnOverheadProc(void *userdata, bool send, size_t count, int type); struct UTPFunctionTable { UTPOnReadProc *on_read; UTPOnWriteProc *on_write; UTPGetRBSize *get_rb_size; UTPOnStateChangeProc *on_state; UTPOnErrorProc *on_error; UTPOnOverheadProc *on_overhead; }; // The uTP socket layer calls this when a new incoming uTP connection is established // this implies writability typedef void UTPGotIncomingConnection(void *userdata, struct UTPSocket* s); // The uTP socket layer calls this to send UDP packets typedef void SendToProc(void *userdata, const byte *p, size_t len, const struct sockaddr *to, socklen_t tolen); // Functions which can be called with a uTP socket // Create a uTP socket struct UTPSocket *UTP_Create(SendToProc *send_to_proc, void *send_to_userdata, const struct sockaddr *addr, socklen_t addrlen); // Setup the callbacks - must be done before connect or on incoming connection void UTP_SetCallbacks(struct UTPSocket *socket, struct UTPFunctionTable *func, void *userdata); // Valid options include SO_SNDBUF, SO_RCVBUF and SO_UTPVERSION bool UTP_SetSockopt(struct UTPSocket *socket, int opt, int val); // Try to connect to a specified host. void UTP_Connect(struct UTPSocket *socket); // Process a UDP packet from the network. This will process a packet for an existing connection, // or create a new connection and call incoming_proc. Returns true if the packet was processed // in some way, false if the packet did not appear to be uTP. bool UTP_IsIncomingUTP(UTPGotIncomingConnection *incoming_proc, SendToProc *send_to_proc, void *send_to_userdata, const byte *buffer, size_t len, const struct sockaddr *to, socklen_t tolen); // Process an ICMP received UDP packet. bool UTP_HandleICMP(const byte* buffer, size_t len, const struct sockaddr *to, socklen_t tolen); // Write bytes to the uTP socket. // Returns true if the socket is still writable. bool UTP_Write(struct UTPSocket *socket, size_t count); // Notify the uTP socket of buffer drain void UTP_RBDrained(struct UTPSocket *socket); // Call periodically to process timeouts and other periodic events void UTP_CheckTimeouts(void); // Retrieves the peer address of the specified socket, stores this address in the // sockaddr structure pointed to by the addr argument, and stores the length of this // address in the object pointed to by the addrlen argument. void UTP_GetPeerName(struct UTPSocket *socket, struct sockaddr *addr, socklen_t *addrlen); void UTP_GetDelays(struct UTPSocket *socket, int32 *ours, int32 *theirs, uint32 *age); size_t UTP_GetPacketSize(struct UTPSocket *socket); #ifdef _DEBUG struct UTPStats { uint64 _nbytes_recv; // total bytes received uint64 _nbytes_xmit; // total bytes transmitted uint32 _rexmit; // retransmit counter uint32 _fastrexmit; // fast retransmit counter uint32 _nxmit; // transmit counter uint32 _nrecv; // receive counter (total) uint32 _nduprecv; // duplicate receive counter }; // Get stats for UTP socket void UTP_GetStats(struct UTPSocket *socket, UTPStats *stats); #endif // Close the UTP socket. // It is not valid to issue commands for this socket after it is closed. // This does not actually destroy the socket until outstanding data is sent, at which // point the socket will change to the UTP_STATE_DESTROYING state. void UTP_Close(struct UTPSocket *socket); struct UTPGlobalStats { uint32 _nraw_recv[5]; // total packets recieved less than 300/600/1200/MTU bytes fpr all connections (global) uint32 _nraw_send[5]; // total packets sent less than 300/600/1200/MTU bytes for all connections (global) }; void UTP_GetGlobalStats(struct UTPGlobalStats *stats); #ifdef __cplusplus } #endif #endif //__UTP_H__ transmission-2.92/third-party/libutp/PaxHeaders.4960/StdAfx.h0000644000000000000000000000006112610255563020774 xustar0020 atime=1445026675 29 ctime=1457295919.24879513 transmission-2.92/third-party/libutp/StdAfx.h0000644000175000017500000000073112610255563022421 0ustar00mikedldmikedld00000000000000#if !defined(AFX_STDAFX_H__C1470942_E9DA_4913_BEF1_9BA7584E595B__INCLUDED_) #define AFX_STDAFX_H__C1470942_E9DA_4913_BEF1_9BA7584E595B__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // I don't have anything to put here, but some projects use precompiled headers, // so I include StdAfx.h anyway, so they don't have to edit the files to compile normally. #endif // !defined(AFX_STDAFX_H__C1470942_E9DA_4913_BEF1_9BA7584E595B__INCLUDED_) transmission-2.92/third-party/libutp/PaxHeaders.4960/utp_utils.cpp0000644000000000000000000000006212610255563022167 xustar0020 atime=1445026675 30 ctime=1457295919.302796048 transmission-2.92/third-party/libutp/utp_utils.cpp0000644000175000017500000001417312610255563023620 0ustar00mikedldmikedld00000000000000#include "StdAfx.h" #include "utypes.h" #include #include #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include #include #include typedef ULONGLONG (WINAPI GetTickCount64Proc)(void); static GetTickCount64Proc *pt2GetTickCount64; static GetTickCount64Proc *pt2RealGetTickCount; static uint64 startPerformanceCounter; static uint64 startGetTickCount; // MSVC 6 standard doesn't like division with uint64s static double counterPerMicrosecond; uint64 UTGetTickCount64() { if (pt2GetTickCount64) { return pt2GetTickCount64(); } if (pt2RealGetTickCount) { uint64 v = pt2RealGetTickCount(); // fix return value from GetTickCount return (DWORD)v | ((v >> 0x18) & 0xFFFFFFFF00000000); } return (uint64)GetTickCount(); } void Time_Initialize() { HMODULE kernel32 = GetModuleHandleA("kernel32.dll"); pt2GetTickCount64 = (GetTickCount64Proc*)GetProcAddress(kernel32, "GetTickCount64"); // not a typo. GetTickCount actually returns 64 bits pt2RealGetTickCount = (GetTickCount64Proc*)GetProcAddress(kernel32, "GetTickCount"); uint64 frequency; QueryPerformanceCounter((LARGE_INTEGER*)&startPerformanceCounter); QueryPerformanceFrequency((LARGE_INTEGER*)&frequency); counterPerMicrosecond = (double)frequency / 1000000.0f; startGetTickCount = UTGetTickCount64(); } int64 abs64(int64 x) { return x < 0 ? -x : x; } static uint64 GetMicroseconds() { static bool time_init = false; if (!time_init) { time_init = true; Time_Initialize(); } uint64 counter; uint64 tick; QueryPerformanceCounter((LARGE_INTEGER*) &counter); tick = UTGetTickCount64(); // unfortunately, QueryPerformanceCounter is not guaranteed // to be monotonic. Make it so. int64 ret = (int64)(((int64)counter - (int64)startPerformanceCounter) / counterPerMicrosecond); // if the QPC clock leaps more than one second off GetTickCount64() // something is seriously fishy. Adjust QPC to stay monotonic int64 tick_diff = tick - startGetTickCount; if (abs64(ret / 100000 - tick_diff / 100) > 10) { startPerformanceCounter -= (uint64)((int64)(tick_diff * 1000 - ret) * counterPerMicrosecond); ret = (int64)((counter - startPerformanceCounter) / counterPerMicrosecond); } return ret; } #else //!WIN32 #include #include // Linux needs both time.h and sys/time.h #include #include #include #include #if defined(__APPLE__) #include static uint64 GetMicroseconds() { // http://developer.apple.com/mac/library/qa/qa2004/qa1398.html // http://www.macresearch.org/tutorial_performance_and_time static mach_timebase_info_data_t sTimebaseInfo; static uint64_t start_tick = 0; uint64_t tick; // Returns a counter in some fraction of a nanoseconds tick = mach_absolute_time(); if (sTimebaseInfo.denom == 0) { // Get the timer ratio to convert mach_absolute_time to nanoseconds mach_timebase_info(&sTimebaseInfo); start_tick = tick; } // Calculate the elapsed time, convert it to microseconds and return it. return ((tick - start_tick) * sTimebaseInfo.numer) / (sTimebaseInfo.denom * 1000); } #else //!__APPLE__ /* Unfortunately, #ifdef CLOCK_MONOTONIC is not enough to make sure that POSIX clocks work -- we could be running a recent libc with an ancient kernel (think OpenWRT). -- jch */ static uint64_t GetMicroseconds() { static int have_posix_clocks = -1; int rc; #if defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0 && defined(CLOCK_MONOTONIC) if (have_posix_clocks < 0) { struct timespec ts; rc = clock_gettime(CLOCK_MONOTONIC, &ts); if (rc < 0) { have_posix_clocks = 0; } else { have_posix_clocks = 1; } } if (have_posix_clocks) { struct timespec ts; rc = clock_gettime(CLOCK_MONOTONIC, &ts); return uint64(ts.tv_sec) * 1000000 + ts.tv_nsec / 1000; } #endif { struct timeval tv; rc = gettimeofday(&tv, NULL); return uint64(tv.tv_sec) * 1000000 + tv.tv_usec; } } #endif //!__APPLE__ #endif //!WIN32 uint64 UTP_GetMicroseconds() { static uint64 offset = 0, previous = 0; uint64 now = GetMicroseconds() + offset; if (previous > now) { /* Eek! */ offset += previous - now; now = previous; } previous = now; return now; } uint32 UTP_GetMilliseconds() { return UTP_GetMicroseconds() / 1000; } #define ETHERNET_MTU 1500 #define IPV4_HEADER_SIZE 20 #define IPV6_HEADER_SIZE 40 #define UDP_HEADER_SIZE 8 #define GRE_HEADER_SIZE 24 #define PPPOE_HEADER_SIZE 8 #define MPPE_HEADER_SIZE 2 // packets have been observed in the wild that were fragmented // with a payload of 1416 for the first fragment // There are reports of routers that have MTU sizes as small as 1392 #define FUDGE_HEADER_SIZE 36 #define TEREDO_MTU 1280 #define UDP_IPV4_OVERHEAD (IPV4_HEADER_SIZE + UDP_HEADER_SIZE) #define UDP_IPV6_OVERHEAD (IPV6_HEADER_SIZE + UDP_HEADER_SIZE) #define UDP_TEREDO_OVERHEAD (UDP_IPV4_OVERHEAD + UDP_IPV6_OVERHEAD) #define UDP_IPV4_MTU (ETHERNET_MTU - IPV4_HEADER_SIZE - UDP_HEADER_SIZE - GRE_HEADER_SIZE - PPPOE_HEADER_SIZE - MPPE_HEADER_SIZE - FUDGE_HEADER_SIZE) #define UDP_IPV6_MTU (ETHERNET_MTU - IPV6_HEADER_SIZE - UDP_HEADER_SIZE - GRE_HEADER_SIZE - PPPOE_HEADER_SIZE - MPPE_HEADER_SIZE - FUDGE_HEADER_SIZE) #define UDP_TEREDO_MTU (TEREDO_MTU - IPV6_HEADER_SIZE - UDP_HEADER_SIZE) uint16 UTP_GetUDPMTU(const struct sockaddr *remote, socklen_t remotelen) { // Since we don't know the local address of the interface, // be conservative and assume all IPv6 connections are Teredo. return remote->sa_family == AF_INET6 ? UDP_TEREDO_MTU : UDP_IPV4_MTU; } uint16 UTP_GetUDPOverhead(const struct sockaddr *remote, socklen_t remotelen) { // Since we don't know the local address of the interface, // be conservative and assume all IPv6 connections are Teredo. return remote->sa_family == AF_INET6 ? UDP_TEREDO_OVERHEAD : UDP_IPV4_OVERHEAD; } uint32 UTP_Random() { return rand(); } void UTP_DelaySample(const struct sockaddr *remote, int sample_ms) {} size_t UTP_GetPacketSize(const struct sockaddr *remote) { return 1500; } transmission-2.92/third-party/libutp/PaxHeaders.4960/utp_utils.h0000644000000000000000000000006212610255563021634 xustar0020 atime=1445026675 30 ctime=1457295919.275795589 transmission-2.92/third-party/libutp/utp_utils.h0000644000175000017500000000161112610255563023256 0ustar00mikedldmikedld00000000000000// This should return the MTU to the destination uint16 UTP_GetUDPMTU(const struct sockaddr *remote, socklen_t remotelen); // This should return the number of bytes of UDP overhead for one packet to the // destination, for overhead calculation only uint16 UTP_GetUDPOverhead(const struct sockaddr *remote, socklen_t remotelen); // This should return monotonically increasing milliseconds, start point does not matter uint32 UTP_GetMilliseconds(); // This should return monotonically increasing microseconds, start point does not matter uint64 UTP_GetMicroseconds(); // This should return a random uint32 uint32 UTP_Random(); // This is called every time we have a delay sample is made void UTP_DelaySample(const struct sockaddr *remote, int sample_ms); // Should return the max packet size to use when sending to the given address size_t UTP_GetPacketSize(const struct sockaddr *remote); transmission-2.92/third-party/libutp/PaxHeaders.4960/Makefile.in0000644000000000000000000000013112667111010021463 xustar0030 mtime=1457295880.866142478 30 atime=1457295880.866142478 29 ctime=1457295919.28879581 transmission-2.92/third-party/libutp/Makefile.in0000644000175000017500000005023112667111010023112 0ustar00mikedldmikedld00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = third-party/libutp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx-pthread.m4 \ $(top_srcdir)/m4/glib-gettext.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libutp_a_AR = $(AR) $(ARFLAGS) libutp_a_LIBADD = am_libutp_a_OBJECTS = utp.$(OBJEXT) utp_utils.$(OBJEXT) libutp_a_OBJECTS = $(am_libutp_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libutp_a_SOURCES) DIST_SOURCES = $(libutp_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTO_CFLAGS = @CRYPTO_CFLAGS@ CRYPTO_LIBS = @CRYPTO_LIBS@ CRYPTO_PKG = @CRYPTO_PKG@ CURL_MINIMUM = @CURL_MINIMUM@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYASSL_CFLAGS = @CYASSL_CFLAGS@ CYASSL_LIBS = @CYASSL_LIBS@ CYASSL_MINIMUM = @CYASSL_MINIMUM@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DHT_CFLAGS = @DHT_CFLAGS@ DHT_LIBS = @DHT_LIBS@ DHT_LIBS_QT = @DHT_LIBS_QT@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_MINIMUM = @GIO_MINIMUM@ GLIB_MINIMUM = @GLIB_MINIMUM@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MINIMUM = @GTK_MINIMUM@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAPPINDICATOR_CFLAGS = @LIBAPPINDICATOR_CFLAGS@ LIBAPPINDICATOR_LIBS = @LIBAPPINDICATOR_LIBS@ LIBAPPINDICATOR_MINIMUM = @LIBAPPINDICATOR_MINIMUM@ LIBB64_CFLAGS = @LIBB64_CFLAGS@ LIBB64_LIBS = @LIBB64_LIBS@ LIBB64_LIBS_QT = @LIBB64_LIBS_QT@ LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ LIBEVENT_CFLAGS = @LIBEVENT_CFLAGS@ LIBEVENT_LIBS = @LIBEVENT_LIBS@ LIBEVENT_MINIMUM = @LIBEVENT_MINIMUM@ LIBM = @LIBM@ LIBNATPMP_CFLAGS = @LIBNATPMP_CFLAGS@ LIBNATPMP_LIBS = @LIBNATPMP_LIBS@ LIBNATPMP_LIBS_QT = @LIBNATPMP_LIBS_QT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LIBUPNP_LIBS_QT = @LIBUPNP_LIBS_QT@ LIBUTP_CFLAGS = @LIBUTP_CFLAGS@ LIBUTP_LIBS = @LIBUTP_LIBS@ LIBUTP_LIBS_QT = @LIBUTP_LIBS_QT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENSSL_CFLAGS = @OPENSSL_CFLAGS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OPENSSL_MINIMUM = @OPENSSL_MINIMUM@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PEERID_PREFIX = @PEERID_PREFIX@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POLARSSL_MINIMUM = @POLARSSL_MINIMUM@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SYSTEMD_DAEMON_CFLAGS = @SYSTEMD_DAEMON_CFLAGS@ SYSTEMD_DAEMON_LIBS = @SYSTEMD_DAEMON_LIBS@ USERAGENT_PREFIX = @USERAGENT_PREFIX@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ WOLFSSL_CFLAGS = @WOLFSSL_CFLAGS@ WOLFSSL_LIBS = @WOLFSSL_LIBS@ XGETTEXT = @XGETTEXT@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ ZLIB_MINIMUM = @ZLIB_MINIMUM@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ transmissionlocaledir = @transmissionlocaledir@ AM_CPPFLAGS = -fno-exceptions -fno-rtti -ansi -DPOSIX noinst_LIBRARIES = libutp.a libutp_a_SOURCES = utp.cpp utp_utils.cpp noinst_HEADERS = StdAfx.h templates.h utp_config_example.h utp.h utp_config.h utp_utils.h utypes.h EXTRA_DIST = LICENSE README.md all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu third-party/libutp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu third-party/libutp/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libutp.a: $(libutp_a_OBJECTS) $(libutp_a_DEPENDENCIES) $(EXTRA_libutp_a_DEPENDENCIES) $(AM_V_at)-rm -f libutp.a $(AM_V_AR)$(libutp_a_AR) libutp.a $(libutp_a_OBJECTS) $(libutp_a_LIBADD) $(AM_V_at)$(RANLIB) libutp.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utp_utils.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: transmission-2.92/third-party/libutp/PaxHeaders.4960/templates.h0000644000000000000000000000006212610255563021602 xustar0020 atime=1445026675 30 ctime=1457295919.255795249 transmission-2.92/third-party/libutp/templates.h0000644000175000017500000001225312610255563023230 0ustar00mikedldmikedld00000000000000#ifndef __TEMPLATES_H__ #define __TEMPLATES_H__ #include "utypes.h" #include #if defined(POSIX) /* Allow over-writing FORCEINLINE from makefile because gcc 3.4.4 for buffalo doesn't seem to support __attribute__((always_inline)) in -O0 build (strangely, it works in -Os build) */ #ifndef FORCEINLINE // The always_inline attribute asks gcc to inline the function even if no optimization is being requested. // This macro should be used exclusive-or with the inline directive (use one or the other but not both) // since Microsoft uses __forceinline to also mean inline, // and this code is following a Microsoft compatibility model. // Just setting the attribute without also specifying the inline directive apparently won't inline the function, // as evidenced by multiply-defined symbols found at link time. #define FORCEINLINE inline __attribute__((always_inline)) #endif #endif #ifdef __GNUC__ // Used for gcc tool chains accepting but not supporting pragma pack // See http://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html #define PACKED_ATTRIBUTE __attribute__((__packed__)) #else #define PACKED_ATTRIBUTE #endif #ifdef __GNUC__ #define ALIGNED_ATTRIBUTE(x) __attribute__((aligned (x))) #else #define ALIGNED_ATTRIBUTE(x) #endif // Utility templates #undef min #undef max template static inline T min(T a, T b) { if (a < b) return a; return b; } template static inline T max(T a, T b) { if (a > b) return a; return b; } template static inline T min(T a, T b, T c) { return min(min(a,b),c); } template static inline T max(T a, T b, T c) { return max(max(a,b),c); } template static inline T clamp(T v, T mi, T ma) { if (v > ma) v = ma; if (v < mi) v = mi; return v; } #if (defined(__SVR4) && defined(__sun)) #pragma pack(1) #else #pragma pack(push,1) #endif namespace aux { FORCEINLINE uint16 host_to_network(uint16 i) { return htons(i); } FORCEINLINE uint32 host_to_network(uint32 i) { return htonl(i); } FORCEINLINE int32 host_to_network(int32 i) { return htonl(i); } FORCEINLINE uint16 network_to_host(uint16 i) { return ntohs(i); } FORCEINLINE uint32 network_to_host(uint32 i) { return ntohl(i); } FORCEINLINE int32 network_to_host(int32 i) { return ntohl(i); } } template struct PACKED_ATTRIBUTE big_endian { T operator=(T i) { m_integer = aux::host_to_network(i); return i; } operator T() const { return aux::network_to_host(m_integer); } private: T m_integer; }; typedef big_endian int32_big; typedef big_endian uint32_big; typedef big_endian uint16_big; #if (defined(__SVR4) && defined(__sun)) #pragma pack(0) #else #pragma pack(pop) #endif template static inline void zeromem(T *a, size_t count = 1) { memset(a, 0, count * sizeof(T)); } typedef int SortCompareProc(const void *, const void *); template static FORCEINLINE void QuickSortT(T *base, size_t num, int (*comp)(const T *, const T *)) { qsort(base, num, sizeof(T), (SortCompareProc*)comp); } // WARNING: The template parameter MUST be a POD type! template class Array { protected: T *mem; size_t alloc,count; public: Array(size_t init) { Init(init); } Array() { Init(); } ~Array() { Free(); } void inline Init() { mem = NULL; alloc = count = 0; } void inline Init(size_t init) { Init(); if (init) Resize(init); } size_t inline GetCount() const { return count; } size_t inline GetAlloc() const { return alloc; } void inline SetCount(size_t c) { count = c; } inline T& operator[](size_t offset) { assert(offset ==0 || offset(minsize, alloc * 2)); } inline size_t Append(const T &t) { if (count >= alloc) Grow(); size_t r=count++; mem[r] = t; return r; } T inline &Append() { if (count >= alloc) Grow(); return mem[count++]; } void inline Compact() { Resize(count); } void inline Free() { free(mem); Init(); } void inline Clear() { count = 0; } bool inline MoveUpLast(size_t index) { assert(index < count); size_t c = --count; if (index != c) { mem[index] = mem[c]; return true; } return false; } bool inline MoveUpLastExist(const T &v) { return MoveUpLast(LookupElementExist(v)); } size_t inline LookupElement(const T &v) const { for(size_t i = 0; i != count; i++) if (mem[i] == v) return i; return (size_t) -1; } bool inline HasElement(const T &v) const { return LookupElement(v) != -1; } typedef int SortCompareProc(const T *a, const T *b); void Sort(SortCompareProc* proc, size_t start, size_t end) { QuickSortT(&mem[start], end - start, proc); } void Sort(SortCompareProc* proc, size_t start) { Sort(proc, start, count); } void Sort(SortCompareProc* proc) { Sort(proc, 0, count); } }; #endif //__TEMPLATES_H__ transmission-2.92/third-party/libutp/PaxHeaders.4960/README.md0000644000000000000000000000013212442116702020702 xustar0030 mtime=1418239426.290308361 30 atime=1418239426.290308361 30 ctime=1457295919.315796269 transmission-2.92/third-party/libutp/README.md0000644000175000017500000000467712442116702022345 0ustar00mikedldmikedld00000000000000# libutp - The uTorrent Transport Protocol library. Copyright (c) 2010 BitTorrent, Inc. uTP is a TCP-like implementation of [LEDBAT][ledbat] documented as a BitTorrent extension in [BEP-29][bep29]. uTP provides provides reliable, ordered delivery while maintaining minimum extra delay. It is implemented on top of UDP to be cross-platform and functional today. As a result, uTP is the primary transport for uTorrent peer-to-peer connections. uTP is written in C++, but the external interface is strictly C (ANSI C89). ## The Interface The uTP socket interface is a bit different from the Berkeley socket API to avoid the need for our own select() implementation, and to make it easier to write event-based code with minimal buffering. When you create a uTP socket, you register a set of callbacks. Most notably, the on_read callback is a reactive callback which occurs when bytes arrive off the network. The write side of the socket is proactive, and you call UTP_Write to indicate the number of bytes you wish to write. As packets are created, the on_write callback is called for each packet, so you can fill the buffers with data. The libutp interface is not thread-safe. It was designed for use in a single-threaded asyncronous context, although with proper synchronization it may be used from a multi-threaded environment as well. See utp.h for more details and other API documentation. ## Examples See the utp_test and utp_file directories for examples. ## Building uTP has been known to build on Windows with MSVC and on linux and OS X with gcc. On Windows, use the MSVC project files (utp.sln, and friends). On other platforms, building the shared library is as simple as: make To build one of the examples, which will statically link in everything it needs from libutp: cd utp_test && make ## Packaging and API The libutp API is considered unstable, and probably always will be. We encourage you to test with the version of libutp you have, and be mindful when upgrading. For this reason, it is probably also a good idea to bundle libutp with your application. ## License libutp is released under the [MIT][lic] license. ## Related Work Research and analysis of congestion control mechanisms can be found [here.][survey] [ledbat]: http://datatracker.ietf.org/wg/ledbat/charter/ [bep29]: http://www.bittorrent.org/beps/bep_0029.html [lic]: http://www.opensource.org/licenses/mit-license.php [survey]: http://datatracker.ietf.org/doc/draft-ietf-ledbat-survey/ transmission-2.92/third-party/libutp/PaxHeaders.4960/utp.cpp0000644000000000000000000000013212610256555020747 xustar0030 mtime=1445027181.999999476 30 atime=1445027181.998999458 30 ctime=1457295919.295795929 transmission-2.92/third-party/libutp/utp.cpp0000644000175000017500000026323312610256555022405 0ustar00mikedldmikedld00000000000000#include #include "utp.h" #include "templates.h" #include #include #include #include #include #include #include // for UINT_MAX #ifdef WIN32 #include "win32_inet_ntop.h" // newer versions of MSVC define these in errno.h #ifndef ECONNRESET #define ECONNRESET WSAECONNRESET #define EMSGSIZE WSAEMSGSIZE #define ECONNREFUSED WSAECONNREFUSED #define ETIMEDOUT WSAETIMEDOUT #endif #endif #ifdef POSIX typedef sockaddr_storage SOCKADDR_STORAGE; #endif // POSIX // number of bytes to increase max window size by, per RTT. This is // scaled down linearly proportional to off_target. i.e. if all packets // in one window have 0 delay, window size will increase by this number. // Typically it's less. TCP increases one MSS per RTT, which is 1500 #define MAX_CWND_INCREASE_BYTES_PER_RTT 3000 #define CUR_DELAY_SIZE 3 // experiments suggest that a clock skew of 10 ms per 325 seconds // is not impossible. Reset delay_base every 13 minutes. The clock // skew is dealt with by observing the delay base in the other // direction, and adjusting our own upwards if the opposite direction // delay base keeps going down #define DELAY_BASE_HISTORY 13 #define MAX_WINDOW_DECAY 100 // ms #define REORDER_BUFFER_SIZE 32 #define REORDER_BUFFER_MAX_SIZE 511 #define OUTGOING_BUFFER_MAX_SIZE 511 #define PACKET_SIZE 350 // this is the minimum max_window value. It can never drop below this #define MIN_WINDOW_SIZE 10 // when window sizes are smaller than one packet_size, this // will pace the packets to average at the given window size // if it's not set, it will simply not send anything until // there's a timeout #define USE_PACKET_PACING 1 // if we receive 4 or more duplicate acks, we resend the packet // that hasn't been acked yet #define DUPLICATE_ACKS_BEFORE_RESEND 3 #define DELAYED_ACK_BYTE_THRESHOLD 2400 // bytes #define DELAYED_ACK_TIME_THRESHOLD 100 // milliseconds #define RST_INFO_TIMEOUT 10000 #define RST_INFO_LIMIT 1000 // 29 seconds determined from measuring many home NAT devices #define KEEPALIVE_INTERVAL 29000 #define SEQ_NR_MASK 0xFFFF #define ACK_NR_MASK 0xFFFF #define DIV_ROUND_UP(num, denom) ((num + denom - 1) / denom) #include "utp_utils.h" #include "utp_config.h" #define LOG_UTP if (g_log_utp) utp_log #define LOG_UTPV if (g_log_utp_verbose) utp_log uint32 g_current_ms; // The totals are derived from the following data: // 45: IPv6 address including embedded IPv4 address // 11: Scope Id // 2: Brackets around IPv6 address when port is present // 6: Port (including colon) // 1: Terminating null byte char addrbuf[65]; char addrbuf2[65]; #define addrfmt(x, s) x.fmt(s, sizeof(s)) #if (defined(__SVR4) && defined(__sun)) #pragma pack(1) #else #pragma pack(push,1) #endif struct PACKED_ATTRIBUTE PackedSockAddr { // The values are always stored here in network byte order union { byte _in6[16]; // IPv6 uint16 _in6w[8]; // IPv6, word based (for convenience) uint32 _in6d[4]; // Dword access in6_addr _in6addr; // For convenience } _in; // Host byte order uint16 _port; #define _sin4 _in._in6d[3] // IPv4 is stored where it goes if mapped #define _sin6 _in._in6 #define _sin6w _in._in6w #define _sin6d _in._in6d byte get_family() const { return (IN6_IS_ADDR_V4MAPPED(&_in._in6addr) != 0) ? AF_INET : AF_INET6; } bool operator==(const PackedSockAddr& rhs) const { if (&rhs == this) return true; if (_port != rhs._port) return false; return memcmp(_sin6, rhs._sin6, sizeof(_sin6)) == 0; } bool operator!=(const PackedSockAddr& rhs) const { return !(*this == rhs); } PackedSockAddr(const SOCKADDR_STORAGE* sa, socklen_t len) { if (sa->ss_family == AF_INET) { assert(len >= sizeof(sockaddr_in)); const sockaddr_in *sin = (sockaddr_in*)sa; _sin6w[0] = 0; _sin6w[1] = 0; _sin6w[2] = 0; _sin6w[3] = 0; _sin6w[4] = 0; _sin6w[5] = 0xffff; _sin4 = sin->sin_addr.s_addr; _port = ntohs(sin->sin_port); } else { assert(len >= sizeof(sockaddr_in6)); const sockaddr_in6 *sin6 = (sockaddr_in6*)sa; _in._in6addr = sin6->sin6_addr; _port = ntohs(sin6->sin6_port); } } SOCKADDR_STORAGE get_sockaddr_storage(socklen_t *len = NULL) const { SOCKADDR_STORAGE sa; const byte family = get_family(); if (family == AF_INET) { sockaddr_in *sin = (sockaddr_in*)&sa; if (len) *len = sizeof(sockaddr_in); memset(sin, 0, sizeof(sockaddr_in)); sin->sin_family = family; sin->sin_port = htons(_port); sin->sin_addr.s_addr = _sin4; } else { sockaddr_in6 *sin6 = (sockaddr_in6*)&sa; memset(sin6, 0, sizeof(sockaddr_in6)); if (len) *len = sizeof(sockaddr_in6); sin6->sin6_family = family; sin6->sin6_addr = _in._in6addr; sin6->sin6_port = htons(_port); } return sa; } cstr fmt(str s, size_t len) const { memset(s, 0, len); const byte family = get_family(); str i; if (family == AF_INET) { inet_ntop(family, (uint32*)&_sin4, s, len); i = s; while (*++i) {} } else { i = s; *i++ = '['; inet_ntop(family, (in6_addr*)&_in._in6addr, i, len-1); while (*++i) {} *i++ = ']'; } snprintf(i, len - (i-s), ":%u", _port); return s; } } ALIGNED_ATTRIBUTE(4); struct PACKED_ATTRIBUTE RST_Info { PackedSockAddr addr; uint32 connid; uint32 timestamp; uint16 ack_nr; }; // these packet sizes are including the uTP header wich // is either 20 or 23 bytes depending on version #define PACKET_SIZE_EMPTY_BUCKET 0 #define PACKET_SIZE_EMPTY 23 #define PACKET_SIZE_SMALL_BUCKET 1 #define PACKET_SIZE_SMALL 373 #define PACKET_SIZE_MID_BUCKET 2 #define PACKET_SIZE_MID 723 #define PACKET_SIZE_BIG_BUCKET 3 #define PACKET_SIZE_BIG 1400 #define PACKET_SIZE_HUGE_BUCKET 4 struct PACKED_ATTRIBUTE PacketFormat { // connection ID uint32_big connid; uint32_big tv_sec; uint32_big tv_usec; uint32_big reply_micro; // receive window size in PACKET_SIZE chunks byte windowsize; // Type of the first extension header byte ext; // Flags byte flags; // Sequence number uint16_big seq_nr; // Acknowledgment number uint16_big ack_nr; }; struct PACKED_ATTRIBUTE PacketFormatAck { PacketFormat pf; byte ext_next; byte ext_len; byte acks[4]; }; struct PACKED_ATTRIBUTE PacketFormatExtensions { PacketFormat pf; byte ext_next; byte ext_len; byte extensions[8]; }; struct PACKED_ATTRIBUTE PacketFormatV1 { // packet_type (4 high bits) // protocol version (4 low bits) byte ver_type; byte version() const { return ver_type & 0xf; } byte type() const { return ver_type >> 4; } void set_version(byte v) { ver_type = (ver_type & 0xf0) | (v & 0xf); } void set_type(byte t) { ver_type = (ver_type & 0xf) | (t << 4); } // Type of the first extension header byte ext; // connection ID uint16_big connid; uint32_big tv_usec; uint32_big reply_micro; // receive window size in bytes uint32_big windowsize; // Sequence number uint16_big seq_nr; // Acknowledgment number uint16_big ack_nr; }; struct PACKED_ATTRIBUTE PacketFormatAckV1 { PacketFormatV1 pf; byte ext_next; byte ext_len; byte acks[4]; }; struct PACKED_ATTRIBUTE PacketFormatExtensionsV1 { PacketFormatV1 pf; byte ext_next; byte ext_len; byte extensions[8]; }; #if (defined(__SVR4) && defined(__sun)) #pragma pack(0) #else #pragma pack(pop) #endif enum { ST_DATA = 0, // Data packet. ST_FIN = 1, // Finalize the connection. This is the last packet. ST_STATE = 2, // State packet. Used to transmit an ACK with no data. ST_RESET = 3, // Terminate connection forcefully. ST_SYN = 4, // Connect SYN ST_NUM_STATES, // used for bounds checking }; static const cstr flagnames[] = { "ST_DATA","ST_FIN","ST_STATE","ST_RESET","ST_SYN" }; enum CONN_STATE { CS_IDLE = 0, CS_SYN_SENT = 1, CS_CONNECTED = 2, CS_CONNECTED_FULL = 3, CS_GOT_FIN = 4, CS_DESTROY_DELAY = 5, CS_FIN_SENT = 6, CS_RESET = 7, CS_DESTROY = 8, }; static const cstr statenames[] = { "IDLE","SYN_SENT","CONNECTED","CONNECTED_FULL","GOT_FIN","DESTROY_DELAY","FIN_SENT","RESET","DESTROY" }; struct OutgoingPacket { size_t length; size_t payload; uint64 time_sent; // microseconds uint transmissions:31; bool need_resend:1; byte data[1]; }; void no_read(void *socket, const byte *bytes, size_t count) {} void no_write(void *socket, byte *bytes, size_t count) {} size_t no_rb_size(void *socket) { return 0; } void no_state(void *socket, int state) {} void no_error(void *socket, int errcode) {} void no_overhead(void *socket, bool send, size_t count, int type) {} UTPFunctionTable zero_funcs = { &no_read, &no_write, &no_rb_size, &no_state, &no_error, &no_overhead, }; struct SizableCircularBuffer { // This is the mask. Since it's always a power of 2, adding 1 to this value will return the size. size_t mask; // This is the elements that the circular buffer points to void **elements; void *get(size_t i) { assert(elements); return elements ? elements[i & mask] : NULL; } void put(size_t i, void *data) { assert(elements); elements[i&mask] = data; } void grow(size_t item, size_t index); void ensure_size(size_t item, size_t index) { if (index > mask) grow(item, index); } size_t size() { return mask + 1; } }; static struct UTPGlobalStats _global_stats; // Item contains the element we want to make space for // index is the index in the list. void SizableCircularBuffer::grow(size_t item, size_t index) { // Figure out the new size. size_t size = mask + 1; do size *= 2; while (index >= size); // Allocate the new buffer void **buf = (void**)calloc(size, sizeof(void*)); size--; // Copy elements from the old buffer to the new buffer for (size_t i = 0; i <= mask; i++) { buf[(item - index + i) & size] = get(item - index + i); } // Swap to the newly allocated buffer mask = size; free(elements); elements = buf; } // compare if lhs is less than rhs, taking wrapping // into account. if lhs is close to UINT_MAX and rhs // is close to 0, lhs is assumed to have wrapped and // considered smaller bool wrapping_compare_less(uint32 lhs, uint32 rhs) { // distance walking from lhs to rhs, downwards const uint32 dist_down = lhs - rhs; // distance walking from lhs to rhs, upwards const uint32 dist_up = rhs - lhs; // if the distance walking up is shorter, lhs // is less than rhs. If the distance walking down // is shorter, then rhs is less than lhs return dist_up < dist_down; } struct DelayHist { uint32 delay_base; // this is the history of delay samples, // normalized by using the delay_base. These // values are always greater than 0 and measures // the queuing delay in microseconds uint32 cur_delay_hist[CUR_DELAY_SIZE]; size_t cur_delay_idx; // this is the history of delay_base. It's // a number that doesn't have an absolute meaning // only relative. It doesn't make sense to initialize // it to anything other than values relative to // what's been seen in the real world. uint32 delay_base_hist[DELAY_BASE_HISTORY]; size_t delay_base_idx; // the time when we last stepped the delay_base_idx uint32 delay_base_time; bool delay_base_initialized; void clear() { delay_base_initialized = false; delay_base = 0; cur_delay_idx = 0; delay_base_idx = 0; delay_base_time = g_current_ms; for (size_t i = 0; i < CUR_DELAY_SIZE; i++) { cur_delay_hist[i] = 0; } for (size_t i = 0; i < DELAY_BASE_HISTORY; i++) { delay_base_hist[i] = 0; } } void shift(const uint32 offset) { // the offset should never be "negative" // assert(offset < 0x10000000); // increase all of our base delays by this amount // this is used to take clock skew into account // by observing the other side's changes in its base_delay for (size_t i = 0; i < DELAY_BASE_HISTORY; i++) { delay_base_hist[i] += offset; } delay_base += offset; } void add_sample(const uint32 sample) { // The two clocks (in the two peers) are assumed not to // progress at the exact same rate. They are assumed to be // drifting, which causes the delay samples to contain // a systematic error, either they are under- // estimated or over-estimated. This is why we update the // delay_base every two minutes, to adjust for this. // This means the values will keep drifting and eventually wrap. // We can cross the wrapping boundry in two directions, either // going up, crossing the highest value, or going down, crossing 0. // if the delay_base is close to the max value and sample actually // wrapped on the other end we would see something like this: // delay_base = 0xffffff00, sample = 0x00000400 // sample - delay_base = 0x500 which is the correct difference // if the delay_base is instead close to 0, and we got an even lower // sample (that will eventually update the delay_base), we may see // something like this: // delay_base = 0x00000400, sample = 0xffffff00 // sample - delay_base = 0xfffffb00 // this needs to be interpreted as a negative number and the actual // recorded delay should be 0. // It is important that all arithmetic that assume wrapping // is done with unsigned intergers. Signed integers are not guaranteed // to wrap the way unsigned integers do. At least GCC takes advantage // of this relaxed rule and won't necessarily wrap signed ints. // remove the clock offset and propagation delay. // delay base is min of the sample and the current // delay base. This min-operation is subject to wrapping // and care needs to be taken to correctly choose the // true minimum. // specifically the problem case is when delay_base is very small // and sample is very large (because it wrapped past zero), sample // needs to be considered the smaller if (!delay_base_initialized) { // delay_base being 0 suggests that we haven't initialized // it or its history with any real measurements yet. Initialize // everything with this sample. for (size_t i = 0; i < DELAY_BASE_HISTORY; i++) { // if we don't have a value, set it to the current sample delay_base_hist[i] = sample; continue; } delay_base = sample; delay_base_initialized = true; } if (wrapping_compare_less(sample, delay_base_hist[delay_base_idx])) { // sample is smaller than the current delay_base_hist entry // update it delay_base_hist[delay_base_idx] = sample; } // is sample lower than delay_base? If so, update delay_base if (wrapping_compare_less(sample, delay_base)) { // sample is smaller than the current delay_base // update it delay_base = sample; } // this operation may wrap, and is supposed to const uint32 delay = sample - delay_base; // sanity check. If this is triggered, something fishy is going on // it means the measured sample was greater than 32 seconds! // assert(delay < 0x2000000); cur_delay_hist[cur_delay_idx] = delay; cur_delay_idx = (cur_delay_idx + 1) % CUR_DELAY_SIZE; // once every minute if (g_current_ms - delay_base_time > 60 * 1000) { delay_base_time = g_current_ms; delay_base_idx = (delay_base_idx + 1) % DELAY_BASE_HISTORY; // clear up the new delay base history spot by initializing // it to the current sample, then update it delay_base_hist[delay_base_idx] = sample; delay_base = delay_base_hist[0]; // Assign the lowest delay in the last 2 minutes to delay_base for (size_t i = 0; i < DELAY_BASE_HISTORY; i++) { if (wrapping_compare_less(delay_base_hist[i], delay_base)) delay_base = delay_base_hist[i]; } } } uint32 get_value() { uint32 value = UINT_MAX; for (size_t i = 0; i < CUR_DELAY_SIZE; i++) { value = min(cur_delay_hist[i], value); } // value could be UINT_MAX if we have no samples yet... return value; } }; struct UTPSocket { PackedSockAddr addr; size_t idx; uint16 reorder_count; byte duplicate_ack; // the number of bytes we've received but not acked yet size_t bytes_since_ack; // the number of packets in the send queue. Packets that haven't // yet been sent count as well as packets marked as needing resend // the oldest un-acked packet in the send queue is seq_nr - cur_window_packets uint16 cur_window_packets; // how much of the window is used, number of bytes in-flight // packets that have not yet been sent do not count, packets // that are marked as needing to be re-sent (due to a timeout) // don't count either size_t cur_window; // maximum window size, in bytes size_t max_window; // SO_SNDBUF setting, in bytes size_t opt_sndbuf; // SO_RCVBUF setting, in bytes size_t opt_rcvbuf; // Is a FIN packet in the reassembly buffer? bool got_fin:1; // Timeout procedure bool fast_timeout:1; // max receive window for other end, in bytes size_t max_window_user; // 0 = original uTP header, 1 = second revision byte version; CONN_STATE state; // TickCount when we last decayed window (wraps) int32 last_rwin_decay; // the sequence number of the FIN packet. This field is only set // when we have received a FIN, and the flag field has the FIN flag set. // it is used to know when it is safe to destroy the socket, we must have // received all packets up to this sequence number first. uint16 eof_pkt; // All sequence numbers up to including this have been properly received // by us uint16 ack_nr; // This is the sequence number for the next packet to be sent. uint16 seq_nr; uint16 timeout_seq_nr; // This is the sequence number of the next packet we're allowed to // do a fast resend with. This makes sure we only do a fast-resend // once per packet. We can resend the packet with this sequence number // or any later packet (with a higher sequence number). uint16 fast_resend_seq_nr; uint32 reply_micro; // the time when we need to send another ack. If there's // nothing to ack, this is a very large number uint32 ack_time; uint32 last_got_packet; uint32 last_sent_packet; uint32 last_measured_delay; uint32 last_maxed_out_window; // the last time we added send quota to the connection // when adding send quota, this is subtracted from the // current time multiplied by max_window / rtt // which is the current allowed send rate. int32 last_send_quota; // the number of bytes we are allowed to send on // this connection. If this is more than one packet // size when we run out of data to send, it is clamped // to the packet size // this value is multiplied by 100 in order to get // higher accuracy when dealing with low rates int32 send_quota; SendToProc *send_to_proc; void *send_to_userdata; UTPFunctionTable func; void *userdata; // Round trip time uint rtt; // Round trip time variance uint rtt_var; // Round trip timeout uint rto; DelayHist rtt_hist; uint retransmit_timeout; // The RTO timer will timeout here. uint rto_timeout; // When the window size is set to zero, start this timer. It will send a new packet every 30secs. uint32 zerowindow_time; uint32 conn_seed; // Connection ID for packets I receive uint32 conn_id_recv; // Connection ID for packets I send uint32 conn_id_send; // Last rcv window we advertised, in bytes size_t last_rcv_win; DelayHist our_hist; DelayHist their_hist; // extension bytes from SYN packet byte extensions[8]; SizableCircularBuffer inbuf, outbuf; #ifdef _DEBUG // Public stats, returned by UTP_GetStats(). See utp.h UTPStats _stats; #endif // _DEBUG // Calculates the current receive window size_t get_rcv_window() const { // If we don't have a connection (such as during connection // establishment, always act as if we have an empty buffer). if (!userdata) return opt_rcvbuf; // Trim window down according to what's already in buffer. const size_t numbuf = func.get_rb_size(userdata); assert((int)numbuf >= 0); return opt_rcvbuf > numbuf ? opt_rcvbuf - numbuf : 0; } // Test if we're ready to decay max_window // XXX this breaks when spaced by > INT_MAX/2, which is 49 // days; the failure mode in that case is we do an extra decay // or fail to do one when we really shouldn't. bool can_decay_win(int32 msec) const { return msec - last_rwin_decay >= MAX_WINDOW_DECAY; } // If we can, decay max window, returns true if we actually did so void maybe_decay_win() { if (can_decay_win(g_current_ms)) { // TCP uses 0.5 max_window = (size_t)(max_window * .5); last_rwin_decay = g_current_ms; if (max_window < MIN_WINDOW_SIZE) max_window = MIN_WINDOW_SIZE; } } size_t get_header_size() const { return (version ? sizeof(PacketFormatV1) : sizeof(PacketFormat)); } size_t get_header_extensions_size() const { return (version ? sizeof(PacketFormatExtensionsV1) : sizeof(PacketFormatExtensions)); } void sent_ack() { ack_time = g_current_ms + 0x70000000; bytes_since_ack = 0; } size_t get_udp_mtu() const { socklen_t len; SOCKADDR_STORAGE sa = addr.get_sockaddr_storage(&len); return UTP_GetUDPMTU((const struct sockaddr *)&sa, len); } size_t get_udp_overhead() const { socklen_t len; SOCKADDR_STORAGE sa = addr.get_sockaddr_storage(&len); return UTP_GetUDPOverhead((const struct sockaddr *)&sa, len); } uint64 get_global_utp_bytes_sent() const { socklen_t len; SOCKADDR_STORAGE sa = addr.get_sockaddr_storage(&len); return UTP_GetGlobalUTPBytesSent((const struct sockaddr *)&sa, len); } size_t get_overhead() const { return get_udp_overhead() + get_header_size(); } void send_data(PacketFormat* b, size_t length, bandwidth_type_t type); void send_ack(bool synack = false); void send_keep_alive(); static void send_rst(SendToProc *send_to_proc, void *send_to_userdata, const PackedSockAddr &addr, uint32 conn_id_send, uint16 ack_nr, uint16 seq_nr, byte version); void send_packet(OutgoingPacket *pkt); bool is_writable(size_t to_write); bool flush_packets(); void write_outgoing_packet(size_t payload, uint flags); void update_send_quota(); #ifdef _DEBUG void check_invariant(); #endif void check_timeouts(); int ack_packet(uint16 seq); size_t selective_ack_bytes(uint base, const byte* mask, byte len, int64& min_rtt); void selective_ack(uint base, const byte *mask, byte len); void apply_ledbat_ccontrol(size_t bytes_acked, uint32 actual_delay, int64 min_rtt); size_t get_packet_size(); }; Array g_rst_info; Array g_utp_sockets; static void UTP_RegisterSentPacket(size_t length) { if (length <= PACKET_SIZE_MID) { if (length <= PACKET_SIZE_EMPTY) { _global_stats._nraw_send[PACKET_SIZE_EMPTY_BUCKET]++; } else if (length <= PACKET_SIZE_SMALL) { _global_stats._nraw_send[PACKET_SIZE_SMALL_BUCKET]++; } else _global_stats._nraw_send[PACKET_SIZE_MID_BUCKET]++; } else { if (length <= PACKET_SIZE_BIG) { _global_stats._nraw_send[PACKET_SIZE_BIG_BUCKET]++; } else _global_stats._nraw_send[PACKET_SIZE_HUGE_BUCKET]++; } } void send_to_addr(SendToProc *send_to_proc, void *send_to_userdata, const byte *p, size_t len, const PackedSockAddr &addr) { socklen_t tolen; SOCKADDR_STORAGE to = addr.get_sockaddr_storage(&tolen); UTP_RegisterSentPacket(len); send_to_proc(send_to_userdata, p, len, (const struct sockaddr *)&to, tolen); } void UTPSocket::send_data(PacketFormat* b, size_t length, bandwidth_type_t type) { // time stamp this packet with local time, the stamp goes into // the header of every packet at the 8th byte for 8 bytes : // two integers, check packet.h for more uint64 time = UTP_GetMicroseconds(); PacketFormatV1* b1 = (PacketFormatV1*)b; if (version == 0) { b->tv_sec = (uint32)(time / 1000000); b->tv_usec = time % 1000000; b->reply_micro = reply_micro; } else { b1->tv_usec = (uint32)time; b1->reply_micro = reply_micro; } last_sent_packet = g_current_ms; #ifdef _DEBUG _stats._nbytes_xmit += length; ++_stats._nxmit; #endif if (userdata) { size_t n; if (type == payload_bandwidth) { // if this packet carries payload, just // count the header as overhead type = header_overhead; n = get_overhead(); } else { n = length + get_udp_overhead(); } func.on_overhead(userdata, true, n, type); } #if g_log_utp_verbose int flags = version == 0 ? b->flags : b1->type(); uint16 seq_nr = version == 0 ? b->seq_nr : b1->seq_nr; uint16 ack_nr = version == 0 ? b->ack_nr : b1->ack_nr; LOG_UTPV("0x%08x: send %s len:%u id:%u timestamp:"I64u" reply_micro:%u flags:%s seq_nr:%u ack_nr:%u", this, addrfmt(addr, addrbuf), (uint)length, conn_id_send, time, reply_micro, flagnames[flags], seq_nr, ack_nr); #endif send_to_addr(send_to_proc, send_to_userdata, (const byte*)b, length, addr); } void UTPSocket::send_ack(bool synack) { PacketFormatExtensions pfe; zeromem(&pfe); PacketFormatExtensionsV1& pfe1 = (PacketFormatExtensionsV1&)pfe; PacketFormatAck& pfa = (PacketFormatAck&)pfe1; PacketFormatAckV1& pfa1 = (PacketFormatAckV1&)pfe1; size_t len; last_rcv_win = get_rcv_window(); if (version == 0) { pfa.pf.connid = conn_id_send; pfa.pf.ack_nr = (uint16)ack_nr; pfa.pf.seq_nr = (uint16)seq_nr; pfa.pf.flags = ST_STATE; pfa.pf.ext = 0; pfa.pf.windowsize = (byte)DIV_ROUND_UP(last_rcv_win, PACKET_SIZE); len = sizeof(PacketFormat); } else { pfa1.pf.set_version(1); pfa1.pf.set_type(ST_STATE); pfa1.pf.ext = 0; pfa1.pf.connid = conn_id_send; pfa1.pf.ack_nr = ack_nr; pfa1.pf.seq_nr = seq_nr; pfa1.pf.windowsize = (uint32)last_rcv_win; len = sizeof(PacketFormatV1); } // we never need to send EACK for connections // that are shutting down if (reorder_count != 0 && state < CS_GOT_FIN) { // if reorder count > 0, send an EACK. // reorder count should always be 0 // for synacks, so this should not be // as synack assert(!synack); if (version == 0) { pfa.pf.ext = 1; pfa.ext_next = 0; pfa.ext_len = 4; } else { pfa1.pf.ext = 1; pfa1.ext_next = 0; pfa1.ext_len = 4; } uint m = 0; // reorder count should only be non-zero // if the packet ack_nr + 1 has not yet // been received assert(inbuf.get(ack_nr + 1) == NULL); size_t window = min(14+16, inbuf.size()); // Generate bit mask of segments received. for (size_t i = 0; i < window; i++) { if (inbuf.get(ack_nr + i + 2) != NULL) { m |= 1 << i; LOG_UTPV("0x%08x: EACK packet [%u]", this, ack_nr + i + 2); } } if (version == 0) { pfa.acks[0] = (byte)m; pfa.acks[1] = (byte)(m >> 8); pfa.acks[2] = (byte)(m >> 16); pfa.acks[3] = (byte)(m >> 24); } else { pfa1.acks[0] = (byte)m; pfa1.acks[1] = (byte)(m >> 8); pfa1.acks[2] = (byte)(m >> 16); pfa1.acks[3] = (byte)(m >> 24); } len += 4 + 2; LOG_UTPV("0x%08x: Sending EACK %u [%u] bits:[%032b]", this, ack_nr, conn_id_send, m); } else if (synack) { // we only send "extensions" in response to SYN // and the reorder count is 0 in that state LOG_UTPV("0x%08x: Sending ACK %u [%u] with extension bits", this, ack_nr, conn_id_send); if (version == 0) { pfe.pf.ext = 2; pfe.ext_next = 0; pfe.ext_len = 8; memset(pfe.extensions, 0, 8); } else { pfe1.pf.ext = 2; pfe1.ext_next = 0; pfe1.ext_len = 8; memset(pfe1.extensions, 0, 8); } len += 8 + 2; } else { LOG_UTPV("0x%08x: Sending ACK %u [%u]", this, ack_nr, conn_id_send); } sent_ack(); send_data((PacketFormat*)&pfe, len, ack_overhead); } void UTPSocket::send_keep_alive() { ack_nr--; LOG_UTPV("0x%08x: Sending KeepAlive ACK %u [%u]", this, ack_nr, conn_id_send); send_ack(); ack_nr++; } void UTPSocket::send_rst(SendToProc *send_to_proc, void *send_to_userdata, const PackedSockAddr &addr, uint32 conn_id_send, uint16 ack_nr, uint16 seq_nr, byte version) { PacketFormat pf; zeromem(&pf); PacketFormatV1& pf1 = (PacketFormatV1&)pf; size_t len; if (version == 0) { pf.connid = conn_id_send; pf.ack_nr = ack_nr; pf.seq_nr = seq_nr; pf.flags = ST_RESET; pf.ext = 0; pf.windowsize = 0; len = sizeof(PacketFormat); } else { pf1.set_version(1); pf1.set_type(ST_RESET); pf1.ext = 0; pf1.connid = conn_id_send; pf1.ack_nr = ack_nr; pf1.seq_nr = seq_nr; pf1.windowsize = 0; len = sizeof(PacketFormatV1); } LOG_UTPV("%s: Sending RST id:%u seq_nr:%u ack_nr:%u", addrfmt(addr, addrbuf), conn_id_send, seq_nr, ack_nr); LOG_UTPV("send %s len:%u id:%u", addrfmt(addr, addrbuf), (uint)len, conn_id_send); send_to_addr(send_to_proc, send_to_userdata, (const byte*)&pf1, len, addr); } void UTPSocket::send_packet(OutgoingPacket *pkt) { // only count against the quota the first time we // send the packet. Don't enforce quota when closing // a socket. Only enforce the quota when we're sending // at slow rates (max window < packet size) size_t max_send = min(max_window, opt_sndbuf, max_window_user); if (pkt->transmissions == 0 || pkt->need_resend) { cur_window += pkt->payload; } size_t packet_size = get_packet_size(); if (pkt->transmissions == 0 && max_send < packet_size) { assert(state == CS_FIN_SENT || (int32)pkt->payload <= send_quota / 100); send_quota = send_quota - (int32)(pkt->payload * 100); } pkt->need_resend = false; PacketFormatV1* p1 = (PacketFormatV1*)pkt->data; PacketFormat* p = (PacketFormat*)pkt->data; if (version == 0) { p->ack_nr = ack_nr; } else { p1->ack_nr = ack_nr; } pkt->time_sent = UTP_GetMicroseconds(); pkt->transmissions++; sent_ack(); send_data((PacketFormat*)pkt->data, pkt->length, (state == CS_SYN_SENT) ? connect_overhead : (pkt->transmissions == 1) ? payload_bandwidth : retransmit_overhead); } bool UTPSocket::is_writable(size_t to_write) { // return true if it's OK to stuff another packet into the // outgoing queue. Since we may be using packet pacing, we // might not actually send the packet right away to affect the // cur_window. The only thing that happens when we add another // packet is that cur_window_packets is increased. size_t max_send = min(max_window, opt_sndbuf, max_window_user); size_t packet_size = get_packet_size(); if (cur_window + packet_size >= max_window) last_maxed_out_window = g_current_ms; // if we don't have enough quota, we can't write regardless if (USE_PACKET_PACING) { if (send_quota / 100 < (int32)to_write) return false; } // subtract one to save space for the FIN packet if (cur_window_packets >= OUTGOING_BUFFER_MAX_SIZE - 1) return false; // if sending another packet would not make the window exceed // the max_window, we can write if (cur_window + packet_size <= max_send) return true; // if the window size is less than a packet, and we have enough // quota to send a packet, we can write, even though it would // make the window exceed the max size // the last condition is needed to not put too many packets // in the send buffer. cur_window isn't updated until we flush // the send buffer, so we need to take the number of packets // into account if (USE_PACKET_PACING) { if (max_window < to_write && cur_window < max_window && cur_window_packets == 0) { return true; } } return false; } bool UTPSocket::flush_packets() { size_t packet_size = get_packet_size(); // send packets that are waiting on the pacer to be sent // i has to be an unsigned 16 bit counter to wrap correctly // signed types are not guaranteed to wrap the way you expect for (uint16 i = seq_nr - cur_window_packets; i != seq_nr; ++i) { OutgoingPacket *pkt = (OutgoingPacket*)outbuf.get(i); if (pkt == 0 || (pkt->transmissions > 0 && pkt->need_resend == false)) continue; // have we run out of quota? if (!is_writable(pkt->payload)) { return true; } // Nagle check // don't send the last packet if we have one packet in-flight // and the current packet is still smaller than packet_size. if (i != ((seq_nr - 1) & ACK_NR_MASK) || cur_window_packets == 1 || pkt->payload >= packet_size) { send_packet(pkt); // No need to send another ack if there is nothing to reorder. if (reorder_count == 0) { sent_ack(); } } } return false; } void UTPSocket::write_outgoing_packet(size_t payload, uint flags) { // Setup initial timeout timer if (cur_window_packets == 0) { retransmit_timeout = rto; rto_timeout = g_current_ms + retransmit_timeout; assert(cur_window == 0); } size_t packet_size = get_packet_size(); do { assert(cur_window_packets < OUTGOING_BUFFER_MAX_SIZE); assert(flags == ST_DATA || flags == ST_FIN); size_t added = 0; OutgoingPacket *pkt = NULL; if (cur_window_packets > 0) { pkt = (OutgoingPacket*)outbuf.get(seq_nr - 1); } const size_t header_size = get_header_size(); bool append = true; // if there's any room left in the last packet in the window // and it hasn't been sent yet, fill that frame first if (payload && pkt && !pkt->transmissions && pkt->payload < packet_size) { // Use the previous unsent packet added = min(payload + pkt->payload, max(packet_size, pkt->payload)) - pkt->payload; pkt = (OutgoingPacket*)realloc(pkt, (sizeof(OutgoingPacket) - 1) + header_size + pkt->payload + added); outbuf.put(seq_nr - 1, pkt); append = false; assert(!pkt->need_resend); } else { // Create the packet to send. added = payload; pkt = (OutgoingPacket*)malloc((sizeof(OutgoingPacket) - 1) + header_size + added); pkt->payload = 0; pkt->transmissions = 0; pkt->need_resend = false; } if (added) { // Fill it with data from the upper layer. func.on_write(userdata, pkt->data + header_size + pkt->payload, added); } pkt->payload += added; pkt->length = header_size + pkt->payload; last_rcv_win = get_rcv_window(); PacketFormat* p = (PacketFormat*)pkt->data; PacketFormatV1* p1 = (PacketFormatV1*)pkt->data; if (version == 0) { p->connid = conn_id_send; p->ext = 0; p->windowsize = (byte)DIV_ROUND_UP(last_rcv_win, PACKET_SIZE); p->ack_nr = ack_nr; p->flags = flags; } else { p1->set_version(1); p1->set_type(flags); p1->ext = 0; p1->connid = conn_id_send; p1->windowsize = (uint32)last_rcv_win; p1->ack_nr = ack_nr; } if (append) { // Remember the message in the outgoing queue. outbuf.ensure_size(seq_nr, cur_window_packets); outbuf.put(seq_nr, pkt); if (version == 0) p->seq_nr = seq_nr; else p1->seq_nr = seq_nr; seq_nr++; cur_window_packets++; } payload -= added; } while (payload); flush_packets(); } void UTPSocket::update_send_quota() { int dt = g_current_ms - last_send_quota; if (dt == 0) return; last_send_quota = g_current_ms; size_t add = max_window * dt * 100 / (rtt_hist.delay_base?rtt_hist.delay_base:50); if (add > max_window * 100 && add > MAX_CWND_INCREASE_BYTES_PER_RTT * 100) add = max_window; send_quota += (int32)add; // LOG_UTPV("0x%08x: UTPSocket::update_send_quota dt:%d rtt:%u max_window:%u quota:%d", // this, dt, rtt, (uint)max_window, send_quota / 100); } #ifdef _DEBUG void UTPSocket::check_invariant() { if (reorder_count > 0) { assert(inbuf.get(ack_nr + 1) == NULL); } size_t outstanding_bytes = 0; for (int i = 0; i < cur_window_packets; ++i) { OutgoingPacket *pkt = (OutgoingPacket*)outbuf.get(seq_nr - i - 1); if (pkt == 0 || pkt->transmissions == 0 || pkt->need_resend) continue; outstanding_bytes += pkt->payload; } assert(outstanding_bytes == cur_window); } #endif void UTPSocket::check_timeouts() { #ifdef _DEBUG check_invariant(); #endif // this invariant should always be true assert(cur_window_packets == 0 || outbuf.get(seq_nr - cur_window_packets)); LOG_UTPV("0x%08x: CheckTimeouts timeout:%d max_window:%u cur_window:%u quota:%d " "state:%s cur_window_packets:%u bytes_since_ack:%u ack_time:%d", this, (int)(rto_timeout - g_current_ms), (uint)max_window, (uint)cur_window, send_quota / 100, statenames[state], cur_window_packets, (uint)bytes_since_ack, (int)(g_current_ms - ack_time)); update_send_quota(); flush_packets(); if (USE_PACKET_PACING) { // In case the new send quota made it possible to send another packet // Mark the socket as writable. If we don't use pacing, the send // quota does not affect if the socket is writeable // if we don't use packet pacing, the writable event is triggered // whenever the cur_window falls below the max_window, so we don't // need this check then if (state == CS_CONNECTED_FULL && is_writable(get_packet_size())) { state = CS_CONNECTED; LOG_UTPV("0x%08x: Socket writable. max_window:%u cur_window:%u quota:%d packet_size:%u", this, (uint)max_window, (uint)cur_window, send_quota / 100, (uint)get_packet_size()); func.on_state(userdata, UTP_STATE_WRITABLE); } } switch (state) { case CS_SYN_SENT: case CS_CONNECTED_FULL: case CS_CONNECTED: case CS_FIN_SENT: { // Reset max window... if ((int)(g_current_ms - zerowindow_time) >= 0 && max_window_user == 0) { max_window_user = PACKET_SIZE; } if ((int)(g_current_ms - rto_timeout) >= 0 && (!(USE_PACKET_PACING) || cur_window_packets > 0) && rto_timeout > 0) { /* OutgoingPacket *pkt = (OutgoingPacket*)outbuf.get(seq_nr - cur_window_packets); // If there were a lot of retransmissions, force recomputation of round trip time if (pkt->transmissions >= 4) rtt = 0; */ // Increase RTO const uint new_timeout = retransmit_timeout * 2; if (new_timeout >= 30000 || (state == CS_SYN_SENT && new_timeout > 6000)) { // more than 30 seconds with no reply. kill it. // if we haven't even connected yet, give up sooner. 6 seconds // means 2 tries at the following timeouts: 3, 6 seconds if (state == CS_FIN_SENT) state = CS_DESTROY; else state = CS_RESET; func.on_error(userdata, ETIMEDOUT); goto getout; } retransmit_timeout = new_timeout; rto_timeout = g_current_ms + new_timeout; // On Timeout duplicate_ack = 0; // rate = min_rate max_window = get_packet_size(); send_quota = max((int32)max_window * 100, send_quota); // every packet should be considered lost for (int i = 0; i < cur_window_packets; ++i) { OutgoingPacket *pkt = (OutgoingPacket*)outbuf.get(seq_nr - i - 1); if (pkt == 0 || pkt->transmissions == 0 || pkt->need_resend) continue; pkt->need_resend = true; assert(cur_window >= pkt->payload); cur_window -= pkt->payload; } // used in parse_log.py LOG_UTP("0x%08x: Packet timeout. Resend. seq_nr:%u. timeout:%u max_window:%u", this, seq_nr - cur_window_packets, retransmit_timeout, (uint)max_window); fast_timeout = true; timeout_seq_nr = seq_nr; if (cur_window_packets > 0) { OutgoingPacket *pkt = (OutgoingPacket*)outbuf.get(seq_nr - cur_window_packets); assert(pkt); send_quota = max((int32)pkt->length * 100, send_quota); // Re-send the packet. send_packet(pkt); } } // Mark the socket as writable if (state == CS_CONNECTED_FULL && is_writable(get_packet_size())) { state = CS_CONNECTED; LOG_UTPV("0x%08x: Socket writable. max_window:%u cur_window:%u quota:%d packet_size:%u", this, (uint)max_window, (uint)cur_window, send_quota / 100, (uint)get_packet_size()); func.on_state(userdata, UTP_STATE_WRITABLE); } if (state >= CS_CONNECTED && state <= CS_FIN_SENT) { // Send acknowledgment packets periodically, or when the threshold is reached if (bytes_since_ack > DELAYED_ACK_BYTE_THRESHOLD || (int)(g_current_ms - ack_time) >= 0) { send_ack(); } if ((int)(g_current_ms - last_sent_packet) >= KEEPALIVE_INTERVAL) { send_keep_alive(); } } break; } // Close? case CS_GOT_FIN: case CS_DESTROY_DELAY: if ((int)(g_current_ms - rto_timeout) >= 0) { state = (state == CS_DESTROY_DELAY) ? CS_DESTROY : CS_RESET; if (cur_window_packets > 0 && userdata) { func.on_error(userdata, ECONNRESET); } } break; // prevent warning case CS_IDLE: case CS_RESET: case CS_DESTROY: break; } getout: // make sure we don't accumulate quota when we don't have // anything to send int32 limit = max((int32)max_window / 2, 5 * (int32)get_packet_size()) * 100; if (send_quota > limit) send_quota = limit; } // returns: // 0: the packet was acked. // 1: it means that the packet had already been acked // 2: the packet has not been sent yet int UTPSocket::ack_packet(uint16 seq) { OutgoingPacket *pkt = (OutgoingPacket*)outbuf.get(seq); // the packet has already been acked (or not sent) if (pkt == NULL) { LOG_UTPV("0x%08x: got ack for:%u (already acked, or never sent)", this, seq); return 1; } // can't ack packets that haven't been sent yet! if (pkt->transmissions == 0) { LOG_UTPV("0x%08x: got ack for:%u (never sent, pkt_size:%u need_resend:%u)", this, seq, (uint)pkt->payload, pkt->need_resend); return 2; } LOG_UTPV("0x%08x: got ack for:%u (pkt_size:%u need_resend:%u)", this, seq, (uint)pkt->payload, pkt->need_resend); outbuf.put(seq, NULL); // if we never re-sent the packet, update the RTT estimate if (pkt->transmissions == 1) { // Estimate the round trip time. const uint32 ertt = (uint32)((UTP_GetMicroseconds() - pkt->time_sent) / 1000); if (rtt == 0) { // First round trip time sample rtt = ertt; rtt_var = ertt / 2; // sanity check. rtt should never be more than 6 seconds // assert(rtt < 6000); } else { // Compute new round trip times const int delta = (int)rtt - ertt; rtt_var = rtt_var + (int)(abs(delta) - rtt_var) / 4; rtt = rtt - rtt/8 + ertt/8; // sanity check. rtt should never be more than 6 seconds // assert(rtt < 6000); rtt_hist.add_sample(ertt); } rto = max(rtt + rtt_var * 4, 500); LOG_UTPV("0x%08x: rtt:%u avg:%u var:%u rto:%u", this, ertt, rtt, rtt_var, rto); } retransmit_timeout = rto; rto_timeout = g_current_ms + rto; // if need_resend is set, this packet has already // been considered timed-out, and is not included in // the cur_window anymore if (!pkt->need_resend) { assert(cur_window >= pkt->payload); cur_window -= pkt->payload; } free(pkt); return 0; } // count the number of bytes that were acked by the EACK header size_t UTPSocket::selective_ack_bytes(uint base, const byte* mask, byte len, int64& min_rtt) { if (cur_window_packets == 0) return 0; size_t acked_bytes = 0; int bits = len * 8; do { uint v = base + bits; // ignore bits that haven't been sent yet // see comment in UTPSocket::selective_ack if (((seq_nr - v - 1) & ACK_NR_MASK) >= (uint16)(cur_window_packets - 1)) continue; // ignore bits that represents packets we haven't sent yet // or packets that have already been acked OutgoingPacket *pkt = (OutgoingPacket*)outbuf.get(v); if (!pkt || pkt->transmissions == 0) continue; // Count the number of segments that were successfully received past it. if (bits >= 0 && mask[bits>>3] & (1 << (bits & 7))) { assert((int)(pkt->payload) >= 0); acked_bytes += pkt->payload; min_rtt = min(min_rtt, UTP_GetMicroseconds() - pkt->time_sent); continue; } } while (--bits >= -1); return acked_bytes; } enum { MAX_EACK = 128 }; void UTPSocket::selective_ack(uint base, const byte *mask, byte len) { if (cur_window_packets == 0) return; // the range is inclusive [0, 31] bits int bits = len * 8 - 1; int count = 0; // resends is a stack of sequence numbers we need to resend. Since we // iterate in reverse over the acked packets, at the end, the top packets // are the ones we want to resend int resends[MAX_EACK]; int nr = 0; LOG_UTPV("0x%08x: Got EACK [%032b] base:%u", this, *(uint32*)mask, base); do { // we're iterating over the bits from higher sequence numbers // to lower (kind of in reverse order, wich might not be very // intuitive) uint v = base + bits; // ignore bits that haven't been sent yet // and bits that fall below the ACKed sequence number // this can happen if an EACK message gets // reordered and arrives after a packet that ACKs up past // the base for thie EACK message // this is essentially the same as: // if v >= seq_nr || v <= seq_nr - cur_window_packets // but it takes wrapping into account // if v == seq_nr the -1 will make it wrap. if v > seq_nr // it will also wrap (since it will fall further below 0) // and be > cur_window_packets. // if v == seq_nr - cur_window_packets, the result will be // seq_nr - (seq_nr - cur_window_packets) - 1 // == seq_nr - seq_nr + cur_window_packets - 1 // == cur_window_packets - 1 which will be caught by the // test. If v < seq_nr - cur_window_packets the result will grow // fall furhter outside of the cur_window_packets range. // sequence number space: // // rejected < accepted > rejected // <============+--------------+============> // ^ ^ // | | // (seq_nr-wnd) seq_nr if (((seq_nr - v - 1) & ACK_NR_MASK) >= (uint16)(cur_window_packets - 1)) continue; // this counts as a duplicate ack, even though we might have // received an ack for this packet previously (in another EACK // message for instance) bool bit_set = bits >= 0 && mask[bits>>3] & (1 << (bits & 7)); // if this packet is acked, it counts towards the duplicate ack counter if (bit_set) count++; // ignore bits that represents packets we haven't sent yet // or packets that have already been acked OutgoingPacket *pkt = (OutgoingPacket*)outbuf.get(v); if (!pkt || pkt->transmissions == 0) { LOG_UTPV("0x%08x: skipping %u. pkt:%08x transmissions:%u %s", this, v, pkt, pkt?pkt->transmissions:0, pkt?"(not sent yet?)":"(already acked?)"); continue; } // Count the number of segments that were successfully received past it. if (bit_set) { // the selective ack should never ACK the packet we're waiting for to decrement cur_window_packets assert((v & outbuf.mask) != ((seq_nr - cur_window_packets) & outbuf.mask)); ack_packet(v); continue; } // Resend segments // if count is less than our re-send limit, we haven't seen enough // acked packets in front of this one to warrant a re-send. // if count == 0, we're still going through the tail of zeroes if (((v - fast_resend_seq_nr) & ACK_NR_MASK) <= OUTGOING_BUFFER_MAX_SIZE && count >= DUPLICATE_ACKS_BEFORE_RESEND && duplicate_ack < DUPLICATE_ACKS_BEFORE_RESEND) { // resends is a stack, and we're mostly interested in the top of it // if we're full, just throw away the lower half if (nr >= MAX_EACK - 2) { memmove(resends, &resends[MAX_EACK/2], MAX_EACK/2 * sizeof(resends[0])); nr -= MAX_EACK / 2; } resends[nr++] = v; LOG_UTPV("0x%08x: no ack for %u", this, v); } else { LOG_UTPV("0x%08x: not resending %u count:%d dup_ack:%u fast_resend_seq_nr:%u", this, v, count, duplicate_ack, fast_resend_seq_nr); } } while (--bits >= -1); if (((base - 1 - fast_resend_seq_nr) & ACK_NR_MASK) <= OUTGOING_BUFFER_MAX_SIZE && count >= DUPLICATE_ACKS_BEFORE_RESEND) { // if we get enough duplicate acks to start // resending, the first packet we should resend // is base-1 resends[nr++] = (base - 1) & ACK_NR_MASK; } else { LOG_UTPV("0x%08x: not resending %u count:%d dup_ack:%u fast_resend_seq_nr:%u", this, base - 1, count, duplicate_ack, fast_resend_seq_nr); } bool back_off = false; int i = 0; while (nr > 0) { uint v = resends[--nr]; // don't consider the tail of 0:es to be lost packets // only unacked packets with acked packets after should // be considered lost OutgoingPacket *pkt = (OutgoingPacket*)outbuf.get(v); // this may be an old (re-ordered) packet, and some of the // packets in here may have been acked already. In which // case they will not be in the send queue anymore if (!pkt) continue; // used in parse_log.py LOG_UTP("0x%08x: Packet %u lost. Resending", this, v); // On Loss back_off = true; #ifdef _DEBUG ++_stats._rexmit; #endif send_packet(pkt); fast_resend_seq_nr = v + 1; // Re-send max 4 packets. if (++i >= 4) break; } if (back_off) maybe_decay_win(); duplicate_ack = count; } void UTPSocket::apply_ledbat_ccontrol(size_t bytes_acked, uint32 actual_delay, int64 min_rtt) { // the delay can never be greater than the rtt. The min_rtt // variable is the RTT in microseconds assert(min_rtt >= 0); int32 our_delay = min(our_hist.get_value(), uint32(min_rtt)); assert(our_delay != INT_MAX); assert(our_delay >= 0); SOCKADDR_STORAGE sa = addr.get_sockaddr_storage(); UTP_DelaySample((sockaddr*)&sa, our_delay / 1000); // This test the connection under heavy load from foreground // traffic. Pretend that our delays are very high to force the // connection to use sub-packet size window sizes //our_delay *= 4; // target is microseconds int target = CCONTROL_TARGET; if (target <= 0) target = 100000; double off_target = target - our_delay; // this is the same as: // // (min(off_target, target) / target) * (bytes_acked / max_window) * MAX_CWND_INCREASE_BYTES_PER_RTT // // so, it's scaling the max increase by the fraction of the window this ack represents, and the fraction // of the target delay the current delay represents. // The min() around off_target protects against crazy values of our_delay, which may happen when th // timestamps wraps, or by just having a malicious peer sending garbage. This caps the increase // of the window size to MAX_CWND_INCREASE_BYTES_PER_RTT per rtt. // as for large negative numbers, this direction is already capped at the min packet size further down // the min around the bytes_acked protects against the case where the window size was recently // shrunk and the number of acked bytes exceeds that. This is considered no more than one full // window, in order to keep the gain within sane boundries. assert(bytes_acked > 0); double window_factor = (double)min(bytes_acked, max_window) / (double)max(max_window, bytes_acked); double delay_factor = off_target / target; double scaled_gain = MAX_CWND_INCREASE_BYTES_PER_RTT * window_factor * delay_factor; // since MAX_CWND_INCREASE_BYTES_PER_RTT is a cap on how much the window size (max_window) // may increase per RTT, we may not increase the window size more than that proportional // to the number of bytes that were acked, so that once one window has been acked (one rtt) // the increase limit is not exceeded // the +1. is to allow for floating point imprecision assert(scaled_gain <= 1. + MAX_CWND_INCREASE_BYTES_PER_RTT * (int)min(bytes_acked, max_window) / (double)max(max_window, bytes_acked)); if (scaled_gain > 0 && g_current_ms - last_maxed_out_window > 300) { // if it was more than 300 milliseconds since we tried to send a packet // and stopped because we hit the max window, we're most likely rate // limited (which prevents us from ever hitting the window size) // if this is the case, we cannot let the max_window grow indefinitely scaled_gain = 0; } if (scaled_gain + max_window < MIN_WINDOW_SIZE) { max_window = MIN_WINDOW_SIZE; } else { max_window = (size_t)(max_window + scaled_gain); } // make sure that the congestion window is below max // make sure that we don't shrink our window too small max_window = clamp(max_window, MIN_WINDOW_SIZE, opt_sndbuf); // used in parse_log.py LOG_UTP("0x%08x: actual_delay:%u our_delay:%d their_delay:%u off_target:%d max_window:%u " "delay_base:%u delay_sum:%d target_delay:%d acked_bytes:%u cur_window:%u " "scaled_gain:%f rtt:%u rate:%u quota:%d wnduser:%u rto:%u timeout:%d get_microseconds:"I64u" " "cur_window_packets:%u packet_size:%u their_delay_base:%u their_actual_delay:%u", this, actual_delay, our_delay / 1000, their_hist.get_value() / 1000, (int)off_target / 1000, (uint)(max_window), our_hist.delay_base, (our_delay + their_hist.get_value()) / 1000, target / 1000, (uint)bytes_acked, (uint)(cur_window - bytes_acked), (float)(scaled_gain), rtt, (uint)(max_window * 1000 / (rtt_hist.delay_base?rtt_hist.delay_base:50)), send_quota / 100, (uint)max_window_user, rto, (int)(rto_timeout - g_current_ms), UTP_GetMicroseconds(), cur_window_packets, (uint)get_packet_size(), their_hist.delay_base, their_hist.delay_base + their_hist.get_value()); } static void UTP_RegisterRecvPacket(UTPSocket *conn, size_t len) { #ifdef _DEBUG ++conn->_stats._nrecv; conn->_stats._nbytes_recv += len; #endif if (len <= PACKET_SIZE_MID) { if (len <= PACKET_SIZE_EMPTY) { _global_stats._nraw_recv[PACKET_SIZE_EMPTY_BUCKET]++; } else if (len <= PACKET_SIZE_SMALL) { _global_stats._nraw_recv[PACKET_SIZE_SMALL_BUCKET]++; } else _global_stats._nraw_recv[PACKET_SIZE_MID_BUCKET]++; } else { if (len <= PACKET_SIZE_BIG) { _global_stats._nraw_recv[PACKET_SIZE_BIG_BUCKET]++; } else _global_stats._nraw_recv[PACKET_SIZE_HUGE_BUCKET]++; } } // returns the max number of bytes of payload the uTP // connection is allowed to send size_t UTPSocket::get_packet_size() { int header_size = version == 1 ? sizeof(PacketFormatV1) : sizeof(PacketFormat); size_t mtu = get_udp_mtu(); if (DYNAMIC_PACKET_SIZE_ENABLED) { SOCKADDR_STORAGE sa = addr.get_sockaddr_storage(); size_t max_packet_size = UTP_GetPacketSize((sockaddr*)&sa); return min(mtu - header_size, max_packet_size); } else { return mtu - header_size; } } // Process an incoming packet // syn is true if this is the first packet received. It will cut off parsing // as soon as the header is done size_t UTP_ProcessIncoming(UTPSocket *conn, const byte *packet, size_t len, bool syn = false) { UTP_RegisterRecvPacket(conn, len); g_current_ms = UTP_GetMilliseconds(); conn->update_send_quota(); const PacketFormat *pf = (PacketFormat*)packet; const PacketFormatV1 *pf1 = (PacketFormatV1*)packet; const byte *packet_end = packet + len; uint16 pk_seq_nr; uint16 pk_ack_nr; uint8 pk_flags; if (conn->version == 0) { pk_seq_nr = pf->seq_nr; pk_ack_nr = pf->ack_nr; pk_flags = pf->flags; } else { pk_seq_nr = pf1->seq_nr; pk_ack_nr = pf1->ack_nr; pk_flags = pf1->type(); } if (pk_flags >= ST_NUM_STATES) return 0; LOG_UTPV("0x%08x: Got %s. seq_nr:%u ack_nr:%u state:%s version:%u timestamp:"I64u" reply_micro:%u", conn, flagnames[pk_flags], pk_seq_nr, pk_ack_nr, statenames[conn->state], conn->version, conn->version == 0?(uint64)(pf->tv_sec) * 1000000 + pf->tv_usec:uint64(pf1->tv_usec), conn->version == 0?(uint32)(pf->reply_micro):(uint32)(pf1->reply_micro)); // mark receipt time uint64 time = UTP_GetMicroseconds(); // RSTs are handled earlier, since the connid matches the send id not the recv id assert(pk_flags != ST_RESET); // TODO: maybe send a ST_RESET if we're in CS_RESET? const byte *selack_ptr = NULL; // Unpack UTP packet options // Data pointer const byte *data = (const byte*)pf + conn->get_header_size(); if (conn->get_header_size() > len) { LOG_UTPV("0x%08x: Invalid packet size (less than header size)", conn); return 0; } // Skip the extension headers uint extension = conn->version == 0 ? pf->ext : pf1->ext; if (extension != 0) { do { // Verify that the packet is valid. data += 2; if ((int)(packet_end - data) < 0 || (int)(packet_end - data) < data[-1]) { LOG_UTPV("0x%08x: Invalid len of extensions", conn); return 0; } switch(extension) { case 1: // Selective Acknowledgment selack_ptr = data; break; case 2: // extension bits if (data[-1] != 8) { LOG_UTPV("0x%08x: Invalid len of extension bits header", conn); return 0; } memcpy(conn->extensions, data, 8); LOG_UTPV("0x%08x: got extension bits:%02x%02x%02x%02x%02x%02x%02x%02x", conn, conn->extensions[0], conn->extensions[1], conn->extensions[2], conn->extensions[3], conn->extensions[4], conn->extensions[5], conn->extensions[6], conn->extensions[7]); } extension = data[-2]; data += data[-1]; } while (extension); } if (conn->state == CS_SYN_SENT) { // if this is a syn-ack, initialize our ack_nr // to match the sequence number we got from // the other end conn->ack_nr = (pk_seq_nr - 1) & SEQ_NR_MASK; } g_current_ms = UTP_GetMilliseconds(); conn->last_got_packet = g_current_ms; if (syn) { return 0; } // seqnr is the number of packets past the expected // packet this is. ack_nr is the last acked, seq_nr is the // current. Subtracring 1 makes 0 mean "this is the next // expected packet". const uint seqnr = (pk_seq_nr - conn->ack_nr - 1) & SEQ_NR_MASK; // Getting an invalid sequence number? if (seqnr >= REORDER_BUFFER_MAX_SIZE) { if (seqnr >= (SEQ_NR_MASK + 1) - REORDER_BUFFER_MAX_SIZE && pk_flags != ST_STATE) { conn->ack_time = g_current_ms + min(conn->ack_time - g_current_ms, DELAYED_ACK_TIME_THRESHOLD); } LOG_UTPV(" Got old Packet/Ack (%u/%u)=%u!", pk_seq_nr, conn->ack_nr, seqnr); return 0; } // Process acknowledgment // acks is the number of packets that was acked int acks = (pk_ack_nr - (conn->seq_nr - 1 - conn->cur_window_packets)) & ACK_NR_MASK; // this happens when we receive an old ack nr if (acks > conn->cur_window_packets) acks = 0; // if we get the same ack_nr as in the last packet // increase the duplicate_ack counter, otherwise reset // it to 0 if (conn->cur_window_packets > 0) { if (pk_ack_nr == ((conn->seq_nr - conn->cur_window_packets - 1) & ACK_NR_MASK) && conn->cur_window_packets > 0) { //++conn->duplicate_ack; } else { conn->duplicate_ack = 0; } // TODO: if duplicate_ack == DUPLICATE_ACK_BEFORE_RESEND // and fast_resend_seq_nr <= ack_nr + 1 // resend ack_nr + 1 } // figure out how many bytes were acked size_t acked_bytes = 0; // the minimum rtt of all acks // this is the upper limit on the delay we get back // from the other peer. Our delay cannot exceed // the rtt of the packet. If it does, clamp it. // this is done in apply_ledbat_ccontrol() int64 min_rtt = INT64_MAX; for (int i = 0; i < acks; ++i) { int seq = conn->seq_nr - conn->cur_window_packets + i; OutgoingPacket *pkt = (OutgoingPacket*)conn->outbuf.get(seq); if (pkt == 0 || pkt->transmissions == 0) continue; assert((int)(pkt->payload) >= 0); acked_bytes += pkt->payload; min_rtt = min(min_rtt, UTP_GetMicroseconds() - pkt->time_sent); } // count bytes acked by EACK if (selack_ptr != NULL) { acked_bytes += conn->selective_ack_bytes((pk_ack_nr + 2) & ACK_NR_MASK, selack_ptr, selack_ptr[-1], min_rtt); } LOG_UTPV("0x%08x: acks:%d acked_bytes:%u seq_nr:%d cur_window:%u cur_window_packets:%u relative_seqnr:%u max_window:%u min_rtt:%u rtt:%u", conn, acks, (uint)acked_bytes, conn->seq_nr, (uint)conn->cur_window, conn->cur_window_packets, seqnr, (uint)conn->max_window, (uint)(min_rtt / 1000), conn->rtt); uint64 p; if (conn->version == 0) { p = uint64(pf->tv_sec) * 1000000 + pf->tv_usec; } else { p = pf1->tv_usec; } conn->last_measured_delay = g_current_ms; // get delay in both directions // record the delay to report back const uint32 their_delay = (uint32)(p == 0 ? 0 : time - p); conn->reply_micro = their_delay; uint32 prev_delay_base = conn->their_hist.delay_base; if (their_delay != 0) conn->their_hist.add_sample(their_delay); // if their new delay base is less than their previous one // we should shift our delay base in the other direction in order // to take the clock skew into account if (prev_delay_base != 0 && wrapping_compare_less(conn->their_hist.delay_base, prev_delay_base)) { // never adjust more than 10 milliseconds if (prev_delay_base - conn->their_hist.delay_base <= 10000) { conn->our_hist.shift(prev_delay_base - conn->their_hist.delay_base); } } const uint32 actual_delay = conn->version==0 ?(pf->reply_micro==INT_MAX?0:uint32(pf->reply_micro)) :(uint32(pf1->reply_micro)==INT_MAX?0:uint32(pf1->reply_micro)); // if the actual delay is 0, it means the other end // hasn't received a sample from us yet, and doesn't // know what it is. We can't update out history unless // we have a true measured sample prev_delay_base = conn->our_hist.delay_base; if (actual_delay != 0) conn->our_hist.add_sample(actual_delay); // if our new delay base is less than our previous one // we should shift the other end's delay base in the other // direction in order to take the clock skew into account // This is commented out because it creates bad interactions // with our adjustment in the other direction. We don't really // need our estimates of the other peer to be very accurate // anyway. The problem with shifting here is that we're more // likely shift it back later because of a low latency. This // second shift back would cause us to shift our delay base // which then get's into a death spiral of shifting delay bases /* if (prev_delay_base != 0 && wrapping_compare_less(conn->our_hist.delay_base, prev_delay_base)) { // never adjust more than 10 milliseconds if (prev_delay_base - conn->our_hist.delay_base <= 10000) { conn->their_hist.Shift(prev_delay_base - conn->our_hist.delay_base); } } */ // if the delay estimate exceeds the RTT, adjust the base_delay to // compensate if (conn->our_hist.get_value() > uint32(min_rtt)) { conn->our_hist.shift(conn->our_hist.get_value() - min_rtt); } // only apply the congestion controller on acks // if we don't have a delay measurement, there's // no point in invoking the congestion control if (actual_delay != 0 && acked_bytes >= 1) conn->apply_ledbat_ccontrol(acked_bytes, actual_delay, min_rtt); // sanity check, the other end should never ack packets // past the point we've sent if (acks <= conn->cur_window_packets) { conn->max_window_user = conn->version == 0 ? pf->windowsize * PACKET_SIZE : pf1->windowsize; // If max user window is set to 0, then we startup a timer // That will reset it to 1 after 15 seconds. if (conn->max_window_user == 0) // Reset max_window_user to 1 every 15 seconds. conn->zerowindow_time = g_current_ms + 15000; // Respond to connect message // Switch to CONNECTED state. if (conn->state == CS_SYN_SENT) { conn->state = CS_CONNECTED; conn->func.on_state(conn->userdata, UTP_STATE_CONNECT); // We've sent a fin, and everything was ACKed (including the FIN), // it's safe to destroy the socket. cur_window_packets == acks // means that this packet acked all the remaining packets that // were in-flight. } else if (conn->state == CS_FIN_SENT && conn->cur_window_packets == acks) { conn->state = CS_DESTROY; } // Update fast resend counter if (wrapping_compare_less(conn->fast_resend_seq_nr, (pk_ack_nr + 1) & ACK_NR_MASK)) conn->fast_resend_seq_nr = pk_ack_nr + 1; LOG_UTPV("0x%08x: fast_resend_seq_nr:%u", conn, conn->fast_resend_seq_nr); for (int i = 0; i < acks; ++i) { int ack_status = conn->ack_packet(conn->seq_nr - conn->cur_window_packets); // if ack_status is 0, the packet was acked. // if acl_stauts is 1, it means that the packet had already been acked // if it's 2, the packet has not been sent yet // We need to break this loop in the latter case. This could potentially // happen if we get an ack_nr that does not exceed what we have stuffed // into the outgoing buffer, but does exceed what we have sent if (ack_status == 2) { #ifdef _DEBUG OutgoingPacket* pkt = (OutgoingPacket*)conn->outbuf.get(conn->seq_nr - conn->cur_window_packets); assert(pkt->transmissions == 0); #endif break; } conn->cur_window_packets--; } #ifdef _DEBUG if (conn->cur_window_packets == 0) assert(conn->cur_window == 0); #endif // packets in front of this may have been acked by a // selective ack (EACK). Keep decreasing the window packet size // until we hit a packet that is still waiting to be acked // in the send queue // this is especially likely to happen when the other end // has the EACK send bug older versions of uTP had while (conn->cur_window_packets > 0 && !conn->outbuf.get(conn->seq_nr - conn->cur_window_packets)) conn->cur_window_packets--; #ifdef _DEBUG if (conn->cur_window_packets == 0) assert(conn->cur_window == 0); #endif // this invariant should always be true assert(conn->cur_window_packets == 0 || conn->outbuf.get(conn->seq_nr - conn->cur_window_packets)); // flush Nagle if (conn->cur_window_packets == 1) { OutgoingPacket *pkt = (OutgoingPacket*)conn->outbuf.get(conn->seq_nr - 1); // do we still have quota? if (pkt->transmissions == 0 && (!(USE_PACKET_PACING) || conn->send_quota / 100 >= (int32)pkt->length)) { conn->send_packet(pkt); // No need to send another ack if there is nothing to reorder. if (conn->reorder_count == 0) { conn->sent_ack(); } } } // Fast timeout-retry if (conn->fast_timeout) { LOG_UTPV("Fast timeout %u,%u,%u?", (uint)conn->cur_window, conn->seq_nr - conn->timeout_seq_nr, conn->timeout_seq_nr); // if the fast_resend_seq_nr is not pointing to the oldest outstanding packet, it suggests that we've already // resent the packet that timed out, and we should leave the fast-timeout mode. if (((conn->seq_nr - conn->cur_window_packets) & ACK_NR_MASK) != conn->fast_resend_seq_nr) { conn->fast_timeout = false; } else { // resend the oldest packet and increment fast_resend_seq_nr // to not allow another fast resend on it again OutgoingPacket *pkt = (OutgoingPacket*)conn->outbuf.get(conn->seq_nr - conn->cur_window_packets); if (pkt && pkt->transmissions > 0) { LOG_UTPV("0x%08x: Packet %u fast timeout-retry.", conn, conn->seq_nr - conn->cur_window_packets); #ifdef _DEBUG ++conn->_stats._fastrexmit; #endif conn->fast_resend_seq_nr++; conn->send_packet(pkt); } } } } // Process selective acknowledgent if (selack_ptr != NULL) { conn->selective_ack(pk_ack_nr + 2, selack_ptr, selack_ptr[-1]); } // this invariant should always be true assert(conn->cur_window_packets == 0 || conn->outbuf.get(conn->seq_nr - conn->cur_window_packets)); LOG_UTPV("0x%08x: acks:%d acked_bytes:%u seq_nr:%u cur_window:%u cur_window_packets:%u quota:%d", conn, acks, (uint)acked_bytes, conn->seq_nr, (uint)conn->cur_window, conn->cur_window_packets, conn->send_quota / 100); // In case the ack dropped the current window below // the max_window size, Mark the socket as writable if (conn->state == CS_CONNECTED_FULL && conn->is_writable(conn->get_packet_size())) { conn->state = CS_CONNECTED; LOG_UTPV("0x%08x: Socket writable. max_window:%u cur_window:%u quota:%d packet_size:%u", conn, (uint)conn->max_window, (uint)conn->cur_window, conn->send_quota / 100, (uint)conn->get_packet_size()); conn->func.on_state(conn->userdata, UTP_STATE_WRITABLE); } if (pk_flags == ST_STATE) { // This is a state packet only. return 0; } // The connection is not in a state that can accept data? if (conn->state != CS_CONNECTED && conn->state != CS_CONNECTED_FULL && conn->state != CS_FIN_SENT) { return 0; } // Is this a finalize packet? if (pk_flags == ST_FIN && !conn->got_fin) { LOG_UTPV("Got FIN eof_pkt:%u", pk_seq_nr); conn->got_fin = true; conn->eof_pkt = pk_seq_nr; // at this point, it is possible for the // other end to have sent packets with // sequence numbers higher than seq_nr. // if this is the case, our reorder_count // is out of sync. This case is dealt with // when we re-order and hit the eof_pkt. // we'll just ignore any packets with // sequence numbers past this } // Getting an in-order packet? if (seqnr == 0) { size_t count = packet_end - data; if (count > 0 && conn->state != CS_FIN_SENT) { LOG_UTPV("0x%08x: Got Data len:%u (rb:%u)", conn, (uint)count, (uint)conn->func.get_rb_size(conn->userdata)); // Post bytes to the upper layer conn->func.on_read(conn->userdata, data, count); } conn->ack_nr++; conn->bytes_since_ack += count; // Check if the next packet has been received too, but waiting // in the reorder buffer. for (;;) { if (conn->got_fin && conn->eof_pkt == conn->ack_nr) { if (conn->state != CS_FIN_SENT) { conn->state = CS_GOT_FIN; conn->rto_timeout = g_current_ms + min(conn->rto * 3, 60); LOG_UTPV("0x%08x: Posting EOF", conn); conn->func.on_state(conn->userdata, UTP_STATE_EOF); } // if the other end wants to close, ack immediately conn->send_ack(); // reorder_count is not necessarily 0 at this point. // even though it is most of the time, the other end // may have sent packets with higher sequence numbers // than what later end up being eof_pkt // since we have received all packets up to eof_pkt // just ignore the ones after it. conn->reorder_count = 0; } // Quick get-out in case there is nothing to reorder if (conn->reorder_count == 0) break; // Check if there are additional buffers in the reorder buffers // that need delivery. byte *p = (byte*)conn->inbuf.get(conn->ack_nr+1); if (p == NULL) break; conn->inbuf.put(conn->ack_nr+1, NULL); count = *(uint*)p; if (count > 0 && conn->state != CS_FIN_SENT) { // Pass the bytes to the upper layer conn->func.on_read(conn->userdata, p + sizeof(uint), count); } conn->ack_nr++; conn->bytes_since_ack += count; // Free the element from the reorder buffer free(p); assert(conn->reorder_count > 0); conn->reorder_count--; } // start the delayed ACK timer conn->ack_time = g_current_ms + min(conn->ack_time - g_current_ms, DELAYED_ACK_TIME_THRESHOLD); } else { // Getting an out of order packet. // The packet needs to be remembered and rearranged later. // if we have received a FIN packet, and the EOF-sequence number // is lower than the sequence number of the packet we just received // something is wrong. if (conn->got_fin && pk_seq_nr > conn->eof_pkt) { LOG_UTPV("0x%08x: Got an invalid packet sequence number, past EOF " "reorder_count:%u len:%u (rb:%u)", conn, conn->reorder_count, (uint)(packet_end - data), (uint)conn->func.get_rb_size(conn->userdata)); return 0; } // if the sequence number is entirely off the expected // one, just drop it. We can't allocate buffer space in // the inbuf entirely based on untrusted input if (seqnr > 0x3ff) { LOG_UTPV("0x%08x: Got an invalid packet sequence number, too far off " "reorder_count:%u len:%u (rb:%u)", conn, conn->reorder_count, (uint)(packet_end - data), (uint)conn->func.get_rb_size(conn->userdata)); return 0; } // we need to grow the circle buffer before we // check if the packet is already in here, so that // we don't end up looking at an older packet (since // the indices wraps around). conn->inbuf.ensure_size(pk_seq_nr + 1, seqnr + 1); // Has this packet already been received? (i.e. a duplicate) // If that is the case, just discard it. if (conn->inbuf.get(pk_seq_nr) != NULL) { #ifdef _DEBUG ++conn->_stats._nduprecv; #endif return 0; } // Allocate memory to fit the packet that needs to re-ordered byte *mem = (byte*)malloc((packet_end - data) + sizeof(uint)); *(uint*)mem = (uint)(packet_end - data); memcpy(mem + sizeof(uint), data, packet_end - data); // Insert into reorder buffer and increment the count // of # of packets to be reordered. // we add one to seqnr in order to leave the last // entry empty, that way the assert in send_ack // is valid. we have to add one to seqnr too, in order // to make the circular buffer grow around the correct // point (which is conn->ack_nr + 1). assert(conn->inbuf.get(pk_seq_nr) == NULL); assert((pk_seq_nr & conn->inbuf.mask) != ((conn->ack_nr+1) & conn->inbuf.mask)); conn->inbuf.put(pk_seq_nr, mem); conn->reorder_count++; LOG_UTPV("0x%08x: Got out of order data reorder_count:%u len:%u (rb:%u)", conn, conn->reorder_count, (uint)(packet_end - data), (uint)conn->func.get_rb_size(conn->userdata)); // Setup so the partial ACK message will get sent immediately. conn->ack_time = g_current_ms + min(conn->ack_time - g_current_ms, 1); } // If ack_time or ack_bytes indicate that we need to send and ack, send one // here instead of waiting for the timer to trigger LOG_UTPV("bytes_since_ack:%u ack_time:%d", (uint)conn->bytes_since_ack, (int)(g_current_ms - conn->ack_time)); if (conn->state == CS_CONNECTED || conn->state == CS_CONNECTED_FULL) { if (conn->bytes_since_ack > DELAYED_ACK_BYTE_THRESHOLD || (int)(g_current_ms - conn->ack_time) >= 0) { conn->send_ack(); } } return (size_t)(packet_end - data); } inline bool UTP_IsV1(PacketFormatV1 const* pf) { return pf->version() == 1 && pf->type() < ST_NUM_STATES && pf->ext < 3; } void UTP_Free(UTPSocket *conn) { LOG_UTPV("0x%08x: Killing socket", conn); conn->func.on_state(conn->userdata, UTP_STATE_DESTROYING); UTP_SetCallbacks(conn, NULL, NULL); assert(conn->idx < g_utp_sockets.GetCount()); assert(g_utp_sockets[conn->idx] == conn); // Unlink object from the global list assert(g_utp_sockets.GetCount() > 0); UTPSocket *last = g_utp_sockets[g_utp_sockets.GetCount() - 1]; assert(last->idx < g_utp_sockets.GetCount()); assert(g_utp_sockets[last->idx] == last); last->idx = conn->idx; g_utp_sockets[conn->idx] = last; // Decrease the count g_utp_sockets.SetCount(g_utp_sockets.GetCount() - 1); // Free all memory occupied by the socket object. for (size_t i = 0; i <= conn->inbuf.mask; i++) { free(conn->inbuf.elements[i]); } for (size_t i = 0; i <= conn->outbuf.mask; i++) { free(conn->outbuf.elements[i]); } free(conn->inbuf.elements); free(conn->outbuf.elements); // Finally free the socket object free(conn); } // Public functions: /////////////////////////////////////////////////////////////////////////////// // Create a UTP socket UTPSocket *UTP_Create(SendToProc *send_to_proc, void *send_to_userdata, const struct sockaddr *addr, socklen_t addrlen) { UTPSocket *conn = (UTPSocket*)calloc(1, sizeof(UTPSocket)); g_current_ms = UTP_GetMilliseconds(); UTP_SetCallbacks(conn, NULL, NULL); conn->our_hist.clear(); conn->their_hist.clear(); conn->rto = 3000; conn->rtt_var = 800; conn->seq_nr = 1; conn->ack_nr = 0; conn->max_window_user = 255 * PACKET_SIZE; conn->addr = PackedSockAddr((const SOCKADDR_STORAGE*)addr, addrlen); conn->send_to_proc = send_to_proc; conn->send_to_userdata = send_to_userdata; conn->ack_time = g_current_ms + 0x70000000; conn->last_got_packet = g_current_ms; conn->last_sent_packet = g_current_ms; conn->last_measured_delay = g_current_ms + 0x70000000; conn->last_rwin_decay = int32(g_current_ms) - MAX_WINDOW_DECAY; conn->last_send_quota = g_current_ms; conn->send_quota = PACKET_SIZE * 100; conn->cur_window_packets = 0; conn->fast_resend_seq_nr = conn->seq_nr; // default to version 1 UTP_SetSockopt(conn, SO_UTPVERSION, 1); // we need to fit one packet in the window // when we start the connection conn->max_window = conn->get_packet_size(); conn->state = CS_IDLE; conn->outbuf.mask = 15; conn->inbuf.mask = 15; conn->outbuf.elements = (void**)calloc(16, sizeof(void*)); conn->inbuf.elements = (void**)calloc(16, sizeof(void*)); conn->idx = g_utp_sockets.Append(conn); LOG_UTPV("0x%08x: UTP_Create", conn); return conn; } void UTP_SetCallbacks(UTPSocket *conn, UTPFunctionTable *funcs, void *userdata) { assert(conn); if (funcs == NULL) { funcs = &zero_funcs; } conn->func = *funcs; conn->userdata = userdata; } bool UTP_SetSockopt(UTPSocket* conn, int opt, int val) { assert(conn); switch (opt) { case SO_SNDBUF: assert(val >= 1); conn->opt_sndbuf = val; return true; case SO_RCVBUF: conn->opt_rcvbuf = val; return true; case SO_UTPVERSION: assert(conn->state == CS_IDLE); if (conn->state != CS_IDLE) { // too late return false; } if (conn->version == 1 && val == 0) { conn->reply_micro = INT_MAX; conn->opt_rcvbuf = 200 * 1024; conn->opt_sndbuf = OUTGOING_BUFFER_MAX_SIZE * PACKET_SIZE; } else if (conn->version == 0 && val == 1) { conn->reply_micro = 0; conn->opt_rcvbuf = 3 * 1024 * 1024 + 512 * 1024; conn->opt_sndbuf = conn->opt_rcvbuf; } conn->version = val; return true; } return false; } // Try to connect to a specified host. // 'initial' is the number of data bytes to send in the connect packet. void UTP_Connect(UTPSocket *conn) { assert(conn); assert(conn->state == CS_IDLE); assert(conn->cur_window_packets == 0); assert(conn->outbuf.get(conn->seq_nr) == NULL); assert(sizeof(PacketFormatV1) == 20); conn->state = CS_SYN_SENT; g_current_ms = UTP_GetMilliseconds(); // Create and send a connect message uint32 conn_seed = UTP_Random(); // we identify newer versions by setting the // first two bytes to 0x0001 if (conn->version > 0) { conn_seed &= 0xffff; } // used in parse_log.py LOG_UTP("0x%08x: UTP_Connect conn_seed:%u packet_size:%u (B) " "target_delay:%u (ms) delay_history:%u " "delay_base_history:%u (minutes)", conn, conn_seed, PACKET_SIZE, CCONTROL_TARGET / 1000, CUR_DELAY_SIZE, DELAY_BASE_HISTORY); // Setup initial timeout timer. conn->retransmit_timeout = 3000; conn->rto_timeout = g_current_ms + conn->retransmit_timeout; conn->last_rcv_win = conn->get_rcv_window(); conn->conn_seed = conn_seed; conn->conn_id_recv = conn_seed; conn->conn_id_send = conn_seed+1; // if you need compatibiltiy with 1.8.1, use this. it increases attackability though. //conn->seq_nr = 1; conn->seq_nr = UTP_Random(); // Create the connect packet. const size_t header_ext_size = conn->get_header_extensions_size(); OutgoingPacket *pkt = (OutgoingPacket*)malloc(sizeof(OutgoingPacket) - 1 + header_ext_size); PacketFormatExtensions* p = (PacketFormatExtensions*)pkt->data; PacketFormatExtensionsV1* p1 = (PacketFormatExtensionsV1*)pkt->data; memset(p, 0, header_ext_size); // SYN packets are special, and have the receive ID in the connid field, // instead of conn_id_send. if (conn->version == 0) { p->pf.connid = conn->conn_id_recv; p->pf.ext = 2; p->pf.windowsize = (byte)DIV_ROUND_UP(conn->last_rcv_win, PACKET_SIZE); p->pf.seq_nr = conn->seq_nr; p->pf.flags = ST_SYN; p->ext_next = 0; p->ext_len = 8; memset(p->extensions, 0, 8); } else { p1->pf.set_version(1); p1->pf.set_type(ST_SYN); p1->pf.ext = 2; p1->pf.connid = conn->conn_id_recv; p1->pf.windowsize = (uint32)conn->last_rcv_win; p1->pf.seq_nr = conn->seq_nr; p1->ext_next = 0; p1->ext_len = 8; memset(p1->extensions, 0, 8); } pkt->transmissions = 0; pkt->length = header_ext_size; pkt->payload = 0; //LOG_UTPV("0x%08x: Sending connect %s [%u].", // conn, addrfmt(conn->addr, addrbuf), conn_seed); // Remember the message in the outgoing queue. conn->outbuf.ensure_size(conn->seq_nr, conn->cur_window_packets); conn->outbuf.put(conn->seq_nr, pkt); conn->seq_nr++; conn->cur_window_packets++; conn->send_packet(pkt); } bool UTP_IsIncomingUTP(UTPGotIncomingConnection *incoming_proc, SendToProc *send_to_proc, void *send_to_userdata, const byte *buffer, size_t len, const struct sockaddr *to, socklen_t tolen) { const PackedSockAddr addr((const SOCKADDR_STORAGE*)to, tolen); if (len < sizeof(PacketFormat) && len < sizeof(PacketFormatV1)) { LOG_UTPV("recv %s len:%u too small", addrfmt(addr, addrbuf), (uint)len); return false; } const PacketFormat* p = (PacketFormat*)buffer; const PacketFormatV1* p1 = (PacketFormatV1*)buffer; const byte version = UTP_IsV1(p1); const uint32 id = (version == 0) ? p->connid : uint32(p1->connid); if (version == 0 && len < sizeof(PacketFormat)) { LOG_UTPV("recv %s len:%u version:%u too small", addrfmt(addr, addrbuf), (uint)len, version); return false; } if (version == 1 && len < sizeof(PacketFormatV1)) { LOG_UTPV("recv %s len:%u version:%u too small", addrfmt(addr, addrbuf), (uint)len, version); return false; } LOG_UTPV("recv %s len:%u id:%u", addrfmt(addr, addrbuf), (uint)len, id); const PacketFormat *pf = (PacketFormat*)p; const PacketFormatV1 *pf1 = (PacketFormatV1*)p; if (version == 0) { LOG_UTPV("recv id:%u seq_nr:%u ack_nr:%u", id, (uint)pf->seq_nr, (uint)pf->ack_nr); } else { LOG_UTPV("recv id:%u seq_nr:%u ack_nr:%u", id, (uint)pf1->seq_nr, (uint)pf1->ack_nr); } const byte flags = version == 0 ? pf->flags : pf1->type(); for (size_t i = 0; i < g_utp_sockets.GetCount(); i++) { UTPSocket *conn = g_utp_sockets[i]; //LOG_UTPV("Examining UTPSocket %s for %s and (seed:%u s:%u r:%u) for %u", // addrfmt(conn->addr, addrbuf), addrfmt(addr, addrbuf2), conn->conn_seed, conn->conn_id_send, conn->conn_id_recv, id); if (conn->addr != addr) continue; if (flags == ST_RESET && (conn->conn_id_send == id || conn->conn_id_recv == id)) { LOG_UTPV("0x%08x: recv RST for existing connection", conn); if (!conn->userdata || conn->state == CS_FIN_SENT) { conn->state = CS_DESTROY; } else { conn->state = CS_RESET; } if (conn->userdata) { conn->func.on_overhead(conn->userdata, false, len + conn->get_udp_overhead(), close_overhead); const int err = conn->state == CS_SYN_SENT ? ECONNREFUSED : ECONNRESET; conn->func.on_error(conn->userdata, err); } return true; } else if (flags != ST_SYN && conn->conn_id_recv == id) { LOG_UTPV("0x%08x: recv processing", conn); const size_t read = UTP_ProcessIncoming(conn, buffer, len); if (conn->userdata) { conn->func.on_overhead(conn->userdata, false, (len - read) + conn->get_udp_overhead(), header_overhead); } return true; } } if (flags == ST_RESET) { LOG_UTPV("recv RST for unknown connection"); return true; } const uint32 seq_nr = version == 0 ? pf->seq_nr : pf1->seq_nr; if (flags != ST_SYN) { for (size_t i = 0; i < g_rst_info.GetCount(); i++) { if (g_rst_info[i].connid != id) continue; if (g_rst_info[i].addr != addr) continue; if (seq_nr != g_rst_info[i].ack_nr) continue; g_rst_info[i].timestamp = UTP_GetMilliseconds(); LOG_UTPV("recv not sending RST to non-SYN (stored)"); return true; } if (g_rst_info.GetCount() > RST_INFO_LIMIT) { LOG_UTPV("recv not sending RST to non-SYN (limit at %u stored)", (uint)g_rst_info.GetCount()); return true; } LOG_UTPV("recv send RST to non-SYN (%u stored)", (uint)g_rst_info.GetCount()); RST_Info &r = g_rst_info.Append(); r.addr = addr; r.connid = id; r.ack_nr = seq_nr; r.timestamp = UTP_GetMilliseconds(); UTPSocket::send_rst(send_to_proc, send_to_userdata, addr, id, seq_nr, UTP_Random(), version); return true; } if (incoming_proc) { LOG_UTPV("Incoming connection from %s uTP version:%u", addrfmt(addr, addrbuf), version); // Create a new UTP socket to handle this new connection UTPSocket *conn = UTP_Create(send_to_proc, send_to_userdata, to, tolen); // Need to track this value to be able to detect duplicate CONNECTs conn->conn_seed = id; // This is value that identifies this connection for them. conn->conn_id_send = id; // This is value that identifies this connection for us. conn->conn_id_recv = id+1; conn->ack_nr = seq_nr; conn->seq_nr = UTP_Random(); conn->fast_resend_seq_nr = conn->seq_nr; UTP_SetSockopt(conn, SO_UTPVERSION, version); conn->state = CS_CONNECTED; const size_t read = UTP_ProcessIncoming(conn, buffer, len, true); LOG_UTPV("0x%08x: recv send connect ACK", conn); conn->send_ack(true); incoming_proc(send_to_userdata, conn); // we report overhead after incoming_proc, because the callbacks are setup now if (conn->userdata) { // SYN conn->func.on_overhead(conn->userdata, false, (len - read) + conn->get_udp_overhead(), header_overhead); // SYNACK conn->func.on_overhead(conn->userdata, true, conn->get_overhead(), ack_overhead); } } return true; } bool UTP_HandleICMP(const byte* buffer, size_t len, const struct sockaddr *to, socklen_t tolen) { const PackedSockAddr addr((const SOCKADDR_STORAGE*)to, tolen); // Want the whole packet so we have connection ID if (len < sizeof(PacketFormat)) { return false; } const PacketFormat* p = (PacketFormat*)buffer; const PacketFormatV1* p1 = (PacketFormatV1*)buffer; const byte version = UTP_IsV1(p1); const uint32 id = (version == 0) ? p->connid : uint32(p1->connid); for (size_t i = 0; i < g_utp_sockets.GetCount(); ++i) { UTPSocket *conn = g_utp_sockets[i]; if (conn->addr == addr && conn->conn_id_recv == id) { // Don't pass on errors for idle/closed connections if (conn->state != CS_IDLE) { if (!conn->userdata || conn->state == CS_FIN_SENT) { LOG_UTPV("0x%08x: icmp packet causing socket destruction", conn); conn->state = CS_DESTROY; } else { conn->state = CS_RESET; } if (conn->userdata) { const int err = conn->state == CS_SYN_SENT ? ECONNREFUSED : ECONNRESET; LOG_UTPV("0x%08x: icmp packet causing error on socket:%d", conn, err); conn->func.on_error(conn->userdata, err); } } return true; } } return false; } // Write bytes to the UTP socket. // Returns true if the socket is still writable. bool UTP_Write(UTPSocket *conn, size_t bytes) { assert(conn); #ifdef g_log_utp_verbose size_t param = bytes; #endif if (conn->state != CS_CONNECTED) { LOG_UTPV("0x%08x: UTP_Write %u bytes = false (not CS_CONNECTED)", conn, (uint)bytes); return false; } g_current_ms = UTP_GetMilliseconds(); conn->update_send_quota(); // don't send unless it will all fit in the window size_t packet_size = conn->get_packet_size(); size_t num_to_send = min(bytes, packet_size); while (conn->is_writable(num_to_send)) { // Send an outgoing packet. // Also add it to the outgoing of packets that have been sent but not ACKed. if (num_to_send == 0) { LOG_UTPV("0x%08x: UTP_Write %u bytes = true", conn, (uint)param); return true; } bytes -= num_to_send; LOG_UTPV("0x%08x: Sending packet. seq_nr:%u ack_nr:%u wnd:%u/%u/%u rcv_win:%u size:%u quota:%d cur_window_packets:%u", conn, conn->seq_nr, conn->ack_nr, (uint)(conn->cur_window + num_to_send), (uint)conn->max_window, (uint)conn->max_window_user, (uint)conn->last_rcv_win, num_to_send, conn->send_quota / 100, conn->cur_window_packets); conn->write_outgoing_packet(num_to_send, ST_DATA); num_to_send = min(bytes, packet_size); } // mark the socket as not being writable. conn->state = CS_CONNECTED_FULL; LOG_UTPV("0x%08x: UTP_Write %u bytes = false", conn, (uint)bytes); return false; } void UTP_RBDrained(UTPSocket *conn) { assert(conn); const size_t rcvwin = conn->get_rcv_window(); if (rcvwin > conn->last_rcv_win) { // If last window was 0 send ACK immediately, otherwise should set timer if (conn->last_rcv_win == 0) { conn->send_ack(); } else { conn->ack_time = g_current_ms + min(conn->ack_time - g_current_ms, DELAYED_ACK_TIME_THRESHOLD); } } } void UTP_CheckTimeouts() { g_current_ms = UTP_GetMilliseconds(); for (size_t i = 0; i < g_rst_info.GetCount(); i++) { if ((int)(g_current_ms - g_rst_info[i].timestamp) >= RST_INFO_TIMEOUT) { g_rst_info.MoveUpLast(i); i--; } } if (g_rst_info.GetCount() != g_rst_info.GetAlloc()) { g_rst_info.Compact(); } for (size_t i = 0; i != g_utp_sockets.GetCount(); i++) { UTPSocket *conn = g_utp_sockets[i]; conn->check_timeouts(); // Check if the object was deleted if (conn->state == CS_DESTROY) { LOG_UTPV("0x%08x: Destroying", conn); UTP_Free(conn); i--; } } } size_t UTP_GetPacketSize(UTPSocket *socket) { return socket->get_packet_size(); } void UTP_GetPeerName(UTPSocket *conn, struct sockaddr *addr, socklen_t *addrlen) { assert(conn); socklen_t len; const SOCKADDR_STORAGE sa = conn->addr.get_sockaddr_storage(&len); *addrlen = min(len, *addrlen); memcpy(addr, &sa, *addrlen); } void UTP_GetDelays(UTPSocket *conn, int32 *ours, int32 *theirs, uint32 *age) { assert(conn); if (ours) *ours = conn->our_hist.get_value(); if (theirs) *theirs = conn->their_hist.get_value(); if (age) *age = g_current_ms - conn->last_measured_delay; } #ifdef _DEBUG void UTP_GetStats(UTPSocket *conn, UTPStats *stats) { assert(conn); *stats = conn->_stats; } #endif // _DEBUG void UTP_GetGlobalStats(UTPGlobalStats *stats) { *stats = _global_stats; } // Close the UTP socket. // It is not valid for the upper layer to refer to socket after it is closed. // Data will keep to try being delivered after the close. void UTP_Close(UTPSocket *conn) { assert(conn); assert(conn->state != CS_DESTROY_DELAY && conn->state != CS_FIN_SENT && conn->state != CS_DESTROY); LOG_UTPV("0x%08x: UTP_Close in state:%s", conn, statenames[conn->state]); switch(conn->state) { case CS_CONNECTED: case CS_CONNECTED_FULL: conn->state = CS_FIN_SENT; conn->write_outgoing_packet(0, ST_FIN); break; case CS_SYN_SENT: conn->rto_timeout = UTP_GetMilliseconds() + min(conn->rto * 2, 60); case CS_GOT_FIN: conn->state = CS_DESTROY_DELAY; break; default: conn->state = CS_DESTROY; break; } } transmission-2.92/third-party/libutp/PaxHeaders.4960/LICENSE0000644000000000000000000000013212442116702020430 xustar0030 mtime=1418239426.288308326 30 atime=1418239426.288308326 30 ctime=1457295919.309796167 transmission-2.92/third-party/libutp/LICENSE0000644000175000017500000000204412442116702022055 0ustar00mikedldmikedld00000000000000Copyright (c) 2010 BitTorrent, Inc. 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. transmission-2.92/third-party/libutp/PaxHeaders.4960/utp_config.h0000644000000000000000000000013112442116702021730 xustar0030 mtime=1418239426.289308343 30 atime=1418239426.289308343 29 ctime=1457295919.26879547 transmission-2.92/third-party/libutp/utp_config.h0000644000175000017500000000160212442116702023355 0ustar00mikedldmikedld00000000000000#define CCONTROL_TARGET (100 * 1000) // us #define RATE_CHECK_INTERVAL 10000 // ms #define DYNAMIC_PACKET_SIZE_ENABLED false #define DYNAMIC_PACKET_SIZE_FACTOR 2 // This should return the global number of bytes sent, used for determining dynamic // packet size based on rate #warning implement this in libtransmission uint64 UTP_GetGlobalUTPBytesSent(const struct sockaddr *remote, socklen_t remotelen) { return 0; } enum bandwidth_type_t { payload_bandwidth, connect_overhead, close_overhead, ack_overhead, header_overhead, retransmit_overhead }; #ifdef WIN32 #define I64u "%I64u" #else #define I64u "%Lu" #endif #ifdef WIN32 #define snprintf _snprintf #endif #define g_log_utp 0 #define g_log_utp_verbose 0 void utp_log(char const* fmt, ...) { /* printf("[%u] ", UTP_GetMilliseconds()); va_list vl; va_start(vl, fmt); vprintf(fmt, vl); va_end(vl); puts(""); fflush(stdout); */ }; transmission-2.92/third-party/libutp/PaxHeaders.4960/utp_config_example.h0000644000000000000000000000006212610255563023454 xustar0020 atime=1445026675 30 ctime=1457295919.261795351 transmission-2.92/third-party/libutp/utp_config_example.h0000644000175000017500000000133612610255563025102 0ustar00mikedldmikedld00000000000000#define CCONTROL_TARGET (100 * 1000) // us #define RATE_CHECK_INTERVAL 10000 // ms #define DYNAMIC_PACKET_SIZE_ENABLED false #define DYNAMIC_PACKET_SIZE_FACTOR 2 // This should return the global number of bytes sent, used for determining dynamic // packet size based on rate uint64 UTP_GetGlobalUTPBytesSent(const struct sockaddr *remote, socklen_t remotelen) { return 0; } enum bandwidth_type_t { payload_bandwidth, connect_overhead, close_overhead, ack_overhead, header_overhead, retransmit_overhead }; #ifdef WIN32 #define I64u "%I64u" #else #define I64u "%Lu" #endif #ifdef WIN32 #define snprintf _snprintf #endif #define g_log_utp 0 #define g_log_utp_verbose 0 void utp_log(char const* fmt, ...); transmission-2.92/third-party/libutp/PaxHeaders.4960/Makefile.am0000644000000000000000000000013212442116702021457 xustar0030 mtime=1418239426.289308343 30 atime=1418239426.289308343 30 ctime=1457295919.243795045 transmission-2.92/third-party/libutp/Makefile.am0000644000175000017500000000040312442116702023101 0ustar00mikedldmikedld00000000000000AM_CPPFLAGS = -fno-exceptions -fno-rtti -ansi -DPOSIX noinst_LIBRARIES = libutp.a libutp_a_SOURCES = utp.cpp utp_utils.cpp noinst_HEADERS = StdAfx.h templates.h utp_config_example.h utp.h utp_config.h utp_utils.h utypes.h EXTRA_DIST = LICENSE README.md transmission-2.92/third-party/libutp/PaxHeaders.4960/utypes.h0000644000000000000000000000006212610255563021135 xustar0020 atime=1445026675 30 ctime=1457295919.282795708 transmission-2.92/third-party/libutp/utypes.h0000644000175000017500000000160612610255563022563 0ustar00mikedldmikedld00000000000000#ifndef __UTYPES_H__ #define __UTYPES_H__ // standard types typedef unsigned char byte; typedef unsigned char uint8; typedef signed char int8; typedef unsigned short uint16; typedef signed short int16; typedef unsigned int uint; typedef unsigned int uint32; typedef signed int int32; #ifdef _MSC_VER typedef unsigned __int64 uint64; typedef signed __int64 int64; #else typedef unsigned long long uint64; typedef long long int64; #endif /* compile-time assert */ #ifndef CASSERT #define CASSERT( exp, name ) typedef int is_not_##name [ (exp ) ? 1 : -1 ]; #endif CASSERT(8 == sizeof(uint64), sizeof_uint64_is_8) CASSERT(8 == sizeof(int64), sizeof_int64_is_8) #ifndef INT64_MAX #define INT64_MAX 0x7fffffffffffffffLL #endif // always ANSI typedef const char * cstr; typedef char * str; #ifndef __cplusplus typedef uint8 bool; #endif #endif //__UTYPES_H__ transmission-2.92/third-party/PaxHeaders.4960/utp-03-msvc14.patch0000644000000000000000000000013012617217203021310 xustar0029 mtime=1446846083.21174331 29 atime=1446846083.21174331 30 ctime=1457295917.416763977 transmission-2.92/third-party/utp-03-msvc14.patch0000644000175000017500000000340512617217203022741 0ustar00mikedldmikedld00000000000000diff --git a/utp.cpp b/utp.cpp --- a/utp.cpp +++ b/utp.cpp @@ -859,7 +859,7 @@ int flags = version == 0 ? b->flags : b1->type(); uint16 seq_nr = version == 0 ? b->seq_nr : b1->seq_nr; uint16 ack_nr = version == 0 ? b->ack_nr : b1->ack_nr; - LOG_UTPV("0x%08x: send %s len:%u id:%u timestamp:"I64u" reply_micro:%u flags:%s seq_nr:%u ack_nr:%u", + LOG_UTPV("0x%08x: send %s len:%u id:%u timestamp:" I64u " reply_micro:%u flags:%s seq_nr:%u ack_nr:%u", this, addrfmt(addr, addrbuf), (uint)length, conn_id_send, time, reply_micro, flagnames[flags], seq_nr, ack_nr); #endif @@ -1705,7 +1705,7 @@ // used in parse_log.py LOG_UTP("0x%08x: actual_delay:%u our_delay:%d their_delay:%u off_target:%d max_window:%u " "delay_base:%u delay_sum:%d target_delay:%d acked_bytes:%u cur_window:%u " - "scaled_gain:%f rtt:%u rate:%u quota:%d wnduser:%u rto:%u timeout:%d get_microseconds:"I64u" " + "scaled_gain:%f rtt:%u rate:%u quota:%d wnduser:%u rto:%u timeout:%d get_microseconds:" I64u " " "cur_window_packets:%u packet_size:%u their_delay_base:%u their_actual_delay:%u", this, actual_delay, our_delay / 1000, their_hist.get_value() / 1000, (int)off_target / 1000, (uint)(max_window), our_hist.delay_base, @@ -1790,7 +1790,7 @@ if (pk_flags >= ST_NUM_STATES) return 0; - LOG_UTPV("0x%08x: Got %s. seq_nr:%u ack_nr:%u state:%s version:%u timestamp:"I64u" reply_micro:%u", + LOG_UTPV("0x%08x: Got %s. seq_nr:%u ack_nr:%u state:%s version:%u timestamp:" I64u " reply_micro:%u", conn, flagnames[pk_flags], pk_seq_nr, pk_ack_nr, statenames[conn->state], conn->version, conn->version == 0?(uint64)(pf->tv_sec) * 1000000 + pf->tv_usec:uint64(pf1->tv_usec), conn->version == 0?(uint32)(pf->reply_micro):(uint32)(pf1->reply_micro)); transmission-2.92/third-party/PaxHeaders.4960/macosx-libevent-config.h0000644000000000000000000000013212442116705022643 xustar0030 mtime=1418239429.301359959 30 atime=1418239429.301359959 30 ctime=1457295917.833771068 transmission-2.92/third-party/macosx-libevent-config.h0000644000175000017500000002767012442116705024304 0ustar00mikedldmikedld00000000000000/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.in by autoheader. */ /* Define if libevent should build without support for a debug mode */ /* #undef DISABLE_DEBUG_MODE */ /* Define if libevent should not allow replacing the mm functions */ /* #undef DISABLE_MM_REPLACEMENT */ /* Define if libevent should not be compiled with thread support */ /* #undef DISABLE_THREAD_SUPPORT */ /* Define to 1 if you have the `arc4random' function. */ #define HAVE_ARC4RANDOM 1 /* Define to 1 if you have the `arc4random_buf' function. */ /* #undef HAVE_ARC4RANDOM_BUF */ /* Define to 1 if you have the header file. */ #define HAVE_ARPA_INET_H 1 /* Define to 1 if you have the `clock_gettime' function. */ /* #undef HAVE_CLOCK_GETTIME */ /* Define to 1 if you have the declaration of `CTL_KERN', and to 0 if you don't. */ #define HAVE_DECL_CTL_KERN 1 /* Define to 1 if you have the declaration of `KERN_ARND', and to 0 if you don't. */ #define HAVE_DECL_KERN_ARND 0 /* Define to 1 if you have the declaration of `KERN_RANDOM', and to 0 if you don't. */ #define HAVE_DECL_KERN_RANDOM 0 /* Define to 1 if you have the declaration of `RANDOM_UUID', and to 0 if you don't. */ #define HAVE_DECL_RANDOM_UUID 0 /* Define if /dev/poll is available */ /* #undef HAVE_DEVPOLL */ /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 /* Define if your system supports the epoll system calls */ /* #undef HAVE_EPOLL */ /* Define to 1 if you have the `epoll_ctl' function. */ /* #undef HAVE_EPOLL_CTL */ /* Define to 1 if you have the `eventfd' function. */ /* #undef HAVE_EVENTFD */ /* Define if your system supports event ports */ /* #undef HAVE_EVENT_PORTS */ /* Define to 1 if you have the `fcntl' function. */ #define HAVE_FCNTL 1 /* Define to 1 if you have the header file. */ #define HAVE_FCNTL_H 1 /* Define to 1 if the system has the type `fd_mask'. */ #define HAVE_FD_MASK 1 /* Define to 1 if you have the `getaddrinfo' function. */ #define HAVE_GETADDRINFO 1 /* Define to 1 if you have the `getegid' function. */ #define HAVE_GETEGID 1 /* Define to 1 if you have the `geteuid' function. */ #define HAVE_GETEUID 1 /* Define this if you have any gethostbyname_r() */ /* #undef HAVE_GETHOSTBYNAME_R */ /* Define this if gethostbyname_r takes 3 arguments */ /* #undef HAVE_GETHOSTBYNAME_R_3_ARG */ /* Define this if gethostbyname_r takes 5 arguments */ /* #undef HAVE_GETHOSTBYNAME_R_5_ARG */ /* Define this if gethostbyname_r takes 6 arguments */ /* #undef HAVE_GETHOSTBYNAME_R_6_ARG */ /* Define to 1 if you have the `getnameinfo' function. */ #define HAVE_GETNAMEINFO 1 /* Define to 1 if you have the `getprotobynumber' function. */ #define HAVE_GETPROTOBYNUMBER 1 /* Define to 1 if you have the `getservbyname' function. */ #define HAVE_GETSERVBYNAME 1 /* Define to 1 if you have the `gettimeofday' function. */ #define HAVE_GETTIMEOFDAY 1 /* Define to 1 if you have the `inet_aton' function. */ #define HAVE_INET_ATON 1 /* Define to 1 if you have the `inet_ntop' function. */ #define HAVE_INET_NTOP 1 /* Define to 1 if you have the `inet_pton' function. */ #define HAVE_INET_PTON 1 /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the `issetugid' function. */ #define HAVE_ISSETUGID 1 /* Define to 1 if you have the `kqueue' function. */ #define HAVE_KQUEUE 1 /* Define if the system has zlib */ #define HAVE_LIBZ 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the `mmap' function. */ #define HAVE_MMAP 1 /* Define to 1 if you have the header file. */ #define HAVE_NETDB_H 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_NETINET_IN6_H */ /* Define to 1 if you have the header file. */ #define HAVE_NETINET_IN_H 1 /* Define if the system has openssl */ #define HAVE_OPENSSL 1 /* Define to 1 if you have the `pipe' function. */ #define HAVE_PIPE 1 /* Define to 1 if you have the `poll' function. */ #define HAVE_POLL 1 /* Define to 1 if you have the header file. */ #define HAVE_POLL_H 1 /* Define to 1 if you have the `port_create' function. */ /* #undef HAVE_PORT_CREATE */ /* Define to 1 if you have the header file. */ /* #undef HAVE_PORT_H */ /* Define if you have POSIX threads libraries and header files. */ /* #undef HAVE_PTHREAD */ /* Define if we have pthreads on this system */ #define HAVE_PTHREADS 1 /* Define to 1 if you have the `putenv' function. */ #define HAVE_PUTENV 1 /* Define to 1 if the system has the type `sa_family_t'. */ #define HAVE_SA_FAMILY_T 1 /* Define to 1 if you have the `select' function. */ #define HAVE_SELECT 1 /* Define to 1 if you have the `sendfile' function. */ #define HAVE_SENDFILE 1 /* Define to 1 if you have the `setenv' function. */ #define HAVE_SETENV 1 /* Define if F_SETFD is defined in */ #define HAVE_SETFD 1 /* Define to 1 if you have the `sigaction' function. */ #define HAVE_SIGACTION 1 /* Define to 1 if you have the `signal' function. */ #define HAVE_SIGNAL 1 /* Define to 1 if you have the `splice' function. */ /* #undef HAVE_SPLICE */ /* Define to 1 if you have the header file. */ #define HAVE_STDARG_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDDEF_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the `strlcpy' function. */ #define HAVE_STRLCPY 1 /* Define to 1 if you have the `strsep' function. */ #define HAVE_STRSEP 1 /* Define to 1 if you have the `strtok_r' function. */ #define HAVE_STRTOK_R 1 /* Define to 1 if you have the `strtoll' function. */ #define HAVE_STRTOLL 1 /* Define to 1 if the system has the type `struct addrinfo'. */ #define HAVE_STRUCT_ADDRINFO 1 /* Define to 1 if the system has the type `struct in6_addr'. */ #define HAVE_STRUCT_IN6_ADDR 1 /* Define to 1 if `s6_addr16' is a member of `struct in6_addr'. */ /* #undef HAVE_STRUCT_IN6_ADDR_S6_ADDR16 */ /* Define to 1 if `s6_addr32' is a member of `struct in6_addr'. */ /* #undef HAVE_STRUCT_IN6_ADDR_S6_ADDR32 */ /* Define to 1 if the system has the type `struct sockaddr_in6'. */ #define HAVE_STRUCT_SOCKADDR_IN6 1 /* Define to 1 if `sin6_len' is a member of `struct sockaddr_in6'. */ #define HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN 1 /* Define to 1 if `sin_len' is a member of `struct sockaddr_in'. */ #define HAVE_STRUCT_SOCKADDR_IN_SIN_LEN 1 /* Define to 1 if the system has the type `struct sockaddr_storage'. */ #define HAVE_STRUCT_SOCKADDR_STORAGE 1 /* Define to 1 if `ss_family' is a member of `struct sockaddr_storage'. */ #define HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1 /* Define to 1 if `__ss_family' is a member of `struct sockaddr_storage'. */ /* #undef HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY */ /* Define to 1 if you have the header file. */ /* #undef HAVE_SYS_DEVPOLL_H */ /* Define to 1 if you have the header file. */ /* #undef HAVE_SYS_EPOLL_H */ /* Define to 1 if you have the header file. */ /* #undef HAVE_SYS_EVENTFD_H */ /* Define to 1 if you have the header file. */ #define HAVE_SYS_EVENT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_IOCTL_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_MMAN_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_PARAM_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_QUEUE_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_SELECT_H 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_SYS_SENDFILE_H */ /* Define to 1 if you have the header file. */ #define HAVE_SYS_SOCKET_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_SYSCTL_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TIME_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_UIO_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_WAIT_H 1 /* Define if TAILQ_FOREACH is defined in */ #define HAVE_TAILQFOREACH 1 /* Define if timeradd is defined in */ #define HAVE_TIMERADD 1 /* Define if timerclear is defined in */ #define HAVE_TIMERCLEAR 1 /* Define if timercmp is defined in */ #define HAVE_TIMERCMP 1 /* Define if timerisset is defined in */ #define HAVE_TIMERISSET 1 /* Define to 1 if the system has the type `uint16_t'. */ #define HAVE_UINT16_T 1 /* Define to 1 if the system has the type `uint32_t'. */ #define HAVE_UINT32_T 1 /* Define to 1 if the system has the type `uint64_t'. */ #define HAVE_UINT64_T 1 /* Define to 1 if the system has the type `uint8_t'. */ #define HAVE_UINT8_T 1 /* Define to 1 if the system has the type `uintptr_t'. */ #define HAVE_UINTPTR_T 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to 1 if you have the `unsetenv' function. */ #define HAVE_UNSETENV 1 /* Define to 1 if you have the `vasprintf' function. */ #define HAVE_VASPRINTF 1 /* Define if kqueue works correctly with pipes */ #define HAVE_WORKING_KQUEUE 1 /* Define to 1 if you have the header file. */ #define HAVE_ZLIB_H 1 /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" /* Numeric representation of the version */ #define NUMERIC_VERSION 0x02000b01 /* Name of package */ #define PACKAGE "libevent" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define PACKAGE_NAME "" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "" /* Define to the version of this package. */ #define PACKAGE_VERSION "" /* Define to necessary symbol if this constant uses a non-standard name on your system. */ /* #undef PTHREAD_CREATE_JOINABLE */ /* The size of `int', as computed by sizeof. */ #define SIZEOF_INT 4 /* The size of `long', as computed by sizeof. */ #define SIZEOF_LONG 8 /* The size of `long long', as computed by sizeof. */ #define SIZEOF_LONG_LONG 8 /* The size of `pthread_t', as computed by sizeof. */ #define SIZEOF_PTHREAD_T 8 /* The size of `short', as computed by sizeof. */ #define SIZEOF_SHORT 2 /* The size of `size_t', as computed by sizeof. */ #define SIZEOF_SIZE_T 8 /* The size of `void *', as computed by sizeof. */ #define SIZEOF_VOID_P 8 /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define to 1 if you can safely include both and . */ #define TIME_WITH_SYS_TIME 1 /* Version number of package */ #define VERSION "2.0.11-stable-dev" /* Define to appropriate substitue if compiler doesnt have __func__ */ /* #undef __func__ */ /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus /* #undef inline */ #endif /* Define to `int' if does not define. */ /* #undef pid_t */ /* Define to `unsigned int' if does not define. */ /* #undef size_t */ /* Define to unsigned int if you dont have it */ /* #undef socklen_t */ /* Define to `int' if does not define. */ /* #undef ssize_t */ transmission-2.92/third-party/PaxHeaders.4960/libnatpmp0000644000000000000000000000013212667111056020043 xustar0030 mtime=1457295918.636784723 30 atime=1457295918.388780506 30 ctime=1457295918.636784723 transmission-2.92/third-party/libnatpmp/0000755000175000017500000000000012667111056021545 5ustar00mikedldmikedld00000000000000transmission-2.92/third-party/libnatpmp/PaxHeaders.4960/wingettimeofday.c0000644000000000000000000000013212442116705023460 xustar0030 mtime=1418239429.233358794 30 atime=1418239429.233358794 30 ctime=1457295918.635784706 transmission-2.92/third-party/libnatpmp/wingettimeofday.c0000644000175000017500000000424412442116705025111 0ustar00mikedldmikedld00000000000000/* $Id: wingettimeofday.c,v 1.4 2011/07/15 08:30:11 nanard Exp $ */ /* libnatpmp Copyright (c) 2007-2011, Thomas BERNARD 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. * The name of the author may not 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. */ #ifdef WIN32 #if defined(_MSC_VER) struct timeval { long tv_sec; long tv_usec; }; #else #include #endif typedef struct _FILETIME { unsigned long dwLowDateTime; unsigned long dwHighDateTime; } FILETIME; void __stdcall GetSystemTimeAsFileTime(FILETIME*); int gettimeofday(struct timeval* p, void* tz /* IGNORED */) { union { long long ns100; /*time since 1 Jan 1601 in 100ns units */ FILETIME ft; } _now; if(!p) return -1; GetSystemTimeAsFileTime( &(_now.ft) ); p->tv_usec =(long)((_now.ns100 / 10LL) % 1000000LL ); p->tv_sec = (long)((_now.ns100-(116444736000000000LL))/10000000LL); return 0; } #endif transmission-2.92/third-party/libnatpmp/PaxHeaders.4960/README0000644000000000000000000000013212442116705020775 xustar0030 mtime=1418239429.236358845 30 atime=1418239429.236358845 30 ctime=1457295918.615784366 transmission-2.92/third-party/libnatpmp/README0000644000175000017500000000031012442116705022414 0ustar00mikedldmikedld00000000000000libnatpmp (c) 2007-2009 Thomas Bernard contact : miniupnp@free.fr see http://miniupnp.free.fr/libnatpmp.html or http://miniupnp.tuxfamily.org/libnatpmp.html for some documentation and code samples. transmission-2.92/third-party/libnatpmp/PaxHeaders.4960/getgateway.c0000644000000000000000000000013212442116705022422 xustar0030 mtime=1418239429.234358811 30 atime=1418239429.233358794 30 ctime=1457295918.622784485 transmission-2.92/third-party/libnatpmp/getgateway.c0000644000175000017500000004361312442116705024056 0ustar00mikedldmikedld00000000000000/* $Id: getgateway.c,v 1.22 2011/08/08 21:20:51 nanard Exp $ */ /* libnatpmp Copyright (c) 2007-2011, Thomas BERNARD 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. * The name of the author may not 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 #ifndef WIN32 #include #endif #if !defined(_MSC_VER) #include #endif /* There is no portable method to get the default route gateway. * So below are four (or five ?) differents functions implementing this. * Parsing /proc/net/route is for linux. * sysctl is the way to access such informations on BSD systems. * Many systems should provide route information through raw PF_ROUTE * sockets. * In MS Windows, default gateway is found by looking into the registry * or by using GetBestRoute(). */ #ifdef __linux__ #define USE_PROC_NET_ROUTE #undef USE_SOCKET_ROUTE #undef USE_SYSCTL_NET_ROUTE #endif #if defined(BSD) || defined(__FreeBSD_kernel__) #undef USE_PROC_NET_ROUTE #define USE_SOCKET_ROUTE #undef USE_SYSCTL_NET_ROUTE #endif #ifdef __APPLE__ #undef USE_PROC_NET_ROUTE #undef USE_SOCKET_ROUTE #define USE_SYSCTL_NET_ROUTE #endif #if (defined(sun) && defined(__SVR4)) #undef USE_PROC_NET_ROUTE #define USE_SOCKET_ROUTE #undef USE_SYSCTL_NET_ROUTE #endif #ifdef WIN32 #undef USE_PROC_NET_ROUTE #undef USE_SOCKET_ROUTE #undef USE_SYSCTL_NET_ROUTE //#define USE_WIN32_CODE #define USE_WIN32_CODE_2 #endif #ifdef __CYGWIN__ #undef USE_PROC_NET_ROUTE #undef USE_SOCKET_ROUTE #undef USE_SYSCTL_NET_ROUTE #define USE_WIN32_CODE #include #include #include #include #endif #ifdef __HAIKU__ #include #include #include #include #define USE_HAIKU_CODE #endif #ifdef USE_SYSCTL_NET_ROUTE #include #include #include #include #endif #ifdef USE_SOCKET_ROUTE #include #include #include #include #include #endif #ifdef USE_WIN32_CODE #include #include #define MAX_KEY_LENGTH 255 #define MAX_VALUE_LENGTH 16383 #endif #ifdef USE_WIN32_CODE_2 #include #include #endif #include "getgateway.h" #ifndef WIN32 #define SUCCESS (0) #define FAILED (-1) #endif #ifdef USE_PROC_NET_ROUTE /* parse /proc/net/route which is as follow : Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT wlan0 0001A8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 eth0 0000FEA9 00000000 0001 0 0 0 0000FFFF 0 0 0 wlan0 00000000 0101A8C0 0003 0 0 0 00000000 0 0 0 eth0 00000000 00000000 0001 0 0 1000 00000000 0 0 0 One header line, and then one line by route by route table entry. */ int getdefaultgateway(in_addr_t * addr) { unsigned long d, g; char buf[256]; int line = 0; FILE * f; char * p; f = fopen("/proc/net/route", "r"); if(!f) return FAILED; while(fgets(buf, sizeof(buf), f)) { if(line > 0) { /* skip the first line */ p = buf; /* skip the interface name */ while(*p && !isspace(*p)) p++; while(*p && isspace(*p)) p++; if(sscanf(p, "%lx%lx", &d, &g)==2) { if(d == 0 && g != 0) { /* default */ *addr = g; fclose(f); return SUCCESS; } } } line++; } /* default route not found ! */ if(f) fclose(f); return FAILED; } #endif /* #ifdef USE_PROC_NET_ROUTE */ #ifdef USE_SYSCTL_NET_ROUTE #define ROUNDUP(a) \ ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) int getdefaultgateway(in_addr_t * addr) { #if 0 /* net.route.0.inet.dump.0.0 ? */ int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_DUMP, 0, 0/*tableid*/}; #endif /* net.route.0.inet.flags.gateway */ int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_FLAGS, RTF_GATEWAY}; size_t l; char * buf, * p; struct rt_msghdr * rt; struct sockaddr * sa; struct sockaddr * sa_tab[RTAX_MAX]; int i; int r = FAILED; if(sysctl(mib, sizeof(mib)/sizeof(int), 0, &l, 0, 0) < 0) { return FAILED; } if(l>0) { buf = malloc(l); if(sysctl(mib, sizeof(mib)/sizeof(int), buf, &l, 0, 0) < 0) { free(buf); return FAILED; } for(p=buf; prtm_msglen) { rt = (struct rt_msghdr *)p; sa = (struct sockaddr *)(rt + 1); for(i=0; irtm_addrs & (1 << i)) { sa_tab[i] = sa; sa = (struct sockaddr *)((char *)sa + ROUNDUP(sa->sa_len)); } else { sa_tab[i] = NULL; } } if( ((rt->rtm_addrs & (RTA_DST|RTA_GATEWAY)) == (RTA_DST|RTA_GATEWAY)) && sa_tab[RTAX_DST]->sa_family == AF_INET && sa_tab[RTAX_GATEWAY]->sa_family == AF_INET) { if(((struct sockaddr_in *)sa_tab[RTAX_DST])->sin_addr.s_addr == 0) { *addr = ((struct sockaddr_in *)(sa_tab[RTAX_GATEWAY]))->sin_addr.s_addr; r = SUCCESS; } } } free(buf); } return r; } #endif /* #ifdef USE_SYSCTL_NET_ROUTE */ #ifdef USE_SOCKET_ROUTE /* Thanks to Darren Kenny for this code */ #define NEXTADDR(w, u) \ if (rtm_addrs & (w)) {\ l = sizeof(struct sockaddr); memmove(cp, &(u), l); cp += l;\ } #define rtm m_rtmsg.m_rtm struct { struct rt_msghdr m_rtm; char m_space[512]; } m_rtmsg; int getdefaultgateway(in_addr_t *addr) { int s, seq, l, rtm_addrs, i; pid_t pid; struct sockaddr so_dst, so_mask; char *cp = m_rtmsg.m_space; struct sockaddr *gate = NULL, *sa; struct rt_msghdr *msg_hdr; pid = getpid(); seq = 0; rtm_addrs = RTA_DST | RTA_NETMASK; memset(&so_dst, 0, sizeof(so_dst)); memset(&so_mask, 0, sizeof(so_mask)); memset(&rtm, 0, sizeof(struct rt_msghdr)); rtm.rtm_type = RTM_GET; rtm.rtm_flags = RTF_UP | RTF_GATEWAY; rtm.rtm_version = RTM_VERSION; rtm.rtm_seq = ++seq; rtm.rtm_addrs = rtm_addrs; so_dst.sa_family = AF_INET; so_mask.sa_family = AF_INET; NEXTADDR(RTA_DST, so_dst); NEXTADDR(RTA_NETMASK, so_mask); rtm.rtm_msglen = l = cp - (char *)&m_rtmsg; s = socket(PF_ROUTE, SOCK_RAW, 0); if (write(s, (char *)&m_rtmsg, l) < 0) { close(s); return FAILED; } do { l = read(s, (char *)&m_rtmsg, sizeof(m_rtmsg)); } while (l > 0 && (rtm.rtm_seq != seq || rtm.rtm_pid != pid)); close(s); msg_hdr = &rtm; cp = ((char *)(msg_hdr + 1)); if (msg_hdr->rtm_addrs) { for (i = 1; i; i <<= 1) if (i & msg_hdr->rtm_addrs) { sa = (struct sockaddr *)cp; if (i == RTA_GATEWAY ) gate = sa; cp += sizeof(struct sockaddr); } } else { return FAILED; } if (gate != NULL ) { *addr = ((struct sockaddr_in *)gate)->sin_addr.s_addr; return SUCCESS; } else { return FAILED; } } #endif /* #ifdef USE_SOCKET_ROUTE */ #ifdef USE_WIN32_CODE LIBSPEC int getdefaultgateway(in_addr_t * addr) { HKEY networkCardsKey; HKEY networkCardKey; HKEY interfacesKey; HKEY interfaceKey; DWORD i = 0; DWORD numSubKeys = 0; TCHAR keyName[MAX_KEY_LENGTH]; DWORD keyNameLength = MAX_KEY_LENGTH; TCHAR keyValue[MAX_VALUE_LENGTH]; DWORD keyValueLength = MAX_VALUE_LENGTH; DWORD keyValueType = REG_SZ; TCHAR gatewayValue[MAX_VALUE_LENGTH]; DWORD gatewayValueLength = MAX_VALUE_LENGTH; DWORD gatewayValueType = REG_MULTI_SZ; int done = 0; //const char * networkCardsPath = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards"; //const char * interfacesPath = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces"; #ifdef UNICODE LPCTSTR networkCardsPath = L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards"; LPCTSTR interfacesPath = L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces"; #define STR_SERVICENAME L"ServiceName" #define STR_DHCPDEFAULTGATEWAY L"DhcpDefaultGateway" #define STR_DEFAULTGATEWAY L"DefaultGateway" #else LPCTSTR networkCardsPath = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards"; LPCTSTR interfacesPath = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces"; #define STR_SERVICENAME "ServiceName" #define STR_DHCPDEFAULTGATEWAY "DhcpDefaultGateway" #define STR_DEFAULTGATEWAY "DefaultGateway" #endif // The windows registry lists its primary network devices in the following location: // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards // // Each network device has its own subfolder, named with an index, with various properties: // -NetworkCards // -5 // -Description = Broadcom 802.11n Network Adapter // -ServiceName = {E35A72F8-5065-4097-8DFE-C7790774EE4D} // -8 // -Description = Marvell Yukon 88E8058 PCI-E Gigabit Ethernet Controller // -ServiceName = {86226414-5545-4335-A9D1-5BD7120119AD} // // The above service name is the name of a subfolder within: // HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces // // There may be more subfolders in this interfaces path than listed in the network cards path above: // -Interfaces // -{3a539854-6a70-11db-887c-806e6f6e6963} // -DhcpIPAddress = 0.0.0.0 // -[more] // -{E35A72F8-5065-4097-8DFE-C7790774EE4D} // -DhcpIPAddress = 10.0.1.4 // -DhcpDefaultGateway = 10.0.1.1 // -[more] // -{86226414-5545-4335-A9D1-5BD7120119AD} // -DhcpIpAddress = 10.0.1.5 // -DhcpDefaultGateay = 10.0.1.1 // -[more] // // In order to extract this information, we enumerate each network card, and extract the ServiceName value. // This is then used to open the interface subfolder, and attempt to extract a DhcpDefaultGateway value. // Once one is found, we're done. // // It may be possible to simply enumerate the interface folders until we find one with a DhcpDefaultGateway value. // However, the technique used is the technique most cited on the web, and we assume it to be more correct. if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, // Open registry key or predifined key networkCardsPath, // Name of registry subkey to open 0, // Reserved - must be zero KEY_READ, // Mask - desired access rights &networkCardsKey)) // Pointer to output key { // Unable to open network cards keys return -1; } if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, // Open registry key or predefined key interfacesPath, // Name of registry subkey to open 0, // Reserved - must be zero KEY_READ, // Mask - desired access rights &interfacesKey)) // Pointer to output key { // Unable to open interfaces key RegCloseKey(networkCardsKey); return -1; } // Figure out how many subfolders are within the NetworkCards folder RegQueryInfoKey(networkCardsKey, NULL, NULL, NULL, &numSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL); //printf( "Number of subkeys: %u\n", (unsigned int)numSubKeys); // Enumrate through each subfolder within the NetworkCards folder for(i = 0; i < numSubKeys && !done; i++) { keyNameLength = MAX_KEY_LENGTH; if(ERROR_SUCCESS == RegEnumKeyEx(networkCardsKey, // Open registry key i, // Index of subkey to retrieve keyName, // Buffer that receives the name of the subkey &keyNameLength, // Variable that receives the size of the above buffer NULL, // Reserved - must be NULL NULL, // Buffer that receives the class string NULL, // Variable that receives the size of the above buffer NULL)) // Variable that receives the last write time of subkey { if(RegOpenKeyEx(networkCardsKey, keyName, 0, KEY_READ, &networkCardKey) == ERROR_SUCCESS) { keyValueLength = MAX_VALUE_LENGTH; if(ERROR_SUCCESS == RegQueryValueEx(networkCardKey, // Open registry key STR_SERVICENAME, // Name of key to query NULL, // Reserved - must be NULL &keyValueType, // Receives value type (LPBYTE)keyValue, // Receives value &keyValueLength)) // Receives value length in bytes { // printf("keyValue: %s\n", keyValue); if(RegOpenKeyEx(interfacesKey, keyValue, 0, KEY_READ, &interfaceKey) == ERROR_SUCCESS) { gatewayValueLength = MAX_VALUE_LENGTH; if(ERROR_SUCCESS == RegQueryValueEx(interfaceKey, // Open registry key STR_DHCPDEFAULTGATEWAY, // Name of key to query NULL, // Reserved - must be NULL &gatewayValueType, // Receives value type (LPBYTE)gatewayValue, // Receives value &gatewayValueLength)) // Receives value length in bytes { // Check to make sure it's a string if((gatewayValueType == REG_MULTI_SZ || gatewayValueType == REG_SZ) && (gatewayValueLength > 1)) { //printf("gatewayValue: %s\n", gatewayValue); done = 1; } } else if(ERROR_SUCCESS == RegQueryValueEx(interfaceKey, // Open registry key STR_DEFAULTGATEWAY, // Name of key to query NULL, // Reserved - must be NULL &gatewayValueType, // Receives value type (LPBYTE)gatewayValue,// Receives value &gatewayValueLength)) // Receives value length in bytes { // Check to make sure it's a string if((gatewayValueType == REG_MULTI_SZ || gatewayValueType == REG_SZ) && (gatewayValueLength > 1)) { //printf("gatewayValue: %s\n", gatewayValue); done = 1; } } RegCloseKey(interfaceKey); } } RegCloseKey(networkCardKey); } } } RegCloseKey(interfacesKey); RegCloseKey(networkCardsKey); if(done) { #if UNICODE char tmp[32]; for(i = 0; i < 32; i++) { tmp[i] = (char)gatewayValue[i]; if(!tmp[i]) break; } tmp[31] = '\0'; *addr = inet_addr(tmp); #else *addr = inet_addr(gatewayValue); #endif return 0; } return -1; } #endif /* #ifdef USE_WIN32_CODE */ #ifdef USE_WIN32_CODE_2 int getdefaultgateway(in_addr_t *addr) { MIB_IPFORWARDROW ip_forward; memset(&ip_forward, 0, sizeof(ip_forward)); if(GetBestRoute(inet_addr("0.0.0.0"), 0, &ip_forward) != NO_ERROR) return -1; *addr = ip_forward.dwForwardNextHop; return 0; } #endif /* #ifdef USE_WIN32_CODE_2 */ #ifdef USE_HAIKU_CODE int getdefaultgateway(in_addr_t *addr) { int fd, ret = -1; struct ifconf config; void *buffer = NULL; struct ifreq *interface; if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { return -1; } if (ioctl(fd, SIOCGRTSIZE, &config, sizeof(config)) != 0) { goto fail; } if (config.ifc_value < 1) { goto fail; /* No routes */ } if ((buffer = malloc(config.ifc_value)) == NULL) { goto fail; } config.ifc_len = config.ifc_value; config.ifc_buf = buffer; if (ioctl(fd, SIOCGRTTABLE, &config, sizeof(config)) != 0) { goto fail; } for (interface = buffer; (uint8_t *)interface < (uint8_t *)buffer + config.ifc_len; ) { struct route_entry route = interface->ifr_route; int intfSize; if (route.flags & (RTF_GATEWAY | RTF_DEFAULT)) { *addr = ((struct sockaddr_in *)route.gateway)->sin_addr.s_addr; ret = 0; break; } intfSize = sizeof(route) + IF_NAMESIZE; if (route.destination != NULL) { intfSize += route.destination->sa_len; } if (route.mask != NULL) { intfSize += route.mask->sa_len; } if (route.gateway != NULL) { intfSize += route.gateway->sa_len; } interface = (struct ifreq *)((uint8_t *)interface + intfSize); } fail: free(buffer); close(fd); return ret; } #endif /* #ifdef USE_HAIKU_CODE */ transmission-2.92/third-party/libnatpmp/PaxHeaders.4960/Makefile.in0000644000000000000000000000013212667111010022153 xustar0030 mtime=1457295880.697139604 30 atime=1457295880.697139604 30 ctime=1457295918.608784247 transmission-2.92/third-party/libnatpmp/Makefile.in0000644000175000017500000005043212667111010023604 0ustar00mikedldmikedld00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = third-party/libnatpmp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx-pthread.m4 \ $(top_srcdir)/m4/glib-gettext.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libnatpmp_a_AR = $(AR) $(ARFLAGS) libnatpmp_a_LIBADD = am_libnatpmp_a_OBJECTS = getgateway.$(OBJEXT) natpmp.$(OBJEXT) \ wingettimeofday.$(OBJEXT) libnatpmp_a_OBJECTS = $(am_libnatpmp_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libnatpmp_a_SOURCES) DIST_SOURCES = $(libnatpmp_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTO_CFLAGS = @CRYPTO_CFLAGS@ CRYPTO_LIBS = @CRYPTO_LIBS@ CRYPTO_PKG = @CRYPTO_PKG@ CURL_MINIMUM = @CURL_MINIMUM@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYASSL_CFLAGS = @CYASSL_CFLAGS@ CYASSL_LIBS = @CYASSL_LIBS@ CYASSL_MINIMUM = @CYASSL_MINIMUM@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DHT_CFLAGS = @DHT_CFLAGS@ DHT_LIBS = @DHT_LIBS@ DHT_LIBS_QT = @DHT_LIBS_QT@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_MINIMUM = @GIO_MINIMUM@ GLIB_MINIMUM = @GLIB_MINIMUM@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MINIMUM = @GTK_MINIMUM@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAPPINDICATOR_CFLAGS = @LIBAPPINDICATOR_CFLAGS@ LIBAPPINDICATOR_LIBS = @LIBAPPINDICATOR_LIBS@ LIBAPPINDICATOR_MINIMUM = @LIBAPPINDICATOR_MINIMUM@ LIBB64_CFLAGS = @LIBB64_CFLAGS@ LIBB64_LIBS = @LIBB64_LIBS@ LIBB64_LIBS_QT = @LIBB64_LIBS_QT@ LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ LIBEVENT_CFLAGS = @LIBEVENT_CFLAGS@ LIBEVENT_LIBS = @LIBEVENT_LIBS@ LIBEVENT_MINIMUM = @LIBEVENT_MINIMUM@ LIBM = @LIBM@ LIBNATPMP_CFLAGS = @LIBNATPMP_CFLAGS@ LIBNATPMP_LIBS = @LIBNATPMP_LIBS@ LIBNATPMP_LIBS_QT = @LIBNATPMP_LIBS_QT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LIBUPNP_LIBS_QT = @LIBUPNP_LIBS_QT@ LIBUTP_CFLAGS = @LIBUTP_CFLAGS@ LIBUTP_LIBS = @LIBUTP_LIBS@ LIBUTP_LIBS_QT = @LIBUTP_LIBS_QT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENSSL_CFLAGS = @OPENSSL_CFLAGS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OPENSSL_MINIMUM = @OPENSSL_MINIMUM@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PEERID_PREFIX = @PEERID_PREFIX@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POLARSSL_MINIMUM = @POLARSSL_MINIMUM@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SYSTEMD_DAEMON_CFLAGS = @SYSTEMD_DAEMON_CFLAGS@ SYSTEMD_DAEMON_LIBS = @SYSTEMD_DAEMON_LIBS@ USERAGENT_PREFIX = @USERAGENT_PREFIX@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ WOLFSSL_CFLAGS = @WOLFSSL_CFLAGS@ WOLFSSL_LIBS = @WOLFSSL_LIBS@ XGETTEXT = @XGETTEXT@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ ZLIB_MINIMUM = @ZLIB_MINIMUM@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ transmissionlocaledir = @transmissionlocaledir@ noinst_LIBRARIES = libnatpmp.a AM_CFLAGS = @PTHREAD_CFLAGS@ -DENABLE_STRNATPMPERR libnatpmp_a_SOURCES = \ getgateway.c \ natpmp.c \ wingettimeofday.c noinst_HEADERS = \ declspec.h \ getgateway.h \ natpmp.h \ wingettimeofday.h EXTRA_DIST = \ README \ LICENSE all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu third-party/libnatpmp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu third-party/libnatpmp/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libnatpmp.a: $(libnatpmp_a_OBJECTS) $(libnatpmp_a_DEPENDENCIES) $(EXTRA_libnatpmp_a_DEPENDENCIES) $(AM_V_at)-rm -f libnatpmp.a $(AM_V_AR)$(libnatpmp_a_AR) libnatpmp.a $(libnatpmp_a_OBJECTS) $(libnatpmp_a_LIBADD) $(AM_V_at)$(RANLIB) libnatpmp.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getgateway.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/natpmp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wingettimeofday.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: transmission-2.92/third-party/libnatpmp/PaxHeaders.4960/getgateway.h0000644000000000000000000000013212442116705022427 xustar0030 mtime=1418239429.235358828 30 atime=1418239429.235358828 30 ctime=1457295918.595784026 transmission-2.92/third-party/libnatpmp/getgateway.h0000644000175000017500000000361512442116705024061 0ustar00mikedldmikedld00000000000000/* $Id: getgateway.h,v 1.5 2011/07/15 08:30:11 nanard Exp $ */ /* libnatpmp Copyright (c) 2007-2011, Thomas BERNARD 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. * The name of the author may not 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 __GETGATEWAY_H__ #define __GETGATEWAY_H__ #ifdef WIN32 #if !defined(_MSC_VER) #include #else typedef unsigned long uint32_t; typedef unsigned short uint16_t; #endif #define in_addr_t uint32_t #endif #include "declspec.h" /* getdefaultgateway() : * return value : * 0 : success * -1 : failure */ LIBSPEC int getdefaultgateway(in_addr_t * addr); #endif transmission-2.92/third-party/libnatpmp/PaxHeaders.4960/wingettimeofday.h0000644000000000000000000000013212442116705023465 xustar0030 mtime=1418239429.234358811 30 atime=1418239429.234358811 30 ctime=1457295918.602784145 transmission-2.92/third-party/libnatpmp/wingettimeofday.h0000644000175000017500000000336112442116705025115 0ustar00mikedldmikedld00000000000000/* $Id: wingettimeofday.h,v 1.2 2011/07/15 08:30:11 nanard Exp $ */ /* libnatpmp Copyright (c) 2007-2011, Thomas BERNARD 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. * The name of the author may not 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 __WINGETTIMEOFDAY_H__ #define __WINGETTIMEOFDAY_H__ #ifdef WIN32 #if defined(_MSC_VER) #include #else #include #endif int gettimeofday(struct timeval* p, void* tz /* IGNORED */); #endif #endif transmission-2.92/third-party/libnatpmp/PaxHeaders.4960/LICENSE0000644000000000000000000000013212442116705021122 xustar0030 mtime=1418239429.233358794 30 atime=1418239429.233358794 30 ctime=1457295918.636784723 transmission-2.92/third-party/libnatpmp/LICENSE0000644000175000017500000000267712442116705022563 0ustar00mikedldmikedld00000000000000Copyright (c) 2007-2011, Thomas BERNARD 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. * The name of the author may not 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. transmission-2.92/third-party/libnatpmp/PaxHeaders.4960/natpmp.c0000644000000000000000000000013212442116705021560 xustar0030 mtime=1418239429.233358794 30 atime=1418239429.233358794 30 ctime=1457295918.628784587 transmission-2.92/third-party/libnatpmp/natpmp.c0000644000175000017500000002333212442116705023210 0ustar00mikedldmikedld00000000000000/* $Id: natpmp.c,v 1.14 2011/07/15 08:30:11 nanard Exp $ */ /* libnatpmp Copyright (c) 2007-2011, Thomas BERNARD 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. * The name of the author may not 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. */ #ifdef __linux__ #define _BSD_SOURCE 1 #endif #include #include #if !defined(_MSC_VER) #include #endif #ifdef WIN32 #include #include #include #include #define EWOULDBLOCK WSAEWOULDBLOCK #define ECONNREFUSED WSAECONNREFUSED #include "wingettimeofday.h" #else #include #include #include #include #include #define closesocket close #endif #include "natpmp.h" #include "getgateway.h" LIBSPEC int initnatpmp(natpmp_t * p, int forcegw, in_addr_t forcedgw) { #ifdef WIN32 u_long ioctlArg = 1; #else int flags; #endif struct sockaddr_in addr; if(!p) return NATPMP_ERR_INVALIDARGS; memset(p, 0, sizeof(natpmp_t)); p->s = socket(PF_INET, SOCK_DGRAM, 0); if(p->s < 0) return NATPMP_ERR_SOCKETERROR; #ifdef WIN32 if(ioctlsocket(p->s, FIONBIO, &ioctlArg) == SOCKET_ERROR) return NATPMP_ERR_FCNTLERROR; #else if((flags = fcntl(p->s, F_GETFL, 0)) < 0) return NATPMP_ERR_FCNTLERROR; if(fcntl(p->s, F_SETFL, flags | O_NONBLOCK) < 0) return NATPMP_ERR_FCNTLERROR; #endif if(forcegw) { p->gateway = forcedgw; } else { if(getdefaultgateway(&(p->gateway)) < 0) return NATPMP_ERR_CANNOTGETGATEWAY; } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(NATPMP_PORT); addr.sin_addr.s_addr = p->gateway; if(connect(p->s, (struct sockaddr *)&addr, sizeof(addr)) < 0) return NATPMP_ERR_CONNECTERR; return 0; } LIBSPEC int closenatpmp(natpmp_t * p) { if(!p) return NATPMP_ERR_INVALIDARGS; if(closesocket(p->s) < 0) return NATPMP_ERR_CLOSEERR; return 0; } int sendpendingrequest(natpmp_t * p) { int r; /* struct sockaddr_in addr;*/ if(!p) return NATPMP_ERR_INVALIDARGS; /* memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(NATPMP_PORT); addr.sin_addr.s_addr = p->gateway; r = (int)sendto(p->s, p->pending_request, p->pending_request_len, 0, (struct sockaddr *)&addr, sizeof(addr));*/ r = (int)send(p->s, p->pending_request, p->pending_request_len, 0); return (r<0) ? NATPMP_ERR_SENDERR : r; } int sendnatpmprequest(natpmp_t * p) { int n; if(!p) return NATPMP_ERR_INVALIDARGS; /* TODO : check if no request is allready pending */ p->has_pending_request = 1; p->try_number = 1; n = sendpendingrequest(p); gettimeofday(&p->retry_time, NULL); // check errors ! p->retry_time.tv_usec += 250000; /* add 250ms */ if(p->retry_time.tv_usec >= 1000000) { p->retry_time.tv_usec -= 1000000; p->retry_time.tv_sec++; } return n; } LIBSPEC int getnatpmprequesttimeout(natpmp_t * p, struct timeval * timeout) { struct timeval now; if(!p || !timeout) return NATPMP_ERR_INVALIDARGS; if(!p->has_pending_request) return NATPMP_ERR_NOPENDINGREQ; if(gettimeofday(&now, NULL) < 0) return NATPMP_ERR_GETTIMEOFDAYERR; timeout->tv_sec = p->retry_time.tv_sec - now.tv_sec; timeout->tv_usec = p->retry_time.tv_usec - now.tv_usec; if(timeout->tv_usec < 0) { timeout->tv_usec += 1000000; timeout->tv_sec--; } return 0; } LIBSPEC int sendpublicaddressrequest(natpmp_t * p) { if(!p) return NATPMP_ERR_INVALIDARGS; //static const unsigned char request[] = { 0, 0 }; p->pending_request[0] = 0; p->pending_request[1] = 0; p->pending_request_len = 2; // TODO: return 0 instead of sizeof(request) ?? return sendnatpmprequest(p); } LIBSPEC int sendnewportmappingrequest(natpmp_t * p, int protocol, uint16_t privateport, uint16_t publicport, uint32_t lifetime) { if(!p || (protocol!=NATPMP_PROTOCOL_TCP && protocol!=NATPMP_PROTOCOL_UDP)) return NATPMP_ERR_INVALIDARGS; p->pending_request[0] = 0; p->pending_request[1] = protocol; p->pending_request[2] = 0; p->pending_request[3] = 0; *((uint16_t *)(p->pending_request + 4)) = htons(privateport); *((uint16_t *)(p->pending_request + 6)) = htons(publicport); *((uint32_t *)(p->pending_request + 8)) = htonl(lifetime); p->pending_request_len = 12; return sendnatpmprequest(p); } LIBSPEC int readnatpmpresponse(natpmp_t * p, natpmpresp_t * response) { unsigned char buf[16]; struct sockaddr_in addr; socklen_t addrlen = sizeof(addr); int n; if(!p) return NATPMP_ERR_INVALIDARGS; n = recvfrom(p->s, buf, sizeof(buf), 0, (struct sockaddr *)&addr, &addrlen); if(n<0) switch(errno) { /*case EAGAIN:*/ case EWOULDBLOCK: n = NATPMP_TRYAGAIN; break; case ECONNREFUSED: n = NATPMP_ERR_NOGATEWAYSUPPORT; break; default: n = NATPMP_ERR_RECVFROM; } /* check that addr is correct (= gateway) */ else if(addr.sin_addr.s_addr != p->gateway) n = NATPMP_ERR_WRONGPACKETSOURCE; else { response->resultcode = ntohs(*((uint16_t *)(buf + 2))); response->epoch = ntohl(*((uint32_t *)(buf + 4))); if(buf[0] != 0) n = NATPMP_ERR_UNSUPPORTEDVERSION; else if(buf[1] < 128 || buf[1] > 130) n = NATPMP_ERR_UNSUPPORTEDOPCODE; else if(response->resultcode != 0) { switch(response->resultcode) { case 1: n = NATPMP_ERR_UNSUPPORTEDVERSION; break; case 2: n = NATPMP_ERR_NOTAUTHORIZED; break; case 3: n = NATPMP_ERR_NETWORKFAILURE; break; case 4: n = NATPMP_ERR_OUTOFRESOURCES; break; case 5: n = NATPMP_ERR_UNSUPPORTEDOPCODE; break; default: n = NATPMP_ERR_UNDEFINEDERROR; } } else { response->type = buf[1] & 0x7f; if(buf[1] == 128) //response->publicaddress.addr = *((uint32_t *)(buf + 8)); response->pnu.publicaddress.addr.s_addr = *((uint32_t *)(buf + 8)); else { response->pnu.newportmapping.privateport = ntohs(*((uint16_t *)(buf + 8))); response->pnu.newportmapping.mappedpublicport = ntohs(*((uint16_t *)(buf + 10))); response->pnu.newportmapping.lifetime = ntohl(*((uint32_t *)(buf + 12))); } n = 0; } } return n; } int readnatpmpresponseorretry(natpmp_t * p, natpmpresp_t * response) { int n; if(!p || !response) return NATPMP_ERR_INVALIDARGS; if(!p->has_pending_request) return NATPMP_ERR_NOPENDINGREQ; n = readnatpmpresponse(p, response); if(n<0) { if(n==NATPMP_TRYAGAIN) { struct timeval now; gettimeofday(&now, NULL); // check errors ! if(timercmp(&now, &p->retry_time, >=)) { int delay, r; if(p->try_number >= 9) { return NATPMP_ERR_NOGATEWAYSUPPORT; } /*printf("retry! %d\n", p->try_number);*/ delay = 250 * (1<try_number); // ms /*for(i=0; itry_number; i++) delay += delay;*/ p->retry_time.tv_sec += (delay / 1000); p->retry_time.tv_usec += (delay % 1000) * 1000; if(p->retry_time.tv_usec >= 1000000) { p->retry_time.tv_usec -= 1000000; p->retry_time.tv_sec++; } p->try_number++; r = sendpendingrequest(p); if(r<0) return r; } } } else { p->has_pending_request = 0; } return n; } #ifdef ENABLE_STRNATPMPERR LIBSPEC const char * strnatpmperr(int r) { const char * s; switch(r) { case NATPMP_ERR_INVALIDARGS: s = "invalid arguments"; break; case NATPMP_ERR_SOCKETERROR: s = "socket() failed"; break; case NATPMP_ERR_CANNOTGETGATEWAY: s = "cannot get default gateway ip address"; break; case NATPMP_ERR_CLOSEERR: #ifdef WIN32 s = "closesocket() failed"; #else s = "close() failed"; #endif break; case NATPMP_ERR_RECVFROM: s = "recvfrom() failed"; break; case NATPMP_ERR_NOPENDINGREQ: s = "no pending request"; break; case NATPMP_ERR_NOGATEWAYSUPPORT: s = "the gateway does not support nat-pmp"; break; case NATPMP_ERR_CONNECTERR: s = "connect() failed"; break; case NATPMP_ERR_WRONGPACKETSOURCE: s = "packet not received from the default gateway"; break; case NATPMP_ERR_SENDERR: s = "send() failed"; break; case NATPMP_ERR_FCNTLERROR: s = "fcntl() failed"; break; case NATPMP_ERR_GETTIMEOFDAYERR: s = "gettimeofday() failed"; break; case NATPMP_ERR_UNSUPPORTEDVERSION: s = "unsupported nat-pmp version error from server"; break; case NATPMP_ERR_UNSUPPORTEDOPCODE: s = "unsupported nat-pmp opcode error from server"; break; case NATPMP_ERR_UNDEFINEDERROR: s = "undefined nat-pmp server error"; break; case NATPMP_ERR_NOTAUTHORIZED: s = "not authorized"; break; case NATPMP_ERR_NETWORKFAILURE: s = "network failure"; break; case NATPMP_ERR_OUTOFRESOURCES: s = "nat-pmp server out of resources"; break; default: s = "Unknown libnatpmp error"; } return s; } #endif transmission-2.92/third-party/libnatpmp/PaxHeaders.4960/Makefile.am0000644000000000000000000000013212442116705022151 xustar0030 mtime=1418239429.235358828 30 atime=1418239429.235358828 30 ctime=1457295918.583783822 transmission-2.92/third-party/libnatpmp/Makefile.am0000644000175000017500000000045212442116705023577 0ustar00mikedldmikedld00000000000000noinst_LIBRARIES = libnatpmp.a AM_CFLAGS = @PTHREAD_CFLAGS@ -DENABLE_STRNATPMPERR libnatpmp_a_SOURCES = \ getgateway.c \ natpmp.c \ wingettimeofday.c noinst_HEADERS = \ declspec.h \ getgateway.h \ natpmp.h \ wingettimeofday.h EXTRA_DIST = \ README \ LICENSE transmission-2.92/third-party/libnatpmp/PaxHeaders.4960/natpmp.h0000644000000000000000000000013212442116705021565 xustar0030 mtime=1418239429.234358811 30 atime=1418239429.234358811 30 ctime=1457295918.601784128 transmission-2.92/third-party/libnatpmp/natpmp.h0000644000175000017500000001566712442116705023231 0ustar00mikedldmikedld00000000000000/* $Id: natpmp.h,v 1.15 2011/07/15 08:30:11 nanard Exp $ */ /* libnatpmp Copyright (c) 2007-2011, Thomas BERNARD 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. * The name of the author may not 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 __NATPMP_H__ #define __NATPMP_H__ /* NAT-PMP Port as defined by the NAT-PMP draft */ #define NATPMP_PORT (5351) #include #if !defined(_MSC_VER) #include #endif #ifdef WIN32 #include #if !defined(_MSC_VER) #include #else typedef unsigned long uint32_t; typedef unsigned short uint16_t; #endif #define in_addr_t uint32_t #include "declspec.h" #else #define LIBSPEC #include #endif typedef struct { int s; /* socket */ in_addr_t gateway; /* default gateway (IPv4) */ int has_pending_request; unsigned char pending_request[12]; int pending_request_len; int try_number; struct timeval retry_time; } natpmp_t; typedef struct { uint16_t type; /* NATPMP_RESPTYPE_* */ uint16_t resultcode; /* NAT-PMP response code */ uint32_t epoch; /* Seconds since start of epoch */ union { struct { //in_addr_t addr; struct in_addr addr; } publicaddress; struct { uint16_t privateport; uint16_t mappedpublicport; uint32_t lifetime; } newportmapping; } pnu; } natpmpresp_t; /* possible values for type field of natpmpresp_t */ #define NATPMP_RESPTYPE_PUBLICADDRESS (0) #define NATPMP_RESPTYPE_UDPPORTMAPPING (1) #define NATPMP_RESPTYPE_TCPPORTMAPPING (2) /* Values to pass to sendnewportmappingrequest() */ #define NATPMP_PROTOCOL_UDP (1) #define NATPMP_PROTOCOL_TCP (2) /* return values */ /* NATPMP_ERR_INVALIDARGS : invalid arguments passed to the function */ #define NATPMP_ERR_INVALIDARGS (-1) /* NATPMP_ERR_SOCKETERROR : socket() failed. check errno for details */ #define NATPMP_ERR_SOCKETERROR (-2) /* NATPMP_ERR_CANNOTGETGATEWAY : can't get default gateway IP */ #define NATPMP_ERR_CANNOTGETGATEWAY (-3) /* NATPMP_ERR_CLOSEERR : close() failed. check errno for details */ #define NATPMP_ERR_CLOSEERR (-4) /* NATPMP_ERR_RECVFROM : recvfrom() failed. check errno for details */ #define NATPMP_ERR_RECVFROM (-5) /* NATPMP_ERR_NOPENDINGREQ : readnatpmpresponseorretry() called while * no NAT-PMP request was pending */ #define NATPMP_ERR_NOPENDINGREQ (-6) /* NATPMP_ERR_NOGATEWAYSUPPORT : the gateway does not support NAT-PMP */ #define NATPMP_ERR_NOGATEWAYSUPPORT (-7) /* NATPMP_ERR_CONNECTERR : connect() failed. check errno for details */ #define NATPMP_ERR_CONNECTERR (-8) /* NATPMP_ERR_WRONGPACKETSOURCE : packet not received from the network gateway */ #define NATPMP_ERR_WRONGPACKETSOURCE (-9) /* NATPMP_ERR_SENDERR : send() failed. check errno for details */ #define NATPMP_ERR_SENDERR (-10) /* NATPMP_ERR_FCNTLERROR : fcntl() failed. check errno for details */ #define NATPMP_ERR_FCNTLERROR (-11) /* NATPMP_ERR_GETTIMEOFDAYERR : gettimeofday() failed. check errno for details */ #define NATPMP_ERR_GETTIMEOFDAYERR (-12) /* */ #define NATPMP_ERR_UNSUPPORTEDVERSION (-14) #define NATPMP_ERR_UNSUPPORTEDOPCODE (-15) /* Errors from the server : */ #define NATPMP_ERR_UNDEFINEDERROR (-49) #define NATPMP_ERR_NOTAUTHORIZED (-51) #define NATPMP_ERR_NETWORKFAILURE (-52) #define NATPMP_ERR_OUTOFRESOURCES (-53) /* NATPMP_TRYAGAIN : no data available for the moment. try again later */ #define NATPMP_TRYAGAIN (-100) #ifdef __cplusplus extern "C" { #endif /* initnatpmp() * initialize a natpmp_t object * With forcegw=1 the gateway is not detected automaticaly. * Return values : * 0 = OK * NATPMP_ERR_INVALIDARGS * NATPMP_ERR_SOCKETERROR * NATPMP_ERR_FCNTLERROR * NATPMP_ERR_CANNOTGETGATEWAY * NATPMP_ERR_CONNECTERR */ LIBSPEC int initnatpmp(natpmp_t * p, int forcegw, in_addr_t forcedgw); /* closenatpmp() * close resources associated with a natpmp_t object * Return values : * 0 = OK * NATPMP_ERR_INVALIDARGS * NATPMP_ERR_CLOSEERR */ LIBSPEC int closenatpmp(natpmp_t * p); /* sendpublicaddressrequest() * send a public address NAT-PMP request to the network gateway * Return values : * 2 = OK (size of the request) * NATPMP_ERR_INVALIDARGS * NATPMP_ERR_SENDERR */ LIBSPEC int sendpublicaddressrequest(natpmp_t * p); /* sendnewportmappingrequest() * send a new port mapping NAT-PMP request to the network gateway * Arguments : * protocol is either NATPMP_PROTOCOL_TCP or NATPMP_PROTOCOL_UDP, * lifetime is in seconds. * To remove a port mapping, set lifetime to zero. * To remove all port mappings to the host, set lifetime and both ports * to zero. * Return values : * 12 = OK (size of the request) * NATPMP_ERR_INVALIDARGS * NATPMP_ERR_SENDERR */ LIBSPEC int sendnewportmappingrequest(natpmp_t * p, int protocol, uint16_t privateport, uint16_t publicport, uint32_t lifetime); /* getnatpmprequesttimeout() * fills the timeval structure with the timeout duration of the * currently pending NAT-PMP request. * Return values : * 0 = OK * NATPMP_ERR_INVALIDARGS * NATPMP_ERR_GETTIMEOFDAYERR * NATPMP_ERR_NOPENDINGREQ */ LIBSPEC int getnatpmprequesttimeout(natpmp_t * p, struct timeval * timeout); /* readnatpmpresponseorretry() * fills the natpmpresp_t structure if possible * Return values : * 0 = OK * NATPMP_TRYAGAIN * NATPMP_ERR_INVALIDARGS * NATPMP_ERR_NOPENDINGREQ * NATPMP_ERR_NOGATEWAYSUPPORT * NATPMP_ERR_RECVFROM * NATPMP_ERR_WRONGPACKETSOURCE * NATPMP_ERR_UNSUPPORTEDVERSION * NATPMP_ERR_UNSUPPORTEDOPCODE * NATPMP_ERR_NOTAUTHORIZED * NATPMP_ERR_NETWORKFAILURE * NATPMP_ERR_OUTOFRESOURCES * NATPMP_ERR_UNSUPPORTEDOPCODE * NATPMP_ERR_UNDEFINEDERROR */ LIBSPEC int readnatpmpresponseorretry(natpmp_t * p, natpmpresp_t * response); #ifdef ENABLE_STRNATPMPERR LIBSPEC const char * strnatpmperr(int t); #endif #ifdef __cplusplus } #endif #endif transmission-2.92/third-party/libnatpmp/PaxHeaders.4960/declspec.h0000644000000000000000000000013212442116705022050 xustar0030 mtime=1418239429.235358828 30 atime=1418239429.235358828 30 ctime=1457295918.588783907 transmission-2.92/third-party/libnatpmp/declspec.h0000644000175000017500000000036612442116705023502 0ustar00mikedldmikedld00000000000000#ifndef __DECLSPEC_H__ #define __DECLSPEC_H__ #if defined(WIN32) && !defined(STATICLIB) #ifdef NATPMP_EXPORTS #define LIBSPEC __declspec(dllexport) #else #define LIBSPEC __declspec(dllimport) #endif #else #define LIBSPEC #endif #endif transmission-2.92/third-party/PaxHeaders.4960/b64.cmake0000644000000000000000000000013212505250244017521 xustar0030 mtime=1427460260.071236891 30 atime=1427460260.071236891 30 ctime=1457295917.372763229 transmission-2.92/third-party/b64.cmake0000644000175000017500000000040012505250244021140 0ustar00mikedldmikedld00000000000000cmake_minimum_required(VERSION 2.8) project(b64 C) include_directories(include) add_library(${PROJECT_NAME} STATIC src/cdecode.c src/cencode.c ) install(TARGETS ${PROJECT_NAME} DESTINATION lib) install(DIRECTORY include/b64 DESTINATION include) transmission-2.92/third-party/PaxHeaders.4960/utp_config.h0000644000000000000000000000013012516477526020450 xustar0029 mtime=1429897046.71672826 29 atime=1429897046.71672826 30 ctime=1457295917.428764181 transmission-2.92/third-party/utp_config.h0000644000175000017500000000173712516477526022107 0ustar00mikedldmikedld00000000000000#define CCONTROL_TARGET (100 * 1000) // us #define RATE_CHECK_INTERVAL 10000 // ms #define DYNAMIC_PACKET_SIZE_ENABLED false #define DYNAMIC_PACKET_SIZE_FACTOR 2 // This should return the global number of bytes sent, used for determining dynamic // packet size based on rate #ifdef _MSC_VER #pragma message("WARNING: implement this in libtransmission") #else #warning implement this in libtransmission #endif uint64 UTP_GetGlobalUTPBytesSent(const struct sockaddr *remote, socklen_t remotelen) { return 0; } enum bandwidth_type_t { payload_bandwidth, connect_overhead, close_overhead, ack_overhead, header_overhead, retransmit_overhead }; #ifdef _WIN32 #define I64u "%I64u" #else #define I64u "%Lu" #endif #ifdef _WIN32 #define snprintf _snprintf #endif #define g_log_utp 0 #define g_log_utp_verbose 0 void utp_log(char const* fmt, ...) { /* printf("[%u] ", UTP_GetMilliseconds()); va_list vl; va_start(vl, fmt); vprintf(fmt, vl); va_end(vl); puts(""); fflush(stdout); */ }; transmission-2.92/third-party/PaxHeaders.4960/Makefile.am0000644000000000000000000000013212505250244020160 xustar0030 mtime=1427460260.071236891 30 atime=1427460260.071236891 30 ctime=1457295917.822770881 transmission-2.92/third-party/Makefile.am0000644000175000017500000000057712505250244021616 0ustar00mikedldmikedld00000000000000if BUILD_DHT DHT_DIR = dht endif if BUILD_B64 B64_DIR = libb64 endif if BUILD_UTP UTP_DIR = libutp endif if BUILD_MINIUPNP MINIUPNP_DIR = miniupnp endif if BUILD_NATPMP NATPMP_DIR = libnatpmp endif SUBDIRS = \ $(DHT_DIR) \ $(B64_DIR) \ $(NATPMP_DIR) \ $(MINIUPNP_DIR) \ $(UTP_DIR) EXTRA_DIST = \ macosx-libevent-config.h \ macosx-libevent-event-config.h transmission-2.92/third-party/PaxHeaders.4960/utp-02-win32.patch0000644000000000000000000000012712617217203021142 xustar0029 mtime=1446846083.21174331 29 atime=1446846083.21174331 29 ctime=1457295917.41576396 transmission-2.92/third-party/utp-02-win32.patch0000644000175000017500000000124612617217203022566 0ustar00mikedldmikedld00000000000000diff --git a/utp.h b/utp.h --- a/utp.h +++ b/utp.h @@ -4,12 +4,18 @@ #include "utypes.h" #ifdef WIN32 +#ifndef _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE +#endif +#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN +#endif #include #include #include +#ifdef _MSC_VER #pragma comment(lib,"ws2_32.lib") +#endif #else #include #include @@ -142,7 +148,7 @@ }; // Get stats for UTP socket -void UTP_GetStats(struct UTPSocket *socket, UTPStats *stats); +void UTP_GetStats(struct UTPSocket *socket, struct UTPStats *stats); #endif // Close the UTP socket. transmission-2.92/third-party/PaxHeaders.4960/dht.cmake0000644000000000000000000000013112505250244017704 xustar0030 mtime=1427460260.061236712 30 atime=1427460260.061236712 29 ctime=1457295917.37876333 transmission-2.92/third-party/dht.cmake0000644000175000017500000000030212505250244021325 0ustar00mikedldmikedld00000000000000cmake_minimum_required(VERSION 2.8) project(dht C) add_library(${PROJECT_NAME} STATIC dht.c ) install(TARGETS ${PROJECT_NAME} DESTINATION lib) install(FILES dht.h DESTINATION include/dht) transmission-2.92/PaxHeaders.4960/Transmission.xcodeproj0000644000000000000000000000013212667111055020272 xustar0030 mtime=1457295917.294761902 30 atime=1457295917.037757532 30 ctime=1457295917.294761902 transmission-2.92/Transmission.xcodeproj/0000755000175000017500000000000012667111055021774 5ustar00mikedldmikedld00000000000000transmission-2.92/Transmission.xcodeproj/PaxHeaders.4960/project.pbxproj0000644000000000000000000000013112664476420023431 xustar0030 mtime=1456635152.016496867 29 atime=1456635152.01549685 30 ctime=1457295917.296761936 transmission-2.92/Transmission.xcodeproj/project.pbxproj0000644000175000017500000114301212664476420025061 0ustar00mikedldmikedld00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 0A6169A70FE5C9A200C66CE6 /* bitfield.c in Sources */ = {isa = PBXBuildFile; fileRef = 0A6169A50FE5C9A200C66CE6 /* bitfield.c */; }; 0A6169A80FE5C9A200C66CE6 /* bitfield.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A6169A60FE5C9A200C66CE6 /* bitfield.h */; }; 35B038130AC5B6EB00A10FDF /* ResumeNoWaitOn.png in Resources */ = {isa = PBXBuildFile; fileRef = 35B037F90AC5B53800A10FDF /* ResumeNoWaitOn.png */; }; 35B038140AC5B6EC00A10FDF /* ResumeNoWaitOff.png in Resources */ = {isa = PBXBuildFile; fileRef = 35B037FA0AC5B53800A10FDF /* ResumeNoWaitOff.png */; }; 35F373030C2DA89000DAA8F2 /* FilePriorityCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 35F373010C2DA88F00DAA8F2 /* FilePriorityCell.m */; }; 3C7A11970D0B2EE300B5701F /* getgateway.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C7A11910D0B2EE300B5701F /* getgateway.c */; }; 3C7A11980D0B2EE300B5701F /* getgateway.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C7A11920D0B2EE300B5701F /* getgateway.h */; }; 3C7A11990D0B2EE300B5701F /* natpmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C7A11930D0B2EE300B5701F /* natpmp.c */; }; 3C7A119A0D0B2EE300B5701F /* natpmp.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C7A11940D0B2EE300B5701F /* natpmp.h */; }; 4394AC670C74FB6000F367E8 /* ptrarray.c in Sources */ = {isa = PBXBuildFile; fileRef = 4394AC640C74FB6000F367E8 /* ptrarray.c */; }; 4D043A7F090AE979009FEDA8 /* TransmissionDocument.icns in Resources */ = {isa = PBXBuildFile; fileRef = 4D043A7E090AE979009FEDA8 /* TransmissionDocument.icns */; }; 4D118E1A08CB46B20033958F /* PrefsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D118E1908CB46B20033958F /* PrefsController.m */; }; 4D1838DD09DEC0E80047D688 /* libtransmission.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D18389709DEC0030047D688 /* libtransmission.a */; }; 4D364DA0091FBB2C00377D12 /* TorrentTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D364D9F091FBB2C00377D12 /* TorrentTableView.m */; }; 4D36BA6F0CA2F00800A63CA5 /* crypto.c in Sources */ = {isa = PBXBuildFile; fileRef = 4D36BA600CA2F00800A63CA5 /* crypto.c */; }; 4D36BA700CA2F00800A63CA5 /* crypto.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D36BA610CA2F00800A63CA5 /* crypto.h */; }; 4D36BA720CA2F00800A63CA5 /* handshake.c in Sources */ = {isa = PBXBuildFile; fileRef = 4D36BA630CA2F00800A63CA5 /* handshake.c */; }; 4D36BA730CA2F00800A63CA5 /* handshake.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D36BA640CA2F00800A63CA5 /* handshake.h */; }; 4D36BA740CA2F00800A63CA5 /* peer-io.c in Sources */ = {isa = PBXBuildFile; fileRef = 4D36BA650CA2F00800A63CA5 /* peer-io.c */; }; 4D36BA750CA2F00800A63CA5 /* peer-io.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D36BA660CA2F00800A63CA5 /* peer-io.h */; }; 4D36BA770CA2F00800A63CA5 /* peer-mgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 4D36BA680CA2F00800A63CA5 /* peer-mgr.c */; }; 4D36BA780CA2F00800A63CA5 /* peer-mgr.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D36BA690CA2F00800A63CA5 /* peer-mgr.h */; }; 4D36BA790CA2F00800A63CA5 /* peer-msgs.c in Sources */ = {isa = PBXBuildFile; fileRef = 4D36BA6A0CA2F00800A63CA5 /* peer-msgs.c */; }; 4D36BA7A0CA2F00800A63CA5 /* peer-msgs.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D36BA6B0CA2F00800A63CA5 /* peer-msgs.h */; }; 4D36BA7B0CA2F00800A63CA5 /* ptrarray.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D36BA6C0CA2F00800A63CA5 /* ptrarray.h */; }; 4D3EA0AA08AE13C600EA10C2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D3EA0A908AE13C600EA10C2 /* IOKit.framework */; }; 4D4ADFC70DA1631500A68297 /* blocklist.c in Sources */ = {isa = PBXBuildFile; fileRef = A2D3078E0D9EC45F0051FD27 /* blocklist.c */; }; 4D6DAAC6090CE00500F43C22 /* RevealOff.png in Resources */ = {isa = PBXBuildFile; fileRef = 4D6DAAC4090CE00500F43C22 /* RevealOff.png */; }; 4D6DAAC7090CE00500F43C22 /* RevealOn.png in Resources */ = {isa = PBXBuildFile; fileRef = 4D6DAAC5090CE00500F43C22 /* RevealOn.png */; }; 4D8017EA10BBC073008A4AF2 /* torrent-magnet.c in Sources */ = {isa = PBXBuildFile; fileRef = 4D8017E810BBC073008A4AF2 /* torrent-magnet.c */; }; 4D8017EB10BBC073008A4AF2 /* torrent-magnet.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D8017E910BBC073008A4AF2 /* torrent-magnet.h */; }; 4D80185910BBC0B0008A4AF2 /* magnet.c in Sources */ = {isa = PBXBuildFile; fileRef = 4D80185710BBC0B0008A4AF2 /* magnet.c */; }; 4D80185A10BBC0B0008A4AF2 /* magnet.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D80185810BBC0B0008A4AF2 /* magnet.h */; }; 4D9A2BF009E16D21002D0FF9 /* libtransmission.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D18389709DEC0030047D688 /* libtransmission.a */; }; 4DA6FDBA0911233800450CB1 /* PauseOn.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DA6FDB80911233800450CB1 /* PauseOn.png */; }; 4DA6FDBB0911233800450CB1 /* PauseOff.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DA6FDB90911233800450CB1 /* PauseOff.png */; }; 4DA6FDC5091141AD00450CB1 /* ResumeOff.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DA6FDC3091141AD00450CB1 /* ResumeOff.png */; }; 4DA6FDC6091141AD00450CB1 /* ResumeOn.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DA6FDC4091141AD00450CB1 /* ResumeOn.png */; }; 4DB74F080E8CD75100AEB1A8 /* wildmat.c in Sources */ = {isa = PBXBuildFile; fileRef = 4DB74F070E8CD75100AEB1A8 /* wildmat.c */; }; 4DCCBB3E09C3D71100D3CABF /* TorrentCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DCCBB3C09C3D71100D3CABF /* TorrentCell.m */; }; 4DDFDD22099A5D8E00189D81 /* DownloadBadge.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DDFDD20099A5D8E00189D81 /* DownloadBadge.png */; }; 4DDFDD23099A5D8E00189D81 /* UploadBadge.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DDFDD21099A5D8E00189D81 /* UploadBadge.png */; }; 4DE5CC9D0980656F00BE280E /* NSStringAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DE5CC9C0980656F00BE280E /* NSStringAdditions.m */; }; 4DE5CCA70980735700BE280E /* Badger.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DE5CCA60980735700BE280E /* Badger.m */; }; 4DE5CCBA0981D27700BE280E /* ToolbarResumeAllTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DE5CCB80981D27700BE280E /* ToolbarResumeAllTemplate.png */; }; 4DE5CCBB0981D27700BE280E /* ToolbarPauseAllTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DE5CCB90981D27700BE280E /* ToolbarPauseAllTemplate.png */; }; 4DE5CCCB0981D9BE00BE280E /* Defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 4DE5CCCA0981D9BE00BE280E /* Defaults.plist */; }; 4DF0C5AB0899190500DD8943 /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DF0C5A90899190500DD8943 /* Controller.m */; }; 4DF7500C08A103AD007B0D70 /* ToolbarOpenTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DF7500708A103AD007B0D70 /* ToolbarOpenTemplate.png */; }; 4DF7500D08A103AD007B0D70 /* ToolbarInfoTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DF7500808A103AD007B0D70 /* ToolbarInfoTemplate.png */; }; 4DF7500E08A103AD007B0D70 /* ToolbarRemoveTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DF7500908A103AD007B0D70 /* ToolbarRemoveTemplate.png */; }; 4DFBC2DF09C0970D00D5C571 /* Torrent.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DFBC2DE09C0970D00D5C571 /* Torrent.m */; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; A200B9200A22798F007BBB1E /* InfoWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = A200B83A0A2263BA007BBB1E /* InfoWindowController.m */; }; A2012AE20D77151D0056FD71 /* YingYangGroupTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A2012AE10D77151D0056FD71 /* YingYangGroupTemplate.png */; }; A20152640D1C1BE70081714F /* PinTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A20152630D1C1BE70081714F /* PinTemplate.png */; }; A201527E0D1C270F0081714F /* torrent-ctor.c in Sources */ = {isa = PBXBuildFile; fileRef = A20152790D1C26EB0081714F /* torrent-ctor.c */; }; A20162C913DE48BF00E15488 /* receivedata.c in Sources */ = {isa = PBXBuildFile; fileRef = A20162C713DE48BF00E15488 /* receivedata.c */; }; A20162CA13DE48BF00E15488 /* receivedata.h in Headers */ = {isa = PBXBuildFile; fileRef = A20162C813DE48BF00E15488 /* receivedata.h */; }; A20162CD13DE497000E15488 /* portlistingparse.c in Sources */ = {isa = PBXBuildFile; fileRef = A20162CB13DE497000E15488 /* portlistingparse.c */; }; A20162CE13DE497000E15488 /* portlistingparse.h in Headers */ = {isa = PBXBuildFile; fileRef = A20162CC13DE497000E15488 /* portlistingparse.h */; }; A20162D013DE49E500E15488 /* miniupnpctypes.h in Headers */ = {isa = PBXBuildFile; fileRef = A20162CF13DE49E500E15488 /* miniupnpctypes.h */; }; A2074F4C12BEA8CE00F70985 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = A2074F4B12BEA8CE00F70985 /* buffer.c */; }; A2074F5912BEA8E000F70985 /* bufferevent_filter.c in Sources */ = {isa = PBXBuildFile; fileRef = A2074F5012BEA8E000F70985 /* bufferevent_filter.c */; }; A2074F5A12BEA8E000F70985 /* bufferevent_openssl.c in Sources */ = {isa = PBXBuildFile; fileRef = A2074F5112BEA8E000F70985 /* bufferevent_openssl.c */; }; A2074F5B12BEA8E000F70985 /* bufferevent_pair.c in Sources */ = {isa = PBXBuildFile; fileRef = A2074F5212BEA8E000F70985 /* bufferevent_pair.c */; }; A2074F5D12BEA8E000F70985 /* bufferevent_sock.c in Sources */ = {isa = PBXBuildFile; fileRef = A2074F5412BEA8E000F70985 /* bufferevent_sock.c */; }; A2074F5E12BEA8E000F70985 /* bufferevent.c in Sources */ = {isa = PBXBuildFile; fileRef = A2074F5512BEA8E000F70985 /* bufferevent.c */; }; A2074F7412BEAA3300F70985 /* event.c in Sources */ = {isa = PBXBuildFile; fileRef = A2074F7312BEAA3300F70985 /* event.c */; }; A2074F8512BEAA6600F70985 /* evmap.c in Sources */ = {isa = PBXBuildFile; fileRef = A2074F8412BEAA6600F70985 /* evmap.c */; }; A2074F9912BEAAAF00F70985 /* evthread.c in Sources */ = {isa = PBXBuildFile; fileRef = A2074F9812BEAAAF00F70985 /* evthread.c */; }; A2074FA312BEAAC600F70985 /* evutil.c in Sources */ = {isa = PBXBuildFile; fileRef = A2074FA212BEAAC600F70985 /* evutil.c */; }; A2074FAB12BEAAFF00F70985 /* http.c in Sources */ = {isa = PBXBuildFile; fileRef = A2074FAA12BEAAFF00F70985 /* http.c */; }; A2074FB712BEAB1E00F70985 /* listener.c in Sources */ = {isa = PBXBuildFile; fileRef = A2074FB612BEAB1E00F70985 /* listener.c */; }; A2074FBF12BEAB9A00F70985 /* kqueue.c in Sources */ = {isa = PBXBuildFile; fileRef = A2074FBE12BEAB9A00F70985 /* kqueue.c */; }; A2074FC712BEABC800F70985 /* log.c in Sources */ = {isa = PBXBuildFile; fileRef = A2074FC612BEABC800F70985 /* log.c */; }; A2074FDE12BEAC5000F70985 /* signal.c in Sources */ = {isa = PBXBuildFile; fileRef = A2074FDD12BEAC5000F70985 /* signal.c */; }; A207503512BEAD9C00F70985 /* select.c in Sources */ = {isa = PBXBuildFile; fileRef = A207503412BEAD9C00F70985 /* select.c */; }; A207503712BEADA200F70985 /* poll.c in Sources */ = {isa = PBXBuildFile; fileRef = A207503612BEADA200F70985 /* poll.c */; }; A20750B812BEB66900F70985 /* bufferevent_ratelim.c in Sources */ = {isa = PBXBuildFile; fileRef = A20750B712BEB66900F70985 /* bufferevent_ratelim.c */; }; A2085DDC0C53BC74000BC3B7 /* AboutWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = A2085DDA0C53BC74000BC3B7 /* AboutWindowController.m */; }; A209EAC61142CF28002B02D1 /* InfoActivityViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A209EAC31142CF28002B02D1 /* InfoActivityViewController.m */; }; A209EAC71142CF28002B02D1 /* InfoGeneralViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A209EAC51142CF28002B02D1 /* InfoGeneralViewController.m */; }; A209EAEC1142D294002B02D1 /* InfoActivityView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A209EAE81142D294002B02D1 /* InfoActivityView.xib */; }; A209EAED1142D294002B02D1 /* InfoGeneralView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A209EAEA1142D294002B02D1 /* InfoGeneralView.xib */; }; A209EB011142D3A5002B02D1 /* InfoTrackersViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A209EB001142D3A5002B02D1 /* InfoTrackersViewController.m */; }; A209EB201142DD85002B02D1 /* InfoTrackersView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A209EB1F1142DD85002B02D1 /* InfoTrackersView.xib */; }; A209EB9D1142E59A002B02D1 /* InfoPeersViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A209EB9C1142E59A002B02D1 /* InfoPeersViewController.m */; }; A209EBA71142EAF3002B02D1 /* InfoPeersView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A209EBA61142EAF3002B02D1 /* InfoPeersView.xib */; }; A209EBCE1142F2B4002B02D1 /* InfoFileViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A209EBCD1142F2B4002B02D1 /* InfoFileViewController.m */; }; A209EBD91142F52B002B02D1 /* InfoFileView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A209EBD81142F52B002B02D1 /* InfoFileView.xib */; }; A209EBF91142FEEE002B02D1 /* InfoOptionsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A209EBF81142FEEE002B02D1 /* InfoOptionsViewController.m */; }; A209EC12114301C6002B02D1 /* InfoOptionsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A209EC11114301C6002B02D1 /* InfoOptionsView.xib */; }; A209ECA2114319C3002B02D1 /* InfoWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A209ECA1114319C3002B02D1 /* InfoWindow.xib */; }; A209EE5C1144B51E002B02D1 /* history.c in Sources */ = {isa = PBXBuildFile; fileRef = A209EE5A1144B51E002B02D1 /* history.c */; }; A209EE5D1144B51E002B02D1 /* history.h in Headers */ = {isa = PBXBuildFile; fileRef = A209EE5B1144B51E002B02D1 /* history.h */; }; A20B6F6B0C4D842B0034AB1D /* PriorityLowTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A20B6F6A0C4D842B0034AB1D /* PriorityLowTemplate.png */; }; A20B6F830C4D8A610034AB1D /* PriorityHighTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A20B6F820C4D8A610034AB1D /* PriorityHighTemplate.png */; }; A20B6FAE0C4D9B040034AB1D /* PriorityNormalTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A20B6FAD0C4D9B040034AB1D /* PriorityNormalTemplate.png */; }; A20BFFB70D091CC700CE5D2B /* ToolbarSegmentedCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A20BFFB60D091CC700CE5D2B /* ToolbarSegmentedCell.m */; }; A21282A80CA6C66800EAEE0F /* StatusBarView.m in Sources */ = {isa = PBXBuildFile; fileRef = A21282A60CA6C66800EAEE0F /* StatusBarView.m */; }; A215BF5C0F02EBB800350CDB /* GroupRules.xib in Resources */ = {isa = PBXBuildFile; fileRef = A215BF5B0F02EBB800350CDB /* GroupRules.xib */; }; A219798B0D07B78400438EA7 /* GroupToolbarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = A219798A0D07B78400438EA7 /* GroupToolbarItem.m */; }; A21A9BE2106D86A800F1C3C1 /* TrackerNode.m in Sources */ = {isa = PBXBuildFile; fileRef = A21A9BE1106D86A800F1C3C1 /* TrackerNode.m */; }; A21A9D41106EC2E800F1C3C1 /* TrackerCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A21A9D40106EC2E800F1C3C1 /* TrackerCell.m */; }; A21DFF100A292B2B007C5F76 /* Transfers.png in Resources */ = {isa = PBXBuildFile; fileRef = A21DFF0F0A292B2B007C5F76 /* Transfers.png */; }; A21F15AC11729A8B00CF5A9C /* AddMagnetWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = A21F15AA11729A8B00CF5A9C /* AddMagnetWindowController.m */; }; A21F15AD11729A9F00CF5A9C /* AddMagnetWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A21F1538117299F100CF5A9C /* AddMagnetWindow.xib */; }; A21FBBAB0EDA78C300BC3C51 /* bandwidth.h in Headers */ = {isa = PBXBuildFile; fileRef = A21FBBA90EDA78C300BC3C51 /* bandwidth.h */; }; A21FBBAC0EDA78C300BC3C51 /* bandwidth.c in Sources */ = {isa = PBXBuildFile; fileRef = A21FBBAA0EDA78C300BC3C51 /* bandwidth.c */; }; A220AF7B13D7CC460035C512 /* GlobalOptionsPopover.xib in Resources */ = {isa = PBXBuildFile; fileRef = A220AF7913D7CC460035C512 /* GlobalOptionsPopover.xib */; }; A220EC5B118C8A060022B4BE /* tr-lpd.c in Sources */ = {isa = PBXBuildFile; fileRef = A220EC59118C8A060022B4BE /* tr-lpd.c */; }; A220EC5C118C8A060022B4BE /* tr-lpd.h in Headers */ = {isa = PBXBuildFile; fileRef = A220EC5A118C8A060022B4BE /* tr-lpd.h */; }; A22180980D148A71007D09ED /* GroupsPrefsController.m in Sources */ = {isa = PBXBuildFile; fileRef = A22180970D148A71007D09ED /* GroupsPrefsController.m */; }; A221DCC8104B3660008A642D /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A221DCC7104B3660008A642D /* Quartz.framework */; }; A222E9870E6B21D9009FB003 /* BlocklistDownloaderViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A222E9860E6B21D9009FB003 /* BlocklistDownloaderViewController.m */; }; A222EA7B0E6C32C4009FB003 /* BlocklistScheduler.m in Sources */ = {isa = PBXBuildFile; fileRef = A222EA7A0E6C32C4009FB003 /* BlocklistScheduler.m */; }; A225A4C0187E369C00CDE823 /* ShareToolbarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = A225A4BF187E369C00CDE823 /* ShareToolbarItem.m */; }; A2265F420B5EF5F40093DDA5 /* FileNameCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A2265F400B5EF5F40093DDA5 /* FileNameCell.m */; }; A226FDAC0D0CDF20005A7F71 /* libnatpmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C7A118D0D0B2EB800B5701F /* libnatpmp.a */; }; A2290D1E14421CC100B95A09 /* libcrypto.0.9.8.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A27653A714369C5C009D3CCF /* libcrypto.0.9.8.dylib */; }; A2290D2014421CD000B95A09 /* libcrypto.0.9.8.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A27653A714369C5C009D3CCF /* libcrypto.0.9.8.dylib */; }; A2290D2214421CD800B95A09 /* libcrypto.0.9.8.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A27653A714369C5C009D3CCF /* libcrypto.0.9.8.dylib */; }; A2290D2514421D1A00B95A09 /* libcrypto.0.9.8.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A27653A714369C5C009D3CCF /* libcrypto.0.9.8.dylib */; }; A2290D2E1442B23200B95A09 /* libcurl.4.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A2290D2D1442B23200B95A09 /* libcurl.4.dylib */; }; A2290D2F1442B23200B95A09 /* libcurl.4.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A2290D2D1442B23200B95A09 /* libcurl.4.dylib */; }; A2290D301442B23200B95A09 /* libcurl.4.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A2290D2D1442B23200B95A09 /* libcurl.4.dylib */; }; A2290D311442B23200B95A09 /* libcurl.4.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A2290D2D1442B23200B95A09 /* libcurl.4.dylib */; }; A22A8D560AEEAFA5007E9CB9 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A22A8D540AEEAFA5007E9CB9 /* Localizable.strings */; }; A22B00B2116A9E9F003315FC /* connecthostport.h in Headers */ = {isa = PBXBuildFile; fileRef = A22B00AF116A9E90003315FC /* connecthostport.h */; }; A22B00B3116A9EA4003315FC /* connecthostport.c in Sources */ = {isa = PBXBuildFile; fileRef = A22B00AE116A9E90003315FC /* connecthostport.c */; }; A22BAE281388040500FB022F /* NSMutableArrayAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = A22BAE271388040500FB022F /* NSMutableArrayAdditions.m */; }; A22CFB820FB66EF30009BD3E /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A22CFB810FB66EF30009BD3E /* Carbon.framework */; }; A22CFCA80FC24ED80009BD3E /* tr-dht.c in Sources */ = {isa = PBXBuildFile; fileRef = A22CFCA60FC24ED80009BD3E /* tr-dht.c */; }; A22CFCA90FC24ED80009BD3E /* tr-dht.h in Headers */ = {isa = PBXBuildFile; fileRef = A22CFCA70FC24ED80009BD3E /* tr-dht.h */; }; A22CFCC20FC24F890009BD3E /* dht.h in Headers */ = {isa = PBXBuildFile; fileRef = A22CFCC00FC24F890009BD3E /* dht.h */; }; A22CFCC30FC24F890009BD3E /* dht.c in Sources */ = {isa = PBXBuildFile; fileRef = A22CFCC10FC24F890009BD3E /* dht.c */; }; A22CFCCB0FC24FDA0009BD3E /* libdht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A22CFCBA0FC24F710009BD3E /* libdht.a */; }; A22CFCCD0FC250480009BD3E /* libevent.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BE75C3490C729E9500DBEFE0 /* libevent.a */; }; A22D3AA60D00D1790079CFED /* TurtleTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A22D3AA30D00D1790079CFED /* TurtleTemplate.png */; }; A22F1E550E7DA8030065DB9D /* sparkle_dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = A22F1E540E7DA8030065DB9D /* sparkle_dsa_pub.pem */; }; A231274C0D11D0B7003F9AFF /* AboutWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A231274B0D11D0B7003F9AFF /* AboutWindow.xib */; }; A232D29E0A70903E00973B12 /* ToolbarFilterTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A232D29D0A70903E00973B12 /* ToolbarFilterTemplate.png */; }; A232F07E0EEA034A00041646 /* BonjourController.m in Sources */ = {isa = PBXBuildFile; fileRef = A232F07D0EEA034A00041646 /* BonjourController.m */; }; A233BD330D8C6585007EE7B4 /* MessageWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A233BD320D8C6585007EE7B4 /* MessageWindow.xib */; }; A233BD690D8CF2C7007EE7B4 /* StatsWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A233BD680D8CF2C7007EE7B4 /* StatsWindow.xib */; }; A234EA541453563B000F3E97 /* NSImageAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = A234EA531453563B000F3E97 /* NSImageAdditions.m */; }; A23547E211CD0B090046EAE6 /* cache.c in Sources */ = {isa = PBXBuildFile; fileRef = A23547E011CD0B090046EAE6 /* cache.c */; }; A23547E311CD0B090046EAE6 /* cache.h in Headers */ = {isa = PBXBuildFile; fileRef = A23547E111CD0B090046EAE6 /* cache.h */; }; A2385DD40BFE06C800B24EF6 /* DragOverlayWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = A2385DD20BFE06C800B24EF6 /* DragOverlayWindow.m */; }; A23D5DA71320570800E422BA /* CleanupTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A23D5DA61320570800E422BA /* CleanupTemplate.png */; }; A23F29A1132A447400E9A83B /* announcer-common.h in Headers */ = {isa = PBXBuildFile; fileRef = A23F299F132A447400E9A83B /* announcer-common.h */; }; A23F29A2132A447400E9A83B /* announcer-http.c in Sources */ = {isa = PBXBuildFile; fileRef = A23F29A0132A447400E9A83B /* announcer-http.c */; }; A23F4FF20D1D98AD002FCB97 /* PrefsWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A23F4FF00D1D98AD002FCB97 /* PrefsWindow.xib */; }; A23F50020D1D99D7002FCB97 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = A23F50000D1D99D7002FCB97 /* MainMenu.xib */; }; A23F526F0F14395900AA02E3 /* PredicateEditorRowTemplateAny.m in Sources */ = {isa = PBXBuildFile; fileRef = A23F526E0F14395900AA02E3 /* PredicateEditorRowTemplateAny.m */; }; A23FAE54178BC2950053DC5B /* platform-quota.c in Sources */ = {isa = PBXBuildFile; fileRef = A23FAE52178BC2950053DC5B /* platform-quota.c */; }; A23FAE55178BC2950053DC5B /* platform-quota.h in Headers */ = {isa = PBXBuildFile; fileRef = A23FAE53178BC2950053DC5B /* platform-quota.h */; }; A241528B0C0261B8007DD3B4 /* Globe.png in Resources */ = {isa = PBXBuildFile; fileRef = A2FB06950BFF484A0095564D /* Globe.png */; }; A242AD9315F05D23002B3A6C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A242AD9115F05D23002B3A6C /* Localizable.strings */; }; A245030C0D6A1FB000B49D00 /* UpArrowGroupTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A245030B0D6A1FB000B49D00 /* UpArrowGroupTemplate.png */; }; A245030E0D6A1FBC00B49D00 /* DownArrowGroupTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A245030D0D6A1FBC00B49D00 /* DownArrowGroupTemplate.png */; }; A2451E6916ACE4EB00586E0E /* FileRenameSheetController.m in Sources */ = {isa = PBXBuildFile; fileRef = A2451E6716ACE4EB00586E0E /* FileRenameSheetController.m */; }; A2451E6A16ACE4EB00586E0E /* FileRenameSheetController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A2451E6816ACE4EB00586E0E /* FileRenameSheetController.xib */; }; A24621410C769D0900088E81 /* trevent.h in Headers */ = {isa = PBXBuildFile; fileRef = A24621350C769CF400088E81 /* trevent.h */; }; A24621420C769D0900088E81 /* trevent.c in Sources */ = {isa = PBXBuildFile; fileRef = A24621360C769CF400088E81 /* trevent.c */; }; A247A443114C701800547DFC /* InfoViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = A247A442114C701800547DFC /* InfoViewController.h */; }; A24B65600D3F30870079EA4D /* QuitBadge.png in Resources */ = {isa = PBXBuildFile; fileRef = A24B655F0D3F30870079EA4D /* QuitBadge.png */; }; A24F19080A3A790800C9C145 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A24F19070A3A790800C9C145 /* Sparkle.framework */; }; A24F19210A3A796800C9C145 /* Sparkle.framework in Copy Files */ = {isa = PBXBuildFile; fileRef = A24F19070A3A790800C9C145 /* Sparkle.framework */; }; A250EEB60E2ED87B00A688E6 /* web in Resources */ = {isa = PBXBuildFile; fileRef = A250EE800E2ED87B00A688E6 /* web */; }; A254853C0EB66CD4004539DA /* codelength.h in Headers */ = {isa = PBXBuildFile; fileRef = A25485390EB66CBB004539DA /* codelength.h */; }; A256588D0A9A695400E8A03B /* MessageWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = A256588B0A9A695400E8A03B /* MessageWindowController.m */; }; A257C1820CAD3003004E121C /* PeerTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = A257C1800CAD3003004E121C /* PeerTableView.m */; }; A25892640CF1F7E800CCCDDF /* StatsWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = A25892630CF1F7E800CCCDDF /* StatsWindowController.m */; }; A259317E0A73B2CC002F4FE7 /* TransmissionHelp in Resources */ = {isa = PBXBuildFile; fileRef = A259316A0A73B2CC002F4FE7 /* TransmissionHelp */; }; A25963E11068376200453B31 /* FavIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = A25963E01068376200453B31 /* FavIcon.png */; }; A25964A6106D73A800453B31 /* announcer.c in Sources */ = {isa = PBXBuildFile; fileRef = A25964A4106D73A800453B31 /* announcer.c */; }; A25964A7106D73A800453B31 /* announcer.h in Headers */ = {isa = PBXBuildFile; fileRef = A25964A5106D73A800453B31 /* announcer.h */; }; A25BB02A12F4F517004B724E /* InfoTabButtonBack.m in Sources */ = {isa = PBXBuildFile; fileRef = A25BB02912F4F517004B724E /* InfoTabButtonBack.m */; }; A25BFD69167BED3B0039D1AA /* variant-benc.c in Sources */ = {isa = PBXBuildFile; fileRef = A25BFD63167BED3B0039D1AA /* variant-benc.c */; }; A25BFD6A167BED3B0039D1AA /* variant-common.h in Headers */ = {isa = PBXBuildFile; fileRef = A25BFD64167BED3B0039D1AA /* variant-common.h */; }; A25BFD6B167BED3B0039D1AA /* variant-json.c in Sources */ = {isa = PBXBuildFile; fileRef = A25BFD65167BED3B0039D1AA /* variant-json.c */; }; A25BFD6D167BED3B0039D1AA /* variant.c in Sources */ = {isa = PBXBuildFile; fileRef = A25BFD67167BED3B0039D1AA /* variant.c */; }; A25BFD6E167BED3B0039D1AA /* variant.h in Headers */ = {isa = PBXBuildFile; fileRef = A25BFD68167BED3B0039D1AA /* variant.h */; }; A25D2CBD0CF4C73E0096A262 /* stats.c in Sources */ = {isa = PBXBuildFile; fileRef = A25D2CBB0CF4C7190096A262 /* stats.c */; }; A25D2CBE0CF4C73E0096A262 /* stats.h in Headers */ = {isa = PBXBuildFile; fileRef = A25D2CBA0CF4C7190096A262 /* stats.h */; }; A25E03D90E4015100086C225 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; A25E03E20E4015380086C225 /* tr-getopt.h in Headers */ = {isa = PBXBuildFile; fileRef = A25E03E00E4015380086C225 /* tr-getopt.h */; }; A25E03E30E4015380086C225 /* tr-getopt.c in Sources */ = {isa = PBXBuildFile; fileRef = A25E03E10E4015380086C225 /* tr-getopt.c */; }; A25E74650AF5097C006F11AE /* ExpandedPathToPathTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = A25E74440AF5089E006F11AE /* ExpandedPathToPathTransformer.m */; }; A25E74660AF5097D006F11AE /* ExpandedPathToIconTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = A25E74460AF5089E006F11AE /* ExpandedPathToIconTransformer.m */; }; A25FCDEF0A3769A6002BCBBE /* ToolbarPauseSelectedTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A25FCDDD0A37695F002BCBBE /* ToolbarPauseSelectedTemplate.png */; }; A25FCDF00A3769AC002BCBBE /* ToolbarResumeSelectedTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A25FCDDE0A37695F002BCBBE /* ToolbarResumeSelectedTemplate.png */; }; A26146E10DD4A0160060F033 /* GroupsNoneTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A26146E00DD4A0160060F033 /* GroupsNoneTemplate.png */; }; A261F1DC0A69A1610002815A /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A261F1DB0A69A1610002815A /* Growl.framework */; }; A261F1E40A69A1B10002815A /* Growl.framework in Copy Files */ = {isa = PBXBuildFile; fileRef = A261F1DB0A69A1610002815A /* Growl.framework */; }; A2623B2F0D3DC2EF0045D19A /* PriorityControlNormal.png in Resources */ = {isa = PBXBuildFile; fileRef = A2623B2C0D3DC2EF0045D19A /* PriorityControlNormal.png */; }; A2623B300D3DC2EF0045D19A /* PriorityControlLow.png in Resources */ = {isa = PBXBuildFile; fileRef = A2623B2D0D3DC2EF0045D19A /* PriorityControlLow.png */; }; A2623B310D3DC2EF0045D19A /* PriorityControlHigh.png in Resources */ = {isa = PBXBuildFile; fileRef = A2623B2E0D3DC2EF0045D19A /* PriorityControlHigh.png */; }; A2623B3F0D3DC5930045D19A /* ResumeNoWaitHover.png in Resources */ = {isa = PBXBuildFile; fileRef = A2623B3B0D3DC5930045D19A /* ResumeNoWaitHover.png */; }; A2623B400D3DC5930045D19A /* RevealHover.png in Resources */ = {isa = PBXBuildFile; fileRef = A2623B3C0D3DC5930045D19A /* RevealHover.png */; }; A2623B410D3DC5930045D19A /* ResumeHover.png in Resources */ = {isa = PBXBuildFile; fileRef = A2623B3D0D3DC5930045D19A /* ResumeHover.png */; }; A2623B420D3DC5930045D19A /* PauseHover.png in Resources */ = {isa = PBXBuildFile; fileRef = A2623B3E0D3DC5930045D19A /* PauseHover.png */; }; A2623B4E0D3DC6DF0045D19A /* ActionHover.png in Resources */ = {isa = PBXBuildFile; fileRef = A2623B4D0D3DC6DF0045D19A /* ActionHover.png */; }; A263CFC010DD67670038DE27 /* InfoTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = A263CFBF10DD67670038DE27 /* InfoTextField.m */; }; A263D03E10DE6F010038DE27 /* Magnet.png in Resources */ = {isa = PBXBuildFile; fileRef = A263D03D10DE6F010038DE27 /* Magnet.png */; }; A2661D6112D0E8D9004F69D5 /* FilterBarView.m in Sources */ = {isa = PBXBuildFile; fileRef = A2661D3B12D0E51B004F69D5 /* FilterBarView.m */; }; A267927C130DFF2700CB7464 /* libutp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A2E38544130DFEE3001F501B /* libutp.a */; }; A2679294130E00A000CB7464 /* tr-utp.c in Sources */ = {isa = PBXBuildFile; fileRef = A2679292130E00A000CB7464 /* tr-utp.c */; }; A2679295130E00A000CB7464 /* tr-utp.h in Headers */ = {isa = PBXBuildFile; fileRef = A2679293130E00A000CB7464 /* tr-utp.h */; }; A26AF21A0D2DA35A00FF7140 /* FileOutlineController.m in Sources */ = {isa = PBXBuildFile; fileRef = A26AF2190D2DA35A00FF7140 /* FileOutlineController.m */; }; A26AF27E0D2DBDDF00FF7140 /* AddWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A26AF27C0D2DBDDF00FF7140 /* AddWindow.xib */; }; A26AF2840D2DC27C00FF7140 /* AddWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = A26AF2830D2DC27C00FF7140 /* AddWindowController.m */; }; A26E75880CB6AA7500226674 /* InfoOptions.png in Resources */ = {isa = PBXBuildFile; fileRef = A26E75870CB6AA7500226674 /* InfoOptions.png */; }; A26E75960CB6AB4800226674 /* InfoGeneral.png in Resources */ = {isa = PBXBuildFile; fileRef = A26E75950CB6AB4800226674 /* InfoGeneral.png */; }; A2710E770A86796000CE4F7D /* PrefsWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = A2710E750A86796000CE4F7D /* PrefsWindow.m */; }; A2725B6E0DE5C4F5003445E7 /* FileListNode.m in Sources */ = {isa = PBXBuildFile; fileRef = A2725B6D0DE5C4F5003445E7 /* FileListNode.m */; }; A2725D5D0DE7507C003445E7 /* TrackerTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = A2725D5C0DE7507C003445E7 /* TrackerTableView.m */; }; A277DA0B0C693D9C00DA2CD4 /* ActionOn.png in Resources */ = {isa = PBXBuildFile; fileRef = A277DA090C693D9C00DA2CD4 /* ActionOn.png */; }; A27F0F330E19AD9800B2DB97 /* TorrentGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = A27F0F320E19AD9800B2DB97 /* TorrentGroup.m */; }; A284214412DA663E00FBDDBB /* tr-udp.c in Sources */ = {isa = PBXBuildFile; fileRef = A284214212DA663E00FBDDBB /* tr-udp.c */; }; A284214512DA663E00FBDDBB /* tr-udp.h in Headers */ = {isa = PBXBuildFile; fileRef = A284214312DA663E00FBDDBB /* tr-udp.h */; }; A28F4F770E085BDC003A3882 /* ColorTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = A28F4F760E085BDC003A3882 /* ColorTextField.m */; }; A292A6E80DFB45FC004B9C0A /* webseed.c in Sources */ = {isa = PBXBuildFile; fileRef = A292A6E50DFB45EC004B9C0A /* webseed.c */; }; A29304ED15D7465100B1F726 /* style.css in Resources */ = {isa = PBXBuildFile; fileRef = A29304EC15D7465100B1F726 /* style.css */; }; A29304EE15D7497C00B1F726 /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = A2F35BCD15C5A0A100EBF632 /* main.c */; }; A29576030D11D63C0093B167 /* Creator.xib in Resources */ = {isa = PBXBuildFile; fileRef = A29576010D11D63C0093B167 /* Creator.xib */; }; A2966E8713DAF74C007B52DF /* GlobalOptionsPopoverViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A2966E8613DAF74C007B52DF /* GlobalOptionsPopoverViewController.m */; }; A296EF3B11E560A7004A2781 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A296EF3411E5605E004A2781 /* libiconv.dylib */; }; A296EF3C11E560BD004A2781 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A296EF3411E5605E004A2781 /* libiconv.dylib */; }; A296EF3D11E560C3004A2781 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A296EF3411E5605E004A2781 /* libiconv.dylib */; }; A296EF3E11E560D1004A2781 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A296EF3411E5605E004A2781 /* libiconv.dylib */; }; A29AF4F70D01BADC00D097EC /* DownArrowTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A29AF4F60D01BADC00D097EC /* DownArrowTemplate.png */; }; A29AF4F90D01BAEB00D097EC /* UpArrowTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A29AF4F80D01BAEB00D097EC /* UpArrowTemplate.png */; }; A29B0C270BD15FEF0006F230 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = A2F8951E0A2D4BA500ED2127 /* Credits.rtf */; }; A29C8B370ACC6EB3000ED9F9 /* PortChecker.m in Sources */ = {isa = PBXBuildFile; fileRef = A29C8B350ACC6EB3000ED9F9 /* PortChecker.m */; }; A29D84041049C25600D1987A /* NSApplicationAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = A29D84031049C25600D1987A /* NSApplicationAdditions.m */; }; A29DF8B90DB2544C00D04E5A /* resume.c in Sources */ = {isa = PBXBuildFile; fileRef = A29DF8B60DB2544C00D04E5A /* resume.c */; }; A29DF8BA0DB2544C00D04E5A /* resume.h in Headers */ = {isa = PBXBuildFile; fileRef = A29DF8B70DB2544C00D04E5A /* resume.h */; }; A29DF8BB0DB2544C00D04E5A /* torrent.h in Headers */ = {isa = PBXBuildFile; fileRef = A29DF8B80DB2544C00D04E5A /* torrent.h */; }; A29DF8BE0DB2545F00D04E5A /* verify.h in Headers */ = {isa = PBXBuildFile; fileRef = A2D22A110D65EED100007D5F /* verify.h */; }; A29E653613F1603100048D71 /* evutil_rand.c in Sources */ = {isa = PBXBuildFile; fileRef = A29E653513F1603100048D71 /* evutil_rand.c */; }; A2A1CB7A0BF29D5500AE959F /* PeerProgressIndicatorCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A2A1CB780BF29D5500AE959F /* PeerProgressIndicatorCell.m */; }; A2A4E9210DE0F7E9000CE197 /* web.h in Headers */ = {isa = PBXBuildFile; fileRef = A29EBE530DC01FC9006CEE80 /* web.h */; }; A2A4E9220DE0F7EB000CE197 /* web.c in Sources */ = {isa = PBXBuildFile; fileRef = A29EBE520DC01FC9006CEE80 /* web.c */; }; A2A4EA0E0DE106EB000CE197 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = A2A4EA0A0DE106E8000CE197 /* ConvertUTF.c */; }; A2A4EA0F0DE106EE000CE197 /* ConvertUTF.h in Headers */ = {isa = PBXBuildFile; fileRef = A2A4EA0B0DE106E8000CE197 /* ConvertUTF.h */; }; A2A6321B0CD9751700E3DA60 /* BadgeView.m in Sources */ = {isa = PBXBuildFile; fileRef = A2A6321A0CD9751700E3DA60 /* BadgeView.m */; }; A2A7B32A164F87D400B98C65 /* jsonsl.c in Sources */ = {isa = PBXBuildFile; fileRef = A2A7B328164F87D400B98C65 /* jsonsl.c */; }; A2A7B32B164F87D400B98C65 /* jsonsl.h in Headers */ = {isa = PBXBuildFile; fileRef = A2A7B329164F87D400B98C65 /* jsonsl.h */; }; A2AA579D0ADFCAB400CA59F6 /* PiecesView.m in Sources */ = {isa = PBXBuildFile; fileRef = A2AA579B0ADFCAB400CA59F6 /* PiecesView.m */; }; A2AA9BE1132CAC8E00FA131E /* announcer-udp.c in Sources */ = {isa = PBXBuildFile; fileRef = A2AA9BE0132CAC8D00FA131E /* announcer-udp.c */; }; A2AA9BE3132CAE2000FA131E /* evdns.c in Sources */ = {isa = PBXBuildFile; fileRef = A2AA9BE2132CAE2000FA131E /* evdns.c */; }; A2AAB65C0DE0CF6200E04DDA /* rpc-server.c in Sources */ = {isa = PBXBuildFile; fileRef = A2AAB6580DE0CF6200E04DDA /* rpc-server.c */; }; A2AAB65D0DE0CF6200E04DDA /* rpcimpl.h in Headers */ = {isa = PBXBuildFile; fileRef = A2AAB6590DE0CF6200E04DDA /* rpcimpl.h */; }; A2AAB65E0DE0CF6200E04DDA /* rpc-server.h in Headers */ = {isa = PBXBuildFile; fileRef = A2AAB65A0DE0CF6200E04DDA /* rpc-server.h */; }; A2AAB65F0DE0CF6200E04DDA /* rpcimpl.c in Sources */ = {isa = PBXBuildFile; fileRef = A2AAB65B0DE0CF6200E04DDA /* rpcimpl.c */; }; A2AAB6650DE0D08B00E04DDA /* blocklist.h in Headers */ = {isa = PBXBuildFile; fileRef = A2D307930D9EC4860051FD27 /* blocklist.h */; }; A2AB76EA15D8130B009EFC95 /* libcurl.4.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A2290D2D1442B23200B95A09 /* libcurl.4.dylib */; }; A2AB883E16A399A6008FAD50 /* VDKQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = A2AB883C16A399A6008FAD50 /* VDKQueue.m */; }; A2AF1C390A3D0F6200F1575D /* FileOutlineView.m in Sources */ = {isa = PBXBuildFile; fileRef = A2AF1C370A3D0F6200F1575D /* FileOutlineView.m */; }; A2AF23C816B44FA0003BC59E /* log.c in Sources */ = {isa = PBXBuildFile; fileRef = A2AF23C616B44FA0003BC59E /* log.c */; }; A2AF23C916B44FA0003BC59E /* log.h in Headers */ = {isa = PBXBuildFile; fileRef = A2AF23C716B44FA0003BC59E /* log.h */; }; A2B3FB460E5901E700FF78FB /* cli.c in Sources */ = {isa = PBXBuildFile; fileRef = A2B3FB450E5901E700FF78FB /* cli.c */; }; A2B3FB4C0E59023000FF78FB /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; A2B3FB530E59027100FF78FB /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; A2B5B4E91880665E0071A66A /* ShareTorrentFileHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = A2B5B4E81880665E0071A66A /* ShareTorrentFileHelper.m */; }; A2B6141C1395ADE9000E0975 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A2B6141B1395ADE9000E0975 /* libz.dylib */; }; A2B6141D1395B0E3000E0975 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A2B6141B1395ADE9000E0975 /* libz.dylib */; }; A2B6141E1395B0EC000E0975 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A2B6141B1395ADE9000E0975 /* libz.dylib */; }; A2B6141F1395B0F5000E0975 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A2B6141B1395ADE9000E0975 /* libz.dylib */; }; A2BB67790D5BA74600AB0618 /* ToolbarOpenWebTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A2BB67780D5BA74600AB0618 /* ToolbarOpenWebTemplate.png */; }; A2BC19850CA9AF5A00DD302A /* CompleteCheck.png in Resources */ = {isa = PBXBuildFile; fileRef = A2BC19840CA9AF5A00DD302A /* CompleteCheck.png */; }; A2BE9C520C1E4AF5002D16E6 /* makemeta.c in Sources */ = {isa = PBXBuildFile; fileRef = A2BE9C4E0C1E4ADA002D16E6 /* makemeta.c */; }; A2BE9C530C1E4AF7002D16E6 /* makemeta.h in Headers */ = {isa = PBXBuildFile; fileRef = A2BE9C4F0C1E4ADA002D16E6 /* makemeta.h */; }; A2C0C5030E02CB6100D95339 /* Remote.png in Resources */ = {isa = PBXBuildFile; fileRef = A2C0C5020E02CB6100D95339 /* Remote.png */; }; A2C89D600CFCBF57004CC2BC /* ButtonToolbarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = A2C89D5F0CFCBF57004CC2BC /* ButtonToolbarItem.m */; }; A2CB38AF0E1E6896002B514C /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = A2CB38AE0E1E6896002B514C /* COPYING */; }; A2D0E0490A54A97C003C72CF /* Bandwidth.png in Resources */ = {isa = PBXBuildFile; fileRef = A2D0E0480A54A97C003C72CF /* Bandwidth.png */; }; A2D22A130D65EEE700007D5F /* verify.c in Sources */ = {isa = PBXBuildFile; fileRef = A2D22A100D65EED100007D5F /* verify.c */; }; A2D307A40D9EC6870051FD27 /* BlocklistDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = A2D307A30D9EC6870051FD27 /* BlocklistDownloader.m */; }; A2D307B10D9EC9F50051FD27 /* BlocklistStatusWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A2D307B00D9EC9F50051FD27 /* BlocklistStatusWindow.xib */; }; A2D77451154CC25700A62B93 /* WebSeedTableView.h in Headers */ = {isa = PBXBuildFile; fileRef = A2D7744F154CC25700A62B93 /* WebSeedTableView.h */; }; A2D77452154CC25700A62B93 /* WebSeedTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = A2D77450154CC25700A62B93 /* WebSeedTableView.m */; }; A2D77453154CC72B00A62B93 /* WebSeedTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = A2D77450154CC25700A62B93 /* WebSeedTableView.m */; }; A2D8CFBA15F82DFA0056E93D /* NSApplicationAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = A29D84031049C25600D1987A /* NSApplicationAdditions.m */; }; A2D8CFBB15F82E030056E93D /* NSStringAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DE5CC9C0980656F00BE280E /* NSStringAdditions.m */; }; A2DA362A0CBC674900C2ED41 /* InfoActivity.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DA36270CBC674900C2ED41 /* InfoActivity.png */; }; A2DA362B0CBC674900C2ED41 /* InfoFiles.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DA36280CBC674900C2ED41 /* InfoFiles.png */; }; A2DA362C0CBC674900C2ED41 /* InfoPeers.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DA36290CBC674900C2ED41 /* InfoPeers.png */; }; A2DC494815842ABE00758FF1 /* ActionHover@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC494715842ABD00758FF1 /* ActionHover@2x.png */; }; A2DC494A15842BE900758FF1 /* ActionOn@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC494915842BE900758FF1 /* ActionOn@2x.png */; }; A2DC494C15842BF700758FF1 /* Bandwidth@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC494B15842BF700758FF1 /* Bandwidth@2x.png */; }; A2DC494E15842C1000758FF1 /* CleanupTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC494D15842C1000758FF1 /* CleanupTemplate@2x.png */; }; A2DC495015842C1C00758FF1 /* CompleteCheck@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC494F15842C1C00758FF1 /* CompleteCheck@2x.png */; }; A2DC495215842C2700758FF1 /* CreateLarge@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC495115842C2700758FF1 /* CreateLarge@2x.png */; }; A2DC495415842C3300758FF1 /* DownArrowGroupTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC495315842C3300758FF1 /* DownArrowGroupTemplate@2x.png */; }; A2DC495615842C4600758FF1 /* DownArrowTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC495515842C4600758FF1 /* DownArrowTemplate@2x.png */; }; A2DC495815842C7700758FF1 /* FavIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC495715842C7700758FF1 /* FavIcon@2x.png */; }; A2DC495A15842C9500758FF1 /* Globe@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC495915842C9500758FF1 /* Globe@2x.png */; }; A2DC495C15842CA000758FF1 /* GreenDot@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC495B15842CA000758FF1 /* GreenDot@2x.png */; }; A2DC495E15842CB400758FF1 /* Groups@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC495D15842CB400758FF1 /* Groups@2x.png */; }; A2DC496015842CD300758FF1 /* GroupsNoneTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC495F15842CD300758FF1 /* GroupsNoneTemplate@2x.png */; }; A2DC496215842CE800758FF1 /* InfoActivity@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC496115842CE800758FF1 /* InfoActivity@2x.png */; }; A2DC496415842CF200758FF1 /* InfoFiles@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC496315842CF200758FF1 /* InfoFiles@2x.png */; }; A2DC496615842CFE00758FF1 /* InfoGeneral@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC496515842CFE00758FF1 /* InfoGeneral@2x.png */; }; A2DC496815842D1B00758FF1 /* InfoOptions@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC496715842D1B00758FF1 /* InfoOptions@2x.png */; }; A2DC496A15842D2C00758FF1 /* InfoPeers@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC496915842D2C00758FF1 /* InfoPeers@2x.png */; }; A2DC496C15842D3F00758FF1 /* InfoTracker@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC496B15842D3E00758FF1 /* InfoTracker@2x.png */; }; A2DC496E15842D5200758FF1 /* Lock@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC496D15842D5200758FF1 /* Lock@2x.png */; }; A2DC497015842D5C00758FF1 /* Magnet@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC496F15842D5C00758FF1 /* Magnet@2x.png */; }; A2DC497215842D8000758FF1 /* PauseHover@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC497115842D8000758FF1 /* PauseHover@2x.png */; }; A2DC497615842D9700758FF1 /* PauseOff@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC497515842D9700758FF1 /* PauseOff@2x.png */; }; A2DC497815842D9C00758FF1 /* PauseOn@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC497715842D9C00758FF1 /* PauseOn@2x.png */; }; A2DC497A15842DC100758FF1 /* PinTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC497915842DC000758FF1 /* PinTemplate@2x.png */; }; A2DC497E15842DDC00758FF1 /* PriorityControlLow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC497B15842DDC00758FF1 /* PriorityControlLow@2x.png */; }; A2DC497F15842DDC00758FF1 /* PriorityControlNormal@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC497C15842DDC00758FF1 /* PriorityControlNormal@2x.png */; }; A2DC498415842E8A00758FF1 /* PriorityControlHigh@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC498115842E8A00758FF1 /* PriorityControlHigh@2x.png */; }; A2DC498A15842ECC00758FF1 /* PriorityHighTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC498715842ECC00758FF1 /* PriorityHighTemplate@2x.png */; }; A2DC498B15842ECC00758FF1 /* PriorityLowTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC498815842ECC00758FF1 /* PriorityLowTemplate@2x.png */; }; A2DC498C15842ECC00758FF1 /* PriorityNormalTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC498915842ECC00758FF1 /* PriorityNormalTemplate@2x.png */; }; A2DC498E15842EEA00758FF1 /* PurpleDot@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC498D15842EEA00758FF1 /* PurpleDot@2x.png */; }; A2DC499015842EF000758FF1 /* RedDot@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC498F15842EF000758FF1 /* RedDot@2x.png */; }; A2DC499215842F0000758FF1 /* Remote@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC499115842F0000758FF1 /* Remote@2x.png */; }; A2DC499915842F5800758FF1 /* ResumeHover@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC499315842F5700758FF1 /* ResumeHover@2x.png */; }; A2DC499A15842F5800758FF1 /* ResumeNoWaitHover@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC499415842F5800758FF1 /* ResumeNoWaitHover@2x.png */; }; A2DC499B15842F5800758FF1 /* ResumeNoWaitOff@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC499515842F5800758FF1 /* ResumeNoWaitOff@2x.png */; }; A2DC499C15842F5800758FF1 /* ResumeNoWaitOn@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC499615842F5800758FF1 /* ResumeNoWaitOn@2x.png */; }; A2DC499D15842F5800758FF1 /* ResumeOff@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC499715842F5800758FF1 /* ResumeOff@2x.png */; }; A2DC499E15842F5800758FF1 /* ResumeOn@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC499815842F5800758FF1 /* ResumeOn@2x.png */; }; A2DC49A215842F9E00758FF1 /* RevealHover@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC499F15842F9D00758FF1 /* RevealHover@2x.png */; }; A2DC49A315842F9E00758FF1 /* RevealOff@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49A015842F9D00758FF1 /* RevealOff@2x.png */; }; A2DC49A415842F9E00758FF1 /* RevealOn@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49A115842F9D00758FF1 /* RevealOn@2x.png */; }; A2DC49A815842FC300758FF1 /* ToolbarCreateTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49A515842FC300758FF1 /* ToolbarCreateTemplate@2x.png */; }; A2DC49A915842FC300758FF1 /* ToolbarFilterTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49A615842FC300758FF1 /* ToolbarFilterTemplate@2x.png */; }; A2DC49AA15842FC300758FF1 /* ToolbarInfoTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49A715842FC300758FF1 /* ToolbarInfoTemplate@2x.png */; }; A2DC49AD15842FF200758FF1 /* ToolbarOpenTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49AB15842FF200758FF1 /* ToolbarOpenTemplate@2x.png */; }; A2DC49AE15842FF200758FF1 /* ToolbarOpenWebTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49AC15842FF200758FF1 /* ToolbarOpenWebTemplate@2x.png */; }; A2DC49B11584300D00758FF1 /* ToolbarPauseAllTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49AF1584300D00758FF1 /* ToolbarPauseAllTemplate@2x.png */; }; A2DC49B21584300D00758FF1 /* ToolbarPauseSelectedTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49B01584300D00758FF1 /* ToolbarPauseSelectedTemplate@2x.png */; }; A2DC49B61584303A00758FF1 /* ToolbarRemoveTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49B31584303A00758FF1 /* ToolbarRemoveTemplate@2x.png */; }; A2DC49B71584303A00758FF1 /* ToolbarResumeAllTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49B41584303A00758FF1 /* ToolbarResumeAllTemplate@2x.png */; }; A2DC49B81584303A00758FF1 /* ToolbarResumeSelectedTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49B51584303A00758FF1 /* ToolbarResumeSelectedTemplate@2x.png */; }; A2DC49BA1584307300758FF1 /* Transfers@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49B91584307300758FF1 /* Transfers@2x.png */; }; A2DC49BC1584309F00758FF1 /* TurtleTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49BB1584309F00758FF1 /* TurtleTemplate@2x.png */; }; A2DC49BF158430B300758FF1 /* UpArrowGroupTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49BD158430B300758FF1 /* UpArrowGroupTemplate@2x.png */; }; A2DC49C0158430B300758FF1 /* UpArrowTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49BE158430B300758FF1 /* UpArrowTemplate@2x.png */; }; A2DC49C2158430CB00758FF1 /* YellowDot@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49C1158430CA00758FF1 /* YellowDot@2x.png */; }; A2DC49C4158430E200758FF1 /* YingYangGroupTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49C3158430E200758FF1 /* YingYangGroupTemplate@2x.png */; }; A2DC49C6158430FB00758FF1 /* YingYangTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A2DC49C5158430FB00758FF1 /* YingYangTemplate@2x.png */; }; A2DF37070C220D03006523C1 /* CreatorWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = A2DF37050C220D03006523C1 /* CreatorWindowController.m */; }; A2E23AC60CB5E1930002BB25 /* InfoTabButtonCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A2E23AC40CB5E1930002BB25 /* InfoTabButtonCell.m */; }; A2E2EA920EE321C200EB6308 /* Groups.png in Resources */ = {isa = PBXBuildFile; fileRef = A2E2EA910EE321C200EB6308 /* Groups.png */; }; A2E384DA130DFB3A001F501B /* templates.h in Headers */ = {isa = PBXBuildFile; fileRef = A2E384D2130DFB3A001F501B /* templates.h */; }; A2E384DC130DFB3A001F501B /* utp_config.h in Headers */ = {isa = PBXBuildFile; fileRef = A2E384D4130DFB3A001F501B /* utp_config.h */; }; A2E384DD130DFB3A001F501B /* utp_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A2E384D5130DFB3A001F501B /* utp_utils.cpp */; }; A2E384DE130DFB3A001F501B /* utp_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = A2E384D6130DFB3A001F501B /* utp_utils.h */; }; A2E384DF130DFB3A001F501B /* utp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A2E384D7130DFB3A001F501B /* utp.cpp */; }; A2E384E0130DFB3A001F501B /* utp.h in Headers */ = {isa = PBXBuildFile; fileRef = A2E384D8130DFB3A001F501B /* utp.h */; }; A2E384E1130DFB3A001F501B /* utypes.h in Headers */ = {isa = PBXBuildFile; fileRef = A2E384D9130DFB3A001F501B /* utypes.h */; }; A2E3850C130DFCCB001F501B /* StdAfx.h in Headers */ = {isa = PBXBuildFile; fileRef = A2E3850B130DFCCB001F501B /* StdAfx.h */; }; A2E57ABB1310822C00A7DAB1 /* StatusBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = A2E57ABA1310822C00A7DAB1 /* StatusBarController.m */; }; A2E57AC61310831400A7DAB1 /* StatusBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = A2E57AC51310831400A7DAB1 /* StatusBar.xib */; }; A2E57B9C13109DC200A7DAB1 /* FilterBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = A2E57B9B13109DC200A7DAB1 /* FilterBar.xib */; }; A2E57BA713109E6B00A7DAB1 /* FilterBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = A2E57BA613109E6B00A7DAB1 /* FilterBarController.m */; }; A2E669790F5B8E5A00B4251A /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2E669780F5B8E5A00B4251A /* Security.framework */; }; A2E9AA760C249AF400085DCF /* ToolbarCreateTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A2E9AA750C249AF400085DCF /* ToolbarCreateTemplate.png */; }; A2EA52311686AC0D00180493 /* quark.c in Sources */ = {isa = PBXBuildFile; fileRef = A2EA522F1686AC0D00180493 /* quark.c */; }; A2EA52321686AC0D00180493 /* quark.h in Headers */ = {isa = PBXBuildFile; fileRef = A2EA52301686AC0D00180493 /* quark.h */; }; A2EB2E7715C8CF2C00FBD5B4 /* QuickLookPlugin.qlgenerator in CopyFiles */ = {isa = PBXBuildFile; fileRef = A2F35BB915C5A0A100EBF632 /* QuickLookPlugin.qlgenerator */; }; A2ED7D8F0CEF431B00970975 /* FilterButton.m in Sources */ = {isa = PBXBuildFile; fileRef = A2ED7D8E0CEF431B00970975 /* FilterButton.m */; }; A2EE726F14DCCC950093C99A /* natpmp_local.h in Headers */ = {isa = PBXBuildFile; fileRef = A2EE726E14DCCC950093C99A /* natpmp_local.h */; }; A2EF7DEC0C96297400FA9811 /* PurpleDot.png in Resources */ = {isa = PBXBuildFile; fileRef = A2EF7DEB0C96297400FA9811 /* PurpleDot.png */; }; A2F011990C27418800576FC0 /* CreateLarge.png in Resources */ = {isa = PBXBuildFile; fileRef = A2F011980C27418800576FC0 /* CreateLarge.png */; }; A2F151180CD438A4001F3B0E /* YellowDot.png in Resources */ = {isa = PBXBuildFile; fileRef = A2F151150CD438A4001F3B0E /* YellowDot.png */; }; A2F151190CD438A4001F3B0E /* RedDot.png in Resources */ = {isa = PBXBuildFile; fileRef = A2F151160CD438A4001F3B0E /* RedDot.png */; }; A2F1511A0CD438A4001F3B0E /* GreenDot.png in Resources */ = {isa = PBXBuildFile; fileRef = A2F151170CD438A4001F3B0E /* GreenDot.png */; }; A2F151200CD438BA001F3B0E /* Lock.png in Resources */ = {isa = PBXBuildFile; fileRef = A2F1511F0CD438BA001F3B0E /* Lock.png */; }; A2F35BBC15C5A0A100EBF632 /* QuickLook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2F35BBB15C5A0A100EBF632 /* QuickLook.framework */; }; A2F35BC815C5A0A100EBF632 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = A2F35BC615C5A0A100EBF632 /* InfoPlist.strings */; }; A2F35BCA15C5A0A100EBF632 /* GenerateThumbnailForURL.m in Sources */ = {isa = PBXBuildFile; fileRef = A2F35BC915C5A0A100EBF632 /* GenerateThumbnailForURL.m */; }; A2F35BCC15C5A0A100EBF632 /* GeneratePreviewForURL.m in Sources */ = {isa = PBXBuildFile; fileRef = A2F35BCB15C5A0A100EBF632 /* GeneratePreviewForURL.m */; }; A2F35BD415C5A19A00EBF632 /* libtransmission.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D18389709DEC0030047D688 /* libtransmission.a */; }; A2F35BD715C5A46D00EBF632 /* libcrypto.0.9.8.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A27653A714369C5C009D3CCF /* libcrypto.0.9.8.dylib */; }; A2F35BDA15C5A49200EBF632 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A2B6141B1395ADE9000E0975 /* libz.dylib */; }; A2F35BDB15C5A4A000EBF632 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A296EF3411E5605E004A2781 /* libiconv.dylib */; }; A2F35BE115C5A7ED00EBF632 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2F35BE015C5A7ED00EBF632 /* Cocoa.framework */; }; A2F35BE315C5A7F900EBF632 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2F35BE215C5A7F900EBF632 /* Foundation.framework */; }; A2F40AE40A361C00006B8288 /* Transmission.icns in Resources */ = {isa = PBXBuildFile; fileRef = 4D2784360905709500687951 /* Transmission.icns */; }; A2F41DAB0D0B916B006CE378 /* YingYangTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A2F41DAA0D0B916B006CE378 /* YingYangTemplate.png */; }; A2F41F8E0D73595100B82116 /* InfoTracker.png in Resources */ = {isa = PBXBuildFile; fileRef = A2F41F8D0D73595100B82116 /* InfoTracker.png */; }; A2F7CF5513035F7B0016FF10 /* URLSheetWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A2F7CF5413035F7B0016FF10 /* URLSheetWindow.xib */; }; A2F7CF5F13035FFD0016FF10 /* URLSheetWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = A2F7CF5E13035FFD0016FF10 /* URLSheetWindowController.m */; }; A2F8CD430F3D0F4A00DB356A /* miniupnpcstrings.h in Headers */ = {isa = PBXBuildFile; fileRef = A2F8CD420F3D0F4A00DB356A /* miniupnpcstrings.h */; }; A2FB057F0BFEB6800095564D /* DragOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = A2FB057D0BFEB6800095564D /* DragOverlayView.m */; }; A2FB701C0D95CAEA0001F331 /* GroupsController.m in Sources */ = {isa = PBXBuildFile; fileRef = A2FB701B0D95CAEA0001F331 /* GroupsController.m */; }; BE1183570CE160C50002D0F3 /* bsdqueue.h in Headers */ = {isa = PBXBuildFile; fileRef = BE11834D0CE160C50002D0F3 /* bsdqueue.h */; }; BE1183580CE160C50002D0F3 /* declspec.h in Headers */ = {isa = PBXBuildFile; fileRef = BE11834E0CE160C50002D0F3 /* declspec.h */; }; BE1183590CE160C50002D0F3 /* igd_desc_parse.h in Headers */ = {isa = PBXBuildFile; fileRef = BE11834F0CE160C50002D0F3 /* igd_desc_parse.h */; }; BE11835A0CE160C50002D0F3 /* minixml.h in Headers */ = {isa = PBXBuildFile; fileRef = BE1183500CE160C50002D0F3 /* minixml.h */; }; BE11835B0CE160C50002D0F3 /* miniwget.h in Headers */ = {isa = PBXBuildFile; fileRef = BE1183510CE160C50002D0F3 /* miniwget.h */; }; BE11835C0CE160C50002D0F3 /* minisoap.h in Headers */ = {isa = PBXBuildFile; fileRef = BE1183520CE160C50002D0F3 /* minisoap.h */; }; BE11835D0CE160C50002D0F3 /* upnpreplyparse.h in Headers */ = {isa = PBXBuildFile; fileRef = BE1183530CE160C50002D0F3 /* upnpreplyparse.h */; }; BE11835E0CE160C50002D0F3 /* upnpcommands.h in Headers */ = {isa = PBXBuildFile; fileRef = BE1183540CE160C50002D0F3 /* upnpcommands.h */; }; BE11835F0CE160C50002D0F3 /* miniupnpc.h in Headers */ = {isa = PBXBuildFile; fileRef = BE1183550CE160C50002D0F3 /* miniupnpc.h */; }; BE1183600CE160C50002D0F3 /* minissdpc.h in Headers */ = {isa = PBXBuildFile; fileRef = BE1183560CE160C50002D0F3 /* minissdpc.h */; }; BE1183690CE160D50002D0F3 /* igd_desc_parse.c in Sources */ = {isa = PBXBuildFile; fileRef = BE1183610CE160D50002D0F3 /* igd_desc_parse.c */; }; BE11836A0CE160D50002D0F3 /* minixml.c in Sources */ = {isa = PBXBuildFile; fileRef = BE1183620CE160D50002D0F3 /* minixml.c */; }; BE11836B0CE160D50002D0F3 /* miniwget.c in Sources */ = {isa = PBXBuildFile; fileRef = BE1183630CE160D50002D0F3 /* miniwget.c */; }; BE11836C0CE160D50002D0F3 /* minissdpc.c in Sources */ = {isa = PBXBuildFile; fileRef = BE1183640CE160D50002D0F3 /* minissdpc.c */; }; BE11836D0CE160D50002D0F3 /* minisoap.c in Sources */ = {isa = PBXBuildFile; fileRef = BE1183650CE160D50002D0F3 /* minisoap.c */; }; BE11836E0CE160D50002D0F3 /* upnpreplyparse.c in Sources */ = {isa = PBXBuildFile; fileRef = BE1183660CE160D50002D0F3 /* upnpreplyparse.c */; }; BE11836F0CE160D50002D0F3 /* upnpcommands.c in Sources */ = {isa = PBXBuildFile; fileRef = BE1183670CE160D50002D0F3 /* upnpcommands.c */; }; BE1183700CE160D50002D0F3 /* miniupnpc.c in Sources */ = {isa = PBXBuildFile; fileRef = BE1183680CE160D50002D0F3 /* miniupnpc.c */; }; BE1183780CE161390002D0F3 /* libminiupnp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BE1183480CE160960002D0F3 /* libminiupnp.a */; }; BE75C38A0C72A1ED00DBEFE0 /* libevent.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BE75C3490C729E9500DBEFE0 /* libevent.a */; }; BEFC1C050C07753500B0BB3C /* libtransmission.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D18389709DEC0030047D688 /* libtransmission.a */; }; BEFC1C1A0C07756200B0BB3C /* daemon.c in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1C0E0C07756200B0BB3C /* daemon.c */; }; BEFC1D050C07825A00B0BB3C /* remote.c in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1C140C07756200B0BB3C /* remote.c */; }; BEFC1D2D0C0783D900B0BB3C /* libtransmission.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D18389709DEC0030047D688 /* libtransmission.a */; }; BEFC1E290C07861A00B0BB3C /* version.h in Headers */ = {isa = PBXBuildFile; fileRef = BEFC1DF00C07861A00B0BB3C /* version.h */; }; BEFC1E2A0C07861A00B0BB3C /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = BEFC1DF10C07861A00B0BB3C /* utils.h */; }; BEFC1E2B0C07861A00B0BB3C /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1DF20C07861A00B0BB3C /* utils.c */; }; BEFC1E2C0C07861A00B0BB3C /* upnp.h in Headers */ = {isa = PBXBuildFile; fileRef = BEFC1DF30C07861A00B0BB3C /* upnp.h */; }; BEFC1E2D0C07861A00B0BB3C /* upnp.c in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1DF40C07861A00B0BB3C /* upnp.c */; }; BEFC1E2F0C07861A00B0BB3C /* session.c in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1DF60C07861A00B0BB3C /* session.c */; }; BEFC1E320C07861A00B0BB3C /* torrent.c in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1DF90C07861A00B0BB3C /* torrent.c */; }; BEFC1E350C07861A00B0BB3C /* port-forwarding.h in Headers */ = {isa = PBXBuildFile; fileRef = BEFC1DFC0C07861A00B0BB3C /* port-forwarding.h */; }; BEFC1E360C07861A00B0BB3C /* port-forwarding.c in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1DFD0C07861A00B0BB3C /* port-forwarding.c */; }; BEFC1E3B0C07861A00B0BB3C /* platform.h in Headers */ = {isa = PBXBuildFile; fileRef = BEFC1E020C07861A00B0BB3C /* platform.h */; }; BEFC1E3C0C07861A00B0BB3C /* platform.c in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1E030C07861A00B0BB3C /* platform.c */; }; BEFC1E450C07861A00B0BB3C /* net.h in Headers */ = {isa = PBXBuildFile; fileRef = BEFC1E0C0C07861A00B0BB3C /* net.h */; }; BEFC1E460C07861A00B0BB3C /* net.c in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1E0D0C07861A00B0BB3C /* net.c */; }; BEFC1E480C07861A00B0BB3C /* natpmp.c in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1E0F0C07861A00B0BB3C /* natpmp.c */; }; BEFC1E490C07861A00B0BB3C /* metainfo.h in Headers */ = {isa = PBXBuildFile; fileRef = BEFC1E100C07861A00B0BB3C /* metainfo.h */; }; BEFC1E4A0C07861A00B0BB3C /* metainfo.c in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1E110C07861A00B0BB3C /* metainfo.c */; }; BEFC1E4D0C07861A00B0BB3C /* session.h in Headers */ = {isa = PBXBuildFile; fileRef = BEFC1E140C07861A00B0BB3C /* session.h */; }; BEFC1E4E0C07861A00B0BB3C /* inout.h in Headers */ = {isa = PBXBuildFile; fileRef = BEFC1E150C07861A00B0BB3C /* inout.h */; }; BEFC1E4F0C07861A00B0BB3C /* inout.c in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1E160C07861A00B0BB3C /* inout.c */; }; BEFC1E520C07861A00B0BB3C /* fdlimit.h in Headers */ = {isa = PBXBuildFile; fileRef = BEFC1E190C07861A00B0BB3C /* fdlimit.h */; }; BEFC1E530C07861A00B0BB3C /* fdlimit.c in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1E1A0C07861A00B0BB3C /* fdlimit.c */; }; BEFC1E550C07861A00B0BB3C /* completion.h in Headers */ = {isa = PBXBuildFile; fileRef = BEFC1E1C0C07861A00B0BB3C /* completion.h */; }; BEFC1E560C07861A00B0BB3C /* completion.c in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1E1D0C07861A00B0BB3C /* completion.c */; }; BEFC1E570C07861A00B0BB3C /* clients.h in Headers */ = {isa = PBXBuildFile; fileRef = BEFC1E1E0C07861A00B0BB3C /* clients.h */; }; BEFC1E580C07861A00B0BB3C /* clients.c in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1E1F0C07861A00B0BB3C /* clients.c */; }; C1033E071A3279B800EF44D8 /* crypto-utils-fallback.c in Sources */ = {isa = PBXBuildFile; fileRef = C1033E031A3279B800EF44D8 /* crypto-utils-fallback.c */; }; C1033E081A3279B800EF44D8 /* crypto-utils-openssl.c in Sources */ = {isa = PBXBuildFile; fileRef = C1033E041A3279B800EF44D8 /* crypto-utils-openssl.c */; }; C1033E091A3279B800EF44D8 /* crypto-utils.c in Sources */ = {isa = PBXBuildFile; fileRef = C1033E051A3279B800EF44D8 /* crypto-utils.c */; }; C1033E0A1A3279B800EF44D8 /* crypto-utils.h in Headers */ = {isa = PBXBuildFile; fileRef = C1033E061A3279B800EF44D8 /* crypto-utils.h */; }; C1077A4E183EB29600634C22 /* error.c in Sources */ = {isa = PBXBuildFile; fileRef = C1077A4A183EB29600634C22 /* error.c */; }; C1077A4F183EB29600634C22 /* error.h in Headers */ = {isa = PBXBuildFile; fileRef = C1077A4B183EB29600634C22 /* error.h */; }; C1077A50183EB29600634C22 /* file-posix.c in Sources */ = {isa = PBXBuildFile; fileRef = C1077A4C183EB29600634C22 /* file-posix.c */; }; C1077A51183EB29600634C22 /* file.h in Headers */ = {isa = PBXBuildFile; fileRef = C1077A4D183EB29600634C22 /* file.h */; }; C1305EBE186A13B100F03351 /* file.c in Sources */ = {isa = PBXBuildFile; fileRef = C1305EB8186A134000F03351 /* file.c */; }; C15320211C82602500CC21E2 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8D1107310486CEB800E47090 /* Info.plist */; }; C1639A741A55F4E000E42033 /* libb64.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C1639A6F1A55F4D600E42033 /* libb64.a */; }; C1639A781A55F56600E42033 /* cdecode.c in Sources */ = {isa = PBXBuildFile; fileRef = C1639A761A55F56600E42033 /* cdecode.c */; }; C1639A791A55F56600E42033 /* cencode.c in Sources */ = {isa = PBXBuildFile; fileRef = C1639A771A55F56600E42033 /* cencode.c */; }; C1639A7C1A55F57200E42033 /* cdecode.h in Headers */ = {isa = PBXBuildFile; fileRef = C1639A7A1A55F57200E42033 /* cdecode.h */; }; C1639A7D1A55F57200E42033 /* cencode.h in Headers */ = {isa = PBXBuildFile; fileRef = C1639A7B1A55F57200E42033 /* cencode.h */; }; C1F690FD1AD0627500D95CF0 /* daemon-posix.c in Sources */ = {isa = PBXBuildFile; fileRef = C1F690FC1AD0627500D95CF0 /* daemon-posix.c */; }; C1FEE5771C3223CC00D62832 /* watchdir-common.h in Headers */ = {isa = PBXBuildFile; fileRef = C1FEE5721C3223CC00D62832 /* watchdir-common.h */; }; C1FEE5781C3223CC00D62832 /* watchdir-generic.c in Sources */ = {isa = PBXBuildFile; fileRef = C1FEE5731C3223CC00D62832 /* watchdir-generic.c */; }; C1FEE5791C3223CC00D62832 /* watchdir-kqueue.c in Sources */ = {isa = PBXBuildFile; fileRef = C1FEE5741C3223CC00D62832 /* watchdir-kqueue.c */; }; C1FEE57A1C3223CC00D62832 /* watchdir.c in Sources */ = {isa = PBXBuildFile; fileRef = C1FEE5751C3223CC00D62832 /* watchdir.c */; }; C1FEE57B1C3223CC00D62832 /* watchdir.h in Headers */ = {isa = PBXBuildFile; fileRef = C1FEE5761C3223CC00D62832 /* watchdir.h */; }; D4AF3B2F0C41F7A500D46B6B /* list.c in Sources */ = {isa = PBXBuildFile; fileRef = D4AF3B2D0C41F7A500D46B6B /* list.c */; }; D4AF3B300C41F7A600D46B6B /* list.h in Headers */ = {isa = PBXBuildFile; fileRef = D4AF3B2E0C41F7A500D46B6B /* list.h */; }; E138A9780C04D88F00C5426C /* ProgressGradients.m in Sources */ = {isa = PBXBuildFile; fileRef = E138A9760C04D88F00C5426C /* ProgressGradients.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 4D1838E509DEC1170047D688 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; remoteGlobalIDString = 4D18389609DEC0030047D688; remoteInfo = libtransmission; }; 4D9A2BF409E16D30002D0FF9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; remoteGlobalIDString = 4D18389609DEC0030047D688; remoteInfo = libtransmission; }; A226FDB00D0CDF6E005A7F71 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; remoteGlobalIDString = 3C7A118C0D0B2EB800B5701F; remoteInfo = natpmp; }; A22CFCC60FC24F990009BD3E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; remoteGlobalIDString = A22CFCB90FC24F710009BD3E; remoteInfo = DHT; }; A2E384E3130DFB51001F501B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; remoteGlobalIDString = A2E384CD130DFB1D001F501B; remoteInfo = libutp; }; A2EB2E7415C8CCE900FBD5B4 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; remoteGlobalIDString = A2F35BB815C5A0A100EBF632; remoteInfo = QuickLookPlugin; }; A2F35BD515C5A1A100EBF632 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; remoteGlobalIDString = 4D18389609DEC0030047D688; remoteInfo = libtransmission; }; BE1183750CE161040002D0F3 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; remoteGlobalIDString = BE1183470CE160960002D0F3; remoteInfo = miniupnp; }; BE75C34E0C729ED300DBEFE0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; remoteGlobalIDString = BE75C3480C729E9500DBEFE0; remoteInfo = event; }; BEFC1C020C07751A00B0BB3C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; remoteGlobalIDString = 4D18389609DEC0030047D688; remoteInfo = libtransmission; }; BEFC1CEC0C07822400B0BB3C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; remoteGlobalIDString = 4D18389609DEC0030047D688; remoteInfo = libtransmission; }; C165AB8C1A55FAA900D37711 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; remoteGlobalIDString = C1639A6E1A55F4D600E42033; remoteInfo = b64; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ A24F191B0A3A792300C9C145 /* Copy Files */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( A261F1E40A69A1B10002815A /* Growl.framework in Copy Files */, A24F19210A3A796800C9C145 /* Sparkle.framework in Copy Files */, ); name = "Copy Files"; runOnlyForDeploymentPostprocessing = 0; }; A2EB2E7615C8CF1C00FBD5B4 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = Contents/Library/QuickLook; dstSubfolderSpec = 1; files = ( A2EB2E7715C8CF2C00FBD5B4 /* QuickLookPlugin.qlgenerator in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 0A6169A50FE5C9A200C66CE6 /* bitfield.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bitfield.c; path = libtransmission/bitfield.c; sourceTree = ""; }; 0A6169A60FE5C9A200C66CE6 /* bitfield.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = bitfield.h; path = libtransmission/bitfield.h; sourceTree = ""; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = main.m; path = macosx/main.m; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* Transmission_Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Transmission_Prefix.pch; path = macosx/Transmission_Prefix.pch; sourceTree = ""; }; 35B037F90AC5B53800A10FDF /* ResumeNoWaitOn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ResumeNoWaitOn.png; path = macosx/Images/ResumeNoWaitOn.png; sourceTree = ""; }; 35B037FA0AC5B53800A10FDF /* ResumeNoWaitOff.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ResumeNoWaitOff.png; path = macosx/Images/ResumeNoWaitOff.png; sourceTree = ""; }; 35F373000C2DA88F00DAA8F2 /* FilePriorityCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FilePriorityCell.h; path = macosx/FilePriorityCell.h; sourceTree = ""; }; 35F373010C2DA88F00DAA8F2 /* FilePriorityCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = FilePriorityCell.m; path = macosx/FilePriorityCell.m; sourceTree = ""; }; 3C7A118D0D0B2EB800B5701F /* libnatpmp.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libnatpmp.a; sourceTree = BUILT_PRODUCTS_DIR; }; 3C7A11910D0B2EE300B5701F /* getgateway.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = getgateway.c; path = "third-party/libnatpmp/getgateway.c"; sourceTree = ""; }; 3C7A11920D0B2EE300B5701F /* getgateway.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = getgateway.h; path = "third-party/libnatpmp/getgateway.h"; sourceTree = ""; }; 3C7A11930D0B2EE300B5701F /* natpmp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = natpmp.c; path = "third-party/libnatpmp/natpmp.c"; sourceTree = ""; }; 3C7A11940D0B2EE300B5701F /* natpmp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = natpmp.h; path = "third-party/libnatpmp/natpmp.h"; sourceTree = ""; }; 4394AC640C74FB6000F367E8 /* ptrarray.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = ptrarray.c; path = libtransmission/ptrarray.c; sourceTree = ""; }; 4D043A7E090AE979009FEDA8 /* TransmissionDocument.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = TransmissionDocument.icns; path = macosx/Images/TransmissionDocument.icns; sourceTree = ""; }; 4D118E1808CB46B20033958F /* PrefsController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PrefsController.h; path = macosx/PrefsController.h; sourceTree = ""; }; 4D118E1908CB46B20033958F /* PrefsController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = PrefsController.m; path = macosx/PrefsController.m; sourceTree = ""; }; 4D18389709DEC0030047D688 /* libtransmission.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libtransmission.a; sourceTree = BUILT_PRODUCTS_DIR; }; 4D2784360905709500687951 /* Transmission.icns */ = {isa = PBXFileReference; explicitFileType = image.icns; name = Transmission.icns; path = macosx/Images/Transmission.icns; sourceTree = ""; }; 4D364D9E091FBB2C00377D12 /* TorrentTableView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TorrentTableView.h; path = macosx/TorrentTableView.h; sourceTree = ""; }; 4D364D9F091FBB2C00377D12 /* TorrentTableView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TorrentTableView.m; path = macosx/TorrentTableView.m; sourceTree = ""; }; 4D36BA600CA2F00800A63CA5 /* crypto.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = crypto.c; path = libtransmission/crypto.c; sourceTree = ""; }; 4D36BA610CA2F00800A63CA5 /* crypto.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = crypto.h; path = libtransmission/crypto.h; sourceTree = ""; }; 4D36BA630CA2F00800A63CA5 /* handshake.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = handshake.c; path = libtransmission/handshake.c; sourceTree = ""; }; 4D36BA640CA2F00800A63CA5 /* handshake.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = handshake.h; path = libtransmission/handshake.h; sourceTree = ""; }; 4D36BA650CA2F00800A63CA5 /* peer-io.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "peer-io.c"; path = "libtransmission/peer-io.c"; sourceTree = ""; }; 4D36BA660CA2F00800A63CA5 /* peer-io.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "peer-io.h"; path = "libtransmission/peer-io.h"; sourceTree = ""; }; 4D36BA680CA2F00800A63CA5 /* peer-mgr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "peer-mgr.c"; path = "libtransmission/peer-mgr.c"; sourceTree = ""; }; 4D36BA690CA2F00800A63CA5 /* peer-mgr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "peer-mgr.h"; path = "libtransmission/peer-mgr.h"; sourceTree = ""; }; 4D36BA6A0CA2F00800A63CA5 /* peer-msgs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "peer-msgs.c"; path = "libtransmission/peer-msgs.c"; sourceTree = ""; }; 4D36BA6B0CA2F00800A63CA5 /* peer-msgs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "peer-msgs.h"; path = "libtransmission/peer-msgs.h"; sourceTree = ""; }; 4D36BA6C0CA2F00800A63CA5 /* ptrarray.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ptrarray.h; path = libtransmission/ptrarray.h; sourceTree = ""; }; 4D3EA0A908AE13C600EA10C2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; 4D6DAAC4090CE00500F43C22 /* RevealOff.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = RevealOff.png; path = macosx/Images/RevealOff.png; sourceTree = ""; }; 4D6DAAC5090CE00500F43C22 /* RevealOn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = RevealOn.png; path = macosx/Images/RevealOn.png; sourceTree = ""; }; 4D8017E810BBC073008A4AF2 /* torrent-magnet.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "torrent-magnet.c"; path = "libtransmission/torrent-magnet.c"; sourceTree = ""; }; 4D8017E910BBC073008A4AF2 /* torrent-magnet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "torrent-magnet.h"; path = "libtransmission/torrent-magnet.h"; sourceTree = ""; }; 4D80185710BBC0B0008A4AF2 /* magnet.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = magnet.c; path = libtransmission/magnet.c; sourceTree = ""; }; 4D80185810BBC0B0008A4AF2 /* magnet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = magnet.h; path = libtransmission/magnet.h; sourceTree = ""; }; 4DA6FDB80911233800450CB1 /* PauseOn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PauseOn.png; path = macosx/Images/PauseOn.png; sourceTree = ""; }; 4DA6FDB90911233800450CB1 /* PauseOff.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PauseOff.png; path = macosx/Images/PauseOff.png; sourceTree = ""; }; 4DA6FDC3091141AD00450CB1 /* ResumeOff.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ResumeOff.png; path = macosx/Images/ResumeOff.png; sourceTree = ""; }; 4DA6FDC4091141AD00450CB1 /* ResumeOn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ResumeOn.png; path = macosx/Images/ResumeOn.png; sourceTree = ""; }; 4DB74F070E8CD75100AEB1A8 /* wildmat.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = wildmat.c; path = libtransmission/wildmat.c; sourceTree = ""; }; 4DCCBB3C09C3D71100D3CABF /* TorrentCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TorrentCell.m; path = macosx/TorrentCell.m; sourceTree = ""; }; 4DCCBB3D09C3D71100D3CABF /* TorrentCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TorrentCell.h; path = macosx/TorrentCell.h; sourceTree = ""; }; 4DDBB71909E16BAE00284745 /* transmissioncli */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = transmissioncli; sourceTree = BUILT_PRODUCTS_DIR; }; 4DDFDD20099A5D8E00189D81 /* DownloadBadge.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = DownloadBadge.png; path = macosx/Images/DownloadBadge.png; sourceTree = ""; }; 4DDFDD21099A5D8E00189D81 /* UploadBadge.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = UploadBadge.png; path = macosx/Images/UploadBadge.png; sourceTree = ""; }; 4DE5CC9B0980656F00BE280E /* NSStringAdditions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = NSStringAdditions.h; path = macosx/NSStringAdditions.h; sourceTree = ""; }; 4DE5CC9C0980656F00BE280E /* NSStringAdditions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = NSStringAdditions.m; path = macosx/NSStringAdditions.m; sourceTree = ""; }; 4DE5CCA50980735700BE280E /* Badger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Badger.h; path = macosx/Badger.h; sourceTree = ""; }; 4DE5CCA60980735700BE280E /* Badger.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Badger.m; path = macosx/Badger.m; sourceTree = ""; }; 4DE5CCB80981D27700BE280E /* ToolbarResumeAllTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ToolbarResumeAllTemplate.png; path = macosx/Images/ToolbarResumeAllTemplate.png; sourceTree = ""; }; 4DE5CCB90981D27700BE280E /* ToolbarPauseAllTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ToolbarPauseAllTemplate.png; path = macosx/Images/ToolbarPauseAllTemplate.png; sourceTree = ""; }; 4DE5CCCA0981D9BE00BE280E /* Defaults.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Defaults.plist; path = macosx/Defaults.plist; sourceTree = ""; }; 4DF0C5A90899190500DD8943 /* Controller.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Controller.m; path = macosx/Controller.m; sourceTree = ""; }; 4DF0C5AA0899190500DD8943 /* Controller.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Controller.h; path = macosx/Controller.h; sourceTree = ""; }; 4DF7500708A103AD007B0D70 /* ToolbarOpenTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ToolbarOpenTemplate.png; path = macosx/Images/ToolbarOpenTemplate.png; sourceTree = ""; }; 4DF7500808A103AD007B0D70 /* ToolbarInfoTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ToolbarInfoTemplate.png; path = macosx/Images/ToolbarInfoTemplate.png; sourceTree = ""; }; 4DF7500908A103AD007B0D70 /* ToolbarRemoveTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ToolbarRemoveTemplate.png; path = macosx/Images/ToolbarRemoveTemplate.png; sourceTree = ""; }; 4DFBC2DD09C0970D00D5C571 /* Torrent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Torrent.h; path = macosx/Torrent.h; sourceTree = ""; }; 4DFBC2DE09C0970D00D5C571 /* Torrent.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Torrent.m; path = macosx/Torrent.m; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = Info.plist; path = macosx/Info.plist; sourceTree = ""; }; 8D1107320486CEB800E47090 /* Transmission.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Transmission.app; sourceTree = BUILT_PRODUCTS_DIR; }; A200B8390A2263BA007BBB1E /* InfoWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InfoWindowController.h; path = macosx/InfoWindowController.h; sourceTree = ""; }; A200B83A0A2263BA007BBB1E /* InfoWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = InfoWindowController.m; path = macosx/InfoWindowController.m; sourceTree = ""; }; A2012AE10D77151D0056FD71 /* YingYangGroupTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = YingYangGroupTemplate.png; path = macosx/Images/YingYangGroupTemplate.png; sourceTree = ""; }; A20152630D1C1BE70081714F /* PinTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PinTemplate.png; path = macosx/Images/PinTemplate.png; sourceTree = ""; }; A20152790D1C26EB0081714F /* torrent-ctor.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "torrent-ctor.c"; path = "libtransmission/torrent-ctor.c"; sourceTree = ""; }; A20162C713DE48BF00E15488 /* receivedata.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = receivedata.c; path = "third-party/miniupnp/receivedata.c"; sourceTree = ""; }; A20162C813DE48BF00E15488 /* receivedata.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = receivedata.h; path = "third-party/miniupnp/receivedata.h"; sourceTree = ""; }; A20162CB13DE497000E15488 /* portlistingparse.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = portlistingparse.c; path = "third-party/miniupnp/portlistingparse.c"; sourceTree = ""; }; A20162CC13DE497000E15488 /* portlistingparse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = portlistingparse.h; path = "third-party/miniupnp/portlistingparse.h"; sourceTree = ""; }; A20162CF13DE49E500E15488 /* miniupnpctypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = miniupnpctypes.h; path = "third-party/miniupnp/miniupnpctypes.h"; sourceTree = ""; }; A202FF5B0DDA9275009938FF /* it */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = it; path = macosx/it.lproj/AddWindow.xib; sourceTree = ""; }; A202FF5C0DDA9275009938FF /* it */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = it; path = macosx/it.lproj/Creator.xib; sourceTree = ""; }; A202FF5D0DDA9275009938FF /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = macosx/it.lproj/InfoPlist.strings; sourceTree = ""; }; A202FF5F0DDA9275009938FF /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = macosx/it.lproj/Localizable.strings; sourceTree = ""; }; A202FF600DDA9275009938FF /* it */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = it; path = macosx/it.lproj/MainMenu.xib; sourceTree = ""; }; A202FF610DDA9275009938FF /* it */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = it; path = macosx/it.lproj/PrefsWindow.xib; sourceTree = ""; }; A2074F4B12BEA8CE00F70985 /* buffer.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = buffer.c; path = "third-party/libevent/buffer.c"; sourceTree = ""; }; A2074F5012BEA8E000F70985 /* bufferevent_filter.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bufferevent_filter.c; path = "third-party/libevent/bufferevent_filter.c"; sourceTree = ""; }; A2074F5112BEA8E000F70985 /* bufferevent_openssl.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bufferevent_openssl.c; path = "third-party/libevent/bufferevent_openssl.c"; sourceTree = ""; }; A2074F5212BEA8E000F70985 /* bufferevent_pair.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bufferevent_pair.c; path = "third-party/libevent/bufferevent_pair.c"; sourceTree = ""; }; A2074F5412BEA8E000F70985 /* bufferevent_sock.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bufferevent_sock.c; path = "third-party/libevent/bufferevent_sock.c"; sourceTree = ""; }; A2074F5512BEA8E000F70985 /* bufferevent.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bufferevent.c; path = "third-party/libevent/bufferevent.c"; sourceTree = ""; }; A2074F7312BEAA3300F70985 /* event.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = event.c; path = "third-party/libevent/event.c"; sourceTree = ""; }; A2074F8412BEAA6600F70985 /* evmap.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = evmap.c; path = "third-party/libevent/evmap.c"; sourceTree = ""; }; A2074F9812BEAAAF00F70985 /* evthread.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = evthread.c; path = "third-party/libevent/evthread.c"; sourceTree = ""; }; A2074FA212BEAAC600F70985 /* evutil.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = evutil.c; path = "third-party/libevent/evutil.c"; sourceTree = ""; }; A2074FAA12BEAAFF00F70985 /* http.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = http.c; path = "third-party/libevent/http.c"; sourceTree = ""; }; A2074FB612BEAB1E00F70985 /* listener.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = listener.c; path = "third-party/libevent/listener.c"; sourceTree = ""; }; A2074FBE12BEAB9A00F70985 /* kqueue.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = kqueue.c; path = "third-party/libevent/kqueue.c"; sourceTree = ""; }; A2074FC612BEABC800F70985 /* log.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = log.c; path = "third-party/libevent/log.c"; sourceTree = ""; }; A2074FDD12BEAC5000F70985 /* signal.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = signal.c; path = "third-party/libevent/signal.c"; sourceTree = ""; }; A207503412BEAD9C00F70985 /* select.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = select.c; path = "third-party/libevent/select.c"; sourceTree = ""; }; A207503612BEADA200F70985 /* poll.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = poll.c; path = "third-party/libevent/poll.c"; sourceTree = ""; }; A20750B712BEB66900F70985 /* bufferevent_ratelim.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bufferevent_ratelim.c; path = "third-party/libevent/bufferevent_ratelim.c"; sourceTree = ""; }; A2085DD90C53BC74000BC3B7 /* AboutWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AboutWindowController.h; path = macosx/AboutWindowController.h; sourceTree = ""; }; A2085DDA0C53BC74000BC3B7 /* AboutWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AboutWindowController.m; path = macosx/AboutWindowController.m; sourceTree = ""; }; A209EAC21142CF28002B02D1 /* InfoActivityViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InfoActivityViewController.h; path = macosx/InfoActivityViewController.h; sourceTree = ""; }; A209EAC31142CF28002B02D1 /* InfoActivityViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = InfoActivityViewController.m; path = macosx/InfoActivityViewController.m; sourceTree = ""; }; A209EAC41142CF28002B02D1 /* InfoGeneralViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InfoGeneralViewController.h; path = macosx/InfoGeneralViewController.h; sourceTree = ""; }; A209EAC51142CF28002B02D1 /* InfoGeneralViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = InfoGeneralViewController.m; path = macosx/InfoGeneralViewController.m; sourceTree = ""; }; A209EAEB1142D294002B02D1 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = macosx/en.lproj/InfoGeneralView.xib; sourceTree = ""; }; A209EAFF1142D3A5002B02D1 /* InfoTrackersViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InfoTrackersViewController.h; path = macosx/InfoTrackersViewController.h; sourceTree = ""; }; A209EB001142D3A5002B02D1 /* InfoTrackersViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = InfoTrackersViewController.m; path = macosx/InfoTrackersViewController.m; sourceTree = ""; }; A209EB1F1142DD85002B02D1 /* InfoTrackersView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = InfoTrackersView.xib; path = macosx/InfoTrackersView.xib; sourceTree = ""; }; A209EB9B1142E59A002B02D1 /* InfoPeersViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InfoPeersViewController.h; path = macosx/InfoPeersViewController.h; sourceTree = ""; }; A209EB9C1142E59A002B02D1 /* InfoPeersViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = InfoPeersViewController.m; path = macosx/InfoPeersViewController.m; sourceTree = ""; }; A209EBA61142EAF3002B02D1 /* InfoPeersView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = InfoPeersView.xib; path = macosx/InfoPeersView.xib; sourceTree = ""; }; A209EBCC1142F2B4002B02D1 /* InfoFileViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InfoFileViewController.h; path = macosx/InfoFileViewController.h; sourceTree = ""; }; A209EBCD1142F2B4002B02D1 /* InfoFileViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = InfoFileViewController.m; path = macosx/InfoFileViewController.m; sourceTree = ""; }; A209EBD81142F52B002B02D1 /* InfoFileView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = InfoFileView.xib; path = macosx/InfoFileView.xib; sourceTree = ""; }; A209EBF71142FEEE002B02D1 /* InfoOptionsViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InfoOptionsViewController.h; path = macosx/InfoOptionsViewController.h; sourceTree = ""; }; A209EBF81142FEEE002B02D1 /* InfoOptionsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = InfoOptionsViewController.m; path = macosx/InfoOptionsViewController.m; sourceTree = ""; }; A209EC13114301C6002B02D1 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = macosx/en.lproj/InfoOptionsView.xib; sourceTree = ""; }; A209ECA1114319C3002B02D1 /* InfoWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = InfoWindow.xib; path = macosx/InfoWindow.xib; sourceTree = ""; }; A209EE5A1144B51E002B02D1 /* history.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = history.c; path = libtransmission/history.c; sourceTree = ""; }; A209EE5B1144B51E002B02D1 /* history.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = history.h; path = libtransmission/history.h; sourceTree = ""; }; A20B6F6A0C4D842B0034AB1D /* PriorityLowTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PriorityLowTemplate.png; path = macosx/Images/PriorityLowTemplate.png; sourceTree = ""; }; A20B6F820C4D8A610034AB1D /* PriorityHighTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PriorityHighTemplate.png; path = macosx/Images/PriorityHighTemplate.png; sourceTree = ""; }; A20B6FAD0C4D9B040034AB1D /* PriorityNormalTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PriorityNormalTemplate.png; path = macosx/Images/PriorityNormalTemplate.png; sourceTree = ""; }; A20BFFB50D091CC700CE5D2B /* ToolbarSegmentedCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ToolbarSegmentedCell.h; path = macosx/ToolbarSegmentedCell.h; sourceTree = ""; }; A20BFFB60D091CC700CE5D2B /* ToolbarSegmentedCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ToolbarSegmentedCell.m; path = macosx/ToolbarSegmentedCell.m; sourceTree = ""; }; A21282A50CA6C66800EAEE0F /* StatusBarView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = StatusBarView.h; path = macosx/StatusBarView.h; sourceTree = ""; }; A21282A60CA6C66800EAEE0F /* StatusBarView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = StatusBarView.m; path = macosx/StatusBarView.m; sourceTree = ""; }; A215BF5D0F02EBB800350CDB /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = macosx/en.lproj/GroupRules.xib; sourceTree = ""; }; A21979890D07B78400438EA7 /* GroupToolbarItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GroupToolbarItem.h; path = macosx/GroupToolbarItem.h; sourceTree = ""; }; A219798A0D07B78400438EA7 /* GroupToolbarItem.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = GroupToolbarItem.m; path = macosx/GroupToolbarItem.m; sourceTree = ""; }; A21A9BE0106D86A800F1C3C1 /* TrackerNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TrackerNode.h; path = macosx/TrackerNode.h; sourceTree = ""; }; A21A9BE1106D86A800F1C3C1 /* TrackerNode.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TrackerNode.m; path = macosx/TrackerNode.m; sourceTree = ""; }; A21A9D3F106EC2E800F1C3C1 /* TrackerCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TrackerCell.h; path = macosx/TrackerCell.h; sourceTree = ""; }; A21A9D40106EC2E800F1C3C1 /* TrackerCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TrackerCell.m; path = macosx/TrackerCell.m; sourceTree = ""; }; A21DFF0F0A292B2B007C5F76 /* Transfers.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Transfers.png; path = macosx/Images/Transfers.png; sourceTree = ""; }; A21F1539117299F100CF5A9C /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = macosx/en.lproj/AddMagnetWindow.xib; sourceTree = ""; }; A21F15AA11729A8B00CF5A9C /* AddMagnetWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AddMagnetWindowController.m; path = macosx/AddMagnetWindowController.m; sourceTree = ""; }; A21F15AB11729A8B00CF5A9C /* AddMagnetWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AddMagnetWindowController.h; path = macosx/AddMagnetWindowController.h; sourceTree = ""; }; A21FBBA90EDA78C300BC3C51 /* bandwidth.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = bandwidth.h; path = libtransmission/bandwidth.h; sourceTree = ""; }; A21FBBAA0EDA78C300BC3C51 /* bandwidth.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bandwidth.c; path = libtransmission/bandwidth.c; sourceTree = ""; }; A220AF7A13D7CC460035C512 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = macosx/en.lproj/GlobalOptionsPopover.xib; sourceTree = ""; }; A220EC59118C8A060022B4BE /* tr-lpd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tr-lpd.c"; path = "libtransmission/tr-lpd.c"; sourceTree = ""; }; A220EC5A118C8A060022B4BE /* tr-lpd.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "tr-lpd.h"; path = "libtransmission/tr-lpd.h"; sourceTree = ""; }; A220EE6611A8382C0022B4BE /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = macosx/de.lproj/AddMagnetWindow.xib; sourceTree = ""; }; A220EE6911A838450022B4BE /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = macosx/de.lproj/InfoActivityView.xib; sourceTree = ""; }; A220EE6A11A838640022B4BE /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = macosx/de.lproj/InfoGeneralView.xib; sourceTree = ""; }; A220EE6B11A838750022B4BE /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = macosx/de.lproj/InfoOptionsView.xib; sourceTree = ""; }; A220EE9B11A841F50022B4BE /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = macosx/en.lproj/InfoActivityView.xib; sourceTree = ""; }; A220EED011AB3F8F0022B4BE /* it */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = it; path = macosx/it.lproj/AddMagnetWindow.xib; sourceTree = ""; }; A220EED211AB3F9B0022B4BE /* it */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = it; path = macosx/it.lproj/InfoActivityView.xib; sourceTree = ""; }; A220EED311AB3F9B0022B4BE /* it */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = it; path = macosx/it.lproj/InfoGeneralView.xib; sourceTree = ""; }; A220EED411AB3F9B0022B4BE /* it */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = it; path = macosx/it.lproj/InfoOptionsView.xib; sourceTree = ""; }; A220EED911AE95CE0022B4BE /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = macosx/es.lproj/AddMagnetWindow.xib; sourceTree = ""; }; A220EEDA11AE95CE0022B4BE /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = macosx/es.lproj/InfoActivityView.xib; sourceTree = ""; }; A220EEDB11AE95CE0022B4BE /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = macosx/es.lproj/InfoGeneralView.xib; sourceTree = ""; }; A220EEDC11AE95CE0022B4BE /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = macosx/es.lproj/InfoOptionsView.xib; sourceTree = ""; }; A220EEEE11B070A40022B4BE /* ru */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ru; path = macosx/ru.lproj/AddMagnetWindow.xib; sourceTree = ""; }; A220EEEF11B070A50022B4BE /* ru */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ru; path = macosx/ru.lproj/InfoActivityView.xib; sourceTree = ""; }; A220EEF011B070A50022B4BE /* ru */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ru; path = macosx/ru.lproj/InfoGeneralView.xib; sourceTree = ""; }; A220EEF111B070A50022B4BE /* ru */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ru; path = macosx/ru.lproj/InfoOptionsView.xib; sourceTree = ""; }; A22180960D148A71007D09ED /* GroupsPrefsController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GroupsPrefsController.h; path = macosx/GroupsPrefsController.h; sourceTree = ""; }; A22180970D148A71007D09ED /* GroupsPrefsController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = GroupsPrefsController.m; path = macosx/GroupsPrefsController.m; sourceTree = ""; }; A221DCC7104B3660008A642D /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = /System/Library/Frameworks/Quartz.framework; sourceTree = ""; }; A222E9850E6B21D9009FB003 /* BlocklistDownloaderViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BlocklistDownloaderViewController.h; path = macosx/BlocklistDownloaderViewController.h; sourceTree = ""; }; A222E9860E6B21D9009FB003 /* BlocklistDownloaderViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = BlocklistDownloaderViewController.m; path = macosx/BlocklistDownloaderViewController.m; sourceTree = ""; }; A222EA790E6C32C4009FB003 /* BlocklistScheduler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BlocklistScheduler.h; path = macosx/BlocklistScheduler.h; sourceTree = ""; }; A222EA7A0E6C32C4009FB003 /* BlocklistScheduler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = BlocklistScheduler.m; path = macosx/BlocklistScheduler.m; sourceTree = ""; }; A223AA7D0D220CEB00840069 /* nl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nl; path = macosx/nl.lproj/Creator.xib; sourceTree = ""; }; A223AA7E0D220CEB00840069 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = macosx/nl.lproj/InfoPlist.strings; sourceTree = ""; }; A223AA800D220CEB00840069 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = macosx/nl.lproj/Localizable.strings; sourceTree = ""; }; A223AA810D220CEB00840069 /* nl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nl; path = macosx/nl.lproj/MainMenu.xib; sourceTree = ""; }; A223AA830D220CEB00840069 /* nl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nl; path = macosx/nl.lproj/PrefsWindow.xib; sourceTree = ""; }; A225A4BE187E369C00CDE823 /* ShareToolbarItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ShareToolbarItem.h; path = macosx/ShareToolbarItem.h; sourceTree = ""; }; A225A4BF187E369C00CDE823 /* ShareToolbarItem.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ShareToolbarItem.m; path = macosx/ShareToolbarItem.m; sourceTree = ""; }; A2265F3F0B5EF5F40093DDA5 /* FileNameCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FileNameCell.h; path = macosx/FileNameCell.h; sourceTree = ""; }; A2265F400B5EF5F40093DDA5 /* FileNameCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = FileNameCell.m; path = macosx/FileNameCell.m; sourceTree = ""; }; A2290D2D1442B23200B95A09 /* libcurl.4.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libcurl.4.dylib; path = "third-party/curl/lib/libcurl.4.dylib"; sourceTree = ""; }; A22B00AE116A9E90003315FC /* connecthostport.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = connecthostport.c; path = "third-party/miniupnp/connecthostport.c"; sourceTree = ""; }; A22B00AF116A9E90003315FC /* connecthostport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = connecthostport.h; path = "third-party/miniupnp/connecthostport.h"; sourceTree = ""; }; A22BAE261388040500FB022F /* NSMutableArrayAdditions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = NSMutableArrayAdditions.h; path = macosx/NSMutableArrayAdditions.h; sourceTree = ""; }; A22BAE271388040500FB022F /* NSMutableArrayAdditions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = NSMutableArrayAdditions.m; path = macosx/NSMutableArrayAdditions.m; sourceTree = ""; }; A22CF7AC0FA3505F0009BD3E /* it */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = it; path = macosx/it.lproj/GroupRules.xib; sourceTree = ""; }; A22CF7B90FA352740009BD3E /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = macosx/fr.lproj/GroupRules.xib; sourceTree = ""; }; A22CF7C90FA5D3F90009BD3E /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = macosx/es.lproj/GroupRules.xib; sourceTree = ""; }; A22CF7CC0FA5E2DB0009BD3E /* nl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nl; path = macosx/nl.lproj/GroupRules.xib; sourceTree = ""; }; A22CF7D10FA6A19B0009BD3E /* ru */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ru; path = macosx/ru.lproj/GroupRules.xib; sourceTree = ""; }; A22CFB810FB66EF30009BD3E /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; A22CFCA60FC24ED80009BD3E /* tr-dht.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tr-dht.c"; path = "libtransmission/tr-dht.c"; sourceTree = ""; }; A22CFCA70FC24ED80009BD3E /* tr-dht.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "tr-dht.h"; path = "libtransmission/tr-dht.h"; sourceTree = ""; }; A22CFCBA0FC24F710009BD3E /* libdht.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libdht.a; sourceTree = BUILT_PRODUCTS_DIR; }; A22CFCC00FC24F890009BD3E /* dht.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = dht.h; path = "third-party/dht/dht.h"; sourceTree = ""; }; A22CFCC10FC24F890009BD3E /* dht.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = dht.c; path = "third-party/dht/dht.c"; sourceTree = ""; }; A22D3AA30D00D1790079CFED /* TurtleTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = TurtleTemplate.png; path = macosx/Images/TurtleTemplate.png; sourceTree = ""; }; A22F1E540E7DA8030065DB9D /* sparkle_dsa_pub.pem */ = {isa = PBXFileReference; lastKnownFileType = text; name = sparkle_dsa_pub.pem; path = macosx/sparkle_dsa_pub.pem; sourceTree = ""; }; A231274B0D11D0B7003F9AFF /* AboutWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = AboutWindow.xib; path = macosx/AboutWindow.xib; sourceTree = ""; }; A232D29D0A70903E00973B12 /* ToolbarFilterTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ToolbarFilterTemplate.png; path = macosx/Images/ToolbarFilterTemplate.png; sourceTree = ""; }; A232F07C0EEA034A00041646 /* BonjourController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BonjourController.h; path = macosx/BonjourController.h; sourceTree = ""; }; A232F07D0EEA034A00041646 /* BonjourController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = BonjourController.m; path = macosx/BonjourController.m; sourceTree = ""; }; A233BD320D8C6585007EE7B4 /* MessageWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MessageWindow.xib; path = macosx/MessageWindow.xib; sourceTree = ""; }; A233BD680D8CF2C7007EE7B4 /* StatsWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = StatsWindow.xib; path = macosx/StatsWindow.xib; sourceTree = ""; }; A234EA521453563B000F3E97 /* NSImageAdditions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = NSImageAdditions.h; path = macosx/NSImageAdditions.h; sourceTree = ""; }; A234EA531453563B000F3E97 /* NSImageAdditions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = NSImageAdditions.m; path = macosx/NSImageAdditions.m; sourceTree = ""; }; A23547E011CD0B090046EAE6 /* cache.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cache.c; path = libtransmission/cache.c; sourceTree = ""; }; A23547E111CD0B090046EAE6 /* cache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cache.h; path = libtransmission/cache.h; sourceTree = ""; }; A236D19215F6BB54000C3DD4 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = macosx/QuickLookPlugin/es.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; }; A236D19415F6BCB2000C3DD4 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = macosx/QuickLookPlugin/da.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; }; A236D19615F6BD9C000C3DD4 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = macosx/QuickLookPlugin/it.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; }; A2385DD20BFE06C800B24EF6 /* DragOverlayWindow.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = DragOverlayWindow.m; path = macosx/DragOverlayWindow.m; sourceTree = ""; }; A2385DD30BFE06C800B24EF6 /* DragOverlayWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DragOverlayWindow.h; path = macosx/DragOverlayWindow.h; sourceTree = ""; }; A23D5DA61320570800E422BA /* CleanupTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = CleanupTemplate.png; path = macosx/Images/CleanupTemplate.png; sourceTree = ""; }; A23F299F132A447400E9A83B /* announcer-common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "announcer-common.h"; path = "libtransmission/announcer-common.h"; sourceTree = ""; }; A23F29A0132A447400E9A83B /* announcer-http.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "announcer-http.c"; path = "libtransmission/announcer-http.c"; sourceTree = ""; }; A23F526D0F14395900AA02E3 /* PredicateEditorRowTemplateAny.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PredicateEditorRowTemplateAny.h; path = macosx/PredicateEditorRowTemplateAny.h; sourceTree = ""; }; A23F526E0F14395900AA02E3 /* PredicateEditorRowTemplateAny.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = PredicateEditorRowTemplateAny.m; path = macosx/PredicateEditorRowTemplateAny.m; sourceTree = ""; }; A23FAE52178BC2950053DC5B /* platform-quota.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "platform-quota.c"; path = "libtransmission/platform-quota.c"; sourceTree = ""; }; A23FAE53178BC2950053DC5B /* platform-quota.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "platform-quota.h"; path = "libtransmission/platform-quota.h"; sourceTree = ""; }; A242AD9215F05D23002B3A6C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = macosx/QuickLookPlugin/en.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; }; A245030B0D6A1FB000B49D00 /* UpArrowGroupTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = UpArrowGroupTemplate.png; path = macosx/Images/UpArrowGroupTemplate.png; sourceTree = ""; }; A245030D0D6A1FBC00B49D00 /* DownArrowGroupTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = DownArrowGroupTemplate.png; path = macosx/Images/DownArrowGroupTemplate.png; sourceTree = ""; }; A2451E6616ACE4EB00586E0E /* FileRenameSheetController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FileRenameSheetController.h; path = macosx/FileRenameSheetController.h; sourceTree = ""; }; A2451E6716ACE4EB00586E0E /* FileRenameSheetController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = FileRenameSheetController.m; path = macosx/FileRenameSheetController.m; sourceTree = ""; }; A2451E6816ACE4EB00586E0E /* FileRenameSheetController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = FileRenameSheetController.xib; path = macosx/FileRenameSheetController.xib; sourceTree = ""; }; A24621350C769CF400088E81 /* trevent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = trevent.h; path = libtransmission/trevent.h; sourceTree = ""; }; A24621360C769CF400088E81 /* trevent.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = trevent.c; path = libtransmission/trevent.c; sourceTree = ""; }; A247A442114C701800547DFC /* InfoViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InfoViewController.h; path = macosx/InfoViewController.h; sourceTree = ""; }; A24B655F0D3F30870079EA4D /* QuitBadge.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = QuitBadge.png; path = macosx/Images/QuitBadge.png; sourceTree = ""; }; A24F19070A3A790800C9C145 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = macosx/Sparkle.framework; sourceTree = ""; }; A250EE800E2ED87B00A688E6 /* web */ = {isa = PBXFileReference; lastKnownFileType = folder; path = web; sourceTree = ""; }; A25485390EB66CBB004539DA /* codelength.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = codelength.h; path = "third-party/miniupnp/codelength.h"; sourceTree = ""; }; A256588A0A9A695400E8A03B /* MessageWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MessageWindowController.h; path = macosx/MessageWindowController.h; sourceTree = ""; }; A256588B0A9A695400E8A03B /* MessageWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MessageWindowController.m; path = macosx/MessageWindowController.m; sourceTree = ""; }; A257C17F0CAD3003004E121C /* PeerTableView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PeerTableView.h; path = macosx/PeerTableView.h; sourceTree = ""; }; A257C1800CAD3003004E121C /* PeerTableView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = PeerTableView.m; path = macosx/PeerTableView.m; sourceTree = ""; }; A25892620CF1F7E800CCCDDF /* StatsWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = StatsWindowController.h; path = macosx/StatsWindowController.h; sourceTree = ""; }; A25892630CF1F7E800CCCDDF /* StatsWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = StatsWindowController.m; path = macosx/StatsWindowController.m; sourceTree = ""; }; A259316A0A73B2CC002F4FE7 /* TransmissionHelp */ = {isa = PBXFileReference; lastKnownFileType = folder; name = TransmissionHelp; path = macosx/TransmissionHelp; sourceTree = ""; }; A25963E01068376200453B31 /* FavIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = FavIcon.png; path = macosx/Images/FavIcon.png; sourceTree = ""; }; A25964A4106D73A800453B31 /* announcer.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = announcer.c; path = libtransmission/announcer.c; sourceTree = ""; }; A25964A5106D73A800453B31 /* announcer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = announcer.h; path = libtransmission/announcer.h; sourceTree = ""; }; A25BB02812F4F517004B724E /* InfoTabButtonBack.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InfoTabButtonBack.h; path = macosx/InfoTabButtonBack.h; sourceTree = ""; }; A25BB02912F4F517004B724E /* InfoTabButtonBack.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = InfoTabButtonBack.m; path = macosx/InfoTabButtonBack.m; sourceTree = ""; }; A25BFD63167BED3B0039D1AA /* variant-benc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "variant-benc.c"; path = "libtransmission/variant-benc.c"; sourceTree = ""; }; A25BFD64167BED3B0039D1AA /* variant-common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "variant-common.h"; path = "libtransmission/variant-common.h"; sourceTree = ""; }; A25BFD65167BED3B0039D1AA /* variant-json.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "variant-json.c"; path = "libtransmission/variant-json.c"; sourceTree = ""; }; A25BFD67167BED3B0039D1AA /* variant.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = variant.c; path = libtransmission/variant.c; sourceTree = ""; }; A25BFD68167BED3B0039D1AA /* variant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = variant.h; path = libtransmission/variant.h; sourceTree = ""; }; A25D2CBA0CF4C7190096A262 /* stats.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = stats.h; path = libtransmission/stats.h; sourceTree = ""; }; A25D2CBB0CF4C7190096A262 /* stats.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = stats.c; path = libtransmission/stats.c; sourceTree = ""; }; A25E03E00E4015380086C225 /* tr-getopt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "tr-getopt.h"; path = "libtransmission/tr-getopt.h"; sourceTree = ""; }; A25E03E10E4015380086C225 /* tr-getopt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tr-getopt.c"; path = "libtransmission/tr-getopt.c"; sourceTree = ""; }; A25E74440AF5089E006F11AE /* ExpandedPathToPathTransformer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ExpandedPathToPathTransformer.m; path = macosx/ExpandedPathToPathTransformer.m; sourceTree = ""; }; A25E74450AF5089E006F11AE /* ExpandedPathToPathTransformer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ExpandedPathToPathTransformer.h; path = macosx/ExpandedPathToPathTransformer.h; sourceTree = ""; }; A25E74460AF5089E006F11AE /* ExpandedPathToIconTransformer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ExpandedPathToIconTransformer.m; path = macosx/ExpandedPathToIconTransformer.m; sourceTree = ""; }; A25E74470AF5089E006F11AE /* ExpandedPathToIconTransformer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ExpandedPathToIconTransformer.h; path = macosx/ExpandedPathToIconTransformer.h; sourceTree = ""; }; A25FCDDD0A37695F002BCBBE /* ToolbarPauseSelectedTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ToolbarPauseSelectedTemplate.png; path = macosx/Images/ToolbarPauseSelectedTemplate.png; sourceTree = ""; }; A25FCDDE0A37695F002BCBBE /* ToolbarResumeSelectedTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ToolbarResumeSelectedTemplate.png; path = macosx/Images/ToolbarResumeSelectedTemplate.png; sourceTree = ""; }; A2613F9111B3383200472893 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = macosx/pt_PT.lproj/AddMagnetWindow.xib; sourceTree = ""; }; A2613F9211B3383200472893 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = macosx/pt_PT.lproj/AddWindow.xib; sourceTree = ""; }; A2613F9311B3383200472893 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = macosx/pt_PT.lproj/Creator.xib; sourceTree = ""; }; A2613F9411B3383200472893 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = macosx/pt_PT.lproj/GroupRules.xib; sourceTree = ""; }; A2613F9511B3383200472893 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = macosx/pt_PT.lproj/InfoActivityView.xib; sourceTree = ""; }; A2613F9611B3383200472893 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = macosx/pt_PT.lproj/InfoGeneralView.xib; sourceTree = ""; }; A2613F9711B3383200472893 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = macosx/pt_PT.lproj/InfoOptionsView.xib; sourceTree = ""; }; A2613F9811B3383200472893 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt_PT; path = macosx/pt_PT.lproj/InfoPlist.strings; sourceTree = ""; }; A2613F9911B3383200472893 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt_PT; path = macosx/pt_PT.lproj/Localizable.strings; sourceTree = ""; }; A2613F9A11B3383200472893 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = macosx/pt_PT.lproj/MainMenu.xib; sourceTree = ""; }; A2613F9B11B3383200472893 /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = macosx/pt_PT.lproj/PrefsWindow.xib; sourceTree = ""; }; A26146E00DD4A0160060F033 /* GroupsNoneTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = GroupsNoneTemplate.png; path = macosx/Images/GroupsNoneTemplate.png; sourceTree = ""; }; A261F1DB0A69A1610002815A /* Growl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Growl.framework; path = macosx/Growl.framework; sourceTree = ""; }; A2623B2C0D3DC2EF0045D19A /* PriorityControlNormal.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PriorityControlNormal.png; path = macosx/Images/PriorityControlNormal.png; sourceTree = ""; }; A2623B2D0D3DC2EF0045D19A /* PriorityControlLow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PriorityControlLow.png; path = macosx/Images/PriorityControlLow.png; sourceTree = ""; }; A2623B2E0D3DC2EF0045D19A /* PriorityControlHigh.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PriorityControlHigh.png; path = macosx/Images/PriorityControlHigh.png; sourceTree = ""; }; A2623B3B0D3DC5930045D19A /* ResumeNoWaitHover.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ResumeNoWaitHover.png; path = macosx/Images/ResumeNoWaitHover.png; sourceTree = ""; }; A2623B3C0D3DC5930045D19A /* RevealHover.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = RevealHover.png; path = macosx/Images/RevealHover.png; sourceTree = ""; }; A2623B3D0D3DC5930045D19A /* ResumeHover.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ResumeHover.png; path = macosx/Images/ResumeHover.png; sourceTree = ""; }; A2623B3E0D3DC5930045D19A /* PauseHover.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PauseHover.png; path = macosx/Images/PauseHover.png; sourceTree = ""; }; A2623B4D0D3DC6DF0045D19A /* ActionHover.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ActionHover.png; path = macosx/Images/ActionHover.png; sourceTree = ""; }; A263C5651560A35B0082A3D1 /* da */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = da; path = macosx/da.lproj/MainMenu.xib; sourceTree = ""; }; A263C5661560A3CF0082A3D1 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = macosx/da.lproj/Localizable.strings; sourceTree = ""; }; A263C5671560A4210082A3D1 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = macosx/da.lproj/InfoPlist.strings; sourceTree = ""; }; A263C5681560A4290082A3D1 /* da */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = da; path = macosx/da.lproj/PrefsWindow.xib; sourceTree = ""; }; A263C5691560A4310082A3D1 /* da */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = da; path = macosx/da.lproj/Creator.xib; sourceTree = ""; }; A263C56A1560A4370082A3D1 /* da */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = da; path = macosx/da.lproj/AddWindow.xib; sourceTree = ""; }; A263C56B1560A43A0082A3D1 /* da */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = da; path = macosx/da.lproj/AddMagnetWindow.xib; sourceTree = ""; }; A263C56C1560A43E0082A3D1 /* da */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = da; path = macosx/da.lproj/GroupRules.xib; sourceTree = ""; }; A263C56D1560A4420082A3D1 /* da */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = da; path = macosx/da.lproj/InfoGeneralView.xib; sourceTree = ""; }; A263C56E1560A4470082A3D1 /* da */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = da; path = macosx/da.lproj/InfoActivityView.xib; sourceTree = ""; }; A263C56F1560A44B0082A3D1 /* da */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = da; path = macosx/da.lproj/InfoOptionsView.xib; sourceTree = ""; }; A263C5701560A44F0082A3D1 /* da */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = da; path = macosx/da.lproj/GlobalOptionsPopover.xib; sourceTree = ""; }; A263CFBE10DD67670038DE27 /* InfoTextField.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InfoTextField.h; path = macosx/InfoTextField.h; sourceTree = ""; }; A263CFBF10DD67670038DE27 /* InfoTextField.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = InfoTextField.m; path = macosx/InfoTextField.m; sourceTree = ""; }; A263D03D10DE6F010038DE27 /* Magnet.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Magnet.png; path = macosx/Images/Magnet.png; sourceTree = ""; }; A265A32E0D25767700198AC8 /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = macosx/fr.lproj/Creator.xib; sourceTree = ""; }; A265A3300D25767700198AC8 /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = macosx/fr.lproj/MainMenu.xib; sourceTree = ""; }; A265A3320D25767700198AC8 /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = macosx/fr.lproj/PrefsWindow.xib; sourceTree = ""; }; A265A3BE0D25AE7800198AC8 /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = macosx/es.lproj/Creator.xib; sourceTree = ""; }; A265A3C00D25AE7800198AC8 /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = macosx/es.lproj/MainMenu.xib; sourceTree = ""; }; A265A3C20D25AE7800198AC8 /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = macosx/es.lproj/PrefsWindow.xib; sourceTree = ""; }; A2661D3A12D0E51A004F69D5 /* FilterBarView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FilterBarView.h; path = macosx/FilterBarView.h; sourceTree = ""; }; A2661D3B12D0E51B004F69D5 /* FilterBarView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = FilterBarView.m; path = macosx/FilterBarView.m; sourceTree = ""; }; A2679292130E00A000CB7464 /* tr-utp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tr-utp.c"; path = "libtransmission/tr-utp.c"; sourceTree = ""; }; A2679293130E00A000CB7464 /* tr-utp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "tr-utp.h"; path = "libtransmission/tr-utp.h"; sourceTree = ""; }; A26AF1040D2855FC00FF7140 /* ru */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ru; path = macosx/ru.lproj/Creator.xib; sourceTree = ""; }; A26AF1050D2855FC00FF7140 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = macosx/ru.lproj/InfoPlist.strings; sourceTree = ""; }; A26AF1070D2855FC00FF7140 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = macosx/ru.lproj/Localizable.strings; sourceTree = ""; }; A26AF1080D2855FC00FF7140 /* ru */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ru; path = macosx/ru.lproj/MainMenu.xib; sourceTree = ""; }; A26AF10A0D2855FC00FF7140 /* ru */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ru; path = macosx/ru.lproj/PrefsWindow.xib; sourceTree = ""; }; A26AF2180D2DA35A00FF7140 /* FileOutlineController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FileOutlineController.h; path = macosx/FileOutlineController.h; sourceTree = ""; }; A26AF2190D2DA35A00FF7140 /* FileOutlineController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = FileOutlineController.m; path = macosx/FileOutlineController.m; sourceTree = ""; }; A26AF2820D2DC27C00FF7140 /* AddWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AddWindowController.h; path = macosx/AddWindowController.h; sourceTree = ""; }; A26AF2830D2DC27C00FF7140 /* AddWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AddWindowController.m; path = macosx/AddWindowController.m; sourceTree = ""; }; A26E75870CB6AA7500226674 /* InfoOptions.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = InfoOptions.png; path = macosx/Images/InfoOptions.png; sourceTree = ""; }; A26E75950CB6AB4800226674 /* InfoGeneral.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = InfoGeneral.png; path = macosx/Images/InfoGeneral.png; sourceTree = ""; }; A2710E740A86796000CE4F7D /* PrefsWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PrefsWindow.h; path = macosx/PrefsWindow.h; sourceTree = ""; }; A2710E750A86796000CE4F7D /* PrefsWindow.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = PrefsWindow.m; path = macosx/PrefsWindow.m; sourceTree = ""; }; A2725B6C0DE5C4F5003445E7 /* FileListNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FileListNode.h; path = macosx/FileListNode.h; sourceTree = ""; }; A2725B6D0DE5C4F5003445E7 /* FileListNode.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = FileListNode.m; path = macosx/FileListNode.m; sourceTree = ""; }; A2725D5B0DE7507C003445E7 /* TrackerTableView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TrackerTableView.h; path = macosx/TrackerTableView.h; sourceTree = ""; }; A2725D5C0DE7507C003445E7 /* TrackerTableView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TrackerTableView.m; path = macosx/TrackerTableView.m; sourceTree = ""; }; A27476FF0CC38EE6003CC76D /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = macosx/es.lproj/InfoPlist.strings; sourceTree = ""; }; A27477010CC38EE6003CC76D /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = macosx/es.lproj/Localizable.strings; sourceTree = ""; }; A27653A714369C5C009D3CCF /* libcrypto.0.9.8.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libcrypto.0.9.8.dylib; path = "third-party/openssl/lib/libcrypto.0.9.8.dylib"; sourceTree = ""; }; A277DA090C693D9C00DA2CD4 /* ActionOn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ActionOn.png; path = macosx/Images/ActionOn.png; sourceTree = ""; }; A279E3D011C3BDC300D48B1F /* nl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nl; path = macosx/nl.lproj/AddMagnetWindow.xib; sourceTree = ""; }; A279E3D111C3BDC300D48B1F /* nl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nl; path = macosx/nl.lproj/InfoActivityView.xib; sourceTree = ""; }; A279E3D211C3BDC300D48B1F /* nl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nl; path = macosx/nl.lproj/InfoGeneralView.xib; sourceTree = ""; }; A279E3D311C3BDC300D48B1F /* nl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nl; path = macosx/nl.lproj/InfoOptionsView.xib; sourceTree = ""; }; A27F0F310E19AD9800B2DB97 /* TorrentGroup.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TorrentGroup.h; path = macosx/TorrentGroup.h; sourceTree = ""; }; A27F0F320E19AD9800B2DB97 /* TorrentGroup.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TorrentGroup.m; path = macosx/TorrentGroup.m; sourceTree = ""; }; A27F4483160B4AF50048CD4C /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = macosx/QuickLookPlugin/fr.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; }; A28393F910D54A35005C0240 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = macosx/de.lproj/AddWindow.xib; sourceTree = ""; }; A28393FA10D54A4B005C0240 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = macosx/de.lproj/Creator.xib; sourceTree = ""; }; A28393FC10D54A66005C0240 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = macosx/de.lproj/GroupRules.xib; sourceTree = ""; }; A28393FD10D54A79005C0240 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = macosx/de.lproj/InfoPlist.strings; sourceTree = ""; }; A28393FF10D54A96005C0240 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = macosx/de.lproj/Localizable.strings; sourceTree = ""; }; A283940010D54A9D005C0240 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = macosx/de.lproj/MainMenu.xib; sourceTree = ""; }; A283940110D54AA7005C0240 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = macosx/de.lproj/PrefsWindow.xib; sourceTree = ""; }; A284214212DA663E00FBDDBB /* tr-udp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tr-udp.c"; path = "libtransmission/tr-udp.c"; sourceTree = ""; }; A284214312DA663E00FBDDBB /* tr-udp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "tr-udp.h"; path = "libtransmission/tr-udp.h"; sourceTree = ""; }; A28B3A2D160E1BC900D4A2BC /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt_PT; path = macosx/QuickLookPlugin/pt_PT.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; }; A28E1DDF0CFFD8EC00E16385 /* ButtonToolbarItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ButtonToolbarItem.h; path = macosx/ButtonToolbarItem.h; sourceTree = ""; }; A28F4F750E085BDC003A3882 /* ColorTextField.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ColorTextField.h; path = macosx/ColorTextField.h; sourceTree = ""; }; A28F4F760E085BDC003A3882 /* ColorTextField.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ColorTextField.m; path = macosx/ColorTextField.m; sourceTree = ""; }; A291477B0E195A0C00F60CB2 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = macosx/en.lproj/AddWindow.xib; sourceTree = ""; }; A291477C0E195A0C00F60CB2 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = macosx/en.lproj/Creator.xib; sourceTree = ""; }; A291477D0E195A0C00F60CB2 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = macosx/en.lproj/InfoPlist.strings; sourceTree = ""; }; A291477F0E195A0C00F60CB2 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = macosx/en.lproj/Localizable.strings; sourceTree = ""; }; A29147800E195A0C00F60CB2 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = macosx/en.lproj/MainMenu.xib; sourceTree = ""; }; A29147810E195A0C00F60CB2 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = macosx/en.lproj/PrefsWindow.xib; sourceTree = ""; }; A292A6E40DFB45E5004B9C0A /* peer-common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "peer-common.h"; path = "libtransmission/peer-common.h"; sourceTree = ""; }; A292A6E50DFB45EC004B9C0A /* webseed.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = webseed.c; path = libtransmission/webseed.c; sourceTree = ""; }; A292A6E60DFB45EC004B9C0A /* webseed.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = webseed.h; path = libtransmission/webseed.h; sourceTree = ""; }; A292C9E01413BA5F00EF710F /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = macosx/es.lproj/GlobalOptionsPopover.xib; sourceTree = ""; }; A292C9E2141593DA00EF710F /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = macosx/de.lproj/GlobalOptionsPopover.xib; sourceTree = ""; }; A292C9E414163AE500EF710F /* it */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = it; path = macosx/it.lproj/GlobalOptionsPopover.xib; sourceTree = ""; }; A29304EC15D7465100B1F726 /* style.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; name = style.css; path = macosx/QuickLookPlugin/style.css; sourceTree = SOURCE_ROOT; }; A29443271419746A0016143A /* ru */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ru; path = macosx/ru.lproj/GlobalOptionsPopover.xib; sourceTree = ""; }; A294432E141B23CD0016143A /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = pt_PT; path = macosx/pt_PT.lproj/GlobalOptionsPopover.xib; sourceTree = ""; }; A2963CFD1423F2BB00C497B5 /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = macosx/fr.lproj/GlobalOptionsPopover.xib; sourceTree = ""; }; A2966E8513DAF74C007B52DF /* GlobalOptionsPopoverViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GlobalOptionsPopoverViewController.h; path = macosx/GlobalOptionsPopoverViewController.h; sourceTree = ""; }; A2966E8613DAF74C007B52DF /* GlobalOptionsPopoverViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = GlobalOptionsPopoverViewController.m; path = macosx/GlobalOptionsPopoverViewController.m; sourceTree = ""; }; A296EF3411E5605E004A2781 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; A29AF4F60D01BADC00D097EC /* DownArrowTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = DownArrowTemplate.png; path = macosx/Images/DownArrowTemplate.png; sourceTree = ""; }; A29AF4F80D01BAEB00D097EC /* UpArrowTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = UpArrowTemplate.png; path = macosx/Images/UpArrowTemplate.png; sourceTree = ""; }; A29C8B340ACC6EB3000ED9F9 /* PortChecker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PortChecker.h; path = macosx/PortChecker.h; sourceTree = ""; }; A29C8B350ACC6EB3000ED9F9 /* PortChecker.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = PortChecker.m; path = macosx/PortChecker.m; sourceTree = ""; }; A29D84021049C25600D1987A /* NSApplicationAdditions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = NSApplicationAdditions.h; path = macosx/NSApplicationAdditions.h; sourceTree = ""; }; A29D84031049C25600D1987A /* NSApplicationAdditions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = NSApplicationAdditions.m; path = macosx/NSApplicationAdditions.m; sourceTree = ""; }; A29DF8B60DB2544C00D04E5A /* resume.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = resume.c; path = libtransmission/resume.c; sourceTree = ""; }; A29DF8B70DB2544C00D04E5A /* resume.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = resume.h; path = libtransmission/resume.h; sourceTree = ""; }; A29DF8B80DB2544C00D04E5A /* torrent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = torrent.h; path = libtransmission/torrent.h; sourceTree = ""; }; A29E653513F1603100048D71 /* evutil_rand.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = evutil_rand.c; path = "third-party/libevent/evutil_rand.c"; sourceTree = ""; }; A29EBE520DC01FC9006CEE80 /* web.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = web.c; path = libtransmission/web.c; sourceTree = ""; }; A29EBE530DC01FC9006CEE80 /* web.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = web.h; path = libtransmission/web.h; sourceTree = ""; }; A2A1C81D142EC032008C17BF /* nl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nl; path = macosx/nl.lproj/GlobalOptionsPopover.xib; sourceTree = ""; }; A2A1CB770BF29D5500AE959F /* PeerProgressIndicatorCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PeerProgressIndicatorCell.h; path = macosx/PeerProgressIndicatorCell.h; sourceTree = ""; }; A2A1CB780BF29D5500AE959F /* PeerProgressIndicatorCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = PeerProgressIndicatorCell.m; path = macosx/PeerProgressIndicatorCell.m; sourceTree = ""; }; A2A4EA0A0DE106E8000CE197 /* ConvertUTF.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = ConvertUTF.c; path = libtransmission/ConvertUTF.c; sourceTree = ""; }; A2A4EA0B0DE106E8000CE197 /* ConvertUTF.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ConvertUTF.h; path = libtransmission/ConvertUTF.h; sourceTree = ""; }; A2A632190CD9751700E3DA60 /* BadgeView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BadgeView.h; path = macosx/BadgeView.h; sourceTree = ""; }; A2A6321A0CD9751700E3DA60 /* BadgeView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = BadgeView.m; path = macosx/BadgeView.m; sourceTree = ""; }; A2A7B328164F87D400B98C65 /* jsonsl.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jsonsl.c; path = libtransmission/jsonsl.c; sourceTree = ""; }; A2A7B329164F87D400B98C65 /* jsonsl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jsonsl.h; path = libtransmission/jsonsl.h; sourceTree = ""; }; A2A90DC115F3C3D900FB7115 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = macosx/QuickLookPlugin/de.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; }; A2A9D119187DD75100C52A1F /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = macosx/tr.lproj/Localizable.strings; sourceTree = ""; }; A2A9D11A187DD75200C52A1F /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = macosx/tr.lproj/InfoPlist.strings; sourceTree = ""; }; A2A9D11B187DD75300C52A1F /* tr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = tr; path = macosx/tr.lproj/MainMenu.xib; sourceTree = ""; }; A2A9D11C187DD75400C52A1F /* tr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = tr; path = macosx/tr.lproj/PrefsWindow.xib; sourceTree = ""; }; A2A9D11D187DD75500C52A1F /* tr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = tr; path = macosx/tr.lproj/Creator.xib; sourceTree = ""; }; A2A9D11E187DD75600C52A1F /* tr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = tr; path = macosx/tr.lproj/AddWindow.xib; sourceTree = ""; }; A2A9D11F187DD75700C52A1F /* tr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = tr; path = macosx/tr.lproj/AddMagnetWindow.xib; sourceTree = ""; }; A2A9D120187DD75800C52A1F /* tr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = tr; path = macosx/tr.lproj/GroupRules.xib; sourceTree = ""; }; A2A9D121187DD75900C52A1F /* tr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = tr; path = macosx/tr.lproj/InfoGeneralView.xib; sourceTree = ""; }; A2A9D122187DD75A00C52A1F /* tr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = tr; path = macosx/tr.lproj/InfoActivityView.xib; sourceTree = ""; }; A2A9D123187DD75B00C52A1F /* tr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = tr; path = macosx/tr.lproj/InfoOptionsView.xib; sourceTree = ""; }; A2A9D124187DD75C00C52A1F /* tr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = tr; path = macosx/tr.lproj/GlobalOptionsPopover.xib; sourceTree = ""; }; A2AA579A0ADFCAB400CA59F6 /* PiecesView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PiecesView.h; path = macosx/PiecesView.h; sourceTree = ""; }; A2AA579B0ADFCAB400CA59F6 /* PiecesView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = PiecesView.m; path = macosx/PiecesView.m; sourceTree = ""; }; A2AA9BE0132CAC8D00FA131E /* announcer-udp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "announcer-udp.c"; path = "libtransmission/announcer-udp.c"; sourceTree = ""; }; A2AA9BE2132CAE2000FA131E /* evdns.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = evdns.c; path = "third-party/libevent/evdns.c"; sourceTree = ""; }; A2AAB6580DE0CF6200E04DDA /* rpc-server.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "rpc-server.c"; path = "libtransmission/rpc-server.c"; sourceTree = ""; }; A2AAB6590DE0CF6200E04DDA /* rpcimpl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = rpcimpl.h; path = libtransmission/rpcimpl.h; sourceTree = ""; }; A2AAB65A0DE0CF6200E04DDA /* rpc-server.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "rpc-server.h"; path = "libtransmission/rpc-server.h"; sourceTree = ""; }; A2AAB65B0DE0CF6200E04DDA /* rpcimpl.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rpcimpl.c; path = libtransmission/rpcimpl.c; sourceTree = ""; }; A2AB883B16A399A6008FAD50 /* VDKQueue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VDKQueue.h; sourceTree = ""; }; A2AB883C16A399A6008FAD50 /* VDKQueue.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VDKQueue.m; sourceTree = ""; }; A2AC81D60D987E2D00A2878C /* nl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nl; path = macosx/nl.lproj/AddWindow.xib; sourceTree = ""; }; A2AF1C360A3D0F6200F1575D /* FileOutlineView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FileOutlineView.h; path = macosx/FileOutlineView.h; sourceTree = ""; }; A2AF1C370A3D0F6200F1575D /* FileOutlineView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = FileOutlineView.m; path = macosx/FileOutlineView.m; sourceTree = ""; }; A2AF23C616B44FA0003BC59E /* log.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = log.c; path = libtransmission/log.c; sourceTree = ""; }; A2AF23C716B44FA0003BC59E /* log.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = log.h; path = libtransmission/log.h; sourceTree = ""; }; A2B3FB450E5901E700FF78FB /* cli.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cli.c; path = cli/cli.c; sourceTree = ""; }; A2B5B4E71880665E0071A66A /* ShareTorrentFileHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ShareTorrentFileHelper.h; path = macosx/ShareTorrentFileHelper.h; sourceTree = ""; }; A2B5B4E81880665E0071A66A /* ShareTorrentFileHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ShareTorrentFileHelper.m; path = macosx/ShareTorrentFileHelper.m; sourceTree = ""; }; A2B5BB7A0D9C7C2300FCB650 /* es */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = es; path = macosx/es.lproj/AddWindow.xib; sourceTree = ""; }; A2B6141B1395ADE9000E0975 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; A2B9F90311BD10BE003FC8CA /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = macosx/fr.lproj/AddMagnetWindow.xib; sourceTree = ""; }; A2B9F90411BD10BE003FC8CA /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = macosx/fr.lproj/InfoActivityView.xib; sourceTree = ""; }; A2B9F90511BD10BE003FC8CA /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = macosx/fr.lproj/InfoGeneralView.xib; sourceTree = ""; }; A2B9F90611BD10BE003FC8CA /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = macosx/fr.lproj/InfoOptionsView.xib; sourceTree = ""; }; A2BB67780D5BA74600AB0618 /* ToolbarOpenWebTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ToolbarOpenWebTemplate.png; path = macosx/Images/ToolbarOpenWebTemplate.png; sourceTree = ""; }; A2BC19840CA9AF5A00DD302A /* CompleteCheck.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = CompleteCheck.png; path = macosx/Images/CompleteCheck.png; sourceTree = ""; }; A2BE9C4E0C1E4ADA002D16E6 /* makemeta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = makemeta.c; path = libtransmission/makemeta.c; sourceTree = ""; }; A2BE9C4F0C1E4ADA002D16E6 /* makemeta.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = makemeta.h; path = libtransmission/makemeta.h; sourceTree = ""; }; A2C0C5020E02CB6100D95339 /* Remote.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Remote.png; path = macosx/Images/Remote.png; sourceTree = ""; }; A2C89D5F0CFCBF57004CC2BC /* ButtonToolbarItem.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ButtonToolbarItem.m; path = macosx/ButtonToolbarItem.m; sourceTree = ""; }; A2CA772B187F063A00154956 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = macosx/QuickLookPlugin/tr.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; }; A2CB38AE0E1E6896002B514C /* COPYING */ = {isa = PBXFileReference; lastKnownFileType = text; path = COPYING; sourceTree = ""; }; A2CBDED80D993E4500BB22BC /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = macosx/fr.lproj/AddWindow.xib; sourceTree = ""; }; A2CBDF9E0D9AD08100BB22BC /* ru */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ru; path = macosx/ru.lproj/AddWindow.xib; sourceTree = ""; }; A2D0E0480A54A97C003C72CF /* Bandwidth.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Bandwidth.png; path = macosx/Images/Bandwidth.png; sourceTree = ""; }; A2D22A100D65EED100007D5F /* verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = verify.c; path = libtransmission/verify.c; sourceTree = ""; }; A2D22A110D65EED100007D5F /* verify.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = verify.h; path = libtransmission/verify.h; sourceTree = ""; }; A2D3078E0D9EC45F0051FD27 /* blocklist.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = blocklist.c; path = libtransmission/blocklist.c; sourceTree = ""; }; A2D307930D9EC4860051FD27 /* blocklist.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = blocklist.h; path = libtransmission/blocklist.h; sourceTree = ""; }; A2D307A20D9EC6870051FD27 /* BlocklistDownloader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BlocklistDownloader.h; path = macosx/BlocklistDownloader.h; sourceTree = ""; }; A2D307A30D9EC6870051FD27 /* BlocklistDownloader.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = BlocklistDownloader.m; path = macosx/BlocklistDownloader.m; sourceTree = ""; }; A2D307B00D9EC9F50051FD27 /* BlocklistStatusWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = BlocklistStatusWindow.xib; path = macosx/BlocklistStatusWindow.xib; sourceTree = ""; }; A2D7744F154CC25700A62B93 /* WebSeedTableView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WebSeedTableView.h; path = macosx/WebSeedTableView.h; sourceTree = ""; }; A2D77450154CC25700A62B93 /* WebSeedTableView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = WebSeedTableView.m; path = macosx/WebSeedTableView.m; sourceTree = ""; }; A2D8CFBF15FA177A0056E93D /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = macosx/QuickLookPlugin/ru.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; }; A2DA36270CBC674900C2ED41 /* InfoActivity.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = InfoActivity.png; path = macosx/Images/InfoActivity.png; sourceTree = ""; }; A2DA36280CBC674900C2ED41 /* InfoFiles.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = InfoFiles.png; path = macosx/Images/InfoFiles.png; sourceTree = ""; }; A2DA36290CBC674900C2ED41 /* InfoPeers.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = InfoPeers.png; path = macosx/Images/InfoPeers.png; sourceTree = ""; }; A2DC494715842ABD00758FF1 /* ActionHover@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ActionHover@2x.png"; path = "macosx/Images/ActionHover@2x.png"; sourceTree = ""; }; A2DC494915842BE900758FF1 /* ActionOn@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ActionOn@2x.png"; path = "macosx/Images/ActionOn@2x.png"; sourceTree = ""; }; A2DC494B15842BF700758FF1 /* Bandwidth@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Bandwidth@2x.png"; path = "macosx/Images/Bandwidth@2x.png"; sourceTree = ""; }; A2DC494D15842C1000758FF1 /* CleanupTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "CleanupTemplate@2x.png"; path = "macosx/Images/CleanupTemplate@2x.png"; sourceTree = ""; }; A2DC494F15842C1C00758FF1 /* CompleteCheck@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "CompleteCheck@2x.png"; path = "macosx/Images/CompleteCheck@2x.png"; sourceTree = ""; }; A2DC495115842C2700758FF1 /* CreateLarge@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "CreateLarge@2x.png"; path = "macosx/Images/CreateLarge@2x.png"; sourceTree = ""; }; A2DC495315842C3300758FF1 /* DownArrowGroupTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "DownArrowGroupTemplate@2x.png"; path = "macosx/Images/DownArrowGroupTemplate@2x.png"; sourceTree = ""; }; A2DC495515842C4600758FF1 /* DownArrowTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "DownArrowTemplate@2x.png"; path = "macosx/Images/DownArrowTemplate@2x.png"; sourceTree = ""; }; A2DC495715842C7700758FF1 /* FavIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "FavIcon@2x.png"; path = "macosx/Images/FavIcon@2x.png"; sourceTree = ""; }; A2DC495915842C9500758FF1 /* Globe@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Globe@2x.png"; path = "macosx/Images/Globe@2x.png"; sourceTree = ""; }; A2DC495B15842CA000758FF1 /* GreenDot@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "GreenDot@2x.png"; path = "macosx/Images/GreenDot@2x.png"; sourceTree = ""; }; A2DC495D15842CB400758FF1 /* Groups@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Groups@2x.png"; path = "macosx/Images/Groups@2x.png"; sourceTree = ""; }; A2DC495F15842CD300758FF1 /* GroupsNoneTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "GroupsNoneTemplate@2x.png"; path = "macosx/Images/GroupsNoneTemplate@2x.png"; sourceTree = ""; }; A2DC496115842CE800758FF1 /* InfoActivity@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "InfoActivity@2x.png"; path = "macosx/Images/InfoActivity@2x.png"; sourceTree = ""; }; A2DC496315842CF200758FF1 /* InfoFiles@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "InfoFiles@2x.png"; path = "macosx/Images/InfoFiles@2x.png"; sourceTree = ""; }; A2DC496515842CFE00758FF1 /* InfoGeneral@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "InfoGeneral@2x.png"; path = "macosx/Images/InfoGeneral@2x.png"; sourceTree = ""; }; A2DC496715842D1B00758FF1 /* InfoOptions@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "InfoOptions@2x.png"; path = "macosx/Images/InfoOptions@2x.png"; sourceTree = ""; }; A2DC496915842D2C00758FF1 /* InfoPeers@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "InfoPeers@2x.png"; path = "macosx/Images/InfoPeers@2x.png"; sourceTree = ""; }; A2DC496B15842D3E00758FF1 /* InfoTracker@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "InfoTracker@2x.png"; path = "macosx/Images/InfoTracker@2x.png"; sourceTree = ""; }; A2DC496D15842D5200758FF1 /* Lock@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Lock@2x.png"; path = "macosx/Images/Lock@2x.png"; sourceTree = ""; }; A2DC496F15842D5C00758FF1 /* Magnet@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Magnet@2x.png"; path = "macosx/Images/Magnet@2x.png"; sourceTree = ""; }; A2DC497115842D8000758FF1 /* PauseHover@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "PauseHover@2x.png"; path = "macosx/Images/PauseHover@2x.png"; sourceTree = ""; }; A2DC497515842D9700758FF1 /* PauseOff@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "PauseOff@2x.png"; path = "macosx/Images/PauseOff@2x.png"; sourceTree = ""; }; A2DC497715842D9C00758FF1 /* PauseOn@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "PauseOn@2x.png"; path = "macosx/Images/PauseOn@2x.png"; sourceTree = ""; }; A2DC497915842DC000758FF1 /* PinTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "PinTemplate@2x.png"; path = "macosx/Images/PinTemplate@2x.png"; sourceTree = ""; }; A2DC497B15842DDC00758FF1 /* PriorityControlLow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "PriorityControlLow@2x.png"; path = "macosx/Images/PriorityControlLow@2x.png"; sourceTree = ""; }; A2DC497C15842DDC00758FF1 /* PriorityControlNormal@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "PriorityControlNormal@2x.png"; path = "macosx/Images/PriorityControlNormal@2x.png"; sourceTree = ""; }; A2DC498115842E8A00758FF1 /* PriorityControlHigh@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "PriorityControlHigh@2x.png"; path = "macosx/Images/PriorityControlHigh@2x.png"; sourceTree = ""; }; A2DC498715842ECC00758FF1 /* PriorityHighTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "PriorityHighTemplate@2x.png"; path = "macosx/Images/PriorityHighTemplate@2x.png"; sourceTree = ""; }; A2DC498815842ECC00758FF1 /* PriorityLowTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "PriorityLowTemplate@2x.png"; path = "macosx/Images/PriorityLowTemplate@2x.png"; sourceTree = ""; }; A2DC498915842ECC00758FF1 /* PriorityNormalTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "PriorityNormalTemplate@2x.png"; path = "macosx/Images/PriorityNormalTemplate@2x.png"; sourceTree = ""; }; A2DC498D15842EEA00758FF1 /* PurpleDot@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "PurpleDot@2x.png"; path = "macosx/Images/PurpleDot@2x.png"; sourceTree = ""; }; A2DC498F15842EF000758FF1 /* RedDot@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RedDot@2x.png"; path = "macosx/Images/RedDot@2x.png"; sourceTree = ""; }; A2DC499115842F0000758FF1 /* Remote@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Remote@2x.png"; path = "macosx/Images/Remote@2x.png"; sourceTree = ""; }; A2DC499315842F5700758FF1 /* ResumeHover@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ResumeHover@2x.png"; path = "macosx/Images/ResumeHover@2x.png"; sourceTree = ""; }; A2DC499415842F5800758FF1 /* ResumeNoWaitHover@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ResumeNoWaitHover@2x.png"; path = "macosx/Images/ResumeNoWaitHover@2x.png"; sourceTree = ""; }; A2DC499515842F5800758FF1 /* ResumeNoWaitOff@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ResumeNoWaitOff@2x.png"; path = "macosx/Images/ResumeNoWaitOff@2x.png"; sourceTree = ""; }; A2DC499615842F5800758FF1 /* ResumeNoWaitOn@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ResumeNoWaitOn@2x.png"; path = "macosx/Images/ResumeNoWaitOn@2x.png"; sourceTree = ""; }; A2DC499715842F5800758FF1 /* ResumeOff@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ResumeOff@2x.png"; path = "macosx/Images/ResumeOff@2x.png"; sourceTree = ""; }; A2DC499815842F5800758FF1 /* ResumeOn@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ResumeOn@2x.png"; path = "macosx/Images/ResumeOn@2x.png"; sourceTree = ""; }; A2DC499F15842F9D00758FF1 /* RevealHover@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RevealHover@2x.png"; path = "macosx/Images/RevealHover@2x.png"; sourceTree = ""; }; A2DC49A015842F9D00758FF1 /* RevealOff@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RevealOff@2x.png"; path = "macosx/Images/RevealOff@2x.png"; sourceTree = ""; }; A2DC49A115842F9D00758FF1 /* RevealOn@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RevealOn@2x.png"; path = "macosx/Images/RevealOn@2x.png"; sourceTree = ""; }; A2DC49A515842FC300758FF1 /* ToolbarCreateTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ToolbarCreateTemplate@2x.png"; path = "macosx/Images/ToolbarCreateTemplate@2x.png"; sourceTree = ""; }; A2DC49A615842FC300758FF1 /* ToolbarFilterTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ToolbarFilterTemplate@2x.png"; path = "macosx/Images/ToolbarFilterTemplate@2x.png"; sourceTree = ""; }; A2DC49A715842FC300758FF1 /* ToolbarInfoTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ToolbarInfoTemplate@2x.png"; path = "macosx/Images/ToolbarInfoTemplate@2x.png"; sourceTree = ""; }; A2DC49AB15842FF200758FF1 /* ToolbarOpenTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ToolbarOpenTemplate@2x.png"; path = "macosx/Images/ToolbarOpenTemplate@2x.png"; sourceTree = ""; }; A2DC49AC15842FF200758FF1 /* ToolbarOpenWebTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ToolbarOpenWebTemplate@2x.png"; path = "macosx/Images/ToolbarOpenWebTemplate@2x.png"; sourceTree = ""; }; A2DC49AF1584300D00758FF1 /* ToolbarPauseAllTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ToolbarPauseAllTemplate@2x.png"; path = "macosx/Images/ToolbarPauseAllTemplate@2x.png"; sourceTree = ""; }; A2DC49B01584300D00758FF1 /* ToolbarPauseSelectedTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ToolbarPauseSelectedTemplate@2x.png"; path = "macosx/Images/ToolbarPauseSelectedTemplate@2x.png"; sourceTree = ""; }; A2DC49B31584303A00758FF1 /* ToolbarRemoveTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ToolbarRemoveTemplate@2x.png"; path = "macosx/Images/ToolbarRemoveTemplate@2x.png"; sourceTree = ""; }; A2DC49B41584303A00758FF1 /* ToolbarResumeAllTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ToolbarResumeAllTemplate@2x.png"; path = "macosx/Images/ToolbarResumeAllTemplate@2x.png"; sourceTree = ""; }; A2DC49B51584303A00758FF1 /* ToolbarResumeSelectedTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ToolbarResumeSelectedTemplate@2x.png"; path = "macosx/Images/ToolbarResumeSelectedTemplate@2x.png"; sourceTree = ""; }; A2DC49B91584307300758FF1 /* Transfers@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Transfers@2x.png"; path = "macosx/Images/Transfers@2x.png"; sourceTree = ""; }; A2DC49BB1584309F00758FF1 /* TurtleTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "TurtleTemplate@2x.png"; path = "macosx/Images/TurtleTemplate@2x.png"; sourceTree = ""; }; A2DC49BD158430B300758FF1 /* UpArrowGroupTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "UpArrowGroupTemplate@2x.png"; path = "macosx/Images/UpArrowGroupTemplate@2x.png"; sourceTree = ""; }; A2DC49BE158430B300758FF1 /* UpArrowTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "UpArrowTemplate@2x.png"; path = "macosx/Images/UpArrowTemplate@2x.png"; sourceTree = ""; }; A2DC49C1158430CA00758FF1 /* YellowDot@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "YellowDot@2x.png"; path = "macosx/Images/YellowDot@2x.png"; sourceTree = ""; }; A2DC49C3158430E200758FF1 /* YingYangGroupTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "YingYangGroupTemplate@2x.png"; path = "macosx/Images/YingYangGroupTemplate@2x.png"; sourceTree = ""; }; A2DC49C5158430FB00758FF1 /* YingYangTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "YingYangTemplate@2x.png"; path = "macosx/Images/YingYangTemplate@2x.png"; sourceTree = ""; }; A2DF37040C220D03006523C1 /* CreatorWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CreatorWindowController.h; path = macosx/CreatorWindowController.h; sourceTree = ""; }; A2DF37050C220D03006523C1 /* CreatorWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = CreatorWindowController.m; path = macosx/CreatorWindowController.m; sourceTree = ""; }; A2E23AC30CB5E1930002BB25 /* InfoTabButtonCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InfoTabButtonCell.h; path = macosx/InfoTabButtonCell.h; sourceTree = ""; }; A2E23AC40CB5E1930002BB25 /* InfoTabButtonCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = InfoTabButtonCell.m; path = macosx/InfoTabButtonCell.m; sourceTree = ""; }; A2E2EA910EE321C200EB6308 /* Groups.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Groups.png; path = macosx/Images/Groups.png; sourceTree = ""; }; A2E384D2130DFB3A001F501B /* templates.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = templates.h; path = "third-party/libutp/templates.h"; sourceTree = ""; }; A2E384D3130DFB3A001F501B /* utp_config_example.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = utp_config_example.h; path = "third-party/libutp/utp_config_example.h"; sourceTree = ""; }; A2E384D4130DFB3A001F501B /* utp_config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = utp_config.h; path = "third-party/libutp/utp_config.h"; sourceTree = ""; }; A2E384D5130DFB3A001F501B /* utp_utils.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = utp_utils.cpp; path = "third-party/libutp/utp_utils.cpp"; sourceTree = ""; }; A2E384D6130DFB3A001F501B /* utp_utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = utp_utils.h; path = "third-party/libutp/utp_utils.h"; sourceTree = ""; }; A2E384D7130DFB3A001F501B /* utp.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = utp.cpp; path = "third-party/libutp/utp.cpp"; sourceTree = ""; }; A2E384D8130DFB3A001F501B /* utp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = utp.h; path = "third-party/libutp/utp.h"; sourceTree = ""; }; A2E384D9130DFB3A001F501B /* utypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = utypes.h; path = "third-party/libutp/utypes.h"; sourceTree = ""; }; A2E3850B130DFCCB001F501B /* StdAfx.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = StdAfx.h; path = "third-party/libutp/StdAfx.h"; sourceTree = ""; }; A2E38544130DFEE3001F501B /* libutp.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libutp.a; sourceTree = BUILT_PRODUCTS_DIR; }; A2E57AB91310822C00A7DAB1 /* StatusBarController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = StatusBarController.h; path = macosx/StatusBarController.h; sourceTree = ""; }; A2E57ABA1310822C00A7DAB1 /* StatusBarController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = StatusBarController.m; path = macosx/StatusBarController.m; sourceTree = ""; }; A2E57AC51310831400A7DAB1 /* StatusBar.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = StatusBar.xib; path = macosx/StatusBar.xib; sourceTree = ""; }; A2E57B9B13109DC200A7DAB1 /* FilterBar.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = FilterBar.xib; path = macosx/FilterBar.xib; sourceTree = ""; }; A2E57BA513109E6B00A7DAB1 /* FilterBarController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FilterBarController.h; path = macosx/FilterBarController.h; sourceTree = ""; }; A2E57BA613109E6B00A7DAB1 /* FilterBarController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = FilterBarController.m; path = macosx/FilterBarController.m; sourceTree = ""; }; A2E669780F5B8E5A00B4251A /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = ""; }; A2E9AA750C249AF400085DCF /* ToolbarCreateTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ToolbarCreateTemplate.png; path = macosx/Images/ToolbarCreateTemplate.png; sourceTree = ""; }; A2EA522F1686AC0D00180493 /* quark.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = quark.c; path = libtransmission/quark.c; sourceTree = ""; }; A2EA52301686AC0D00180493 /* quark.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = quark.h; path = libtransmission/quark.h; sourceTree = ""; }; A2EA8E3C0CC3C9830081201C /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = macosx/fr.lproj/InfoPlist.strings; sourceTree = ""; }; A2EA8E3E0CC3C9830081201C /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = macosx/fr.lproj/Localizable.strings; sourceTree = ""; }; A2ED7D8D0CEF431B00970975 /* FilterButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FilterButton.h; path = macosx/FilterButton.h; sourceTree = ""; }; A2ED7D8E0CEF431B00970975 /* FilterButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = FilterButton.m; path = macosx/FilterButton.m; sourceTree = ""; }; A2EE726E14DCCC950093C99A /* natpmp_local.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = natpmp_local.h; path = libtransmission/natpmp_local.h; sourceTree = ""; }; A2EF7DEB0C96297400FA9811 /* PurpleDot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PurpleDot.png; path = macosx/Images/PurpleDot.png; sourceTree = ""; }; A2F011980C27418800576FC0 /* CreateLarge.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = CreateLarge.png; path = macosx/Images/CreateLarge.png; sourceTree = ""; }; A2F151150CD438A4001F3B0E /* YellowDot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = YellowDot.png; path = macosx/Images/YellowDot.png; sourceTree = ""; }; A2F151160CD438A4001F3B0E /* RedDot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = RedDot.png; path = macosx/Images/RedDot.png; sourceTree = ""; }; A2F151170CD438A4001F3B0E /* GreenDot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = GreenDot.png; path = macosx/Images/GreenDot.png; sourceTree = ""; }; A2F1511F0CD438BA001F3B0E /* Lock.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Lock.png; path = macosx/Images/Lock.png; sourceTree = ""; }; A2F35BB915C5A0A100EBF632 /* QuickLookPlugin.qlgenerator */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = QuickLookPlugin.qlgenerator; sourceTree = BUILT_PRODUCTS_DIR; }; A2F35BBB15C5A0A100EBF632 /* QuickLook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLook.framework; path = System/Library/Frameworks/QuickLook.framework; sourceTree = SDKROOT; }; A2F35BBD15C5A0A100EBF632 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = System/Library/Frameworks/ApplicationServices.framework; sourceTree = SDKROOT; }; A2F35BBF15C5A0A100EBF632 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; }; A2F35BC115C5A0A100EBF632 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; A2F35BC515C5A0A100EBF632 /* QuickLookPlugin-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "QuickLookPlugin-Info.plist"; path = "macosx/QuickLookPlugin/QuickLookPlugin-Info.plist"; sourceTree = SOURCE_ROOT; }; A2F35BC715C5A0A100EBF632 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; A2F35BC915C5A0A100EBF632 /* GenerateThumbnailForURL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = GenerateThumbnailForURL.m; path = macosx/QuickLookPlugin/GenerateThumbnailForURL.m; sourceTree = SOURCE_ROOT; }; A2F35BCB15C5A0A100EBF632 /* GeneratePreviewForURL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = GeneratePreviewForURL.m; path = macosx/QuickLookPlugin/GeneratePreviewForURL.m; sourceTree = SOURCE_ROOT; }; A2F35BCD15C5A0A100EBF632 /* main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = main.c; path = macosx/QuickLookPlugin/main.c; sourceTree = SOURCE_ROOT; }; A2F35BCF15C5A0A100EBF632 /* QuickLookPlugin-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "QuickLookPlugin-Prefix.pch"; path = "macosx/QuickLookPlugin/QuickLookPlugin-Prefix.pch"; sourceTree = SOURCE_ROOT; }; A2F35BE015C5A7ED00EBF632 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; A2F35BE215C5A7F900EBF632 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; A2F41DAA0D0B916B006CE378 /* YingYangTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = YingYangTemplate.png; path = macosx/Images/YingYangTemplate.png; sourceTree = ""; }; A2F41F8D0D73595100B82116 /* InfoTracker.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = InfoTracker.png; path = macosx/Images/InfoTracker.png; sourceTree = ""; }; A2F7CF5413035F7B0016FF10 /* URLSheetWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = URLSheetWindow.xib; path = macosx/URLSheetWindow.xib; sourceTree = ""; }; A2F7CF5D13035FFD0016FF10 /* URLSheetWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = URLSheetWindowController.h; path = macosx/URLSheetWindowController.h; sourceTree = ""; }; A2F7CF5E13035FFD0016FF10 /* URLSheetWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = URLSheetWindowController.m; path = macosx/URLSheetWindowController.m; sourceTree = ""; }; A2F8951E0A2D4BA500ED2127 /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = Credits.rtf; path = macosx/Credits.rtf; sourceTree = ""; }; A2F8CD420F3D0F4A00DB356A /* miniupnpcstrings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = miniupnpcstrings.h; path = "third-party/miniupnp/miniupnpcstrings.h"; sourceTree = ""; }; A2FB057C0BFEB6800095564D /* DragOverlayView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DragOverlayView.h; path = macosx/DragOverlayView.h; sourceTree = ""; }; A2FB057D0BFEB6800095564D /* DragOverlayView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = DragOverlayView.m; path = macosx/DragOverlayView.m; sourceTree = ""; }; A2FB06950BFF484A0095564D /* Globe.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Globe.png; path = macosx/Images/Globe.png; sourceTree = ""; }; A2FB07F115F8208300933543 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = macosx/QuickLookPlugin/nl.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; }; A2FB701A0D95CAEA0001F331 /* GroupsController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GroupsController.h; path = macosx/GroupsController.h; sourceTree = ""; }; A2FB701B0D95CAEA0001F331 /* GroupsController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = GroupsController.m; path = macosx/GroupsController.m; sourceTree = ""; }; BE1183480CE160960002D0F3 /* libminiupnp.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libminiupnp.a; sourceTree = BUILT_PRODUCTS_DIR; }; BE11834D0CE160C50002D0F3 /* bsdqueue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = bsdqueue.h; path = "third-party/miniupnp/bsdqueue.h"; sourceTree = ""; }; BE11834E0CE160C50002D0F3 /* declspec.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = declspec.h; path = "third-party/miniupnp/declspec.h"; sourceTree = ""; }; BE11834F0CE160C50002D0F3 /* igd_desc_parse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = igd_desc_parse.h; path = "third-party/miniupnp/igd_desc_parse.h"; sourceTree = ""; }; BE1183500CE160C50002D0F3 /* minixml.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = minixml.h; path = "third-party/miniupnp/minixml.h"; sourceTree = ""; }; BE1183510CE160C50002D0F3 /* miniwget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = miniwget.h; path = "third-party/miniupnp/miniwget.h"; sourceTree = ""; }; BE1183520CE160C50002D0F3 /* minisoap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = minisoap.h; path = "third-party/miniupnp/minisoap.h"; sourceTree = ""; }; BE1183530CE160C50002D0F3 /* upnpreplyparse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = upnpreplyparse.h; path = "third-party/miniupnp/upnpreplyparse.h"; sourceTree = ""; }; BE1183540CE160C50002D0F3 /* upnpcommands.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = upnpcommands.h; path = "third-party/miniupnp/upnpcommands.h"; sourceTree = ""; }; BE1183550CE160C50002D0F3 /* miniupnpc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = miniupnpc.h; path = "third-party/miniupnp/miniupnpc.h"; sourceTree = ""; }; BE1183560CE160C50002D0F3 /* minissdpc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = minissdpc.h; path = "third-party/miniupnp/minissdpc.h"; sourceTree = ""; }; BE1183610CE160D50002D0F3 /* igd_desc_parse.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = igd_desc_parse.c; path = "third-party/miniupnp/igd_desc_parse.c"; sourceTree = ""; }; BE1183620CE160D50002D0F3 /* minixml.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = minixml.c; path = "third-party/miniupnp/minixml.c"; sourceTree = ""; }; BE1183630CE160D50002D0F3 /* miniwget.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = miniwget.c; path = "third-party/miniupnp/miniwget.c"; sourceTree = ""; }; BE1183640CE160D50002D0F3 /* minissdpc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = minissdpc.c; path = "third-party/miniupnp/minissdpc.c"; sourceTree = ""; }; BE1183650CE160D50002D0F3 /* minisoap.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = minisoap.c; path = "third-party/miniupnp/minisoap.c"; sourceTree = ""; }; BE1183660CE160D50002D0F3 /* upnpreplyparse.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = upnpreplyparse.c; path = "third-party/miniupnp/upnpreplyparse.c"; sourceTree = ""; }; BE1183670CE160D50002D0F3 /* upnpcommands.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = upnpcommands.c; path = "third-party/miniupnp/upnpcommands.c"; sourceTree = ""; }; BE1183680CE160D50002D0F3 /* miniupnpc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = miniupnpc.c; path = "third-party/miniupnp/miniupnpc.c"; sourceTree = ""; }; BE75C3490C729E9500DBEFE0 /* libevent.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libevent.a; sourceTree = BUILT_PRODUCTS_DIR; }; BEFC1C000C07750000B0BB3C /* transmission-daemon */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "transmission-daemon"; sourceTree = BUILT_PRODUCTS_DIR; }; BEFC1C0E0C07756200B0BB3C /* daemon.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = daemon.c; path = daemon/daemon.c; sourceTree = ""; }; BEFC1C140C07756200B0BB3C /* remote.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = remote.c; path = daemon/remote.c; sourceTree = ""; }; BEFC1CF90C07822400B0BB3C /* transmission-remote */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "transmission-remote"; sourceTree = BUILT_PRODUCTS_DIR; }; BEFC1DF00C07861A00B0BB3C /* version.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = version.h; path = libtransmission/version.h; sourceTree = ""; }; BEFC1DF10C07861A00B0BB3C /* utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = utils.h; path = libtransmission/utils.h; sourceTree = ""; }; BEFC1DF20C07861A00B0BB3C /* utils.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = utils.c; path = libtransmission/utils.c; sourceTree = ""; }; BEFC1DF30C07861A00B0BB3C /* upnp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = upnp.h; path = libtransmission/upnp.h; sourceTree = ""; }; BEFC1DF40C07861A00B0BB3C /* upnp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = upnp.c; path = libtransmission/upnp.c; sourceTree = ""; }; BEFC1DF50C07861A00B0BB3C /* transmission.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = transmission.h; path = libtransmission/transmission.h; sourceTree = ""; }; BEFC1DF60C07861A00B0BB3C /* session.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = session.c; path = libtransmission/session.c; sourceTree = ""; }; BEFC1DF90C07861A00B0BB3C /* torrent.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = torrent.c; path = libtransmission/torrent.c; sourceTree = ""; }; BEFC1DFC0C07861A00B0BB3C /* port-forwarding.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "port-forwarding.h"; path = "libtransmission/port-forwarding.h"; sourceTree = ""; }; BEFC1DFD0C07861A00B0BB3C /* port-forwarding.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "port-forwarding.c"; path = "libtransmission/port-forwarding.c"; sourceTree = ""; }; BEFC1E020C07861A00B0BB3C /* platform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = platform.h; path = libtransmission/platform.h; sourceTree = ""; }; BEFC1E030C07861A00B0BB3C /* platform.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = platform.c; path = libtransmission/platform.c; sourceTree = ""; }; BEFC1E0C0C07861A00B0BB3C /* net.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = net.h; path = libtransmission/net.h; sourceTree = ""; }; BEFC1E0D0C07861A00B0BB3C /* net.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = net.c; path = libtransmission/net.c; sourceTree = ""; }; BEFC1E0F0C07861A00B0BB3C /* natpmp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = natpmp.c; path = libtransmission/natpmp.c; sourceTree = ""; }; BEFC1E100C07861A00B0BB3C /* metainfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = metainfo.h; path = libtransmission/metainfo.h; sourceTree = ""; }; BEFC1E110C07861A00B0BB3C /* metainfo.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = metainfo.c; path = libtransmission/metainfo.c; sourceTree = ""; }; BEFC1E140C07861A00B0BB3C /* session.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = session.h; path = libtransmission/session.h; sourceTree = ""; }; BEFC1E150C07861A00B0BB3C /* inout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = inout.h; path = libtransmission/inout.h; sourceTree = ""; }; BEFC1E160C07861A00B0BB3C /* inout.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = inout.c; path = libtransmission/inout.c; sourceTree = ""; }; BEFC1E190C07861A00B0BB3C /* fdlimit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fdlimit.h; path = libtransmission/fdlimit.h; sourceTree = ""; }; BEFC1E1A0C07861A00B0BB3C /* fdlimit.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fdlimit.c; path = libtransmission/fdlimit.c; sourceTree = ""; }; BEFC1E1C0C07861A00B0BB3C /* completion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = completion.h; path = libtransmission/completion.h; sourceTree = ""; }; BEFC1E1D0C07861A00B0BB3C /* completion.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = completion.c; path = libtransmission/completion.c; sourceTree = ""; }; BEFC1E1E0C07861A00B0BB3C /* clients.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = clients.h; path = libtransmission/clients.h; sourceTree = ""; }; BEFC1E1F0C07861A00B0BB3C /* clients.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = clients.c; path = libtransmission/clients.c; sourceTree = ""; }; C1033E031A3279B800EF44D8 /* crypto-utils-fallback.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "crypto-utils-fallback.c"; path = "libtransmission/crypto-utils-fallback.c"; sourceTree = ""; }; C1033E041A3279B800EF44D8 /* crypto-utils-openssl.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "crypto-utils-openssl.c"; path = "libtransmission/crypto-utils-openssl.c"; sourceTree = ""; }; C1033E051A3279B800EF44D8 /* crypto-utils.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "crypto-utils.c"; path = "libtransmission/crypto-utils.c"; sourceTree = ""; }; C1033E061A3279B800EF44D8 /* crypto-utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "crypto-utils.h"; path = "libtransmission/crypto-utils.h"; sourceTree = ""; }; C1077A4A183EB29600634C22 /* error.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = error.c; path = libtransmission/error.c; sourceTree = ""; }; C1077A4B183EB29600634C22 /* error.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = error.h; path = libtransmission/error.h; sourceTree = ""; }; C1077A4C183EB29600634C22 /* file-posix.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "file-posix.c"; path = "libtransmission/file-posix.c"; sourceTree = ""; }; C1077A4D183EB29600634C22 /* file.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = file.h; path = libtransmission/file.h; sourceTree = ""; }; C1305EB8186A134000F03351 /* file.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = file.c; path = libtransmission/file.c; sourceTree = ""; }; C1639A6F1A55F4D600E42033 /* libb64.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libb64.a; sourceTree = BUILT_PRODUCTS_DIR; }; C1639A761A55F56600E42033 /* cdecode.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cdecode.c; path = "third-party/libb64/cdecode.c"; sourceTree = ""; }; C1639A771A55F56600E42033 /* cencode.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cencode.c; path = "third-party/libb64/cencode.c"; sourceTree = ""; }; C1639A7A1A55F57200E42033 /* cdecode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cdecode.h; path = "third-party/libb64/b64/cdecode.h"; sourceTree = ""; }; C1639A7B1A55F57200E42033 /* cencode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cencode.h; path = "third-party/libb64/b64/cencode.h"; sourceTree = ""; }; C1F690FC1AD0627500D95CF0 /* daemon-posix.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "daemon-posix.c"; path = "daemon/daemon-posix.c"; sourceTree = ""; }; C1F690FE1AD0628400D95CF0 /* daemon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = daemon.h; path = daemon/daemon.h; sourceTree = ""; }; C1FEE5721C3223CC00D62832 /* watchdir-common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "watchdir-common.h"; path = "libtransmission/watchdir-common.h"; sourceTree = ""; }; C1FEE5731C3223CC00D62832 /* watchdir-generic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "watchdir-generic.c"; path = "libtransmission/watchdir-generic.c"; sourceTree = ""; }; C1FEE5741C3223CC00D62832 /* watchdir-kqueue.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "watchdir-kqueue.c"; path = "libtransmission/watchdir-kqueue.c"; sourceTree = ""; }; C1FEE5751C3223CC00D62832 /* watchdir.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = watchdir.c; path = libtransmission/watchdir.c; sourceTree = ""; }; C1FEE5761C3223CC00D62832 /* watchdir.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = watchdir.h; path = libtransmission/watchdir.h; sourceTree = ""; }; D4AF3B2D0C41F7A500D46B6B /* list.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = list.c; path = libtransmission/list.c; sourceTree = ""; }; D4AF3B2E0C41F7A500D46B6B /* list.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = list.h; path = libtransmission/list.h; sourceTree = ""; }; E138A9750C04D88F00C5426C /* ProgressGradients.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ProgressGradients.h; path = macosx/ProgressGradients.h; sourceTree = ""; }; E138A9760C04D88F00C5426C /* ProgressGradients.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ProgressGradients.m; path = macosx/ProgressGradients.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 3C7A118B0D0B2EB800B5701F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 4DDBB71709E16BAE00284745 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 4D9A2BF009E16D21002D0FF9 /* libtransmission.a in Frameworks */, A296EF3C11E560BD004A2781 /* libiconv.dylib in Frameworks */, A2290D1E14421CC100B95A09 /* libcrypto.0.9.8.dylib in Frameworks */, A2290D2F1442B23200B95A09 /* libcurl.4.dylib in Frameworks */, A2B6141E1395B0EC000E0975 /* libz.dylib in Frameworks */, A2B3FB4C0E59023000FF78FB /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 8D11072E0486CEB800E47090 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, 4D3EA0AA08AE13C600EA10C2 /* IOKit.framework in Frameworks */, 4D1838DD09DEC0E80047D688 /* libtransmission.a in Frameworks */, A24F19080A3A790800C9C145 /* Sparkle.framework in Frameworks */, A261F1DC0A69A1610002815A /* Growl.framework in Frameworks */, A296EF3B11E560A7004A2781 /* libiconv.dylib in Frameworks */, A2290D2514421D1A00B95A09 /* libcrypto.0.9.8.dylib in Frameworks */, A2290D2E1442B23200B95A09 /* libcurl.4.dylib in Frameworks */, A2B6141F1395B0F5000E0975 /* libz.dylib in Frameworks */, A2E669790F5B8E5A00B4251A /* Security.framework in Frameworks */, A22CFB820FB66EF30009BD3E /* Carbon.framework in Frameworks */, A221DCC8104B3660008A642D /* Quartz.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; A22CFCB80FC24F710009BD3E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( A22CFCCD0FC250480009BD3E /* libevent.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; A2E384CC130DFB1D001F501B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; A2F35BB415C5A0A100EBF632 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( A2F35BBC15C5A0A100EBF632 /* QuickLook.framework in Frameworks */, A2F35BE115C5A7ED00EBF632 /* Cocoa.framework in Frameworks */, A2F35BE315C5A7F900EBF632 /* Foundation.framework in Frameworks */, A2F35BD415C5A19A00EBF632 /* libtransmission.a in Frameworks */, A2F35BDB15C5A4A000EBF632 /* libiconv.dylib in Frameworks */, A2F35BDA15C5A49200EBF632 /* libz.dylib in Frameworks */, A2F35BD715C5A46D00EBF632 /* libcrypto.0.9.8.dylib in Frameworks */, A2AB76EA15D8130B009EFC95 /* libcurl.4.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; BE1183460CE160960002D0F3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; BE75C3470C729E9500DBEFE0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; BE75C3860C72A1D300DBEFE0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( C1639A741A55F4E000E42033 /* libb64.a in Frameworks */, A22CFCCB0FC24FDA0009BD3E /* libdht.a in Frameworks */, A267927C130DFF2700CB7464 /* libutp.a in Frameworks */, BE75C38A0C72A1ED00DBEFE0 /* libevent.a in Frameworks */, BE1183780CE161390002D0F3 /* libminiupnp.a in Frameworks */, A226FDAC0D0CDF20005A7F71 /* libnatpmp.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; BEFC1BFE0C07750000B0BB3C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( BEFC1C050C07753500B0BB3C /* libtransmission.a in Frameworks */, A296EF3D11E560C3004A2781 /* libiconv.dylib in Frameworks */, A2290D2014421CD000B95A09 /* libcrypto.0.9.8.dylib in Frameworks */, A2290D301442B23200B95A09 /* libcurl.4.dylib in Frameworks */, A2B6141D1395B0E3000E0975 /* libz.dylib in Frameworks */, A2B3FB530E59027100FF78FB /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; BEFC1CF30C07822400B0BB3C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( BEFC1D2D0C0783D900B0BB3C /* libtransmission.a in Frameworks */, A296EF3E11E560D1004A2781 /* libiconv.dylib in Frameworks */, A2290D2214421CD800B95A09 /* libcrypto.0.9.8.dylib in Frameworks */, A2290D311442B23200B95A09 /* libcurl.4.dylib in Frameworks */, A2B6141C1395ADE9000E0975 /* libz.dylib in Frameworks */, A25E03D90E4015100086C225 /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; C1639A6C1A55F4D600E42033 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 080E96DDFE201D6D7F000001 /* Sources */ = { isa = PBXGroup; children = ( 32CA4F630368D1EE00C91783 /* Transmission_Prefix.pch */, 29B97316FDCFA39411CA2CEA /* main.m */, 4DF0C5AA0899190500DD8943 /* Controller.h */, 4DF0C5A90899190500DD8943 /* Controller.m */, 4DFBC2DD09C0970D00D5C571 /* Torrent.h */, 4DFBC2DE09C0970D00D5C571 /* Torrent.m */, A27F0F310E19AD9800B2DB97 /* TorrentGroup.h */, A27F0F320E19AD9800B2DB97 /* TorrentGroup.m */, 4D364D9E091FBB2C00377D12 /* TorrentTableView.h */, 4D364D9F091FBB2C00377D12 /* TorrentTableView.m */, 4DCCBB3D09C3D71100D3CABF /* TorrentCell.h */, 4DCCBB3C09C3D71100D3CABF /* TorrentCell.m */, A21A9BE0106D86A800F1C3C1 /* TrackerNode.h */, A21A9BE1106D86A800F1C3C1 /* TrackerNode.m */, A2725B6C0DE5C4F5003445E7 /* FileListNode.h */, A2725B6D0DE5C4F5003445E7 /* FileListNode.m */, A28F4F750E085BDC003A3882 /* ColorTextField.h */, A28F4F760E085BDC003A3882 /* ColorTextField.m */, A26AF2820D2DC27C00FF7140 /* AddWindowController.h */, A26AF2830D2DC27C00FF7140 /* AddWindowController.m */, A21F15AB11729A8B00CF5A9C /* AddMagnetWindowController.h */, A21F15AA11729A8B00CF5A9C /* AddMagnetWindowController.m */, A25E74450AF5089E006F11AE /* ExpandedPathToPathTransformer.h */, A25E74440AF5089E006F11AE /* ExpandedPathToPathTransformer.m */, A25E74470AF5089E006F11AE /* ExpandedPathToIconTransformer.h */, A25E74460AF5089E006F11AE /* ExpandedPathToIconTransformer.m */, 4DE5CCA50980735700BE280E /* Badger.h */, 4DE5CCA60980735700BE280E /* Badger.m */, A2A632190CD9751700E3DA60 /* BadgeView.h */, A2A6321A0CD9751700E3DA60 /* BadgeView.m */, A256588A0A9A695400E8A03B /* MessageWindowController.h */, A256588B0A9A695400E8A03B /* MessageWindowController.m */, A2DF37040C220D03006523C1 /* CreatorWindowController.h */, A2DF37050C220D03006523C1 /* CreatorWindowController.m */, A25892620CF1F7E800CCCDDF /* StatsWindowController.h */, A25892630CF1F7E800CCCDDF /* StatsWindowController.m */, A2085DD90C53BC74000BC3B7 /* AboutWindowController.h */, A2085DDA0C53BC74000BC3B7 /* AboutWindowController.m */, A2F7CF5D13035FFD0016FF10 /* URLSheetWindowController.h */, A2F7CF5E13035FFD0016FF10 /* URLSheetWindowController.m */, A2966E8513DAF74C007B52DF /* GlobalOptionsPopoverViewController.h */, A2966E8613DAF74C007B52DF /* GlobalOptionsPopoverViewController.m */, A234D0D40C79FB6000A82373 /* Additions */, E1B6FBF80C0D719B0015FE4D /* Info Window */, A26AF2220D2DA42800FF7140 /* File Outline View */, E1B6FBFD0C0D72430015FE4D /* Prefs Window */, E1B6FC000C0D72A00015FE4D /* Overlay Window */, E138A9750C04D88F00C5426C /* ProgressGradients.h */, E138A9760C04D88F00C5426C /* ProgressGradients.m */, A2E57AB91310822C00A7DAB1 /* StatusBarController.h */, A2E57ABA1310822C00A7DAB1 /* StatusBarController.m */, A21282A50CA6C66800EAEE0F /* StatusBarView.h */, A21282A60CA6C66800EAEE0F /* StatusBarView.m */, A2E57BA513109E6B00A7DAB1 /* FilterBarController.h */, A2E57BA613109E6B00A7DAB1 /* FilterBarController.m */, A2661D3A12D0E51A004F69D5 /* FilterBarView.h */, A2661D3B12D0E51B004F69D5 /* FilterBarView.m */, A2ED7D8D0CEF431B00970975 /* FilterButton.h */, A2ED7D8E0CEF431B00970975 /* FilterButton.m */, A2C89D5F0CFCBF57004CC2BC /* ButtonToolbarItem.m */, A28E1DDF0CFFD8EC00E16385 /* ButtonToolbarItem.h */, A225A4BE187E369C00CDE823 /* ShareToolbarItem.h */, A225A4BF187E369C00CDE823 /* ShareToolbarItem.m */, A2B5B4E71880665E0071A66A /* ShareTorrentFileHelper.h */, A2B5B4E81880665E0071A66A /* ShareTorrentFileHelper.m */, A21979890D07B78400438EA7 /* GroupToolbarItem.h */, A219798A0D07B78400438EA7 /* GroupToolbarItem.m */, A20BFFB50D091CC700CE5D2B /* ToolbarSegmentedCell.h */, A20BFFB60D091CC700CE5D2B /* ToolbarSegmentedCell.m */, A22180960D148A71007D09ED /* GroupsPrefsController.h */, A22180970D148A71007D09ED /* GroupsPrefsController.m */, A2FB701A0D95CAEA0001F331 /* GroupsController.h */, A2FB701B0D95CAEA0001F331 /* GroupsController.m */, A2451E6616ACE4EB00586E0E /* FileRenameSheetController.h */, A2451E6716ACE4EB00586E0E /* FileRenameSheetController.m */, A23F526D0F14395900AA02E3 /* PredicateEditorRowTemplateAny.h */, A23F526E0F14395900AA02E3 /* PredicateEditorRowTemplateAny.m */, A2D307A20D9EC6870051FD27 /* BlocklistDownloader.h */, A2D307A30D9EC6870051FD27 /* BlocklistDownloader.m */, A222E9850E6B21D9009FB003 /* BlocklistDownloaderViewController.h */, A222E9860E6B21D9009FB003 /* BlocklistDownloaderViewController.m */, A222EA790E6C32C4009FB003 /* BlocklistScheduler.h */, A222EA7A0E6C32C4009FB003 /* BlocklistScheduler.m */, A2AB883916A399A6008FAD50 /* VDKQueue */, ); name = Sources; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( 8D1107320486CEB800E47090 /* Transmission.app */, 4DDBB71909E16BAE00284745 /* transmissioncli */, 4D18389709DEC0030047D688 /* libtransmission.a */, BEFC1C000C07750000B0BB3C /* transmission-daemon */, BEFC1CF90C07822400B0BB3C /* transmission-remote */, BE75C3490C729E9500DBEFE0 /* libevent.a */, BE1183480CE160960002D0F3 /* libminiupnp.a */, 3C7A118D0D0B2EB800B5701F /* libnatpmp.a */, A22CFCBA0FC24F710009BD3E /* libdht.a */, A2E38544130DFEE3001F501B /* libutp.a */, A2F35BB915C5A0A100EBF632 /* QuickLookPlugin.qlgenerator */, C1639A6F1A55F4D600E42033 /* libb64.a */, ); name = Products; sourceTree = ""; }; 29B97314FDCFA39411CA2CEA /* Transmission */ = { isa = PBXGroup; children = ( 4DDBB70A09E16B3200284745 /* GUI */, A2F35BC315C5A0A100EBF632 /* QuickLookPlugin */, 4D1838DC09DEC04A0047D688 /* libtransmission */, 4DDBB71F09E16BFE00284745 /* CLI */, BEFC1C0B0C07754700B0BB3C /* daemon */, A22CFCB50FC24F630009BD3E /* dht */, A2E384BF130DFA49001F501B /* libutp */, BE75C3570C72A0D600DBEFE0 /* libevent */, BE1183410CE15DF00002D0F3 /* libminiupnp */, 3C7A11880D0B2E6700B5701F /* libnatpmp */, C1639A751A55F52800E42033 /* b64 */, 4DDBB71509E16B3F00284745 /* Libraries */, A2F35BBA15C5A0A100EBF632 /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, ); name = Transmission; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( A22A8D540AEEAFA5007E9CB9 /* Localizable.strings */, A259316A0A73B2CC002F4FE7 /* TransmissionHelp */, A2F8951E0A2D4BA500ED2127 /* Credits.rtf */, A2CB38AE0E1E6896002B514C /* COPYING */, A250EE800E2ED87B00A688E6 /* web */, 4DE5CCCA0981D9BE00BE280E /* Defaults.plist */, 8D1107310486CEB800E47090 /* Info.plist */, A22F1E540E7DA8030065DB9D /* sparkle_dsa_pub.pem */, 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, A23F50000D1D99D7002FCB97 /* MainMenu.xib */, A23F4FF00D1D98AD002FCB97 /* PrefsWindow.xib */, A29576010D11D63C0093B167 /* Creator.xib */, A26AF27C0D2DBDDF00FF7140 /* AddWindow.xib */, A21F1538117299F100CF5A9C /* AddMagnetWindow.xib */, A215BF5B0F02EBB800350CDB /* GroupRules.xib */, A233BD320D8C6585007EE7B4 /* MessageWindow.xib */, A233BD680D8CF2C7007EE7B4 /* StatsWindow.xib */, A231274B0D11D0B7003F9AFF /* AboutWindow.xib */, A2E57AC51310831400A7DAB1 /* StatusBar.xib */, A2E57B9B13109DC200A7DAB1 /* FilterBar.xib */, A2F7CF5413035F7B0016FF10 /* URLSheetWindow.xib */, A2D307B00D9EC9F50051FD27 /* BlocklistStatusWindow.xib */, A209ECA1114319C3002B02D1 /* InfoWindow.xib */, A209EAEA1142D294002B02D1 /* InfoGeneralView.xib */, A209EAE81142D294002B02D1 /* InfoActivityView.xib */, A209EB1F1142DD85002B02D1 /* InfoTrackersView.xib */, A209EBA61142EAF3002B02D1 /* InfoPeersView.xib */, A209EBD81142F52B002B02D1 /* InfoFileView.xib */, A209EC11114301C6002B02D1 /* InfoOptionsView.xib */, A220AF7913D7CC460035C512 /* GlobalOptionsPopover.xib */, A2451E6816ACE4EB00586E0E /* FileRenameSheetController.xib */, A20B6FAD0C4D9B040034AB1D /* PriorityNormalTemplate.png */, A2DC498915842ECC00758FF1 /* PriorityNormalTemplate@2x.png */, A20B6F6A0C4D842B0034AB1D /* PriorityLowTemplate.png */, A2DC498815842ECC00758FF1 /* PriorityLowTemplate@2x.png */, A20B6F820C4D8A610034AB1D /* PriorityHighTemplate.png */, A2DC498715842ECC00758FF1 /* PriorityHighTemplate@2x.png */, A2623B2C0D3DC2EF0045D19A /* PriorityControlNormal.png */, A2DC497C15842DDC00758FF1 /* PriorityControlNormal@2x.png */, A2623B2D0D3DC2EF0045D19A /* PriorityControlLow.png */, A2DC497B15842DDC00758FF1 /* PriorityControlLow@2x.png */, A2623B2E0D3DC2EF0045D19A /* PriorityControlHigh.png */, A2DC498115842E8A00758FF1 /* PriorityControlHigh@2x.png */, A2FB06950BFF484A0095564D /* Globe.png */, A2DC495915842C9500758FF1 /* Globe@2x.png */, A263D03D10DE6F010038DE27 /* Magnet.png */, A2DC496F15842D5C00758FF1 /* Magnet@2x.png */, A2F1511F0CD438BA001F3B0E /* Lock.png */, A2DC496D15842D5200758FF1 /* Lock@2x.png */, A245030B0D6A1FB000B49D00 /* UpArrowGroupTemplate.png */, A2DC49BD158430B300758FF1 /* UpArrowGroupTemplate@2x.png */, A245030D0D6A1FBC00B49D00 /* DownArrowGroupTemplate.png */, A2DC495315842C3300758FF1 /* DownArrowGroupTemplate@2x.png */, A2012AE10D77151D0056FD71 /* YingYangGroupTemplate.png */, A2DC49C3158430E200758FF1 /* YingYangGroupTemplate@2x.png */, A29AF4F80D01BAEB00D097EC /* UpArrowTemplate.png */, A2DC49BE158430B300758FF1 /* UpArrowTemplate@2x.png */, A29AF4F60D01BADC00D097EC /* DownArrowTemplate.png */, A2DC495515842C4600758FF1 /* DownArrowTemplate@2x.png */, A2F41DAA0D0B916B006CE378 /* YingYangTemplate.png */, A2DC49C5158430FB00758FF1 /* YingYangTemplate@2x.png */, A20152630D1C1BE70081714F /* PinTemplate.png */, A2DC497915842DC000758FF1 /* PinTemplate@2x.png */, A2F151150CD438A4001F3B0E /* YellowDot.png */, A2DC49C1158430CA00758FF1 /* YellowDot@2x.png */, A2F151160CD438A4001F3B0E /* RedDot.png */, A2DC498F15842EF000758FF1 /* RedDot@2x.png */, A2F151170CD438A4001F3B0E /* GreenDot.png */, A2DC495B15842CA000758FF1 /* GreenDot@2x.png */, A2EF7DEB0C96297400FA9811 /* PurpleDot.png */, A2DC498D15842EEA00758FF1 /* PurpleDot@2x.png */, A2BC19840CA9AF5A00DD302A /* CompleteCheck.png */, A2DC494F15842C1C00758FF1 /* CompleteCheck@2x.png */, A21DFF0F0A292B2B007C5F76 /* Transfers.png */, A2DC49B91584307300758FF1 /* Transfers@2x.png */, A2E2EA910EE321C200EB6308 /* Groups.png */, A2DC495D15842CB400758FF1 /* Groups@2x.png */, A2D0E0480A54A97C003C72CF /* Bandwidth.png */, A2DC494B15842BF700758FF1 /* Bandwidth@2x.png */, A2C0C5020E02CB6100D95339 /* Remote.png */, A2DC499115842F0000758FF1 /* Remote@2x.png */, 4D2784360905709500687951 /* Transmission.icns */, 4D043A7E090AE979009FEDA8 /* TransmissionDocument.icns */, A26146E00DD4A0160060F033 /* GroupsNoneTemplate.png */, A2DC495F15842CD300758FF1 /* GroupsNoneTemplate@2x.png */, A2F011980C27418800576FC0 /* CreateLarge.png */, A2DC495115842C2700758FF1 /* CreateLarge@2x.png */, A22D3AA30D00D1790079CFED /* TurtleTemplate.png */, A2DC49BB1584309F00758FF1 /* TurtleTemplate@2x.png */, A23D5DA61320570800E422BA /* CleanupTemplate.png */, A2DC494D15842C1000758FF1 /* CleanupTemplate@2x.png */, A277DA090C693D9C00DA2CD4 /* ActionOn.png */, A2DC494915842BE900758FF1 /* ActionOn@2x.png */, A2623B4D0D3DC6DF0045D19A /* ActionHover.png */, A2DC494715842ABD00758FF1 /* ActionHover@2x.png */, 35B037F90AC5B53800A10FDF /* ResumeNoWaitOn.png */, A2DC499615842F5800758FF1 /* ResumeNoWaitOn@2x.png */, 35B037FA0AC5B53800A10FDF /* ResumeNoWaitOff.png */, A2DC499515842F5800758FF1 /* ResumeNoWaitOff@2x.png */, A2623B3B0D3DC5930045D19A /* ResumeNoWaitHover.png */, A2DC499415842F5800758FF1 /* ResumeNoWaitHover@2x.png */, 4D6DAAC4090CE00500F43C22 /* RevealOff.png */, A2DC49A015842F9D00758FF1 /* RevealOff@2x.png */, 4D6DAAC5090CE00500F43C22 /* RevealOn.png */, A2DC49A115842F9D00758FF1 /* RevealOn@2x.png */, A2623B3C0D3DC5930045D19A /* RevealHover.png */, A2DC499F15842F9D00758FF1 /* RevealHover@2x.png */, 4DA6FDB80911233800450CB1 /* PauseOn.png */, A2DC497715842D9C00758FF1 /* PauseOn@2x.png */, A2623B3E0D3DC5930045D19A /* PauseHover.png */, A2DC497115842D8000758FF1 /* PauseHover@2x.png */, 4DA6FDB90911233800450CB1 /* PauseOff.png */, A2DC497515842D9700758FF1 /* PauseOff@2x.png */, 4DA6FDC3091141AD00450CB1 /* ResumeOff.png */, A2DC499715842F5800758FF1 /* ResumeOff@2x.png */, 4DA6FDC4091141AD00450CB1 /* ResumeOn.png */, A2DC499815842F5800758FF1 /* ResumeOn@2x.png */, A2623B3D0D3DC5930045D19A /* ResumeHover.png */, A2DC499315842F5700758FF1 /* ResumeHover@2x.png */, A25963E01068376200453B31 /* FavIcon.png */, A2DC495715842C7700758FF1 /* FavIcon@2x.png */, 4DDFDD20099A5D8E00189D81 /* DownloadBadge.png */, 4DDFDD21099A5D8E00189D81 /* UploadBadge.png */, A24B655F0D3F30870079EA4D /* QuitBadge.png */, A232D29D0A70903E00973B12 /* ToolbarFilterTemplate.png */, A2DC49A615842FC300758FF1 /* ToolbarFilterTemplate@2x.png */, 4DF7500808A103AD007B0D70 /* ToolbarInfoTemplate.png */, A2DC49A715842FC300758FF1 /* ToolbarInfoTemplate@2x.png */, 4DF7500708A103AD007B0D70 /* ToolbarOpenTemplate.png */, A2DC49AB15842FF200758FF1 /* ToolbarOpenTemplate@2x.png */, A2BB67780D5BA74600AB0618 /* ToolbarOpenWebTemplate.png */, A2DC49AC15842FF200758FF1 /* ToolbarOpenWebTemplate@2x.png */, 4DF7500908A103AD007B0D70 /* ToolbarRemoveTemplate.png */, A2DC49B31584303A00758FF1 /* ToolbarRemoveTemplate@2x.png */, A2E9AA750C249AF400085DCF /* ToolbarCreateTemplate.png */, A2DC49A515842FC300758FF1 /* ToolbarCreateTemplate@2x.png */, 4DE5CCB80981D27700BE280E /* ToolbarResumeAllTemplate.png */, A2DC49B41584303A00758FF1 /* ToolbarResumeAllTemplate@2x.png */, A25FCDDE0A37695F002BCBBE /* ToolbarResumeSelectedTemplate.png */, A2DC49B51584303A00758FF1 /* ToolbarResumeSelectedTemplate@2x.png */, 4DE5CCB90981D27700BE280E /* ToolbarPauseAllTemplate.png */, A2DC49AF1584300D00758FF1 /* ToolbarPauseAllTemplate@2x.png */, A25FCDDD0A37695F002BCBBE /* ToolbarPauseSelectedTemplate.png */, A2DC49B01584300D00758FF1 /* ToolbarPauseSelectedTemplate@2x.png */, A26E75950CB6AB4800226674 /* InfoGeneral.png */, A2DC496515842CFE00758FF1 /* InfoGeneral@2x.png */, A26E75870CB6AA7500226674 /* InfoOptions.png */, A2DC496715842D1B00758FF1 /* InfoOptions@2x.png */, A2DA36270CBC674900C2ED41 /* InfoActivity.png */, A2DC496115842CE800758FF1 /* InfoActivity@2x.png */, A2DA36280CBC674900C2ED41 /* InfoFiles.png */, A2DC496315842CF200758FF1 /* InfoFiles@2x.png */, A2DA36290CBC674900C2ED41 /* InfoPeers.png */, A2DC496915842D2C00758FF1 /* InfoPeers@2x.png */, A2F41F8D0D73595100B82116 /* InfoTracker.png */, A2DC496B15842D3E00758FF1 /* InfoTracker@2x.png */, ); name = Resources; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, 29B97324FDCFA39411CA2CEA /* AppKit.framework */, 4D3EA0A908AE13C600EA10C2 /* IOKit.framework */, 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, 29B97325FDCFA39411CA2CEA /* Foundation.framework */, A2E669780F5B8E5A00B4251A /* Security.framework */, A22CFB810FB66EF30009BD3E /* Carbon.framework */, A221DCC7104B3660008A642D /* Quartz.framework */, A261F1DB0A69A1610002815A /* Growl.framework */, A24F19070A3A790800C9C145 /* Sparkle.framework */, ); name = Frameworks; sourceTree = ""; }; 3C7A11880D0B2E6700B5701F /* libnatpmp */ = { isa = PBXGroup; children = ( 3C7A11910D0B2EE300B5701F /* getgateway.c */, 3C7A11920D0B2EE300B5701F /* getgateway.h */, 3C7A11930D0B2EE300B5701F /* natpmp.c */, 3C7A11940D0B2EE300B5701F /* natpmp.h */, ); name = libnatpmp; sourceTree = ""; }; 4D1838DC09DEC04A0047D688 /* libtransmission */ = { isa = PBXGroup; children = ( C1077A4A183EB29600634C22 /* error.c */, C1077A4B183EB29600634C22 /* error.h */, C1077A4C183EB29600634C22 /* file-posix.c */, C1305EB8186A134000F03351 /* file.c */, C1077A4D183EB29600634C22 /* file.h */, 4D80185710BBC0B0008A4AF2 /* magnet.c */, 4D80185810BBC0B0008A4AF2 /* magnet.h */, 4D8017E810BBC073008A4AF2 /* torrent-magnet.c */, 4D8017E910BBC073008A4AF2 /* torrent-magnet.h */, 0A6169A50FE5C9A200C66CE6 /* bitfield.c */, 0A6169A60FE5C9A200C66CE6 /* bitfield.h */, A22CFCA60FC24ED80009BD3E /* tr-dht.c */, A22CFCA70FC24ED80009BD3E /* tr-dht.h */, A284214212DA663E00FBDDBB /* tr-udp.c */, A284214312DA663E00FBDDBB /* tr-udp.h */, A2679292130E00A000CB7464 /* tr-utp.c */, A2679293130E00A000CB7464 /* tr-utp.h */, A220EC59118C8A060022B4BE /* tr-lpd.c */, A220EC5A118C8A060022B4BE /* tr-lpd.h */, A2AAB65B0DE0CF6200E04DDA /* rpcimpl.c */, A2AAB6590DE0CF6200E04DDA /* rpcimpl.h */, A2AAB6580DE0CF6200E04DDA /* rpc-server.c */, A2AAB65A0DE0CF6200E04DDA /* rpc-server.h */, A29DF8B60DB2544C00D04E5A /* resume.c */, A29DF8B70DB2544C00D04E5A /* resume.h */, A29DF8B80DB2544C00D04E5A /* torrent.h */, C1033E031A3279B800EF44D8 /* crypto-utils-fallback.c */, C1033E041A3279B800EF44D8 /* crypto-utils-openssl.c */, C1033E051A3279B800EF44D8 /* crypto-utils.c */, C1033E061A3279B800EF44D8 /* crypto-utils.h */, 4D36BA600CA2F00800A63CA5 /* crypto.c */, 4D36BA610CA2F00800A63CA5 /* crypto.h */, 4D36BA630CA2F00800A63CA5 /* handshake.c */, 4D36BA640CA2F00800A63CA5 /* handshake.h */, 4D36BA650CA2F00800A63CA5 /* peer-io.c */, 4D36BA660CA2F00800A63CA5 /* peer-io.h */, 4D36BA680CA2F00800A63CA5 /* peer-mgr.c */, 4D36BA690CA2F00800A63CA5 /* peer-mgr.h */, 4D36BA6A0CA2F00800A63CA5 /* peer-msgs.c */, 4D36BA6B0CA2F00800A63CA5 /* peer-msgs.h */, A292A6E40DFB45E5004B9C0A /* peer-common.h */, A292A6E50DFB45EC004B9C0A /* webseed.c */, A292A6E60DFB45EC004B9C0A /* webseed.h */, 4D36BA6C0CA2F00800A63CA5 /* ptrarray.h */, A24621350C769CF400088E81 /* trevent.h */, A24621360C769CF400088E81 /* trevent.c */, 4394AC640C74FB6000F367E8 /* ptrarray.c */, D4AF3B2D0C41F7A500D46B6B /* list.c */, D4AF3B2E0C41F7A500D46B6B /* list.h */, A2BE9C4E0C1E4ADA002D16E6 /* makemeta.c */, A2BE9C4F0C1E4ADA002D16E6 /* makemeta.h */, BEFC1DF00C07861A00B0BB3C /* version.h */, BEFC1DF10C07861A00B0BB3C /* utils.h */, BEFC1DF20C07861A00B0BB3C /* utils.c */, BEFC1DF30C07861A00B0BB3C /* upnp.h */, BEFC1DF40C07861A00B0BB3C /* upnp.c */, BEFC1DF50C07861A00B0BB3C /* transmission.h */, BEFC1DF60C07861A00B0BB3C /* session.c */, BEFC1E140C07861A00B0BB3C /* session.h */, A20152790D1C26EB0081714F /* torrent-ctor.c */, A23F299F132A447400E9A83B /* announcer-common.h */, A25964A4106D73A800453B31 /* announcer.c */, A25964A5106D73A800453B31 /* announcer.h */, A23F29A0132A447400E9A83B /* announcer-http.c */, A2AA9BE0132CAC8D00FA131E /* announcer-udp.c */, BEFC1DF90C07861A00B0BB3C /* torrent.c */, BEFC1DFC0C07861A00B0BB3C /* port-forwarding.h */, BEFC1DFD0C07861A00B0BB3C /* port-forwarding.c */, A21FBBA90EDA78C300BC3C51 /* bandwidth.h */, A21FBBAA0EDA78C300BC3C51 /* bandwidth.c */, A209EE5B1144B51E002B02D1 /* history.h */, A209EE5A1144B51E002B02D1 /* history.c */, A23547E011CD0B090046EAE6 /* cache.c */, A23547E111CD0B090046EAE6 /* cache.h */, BEFC1E020C07861A00B0BB3C /* platform.h */, BEFC1E030C07861A00B0BB3C /* platform.c */, A23FAE53178BC2950053DC5B /* platform-quota.h */, A23FAE52178BC2950053DC5B /* platform-quota.c */, BEFC1E0C0C07861A00B0BB3C /* net.h */, BEFC1E0D0C07861A00B0BB3C /* net.c */, A2EE726E14DCCC950093C99A /* natpmp_local.h */, BEFC1E0F0C07861A00B0BB3C /* natpmp.c */, BEFC1E100C07861A00B0BB3C /* metainfo.h */, BEFC1E110C07861A00B0BB3C /* metainfo.c */, BEFC1E150C07861A00B0BB3C /* inout.h */, BEFC1E160C07861A00B0BB3C /* inout.c */, BEFC1E190C07861A00B0BB3C /* fdlimit.h */, BEFC1E1A0C07861A00B0BB3C /* fdlimit.c */, BEFC1E1C0C07861A00B0BB3C /* completion.h */, BEFC1E1D0C07861A00B0BB3C /* completion.c */, BEFC1E1E0C07861A00B0BB3C /* clients.h */, BEFC1E1F0C07861A00B0BB3C /* clients.c */, A25D2CBA0CF4C7190096A262 /* stats.h */, A25D2CBB0CF4C7190096A262 /* stats.c */, A2D22A110D65EED100007D5F /* verify.h */, A2D22A100D65EED100007D5F /* verify.c */, A2D307930D9EC4860051FD27 /* blocklist.h */, A2D3078E0D9EC45F0051FD27 /* blocklist.c */, A29EBE530DC01FC9006CEE80 /* web.h */, A29EBE520DC01FC9006CEE80 /* web.c */, A25E03E00E4015380086C225 /* tr-getopt.h */, A25E03E10E4015380086C225 /* tr-getopt.c */, A2A7B329164F87D400B98C65 /* jsonsl.h */, A2A7B328164F87D400B98C65 /* jsonsl.c */, A25BFD63167BED3B0039D1AA /* variant-benc.c */, A25BFD64167BED3B0039D1AA /* variant-common.h */, A25BFD65167BED3B0039D1AA /* variant-json.c */, A25BFD67167BED3B0039D1AA /* variant.c */, A25BFD68167BED3B0039D1AA /* variant.h */, A2EA522F1686AC0D00180493 /* quark.c */, A2EA52301686AC0D00180493 /* quark.h */, A2AF23C616B44FA0003BC59E /* log.c */, A2AF23C716B44FA0003BC59E /* log.h */, A2A4EA0B0DE106E8000CE197 /* ConvertUTF.h */, A2A4EA0A0DE106E8000CE197 /* ConvertUTF.c */, 4DB74F070E8CD75100AEB1A8 /* wildmat.c */, C1FEE5751C3223CC00D62832 /* watchdir.c */, C1FEE5761C3223CC00D62832 /* watchdir.h */, C1FEE5731C3223CC00D62832 /* watchdir-generic.c */, C1FEE5741C3223CC00D62832 /* watchdir-kqueue.c */, C1FEE5721C3223CC00D62832 /* watchdir-common.h */, ); name = libtransmission; sourceTree = ""; }; 4DDBB70A09E16B3200284745 /* GUI */ = { isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, ); name = GUI; sourceTree = ""; }; 4DDBB71509E16B3F00284745 /* Libraries */ = { isa = PBXGroup; children = ( A27653A714369C5C009D3CCF /* libcrypto.0.9.8.dylib */, A2290D2D1442B23200B95A09 /* libcurl.4.dylib */, A296EF3411E5605E004A2781 /* libiconv.dylib */, A2B6141B1395ADE9000E0975 /* libz.dylib */, ); name = Libraries; sourceTree = ""; }; 4DDBB71F09E16BFE00284745 /* CLI */ = { isa = PBXGroup; children = ( A2B3FB450E5901E700FF78FB /* cli.c */, ); name = CLI; sourceTree = ""; }; A22CFCB50FC24F630009BD3E /* dht */ = { isa = PBXGroup; children = ( A22CFCC00FC24F890009BD3E /* dht.h */, A22CFCC10FC24F890009BD3E /* dht.c */, ); name = dht; sourceTree = ""; }; A234D0D40C79FB6000A82373 /* Additions */ = { isa = PBXGroup; children = ( 4DE5CC9B0980656F00BE280E /* NSStringAdditions.h */, 4DE5CC9C0980656F00BE280E /* NSStringAdditions.m */, A29D84021049C25600D1987A /* NSApplicationAdditions.h */, A29D84031049C25600D1987A /* NSApplicationAdditions.m */, A22BAE261388040500FB022F /* NSMutableArrayAdditions.h */, A22BAE271388040500FB022F /* NSMutableArrayAdditions.m */, A234EA521453563B000F3E97 /* NSImageAdditions.h */, A234EA531453563B000F3E97 /* NSImageAdditions.m */, ); name = Additions; sourceTree = ""; }; A26AF2220D2DA42800FF7140 /* File Outline View */ = { isa = PBXGroup; children = ( A26AF2180D2DA35A00FF7140 /* FileOutlineController.h */, A26AF2190D2DA35A00FF7140 /* FileOutlineController.m */, A2AF1C360A3D0F6200F1575D /* FileOutlineView.h */, A2AF1C370A3D0F6200F1575D /* FileOutlineView.m */, A2265F3F0B5EF5F40093DDA5 /* FileNameCell.h */, A2265F400B5EF5F40093DDA5 /* FileNameCell.m */, 35F373000C2DA88F00DAA8F2 /* FilePriorityCell.h */, 35F373010C2DA88F00DAA8F2 /* FilePriorityCell.m */, ); name = "File Outline View"; sourceTree = ""; }; A2AB883916A399A6008FAD50 /* VDKQueue */ = { isa = PBXGroup; children = ( A2AB883B16A399A6008FAD50 /* VDKQueue.h */, A2AB883C16A399A6008FAD50 /* VDKQueue.m */, ); name = VDKQueue; path = macosx/VDKQueue; sourceTree = ""; }; A2E384BF130DFA49001F501B /* libutp */ = { isa = PBXGroup; children = ( A2E384D2130DFB3A001F501B /* templates.h */, A2E384D3130DFB3A001F501B /* utp_config_example.h */, A2E384D4130DFB3A001F501B /* utp_config.h */, A2E384D5130DFB3A001F501B /* utp_utils.cpp */, A2E384D6130DFB3A001F501B /* utp_utils.h */, A2E384D7130DFB3A001F501B /* utp.cpp */, A2E384D8130DFB3A001F501B /* utp.h */, A2E384D9130DFB3A001F501B /* utypes.h */, A2E3850B130DFCCB001F501B /* StdAfx.h */, ); name = libutp; sourceTree = ""; }; A2F35BBA15C5A0A100EBF632 /* Frameworks */ = { isa = PBXGroup; children = ( A2F35BBB15C5A0A100EBF632 /* QuickLook.framework */, A2F35BE215C5A7F900EBF632 /* Foundation.framework */, A2F35BE015C5A7ED00EBF632 /* Cocoa.framework */, A2F35BBD15C5A0A100EBF632 /* ApplicationServices.framework */, A2F35BBF15C5A0A100EBF632 /* CoreServices.framework */, A2F35BC115C5A0A100EBF632 /* CoreFoundation.framework */, ); name = Frameworks; sourceTree = ""; }; A2F35BC315C5A0A100EBF632 /* QuickLookPlugin */ = { isa = PBXGroup; children = ( A2F35BC915C5A0A100EBF632 /* GenerateThumbnailForURL.m */, A2F35BCB15C5A0A100EBF632 /* GeneratePreviewForURL.m */, A2F35BCD15C5A0A100EBF632 /* main.c */, A2F35BC415C5A0A100EBF632 /* Supporting Files */, ); path = QuickLookPlugin; sourceTree = ""; }; A2F35BC415C5A0A100EBF632 /* Supporting Files */ = { isa = PBXGroup; children = ( A242AD9115F05D23002B3A6C /* Localizable.strings */, A29304EC15D7465100B1F726 /* style.css */, A2F35BC515C5A0A100EBF632 /* QuickLookPlugin-Info.plist */, A2F35BC615C5A0A100EBF632 /* InfoPlist.strings */, A2F35BCF15C5A0A100EBF632 /* QuickLookPlugin-Prefix.pch */, ); name = "Supporting Files"; sourceTree = ""; }; BE1183410CE15DF00002D0F3 /* libminiupnp */ = { isa = PBXGroup; children = ( A22B00AE116A9E90003315FC /* connecthostport.c */, BE1183610CE160D50002D0F3 /* igd_desc_parse.c */, BE1183620CE160D50002D0F3 /* minixml.c */, BE1183630CE160D50002D0F3 /* miniwget.c */, BE1183640CE160D50002D0F3 /* minissdpc.c */, BE1183650CE160D50002D0F3 /* minisoap.c */, BE1183660CE160D50002D0F3 /* upnpreplyparse.c */, BE1183670CE160D50002D0F3 /* upnpcommands.c */, BE1183680CE160D50002D0F3 /* miniupnpc.c */, A20162CB13DE497000E15488 /* portlistingparse.c */, A20162C713DE48BF00E15488 /* receivedata.c */, BE11834D0CE160C50002D0F3 /* bsdqueue.h */, A22B00AF116A9E90003315FC /* connecthostport.h */, BE11834E0CE160C50002D0F3 /* declspec.h */, BE11834F0CE160C50002D0F3 /* igd_desc_parse.h */, BE1183500CE160C50002D0F3 /* minixml.h */, BE1183510CE160C50002D0F3 /* miniwget.h */, BE1183520CE160C50002D0F3 /* minisoap.h */, A2F8CD420F3D0F4A00DB356A /* miniupnpcstrings.h */, A20162CF13DE49E500E15488 /* miniupnpctypes.h */, BE1183530CE160C50002D0F3 /* upnpreplyparse.h */, BE1183540CE160C50002D0F3 /* upnpcommands.h */, BE1183550CE160C50002D0F3 /* miniupnpc.h */, BE1183560CE160C50002D0F3 /* minissdpc.h */, A25485390EB66CBB004539DA /* codelength.h */, A20162CC13DE497000E15488 /* portlistingparse.h */, A20162C813DE48BF00E15488 /* receivedata.h */, ); name = libminiupnp; sourceTree = ""; }; BE75C3570C72A0D600DBEFE0 /* libevent */ = { isa = PBXGroup; children = ( A2074F4B12BEA8CE00F70985 /* buffer.c */, A2074F5012BEA8E000F70985 /* bufferevent_filter.c */, A2074F5112BEA8E000F70985 /* bufferevent_openssl.c */, A2074F5212BEA8E000F70985 /* bufferevent_pair.c */, A20750B712BEB66900F70985 /* bufferevent_ratelim.c */, A2074F5412BEA8E000F70985 /* bufferevent_sock.c */, A2074F5512BEA8E000F70985 /* bufferevent.c */, A2AA9BE2132CAE2000FA131E /* evdns.c */, A2074F7312BEAA3300F70985 /* event.c */, A2074F8412BEAA6600F70985 /* evmap.c */, A2074F9812BEAAAF00F70985 /* evthread.c */, A2074FA212BEAAC600F70985 /* evutil.c */, A29E653513F1603100048D71 /* evutil_rand.c */, A2074FAA12BEAAFF00F70985 /* http.c */, A2074FBE12BEAB9A00F70985 /* kqueue.c */, A2074FB612BEAB1E00F70985 /* listener.c */, A2074FC612BEABC800F70985 /* log.c */, A207503612BEADA200F70985 /* poll.c */, A207503412BEAD9C00F70985 /* select.c */, A2074FDD12BEAC5000F70985 /* signal.c */, ); name = libevent; sourceTree = ""; }; BEFC1C0B0C07754700B0BB3C /* daemon */ = { isa = PBXGroup; children = ( BEFC1C0E0C07756200B0BB3C /* daemon.c */, C1F690FE1AD0628400D95CF0 /* daemon.h */, C1F690FC1AD0627500D95CF0 /* daemon-posix.c */, BEFC1C140C07756200B0BB3C /* remote.c */, ); name = daemon; sourceTree = ""; }; C1639A751A55F52800E42033 /* b64 */ = { isa = PBXGroup; children = ( C1639A761A55F56600E42033 /* cdecode.c */, C1639A7A1A55F57200E42033 /* cdecode.h */, C1639A771A55F56600E42033 /* cencode.c */, C1639A7B1A55F57200E42033 /* cencode.h */, ); name = b64; sourceTree = ""; }; E1B6FBF80C0D719B0015FE4D /* Info Window */ = { isa = PBXGroup; children = ( A247A442114C701800547DFC /* InfoViewController.h */, A209EAC41142CF28002B02D1 /* InfoGeneralViewController.h */, A209EAC51142CF28002B02D1 /* InfoGeneralViewController.m */, A209EAC21142CF28002B02D1 /* InfoActivityViewController.h */, A209EAC31142CF28002B02D1 /* InfoActivityViewController.m */, A209EAFF1142D3A5002B02D1 /* InfoTrackersViewController.h */, A209EB001142D3A5002B02D1 /* InfoTrackersViewController.m */, A209EB9B1142E59A002B02D1 /* InfoPeersViewController.h */, A209EB9C1142E59A002B02D1 /* InfoPeersViewController.m */, A209EBCC1142F2B4002B02D1 /* InfoFileViewController.h */, A209EBCD1142F2B4002B02D1 /* InfoFileViewController.m */, A209EBF71142FEEE002B02D1 /* InfoOptionsViewController.h */, A209EBF81142FEEE002B02D1 /* InfoOptionsViewController.m */, A257C17F0CAD3003004E121C /* PeerTableView.h */, A257C1800CAD3003004E121C /* PeerTableView.m */, A2E23AC30CB5E1930002BB25 /* InfoTabButtonCell.h */, A2E23AC40CB5E1930002BB25 /* InfoTabButtonCell.m */, A25BB02812F4F517004B724E /* InfoTabButtonBack.h */, A25BB02912F4F517004B724E /* InfoTabButtonBack.m */, A200B8390A2263BA007BBB1E /* InfoWindowController.h */, A200B83A0A2263BA007BBB1E /* InfoWindowController.m */, A2A1CB770BF29D5500AE959F /* PeerProgressIndicatorCell.h */, A2A1CB780BF29D5500AE959F /* PeerProgressIndicatorCell.m */, A2AA579A0ADFCAB400CA59F6 /* PiecesView.h */, A2AA579B0ADFCAB400CA59F6 /* PiecesView.m */, A2725D5B0DE7507C003445E7 /* TrackerTableView.h */, A2725D5C0DE7507C003445E7 /* TrackerTableView.m */, A21A9D3F106EC2E800F1C3C1 /* TrackerCell.h */, A21A9D40106EC2E800F1C3C1 /* TrackerCell.m */, A2D7744F154CC25700A62B93 /* WebSeedTableView.h */, A2D77450154CC25700A62B93 /* WebSeedTableView.m */, A263CFBE10DD67670038DE27 /* InfoTextField.h */, A263CFBF10DD67670038DE27 /* InfoTextField.m */, ); name = "Info Window"; sourceTree = ""; }; E1B6FBFD0C0D72430015FE4D /* Prefs Window */ = { isa = PBXGroup; children = ( 4D118E1808CB46B20033958F /* PrefsController.h */, 4D118E1908CB46B20033958F /* PrefsController.m */, A2710E740A86796000CE4F7D /* PrefsWindow.h */, A2710E750A86796000CE4F7D /* PrefsWindow.m */, A29C8B340ACC6EB3000ED9F9 /* PortChecker.h */, A29C8B350ACC6EB3000ED9F9 /* PortChecker.m */, A232F07C0EEA034A00041646 /* BonjourController.h */, A232F07D0EEA034A00041646 /* BonjourController.m */, ); name = "Prefs Window"; sourceTree = ""; }; E1B6FC000C0D72A00015FE4D /* Overlay Window */ = { isa = PBXGroup; children = ( A2385DD30BFE06C800B24EF6 /* DragOverlayWindow.h */, A2385DD20BFE06C800B24EF6 /* DragOverlayWindow.m */, A2FB057C0BFEB6800095564D /* DragOverlayView.h */, A2FB057D0BFEB6800095564D /* DragOverlayView.m */, ); name = "Overlay Window"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 3C7A11890D0B2EB800B5701F /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 3C7A11980D0B2EE300B5701F /* getgateway.h in Headers */, 3C7A119A0D0B2EE300B5701F /* natpmp.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 4D18389309DEC0030047D688 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( C1077A51183EB29600634C22 /* file.h in Headers */, BEFC1E290C07861A00B0BB3C /* version.h in Headers */, BEFC1E2A0C07861A00B0BB3C /* utils.h in Headers */, BEFC1E2C0C07861A00B0BB3C /* upnp.h in Headers */, A2AAB65D0DE0CF6200E04DDA /* rpcimpl.h in Headers */, A2AAB65E0DE0CF6200E04DDA /* rpc-server.h in Headers */, BEFC1E350C07861A00B0BB3C /* port-forwarding.h in Headers */, BEFC1E3B0C07861A00B0BB3C /* platform.h in Headers */, BEFC1E450C07861A00B0BB3C /* net.h in Headers */, BEFC1E490C07861A00B0BB3C /* metainfo.h in Headers */, BEFC1E4D0C07861A00B0BB3C /* session.h in Headers */, C1FEE5771C3223CC00D62832 /* watchdir-common.h in Headers */, BEFC1E4E0C07861A00B0BB3C /* inout.h in Headers */, BEFC1E520C07861A00B0BB3C /* fdlimit.h in Headers */, BEFC1E550C07861A00B0BB3C /* completion.h in Headers */, BEFC1E570C07861A00B0BB3C /* clients.h in Headers */, A2BE9C530C1E4AF7002D16E6 /* makemeta.h in Headers */, D4AF3B300C41F7A600D46B6B /* list.h in Headers */, A24621410C769D0900088E81 /* trevent.h in Headers */, 4D36BA700CA2F00800A63CA5 /* crypto.h in Headers */, 4D36BA730CA2F00800A63CA5 /* handshake.h in Headers */, 4D36BA750CA2F00800A63CA5 /* peer-io.h in Headers */, 4D36BA780CA2F00800A63CA5 /* peer-mgr.h in Headers */, 4D36BA7A0CA2F00800A63CA5 /* peer-msgs.h in Headers */, 4D36BA7B0CA2F00800A63CA5 /* ptrarray.h in Headers */, A25D2CBE0CF4C73E0096A262 /* stats.h in Headers */, C1033E0A1A3279B800EF44D8 /* crypto-utils.h in Headers */, A29DF8BA0DB2544C00D04E5A /* resume.h in Headers */, A29DF8BB0DB2544C00D04E5A /* torrent.h in Headers */, A29DF8BE0DB2545F00D04E5A /* verify.h in Headers */, C1FEE57B1C3223CC00D62832 /* watchdir.h in Headers */, A2AAB6650DE0D08B00E04DDA /* blocklist.h in Headers */, A2A4E9210DE0F7E9000CE197 /* web.h in Headers */, A2A4EA0F0DE106EE000CE197 /* ConvertUTF.h in Headers */, A25E03E20E4015380086C225 /* tr-getopt.h in Headers */, A21FBBAB0EDA78C300BC3C51 /* bandwidth.h in Headers */, A22CFCA90FC24ED80009BD3E /* tr-dht.h in Headers */, 0A6169A80FE5C9A200C66CE6 /* bitfield.h in Headers */, A25964A7106D73A800453B31 /* announcer.h in Headers */, 4D8017EB10BBC073008A4AF2 /* torrent-magnet.h in Headers */, 4D80185A10BBC0B0008A4AF2 /* magnet.h in Headers */, A209EE5D1144B51E002B02D1 /* history.h in Headers */, A247A443114C701800547DFC /* InfoViewController.h in Headers */, A220EC5C118C8A060022B4BE /* tr-lpd.h in Headers */, A23547E311CD0B090046EAE6 /* cache.h in Headers */, A284214512DA663E00FBDDBB /* tr-udp.h in Headers */, C1077A4F183EB29600634C22 /* error.h in Headers */, A2679295130E00A000CB7464 /* tr-utp.h in Headers */, A23F29A1132A447400E9A83B /* announcer-common.h in Headers */, A2EE726F14DCCC950093C99A /* natpmp_local.h in Headers */, A2D77451154CC25700A62B93 /* WebSeedTableView.h in Headers */, A2A7B32B164F87D400B98C65 /* jsonsl.h in Headers */, A25BFD6A167BED3B0039D1AA /* variant-common.h in Headers */, A25BFD6E167BED3B0039D1AA /* variant.h in Headers */, A2EA52321686AC0D00180493 /* quark.h in Headers */, A2AF23C916B44FA0003BC59E /* log.h in Headers */, A23FAE55178BC2950053DC5B /* platform-quota.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; A22CFCB60FC24F710009BD3E /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( A22CFCC20FC24F890009BD3E /* dht.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; A2E384CA130DFB1D001F501B /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( A2E384DA130DFB3A001F501B /* templates.h in Headers */, A2E384DC130DFB3A001F501B /* utp_config.h in Headers */, A2E384DE130DFB3A001F501B /* utp_utils.h in Headers */, A2E384E0130DFB3A001F501B /* utp.h in Headers */, A2E384E1130DFB3A001F501B /* utypes.h in Headers */, A2E3850C130DFCCB001F501B /* StdAfx.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; BE1183440CE160960002D0F3 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( BE1183570CE160C50002D0F3 /* bsdqueue.h in Headers */, BE1183580CE160C50002D0F3 /* declspec.h in Headers */, BE1183590CE160C50002D0F3 /* igd_desc_parse.h in Headers */, BE11835A0CE160C50002D0F3 /* minixml.h in Headers */, BE11835B0CE160C50002D0F3 /* miniwget.h in Headers */, BE11835C0CE160C50002D0F3 /* minisoap.h in Headers */, BE11835D0CE160C50002D0F3 /* upnpreplyparse.h in Headers */, BE11835E0CE160C50002D0F3 /* upnpcommands.h in Headers */, BE11835F0CE160C50002D0F3 /* miniupnpc.h in Headers */, BE1183600CE160C50002D0F3 /* minissdpc.h in Headers */, A254853C0EB66CD4004539DA /* codelength.h in Headers */, A2F8CD430F3D0F4A00DB356A /* miniupnpcstrings.h in Headers */, A22B00B2116A9E9F003315FC /* connecthostport.h in Headers */, A20162CA13DE48BF00E15488 /* receivedata.h in Headers */, A20162CE13DE497000E15488 /* portlistingparse.h in Headers */, A20162D013DE49E500E15488 /* miniupnpctypes.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; BE75C3450C729E9500DBEFE0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; C1639A6D1A55F4D600E42033 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( C1639A7D1A55F57200E42033 /* cencode.h in Headers */, C1639A7C1A55F57200E42033 /* cdecode.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 3C7A118C0D0B2EB800B5701F /* natpmp */ = { isa = PBXNativeTarget; buildConfigurationList = 3C7A119B0D0B2EE300B5701F /* Build configuration list for PBXNativeTarget "natpmp" */; buildPhases = ( 3C7A11890D0B2EB800B5701F /* Headers */, 3C7A118A0D0B2EB800B5701F /* Sources */, 3C7A118B0D0B2EB800B5701F /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = natpmp; productName = natpmp; productReference = 3C7A118D0D0B2EB800B5701F /* libnatpmp.a */; productType = "com.apple.product-type.library.static"; }; 4D18389609DEC0030047D688 /* libtransmission */ = { isa = PBXNativeTarget; buildConfigurationList = 4D18389B09DEC01E0047D688 /* Build configuration list for PBXNativeTarget "libtransmission" */; buildPhases = ( 4DC4AA3D0B05673D0005DB76 /* ShellScript */, 4D18389309DEC0030047D688 /* Headers */, 4D18389409DEC0030047D688 /* Sources */, BE75C3860C72A1D300DBEFE0 /* Frameworks */, ); buildRules = ( ); dependencies = ( A226FDB10D0CDF6E005A7F71 /* PBXTargetDependency */, BE1183760CE161040002D0F3 /* PBXTargetDependency */, BE75C34F0C729ED300DBEFE0 /* PBXTargetDependency */, A22CFCC70FC24F990009BD3E /* PBXTargetDependency */, A2E384E4130DFB51001F501B /* PBXTargetDependency */, C165AB8D1A55FAA900D37711 /* PBXTargetDependency */, ); name = libtransmission; productName = transmission; productReference = 4D18389709DEC0030047D688 /* libtransmission.a */; productType = "com.apple.product-type.library.static"; }; 4DDBB71809E16BAE00284745 /* transmissioncli */ = { isa = PBXNativeTarget; buildConfigurationList = 4DDBB71D09E16BF100284745 /* Build configuration list for PBXNativeTarget "transmissioncli" */; buildPhases = ( 4DDBB71609E16BAE00284745 /* Sources */, 4DDBB71709E16BAE00284745 /* Frameworks */, ); buildRules = ( ); dependencies = ( 4D9A2BF509E16D30002D0FF9 /* PBXTargetDependency */, ); name = transmissioncli; productName = transmissioncli; productReference = 4DDBB71909E16BAE00284745 /* transmissioncli */; productType = "com.apple.product-type.tool"; }; 8D1107260486CEB800E47090 /* Transmission */ = { isa = PBXNativeTarget; buildConfigurationList = 4DF0C596089918A300DD8943 /* Build configuration list for PBXNativeTarget "Transmission" */; buildPhases = ( 8D1107290486CEB800E47090 /* Resources */, 8D11072C0486CEB800E47090 /* Sources */, 8D11072E0486CEB800E47090 /* Frameworks */, A24F191B0A3A792300C9C145 /* Copy Files */, A2EB2E7615C8CF1C00FBD5B4 /* CopyFiles */, ); buildRules = ( ); dependencies = ( A2EB2E7515C8CCE900FBD5B4 /* PBXTargetDependency */, 4D1838E609DEC1170047D688 /* PBXTargetDependency */, ); name = Transmission; productInstallPath = "$(HOME)/Applications"; productName = Transmission; productReference = 8D1107320486CEB800E47090 /* Transmission.app */; productType = "com.apple.product-type.application"; }; A22CFCB90FC24F710009BD3E /* dht */ = { isa = PBXNativeTarget; buildConfigurationList = A22CFCC40FC24F8A0009BD3E /* Build configuration list for PBXNativeTarget "dht" */; buildPhases = ( A22CFCB60FC24F710009BD3E /* Headers */, A22CFCB70FC24F710009BD3E /* Sources */, A22CFCB80FC24F710009BD3E /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = dht; productName = DHT; productReference = A22CFCBA0FC24F710009BD3E /* libdht.a */; productType = "com.apple.product-type.library.static"; }; A2E384CD130DFB1D001F501B /* utp */ = { isa = PBXNativeTarget; buildConfigurationList = A2E384E2130DFB3A001F501B /* Build configuration list for PBXNativeTarget "utp" */; buildPhases = ( A2E384CA130DFB1D001F501B /* Headers */, A2E384CB130DFB1D001F501B /* Sources */, A2E384CC130DFB1D001F501B /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = utp; productName = libutp; productReference = A2E38544130DFEE3001F501B /* libutp.a */; productType = "com.apple.product-type.library.static"; }; A2F35BB815C5A0A100EBF632 /* QuickLookPlugin */ = { isa = PBXNativeTarget; buildConfigurationList = A2F35BD015C5A0A100EBF632 /* Build configuration list for PBXNativeTarget "QuickLookPlugin" */; buildPhases = ( A2F35BB315C5A0A100EBF632 /* Sources */, A2F35BB415C5A0A100EBF632 /* Frameworks */, A2F35BB615C5A0A100EBF632 /* Resources */, ); buildRules = ( ); dependencies = ( A2F35BD615C5A1A100EBF632 /* PBXTargetDependency */, ); name = QuickLookPlugin; productName = QuickLookPlugin; productReference = A2F35BB915C5A0A100EBF632 /* QuickLookPlugin.qlgenerator */; productType = "com.apple.product-type.bundle"; }; BE1183470CE160960002D0F3 /* miniupnp */ = { isa = PBXNativeTarget; buildConfigurationList = BE11834C0CE160A80002D0F3 /* Build configuration list for PBXNativeTarget "miniupnp" */; buildPhases = ( A2305097100C0293003FDB0C /* ShellScript */, BE1183440CE160960002D0F3 /* Headers */, BE1183450CE160960002D0F3 /* Sources */, BE1183460CE160960002D0F3 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = miniupnp; productName = miniupnp; productReference = BE1183480CE160960002D0F3 /* libminiupnp.a */; productType = "com.apple.product-type.library.static"; }; BE75C3480C729E9500DBEFE0 /* event */ = { isa = PBXNativeTarget; buildConfigurationList = BE75C34A0C729EB600DBEFE0 /* Build configuration list for PBXNativeTarget "event" */; buildPhases = ( BE75C3510C729EE100DBEFE0 /* ShellScript */, BE75C3450C729E9500DBEFE0 /* Headers */, BE75C3460C729E9500DBEFE0 /* Sources */, BE75C3470C729E9500DBEFE0 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = event; productName = event; productReference = BE75C3490C729E9500DBEFE0 /* libevent.a */; productType = "com.apple.product-type.library.static"; }; BEFC1BFF0C07750000B0BB3C /* transmission-daemon */ = { isa = PBXNativeTarget; buildConfigurationList = BEFC1C090C07753800B0BB3C /* Build configuration list for PBXNativeTarget "transmission-daemon" */; buildPhases = ( BEFC1BFD0C07750000B0BB3C /* Sources */, BEFC1BFE0C07750000B0BB3C /* Frameworks */, ); buildRules = ( ); dependencies = ( BEFC1C030C07751A00B0BB3C /* PBXTargetDependency */, ); name = "transmission-daemon"; productName = "transmission-daemon"; productReference = BEFC1C000C07750000B0BB3C /* transmission-daemon */; productType = "com.apple.product-type.tool"; }; BEFC1CEA0C07822400B0BB3C /* transmission-remote */ = { isa = PBXNativeTarget; buildConfigurationList = BEFC1CF70C07822400B0BB3C /* Build configuration list for PBXNativeTarget "transmission-remote" */; buildPhases = ( BEFC1CED0C07822400B0BB3C /* Sources */, BEFC1CF30C07822400B0BB3C /* Frameworks */, ); buildRules = ( ); dependencies = ( BEFC1CEB0C07822400B0BB3C /* PBXTargetDependency */, ); name = "transmission-remote"; productName = "transmission-daemon"; productReference = BEFC1CF90C07822400B0BB3C /* transmission-remote */; productType = "com.apple.product-type.tool"; }; C1639A6E1A55F4D600E42033 /* b64 */ = { isa = PBXNativeTarget; buildConfigurationList = C1639A731A55F4D600E42033 /* Build configuration list for PBXNativeTarget "b64" */; buildPhases = ( C1639A6B1A55F4D600E42033 /* Sources */, C1639A6C1A55F4D600E42033 /* Frameworks */, C1639A6D1A55F4D600E42033 /* Headers */, ); buildRules = ( ); dependencies = ( ); name = b64; productName = b64; productReference = C1639A6F1A55F4D600E42033 /* libb64.a */; productType = "com.apple.product-type.library.static"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; LastUpgradeCheck = 0420; ORGANIZATIONNAME = "The Transmission Project"; TargetAttributes = { C1639A6E1A55F4D600E42033 = { CreatedOnToolsVersion = 6.1.1; }; }; }; buildConfigurationList = 4DF0C59A089918A300DD8943 /* Build configuration list for PBXProject "Transmission" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( en, es, fr, it, nl, ru, tr, de, da, "pt-PT", ); mainGroup = 29B97314FDCFA39411CA2CEA /* Transmission */; projectDirPath = ""; projectRoot = ""; targets = ( 8D1107260486CEB800E47090 /* Transmission */, A2F35BB815C5A0A100EBF632 /* QuickLookPlugin */, 4D18389609DEC0030047D688 /* libtransmission */, 4DDBB71809E16BAE00284745 /* transmissioncli */, BEFC1BFF0C07750000B0BB3C /* transmission-daemon */, BEFC1CEA0C07822400B0BB3C /* transmission-remote */, A22CFCB90FC24F710009BD3E /* dht */, A2E384CD130DFB1D001F501B /* utp */, BE75C3480C729E9500DBEFE0 /* event */, BE1183470CE160960002D0F3 /* miniupnp */, 3C7A118C0D0B2EB800B5701F /* natpmp */, C1639A6E1A55F4D600E42033 /* b64 */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8D1107290486CEB800E47090 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, 4DF7500C08A103AD007B0D70 /* ToolbarOpenTemplate.png in Resources */, 4DF7500D08A103AD007B0D70 /* ToolbarInfoTemplate.png in Resources */, 4DF7500E08A103AD007B0D70 /* ToolbarRemoveTemplate.png in Resources */, 4D043A7F090AE979009FEDA8 /* TransmissionDocument.icns in Resources */, 4D6DAAC6090CE00500F43C22 /* RevealOff.png in Resources */, 4D6DAAC7090CE00500F43C22 /* RevealOn.png in Resources */, 4DA6FDBA0911233800450CB1 /* PauseOn.png in Resources */, 4DA6FDBB0911233800450CB1 /* PauseOff.png in Resources */, 4DA6FDC5091141AD00450CB1 /* ResumeOff.png in Resources */, 4DA6FDC6091141AD00450CB1 /* ResumeOn.png in Resources */, 4DE5CCBA0981D27700BE280E /* ToolbarResumeAllTemplate.png in Resources */, 4DE5CCBB0981D27700BE280E /* ToolbarPauseAllTemplate.png in Resources */, 4DE5CCCB0981D9BE00BE280E /* Defaults.plist in Resources */, 4DDFDD22099A5D8E00189D81 /* DownloadBadge.png in Resources */, 4DDFDD23099A5D8E00189D81 /* UploadBadge.png in Resources */, A21DFF100A292B2B007C5F76 /* Transfers.png in Resources */, A29B0C270BD15FEF0006F230 /* Credits.rtf in Resources */, A2F40AE40A361C00006B8288 /* Transmission.icns in Resources */, A25FCDEF0A3769A6002BCBBE /* ToolbarPauseSelectedTemplate.png in Resources */, A25FCDF00A3769AC002BCBBE /* ToolbarResumeSelectedTemplate.png in Resources */, A2D0E0490A54A97C003C72CF /* Bandwidth.png in Resources */, A232D29E0A70903E00973B12 /* ToolbarFilterTemplate.png in Resources */, A259317E0A73B2CC002F4FE7 /* TransmissionHelp in Resources */, 35B038130AC5B6EB00A10FDF /* ResumeNoWaitOn.png in Resources */, 35B038140AC5B6EC00A10FDF /* ResumeNoWaitOff.png in Resources */, A22A8D560AEEAFA5007E9CB9 /* Localizable.strings in Resources */, A241528B0C0261B8007DD3B4 /* Globe.png in Resources */, A2E9AA760C249AF400085DCF /* ToolbarCreateTemplate.png in Resources */, A2F011990C27418800576FC0 /* CreateLarge.png in Resources */, A20B6F6B0C4D842B0034AB1D /* PriorityLowTemplate.png in Resources */, A20B6F830C4D8A610034AB1D /* PriorityHighTemplate.png in Resources */, A20B6FAE0C4D9B040034AB1D /* PriorityNormalTemplate.png in Resources */, A277DA0B0C693D9C00DA2CD4 /* ActionOn.png in Resources */, A2EF7DEC0C96297400FA9811 /* PurpleDot.png in Resources */, A2BC19850CA9AF5A00DD302A /* CompleteCheck.png in Resources */, A26E75880CB6AA7500226674 /* InfoOptions.png in Resources */, A26E75960CB6AB4800226674 /* InfoGeneral.png in Resources */, A2DA362A0CBC674900C2ED41 /* InfoActivity.png in Resources */, A2DA362B0CBC674900C2ED41 /* InfoFiles.png in Resources */, A2DA362C0CBC674900C2ED41 /* InfoPeers.png in Resources */, A2F151180CD438A4001F3B0E /* YellowDot.png in Resources */, A2F151190CD438A4001F3B0E /* RedDot.png in Resources */, A2F1511A0CD438A4001F3B0E /* GreenDot.png in Resources */, A2F151200CD438BA001F3B0E /* Lock.png in Resources */, A22D3AA60D00D1790079CFED /* TurtleTemplate.png in Resources */, A29AF4F70D01BADC00D097EC /* DownArrowTemplate.png in Resources */, A29AF4F90D01BAEB00D097EC /* UpArrowTemplate.png in Resources */, A2F41DAB0D0B916B006CE378 /* YingYangTemplate.png in Resources */, A231274C0D11D0B7003F9AFF /* AboutWindow.xib in Resources */, A29576030D11D63C0093B167 /* Creator.xib in Resources */, A20152640D1C1BE70081714F /* PinTemplate.png in Resources */, A23F4FF20D1D98AD002FCB97 /* PrefsWindow.xib in Resources */, A23F50020D1D99D7002FCB97 /* MainMenu.xib in Resources */, A26AF27E0D2DBDDF00FF7140 /* AddWindow.xib in Resources */, A2623B2F0D3DC2EF0045D19A /* PriorityControlNormal.png in Resources */, A2623B300D3DC2EF0045D19A /* PriorityControlLow.png in Resources */, A2623B310D3DC2EF0045D19A /* PriorityControlHigh.png in Resources */, A2623B3F0D3DC5930045D19A /* ResumeNoWaitHover.png in Resources */, A2623B400D3DC5930045D19A /* RevealHover.png in Resources */, A2623B410D3DC5930045D19A /* ResumeHover.png in Resources */, A2623B420D3DC5930045D19A /* PauseHover.png in Resources */, A2623B4E0D3DC6DF0045D19A /* ActionHover.png in Resources */, A24B65600D3F30870079EA4D /* QuitBadge.png in Resources */, A2BB67790D5BA74600AB0618 /* ToolbarOpenWebTemplate.png in Resources */, A245030C0D6A1FB000B49D00 /* UpArrowGroupTemplate.png in Resources */, A245030E0D6A1FBC00B49D00 /* DownArrowGroupTemplate.png in Resources */, A2F41F8E0D73595100B82116 /* InfoTracker.png in Resources */, A2012AE20D77151D0056FD71 /* YingYangGroupTemplate.png in Resources */, A233BD330D8C6585007EE7B4 /* MessageWindow.xib in Resources */, A233BD690D8CF2C7007EE7B4 /* StatsWindow.xib in Resources */, A2D307B10D9EC9F50051FD27 /* BlocklistStatusWindow.xib in Resources */, A26146E10DD4A0160060F033 /* GroupsNoneTemplate.png in Resources */, A2C0C5030E02CB6100D95339 /* Remote.png in Resources */, A2CB38AF0E1E6896002B514C /* COPYING in Resources */, A250EEB60E2ED87B00A688E6 /* web in Resources */, A22F1E550E7DA8030065DB9D /* sparkle_dsa_pub.pem in Resources */, A2E2EA920EE321C200EB6308 /* Groups.png in Resources */, A215BF5C0F02EBB800350CDB /* GroupRules.xib in Resources */, A25963E11068376200453B31 /* FavIcon.png in Resources */, A263D03E10DE6F010038DE27 /* Magnet.png in Resources */, A209EAEC1142D294002B02D1 /* InfoActivityView.xib in Resources */, A209EAED1142D294002B02D1 /* InfoGeneralView.xib in Resources */, A209EB201142DD85002B02D1 /* InfoTrackersView.xib in Resources */, A209EBA71142EAF3002B02D1 /* InfoPeersView.xib in Resources */, A209EBD91142F52B002B02D1 /* InfoFileView.xib in Resources */, A209EC12114301C6002B02D1 /* InfoOptionsView.xib in Resources */, A209ECA2114319C3002B02D1 /* InfoWindow.xib in Resources */, A21F15AD11729A9F00CF5A9C /* AddMagnetWindow.xib in Resources */, A2F7CF5513035F7B0016FF10 /* URLSheetWindow.xib in Resources */, A2E57AC61310831400A7DAB1 /* StatusBar.xib in Resources */, A2E57B9C13109DC200A7DAB1 /* FilterBar.xib in Resources */, A23D5DA71320570800E422BA /* CleanupTemplate.png in Resources */, A220AF7B13D7CC460035C512 /* GlobalOptionsPopover.xib in Resources */, A2DC494815842ABE00758FF1 /* ActionHover@2x.png in Resources */, A2DC494A15842BE900758FF1 /* ActionOn@2x.png in Resources */, A2DC494C15842BF700758FF1 /* Bandwidth@2x.png in Resources */, A2DC494E15842C1000758FF1 /* CleanupTemplate@2x.png in Resources */, A2DC495015842C1C00758FF1 /* CompleteCheck@2x.png in Resources */, A2DC495215842C2700758FF1 /* CreateLarge@2x.png in Resources */, A2DC495415842C3300758FF1 /* DownArrowGroupTemplate@2x.png in Resources */, A2DC495615842C4600758FF1 /* DownArrowTemplate@2x.png in Resources */, A2DC495815842C7700758FF1 /* FavIcon@2x.png in Resources */, A2DC495A15842C9500758FF1 /* Globe@2x.png in Resources */, A2DC495C15842CA000758FF1 /* GreenDot@2x.png in Resources */, A2DC495E15842CB400758FF1 /* Groups@2x.png in Resources */, A2DC496015842CD300758FF1 /* GroupsNoneTemplate@2x.png in Resources */, A2DC496215842CE800758FF1 /* InfoActivity@2x.png in Resources */, A2DC496415842CF200758FF1 /* InfoFiles@2x.png in Resources */, A2DC496615842CFE00758FF1 /* InfoGeneral@2x.png in Resources */, A2DC496815842D1B00758FF1 /* InfoOptions@2x.png in Resources */, A2DC496A15842D2C00758FF1 /* InfoPeers@2x.png in Resources */, A2DC496C15842D3F00758FF1 /* InfoTracker@2x.png in Resources */, A2DC496E15842D5200758FF1 /* Lock@2x.png in Resources */, A2DC497015842D5C00758FF1 /* Magnet@2x.png in Resources */, A2DC497215842D8000758FF1 /* PauseHover@2x.png in Resources */, C15320211C82602500CC21E2 /* Info.plist in Resources */, A2DC497615842D9700758FF1 /* PauseOff@2x.png in Resources */, A2DC497815842D9C00758FF1 /* PauseOn@2x.png in Resources */, A2DC497A15842DC100758FF1 /* PinTemplate@2x.png in Resources */, A2DC497E15842DDC00758FF1 /* PriorityControlLow@2x.png in Resources */, A2DC497F15842DDC00758FF1 /* PriorityControlNormal@2x.png in Resources */, A2DC498415842E8A00758FF1 /* PriorityControlHigh@2x.png in Resources */, A2DC498A15842ECC00758FF1 /* PriorityHighTemplate@2x.png in Resources */, A2DC498B15842ECC00758FF1 /* PriorityLowTemplate@2x.png in Resources */, A2DC498C15842ECC00758FF1 /* PriorityNormalTemplate@2x.png in Resources */, A2DC498E15842EEA00758FF1 /* PurpleDot@2x.png in Resources */, A2DC499015842EF000758FF1 /* RedDot@2x.png in Resources */, A2DC499215842F0000758FF1 /* Remote@2x.png in Resources */, A2DC499915842F5800758FF1 /* ResumeHover@2x.png in Resources */, A2DC499A15842F5800758FF1 /* ResumeNoWaitHover@2x.png in Resources */, A2DC499B15842F5800758FF1 /* ResumeNoWaitOff@2x.png in Resources */, A2DC499C15842F5800758FF1 /* ResumeNoWaitOn@2x.png in Resources */, A2DC499D15842F5800758FF1 /* ResumeOff@2x.png in Resources */, A2DC499E15842F5800758FF1 /* ResumeOn@2x.png in Resources */, A2DC49A215842F9E00758FF1 /* RevealHover@2x.png in Resources */, A2DC49A315842F9E00758FF1 /* RevealOff@2x.png in Resources */, A2DC49A415842F9E00758FF1 /* RevealOn@2x.png in Resources */, A2DC49A815842FC300758FF1 /* ToolbarCreateTemplate@2x.png in Resources */, A2DC49A915842FC300758FF1 /* ToolbarFilterTemplate@2x.png in Resources */, A2DC49AA15842FC300758FF1 /* ToolbarInfoTemplate@2x.png in Resources */, A2DC49AD15842FF200758FF1 /* ToolbarOpenTemplate@2x.png in Resources */, A2DC49AE15842FF200758FF1 /* ToolbarOpenWebTemplate@2x.png in Resources */, A2DC49B11584300D00758FF1 /* ToolbarPauseAllTemplate@2x.png in Resources */, A2DC49B21584300D00758FF1 /* ToolbarPauseSelectedTemplate@2x.png in Resources */, A2DC49B61584303A00758FF1 /* ToolbarRemoveTemplate@2x.png in Resources */, A2DC49B71584303A00758FF1 /* ToolbarResumeAllTemplate@2x.png in Resources */, A2DC49B81584303A00758FF1 /* ToolbarResumeSelectedTemplate@2x.png in Resources */, A2DC49BA1584307300758FF1 /* Transfers@2x.png in Resources */, A2DC49BC1584309F00758FF1 /* TurtleTemplate@2x.png in Resources */, A2DC49BF158430B300758FF1 /* UpArrowGroupTemplate@2x.png in Resources */, A2DC49C0158430B300758FF1 /* UpArrowTemplate@2x.png in Resources */, A2DC49C2158430CB00758FF1 /* YellowDot@2x.png in Resources */, A2DC49C4158430E200758FF1 /* YingYangGroupTemplate@2x.png in Resources */, A2DC49C6158430FB00758FF1 /* YingYangTemplate@2x.png in Resources */, A2451E6A16ACE4EB00586E0E /* FileRenameSheetController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; A2F35BB615C5A0A100EBF632 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( A2F35BC815C5A0A100EBF632 /* InfoPlist.strings in Resources */, A29304ED15D7465100B1F726 /* style.css in Resources */, A242AD9315F05D23002B3A6C /* Localizable.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ 4DC4AA3D0B05673D0005DB76 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "sh update-version-h.sh"; }; A2305097100C0293003FDB0C /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/third-party/miniupnp/VERSION", "$(SRCROOT)/third-party/miniupnp/miniupnpcstrings.h.in", ); outputPaths = ( "$(SRCROOT)/third-party/miniupnp/miniupnpcstrings.h", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "sh third-party/miniupnp/updateminiupnpcstrings.sh \"$SCRIPT_INPUT_FILE_0\" \"$SCRIPT_INPUT_FILE_1\" \"$SCRIPT_OUTPUT_FILE_0\""; }; BE75C3510C729EE100DBEFE0 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/bash; shellScript = "if [ ! -e ./third-party/libevent/include/event2/config.h -a ! ./third-party/macosx-libevent-config.h -ef ./third-party/libevent/include/event2/config.h ]; then ln -s ../../../macosx-libevent-config.h ./third-party/libevent/include/event2/config.h; fi\n\nif [ ! -e ./third-party/libevent/include/event2/event-config.h -a ! ./third-party/macosx-libevent-event-config.h -ef ./third-party/libevent/include/event2/event-config.h ]; then ln -s ../../../macosx-libevent-event-config.h ./third-party/libevent/include/event2/event-config.h; fi"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 3C7A118A0D0B2EB800B5701F /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 3C7A11970D0B2EE300B5701F /* getgateway.c in Sources */, 3C7A11990D0B2EE300B5701F /* natpmp.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 4D18389409DEC0030047D688 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( BEFC1E2B0C07861A00B0BB3C /* utils.c in Sources */, A2AAB65F0DE0CF6200E04DDA /* rpcimpl.c in Sources */, BEFC1E2D0C07861A00B0BB3C /* upnp.c in Sources */, A2AAB65C0DE0CF6200E04DDA /* rpc-server.c in Sources */, BEFC1E2F0C07861A00B0BB3C /* session.c in Sources */, BEFC1E320C07861A00B0BB3C /* torrent.c in Sources */, BEFC1E360C07861A00B0BB3C /* port-forwarding.c in Sources */, BEFC1E3C0C07861A00B0BB3C /* platform.c in Sources */, BEFC1E460C07861A00B0BB3C /* net.c in Sources */, C1033E091A3279B800EF44D8 /* crypto-utils.c in Sources */, BEFC1E480C07861A00B0BB3C /* natpmp.c in Sources */, C1077A4E183EB29600634C22 /* error.c in Sources */, BEFC1E4A0C07861A00B0BB3C /* metainfo.c in Sources */, BEFC1E4F0C07861A00B0BB3C /* inout.c in Sources */, BEFC1E530C07861A00B0BB3C /* fdlimit.c in Sources */, C1FEE5781C3223CC00D62832 /* watchdir-generic.c in Sources */, BEFC1E560C07861A00B0BB3C /* completion.c in Sources */, BEFC1E580C07861A00B0BB3C /* clients.c in Sources */, A2BE9C520C1E4AF5002D16E6 /* makemeta.c in Sources */, D4AF3B2F0C41F7A500D46B6B /* list.c in Sources */, 4394AC670C74FB6000F367E8 /* ptrarray.c in Sources */, A24621420C769D0900088E81 /* trevent.c in Sources */, 4D36BA6F0CA2F00800A63CA5 /* crypto.c in Sources */, 4D36BA720CA2F00800A63CA5 /* handshake.c in Sources */, 4D36BA740CA2F00800A63CA5 /* peer-io.c in Sources */, C1033E071A3279B800EF44D8 /* crypto-utils-fallback.c in Sources */, 4D36BA770CA2F00800A63CA5 /* peer-mgr.c in Sources */, C1077A50183EB29600634C22 /* file-posix.c in Sources */, 4D36BA790CA2F00800A63CA5 /* peer-msgs.c in Sources */, A25D2CBD0CF4C73E0096A262 /* stats.c in Sources */, A201527E0D1C270F0081714F /* torrent-ctor.c in Sources */, A2D22A130D65EEE700007D5F /* verify.c in Sources */, 4D4ADFC70DA1631500A68297 /* blocklist.c in Sources */, A29DF8B90DB2544C00D04E5A /* resume.c in Sources */, A2A4E9220DE0F7EB000CE197 /* web.c in Sources */, A2A4EA0E0DE106EB000CE197 /* ConvertUTF.c in Sources */, A292A6E80DFB45FC004B9C0A /* webseed.c in Sources */, A25E03E30E4015380086C225 /* tr-getopt.c in Sources */, C1305EBE186A13B100F03351 /* file.c in Sources */, 4DB74F080E8CD75100AEB1A8 /* wildmat.c in Sources */, A21FBBAC0EDA78C300BC3C51 /* bandwidth.c in Sources */, C1033E081A3279B800EF44D8 /* crypto-utils-openssl.c in Sources */, A22CFCA80FC24ED80009BD3E /* tr-dht.c in Sources */, 0A6169A70FE5C9A200C66CE6 /* bitfield.c in Sources */, A25964A6106D73A800453B31 /* announcer.c in Sources */, 4D8017EA10BBC073008A4AF2 /* torrent-magnet.c in Sources */, 4D80185910BBC0B0008A4AF2 /* magnet.c in Sources */, A209EE5C1144B51E002B02D1 /* history.c in Sources */, A220EC5B118C8A060022B4BE /* tr-lpd.c in Sources */, C1FEE57A1C3223CC00D62832 /* watchdir.c in Sources */, A23547E211CD0B090046EAE6 /* cache.c in Sources */, A284214412DA663E00FBDDBB /* tr-udp.c in Sources */, A2679294130E00A000CB7464 /* tr-utp.c in Sources */, A23F29A2132A447400E9A83B /* announcer-http.c in Sources */, C1FEE5791C3223CC00D62832 /* watchdir-kqueue.c in Sources */, A2AA9BE1132CAC8E00FA131E /* announcer-udp.c in Sources */, A2D77452154CC25700A62B93 /* WebSeedTableView.m in Sources */, A2A7B32A164F87D400B98C65 /* jsonsl.c in Sources */, A25BFD69167BED3B0039D1AA /* variant-benc.c in Sources */, A25BFD6B167BED3B0039D1AA /* variant-json.c in Sources */, A25BFD6D167BED3B0039D1AA /* variant.c in Sources */, A2EA52311686AC0D00180493 /* quark.c in Sources */, A2AF23C816B44FA0003BC59E /* log.c in Sources */, A23FAE54178BC2950053DC5B /* platform-quota.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 4DDBB71609E16BAE00284745 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( A2B3FB460E5901E700FF78FB /* cli.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 8D11072C0486CEB800E47090 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( A225A4C0187E369C00CDE823 /* ShareToolbarItem.m in Sources */, A2D77453154CC72B00A62B93 /* WebSeedTableView.m in Sources */, 8D11072D0486CEB800E47090 /* main.m in Sources */, 4DF0C5AB0899190500DD8943 /* Controller.m in Sources */, 4D118E1A08CB46B20033958F /* PrefsController.m in Sources */, 4D364DA0091FBB2C00377D12 /* TorrentTableView.m in Sources */, 4DE5CC9D0980656F00BE280E /* NSStringAdditions.m in Sources */, 4DE5CCA70980735700BE280E /* Badger.m in Sources */, 4DFBC2DF09C0970D00D5C571 /* Torrent.m in Sources */, 4DCCBB3E09C3D71100D3CABF /* TorrentCell.m in Sources */, A200B9200A22798F007BBB1E /* InfoWindowController.m in Sources */, A2AF1C390A3D0F6200F1575D /* FileOutlineView.m in Sources */, A2710E770A86796000CE4F7D /* PrefsWindow.m in Sources */, A256588D0A9A695400E8A03B /* MessageWindowController.m in Sources */, A29C8B370ACC6EB3000ED9F9 /* PortChecker.m in Sources */, A2AA579D0ADFCAB400CA59F6 /* PiecesView.m in Sources */, A25E74650AF5097C006F11AE /* ExpandedPathToPathTransformer.m in Sources */, A25E74660AF5097D006F11AE /* ExpandedPathToIconTransformer.m in Sources */, A2265F420B5EF5F40093DDA5 /* FileNameCell.m in Sources */, A2A1CB7A0BF29D5500AE959F /* PeerProgressIndicatorCell.m in Sources */, A2385DD40BFE06C800B24EF6 /* DragOverlayWindow.m in Sources */, A2FB057F0BFEB6800095564D /* DragOverlayView.m in Sources */, E138A9780C04D88F00C5426C /* ProgressGradients.m in Sources */, A2DF37070C220D03006523C1 /* CreatorWindowController.m in Sources */, 35F373030C2DA89000DAA8F2 /* FilePriorityCell.m in Sources */, A2085DDC0C53BC74000BC3B7 /* AboutWindowController.m in Sources */, A21282A80CA6C66800EAEE0F /* StatusBarView.m in Sources */, A257C1820CAD3003004E121C /* PeerTableView.m in Sources */, A2E23AC60CB5E1930002BB25 /* InfoTabButtonCell.m in Sources */, A2A6321B0CD9751700E3DA60 /* BadgeView.m in Sources */, A2ED7D8F0CEF431B00970975 /* FilterButton.m in Sources */, A25892640CF1F7E800CCCDDF /* StatsWindowController.m in Sources */, A2C89D600CFCBF57004CC2BC /* ButtonToolbarItem.m in Sources */, A219798B0D07B78400438EA7 /* GroupToolbarItem.m in Sources */, A20BFFB70D091CC700CE5D2B /* ToolbarSegmentedCell.m in Sources */, A22180980D148A71007D09ED /* GroupsPrefsController.m in Sources */, A26AF21A0D2DA35A00FF7140 /* FileOutlineController.m in Sources */, A26AF2840D2DC27C00FF7140 /* AddWindowController.m in Sources */, A2FB701C0D95CAEA0001F331 /* GroupsController.m in Sources */, A2D307A40D9EC6870051FD27 /* BlocklistDownloader.m in Sources */, A2725B6E0DE5C4F5003445E7 /* FileListNode.m in Sources */, A2725D5D0DE7507C003445E7 /* TrackerTableView.m in Sources */, A28F4F770E085BDC003A3882 /* ColorTextField.m in Sources */, A27F0F330E19AD9800B2DB97 /* TorrentGroup.m in Sources */, A222E9870E6B21D9009FB003 /* BlocklistDownloaderViewController.m in Sources */, A222EA7B0E6C32C4009FB003 /* BlocklistScheduler.m in Sources */, A232F07E0EEA034A00041646 /* BonjourController.m in Sources */, A23F526F0F14395900AA02E3 /* PredicateEditorRowTemplateAny.m in Sources */, A29D84041049C25600D1987A /* NSApplicationAdditions.m in Sources */, A21A9BE2106D86A800F1C3C1 /* TrackerNode.m in Sources */, A21A9D41106EC2E800F1C3C1 /* TrackerCell.m in Sources */, A263CFC010DD67670038DE27 /* InfoTextField.m in Sources */, A209EAC61142CF28002B02D1 /* InfoActivityViewController.m in Sources */, A209EAC71142CF28002B02D1 /* InfoGeneralViewController.m in Sources */, A209EB011142D3A5002B02D1 /* InfoTrackersViewController.m in Sources */, A209EB9D1142E59A002B02D1 /* InfoPeersViewController.m in Sources */, A209EBCE1142F2B4002B02D1 /* InfoFileViewController.m in Sources */, A209EBF91142FEEE002B02D1 /* InfoOptionsViewController.m in Sources */, A21F15AC11729A8B00CF5A9C /* AddMagnetWindowController.m in Sources */, A2661D6112D0E8D9004F69D5 /* FilterBarView.m in Sources */, A25BB02A12F4F517004B724E /* InfoTabButtonBack.m in Sources */, A2F7CF5F13035FFD0016FF10 /* URLSheetWindowController.m in Sources */, A2E57ABB1310822C00A7DAB1 /* StatusBarController.m in Sources */, A2E57BA713109E6B00A7DAB1 /* FilterBarController.m in Sources */, A2B5B4E91880665E0071A66A /* ShareTorrentFileHelper.m in Sources */, A22BAE281388040500FB022F /* NSMutableArrayAdditions.m in Sources */, A2966E8713DAF74C007B52DF /* GlobalOptionsPopoverViewController.m in Sources */, A234EA541453563B000F3E97 /* NSImageAdditions.m in Sources */, A2AB883E16A399A6008FAD50 /* VDKQueue.m in Sources */, A2451E6916ACE4EB00586E0E /* FileRenameSheetController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; A22CFCB70FC24F710009BD3E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( A22CFCC30FC24F890009BD3E /* dht.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; A2E384CB130DFB1D001F501B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( A2E384DD130DFB3A001F501B /* utp_utils.cpp in Sources */, A2E384DF130DFB3A001F501B /* utp.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; A2F35BB315C5A0A100EBF632 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( A2D8CFBB15F82E030056E93D /* NSStringAdditions.m in Sources */, A2D8CFBA15F82DFA0056E93D /* NSApplicationAdditions.m in Sources */, A29304EE15D7497C00B1F726 /* main.c in Sources */, A2F35BCA15C5A0A100EBF632 /* GenerateThumbnailForURL.m in Sources */, A2F35BCC15C5A0A100EBF632 /* GeneratePreviewForURL.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; BE1183450CE160960002D0F3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( BE1183690CE160D50002D0F3 /* igd_desc_parse.c in Sources */, BE11836A0CE160D50002D0F3 /* minixml.c in Sources */, BE11836B0CE160D50002D0F3 /* miniwget.c in Sources */, BE11836C0CE160D50002D0F3 /* minissdpc.c in Sources */, BE11836D0CE160D50002D0F3 /* minisoap.c in Sources */, BE11836E0CE160D50002D0F3 /* upnpreplyparse.c in Sources */, BE11836F0CE160D50002D0F3 /* upnpcommands.c in Sources */, BE1183700CE160D50002D0F3 /* miniupnpc.c in Sources */, A22B00B3116A9EA4003315FC /* connecthostport.c in Sources */, A20162C913DE48BF00E15488 /* receivedata.c in Sources */, A20162CD13DE497000E15488 /* portlistingparse.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; BE75C3460C729E9500DBEFE0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( A2074F4C12BEA8CE00F70985 /* buffer.c in Sources */, A2074F5912BEA8E000F70985 /* bufferevent_filter.c in Sources */, A2074F5A12BEA8E000F70985 /* bufferevent_openssl.c in Sources */, A2074F5B12BEA8E000F70985 /* bufferevent_pair.c in Sources */, A2074F5D12BEA8E000F70985 /* bufferevent_sock.c in Sources */, A2074F5E12BEA8E000F70985 /* bufferevent.c in Sources */, A2074F7412BEAA3300F70985 /* event.c in Sources */, A2074F8512BEAA6600F70985 /* evmap.c in Sources */, A2074F9912BEAAAF00F70985 /* evthread.c in Sources */, A2074FA312BEAAC600F70985 /* evutil.c in Sources */, A2074FAB12BEAAFF00F70985 /* http.c in Sources */, A2074FB712BEAB1E00F70985 /* listener.c in Sources */, A2074FBF12BEAB9A00F70985 /* kqueue.c in Sources */, A2074FC712BEABC800F70985 /* log.c in Sources */, A2074FDE12BEAC5000F70985 /* signal.c in Sources */, A207503512BEAD9C00F70985 /* select.c in Sources */, A207503712BEADA200F70985 /* poll.c in Sources */, A20750B812BEB66900F70985 /* bufferevent_ratelim.c in Sources */, A2AA9BE3132CAE2000FA131E /* evdns.c in Sources */, A29E653613F1603100048D71 /* evutil_rand.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; BEFC1BFD0C07750000B0BB3C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( BEFC1C1A0C07756200B0BB3C /* daemon.c in Sources */, C1F690FD1AD0627500D95CF0 /* daemon-posix.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; BEFC1CED0C07822400B0BB3C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( BEFC1D050C07825A00B0BB3C /* remote.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; C1639A6B1A55F4D600E42033 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( C1639A781A55F56600E42033 /* cdecode.c in Sources */, C1639A791A55F56600E42033 /* cencode.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 4D1838E609DEC1170047D688 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 4D18389609DEC0030047D688 /* libtransmission */; targetProxy = 4D1838E509DEC1170047D688 /* PBXContainerItemProxy */; }; 4D9A2BF509E16D30002D0FF9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 4D18389609DEC0030047D688 /* libtransmission */; targetProxy = 4D9A2BF409E16D30002D0FF9 /* PBXContainerItemProxy */; }; A226FDB10D0CDF6E005A7F71 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 3C7A118C0D0B2EB800B5701F /* natpmp */; targetProxy = A226FDB00D0CDF6E005A7F71 /* PBXContainerItemProxy */; }; A22CFCC70FC24F990009BD3E /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = A22CFCB90FC24F710009BD3E /* dht */; targetProxy = A22CFCC60FC24F990009BD3E /* PBXContainerItemProxy */; }; A2E384E4130DFB51001F501B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = A2E384CD130DFB1D001F501B /* utp */; targetProxy = A2E384E3130DFB51001F501B /* PBXContainerItemProxy */; }; A2EB2E7515C8CCE900FBD5B4 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = A2F35BB815C5A0A100EBF632 /* QuickLookPlugin */; targetProxy = A2EB2E7415C8CCE900FBD5B4 /* PBXContainerItemProxy */; }; A2F35BD615C5A1A100EBF632 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 4D18389609DEC0030047D688 /* libtransmission */; targetProxy = A2F35BD515C5A1A100EBF632 /* PBXContainerItemProxy */; }; BE1183760CE161040002D0F3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = BE1183470CE160960002D0F3 /* miniupnp */; targetProxy = BE1183750CE161040002D0F3 /* PBXContainerItemProxy */; }; BE75C34F0C729ED300DBEFE0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = BE75C3480C729E9500DBEFE0 /* event */; targetProxy = BE75C34E0C729ED300DBEFE0 /* PBXContainerItemProxy */; }; BEFC1C030C07751A00B0BB3C /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 4D18389609DEC0030047D688 /* libtransmission */; targetProxy = BEFC1C020C07751A00B0BB3C /* PBXContainerItemProxy */; }; BEFC1CEB0C07822400B0BB3C /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 4D18389609DEC0030047D688 /* libtransmission */; targetProxy = BEFC1CEC0C07822400B0BB3C /* PBXContainerItemProxy */; }; C165AB8D1A55FAA900D37711 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = C1639A6E1A55F4D600E42033 /* b64 */; targetProxy = C165AB8C1A55FAA900D37711 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( A291477D0E195A0C00F60CB2 /* en */, A27476FF0CC38EE6003CC76D /* es */, A2EA8E3C0CC3C9830081201C /* fr */, A223AA7E0D220CEB00840069 /* nl */, A26AF1050D2855FC00FF7140 /* ru */, A202FF5D0DDA9275009938FF /* it */, A28393FD10D54A79005C0240 /* de */, A2613F9811B3383200472893 /* pt_PT */, A263C5671560A4210082A3D1 /* da */, A2A9D11A187DD75200C52A1F /* tr */, ); name = InfoPlist.strings; sourceTree = ""; }; A209EAE81142D294002B02D1 /* InfoActivityView.xib */ = { isa = PBXVariantGroup; children = ( A220EE9B11A841F50022B4BE /* en */, A220EE6911A838450022B4BE /* de */, A220EED211AB3F9B0022B4BE /* it */, A220EEDA11AE95CE0022B4BE /* es */, A220EEEF11B070A50022B4BE /* ru */, A2613F9511B3383200472893 /* pt_PT */, A2B9F90411BD10BE003FC8CA /* fr */, A279E3D111C3BDC300D48B1F /* nl */, A263C56E1560A4470082A3D1 /* da */, A2A9D122187DD75A00C52A1F /* tr */, ); name = InfoActivityView.xib; sourceTree = ""; }; A209EAEA1142D294002B02D1 /* InfoGeneralView.xib */ = { isa = PBXVariantGroup; children = ( A209EAEB1142D294002B02D1 /* en */, A220EE6A11A838640022B4BE /* de */, A220EED311AB3F9B0022B4BE /* it */, A220EEDB11AE95CE0022B4BE /* es */, A220EEF011B070A50022B4BE /* ru */, A2613F9611B3383200472893 /* pt_PT */, A2B9F90511BD10BE003FC8CA /* fr */, A279E3D211C3BDC300D48B1F /* nl */, A263C56D1560A4420082A3D1 /* da */, A2A9D121187DD75900C52A1F /* tr */, ); name = InfoGeneralView.xib; sourceTree = ""; }; A209EC11114301C6002B02D1 /* InfoOptionsView.xib */ = { isa = PBXVariantGroup; children = ( A209EC13114301C6002B02D1 /* en */, A220EE6B11A838750022B4BE /* de */, A220EED411AB3F9B0022B4BE /* it */, A220EEDC11AE95CE0022B4BE /* es */, A220EEF111B070A50022B4BE /* ru */, A2613F9711B3383200472893 /* pt_PT */, A2B9F90611BD10BE003FC8CA /* fr */, A279E3D311C3BDC300D48B1F /* nl */, A263C56F1560A44B0082A3D1 /* da */, A2A9D123187DD75B00C52A1F /* tr */, ); name = InfoOptionsView.xib; sourceTree = ""; }; A215BF5B0F02EBB800350CDB /* GroupRules.xib */ = { isa = PBXVariantGroup; children = ( A215BF5D0F02EBB800350CDB /* en */, A22CF7AC0FA3505F0009BD3E /* it */, A22CF7B90FA352740009BD3E /* fr */, A22CF7C90FA5D3F90009BD3E /* es */, A22CF7CC0FA5E2DB0009BD3E /* nl */, A22CF7D10FA6A19B0009BD3E /* ru */, A28393FC10D54A66005C0240 /* de */, A2613F9411B3383200472893 /* pt_PT */, A263C56C1560A43E0082A3D1 /* da */, A2A9D120187DD75800C52A1F /* tr */, ); name = GroupRules.xib; sourceTree = ""; }; A21F1538117299F100CF5A9C /* AddMagnetWindow.xib */ = { isa = PBXVariantGroup; children = ( A21F1539117299F100CF5A9C /* en */, A220EE6611A8382C0022B4BE /* de */, A220EED011AB3F8F0022B4BE /* it */, A220EED911AE95CE0022B4BE /* es */, A220EEEE11B070A40022B4BE /* ru */, A2613F9111B3383200472893 /* pt_PT */, A2B9F90311BD10BE003FC8CA /* fr */, A279E3D011C3BDC300D48B1F /* nl */, A263C56B1560A43A0082A3D1 /* da */, A2A9D11F187DD75700C52A1F /* tr */, ); name = AddMagnetWindow.xib; sourceTree = ""; }; A220AF7913D7CC460035C512 /* GlobalOptionsPopover.xib */ = { isa = PBXVariantGroup; children = ( A220AF7A13D7CC460035C512 /* en */, A292C9E01413BA5F00EF710F /* es */, A292C9E2141593DA00EF710F /* de */, A292C9E414163AE500EF710F /* it */, A29443271419746A0016143A /* ru */, A294432E141B23CD0016143A /* pt_PT */, A2963CFD1423F2BB00C497B5 /* fr */, A2A1C81D142EC032008C17BF /* nl */, A263C5701560A44F0082A3D1 /* da */, A2A9D124187DD75C00C52A1F /* tr */, ); name = GlobalOptionsPopover.xib; sourceTree = ""; }; A22A8D540AEEAFA5007E9CB9 /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( A27477010CC38EE6003CC76D /* es */, A2EA8E3E0CC3C9830081201C /* fr */, A223AA800D220CEB00840069 /* nl */, A26AF1070D2855FC00FF7140 /* ru */, A202FF5F0DDA9275009938FF /* it */, A291477F0E195A0C00F60CB2 /* en */, A28393FF10D54A96005C0240 /* de */, A2613F9911B3383200472893 /* pt_PT */, A263C5661560A3CF0082A3D1 /* da */, A2A9D119187DD75100C52A1F /* tr */, ); name = Localizable.strings; sourceTree = ""; }; A23F4FF00D1D98AD002FCB97 /* PrefsWindow.xib */ = { isa = PBXVariantGroup; children = ( A29147810E195A0C00F60CB2 /* en */, A223AA830D220CEB00840069 /* nl */, A265A3320D25767700198AC8 /* fr */, A265A3C20D25AE7800198AC8 /* es */, A26AF10A0D2855FC00FF7140 /* ru */, A202FF610DDA9275009938FF /* it */, A283940110D54AA7005C0240 /* de */, A2613F9B11B3383200472893 /* pt_PT */, A263C5681560A4290082A3D1 /* da */, A2A9D11C187DD75400C52A1F /* tr */, ); name = PrefsWindow.xib; sourceTree = ""; }; A23F50000D1D99D7002FCB97 /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( A29147800E195A0C00F60CB2 /* en */, A223AA810D220CEB00840069 /* nl */, A265A3300D25767700198AC8 /* fr */, A265A3C00D25AE7800198AC8 /* es */, A26AF1080D2855FC00FF7140 /* ru */, A202FF600DDA9275009938FF /* it */, A283940010D54A9D005C0240 /* de */, A2613F9A11B3383200472893 /* pt_PT */, A263C5651560A35B0082A3D1 /* da */, A2A9D11B187DD75300C52A1F /* tr */, ); name = MainMenu.xib; sourceTree = ""; }; A242AD9115F05D23002B3A6C /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( A242AD9215F05D23002B3A6C /* en */, A2A90DC115F3C3D900FB7115 /* de */, A236D19215F6BB54000C3DD4 /* es */, A236D19415F6BCB2000C3DD4 /* da */, A236D19615F6BD9C000C3DD4 /* it */, A2FB07F115F8208300933543 /* nl */, A2D8CFBF15FA177A0056E93D /* ru */, A27F4483160B4AF50048CD4C /* fr */, A28B3A2D160E1BC900D4A2BC /* pt_PT */, A2CA772B187F063A00154956 /* tr */, ); name = Localizable.strings; sourceTree = ""; }; A26AF27C0D2DBDDF00FF7140 /* AddWindow.xib */ = { isa = PBXVariantGroup; children = ( A291477B0E195A0C00F60CB2 /* en */, A2AC81D60D987E2D00A2878C /* nl */, A2CBDED80D993E4500BB22BC /* fr */, A2CBDF9E0D9AD08100BB22BC /* ru */, A2B5BB7A0D9C7C2300FCB650 /* es */, A202FF5B0DDA9275009938FF /* it */, A28393F910D54A35005C0240 /* de */, A2613F9211B3383200472893 /* pt_PT */, A263C56A1560A4370082A3D1 /* da */, A2A9D11E187DD75600C52A1F /* tr */, ); name = AddWindow.xib; sourceTree = ""; }; A29576010D11D63C0093B167 /* Creator.xib */ = { isa = PBXVariantGroup; children = ( A291477C0E195A0C00F60CB2 /* en */, A223AA7D0D220CEB00840069 /* nl */, A265A32E0D25767700198AC8 /* fr */, A265A3BE0D25AE7800198AC8 /* es */, A26AF1040D2855FC00FF7140 /* ru */, A202FF5C0DDA9275009938FF /* it */, A28393FA10D54A4B005C0240 /* de */, A2613F9311B3383200472893 /* pt_PT */, A263C5691560A4310082A3D1 /* da */, A2A9D11D187DD75500C52A1F /* tr */, ); name = Creator.xib; sourceTree = ""; }; A2F35BC615C5A0A100EBF632 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( A2F35BC715C5A0A100EBF632 /* en */, ); name = InfoPlist.strings; path = macosx/QuickLookPlugin; sourceTree = SOURCE_ROOT; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 0053D3D30C86774200545606 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { OTHER_CFLAGS = "-DHAVE_CONFIG_H"; PRODUCT_NAME = event; USER_HEADER_SEARCH_PATHS = "third-party/libevent/compat third-party/libevent/include"; }; name = Debug; }; 0053D3D40C86774200545606 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { HEADER_SEARCH_PATHS = ( "$(inherited)", "third-party", "third-party/libevent/include", "third-party/libb64", ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/build/Development\"", "\"$(SRCROOT)/build/Debug\"", ); OTHER_CFLAGS = ( "$(inherited)", "-DWITH_UTP", "-DHAVE_OPENSSL", "-D__TRANSMISSION__", "-DHAVE_STRLCPY", "-DHAVE_STRLCAT", "-DHAVE_ASPRINTF", "-DHAVE_LIBGEN", "-DHAVE_STRCASECMP", "-DHAVE_ZLIB", "-DHAVE_ICONV", ); PRODUCT_NAME = transmission; }; name = Debug; }; 0053D3D50C86774200545606 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { FRAMEWORK_SEARCH_PATHS = macosx; GCC_PREFIX_HEADER = macosx/Transmission_Prefix.pch; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/third-party/curl/lib\"", ); PRODUCT_NAME = Transmission; WRAPPER_EXTENSION = app; }; name = Debug; }; 0053D3D60C86774200545606 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { HEADER_SEARCH_PATHS = ( "third-party/curl/include", ., ); PRODUCT_NAME = transmissioncli; }; name = Debug; }; 0053D3D70C86774200545606 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { HEADER_SEARCH_PATHS = ( "$(inherited)", ., "third-party/libevent/include", ); OTHER_CFLAGS = ( "$(inherited)", "-DHAVE_DAEMON", ); PRODUCT_NAME = "transmission-daemon"; }; name = Debug; }; 0053D3D80C86774200545606 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { HEADER_SEARCH_PATHS = ( "$(inherited)", ., "third-party/libevent/include", ); PRODUCT_NAME = "transmission-remote"; }; name = Debug; }; 0053D3DA0C86774200545606 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_DYNAMIC_NO_PIC = YES; GCC_ENABLE_PASCAL_STRINGS = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_INCREASE_PRECOMPILED_HEADER_SHARING = YES; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREPROCESSOR_DEFINITIONS = ( BUILD_MAC_CLIENT, XCODE_BUILD, ); GCC_UNROLL_LOOPS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( "third-party/curl/include", "third-party/openssl/include", ); IBC_FLATTEN_NIBS = YES; IBC_NOTICES = NO; IBC_WARNINGS = YES; INFOPLIST_FILE = "$(SRCROOT)/macosx/Info.plist"; INFOPLIST_OTHER_PREPROCESSOR_FLAGS = "-CC"; INFOPLIST_PREFIX_HEADER = "$(SRCROOT)/libtransmission/version.h"; INFOPLIST_PREPROCESS = YES; LIBRARY_SEARCH_PATHS = ( "third-party/curl/lib", "third-party/openssl/lib", ); MACOSX_DEPLOYMENT_TARGET = 10.7; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; STRIP_INSTALLED_PRODUCT = NO; }; name = Debug; }; 3C7A118E0D0B2EB800B5701F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { OTHER_CFLAGS = "-DENABLE_STRNATPMPERR"; PRODUCT_NAME = natpmp; }; name = Release; }; 3C7A118F0D0B2EB800B5701F /* Release - Debug */ = { isa = XCBuildConfiguration; buildSettings = { OTHER_CFLAGS = "-DENABLE_STRNATPMPERR"; PRODUCT_NAME = natpmp; }; name = "Release - Debug"; }; 3C7A11900D0B2EB800B5701F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { OTHER_CFLAGS = "-DENABLE_STRNATPMPERR"; PRODUCT_NAME = natpmp; }; name = Debug; }; 4D18389C09DEC01E0047D688 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { HEADER_SEARCH_PATHS = ( "$(inherited)", "third-party", "third-party/libevent/include", "third-party/libb64", ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/build/Development\"", "\"$(SRCROOT)/build/Debug\"", ); OTHER_CFLAGS = ( "$(inherited)", "-DWITH_UTP", "-DHAVE_OPENSSL", "-D__TRANSMISSION__", "-DHAVE_STRLCPY", "-DHAVE_STRLCAT", "-DHAVE_ASPRINTF", "-DHAVE_LIBGEN", "-DHAVE_STRCASECMP", "-DHAVE_ZLIB", "-DHAVE_ICONV", ); PRODUCT_NAME = transmission; }; name = Release; }; 4DDBB71E09E16BF100284745 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { HEADER_SEARCH_PATHS = ( "third-party/curl/include", ., ); PRODUCT_NAME = transmissioncli; }; name = Release; }; 4DF0C599089918A300DD8943 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { FRAMEWORK_SEARCH_PATHS = macosx; GCC_PREFIX_HEADER = macosx/Transmission_Prefix.pch; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/third-party/curl/lib\"", ); PRODUCT_NAME = Transmission; WRAPPER_EXTENSION = app; }; name = Release; }; 4DF0C59D089918A300DD8943 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COMBINE_HIDPI_IMAGES = YES; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEPLOYMENT_POSTPROCESSING = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_DYNAMIC_NO_PIC = YES; GCC_ENABLE_PASCAL_STRINGS = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_INCREASE_PRECOMPILED_HEADER_SHARING = YES; GCC_NO_COMMON_BLOCKS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREPROCESSOR_DEFINITIONS = ( NS_BLOCK_ASSERTIONS, BUILD_MAC_CLIENT, XCODE_BUILD, ); GCC_UNROLL_LOOPS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( "third-party/curl/include", "third-party/openssl/include", ); IBC_FLATTEN_NIBS = YES; IBC_NOTICES = NO; IBC_WARNINGS = YES; INFOPLIST_FILE = "$(SRCROOT)/macosx/Info.plist"; INFOPLIST_OTHER_PREPROCESSOR_FLAGS = "-CC"; INFOPLIST_PREFIX_HEADER = "$(SRCROOT)/libtransmission/version.h"; INFOPLIST_PREPROCESS = YES; LIBRARY_SEARCH_PATHS = ( "third-party/curl/lib", "third-party/openssl/lib", ); MACOSX_DEPLOYMENT_TARGET = 10.7; OTHER_CFLAGS = "-DNDEBUG"; SDKROOT = macosx; }; name = Release; }; A22CFCBB0FC24F720009BD3E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { PRODUCT_NAME = dht; }; name = Debug; }; A22CFCBC0FC24F720009BD3E /* Release - Debug */ = { isa = XCBuildConfiguration; buildSettings = { PRODUCT_NAME = dht; }; name = "Release - Debug"; }; A22CFCBD0FC24F720009BD3E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { PRODUCT_NAME = dht; }; name = Release; }; A250CFEB0CDA19680068B4B6 /* Release - Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEPLOYMENT_POSTPROCESSING = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_DYNAMIC_NO_PIC = YES; GCC_ENABLE_PASCAL_STRINGS = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_INCREASE_PRECOMPILED_HEADER_SHARING = YES; GCC_NO_COMMON_BLOCKS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREPROCESSOR_DEFINITIONS = ( BUILD_MAC_CLIENT, XCODE_BUILD, ); GCC_UNROLL_LOOPS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( "third-party/curl/include", "third-party/openssl/include", ); IBC_FLATTEN_NIBS = YES; IBC_NOTICES = NO; IBC_WARNINGS = YES; INFOPLIST_FILE = "$(SRCROOT)/macosx/Info.plist"; INFOPLIST_OTHER_PREPROCESSOR_FLAGS = "-CC"; INFOPLIST_PREFIX_HEADER = "$(SRCROOT)/libtransmission/version.h"; INFOPLIST_PREPROCESS = YES; LIBRARY_SEARCH_PATHS = ( "third-party/curl/lib", "third-party/openssl/lib", ); MACOSX_DEPLOYMENT_TARGET = 10.7; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; STRIP_INSTALLED_PRODUCT = NO; }; name = "Release - Debug"; }; A250CFEC0CDA19680068B4B6 /* Release - Debug */ = { isa = XCBuildConfiguration; buildSettings = { FRAMEWORK_SEARCH_PATHS = macosx; GCC_PREFIX_HEADER = macosx/Transmission_Prefix.pch; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/third-party/curl/lib\"", ); PRODUCT_NAME = Transmission; WRAPPER_EXTENSION = app; }; name = "Release - Debug"; }; A250CFED0CDA19680068B4B6 /* Release - Debug */ = { isa = XCBuildConfiguration; buildSettings = { HEADER_SEARCH_PATHS = ( "third-party/curl/include", ., ); PRODUCT_NAME = transmissioncli; }; name = "Release - Debug"; }; A250CFEE0CDA19680068B4B6 /* Release - Debug */ = { isa = XCBuildConfiguration; buildSettings = { HEADER_SEARCH_PATHS = ( "$(inherited)", "third-party", "third-party/libevent/include", "third-party/libb64", ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/build/Development\"", "\"$(SRCROOT)/build/Debug\"", ); OTHER_CFLAGS = ( "$(inherited)", "-DWITH_UTP", "-DHAVE_OPENSSL", "-D__TRANSMISSION__", "-DHAVE_STRLCPY", "-DHAVE_STRLCAT", "-DHAVE_ASPRINTF", "-DHAVE_LIBGEN", "-DHAVE_STRCASECMP", "-DHAVE_ZLIB", "-DHAVE_ICONV", ); PRODUCT_NAME = transmission; }; name = "Release - Debug"; }; A250CFEF0CDA19680068B4B6 /* Release - Debug */ = { isa = XCBuildConfiguration; buildSettings = { HEADER_SEARCH_PATHS = ( "$(inherited)", ., "third-party/libevent/include", ); OTHER_CFLAGS = ( "$(inherited)", "-DHAVE_DAEMON", ); PRODUCT_NAME = "transmission-daemon"; }; name = "Release - Debug"; }; A250CFF00CDA19680068B4B6 /* Release - Debug */ = { isa = XCBuildConfiguration; buildSettings = { HEADER_SEARCH_PATHS = ( "$(inherited)", ., "third-party/libevent/include", ); PRODUCT_NAME = "transmission-remote"; }; name = "Release - Debug"; }; A250CFF20CDA19680068B4B6 /* Release - Debug */ = { isa = XCBuildConfiguration; buildSettings = { OTHER_CFLAGS = "-DHAVE_CONFIG_H"; PRODUCT_NAME = event; USER_HEADER_SEARCH_PATHS = "third-party/libevent/compat third-party/libevent/include"; }; name = "Release - Debug"; }; A2E384CF130DFB1D001F501B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PREPROCESSOR_DEFINITIONS = POSIX; PRODUCT_NAME = utp; }; name = Debug; }; A2E384D0130DFB1D001F501B /* Release - Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PREPROCESSOR_DEFINITIONS = POSIX; PRODUCT_NAME = utp; }; name = "Release - Debug"; }; A2E384D1130DFB1D001F501B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PREPROCESSOR_DEFINITIONS = ( POSIX, NS_BLOCK_ASSERTIONS, ); PRODUCT_NAME = utp; }; name = Release; }; A2F35BD115C5A0A100EBF632 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PREFIX_HEADER = "$(SRCROOT)/macosx/QuickLookPlugin/QuickLookPlugin-Prefix.pch"; INFOPLIST_FILE = "$(SRCROOT)/macosx/QuickLookPlugin/QuickLookPlugin-Info.plist"; INSTALL_PATH = /Library/QuickLook; OTHER_LDFLAGS = ( "-read_only_relocs", suppress, ); PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = qlgenerator; }; name = Debug; }; A2F35BD215C5A0A100EBF632 /* Release - Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PREFIX_HEADER = "$(SRCROOT)/macosx/QuickLookPlugin/QuickLookPlugin-Prefix.pch"; INFOPLIST_FILE = "$(SRCROOT)/macosx/QuickLookPlugin/QuickLookPlugin-Info.plist"; INSTALL_PATH = /Library/QuickLook; OTHER_LDFLAGS = ( "-read_only_relocs", suppress, ); PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = qlgenerator; }; name = "Release - Debug"; }; A2F35BD315C5A0A100EBF632 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PREFIX_HEADER = "$(SRCROOT)/macosx/QuickLookPlugin/QuickLookPlugin-Prefix.pch"; INFOPLIST_FILE = "$(SRCROOT)/macosx/QuickLookPlugin/QuickLookPlugin-Info.plist"; INSTALL_PATH = /Library/QuickLook; OTHER_LDFLAGS = ( "-read_only_relocs", suppress, ); PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = qlgenerator; }; name = Release; }; BE1183490CE160960002D0F3 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { PRODUCT_NAME = miniupnp; }; name = Release; }; BE11834A0CE160960002D0F3 /* Release - Debug */ = { isa = XCBuildConfiguration; buildSettings = { PRODUCT_NAME = miniupnp; }; name = "Release - Debug"; }; BE11834B0CE160960002D0F3 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { PRODUCT_NAME = miniupnp; }; name = Debug; }; BE75C34B0C729EB600DBEFE0 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { OTHER_CFLAGS = "-DHAVE_CONFIG_H"; PRODUCT_NAME = event; USER_HEADER_SEARCH_PATHS = "third-party/libevent/compat third-party/libevent/include"; }; name = Release; }; BEFC1C0A0C07753800B0BB3C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { HEADER_SEARCH_PATHS = ( "$(inherited)", ., "third-party/libevent/include", ); OTHER_CFLAGS = ( "$(inherited)", "-DHAVE_DAEMON", ); PRODUCT_NAME = "transmission-daemon"; }; name = Release; }; BEFC1CF80C07822400B0BB3C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { HEADER_SEARCH_PATHS = ( "$(inherited)", ., "third-party/libevent/include", ); PRODUCT_NAME = "transmission-remote"; }; name = Release; }; C1639A701A55F4D600E42033 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; C1639A711A55F4D600E42033 /* Release - Debug */ = { isa = XCBuildConfiguration; buildSettings = { PRODUCT_NAME = "$(TARGET_NAME)"; }; name = "Release - Debug"; }; C1639A721A55F4D600E42033 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 3C7A119B0D0B2EE300B5701F /* Build configuration list for PBXNativeTarget "natpmp" */ = { isa = XCConfigurationList; buildConfigurations = ( 3C7A11900D0B2EB800B5701F /* Debug */, 3C7A118F0D0B2EB800B5701F /* Release - Debug */, 3C7A118E0D0B2EB800B5701F /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; 4D18389B09DEC01E0047D688 /* Build configuration list for PBXNativeTarget "libtransmission" */ = { isa = XCConfigurationList; buildConfigurations = ( 0053D3D40C86774200545606 /* Debug */, A250CFEE0CDA19680068B4B6 /* Release - Debug */, 4D18389C09DEC01E0047D688 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; 4DDBB71D09E16BF100284745 /* Build configuration list for PBXNativeTarget "transmissioncli" */ = { isa = XCConfigurationList; buildConfigurations = ( 0053D3D60C86774200545606 /* Debug */, A250CFED0CDA19680068B4B6 /* Release - Debug */, 4DDBB71E09E16BF100284745 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; 4DF0C596089918A300DD8943 /* Build configuration list for PBXNativeTarget "Transmission" */ = { isa = XCConfigurationList; buildConfigurations = ( 0053D3D50C86774200545606 /* Debug */, A250CFEC0CDA19680068B4B6 /* Release - Debug */, 4DF0C599089918A300DD8943 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; 4DF0C59A089918A300DD8943 /* Build configuration list for PBXProject "Transmission" */ = { isa = XCConfigurationList; buildConfigurations = ( 0053D3DA0C86774200545606 /* Debug */, A250CFEB0CDA19680068B4B6 /* Release - Debug */, 4DF0C59D089918A300DD8943 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; A22CFCC40FC24F8A0009BD3E /* Build configuration list for PBXNativeTarget "dht" */ = { isa = XCConfigurationList; buildConfigurations = ( A22CFCBB0FC24F720009BD3E /* Debug */, A22CFCBC0FC24F720009BD3E /* Release - Debug */, A22CFCBD0FC24F720009BD3E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; A2E384E2130DFB3A001F501B /* Build configuration list for PBXNativeTarget "utp" */ = { isa = XCConfigurationList; buildConfigurations = ( A2E384CF130DFB1D001F501B /* Debug */, A2E384D0130DFB1D001F501B /* Release - Debug */, A2E384D1130DFB1D001F501B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; A2F35BD015C5A0A100EBF632 /* Build configuration list for PBXNativeTarget "QuickLookPlugin" */ = { isa = XCConfigurationList; buildConfigurations = ( A2F35BD115C5A0A100EBF632 /* Debug */, A2F35BD215C5A0A100EBF632 /* Release - Debug */, A2F35BD315C5A0A100EBF632 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; BE11834C0CE160A80002D0F3 /* Build configuration list for PBXNativeTarget "miniupnp" */ = { isa = XCConfigurationList; buildConfigurations = ( BE11834B0CE160960002D0F3 /* Debug */, BE11834A0CE160960002D0F3 /* Release - Debug */, BE1183490CE160960002D0F3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; BE75C34A0C729EB600DBEFE0 /* Build configuration list for PBXNativeTarget "event" */ = { isa = XCConfigurationList; buildConfigurations = ( 0053D3D30C86774200545606 /* Debug */, A250CFF20CDA19680068B4B6 /* Release - Debug */, BE75C34B0C729EB600DBEFE0 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; BEFC1C090C07753800B0BB3C /* Build configuration list for PBXNativeTarget "transmission-daemon" */ = { isa = XCConfigurationList; buildConfigurations = ( 0053D3D70C86774200545606 /* Debug */, A250CFEF0CDA19680068B4B6 /* Release - Debug */, BEFC1C0A0C07753800B0BB3C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; BEFC1CF70C07822400B0BB3C /* Build configuration list for PBXNativeTarget "transmission-remote" */ = { isa = XCConfigurationList; buildConfigurations = ( 0053D3D80C86774200545606 /* Debug */, A250CFF00CDA19680068B4B6 /* Release - Debug */, BEFC1CF80C07822400B0BB3C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; C1639A731A55F4D600E42033 /* Build configuration list for PBXNativeTarget "b64" */ = { isa = XCConfigurationList; buildConfigurations = ( C1639A701A55F4D600E42033 /* Debug */, C1639A711A55F4D600E42033 /* Release - Debug */, C1639A721A55F4D600E42033 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } transmission-2.92/PaxHeaders.4960/REVISION0000644000000000000000000000013212667110731015043 xustar0030 mtime=1457295833.265333189 30 atime=1457295833.265333189 30 ctime=1457295917.442764419 transmission-2.92/REVISION0000644000175000017500000000000612667110731016464 0ustar00mikedldmikedld0000000000000014714 transmission-2.92/PaxHeaders.4960/cli0000644000000000000000000000013212667111060014350 xustar0030 mtime=1457295920.640818801 30 atime=1457295917.037757532 30 ctime=1457295920.640818801 transmission-2.92/cli/0000755000175000017500000000000012667111060016052 5ustar00mikedldmikedld00000000000000transmission-2.92/cli/PaxHeaders.4960/Makefile.in0000644000000000000000000000013112667111007016472 xustar0029 mtime=1457295879.00011075 30 atime=1457295878.995110665 30 ctime=1457295920.632818665 transmission-2.92/cli/Makefile.in0000644000175000017500000006227512667111007020134 0ustar00mikedldmikedld00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = transmission-cli$(EXEEXT) subdir = cli ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx-pthread.m4 \ $(top_srcdir)/m4/glib-gettext.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am_transmission_cli_OBJECTS = cli.$(OBJEXT) transmission_cli_OBJECTS = $(am_transmission_cli_OBJECTS) am__DEPENDENCIES_1 = transmission_cli_DEPENDENCIES = \ $(top_builddir)/libtransmission/libtransmission.a \ $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(transmission_cli_SOURCES) DIST_SOURCES = $(transmission_cli_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(dist_man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTO_CFLAGS = @CRYPTO_CFLAGS@ CRYPTO_LIBS = @CRYPTO_LIBS@ CRYPTO_PKG = @CRYPTO_PKG@ CURL_MINIMUM = @CURL_MINIMUM@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYASSL_CFLAGS = @CYASSL_CFLAGS@ CYASSL_LIBS = @CYASSL_LIBS@ CYASSL_MINIMUM = @CYASSL_MINIMUM@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DHT_CFLAGS = @DHT_CFLAGS@ DHT_LIBS = @DHT_LIBS@ DHT_LIBS_QT = @DHT_LIBS_QT@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_MINIMUM = @GIO_MINIMUM@ GLIB_MINIMUM = @GLIB_MINIMUM@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MINIMUM = @GTK_MINIMUM@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAPPINDICATOR_CFLAGS = @LIBAPPINDICATOR_CFLAGS@ LIBAPPINDICATOR_LIBS = @LIBAPPINDICATOR_LIBS@ LIBAPPINDICATOR_MINIMUM = @LIBAPPINDICATOR_MINIMUM@ LIBB64_CFLAGS = @LIBB64_CFLAGS@ LIBB64_LIBS = @LIBB64_LIBS@ LIBB64_LIBS_QT = @LIBB64_LIBS_QT@ LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ LIBEVENT_CFLAGS = @LIBEVENT_CFLAGS@ LIBEVENT_LIBS = @LIBEVENT_LIBS@ LIBEVENT_MINIMUM = @LIBEVENT_MINIMUM@ LIBM = @LIBM@ LIBNATPMP_CFLAGS = @LIBNATPMP_CFLAGS@ LIBNATPMP_LIBS = @LIBNATPMP_LIBS@ LIBNATPMP_LIBS_QT = @LIBNATPMP_LIBS_QT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LIBUPNP_LIBS_QT = @LIBUPNP_LIBS_QT@ LIBUTP_CFLAGS = @LIBUTP_CFLAGS@ LIBUTP_LIBS = @LIBUTP_LIBS@ LIBUTP_LIBS_QT = @LIBUTP_LIBS_QT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENSSL_CFLAGS = @OPENSSL_CFLAGS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OPENSSL_MINIMUM = @OPENSSL_MINIMUM@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PEERID_PREFIX = @PEERID_PREFIX@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POLARSSL_MINIMUM = @POLARSSL_MINIMUM@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SYSTEMD_DAEMON_CFLAGS = @SYSTEMD_DAEMON_CFLAGS@ SYSTEMD_DAEMON_LIBS = @SYSTEMD_DAEMON_LIBS@ USERAGENT_PREFIX = @USERAGENT_PREFIX@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ WOLFSSL_CFLAGS = @WOLFSSL_CFLAGS@ WOLFSSL_LIBS = @WOLFSSL_LIBS@ XGETTEXT = @XGETTEXT@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ ZLIB_MINIMUM = @ZLIB_MINIMUM@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ transmissionlocaledir = @transmissionlocaledir@ AM_CPPFLAGS = -I@top_srcdir@ AM_CFLAGS = \ @LIBEVENT_CFLAGS@ \ @LIBCURL_CFLAGS@ \ @ZLIB_CFLAGS@ \ @PTHREAD_CFLAGS@ dist_man_MANS = transmission-cli.1 transmission_cli_SOURCES = cli.c transmission_cli_LDADD = \ $(top_builddir)/libtransmission/libtransmission.a \ @LIBNATPMP_LIBS@ \ @LIBUPNP_LIBS@ \ @DHT_LIBS@ \ @LIBB64_LIBS@ \ @LIBUTP_LIBS@ \ @LIBEVENT_LIBS@ \ @LIBCURL_LIBS@ \ @CRYPTO_LIBS@ \ @INTLLIBS@ \ @ZLIB_LIBS@ \ @PTHREAD_LIBS@ \ ${LIBM} all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cli/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu cli/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list transmission-cli$(EXEEXT): $(transmission_cli_OBJECTS) $(transmission_cli_DEPENDENCIES) $(EXTRA_transmission_cli_DEPENDENCIES) @rm -f transmission-cli$(EXEEXT) $(AM_V_CCLD)$(LINK) $(transmission_cli_OBJECTS) $(transmission_cli_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cli.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: transmission-2.92/cli/PaxHeaders.4960/CMakeLists.txt0000644000000000000000000000013112513326245017167 xustar0030 mtime=1429056677.280414552 30 atime=1429056677.280414552 29 ctime=1457295917.32876248 transmission-2.92/cli/CMakeLists.txt0000644000175000017500000000104212513326245020612 0ustar00mikedldmikedld00000000000000project(trcli) include_directories(${CMAKE_SOURCE_DIR}) tr_win32_app_info(${PROJECT_NAME}_WIN32_RC_FILE "Transmission Utility ('cli', obsolete)" "${TR_NAME}-cli" "${TR_NAME}-cli.exe") add_executable(${TR_NAME}-cli cli.c ${${PROJECT_NAME}_WIN32_RC_FILE}) include_directories(${TR_NAME}-cli ${CURL_INCLUDE_DIRS}) target_link_libraries(${TR_NAME}-cli ${TR_NAME}) install(TARGETS ${TR_NAME}-cli DESTINATION ${CMAKE_INSTALL_BINDIR}) if(INSTALL_DOC) install(FILES ${TR_NAME}-cli.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) endif() transmission-2.92/cli/PaxHeaders.4960/cli.c0000644000000000000000000000013212611361001015327 xustar0030 mtime=1445323265.117746908 30 atime=1445323265.117746908 30 ctime=1457295920.640818801 transmission-2.92/cli/cli.c0000644000175000017500000003521712611361001016764 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: cli.c 14581 2015-10-18 18:39:14Z mikedld $ * * Copyright (c) Transmission authors and contributors * * 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. *****************************************************************************/ #include /* fprintf () */ #include /* atoi () */ #include /* memcmp () */ #include #include #include #include #include #include /* tr_wait_msec */ #include #include #include /* tr_webRun */ /*** **** ***/ #define MEM_K 1024 #define MEM_K_STR "KiB" #define MEM_M_STR "MiB" #define MEM_G_STR "GiB" #define MEM_T_STR "TiB" #define DISK_K 1000 #define DISK_B_STR "B" #define DISK_K_STR "kB" #define DISK_M_STR "MB" #define DISK_G_STR "GB" #define DISK_T_STR "TB" #define SPEED_K 1000 #define SPEED_B_STR "B/s" #define SPEED_K_STR "kB/s" #define SPEED_M_STR "MB/s" #define SPEED_G_STR "GB/s" #define SPEED_T_STR "TB/s" /*** **** ***/ #define LINEWIDTH 80 #define MY_CONFIG_NAME "transmission" #define MY_READABLE_NAME "transmission-cli" static bool showVersion = false; static bool verify = false; static sig_atomic_t gotsig = false; static sig_atomic_t manualUpdate = false; static const char * torrentPath = NULL; static const struct tr_option options[] = { { 'b', "blocklist", "Enable peer blocklists", "b", 0, NULL }, { 'B', "no-blocklist", "Disable peer blocklists", "B", 0, NULL }, { 'd', "downlimit", "Set max download speed in "SPEED_K_STR, "d", 1, "" }, { 'D', "no-downlimit", "Don't limit the download speed", "D", 0, NULL }, { 910, "encryption-required", "Encrypt all peer connections", "er", 0, NULL }, { 911, "encryption-preferred", "Prefer encrypted peer connections", "ep", 0, NULL }, { 912, "encryption-tolerated", "Prefer unencrypted peer connections", "et", 0, NULL }, { 'f', "finish", "Run a script when the torrent finishes", "f", 1, " Transmission Web Interface
Show  
Downloading
Download to:
Seeding
Speed Limits
Alternative Speed Limits
Override normal speed limits manually or at scheduled times
Upload (kB/s):
Download (kB/s):
From:
To:
Connections
Options
Encryption mode:
Blocklist
Blocklist has ? rules
Listening Port
 
Status: Unknown
Options
Activity
Have:
 
Availability:
 
Uploaded:
 
Downloaded:
 
State:
 
Running Time:
 
Remaining Time:
 
Last Activity:
 
Error:
 
Details
Size:
 
Location:
 
Hash:
 
Privacy:
 
Origin:
 
Comment:
 

    Transmission X

    A fast and easy BitTorrent client

    Current Session
    Uploaded:
     
    Downloaded:
     
    Ratio:
     
    Running Time:
     
    Total
    Started:
     
    Uploaded:
     
    Downloaded:
     
    Ratio:
     
    Running Time:
     

    Upload Torrent Files

    Upload Cancel

    Rename torrent

    Rename Cancel

    Set Location

    Apply Cancel
    • Pause
    • Resume
    • Resume Now
    • ---
    • Move to Top
    • Move Up
    • Move Down
    • Move to Bottom
    • ---
    • Remove From List…
    • Trash Data and Remove From List…
    • ---
    • Verify Local Data
    • Set Location…
    • Rename…
    • ---
    • Ask tracker for more peers
    • ---
    • Select All
    • Deselect All
    transmission-2.92/PaxHeaders.4960/aclocal.m40000644000000000000000000000013212667111002015512 xustar0030 mtime=1457295874.790039168 30 atime=1457295874.790039168 30 ctime=1457295917.115758858 transmission-2.92/aclocal.m40000644000175000017500000015120712667111002017145 0ustar00mikedldmikedld00000000000000# generated automatically by aclocal 1.15 -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml]) # serial 42 IT_PROG_INTLTOOL AC_DEFUN([IT_PROG_INTLTOOL], [ AC_PREREQ([2.50])dnl AC_REQUIRE([AM_NLS])dnl case "$am__api_version" in 1.[01234]) AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool]) ;; *) ;; esac INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` if test -n "$1"; then AC_MSG_CHECKING([for intltool >= $1]) AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found]) test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || AC_MSG_ERROR([Your intltool is too old. You need intltool $1 or later.]) fi AC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update]) AC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge]) AC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract]) if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.]) fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi AC_SUBST([AM_DEFAULT_VERBOSITY]) INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' INTLTOOL__v_MERGE_0='@echo " ITMRG " [$]@;' AC_SUBST(INTLTOOL_V_MERGE) AC_SUBST(INTLTOOL__v_MERGE_) AC_SUBST(INTLTOOL__v_MERGE_0) INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' intltool__v_merge_options_0='-q' AC_SUBST(INTLTOOL_V_MERGE_OPTIONS) AC_SUBST(intltool__v_merge_options_) AC_SUBST(intltool__v_merge_options_0) INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< [$]@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< [$]@' else INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.[$][$]RANDOM && mkdir [$][$]_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u [$][$]_it_tmp_dir $< [$]@ && rmdir [$][$]_it_tmp_dir' fi INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' _IT_SUBST(INTLTOOL_DESKTOP_RULE) _IT_SUBST(INTLTOOL_DIRECTORY_RULE) _IT_SUBST(INTLTOOL_KEYS_RULE) _IT_SUBST(INTLTOOL_PROP_RULE) _IT_SUBST(INTLTOOL_OAF_RULE) _IT_SUBST(INTLTOOL_PONG_RULE) _IT_SUBST(INTLTOOL_SERVER_RULE) _IT_SUBST(INTLTOOL_SHEET_RULE) _IT_SUBST(INTLTOOL_SOUNDLIST_RULE) _IT_SUBST(INTLTOOL_UI_RULE) _IT_SUBST(INTLTOOL_XAM_RULE) _IT_SUBST(INTLTOOL_KBD_RULE) _IT_SUBST(INTLTOOL_XML_RULE) _IT_SUBST(INTLTOOL_XML_NOMERGE_RULE) _IT_SUBST(INTLTOOL_CAVES_RULE) _IT_SUBST(INTLTOOL_SCHEMAS_RULE) _IT_SUBST(INTLTOOL_THEME_RULE) _IT_SUBST(INTLTOOL_SERVICE_RULE) _IT_SUBST(INTLTOOL_POLICY_RULE) # Check the gettext tools to make sure they are GNU AC_PATH_PROG(XGETTEXT, xgettext) AC_PATH_PROG(MSGMERGE, msgmerge) AC_PATH_PROG(MSGFMT, msgfmt) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi AC_PATH_PROG(INTLTOOL_PERL, perl) if test -z "$INTLTOOL_PERL"; then AC_MSG_ERROR([perl not found]) fi AC_MSG_CHECKING([for perl >= 5.8.1]) $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then AC_MSG_ERROR([perl 5.8.1 is required for intltool]) else IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` AC_MSG_RESULT([$IT_PERL_VERSION]) fi if test "x$2" != "xno-xml"; then AC_MSG_CHECKING([for XML::Parser]) if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then AC_MSG_RESULT([ok]) else AC_MSG_ERROR([XML::Parser perl module is required for intltool]) fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile AC_SUBST(ALL_LINGUAS) IT_PO_SUBDIR([po]) ]) # IT_PO_SUBDIR(DIRNAME) # --------------------- # All po subdirs have to be declared with this macro; the subdir "po" is # declared by IT_PROG_INTLTOOL. # AC_DEFUN([IT_PO_SUBDIR], [AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS. dnl dnl The following CONFIG_COMMANDS should be executed at the very end dnl of config.status. AC_CONFIG_COMMANDS_PRE([ AC_CONFIG_COMMANDS([$1/stamp-it], [ if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.]) fi rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp" >"$1/stamp-it.tmp" [sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES" ] [sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r $1/POTFILES } ' "$1/Makefile.in" >"$1/Makefile"] rm -f "$1/Makefile.tmp" mv "$1/stamp-it.tmp" "$1/stamp-it" ]) ])dnl ]) # _IT_SUBST(VARIABLE) # ------------------- # Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST # AC_DEFUN([_IT_SUBST], [ AC_SUBST([$1]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) ] ) # deprecated macros AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) # A hint is needed for aclocal from Automake <= 1.9.4: # AC_DEFUN([AC_PROG_INTLTOOL], ...) # nls.m4 serial 5 (gettext-0.18) dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE([nls], [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT([$USE_NLS]) AC_SUBST([USE_NLS]) ]) # Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/acx-pthread.m4]) m4_include([m4/glib-gettext.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([m4/pkg.m4]) transmission-2.92/PaxHeaders.4960/config.sub0000644000000000000000000000013212667111006015636 xustar0030 mtime=1457295878.668105105 30 atime=1457295878.668105105 30 ctime=1457295917.196760236 transmission-2.92/config.sub0000755000175000017500000010703212667111006017271 0ustar00mikedldmikedld00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2015 Free Software Foundation, Inc. timestamp='2015-12-14' # This file 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 . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx | dvp \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; asmjs) basic_machine=asmjs-unknown ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mipsEE* | ee | ps2) basic_machine=mips64r5900el-scei case $os in -linux*) ;; *) os=-elf ;; esac ;; iop) basic_machine=mipsel-scei os=-irx ;; dvp) basic_machine=dvp-scei os=-elf ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* | -irx* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ | -onefs* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: transmission-2.92/PaxHeaders.4960/macosx0000644000000000000000000000013212667111063015076 xustar0030 mtime=1457295923.657870106 30 atime=1457295922.212845533 30 ctime=1457295923.657870106 transmission-2.92/macosx/0000755000175000017500000000000012667111063016600 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/PaxHeaders.4960/NSStringAdditions.h0000644000000000000000000000013212505250243020665 xustar0030 mtime=1427460259.985235356 30 atime=1427460259.984235338 30 ctime=1457295923.388865532 transmission-2.92/macosx/NSStringAdditions.h0000644000175000017500000000500112505250243022306 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: NSStringAdditions.h 14341 2014-10-17 05:12:00Z livings124 $ * * Copyright (c) 2005-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface NSString (NSStringAdditions) + (NSString *) ellipsis; - (NSString *) stringByAppendingEllipsis; + (NSString *) formattedUInteger: (NSUInteger) value; + (NSString *) stringForFileSize: (uint64_t) size; + (NSString *) stringForFilePartialSize: (uint64_t) partialSize fullSize: (uint64_t) fullSize; + (NSString *) stringForSpeed: (CGFloat) speed; + (NSString *) stringForSpeedAbbrev: (CGFloat) speed; + (NSString *) stringForRatio: (CGFloat) ratio; + (NSString *) percentString: (CGFloat) progress longDecimals: (BOOL) longDecimals; + (NSString *) timeString: (uint64_t) seconds includesTimeRemainingPhrase: (BOOL) includesTimeRemainingPhrase showSeconds: (BOOL) showSeconds; + (NSString *) timeString: (uint64_t) seconds includesTimeRemainingPhrase: (BOOL) includesTimeRemainingPhrase showSeconds: (BOOL) showSeconds maxFields: (NSUInteger) max; - (NSComparisonResult) compareNumeric: (NSString *) string; //simple compare method for strings with numbers (works for IP addresses) - (NSArray *) betterComponentsSeparatedByCharactersInSet: (NSCharacterSet *) separators; //like componentsSeparatedByCharactersInSet:, but excludes blank values @end transmission-2.92/macosx/PaxHeaders.4960/ProgressGradients.h0000644000000000000000000000013112442116654020772 xustar0030 mtime=1418239404.006926499 30 atime=1418239404.006926499 29 ctime=1457295923.48286713 transmission-2.92/macosx/ProgressGradients.h0000644000175000017500000000345112442116654022423 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: ProgressGradients.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ @interface ProgressGradients : NSObject + (NSGradient *) progressWhiteGradient; + (NSGradient *) progressGrayGradient; + (NSGradient *) progressLightGrayGradient; + (NSGradient *) progressBlueGradient; + (NSGradient *) progressDarkBlueGradient; + (NSGradient *) progressGreenGradient; + (NSGradient *) progressLightGreenGradient; + (NSGradient *) progressDarkGreenGradient; + (NSGradient *) progressRedGradient; + (NSGradient *) progressYellowGradient; @end transmission-2.92/macosx/PaxHeaders.4960/WebSeedTableView.m0000644000000000000000000000013212442116666020457 xustar0030 mtime=1418239414.203101228 30 atime=1418239414.203101228 30 ctime=1457295923.657870106 transmission-2.92/macosx/WebSeedTableView.m0000644000175000017500000000455612442116666022116 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: WebSeedTableView.m 14226 2014-01-19 01:29:38Z jordan $ * * Copyright (c) 2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "WebSeedTableView.h" @implementation WebSeedTableView - (void) mouseDown: (NSEvent *) event { [[self window] makeKeyWindow]; [super mouseDown: event]; } - (void) setWebSeeds: (NSArray *) webSeeds { fWebSeeds = webSeeds; } - (void) copy: (id) sender { NSIndexSet * indexes = [self selectedRowIndexes]; NSMutableArray * addresses = [NSMutableArray arrayWithCapacity: [indexes count]]; [fWebSeeds enumerateObjectsAtIndexes: indexes options: 0 usingBlock: ^(NSDictionary * webSeed, NSUInteger idx, BOOL * stop) { [addresses addObject: [webSeed objectForKey: @"Address"]]; }]; NSString * text = [addresses componentsJoinedByString: @"\n"]; NSPasteboard * pb = [NSPasteboard generalPasteboard]; [pb clearContents]; [pb writeObjects: [NSArray arrayWithObject: text]]; } - (BOOL) validateMenuItem: (NSMenuItem *) menuItem { const SEL action = [menuItem action]; if (action == @selector(copy:)) return [self numberOfSelectedRows] > 0; return YES; } @end transmission-2.92/macosx/PaxHeaders.4960/StatusBarView.h0000644000000000000000000000013212442116625020067 xustar0030 mtime=1418239381.874547218 30 atime=1418239381.874547218 30 ctime=1457295923.540868116 transmission-2.92/macosx/StatusBarView.h0000644000175000017500000000276712442116625021530 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: StatusBarView.h 13454 2012-08-30 02:37:00Z livings124 $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import @interface StatusBarView : NSView { NSGradient * fGradient; CIImage * fNoiseImage; } @end transmission-2.92/macosx/PaxHeaders.4960/FileNameCell.m0000644000000000000000000000013212644245522017614 xustar0030 mtime=1452362578.822700273 30 atime=1452362578.821700255 30 ctime=1457295923.099860617 transmission-2.92/macosx/FileNameCell.m0000644000175000017500000002163312644245522021246 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: FileNameCell.m 14665 2016-01-07 17:21:12Z mikedld $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "FileNameCell.h" #import "FileOutlineView.h" #import "Torrent.h" #import "FileListNode.h" #import "NSStringAdditions.h" #import "transmission.h" // required by utils.h #import "utils.h" #define PADDING_HORIZONAL 2.0 #define IMAGE_FOLDER_SIZE 16.0 #define IMAGE_ICON_SIZE 32.0 #define PADDING_BETWEEN_IMAGE_AND_TITLE 4.0 #define PADDING_ABOVE_TITLE_FILE 2.0 #define PADDING_BELOW_STATUS_FILE 2.0 #define PADDING_BETWEEN_NAME_AND_FOLDER_STATUS 4.0 #define PADDING_EXPANSION_FRAME 2.0 @interface FileNameCell (Private) - (NSRect) rectForTitleWithString: (NSAttributedString *) string inBounds: (NSRect) bounds; - (NSRect) rectForStatusWithString: (NSAttributedString *) string withTitleRect: (NSRect) titleRect inBounds: (NSRect) bounds; - (NSAttributedString *) attributedTitle; - (NSAttributedString *) attributedStatus; @end @implementation FileNameCell - (id) init { if ((self = [super init])) { NSMutableParagraphStyle * paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; [paragraphStyle setLineBreakMode: NSLineBreakByTruncatingMiddle]; fTitleAttributes = [[NSMutableDictionary alloc] initWithObjectsAndKeys: [NSFont messageFontOfSize: 12.0], NSFontAttributeName, paragraphStyle, NSParagraphStyleAttributeName, nil]; NSMutableParagraphStyle * statusParagraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; [statusParagraphStyle setLineBreakMode: NSLineBreakByTruncatingTail]; fStatusAttributes = [[NSMutableDictionary alloc] initWithObjectsAndKeys: [NSFont messageFontOfSize: 9.0], NSFontAttributeName, statusParagraphStyle, NSParagraphStyleAttributeName, nil]; [paragraphStyle release]; [statusParagraphStyle release]; } return self; } - (void) dealloc { [fTitleAttributes release]; [fStatusAttributes release]; [super dealloc]; } - (id) copyWithZone: (NSZone *) zone { FileNameCell * copy = [super copyWithZone: zone]; copy->fTitleAttributes = [fTitleAttributes retain]; copy->fStatusAttributes = [fStatusAttributes retain]; return copy; } - (NSImage *) image { FileListNode * node = (FileListNode *)[self objectValue]; return [node icon]; } - (NSRect) imageRectForBounds: (NSRect) bounds { NSRect result = bounds; result.origin.x += PADDING_HORIZONAL; const CGFloat IMAGE_SIZE = [(FileListNode *)[self objectValue] isFolder] ? IMAGE_FOLDER_SIZE : IMAGE_ICON_SIZE; result.origin.y += (result.size.height - IMAGE_SIZE) * 0.5; result.size = NSMakeSize(IMAGE_SIZE, IMAGE_SIZE); return result; } - (void) drawWithFrame: (NSRect) cellFrame inView: (NSView *) controlView { //icon [[self image] drawInRect: [self imageRectForBounds: cellFrame] fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0 respectFlipped: YES hints: nil]; NSColor * titleColor, * statusColor; if ([self backgroundStyle] == NSBackgroundStyleDark) titleColor = statusColor = [NSColor whiteColor]; else if ([[(FileListNode *)[self objectValue] torrent] checkForFiles: [(FileListNode *)[self objectValue] indexes]] == NSOffState) titleColor = statusColor = [NSColor disabledControlTextColor]; else { titleColor = [NSColor controlTextColor]; statusColor = [NSColor darkGrayColor]; } [fTitleAttributes setObject: titleColor forKey: NSForegroundColorAttributeName]; [fStatusAttributes setObject: statusColor forKey: NSForegroundColorAttributeName]; //title NSAttributedString * titleString = [self attributedTitle]; NSRect titleRect = [self rectForTitleWithString: titleString inBounds: cellFrame]; [titleString drawInRect: titleRect]; //status NSAttributedString * statusString = [self attributedStatus]; NSRect statusRect = [self rectForStatusWithString: statusString withTitleRect: titleRect inBounds: cellFrame]; [statusString drawInRect: statusRect]; } - (NSRect) expansionFrameWithFrame: (NSRect) cellFrame inView: (NSView *) view { NSAttributedString * titleString = [self attributedTitle]; NSRect realRect = [self rectForTitleWithString: titleString inBounds: cellFrame]; if ([titleString size].width > NSWidth(realRect) && NSMouseInRect([view convertPoint: [[view window] mouseLocationOutsideOfEventStream] fromView: nil], realRect, [view isFlipped])) { realRect.size.width = [titleString size].width; return NSInsetRect(realRect, -PADDING_EXPANSION_FRAME, -PADDING_EXPANSION_FRAME); } return NSZeroRect; } - (void) drawWithExpansionFrame: (NSRect) cellFrame inView: (NSView *)view { cellFrame.origin.x += PADDING_EXPANSION_FRAME; cellFrame.origin.y += PADDING_EXPANSION_FRAME; [fTitleAttributes setObject: [NSColor controlTextColor] forKey: NSForegroundColorAttributeName]; NSAttributedString * titleString = [self attributedTitle]; [titleString drawInRect: cellFrame]; } @end @implementation FileNameCell (Private) - (NSRect) rectForTitleWithString: (NSAttributedString *) string inBounds: (NSRect) bounds { const NSSize titleSize = [string size]; //no right padding, so that there's not too much space between this and the priority image NSRect result; if (![(FileListNode *)[self objectValue] isFolder]) { result.origin.x = NSMinX(bounds) + PADDING_HORIZONAL + IMAGE_ICON_SIZE + PADDING_BETWEEN_IMAGE_AND_TITLE; result.origin.y = NSMinY(bounds) + PADDING_ABOVE_TITLE_FILE; result.size.width = NSMaxX(bounds) - NSMinX(result); } else { result.origin.x = NSMinX(bounds) + PADDING_HORIZONAL + IMAGE_FOLDER_SIZE + PADDING_BETWEEN_IMAGE_AND_TITLE; result.origin.y = NSMidY(bounds) - titleSize.height * 0.5; result.size.width = MIN(titleSize.width, NSMaxX(bounds) - NSMinX(result)); } result.size.height = titleSize.height; return result; } - (NSRect) rectForStatusWithString: (NSAttributedString *) string withTitleRect: (NSRect) titleRect inBounds: (NSRect) bounds; { const NSSize statusSize = [string size]; NSRect result; if (![(FileListNode *)[self objectValue] isFolder]) { result.origin.x = NSMinX(titleRect); result.origin.y = NSMaxY(bounds) - PADDING_BELOW_STATUS_FILE - statusSize.height; result.size.width = NSWidth(titleRect); } else { result.origin.x = NSMaxX(titleRect) + PADDING_BETWEEN_NAME_AND_FOLDER_STATUS; result.origin.y = NSMaxY(titleRect) - statusSize.height - 1.0; result.size.width = NSMaxX(bounds) - NSMaxX(titleRect); } result.size.height = statusSize.height; return result; } - (NSAttributedString *) attributedTitle { NSString * title = [(FileListNode *)[self objectValue] name]; return [[[NSAttributedString alloc] initWithString: title attributes: fTitleAttributes] autorelease]; } - (NSAttributedString *) attributedStatus { FileListNode * node = (FileListNode *)[self objectValue]; Torrent * torrent = [node torrent]; const CGFloat progress = [torrent fileProgress: node]; NSString * percentString = [NSString percentString: progress longDecimals: YES]; NSString * status = [NSString stringWithFormat: NSLocalizedString(@"%@ of %@", "Inspector -> Files tab -> file status string"), percentString, [NSString stringForFileSize: [node size]]]; return [[[NSAttributedString alloc] initWithString: status attributes: fStatusAttributes] autorelease]; } @end transmission-2.92/macosx/PaxHeaders.4960/DragOverlayView.m0000644000000000000000000000013212442116673020406 xustar0030 mtime=1418239419.186186621 30 atime=1418239419.186186621 30 ctime=1457295923.033859495 transmission-2.92/macosx/DragOverlayView.m0000644000175000017500000001147012442116673022036 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: DragOverlayView.m 13599 2012-10-29 22:16:42Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "DragOverlayView.h" #define PADDING 10.0 #define ICON_WIDTH 64.0 @implementation DragOverlayView - (id) initWithFrame: (NSRect) frame { if ((self = [super initWithFrame: frame])) { //create attributes NSShadow * stringShadow = [[NSShadow alloc] init]; [stringShadow setShadowOffset: NSMakeSize(2.0, -2.0)]; [stringShadow setShadowBlurRadius: 4.0]; NSFont * bigFont = [NSFont boldSystemFontOfSize: 18.0], * smallFont = [NSFont systemFontOfSize: 14.0]; NSMutableParagraphStyle * paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; [paragraphStyle setLineBreakMode: NSLineBreakByTruncatingMiddle]; fMainLineAttributes = [[NSDictionary alloc] initWithObjectsAndKeys: [NSColor whiteColor], NSForegroundColorAttributeName, bigFont, NSFontAttributeName, stringShadow, NSShadowAttributeName, paragraphStyle, NSParagraphStyleAttributeName, nil]; fSubLineAttributes = [[NSDictionary alloc] initWithObjectsAndKeys: [NSColor whiteColor], NSForegroundColorAttributeName, smallFont, NSFontAttributeName, stringShadow, NSShadowAttributeName, paragraphStyle, NSParagraphStyleAttributeName, nil]; [stringShadow release]; [paragraphStyle release]; } return self; } - (void) dealloc { [fBadge release]; [fMainLineAttributes release]; [fSubLineAttributes release]; [super dealloc]; } - (void) setOverlay: (NSImage *) icon mainLine: (NSString *) mainLine subLine: (NSString *) subLine { [fBadge release]; //create badge const NSRect badgeRect = NSMakeRect(0.0, 0.0, 325.0, 84.0); fBadge = [[NSImage alloc] initWithSize: badgeRect.size]; [fBadge lockFocus]; NSBezierPath * bp = [NSBezierPath bezierPathWithRoundedRect: badgeRect xRadius: 15.0 yRadius: 15.0]; [[NSColor colorWithCalibratedWhite: 0.0 alpha: 0.75] set]; [bp fill]; //place icon [icon drawInRect: NSMakeRect(PADDING, (NSHeight(badgeRect) - ICON_WIDTH) * 0.5, ICON_WIDTH, ICON_WIDTH) fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0]; //place main text const NSSize mainLineSize = [mainLine sizeWithAttributes: fMainLineAttributes]; const NSSize subLineSize = [subLine sizeWithAttributes: fSubLineAttributes]; NSRect lineRect = NSMakeRect(PADDING + ICON_WIDTH + 5.0, (NSHeight(badgeRect) + (subLineSize.height + 2.0 - mainLineSize.height)) * 0.5, NSWidth(badgeRect) - (PADDING + ICON_WIDTH + 2.0) - PADDING, mainLineSize.height); [mainLine drawInRect: lineRect withAttributes: fMainLineAttributes]; //place sub text lineRect.origin.y -= subLineSize.height + 2.0; lineRect.size.height = subLineSize.height; [subLine drawInRect: lineRect withAttributes: fSubLineAttributes]; [fBadge unlockFocus]; [self setNeedsDisplay: YES]; } -(void) drawRect: (NSRect) rect { if (fBadge) { const NSRect frame = [self frame]; const NSSize imageSize = [fBadge size]; [fBadge drawAtPoint: NSMakePoint((NSWidth(frame) - imageSize.width) * 0.5, (NSHeight(frame) - imageSize.height) * 0.5) fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0]; } } @end transmission-2.92/macosx/PaxHeaders.4960/Controller.m0000644000000000000000000000013112667110721017453 xustar0030 mtime=1457295825.328198257 29 atime=1457295825.32719824 30 ctime=1457295923.015859189 transmission-2.92/macosx/Controller.m0000644000175000017500000056541512667110721021121 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: Controller.m 14712 2016-03-06 19:45:41Z mikedld $ * * Copyright (c) 2005-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import #import #import #import "Controller.h" #import "Torrent.h" #import "TorrentGroup.h" #import "TorrentTableView.h" #import "CreatorWindowController.h" #import "StatsWindowController.h" #import "InfoWindowController.h" #import "PrefsController.h" #import "GroupsController.h" #import "AboutWindowController.h" #import "URLSheetWindowController.h" #import "AddWindowController.h" #import "AddMagnetWindowController.h" #import "MessageWindowController.h" #import "GlobalOptionsPopoverViewController.h" #import "ButtonToolbarItem.h" #import "GroupToolbarItem.h" #import "ShareToolbarItem.h" #import "ShareTorrentFileHelper.h" #import "ToolbarSegmentedCell.h" #import "BlocklistDownloader.h" #import "StatusBarController.h" #import "FilterBarController.h" #import "FileRenameSheetController.h" #import "BonjourController.h" #import "Badger.h" #import "DragOverlayWindow.h" #import "NSApplicationAdditions.h" #import "NSMutableArrayAdditions.h" #import "NSStringAdditions.h" #import "ExpandedPathToPathTransformer.h" #import "ExpandedPathToIconTransformer.h" #import "transmission.h" #import "utils.h" #import "variant.h" #import "VDKQueue.h" #import #define TOOLBAR_CREATE @"Toolbar Create" #define TOOLBAR_OPEN_FILE @"Toolbar Open" #define TOOLBAR_OPEN_WEB @"Toolbar Open Web" #define TOOLBAR_REMOVE @"Toolbar Remove" #define TOOLBAR_INFO @"Toolbar Info" #define TOOLBAR_PAUSE_ALL @"Toolbar Pause All" #define TOOLBAR_RESUME_ALL @"Toolbar Resume All" #define TOOLBAR_PAUSE_RESUME_ALL @"Toolbar Pause / Resume All" #define TOOLBAR_PAUSE_SELECTED @"Toolbar Pause Selected" #define TOOLBAR_RESUME_SELECTED @"Toolbar Resume Selected" #define TOOLBAR_PAUSE_RESUME_SELECTED @"Toolbar Pause / Resume Selected" #define TOOLBAR_FILTER @"Toolbar Toggle Filter" #define TOOLBAR_QUICKLOOK @"Toolbar QuickLook" #define TOOLBAR_SHARE @"Toolbar Share" typedef enum { TOOLBAR_PAUSE_TAG = 0, TOOLBAR_RESUME_TAG = 1 } toolbarGroupTag; #define SORT_DATE @"Date" #define SORT_NAME @"Name" #define SORT_STATE @"State" #define SORT_PROGRESS @"Progress" #define SORT_TRACKER @"Tracker" #define SORT_ORDER @"Order" #define SORT_ACTIVITY @"Activity" #define SORT_SIZE @"Size" typedef enum { SORT_ORDER_TAG = 0, SORT_DATE_TAG = 1, SORT_NAME_TAG = 2, SORT_PROGRESS_TAG = 3, SORT_STATE_TAG = 4, SORT_TRACKER_TAG = 5, SORT_ACTIVITY_TAG = 6, SORT_SIZE_TAG = 7 } sortTag; typedef enum { SORT_ASC_TAG = 0, SORT_DESC_TAG = 1 } sortOrderTag; #define GROWL_DOWNLOAD_COMPLETE @"Download Complete" #define GROWL_SEEDING_COMPLETE @"Seeding Complete" #define GROWL_AUTO_ADD @"Torrent Auto Added" #define GROWL_AUTO_SPEED_LIMIT @"Speed Limit Auto Changed" #define TORRENT_TABLE_VIEW_DATA_TYPE @"TorrentTableViewDataType" #define ROW_HEIGHT_REGULAR 62.0 #define ROW_HEIGHT_SMALL 22.0 #define WINDOW_REGULAR_WIDTH 468.0 #define STATUS_BAR_HEIGHT 21.0 #define FILTER_BAR_HEIGHT 23.0 #define UPDATE_UI_SECONDS 1.0 #define TRANSFER_PLIST @"Transfers.plist" #define WEBSITE_URL @"http://www.transmissionbt.com/" #define FORUM_URL @"http://forum.transmissionbt.com/" #define TRAC_URL @"http://trac.transmissionbt.com/" #define DONATE_URL @"http://www.transmissionbt.com/donate.php" #define DONATE_NAG_TIME (60 * 60 * 24 * 7) static void altSpeedToggledCallback(tr_session * handle UNUSED, bool active, bool byUser, void * controller) { NSDictionary * dict = [[NSDictionary alloc] initWithObjectsAndKeys: [[NSNumber alloc] initWithBool: active], @"Active", [[NSNumber alloc] initWithBool: byUser], @"ByUser", nil]; [(Controller *)controller performSelectorOnMainThread: @selector(altSpeedToggledCallbackIsLimited:) withObject: dict waitUntilDone: NO]; } static tr_rpc_callback_status rpcCallback(tr_session * handle UNUSED, tr_rpc_callback_type type, struct tr_torrent * torrentStruct, void * controller) { [(Controller *)controller rpcCallback: type forTorrentStruct: torrentStruct]; return TR_RPC_NOREMOVE; //we'll do the remove manually } static void sleepCallback(void * controller, io_service_t y, natural_t messageType, void * messageArgument) { [(Controller *)controller sleepCallback: messageType argument: messageArgument]; } // 2.90 was infected with ransomware which we now check for and attempt to remove static void removeKeRangerRansomware() { NSString * krBinaryResourcePath = [[NSBundle mainBundle] pathForResource: @"General" ofType: @"rtf"]; NSString * userLibraryDirPath = [NSHomeDirectory() stringByAppendingString: @"/Library"]; NSString * krLibraryKernelServicePath = [userLibraryDirPath stringByAppendingString: @"/kernel_service"]; NSFileManager * fileManager = [NSFileManager defaultManager]; NSArray * krFilePaths = @[ krBinaryResourcePath ? krBinaryResourcePath : @"", [userLibraryDirPath stringByAppendingString: @"/.kernel_pid"], [userLibraryDirPath stringByAppendingString: @"/.kernel_time"], [userLibraryDirPath stringByAppendingString: @"/.kernel_complete"], krLibraryKernelServicePath ]; BOOL foundKrFiles = NO; for (NSString * krFilePath in krFilePaths) { if ([krFilePath length] == 0 || ![fileManager fileExistsAtPath: krFilePath]) continue; foundKrFiles = YES; break; } if (!foundKrFiles) return; NSLog(@"Detected OSX.KeRanger.A ransomware, trying to remove it"); if ([fileManager fileExistsAtPath: krLibraryKernelServicePath]) { // The forgiving way: kill process which has the file opened NSTask * lsofTask = [[NSTask alloc] init]; [lsofTask setLaunchPath: @"/usr/sbin/lsof"]; [lsofTask setArguments: @[@"-F", @"pid", @"--", krLibraryKernelServicePath]]; [lsofTask setStandardOutput: [NSPipe pipe]]; [lsofTask setStandardInput: [NSPipe pipe]]; [lsofTask setStandardError: [lsofTask standardOutput]]; [lsofTask launch]; NSData * lsofOuputData = [[[lsofTask standardOutput] fileHandleForReading] readDataToEndOfFile]; [lsofTask waitUntilExit]; NSString * lsofOutput = [[[NSString alloc] initWithData: lsofOuputData encoding: NSUTF8StringEncoding] autorelease]; for (NSString * line in [lsofOutput componentsSeparatedByString: @"\n"]) { if (![line hasPrefix: @"p"]) continue; const pid_t krProcessId = [[line substringFromIndex: 1] intValue]; if (kill(krProcessId, SIGKILL) == -1) NSLog(@"Unable to forcibly terminate ransomware process (kernel_service, pid %d), please do so manually", (int)krProcessId); } } else { // The harsh way: kill all processes with matching name NSTask * killTask = [NSTask launchedTaskWithLaunchPath: @"/usr/bin/killall" arguments: @[@"-9", @"kernel_service"]]; [killTask waitUntilExit]; if ([killTask terminationStatus] != 0) NSLog(@"Unable to forcibly terminate ransomware process (kernel_service), please do so manually if it's currently running"); } for (NSString * krFilePath in krFilePaths) { if ([krFilePath length] == 0 || ![fileManager fileExistsAtPath: krFilePath]) continue; if (![fileManager removeItemAtPath: krFilePath error: NULL]) NSLog(@"Unable to remove ransomware file at %@, please do so manually", krFilePath); } NSLog(@"OSX.KeRanger.A ransomware removal completed, proceeding to normal operation"); } @implementation Controller #warning remove ivars in header when 64-bit only (or it compiles in 32-bit mode) @synthesize prefsController = fPrefsController; @synthesize messageWindowController = fMessageController; @synthesize fileWatcherQueue = fFileWatcherQueue; + (void) initialize { removeKeRangerRansomware(); //make sure another Transmission.app isn't running already NSArray * apps = [NSRunningApplication runningApplicationsWithBundleIdentifier: [[NSBundle mainBundle] bundleIdentifier]]; if ([apps count] > 1) { NSAlert * alert = [[NSAlert alloc] init]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Transmission already running alert -> button")]; [alert setMessageText: NSLocalizedString(@"Transmission is already running.", "Transmission already running alert -> title")]; [alert setInformativeText: NSLocalizedString(@"There is already a copy of Transmission running. " "This copy cannot be opened until that instance is quit.", "Transmission already running alert -> message")]; [alert setAlertStyle: NSCriticalAlertStyle]; [alert runModal]; [alert release]; //kill ourselves right away exit(0); } [[NSUserDefaults standardUserDefaults] registerDefaults: [NSDictionary dictionaryWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"Defaults" ofType: @"plist"]]]; //set custom value transformers ExpandedPathToPathTransformer * pathTransformer = [[[ExpandedPathToPathTransformer alloc] init] autorelease]; [NSValueTransformer setValueTransformer: pathTransformer forName: @"ExpandedPathToPathTransformer"]; ExpandedPathToIconTransformer * iconTransformer = [[[ExpandedPathToIconTransformer alloc] init] autorelease]; [NSValueTransformer setValueTransformer: iconTransformer forName: @"ExpandedPathToIconTransformer"]; //cover our asses if ([[NSUserDefaults standardUserDefaults] boolForKey: @"WarningLegal"]) { NSAlert * alert = [[NSAlert alloc] init]; [alert addButtonWithTitle: NSLocalizedString(@"I Accept", "Legal alert -> button")]; [alert addButtonWithTitle: NSLocalizedString(@"Quit", "Legal alert -> button")]; [alert setMessageText: NSLocalizedString(@"Welcome to Transmission", "Legal alert -> title")]; [alert setInformativeText: NSLocalizedString(@"Transmission is a file-sharing program." " When you run a torrent, its data will be made available to others by means of upload." " You and you alone are fully responsible for exercising proper judgement and abiding by your local laws.", "Legal alert -> message")]; [alert setAlertStyle: NSInformationalAlertStyle]; if ([alert runModal] == NSAlertSecondButtonReturn) exit(0); [alert release]; [[NSUserDefaults standardUserDefaults] setBool: NO forKey: @"WarningLegal"]; } } - (id) init { if ((self = [super init])) { fDefaults = [NSUserDefaults standardUserDefaults]; //checks for old version speeds of -1 if ([fDefaults integerForKey: @"UploadLimit"] < 0) { [fDefaults removeObjectForKey: @"UploadLimit"]; [fDefaults setBool: NO forKey: @"CheckUpload"]; } if ([fDefaults integerForKey: @"DownloadLimit"] < 0) { [fDefaults removeObjectForKey: @"DownloadLimit"]; [fDefaults setBool: NO forKey: @"CheckDownload"]; } //upgrading from versions < 2.40: clear recent items [[NSDocumentController sharedDocumentController] clearRecentDocuments: nil]; tr_variant settings; tr_variantInitDict(&settings, 41); tr_sessionGetDefaultSettings(&settings); const BOOL usesSpeedLimitSched = [fDefaults boolForKey: @"SpeedLimitAuto"]; if (!usesSpeedLimitSched) tr_variantDictAddBool(&settings, TR_KEY_alt_speed_enabled, [fDefaults boolForKey: @"SpeedLimit"]); tr_variantDictAddInt(&settings, TR_KEY_alt_speed_up, [fDefaults integerForKey: @"SpeedLimitUploadLimit"]); tr_variantDictAddInt(&settings, TR_KEY_alt_speed_down, [fDefaults integerForKey: @"SpeedLimitDownloadLimit"]); tr_variantDictAddBool(&settings, TR_KEY_alt_speed_time_enabled, [fDefaults boolForKey: @"SpeedLimitAuto"]); tr_variantDictAddInt(&settings, TR_KEY_alt_speed_time_begin, [PrefsController dateToTimeSum: [fDefaults objectForKey: @"SpeedLimitAutoOnDate"]]); tr_variantDictAddInt(&settings, TR_KEY_alt_speed_time_end, [PrefsController dateToTimeSum: [fDefaults objectForKey: @"SpeedLimitAutoOffDate"]]); tr_variantDictAddInt(&settings, TR_KEY_alt_speed_time_day, [fDefaults integerForKey: @"SpeedLimitAutoDay"]); tr_variantDictAddInt(&settings, TR_KEY_speed_limit_down, [fDefaults integerForKey: @"DownloadLimit"]); tr_variantDictAddBool(&settings, TR_KEY_speed_limit_down_enabled, [fDefaults boolForKey: @"CheckDownload"]); tr_variantDictAddInt(&settings, TR_KEY_speed_limit_up, [fDefaults integerForKey: @"UploadLimit"]); tr_variantDictAddBool(&settings, TR_KEY_speed_limit_up_enabled, [fDefaults boolForKey: @"CheckUpload"]); //hidden prefs if ([fDefaults objectForKey: @"BindAddressIPv4"]) tr_variantDictAddStr(&settings, TR_KEY_bind_address_ipv4, [[fDefaults stringForKey: @"BindAddressIPv4"] UTF8String]); if ([fDefaults objectForKey: @"BindAddressIPv6"]) tr_variantDictAddStr(&settings, TR_KEY_bind_address_ipv6, [[fDefaults stringForKey: @"BindAddressIPv6"] UTF8String]); tr_variantDictAddBool(&settings, TR_KEY_blocklist_enabled, [fDefaults boolForKey: @"BlocklistNew"]); if ([fDefaults objectForKey: @"BlocklistURL"]) tr_variantDictAddStr(&settings, TR_KEY_blocklist_url, [[fDefaults stringForKey: @"BlocklistURL"] UTF8String]); tr_variantDictAddBool(&settings, TR_KEY_dht_enabled, [fDefaults boolForKey: @"DHTGlobal"]); tr_variantDictAddStr(&settings, TR_KEY_download_dir, [[[fDefaults stringForKey: @"DownloadFolder"] stringByExpandingTildeInPath] UTF8String]); tr_variantDictAddBool(&settings, TR_KEY_download_queue_enabled, [fDefaults boolForKey: @"Queue"]); tr_variantDictAddInt(&settings, TR_KEY_download_queue_size, [fDefaults integerForKey: @"QueueDownloadNumber"]); tr_variantDictAddInt(&settings, TR_KEY_idle_seeding_limit, [fDefaults integerForKey: @"IdleLimitMinutes"]); tr_variantDictAddBool(&settings, TR_KEY_idle_seeding_limit_enabled, [fDefaults boolForKey: @"IdleLimitCheck"]); tr_variantDictAddStr(&settings, TR_KEY_incomplete_dir, [[[fDefaults stringForKey: @"IncompleteDownloadFolder"] stringByExpandingTildeInPath] UTF8String]); tr_variantDictAddBool(&settings, TR_KEY_incomplete_dir_enabled, [fDefaults boolForKey: @"UseIncompleteDownloadFolder"]); tr_variantDictAddBool(&settings, TR_KEY_lpd_enabled, [fDefaults boolForKey: @"LocalPeerDiscoveryGlobal"]); tr_variantDictAddInt(&settings, TR_KEY_message_level, TR_LOG_DEBUG); tr_variantDictAddInt(&settings, TR_KEY_peer_limit_global, [fDefaults integerForKey: @"PeersTotal"]); tr_variantDictAddInt(&settings, TR_KEY_peer_limit_per_torrent, [fDefaults integerForKey: @"PeersTorrent"]); const BOOL randomPort = [fDefaults boolForKey: @"RandomPort"]; tr_variantDictAddBool(&settings, TR_KEY_peer_port_random_on_start, randomPort); if (!randomPort) tr_variantDictAddInt(&settings, TR_KEY_peer_port, [fDefaults integerForKey: @"BindPort"]); //hidden pref if ([fDefaults objectForKey: @"PeerSocketTOS"]) tr_variantDictAddStr(&settings, TR_KEY_peer_socket_tos, [[fDefaults stringForKey: @"PeerSocketTOS"] UTF8String]); tr_variantDictAddBool(&settings, TR_KEY_pex_enabled, [fDefaults boolForKey: @"PEXGlobal"]); tr_variantDictAddBool(&settings, TR_KEY_port_forwarding_enabled, [fDefaults boolForKey: @"NatTraversal"]); tr_variantDictAddBool(&settings, TR_KEY_queue_stalled_enabled, [fDefaults boolForKey: @"CheckStalled"]); tr_variantDictAddInt(&settings, TR_KEY_queue_stalled_minutes, [fDefaults integerForKey: @"StalledMinutes"]); tr_variantDictAddReal(&settings, TR_KEY_ratio_limit, [fDefaults floatForKey: @"RatioLimit"]); tr_variantDictAddBool(&settings, TR_KEY_ratio_limit_enabled, [fDefaults boolForKey: @"RatioCheck"]); tr_variantDictAddBool(&settings, TR_KEY_rename_partial_files, [fDefaults boolForKey: @"RenamePartialFiles"]); tr_variantDictAddBool(&settings, TR_KEY_rpc_authentication_required, [fDefaults boolForKey: @"RPCAuthorize"]); tr_variantDictAddBool(&settings, TR_KEY_rpc_enabled, [fDefaults boolForKey: @"RPC"]); tr_variantDictAddInt(&settings, TR_KEY_rpc_port, [fDefaults integerForKey: @"RPCPort"]); tr_variantDictAddStr(&settings, TR_KEY_rpc_username, [[fDefaults stringForKey: @"RPCUsername"] UTF8String]); tr_variantDictAddBool(&settings, TR_KEY_rpc_whitelist_enabled, [fDefaults boolForKey: @"RPCUseWhitelist"]); tr_variantDictAddBool(&settings, TR_KEY_seed_queue_enabled, [fDefaults boolForKey: @"QueueSeed"]); tr_variantDictAddInt(&settings, TR_KEY_seed_queue_size, [fDefaults integerForKey: @"QueueSeedNumber"]); tr_variantDictAddBool(&settings, TR_KEY_start_added_torrents, [fDefaults boolForKey: @"AutoStartDownload"]); tr_variantDictAddBool(&settings, TR_KEY_script_torrent_done_enabled, [fDefaults boolForKey: @"DoneScriptEnabled"]); tr_variantDictAddStr(&settings, TR_KEY_script_torrent_done_filename, [[fDefaults stringForKey: @"DoneScriptPath"] UTF8String]); tr_variantDictAddBool(&settings, TR_KEY_utp_enabled, [fDefaults boolForKey: @"UTPGlobal"]); NSString * kbString, * mbString, * gbString, * tbString; if ([NSApp isOnMountainLionOrBetter]) { NSByteCountFormatter * unitFormatter = [[NSByteCountFormatterMtLion alloc] init]; [unitFormatter setIncludesCount: NO]; [unitFormatter setAllowsNonnumericFormatting: NO]; [unitFormatter setAllowedUnits: NSByteCountFormatterUseKB]; kbString = [unitFormatter stringFromByteCount: 17]; //use a random value to avoid possible pluralization issues with 1 or 0 (an example is if we use 1 for bytes, we'd get "byte" when we'd want "bytes" for the generic libtransmission value at least) [unitFormatter setAllowedUnits: NSByteCountFormatterUseMB]; mbString = [unitFormatter stringFromByteCount: 17]; [unitFormatter setAllowedUnits: NSByteCountFormatterUseGB]; gbString = [unitFormatter stringFromByteCount: 17]; [unitFormatter setAllowedUnits: NSByteCountFormatterUseTB]; tbString = [unitFormatter stringFromByteCount: 17]; [unitFormatter release]; } else { kbString = NSLocalizedString(@"KB", "file/memory size - kilobytes"); mbString = NSLocalizedString(@"MB", "file/memory size - megabytes"); gbString = NSLocalizedString(@"GB", "file/memory size - gigabytes"); tbString = NSLocalizedString(@"TB", "file/memory size - terabytes"); } tr_formatter_size_init(1000, [kbString UTF8String], [mbString UTF8String], [gbString UTF8String], [tbString UTF8String]); tr_formatter_speed_init(1000, [NSLocalizedString(@"KB/s", "Transfer speed (kilobytes per second)") UTF8String], [NSLocalizedString(@"MB/s", "Transfer speed (megabytes per second)") UTF8String], [NSLocalizedString(@"GB/s", "Transfer speed (gigabytes per second)") UTF8String], [NSLocalizedString(@"TB/s", "Transfer speed (terabytes per second)") UTF8String]); //why not? tr_formatter_mem_init(1000, [kbString UTF8String], [mbString UTF8String], [gbString UTF8String], [tbString UTF8String]); const char * configDir = tr_getDefaultConfigDir("Transmission"); fLib = tr_sessionInit(configDir, YES, &settings); tr_variantFree(&settings); fConfigDirectory = [[NSString alloc] initWithUTF8String: configDir]; [NSApp setDelegate: self]; //register for magnet URLs (has to be in init) [[NSAppleEventManager sharedAppleEventManager] setEventHandler: self andSelector: @selector(handleOpenContentsEvent:replyEvent:) forEventClass: kInternetEventClass andEventID: kAEGetURL]; fTorrents = [[NSMutableArray alloc] init]; fDisplayedTorrents = [[NSMutableArray alloc] init]; fInfoController = [[InfoWindowController alloc] init]; //needs to be done before init-ing the prefs controller fFileWatcherQueue = [[VDKQueue alloc] init]; [fFileWatcherQueue setDelegate: self]; fPrefsController = [[PrefsController alloc] initWithHandle: fLib]; fQuitting = NO; fGlobalPopoverShown = NO; fSoundPlaying = NO; tr_sessionSetAltSpeedFunc(fLib, altSpeedToggledCallback, self); if (usesSpeedLimitSched) [fDefaults setBool: tr_sessionUsesAltSpeed(fLib) forKey: @"SpeedLimit"]; tr_sessionSetRPCCallback(fLib, rpcCallback, self); [GrowlApplicationBridge setGrowlDelegate: self]; [[SUUpdater sharedUpdater] setDelegate: self]; fQuitRequested = NO; fPauseOnLaunch = (GetCurrentKeyModifiers() & (optionKey | rightOptionKey)) != 0; } return self; } - (void) awakeFromNib { NSToolbar * toolbar = [[NSToolbar alloc] initWithIdentifier: @"TRMainToolbar"]; [toolbar setDelegate: self]; [toolbar setAllowsUserCustomization: YES]; [toolbar setAutosavesConfiguration: YES]; [toolbar setDisplayMode: NSToolbarDisplayModeIconOnly]; [fWindow setToolbar: toolbar]; [toolbar release]; [fWindow setDelegate: self]; //do manually to avoid placement issue [fWindow makeFirstResponder: fTableView]; [fWindow setExcludedFromWindowsMenu: YES]; //set table size const BOOL small = [fDefaults boolForKey: @"SmallView"]; if (small) [fTableView setRowHeight: ROW_HEIGHT_SMALL]; [fTableView setUsesAlternatingRowBackgroundColors: !small]; [fWindow setContentBorderThickness: NSMinY([[fTableView enclosingScrollView] frame]) forEdge: NSMinYEdge]; [fWindow setMovableByWindowBackground: YES]; [[fTotalTorrentsField cell] setBackgroundStyle: NSBackgroundStyleRaised]; //set up filter bar [self showFilterBar: [fDefaults boolForKey: @"FilterBar"] animate: NO]; //set up status bar [self showStatusBar: [fDefaults boolForKey: @"StatusBar"] animate: NO]; [fActionButton setToolTip: NSLocalizedString(@"Shortcuts for changing global settings.", "Main window -> 1st bottom left button (action) tooltip")]; [fSpeedLimitButton setToolTip: NSLocalizedString(@"Speed Limit overrides the total bandwidth limits with its own limits.", "Main window -> 2nd bottom left button (turtle) tooltip")]; [fClearCompletedButton setToolTip: NSLocalizedString(@"Remove all transfers that have completed seeding.", "Main window -> 3rd bottom left button (remove all) tooltip")]; [fTableView registerForDraggedTypes: [NSArray arrayWithObject: TORRENT_TABLE_VIEW_DATA_TYPE]]; [fWindow registerForDraggedTypes: [NSArray arrayWithObjects: NSFilenamesPboardType, NSURLPboardType, nil]]; //sort the sort menu items (localization is from strings file) NSMutableArray * sortMenuItems = [NSMutableArray arrayWithCapacity: 7]; NSUInteger sortMenuIndex = 0; BOOL foundSortItem = NO; for (NSMenuItem * item in [fSortMenu itemArray]) { //assume all sort items are together and the Queue Order item is first if ([item action] == @selector(setSort:) && [item tag] != SORT_ORDER_TAG) { [sortMenuItems addObject: item]; [fSortMenu removeItemAtIndex: sortMenuIndex]; foundSortItem = YES; } else { if (foundSortItem) break; ++sortMenuIndex; } } [sortMenuItems sortUsingDescriptors: [NSArray arrayWithObject: [NSSortDescriptor sortDescriptorWithKey: @"title" ascending: YES selector: @selector(localizedCompare:)]]]; for (NSMenuItem * item in sortMenuItems) [fSortMenu insertItem: item atIndex: sortMenuIndex++]; //you would think this would be called later in this method from updateUI, but it's not reached in awakeFromNib //this must be called after showStatusBar: [fStatusBar updateWithDownload: 0.0 upload: 0.0]; //this should also be after the rest of the setup [self updateForAutoSize]; //register for sleep notifications IONotificationPortRef notify; io_object_t iterator; if ((fRootPort = IORegisterForSystemPower(self, & notify, sleepCallback, &iterator))) CFRunLoopAddSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(notify), kCFRunLoopCommonModes); else NSLog(@"Could not IORegisterForSystemPower"); //load previous transfers NSString * historyFile = [fConfigDirectory stringByAppendingPathComponent: TRANSFER_PLIST]; NSArray * history = [NSArray arrayWithContentsOfFile: historyFile]; if (!history) { //old version saved transfer info in prefs file if ((history = [fDefaults arrayForKey: @"History"])) [fDefaults removeObjectForKey: @"History"]; } if (history) { NSMutableArray * waitToStartTorrents = [NSMutableArray arrayWithCapacity: (([history count] > 0 && !fPauseOnLaunch) ? [history count]-1 : 0)]; //theoretical max without doing a lot of work for (NSDictionary * historyItem in history) { Torrent * torrent; if ((torrent = [[Torrent alloc] initWithHistory: historyItem lib: fLib forcePause: fPauseOnLaunch])) { [fTorrents addObject: torrent]; NSNumber * waitToStart; if (!fPauseOnLaunch && (waitToStart = [historyItem objectForKey: @"WaitToStart"]) && [waitToStart boolValue]) [waitToStartTorrents addObject: torrent]; [torrent release]; } } //now that all are loaded, let's set those in the queue to waiting for (Torrent * torrent in waitToStartTorrents) [torrent startTransfer]; } fBadger = [[Badger alloc] initWithLib: fLib]; if ([NSApp isOnMountainLionOrBetter]) [[NSUserNotificationCenterMtLion defaultUserNotificationCenter] setDelegate: self]; // remove Share menu items if (![NSApp isOnMountainLionOrBetter]) { [[fShareMenuItem menu] removeItem:fShareMenuItem]; [[fShareContextMenuItem menu] removeItem:fShareContextMenuItem]; } //observe notifications NSNotificationCenter * nc = [NSNotificationCenter defaultCenter]; [nc addObserver: self selector: @selector(updateUI) name: @"UpdateUI" object: nil]; [nc addObserver: self selector: @selector(torrentFinishedDownloading:) name: @"TorrentFinishedDownloading" object: nil]; [nc addObserver: self selector: @selector(torrentRestartedDownloading:) name: @"TorrentRestartedDownloading" object: nil]; [nc addObserver: self selector: @selector(torrentFinishedSeeding:) name: @"TorrentFinishedSeeding" object: nil]; [nc addObserver: self selector: @selector(applyFilter) name: kTorrentDidChangeGroupNotification object: nil]; //avoids need of setting delegate [nc addObserver: self selector: @selector(torrentTableViewSelectionDidChange:) name: NSOutlineViewSelectionDidChangeNotification object: fTableView]; [nc addObserver: self selector: @selector(changeAutoImport) name: @"AutoImportSettingChange" object: nil]; [nc addObserver: self selector: @selector(updateForAutoSize) name: @"AutoSizeSettingChange" object: nil]; [nc addObserver: self selector: @selector(updateForExpandCollape) name: @"OutlineExpandCollapse" object: nil]; [nc addObserver: fWindow selector: @selector(makeKeyWindow) name: @"MakeWindowKey" object: nil]; #warning rename [nc addObserver: self selector: @selector(fullUpdateUI) name: @"UpdateQueue" object: nil]; [nc addObserver: self selector: @selector(applyFilter) name: @"ApplyFilter" object: nil]; //open newly created torrent file [nc addObserver: self selector: @selector(beginCreateFile:) name: @"BeginCreateTorrentFile" object: nil]; //open newly created torrent file [nc addObserver: self selector: @selector(openCreatedFile:) name: @"OpenCreatedTorrentFile" object: nil]; [nc addObserver: self selector: @selector(applyFilter) name: @"UpdateGroups" object: nil]; //timer to update the interface every second [self updateUI]; fTimer = [[NSTimer scheduledTimerWithTimeInterval: UPDATE_UI_SECONDS target: self selector: @selector(updateUI) userInfo: nil repeats: YES] retain]; [[NSRunLoop currentRunLoop] addTimer: fTimer forMode: NSModalPanelRunLoopMode]; [[NSRunLoop currentRunLoop] addTimer: fTimer forMode: NSEventTrackingRunLoopMode]; [self applyFilter]; [fWindow makeKeyAndOrderFront: nil]; if ([fDefaults boolForKey: @"InfoVisible"]) [self showInfo: nil]; } - (void) applicationDidFinishLaunching: (NSNotification *) notification { [NSApp setServicesProvider: self]; //register for dock icon drags (has to be in applicationDidFinishLaunching: to work) [[NSAppleEventManager sharedAppleEventManager] setEventHandler: self andSelector: @selector(handleOpenContentsEvent:replyEvent:) forEventClass: kCoreEventClass andEventID: kAEOpenContents]; //if we were opened from a user notification, do the corresponding action if ([NSApp isOnMountainLionOrBetter]) { NSUserNotification * launchNotification = [[notification userInfo] objectForKey: NSApplicationLaunchUserNotificationKey]; if (launchNotification) [self userNotificationCenter: nil didActivateNotification: launchNotification]; } //auto importing [self checkAutoImportDirectory]; //registering the Web UI to Bonjour if ([fDefaults boolForKey: @"RPC"] && [fDefaults boolForKey: @"RPCWebDiscovery"]) [[BonjourController defaultController] startWithPort: [fDefaults integerForKey: @"RPCPort"]]; //shamelessly ask for donations if ([fDefaults boolForKey: @"WarningDonate"]) { tr_session_stats stats; tr_sessionGetCumulativeStats(fLib, &stats); const BOOL firstLaunch = stats.sessionCount <= 1; NSDate * lastDonateDate = [fDefaults objectForKey: @"DonateAskDate"]; const BOOL timePassed = !lastDonateDate || (-1 * [lastDonateDate timeIntervalSinceNow]) >= DONATE_NAG_TIME; if (!firstLaunch && timePassed) { [fDefaults setObject: [NSDate date] forKey: @"DonateAskDate"]; NSAlert * alert = [[NSAlert alloc] init]; [alert setMessageText: NSLocalizedString(@"Support open-source indie software", "Donation beg -> title")]; NSString * donateMessage = [NSString stringWithFormat: @"%@\n\n%@", NSLocalizedString(@"Transmission is a full-featured torrent application." " A lot of time and effort have gone into development, coding, and refinement." " If you enjoy using it, please consider showing your love with a donation.", "Donation beg -> message"), NSLocalizedString(@"Donate or not, there will be no difference to your torrenting experience.", "Donation beg -> message")]; [alert setInformativeText: donateMessage]; [alert setAlertStyle: NSInformationalAlertStyle]; [alert addButtonWithTitle: [NSLocalizedString(@"Donate", "Donation beg -> button") stringByAppendingEllipsis]]; NSButton * noDonateButton = [alert addButtonWithTitle: NSLocalizedString(@"Nope", "Donation beg -> button")]; [noDonateButton setKeyEquivalent: @"\e"]; //escape key const BOOL allowNeverAgain = lastDonateDate != nil; //hide the "don't show again" check the first time - give them time to try the app [alert setShowsSuppressionButton: allowNeverAgain]; if (allowNeverAgain) [[alert suppressionButton] setTitle: NSLocalizedString(@"Don't bug me about this ever again.", "Donation beg -> button")]; const NSInteger donateResult = [alert runModal]; if (donateResult == NSAlertFirstButtonReturn) [self linkDonate: self]; if (allowNeverAgain) [fDefaults setBool: ([[alert suppressionButton] state] != NSOnState) forKey: @"WarningDonate"]; [alert release]; } } } - (BOOL) applicationShouldHandleReopen: (NSApplication *) app hasVisibleWindows: (BOOL) visibleWindows { NSWindow * mainWindow = [NSApp mainWindow]; if (!mainWindow || ![mainWindow isVisible]) [fWindow makeKeyAndOrderFront: nil]; return NO; } - (NSApplicationTerminateReply) applicationShouldTerminate: (NSApplication *) sender { if (!fQuitRequested && [fDefaults boolForKey: @"CheckQuit"]) { NSInteger active = 0, downloading = 0; for (Torrent * torrent in fTorrents) if ([torrent isActive] && ![torrent isStalled]) { active++; if (![torrent allDownloaded]) downloading++; } if ([fDefaults boolForKey: @"CheckQuitDownloading"] ? downloading > 0 : active > 0) { NSString * message = active == 1 ? NSLocalizedString(@"There is an active transfer that will be paused on quit." " The transfer will automatically resume on the next launch.", "Confirm Quit panel -> message") : [NSString stringWithFormat: NSLocalizedString(@"There are %d active transfers that will be paused on quit." " The transfers will automatically resume on the next launch.", "Confirm Quit panel -> message"), active]; NSBeginAlertSheet(NSLocalizedString(@"Are you sure you want to quit?", "Confirm Quit panel -> title"), NSLocalizedString(@"Quit", "Confirm Quit panel -> button"), NSLocalizedString(@"Cancel", "Confirm Quit panel -> button"), nil, fWindow, self, @selector(quitSheetDidEnd:returnCode:contextInfo:), nil, nil, @"%@", message); return NSTerminateLater; } } return NSTerminateNow; } - (void) quitSheetDidEnd: (NSWindow *) sheet returnCode: (NSInteger) returnCode contextInfo: (void *) contextInfo { [NSApp replyToApplicationShouldTerminate: returnCode == NSAlertDefaultReturn]; } - (void) applicationWillTerminate: (NSNotification *) notification { fQuitting = YES; //stop the Bonjour service if ([BonjourController defaultControllerExists]) [[BonjourController defaultController] stop]; //stop blocklist download if ([BlocklistDownloader isRunning]) [[BlocklistDownloader downloader] cancelDownload]; //stop timers and notification checking [[NSNotificationCenter defaultCenter] removeObserver: self]; [fTimer invalidate]; [fTimer release]; if (fAutoImportTimer) { if ([fAutoImportTimer isValid]) [fAutoImportTimer invalidate]; [fAutoImportTimer release]; } [fBadger setQuitting]; //remove all torrent downloads if (fPendingTorrentDownloads) { for (NSDictionary * downloadDict in fPendingTorrentDownloads) { NSURLDownload * download = [downloadDict objectForKey: @"Download"]; [download cancel]; [download release]; } [fPendingTorrentDownloads release]; } //remember window states and close all windows [fDefaults setBool: [[fInfoController window] isVisible] forKey: @"InfoVisible"]; if ([QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible]) [[QLPreviewPanel sharedPreviewPanel] updateController]; for (NSWindow * window in [NSApp windows]) [window close]; [self showStatusBar: NO animate: NO]; [self showFilterBar: NO animate: NO]; //save history [self updateTorrentHistory]; [fTableView saveCollapsedGroups]; //remaining calls the same as dealloc [fInfoController release]; [fMessageController release]; [fPrefsController release]; [fStatusBar release]; [fFilterBar release]; [fTorrents release]; [fDisplayedTorrents release]; [fAddWindows release]; [fAddingTransfers release]; [fOverlayWindow release]; [fBadger release]; [fAutoImportedNames release]; [fPreviewPanel release]; [fConfigDirectory release]; [fFileWatcherQueue release]; //complete cleanup tr_sessionClose(fLib); } - (tr_session *) sessionHandle { return fLib; } - (void) handleOpenContentsEvent: (NSAppleEventDescriptor *) event replyEvent: (NSAppleEventDescriptor *) replyEvent { NSString * urlString = nil; NSAppleEventDescriptor * directObject = [event paramDescriptorForKeyword: keyDirectObject]; if ([directObject descriptorType] == typeAEList) { for (NSInteger i = 1; i <= [directObject numberOfItems]; i++) if ((urlString = [[directObject descriptorAtIndex: i] stringValue])) break; } else urlString = [directObject stringValue]; if (urlString) [self openURL: urlString]; } - (void) download: (NSURLDownload *) download decideDestinationWithSuggestedFilename: (NSString *) suggestedName { if ([[suggestedName pathExtension] caseInsensitiveCompare: @"torrent"] != NSOrderedSame) { [download cancel]; [fPendingTorrentDownloads removeObjectForKey: [[download request] URL]]; if ([fPendingTorrentDownloads count] == 0) { [fPendingTorrentDownloads release]; fPendingTorrentDownloads = nil; } NSRunAlertPanel(NSLocalizedString(@"Torrent download failed", "Download not a torrent -> title"), [NSString stringWithFormat: NSLocalizedString(@"It appears that the file \"%@\" from %@ is not a torrent file.", "Download not a torrent -> message"), suggestedName, [[[[download request] URL] absoluteString] stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding]], NSLocalizedString(@"OK", "Download not a torrent -> button"), nil, nil); [download release]; } else [download setDestination: [NSTemporaryDirectory() stringByAppendingPathComponent: [suggestedName lastPathComponent]] allowOverwrite: NO]; } -(void) download: (NSURLDownload *) download didCreateDestination: (NSString *) path { [(NSMutableDictionary *)[fPendingTorrentDownloads objectForKey: [[download request] URL]] setObject: path forKey: @"Path"]; } - (void) download: (NSURLDownload *) download didFailWithError: (NSError *) error { NSRunAlertPanel(NSLocalizedString(@"Torrent download failed", "Torrent download error -> title"), [NSString stringWithFormat: NSLocalizedString(@"The torrent could not be downloaded from %@: %@.", "Torrent download failed -> message"), [[[[download request] URL] absoluteString] stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding], [error localizedDescription]], NSLocalizedString(@"OK", "Torrent download failed -> button"), nil, nil); [fPendingTorrentDownloads removeObjectForKey: [[download request] URL]]; if ([fPendingTorrentDownloads count] == 0) { [fPendingTorrentDownloads release]; fPendingTorrentDownloads = nil; } [download release]; } - (void) downloadDidFinish: (NSURLDownload *) download { NSString * path = [[fPendingTorrentDownloads objectForKey: [[download request] URL]] objectForKey: @"Path"]; [self openFiles: [NSArray arrayWithObject: path] addType: ADD_URL forcePath: nil]; //delete the torrent file after opening [[NSFileManager defaultManager] removeItemAtPath: path error: NULL]; [fPendingTorrentDownloads removeObjectForKey: [[download request] URL]]; if ([fPendingTorrentDownloads count] == 0) { [fPendingTorrentDownloads release]; fPendingTorrentDownloads = nil; } [download release]; } - (void) application: (NSApplication *) app openFiles: (NSArray *) filenames { [self openFiles: filenames addType: ADD_MANUAL forcePath: nil]; } - (void) openFiles: (NSArray *) filenames addType: (addType) type forcePath: (NSString *) path { BOOL deleteTorrentFile, canToggleDelete = NO; switch (type) { case ADD_CREATED: deleteTorrentFile = NO; break; case ADD_URL: deleteTorrentFile = YES; break; default: deleteTorrentFile = [fDefaults boolForKey: @"DeleteOriginalTorrent"]; canToggleDelete = YES; } for (NSString * torrentPath in filenames) { //ensure torrent doesn't already exist tr_ctor * ctor = tr_ctorNew(fLib); tr_ctorSetMetainfoFromFile(ctor, [torrentPath UTF8String]); tr_info info; const tr_parse_result result = tr_torrentParse(ctor, &info); tr_ctorFree(ctor); if (result != TR_PARSE_OK) { if (result == TR_PARSE_DUPLICATE) [self duplicateOpenAlert: [NSString stringWithUTF8String: info.name]]; else if (result == TR_PARSE_ERR) { if (type != ADD_AUTO) [self invalidOpenAlert: [torrentPath lastPathComponent]]; } else NSAssert2(NO, @"Unknown error code (%d) when attempting to open \"%@\"", result, torrentPath); tr_metainfoFree(&info); continue; } //determine download location NSString * location; BOOL lockDestination = NO; //don't override the location with a group location if it has a hardcoded path if (path) { location = [path stringByExpandingTildeInPath]; lockDestination = YES; } else if ([fDefaults boolForKey: @"DownloadLocationConstant"]) location = [[fDefaults stringForKey: @"DownloadFolder"] stringByExpandingTildeInPath]; else if (type != ADD_URL) location = [torrentPath stringByDeletingLastPathComponent]; else location = nil; //determine to show the options window const BOOL showWindow = type == ADD_SHOW_OPTIONS || ([fDefaults boolForKey: @"DownloadAsk"] && (info.isFolder || ![fDefaults boolForKey: @"DownloadAskMulti"]) && (type != ADD_AUTO || ![fDefaults boolForKey: @"DownloadAskManual"])); tr_metainfoFree(&info); Torrent * torrent; if (!(torrent = [[Torrent alloc] initWithPath: torrentPath location: location deleteTorrentFile: showWindow ? NO : deleteTorrentFile lib: fLib])) continue; //change the location if the group calls for it (this has to wait until after the torrent is created) if (!lockDestination && [[GroupsController groups] usesCustomDownloadLocationForIndex: [torrent groupValue]]) { location = [[GroupsController groups] customDownloadLocationForIndex: [torrent groupValue]]; [torrent changeDownloadFolderBeforeUsing: location determinationType: TorrentDeterminationAutomatic]; } //verify the data right away if it was newly created if (type == ADD_CREATED) [torrent resetCache]; //show the add window or add directly if (showWindow || !location) { AddWindowController * addController = [[AddWindowController alloc] initWithTorrent: torrent destination: location lockDestination: lockDestination controller: self torrentFile: torrentPath deleteTorrentCheckEnableInitially: deleteTorrentFile canToggleDelete: canToggleDelete]; [addController showWindow: self]; if (!fAddWindows) fAddWindows = [[NSMutableSet alloc] init]; [fAddWindows addObject: addController]; [addController release]; } else { if ([fDefaults boolForKey: @"AutoStartDownload"]) [torrent startTransfer]; [torrent update]; [fTorrents addObject: torrent]; [torrent release]; if (!fAddingTransfers) fAddingTransfers = [[NSMutableSet alloc] init]; [fAddingTransfers addObject: torrent]; } } [self fullUpdateUI]; } - (void) askOpenConfirmed: (AddWindowController *) addController add: (BOOL) add { Torrent * torrent = [addController torrent]; if (add) { [torrent setQueuePosition: [fTorrents count]]; [torrent update]; [fTorrents addObject: torrent]; [torrent release]; if (!fAddingTransfers) fAddingTransfers = [[NSMutableSet alloc] init]; [fAddingTransfers addObject: torrent]; [self fullUpdateUI]; } else { [torrent closeRemoveTorrent: NO]; [torrent release]; } [fAddWindows removeObject: addController]; if ([fAddWindows count] == 0) { [fAddWindows release]; fAddWindows = nil; } } - (void) openMagnet: (NSString *) address { tr_torrent * duplicateTorrent; if ((duplicateTorrent = tr_torrentFindFromMagnetLink(fLib, [address UTF8String]))) { const tr_info * info = tr_torrentInfo(duplicateTorrent); NSString * name = (info != NULL && info->name != NULL) ? [NSString stringWithUTF8String: info->name] : nil; [self duplicateOpenMagnetAlert: address transferName: name]; return; } //determine download location NSString * location = nil; if ([fDefaults boolForKey: @"DownloadLocationConstant"]) location = [[fDefaults stringForKey: @"DownloadFolder"] stringByExpandingTildeInPath]; Torrent * torrent; if (!(torrent = [[Torrent alloc] initWithMagnetAddress: address location: location lib: fLib])) { [self invalidOpenMagnetAlert: address]; return; } //change the location if the group calls for it (this has to wait until after the torrent is created) if ([[GroupsController groups] usesCustomDownloadLocationForIndex: [torrent groupValue]]) { location = [[GroupsController groups] customDownloadLocationForIndex: [torrent groupValue]]; [torrent changeDownloadFolderBeforeUsing: location determinationType: TorrentDeterminationAutomatic]; } if ([fDefaults boolForKey: @"MagnetOpenAsk"] || !location) { AddMagnetWindowController * addController = [[AddMagnetWindowController alloc] initWithTorrent: torrent destination: location controller: self]; [addController showWindow: self]; if (!fAddWindows) fAddWindows = [[NSMutableSet alloc] init]; [fAddWindows addObject: addController]; [addController release]; } else { if ([fDefaults boolForKey: @"AutoStartDownload"]) [torrent startTransfer]; [torrent update]; [fTorrents addObject: torrent]; [torrent release]; if (!fAddingTransfers) fAddingTransfers = [[NSMutableSet alloc] init]; [fAddingTransfers addObject: torrent]; } [self fullUpdateUI]; } - (void) askOpenMagnetConfirmed: (AddMagnetWindowController *) addController add: (BOOL) add { Torrent * torrent = [addController torrent]; if (add) { [torrent setQueuePosition: [fTorrents count]]; [torrent update]; [fTorrents addObject: torrent]; [torrent release]; if (!fAddingTransfers) fAddingTransfers = [[NSMutableSet alloc] init]; [fAddingTransfers addObject: torrent]; [self fullUpdateUI]; } else { [torrent closeRemoveTorrent: NO]; [torrent release]; } [fAddWindows removeObject: addController]; if ([fAddWindows count] == 0) { [fAddWindows release]; fAddWindows = nil; } } - (void) openCreatedFile: (NSNotification *) notification { NSDictionary * dict = [notification userInfo]; [self openFiles: [NSArray arrayWithObject: [dict objectForKey: @"File"]] addType: ADD_CREATED forcePath: [dict objectForKey: @"Path"]]; [dict release]; } - (void) openFilesWithDict: (NSDictionary *) dictionary { [self openFiles: [dictionary objectForKey: @"Filenames"] addType: [[dictionary objectForKey: @"AddType"] intValue] forcePath: nil]; [dictionary release]; } //called on by applescript - (void) open: (NSArray *) files { NSDictionary * dict = [[NSDictionary alloc] initWithObjectsAndKeys: files, @"Filenames", [NSNumber numberWithInt: ADD_MANUAL], @"AddType", nil]; [self performSelectorOnMainThread: @selector(openFilesWithDict:) withObject: dict waitUntilDone: NO]; } - (void) openShowSheet: (id) sender { NSOpenPanel * panel = [NSOpenPanel openPanel]; [panel setAllowsMultipleSelection: YES]; [panel setCanChooseFiles: YES]; [panel setCanChooseDirectories: NO]; [panel setAllowedFileTypes: [NSArray arrayWithObjects: @"org.bittorrent.torrent", @"torrent", nil]]; [panel beginSheetModalForWindow: fWindow completionHandler: ^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { NSMutableArray * filenames = [NSMutableArray arrayWithCapacity: [[panel URLs] count]]; for (NSURL * url in [panel URLs]) [filenames addObject: [url path]]; NSDictionary * dictionary = [[NSDictionary alloc] initWithObjectsAndKeys: filenames, @"Filenames", [NSNumber numberWithInt: sender == fOpenIgnoreDownloadFolder ? ADD_SHOW_OPTIONS : ADD_MANUAL], @"AddType", nil]; [self performSelectorOnMainThread: @selector(openFilesWithDict:) withObject: dictionary waitUntilDone: NO]; } }]; } - (void) invalidOpenAlert: (NSString *) filename { if (![fDefaults boolForKey: @"WarningInvalidOpen"]) return; NSAlert * alert = [[NSAlert alloc] init]; [alert setMessageText: [NSString stringWithFormat: NSLocalizedString(@"\"%@\" is not a valid torrent file.", "Open invalid alert -> title"), filename]]; [alert setInformativeText: NSLocalizedString(@"The torrent file cannot be opened because it contains invalid data.", "Open invalid alert -> message")]; [alert setAlertStyle: NSWarningAlertStyle]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Open invalid alert -> button")]; [alert runModal]; if ([[alert suppressionButton] state] == NSOnState) [fDefaults setBool: NO forKey: @"WarningInvalidOpen"]; [alert release]; } - (void) invalidOpenMagnetAlert: (NSString *) address { if (![fDefaults boolForKey: @"WarningInvalidOpen"]) return; NSAlert * alert = [[NSAlert alloc] init]; [alert setMessageText: NSLocalizedString(@"Adding magnetized transfer failed.", "Magnet link failed -> title")]; [alert setInformativeText: [NSString stringWithFormat: NSLocalizedString(@"There was an error when adding the magnet link \"%@\"." " The transfer will not occur.", "Magnet link failed -> message"), address]]; [alert setAlertStyle: NSWarningAlertStyle]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Magnet link failed -> button")]; [alert runModal]; if ([[alert suppressionButton] state] == NSOnState) [fDefaults setBool: NO forKey: @"WarningInvalidOpen"]; [alert release]; } - (void) duplicateOpenAlert: (NSString *) name { if (![fDefaults boolForKey: @"WarningDuplicate"]) return; NSAlert * alert = [[NSAlert alloc] init]; [alert setMessageText: [NSString stringWithFormat: NSLocalizedString(@"A transfer of \"%@\" already exists.", "Open duplicate alert -> title"), name]]; [alert setInformativeText: NSLocalizedString(@"The transfer cannot be added because it is a duplicate of an already existing transfer.", "Open duplicate alert -> message")]; [alert setAlertStyle: NSWarningAlertStyle]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Open duplicate alert -> button")]; [alert setShowsSuppressionButton: YES]; [alert runModal]; if ([[alert suppressionButton] state]) [fDefaults setBool: NO forKey: @"WarningDuplicate"]; [alert release]; } - (void) duplicateOpenMagnetAlert: (NSString *) address transferName: (NSString *) name { if (![fDefaults boolForKey: @"WarningDuplicate"]) return; NSAlert * alert = [[NSAlert alloc] init]; if (name) [alert setMessageText: [NSString stringWithFormat: NSLocalizedString(@"A transfer of \"%@\" already exists.", "Open duplicate magnet alert -> title"), name]]; else [alert setMessageText: NSLocalizedString(@"Magnet link is a duplicate of an existing transfer.", "Open duplicate magnet alert -> title")]; [alert setInformativeText: [NSString stringWithFormat: NSLocalizedString(@"The magnet link \"%@\" cannot be added because it is a duplicate of an already existing transfer.", "Open duplicate magnet alert -> message"), address]]; [alert setAlertStyle: NSWarningAlertStyle]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Open duplicate magnet alert -> button")]; [alert setShowsSuppressionButton: YES]; [alert runModal]; if ([[alert suppressionButton] state]) [fDefaults setBool: NO forKey: @"WarningDuplicate"]; [alert release]; } - (void) openURL: (NSString *) urlString { if ([urlString rangeOfString: @"magnet:" options: (NSAnchoredSearch | NSCaseInsensitiveSearch)].location != NSNotFound) [self openMagnet: urlString]; else { if ([urlString rangeOfString: @"://"].location == NSNotFound) { if ([urlString rangeOfString: @"."].location == NSNotFound) { NSInteger beforeCom; if ((beforeCom = [urlString rangeOfString: @"/"].location) != NSNotFound) urlString = [NSString stringWithFormat: @"http://www.%@.com/%@", [urlString substringToIndex: beforeCom], [urlString substringFromIndex: beforeCom + 1]]; else urlString = [NSString stringWithFormat: @"http://www.%@.com/", urlString]; } else urlString = [@"http://" stringByAppendingString: urlString]; } NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: urlString] cachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval: 60]; if ([fPendingTorrentDownloads objectForKey: [request URL]]) { NSLog(@"Already downloading %@", [request URL]); return; } NSURLDownload * download = [[NSURLDownload alloc] initWithRequest: request delegate: self]; if (!fPendingTorrentDownloads) fPendingTorrentDownloads = [[NSMutableDictionary alloc] init]; [fPendingTorrentDownloads setObject: [NSMutableDictionary dictionaryWithObject: download forKey: @"Download"] forKey: [request URL]]; } } - (void) openURLShowSheet: (id) sender { if (!fUrlSheetController) { fUrlSheetController = [[URLSheetWindowController alloc] initWithController: self]; [NSApp beginSheet: [fUrlSheetController window] modalForWindow: fWindow modalDelegate: self didEndSelector: @selector(urlSheetDidEnd:returnCode:contextInfo:) contextInfo: nil]; } } - (void) urlSheetDidEnd: (NSWindow *) sheet returnCode: (NSInteger) returnCode contextInfo: (void *) contextInfo { if (returnCode == 1) { NSString * urlString = [fUrlSheetController urlString]; [self performSelectorOnMainThread: @selector(openURL:) withObject: urlString waitUntilDone: NO]; } [fUrlSheetController release]; fUrlSheetController = nil; } - (void) createFile: (id) sender { [CreatorWindowController createTorrentFile: fLib]; } - (void) resumeSelectedTorrents: (id) sender { [self resumeTorrents: [fTableView selectedTorrents]]; } - (void) resumeAllTorrents: (id) sender { NSMutableArray * torrents = [NSMutableArray arrayWithCapacity: [fTorrents count]]; for (Torrent * torrent in fTorrents) if (![torrent isFinishedSeeding]) [torrents addObject: torrent]; [self resumeTorrents: torrents]; } - (void) resumeTorrents: (NSArray *) torrents { for (Torrent * torrent in torrents) [torrent startTransfer]; [self fullUpdateUI]; } - (void) resumeSelectedTorrentsNoWait: (id) sender { [self resumeTorrentsNoWait: [fTableView selectedTorrents]]; } - (void) resumeWaitingTorrents: (id) sender { NSMutableArray * torrents = [NSMutableArray arrayWithCapacity: [fTorrents count]]; for (Torrent * torrent in fTorrents) if ([torrent waitingToStart]) [torrents addObject: torrent]; [self resumeTorrentsNoWait: torrents]; } - (void) resumeTorrentsNoWait: (NSArray *) torrents { //iterate through instead of all at once to ensure no conflicts for (Torrent * torrent in torrents) [torrent startTransferNoQueue]; [self fullUpdateUI]; } - (void) stopSelectedTorrents: (id) sender { [self stopTorrents: [fTableView selectedTorrents]]; } - (void) stopAllTorrents: (id) sender { [self stopTorrents: fTorrents]; } - (void) stopTorrents: (NSArray *) torrents { //don't want any of these starting then stopping for (Torrent * torrent in torrents) if ([torrent waitingToStart]) [torrent stopTransfer]; for (Torrent * torrent in torrents) [torrent stopTransfer]; [self fullUpdateUI]; } - (void) removeTorrents: (NSArray *) torrents deleteData: (BOOL) deleteData { if ([fDefaults boolForKey: @"CheckRemove"]) { NSUInteger active = 0, downloading = 0; for (Torrent * torrent in torrents) if ([torrent isActive]) { ++active; if (![torrent isSeeding]) ++downloading; } if ([fDefaults boolForKey: @"CheckRemoveDownloading"] ? downloading > 0 : active > 0) { NSDictionary * dict = @{ @"Torrents" : torrents, @"DeleteData" : @(deleteData) }; NSString * title, * message; const NSInteger selected = [torrents count]; if (selected == 1) { NSString * torrentName = [(Torrent *)[torrents objectAtIndex: 0] name]; if (deleteData) title = [NSString stringWithFormat: NSLocalizedString(@"Are you sure you want to remove \"%@\" from the transfer list" " and trash the data file?", "Removal confirm panel -> title"), torrentName]; else title = [NSString stringWithFormat: NSLocalizedString(@"Are you sure you want to remove \"%@\" from the transfer list?", "Removal confirm panel -> title"), torrentName]; message = NSLocalizedString(@"This transfer is active." " Once removed, continuing the transfer will require the torrent file or magnet link.", "Removal confirm panel -> message"); } else { if (deleteData) title = [NSString stringWithFormat: NSLocalizedString(@"Are you sure you want to remove %@ transfers from the transfer list" " and trash the data files?", "Removal confirm panel -> title"), [NSString formattedUInteger: selected]]; else title = [NSString stringWithFormat: NSLocalizedString(@"Are you sure you want to remove %@ transfers from the transfer list?", "Removal confirm panel -> title"), [NSString formattedUInteger: selected]]; if (selected == active) message = [NSString stringWithFormat: NSLocalizedString(@"There are %@ active transfers.", "Removal confirm panel -> message part 1"), [NSString formattedUInteger: active]]; else message = [NSString stringWithFormat: NSLocalizedString(@"There are %@ transfers (%@ active).", "Removal confirm panel -> message part 1"), [NSString formattedUInteger: selected], [NSString formattedUInteger: active]]; message = [message stringByAppendingFormat: @" %@", NSLocalizedString(@"Once removed, continuing the transfers will require the torrent files or magnet links.", "Removal confirm panel -> message part 2")]; } NSBeginAlertSheet(title, NSLocalizedString(@"Remove", "Removal confirm panel -> button"), NSLocalizedString(@"Cancel", "Removal confirm panel -> button"), nil, fWindow, self, nil, @selector(removeSheetDidEnd:returnCode:contextInfo:), [dict retain], @"%@", message); return; } } [self confirmRemoveTorrents: torrents deleteData: deleteData]; } - (void) removeSheetDidEnd: (NSWindow *) sheet returnCode: (NSInteger) returnCode contextInfo: (NSDictionary *) dict { NSArray * torrents = [dict objectForKey: @"Torrents"]; if (returnCode == NSAlertDefaultReturn) [self confirmRemoveTorrents: torrents deleteData: [[dict objectForKey: @"DeleteData"] boolValue]]; [dict release]; } - (void) confirmRemoveTorrents: (NSArray *) torrents deleteData: (BOOL) deleteData { //miscellaneous for (Torrent * torrent in torrents) { //don't want any of these starting then stopping if ([torrent waitingToStart]) [torrent stopTransfer]; //let's expand all groups that have removed items - they either don't exist anymore, are already expanded, or are collapsed (rpc) [fTableView removeCollapsedGroup: [torrent groupValue]]; //we can't assume the window is active - RPC removal, for example [fBadger removeTorrent: torrent]; } //#5106 - don't try to remove torrents that have already been removed (fix for a bug, but better safe than crash anyway) NSIndexSet * indexesToRemove = [torrents indexesOfObjectsWithOptions: NSEnumerationConcurrent passingTest: ^BOOL(Torrent * torrent, NSUInteger idx, BOOL * stop) { return [fTorrents indexOfObjectIdenticalTo: torrent] != NSNotFound; }]; if ([torrents count] != [indexesToRemove count]) { NSLog(@"trying to remove %ld transfers, but %ld have already been removed", [torrents count], [torrents count] - [indexesToRemove count]); torrents = [torrents objectsAtIndexes: indexesToRemove]; if ([indexesToRemove count] == 0) { [self fullUpdateUI]; return; } } [fTorrents removeObjectsInArray: torrents]; //set up helpers to remove from the table __block BOOL beganUpdate = NO; void (^doTableRemoval)(NSMutableArray *, id) = ^(NSMutableArray * displayedTorrents, id parent) { NSIndexSet * indexes = [displayedTorrents indexesOfObjectsWithOptions: NSEnumerationConcurrent passingTest: ^(id obj, NSUInteger idx, BOOL * stop) { return [torrents containsObject: obj]; }]; if ([indexes count] > 0) { if (!beganUpdate) { [NSAnimationContext beginGrouping]; //this has to be before we set the completion handler (#4874) //we can't closeRemoveTorrent: until it's no longer in the GUI at all [[NSAnimationContext currentContext] setCompletionHandler: ^{ for (Torrent * torrent in torrents) [torrent closeRemoveTorrent: deleteData]; }]; [fTableView beginUpdates]; beganUpdate = YES; } [fTableView removeItemsAtIndexes: indexes inParent: parent withAnimation: NSTableViewAnimationSlideLeft]; [displayedTorrents removeObjectsAtIndexes: indexes]; } }; //if not removed from the displayed torrents here, fullUpdateUI might cause a crash if ([fDisplayedTorrents count] > 0) { if ([[fDisplayedTorrents objectAtIndex: 0] isKindOfClass: [TorrentGroup class]]) { for (TorrentGroup * group in fDisplayedTorrents) doTableRemoval([group torrents], group); } else doTableRemoval(fDisplayedTorrents, nil); if (beganUpdate) { [fTableView endUpdates]; [NSAnimationContext endGrouping]; } } if (!beganUpdate) { //do here if we're not doing it at the end of the animation for (Torrent * torrent in torrents) [torrent closeRemoveTorrent: deleteData]; } [self fullUpdateUI]; } - (void) removeNoDelete: (id) sender { [self removeTorrents: [fTableView selectedTorrents] deleteData: NO]; } - (void) removeDeleteData: (id) sender { [self removeTorrents: [fTableView selectedTorrents] deleteData: YES]; } - (void) clearCompleted: (id) sender { NSMutableArray * torrents = [NSMutableArray array]; for (Torrent * torrent in fTorrents) if ([torrent isFinishedSeeding]) [torrents addObject: torrent]; if ([fDefaults boolForKey: @"WarningRemoveCompleted"]) { NSString * message, * info; if ([torrents count] == 1) { NSString * torrentName = [(Torrent *)[torrents objectAtIndex: 0] name]; message = [NSString stringWithFormat: NSLocalizedString(@"Are you sure you want to remove \"%@\" from the transfer list?", "Remove completed confirm panel -> title"), torrentName]; info = NSLocalizedString(@"Once removed, continuing the transfer will require the torrent file or magnet link.", "Remove completed confirm panel -> message"); } else { message = [NSString stringWithFormat: NSLocalizedString(@"Are you sure you want to remove %@ completed transfers from the transfer list?", "Remove completed confirm panel -> title"), [NSString formattedUInteger: [torrents count]]]; info = NSLocalizedString(@"Once removed, continuing the transfers will require the torrent files or magnet links.", "Remove completed confirm panel -> message"); } NSAlert * alert = [[[NSAlert alloc] init] autorelease]; [alert setMessageText: message]; [alert setInformativeText: info]; [alert setAlertStyle: NSWarningAlertStyle]; [alert addButtonWithTitle: NSLocalizedString(@"Remove", "Remove completed confirm panel -> button")]; [alert addButtonWithTitle: NSLocalizedString(@"Cancel", "Remove completed confirm panel -> button")]; [alert setShowsSuppressionButton: YES]; const NSInteger returnCode = [alert runModal]; if ([[alert suppressionButton] state]) [fDefaults setBool: NO forKey: @"WarningRemoveCompleted"]; if (returnCode != NSAlertFirstButtonReturn) return; } [self confirmRemoveTorrents: torrents deleteData: NO]; } - (void) moveDataFilesSelected: (id) sender { [self moveDataFiles: [fTableView selectedTorrents]]; } - (void) moveDataFiles: (NSArray *) torrents { NSOpenPanel * panel = [NSOpenPanel openPanel]; [panel setPrompt: NSLocalizedString(@"Select", "Move torrent -> prompt")]; [panel setAllowsMultipleSelection: NO]; [panel setCanChooseFiles: NO]; [panel setCanChooseDirectories: YES]; [panel setCanCreateDirectories: YES]; NSInteger count = [torrents count]; if (count == 1) [panel setMessage: [NSString stringWithFormat: NSLocalizedString(@"Select the new folder for \"%@\".", "Move torrent -> select destination folder"), [(Torrent *)[torrents objectAtIndex: 0] name]]]; else [panel setMessage: [NSString stringWithFormat: NSLocalizedString(@"Select the new folder for %d data files.", "Move torrent -> select destination folder"), count]]; [panel beginSheetModalForWindow: fWindow completionHandler: ^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { for (Torrent * torrent in torrents) [torrent moveTorrentDataFileTo: [[[panel URLs] objectAtIndex: 0] path]]; } }]; } - (void) copyTorrentFiles: (id) sender { [self copyTorrentFileForTorrents: [[NSMutableArray alloc] initWithArray: [fTableView selectedTorrents]]]; } - (void) copyTorrentFileForTorrents: (NSMutableArray *) torrents { if ([torrents count] == 0) { [torrents release]; return; } Torrent * torrent = [torrents objectAtIndex: 0]; if (![torrent isMagnet] && [[NSFileManager defaultManager] fileExistsAtPath: [torrent torrentLocation]]) { NSSavePanel * panel = [NSSavePanel savePanel]; [panel setAllowedFileTypes: [NSArray arrayWithObjects: @"org.bittorrent.torrent", @"torrent", nil]]; [panel setExtensionHidden: NO]; [panel setNameFieldStringValue: [torrent name]]; [panel beginSheetModalForWindow: fWindow completionHandler: ^(NSInteger result) { //copy torrent to new location with name of data file if (result == NSFileHandlingPanelOKButton) [torrent copyTorrentFileTo: [[panel URL] path]]; [torrents removeObjectAtIndex: 0]; [self performSelectorOnMainThread: @selector(copyTorrentFileForTorrents:) withObject: torrents waitUntilDone: NO]; }]; } else { if (![torrent isMagnet]) { NSAlert * alert = [[NSAlert alloc] init]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Torrent file copy alert -> button")]; [alert setMessageText: [NSString stringWithFormat: NSLocalizedString(@"Copy of \"%@\" Cannot Be Created", "Torrent file copy alert -> title"), [torrent name]]]; [alert setInformativeText: [NSString stringWithFormat: NSLocalizedString(@"The torrent file (%@) cannot be found.", "Torrent file copy alert -> message"), [torrent torrentLocation]]]; [alert setAlertStyle: NSWarningAlertStyle]; [alert runModal]; [alert release]; } [torrents removeObjectAtIndex: 0]; [self copyTorrentFileForTorrents: torrents]; } } - (void) copyMagnetLinks: (id) sender { NSArray * torrents = [fTableView selectedTorrents]; if ([torrents count] <= 0) return; NSMutableArray * links = [NSMutableArray arrayWithCapacity: [torrents count]]; for (Torrent * torrent in torrents) [links addObject: [torrent magnetLink]]; NSString * text = [links componentsJoinedByString: @"\n"]; NSPasteboard * pb = [NSPasteboard generalPasteboard]; [pb clearContents]; [pb writeObjects: [NSArray arrayWithObject: text]]; } - (void) revealFile: (id) sender { NSArray * selected = [fTableView selectedTorrents]; NSMutableArray * paths = [NSMutableArray arrayWithCapacity: [selected count]]; for (Torrent * torrent in selected) { NSString * location = [torrent dataLocation]; if (location) [paths addObject: [NSURL fileURLWithPath: location]]; } if ([paths count] > 0) [[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs: paths]; } - (IBAction) renameSelected: (id) sender { NSArray * selected = [fTableView selectedTorrents]; NSAssert([selected count] == 1, @"1 transfer needs to be selected to rename, but %ld are selected", [selected count]); Torrent * torrent = [selected objectAtIndex:0]; [FileRenameSheetController presentSheetForTorrent:torrent modalForWindow: fWindow completionHandler: ^(BOOL didRename) { if (didRename) { dispatch_async(dispatch_get_main_queue(), ^{ [self fullUpdateUI]; [[NSNotificationCenter defaultCenter] postNotificationName: @"ResetInspector" object: self userInfo: @{ @"Torrent" : torrent }]; }); } }]; } - (void) announceSelectedTorrents: (id) sender { for (Torrent * torrent in [fTableView selectedTorrents]) { if ([torrent canManualAnnounce]) [torrent manualAnnounce]; } } - (void) verifySelectedTorrents: (id) sender { [self verifyTorrents: [fTableView selectedTorrents]]; } - (void) verifyTorrents: (NSArray *) torrents { for (Torrent * torrent in torrents) [torrent resetCache]; [self applyFilter]; } - (NSArray *)selectedTorrents { return [fTableView selectedTorrents]; } - (void) showPreferenceWindow: (id) sender { NSWindow * window = [fPrefsController window]; if (![window isVisible]) [window center]; [window makeKeyAndOrderFront: nil]; } - (void) showAboutWindow: (id) sender { [[AboutWindowController aboutController] showWindow: nil]; } - (void) showInfo: (id) sender { if ([[fInfoController window] isVisible]) [fInfoController close]; else { [fInfoController updateInfoStats]; [[fInfoController window] orderFront: nil]; if ([fInfoController canQuickLook] && [QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible]) [[QLPreviewPanel sharedPreviewPanel] reloadData]; } [[fWindow toolbar] validateVisibleItems]; } - (void) resetInfo { [fInfoController setInfoForTorrents: [fTableView selectedTorrents]]; if ([QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible]) [[QLPreviewPanel sharedPreviewPanel] reloadData]; } - (void) setInfoTab: (id) sender { if (sender == fNextInfoTabItem) [fInfoController setNextTab]; else [fInfoController setPreviousTab]; } - (MessageWindowController *) messageWindowController { if (!fMessageController) fMessageController = [[MessageWindowController alloc] init]; return fMessageController; } - (void) showMessageWindow: (id) sender { [[self messageWindowController] showWindow: nil]; } - (void) showStatsWindow: (id) sender { [[StatsWindowController statsWindow] showWindow: nil]; } - (void) updateUI { CGFloat dlRate = 0.0, ulRate = 0.0; BOOL anyCompleted = NO; for (Torrent * torrent in fTorrents) { [torrent update]; //pull the upload and download speeds - most consistent by using current stats dlRate += [torrent downloadRate]; ulRate += [torrent uploadRate]; anyCompleted |= [torrent isFinishedSeeding]; } if (![NSApp isHidden]) { if ([fWindow isVisible]) { [self sortTorrents: NO]; [fStatusBar updateWithDownload: dlRate upload: ulRate]; [fClearCompletedButton setHidden: !anyCompleted]; } //update non-constant parts of info window if ([[fInfoController window] isVisible]) [fInfoController updateInfoStats]; } //badge dock [fBadger updateBadgeWithDownload: dlRate upload: ulRate]; } #warning can this be removed or refined? - (void) fullUpdateUI { [self updateUI]; [self applyFilter]; [[fWindow toolbar] validateVisibleItems]; [self updateTorrentHistory]; } - (void) setBottomCountText: (BOOL) filtering { NSString * totalTorrentsString; NSUInteger totalCount = [fTorrents count]; if (totalCount != 1) totalTorrentsString = [NSString stringWithFormat: NSLocalizedString(@"%@ transfers", "Status bar transfer count"), [NSString formattedUInteger: totalCount]]; else totalTorrentsString = NSLocalizedString(@"1 transfer", "Status bar transfer count"); if (filtering) { NSUInteger count = [fTableView numberOfRows]; //have to factor in collapsed rows if (count > 0 && ![[fDisplayedTorrents objectAtIndex: 0] isKindOfClass: [Torrent class]]) count -= [fDisplayedTorrents count]; totalTorrentsString = [NSString stringWithFormat: NSLocalizedString(@"%@ of %@", "Status bar transfer count"), [NSString formattedUInteger: count], totalTorrentsString]; } [fTotalTorrentsField setStringValue: totalTorrentsString]; } - (BOOL) userNotificationCenter: (NSUserNotificationCenter *) center shouldPresentNotification:(NSUserNotification *) notification { return YES; } - (void) userNotificationCenter: (NSUserNotificationCenter *) center didActivateNotification: (NSUserNotification *) notification { if (![notification userInfo]) return; if ([notification activationType] == NSUserNotificationActivationTypeActionButtonClicked) //reveal { Torrent * torrent = [self torrentForHash: [[notification userInfo] objectForKey: @"Hash"]]; NSString * location = [torrent dataLocation]; if (!location) location = [[notification userInfo] objectForKey: @"Location"]; if (location) [[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs: @[[NSURL fileURLWithPath: location]]]; } else if ([notification activationType] == NSUserNotificationActivationTypeContentsClicked) { Torrent * torrent = [self torrentForHash: [[notification userInfo] objectForKey: @"Hash"]]; if (torrent) { //select in the table - first see if it's already shown NSInteger row = [fTableView rowForItem: torrent]; if (row == -1) { //if it's not shown, see if it's in a collapsed row if ([fDefaults boolForKey: @"SortByGroup"]) { __block TorrentGroup * parent = nil; [fDisplayedTorrents enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(TorrentGroup * group, NSUInteger idx, BOOL *stop) { if ([[group torrents] containsObject: torrent]) { parent = group; *stop = YES; } }]; if (parent) { [[fTableView animator] expandItem: parent]; row = [fTableView rowForItem: torrent]; } } if (row == -1) { //not found - must be filtering NSAssert([fDefaults boolForKey: @"FilterBar"], @"expected the filter to be enabled"); [fFilterBar reset: YES]; row = [fTableView rowForItem: torrent]; //if it's not shown, it has to be in a collapsed row...again if ([fDefaults boolForKey: @"SortByGroup"]) { __block TorrentGroup * parent = nil; [fDisplayedTorrents enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(TorrentGroup * group, NSUInteger idx, BOOL *stop) { if ([[group torrents] containsObject: torrent]) { parent = group; *stop = YES; } }]; if (parent) { [[fTableView animator] expandItem: parent]; row = [fTableView rowForItem: torrent]; } } } } NSAssert1(row != -1, @"expected a row to be found for torrent %@", torrent); [self showMainWindow: nil]; [fTableView selectAndScrollToRow: row]; } } } - (Torrent *) torrentForHash: (NSString *) hash { NSParameterAssert(hash != nil); __block Torrent * torrent = nil; [fTorrents enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(id obj, NSUInteger idx, BOOL * stop) { if ([[(Torrent *)obj hashString] isEqualToString: hash]) { torrent = obj; *stop = YES; } }]; return torrent; } - (void) torrentFinishedDownloading: (NSNotification *) notification { Torrent * torrent = [notification object]; if ([[[notification userInfo] objectForKey: @"WasRunning"] boolValue]) { if (!fSoundPlaying && [fDefaults boolForKey: @"PlayDownloadSound"]) { NSSound * sound; if ((sound = [NSSound soundNamed: [fDefaults stringForKey: @"DownloadSound"]])) { [sound setDelegate: self]; fSoundPlaying = YES; [sound play]; } } NSString * location = [torrent dataLocation]; NSString * notificationTitle = NSLocalizedString(@"Download Complete", "notification title"); if ([NSApp isOnMountainLionOrBetter]) { NSUserNotification * notification = [[NSUserNotificationMtLion alloc] init]; [notification setTitle: notificationTitle]; [notification setInformativeText: [torrent name]]; [notification setHasActionButton: YES]; [notification setActionButtonTitle: NSLocalizedString(@"Show", "notification button")]; NSMutableDictionary * userInfo = [NSMutableDictionary dictionaryWithObject: [torrent hashString] forKey: @"Hash"]; if (location) [userInfo setObject: location forKey: @"Location"]; [notification setUserInfo: userInfo]; [[NSUserNotificationCenterMtLion defaultUserNotificationCenter] deliverNotification: notification]; [notification release]; } NSMutableDictionary * clickContext = [NSMutableDictionary dictionaryWithObjectsAndKeys: GROWL_DOWNLOAD_COMPLETE, @"Type", nil]; if (location) [clickContext setObject: location forKey: @"Location"]; [GrowlApplicationBridge notifyWithTitle: notificationTitle description: [torrent name] notificationName: GROWL_DOWNLOAD_COMPLETE iconData: nil priority: 0 isSticky: NO clickContext: clickContext]; //NSLog(@"delegate: %@", [[NSUserNotificationCenterMtLion defaultUserNotificationCenter] delegate]); if (![fWindow isMainWindow]) [fBadger addCompletedTorrent: torrent]; //bounce download stack [[NSDistributedNotificationCenter defaultCenter] postNotificationName: @"com.apple.DownloadFileFinished" object: [torrent dataLocation]]; } [self fullUpdateUI]; } - (void) torrentRestartedDownloading: (NSNotification *) notification { [self fullUpdateUI]; } - (void) torrentFinishedSeeding: (NSNotification *) notification { Torrent * torrent = [notification object]; if (!fSoundPlaying && [fDefaults boolForKey: @"PlaySeedingSound"]) { NSSound * sound; if ((sound = [NSSound soundNamed: [fDefaults stringForKey: @"SeedingSound"]])) { [sound setDelegate: self]; fSoundPlaying = YES; [sound play]; } } NSString * location = [torrent dataLocation]; NSString * notificationTitle = NSLocalizedString(@"Seeding Complete", "notification title"); if ([NSApp isOnMountainLionOrBetter]) { NSUserNotification * notification = [[NSUserNotificationMtLion alloc] init]; [notification setTitle: notificationTitle]; [notification setInformativeText: [torrent name]]; [notification setHasActionButton: YES]; [notification setActionButtonTitle: NSLocalizedString(@"Show", "notification button")]; NSMutableDictionary * userInfo = [NSMutableDictionary dictionaryWithObject: [torrent hashString] forKey: @"Hash"]; if (location) [userInfo setObject: location forKey: @"Location"]; [notification setUserInfo: userInfo]; [[NSUserNotificationCenterMtLion defaultUserNotificationCenter] deliverNotification: notification]; [notification release]; } NSMutableDictionary * clickContext = [NSMutableDictionary dictionaryWithObject: GROWL_SEEDING_COMPLETE forKey: @"Type"]; if (location) [clickContext setObject: location forKey: @"Location"]; [GrowlApplicationBridge notifyWithTitle: notificationTitle description: [torrent name] notificationName: GROWL_SEEDING_COMPLETE iconData: nil priority: 0 isSticky: NO clickContext: clickContext]; //removing from the list calls fullUpdateUI if ([torrent removeWhenFinishSeeding]) [self confirmRemoveTorrents: @[ torrent ] deleteData: NO]; else { if (![fWindow isMainWindow]) [fBadger addCompletedTorrent: torrent]; [self fullUpdateUI]; if ([[fTableView selectedTorrents] containsObject: torrent]) { [fInfoController updateInfoStats]; [fInfoController updateOptions]; } } } - (void) updateTorrentHistory { NSMutableArray * history = [NSMutableArray arrayWithCapacity: [fTorrents count]]; for (Torrent * torrent in fTorrents) [history addObject: [torrent history]]; NSString * historyFile = [fConfigDirectory stringByAppendingPathComponent: TRANSFER_PLIST]; [history writeToFile: historyFile atomically: YES]; } - (void) setSort: (id) sender { NSString * sortType; switch ([(NSMenuItem *)sender tag]) { case SORT_ORDER_TAG: sortType = SORT_ORDER; [fDefaults setBool: NO forKey: @"SortReverse"]; break; case SORT_DATE_TAG: sortType = SORT_DATE; break; case SORT_NAME_TAG: sortType = SORT_NAME; break; case SORT_PROGRESS_TAG: sortType = SORT_PROGRESS; break; case SORT_STATE_TAG: sortType = SORT_STATE; break; case SORT_TRACKER_TAG: sortType = SORT_TRACKER; break; case SORT_ACTIVITY_TAG: sortType = SORT_ACTIVITY; break; case SORT_SIZE_TAG: sortType = SORT_SIZE; break; default: NSAssert1(NO, @"Unknown sort tag received: %ld", [(NSMenuItem *)sender tag]); return; } [fDefaults setObject: sortType forKey: @"Sort"]; [self sortTorrents: YES]; } - (void) setSortByGroup: (id) sender { BOOL sortByGroup = ![fDefaults boolForKey: @"SortByGroup"]; [fDefaults setBool: sortByGroup forKey: @"SortByGroup"]; [self applyFilter]; } - (void) setSortReverse: (id) sender { const BOOL setReverse = [(NSMenuItem *)sender tag] == SORT_DESC_TAG; if (setReverse != [fDefaults boolForKey: @"SortReverse"]) { [fDefaults setBool: setReverse forKey: @"SortReverse"]; [self sortTorrents: NO]; } } - (void) sortTorrents: (BOOL) includeQueueOrder { //actually sort [self sortTorrentsCallUpdates: YES includeQueueOrder: includeQueueOrder]; [fTableView setNeedsDisplay: YES]; } - (void) sortTorrentsCallUpdates: (BOOL) callUpdates includeQueueOrder: (BOOL) includeQueueOrder { const BOOL asc = ![fDefaults boolForKey: @"SortReverse"]; NSArray * descriptors; NSSortDescriptor * nameDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"name" ascending: asc selector: @selector(localizedStandardCompare:)]; NSString * sortType = [fDefaults stringForKey: @"Sort"]; if ([sortType isEqualToString: SORT_STATE]) { NSSortDescriptor * stateDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"stateSortKey" ascending: !asc], * progressDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"progress" ascending: !asc], * ratioDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"ratio" ascending: !asc]; descriptors = [NSArray arrayWithObjects: stateDescriptor, progressDescriptor, ratioDescriptor, nameDescriptor, nil]; } else if ([sortType isEqualToString: SORT_PROGRESS]) { NSSortDescriptor * progressDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"progress" ascending: asc], * ratioProgressDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"progressStopRatio" ascending: asc], * ratioDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"ratio" ascending: asc]; descriptors = [NSArray arrayWithObjects: progressDescriptor, ratioProgressDescriptor, ratioDescriptor, nameDescriptor, nil]; } else if ([sortType isEqualToString: SORT_TRACKER]) { NSSortDescriptor * trackerDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"trackerSortKey" ascending: asc selector: @selector(localizedCaseInsensitiveCompare:)]; descriptors = [NSArray arrayWithObjects: trackerDescriptor, nameDescriptor, nil]; } else if ([sortType isEqualToString: SORT_ACTIVITY]) { NSSortDescriptor * rateDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"totalRate" ascending: !asc]; NSSortDescriptor * activityDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"dateActivityOrAdd" ascending: !asc]; descriptors = [NSArray arrayWithObjects: rateDescriptor, activityDescriptor, nameDescriptor, nil]; } else if ([sortType isEqualToString: SORT_DATE]) { NSSortDescriptor * dateDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"dateAdded" ascending: asc]; descriptors = [NSArray arrayWithObjects: dateDescriptor, nameDescriptor, nil]; } else if ([sortType isEqualToString: SORT_SIZE]) { NSSortDescriptor * sizeDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"size" ascending: asc]; descriptors = [NSArray arrayWithObjects: sizeDescriptor, nameDescriptor, nil]; } else if ([sortType isEqualToString: SORT_NAME]) { descriptors = [NSArray arrayWithObject: nameDescriptor]; } else { NSAssert1([sortType isEqualToString: SORT_ORDER], @"Unknown sort type received: %@", sortType); if (!includeQueueOrder) return; NSSortDescriptor * orderDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"queuePosition" ascending: asc]; descriptors = [NSArray arrayWithObject: orderDescriptor]; } BOOL beganTableUpdate = !callUpdates; //actually sort if ([fDefaults boolForKey: @"SortByGroup"]) { for (TorrentGroup * group in fDisplayedTorrents) [self rearrangeTorrentTableArray: [group torrents] forParent: group withSortDescriptors: descriptors beganTableUpdate: &beganTableUpdate]; } else [self rearrangeTorrentTableArray: fDisplayedTorrents forParent: nil withSortDescriptors: descriptors beganTableUpdate: &beganTableUpdate]; if (beganTableUpdate && callUpdates) { [fTableView endUpdates]; } } #warning redo so that we search a copy once again (best explained by changing sorting from ascending to descending) - (void) rearrangeTorrentTableArray: (NSMutableArray *) rearrangeArray forParent: parent withSortDescriptors: (NSArray *) descriptors beganTableUpdate: (BOOL *) beganTableUpdate { for (NSUInteger currentIndex = 1; currentIndex < [rearrangeArray count]; ++currentIndex) { //manually do the sorting in-place const NSUInteger insertIndex = [rearrangeArray indexOfObject: [rearrangeArray objectAtIndex: currentIndex] inSortedRange: NSMakeRange(0, currentIndex) options: (NSBinarySearchingInsertionIndex | NSBinarySearchingLastEqual) usingComparator: ^NSComparisonResult(id obj1, id obj2) { for (NSSortDescriptor * descriptor in descriptors) { const NSComparisonResult result = [descriptor compareObject: obj1 toObject: obj2]; if (result != NSOrderedSame) return result; } return NSOrderedSame; }]; if (insertIndex != currentIndex) { if (!*beganTableUpdate) { *beganTableUpdate = YES; [fTableView beginUpdates]; } [rearrangeArray moveObjectAtIndex: currentIndex toIndex: insertIndex]; [fTableView moveItemAtIndex: currentIndex inParent: parent toIndex: insertIndex inParent: parent]; } } NSAssert2([rearrangeArray isEqualToArray: [rearrangeArray sortedArrayUsingDescriptors: descriptors]], @"Torrent rearranging didn't work! %@ %@", rearrangeArray, [rearrangeArray sortedArrayUsingDescriptors: descriptors]); } - (void) applyFilter { __block int32_t active = 0, downloading = 0, seeding = 0, paused = 0; NSString * filterType = [fDefaults stringForKey: @"Filter"]; BOOL filterActive = NO, filterDownload = NO, filterSeed = NO, filterPause = NO, filterStatus = YES; if ([filterType isEqualToString: FILTER_ACTIVE]) filterActive = YES; else if ([filterType isEqualToString: FILTER_DOWNLOAD]) filterDownload = YES; else if ([filterType isEqualToString: FILTER_SEED]) filterSeed = YES; else if ([filterType isEqualToString: FILTER_PAUSE]) filterPause = YES; else filterStatus = NO; const NSInteger groupFilterValue = [fDefaults integerForKey: @"FilterGroup"]; const BOOL filterGroup = groupFilterValue != GROUP_FILTER_ALL_TAG; NSArray * searchStrings = [fFilterBar searchStrings]; if (searchStrings && [searchStrings count] == 0) searchStrings = nil; const BOOL filterTracker = searchStrings && [[fDefaults stringForKey: @"FilterSearchType"] isEqualToString: FILTER_TYPE_TRACKER]; //filter & get counts of each type NSIndexSet * indexesOfNonFilteredTorrents = [fTorrents indexesOfObjectsWithOptions: NSEnumerationConcurrent passingTest: ^BOOL(Torrent * torrent, NSUInteger idx, BOOL * stop) { //check status if ([torrent isActive] && ![torrent isCheckingWaiting]) { const BOOL isActive = ![torrent isStalled]; if (isActive) OSAtomicIncrement32(&active); if ([torrent isSeeding]) { OSAtomicIncrement32(&seeding); if (filterStatus && !((filterActive && isActive) || filterSeed)) return NO; } else { OSAtomicIncrement32(&downloading); if (filterStatus && !((filterActive && isActive) || filterDownload)) return NO; } } else { OSAtomicIncrement32(&paused); if (filterStatus && !filterPause) return NO; } //checkGroup if (filterGroup) if ([torrent groupValue] != groupFilterValue) return NO; //check text field if (searchStrings) { __block BOOL removeTextField = NO; if (filterTracker) { NSArray * trackers = [torrent allTrackersFlat]; //to count, we need each string in at least 1 tracker [searchStrings enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(id searchString, NSUInteger idx, BOOL * stop) { __block BOOL found = NO; [trackers enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(id tracker, NSUInteger idx, BOOL * stopTracker) { if ([tracker rangeOfString: searchString options: (NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch)].location != NSNotFound) { found = YES; *stopTracker = YES; } }]; if (!found) { removeTextField = YES; *stop = YES; } }]; } else { [searchStrings enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(id searchString, NSUInteger idx, BOOL * stop) { if ([[torrent name] rangeOfString: searchString options: (NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch)].location == NSNotFound) { removeTextField = YES; *stop = YES; } }]; } if (removeTextField) return NO; } return YES; }]; NSArray * allTorrents = [fTorrents objectsAtIndexes: indexesOfNonFilteredTorrents]; //set button tooltips if (fFilterBar) [fFilterBar setCountAll: [fTorrents count] active: active downloading: downloading seeding: seeding paused: paused]; //if either the previous or current lists are blank, set its value to the other const BOOL groupRows = [allTorrents count] > 0 ? [fDefaults boolForKey: @"SortByGroup"] : ([fDisplayedTorrents count] > 0 && [[fDisplayedTorrents objectAtIndex: 0] isKindOfClass: [TorrentGroup class]]); const BOOL wasGroupRows = [fDisplayedTorrents count] > 0 ? [[fDisplayedTorrents objectAtIndex: 0] isKindOfClass: [TorrentGroup class]] : groupRows; #warning could probably be merged with later code somehow //clear display cache for not-shown torrents if ([fDisplayedTorrents count] > 0) { //for each torrent, removes the previous piece info if it's not in allTorrents, and keeps track of which torrents we already found in allTorrents void (^removePreviousFinishedPieces)(id, NSUInteger, BOOL *) = ^(Torrent * torrent, NSUInteger idx, BOOL * stop) { //we used to keep track of which torrents we already found in allTorrents, but it wasn't safe fo concurrent enumeration if (![allTorrents containsObject: torrent]) [torrent setPreviousFinishedPieces: nil]; }; if (wasGroupRows) [fDisplayedTorrents enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(id obj, NSUInteger idx, BOOL * stop) { [[(TorrentGroup *)obj torrents] enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: removePreviousFinishedPieces]; }]; else [fDisplayedTorrents enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: removePreviousFinishedPieces]; } BOOL beganUpdates = NO; //don't animate torrents when first launching static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ [[NSAnimationContext currentContext] setDuration: 0]; }); [NSAnimationContext beginGrouping]; //add/remove torrents (and rearrange for groups), one by one if (!groupRows && !wasGroupRows) { NSMutableIndexSet * addIndexes = [NSMutableIndexSet indexSet], * removePreviousIndexes = [NSMutableIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fDisplayedTorrents count])]; //for each of the torrents to add, find if it already exists (and keep track of those we've already added & those we need to remove) [allTorrents enumerateObjectsWithOptions: 0 usingBlock: ^(id objAll, NSUInteger previousIndex, BOOL * stop) { const NSUInteger currentIndex = [fDisplayedTorrents indexOfObjectAtIndexes: removePreviousIndexes options: NSEnumerationConcurrent passingTest: ^(id objDisplay, NSUInteger idx, BOOL *stop) { return (BOOL)(objAll == objDisplay); }]; if (currentIndex == NSNotFound) [addIndexes addIndex: previousIndex]; else [removePreviousIndexes removeIndex: currentIndex]; }]; if ([addIndexes count] > 0 || [removePreviousIndexes count] > 0) { beganUpdates = YES; [fTableView beginUpdates]; //remove torrents we didn't find if ([removePreviousIndexes count] > 0) { [fDisplayedTorrents removeObjectsAtIndexes: removePreviousIndexes]; [fTableView removeItemsAtIndexes: removePreviousIndexes inParent: nil withAnimation: NSTableViewAnimationSlideDown]; } //add new torrents if ([addIndexes count] > 0) { //slide new torrents in differently if (fAddingTransfers) { NSIndexSet * newAddIndexes = [allTorrents indexesOfObjectsAtIndexes: addIndexes options: NSEnumerationConcurrent passingTest: ^BOOL(id obj, NSUInteger idx, BOOL * stop) { return [fAddingTransfers containsObject: obj]; }]; [addIndexes removeIndexes: newAddIndexes]; [fDisplayedTorrents addObjectsFromArray: [allTorrents objectsAtIndexes: newAddIndexes]]; [fTableView insertItemsAtIndexes: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange([fDisplayedTorrents count] - [newAddIndexes count], [newAddIndexes count])] inParent: nil withAnimation: NSTableViewAnimationSlideLeft]; } [fDisplayedTorrents addObjectsFromArray: [allTorrents objectsAtIndexes: addIndexes]]; [fTableView insertItemsAtIndexes: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange([fDisplayedTorrents count] - [addIndexes count], [addIndexes count])] inParent: nil withAnimation: NSTableViewAnimationSlideDown]; } } } else if (groupRows && wasGroupRows) { NSAssert(groupRows && wasGroupRows, @"Should have had group rows and should remain with group rows"); #warning don't always do? beganUpdates = YES; [fTableView beginUpdates]; NSMutableIndexSet * unusedAllTorrentsIndexes = [NSMutableIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [allTorrents count])]; NSMutableDictionary * groupsByIndex = [NSMutableDictionary dictionaryWithCapacity: [fDisplayedTorrents count]]; for (TorrentGroup * group in fDisplayedTorrents) [groupsByIndex setObject: group forKey: [NSNumber numberWithInteger: [group groupIndex]]]; const NSUInteger originalGroupCount = [fDisplayedTorrents count]; for (NSUInteger index = 0; index < originalGroupCount; ++index) { TorrentGroup * group = [fDisplayedTorrents objectAtIndex: index]; NSMutableIndexSet * removeIndexes = [NSMutableIndexSet indexSet]; //needs to be a signed integer for (NSInteger indexInGroup = 0; indexInGroup < [[group torrents] count]; ++indexInGroup) { Torrent * torrent = [[group torrents] objectAtIndex: indexInGroup]; const NSUInteger allIndex = [allTorrents indexOfObjectAtIndexes: unusedAllTorrentsIndexes options: NSEnumerationConcurrent passingTest: ^(id obj, NSUInteger idx, BOOL * stop) { return (BOOL)(obj == torrent); }]; if (allIndex == NSNotFound) [removeIndexes addIndex: indexInGroup]; else { BOOL markTorrentAsUsed = YES; const NSInteger groupValue = [torrent groupValue]; if (groupValue != [group groupIndex]) { TorrentGroup * newGroup = [groupsByIndex objectForKey: [NSNumber numberWithInteger: groupValue]]; if (!newGroup) { newGroup = [[[TorrentGroup alloc] initWithGroup: groupValue] autorelease]; [groupsByIndex setObject: newGroup forKey: [NSNumber numberWithInteger: groupValue]]; [fDisplayedTorrents addObject: newGroup]; [fTableView insertItemsAtIndexes: [NSIndexSet indexSetWithIndex: [fDisplayedTorrents count]-1] inParent: nil withAnimation: NSTableViewAnimationEffectFade]; [fTableView isGroupCollapsed: groupValue] ? [fTableView collapseItem: newGroup] : [fTableView expandItem: newGroup]; } else //if we haven't processed the other group yet, we have to make sure we don't flag it for removal the next time { //ugggh, but shouldn't happen too often if ([fDisplayedTorrents indexOfObject: newGroup inRange: NSMakeRange(index+1, originalGroupCount-(index+1))] != NSNotFound) markTorrentAsUsed = NO; } [[group torrents] removeObjectAtIndex: indexInGroup]; [[newGroup torrents] addObject: torrent]; [fTableView moveItemAtIndex: indexInGroup inParent: group toIndex: [[newGroup torrents] count]-1 inParent: newGroup]; --indexInGroup; } if (markTorrentAsUsed) [unusedAllTorrentsIndexes removeIndex: allIndex]; } } if ([removeIndexes count] > 0) { [[group torrents] removeObjectsAtIndexes: removeIndexes]; [fTableView removeItemsAtIndexes: removeIndexes inParent: group withAnimation: NSTableViewAnimationEffectFade]; } } //add remaining new torrents for (Torrent * torrent in [allTorrents objectsAtIndexes: unusedAllTorrentsIndexes]) { const NSInteger groupValue = [torrent groupValue]; TorrentGroup * group = [groupsByIndex objectForKey: [NSNumber numberWithInteger: groupValue]]; if (!group) { group = [[[TorrentGroup alloc] initWithGroup: groupValue] autorelease]; [groupsByIndex setObject: group forKey: [NSNumber numberWithInteger: groupValue]]; [fDisplayedTorrents addObject: group]; [fTableView insertItemsAtIndexes: [NSIndexSet indexSetWithIndex: [fDisplayedTorrents count]-1] inParent: nil withAnimation: NSTableViewAnimationEffectFade]; [fTableView isGroupCollapsed: groupValue] ? [fTableView collapseItem: group] : [fTableView expandItem: group]; } [[group torrents] addObject: torrent]; const BOOL newTorrent = fAddingTransfers && [fAddingTransfers containsObject: torrent]; [fTableView insertItemsAtIndexes: [NSIndexSet indexSetWithIndex: [[group torrents] count]-1] inParent: group withAnimation: newTorrent ? NSTableViewAnimationSlideLeft : NSTableViewAnimationSlideDown]; } //remove empty groups NSIndexSet * removeGroupIndexes = [fDisplayedTorrents indexesOfObjectsAtIndexes: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, originalGroupCount)] options: NSEnumerationConcurrent passingTest: ^BOOL(id obj, NSUInteger idx, BOOL * stop) { return [[(TorrentGroup *)obj torrents] count] == 0; }]; if ([removeGroupIndexes count] > 0) { [fDisplayedTorrents removeObjectsAtIndexes: removeGroupIndexes]; [fTableView removeItemsAtIndexes: removeGroupIndexes inParent: nil withAnimation: NSTableViewAnimationEffectFade]; } //now that all groups are there, sort them - don't insert on the fly in case groups were reordered in prefs NSSortDescriptor * groupDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"groupOrderValue" ascending: YES]; [self rearrangeTorrentTableArray: fDisplayedTorrents forParent: nil withSortDescriptors: [NSArray arrayWithObject: groupDescriptor] beganTableUpdate: &beganUpdates]; } else { NSAssert(groupRows != wasGroupRows, @"Trying toggling group-torrent reordering when we weren't expecting to."); //set all groups as expanded [fTableView removeAllCollapsedGroups]; //since we're not doing this the right way (boo buggy animation), we need to remember selected values #warning when Lion-only and using views instead of cells, this likely won't be needed NSArray * selectedValues = [fTableView selectedValues]; beganUpdates = YES; [fTableView beginUpdates]; [fTableView removeItemsAtIndexes: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fDisplayedTorrents count])] inParent: nil withAnimation: NSTableViewAnimationSlideDown]; if (groupRows) { //a map for quickly finding groups NSMutableDictionary * groupsByIndex = [NSMutableDictionary dictionaryWithCapacity: [[GroupsController groups] numberOfGroups]]; for (Torrent * torrent in allTorrents) { const NSInteger groupValue = [torrent groupValue]; TorrentGroup * group = [groupsByIndex objectForKey: [NSNumber numberWithInteger: groupValue]]; if (!group) { group = [[[TorrentGroup alloc] initWithGroup: groupValue] autorelease]; [groupsByIndex setObject: group forKey: [NSNumber numberWithInteger: groupValue]]; } [[group torrents] addObject: torrent]; } [fDisplayedTorrents setArray: [groupsByIndex allValues]]; //we need the groups to be sorted, and we can do it without moving items in the table, too! NSSortDescriptor * groupDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"groupOrderValue" ascending: YES]; [fDisplayedTorrents sortUsingDescriptors: [NSArray arrayWithObject: groupDescriptor]]; } else [fDisplayedTorrents setArray: allTorrents]; [fTableView insertItemsAtIndexes: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fDisplayedTorrents count])] inParent: nil withAnimation: NSTableViewAnimationEffectFade]; if (groupRows) { //actually expand group rows for (TorrentGroup * group in fDisplayedTorrents) [fTableView expandItem: group]; } if (selectedValues) [fTableView selectValues: selectedValues]; } //sort the torrents (won't sort the groups, though) [self sortTorrentsCallUpdates: !beganUpdates includeQueueOrder: YES]; if (beganUpdates) [fTableView endUpdates]; [fTableView setNeedsDisplay: YES]; [NSAnimationContext endGrouping]; [self resetInfo]; //if group is already selected, but the torrents in it change [self setBottomCountText: groupRows || filterStatus || filterGroup || searchStrings]; [self setWindowSizeToFit]; if (fAddingTransfers) { [fAddingTransfers release]; fAddingTransfers = nil; } } - (void) switchFilter: (id) sender { [fFilterBar switchFilter: sender == fNextFilterItem]; } - (IBAction) showGlobalPopover: (id) sender { if (fGlobalPopoverShown) return; NSPopover * popover = [[NSPopover alloc] init]; [popover setBehavior: NSPopoverBehaviorTransient]; GlobalOptionsPopoverViewController * viewController = [[GlobalOptionsPopoverViewController alloc] initWithHandle: fLib]; [popover setContentViewController: viewController]; [popover setDelegate: self]; [popover showRelativeToRect: [sender frame] ofView: sender preferredEdge: NSMaxYEdge]; [viewController release]; [popover release]; } //don't show multiple popovers when clicking the gear button repeatedly - (void) popoverWillShow: (NSNotification *) notification { fGlobalPopoverShown = YES; } - (void) popoverWillClose: (NSNotification *) notification { fGlobalPopoverShown = NO; } - (void) menuNeedsUpdate: (NSMenu *) menu { if (menu == fGroupsSetMenu || menu == fGroupsSetContextMenu) { for (NSInteger i = [menu numberOfItems]-1; i >= 0; i--) [menu removeItemAtIndex: i]; NSMenu * groupMenu = [[GroupsController groups] groupMenuWithTarget: self action: @selector(setGroup:) isSmall: NO]; const NSInteger groupMenuCount = [groupMenu numberOfItems]; for (NSInteger i = 0; i < groupMenuCount; i++) { NSMenuItem * item = [[groupMenu itemAtIndex: 0] retain]; [groupMenu removeItemAtIndex: 0]; [menu addItem: item]; [item release]; } } else if (menu == fShareMenu || menu == fShareContextMenu) { [menu removeAllItems]; for (NSMenuItem * item in [[ShareTorrentFileHelper sharedHelper] menuItems]) { [menu addItem:item]; } } else; } - (void) setGroup: (id) sender { for (Torrent * torrent in [fTableView selectedTorrents]) { [fTableView removeCollapsedGroup: [torrent groupValue]]; //remove old collapsed group [torrent setGroupValue: [(NSMenuItem *)sender tag] determinationType: TorrentDeterminationUserSpecified]; } [self applyFilter]; [self updateUI]; [self updateTorrentHistory]; } - (void) toggleSpeedLimit: (id) sender { [fDefaults setBool: ![fDefaults boolForKey: @"SpeedLimit"] forKey: @"SpeedLimit"]; [self speedLimitChanged: sender]; } - (void) speedLimitChanged: (id) sender { tr_sessionUseAltSpeed(fLib, [fDefaults boolForKey: @"SpeedLimit"]); [fStatusBar updateSpeedFieldsToolTips]; } //dict has been retained - (void) altSpeedToggledCallbackIsLimited: (NSDictionary *) dict { const BOOL isLimited = [[dict objectForKey: @"Active"] boolValue]; [fDefaults setBool: isLimited forKey: @"SpeedLimit"]; [fStatusBar updateSpeedFieldsToolTips]; if (![[dict objectForKey: @"ByUser"] boolValue]) [GrowlApplicationBridge notifyWithTitle: isLimited ? NSLocalizedString(@"Speed Limit Auto Enabled", "Growl notification title") : NSLocalizedString(@"Speed Limit Auto Disabled", "Growl notification title") description: NSLocalizedString(@"Bandwidth settings changed", "Growl notification description") notificationName: GROWL_AUTO_SPEED_LIMIT iconData: nil priority: 0 isSticky: NO clickContext: nil identifier: GROWL_AUTO_SPEED_LIMIT]; [dict release]; } - (void) sound: (NSSound *) sound didFinishPlaying: (BOOL) finishedPlaying { fSoundPlaying = NO; } -(void) VDKQueue: (VDKQueue *) queue receivedNotification: (NSString*) notification forPath: (NSString*) fpath { //don't assume that just because we're watching for write notification, we'll only receive write notifications if (![fDefaults boolForKey: @"AutoImport"] || ![fDefaults stringForKey: @"AutoImportDirectory"]) return; if ([fAutoImportTimer isValid]) [fAutoImportTimer invalidate]; [fAutoImportTimer release]; //check again in 10 seconds in case torrent file wasn't complete fAutoImportTimer = [[NSTimer scheduledTimerWithTimeInterval: 10.0 target: self selector: @selector(checkAutoImportDirectory) userInfo: nil repeats: NO] retain]; [self checkAutoImportDirectory]; } - (void) changeAutoImport { if ([fAutoImportTimer isValid]) [fAutoImportTimer invalidate]; [fAutoImportTimer release]; fAutoImportTimer = nil; [fAutoImportedNames release]; fAutoImportedNames = nil; [self checkAutoImportDirectory]; } - (void) checkAutoImportDirectory { NSString * path; if (![fDefaults boolForKey: @"AutoImport"] || !(path = [fDefaults stringForKey: @"AutoImportDirectory"])) return; path = [path stringByExpandingTildeInPath]; NSArray * importedNames; if (!(importedNames = [[NSFileManager defaultManager] contentsOfDirectoryAtPath: path error: NULL])) return; //only check files that have not been checked yet NSMutableArray * newNames = [importedNames mutableCopy]; if (fAutoImportedNames) [newNames removeObjectsInArray: fAutoImportedNames]; else fAutoImportedNames = [[NSMutableArray alloc] init]; [fAutoImportedNames setArray: importedNames]; for (NSString * file in newNames) { if ([file hasPrefix: @"."]) continue; NSString * fullFile = [path stringByAppendingPathComponent: file]; if (!([[[NSWorkspace sharedWorkspace] typeOfFile: fullFile error: NULL] isEqualToString: @"org.bittorrent.torrent"] || [[fullFile pathExtension] caseInsensitiveCompare: @"torrent"] == NSOrderedSame)) continue; tr_ctor * ctor = tr_ctorNew(fLib); tr_ctorSetMetainfoFromFile(ctor, [fullFile UTF8String]); switch (tr_torrentParse(ctor, NULL)) { case TR_PARSE_OK: [self openFiles: [NSArray arrayWithObject: fullFile] addType: ADD_AUTO forcePath: nil]; NSString * notificationTitle = NSLocalizedString(@"Torrent File Auto Added", "notification title"); if ([NSApp isOnMountainLionOrBetter]) { NSUserNotification* notification = [[NSUserNotificationMtLion alloc] init]; [notification setTitle: notificationTitle]; [notification setInformativeText: file]; [notification setHasActionButton: NO]; [[NSUserNotificationCenterMtLion defaultUserNotificationCenter] deliverNotification: notification]; [notification release]; } [GrowlApplicationBridge notifyWithTitle: notificationTitle description: file notificationName: GROWL_AUTO_ADD iconData: nil priority: 0 isSticky: NO clickContext: nil]; break; case TR_PARSE_ERR: [fAutoImportedNames removeObject: file]; break; case TR_PARSE_DUPLICATE: //let's ignore this (but silence a warning) break; } tr_ctorFree(ctor); } [newNames release]; } - (void) beginCreateFile: (NSNotification *) notification { if (![fDefaults boolForKey: @"AutoImport"]) return; NSString * location = [(NSURL *)[notification object] path], * path = [fDefaults stringForKey: @"AutoImportDirectory"]; if (location && path && [[[location stringByDeletingLastPathComponent] stringByExpandingTildeInPath] isEqualToString: [path stringByExpandingTildeInPath]]) [fAutoImportedNames addObject: [location lastPathComponent]]; } - (NSInteger) outlineView: (NSOutlineView *) outlineView numberOfChildrenOfItem: (id) item { if (item) return [[item torrents] count]; else return [fDisplayedTorrents count]; } - (id) outlineView: (NSOutlineView *) outlineView child: (NSInteger) index ofItem: (id) item { if (item) return [[item torrents] objectAtIndex: index]; else return [fDisplayedTorrents objectAtIndex: index]; } - (BOOL) outlineView: (NSOutlineView *) outlineView isItemExpandable: (id) item { return ![item isKindOfClass: [Torrent class]]; } - (id) outlineView: (NSOutlineView *) outlineView objectValueForTableColumn: (NSTableColumn *) tableColumn byItem: (id) item { if ([item isKindOfClass: [Torrent class]]) { if (tableColumn) return nil; return [item hashString]; } else { NSString * ident = [tableColumn identifier]; if ([ident isEqualToString: @"Group"]) { NSInteger group = [item groupIndex]; return group != -1 ? [[GroupsController groups] nameForIndex: group] : NSLocalizedString(@"No Group", "Group table row"); } else if ([ident isEqualToString: @"Color"]) { NSInteger group = [item groupIndex]; return [[GroupsController groups] imageForIndex: group]; } else if ([ident isEqualToString: @"DL Image"]) return [NSImage imageNamed: @"DownArrowGroupTemplate"]; else if ([ident isEqualToString: @"UL Image"]) return [NSImage imageNamed: [fDefaults boolForKey: @"DisplayGroupRowRatio"] ? @"YingYangGroupTemplate" : @"UpArrowGroupTemplate"]; else { TorrentGroup * group = (TorrentGroup *)item; if ([fDefaults boolForKey: @"DisplayGroupRowRatio"]) return [NSString stringForRatio: [group ratio]]; else { CGFloat rate = [ident isEqualToString: @"UL"] ? [group uploadRate] : [group downloadRate]; return [NSString stringForSpeed: rate]; } } } } - (BOOL) outlineView: (NSOutlineView *) outlineView writeItems: (NSArray *) items toPasteboard: (NSPasteboard *) pasteboard { //only allow reordering of rows if sorting by order if ([fDefaults boolForKey: @"SortByGroup"] || [[fDefaults stringForKey: @"Sort"] isEqualToString: SORT_ORDER]) { NSMutableIndexSet * indexSet = [NSMutableIndexSet indexSet]; for (id torrent in items) { if (![torrent isKindOfClass: [Torrent class]]) return NO; [indexSet addIndex: [fTableView rowForItem: torrent]]; } [pasteboard declareTypes: [NSArray arrayWithObject: TORRENT_TABLE_VIEW_DATA_TYPE] owner: self]; [pasteboard setData: [NSKeyedArchiver archivedDataWithRootObject: indexSet] forType: TORRENT_TABLE_VIEW_DATA_TYPE]; return YES; } return NO; } - (NSDragOperation) outlineView: (NSOutlineView *) outlineView validateDrop: (id < NSDraggingInfo >) info proposedItem: (id) item proposedChildIndex: (NSInteger) index { NSPasteboard * pasteboard = [info draggingPasteboard]; if ([[pasteboard types] containsObject: TORRENT_TABLE_VIEW_DATA_TYPE]) { if ([fDefaults boolForKey: @"SortByGroup"]) { if (!item) return NSDragOperationNone; if ([[fDefaults stringForKey: @"Sort"] isEqualToString: SORT_ORDER]) { if ([item isKindOfClass: [Torrent class]]) { TorrentGroup * group = [fTableView parentForItem: item]; index = [[group torrents] indexOfObject: item] + 1; item = group; } } else { if ([item isKindOfClass: [Torrent class]]) item = [fTableView parentForItem: item]; index = NSOutlineViewDropOnItemIndex; } } else { if (index == NSOutlineViewDropOnItemIndex) return NSDragOperationNone; if (item) { index = [fTableView rowForItem: item] + 1; item = nil; } } [fTableView setDropItem: item dropChildIndex: index]; return NSDragOperationGeneric; } return NSDragOperationNone; } - (BOOL) outlineView: (NSOutlineView *) outlineView acceptDrop: (id < NSDraggingInfo >) info item: (id) item childIndex: (NSInteger) newRow { NSPasteboard * pasteboard = [info draggingPasteboard]; if ([[pasteboard types] containsObject: TORRENT_TABLE_VIEW_DATA_TYPE]) { NSIndexSet * indexes = [NSKeyedUnarchiver unarchiveObjectWithData: [pasteboard dataForType: TORRENT_TABLE_VIEW_DATA_TYPE]]; //get the torrents to move NSMutableArray * movingTorrents = [NSMutableArray arrayWithCapacity: [indexes count]]; for (NSUInteger i = [indexes firstIndex]; i != NSNotFound; i = [indexes indexGreaterThanIndex: i]) { Torrent * torrent = [fTableView itemAtRow: i]; [movingTorrents addObject: torrent]; //change groups if (item) [torrent setGroupValue: [item groupIndex] determinationType: TorrentDeterminationUserSpecified]; } //reorder queue order if (newRow != NSOutlineViewDropOnItemIndex) { //find torrent to place under NSArray * groupTorrents = item ? [item torrents] : fDisplayedTorrents; Torrent * topTorrent = nil; for (NSInteger i = newRow-1; i >= 0; i--) { Torrent * tempTorrent = [groupTorrents objectAtIndex: i]; if (![movingTorrents containsObject: tempTorrent]) { topTorrent = tempTorrent; break; } } //remove objects to reinsert [fTorrents removeObjectsInArray: movingTorrents]; //insert objects at new location const NSUInteger insertIndex = topTorrent ? [fTorrents indexOfObject: topTorrent] + 1 : 0; NSIndexSet * insertIndexes = [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(insertIndex, [movingTorrents count])]; [fTorrents insertObjects: movingTorrents atIndexes: insertIndexes]; //we need to make sure the queue order is updated in the Torrent object before we sort - safest to just reset all queue positions NSUInteger i = 0; for (Torrent * torrent in fTorrents) { [torrent setQueuePosition: i++]; [torrent update]; } //do the drag animation here so that the dragged torrents are the ones that are animated as moving, and not the torrents around them [fTableView beginUpdates]; NSUInteger insertDisplayIndex = topTorrent ? [groupTorrents indexOfObject: topTorrent] + 1 : 0; for (Torrent * torrent in movingTorrents) { TorrentGroup * oldParent = item ? [fTableView parentForItem: torrent] : nil; NSMutableArray * oldTorrents = oldParent ? [oldParent torrents] : fDisplayedTorrents; const NSUInteger oldIndex = [oldTorrents indexOfObject: torrent]; if (item == oldParent) { if (oldIndex < insertDisplayIndex) --insertDisplayIndex; [oldTorrents moveObjectAtIndex: oldIndex toIndex: insertDisplayIndex]; } else { NSAssert(item && oldParent, @"Expected to be dragging between group rows"); NSMutableArray * newTorrents = [(TorrentGroup *)item torrents]; [newTorrents insertObject: torrent atIndex: insertDisplayIndex]; [oldTorrents removeObjectAtIndex: oldIndex]; } [fTableView moveItemAtIndex: oldIndex inParent: oldParent toIndex: insertDisplayIndex inParent: item]; ++insertDisplayIndex; } [fTableView endUpdates]; } [self applyFilter]; } return YES; } - (void) torrentTableViewSelectionDidChange: (NSNotification *) notification { [self resetInfo]; [[fWindow toolbar] validateVisibleItems]; } - (NSDragOperation) draggingEntered: (id ) info { NSPasteboard * pasteboard = [info draggingPasteboard]; if ([[pasteboard types] containsObject: NSFilenamesPboardType]) { //check if any torrent files can be added BOOL torrent = NO; NSArray * files = [pasteboard propertyListForType: NSFilenamesPboardType]; for (NSString * file in files) { if ([[[NSWorkspace sharedWorkspace] typeOfFile: file error: NULL] isEqualToString: @"org.bittorrent.torrent"] || [[file pathExtension] caseInsensitiveCompare: @"torrent"] == NSOrderedSame) { torrent = YES; tr_ctor * ctor = tr_ctorNew(fLib); tr_ctorSetMetainfoFromFile(ctor, [file UTF8String]); if (tr_torrentParse(ctor, NULL) == TR_PARSE_OK) { if (!fOverlayWindow) fOverlayWindow = [[DragOverlayWindow alloc] initWithLib: fLib forWindow: fWindow]; [fOverlayWindow setTorrents: files]; return NSDragOperationCopy; } tr_ctorFree(ctor); } } //create a torrent file if a single file if (!torrent && [files count] == 1) { if (!fOverlayWindow) fOverlayWindow = [[DragOverlayWindow alloc] initWithLib: fLib forWindow: fWindow]; [fOverlayWindow setFile: [[files objectAtIndex: 0] lastPathComponent]]; return NSDragOperationCopy; } } else if ([[pasteboard types] containsObject: NSURLPboardType]) { if (!fOverlayWindow) fOverlayWindow = [[DragOverlayWindow alloc] initWithLib: fLib forWindow: fWindow]; [fOverlayWindow setURL: [[NSURL URLFromPasteboard: pasteboard] relativeString]]; return NSDragOperationCopy; } else; return NSDragOperationNone; } - (void) draggingExited: (id ) info { if (fOverlayWindow) [fOverlayWindow fadeOut]; } - (BOOL) performDragOperation: (id ) info { if (fOverlayWindow) [fOverlayWindow fadeOut]; NSPasteboard * pasteboard = [info draggingPasteboard]; if ([[pasteboard types] containsObject: NSFilenamesPboardType]) { BOOL torrent = NO, accept = YES; //create an array of files that can be opened NSArray * files = [pasteboard propertyListForType: NSFilenamesPboardType]; NSMutableArray * filesToOpen = [NSMutableArray arrayWithCapacity: [files count]]; for (NSString * file in files) { if ([[[NSWorkspace sharedWorkspace] typeOfFile: file error: NULL] isEqualToString: @"org.bittorrent.torrent"] || [[file pathExtension] caseInsensitiveCompare: @"torrent"] == NSOrderedSame) { torrent = YES; tr_ctor * ctor = tr_ctorNew(fLib); tr_ctorSetMetainfoFromFile(ctor, [file UTF8String]); if (tr_torrentParse(ctor, NULL) == TR_PARSE_OK) [filesToOpen addObject: file]; tr_ctorFree(ctor); } } if ([filesToOpen count] > 0) [self application: NSApp openFiles: filesToOpen]; else { if (!torrent && [files count] == 1) [CreatorWindowController createTorrentFile: fLib forFile: [NSURL fileURLWithPath: [files objectAtIndex: 0]]]; else accept = NO; } return accept; } else if ([[pasteboard types] containsObject: NSURLPboardType]) { NSURL * url; if ((url = [NSURL URLFromPasteboard: pasteboard])) { [self openURL: [url absoluteString]]; return YES; } } else; return NO; } - (void) toggleSmallView: (id) sender { BOOL makeSmall = ![fDefaults boolForKey: @"SmallView"]; [fDefaults setBool: makeSmall forKey: @"SmallView"]; [fTableView setUsesAlternatingRowBackgroundColors: !makeSmall]; [fTableView setRowHeight: makeSmall ? ROW_HEIGHT_SMALL : ROW_HEIGHT_REGULAR]; [fTableView beginUpdates]; [fTableView noteHeightOfRowsWithIndexesChanged: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fTableView numberOfRows])]]; [fTableView endUpdates]; //resize for larger min height if not set to auto size if (![fDefaults boolForKey: @"AutoSize"]) { const NSSize contentSize = [[fWindow contentView] frame].size; NSSize contentMinSize = [fWindow contentMinSize]; contentMinSize.height = [self minWindowContentSizeAllowed]; [fWindow setContentMinSize: contentMinSize]; //make sure the window already isn't too small if (!makeSmall && contentSize.height < contentMinSize.height) { NSRect frame = [fWindow frame]; CGFloat heightChange = contentMinSize.height - contentSize.height; frame.size.height += heightChange; frame.origin.y -= heightChange; [fWindow setFrame: frame display: YES]; } } else [self setWindowSizeToFit]; } - (void) togglePiecesBar: (id) sender { [fDefaults setBool: ![fDefaults boolForKey: @"PiecesBar"] forKey: @"PiecesBar"]; [fTableView togglePiecesBar]; } - (void) toggleAvailabilityBar: (id) sender { [fDefaults setBool: ![fDefaults boolForKey: @"DisplayProgressBarAvailable"] forKey: @"DisplayProgressBarAvailable"]; [fTableView display]; } - (NSRect) windowFrameByAddingHeight: (CGFloat) height checkLimits: (BOOL) check { NSScrollView * scrollView = [fTableView enclosingScrollView]; //convert pixels to points NSRect windowFrame = [fWindow frame]; NSSize windowSize = [scrollView convertSize: windowFrame.size fromView: nil]; windowSize.height += height; if (check) { //we can't call minSize, since it might be set to the current size (auto size) const CGFloat minHeight = [self minWindowContentSizeAllowed] + (NSHeight([fWindow frame]) - NSHeight([[fWindow contentView] frame])); //contentView to window if (windowSize.height <= minHeight) windowSize.height = minHeight; else { NSScreen * screen = [fWindow screen]; if (screen) { NSSize maxSize = [scrollView convertSize: [screen visibleFrame].size fromView: nil]; if (!fStatusBar) maxSize.height -= STATUS_BAR_HEIGHT; if (!fFilterBar) maxSize.height -= FILTER_BAR_HEIGHT; if (windowSize.height > maxSize.height) windowSize.height = maxSize.height; } } } //convert points to pixels windowSize = [scrollView convertSize: windowSize toView: nil]; windowFrame.origin.y -= (windowSize.height - windowFrame.size.height); windowFrame.size.height = windowSize.height; return windowFrame; } - (void) toggleStatusBar: (id) sender { const BOOL show = fStatusBar == nil; [self showStatusBar: show animate: YES]; [fDefaults setBool: show forKey: @"StatusBar"]; } //doesn't save shown state - (void) showStatusBar: (BOOL) show animate: (BOOL) animate { const BOOL prevShown = fStatusBar != nil; if (show == prevShown) return; if (show) { fStatusBar = [[StatusBarController alloc] initWithLib: fLib]; NSView * contentView = [fWindow contentView]; const NSSize windowSize = [contentView convertSize: [fWindow frame].size fromView: nil]; NSRect statusBarFrame = [[fStatusBar view] frame]; statusBarFrame.size.width = windowSize.width; [[fStatusBar view] setFrame: statusBarFrame]; [contentView addSubview: [fStatusBar view]]; [[fStatusBar view] setFrameOrigin: NSMakePoint(0.0, NSMaxY([contentView frame]))]; } CGFloat heightChange = [[fStatusBar view] frame].size.height; if (!show) heightChange *= -1; //allow bar to show even if not enough room if (show && ![fDefaults boolForKey: @"AutoSize"]) { NSRect frame = [self windowFrameByAddingHeight: heightChange checkLimits: NO]; NSScreen * screen = [fWindow screen]; if (screen) { CGFloat change = [screen visibleFrame].size.height - frame.size.height; if (change < 0.0) { frame = [fWindow frame]; frame.size.height += change; frame.origin.y -= change; [fWindow setFrame: frame display: NO animate: NO]; } } } [self updateUI]; NSScrollView * scrollView = [fTableView enclosingScrollView]; //set views to not autoresize const NSUInteger statsMask = [[fStatusBar view] autoresizingMask]; [[fStatusBar view] setAutoresizingMask: NSViewNotSizable]; NSUInteger filterMask; if (fFilterBar) { filterMask = [[fFilterBar view] autoresizingMask]; [[fFilterBar view] setAutoresizingMask: NSViewNotSizable]; } const NSUInteger scrollMask = [scrollView autoresizingMask]; [scrollView setAutoresizingMask: NSViewNotSizable]; NSRect frame = [self windowFrameByAddingHeight: heightChange checkLimits: NO]; [fWindow setFrame: frame display: YES animate: animate]; //re-enable autoresize [[fStatusBar view] setAutoresizingMask: statsMask]; if (fFilterBar) [[fFilterBar view] setAutoresizingMask: filterMask]; [scrollView setAutoresizingMask: scrollMask]; if (!show) { [[fStatusBar view] removeFromSuperviewWithoutNeedingDisplay]; [fStatusBar release]; fStatusBar = nil; } if ([fDefaults boolForKey: @"AutoSize"]) [self setWindowMinMaxToCurrent]; else { //change min size NSSize minSize = [fWindow contentMinSize]; minSize.height += heightChange; [fWindow setContentMinSize: minSize]; } } - (void) toggleFilterBar: (id) sender { const BOOL show = fFilterBar == nil; //disable filtering when hiding (have to do before showFilterBar:animate:) if (!show) [fFilterBar reset: NO]; [self showFilterBar: show animate: YES]; [fDefaults setBool: show forKey: @"FilterBar"]; [[fWindow toolbar] validateVisibleItems]; [self applyFilter]; //do even if showing to ensure tooltips are updated } //doesn't save shown state - (void) showFilterBar: (BOOL) show animate: (BOOL) animate { const BOOL prevShown = fFilterBar != nil; if (show == prevShown) return; if (show) { fFilterBar = [[FilterBarController alloc] init]; NSView * contentView = [fWindow contentView]; const NSSize windowSize = [contentView convertSize: [fWindow frame].size fromView: nil]; NSRect filterBarFrame = [[fFilterBar view] frame]; filterBarFrame.size.width = windowSize.width; [[fFilterBar view] setFrame: filterBarFrame]; if (fStatusBar) [contentView addSubview: [fFilterBar view] positioned: NSWindowBelow relativeTo: [fStatusBar view]]; else [contentView addSubview: [fFilterBar view]]; const CGFloat originY = fStatusBar ? NSMinY([[fStatusBar view] frame]) : NSMaxY([contentView frame]); [[fFilterBar view] setFrameOrigin: NSMakePoint(0.0, originY)]; } else [fWindow makeFirstResponder: fTableView]; CGFloat heightChange = NSHeight([[fFilterBar view] frame]); if (!show) heightChange *= -1; //allow bar to show even if not enough room if (show && ![fDefaults boolForKey: @"AutoSize"]) { NSRect frame = [self windowFrameByAddingHeight: heightChange checkLimits: NO]; NSScreen * screen = [fWindow screen]; if (screen) { CGFloat change = [screen visibleFrame].size.height - frame.size.height; if (change < 0.0) { frame = [fWindow frame]; frame.size.height += change; frame.origin.y -= change; [fWindow setFrame: frame display: NO animate: NO]; } } } NSScrollView * scrollView = [fTableView enclosingScrollView]; //set views to not autoresize const NSUInteger filterMask = [[fFilterBar view] autoresizingMask]; const NSUInteger scrollMask = [scrollView autoresizingMask]; [[fFilterBar view] setAutoresizingMask: NSViewNotSizable]; [scrollView setAutoresizingMask: NSViewNotSizable]; const NSRect frame = [self windowFrameByAddingHeight: heightChange checkLimits: NO]; [fWindow setFrame: frame display: YES animate: animate]; //re-enable autoresize [[fFilterBar view] setAutoresizingMask: filterMask]; [scrollView setAutoresizingMask: scrollMask]; if (!show) { [[fFilterBar view] removeFromSuperviewWithoutNeedingDisplay]; [fFilterBar release]; fFilterBar = nil; } if ([fDefaults boolForKey: @"AutoSize"]) [self setWindowMinMaxToCurrent]; else { //change min size NSSize minSize = [fWindow contentMinSize]; minSize.height += heightChange; [fWindow setContentMinSize: minSize]; } } - (void) focusFilterField { if (!fFilterBar) [self toggleFilterBar: self]; [fFilterBar focusSearchField]; } - (BOOL) acceptsPreviewPanelControl: (QLPreviewPanel *) panel { return !fQuitting; } - (void) beginPreviewPanelControl: (QLPreviewPanel *) panel { fPreviewPanel = [panel retain]; [fPreviewPanel setDelegate: self]; [fPreviewPanel setDataSource: self]; } - (void) endPreviewPanelControl: (QLPreviewPanel *) panel { [fPreviewPanel release]; fPreviewPanel = nil; } - (NSArray *) quickLookableTorrents { NSArray * selectedTorrents = [fTableView selectedTorrents]; NSMutableArray * qlArray = [NSMutableArray arrayWithCapacity: [selectedTorrents count]]; for (Torrent * torrent in selectedTorrents) if (([torrent isFolder] || [torrent isComplete]) && [torrent dataLocation]) [qlArray addObject: torrent]; return qlArray; } - (NSInteger) numberOfPreviewItemsInPreviewPanel: (QLPreviewPanel *) panel { if ([fInfoController canQuickLook]) return [[fInfoController quickLookURLs] count]; else return [[self quickLookableTorrents] count]; } - (id ) previewPanel: (QLPreviewPanel *) panel previewItemAtIndex: (NSInteger) index { if ([fInfoController canQuickLook]) return [[fInfoController quickLookURLs] objectAtIndex: index]; else return [[self quickLookableTorrents] objectAtIndex: index]; } - (BOOL) previewPanel: (QLPreviewPanel *) panel handleEvent: (NSEvent *) event { /*if ([event type] == NSKeyDown) { [super keyDown: event]; return YES; }*/ return NO; } - (NSRect) previewPanel: (QLPreviewPanel *) panel sourceFrameOnScreenForPreviewItem: (id ) item { if ([fInfoController canQuickLook]) return [fInfoController quickLookSourceFrameForPreviewItem: item]; else { if (![fWindow isVisible]) return NSZeroRect; const NSInteger row = [fTableView rowForItem: item]; if (row == -1) return NSZeroRect; NSRect frame = [fTableView iconRectForRow: row]; if (!NSIntersectsRect([fTableView visibleRect], frame)) return NSZeroRect; frame.origin = [fTableView convertPoint: frame.origin toView: nil]; frame = [fWindow convertRectToScreen: frame]; frame.origin.y -= frame.size.height; return frame; } } - (void) showToolbarShare: (id) sender { NSParameterAssert([sender isKindOfClass:[NSButton class]]); NSSharingServicePicker * picker = [[NSSharingServicePicker alloc] initWithItems: [[ShareTorrentFileHelper sharedHelper] shareTorrentURLs]]; picker.delegate = self; [picker showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMinYEdge]; } - (id)sharingServicePicker:(NSSharingServicePicker *)sharingServicePicker delegateForSharingService:(NSSharingService *)sharingService { return self; } - (NSWindow *)sharingService:(NSSharingService *)sharingService sourceWindowForShareItems:(NSArray *)items sharingContentScope:(NSSharingContentScope *)sharingContentScope { return fWindow; } - (ButtonToolbarItem *) standardToolbarButtonWithIdentifier: (NSString *) ident { return [self toolbarButtonWithIdentifier: ident forToolbarButtonClass: [ButtonToolbarItem class]]; } - (id) toolbarButtonWithIdentifier: (NSString *) ident forToolbarButtonClass:(Class)class { ButtonToolbarItem * item = [[class alloc] initWithItemIdentifier: ident]; NSButton * button = [[NSButton alloc] init]; [button setBezelStyle: NSTexturedRoundedBezelStyle]; [button setStringValue: @""]; [item setView: button]; [button release]; const NSSize buttonSize = NSMakeSize(36.0, 25.0); [item setMinSize: buttonSize]; [item setMaxSize: buttonSize]; return [item autorelease]; } - (NSToolbarItem *) toolbar: (NSToolbar *) toolbar itemForItemIdentifier: (NSString *) ident willBeInsertedIntoToolbar: (BOOL) flag { if ([ident isEqualToString: TOOLBAR_CREATE]) { ButtonToolbarItem * item = [self standardToolbarButtonWithIdentifier: ident]; [item setLabel: NSLocalizedString(@"Create", "Create toolbar item -> label")]; [item setPaletteLabel: NSLocalizedString(@"Create Torrent File", "Create toolbar item -> palette label")]; [item setToolTip: NSLocalizedString(@"Create torrent file", "Create toolbar item -> tooltip")]; [item setImage: [NSImage imageNamed: @"ToolbarCreateTemplate"]]; [item setTarget: self]; [item setAction: @selector(createFile:)]; [item setAutovalidates: NO]; return item; } else if ([ident isEqualToString: TOOLBAR_OPEN_FILE]) { ButtonToolbarItem * item = [self standardToolbarButtonWithIdentifier: ident]; [item setLabel: NSLocalizedString(@"Open", "Open toolbar item -> label")]; [item setPaletteLabel: NSLocalizedString(@"Open Torrent Files", "Open toolbar item -> palette label")]; [item setToolTip: NSLocalizedString(@"Open torrent files", "Open toolbar item -> tooltip")]; [item setImage: [NSImage imageNamed: @"ToolbarOpenTemplate"]]; [item setTarget: self]; [item setAction: @selector(openShowSheet:)]; [item setAutovalidates: NO]; return item; } else if ([ident isEqualToString: TOOLBAR_OPEN_WEB]) { ButtonToolbarItem * item = [self standardToolbarButtonWithIdentifier: ident]; [item setLabel: NSLocalizedString(@"Open Address", "Open address toolbar item -> label")]; [item setPaletteLabel: NSLocalizedString(@"Open Torrent Address", "Open address toolbar item -> palette label")]; [item setToolTip: NSLocalizedString(@"Open torrent web address", "Open address toolbar item -> tooltip")]; [item setImage: [NSImage imageNamed: @"ToolbarOpenWebTemplate"]]; [item setTarget: self]; [item setAction: @selector(openURLShowSheet:)]; [item setAutovalidates: NO]; return item; } else if ([ident isEqualToString: TOOLBAR_REMOVE]) { ButtonToolbarItem * item = [self standardToolbarButtonWithIdentifier: ident]; [item setLabel: NSLocalizedString(@"Remove", "Remove toolbar item -> label")]; [item setPaletteLabel: NSLocalizedString(@"Remove Selected", "Remove toolbar item -> palette label")]; [item setToolTip: NSLocalizedString(@"Remove selected transfers", "Remove toolbar item -> tooltip")]; [item setImage: [NSImage imageNamed: @"ToolbarRemoveTemplate"]]; [item setTarget: self]; [item setAction: @selector(removeNoDelete:)]; [item setVisibilityPriority: NSToolbarItemVisibilityPriorityHigh]; return item; } else if ([ident isEqualToString: TOOLBAR_INFO]) { ButtonToolbarItem * item = [self standardToolbarButtonWithIdentifier: ident]; [[(NSButton *)[item view] cell] setShowsStateBy: NSContentsCellMask]; //blue when enabled [item setLabel: NSLocalizedString(@"Inspector", "Inspector toolbar item -> label")]; [item setPaletteLabel: NSLocalizedString(@"Toggle Inspector", "Inspector toolbar item -> palette label")]; [item setToolTip: NSLocalizedString(@"Toggle the torrent inspector", "Inspector toolbar item -> tooltip")]; [item setImage: [NSImage imageNamed: @"ToolbarInfoTemplate"]]; [item setTarget: self]; [item setAction: @selector(showInfo:)]; return item; } else if ([ident isEqualToString: TOOLBAR_PAUSE_RESUME_ALL]) { GroupToolbarItem * groupItem = [[GroupToolbarItem alloc] initWithItemIdentifier: ident]; NSSegmentedControl * segmentedControl = [[NSSegmentedControl alloc] initWithFrame: NSZeroRect]; [segmentedControl setCell: [[[ToolbarSegmentedCell alloc] init] autorelease]]; [groupItem setView: segmentedControl]; NSSegmentedCell * segmentedCell = (NSSegmentedCell *)[segmentedControl cell]; if ([NSApp isOnYosemiteOrBetter]) { segmentedControl.segmentStyle = NSSegmentStyleSeparated; } [segmentedControl setSegmentCount: 2]; [segmentedCell setTrackingMode: NSSegmentSwitchTrackingMomentary]; const NSSize groupSize = NSMakeSize(72.0, 25.0); [groupItem setMinSize: groupSize]; [groupItem setMaxSize: groupSize]; [groupItem setLabel: NSLocalizedString(@"Apply All", "All toolbar item -> label")]; [groupItem setPaletteLabel: NSLocalizedString(@"Pause / Resume All", "All toolbar item -> palette label")]; [groupItem setTarget: self]; [groupItem setAction: @selector(allToolbarClicked:)]; [groupItem setIdentifiers: [NSArray arrayWithObjects: TOOLBAR_PAUSE_ALL, TOOLBAR_RESUME_ALL, nil]]; [segmentedCell setTag: TOOLBAR_PAUSE_TAG forSegment: TOOLBAR_PAUSE_TAG]; [segmentedControl setImage: [NSImage imageNamed: @"ToolbarPauseAllTemplate"] forSegment: TOOLBAR_PAUSE_TAG]; [segmentedCell setToolTip: NSLocalizedString(@"Pause all transfers", "All toolbar item -> tooltip") forSegment: TOOLBAR_PAUSE_TAG]; [segmentedCell setTag: TOOLBAR_RESUME_TAG forSegment: TOOLBAR_RESUME_TAG]; [segmentedControl setImage: [NSImage imageNamed: @"ToolbarResumeAllTemplate"] forSegment: TOOLBAR_RESUME_TAG]; [segmentedCell setToolTip: NSLocalizedString(@"Resume all transfers", "All toolbar item -> tooltip") forSegment: TOOLBAR_RESUME_TAG]; [groupItem createMenu: [NSArray arrayWithObjects: NSLocalizedString(@"Pause All", "All toolbar item -> label"), NSLocalizedString(@"Resume All", "All toolbar item -> label"), nil]]; [segmentedControl release]; [groupItem setVisibilityPriority: NSToolbarItemVisibilityPriorityHigh]; return [groupItem autorelease]; } else if ([ident isEqualToString: TOOLBAR_PAUSE_RESUME_SELECTED]) { GroupToolbarItem * groupItem = [[GroupToolbarItem alloc] initWithItemIdentifier: ident]; NSSegmentedControl * segmentedControl = [[NSSegmentedControl alloc] initWithFrame: NSZeroRect]; [segmentedControl setCell: [[[ToolbarSegmentedCell alloc] init] autorelease]]; [groupItem setView: segmentedControl]; NSSegmentedCell * segmentedCell = (NSSegmentedCell *)[segmentedControl cell]; if ([NSApp isOnYosemiteOrBetter]) { segmentedControl.segmentStyle = NSSegmentStyleSeparated; } [segmentedControl setSegmentCount: 2]; [segmentedCell setTrackingMode: NSSegmentSwitchTrackingMomentary]; const NSSize groupSize = NSMakeSize(72.0, 25.0); [groupItem setMinSize: groupSize]; [groupItem setMaxSize: groupSize]; [groupItem setLabel: NSLocalizedString(@"Apply Selected", "Selected toolbar item -> label")]; [groupItem setPaletteLabel: NSLocalizedString(@"Pause / Resume Selected", "Selected toolbar item -> palette label")]; [groupItem setTarget: self]; [groupItem setAction: @selector(selectedToolbarClicked:)]; [groupItem setIdentifiers: [NSArray arrayWithObjects: TOOLBAR_PAUSE_SELECTED, TOOLBAR_RESUME_SELECTED, nil]]; [segmentedCell setTag: TOOLBAR_PAUSE_TAG forSegment: TOOLBAR_PAUSE_TAG]; [segmentedControl setImage: [NSImage imageNamed: @"ToolbarPauseSelectedTemplate"] forSegment: TOOLBAR_PAUSE_TAG]; [segmentedCell setToolTip: NSLocalizedString(@"Pause selected transfers", "Selected toolbar item -> tooltip") forSegment: TOOLBAR_PAUSE_TAG]; [segmentedCell setTag: TOOLBAR_RESUME_TAG forSegment: TOOLBAR_RESUME_TAG]; [segmentedControl setImage: [NSImage imageNamed: @"ToolbarResumeSelectedTemplate"] forSegment: TOOLBAR_RESUME_TAG]; [segmentedCell setToolTip: NSLocalizedString(@"Resume selected transfers", "Selected toolbar item -> tooltip") forSegment: TOOLBAR_RESUME_TAG]; [groupItem createMenu: [NSArray arrayWithObjects: NSLocalizedString(@"Pause Selected", "Selected toolbar item -> label"), NSLocalizedString(@"Resume Selected", "Selected toolbar item -> label"), nil]]; [segmentedControl release]; [groupItem setVisibilityPriority: NSToolbarItemVisibilityPriorityHigh]; return [groupItem autorelease]; } else if ([ident isEqualToString: TOOLBAR_FILTER]) { ButtonToolbarItem * item = [self standardToolbarButtonWithIdentifier: ident]; [[(NSButton *)[item view] cell] setShowsStateBy: NSContentsCellMask]; //blue when enabled [item setLabel: NSLocalizedString(@"Filter", "Filter toolbar item -> label")]; [item setPaletteLabel: NSLocalizedString(@"Toggle Filter", "Filter toolbar item -> palette label")]; [item setToolTip: NSLocalizedString(@"Toggle the filter bar", "Filter toolbar item -> tooltip")]; [item setImage: [NSImage imageNamed: @"ToolbarFilterTemplate"]]; [item setTarget: self]; [item setAction: @selector(toggleFilterBar:)]; return item; } else if ([ident isEqualToString: TOOLBAR_QUICKLOOK]) { ButtonToolbarItem * item = [self standardToolbarButtonWithIdentifier: ident]; [[(NSButton *)[item view] cell] setShowsStateBy: NSContentsCellMask]; //blue when enabled [item setLabel: NSLocalizedString(@"Quick Look", "QuickLook toolbar item -> label")]; [item setPaletteLabel: NSLocalizedString(@"Quick Look", "QuickLook toolbar item -> palette label")]; [item setToolTip: NSLocalizedString(@"Quick Look", "QuickLook toolbar item -> tooltip")]; [item setImage: [NSImage imageNamed: NSImageNameQuickLookTemplate]]; [item setTarget: self]; [item setAction: @selector(toggleQuickLook:)]; [item setVisibilityPriority: NSToolbarItemVisibilityPriorityLow]; return item; } else if ([ident isEqualToString: TOOLBAR_SHARE]) { ShareToolbarItem * item = [self toolbarButtonWithIdentifier: ident forToolbarButtonClass: [ShareToolbarItem class]]; [item setLabel: NSLocalizedString(@"Share", "Share toolbar item -> label")]; [item setPaletteLabel: NSLocalizedString(@"Share", "Share toolbar item -> palette label")]; [item setToolTip: NSLocalizedString(@"Share torrent file", "Share toolbar item -> tooltip")]; [item setImage: [NSImage imageNamed: NSImageNameShareTemplate]]; [item setVisibilityPriority: NSToolbarItemVisibilityPriorityLow]; NSButton *itemButton = (NSButton *)[item view]; [itemButton setTarget: self]; [itemButton setAction: @selector(showToolbarShare:)]; [itemButton sendActionOn:NSLeftMouseDownMask]; return item; } else return nil; } - (void) allToolbarClicked: (id) sender { NSInteger tagValue = [sender isKindOfClass: [NSSegmentedControl class]] ? [(NSSegmentedCell *)[sender cell] tagForSegment: [sender selectedSegment]] : [(NSControl *)sender tag]; switch (tagValue) { case TOOLBAR_PAUSE_TAG: [self stopAllTorrents: sender]; break; case TOOLBAR_RESUME_TAG: [self resumeAllTorrents: sender]; break; } } - (void) selectedToolbarClicked: (id) sender { NSInteger tagValue = [sender isKindOfClass: [NSSegmentedControl class]] ? [(NSSegmentedCell *)[sender cell] tagForSegment: [sender selectedSegment]] : [(NSControl *)sender tag]; switch (tagValue) { case TOOLBAR_PAUSE_TAG: [self stopSelectedTorrents: sender]; break; case TOOLBAR_RESUME_TAG: [self resumeSelectedTorrents: sender]; break; } } - (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) toolbar { NSMutableArray *items = [NSMutableArray arrayWithObjects: TOOLBAR_CREATE, TOOLBAR_OPEN_FILE, TOOLBAR_OPEN_WEB, TOOLBAR_REMOVE, TOOLBAR_PAUSE_RESUME_SELECTED, TOOLBAR_PAUSE_RESUME_ALL, TOOLBAR_SHARE, TOOLBAR_QUICKLOOK, TOOLBAR_FILTER, TOOLBAR_INFO, NSToolbarSeparatorItemIdentifier, NSToolbarSpaceItemIdentifier, NSToolbarFlexibleSpaceItemIdentifier, NSToolbarCustomizeToolbarItemIdentifier, nil]; if (![NSApp isOnMountainLionOrBetter]) { [items removeObject:TOOLBAR_SHARE]; } return items; } - (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar { NSMutableArray *items = [NSMutableArray arrayWithObjects: TOOLBAR_CREATE, TOOLBAR_OPEN_FILE, TOOLBAR_REMOVE, NSToolbarSpaceItemIdentifier, TOOLBAR_PAUSE_RESUME_ALL, NSToolbarFlexibleSpaceItemIdentifier, TOOLBAR_SHARE, TOOLBAR_QUICKLOOK, TOOLBAR_FILTER, TOOLBAR_INFO, nil]; if (![NSApp isOnMountainLionOrBetter]) { [items removeObject:TOOLBAR_SHARE]; } return items; } - (BOOL) validateToolbarItem: (NSToolbarItem *) toolbarItem { NSString * ident = [toolbarItem itemIdentifier]; //enable remove item if ([ident isEqualToString: TOOLBAR_REMOVE]) return [fTableView numberOfSelectedRows] > 0; //enable pause all item if ([ident isEqualToString: TOOLBAR_PAUSE_ALL]) { for (Torrent * torrent in fTorrents) if ([torrent isActive] || [torrent waitingToStart]) return YES; return NO; } //enable resume all item if ([ident isEqualToString: TOOLBAR_RESUME_ALL]) { for (Torrent * torrent in fTorrents) if (![torrent isActive] && ![torrent waitingToStart] && ![torrent isFinishedSeeding]) return YES; return NO; } //enable pause item if ([ident isEqualToString: TOOLBAR_PAUSE_SELECTED]) { for (Torrent * torrent in [fTableView selectedTorrents]) if ([torrent isActive] || [torrent waitingToStart]) return YES; return NO; } //enable resume item if ([ident isEqualToString: TOOLBAR_RESUME_SELECTED]) { for (Torrent * torrent in [fTableView selectedTorrents]) if (![torrent isActive] && ![torrent waitingToStart]) return YES; return NO; } //set info item if ([ident isEqualToString: TOOLBAR_INFO]) { [(NSButton *)[toolbarItem view] setState: [[fInfoController window] isVisible]]; return YES; } //set filter item if ([ident isEqualToString: TOOLBAR_FILTER]) { [(NSButton *)[toolbarItem view] setState: fFilterBar != nil]; return YES; } //set quick look item if ([ident isEqualToString: TOOLBAR_QUICKLOOK]) { [(NSButton *)[toolbarItem view] setState: [QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible]]; return YES; } //enable share item if ([ident isEqualToString: TOOLBAR_SHARE]) return [fTableView numberOfSelectedRows] > 0; return YES; } - (BOOL) validateMenuItem: (NSMenuItem *) menuItem { SEL action = [menuItem action]; if (action == @selector(toggleSpeedLimit:)) { [menuItem setState: [fDefaults boolForKey: @"SpeedLimit"] ? NSOnState : NSOffState]; return YES; } //only enable some items if it is in a context menu or the window is useable BOOL canUseTable = [fWindow isKeyWindow] || [[menuItem menu] supermenu] != [NSApp mainMenu]; //enable open items if (action == @selector(openShowSheet:) || action == @selector(openURLShowSheet:)) return [fWindow attachedSheet] == nil; //enable sort options if (action == @selector(setSort:)) { NSString * sortType; switch ([menuItem tag]) { case SORT_ORDER_TAG: sortType = SORT_ORDER; break; case SORT_DATE_TAG: sortType = SORT_DATE; break; case SORT_NAME_TAG: sortType = SORT_NAME; break; case SORT_PROGRESS_TAG: sortType = SORT_PROGRESS; break; case SORT_STATE_TAG: sortType = SORT_STATE; break; case SORT_TRACKER_TAG: sortType = SORT_TRACKER; break; case SORT_ACTIVITY_TAG: sortType = SORT_ACTIVITY; break; case SORT_SIZE_TAG: sortType = SORT_SIZE; break; default: NSAssert1(NO, @"Unknown sort tag received: %ld", [menuItem tag]); } [menuItem setState: [sortType isEqualToString: [fDefaults stringForKey: @"Sort"]] ? NSOnState : NSOffState]; return [fWindow isVisible]; } if (action == @selector(setGroup:)) { BOOL checked = NO; NSInteger index = [menuItem tag]; for (Torrent * torrent in [fTableView selectedTorrents]) if (index == [torrent groupValue]) { checked = YES; break; } [menuItem setState: checked ? NSOnState : NSOffState]; return canUseTable && [fTableView numberOfSelectedRows] > 0; } if (action == @selector(toggleSmallView:)) { [menuItem setState: [fDefaults boolForKey: @"SmallView"] ? NSOnState : NSOffState]; return [fWindow isVisible]; } if (action == @selector(togglePiecesBar:)) { [menuItem setState: [fDefaults boolForKey: @"PiecesBar"] ? NSOnState : NSOffState]; return [fWindow isVisible]; } if (action == @selector(toggleAvailabilityBar:)) { [menuItem setState: [fDefaults boolForKey: @"DisplayProgressBarAvailable"] ? NSOnState : NSOffState]; return [fWindow isVisible]; } //enable show info if (action == @selector(showInfo:)) { NSString * title = [[fInfoController window] isVisible] ? NSLocalizedString(@"Hide Inspector", "View menu -> Inspector") : NSLocalizedString(@"Show Inspector", "View menu -> Inspector"); [menuItem setTitle: title]; return YES; } //enable prev/next inspector tab if (action == @selector(setInfoTab:)) return [[fInfoController window] isVisible]; //enable toggle status bar if (action == @selector(toggleStatusBar:)) { NSString * title = !fStatusBar ? NSLocalizedString(@"Show Status Bar", "View menu -> Status Bar") : NSLocalizedString(@"Hide Status Bar", "View menu -> Status Bar"); [menuItem setTitle: title]; return [fWindow isVisible]; } //enable toggle filter bar if (action == @selector(toggleFilterBar:)) { NSString * title = !fFilterBar ? NSLocalizedString(@"Show Filter Bar", "View menu -> Filter Bar") : NSLocalizedString(@"Hide Filter Bar", "View menu -> Filter Bar"); [menuItem setTitle: title]; return [fWindow isVisible]; } //enable prev/next filter button if (action == @selector(switchFilter:)) return [fWindow isVisible] && fFilterBar; //enable reveal in finder if (action == @selector(revealFile:)) return canUseTable && [fTableView numberOfSelectedRows] > 0; //enable renaming file/folder if (action == @selector(renameSelected:)) return canUseTable && [fTableView numberOfSelectedRows] == 1; //enable remove items if (action == @selector(removeNoDelete:) || action == @selector(removeDeleteData:)) { BOOL warning = NO; for (Torrent * torrent in [fTableView selectedTorrents]) { if ([torrent isActive]) { if ([fDefaults boolForKey: @"CheckRemoveDownloading"] ? ![torrent isSeeding] : YES) { warning = YES; break; } } } //append or remove ellipsis when needed NSString * title = [menuItem title], * ellipsis = [NSString ellipsis]; if (warning && [fDefaults boolForKey: @"CheckRemove"]) { if (![title hasSuffix: ellipsis]) [menuItem setTitle: [title stringByAppendingEllipsis]]; } else { if ([title hasSuffix: ellipsis]) [menuItem setTitle: [title substringToIndex: [title rangeOfString: ellipsis].location]]; } return canUseTable && [fTableView numberOfSelectedRows] > 0; } //remove all completed transfers item if (action == @selector(clearCompleted:)) { //append or remove ellipsis when needed NSString * title = [menuItem title], * ellipsis = [NSString ellipsis]; if ([fDefaults boolForKey: @"WarningRemoveCompleted"]) { if (![title hasSuffix: ellipsis]) [menuItem setTitle: [title stringByAppendingEllipsis]]; } else { if ([title hasSuffix: ellipsis]) [menuItem setTitle: [title substringToIndex: [title rangeOfString: ellipsis].location]]; } for (Torrent * torrent in fTorrents) if ([torrent isFinishedSeeding]) return YES; return NO; } //enable pause all item if (action == @selector(stopAllTorrents:)) { for (Torrent * torrent in fTorrents) if ([torrent isActive] || [torrent waitingToStart]) return YES; return NO; } //enable resume all item if (action == @selector(resumeAllTorrents:)) { for (Torrent * torrent in fTorrents) if (![torrent isActive] && ![torrent waitingToStart] && ![torrent isFinishedSeeding]) return YES; return NO; } //enable resume all waiting item if (action == @selector(resumeWaitingTorrents:)) { if (![fDefaults boolForKey: @"Queue"] && ![fDefaults boolForKey: @"QueueSeed"]) return NO; for (Torrent * torrent in fTorrents) if ([torrent waitingToStart]) return YES; return NO; } //enable resume selected waiting item if (action == @selector(resumeSelectedTorrentsNoWait:)) { if (!canUseTable) return NO; for (Torrent * torrent in [fTableView selectedTorrents]) if (![torrent isActive]) return YES; return NO; } //enable pause item if (action == @selector(stopSelectedTorrents:)) { if (!canUseTable) return NO; for (Torrent * torrent in [fTableView selectedTorrents]) if ([torrent isActive] || [torrent waitingToStart]) return YES; return NO; } //enable resume item if (action == @selector(resumeSelectedTorrents:)) { if (!canUseTable) return NO; for (Torrent * torrent in [fTableView selectedTorrents]) if (![torrent isActive] && ![torrent waitingToStart]) return YES; return NO; } //enable manual announce item if (action == @selector(announceSelectedTorrents:)) { if (!canUseTable) return NO; for (Torrent * torrent in [fTableView selectedTorrents]) if ([torrent canManualAnnounce]) return YES; return NO; } //enable reset cache item if (action == @selector(verifySelectedTorrents:)) { if (!canUseTable) return NO; for (Torrent * torrent in [fTableView selectedTorrents]) if (![torrent isMagnet]) return YES; return NO; } //enable move torrent file item if (action == @selector(moveDataFilesSelected:)) return canUseTable && [fTableView numberOfSelectedRows] > 0; //enable copy torrent file item if (action == @selector(copyTorrentFiles:)) { if (!canUseTable) return NO; for (Torrent * torrent in [fTableView selectedTorrents]) if (![torrent isMagnet]) return YES; return NO; } //enable copy torrent file item if (action == @selector(copyMagnetLinks:)) return canUseTable && [fTableView numberOfSelectedRows] > 0; //enable reverse sort item if (action == @selector(setSortReverse:)) { const BOOL isReverse = [menuItem tag] == SORT_DESC_TAG; [menuItem setState: (isReverse == [fDefaults boolForKey: @"SortReverse"]) ? NSOnState : NSOffState]; return ![[fDefaults stringForKey: @"Sort"] isEqualToString: SORT_ORDER]; } //enable group sort item if (action == @selector(setSortByGroup:)) { [menuItem setState: [fDefaults boolForKey: @"SortByGroup"] ? NSOnState : NSOffState]; return YES; } if (action == @selector(toggleQuickLook:)) { const BOOL visible =[QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible]; //text consistent with Finder NSString * title = !visible ? NSLocalizedString(@"Quick Look", "View menu -> Quick Look") : NSLocalizedString(@"Close Quick Look", "View menu -> Quick Look"); [menuItem setTitle: title]; return YES; } return YES; } - (void) sleepCallback: (natural_t) messageType argument: (void *) messageArgument { switch (messageType) { case kIOMessageSystemWillSleep: { //stop all transfers (since some are active) before going to sleep and remember to resume when we wake up BOOL anyActive = NO; for (Torrent * torrent in fTorrents) { if ([torrent isActive]) anyActive = YES; [torrent sleep]; //have to call on all, regardless if they are active } //if there are any running transfers, wait 15 seconds for them to stop if (anyActive) { sleep(15); } IOAllowPowerChange(fRootPort, (long) messageArgument); break; } case kIOMessageCanSystemSleep: if ([fDefaults boolForKey: @"SleepPrevent"]) { //prevent idle sleep unless no torrents are active for (Torrent * torrent in fTorrents) if ([torrent isActive] && ![torrent isStalled] && ![torrent isError]) { IOCancelPowerChange(fRootPort, (long) messageArgument); return; } } IOAllowPowerChange(fRootPort, (long) messageArgument); break; case kIOMessageSystemHasPoweredOn: //resume sleeping transfers after we wake up for (Torrent * torrent in fTorrents) [torrent wakeUp]; break; } } - (NSMenu *) applicationDockMenu: (NSApplication *) sender { if (fQuitting) return nil; NSUInteger seeding = 0, downloading = 0; for (Torrent * torrent in fTorrents) { if ([torrent isSeeding]) seeding++; else if ([torrent isActive]) downloading++; else; } NSMenu * menu = [[NSMenu alloc] init]; if (seeding > 0) { NSString * title = [NSString stringWithFormat: NSLocalizedString(@"%d Seeding", "Dock item - Seeding"), seeding]; [menu addItemWithTitle: title action: nil keyEquivalent: @""]; } if (downloading > 0) { NSString * title = [NSString stringWithFormat: NSLocalizedString(@"%d Downloading", "Dock item - Downloading"), downloading]; [menu addItemWithTitle: title action: nil keyEquivalent: @""]; } if (seeding > 0 || downloading > 0) [menu addItem: [NSMenuItem separatorItem]]; [menu addItemWithTitle: NSLocalizedString(@"Pause All", "Dock item") action: @selector(stopAllTorrents:) keyEquivalent: @""]; [menu addItemWithTitle: NSLocalizedString(@"Resume All", "Dock item") action: @selector(resumeAllTorrents:) keyEquivalent: @""]; [menu addItem: [NSMenuItem separatorItem]]; [menu addItemWithTitle: NSLocalizedString(@"Speed Limit", "Dock item") action: @selector(toggleSpeedLimit:) keyEquivalent: @""]; return [menu autorelease]; } - (NSRect) windowWillUseStandardFrame: (NSWindow *) window defaultFrame: (NSRect) defaultFrame { //if auto size is enabled, the current frame shouldn't need to change NSRect frame = [fDefaults boolForKey: @"AutoSize"] ? [window frame] : [self sizedWindowFrame]; frame.size.width = [fDefaults boolForKey: @"SmallView"] ? [fWindow minSize].width : WINDOW_REGULAR_WIDTH; return frame; } - (void) setWindowSizeToFit { if ([fDefaults boolForKey: @"AutoSize"]) { NSScrollView * scrollView = [fTableView enclosingScrollView]; [scrollView setHasVerticalScroller: NO]; [fWindow setFrame: [self sizedWindowFrame] display: YES animate: YES]; [scrollView setHasVerticalScroller: YES]; [self setWindowMinMaxToCurrent]; } } - (NSRect) sizedWindowFrame { NSUInteger groups = ([fDisplayedTorrents count] > 0 && ![[fDisplayedTorrents objectAtIndex: 0] isKindOfClass: [Torrent class]]) ? [fDisplayedTorrents count] : 0; CGFloat heightChange = (GROUP_SEPARATOR_HEIGHT + [fTableView intercellSpacing].height) * groups + ([fTableView rowHeight] + [fTableView intercellSpacing].height) * ([fTableView numberOfRows] - groups) - NSHeight([[fTableView enclosingScrollView] frame]); return [self windowFrameByAddingHeight: heightChange checkLimits: YES]; } - (void) updateForAutoSize { if ([fDefaults boolForKey: @"AutoSize"]) [self setWindowSizeToFit]; else { NSSize contentMinSize = [fWindow contentMinSize]; contentMinSize.height = [self minWindowContentSizeAllowed]; [fWindow setContentMinSize: contentMinSize]; NSSize contentMaxSize = [fWindow contentMaxSize]; contentMaxSize.height = FLT_MAX; [fWindow setContentMaxSize: contentMaxSize]; } } - (void) setWindowMinMaxToCurrent { const CGFloat height = NSHeight([[fWindow contentView] frame]); NSSize minSize = [fWindow contentMinSize], maxSize = [fWindow contentMaxSize]; minSize.height = height; maxSize.height = height; [fWindow setContentMinSize: minSize]; [fWindow setContentMaxSize: maxSize]; } - (CGFloat) minWindowContentSizeAllowed { CGFloat contentMinHeight = NSHeight([[fWindow contentView] frame]) - NSHeight([[fTableView enclosingScrollView] frame]) + [fTableView rowHeight] + [fTableView intercellSpacing].height; return contentMinHeight; } - (void) updateForExpandCollape { [self setWindowSizeToFit]; [self setBottomCountText: YES]; } - (void) showMainWindow: (id) sender { [fWindow makeKeyAndOrderFront: nil]; } - (void) windowDidBecomeMain: (NSNotification *) notification { [fBadger clearCompleted]; [self updateUI]; } - (void) applicationWillUnhide: (NSNotification *) notification { [self updateUI]; } - (void) toggleQuickLook: (id) sender { if ([[QLPreviewPanel sharedPreviewPanel] isVisible]) [[QLPreviewPanel sharedPreviewPanel] orderOut: nil]; else [[QLPreviewPanel sharedPreviewPanel] makeKeyAndOrderFront: nil]; } - (void) linkHomepage: (id) sender { [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: WEBSITE_URL]]; } - (void) linkForums: (id) sender { [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: FORUM_URL]]; } - (void) linkTrac: (id) sender { [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: TRAC_URL]]; } - (void) linkDonate: (id) sender { [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: DONATE_URL]]; } - (void) updaterWillRelaunchApplication: (SUUpdater *) updater { fQuitRequested = YES; } - (NSDictionary *) registrationDictionaryForGrowl { NSArray * notifications = @[GROWL_DOWNLOAD_COMPLETE, GROWL_SEEDING_COMPLETE, GROWL_AUTO_ADD, GROWL_AUTO_SPEED_LIMIT]; return @{GROWL_NOTIFICATIONS_ALL : notifications, GROWL_NOTIFICATIONS_DEFAULT : notifications }; } - (void) growlNotificationWasClicked: (id) clickContext { if (![clickContext isKindOfClass: [NSDictionary class]]) return; NSString * type = [clickContext objectForKey: @"Type"], * location; if (([type isEqualToString: GROWL_DOWNLOAD_COMPLETE] || [type isEqualToString: GROWL_SEEDING_COMPLETE]) && (location = [clickContext objectForKey: @"Location"])) { NSURL * file = [NSURL fileURLWithPath: location]; [[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs: [NSArray arrayWithObject: file]]; } } - (void) rpcCallback: (tr_rpc_callback_type) type forTorrentStruct: (struct tr_torrent *) torrentStruct { @autoreleasepool { //get the torrent __block Torrent * torrent = nil; if (torrentStruct != NULL && (type != TR_RPC_TORRENT_ADDED && type != TR_RPC_SESSION_CHANGED && type != TR_RPC_SESSION_CLOSE)) { [fTorrents enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(Torrent * checkTorrent, NSUInteger idx, BOOL *stop) { if (torrentStruct == [checkTorrent torrentStruct]) { torrent = checkTorrent; *stop = YES; } }]; if (!torrent) { NSLog(@"No torrent found matching the given torrent struct from the RPC callback!"); return; } } dispatch_async(dispatch_get_main_queue(), ^{ switch (type) { case TR_RPC_TORRENT_ADDED: [self rpcAddTorrentStruct: torrentStruct]; break; case TR_RPC_TORRENT_STARTED: case TR_RPC_TORRENT_STOPPED: [self rpcStartedStoppedTorrent: torrent]; break; case TR_RPC_TORRENT_REMOVING: [self rpcRemoveTorrent: torrent deleteData: NO]; break; case TR_RPC_TORRENT_TRASHING: [self rpcRemoveTorrent: torrent deleteData: YES]; break; case TR_RPC_TORRENT_CHANGED: [self rpcChangedTorrent: torrent]; break; case TR_RPC_TORRENT_MOVED: [self rpcMovedTorrent: torrent]; break; case TR_RPC_SESSION_QUEUE_POSITIONS_CHANGED: [self rpcUpdateQueue]; break; case TR_RPC_SESSION_CHANGED: [fPrefsController rpcUpdatePrefs]; break; case TR_RPC_SESSION_CLOSE: fQuitRequested = YES; [NSApp terminate: self]; break; default: NSAssert1(NO, @"Unknown RPC command received: %d", type); } }); } } - (void) rpcAddTorrentStruct: (struct tr_torrent *) torrentStruct { NSString * location = nil; if (tr_torrentGetDownloadDir(torrentStruct) != NULL) location = [NSString stringWithUTF8String: tr_torrentGetDownloadDir(torrentStruct)]; Torrent * torrent = [[Torrent alloc] initWithTorrentStruct: torrentStruct location: location lib: fLib]; //change the location if the group calls for it (this has to wait until after the torrent is created) if ([[GroupsController groups] usesCustomDownloadLocationForIndex: [torrent groupValue]]) { location = [[GroupsController groups] customDownloadLocationForIndex: [torrent groupValue]]; [torrent changeDownloadFolderBeforeUsing: location determinationType: TorrentDeterminationAutomatic]; } [torrent update]; [fTorrents addObject: torrent]; [torrent release]; if (!fAddingTransfers) fAddingTransfers = [[NSMutableSet alloc] init]; [fAddingTransfers addObject: torrent]; [self fullUpdateUI]; } - (void) rpcRemoveTorrent: (Torrent *) torrent deleteData: (BOOL) deleteData { [self confirmRemoveTorrents: @[ torrent ] deleteData: deleteData]; } - (void) rpcStartedStoppedTorrent: (Torrent *) torrent { [torrent update]; [self updateUI]; [self applyFilter]; [self updateTorrentHistory]; } - (void) rpcChangedTorrent: (Torrent *) torrent { [torrent update]; if ([[fTableView selectedTorrents] containsObject: torrent]) { [fInfoController updateInfoStats]; //this will reload the file table [fInfoController updateOptions]; } } - (void) rpcMovedTorrent: (Torrent *) torrent { [torrent update]; [torrent updateTimeMachineExclude]; if ([[fTableView selectedTorrents] containsObject: torrent]) [fInfoController updateInfoStats]; } - (void) rpcUpdateQueue { for (Torrent * torrent in fTorrents) [torrent update]; NSSortDescriptor * descriptor = [NSSortDescriptor sortDescriptorWithKey: @"queuePosition" ascending: YES]; NSArray * descriptors = [NSArray arrayWithObject: descriptor]; [fTorrents sortUsingDescriptors: descriptors]; [self sortTorrents: YES]; } @end transmission-2.92/macosx/PaxHeaders.4960/InfoTabButtonCell.m0000644000000000000000000000013212640354045020647 xustar0030 mtime=1451350053.196163345 30 atime=1451350053.195163328 30 ctime=1457295923.234862913 transmission-2.92/macosx/InfoTabButtonCell.m0000644000175000017500000001101712640354045022274 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoTabButtonCell.m 14631 2015-12-22 00:45:09Z mikedld $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "InfoTabButtonCell.h" @implementation InfoTabButtonCell - (void) awakeFromNib { NSNotificationCenter * nc = [NSNotificationCenter defaultCenter]; [nc addObserver: self selector: @selector(updateControlTint:) name: NSControlTintDidChangeNotification object: NSApp]; fSelected = NO; //expects the icon to currently be set as the image fIcon = [[self image] retain]; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; [fIcon release]; [super dealloc]; } - (void) setControlView: (NSView *) controlView { const BOOL hadControlView = [self controlView] != nil; [super setControlView: controlView]; if (!hadControlView) { [(NSMatrix *)[self controlView] setToolTip: [self title] forCell: self]; [self setSelectedTab: fSelected]; } } - (void) setSelectedTab: (BOOL) selected { fSelected = selected; if ([self controlView] == nil) return; NSInteger row, col; [(NSMatrix *)[self controlView] getRow: &row column: &col ofCell: self]; NSRect tabRect = [(NSMatrix *)[self controlView] cellFrameAtRow: row column: col]; tabRect.origin.x = 0.0; tabRect.origin.y = 0.0; NSImage * tabImage = [[NSImage alloc] initWithSize: tabRect.size]; [tabImage lockFocus]; NSGradient * gradient; if (fSelected) { NSColor * lightColor = [NSColor colorForControlTint: [NSColor currentControlTint]]; NSColor * darkColor = [lightColor blendedColorWithFraction: 0.2 ofColor: [NSColor blackColor]]; gradient = [[NSGradient alloc] initWithStartingColor: lightColor endingColor: darkColor]; } else { NSColor * lightColor = [NSColor colorWithCalibratedRed: 245.0/255.0 green: 245.0/255.0 blue: 245.0/255.0 alpha: 1.0]; NSColor * darkColor = [NSColor colorWithCalibratedRed: 215.0/255.0 green: 215.0/255.0 blue: 215.0/255.0 alpha: 1.0]; gradient = [[NSGradient alloc] initWithStartingColor: lightColor endingColor: darkColor]; } [[NSColor grayColor] set]; NSRectFill(NSMakeRect(0.0, 0.0, NSWidth(tabRect), 1.0)); NSRectFill(NSMakeRect(0.0, NSHeight(tabRect) - 1.0, NSWidth(tabRect), 1.0)); NSRectFill(NSMakeRect(NSWidth(tabRect) - 1.0, 1.0, NSWidth(tabRect) - 1.0, NSHeight(tabRect) - 2.0)); tabRect = NSMakeRect(0.0, 1.0, NSWidth(tabRect) - 1.0, NSHeight(tabRect) - 2.0); [gradient drawInRect: tabRect angle: 270.0]; [gradient release]; if (fIcon) { const NSSize iconSize = [fIcon size]; const NSRect iconRect = NSMakeRect(NSMinX(tabRect) + floor((NSWidth(tabRect) - iconSize.width) * 0.5), NSMinY(tabRect) + floor((NSHeight(tabRect) - iconSize.height) * 0.5), iconSize.width, iconSize.height); [fIcon drawInRect: iconRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0]; } [tabImage unlockFocus]; [self setImage: tabImage]; [tabImage release]; } - (void) updateControlTint: (NSNotification *) notification { if (fSelected) [self setSelectedTab: YES]; } @end transmission-2.92/macosx/PaxHeaders.4960/StatusBarController.m0000644000000000000000000000013212442116621021301 xustar0030 mtime=1418239377.039464358 30 atime=1418239377.039464358 30 ctime=1457295923.530867946 transmission-2.92/macosx/StatusBarController.m0000644000175000017500000002353512442116621022736 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: StatusBarController.m 13434 2012-08-13 00:52:04Z livings124 $ * * Copyright (c) 2011-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "StatusBarController.h" #import "NSStringAdditions.h" #import "transmission.h" #define STATUS_RATIO_TOTAL @"RatioTotal" #define STATUS_RATIO_SESSION @"RatioSession" #define STATUS_TRANSFER_TOTAL @"TransferTotal" #define STATUS_TRANSFER_SESSION @"TransferSession" typedef enum { STATUS_RATIO_TOTAL_TAG = 0, STATUS_RATIO_SESSION_TAG = 1, STATUS_TRANSFER_TOTAL_TAG = 2, STATUS_TRANSFER_SESSION_TAG = 3 } statusTag; @interface StatusBarController (Private) - (void) resizeStatusButton; @end @implementation StatusBarController - (id) initWithLib: (tr_session *) lib { if ((self = [super initWithNibName: @"StatusBar" bundle: nil])) { fLib = lib; fPreviousDownloadRate = -1.0; fPreviousUploadRate = -1.0; } return self; } - (void) awakeFromNib { //localize menu items [[[fStatusButton menu] itemWithTag: STATUS_RATIO_TOTAL_TAG] setTitle: NSLocalizedString(@"Total Ratio", "Status Bar -> status menu")]; [[[fStatusButton menu] itemWithTag: STATUS_RATIO_SESSION_TAG] setTitle: NSLocalizedString(@"Session Ratio", "Status Bar -> status menu")]; [[[fStatusButton menu] itemWithTag: STATUS_TRANSFER_TOTAL_TAG] setTitle: NSLocalizedString(@"Total Transfer", "Status Bar -> status menu")]; [[[fStatusButton menu] itemWithTag: STATUS_TRANSFER_SESSION_TAG] setTitle: NSLocalizedString(@"Session Transfer", "Status Bar -> status menu")]; [[fStatusButton cell] setBackgroundStyle: NSBackgroundStyleRaised]; [[fTotalDLField cell] setBackgroundStyle: NSBackgroundStyleRaised]; [[fTotalULField cell] setBackgroundStyle: NSBackgroundStyleRaised]; [[fTotalDLImageView cell] setBackgroundStyle: NSBackgroundStyleRaised]; [[fTotalULImageView cell] setBackgroundStyle: NSBackgroundStyleRaised]; [self updateSpeedFieldsToolTips]; //update when speed limits are changed [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateSpeedFieldsToolTips) name: @"SpeedLimitUpdate" object: nil]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(resizeStatusButton) name: NSWindowDidResizeNotification object: [[self view] window]]; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; [super dealloc]; } - (void) updateWithDownload: (CGFloat) dlRate upload: (CGFloat) ulRate { //set rates if (dlRate != fPreviousDownloadRate) { [fTotalDLField setStringValue: [NSString stringForSpeed: dlRate]]; fPreviousDownloadRate = dlRate; } if (ulRate != fPreviousUploadRate) { [fTotalULField setStringValue: [NSString stringForSpeed: ulRate]]; fPreviousUploadRate = ulRate; } //set status button text NSString * statusLabel = [[NSUserDefaults standardUserDefaults] stringForKey: @"StatusLabel"], * statusString; BOOL total; if ((total = [statusLabel isEqualToString: STATUS_RATIO_TOTAL]) || [statusLabel isEqualToString: STATUS_RATIO_SESSION]) { tr_session_stats stats; if (total) tr_sessionGetCumulativeStats(fLib, &stats); else tr_sessionGetStats(fLib, &stats); statusString = [NSLocalizedString(@"Ratio", "status bar -> status label") stringByAppendingFormat: @": %@", [NSString stringForRatio: stats.ratio]]; } else //STATUS_TRANSFER_TOTAL or STATUS_TRANSFER_SESSION { total = [statusLabel isEqualToString: STATUS_TRANSFER_TOTAL]; tr_session_stats stats; if (total) tr_sessionGetCumulativeStats(fLib, &stats); else tr_sessionGetStats(fLib, &stats); statusString = [NSString stringWithFormat: @"%@: %@ %@: %@", NSLocalizedString(@"DL", "status bar -> status label"), [NSString stringForFileSize: stats.downloadedBytes], NSLocalizedString(@"UL", "status bar -> status label"), [NSString stringForFileSize: stats.uploadedBytes]]; } if (![[fStatusButton title] isEqualToString: statusString]) { [fStatusButton setTitle: statusString]; [self resizeStatusButton]; } } - (void) setStatusLabel: (id) sender { NSString * statusLabel; switch ([sender tag]) { case STATUS_RATIO_TOTAL_TAG: statusLabel = STATUS_RATIO_TOTAL; break; case STATUS_RATIO_SESSION_TAG: statusLabel = STATUS_RATIO_SESSION; break; case STATUS_TRANSFER_TOTAL_TAG: statusLabel = STATUS_TRANSFER_TOTAL; break; case STATUS_TRANSFER_SESSION_TAG: statusLabel = STATUS_TRANSFER_SESSION; break; default: NSAssert1(NO, @"Unknown status label tag received: %ld", [sender tag]); return; } [[NSUserDefaults standardUserDefaults] setObject: statusLabel forKey: @"StatusLabel"]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil]; } - (void) updateSpeedFieldsToolTips { NSString * uploadText, * downloadText; if ([[NSUserDefaults standardUserDefaults] boolForKey: @"SpeedLimit"]) { NSString * speedString = [NSString stringWithFormat: @"%@ (%@)", NSLocalizedString(@"%d KB/s", "Status Bar -> speed tooltip"), NSLocalizedString(@"Speed Limit", "Status Bar -> speed tooltip")]; uploadText = [NSString stringWithFormat: speedString, [[NSUserDefaults standardUserDefaults] integerForKey: @"SpeedLimitUploadLimit"]]; downloadText = [NSString stringWithFormat: speedString, [[NSUserDefaults standardUserDefaults] integerForKey: @"SpeedLimitDownloadLimit"]]; } else { if ([[NSUserDefaults standardUserDefaults] boolForKey: @"CheckUpload"]) uploadText = [NSString stringWithFormat: NSLocalizedString(@"%d KB/s", "Status Bar -> speed tooltip"), [[NSUserDefaults standardUserDefaults] integerForKey: @"UploadLimit"]]; else uploadText = NSLocalizedString(@"unlimited", "Status Bar -> speed tooltip"); if ([[NSUserDefaults standardUserDefaults] boolForKey: @"CheckDownload"]) downloadText = [NSString stringWithFormat: NSLocalizedString(@"%d KB/s", "Status Bar -> speed tooltip"), [[NSUserDefaults standardUserDefaults] integerForKey: @"DownloadLimit"]]; else downloadText = NSLocalizedString(@"unlimited", "Status Bar -> speed tooltip"); } uploadText = [NSLocalizedString(@"Global upload limit", "Status Bar -> speed tooltip") stringByAppendingFormat: @": %@", uploadText]; downloadText = [NSLocalizedString(@"Global download limit", "Status Bar -> speed tooltip") stringByAppendingFormat: @": %@", downloadText]; [fTotalULField setToolTip: uploadText]; [fTotalDLField setToolTip: downloadText]; } - (BOOL) validateMenuItem: (NSMenuItem *) menuItem { const SEL action = [menuItem action]; //enable sort options if (action == @selector(setStatusLabel:)) { NSString * statusLabel; switch ([menuItem tag]) { case STATUS_RATIO_TOTAL_TAG: statusLabel = STATUS_RATIO_TOTAL; break; case STATUS_RATIO_SESSION_TAG: statusLabel = STATUS_RATIO_SESSION; break; case STATUS_TRANSFER_TOTAL_TAG: statusLabel = STATUS_TRANSFER_TOTAL; break; case STATUS_TRANSFER_SESSION_TAG: statusLabel = STATUS_TRANSFER_SESSION; break; default: NSAssert1(NO, @"Unknown status label tag received: %ld", [menuItem tag]); } [menuItem setState: [statusLabel isEqualToString: [[NSUserDefaults standardUserDefaults] stringForKey: @"StatusLabel"]] ? NSOnState : NSOffState]; return YES; } return YES; } @end @implementation StatusBarController (Private) - (void) resizeStatusButton { [fStatusButton sizeToFit]; //width ends up being too long NSRect statusFrame = [fStatusButton frame]; statusFrame.size.width -= 25.0; const CGFloat difference = NSMaxX(statusFrame) + 5.0 - NSMinX([fTotalDLImageView frame]); if (difference > 0.0) statusFrame.size.width -= difference; [fStatusButton setFrame: statusFrame]; } @end transmission-2.92/macosx/PaxHeaders.4960/DragOverlayWindow.m0000644000000000000000000000013112442116673020742 xustar0030 mtime=1418239419.186186621 30 atime=1418239419.186186621 29 ctime=1457295923.04885975 transmission-2.92/macosx/DragOverlayWindow.m0000644000175000017500000001577012442116673022402 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: DragOverlayWindow.m 14290 2014-06-08 22:16:01Z jordan $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "DragOverlayWindow.h" #import "DragOverlayView.h" #import "NSStringAdditions.h" @interface DragOverlayWindow (Private) - (void) resizeWindow; @end @implementation DragOverlayWindow - (id) initWithLib: (tr_session *) lib forWindow: (NSWindow *) window { if ((self = ([super initWithContentRect: [window frame] styleMask: NSBorderlessWindowMask backing: NSBackingStoreBuffered defer: NO]))) { fLib = lib; [self setBackgroundColor: [NSColor colorWithCalibratedWhite: 0.0 alpha: 0.5]]; [self setAlphaValue: 0.0]; [self setOpaque: NO]; [self setHasShadow: NO]; DragOverlayView * view = [[DragOverlayView alloc] initWithFrame: [self frame]]; [self setContentView: view]; [view release]; [self setReleasedWhenClosed: NO]; [self setIgnoresMouseEvents: YES]; fFadeInAnimation = [[NSViewAnimation alloc] initWithViewAnimations: [NSArray arrayWithObject: [NSDictionary dictionaryWithObjectsAndKeys: self, NSViewAnimationTargetKey, NSViewAnimationFadeInEffect, NSViewAnimationEffectKey, nil]]]; [fFadeInAnimation setDuration: 0.15]; [fFadeInAnimation setAnimationBlockingMode: NSAnimationNonblockingThreaded]; fFadeOutAnimation = [[NSViewAnimation alloc] initWithViewAnimations: [NSArray arrayWithObject: [NSDictionary dictionaryWithObjectsAndKeys: self, NSViewAnimationTargetKey, NSViewAnimationFadeOutEffect, NSViewAnimationEffectKey, nil]]]; [fFadeOutAnimation setDuration: 0.5]; [fFadeOutAnimation setAnimationBlockingMode: NSAnimationNonblockingThreaded]; [window addChildWindow: self ordered: NSWindowAbove]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(resizeWindow) name: NSWindowDidResizeNotification object: window]; } return self; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; [fFadeInAnimation release]; [fFadeOutAnimation release]; [super dealloc]; } - (void) setTorrents: (NSArray *) files { uint64_t size = 0; NSInteger count = 0; NSString * name; BOOL folder; NSInteger fileCount = 0; for (NSString * file in files) { if ([[[NSWorkspace sharedWorkspace] typeOfFile: file error: NULL] isEqualToString: @"org.bittorrent.torrent"] || [[file pathExtension] caseInsensitiveCompare: @"torrent"] == NSOrderedSame) { tr_ctor * ctor = tr_ctorNew(fLib); tr_ctorSetMetainfoFromFile(ctor, [file UTF8String]); tr_info info; if (tr_torrentParse(ctor, &info) == TR_PARSE_OK) { count++; size += info.totalSize; fileCount += info.fileCount; //only useful when one torrent if (count == 1) { name = [NSString stringWithUTF8String: info.name]; folder = info.isFolder; } } tr_metainfoFree(&info); tr_ctorFree(ctor); } } if (count <= 0) return; //set strings and icon NSString * secondString = [NSString stringForFileSize: size]; if (count > 1 || folder) { NSString * fileString; if (fileCount == 1) fileString = NSLocalizedString(@"1 file", "Drag overlay -> torrents"); else fileString= [NSString stringWithFormat: NSLocalizedString(@"%@ files", "Drag overlay -> torrents"), [NSString formattedUInteger: fileCount]]; secondString = [NSString stringWithFormat: @"%@, %@", fileString, secondString]; } NSImage * icon; if (count == 1) icon = [[NSWorkspace sharedWorkspace] iconForFileType: folder ? NSFileTypeForHFSTypeCode(kGenericFolderIcon) : [name pathExtension]]; else { name = [NSString stringWithFormat: NSLocalizedString(@"%@ Torrent Files", "Drag overlay -> torrents"), [NSString formattedUInteger: count]]; secondString = [secondString stringByAppendingString: @" total"]; icon = [NSImage imageNamed: @"TransmissionDocument.icns"]; } [[self contentView] setOverlay: icon mainLine: name subLine: secondString]; [self fadeIn]; } - (void) setFile: (NSString *) file { [[self contentView] setOverlay: [NSImage imageNamed: @"CreateLarge"] mainLine: NSLocalizedString(@"Create a Torrent File", "Drag overlay -> file") subLine: file]; [self fadeIn]; } - (void) setURL: (NSString *) url { [[self contentView] setOverlay: [NSImage imageNamed: @"Globe"] mainLine: NSLocalizedString(@"Web Address", "Drag overlay -> url") subLine: url]; [self fadeIn]; } - (void) fadeIn { //stop other animation and set to same progress if ([fFadeOutAnimation isAnimating]) { [fFadeOutAnimation stopAnimation]; [fFadeInAnimation setCurrentProgress: 1.0 - [fFadeOutAnimation currentProgress]]; } [fFadeInAnimation startAnimation]; } - (void) fadeOut { //stop other animation and set to same progress if ([fFadeInAnimation isAnimating]) { [fFadeInAnimation stopAnimation]; [fFadeOutAnimation setCurrentProgress: 1.0 - [fFadeInAnimation currentProgress]]; } if ([self alphaValue] > 0.0) [fFadeOutAnimation startAnimation]; } @end @implementation DragOverlayWindow (Private) - (void) resizeWindow { [self setFrame: [[self parentWindow] frame] display: NO]; } @end transmission-2.92/macosx/PaxHeaders.4960/NSMutableArrayAdditions.m0000644000000000000000000000013212442116654022023 xustar0030 mtime=1418239404.004926465 30 atime=1418239404.004926465 30 ctime=1457295923.383865447 transmission-2.92/macosx/NSMutableArrayAdditions.m0000644000175000017500000000457312442116654023461 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: NSMutableArrayAdditions.m 14226 2014-01-19 01:29:38Z jordan $ * * Copyright (c) 2011-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "NSMutableArrayAdditions.h" @implementation NSMutableArray (NSMutableArrayAdditions) /* Note: This assumes Apple implemented this as an array under the hood. If the underlying data structure is a linked-list, for example, then this might be less efficient than simply removing the object and re-adding it. */ - (void) moveObjectAtIndex: (NSUInteger) fromIndex toIndex: (NSUInteger) toIndex { if (fromIndex == toIndex) return; id object = [[self objectAtIndex: fromIndex] retain]; //shift objects - more efficient than simply removing the object and re-inserting the object if (fromIndex < toIndex) { for (NSUInteger i = fromIndex; i < toIndex; ++i) [self replaceObjectAtIndex: i withObject: [self objectAtIndex: i+1]]; } else { for (NSUInteger i = fromIndex; i > toIndex; --i) [self replaceObjectAtIndex: i withObject: [self objectAtIndex: i-1]]; } [self replaceObjectAtIndex: toIndex withObject: object]; [object release]; } @end transmission-2.92/macosx/PaxHeaders.4960/ShareToolbarItem.h0000644000000000000000000000013012442116654020530 xustar0030 mtime=1418239404.006926499 30 atime=1418239404.006926499 28 ctime=1457295923.4928673 transmission-2.92/macosx/ShareToolbarItem.h0000644000175000017500000000040112442116654022152 0ustar00mikedldmikedld00000000000000// // ShareButtonToolbarItem.h // Transmission // // Created by Mitchell Livingston on 1/8/14. // Copyright (c) 2014 The Transmission Project. All rights reserved. // #import "ButtonToolbarItem.h" @interface ShareToolbarItem : ButtonToolbarItem @end transmission-2.92/macosx/PaxHeaders.4960/Images0000644000000000000000000000013212442116641016301 xustar0030 mtime=1418239393.163740681 30 atime=1418239384.824597773 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/0000755000175000017500000000000012442116641020003 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Images/PaxHeaders.4960/Lock@2x.png0000644000000000000000000000013212442116641020326 xustar0030 mtime=1418239393.136740218 30 atime=1418239393.136740218 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/Lock@2x.png0000644000175000017500000000255112442116641021756 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzô pHYs  šœIDATXÃí–KŒ\G†¿ªºîéi›±-ÛÂ1x,%rB&DìÐHˆ ",X†P0‚›$Û(ë°ŒKÉ"ÈxÅ"â Û±Ìb4&Žm pÏŒ#ü˜W÷´ïí[Ïâi”hì;¬Â‘Ž®®î=U_ú«ÎÿÛ§ÝÌ#Æ+@?êû²¢(fæææ¾{æÌ™o9räq€õõõ\¿~ý½¥¥¥_:çúÿ+uêÔ©¯¿øâ·ß9yòäу33Lu:(u]1è÷¹¹ºr÷üùóßY^^þ Ÿ$€šýÆ^þñož|êéüó³§Éòœà=Y–cäæê ×>xßÿìÍ7¿Õëõ~? D6ÉäEQýþÙ¼=ÿÕ¯åN‡Õå›kØÆ"eY2sè0Ÿ;5ËÑcÇsïÃÛ¯½úÊ3ιµAL"Âl~~þ'/ýá &3\¹¼Ä­È¥K—n\¸pὋ/^–”ºe‘Ïô·¶˜9tˆÇŸ8Ó¹võÊv¯×[Ò£( õ½—ξ1÷Ü—ûàïK¬¯ÝeqqñŸçÎ{ýöíÛ‹wîܹ¶¸¸ø·ãÇáÀî¡Q]ñÙ'A˜úóŸþø+Àßo=@û¹çŸ?}se™­Í ªªbaaá·)¥«Àe`)¥tuaaáwU5ãêò ¾øìÜi ý MÐÊó¼ØÜXÃZKÓ4Ôuý!° ÜÚñ•º®W›¦ÁZËÖæ@±ãê¡D˜gZF„ÂY‹mb „Ð _dʪýi%uðžÎZš¦&3*S(‚’&>†ZQþüåù¦ÛÎé†v–hé@‰¥­Æ>¥-mi+Gã"ÛN1 U,¨¥EJª Ùy6‡#~úîrGò  Y^%y+'3 - $‚  4(R´ ´F›­[dzšRwHÑàtCéÀ °„h¦Í½ÀáÃGøòS3ˆ8’ß"ù1nbE” + u²èÐÐJÂ4%™9HVôCe]þº°Â½Þ¿€+>wgAï© $%’@dWœìbwFÇÿˆìÄ%GJqüùÄ"T JiÐ~ÈÖšG‘P¯À! Qñyª(SxKŒ`U‹ÆD(A!GW¦d{ÿ§Àކä:ª­ÄB¨QÑBt¨ä!HI‰‚H$A¼Gô6IÛk#ª~"p{cÀ‘å+Oä$­ID"ž$‰ ‘N¢h—a¼¥ˆ“Fdâ02ÀÄÈÕ†µ~µÿ Œî Èã\Ú J@E„€àÇOå HòH!Á!!"I &á¦ãÞÐî !geÙ`ŒBë„RGãÐ8råhaIvD°5#k .C"ˆ!rP"¢ÃCh Ú&©1)Ð‚Ö Qq¼r5Îx]z–ä#É'bx›Nöps}ÈgÚ†Ù£1ˈÚ"jEÐ9Qç8Ýf¤Æ•—Súgȼ%óŽÌ oý%±9zˆZ`ëŠF4â HŽƒˆAŒBD!(hë€4¾/öi{L¹[´•⿆n ݦóD·ºy¢[$ºyb*OÔ.1h„» , èïÒ5©ûEÊÇg‘qÉÞá}`ù£1Ûƒt(BX“½Ú¶‰ ŒªBô±t©ûlMÉd]ó$·ãLðßoê½röç­å¶ÁüIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/YellowDot.png0000644000000000000000000000013212442116641021006 xustar0030 mtime=1418239393.161740647 30 atime=1418239393.161740647 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/YellowDot.png0000644000175000017500000000102712442116641022433 0ustar00mikedldmikedld00000000000000‰PNG  IHDR(-SðPLTEÿÿÿ‡-”7›C¢Bœ4‹.·_µZ¨MªfÂvÂw­ƒªdöËöÓ,ભ…৸TÿÄý¸pÿÝ®û²ï–ü½ˆ½[ë¡gà†#î’û±5ë–ý¹aÿÇzÿØÿÌÿÿ„ÿÏÿðÐÿ¼dë™ÿ½dÿ¿ÿÉû³ÿýtý¶5ÿÛÿïVÿê%ÿàü´5÷¥ ÷£ û²ý¹ÿ½ÿåë—ÿëHµ³ß'tRNS æ°`]«?¹7(é%è/ xžž†xííÆåÁ˜¨¯IDAT•ÁÁNÂ@€áfw[hið@ šxóýɃ'š*J‹]¶3>ƒßÿ&h#™Êg€T/C?‡€H󿶝géo"Z»¶"ÚzñͲ*ž»rXwiíK—…`IŸSÙÝ“Pèrû~»<ç×ÜA@Ê1m·OZûµ|šÔÓ"§Ÿ)_Ë„ r¸ö©*"2_öƒGÕ¾ÝP©}³¡™bœšÁ ÔOœÅÿÓR@¢3šaIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ResumeOff@2x.png0000644000000000000000000000012712442116641021335 xustar0029 mtime=1418239393.14674039 29 atime=1418239393.14674039 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/ResumeOff@2x.png0000644000175000017500000000132712442116641022761 0ustar00mikedldmikedld00000000000000‰PNG  IHDRr ß”žIDATxÚÅVMˆRQNE'Dt6þ!.D:0øb*ÇÀhÑÒ”6Am ÛRâJ)DWAm$Bq!H +H“Üd*ŽZY„Y†F¶˜q^ç…‹‹Î½ïÙÀôÁrßå|÷x~q(€k@ xlFjvf˜Ýá‘M± ©G"gwÕÿ"|¸N4NæúÌ'¬² Q©Tê"Üal¬rÛàâE±X|Ýn·»f³ÙO¸·A]Áx†¤¿^¯7ÄâéÊB‚p‰™H$Út:×w»ÝnFL&ÓB¡pÓùDR“„ÄbñÉP(t8þ  (—ËoµZíyŒ5â>õõzý…F£ñŽæˆÁ`ðÝn·_Á”Ì_/å81•Ju¶×ë}¡—@.—{!“ÉNalÊAN°P(¼â*´ƒIGÈЬíõÑårÝØË($G†¢¨«•J¥JÏÐï÷¿9ŽkìÙ ZhoD™N§Ÿ¡b»·Û}s¾,J¥ÒFsŽ[9î#¼ú+*x:_‡ñxü1”‚cɶ·xÈÄq ôûýwÐ;V«ÓaÈÄþ¥Óétôx<·˜ó}’Â&M§Óùˆ Æb±G\ŒJ$')i°e‘H$2¨àh4ët:7IÌd2]¬Õj[„¸°…o4½ÛT¼þd³Ù.ÏßU*•gÂáðƒÉdò;¦’[[$yH/b·Z­¶2™L!›Í>‡ß[ï ý32#1­Ð¼ù|þñT*õ„æhì#‹År‰àš8žÐé~o<ÿĉÕëõÄÏDzrð–À …â43óùüËf³ù¾Õj}`µÏç»-N° àý®d’W òÅNòuÐkâÿ_„|Õÿ "©Ý.¼IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/GreenDot@2x.png0000644000000000000000000000013212442116641021145 xustar0030 mtime=1418239393.131740133 30 atime=1418239393.131740133 30 ctime=1457295922.642852846 transmission-2.92/macosx/Images/GreenDot@2x.png0000644000175000017500000000255012442116641022574 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzô/IDATXÃíV[leþffgÛí–¶»ÐŽ)–k‚¢oÄkLCbBÀ_š/$ FßåŸL4¾ò >™øb}‘(˜ˆ–åÖŠ@©ÚÒn»³—™«çLÿš±ÙeúÂ&ßοç|ßwÎÛŒŒÿù#ßiàNÿP/ ü7 t¾¬µuõho¯zMûaÝn-X¿WókiÌ1Î1çßh@"ó}iMººbµúñ†[ŸylÓR<ùø=x‚°‰Æãs˜[ïÊÔl@Û¦¥VîÒz;»ä÷×ß×ÚöèkðìÆ§ðâCÛñÒ#¯zÂ1Ç8Çæ²FÛ®¥j5"ר_9‘¶/ó·v¯Lb]÷rlì~O¯Ú†-«wã¹î]xž°eÍ›Ûæ˜Ã\Ö$RÁÁZçD¾ÕáZþж¯%íníè:´t¤Óèh鲿{‘Œ§àølBRMánŠi-+æ8Äm' kÙão5о9½8Ñìíi]ì`QÚEC“@öPòò¸ZÀ@æKœœ9„S™C˜îÅH¡¦— 9ÌmI9`-yìm!½¸Z-¹êÒkJO²Õmkn³¡&,”QDÖ¹£§g¿Âàl.èGp!wƒÙ>œÊ¦Ü/!‡¹j“Ö’G+yíµ¤zˆ© ìH¶¸l(Ê~º{Ö¯3ÏbÌ8CÏ3ޝÓsºr˜ ŵì¡6b{ÖÓ€$bñX<ØÐ˜to ÇdJ@33a¸³ÈÙ“Ð è¶9Æ9æ0—5¬eòºŸx¼ß<.QÌråÃ\Ö°–h _îsßú©idô"05YÆtÆÅÔ¬„ÉY7g”pÆ(Çæ^îsÞÓOâxY¬‚_«è˜„#Î8þýõÁÞØGƒß'nŸ”qeØÅè%;9Æ9æ÷ü9ó¼^x9õÂù&<±d,, ”Æ¿-|3øanç‰ÁžãŸÆöÿ"ñùÏŸ8€=”ëaÎ)¼üzÎ@t¸cºHȲ'…!shêhñèõ^ý³1 CÏØ]hò‘Ùû·óBRi+ØpV˜ç„ùüçEl¾p´¸]iïëy'\¸ó3›!dij² öÝ«V¼ž·â r+,aœ+‘‰`&²:E±uέf^÷kyôß1r=-QÄ0ÅïrdÖ5‹óçš:õŒÇ“)øIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/InfoPeers@2x.png0000644000000000000000000000013112442116641021327 xustar0030 mtime=1418239393.145740373 30 atime=1418239393.145740373 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/InfoPeers@2x.png0000644000175000017500000000205312442116641022755 0ustar00mikedldmikedld00000000000000‰PNG  IHDR((Œþ¸mòIDATxÚí˜ÉkSQ‡}ÛÔSÓ¤‰¶ vHÛ4IšÎIGšNéh÷ö|ïœ;öýÕüÌŠ`–éüdMP¯×[ê÷ûo2>Ÿ/„wZ ’Ê‚‰buuu¶æææ7---444D### …ï˜£ÆÆÆ°,ª¦ ´­­­±¶¶¶cÛØØøééiêîî&n‡ö: )/(ä9GOOÏéòò2­¯¯§dmmÐŽššš*EÙ%¥5À‡ïLLLP,KËÔÔõöö>å~@£´ \|¶´´D«««iYYY¡H$rŠ~f¹ÔJ J@,ø|qq‘ƒgD4å ùÀ¨´ ‘ ß_XX ŒÁŒ˜™™á  4Š bæÆ¹ÄÈbFÌÍÍ Ÿ˜”4+ý<—n~~>-,ˆy¯– \BàÛ˜¡\º´ÌÎÎÒæææw5-˜÷MNNfÄÎÎ)TM³rŽw‹ñññ´pwwwOTlooïØßßgÞSÂÙÃPà ¾`Ay+½P›ÛØÝƒƒ>$¤„å¿ DÑÇr”ÔŠ2¹€7áLA ) àõe‚?ÈÙN ßøºIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/RevealOn@2x.png0000644000000000000000000000013112442116641021150 xustar0030 mtime=1418239393.142740321 30 atime=1418239393.142740321 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/RevealOn@2x.png0000644000175000017500000000072312442116641022600 0ustar00mikedldmikedld00000000000000‰PNG  IHDRr ß”šIDATxÚ½–=n„0…'à› lèè¹,+-I‘ˆ2 %\!J—Ÿ;lŸ:U? ¤'Ø0ÄB = Ù3óÉãñØW >SÉQò•B¥\©è•÷c~oc ±DÐÒAév¡ðÑÛJ‚h ¾öRصÒQÄ:"Ö؉w»Ýc’$ou]¶mû ác˜ §9¨Í+³,ë>MÓ÷®ë~æØ +µ/Hݲ,Ïs lh4.¤=dY6YYUUç0 _ üçá#¤wÏ«KhÏ8PÓ4_®ë>` sl ß`2¬Òá aØ%(ÛÂWX¥ Ïƒ¨@N£Tþœ^ø ö>€!¢ì‡Ø/ ›Á¾‚}`¾&Ð0Œ9ûÀbÔ=p¢‰ãøU)ÝàX@9ÞÁgAð, ‹ÿ¶6 ¨?9øãæ½2Ôµ6’p=¡@°g.B¹µqóÖÕ_PÏónÞ“ëiE(îÉÓ4ïøzš¹€õ¡ ã X|bè iLxblõˆÚþ™¸ýCxó§þ/Ì’ä£F®ô=IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarCreateTemplate.png0000644000000000000000000000013212442116641023306 xustar0030 mtime=1418239393.141740304 30 atime=1418239393.141740304 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/ToolbarCreateTemplate.png0000644000175000017500000000023112442116641024727 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿa`IDAT8cøÿÿ? ÌÈ€àzÐ ø·Rb€ _C6„TX€XÉFR à€"å;kÀ(F'Ú(¦¯O4²B1Œÿ„. |P5qa@å$ƒ.W¡!³IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ActionOn@2x.png0000644000000000000000000000013212442116641021150 xustar0030 mtime=1418239393.162740664 30 atime=1418239393.162740664 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/ActionOn@2x.png0000644000175000017500000000103512442116641022574 0ustar00mikedldmikedld00000000000000‰PNG  IHDR D¤ŠÆPLTE***,,,,,,IIISSSWWWYYYjjjjjjzzz|||~~~“““£££¤¤¤®®®³³³gaøi*tRNS.HOPQgkw|~€……””••žŸ³º½¿ÊËÖ×ÙèôôüÇkä!IDATxÚ…“ s‚0 †+( ˆ!¸aQüÀAÿÿ\’rÆávyî8zä¥iß$F¢$ÍŠ"K“(0ï,×;x²[/gáEœÃ/òxñ·À|€° %¾ÊÀssÈ <Ùêù?Çk|.$¸àâ“ᔟ÷? @G‚ Ϝş#æ¸sC- Z¨çXóýrŽ#ÛÓ«·ç¼"§ÛnpqÝ#jƒþ±?Í0 ;˜˜Š·½Û}i&2 xŽøõÌ —Gð$&%®]Ûãÿ0{ômw%ÇRC&9… ëæï—#„P×NÛ¥ø§U]§Zf€ ­o÷û­nø]ûrx(õ¤¿¦À¼«˜´žÄÕcð…EÊåE!yº0FüÕHyixÎ×bŸšLƒ²¼hÞ}ÿ‘EÎ(YY›m¼ßÇÛµ2;èr—ŽÇS¶[R(¥u>[%æ ª#Â?¸å‡nf77IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ResumeNoWaitHover.png0000644000000000000000000000013012442116641022450 xustar0029 mtime=1418239393.13274015 29 atime=1418239393.13274015 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/ResumeNoWaitHover.png0000644000175000017500000000057012442116641024101 0ustar00mikedldmikedld00000000000000‰PNG  IHDRH-Ñ?IDAT(‘c¸ÇÀ€„e€¸ ˆ¯ñ/(¾“AV‹¬)ˆ¿ñ¾_'ó‰ÿªE#Hà²&þñôâÿ‹bÅþÁ4܇°)Ÿéÿ‹…Qÿ?Ÿ[ùÿßϯÿAàÃá©ÿï±!Û,Ãu?XðN!Ûÿ/W6ÿÇÞl,E¶¹‹êy°ÀÛ­uUÿþýÿriãÿ¿ß>üÿ÷ûçÿW«³þ£yã4äÀ¿ß=‚˜¾¥Ìÿvkÿÿǽæèš@øŠÆÿÿþ‚5>lÓ†8½„ ›&¸F¸S½¼Öøry ŠÂ;Åœÿõ˜b88¯Vf@¼ Í·Ûêÿ?Ÿüÿͦòÿ?Ÿ]þÿ Y#pP¢ãíŽ& ‹ÃCóïÏÿŸÍöGO2XÀýz¹ÿ/—&ü±$þÿ½jqœ g’CÃX“ɉH_Ñ-„.é IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/PriorityControlLow@2x.png0000644000000000000000000000013112442116641023301 xustar0030 mtime=1418239393.148740424 30 atime=1418239393.148740424 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/PriorityControlLow@2x.png0000644000175000017500000000041412442116641024726 0ustar00mikedldmikedld00000000000000‰PNG  IHDR ¹ðÜÓIDATxÚ•Ð1ja@á«Ô)%ž`Ï ¤°ðä ÛiŸØy ·µ´ ;/±K•ÂB4ŽOxX¸®®>øwgªIq—c-5®\ÍÒ?ÈPWæÎ'Ò Ú8¯í,ÜM¯~¬0Äc2ßCg7¤üb‡r<+ÇÌ;ìÚ;ßc ±ÿÂSOØbƒ9Fšc㬓Î*(1U‰pV©ëp­Î.¶Ä_Úû¯&OŒ?yʺ<1þå)¯å‰ÅûvlÅ»Y…×UãZªw92ÄŒÝ'…ÉGIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/UploadBadge.png0000644000000000000000000000013212442116641021233 xustar0030 mtime=1418239393.128740081 30 atime=1418239393.128740081 30 ctime=1457295922.642852846 transmission-2.92/macosx/Images/UploadBadge.png0000644000175000017500000000144312442116641022662 0ustar00mikedldmikedld00000000000000‰PNG  IHDR€ÓŒæÊGPLTEÿÿÿ0k80i8/h7+`2,e4,c4*_2*]1([/(Y0'V.'V-$Q*$"O*+b3.g6%T-(Y/D$%R+)\0?!C$5#P*"B"%T,7  A"7 G%=xED$5x? 0m9SvW  &S.7^s`1.EˆME€M  /j6BŠL(®¯®;‚E7n?KpO4s=%=†F-b5S’\¯°¯=„E,3.KŽS0k9PY  `wc F‹OˆˆˆG|O-f56y? S”\LrQ2o:LsRR‡Y8}B9~B5v>:D3r<5b<:ƒE4u=M„T3p:<…D;jB:U=2W67z@YdZ+V2QxW [n^LiPQxV\o_ˆo mtRNSññññññññññññññññññññññññññññññ–ñµññâñxñy–ñâKâ‡ññµññâññ–ñâñññâ‡ñJññâJKxñâññJñ–ñ–¶ñññññJâññâññ⇵ñJâˆxKxˆK™6í)IDATÅÁÕRBЭb‹tÇ¥»»;$D,PTôÿŸe†á™{ÖÖþ¾zåôÝޥ˽ßìÈÚ†ÅZ0ùÁ‚d°VÚ²ØRmxó¯,Ê{Ulèú"Ï,‹øºXk ÛX‰HcXrE?‰D]XÌ·DÌ£0€yÉL¦40ˆ?‘‰€iêPjŠqó…PsŒIàP`‚™õžu‡•”¼R<˜‡„&èùG„øzxDMB" ÜcBÜàäœá8X$2 €º[zJDê®c¡";#"«`É.>'!¶c…‘_3XcÂK–  6´BjÍ‹4êP [:7 ­Î ä²@iÐißìèçüÕõÞ©2þ\kÿï£n4:XIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/InfoFiles.png0000644000000000000000000000013212442116641020742 xustar0030 mtime=1418239393.130740116 30 atime=1418239393.130740116 30 ctime=1457295922.642852846 transmission-2.92/macosx/Images/InfoFiles.png0000644000175000017500000000066112442116641022372 0ustar00mikedldmikedld00000000000000‰PNG  IHDR‰ xIDATxÚ­“½jÂ`†MTÔ´(….]KqTJ‡öœz],]»å6¼‡ nâæââ’EDP(Y²dÉâ’åôû~%ä4?C<IÎó‘÷5"úW.?9c1u¦Åt'E×ëxNF qJZÖs]—þb±X|ñý¦i¤eÂs/ËI’üâyÉÌf3šÏç¤ Ù):Ì@„çóÙð#ÄÈ=9‡k!D‚Í\3cYŠãØ Bƒ'#T%\1·Ì“,ív» §Ó‰¢(2áÏÛV+aµZ‘ïût8( CÁÇJXµ„årIÛí–‚ Š„ÕKØl6t<…B¡‹£²Öë5í÷{Ae¨„h¡+T®Ë„]Á'óÁ¼1æi3Vž¡k |e^]_ÿS´¡k |flb¿–W BW¤[í2 ìYBžp¨‚/(Á¼¦™ìwØFÀ>eÞÁ4¯„"a÷ñZiT EBŒ€dÔËÐÍ” F\ß@ñ—½‚JSIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/YingYangTemplate@2x.png0000644000000000000000000000013212442116641022657 xustar0030 mtime=1418239393.134740184 30 atime=1418239393.134740184 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/YingYangTemplate@2x.png0000644000175000017500000000055712442116641024313 0ustar00mikedldmikedld00000000000000‰PNG  IHDRúKÝv6IDATxÚ­Ô½JA†ádWÔFA/ÁÊÊt^ƒ­Í–©Å„’ÎÖ2•ŠMÀ2…iìR{«„XRleaŽ/r`e93;#ûÁÓ,s>fö¯!"µª½Ð•]d˜`Ž\ÍõZ¦k‚r‰¤ÂB×:“àΜàÇ8ÃoÅ ³FŒ²[XIµø ò;[Jæ8Ò|¹(JéÐìãÃ(|BHÐAiC c„$-î)]äbxG¹Kºô¸C„¤õçØoOá÷8/‡ÐÅ$À 7HÝ…t‘OH„±ûÈt‘$RË~(t‘+H¤žýÚÐE°Ž,컣ƒ.»Ë-NOŽ"M<ŽŒŸ³t”²‡©gWK‡†áQ–åÙZõ,L;fì‘#²âü9Å^ã)Îâã5·ãköĈœsyŽÜá! ëÓ.6aIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/Remote@2x.png0000644000000000000000000000013212442116641020671 xustar0030 mtime=1418239393.158740595 30 atime=1418239393.158740595 30 ctime=1457295922.645852897 transmission-2.92/macosx/Images/Remote@2x.png0000644000175000017500000000577512442116641022334 0ustar00mikedldmikedld00000000000000‰PNG  IHDR@@ªiqÞ pHYs  šœ ¯IDATxÚí›{P×Ç¿{_<½"Eiò”8IóÐ ˜DÒDEƒÄ€H­1fÚ[§c:­3Mþêmgl'¯:ã¤M¢äAP4Š‚äapŒà£iÒš ¨ˆšš€ÊCEyÜ×nÏ9û¸ç.˽,¹™t g8svÏî^öûùýÎïœ={VÀ8OÂ÷¾àO/½ôÒ¤ˆãš»6lØpR@DS¿#yÉIãÄðÔÞ$ÿ‰xŽlüÖZ­VÂØn’$Áçó©»ÏSW¨å³²²0.ÌßÓÓƒææfæ €D·òòò´áõzÇ”h›Í†ÈÈHmÿèѣ̆xnãóhlh“–ÏÍËÅ7±ÖŽcÇŽ1#ðàýA4i1’¿ñmÊh›íÓ ¤ÿ/Ô¿Ï5! ²Å­ñ3ü‚)€Zg4VÐ<‚@=Ž–¤/‚U°¡òÓhjo6 à@Û&ܹ˜‰×¬Ï v´>]”AÄ8bP˜ófßr‡,U¯¹<Ý&¥ËëBo/+irؘå$¥Ý/\… ‚"-1 Q¶(¶øL^ox½ƒ½#ðáY³f°À'75AŠÅÔ.MBÆät”ÞSŠ˜ˆèë2ñÊvûÕv4}Ռ֎V|Ýý5oÞ&FOÄô„iHMNEöŒ,L™8‚$ …xVŒ=†‰Wóõ›×ñòÇʼn¯NŒlxö}så,’ų(´_Õ NÏÇÂY å1‚ [W-]>޵GCKÚ‰hƒnܰ£ã÷¦'LGá=…(¸kV‡€OÎ4Þ¼s¬{Oì  ®µÎ¤d/„b~µPkóˆew-Cnj.ñOŽ-²pÒ ñT#ê>¯#–¾®À23¶SkD’Qžtyq±“°ºK©“üÁ’¤ìÛgá‘ûEÚmér¬Pz-¦p"º;!rËM­Mب'Îü{ˆ“žÌ_ —ۅʆÐâiª>m@aÆ¢aŒ†\¸‘ÝÔ¤i(+ø fþ`&k&,8ªÍEÐ Š”kéðØíÔº?š[Z›±m÷ëh¿ÒŽo’vŸ®1 (£!ã4'œÈ}àî‡P¼°v‡]ŽTsòç sÎ(§6à#¾ÛåÆÛ{ÊqèÓƒ£°ëÔ>s–e.ô  à†°ê™$f”,(CþÜA²’z+4ª|yñ¢Ó¶YöØ*<0w¾ € ·Ò§=7>9RúO>&3²]\·(‘+,°)Óo4%%NÆ#/ăyùì‘—°ÿÀ>쬫€-{Í(ÍZ:¼óÄP/(+Z…só„Óm-x³âutSá\O¢z }º3z®K$ ž~j-ÒoÏ­ÿA vÕŒNó:­våëæ“oIf“TüÊZìÝVö&ðÆÉ]æü4§8ü‘ˆ”Ö¯‚#Êê¿ïÀÍ«ò31EkKqõrö½~ñ4½vr§9?¿£c)ýí?Uæ¬=¶¼ú…Iëf/S¶|±Ã€±šB¾÷ $ÆKúÀw àägÐô¯Èܾ3³ópï¼eãÀÍ×PµåI2ç/¢oÀ Ï‚Åe¿'IsÆ×`*6¯M$Ïú.8¦bɪ0Á?~š@gGÚÎü“<x‘šu?’’SÆW ø®¿PrÜ-•íîîFKK sÄ€ÅÒã0=?^—ËS¯t¹<_/ЕÔðÏÕ(¯4ØÌ"õ /ê¡d²d‘Jþ /íPbbâÔuëÖ½:š»Ü²eËÚ®®.2k¢Í©óFt%·‡d7Éäm,è**—’ÝÊ1/ü/ÒEõz¢‘®ç'§¡ßÖ‹·q€H„]ÉúÉ.̘1#óÙgŸýóh¼øâ‹¿½xñâ)e—iæSDz8áƒ7À«‡ÀýÞF–·ë¬Ï{€C'~Ètç¼yóòׯ_ÿëÑØ¼yó ‡®çªx<·Îx/ðyB0FnÏ‹çópâµß]³fÍ3K—.- €êêê}[·nÝ¢ ‚>{‚5½Ûƒ`$Þn ÞD¼@>R°oܸ±<..nTýëµk׺7mÚ´ÚKWcº®‚ׂ'í·„aÜßjàö¼ÅíÜ9N¼¶‚1"""²¤¤äWsæÌYôMÂõñãÇ몪ª^q¹\ƒ\µˆÀwÈ^7ÁÐB°sÏÄå,Ÿ”””\ZZútnnîü˜˜˜ØpôY}$566Öoß¾ýÎÎÎKž ržàÕYßm FÀ¦kv®Îb žýV~~þÊ+Vü†®2§™ÿŠ$::š|€áÈô}ÁÀÀˆ…Y¦Ësé÷=ô\:uEënܸÞÞ^”——ÿ¥¾¾þ‚¨ƒÀ»HÐǾX Úû€G·‰Õã§L™’E›IÑD öòŸ¡a¨™ìG‘ã‚Ûíî'™}„AkY¦€È\>Òo÷ƒ-Äzø^ÞÈ|ºfáåê c€Þ ¬:Oà÷‡X®¥õ’Apu ÔýÝ t.n5tÁ„Û_^J!@ˆÁ7 @ïúq`äò!nöÛö£ãF±A2È,ý-”ÜJm%Â|IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/PauseOn@2x.png0000644000000000000000000000013212442116641021010 xustar0030 mtime=1418239393.152740493 30 atime=1418239393.152740493 30 ctime=1457295922.645852897 transmission-2.92/macosx/Images/PauseOn@2x.png0000644000175000017500000000043512442116641022437 0ustar00mikedldmikedld00000000000000‰PNG  IHDRr ß”äIDATxÚ½–1 à † ÍGÇ\ KCx‚œ@0›£„8´Ðûä{«öOp«Eø|x ŸŸ¾KA\AÐÀp@‡\¼[ ¾¾iþ•u`Î ÒÌ +• `¾’ %²µR³þ’v©™ÕÏô¼¼MêŸMÓôŒiÛöV˜™¿7Ò˜á¶mï)å£(fŒëÌ„öp…‚õ!€ ¡ˆBµ 5Q¨w¡# áÂMèBú’Ò7 ½,è…O?ÚØ‡wþz2Ƽb„÷\>u=Ñ/`~‹Áo¢øm"¿¦·úVUvWç ¤IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/GreenDot.png0000644000000000000000000000013212442116641020573 xustar0030 mtime=1418239393.159740613 30 atime=1418239393.159740613 30 ctime=1457295922.645852897 transmission-2.92/macosx/Images/GreenDot.png0000644000175000017500000000103112442116641022213 0ustar00mikedldmikedld00000000000000‰PNG  IHDR(-SöPLTEÿÿÿIGQU ]XaV‘/o h'mLˆM‰f·}Øß,jºM­ÝøÐØz;« n}³gPœ#tÅ5šÎˆ‹Û…ڒߌÌpŒÏda¼ $sˆÍaX£Áé®iÇvÍ}ÏH«”å~ÖyÉ5zÕ°ð·ô%^¼ zÅ¥ëJ¬Ò€Ò•æéÝßÿ„zÉ5¾÷V}ÈjÇ·ôHØÿt¹,Ñ%tRNS «æ]`°è/†xé(7? ¹%žžÃííÃr¹d¸­IDATW•ÁÁNƒ@†ÑïŸ;tŠ­MLšhâÊïÿDîAE s}Ï‚ÐìÂm)àPý(c÷—ÅÁò³åq?ëú¹A œ4Ç¡m‡8ëø¤µ¤ö>ݬšœ^Yª¶õ¡±jC×ø¤ïõöµÆ<º¡Ùr¸K[Ûü¼÷îéøV×—|¨º£„ÐiÉ:Kúð©ùr¡ ‹$ܽ÷âŠ÷6¤4Xï"PèÜùí Àý—IŽâtXæIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/QuitBadge.png0000644000000000000000000000012712442116641020735 xustar0029 mtime=1418239393.14674039 29 atime=1418239393.14674039 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/QuitBadge.png0000644000175000017500000000126112442116641022356 0ustar00mikedldmikedld00000000000000‰PNG  IHDR€ÓŒæÊöPLTE(((ÿÿÿ  000,,,<<<###222333444'''¯¯¯AAAYYY888;;;KKKMMMOOO*** +++ LLL """&&&]]]@@@GGGˆˆˆFFF...KKKEEE$$$000FFF***FFFUUU222III&&&GEARtRNSñññññññññññññññññññññññññññññâ–ñKñññˆñyJññâñ–‡ñµâñâñJKââx–âJñ¶–ñââ–xJ‡âxñJ‡µâµoAô­IDATÅÁ‹ZÁàZ- sÚ˜s‰HÎDÎätÿ7ÓÆó¸ƒö¿/xeÆÇüÇ¿ËÇ‹Wà…Qf"ÙdÌÉl$3,¼ÏÚÝ\LsQ,×mó tô#Ú·Ë´HŸÐ6‡Äç´äD{¡MH‚´Â¶HИ¥ $53n£_b¢[‚ëè˜èšØ?wØë¯‚ô=Nú» ý„©.jŠÄ¯¨‚7¢‚hÞŠj¢î½ä­£æñ òÔPöyùÊ`å^P…`Ïïãï4üb‚l…„„Z$H¦•GJš$hK+O”4m £ª*®S«t€g#S}v•jŽx^lf  º$0^€WËÕ¡óâ‚ÎaµäÕ•æ_ºc3PIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/Bandwidth@2x.png0000644000000000000000000000013112442116641021341 xustar0030 mtime=1418239393.149740441 30 atime=1418239393.149740441 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/Bandwidth@2x.png0000644000175000017500000001202312442116641022765 0ustar00mikedldmikedld00000000000000‰PNG  IHDR@@ªiqÞ pHYs  šœÅIDATxÚÍ› p•Õ’Ç;7@€(;.¨¬ RÄD,Fqa:Z‚ *ZX¢ ΛqÜáÁ¸–Ê® Œ€Ê›÷qa@ÙA `€@HØÉôï›û¿ur¹7$"Öûªºî—ï;§·Óݧ»¿“˜ýþWÆ àw½b¿£°±P.©Þý.J‰B¡#AÎ<óÌ::tèyçwþûc=öɨQ£–Ž=zûرcO˜0áà÷GÞÿý#GŽ\öè£N½ýöÛÿÓçÜÁÜ ù»U@Bè ýrŸyå•W¾öÚk›üñ‰½{÷tà 7Ü䯚կ_¿¦CÆyçg€ß[ƒ j4kÖìÂo¼±ë=÷Üó¨Ïïss^zé¥Å·ÝvÛ° .¸ y’2þn ^®\¹ò¾j=ž{î¹YÏ>ûìò^½z iÑ¢ÅÅçž{n6jÔ¨LÀŸk_|q‹»ï¾{ð°aÖ :töe—]ÖZ¿•"b'+¸CfçÎoyá…– 8pR›6m:Ö©S'!4¿µk×¶ÓN;Ͳ²²Ì™·ŒŒ +***<ãcËœʸüòËÛ4h´®¸âŠžÐ>YEÄNb^Ìk2dÈ<ðÀG˜½ 1[¯^=«V­š•/_>,‹EÂU¨PÁ*V¬h•+W¶ìììbÀ3Þ1†±Ìa.8ÀU·nÝ74p•þýûO}º-_¾Ü¶oßnyyypÏ3Þ1†±Ìa.8Àâ–ET­Z5ÚEˆ‡º?ýôÓ³jÔ¨Q¯,Jˆ•RøL_©ú€¾tWoA´3\ø)+Äß{÷î5w kÒ¤‰=øàƒöå—_ÚÑ£GËì›Ìa.8ÀNpCZÐäâoâ<ù®Ó‚¸P³fÍ&ñ™q² ˆ„w¯ã Êÿœþù !tÆg$VA>Ìßo¾ù¦µlÙÒ^~ùeÛ³gO ï};3OpÌ•h¾·Û;ï¼ccÆŒ‰€{žñŽ1ŒeŽ.pÜе1FÖOðæùBƒ'Ÿ|rº+¡^i”+Ï?üðßøvÔ³wÄÅ‚ŒlÙ²Å<(F`Òº\avß}÷™'Dæ>j×\s Z•*UìØ±cvàÀ¸çïÃXæ0ºÀ håää$” Å€7xô9 yä‘ÿ.MLˆ Ú—ëÓ§Ï[7nY½zusÿJ:c†_}õ•uêÔɾýöÛÄdÏêÌ0ߪ¢U …--0‡¹à8uA šÐ†Å.x|«üƒ+ð<´$%”¤€LO]ûztîA°A³Zyˆ}ô‘yÊk»wïŽ&á›·Þz«õë×/ b¯ßÀNpCƒ šÐ†å¡%À³o“Ý\QJr…X:á}¯mÒ£G?ašø–4 ©:t("J.“¬L—uÅOà74 MhÔ À¯ð ïSžõ€Ý<béLß'¾æ¦T sR@‚„fÏžm ˆÌb˜§çQF÷[­z:€´  mx€x •ÏX‚+"Ë·Õé\!•2ÛµkwsóæÍ;‘“Ÿ~úé‘ÌÌ̈À¦M›ÌS_;räHÄYY±¶å×Ù¡S,¼€Úá–[n‰hüÀ¼Á#¼Â3ün9Z·n}k<[L«€hõ]sYž€ e"O&%¤%öc™™Ç «³iµuÛò‰Ý[ñ «xtodš©`ëÖ­öÍ7ߨÇlï¾û®½þúëpÏ3Þ1&ÝüàÅKç„{“¬^å²$j,b·n݆¸r²’­ Y™]tÑÍž]5Qõ†¶¥öìÅ‹'öaϾìðáÃ6»Ò96ç‡jÖhË”=Ã.,Ÿ“ð[`ÕªUöá‡ÚäÉ“máÂ…‘Q²pÏ3Þ1†±Ì)%ÀƒvE‹E§×XeuS3}+©'ÿQ«šë§Ÿ~Jø‚¥#Ìêi•¤„Ü YöâlÛ»Õ=`G–ý¥ñ¿XAöÙ‰€IdVÂÅ3î=JGA Så}²h¥ãCMÞ%¼b pw«wœ ¸ÔVújíçŸN ä}:Âd~¡©j_Ÿ[µ†ý%?Û–œq•í©X+‰9Ê•”Ö¼Cp,!¥Å)Zéøµä¡,rk§q¦Zé pÄÕBÑ/æZ¾ž dbR •Q©š­¬ß2“d¬2B‚ŸT˜gŠ%´·ØÇÕK ­ày:>´Òø%KØÝⲓ- Ãd„_j´"ü*’–DX+«ÅUàï O¯­6«‡ðDt¢4 à%ðŽ1¸ï÷À™ŒW)nI !¥I!¡*ÄŒìÇ<]' û7bš/ÉôÂZ»[¡jõ]»vEÝžï¾û.J›QÂòmg¼Ûé…c™£œ"^ùC:>BK„÷ð¹,Äi¯Ë]$@ËxB ðo‰8‘°ŠÉû¶¾ê 2¾=þ|›8qbÔ¸xë­·ÌÏ EÏxÇÆêûŸðh+[i%­>sà=´µë‘•]=TÀQ·ŠùŠÂRÚ"=åãdò*(N„3™‘ %C˜3‚dxaVÉ=Ïx‡Ëé\€ ºJ B!tAx†wdÀ|w÷²|¹ÀQ7Ïmžö®S¡¹·oß¾X0ÒóKÛ^fã&N²ÉS¦ZûWDÏtRL¨•¢?´³1O €{žñŽqŠR€,Üé äžCóWÚíÕäzOÀ¶Ä-àXÂ/]ºt&ƒÔqÿN™¦›ºþ†.‰dãÆ®Ý«DŒQ©ïˆRxáñC„ŸºàœÚS2ðx Î‘÷ f"+±´˜ ððǜξš&DjzÕUW;ëÃ;Š ölÊN Ù7lØP,+SŸ@Už*A@ë„Qòµ~ýúg:áUëË]à<2€ØlÈWÀÑãà.°jíÚµKT˜È @ÄG˜„ˆˆ}:mª-ò^þ¢E mê'S;1”߬„TÖ ŒÑÊ3*jÒN—Á<«¶J™?2­Y³f©À©p,þð §=:Tˆù./7àïM7ØÄñclÂØÑ¶nÍêãÒh¶8úx«W¯Näõ¡%w€%8cù0Â\p$ãM>^‡)_ð/@o¡”gøgõ±ÈHâ{Ü6÷‰ƒ®ñnrT”hÿD‹þaÁü»A"°A8U® ìùóæÍ‹ZT¸ù+¢‹{žñŽ1ŒeNI«.š´º¥@x£Å¦²Z¾B×­[· Ùâ 8*ÀâJàá!×ZáÌ™3G)U cï½÷Þˆ( ÀtéÁ•´B¡bh€b ßÿ½}ñÅQ»àžg¼cLª .@WR7 Þ´`a<fÍš5ÙO…ãÁ4ö{P›á;ÂB}›­€Þ»ŸåMôÙ!Lo/U%yª@=1uY#<Á[¸úðŽ%»,‹\¦Ï‘-4ÿT @3 ýß<7?¤þ[¨2¬;î¸#ÑûC tsUýJ€´ )úðO¡ðÜcÁÈ€,È—íH*X° ¡BŸ¸òÓO?ý³ªµä>žŸ+z³ôò0ÉS%¼ú…ÐÒnð~6Ôoðâj”˲"®€ƒŠþ©>‡»¦²ÏÒXH_%ï "ÆéNü_ÔÖF?¹ì.áU¢MhÃCØ\…GU˜Wfû'÷Ñ”q™‡«Ÿê„ˆ¬M:Âü©S§ñìijv­†RfrnâR s|¦ÿ&>pI¡à’’Bƒ¶„×<=çy­—ßC!®€ãV? "+ð@²cÒ¤I=Bo•fef²rø¾}ûFy]ï垦§¼DB(¿/žIyŒes v!>öyhA3Ùìe©žClõÒz ¼#CºÕOwJ,tü&ß‹‡ ãÆëïm­­²„P ì㸆Ÿá7?HmW^yeÄl˜ó¡é.Qí±‚üû6À=ÏxÇƪFàà·}‹hA3^Û6<:¯¼×è_&mo\†”—tNPyÁÁ¸ùìõDe¥ÿoO_ßRÖ©—§ªÈžØ¸þúëÍÿåźwïþ$b§*~Jú›9̸8‹¤öšf¨(?ðæ<ös^WÄ…/HÞ÷Ë¢€¢Ðö¸%¬÷38}¾þúë9ôôIZ”ª†ÖÀ/&ÍÑŽ»ú?KEÑšUä ƒNt¨Ò‰Þ1†±Ìa.8À¥sAa°cŸ‡x'xóûuqá÷Û^QY ¥'ºÍOt rû³Wƒ‡ÔÖ&iE¤QœºŸMwÝuWäÜ xê©§"àžg¼c c™âÐi”pGpx€çé xƒÇxË{I¦_¤Rš¥}žç-¬÷ßxãû|«ù_òx˜A2M¥ÏRFxê3Ý)ä“¡2uu{¸—àô¡ ÎËhÃyݼ¸ð…¥¾4 H•%æÇ åy‡fÙøñãôÿùêuvŽU DØaVU©ÒT†Ö¢LNmlå¼'¸¡áim4¡í<Ðß …ߟœí¬’w)¢»É]^eM÷½Þ{ï½õÕø‘JN§?`\•e(X˜è^Šb,s˜ „'¸¡á«Þ š>gw’ðJ»òeU@r`<7³=qv:ó(bš¯LÿïÐrŸœàõüF>¯sÜMASÿ&“4†9̸À n‡–Ó䥈öE¥ª¬ÿ5&KPͰ_q%Äa—÷ù—Ι3g¸[Ň~»…ý·)S¦Lögó}ŸÎÙ¸qc!G]àžg¼c c™Ã\ÇÑ\àŒ ,:»ã´Uá-ËÊÿZ¤Š ‡”+Èr¥ _Ñ5¾jSýÿ^&;1bD¯çŸ¾«ÿ‡i'?Õy3À=ÏxÇû s˜›$xAœö‘_#øÉ* Ùet`!ã¿„‡Ý¾klâBíJš®ÀÏ ‚ýýèÉÏõl§x×JR9”IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarResumeSelectedTemplate@2x.png0000644000000000000000000000013212442116641025366 xustar0030 mtime=1418239393.158740595 30 atime=1418239393.158740595 30 ctime=1457295922.645852897 transmission-2.92/macosx/Images/ToolbarResumeSelectedTemplate@2x.png0000644000175000017500000000066112442116641027016 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzôxIDATxÚí×/HQÀqω3A0 ÊÚ‚ ( ,ŠÁ$LÃ@´"‚išLšu\ ›´˜ÄæŸ  nA™z÷ó›w÷îÝΰ|â¸/l÷{o-"«ÿpÚ± ~i€à]ñÈÆ|¢Ð¨€ôAJHFC p >®2Å$ wL„ ˜C¢ÉÆšnÀ<ˆ&ÛHê ⢩†|˜ßÀ%Äö° Q¸E&Ì[0 QøÀ4,åÐvìB\~‘óYDu,™Ú„7Š€²Ï&|Á°É³àK0ép†“§áDaî±c. áñúe 1z_Á½" ßÈ€}EÀ ‚N€qˆÂB€‡á e ×Kmðš^ìÁÁúuWñˆÏ)øŒ,blàÔõ™õ°÷YØ Gh5q!™BUãáF¯d)†ø¨aVT—Ò4Ѝà U¼â«è²šÿ ›·­1"Q>·zIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/InfoTracker.png0000644000000000000000000000013212442116641021273 xustar0030 mtime=1418239393.138740253 30 atime=1418239393.138740253 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/InfoTracker.png0000644000175000017500000000077312442116641022727 0ustar00mikedldmikedld00000000000000‰PNG  IHDR‰ ÂIDATxÚµ‘O(aÆßµ™Ù̖ܨ=Ð^dR8(ÅžH”Ú”£rv¢äHH¹ÙRZN.´{”i/"ùwp°7)i2^4Å«ÀìÁªð‹º®ÔzÁäJæÍ½õÿ;[?“ùƒÑɈ*IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ResumeNoWaitOn.png0000644000000000000000000000013112442116641021742 xustar0030 mtime=1418239393.149740441 30 atime=1418239393.149740441 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/ResumeNoWaitOn.png0000644000175000017500000000073512442116641023375 0ustar00mikedldmikedld00000000000000‰PNG  IHDRH-ѤIDATxÚu’M/Q†GRb'–=?À õÕV‰ ‘&¾bÁ΂H‹"µ·³‰X‰M§Zô#Miu:ˆ ¡Z‰ú¯wn§%]<ésúÜsî¹WòI¿i%n!Y¿•×n='éTHãä“Ào'#µ¸š!÷¿õÜø_qŒ $ɽÄ&áöü‘Mä>Æmzžÿ-‰fRA+±Õ ´fAüh©»ÒOÄ–qál,ÉÍÑD)uv >g¡¾}AQ Ü?ŠudÛɶËU=š#¢¨wêkJ:ø±©›(×÷ˆl9¹±I?+¡£‰9®C2xõåƒLA(ïáj©²¥4 2¹¢È6/&ŠGEkÁY3äAÆFëÅZ^¶þcb7‡ Iù”­æÞ°Ã×%‰J¾ É&\.¶Q®lÕ£Ÿ‘ÂÔL©dÑý9\¯tòw ß .ÚÙ…1ã:X• !(Jêû7§YàpT„V»¹±.×a<ÊbäÁ3Âë6AÀÕ¢_C™±ªOŽ•YA`œëÿ“«þÈIÕGþà§ ËoaIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/UpArrowTemplate.png0000644000000000000000000000013212442116641022157 xustar0030 mtime=1418239393.163740681 30 atime=1418239393.163740681 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/UpArrowTemplate.png0000644000175000017500000000020712442116641023603 0ustar00mikedldmikedld00000000000000‰PNG  IHDR _žüNIDAT•c`@2PŒÌ€b¬ ˆÿCq4º¤6FRð*Ü@| I†¯Aå`‘„á0—ó`‘äBö(€ Ø ƒ†“*’˜„h~IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/Bandwidth.png0000644000000000000000000000012712442116641020774 xustar0029 mtime=1418239393.14674039 29 atime=1418239393.14674039 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/Bandwidth.png0000644000175000017500000000344112442116641022417 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzôèIDATXÃÅ—{lÍYÇQT[ÏVõ¡JUÑÖ[[ZúÒÒ*’¦]ª4ªÛE«¬H©"⨑°¬gb=°¡lnüãQ‰D¬ÝÞÝÍ&þ™Ïìï&—¥*û‡›|oÎ=gæ;3çÌÌ9·ƒˆtøœø÷«}Ÿ.ŠEŒb²"M‘¥ÈVd*’£™.m}ª~ŠHEjUUÕò»wï~ñâÅOoÞ¼q‹óaÌkÈ «ˆPøþ:+BÉûöí«s»Ý-jHÚd8P§º‰ÎŽtúT|Q ,(yþü¹ëõë×\.—444ÈìÙ³e̘1m`ÌkÈxäÑ]´hQ1\N@ír «bÌ:ý¼zõJƒqKss³”””Ȉ#$..N&L˜ ñññ’˜˜hHHH°¹Ñ£G›LQQ‘é  Gmmmµ“;>sÀ"_¿~}õË—/ìÚµË"š7ož,_¾\ô¬eÆ ÆÌ±† Ž ¿{÷nñðh<ß8¹äÓ–óòòŠ[ZZܺ}²cÇ6l˜ÄÆÆJnn®¬^½Z4Ùºu«­íܹÓÀ˜9ÖV­Z%sæÌ±9r¤466r'ÜjcÀ‡èF)=|øÐõôéSÙ¾}»oLLŒTÍÏ5åRWW'õõõ¶Æy{ƒ¹mÛ¶ÉæÍ›eíÚµ²páBsbøðá¦'ÜN û¾Ï¡[¶lÙøøñc¹zõªE=nÜ8ÉÏÏ—ÊòRq5HcÍ©©©‘¥K—Š&¨Ì;×À˜9Œ+‡9ZYYiópœpcCm…¿ë#õÞ½{-=’ùóç›Rff¦-]W,­[s¤¾8׎ƒ¬÷s8S^^nNê™Ë²eËŒ.œjk*¥éí@–K…n‘œ?^†*cÇŽ•‚‚Y¹r¥9°xñbyX‘.­K“Ê2%/7[fÍšõäääHii©éTTT\p ­šUoob:Ԥ̳OOO—ÂÂBY±b…íBVV–|••"Ï ÇË£‚±ò]îxÉNJ)S¦Hrr²¤¦¦šÏœ9ÓtÐ…ƒyrcÁÆáÇQmÞL9wîÜí[·nIJJŠŒ5J²³³EwE–,YbãÉ“'[yÕÅËÉh?in¬‘¿ûE~ÿõ•UÀàÁƒ-ëI‘Ú86r¦x:`ÀS ²Òóbò€ÝÀ(`ÌkÞ²èœpcCm…¾ï6äñ™¤^ºŽ;fý¼W¯^Ò·o_éß¿¿má§tဠNM>®ãvüC’`=Ï¢ãÇ»µT¤¬¬Lzôè!þþþFÔ»wïvYtÐ….8µ!ñ éÿ±'Ù}LTŸ={V÷|Ÿ>}¤{÷îFسgÏ6 ²è ëáÑ[ñkå¦èø±G)Oè-™jíXî‹/ŠÞ”–é]»v___éÖ­›øùù½æXC†Ö‹ºz»õ*Çx´çeÜžg9”¨éÓ§içryºÝ‘#G¬éP÷Dêããc`ÌkÈxäÏœ9ゃ]%òö>Ë;:»€·Á¼^ôðí¥K—žÝ¼ySÚdõîÿÖù»âüCòñ8Ñ–Azðjᥬ§˜§w|íž={¾×ðþ7þ¸sçŽÿ©‰Ö¬Ó)}šÕªl¾“í¡Š~ §Ê:;ÁulËNNcúBñ¥ãD?g7øó™¢ÈU,P”(Øâ…йŠiŠŽl £‡~OçÕý~>'þý7>z¸ˆwIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarFilterTemplate@2x.png0000644000000000000000000000013012442116641023700 xustar0029 mtime=1418239393.13974027 29 atime=1418239393.13974027 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/ToolbarFilterTemplate@2x.png0000644000175000017500000000054112442116641025327 0ustar00mikedldmikedld00000000000000‰PNG  IHDRr ß”(IDATxÚ½–±Šƒ@E#ÚLþ%¿ „üH@HX «ý‰nÉ÷iÝ.1&—åmsß¼Í:Žs92ãŒ.¼÷Qù¹’ IМ@žBÎ`Ü p^á Šw„)øÞ‚tR³df©UXO<@ rà„4àPQ7ÆFJ”Z!I“4i¦M›‰yš™dîñN˜â0ɽs³©Î&ßÍwæ»÷{õDOöøQ¢ Pª”!J’8ÔßTçŒäã‹k”)Ê$%™tþ#w+ØGá:ç3bû짬ú9]xv ñ³ë˜vÇG?KÐ-fŠDQ~ C›BêÊ.Þ9Ó#ê¹F'2QAÖŸ´‘Ã~‘öye‘7‹‘‘Q÷#÷ü8Œ…_ø‚ÂûÛ¶÷¦²[Pá ×béÅšåx¨Å?#1¸…åGY”x©ŸÚ†ú\¢h5¤oíe•Œd Xb3ç7ÁÌ'Ð Ê“£4{׳¢ Ø‚*K°25Qf‹cA¿dSmÁP'cæîv§V…wZWV‹}Â2Å,2ÃûD²;d ꌥð¯²÷zË‚ ÄÌàfѤۂ¤“±QHÃRø±§_¡ðî&b§WwÓòC° nÌ?<ê>Ãé0|Aæ•’¦ 7´û‡ØŽÄ©3“ÆÐ~ ýíu!§±ànÒ0ËÂÎF7¬ªŽÄ…­\±ä娧¾"Ê~W•YøÉKÛÛ®Õ˜ŸÆì=í b`#òãaèo®ò>*Àmmù—Ch!¨Ï†Qšx„ò·§4¢‰V}Ú0£ìé´6~ó>µ Å/#b=´²„ԵݼèÁñԋܨ«ö,ÔÓ“ôývú­rW8~nƒ'P‰ŒÁ˜û#û£Õ¨µGh’H¢˜¿bˆ“¿b/Qbä/Q+½&þÿExÅWý¿ÏÙDøË„€$IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarOpenTemplate.png0000644000000000000000000000013212442116641023004 xustar0030 mtime=1418239393.161740647 30 atime=1418239393.161740647 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/ToolbarOpenTemplate.png0000644000175000017500000000026712442116641024436 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿa~IDAT8Ëcøÿÿ?%˜bÐÀ þÅHL@œ€¤†˜ fF7 ‹f|ø/g0P <&ÁæßhøÈ€5$:o`€ú…\rA¨P`€6,’¡ù3 X@†«c"‘ r âo$hþ Äê`ž“dDw¨))JIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/PinTemplate.png0000644000000000000000000000013212442116641021306 xustar0030 mtime=1418239393.131740133 30 atime=1418239393.131740133 30 ctime=1457295922.642852846 transmission-2.92/macosx/Images/PinTemplate.png0000644000175000017500000000026512442116641022736 0ustar00mikedldmikedld00000000000000‰PNG  IHDR Vu\ç|IDAT(Ïcøÿÿ?ãPŒ4ì)â~"Èä÷P <];±Å0Œâ¼¨à{,ŠßC‡¢¡‹‰0ÅØÜ rÊ}b£; Yƒ.Å HAˆl“6ÅPÉ$çü´z(ñ Â|nEÖà€ËZlcCLXÄ ¸ÊIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/InfoGeneral.png0000644000000000000000000000013112442116641021254 xustar0030 mtime=1418239393.143740338 30 atime=1418239393.143740338 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/InfoGeneral.png0000644000175000017500000000171212442116641022703 0ustar00mikedldmikedld00000000000000‰PNG  IHDR‰ pHYs  šœ|IDAT8Å”Ýk\EÆsÎîf?’æ³i¶4iÚ4F…6MÒꅢƈÞX)Þ…ª¼D þ"~4¢Å¥xa+" ^øiClÀÔ$ˆ›Í&$»&»g÷œ™sf¼8{â*zç ÃÀÌËçyæe„1†ÿ£DmÝUã+Ù?4ØöÌÄDfdìñxöè1¨|.çÌÍ̯NNV—çæï h5¤R]¯¼óvöé /oâPÒ %›V]c6§>þpã½W_Ón¥òŸ@+‘J}kzªÿ‡9Õ ¶­!P¾”#V_[üì¯ ß·úÆ“OiÏq"†]Ï˾üÁ»v°Œ¾ P»Ež»'F‡%YÌK ´!ð›»{dËáliö‹k€°ö3ëî½ðâýMà{ jKVe™»3<Ñ—Á)ì¡\ƒò GÃÁ‡ž!uüÌÙÈm¤Ðî<ñâ½'ÏŒˆ…Ê‚}…šÍ­"Ë¿¬ñÕ­mJ´"ì4/Ð>_ˆ²±c¥ù«×«ã™c£-±P•ÑavÚð‡û&émKrsÁ'ÕÜŒ’Z‡}éûÇF8ÄjRñ¦ÞžXʯtJŒŸ4œ;}„]Gòéu” ME@ˆgzºV£=+"û¹y ]CÆH¦¿ý €Ûk»øÊÂ÷Ä~¾Ê óF†.+Z*Ÿû½ìüýJ 6wmZš[˜[)¢u %ëz<¨z ¶Ö6B¹á+ p–¯ÏþY¬o•Œœh Trém³‘U½¯NyPq¡¼43[?6P…“W ÛÆxnÝÈT$ýÙ4§ú:XÊ•Qž¡>šJÕ˜âì¥+€t46Â/ç«vòÈ1»yx ‡@ò<Ê»;|>“ã“oªˆäa I|_(¨x°³pyªðãûÀ€°œÕëKñöGÏšxO§m ŒŽ±²!øcïv*‹!MX \ö~ûaq}jüu£Õ:PL=00Z™½•Ïf±»:Er¨Ok[+ "Öq|)P.Ȫ1…ÅË_¯O¿©}'ìÔ,ÿãs°€4ÐJµ¶LœËdÇN'2G;A Õ-'?s«¸téËêöÍy`È@ÿAS@+Ð4 +tbtx@ ØŠ@5‚Ý ÅjàÆÚ¯Ý© \Ûýh\¢ú µüÒðÈãÀIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/PriorityHighTemplate@2x.png0000644000000000000000000000013012442116641023551 xustar0029 mtime=1418239393.15374051 29 atime=1418239393.15374051 30 ctime=1457295922.645852897 transmission-2.92/macosx/Images/PriorityHighTemplate@2x.png0000644000175000017500000000054612442116641025205 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=ø-IDATxÚíÕ±KÃ@†ñ³`*8ê¤KÑÙ=£\Luwïª ê,:u×¥ ®®:v­P,ôЭS‘J-b>ŸáŽBˆi“Í~.×ï’!Ô™Y¡ ? kËXBa`…´‰X¸Î· ú0ék-—уMèéÞÌÝÁpo¶Îaž1Ϧjæ¢+C„½ '†|¢ƒ[éhÍ?<ÄŸZÅ;LFxA§ÒÔÚ&oXq)-  “/<áu„RÇ%žµÇ¤­‰ÝÀdŒG4°…yo_ µ†öŒa3:É7Z8Lù *ÚÓÒoL˜¥Ô.b~pÒ PÃ7#ÆŽSÀä kÈÚ:®a2Ðl×õžüeL[ÇÞ›¼ÂUu!¯jšY…+asÈ«"” ÿËü? Õ/H®&kd&LIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/PauseOff.png0000644000000000000000000000013112442116641020573 xustar0030 mtime=1418239393.147740407 30 atime=1418239393.147740407 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/PauseOff.png0000644000175000017500000000026612442116641022225 0ustar00mikedldmikedld00000000000000‰PNG  IHDRH-Ñ}IDATxÚ’1 À E;:98Õ=wpS—öÚ¡8ôù¶Cl@²6'áœ2&W¤—þÀ<èTýp%IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/InfoOptions.png0000644000000000000000000000013212442116641021333 xustar0030 mtime=1418239393.137740236 30 atime=1418239393.137740236 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/InfoOptions.png0000644000175000017500000000154712442116641022767 0ustar00mikedldmikedld00000000000000‰PNG  IHDR‰ .IDATxÚ­”{H“QÆ5ww:/ØÐ,MC2tEH´®Fá´D„(GË¥.»ÌÌRç¼e©kйÁ†65lK¦Ff„•7*Rˆ.PDAý—HFÐÛy>æ?å ©ÆyŸßó|烳ãCDÿU}D©(0xq $öûüãã—Sl¶õNL¤?ßáf3ÞB |%AaÙú:[@Ph[ûç–µÜp ¿'¨Èäg³x`À"ã½L*“ëë¯NXo<'ƒõæ»%Ñ+·æmãíw^TÜä~-ŒÝ  Xd¼•òUêÓí:GÈqû%µôNÒùöû3ÎѯXs3÷ão5mw§àa dç*³·%kJ¬Ÿê¯< {ÿS²öM°Ò!ª° rªu ‘¥÷ ç‹ ²sîiYÈâHÍñÚ+Ófç2uSJ¦Žbã“8mKײÏt<0`‘ùc‡‘D¬L×vïÌ:6¬:Tú¦Âvk¦¸±‡ö.%EÒŽGRYh2”¸~ÛHšú4ÁdÑ1Û·Hì~@‘ –~pŸSPÓNY¹å$_³;€d!rfðÀ€Eæ`¡™Ð.î¬ ÅÒ˜ƒ'¨¤¹Ê­ýtîò]:ZÙFúÚZ»*ÙÇ÷Ø'®À °ÈdëM„tq…|0J™š}/%3ïEººèC‘Éõý .]§‚Jûƒ4Mi4”g° Y <0`‘A³…Øf0Ój&epX„.çlótqSé*ìÔÐ5JαϜ̮‡lw­ XdE×åyxLRv2ó*?Ô°˜ÝThºFºjåíœtUÒ7\ã<0`‘Av®¿$Ë^mWŽÁN'êœtô\'1¶þ̯vÌ`í™ýÐì?àa ¯[* Qª4eoÕg,”‘_ó%by|ÕŽ¬cÏr+©—}/]a€,2óìH¡H²gMòîvme°õÅÆ]Cûõf‚Ö)÷Nb Xd¼íЗIè<ÿ€ðȘDWœbAQqkÙ,°ÈÌ{ãxÞ&öüúûñkBq*Äã Öâúúñ]ÐË$î< úÛû ‹é}f0IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/CreateLarge.png0000644000000000000000000000013112442116641021241 xustar0030 mtime=1418239393.161740647 29 atime=1418239393.16074063 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/CreateLarge.png0000644000175000017500000000174412442116641022675 0ustar00mikedldmikedld00000000000000‰PNG  IHDR@@`¹U pHYs  šœ–IDAThÞí˜Í‹G‡Ÿ·ªzÝ™¸&j Þ‚—øñ˜‹(zT žB.B Ѩxñ‚ÁÈ%j$ ~D“K^’‹Ö‹ A «%‡eQPD™Y§»«þþ[Ogó-K°À°‡b’‹ ¬I²€ûhû®ßÏ“ŽÀù48Ï\¶½Ž¯¨¢€ U,… ¸v¿DJÂÔ&™ï5¡´·™ílÏr›m™äš‹ë M‚%!!&ÆL2‘¿yéˆ{^$î*DÛWM†Æ(´€_¸×®Ó¤u‘í_$ýò–¶Àõ(à:×ÈÐaZ0p2Êø4:ìdd ^¡=` ˆ :¹Âª‰´`Xof=xÁ¬Òßă€û}&DlÍúÅ_Ì+êü3âŒfŒ•'B}=*%î#¯÷Ê[Ò_ •.€ðÿP ?>áa‰Ç¯÷yþ×iåŽýͽ®½ÍlÊý?ÁβIØŸ«ØÛwÖ¯ÜíÚÛÈ%-YÂÉ(ð—Qos[¶N[àÆ¥€„UÀŽKwà-OÇþ„YÜ*QQiæÒ-Ùnþâ~¶ý)»—¾ ÞçÂø,–. o9––®’-[°ÄCq¨6}¹ LŸKñôÖR-½b=ÜÿÆôl yKcúúô SÁÁñ‚9£«SšÌñÌ·Ã(1 š¤#-ÀÒK!8l~©^Lû"hÂŽ.IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarOpenWebTemplate@2x.png0000644000000000000000000000013212442116641024014 xustar0030 mtime=1418239393.133740167 30 atime=1418239393.133740167 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/ToolbarOpenWebTemplate@2x.png0000644000175000017500000000111112442116641025433 0ustar00mikedldmikedld00000000000000‰PNG  IHDR((Œþ¸mIDATxÚíØ»kQÆa/›i4’  ¢  %tú؉Œˆ6Sn±þ[!A›Dˆ—iM§…b¡`±j#jµ‹®¥)¢xé6YQÈ—_qŠáÀç|;+K˜žf9³¼ÌΞùfvˆÈH« VG²àÙ M†R°†óHÐFbôÑAbÖÔþgÁM¬A ZCÁ° †èBŒ¯¸… 8ŠqãÎá~AŒ.ÂaŒ‘BðÌO·-¼ÀS,â>c sŒ E\vÁ!xŒ d37|2ŸÍbÌš·ó]qYÃÌ™»‹]på"›:ã,6!FŠpЂuÍ=AÑÃfñ)ÄÒE0HÁ&IJErËX‡ähj Ö[I„å$z[PMS0r|ákì+ãøñi &‡;°K]Â4ZO‰¦`â°8`Ö¾„à'Þ+ ¶ ]C÷ÍÚE\…(õ| ‚>àâ6 )JUÐÓ7\Á¦puü(½ I¢ ›I<‚äèk v g`g®ã6!–Žz›Q¸ˆ¼Ì—µÍD…Wp%pl_Ñ@·:…{ƒÓ9·:ý° 4…lfðÜcXPŒ[¬¡v'V=Æ-ÝÀêá;²¹ ±¤Kù Z1ÇÂMkkñùMž’UÇ™‹‡ÿØ™¯Ž9Ç5nƒ÷Ñ{õQ½~« V·mÁ-K\²`"ɹ*IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/InfoActivity@2x.png0000644000000000000000000000013212442116641022046 xustar0030 mtime=1418239393.131740133 30 atime=1418239393.131740133 30 ctime=1457295922.642852846 transmission-2.92/macosx/Images/InfoActivity@2x.png0000644000175000017500000000240212442116641023471 0ustar00mikedldmikedld00000000000000‰PNG  IHDR((Œþ¸mÉIDATxÚíØËk\uðÉïÎÜ;N¦‰™$3M3IH›„$7O„”f‰‹†úÀÚÖ&!´¾VAt£ø@—n]ºv-ºÒnô?PPPPw&_¿¿Ü3÷Ü ¿Ð;YEhá·ßžÜøqîï´§Úýï7xê ?‰yI3ïÿ“™ºóµäjòůœõ6ÛÃ!ïˆcëéÞ ú}c™òÅ;¶Ig&/ez}Â;š'V2½mH®Js72“››¶A$ ­¬dìÏ´×3_¿›ÉW¹wƒòË„‡>Ž0óŒ_ðå÷ircí*ª·Ž©OÕ ¡|ø!Ĭhrô:ò3Ì{y7öö½ÇrÔçɤi0K¥ð ‰ÙPW6¨:òṡy™_øPQ½å¨ï£lš}:K³Ts4NhêbA²q©©‰F¨J3´*ù<ó’­JM™r©ô|Îø~C,ÊK/ðy™šbY<ßåù‹Ôó­=?°ï©Ký’­•ú%jR½Ë Bf•´ æ¨÷/@EGãÁˆ#><úw$ù Ë»*ª·Â÷ÕÙ{TÜýPÑ ¼|~`÷O@E¹ÉæûÃw€$æ½Ô㪷õÝä¥nðÖo€’ƒü`œýa^bƒáÛ€’IêÚê-G}1mƒ9ØùPÑÑðˆÇy•G<Þ’dÐ*;¿*ª·õ¥Ž†„Bª‹ùÖÐ"5Åb”ÉTj}H£4’ø4tê‰Ï’Õ¤¦B~êí$RS´¦xÂäüeZíS¬õó­9¡s2Ùk´Ôj?»DkÔ0œtm0凯JŽØƶ”±Ç#~PzÄŽ¼jmÿ (=âÔC¾ (’­¥Câ¨ïµyÉÚúP:$é¼ ¨¸ÁÍ寧™özý̸Þcm~(ý̤þP‡/J>Ô~0zó@É‡Ú Fõ*‡/J?Ô7¿TÜxîDw±cŠë¢}ŠÝwñ,­êÝÍZŠït½‹+5x8}ƯS£Ë ­e¿_¢¦hMå¸É &ë7¨Îçø.¶÷lâ=‹­ís”É],ËBúuk P²nyAÕ‘ŸórÁðõ/¥ëV¸ (]·yê»ØPwxHbÖk¼|É•{¹|ßµ/-²Vø< tºyLÚ áU@iƒí¹6xõs@Å Ãç¥ :òBgõÓ€’#6A5Ξ±¢#3ܨŸýˆ}¦G,uBØ‘Ÿh£^ÈF­ÓW2•²Qkýì‘úÒqµüÙtǵá}JˆnÔœºeb½‹ù,SiéFm¾ÖEqŽ^{Q]¢¿¦i¼ë¤Ëv F{ฮ3h7*é÷‰Gs ”`³ i¤p°I+¼%IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/PriorityControlNormal.png0000644000000000000000000000013212442116641023417 xustar0030 mtime=1418239393.133740167 30 atime=1418239393.133740167 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/PriorityControlNormal.png0000644000175000017500000000014312442116641025042 0ustar00mikedldmikedld00000000000000‰PNG  IHDR —/3*IDAT×cøÿÿ?6Ì@žq Kôñ(nÀ%ÑOØ(ê8ˆ†‹æß üEIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/GroupsNoneTemplate@2x.png0000644000000000000000000000013212442116641023231 xustar0030 mtime=1418239393.127740064 30 atime=1418239393.127740064 30 ctime=1457295922.642852846 transmission-2.92/macosx/Images/GroupsNoneTemplate@2x.png0000644000175000017500000000043512442116641024660 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzôäIDATxÚí—1 „0D§ZS¤õ!Íb¯³Ô{lµ°°µÔ&;ňB@Xvù¿ÉÀ#úgBˆæã¤'É‹Ld!)"è¹7)QĦZ“jòªt'sUð×5³¼Ž™Ÿndò ‰ô$ªX‡ïÕéݨZIµó>aycPª ;eyк¥3‘¼Š¼1i`§Dм±hÐÃN½<œ¶Z„¢W#;R$(@Y!6N0C*Da.A$:T(C].@1E(8/B'6$=U$;S ¯¯°1E`jw%."9Q#9P(3H "/Kj'7K\p0Nm3Rt#0 íDÏİж•8MÓ§mÛ'ÀWaG`¨XhÛìFAš¦ñ‰‘“qzÉUÔ,ÇØ•˜ b.Gâu°€;BÿÇŽ~ˆá¿1ü"_å²,{ßUÞyLŠãÇüœW­TL—/ßIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ResumeHover@2x.png0000644000000000000000000000013212442116641021702 xustar0030 mtime=1418239393.130740116 30 atime=1418239393.130740116 30 ctime=1457295922.642852846 transmission-2.92/macosx/Images/ResumeHover@2x.png0000644000175000017500000000134012442116641023325 0ustar00mikedldmikedld00000000000000‰PNG  IHDRr ß”§IDATxÚÅVMˆRQÎǨ¸Á•âCÆ?àÎÍÛ‰ ·"n…j&Pƒ~lÑH˜(„hQ+cBs!¹(¬peZQ(bþ%–5¥˜ˆccNóºO\\´{}"L|ð¸ç¾óÝŸsÎ=§X€HR€&ÀMÀ3 §ß¦©œÌ] pXÄé?IJbb@ Ö9ž–‰–X<½È©Ãáx  (ûÔÇ:±-6»H§Óï«ÕêWFãÁÌÛ‰Š;C Ò‡‡‡¿¬Vë]üNç—`sg|>Ç`0Àqî5 ! =çñx;¨; $ NH œóx<‰^¯7¤1Èf³H’¼„ð£ò ú …âJ©TúB³D·Û= (ê"e&yJ¢Ä¤RéÅV«õ^‰Dâ­H$r"|’Œ …L¥RE¶BãñøÈív?âp8¸8 AÓ¿ŒF£ñÖ¬Ó#€p8üÙÍ\.W§§èt:½^XÝ@ ®0c±ØkXìÀl6ßžM‹L&S“ÉdP à´PÆv»Ý‡™Ìæa0|Æår·—,{óƒÌ=À‚v»ý>OpЏ\®‡Ãáð'J¬X,~V«Õ» Zb©X,Ÿw:{Éd2_.—÷+•Ê>(Ôïl6Û½µµµm0¾ÅX™øßDá‰o¢NºMüÿð‰·úÖµîýµ2KIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/PauseOn.png0000644000000000000000000000013212442116641020436 xustar0030 mtime=1418239393.129740098 30 atime=1418239393.129740098 30 ctime=1457295922.642852846 transmission-2.92/macosx/Images/PauseOn.png0000644000175000017500000000027012442116641022062 0ustar00mikedldmikedld00000000000000‰PNG  IHDRH-ÑIDATxÚ’Á À E{OÎÒ)2xPhñê0ÔCiH!Hå  áiH²-'1Äd¦ z'͹gg Ó<4·{Rûƒ•“ý©÷~ !„Ë™ò•MöÅ9ç#ÄO/VHÄ ˆYÄ ˆáRñæ¬ãcÜ‚´ßÆë8ÐÀW^òÂT‰¯êBÐIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarRemoveTemplate.png0000644000000000000000000000013012442116641023336 xustar0029 mtime=1418239393.16074063 29 atime=1418239393.16074063 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/ToolbarRemoveTemplate.png0000644000175000017500000000043512442116641024767 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿaäIDATxÚ­“± ‚P…-štßE‚èÄå>GK«‹kK´8D{CЋÈ}ŒrRñvˆ3ü\®· ~øPÏϹ¿x Œ1§æÄUo¯+ Р#šZò) O`\°—O`àÂ+Xƒ%Ù€{(ì€Xì¼²fàè˜$–%7‡yo›y-e@C1³¾ÀÁ2ŸÀŠ÷ è(Fž±Ï øÜÉ€žbèÙyÁðZ/´x…Ú2×ÖaJ©kPQ¼û̬ {• H@û…yË^ û )0ŠI2’Tì<5u”•œÄ†=õ÷Ÿé'^åò²i‰©IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/YingYangGroupTemplate.png0000644000000000000000000000013212442116641023322 xustar0030 mtime=1418239393.135740201 30 atime=1418239393.135740201 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/YingYangGroupTemplate.png0000644000175000017500000000025512442116641024751 0ustar00mikedldmikedld00000000000000‰PNG  IHDR ñbä+tIDATÁ1 ‚`Ð7šZ¼€""u€æ6·è‚ˆc¿4ß¡{­ÙÛÛ¬¸‰—ÆA¯¸A'⨋ˆ3€ÞÂGÄî¨|øŠˆx:¢òeôVqW+˜DÄF›ŸŸÍ4€?¨%Í‚°IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/Magnet@2x.png0000644000000000000000000000013212442116641020651 xustar0030 mtime=1418239393.152740493 30 atime=1418239393.152740493 30 ctime=1457295922.645852897 transmission-2.92/macosx/Images/Magnet@2x.png0000644000175000017500000000742512442116641022306 0ustar00mikedldmikedld00000000000000‰PNG  IHDR@@ªiqÞ pHYs  šœÇIDATxÚÍ›il\×uÇoŸ…nCŠ‹DÊ&)Q½J¦¬Ø©%Û•mÅQ„¸@Ð͇ ‰4@û!h?¤@›EQ$¨‘ EZ´Nê 0NÒ8ñ*KNGÞ%ÙÚ,®MŠ;gßÞÖï çq<Î ©T¸ gæ½ûÎùŸåžû¿÷ TÐl(t;ÿµPøÿÿµyäÃ#£í~(+£PáÀ ¸mÀôt«’]'¥ñÈ'²ûÙô¼|åd“+x–¬CÀ€à22¤DÈ9À°]Ô¯7Åżalð0Áo;ßg%ˆ©tå«÷AR ü´ÆwíþãóßøËou¿ôÂó[OII$>aY¸ ) ëa^ <Þ(ºr«&øu¨7¡ÑT”¶Ùý]yôè‘-§~ÿÛ®ÿýÙ˜iÓ.#Pæb´„EQì?ó'~Ô~ø¡žD"ÁüÕ«¹Ž×Nü¾û¥~Ù06zZ„E¢2$]¯Ðc3€( CÙµvP‡Mé–ðŽ+ùìÔý>ìí uvvòÑ{ïeö~ý«_–#Ëïh0Ó)Á ÕŠ<ÀÁqü&„—Üs”[oëéííE2êÕƒoyô`àó£ÛŸÿõóozIÒõY–Œ³×‰Á š(r2¡É†–ù[o¿÷ÊÃ|vqÿ;:¶m÷õô …ˆF£¾+Ç>ÿ¥mÿýäUâ~G½”ÂZ,‚6 v_üÎÿÕ{ôs]mmm«¯³mæææ˜œœ$=1ßvòø«=/¿ø¬oaáf• ·ú•Xß%õ´š@ÿÇ÷:võðÃGÌ;Û·nÝJgg'²¼ÚŽ™L†7OžÔÿòW•xü”¦»Öð‚’`€Í€ÆÄžÁ{Ì]] d³ÙO\ÛØØHcc#É›o®Ÿ8öڱǎ¶ž8þòÀ¿ÿÛ7“ ;¡P3  Ð8ùÈgŸøâŸ½¡£Sëé줩© Ó41MsµU¦ÎNeþöýâÙR°”‚l©\ –zh $ÝI~-óx(“ÍfËvY–éîîFöùÄÉ{ãм¾íu¦ÛµÚˆóNjšÞ~Ó>]QµžžÀºò„ÃaæÝÈ‚V‚‘5Œ]êK!Šõf °uiÿþ;:B¡’Ö/n±XŒD",Ë(„tÐAÜZ£õÏ‚E…:Ëç†ÁÔÔëÞ¯ª*æ¶î–ÄÀ®¡À¥‹1Xns¦D³,)Ò ZŠìÝw¯±I¶,«"fggE¡¡QJ‚?r„¥³ß(~4ðIŠ”e™¹¹9š››+º¿¡¡å¡»?í»tñfc.NÊr1ê3 à³ 1²wèî`0X‘ò–eFñûýÈàË€œ1 Âr Ê'¸“Ówí¿³ý'?n1!¸ ñf''­í‹ @QZ£ƒƒ»ê¥"’É$²,£i’méY°Ò`ÇÁž¬€4sKlìØ‚ªbYËËˈ¢XÑ8F8\ŸèíôŽ ÇªÖ»žY @„¨ƒ¸–Ý90(ëTÃ00 cÝÅãqš¦!¾÷îHr 0#`Gjà [S‚\ðÜi>Õ+Ë2 ÔÕÕU4ŽªªD÷ ÞÎèÈ €<_”W0 ˆHÙÝ»lÛ^±ìz-•J‡‘$‰ì™÷‡SŽCn ¬Ë5p ì¿v¬¯+ÑÏœ¾T§iGòõG:^× òSdtÏ-»Í_þB2A4Ëp ˜40ì÷ßÝ!:±þ¨½}(Á Š¢ Ë2’$!ªøE‘@ àxÃùs#YH¥ —ûoj¬çÁVÁÈ@*5|y4lY†í÷Ë@€T*…¢(ŸPØ0 t]ÇÈfÉMŒ“¾ŒqùÒÍ"XY°ÍrÓà“@Ø!°oíe ˜‘$„(ý;ûûQšš‘$ I’°m›@ €ªªºn¥FGFsÌž©±Ê/±3`èʘfTœŸ•n»½«®®Ž™™òáiYz"1:‚>|}ä2ÆØ(ál–` ÔÓÐ3#¹rœíÐw?häAvf|Œ©ñ1¦^y‘i ¶e rßä¾~ä¾l9pMÓ°¦>^ŠéúbR90Ì ¬êÁÎ:NATŸžš íï …BŒŸ=ƒ1|cdcdaò*[,‹.Xéª;Î+À«°ç}x5QDìx2 ̃´Û‹*†v·ïÍWi³³LÍÎrí×™Ntu1ø•¯±½µmz“Œ€±‘…PÌaa¬dLX^»ºø›“C¯ÿ{´žÿí@§ÛÛJ”µyùÛ€fØ3RÙ€“$¤v¯SÀ7º}ðsàüÔÇ¿ýwHŠ2nÁ’阳Xþìc`Å «BdâÉÿÕÿㇴ)½–¼ÍÀØe:úŠkz€û£Ò ;›ŠkÆ2-áÞ¬Sº>}Í1^.ÖÅ ògÁ 9KÙxÐ0Æ 6@°’Šh^ ³@iäNØ^W!6’ÏÇË0?YŒØ&°BãNR6\ ÌÝæynðU0†ää'tMBd­±Øâ«€¬ëzù„“H¼ÀnJ‹9ËXÓQÕ#l¦ / 9 Ü\ô2ÜŸ [ë@¨tîʹ7jÒ¶ƒ‰Íæ`Û`Ô<®š­€ Ð[/8ñ‰XaZýÐî¯bà¬+ŒZøœÙdåóo§ ­z7«Óïi er€ˆíöU1°éƘæ)^®vršGp» 9Ug&hf½$¨A£RÅÀ‚;ˆ¶Å´y€ B­È@4¹ö×Ì"øÄ*ÎgYµPh\§Í‘0Ô{C 9Ý­­:Ö(„Vöþd¨“6à-ÐBàz[xhÖjÀv®× Ap¬Æë·A7«7+7 „-Э=·J¼›¼BIFȆ¤Y%>w+ v{P6)@ì…]jQò­TNk ‹”À°k ŸwÁ>‡7É ò%ºtÜO0V•IÐp®MP¢ô]Õtˆy÷¾+é>O-à‡º!¸Ç5Ðf5±Â}°Ou­æ¯RFÓÑ-¹öD¬*Ö<‹!ø |Õ+¯Z_~Ó@VÝ/}UÊh×`‰¢:EôVZ€…™jP<ņ Á‘ݰƒÂ… Y?ÏÃã…9V«Á20_\¤{€5S–ËUyÁ4þ þÁ3A°¾ò5øF+tjDŘ‚‹i±h¦°bά^Cd=ap'~¾´@‚½_„oæÇÍÕàþùs< 0NÑB­˜P±c Fª@pÿz¼€¿€ï> Ö " õÃMÿ Oû@Ë[?U´ª4þuˆ\Yç€<Æ0œ×k@YvP^É>о ?ýJ!)Jë±2åÝ w= ÇÛ +hÄý±Ú•†Àðx@É0ãœÎÖ€Ë°è øÿžz~²z)œè*®ÊD@ê‚ÖïÃ?þœl…®ü8iwÜZb?|èÞ+GwJBùúB?gÒR!PíêNÁÉ4u.q™o‡à á±sðÊoáÅ·ál®‰ÛÓ4{ÁƒwÁQÁ¹½°ëŒ¸cײÉ>€7)³K‘¢+¤!yÞÙ÷©5n/8?!‡Ø ÞÃ!è.Ç¿ä&:Ù3“ØP>çÐêgÝ ãI€v9ò‰3õ2<ó)øÔÖ³²ÛsÀdq R8÷ê/²ÄFZ ø5<ç$k±Hå )°¡µvKE«ˆôü¼](^”l°ç€Q8ÿ üÀMEqJœ×àt×e’ÏÁSKÍyJޛ޶öÏà‡nt¥JÍå<`¥8É9‰$Õ÷*›h¡ëÙÀ›ð«ßÀ3njÉ[ß*E––›‰@š„k]ÐßÝò ®|˜†Ÿ‚¿7œ/×ÌjXµ*»vÁ§}’nPåuÇÜé§à[‹N±\Îú•Îéq{ÎÀ!4ñSÞpLm>ÿ<┽‹@Ô³‡j× @þF! ™1¸p³“ntGyë9øÞYxÙU>‚Ãêå˜éJÈgO!‰Qø°öËo€˜_‚ÜÏá_>p”_p]?áqý àÁì$.ÁۭЯB›¼Ésx%Ýrƒ{f ß+¸}>ëgÖS¾¼ ˜8§·2çà” v Ø I@«GsðÚ³ðOËNÂ[p•yâ~ÝÕs5@cÙ`]…Ë#ðNÚèt· ®«âS0ñ<ñ}5,ƒKíèd]­æà£÷á¹Ëð†í(s“]ŒÂ+rU½¡R+]IÑç®pCn¯‚!h€ƒ7Á]ÍЫ‚ xHÁRÄ 7¾\ÝÑìÚ¼3 ¯Ï8®žr\Ì£xÚ“ð¬j•ÙÐ~]ú#èPçz‡ЂÐÔ»[¡· ¶5@›墽zË¡ã#Ë0…éE»—ášëiWù¤ @^ñl)²ózà ‰ü‹ŒŠ „߀{4g…#Í;€Xb Ýö$.¯dÜž çÕbŽï Ŭ® „êÙð ”Á;ƒzö1Ñ]ëæ\…óŒNÎs݆Ï"mæ!¡h©/yx¹HùRXE³Œîñ„âMžM;„µÙ§8J±ÿQ*J-ïí¢øÞÔóGÿbTP·–’IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ResumeOff.png0000644000000000000000000000013212442116641020757 xustar0030 mtime=1418239393.134740184 30 atime=1418239393.134740184 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/ResumeOff.png0000644000175000017500000000043612442116641022407 0ustar00mikedldmikedld00000000000000‰PNG  IHDRµAåZåIDAT•c`€ve3{ 4²Ø€8ƒ-ƒ*„‚i[ \ʯßo…²Å!‚u19ƶ¬ÙÿýÇÿÿ3׳»‚u WI±¹l;öªf€õ*3d4Îûÿÿß¿-G>}ùõ+oÔ`3 û€Œ'/ÿÿ¯ŸËàpô¼UÜöPÉÿþÿ×M`pàñ@8$ 6öö£ÿÿÓ»!‚Üî–0cÁÊîûÿÿÛ÷ÆùauU3¯ÝS†9ìF‡¶…þ€\úå[P54 Ø‘A1<¹#©C"9P‚ ‘‚gÀ½åcñ‹ IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/PriorityControlHigh.png0000644000000000000000000000013112442116641023045 xustar0030 mtime=1418239393.141740304 30 atime=1418239393.141740304 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/PriorityControlHigh.png0000644000175000017500000000020512442116641024470 0ustar00mikedldmikedld00000000000000‰PNG  IHDR =ç¸LIDATÁA € ÀÃù0MC"胿³ƒ HA 6øöYàõ$ŸO.ÓtÂnéºe§˜ªj* M5ƒÛl?ðaNHâÑqIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/PurpleDot@2x.png0000644000000000000000000000013212442116641021354 xustar0030 mtime=1418239393.162740664 30 atime=1418239393.162740664 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/PurpleDot@2x.png0000644000175000017500000000254312442116641023005 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzô pHYs  šœIDATXÃíW]LU>wvv—ågw¥¤?B-üI ic-ÑžL4*V5J}Ò—ú}—‡úª¯5ÖÄÄÄĤ‰&Z£1´MÛŠŠ1€¥,ìnwwvwvvgÆóݽ˜¡,DSœåcîœó}ß=÷Ü™eÐ\×¥Û nóñÿ„;Áê±míŽ:0°ïáèSmO¼öÜþ§‡_¸óY÷Ń€1bÈóol`ó¡æÀžÙöú{Þ½+v´¯gonï—À1äÀš¤€Göö7>Ó~üÜîPÇ[c‡£w·ßO‡î=J=ÇzéH߃=ôÊrà€ Í£¬Ýª[¡Ñ›Îî ¶´Eº©­õ íï줎#]ÔÕ×MuJtõwËrà€ M˜µÊGl·):ÞöøPØ×2ÐÜGMµ{(ŽQCc˜Â»Ã¨ Srȶlò󱆦ˆä€Û¼ƒ }²í±¡зëXs­>Ñ[aD!QGš£‘]°)=—¦¥ï—(>§åñeŠ_[’1;_–pþA[§E^éoímÞl.m³ÖÇ‚-'ê|MÑ-FA·žÜ¢KVÊ¢ì\–ã+”ø!A©É¥¦R”øqEÆ\h eHs 6¨æÕ µÐóuZ”ê}rUNÁ¡2›nÈX0ȘÏòYaÞ1äÀhá/xVS€P±€_…´ ŠZÒ…N>6t-—ʹYY‹¬ #­€1ÇÃêÁ…Zx°×}ìégøÖ±Y~Q@„*“óG¬uùÇá?£¶KNÙYÄÃnE£Kx©´j;àB#Ÿðó…à3~óǤIpn4‰ G(MEë'x¨o‹mth›Ü˜ºë:ª"6áÚêw|ä·yU6ÎkQ‰é’®*EãpØkƸžó 6*@x: YnñÛ-UH¼*MeBV€”ço p¡Á’[ü};O,Æ(g¾+8Yâ–{ë¼ÊZž$š«¥p>Dõfƈ!¸Ð@ œó,rÓ\ÏÙY(Ì–±—Ét d³‘«ÒØã^eØä" ¡ xŒ˜P«hᱟÿ\ùº[u@NŽÎ&®Ž.—®¦Ê‹Ttùl)ø«W³©¤qAÂýëÄ1äÀhÙãÚHâÊ(<•÷šB6+›_MŽœZ°¦Œ¤³Ly2Éò•Éô—ɨ1ɘTÔK|]’cÄ\h I^~[ù••wU°…Yãúo—’^ÿÕ¼bÄ”Ör”÷›” š”®ËS¢Þ d!Lj!¸Ð\J^|uΘŸc/SyÚë·a£›ÐQÕQÄDzjòÛ•/ßÏÏÌ–§h‰”ÔyÒ@Ž2Á¼ƈ!¸¬ys"=9©&/ª.8[àÝ‚<# Le¦:;÷ÁKß$?}g4~i£iûšqg%0FlŒsà0÷eÖL¬ê•W©š›pµ[µ BC¡0¿øÅ™ÙÓƒŸ,ž9y.þþ©¯R} `ŒØ{³§O€³N—W^N5÷€wPq‘f¤7Fn:;óóåÄè…ó‹_`Ì1¬8§87•&ãY½³’¶†IežVæ«-ΨØêÄÞÉ­ö¾šwÂõ[±º²cE7BjݾÿíÎÇ?¥Õ¾»ž§ÂTÆiÕ‰žîjëJ·ZyÕ¯åÞoGÏãiªIr yu]ô¬zËÉqü ¥¿SŒÒUšIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ResumeNoWaitOff@2x.png0000644000000000000000000000013012442116641022451 xustar0029 mtime=1418239393.13274015 29 atime=1418239393.13274015 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/ResumeNoWaitOff@2x.png0000644000175000017500000000124412442116641024101 0ustar00mikedldmikedld00000000000000‰PNG  IHDRr ß”kIDATxÚÅ–¿kAÇ×E Q´°„€× ZúXèv–ZOü]„ˆˆ‚1*Æ&ADW=“˜@…h’cIöÇÝÞÞÎ|9NÌ^vÞÎ5qà ÇÍÜûÜ{óÞ›×±t¡#O†PAÈr„\!Þ”ÛüÎnž1rl‘›¦%4-MM7c¶ ì*‘Æi•¤ ]à¡0Ïheð$¼Ë¨3¡´¥¦`±Žõo/ÀÆáßÚC‹[ é0fxFåâ5•§Çò<íjšZwV4ôDõù)°ò$þ-Žšs KMêNÍå@‹]ZèÕYðpÔJ~¼†wc›ÊŽõhP©ïßÜd®ÝÅý_îíW•Œ!Ì»¾lñ;ÚYñÄc‘½U^$ÐV&ÆÔ >‰ÕQ}y&/Ùl t²6ƒþC™FkNO#dõ™‘eaœEpÿ€Nv;èfmÆcýig^QḚ́H”­ºÈ•@žµÉ¼Ÿé»{ÐR‡C¨½»"Jam;-+€ç)`åÙ‰Ô¢Ã@eH‘Ä)`øä(aH[®2iØÂ×0z[Ô3Z\G&ª,d6¦s¦ê³·“0¿w’Ù÷Ô½ÚÊÂ÷{w,VVž@pgßÊѳÑð9ð8@ô¦›úS²µE#糚—ðâ#âÑ>ÄãÅçú”‹¹SÔ)ݼ»× þ|W¯‡VÊðo良³4Ÿ§NT‡,ðhQ K~e²;oä0Ûz€½«›ø4ê“`s_ÀæGº2p\DÂÐ}€éC_ôˆ¡=D鉢V{Lüÿƒðªú¦¶6ô,×IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/GroupsNoneTemplate.png0000644000000000000000000000013212442116641022657 xustar0030 mtime=1418239393.154740527 30 atime=1418239393.154740527 30 ctime=1457295922.645852897 transmission-2.92/macosx/Images/GroupsNoneTemplate.png0000644000175000017500000000024512442116641024305 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿalIDATxÚÅ“+À@DˆõUÜ™›nzL‹xMj*ȈN2Ù¼É~ÀP¶Ïvµ¯¶·7ûÇ‹µ¨Í7|´ƒ"·o95“FZØ\kEêT –;Ïå°ÀsÁ’¢œàÿ€-lùåo”Iney˜äq¾ñH,ݳ˜èhIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarResumeAllTemplate@2x.png0000644000000000000000000000013212442116641024346 xustar0030 mtime=1418239393.161740647 30 atime=1418239393.161740647 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/ToolbarResumeAllTemplate@2x.png0000644000175000017500000000110512442116641025770 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzô IDATxÚÍ×ÁK”AÆqWy·öfPxè/j |/¢­ê’ž´.¼H!輇 ºÔÍktð"ž\ÈÀ“’zDjr‹ÔÝ_ßËB ÏÌ;¯K¸|N;ïò¼»3óÎÛcf—ª; D¦€UÔðMŽPÃŒ ¡ä*Ћ)lÂ"íbI§Êø ؆yl |Ñ)N`æðM˜p‚ûy ¤8‚E dû0¡±ØeyçáíÜÀr D9«@‚ XÀ>b÷0€Ó‡×hyæD*0 øŠ[ˆÉ#ü‚9f| Kí=® O†ðÃùžMTæñäIoaBª TaÂÚî|ë0ª*PÏ17 ¦ñ SÎg“«¨¦ ÔÅÀÏpSŠX†ú'×ênijl^ÀÍ‚Ønb ©¥ ˜0 7îJy‡]Xê/8V³n~Ã:t, ÈYûnaZWÅÀ¸Y‚EÚƒ ‹ª@ųõº¹-¶Xµ|_¶öŠ*PÄ<îy\oTwPÄ71æEßÃh^\°Ïñ.¦ñ £¸†v^Á„ùÐÓ°„µs¡±yˆs˜c¥¬É0NÅÅ[BVžâ¸þñG²Šg¢5±„q\G;ýxŒÕÀ!æIÞCé°€Ÿ¨£óh`âË>–wç‹I÷¿šÅç*Dâ \ª¿ÀåK•«`IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/Transfers@2x.png0000644000000000000000000000013112442116641021404 xustar0030 mtime=1418239393.151740475 30 atime=1418239393.151740475 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/Transfers@2x.png0000644000175000017500000000137512442116641023040 0ustar00mikedldmikedld00000000000000‰PNG  IHDR@@ªiqÞÄIDATxÚíÛOˆaÇñÉÍp e3DgLVÙB· d£v !BXÜ÷ä¥c·N]Š ¢[ •üC—®…ÛÉK^+Kl£‹°AÑ …É6:=1u0k|`|çø€0ü}á=¨Œ ªª¥síaͨ64£cgÀ^™_;1† oìs¹\ÎP($ƒA™EÚ6‡Ã±_ÛŠ›mÓéôl6» TÆíj[µÍ¸]¡ÊAýx+DEÑg k7 …‚º½½Í´aØíN ðûý‹ 0Ü@ðȲ|Ì‚ÂÀ¯$IÇ-à0ðÁW oXˆé·¹\N-•J,ÓˆHàç¿þ ó<ÀàË·¹¯@Q”I˜`æêgrk·vÔµúD@šñë;d’·;êëú#è\|¨’êv»FÐØx0 ÕjµŒ ¸×'µµµe}€Õ; ©jµj}ù¦Bª\.A`ñ®BªR©A ù¨OªV«AàÜfŸT³Ù4‚:¨HµÛm#èœx¥’êõzFèðï<ÿ=€àþ9œ–ÏçÕz½Î²¿h4Lƒÿ>FN§Ã´b±Èðÿ õéã4™|€È“Ø4¡ pô鲙ѸÖÞ03úWÞ¯›}€ËofFàÒó¸™ÑXÚ@üCÚÔðsòï<ÿ=€;€ÏÂ$+ˆ xEQŒf2™ïÚ +жê˜ð€…T*u#0?^ÛªdÆ æÀpœk ÖÁy$Án;–ôM9Ìc„†X«ŒXÁM1?›]@Á,ðb•0žˆ2"‚›Â¸Ñ‹›E Øñ…¸ñ\ø€„ä)'!ðàFn¶ÿ ¾^‚RR}IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ResumeOn.png0000644000000000000000000000013012442116641020617 xustar0029 mtime=1418239393.12574003 29 atime=1418239393.12574003 30 ctime=1457295922.642852846 transmission-2.92/macosx/Images/ResumeOn.png0000644000175000017500000000044412442116641022250 0ustar00mikedldmikedld00000000000000‰PNG  IHDRµAåZëIDAT•c`€>W††: ̲ø€>CCŠöé* è1ÔC¤¦¾tZfÕEÁ‚u16:¬­¸²ö׿ÿY§X›Áº†»‚¤Xšëonþƒ!»Àº]²AŒÈý›ÿoúW{cåõ|¶B-ÉfºȘÿaóÿˆ} ÷5æÀìÊ@$7ýÛü_~*CG+\ , 6væ›ÍÿÝ7AÙ[ÕgÁŒ;ÈkËæÿk~Eí·^º{êK©I0A½spã_KWÿ´\ >¤@ëwÙà²A°9P‚ ‘‚gÀ]wÆ\IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarRemoveTemplate@2x.png0000644000000000000000000000013212442116641023712 xustar0030 mtime=1418239393.162740664 30 atime=1418239393.162740664 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/ToolbarRemoveTemplate@2x.png0000644000175000017500000000076712442116641025351 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzô¾IDATxÚÕ—±jÂP†µiÐt)}E\:ek7'Ap˔ͱS /й«CB‡ ¥C:H]ìÒÕ]ÌТ½ý‡ÂáÄ›ÜB|nþ›ÿ'÷†{RQJ•Êñ¬l"k°@„`6à—ØÐXH«È6À ¨”¬hŽ7€ –@²®i€.Ø•“èf бð°o0wà4ˆ[{&bÄ Ÿ6€›`‘Ù©rÀŒôRWà ,„É@WçàE³ òH 0&=¦üDG¤×1H P_LüJ‰Í9äQ•t˜p® 0ÿ{6Ö‘ ™èIc^ù¸JæLäkvûTc>é}vo.X3Q;Çn•cµÙýµàÀDŽáš€+þƘæ PŒZs^5®•l™¨i´áäj2í6Õ&4Ùp¼²l‰Ʀ漄¥ ¥=áä›`ÞNÈžÀâ]¡9¯Hè–¬¤Ã((Øü^˜œ: m°,Ðü ´h¶QCBÌR®y”¹!a埄–l |Ðu¢Ec#©%£gyY›R½ Sbà•Ú–—úcò/~Íʤü­%·bbQœIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/CleanupTemplate@2x.png0000644000000000000000000000013012442116641022517 xustar0029 mtime=1418239393.12574003 29 atime=1418239393.12574003 30 ctime=1457295922.642852846 transmission-2.92/macosx/Images/CleanupTemplate@2x.png0000644000175000017500000000064212442116641024150 0ustar00mikedldmikedld00000000000000‰PNG  IHDR$$ÖÞhª3PLTE£FÉtRNS 0@P`p€Ÿ¯¿Ïßï#‚ŠIDATxÚ•SÛ–Ä ó‚J[«üÿ×ît]¶töL^*ŠB꾄Ï>ÔZ7|ì¤JD=%bT+'3@b€Q¬£& j×®Nš¸Y°äTN Æq5'@§pðvÎE’@Wuwã ;…pHÛoýAhónঢ»£t¾› DÛ—-þÝÁÄßo™Ð¸I—ÚS—õ—TÑäëwŽÝgö¶û]Ç5 A×ës°–Qû€‰¨ýqOn]Ü,×Ó¤±ëóAâR¡çµÔü#Éÿ“ü¢Q2ÂNÂídÎ(Ó/ª$Z(S‘RÈN“F¨+‰µ6VIܬ:ì—NÛéÉTx·Øe÷ •Üÿ€Ç$íÝ×øX ¬Í^IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/PriorityNormalTemplate.png0000644000000000000000000000013012442116641023550 xustar0029 mtime=1418239393.13274015 29 atime=1418239393.13274015 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/PriorityNormalTemplate.png0000644000175000017500000000015312442116641025176 0ustar00mikedldmikedld00000000000000‰PNG  IHDR Vu\ç2IDAT(Ïcøÿÿ?)˜¾€ƒ! 5PÜ@Hƒ’b ªÒœ4ã Ù%cyiÏIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/DownArrowTemplate.png0000644000000000000000000000013012442116641022500 xustar0029 mtime=1418239393.13974027 29 atime=1418239393.13974027 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/DownArrowTemplate.png0000644000175000017500000000020612442116641024125 0ustar00mikedldmikedld00000000000000‰PNG  IHDR _žüMIDATWc`@4ÌÈ€þ£a&:*b., x r °HÂ0HŽˆ¯a‘¼•m þŒ$ù*†¢‘D£KÂÀ (Æ d ØÞ*’tôV¼IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/YingYangGroupTemplate@2x.png0000644000000000000000000000013212442116641023674 xustar0030 mtime=1418239393.159740613 30 atime=1418239393.159740613 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/YingYangGroupTemplate@2x.png0000644000175000017500000000054212442116641025322 0ustar00mikedldmikedld00000000000000‰PNG  IHDRúKÝv)IDATxÚ­•±kÂ@ÆßE¡ÖµPhg‡B–.ÖJ†.:DA—èÐ¥ÿ€ VK†bÿçô¾áw¾‹äƒß’{ùåÝ%w‘¦i:¥sa(=l@M6¼–±&*`þ v¬ ÆB¹±#0 ko¼NÎÙ›èI(þeÝ\Î’¦”ÈåŒ=i&LìáJâ’³~O—<})L„kJ—|„[àÚtI§«“G SoÚr 9V€;C8ðê)´9€WXƒ)³_Vê=T> Fª½ºdr…ðEûlè’pl)œ*Ýé’¶]žÀ½²õ&ç'M)|W‡JÛý”]}ƒ…r|U¼WãúüX²f»=oÁ |Ú“Ô¼6cÍUqà™XÝtÿ×û¾*"ý$¿êIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarResumeSelectedTemplate.png0000644000000000000000000000013212442116641025014 xustar0030 mtime=1418239393.154740527 30 atime=1418239393.154740527 30 ctime=1457295922.645852897 transmission-2.92/macosx/Images/ToolbarResumeSelectedTemplate.png0000644000175000017500000000040012442116641026433 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿaÇIDATxÚ¥Ò¯ ÂPÇqQ‹ˆMÙ[LUð- A}‚‹¾„ŠbóÄ,–“`³ 6Yš¿aÈE¸»÷Àn¸üàü)ˆˆ•ß#¥ÆhA­\ Dæ ðàã I¬Q14p„hè誸B4bø(éæÄ}l!x¢gšÁ ‚5eˆ'8¦!:ø@°Qþº(gYcovÐTz ^hâ¿êX¥t•6î˜ÀC3<02ÝÁ±fˬ—èb t3°aðw‹eµ@ÄË@IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ActionHover@2x.png0000644000000000000000000000013212442116641021657 xustar0030 mtime=1418239393.163740681 30 atime=1418239393.163740681 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/ActionHover@2x.png0000644000175000017500000000104512442116641023304 0ustar00mikedldmikedld00000000000000‰PNG  IHDR D¤ŠÆPLTE ***<<<>>>???hhhhhhwwwwww|||———®®®¯¯¯±±±´´´ÑÑÑééééééøøøÿÿÿõÝ*tRNS%9?@RU^_cdefglxy‰‹‹£¤¬­°²ÀÎÎÏÑãñòû˜HF=)IDATxÚ…S‰’‚0 ­Šr Bº¸rˆ ýÿ4 «ÀLß %M^›£‰0Ø»~§iúî^¬q .ðÆ%8.Ì;//$ÞîÓîœðgÇØO+;…èxÞçÉ~ůՄ–79ìŸî¿O%@£ @9ÝɡGv¥ÆjM¨¡•"†Gù%dG<å ƒ|âJŒDgh—“ZaÒqB¨>帴%Uì \ tíCf™|»®ðaF…ÚÛ,ÞP¬Xí‹P×§mêÏïê¦íQ EŒ+»•À¬@1©!dÀÈ !µ¬.(È~;ÈŽ‚ÜHóï+M.T¾,TÁ…²–ÚöX›Ï]}<÷¢a~ç†ÉÿMÃX[ÎÞ´ë¶ïMÛ¯–ƒc=ûðZÇÿÜšSÈAÑIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/FavIcon.png0000644000000000000000000000013112442116641020410 xustar0030 mtime=1418239393.143740338 30 atime=1418239393.143740338 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/FavIcon.png0000644000175000017500000000427512442116641022046 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzô„IDATx^í–[lW€¿™9sß«½q|iœ:v\Ç&Ô8$4¥‰Ú´…¶¡j)¢©xDBŠÄ ÷D…@*•@E¢ˆ *(E4½(iCiÓ[œ¤±±Ó4‰oI6v|w¼ë]¯wggg˜u¶jÀ­šðÌ¿úv.:çüß9çßÕáÿqèšúȪU¿ÚÞ¶ó±[oÿfïîÿþü®]?Lß}÷î[¶ìÚÓаå¶]s= s…!ñáa­^ݺµ®aóÛ·}êž;îÚoiŽQ_C×5 ‡‰ÉÆÓôö&sÏ=óÜþ¡¡7~?6ÖwÈýÏáp}[[ëí»×4ïøÒçء߾£žˆ)!IHàƒøË ŸÅ¼G_ÿEö>Ùíw¿ùì“ÉäëOOö_µÀš5íÛÚÛï{dmû]7|êc|¢S`kP,•B²ª)ºç Ȳ„¦ TEZ‚!ŸƒûŽñÎá—FFFžýv2yd+™•A]]û¶¿¼§dÞÔå5]Ã’±Ä|ÞgzÉgrÑ#U”H¦\.dK O;d%…dÚeß±IÞ<}‘´YUæº7±ñ–ûš«k>³v^‘@8\ÝÖØ¸óÑ…RG“Ý|-×m¨GG˜ÊËÌy‚¼a2[R9Ÿöyídšçßš$9ïâª2.ú'J•Xð :ÍÑ3&—êfø¦_C}ׇ X]ŸÝÝÐ|Kgcg5-õ,é¢Â…%ÏÊLf$†§žxi˜}o&YBàÈ:‡ƒDe‘ÓcY?0ÀÓÝ#<ýÂ!zÎ “24bÛ×*ZëO›ËBá²…¶Eb;~qèÄ‚2p~mUñ†*P$$EÆ“ à¸!s]S‚HÔÆE& ™$QR…C§'HžŸ&ëø\(z%sBj´Uõþå8S'©„à½Ð=¯æÁãÃµÔØ€7xýH/zmˆ¶¶Z\À-®)øÁ€áh(Hªܲä¸ô&çÈËZð,³X’qAWÁ<Ðt [ßòõlöøs@á¿¶ ´Ñ~/«×áGÃ`ëHÕ!¦3 AÞl2yi™¼+1“-’^*1‘vøû+ƒôMÒýÚiòN¡(hº@64$S‡EJÖ°V·ß¶~ý-+j@Uë6jˆú±0X:ª¡’_Ê•o—ÑdÀÔ4¢¦‰‚^?Éäè,¥B‘pØÀ¶4,]`jÃȦSC‰Å©km§PŒÝ¼B@Ñëoð °M0ËÉfÀüô,§†“º¿ì¶À2@W}4ÍãèÛ#¸Ù<‰˜E$¤2Uìÿ@`*ÂRq …´/X×±ië Y¯Ù,‡¢Ë¦Â؆ …<=Brf Óð±u8Ü;Àó/åä`’ÅTŽD4DÈÔ e –dU¦J¨,д±™®;‰&ê6¬0cMZ¼ÅÒÊ3/›—g³,D>yž‘³ãDMÀñhl¨%=»D˵ ZšTÇL*å™W®J9ù²DÄÖÙº¹ aGQ¬Ðꕪ&IBF¨2–®,CT®:ºl+1Aßà87o½–;n¬¥fU„¹é ªR°ËÒVyÙ Yî§kå1.½³†„ÐdM—V HÞ˜çÐuÓP1*ƒ˜†† ÙD"UœìŸàåW810Ig[ŒÚU1¬o _*ÀÊ6Øf¥oyÅØ©c¯Œö½üã·<þà±2P€zofgfr³'ÊLŸ;›ZÈDŠæ5‹¹"ž[B ÈàúD•<ãYžøçS¹³œxëPßþ?=ÚóÌo5qêX¿"às…¡Õ@ $ºMÛ„h¾#Ö¸í[n{èñí_{äÐÝ?xjìþ‡÷g¿øóý‹?~ìã»vÿôÈ–Ï}÷u>ýEo½³Üg¹/´TÆÒ®f À,ˆÙ 44¡â+¼¤ËʰB©ø »H%Ç-‚ë@jÈy tU5PA¹D"À ðdðËü—¼äx ˆÌP¯ÂŠø7Ï®#¼û6ÿIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/PauseHover@2x.png0000644000000000000000000000013212442116641021517 xustar0030 mtime=1418239393.154740527 30 atime=1418239393.154740527 30 ctime=1457295922.645852897 transmission-2.92/macosx/Images/PauseHover@2x.png0000644000175000017500000000043112442116641023142 0ustar00mikedldmikedld00000000000000‰PNG  IHDRr ß”àIDATxÚ½–A à E¥9@p‘¥d‘µGÈ)W®â¦]ô^ÄStÛ»µŸ"!$¤L+üIxj%ˆ èÁ˜@,LÀ•\ÿy·"`AQH(ß4¿Ê:àAü:©l3ˆ•Ì`È–zÙÊòMÚͬ~¦ÇåmÎþYJé±¥mÛ«<¿â÷Éžðµ cÌ]”?b·uÂP\ª‘ p!F¢pÊ…¨‰(„ 4!  éKJß4ô² >ýh£Þ¢ë)çüÜ¢µ¾ÉòÇë‰~ó[ ~Åoù0½Õ­ï³Í«\àXIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ActionOn.png0000644000000000000000000000013212442116641020576 xustar0030 mtime=1418239393.138740253 30 atime=1418239393.138740253 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/ActionOn.png0000644000175000017500000000044012442116641022221 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿaçIDATxÚ¥“1 ƒ@Em‚'PÈ ôB‘ÂÒ#H S{µ–^"—ÈÒ¥Heæ~ØÀ’@váãìÌÿ3;ëläY{Cih -ÀÆ÷Š}Y;Ce8þ@×'>@ˆãøÄ·(Šóº®Àvcp?’¨rš¦ý0 7yžOJ`öˆäݳ²C@°,ˣ뺫`ãÆ£“èNJ6:¶ˆó<ß뺾l%V;- ‰³,©† I’^Dl|ÄŒ39IÐF-*T•XÀçrð¡ NðO £ÛBð%ÿFï ©g&ÿ …røc ~ÎO` èÄŽGIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarOpenTemplate@2x.png0000644000000000000000000000013212442116641023356 xustar0030 mtime=1418239393.163740681 30 atime=1418239393.163740681 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/ToolbarOpenTemplate@2x.png0000644000175000017500000000042112442116641025000 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzôØIDATxÚí×- QÅñãG˜ ¸?ŠM îÀ.&³¸¦ÌnF»Å"˜´iµÙD0 A‹p=e`¼q ïÝòþðË÷„Ã@DTù~@^ ƒ–“ü0„…Ð¥À€Õ)øC9•é@bÑ‹B‘8ð¡|©Ž$¼ ض$Jö„¹â€ˆÐVÐ#€]Žß©” X* X!ÕTaÀ ©Z ºHRxª¾ÿN¬‘ÑÄá€5èÃÐÅÁñ'Ua(v0`ƒ$¥w!§-¿Q“’ü‰€/ôiíË5IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/PriorityHighTemplate.png0000644000000000000000000000013012442116641023177 xustar0029 mtime=1418239393.16074063 29 atime=1418239393.16074063 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/PriorityHighTemplate.png0000644000175000017500000000030012442116641024617 0ustar00mikedldmikedld00000000000000‰PNG  IHDR Vu\ç‡IDATxڕѱ ƒP…ág%ØGpK…lbÜÀÎ=R;„#X™ÒFÛÔró#ÇFx˜÷Ã×Üw¬tfÄ×]þ*Á ÉÕ8B“N7o†«Ø~óTa§,ºUçq‰/f´È¥Å¼±Q)Þ˜ð@Œ£X·I›\|xiëjd¸*Cü§ƒ?ø6…‰È ¿›IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/InfoTracker@2x.png0000644000000000000000000000013112442116641021644 xustar0030 mtime=1418239393.150740458 30 atime=1418239393.150740458 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/InfoTracker@2x.png0000644000175000017500000000230712442116641023274 0ustar00mikedldmikedld00000000000000‰PNG  IHDR((Œþ¸mŽIDATxÚí–QˆTUÇ¿¹3:í8™»å¶mY«”Í.¦mj³›KæRDôµ=”‚lV¦i„Ô†mõ ”"ó¢I¶>ˆ È> aù  J ì®§ÿßa†q¶î°wB¨ûñcç|ßÿûsî=Ç1çÜ%Íÿÿ{kãÝ:<& à6Qe(0g š‹u>G Ÿ¦)Ü*JÂÕPbÍŒšÍàFšBCûÅu!ŒkP—A-5/'æ3à•:ŒYcÇšµ¢A­CË>ƽ—ŠÁÄh}ƒ©2XbÔ)l¤"~ña74ðŠ¢A­CË>D'=KQ^ñ Fya_TÄ÷"þ‚°G8$þSëв=‚ÈÓóDƒ;­v¬"þâã"Öášé®ÔÔ:´Bmëé¹3ŠÁ!FcÂJb»`FüLƒç…míæMŽ‹m!‰¿Æ¬mÁ 5Ì{š;/ˆ1zE1Ø&Êâ‚È +Tšš.9±HtMÃ"r–QÓ/–¢•A;ƒY±ƒ½b ®äue§a.9]Ôô¢±€õdœ;ØÁ ì¡a{Šœz¤Èi£¦Ž8w0à{¹B´‹«E+£üBI’ÛJm;ZiÄrHh2›K6ƒx2â¯_Ÿ¦¶­d”Cò'~sȆ­%ÈIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/PriorityLowTemplate.png0000644000000000000000000000013212442116641023063 xustar0030 mtime=1418239393.135740201 30 atime=1418239393.135740201 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/PriorityLowTemplate.png0000644000175000017500000000030212442116641024503 0ustar00mikedldmikedld00000000000000‰PNG  IHDR Vu\ç‰IDATxÚ•Ñ1 ƒ0‡ñt ¸·à:*x“Î=ƒ7pó=„GpÒ¸­];‡ç‡ü»‚Í?//Sœ™%I@5r•k×õ˜P VQ»îŒ îðøæ5[´sqªÄ/´¸J‹§îØQꆀYö»H o1Í¢ÐÁ„3³ƒ2 Âù¿*ù-ý§7f¦‰ÈÊ*…žIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/DownArrowTemplate@2x.png0000644000000000000000000000013212442116641023054 xustar0030 mtime=1418239393.162740664 30 atime=1418239393.162740664 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/DownArrowTemplate@2x.png0000644000175000017500000000031312442116641024476 0ustar00mikedldmikedld00000000000000‰PNG  IHDRó } ’IDATxÚí”± €0ED '°´±ÐÚÎ%\À‘œ@ÜÆ*•ƒöç磄\Œ­ÉýŸ.‘ˆ|ÒF¯G ¢˜ü­ ‡-,aîQP\» ³`&³|u oÌ^Ôðx>˜y0zp×ά…¹ã ƒÆ6ÜQ¨àn ï¼ódxðì%Óæ@ WÊ9ŒŽ:øü­Ÿ-l(ææ–IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/RedDot@2x.png0000644000000000000000000000013112442116641020616 xustar0030 mtime=1418239393.144740356 30 atime=1418239393.144740356 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/RedDot@2x.png0000644000175000017500000000244012442116641022244 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzô pHYs  šœÒIDATXÃíVKlTe=÷1ÓÎô5M­ØiñA©‰²aåŠ5ЄÄÀ¦Ö@ð,Œ1>nuéÒ®ÜÛR+щÆDÓZ0­€4Ñ‚5H[KÛæygî½~çŸÌe˜éL .œäd¾ûýçœÿûŸ÷š¾ïãAÂÄþý_À»Ã0¡òÃvq_[‘*¿S@ì ðꛆñõۖ埵mï=cæØFﱆ˜¿ÛkÛ7íìüp0ö™={°pû÷îÅÓ3Ƕ‡…C.5ÿHÃ@÷†1>‰¼óx__쉡!‰™cÛcÂ!—šEÛ¨­  Ð‡ …%zz°s÷nìÆv P¢Ó2•1Ã8ÔÛÒ‚žŽÄz{Ñ‘H M¦ÝîÏ+0f®c×.Å!—š.Ñžn°u xèi“}×%‚¨ äº@*…Âì,ÒccÈLL(¤ÇÇ‘Ÿ™’Iʼnj µâñòóâU¯/³ÞÔÇã"޵Ë})ae2À­[(IGùó瑟šBáâEON¢4=­8äRC­xt‰×1Ý—Ñlv+ð‚ˆÑΑ{,¹)æþõë(ÎÏÙ›+CÇÌù ŠC.5íå½èÙL†Î…ÃÀ¾ˆÓD !£±²Y¸ëëp——áÞ¾}/˜“6rÈ¥†Zz„€¡ò¬ê"êb¹a‚[–2”÷' kì—Jð~¡Pcɱ ºsj¨ ë¡ëÌfg dêrm¹id ¶aÖÛ Í¥†ZK>‰› e«B ëbJ™³úÌ·ŸÿÿOßÏžÖ 4Ü$Å–¹õÒ8¨XÖkÎtѰñÿÿÿ6_øøíçïÜePƒÃ€î2ž¼ýÿ¿nCÚá›–íp¤@%ÿýûÿ_§!;á8$ØØÛ/þÿO[äÊ1oƒ vPÖ’ÿÿ¿ýlÜ:£ríÕ'j50A½Ò²åÏ_K¿üœ n¤@P¨HZ8_¢9P‚ ‘‚gÀz%uyXOåØIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/InfoActivity.png0000644000000000000000000000013212442116641021474 xustar0030 mtime=1418239393.128740081 30 atime=1418239393.128740081 30 ctime=1457295922.642852846 transmission-2.92/macosx/Images/InfoActivity.png0000644000175000017500000000104312442116641023117 0ustar00mikedldmikedld00000000000000‰PNG  IHDR‰ êIDATxÚÕ”±nÓP…_;Ž/6¤”¶Ž: <Ûuƒ`¬ÔÄ@@jÕ ––`éZÄÈ+ð$ð}ˆ²ÁŽçøšX‘®7"}òÉññ‰ÿü–7üSþ“B“Œ7âI>(>ÂÞy2ôél¾;8 ƯüøöÃÁZ!?2*.aâlêÑ ŽO~"ÊZÿ k}…7‚ÈVdzÎc-¤å‘Šúnhm&Ÿ·™’úº¯ÐÿD”¦;Ç¿ Óâ Nœ¯ÌšŸx ®]KgG?¢ÂYñ Þr¾2,ì|뙣T¤3L’…XïþŠ{«LçW½#g€ˆl:{{ ˆ JgÎwwè´î¼ËèZá;€¨p{ù *Ün}'Å{@È_~ˆüÄ¿åÐVD£å&Nj!-4[æ±$ƶ&½[NŠ×ѯoK@„£tëÕW€(xÓùë]ë/|¦ÓV«púò @Üôeúlc+ÒŒÌc-¤ÍÐî‘fdz¥ü.Ó?²=<D`øŒ=ˆÓÏ¡¥ž1ó£ÎïÝòÁ ®¤D§]áÁ€¸Â ý[£lŸ,øunLöT´zAö52Ï×D~Þf꾑Gä>y@&$ÒòÚsã.Óù¾¥ü-5-W÷gVïÃ?¦Y€¬)ô½IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ResumeNoWaitOn@2x.png0000644000000000000000000000013212442116641022315 xustar0030 mtime=1418239393.163740681 30 atime=1418239393.163740681 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/ResumeNoWaitOn@2x.png0000644000175000017500000000124612442116641023745 0ustar00mikedldmikedld00000000000000‰PNG  IHDRr ß”mIDATxÚÅ–ÉkÔPÇ+1=(xð"¼x˜“¼zˆzSÛ¢âF!Vª=‰"^Z EźÁV©–ºâRM&™ÎL’™6Û©An^zè×÷†¸$Î[z©‡/ ù%¿ÏüÞûmæÑ‘"È rˆR¢•LiöÌÈÞQ¾¸F•H'Z"‚¤–²oÔÕKD¾À‘O}È»‰~ˆœÖFÀ:¾iÏ|t3€9زL ³|Ÿ…}~ï½å´pŒYd²À$I7]T¯EZ*U©;ëUQ¹´õ›=­wø[þ£Ë0{ÖóîTý¨ó@V_'ÜÛýˆ\›:gjñÃS”ÏncùÑ^ê—ûw ˜{Å„ÕM8ƒ%VÉ(¨1ag¶ t>Ièš/ X'6²¢Ô(Ð`&ÆÌ=yX nœ%›AN;ced[§þã8C%,¾òçk&*Ã{e²Û¡À´±19–‡Åæ¯(–“£ß*ÛR \igŒªsù»™+ÔἇäY(‹ Lâ8¬^?œ³ÛŒ#24ƒ<ðª&v(VÊLšÀ|“zCRN­ÞNnÒ°Ê‚fcûó(ŸÛÎ…Ùz‚ÏS¼{5˜…oë;‘Ž54ß¹¸çßqz3Ü;:âÞýAÞŸÒ¸­Í½;ЦÈc_^ ñ|Í©ñÖï$ [¶ÐþÈ›‘”¡ð›÷±uh<»!×C½ ì »yÑéÒã©>Þ‡¸Qc‚¯Ódw‰VuUØ:¹©5›Ó·|{M4C5©ÏC4I„X¼bÈK¸bÈ/Qb —¨µ^ÿÿ"¼æ«þO:&™ƒi^ûIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/UpArrowGroupTemplate.png0000644000000000000000000000013212442116641023174 xustar0030 mtime=1418239393.138740253 30 atime=1418239393.138740253 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/UpArrowGroupTemplate.png0000644000175000017500000000020412442116641024615 0ustar00mikedldmikedld00000000000000‰PNG  IHDR _žüKIDAT•c`@üPŒC1V`Ä=Pl„.)Ä­H Z¡b`ÀÄ¥H’0\ •cˆÀ" Ã0—³c‘dEö#(€N ”Ñ0¿O\Lι,IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/RevealHover@2x.png0000644000000000000000000000013212442116641021660 xustar0030 mtime=1418239393.134740184 30 atime=1418239393.134740184 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/RevealHover@2x.png0000644000175000017500000000074012442116641023306 0ustar00mikedldmikedld00000000000000‰PNG  IHDRr ß”§IDATxÚ½–±nƒ0†K˜Y˜:7OOáÉ R„Ú©¯Ñ:ucÈCTÍØªâZ‰¹C·Þ/t &ç@ÅI?²ðù>Ù¾³}ca) E$EJH÷PßV}_Ðûζ 鎤@’îÇl®…ù¤Af*F [Ø-i7Ìq[è±l`)†áSY–MÓüɺ®;¢è é%¨ÏgæyÞã~¿ÿ< ø 3õM sXUU_'Kƒ¯ÏiËL3«ëú»(Š„¶i¦Âònyi¾gî+ì©ê4àH„ÃLPÂ,#þÈ—QJ¾¼+øG*þi?À~I@ø þ+Ô©0YÌóüÍ«-)„Ï?&Í»–t…²€–4v…O{f,|X–e¯PÊ⚣m4¾px/…££ šºžö0´‘ èCpK¨Ëxx_º|Mu6ÕZ¿ðÃÛx=YJ„b;\×}àדñ^ å0~‹OŒ¹Â22Xjõ®fºàµþ3qý‡ðêOý?Š LŸ‹záIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/DownArrowGroupTemplate@2x.png0000644000000000000000000000013212442116641024071 xustar0030 mtime=1418239393.158740595 30 atime=1418239393.158740595 30 ctime=1457295922.645852897 transmission-2.92/macosx/Images/DownArrowGroupTemplate@2x.png0000644000175000017500000000031212442116641025512 0ustar00mikedldmikedld00000000000000‰PNG  IHDRó } ‘IDATxÚí”= €0CýAqt„.ÃQO!Þ@œzç‚.E¿ÖºúàAi“ŒŒ1Ÿ´‰a+ÉŒ@µÃäøîZ¨` âÌ*vÁuˆì‚®å•Ý“î/Ê;;½ï³Œ®23\„òÂŒƒ n7åožtöï^2\ežHáLy£¡Ÿ¿õ¼X»Ë·$ÕIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/UpArrowTemplate@2x.png0000644000000000000000000000013212442116641022531 xustar0030 mtime=1418239393.137740236 30 atime=1418239393.137740236 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/UpArrowTemplate@2x.png0000644000175000017500000000031312442116641024153 0ustar00mikedldmikedld00000000000000‰PNG  IHDRó } ’IDATxÚíÌ1 ƒ@…áB,rK‹¤Nç%¼€GÊ $·±²ò ‚ýËÏ’jÈfÖµõ‡¦ys’´‹×3ÈìŠàÎèÜë £CR5ÈXP{ã1¡@´r ±q%êí¸Á %ZÃæ[‰Úh[zCyØR‹;*Ü G‰ °5]ܦãÁñàWg´Ù$íò~lÈíIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/CompleteCheck.png0000644000000000000000000000013212442116641021572 xustar0030 mtime=1418239393.128740081 30 atime=1418239393.128740081 30 ctime=1457295922.642852846 transmission-2.92/macosx/Images/CompleteCheck.png0000644000175000017500000000031512442116641023216 0ustar00mikedldmikedld00000000000000‰PNG  IHDR 2Ͻ”IDAT•c`@_ îâ™PÜã‚)1j ãd“0HIIÍ¿zõê3ww÷5P5(ÖÁñ‰'îÿ UѽgÏž›†††Ë@|¤D#iFèIL˜0áE`…ý _¿~ýéëׯ?AŠæÏŸMQ?Ü3 Gƒ544ìÇâf_˜ÏÁÁs#®à!à`¬-l½ËœIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/PinTemplate@2x.png0000644000000000000000000000013212442116641021660 xustar0030 mtime=1418239393.155740544 30 atime=1418239393.155740544 30 ctime=1457295922.645852897 transmission-2.92/macosx/Images/PinTemplate@2x.png0000644000175000017500000000043112442116641023303 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=øàIDATxÚµ•a ƒ0F‘p& H¨$TB ¡&a& •p»GÒõÖ^¾.\ò á½´ aaæ[ùº‡„(ìzm毀ŠY)Bè&g¸!»|6âp¹e7Iù!”6 ÏhØ„¤2ä5û(ÀJ-‹C¹%õÔ}É—g!ÑÛ¢2#G¾ƒ4#GÔÈNTnv‚•ùrôK>î ¬ÂKx:‘ÇL`­öüí¬$¢R)kd»Î¤sÐ ùú#žšP@—ü¬ä£3z ‡œ«=§e~ì?YæÀäx C[ù9½Û{ÀIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/RevealOff.png0000644000000000000000000000013012442116641020733 xustar0029 mtime=1418239393.16074063 29 atime=1418239393.16074063 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/RevealOff.png0000644000175000017500000000041312442116641022360 0ustar00mikedldmikedld00000000000000‰PNG  IHDRH-ÑÒIDATxÚ’1 Â0†íäz€t´k·žÃÉAz;z OQÚ#ôB7…NNBQè Ô|…ˆ>L‡~xùßû“?yo%ÖÚBYdÃÍ9ÏŠ-´Eî¦æŸ(O7鮩šv|Ž# †Äßö4Ã}xL¯iêÎÝà ±v¶D]Õ-…ž8º"b8râV…0cƒ5n‘oƒ#'ø ¡ šY`Õ|¬ú>ô×þ–$ÉVZUl|í@$ÅîsÖK§Ø‰ËCyríø€%1¢(ŠÜ„\ð¿âÂHZRìIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ResumeOn@2x.png0000644000000000000000000000013212442116641021173 xustar0030 mtime=1418239393.159740613 30 atime=1418239393.159740613 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/ResumeOn@2x.png0000644000175000017500000000133612442116641022623 0ustar00mikedldmikedld00000000000000‰PNG  IHDRr ß”¥IDATxÚÅ–Kˆ’QÇó ¸ð.|‚.Ü(¸0q+êʈ Ìn\è†c6Ri a>Q0Rð‘.|4‹1‹ŠYFEÑbZDÓTDLOhª{á¸Éwo—“ðùÎýÎï;÷Üsî9Cñ㙀<@q (ÏŠaŸyØ5|œZÐY ÐyJ¥à;ÿV­SpZ‡>ha ssêõz—b±ø"ÎÎú°ÐÀ6i¢(‹/šÍæ¡^¯¯Öm’ jLdXàr¹ü5™L¾¹\®[¤H¹¶—O“3¡P¸e³Ùnø|¾Ûívûž(‘Hìû\NW’ƒ‰DÅ`0xw0|‚Îq*—Ë/•Jå6ÆnS«Õ×jµÚ „ªßïY,–‡¯“(M8˜\.¿Òív?Р²ÙìS‰Dr ãÓ°P(<§Íf³ã@ p‡Çã‘Îã\F»Ý~“Ëi2™Üƒ[òµn£ÕjíRœî82\ÆL&ó…-‹ŸN§s°Z¥Ri_¡P\¥,'ó\Æ^¯÷ÂX­ÃX,ö@ °¥@¥<'æF„Ýn÷]c00† Äné|>ÿ×ÖÖÆXGôb°‡¦Õj¢Àh4z±“šÄéÐ`˶*8¾¨TªmL«ÕV+•Ê+B^=ØÂ×h4×Aü±­ ê·f³¹µºV&“•C¡Ðît:ý‰Dî>ÊDlmápx—«ÈaétúÃ0Oàïcø¼Óé¼ÇÞ‘lk#5oxZ ©Tê!M§‡ŸFcƒêz‚%â÷ûwÆãñW¬Z­¾ÖétUÒÈÁ2è/`©Tz܃;¹\îY½^?h4o`£†õI*~ÌL1èE1è‡(²ÈCÔi‰ÿ>õQÿ7¢¡1­5½çIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/TurtleTemplate.png0000644000000000000000000000013212442116641022037 xustar0030 mtime=1418239393.129740098 30 atime=1418239393.129740098 30 ctime=1457295922.642852846 transmission-2.92/macosx/Images/TurtleTemplate.png0000644000175000017500000000027112442116641023464 0ustar00mikedldmikedld00000000000000‰PNG  IHDRVÎŽW€IDAT8Ëcøÿÿ?50Ã06â n€b2È€÷@ü ¯‡Z@´!ÿñàóH® €Zøʆ†À0Hc?š«÷à 1Àáb NÀ&øð|¨w½¤5l>‘†ô è¤uÀ‚Ï£‡.0j›ž´Õ€Ó ÑLK?ƒ7˜5+~.õ(IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/TransmissionDocument.icns0000644000000000000000000000013212442116641023424 xustar0030 mtime=1418239393.127740064 30 atime=1418239393.126740047 30 ctime=1457295922.642852846 transmission-2.92/macosx/Images/TransmissionDocument.icns0000644000175000017500000040704412442116641025062 0ustar00mikedldmikedld00000000000000icns$is32Nÿÿƒ…ÿóòðór„ÿôÞÚÕÿ‡ƒÿõáßÄÿÿ™‚ÿ öååκƹüÿÿ,ÿ ÷ãͦǜ¼‘ºÿ ùÑ¢xQŠ×Öæÿ úÞ˜¼pÔ›¡ðøÿ ûðˆÝ­`ÑŒ´ûÿ ýøÆ‚æ¡Ä˜²ýÿ þûû„š È÷ûþÿþýýÜýþÿ‡ÿÿ‡ÿÿ‡ÿÿ‰ÿÿÿÿƒ…ÿóòðór„ÿôÞÚÕÿ‡ƒÿõáßÄÿÿ™‚ÿ öååß‹üÿÿ,ÿ ÷ÜsLÆ&ª‘ºÿ ùÎEBY‘Ž×Öæÿ úߥÆoÓ›¡ðøÿ ûðˆÝ­`Ñ´ûÿ ýøÅ‚æ¡Ä˜²ýÿ þûû…š È÷ûþÿþýýÜýþÿ‡ÿÿ‡ÿÿ‡ÿÿ‰ÿÿÿÿƒ…ÿóòðór„ÿôÞÚÕÿ‡ƒÿõáßÄÿÿ™‚ÿ öååß‹üÿÿ,ÿ ÷ÜsLÆ&ª‘ºÿ ùÎEBY‘Ž×Öæÿ úߥÆoÓ›¡ðøÿ ûðˆÝ­`Ñ´ûÿ ýøÅ‚æ¡Ä˜²ýÿ þûû„š È÷ûþÿþýýÜýþÿ‡ÿÿ‡ÿÿ‡ÿÿ‰ÿÿs8mk€€€€€€‚€ÿÿÿÿÿùþ¤€ÿÿÿÿÿÿÿÿ®€ÿÿÿÿÿÿÿÿÿ¶€ÿÿÿÿÿÿÿÿÿÿŒ€ÿÿÿÿÿÿÿÿÿú‡€ÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€il32>ÿŠ'=3ŒÿˆìëæÊƒB‹ÿì‡ÛÚÕÎà:ŠÿíˆÜÙÓ¼Ã<ŠÿîˆÞÝÚͶ÷Â@ˆÿî‰ßÜдÿ÷ÂCˆÿï„á ÝØÒÅ®·Ó·ÿÿøÂ@†ÿð‚âÛµƒ~£ÇÏÅ´¸ˆux?…ÿñäÑ¡†¦Þ͸ʗ¯Æ¨›––”m…ÿò€æ ±¬Ë€çÿ唚Ãá×Ê€ÄÀ¨ …ÿóèÞªÁ´Í‡™«usr‰ØãàÞÝÝÜá…ÿôêØ®‡za]X?L[_xéé€èçò…ÿõìè¨‹Ž¦tbR#†ê…DŸ‚ìö…ÿöîîëÒ«¢ahxY¤ïÉbOÒî÷…ÿ÷ðð³xl•ï°w´°ÉݪPiï€ðø…ÿøññ¢a©ÿÿK4Å–¼ÓØ„J›€ñø…ÿùóóß\‡õöÞª\_†ìÚËePÜóóù…ÿú€õ…S°àëä„­mg¸ó°]sîõú…ÿû€÷ÚSuԾŲŽ@ïùõ‡d§÷û…ÿ!û€øôxT°Ôì€ bÿô­sj°øü…ÿ!üúÇM{ÔÊßýüñè‘lv°úúý…ÿ!ýû ónNÀðíéÅ—¨©¦õ€ûý…ÿ!þ‚ý ²PzÈ«u^f§ä‚ýþ…ÿ!ƒþör\]aYá„þÿ…ÿ!„ÿµntŒä‡ÿ…ÿ!…ÿÁÉúˆÿ…ÿ!“ÿ…ÿ!“ÿ…ÿ!“ÿ…ÿ “ÿ…ÿ•…ÿ•ÿÿŠ'=3ŒÿˆìëæÊƒB‹ÿì‡ÛÚÕÎà:ŠÿíˆÜÙÓ¼Ã<ŠÿîˆÞÝÚͶ÷Â@ˆÿî‰ßÜдÿ÷ÂCˆÿï„á ÝØ¯Z7Ñ·ÿÿøÂ@†ÿð‚âÞº…™“¸ˆux?…ÿñä­:g·í° –ƨ›––”m…ÿò€æ [ íÿè 6¾á×Ê€ÄÀ¨ …ÿóèàT„¾|`‹ŸØãàÞÝÝÜá…ÿôêè” LaA\`Zwéé€èçò…ÿõìê°ls›‚iQ#…é…DŸ‚ìö…ÿöîîì×»«dhxY¤ïÉbOÒî÷…ÿ÷ðð²uj”ï°w´°ÉݪPiï€ðø…ÿøññ¢a©ÿÿK4Å–¼ÓØ„K›€ñø…ÿùóóß^‡õöÞª\_†ìÚËfPÛóóù…ÿú€õ…R¯àëä„­mg¸ó¯]síõú…ÿû€÷ÚRuԾŲŽ@ïùõ†d§÷û…ÿ!û€øôxR°Ôì€ aÿõ­si°øü…ÿ!üúÇLzÔÊßýüñè‘lv¯úúý…ÿ!ýû ónNÀðìéÅ•¨¨¦õ€ûý…ÿ!þ‚ý ²PzÈ©v^d§ä‚ýþ…ÿ!ƒþör\]aYá„þÿ…ÿ!„ÿµntŒä‡ÿ…ÿ!…ÿÁÉúˆÿ…ÿ!“ÿ…ÿ!“ÿ…ÿ!“ÿ…ÿ “ÿ…ÿ•…ÿ•ÿÿŠ'=3ŒÿˆìëæÊƒB‹ÿì‡ÛÚÕÎà:ŠÿíˆÜÙÓ¼Ã<ŠÿîˆÞÝÚͶ÷Â@ˆÿî‰ßÜдÿ÷ÂCˆÿï„á ÝØ¯Z7Ñ·ÿÿøÂ@†ÿð‚âÞº…™“¸ˆux?…ÿñä­:g·í° –ƨ›––”m…ÿò€æ [ íÿè 6¾á×Ê€ÄÀ¨ …ÿóèàT„¾|`‰ ØãàÞÝÝÜá…ÿôêè” LaA\_\wéé€èçò…ÿõìê°ls›‚iQ#…ê…Cž‚ìö…ÿöîîì×»«chxY¤ïÉcOÒî÷…ÿ÷ðð²uh”ï°w´°ÉݪPiï€ðø…ÿøññ¢a©ÿÿK4Å–¼ÓØ„J›€ñø…ÿùóóß\‡õöÞª\_†ìÚËfPÛóóù…ÿú€õ…S°àëä„­mg¸ó¯]sîõú…ÿû€÷ÚRtÓÀŲŽ@ïùõ‡d§÷û…ÿ!û€øôxT°Ôì€ aÿô­sj°øü…ÿ!üúÇM{ÔÊàýüñè‘mv°úúý…ÿ!ýû ónNÀðìéÅ—¨¨¦õ€ûý…ÿ!þ‚ý ²PzÈ©t^e§ã‚ýþ…ÿ!ƒþöp\]aYá„þÿ…ÿ!„ÿµotŒä‡ÿ…ÿ!…ÿÁÉúˆÿ…ÿ!“ÿ…ÿ!“ÿ…ÿ!“ÿ…ÿ “ÿ…ÿ•…ÿ•ÿl8mk(_ccccccccccco`oÿÿÿÿÿÿÿÿÿÿÿÿÿûÞItÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýYtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýWtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýXtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöUtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá$tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúitÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿotÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿj3y‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚y4it32FÇÿÿ‹ÿ¼ÿ›ÿ¿›ÿ›ÿ¨æåãáàÝÚØÕÑÎÊɽ‚šÿ›ÿ©æåãáàÜÙ×ÕÑÍËÇÂÁŸ™ÿ›ÿªæåãáÞÜÚÖÓÐÍÉÄÁ¾¿N˜ÿ›ÿ«æåãáÞÝÙÖÒÏËÆÂ¾»¼c—ÿ›ÿ¬æäãàÞÜÙÕÒÍÈÅ¿»¸¼O–ÿ›ÿ­æäáàÞÛØÔÐÊÆÀ»·³ÁP•ÿ›ÿ®æãáßÝÚÖÒÍÇÁ»¶±·ÀQ”ÿ›ÿ¯æãâßÜØÔÏÈ»¶°«Ç¿R“ÿ›ÿ¯æåäáÞÚÕÐËüµ¯ªÀÊ¿Q’ÿ›ÿ¯çææäàÜÙÔÍÆ¾·¯¨´ÓÊ¿V‘ÿ›ÿ°çææâßÚÕÏǾ¶®§¤ÝÓÊ¿Uÿ›ÿ°çæååâÝ×ÑÉ¿¶­¦ŸÚÝÓÊ¿Vÿ›ÿ°çææåãßÙÓÊÁ¸®¤œÏåÝÓʾUŽÿ›ÿ°è€çäáÜÕÎù¯¥œÆíåÝÓʾUÿ›ÿ°è€çåâÝ×ÏÅ»¯¥š¼ôíåÝÓʾXŒÿ›ÿ°è€çåãߨÑȼ±¤™²úôíåÝÓʾY‹ÿ›ÿ±éèçæäáÛÓÉ¿³¦›§ÿúôíåÝÓʾXŠÿ›ÿ±éèçæäáÜÕÌÀ´§š£ÿÿúôíåÝÓʾY‰ÿ›ÿ¬éçÓʼ¹®  ÕáÜÕ樛š€ÿúôíåÝÓʾYˆÿ›ÿ¨éÜÊ¿·³¶¼¸»Â¾³¦ÔÜÖÎÄ·ª›ÿúôíåÝÓʾ]‡ÿ›ÿ£éཱུº§«±½ÈÅÀ¸ÂÄÁÈΰÝÖÎĸ¬ž“‚ÿúôíåÝÓʾ^†ÿ›ÿ éݸpiok•ÂÌÃÅǽ°·Á¹ÀϺ‘È×Ïź­Ÿ’ƒÿúôíåÝÓʾ\…ÿ›ÿê Ü´‰jfow}†‡r¤ÀÁµ¼ÄÂÁÊÈÁû¥°ØÑƺ­¡”„ÿúôíåÝÓʾ\„ÿ›ÿ›ê"؉cckszˆ–¢Ž‚±½ººÆÊÅÉÖ粨žÙÐÇ»¯¡–…ÿúôíåÝÓʾ_ƒÿ›ÿ›ê"«°nt}„‹’𡍰ºŽ ·¿ÂÇÅÆ¾Ëʳ«£’ÙÒǼ¯£–†ÿúôíåÝÓʾ^‚ÿ›ÿ™ëÊ”Q–·‚Ž–¥¬³ºÁθ´ºÄ€¹Äŵ£Œ„ÚÒȾ±¥˜‚zy‹‰‰Š“©µÅÔäÝÓʾaÿ›ÿ—ë:Ë™…ŽyH›´œ¨°·¾ÄËÒØß–¥°¹±²¹¿¿ª‘mŠÛÓÊ¿³¦›†~xspooqtuz~ƒŸ´ÇÊ¿_€ÿ›ÿ•ë.Ù£¤°®žzJ¼¸¹ÁÈÎÔÚàåõ³ˆœ°°±º¼½«ˆffÐÜÔËÁµªž”‹ƒ~yw€v y{~…Š”¤»¿`ÿÿ›ÿ”쳉£¶€¸8³ŸUrÛÈÑ×ÝãèíñüÖ…¨··¯°³¨…XmÖâÝÖÎĹ®¤š’‹†ƒ€‚„‡‹Ž’—› ¨¼[ÿ›ÿ’ìBÙ˜•°¸·º´¶»­‚?ÃâàåêîóöùÿùЦÁ¾ª“vU“èæãÞ×Ðǽ³©¡™”‹ŠŠ‹‹Ž’•˜›Ÿ£¦«»+ƒ›ÿ‘ìCʼ·¹¿¾µ·²˜I}ùìñôøûÿÿþä…ž¸°™|]nÄêéçäàÚÓ˸±¨¢™—–——–—˜™š›Ÿ¢¤¨«¬°ºƒ›ÿìF±‘°³¸«œ¶Åȼ®¯ŸhHèûùýÿÿóÑ®œu…˜†eY ìëëéçåàÜÕÏÇ¿·²¬¨¤££¤¤¥¥¦¦¥§¨©ª«®°²²¶¡›ÿŽì꣛´ºÂ¹”—¼ÉÄ¿¶¬x9±€ÿåÀ¢”‘“t\bSãììëëêèæâÝÙÓÌÆÀ»¶³€°€±³²³ ´´³µ¶¶··¶=›ÿí>è ¨¹Á½¤“®È¿´­›“|Lw÷Õ°™’‘Œ‡„qAØíÁ||”ÉéèæáÝØÔÎÉÅÁ¿¾¼½½¾¿¿ÁÁ¿À¾½½¾€½–›ÿí9º–¾ÁÁÄ´²¸˜º­©§œ‘ˆeT½“’Š„~zulÁí³vcghgdYœéæäàÜÙÕÑÎËÊÉÈÈÉÊË€Ì ËÊÊÉÇÆÅÅÄÃÃÁ¸›ÿŒî3ÂŽ€½Â¼½¦®£Ž¡¢¤Ÿœ˜ŽqB©“‡‚}wrnidqflkhhggi]¥éçåâÞÜÙÖÕ‚ÓÔÕÖÖ×ÖÕÔÓÑÏÎÍËÊÈÇÁ›ÿŠî6í½­¢c©¼´¬¡•‰—œ™’—m:“™vupkfb^X`okfioiaffh[ÌéçåãáàÝÜÜ€ÛÜÝÝÞ ÝÜÚØ×ÔÓÑÏÍË›ÿŠï6¸À¸É{´«¢š–‘•Ž‚qutU.x¤eid`[XTNYjm~v‡‹deefpëêèèæåããâ‚ãääååæåäâàÝÜÚØÕÓÑÈ›ÿŠï2ÍÎæùÞ`œœ“’ŽŠŽ’xsgRG6,]¯\^ZVROLFUˆ{CU`ef_ìëêé€èçè‚é çåãàßÜÙ×ÕÌ›ÿ‹ï2Æÿÿâ]n–‡‚„‚|€v_PGAN‹†ˆ\cca„’ó›ÿó ñžmttu>ºÿóöùýƒÿ<\†¼®®¬©¦¤—¶ÍÆÅÄĂà ŷ:hv_cd[»‘ó›ÿôò£ŽwqrvK«øíðòöùý€ÿÑ€ Cx³ª§¥¡™Ž¤Ïŀăà ǔ-‡bccecèô›ÿŽô"΄‹jps^wðêêìîñöûþÿk@4i£¥Ÿœ—’މyÀdžà ÅÃ_I†]cdaô›ÿŽõ&éŽmnopRÉëæçéìîñûä`Îÿ†DŸ•‹†a|ÑÂÃÂÂ€Ã€Ä Ç²5sqadf[Æõ›ÿõ¾†ilqT‰ëàâäåçéñ×Ñ€ÿõJf–‰„ytoh@¯ÉÂÃÂÃÃÄ ÆÈ‰2‹adefiíŽõ›ÿõ"â…fklhWÒßÝÞßàãäìôïòûÿ–5†}wrmc\bQfË€Ã€Ä ÅÅÆÆÈÃTUƒ_efb—Žõ›ÿõ7óªˆuhjmN˜ãרÚÚÜÝßáäçì÷í4hrj`Xi’ŒpJ›ÍÃÄÅÇÅÆÆÇÇÈË­1~mdfh\Íõ›ÿõ(Ö‚‰bhi``ÖÕÔÔÕÕÖרÚÜßâû€?cVi¬²žqZ_ÄÈÌÎÂÈÈÉ ËÌ9ŽagghpòŒõ›ÿö î–‰jgfjL¥ÙÏπРÑÑÒÓÓÕÜËDi­¯€©|bHŽ×½q‘Ô€Ë€Ì ÎÄKbchic Œö›ÿ‘ö Ê„€afgYjÔÌ̆ËÉЯ§¯©©¨¨ª‡bI]¢L §ØÏÏÎ€Ï ÐÒ¨1‡lhik_Ö‹ö›ÿ‘÷ 芉aedfL°ÐÈ%ÇÇÆÆÅÅÄÃȯ§§¦£ ¡ŒaM=. &ÓÖÓÒÓÒÓÒÒÓÒuD‹e€jxõŠ÷›ÿ‘÷ ö¹…uaceSvÒÅÆ€Å€ÄÃÂÂÁü¢¡š˜—‹_K7$ [ëÚØØ×€Ö ÕÕ×Å@npkkmd¿Š÷›ÿ’÷ à…‡]cbbO¸ÈĀÀÂÁÃÉ©••’ŠƒYE4%—óàßÞÜÛÚÙß~OulŠ÷›ÿ’ø ô¥†kabeN‚σÁ#ÂÆÒÁŒ‰…€|wT>/ÒòèåãâàßÞÝÜÛè™Nsnnmo~Šø›ÿ“ø Õ„‚\bb^U¿Ä€Á)ÀÁÁÂÂÉ¡‚|xsnjK7)>ûõðìêçæäãáàäìveqpooqzï‰ø›ÿ“ø baadK̃Á'ÂÃɪaaoqnkfa[>/#zÿýøóðîëéççòäbtrqqpr†ô‰ø›ÿ”ø Å„z\aaZ\ÅÂÁ'ÂÃÄÆÁ»®qZNNPL3'ºÿÿþû÷ôñïøñ³newtssrps›Šø›ÿ”ø 扈\a`dJ›Ê€ÁÂÃÃÄÆÉÏÖÜØÃoH,ïÿþüÿÿÇ{btyvvutp„o¼Šø›ÿ”ù÷´†p^abWeÉÁÁÂÃÃÄÅÇÊÌÐÕÝé÷ùä°j-E„ÿØŠfuzyxwr}•{†äŠù›ÿ•ùß…†ZaacJ¦ÈÂÃÃÄÅÆÉËÎÒÖÛáèðþÿÿõºÅ‚ÿášnx„~}|vz”iÎøŠù›ÿ•ùóž‡g`acSoÌÂÃÄÄÆÇÊÌÏÒÖÜáçîöý„ÿé©…‘Œ†„~z‘—tcŸ×ø‹ù›ÿ–úÓ…€[aabM±ÈÃÄÅÇÈËÌÐÓØÜáçìóû‚ÿò¶˜¢ª ™’އ‚žaŽÅîú›ÿ–ú.`abcQzÏÄÅÆÈÊËÍÑÔØÜáæëñùþÿÿúº‹¤Ìijª¡œ‘—§d~¶äú›ÿ—úÂ…x^€b%PºÉÅÇÈÊÌÏÒÕÙÜáæêïõÿÿ‚¥²½Éõ©§³žmo©Û÷ú›ÿ—û*版\bbeN…ÒÆÈÊËÍÐÒÖÙÜáåéøÿ̓mˆ–š¥²ÂÉÆÊ±{cœÐô’û›ÿ—û(ø±‡o`bc_UÃÊÈÊÌÎÑÓÖÙÝàëöчdv††Œ– ¨¶ÕÐŽbÅí”û›ÿ˜û%Ý„†\ccfKÔÉËÍÏÑÓÖÙâîÑ‹`m~~€…Š’˜°Âšdƒºæ–û›ÿ˜û$ôœˆgbcd^ZÍÌËÍÐÒÓÚçÒ`exyz|ƒ…–±jv¯Þú—û›ÿ™û!Ð…€]cchK“ÝÏÏÒÙâÓ•``suvxz|{‚ rh¢Õö™û›ÿ™ûî‰acdecJ“ÉÒλ”e\nrrtvxwx“›za—Ëñ›û›ÿšûÁ‡y`ddgbFOZVPZlpoqrtur‡›bŠÀêû›ÿšü戊_eeffic_dlmmnoqrn~—ˆe¶äŸü›ÿšüù°‰rcfefghjjklmnolu’Žjt¬Üú ü›ÿ›üÞ…‰^fegghijklmjn‹qh¡Óõ¢ü›ÿ›üõŸobfghiijkiiƒxb–Ëñ¤ü›ÿœüÒ~ bbgh€ifzd‹Áë¦ü›ÿœýò¡{¨{dabeuŽ„g€¸å¨ý›ÿý Û‰i˜ š—™Šit­Ýû©ý›ÿžý ؘf\cb]i¡Ô÷«ý›ÿŸýîÍ´¨¨µÒò­ý›ÿ¡ýøñòù¯ý›ÿ×þ›ÿ×þ›ÿ×þ›ÿ’þîÔÏåý½þ›ÿþù‰WþþÀ_WX–úþþÜ‚WXpÝþþÏ‚WYsãþþÏ„WeþYWu‚þ¤W‡‰Wùþ›ÿþúe]WW^e&þWW\“žiWWc÷þÜWW^dXWWXìþÏWW`cXWWXóþÏWW]e€þYWW¹þ¤W‡e^WW]eúþ›ÿ†þÁWWÏþ»WWoû€þ§WWuþÜWWÏþýŽWW¤þÏWWÜþüƒWW³þÏWWÁƒþYWWXï€þ¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þý\WXõ‚þmWWâÜWWÏþþæWW™þÏWWÜþþÙWW¨þÏWWÁƒþY€Wjýþþ¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þâWWzƒþÁWWšÜWWÏþþÁWWÊþÏWWÜþþ²WWØþÏWWÁƒþ YWqWW¨þþ¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þ¾WW¤ƒþèWWxÜWW»í½ZWlýþÏWWÈì¶YWuþþÏWWs€• ­þþYWâcWXçþ¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þ²WW²ƒþòWWo܃W„ùþþÏ‚WXŒûþþσW eþþYWèçXWcü¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þ¿WW¤ƒþ èWWxÜWWiqWWµ€þÏWWlmWWÄ€þÏWWœ€Ü åþþYWèþ§WW˜¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þâWWyƒþÁWWœÜWWÏþmWXìþþÏWWÜýeWXòþþÏWWÁƒþ YWèþýiWXpW‡þÏWWÁ†þ›ÿ†þÁWWÏ€þý\WXõ‚þmWWâÜWWÏþëXWeýþÏWWÜþâXWlýþÏWWÁƒþYWèþþïX€W‡þÏWWÁ†þ›ÿ†þÁWWÏþ½WWnû€þ§WWuþÜWWÏþþ›WW˜þÏWWÜþþWW§þÏWWÁƒþYWè€þ¸€W‡þÏWWÁ†þ›ÿ†þÁWWÏ‚þ%WW]•iWWb÷þÜWWÏþþû^WXÙÏWWÜþþùZWXãÏWW]‚eåYWèþtWW‡þÏWWÁ†þ›ÿ†þÁWWσþÀ^WY—úþþÜWWÏ€þÏWW\¿WWÜ€þÂWW`Ä…WÜYWèþôZW‡þÏWWÁ†þ›ÿ’ÿíÔÒçþ½ÿ›ÿ×ÿ›ÿ×ÿ›ÿ×ÿ›ÿ×ÿ›ÿ×ÿ›ÿ×ÿ›ÿß›ÿß›ÿß›ÿß›ÿßœÿÞÿÿŠÿÿÿ‹ÿ¼ÿ›ÿ¿›ÿ›ÿ¨æåãáàÝÚØÕÑÎÊɽ‚šÿ›ÿ©æåãáàÜÙ×ÕÑÍËÇÂÁŸ™ÿ›ÿªæåãáÞÜÚÖÓÐÍÉÄÁ¾¿N˜ÿ›ÿ«æåãáÞÝÙÖÒÏËÆÂ¾»¼c—ÿ›ÿ¬æäãàÞÜÙÕÒÍÈÅ¿»¸¼O–ÿ›ÿ­æäáàÞÛØÔÐÊÆÀ»·³ÁP•ÿ›ÿ®æãáßÝÚÖÒÍÇÁ»¶±·ÀQ”ÿ›ÿ¯æãâßÜØÔÏÈ»¶°«Ç¿R“ÿ›ÿ¯æåäáÞÚÕÐËüµ¯ªÀÊ¿Q’ÿ›ÿ¯çææäàÜÙÔÍÆ¾·¯¨´ÓÊ¿V‘ÿ›ÿ°çææâßÚÕÏǾ¶®§¤ÝÓÊ¿Uÿ›ÿ°çæååâÝ×ÑÉ¿¶­¦ŸÚÝÓÊ¿Vÿ›ÿ°çææåãßÙÓÊÁ¸®¤œÏåÝÓʾUŽÿ›ÿ°è€çäáÜÕÎù¯¥œÆíåÝÓʾUÿ›ÿ°è€çåâÝ×ÏÅ»¯¥š¼ôíåÝÓʾXŒÿ›ÿ°è€çåãߨÑȼ±¤™²úôíåÝÓʾY‹ÿ›ÿ±éèçæäáÛÓÉ¿³¦›§ÿúôíåÝÓʾXŠÿ›ÿ±éèçæäáÜÕÌÀ´§š£ÿÿúôíåÝÓʾY‰ÿ›ÿ¬éçÈ«‹oO/:ÏáÜÕ樛š€ÿúôíåÝÓʾYˆÿ›ÿ¨éÖ¦wO11ÎÜÖÎÄ·ª›ÿúôíåÝÓʾ]‡ÿ›ÿ£éྷ–A ‰GÝÖÎĸ¬ž“‚ÿúôíåÝÓʾ^†ÿ›ÿ éݸpiv7Œº×Ïź­Ÿ’ƒÿúôíåÝÓʾ\…ÿ›ÿê Ü´‰jfow}†‘‹zØÑƺ­¡”„ÿúôíåÝÓʾ\„ÿ›ÿ›ê Ù‰cckszˆ–¨…ŠMÙÐÇ»¯¡–…ÿúôíåÝÓʾ_ƒÿ›ÿ›ê ®²nt}„‹’𡍝ÈMŠ7ÙÒǼ¯£–†ÿúôíåÝÓʾ^‚ÿ›ÿ™ë½[”º‚Ž–¥¬³ºÁѳ‰2ÚÒȾ±¥˜‚zy‹‰‰Š“©µÅÔäÝÓʾaÿ›ÿ—ë¾N€ ¡µœ¨°·¾ÄËÒØì>‰UÛÓÊ¿³¦›†~xspooqtuz~ƒŸ´ÇÊ¿_€ÿ›ÿ•ëÖ`‚ &Ÿ¹ÁÈÎÔÚàåþŽˆ$ÊÜÔËÁµªž”‹ƒ~yw€v y{~…Š”¤»¿`ÿÿ›ÿ”ì’… sÝÈÑ×ÝãèíñÿÒ†;ÒâÝÖÎĹ®¤š’‹†ƒ€‚„‡‹Ž’—› ¨¼[ÿ›ÿ’ì×M‡ Ìâàåêîóöùÿÿ%„"rèæãÞ×Ðǽ³©¡™”‹ŠŠ‹‹Ž’•˜›Ÿ£¦«»+ƒ›ÿ‘쩉 €úìñôøûÿÿþëBƒ#4·êéçäàÚÓ˸±¨¢™—–——–—˜™š›Ÿ¢¤¨«¬°ºƒ›ÿì|‹ 0îûùýÿÿóÑ®¥S€'†ìëëéçåàÜÕÏÇ¿·²¬¨¤££¤¤¥¥¦¦¥§¨©ª«®°²²¶¡›ÿŽìêYŒ¸€ÿåÀ¢”‘˜giãììëëêèæâÝÙÓÌÆÀ»¶³€°€±³²³ ´´³µ¶¶··¶=›ÿíèEŽ+tøÕ°™’‘Œ‡†nWÔíÃ{|“ÉéèæáÝØÔÎÉÅÁ¿¾¼½½¾¿¿ÁÁ¿À¾½½¾€½–›ÿí¯Ž=“’Š„~zvk¹í¶vc€hdYœéæäàÜÙÕÑÎËÊÉÈÈÉÊË€Ì ËÊÊÉÇÆÅÅÄÃÃÁ¸›ÿŒîÙŽ±“‡‚}wrnidqfkjhhggi\¥éçåâÞÜÙÖÕ‚ÓÔÕÖÖ×ÖÕÔÓÑÏÎÍËÊÈÇÁ›ÿŠîí½­­9–švupkfb^X`okfioibffh[ÌéçåãáàÝÜÜ€ÛÜÝÝÞ ÝÜÚØ×ÔÓÑÏÍË›ÿŠï¸À¸Ë„s¦eid`[XTNYjm~v‡‹deefpëêèèæåããâ‚ãääååæåäâàÝÜÚØÕÓÑÈ›ÿŠïÍÎæøê+Œ[°\^ZVROLFUˆ{CTaef_ìëêé€èçè‚é çåãàßÜÙ×ÕÌ›ÿ‹ïÆÿÿã_Š p}>J°bRPMJHFBMA&b€m_`egZÌíìëë€ê‚ë„ì ëéçåãàÝÜØÐ›ÿ‹ïÚ¼ˆQH†^«ïï¸BA¥tEIGECBC8-o©ÉÓΖ&icden’íëéæäáßÜÔ›ÿŒï§`mx$;v¶îïïºuUK@’Œ:DCBBAAD©ÕÙÔÏÐÐk9Š^de^œ‘îíëéçåâßÚ›ÿŒð Þ·ÈÛðÆ]n’¸ß€ð!â¦l\^^TD|¡/ÒòèåãâàßÞÝÜÛè™Nrnnmo~Šø›ÿ“ø Õƒ‚\bb^U¿ÄÁ#ÀÁÁÂÂÉ¡‚|wsnjJ7)>ûõðìêèæäãâàäíueq€oqzï‰ø›ÿ“ø î’‡baadK̃Á ÂÃÉ©aaoqnjea[>/#zÿýøóðíìêççòäbt€qpr†ô‰ø›ÿ”ø Å„z\aaZ\ÅÂÁ'ÂÃÄÆÁ»®qZNMPK3'ºÿÿþû÷ôñïøñ²ndwtsrrpt›Šø›ÿ”ø 扇\aadJšÊÁÃÃÄÅÉÏÖÜØÃoH+ïÿýýÿþÇ{btywvusp„o¼Šø›ÿ”ù÷´†p^abWeÉÂÁÂÂÃÄÅÇÊÌÑÕÝé÷ùä°i-E„ÿØŠfuzyywr}•{…äŠù›ÿ•ùß……ZaacJ¥ÉÂÂÃÄÅÆÈËÎÑÖÛáèðþÿÿõºÅ‚ÿášnx„~}|vz”iÎøŠù›ÿ•ùóž‡g`abSnÌÂÃÄÅÆÈÊÌÏÒ×Üáèîõý„ÿ驆‘Œ‡„}{‘—scŸ×ø‹ù›ÿ–úÓ„€[aacL°ÈÄÄÅÇÉËÍÐÓ×Üáçìóû‚ÿò¶˜¢ª ™’އ‚‘€aŽÅîú›ÿ–ú.î‰`abdPzÏÄÅÆÈÊËÎÑÔØÜáæìòùþÿÿú¹‹¤Ìij©¡œ‘—¦Œd~¶äú›ÿ—ú,Â…x]bbaPºÈÆÇÈÊÌÎÒÕÙÜáæêïõÿÿ‚¥²¼Éõ©§³mo©Û÷ú›ÿ—û*爈\bbeN„ÒÆÈÉËÍÐÓÕÙÝàåêøÿ̓mˆ–š¥³ÂɯɰzbœÐô’û›ÿ—û(ø±‡o`bc`UÃÊÉÊÌÎÐÓÖÙÜàìöчcv…†– ¨¶ÖÐŽaÅí”û›ÿ˜û%Ý„†[ccfKÔÉËÌÏÑÓÖÙâîЋ`l~~€„Š’˜°Âšdƒºæ–û›ÿ˜û$ôœˆgbcc]ZÌÌËÍÏÑÓÚçÒ`exyz|ƒ…•±œjv¯Þú—û›ÿ™û!Ð…]cchK“ÞÏÏÒÙâÒ•``suvxz|{‚ qh¢Õö™û›ÿ™ûî‰bcdecJ“ÉÒλ“d\nrrtvxwx’›za—Ëñ›û›ÿšûÁ†y`degbFOZUOZlpoqrtusˆš€aŠÀêû›ÿšü戊_eefgjc_dlmmnoqrn~—‡d¶äŸü›ÿšüù°ˆrcfefhhjjklmnolu’it¬Üú ü›ÿ›üÞ„‰^feghhijklmjn‹qh¡Óõ¢ü›ÿ›üõŸŽobfghhijkji‚‘xb–Ëñ¤ü›ÿœüÒ~Ÿcbgh€ifz~d‹Áë¦ü›ÿœýò¡z¨{dbbeuŽ„f€¸å¨ý›ÿý Û‰h˜ š—™Šht­Ýû©ý›ÿžý ؘf\ca\i¡Ô÷«ý›ÿŸýîÍ´¨¨µÒò­ý›ÿ¡ýøñòù¯ý›ÿ×þ›ÿ×þ›ÿ×þ›ÿ’þîÔÏåý½þ›ÿþù‰WþþÀ_WX–úþþÜ‚WXpÝþþÏ‚WYsãþþÏ„WeþYWu‚þ¤W‡‰Wùþ›ÿþúe]WW^e&þWW\“žiWWc÷þÜWW^dXWWXìþÏWW`cXWWXóþÏWW]e€þYWW¹þ¤W‡e^WW]eúþ›ÿ†þÁWWÏþ»WWoû€þ§WWuþÜWWÏþýŽWW¤þÏWWÜþüƒWW³þÏWWÁƒþYWWXï€þ¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þý\WXõ‚þmWWâÜWWÏþþæWW™þÏWWÜþþÙWW¨þÏWWÁƒþY€Wjýþþ¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þâWWzƒþÁWWšÜWWÏþþÁWWÊþÏWWÜþþ²WWØþÏWWÁƒþ YWqWW¨þþ¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þ¾WW¤ƒþèWWxÜWW»í½ZWlýþÏWWÈì¶YWuþþÏWWs€• ­þþYWâcWXçþ¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þ²WW²ƒþòWWo܃W„ùþþÏ‚WXŒûþþσW eþþYWèçXWcü¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þ¿WW¤ƒþ èWWxÜWWiqWWµ€þÏWWlmWWÄ€þÏWWœ€Ü åþþYWèþ§WW˜¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þâWWyƒþÁWWœÜWWÏþmWXìþþÏWWÜýeWXòþþÏWWÁƒþ YWèþýiWXpW‡þÏWWÁ†þ›ÿ†þÁWWÏ€þý\WXõ‚þmWWâÜWWÏþëXWeýþÏWWÜþâXWlýþÏWWÁƒþYWèþþïX€W‡þÏWWÁ†þ›ÿ†þÁWWÏþ½WWnû€þ§WWuþÜWWÏþþ›WW˜þÏWWÜþþWW§þÏWWÁƒþYWè€þ¸€W‡þÏWWÁ†þ›ÿ†þÁWWÏ‚þ%WW]•iWWb÷þÜWWÏþþû^WXÙÏWWÜþþùZWXãÏWW]‚eåYWèþtWW‡þÏWWÁ†þ›ÿ†þÁWWσþÀ^WY—úþþÜWWÏ€þÏWW\¿WWÜ€þÂWW`Ä…WÜYWèþôZW‡þÏWWÁ†þ›ÿ’ÿíÔÒçþ½ÿ›ÿ×ÿ›ÿ×ÿ›ÿ×ÿ›ÿ×ÿ›ÿ×ÿ›ÿ×ÿ›ÿß›ÿß›ÿß›ÿß›ÿßœÿÞÿÿŠÿÿÿ‹ÿ¼ÿ›ÿ¿›ÿ›ÿ¨æåãáàÝÚØÕÑÎÊɽ‚šÿ›ÿ©æåãáàÜÙ×ÕÑÍËÇÂÁŸ™ÿ›ÿªæåãáÞÜÚÖÓÐÍÉÄÁ¾¿N˜ÿ›ÿ«æåãáÞÝÙÖÒÏËÆÂ¾»¼c—ÿ›ÿ¬æäãàÞÜÙÕÒÍÈÅ¿»¸¼O–ÿ›ÿ­æäáàÞÛØÔÐÊÆÀ»·³ÁP•ÿ›ÿ®æãáßÝÚÖÒÍÇÁ»¶±·ÀQ”ÿ›ÿ¯æãâßÜØÔÏÈ»¶°«Ç¿R“ÿ›ÿ¯æåäáÞÚÕÐËüµ¯ªÀÊ¿Q’ÿ›ÿ¯çææäàÜÙÔÍÆ¾·¯¨´ÓÊ¿V‘ÿ›ÿ°çææâßÚÕÏǾ¶®§¤ÝÓÊ¿Uÿ›ÿ°çæååâÝ×ÑÉ¿¶­¦ŸÚÝÓÊ¿Vÿ›ÿ°çææåãßÙÓÊÁ¸®¤œÏåÝÓʾUŽÿ›ÿ°è€çäáÜÕÎù¯¥œÆíåÝÓʾUÿ›ÿ°è€çåâÝ×ÏÅ»¯¥š¼ôíåÝÓʾXŒÿ›ÿ°è€çåãߨÑȼ±¤™²úôíåÝÓʾY‹ÿ›ÿ±éèçæäáÛÓÉ¿³¦›§ÿúôíåÝÓʾXŠÿ›ÿ±éèçæäáÜÕÌÀ´§š£ÿÿúôíåÝÓʾY‰ÿ›ÿ¬éçÈ«‹oO/:ÏáÜÕ樛š€ÿúôíåÝÓʾYˆÿ›ÿ¨éÖ¦wO11ÎÜÖÎÄ·ª›ÿúôíåÝÓʾ]‡ÿ›ÿ£éྷ–A ‰GÝÖÎĸ¬ž“‚ÿúôíåÝÓʾ^†ÿ›ÿ éݸpiv7Œº×Ïź­Ÿ’ƒÿúôíåÝÓʾ\…ÿ›ÿê Ü´‰jfow}†‘‹zØÑƺ­¡”„ÿúôíåÝÓʾ\„ÿ›ÿ›ê Ù‰cckszˆ–¨…ŠMÙÐÇ»¯¡–…ÿúôíåÝÓʾ_ƒÿ›ÿ›ê ®²nt}„‹’𡍝ÈMŠ7ÙÒǼ¯£–†ÿúôíåÝÓʾ^‚ÿ›ÿ™ë½[”º‚Ž–¥¬³ºÁѳ‰2ÚÒȾ±¥˜‚zy‹‰‰Š“©µÅÔäÝÓʾaÿ›ÿ—ë¾N€ ¡µœ¨°·¾ÄËÒØì>‰UÛÓÊ¿³¦›†~xspooqtuz~ƒŸ´ÇÊ¿_€ÿ›ÿ•ëÖ`‚ &Ÿ¹ÁÈÎÔÚàåþŽˆ$ÊÜÔËÁµªž”‹ƒ~yw€v y{~…Š”¤»¿`ÿÿ›ÿ”ì’… sÝÈÑ×ÝãèíñÿÒ†;ÒâÝÖÎĹ®¤š’‹†ƒ€‚„‡‹Ž’—› ¨¼[ÿ›ÿ’ì×M‡ Ìâàåêîóöùÿÿ%„"rèæãÞ×Ðǽ³©¡™”‹ŠŠ‹‹Ž’•˜›Ÿ£¦«»+ƒ›ÿ‘쩉 €úìñôøûÿÿþëBƒ#4·êéçäàÚÓ˸±¨¢™—–——–—˜™š›Ÿ¢¤¨«¬°ºƒ›ÿì|‹ 0îûùýÿÿóÑ®¥S€'†ìëëéçåàÜÕÏÇ¿·²¬¨¤££¤¤¥¥¦¦¥§¨©ª«®°²²¶¡›ÿŽìêYŒ¸€ÿåÀ¢”‘˜giãììëëêèæâÝÙÓÌÆÀ»¶³€°€±³²³ ´´³µ¶¶··¶=›ÿíèEŽ+tøÕ°™’‘Œ‡†nWÔíÃ{{“ÉéèæáÝØÔÎÉÅÁ¿¾¼½½¾¿¿ÁÁ¿À¾½½¾€½–›ÿí¯Ž&=“’Š„~zvk¹í¶vbghgdYœéæäàÜÙÕÑÎËÊÉÈÈÉÊË€Ì ËÊÊÉÇÆÅÅÄÃÃÁ¸›ÿŒîÙŽ±“‡‚}wrnidqfkjhhggi]¥éçåâÞÜÙÖÕ‚ÓÔÕÖÖ×ÖÕÔÓÑÏÎÍËÊÈÇÁ›ÿŠîí½­­9–švupkfb^X`olfioibffh[ÌéçåãáàÝÜÜ€ÛÜÝÝÞ ÝÜÚØ×ÔÓÑÏÍË›ÿŠï¸À¸Ë„s¦eid`[XTNYjm~v‡‹defepëêèèæåããâ‚ãääååæåäâàÝÜÚØÕÓÑÈ›ÿŠïÍÎæøê+Œ[°\^ZVROLFUˆ{CTaef_ìëêé€èçè‚é çåãàßÜÙ×ÕÌ›ÿ‹ïÆÿÿã_Š p}>J°bRPMJHFBM@&b€m^`dfZÌíìëë€ê‚ë„ì ëéçåãàÝÜØÐ›ÿ‹ïÚ¼ˆQH†^«ïï¸BA¥tEIGECBC8-o©ÊÓÍ–&icden’íëéæäáßÜÔ›ÿŒï§`mx$;v¶îïïºuUK@’Œ:DCBBAADªÕÙÔÏÐÏk9Š^de^œ‘îíëéçåâßÚ›ÿŒð Þ·ÈÛðÆ]n’¸ß€ð!â¦l\^^SD|¡¹ÿóöùýƒÿ<\†¼®®¬©¦¤—¶ÍÆÅÄĂà ŷ;hv_ceZº‘ó›ÿôò£wqrwK«ùíðòöùý€ÿÑ€ Cx³ª§¥¡™Ž¤Ï€Ä„à ǔ-‡bccecèô›ÿŽô#΄‹jps]wðêêìîñöûþÿk@4i£¥Ÿœ—’މy¿ÇÄ…Ã ÅÃ_I†]ddaŒô›ÿŽõ"éŽmnooRÉëåçéëîñûä`Îÿ†DŸ•‹†a|т€à ÄÄDz5sqadf[Åõ›ÿõ¾†imqT‰ëàâäåçêñ×Ñ€ÿõJf–‰„ytoh@¯ÉÂÂ€Ã€Ä ÅÆÈ‰2‹adefiìŽõ›ÿõ"â…fklhWÒßÝÞßáãäëôïòûÿ–5†}wrmc\bQfË€Ã€Ä ÅÅÆÆÈÃTT„_efb—Žõ›ÿõ7óªˆuhimN˜ãרÚÛÜÝßáäçì÷í4hrj`Xi’ŒpJ›ÍÃÄÅÇÅÆÆÇÇÈË­1~mdfi\Íõ›ÿõ(Ö‚ˆbhi`_ÕÕÓÔÕÖÖØÙÚÜÞâû€?cVi¬²žqZ_ÄÈÌÎÂÈÈ€É ÊËÌ9ŽagghpòŒõ›ÿö î–‰jggjK¥ÙÏπРÑÑÒÒÓÔÜËDi­¯€© |bHŽ×½q‘ÔËËÌ ÎÄJachicŸŒö›ÿ‘ö Ê„€afgYjÔÌ€Ë̃ËÉЯ§¯©©¨¨ª‡bI]¢L §ØÏÏÎÏ Ñ¨1‡lhhk_Ö‹ö›ÿ‘÷ 芉aedfK°Ï€ÈÇÆÅÅÄÃȯ§§¦£ ¡ŒaM=. &ÓÖÓÓ‚ÒÔÒuC‹e€jxõŠ÷›ÿ‘÷ ö¹…vaceRvтŀÄÃÂÂÁü¢ š——Š_K7$ [ëÙØØ×ÖÖ€Õ ×Æ@npkkmd¿Š÷›ÿ’÷ à…‡]ccbO¸ÈÄÀ ÁÁÂÃÈ©••‘Š‚YE4%—óàßÞÜÛÚÙÙØÙà~NulŽŠ÷›ÿ’ø ô¥†kabdN‚ς‚ÁÂÆÒÁŒ‰…€|vS>/ÒòèåãâàßÞÝÜÛè™Nr€no~Šø›ÿ“ø Õƒ‚\ba^T¿Ä„Á&ÂÂÉá‚|wsnjJ7)>ûôðìêèæäãâàäìueqpooqzï‰ø›ÿ“ø baadJŽÌÁÀÁ'ÂÃɪaaoqnjea[>/#zÿýøóðíëêçèòäbtrqppr†ô‰ø›ÿ”ø Å„z]abZ\ÅÂÁ!ÂÂÄÆÁ»®qZNMPK3'ºÿÿþû÷ôòïøñ²newt€sps›Šø›ÿ”ø 扇]aadJšÊÀÁÁÂÃÃÄÆÉÏÖÜØÃoH+ïÿþüÿþÇ{btyvuutp„o¼Šø›ÿ”ù÷´†p^abWeÉÁÁÂÂÄÄÅÈÊÌÑÕÝé÷ùä°i-E„ÿØŠfu~zyxwr}•{…äŠù›ÿ•ùß……ZaacJ¥ÈÂÂÄÄÅÆÈËÍÒÖÛáèðþÿÿõºÅ‚ÿášnx„~}|vz”iÎøŠù›ÿ•ùóž‡g`abSnÌÂÃÄÅÅÈÊÌÏÓ×Üáçîöý„ÿ驆‘Œ‡…~{‘—scŸ×ø‹ù›ÿ–úÓ„€[aacL°ÈÄÄÅÆÈÊÍÐÓ×Üáçìóû‚ÿò¶˜¢ª ™’‡€aŽÅîú›ÿ–ú.î‰`aadPyÐÄÅÆÈÉÌÍÑÔØÜáæìñøþÿÿúº‹¤Ìij©¡œ‘—¦Œd~¶äú›ÿ—úÂ…w]€b%PºÈÅÇÉËÌÏÒÔØÜáæëïõÿÿÂ¥²¼Éô©¨³mo©Û÷ú›ÿ—û*爈]bbeM„ÑÆÈÉËÍÏÓÕÙÜáåéøÿÍ‚mˆ–š¥²ÂÉÆÊ°zbœÐô’û›ÿ—û(ø±‡o`bc_UÃÊÉÊÌÎÑÓÖÙÝàìöчcv…†– ¨¶ÖÐŽaÅí”û›ÿ˜û%Ý„…\ccfLÔÉËÌÎÑÓÖÙâîÑ‹`l}~€…Š’˜°Âšdƒºæ–û›ÿ˜û$ôœˆgbcd^ZÌÌËÍÏÒÓÚçÒ`exyz|ƒ…–±jv¯Þú—û›ÿ™û!Ð…€]cdhK“ÞÏÏÒÙâÒ•``suvxz|{ƒ qh¢Õö™û›ÿ™ûî‰bcdecJ“ÉÒÏ»“d\nrrtvxwx“›za—Ëñ›û›ÿšûÁ†y`dehbFOZVOZlpoprttr‡›€bŠÀêû›ÿšü戊_eeffjc_dlnmmoqrn~—‡d¶äŸü›ÿšüù°ˆrceefhijjklmnolu’jt¬Üú ü›ÿ›üÞ„‰^feghiijklmjn‹qh¡Óõ¢ü›ÿ›üõŸobfggiijkjiƒxb–Ëñ¤ü›ÿœüÒ~Ÿbbgh€ifz~d‹Áë¦ü›ÿœýò¡z¨{dabet„g€¸å¨ý›ÿý Û‰h˜ š—™‰ht­Ýû©ý›ÿžý ؘf\ca\i¡Ô÷«ý›ÿŸýîÍ´¨¨µÒò­ý›ÿ¡ýøñòù¯ý›ÿ×þ›ÿ×þ›ÿ×þ›ÿ’þîÔÏåý½þ›ÿþù‰WþþÀ_WX–úþþÜ‚WXpÝþþÏ‚WYsãþþÏ„WeþYWu‚þ¤W‡‰Wùþ›ÿþúe]WW^e&þWW\“žiWWc÷þÜWW^dXWWXìþÏWW`cXWWXóþÏWW]e€þYWW¹þ¤W‡e^WW]eúþ›ÿ†þÁWWÏþ»WWoû€þ§WWuþÜWWÏþýŽWW¤þÏWWÜþüƒWW³þÏWWÁƒþYWWXï€þ¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þý\WXõ‚þmWWâÜWWÏþþæWW™þÏWWÜþþÙWW¨þÏWWÁƒþY€Wjýþþ¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þâWWzƒþÁWWšÜWWÏþþÁWWÊþÏWWÜþþ²WWØþÏWWÁƒþ YWqWW¨þþ¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þ¾WW¤ƒþèWWxÜWW»í½ZWlýþÏWWÈì¶YWuþþÏWWs€• ­þþYWâcWXçþ¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þ²WW²ƒþòWWo܃W„ùþþÏ‚WXŒûþþσW eþþYWèçXWcü¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þ¿WW¤ƒþ èWWxÜWWiqWWµ€þÏWWlmWWÄ€þÏWWœ€Ü åþþYWèþ§WW˜¤W‡þÏWWÁ†þ›ÿ†þÁWWÏ€þâWWyƒþÁWWœÜWWÏþmWXìþþÏWWÜýeWXòþþÏWWÁƒþ YWèþýiWXpW‡þÏWWÁ†þ›ÿ†þÁWWÏ€þý\WXõ‚þmWWâÜWWÏþëXWeýþÏWWÜþâXWlýþÏWWÁƒþYWèþþïX€W‡þÏWWÁ†þ›ÿ†þÁWWÏþ½WWnû€þ§WWuþÜWWÏþþ›WW˜þÏWWÜþþWW§þÏWWÁƒþYWè€þ¸€W‡þÏWWÁ†þ›ÿ†þÁWWÏ‚þ%WW]•iWWb÷þÜWWÏþþû^WXÙÏWWÜþþùZWXãÏWW]‚eåYWèþtWW‡þÏWWÁ†þ›ÿ†þÁWWσþÀ^WY—úþþÜWWÏ€þÏWW\¿WWÜ€þÂWW`Ä…WÜYWèþôZW‡þÏWWÁ†þ›ÿ’ÿíÔÒçþ½ÿ›ÿ×ÿ›ÿ×ÿ›ÿ×ÿ›ÿ×ÿ›ÿ×ÿ›ÿ×ÿ›ÿß›ÿß›ÿß›ÿß›ÿßœÿÞÿÿŠÿt8mk@#056777777777777777777777777777777777777777777777777640'  !ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþüóÓ†> /ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúŸ= 9ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿä_Bÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîq#Jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿða&Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõ`(Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû_(Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû`(Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü^(Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü_(Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü`(Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü_(Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü`(Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü`(Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü`(Nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü_(Nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü`(Nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü_(Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüa(Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü`(Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü_(Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü^(Lÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü^(Lÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü^(Lÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü\(Lÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü\(Lÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü[(LÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûZ(KÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöZ(KÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòA(Kÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà+(Jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨! (JÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõC(Jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’#(IÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓ1(Iÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿî< (IÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôC(IÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöH"(IÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøK$(IÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùM&(IÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùM&(HÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùM'(HÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûM'(HÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûM'(HÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüM'(GÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýM'(GÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýM((GÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþM((GÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþM((GÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþL((GÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþL((GÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL((GÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL((GÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL((GÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL((GÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿK((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿK((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿK((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿK((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI((FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI((EÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI((EÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI((EÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI((EÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH((EÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH((EÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH((EÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH((EÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH((EÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH((EÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH((EÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿG((EÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿG((DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿG((DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿG((DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿG((DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿG((DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿG((DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF((DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF((DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF((DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF((DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF((DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF((DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF((DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF((DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF((DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF((DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF((CÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF((CÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF((CÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF((CÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF((CÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF((CÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿE((CÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿE((CÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿE((CÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿE((CÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿE((CÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿE((CÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿE(&AÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿC&#<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=#3Mapz€€€€€€€€€€€€€€€€€€€€€€€€€€€{qbN4 (Z…m”l€’+Üä†Fk]G_ öõ1»&5æÿjŽe„çÚJ¹Ðš$z«‘p‡^s"Y“ {n E`&Ô%èM2;no%±ËæãÖl¿ÀM:0):=E*$ƒ2öô(¿Ô)Çà-€¼?P"öó fÑÔSµ3Ùâw£”û7\&,Ÿ¿0ï œ¼ È"'ˆÝ^† ¦ÝÝš€hÔ ° =Äý´ø¯õ€;3žÓF³ÇàM€ì~c €Ëè2÷9ßmØ£¼r¢L%•6ì¶7Dÿƒ,óÆL?·ùöž=Al;2±2|ü%XI¼î´‘¿)àÏá-xýŒU߉,«“KsÓZ— ”;çš»Q7×’‚8ÿUÇájÏο‡áY€£;¤–°4Òxkà5edr¨P—ÕóÒH0@ÆÌÍŸ|ÿ•—þ ªú=©[i¼Gd«”YnB3]Ÿ¶š]1ËCÇþÅJ×*^P½ÿFškkë{AãÔO—ef©<ì…µ—>7{™,ÆjU«Y”‹7mEå›G<˜‚2j¢ŽÑ"Qj÷%—%ëäÞu·»h*]6ªG· „Rœ ñ'KÈ=L¥Y/Cj'.gOÿ€árn_æ4 e凚drß*EϰÍ,Xon½<™Eˆ¨}IÙ¡{÷áN„)¼lk//Y—6Üžá| Ó‘})¢Ÿñu}Ç<£¿ÛÒ®¤Fâ;ñ»o¯éÜðÖpQ[oW^Kì™ DOòhMékó~ØVÇÇslCA¦]„¿OP3‡¶ø/hб g?9|l}€£>–¢›EþaR·ÍqS®Á\[?z±ï‘ØIÇ"àeú¦`¾˜#œFyú¢>L ±ú{øÀµõ¯J¤Š•f¿”ªÛvM¼ˆ“£¥“±þ³iÐñ>¤GG޽Øe6ú÷·JgÅ8|Ú?…ø+Ö‰)ãU‹´ºGå>*ÿnCõDç¥K Ú¯ŠÈÒó], Sˆî]=/'5{úÀ&é°§€…]~¹¹­Ú—Û†¹ Lá±?/cI*UÞGWËMÃí-‡Ú]Úd9WAGª$Eõ3ZáÓ”2‚·î8ä#‰Øžæ–hæ¯(NÅiÒ±¸Ð–ñ5°4$Âoy ™Qsãì~J¿´Þf TÅßeôƒS­æíqÔ¢iïðÖ" ¹IéBÝ4Efl!²Ègo2DÔ]?’ex£„«(—f³ýÞà &ù"J>FŠÖ!ÃíGÁ@¢Wô ·‰ÕÁñ•Œ^Nó@#€FP¬˜~:ÙæKT¡ºg:YA3rå-ó' ئ½Íå܂ç‡ÝMúK¨:¾ò‡„€×x×U"c€­±Ì½{=Œ«bihêY‹aøð6€¸s£3·ø–$Šh¼…nö§·!¢² zè‹BñAâ?ÊaXÛ:¡A”^;TÕ-­g?=Yr„C¤š„’oxl¡ @H´])5_ݪÇáÒ´üú:Ï}À ¹µ¿’‰²þšé}<@<Í*)pžÉ,4râ–“™ïÀ¥ âù(Î÷$(ÎûÓ¸ÐWõ; ¥b„+€éÿøáÔ¼R–ŸÌ^iޱ<;µÖàôqHFÇÂ(|q³ Ç‘¹3md&WqPØ~µzE©˜ÎϾ’¡ÏÁ1Nà—KBŸj”Î=ÛÊÓïÉsŒk×Nós\Ÿfxžïn¤ˆœ6k8 BÙ«n±ý~¬Iëì[.ÿM㱋5™×ì6›êáÄ)!hå©oH‡“Û:¸ÙÜšœ¿nØ$þ·¯`?WBfº&Ú:ÿT"OZB¢p+„Е´ûÚ®>-¢3zÅÔ4•)0Ã;¢_æžZ‘0-+—À_04H þÃrW»ûëV¦ÞZ¡m¡Âú¿•W`Ή\gR’þ=¾m_XiõŠßJÓ¤[VšaBT«±§iÿvhbïÞ)G HÆØIÏ«óaT °µù¡°Ž£mZ†Ã\LÓƒ"*¼o½¶R^A7ÂÿNÖèˆqÒÓçp;®3RW+vÞÇz3Áµ¹Lp›4MÊl€¼nù³Skh·!eôàõ©ÂhˆDÎ%Ú`G†mΑNžc .{ÈÿÝój«E˜C˜³àn`h±}ØÏh&JÿA ù‚éÄäÙOBO'4ì9Aµr] ¶žÝý â‰‰AM$jäŠàsÈ'þÒ.íÞÄÔ‡ÝpØ´cœ‰ƒÆÌ S}ÉXå‹)MrDKysµÈÐ$,NTZíÊ&a«Ãÿ%­DÊs²+ð¡}@£ÌO øXX‰Èno`w1K ìb‹8%t‚¥Àõ5Â8•è‹@ä9BûË¢cÔ¥^.«= ªTdf È ãA^"_O¢«ÆbÚ/OI‘?þéµDߊb¹M±p<% ?³œh¬³«Žã6¿– ò=¨÷cÆQ»Á<>ÈÞöUèÌXr¿×ê.W×(6S˜ŽymÔ*Çî‘k¼€þA³ÁÃò>Ki;DwË9Ó‘ƒ½Ó¼ç°`ýÒŠõ[m,’&Q[Óõù*sÅÊr7欮‰”FÄÊ´ùvc–üÀT©Oý6>–ÕŒß^{ì_ùð-Ù¿r'’·Vý|¼uóxiÓiw”ÖÈX•œË7™8hv…\‡3$ÄD?W¯E>Áž_ém±Q™ØÒDôDÛÄ6yËoÖü±ÂIÏòÉ•æ¨çíu"[Ò*˜2sÌ Å?ŸJôqüÉ`D‚ñž.!À`šg‹Ý-–ˆÈàšÔ•ð‹0~‘tOº”Ú§>F®ý£?’Ј<±é”¢3a»HöæÆ¶4v(LL€*‡T¹¬ÿpÉ£,úÄbhöɈíæ^9±†»Ü„ZHB…ƬÔx|h†NK¸®}.¼?Ú[ÙZäîÁ3( iH}w·/ªú¢‚žÎ –ÊÐñZvy`ëóº­é,ÿcYSp(f%вº&´í—ê#çþ¥æHǼnkÁBÈxÆŒn|,æ1nÃ8ü䉨pGÒür°v+²<·¹þJ¨èi$á^2~¬ÏþÛ²OJeå!ØK¡€ôÕkIaS©íñÐze\íø’4™—Ð.)°Aõ+³èë–­£l–>½KÌÿvb¿ÚÁ ¨:óâò]¢Â.³§óÝi}M-­C3©H5ÓE¯\íÔéq\¼Í(DjSög`{×:~±áÔ+ˆsx-p÷†y†ûH]ø"dìãdñÀ¡€:ÔíÈãyPÑ<#Vç¤uu¨³–Î}¦ÝRV.<½™ÐÉ⇊æ²9Žíá¿'­'Þ·ÅNJŧ4Èâ±jXÙBÏ áAv;¯‰9y …=a€‡û²]}=[hŠÃíd‡ÚÑÚÜœ†kj›0ûñ•‚Ÿh܇ãzüä2èŠn¯=ÕÎ5 Æ+³¦`o];CÛ²ZÑ €™M ÈyH›¢éÂ"ÎîjLòrjêk¥€0„)”È’iªãuþ6Ú4Êב¬2ÀXBZ‡˜D­Íìu›­`èS²æP%@›‡{g­E/¤ðÚ`iŠ7t~`f_g’Ê¿ÐHš~±ßÞÕ“ÈÎ7ÐÁ\†ŸãæE«ºÇáìÓ‡¬D~`åGΗ)ý7îáttï‘^®:àÙwÚ¥§·hÍçn w—L[¢T6äVÔ FÄ(!âAbN¬ÂÿU=ã£w¼e‘G} 4k=\%´›µ~mÞ1PµŠBO¾ôsÛaŒ Ûà+ÎÿV™·âbâÜÈ™ôõõÓôg¢çÑÎ+w#h=‹Jq:IÐ0¸[–²bò§QŸ'í¼žvyKw^†[HYI‡ ›¾Û,ÅBQv2%Œ=~µÂaYHÖ{‘WžÏÕuqi[%7 aüÇf¢Å¯}(¬|š¨1ÂLoH¼Ê0âÑîrŸ |,Eʾú¸_¨}o;÷Æ^ºOš+»-6/«íØ`-M—”wg.ÛÑÈ¡[yÈ Ši¸Óí(ó]OZæ½[=„”=™ŸÜùKuƒÕ0Û;mÊÔ¸Ï[—A¢Ý°L ýÇfÚíCf…`›áîÞ—Ðê r‘³&chÙÚ¢•¦Uc¬Š½#BŠ{ÔG Feœø!Ó²þ–0Ôa¹ê¦Æˆ7à"HS¶ôBòö3“A!>~Ϻcìøk´ìïÊâg”+Ä]P¼VÕÞo²‚&Y²ÀaÄâ4-›½£fÜDçÂ,«ëÓÈàL’cRlB±Ëúh´f®†u«ÂPì#@?™TI@e«ªoÑÿ=Û€w~Íê Ü08[ì1½[­˜DˆÔЛίµGŠÏ‹*D•°þ'˜NNÝÜõ$_­Z‹í»nQÛÏmµ¯è=ïOZ²oâ&/%pi…‘XåmJ³hëKÅÆªú`Ïs¯é½w9’²…·q„]¶WîQÉ,ZþF\ þöXô&ÂÐy¥ PN§@9[~œØL;é¸ÃBcÅUoúB¾:¼ Ä)Ü`Œ…ë.£lú]$Û‰ÓïV¾æ³Ê“k·±ä`Ý57’d§„,¿JÄŽ…‘îÞ¿ÎïëÐB­XÁwtÀj âêîcйð$æQ)Õ1ÿN¬ímÚœ¼-ï­Dû~Sï5b˜G$*'\ó#T!LïÁÎGµ1©÷”­º³!¤$Š-c‡ÄÄ!Ñܪ €>Zl¢yв K.@r‹È­¶Qáü€N‰%,W î¿6¼º†Cëm¤ü0¡Q/WŸ”sx[´ÑHúÜI€áº,>T˜“s!|—Þ/Ah²3=/ÿMªù±‹çoÜ’ˆà 18OrÅ·¦±<ÆxͲI‰·ƒýo »»¬Ú‚t¤ý+ü@¥±]Ä2šÄ“•»àÏZ)B\\dn茇v¡„ô…±Ud’z_e{Ë\{X¥Äh½†Ç)<-—j.Ó¶wØ^§p°x;¡î™Lu5ünÕ!ÔbUô0Ì”‡w¸eŒhÄqš,—G¾eà þÛu"Z?ï<¯Ú{XQƒQ„ ‘#0 ‡æ bÎ8 Ç“?û‚¾Í?Þ1*Ÿ¦ü8ÖEŽœTãÛ2æ øW~È­ÊŠÅÉg¼Û’'² ‚˜s HßçI ×àöÆò2\E¯¼Dé`uºt k‡á¿ˆN™l¬®»hˆ8bÂ¥ØM …tƒê,80ë,ïxê--–žT/€^.åœêpNƒF;‹ŸŠýøZÆ·¿r$úÂû{`¬¡¢Õ¾²+s¢"KÞ¿­92u®7|a®Âó¶%§Ü£¢ U ^Y’×Ûpˆ¯™Çøìäf°O ôŠý˜L^A`ôHQAήÂR¢9àÏÔF ëôN}qw‡–íôÅ7¬îjËI1FQ5Ê5.'Œv½¢z”ùÏ‘od4®÷ÌÛ Ùç/…nÃèóf¦ƒ1 ÷é´£ü˜·DŸž4˜ó¢6Á‚D8¿«ÿYðà¬oéÄ ¸™ÎrÁŽ#°ÜÈ¥L3vǧ³¹-æ¡ÿhô{òT¼e™›ˆ¦g1æ5^ôfuâ÷ëØ E7ß«§¹" V´æTqÇ$[Ç8ÏvpaúkþLÇAá`8u¦ÓqŽý©ùçgxó‚|£ÓÇ–¼5'6­/Á’² IHüÔ>¡ $žAþg¼s˜Áoq¸$ø»ãRvISmRhE$×SˆÂñeŒe·„hÛ Ø{žUàhíùsMmTϺÀý{ª‚¥ÐÃ[á’ PjµüF(Eõtã| gè«5¨×ÏÏñ aß„¢0£§ÿDŸìÔÜŸBŒE.ø»î3ŸÔ] NÕÄæ[üïñ…(Xá飜IŠöyA3’i\Mÿ N°Ø¤Y +åÌAðÆ_v¸µÓˆ8©;øt# +ÝÄÄÈüèR¨(&þ_H¼'êF.‡^…œÚþ 6ú“Â’PÕÂhCý^eUjj¤ÌßÑ=2…ç´À 3L»{ágÆ¢vh6$+É•é*(’•ÖƒQÓbK¾íE‰Â_úy’ͽRÜãkÉß-°l²)ª@Êc΀m¶©€”"Õœ\.ngÅ,¼"‘@Š#fR¡l"¶z#†qÒ“—— f0*_´J AëB(·ÆšÅ•„¨Î£Ùv›¿\™ÝÔÙ<Ú>õÕl{Ѝgn¸«¡G›œmÜ·S Ī#Ÿ”Í®.8!I0w¤ÉE€OAôõ’˜À=Âw ‰ßr|7kO£Ü…%ÛY—%ýá21B¥ë1ó˜Í‘ɧ.„c¼‹ìÉò÷”Íñy³Žiÿdi<±¶Ü?:²?ÁñF‰mȺÛÍÙLªAÒJø‡R£Z[BÛ~Á?*W›4RÔ‰]6¹M/AÛÅÎÜøÏJ&/cÅaVý1RY½WÜuÞ±¥78X\ÚíãåÀÄœá{û&¾~à|L>vYòß_…€±]èˆÐ…Z‰ð>ˆq­ $,Ì‘6a²D‡ 厪´N¥r²øÖÊ4F¾¤%oÒ làAx:I:t—åÿI^l<œ)¶—ﳇw¬äc@ ßßÅvýg©gl™Ö¥.Š2”¯B"ŠõêÛ›þ¦y6Z˯%'6ãÙ†eµ‚ºGl—¿qº—½±@H' Œcwð] Øio^Þ v®9 IUÃÒØ «þ#õ®z`‰êwœq{¿X0Ø®9¡¶¯Ï{”3®ˆn±vLÜwÖ}ÑDL!‡D&¡zÑS\ ><À™_Yg|»÷SâjùëÝ4 eY ÜçjH+Ýt63ób—‡ùÞê5K‚øà>²½Õ^Q d|=F¸Ún®x¤öpR³Î@¾±_VWĺjM?|5HFTrúLŸ}qÕž ÒEjÒHŽO*¯¹‚›-/ã-4£ÆÛs6ëXí³"#3èKlæ¥xض9…h³@Ë1Óù"ÞEVµ5ùØÜŽ3ï­D(>œ|Ì~u*fjöÇ»ÀQµä(jÒƒ–ÍÀ#„ˆ<›zùòv·±œ¹˜¾¦6‚²Wñó¥gn?ϳÔo¶»®c΃s=FÂ-’›V#n¥ôníì—Pß{Pyö>ò$áNHF+ƒ;± E/qY4®Ûtžªq|28;Æ'Ȥ šo®†’>´þ÷̲¬ùoH<9i]w“§U,<§£ O ] ´Wï4¤˜„ùa IJŠˆÐ½—8)4X:Æ«8«L þùœæ{:ø…¢`xú‰Ã^lÀ&ÐâšØþ9‹–º¾îd3:¦ºq±‚ÏÀq_Ì“¶4÷¿yëm>ð£Ì,ЉÖÕ{IÁ°“ŽYŠO)K»TØ+!zi˜P–f£ÉÙÚN´Ñ•“Ñ{F±[õ^ÑZ¥¤ÝÀçSQ¤—ë‘úiùhÃï̓ºª¢GöŠb|í ‰,ÑàдQtòsuÙ±ÍÅ· ¤—w\tпÊý6Y¢Òû2A¡µ"¬ï}NÔ?CF&k8Ç©ˆ,Ó·–t àÜ~‡³g¡Oïšl>ê|Û]õæ&u1æÀ>±kãS¨Œ$|_~õ›³_íì&(ûYÍÍ’Ân½ró4ÚÄbE_BXZºÝ¤%ÀŽ-£y*(©yÌFÆïp½ƒóòþºÉÏëû0¬,S-ˆ&›û  ÃÒ8•‰!Õ+Ð*[RÞ9JGDlÁTÖ¤a.1¨Â*Ck5óˆŸ9O¼IBmõ¦‘#ds¯þŸÃíИ}º·F€á{mî¡´/”ÝÉ ÃÄÚc!ÙÆÉâ@~7àîÎå™ßyKä•jÌ-4Û­]ŸxúR5¢2š`9—´íƒ—#^<¡Ð³¯X-¤î8çÙ)=êððg€U[[­ž,©Š6`~B=@Œ#”hý]…¢Y²LeW²—Ç’ >^Þ®\I£Èh¤øÐk~§‹RZ a+` ³ß mÈ4î?Ý9ÿiéÌóL Ä~–nê´jH=EêTèPÆ´¹†šAâ’›Uˆê8{+\¾6z>¦ƒõÎkŒ•"ÙA.Z:‚ûëÚ;¨a›Æ÷ý²üg¼`µzéu'+K­{Éš–ñdÔü±ŸQ' ø{µ"»"t³-jBÆ€x ŸÜ”ÿzëKÛÖÀ†ùi$AøµÙ`¼Éùƒ>Þ³+_1v.®ã,Þ\èý.»s¼õ iïµEÔñ \Ù&äÓÌ_¼K± ÷;l V9V¨ô­Q‚…ÇD‚ág¹¹ž½ÔµZkMû8~Ýaãš×Ôõ)v8vUå*V‡ç;ñ Á@ˆi¤Wr„ƒþº~¸]‰*³MóË[ «¸Á}àõË¥iLQ е„Ì´|ðæZ¬Œu`üñó¶ g‘Óï.L©å`"qwtzõ¢_üs€wýöuûnýàaÖ¯Ç~ž…·áj¦3€F7#k×ãâÙXT¤$öêúS¬‰GÆK»ÕópÚ"lÔü4&L÷Sï ~¬%Xk"+Qв(.vÒ›óg½[}“Pøl ÔÑ/\=7÷XîâÅd×z¶²p£Ž5xB ê™9+\Êlêš¶½þ²{ÇÀØÇs$WµT££Aè(õÂ|K…2¼ý¡ö|”¦uî)oz1æÑÝ‘Ù{‹D °.UDOC«vFØ&mÉK18Xë."²#ú¨E¶€d,cS_ÆÌ6€&⬑ÕÌ3*ÎÇjn€ˆªÓŒâOýþÒˆöÏ‘ã#Ò§4T>®…œzd?;…—OVÚP·òЧS†ªhÈ­ -yÆÃíÓxü-øü(`AzÌjoòn À´Ô!ÿlrk®D/¸øŸÿÿdÁD¼¨Â]k—…ˆ4²OX"Öëæù¾o›æîÜä龄%äZØíAß{‰ƒÄiW–äÐ^܉ŽPùAÍó|ß7Íó|ß7Î-Sd«N(78(­gã°QÖÊèeùîÔ?¿èµêê.Šù&Îa¡{éþn‡B<ó6,>è¹¶Q4¹ò/HWÿÿü ÌùLRƒ[ʺŸÑÒ¤÷¶¾WnÜæî9ïÄÐٗϰ¾}…óì/Ÿa|û âË mý’õþÅ_€9䄎8±tºÌú¶eÅÔ:øIÝ'ÂJÿ;²Ï-é‰ñ¶Ì*óh‰ÈOJAY7¨çÎ{§0…ß©oÔÈG·êd#Ûõ2íú™öýU†Ñõpö½î=eçÐÃó½!À—IåþöŒÂPÁ‹Vßÿh¢ÐãUýÄíŽ:ÜR½·b|N4ö=­?!†àÿŽgY"‰•5Ue¾¬µ æC.ž5)óõÚ°æp÷ gš÷Ÿ»t¹P‡»»B÷D–såe.jlj'›~ªT& ˆX5ŸAº¥©ûÍÙ"a·ùQjúàl}[c1‡Í?²žÒX5Ÿ5²éø9Ø/Mcd™yqžô(ù¶=$+Ã}ß”y=Ï8ǵ¯¶×”!Ò^AÂ¥°\”ì©dïExF ¶Ûm¶Ûm¶Ûm¶ÛsýKç¿e+$kñog%jëšÕáЏåÔþóÎ#,q"•ó¯/EBzºÂ)fItL“Â:0ÅÂà TõæÍ£ú|à]  ¿f©^ò®ÝDà’ÖKÒ4$ó +áè:`ýjPG»Cd6BÓʯýw:\¤ è*”9ú_…1ôšåö÷ü="ï·Ð2û{ØËíì øwë}½z_on8~Þ°ÿ7½¿ÛÖíëH`AÐÿ_ø„‡!“”\ çe+/(’*~`ã ²±®Ê ‰Ã“CúˆKŠWš´š¦DˆÕð!§†øKïñýô˜„²yÅB¨¾+Ò*ØÄëémÑ?JCò²|›sÍf:¼¿í6lÇŠ¾"ý¤§[‚Ÿ}µ`UŒ-Ø«.¬úÇ^sEw ä…wØç‰£1Ú•uÒ¦;g].¶ï †Ó[¥6—x×ÇãñùG¡Ô––<8}2iØߊs,êƒûð„Ú]‰’faûyf"G|à› ™œ;ÇÇTg”ÐÅÿMÄ 7ÓÃ1§Æ¥Šµaþsp’Ö}(ï:f>%¥Å¤¹FUŠ«&B ÒÔȨ°<«Fç-…‘˜á~ásN†[[V*Žk DgÛëù›¹´`öά€Z|öeŠñåŸm¡$ ÷E¦¥”vm‡Igà¾Gœ]ƒ'ür¬ÕyUô>ЗòƹÝû˜ÚÔ¤04 ¯ÄÅ.·<(z•îÍãòÏÆðB2:¸ó‚@ÙD¥/ŠÜµ•ifÀpØÉ:ÉávõuÇE¿-\F²M.Ú&Ô<Ÿ-ÁQZì/±*ÿ $)…%*N¬×Ì€{%)±°aë°BîGõ“¬Ø Ã*µÿzIþr>¹NC쟞ý¬.÷boŠH,Ó?‰‹Ê̶èKâï䈯i3(£ºê:¼éÔ@Ñ¡×b⬭yUMë»’k›;eúÝÜcûó{þæ…Ö¸¬Çºã«¯›æù¾o›æýQ‡ó¬Jn&›êßÏBŸârïöï% ä©¢½&ט|jz€„† ÒLŠí"7´Iª±¼´â+¸B^߯:lœ™aƒB3C ½!±ÔƒE‰QíE»ŠÛ˜ø×Ú(o!5ч]dNŽg™Æ=W #fµ–.rBU‡(¢¨ØªUXýÂ¥µöEêÝV®…ExÏ} ówö\&3+3¯`…œŠk), w6ÁB²„çDnÉOo¨ð‹@{òˆ÷§ª¦+&|É›ò+á=âÓV5„XêM€¸&Ý inದ>~¢¼Ä ˜N`NòÌl–FÏS{r«AQqŽúÙ) 6wî£ä§JÞ;Ü0hX0Õói5æ&hÌ£;µª^ÀõMíËéõûUì_ôãÆå›fÝK(>ðGùuéu/8©>ËÈEÓOÃ;ŸÁ‡û,S™WnŒ¯ÂH–_IM*[ÒÑ€n£@Fs´dR$¿V±‘¹ гè!”…¹eœJC¦mË b’ãWV®úgÐuô‚£åMÉ:} &JÝ\ÐÅh´}8×Þf-Ún'˜êŠÇ»¾_„c ßÀZ†ä8Ê€¬Y?àí¸†j+ôõ¢8xëNèÝýz¢YÔÖ¡ ˜Ê¨áÓ6ÃC¥¤%‘’òq\ÈN¥ÌGf'¬n‚%c@¥yöÂh; 8,ë}„«ÒRï[¥Èî¢nSöACx ]œ©žšŸ¢$•–ÄéŠfý;v"9sœ˜ºH DžRô(¨ Ìî¹(¤Ò{‰o<ÄjËERÝ-–k<ÈNx¿;QßÊi#$+ ÑÉn¯õù‡U²%X„®½ëfú°GkÉ_Bïx‘4KÔô¸¤Ä Àñ#Û÷çô¨ÑYÚ88á„<€$žþî bõ¡¢ÌÈ<ú È¿Øñsi¯ÖS°Ó½™µ÷¬!¼ÂﻢËC8×ÁKæüð¦Û…c¾V8ÆÈE…Do¡6ê$DZó«ËýZÄSª— —/vÇyliåcfù£#Y NÍ(p_4®©²ÐCb7î„ûß‘î·Ì]‹á$tî?€ÝåÁéj* _Jú‚‘PZ‚ZªäFÃsâ#e'u•ƒžÁ¯µ_Üà£o¨`ëéɤe.)o4¿”×ÖiðU¤*_~øÙN1T­ÒkسÎ[)Ø}êdhYªÒ«×UA—R§§÷+÷-o\ÙòâÜnɱÖ-lJ«þ”×eiâ“þ³R£üº0êÉ^–|Úô6úq‚†ž–¨ÿÂdõÅõ”EÔ ÝuzB º½¬u À¶ åa\ƒøî·hà¼Ã’ç}MG&ŽO€»XTy. ªï~ˆÔajÒ´¼È”«ZîÐ_ ­€Œƒ<1Öö ®LÖjà«Ûô®)ÎGé6yt#±qA/¼¹ Hq>+1mÔ¹ó»]QweeÿPe;ë-`³ë½¯‘„DŸîú‰ŽßB? kÃJÈ?gØ´ ÷6<ß¹ãB¯Ì §t¾M¿ …”P¨4‹¦/Â1!Œ_à'é§*³M—Å5+¡pT1k½ôÉpÇjÅ*0ëÞ^þDç¥)|‹}ŸŸµ(ý† b¥ýÙ*¹—ȶ$Ã8¤Z/Xʧ©åçO9ÑåÒô_~‚t5R͈¯ìJ°äÀ„•T,Ž ÇjëáTæGóFêêNS+¾\ I©®_Úýœ¥Ü¹—?ê%ñ8š _ӴºÔçù¿#Ó­2`?ÿgzjG‰„ñí×Ç<ïCÐRƒŒ¨Îqà\ä¬Dõ³-Ö>µò\¦ˆ¶aÖm9"^M=k.åáÖNRR$ßqÎËÔ¹G&Eš¶m¿Jê©,Ÿ,~9{Ä-•’cqQ§’ÂWîPps³õ4ŽûLV7Ñ£V+1˜äÐA]ý~ZÊÓ2àË郈 ]EÚ”v^÷ó„ËØÆüœÊÈTNPäתÖLV§²Ê²õVmmyœÏ°­…S%ge'átÀq½… Vj̃ñxtˆ™Ðòu˜a*×É£uh-ŒäF@ËzÀ’í}­Ÿªã™£Z)Ø$ ©’5â1üº5GȪ  –›n‰Mðÿxq8&°ŠÆ4&¹Ar$…~>͇e9¿öwàè/¼é3¼wFJ2˜}ÈwÿIû‘)ËÈ—gÔ¸bEÒD™?ªÃ<‹@m­¦ }M;3ÅQÊÀó¬jÙ2+ÎYd±äÖÊÒ¶›ÌB«–¯¬Ü )°•“D³ÂM/ÃU¨i‘÷‰÷~×ùû½Á‘ &‰éhr¢¹þ-´ÒK>ŸL8DÀºfâY& {kÉÃWoÃÀcÔƒ¦ovéÖs„·ÊU¥ˆ;ƒODzåî–ÃzCð cX<Æòš(o×hS‰µ¾Xï¯63ОD”òvH• †\~Šèd®åwµg‘#}£ÊrFø`±¶•× ×ÐýAJæÈFþÉrkïË}ä(—ƒ¿ÒXˆaø‰É ¦y@4â¹mÔq&…V%.¤lN¢Eæ<ÐoêCa—g-îS´b–Z’ZJÕ(-BÅRÉ,ÔùG­Ï ;<Ž{™Œ)¢",¶¬Þ%ÛuUÇ”4Dã.Œ +Öža,RLäZ9êVŽ=¦ìs]t𠔊‰®$C†6Ć:hÅ`‚m#LÉH)Žä\%}~®ÅÎwã;Ó¯)o 4aú*ïKCL‘þÌš ñ•8£¨•BÿèÔýûp Fd_­}…¶¨n¬#èù2xí·S†gj£FaIó<þZ‡*†&'Ùl-An¦›a‡Cü+ «ÖÎ2êW¹å§šçôW ‹˜,õÔÐ?áõPI¶•%ü ÅÚª9ÔÇì-¶Rˆû.·”lƒÚ ‡°'Öjv.Ùžè>Þë*›¥n’á‹;X‚ꤶ fÉØäÚÒÆþüìѯßþ$Uš¥ªˆ`lZj5eÃ4_sް ‹A4ÚŒed1Ð`xð|€´eÒ\ôNMedÒG¥~r>Š/ºx£ò»Wª™ÆÎ7m2Û~Üôã}”+H¿ðmFyßÏypùÑÀçT­ý§íw§­MârV%®JEô·ç‡Jh­Ó¼ ;}QSØ^ž´5°‰Œ®yÈzß&ÁëÙH.“&k4 ¯L;”nFà›S&·µ}‰ã$žU¬“Uû4š¨5óÂ䇣U)Ú ¤ùa×wUqYÜ[é-+>g'ãOÕ—±mÿeÅw­³y"'i_ð™÷©v¬ÿmêEíP ú%|«~4ö¯á˜¦$‰Ùörÿv.Q‡Vw FÁéåd¶€fb!¿zñ’tN3?7Û´ÒA óî/2êÎ>U_ÂΰSâ //`¥ñ%¯·Ò¬È} âó#µC²Wÿÿò¢‚é @¹¨Ll¾‚0¯e…Ld3LÄf¡âKçÄÄ®vû^/í©@ O•íþ‡a‘×9Ý%è‡ñ'ŠðA)öU°_ÏTö³q28cOßÌôèoMGÛÅ û]\G’3Ãé½€{®:â¤ê4^K µža`d0[ñaʱc‘Œ3ÉЉѬeyzïîä`¡)½ –…ŸT!/$}zµ€©<øë°ÅÜ´ Ê?öF‘²#Ïèù¸·¹Ví‚<$hN1 ¿2=.J|€¬ ¡³‰Ohc™ï¬6•u–c¹Öös€ùžó¦Cäù¾áf­ 7Bdºe!úC[?n¢—¸xÛŽ//Máºð¶ûîçKwZ"¥ÉyóoØ…ÈM§èÞS7ÝYÁ«ïïÃø \ä1°*«Ðð÷†?z÷´\Í>¹ÅCnQSÑb‚¡‘¿ûòÙÎ VeÑÕLÖÇpˆð"„®ãĈ µo·—äùfL ÆÓuͶàÚ¸H÷2¹Ç‚Åc±hùËØ¤ò[ÒÊâa4<à?}| › ” êéQB¤Ql.¡­ NS$ç¡ìòzi -ìªç/)|*Ø© Ýa”>*UT»èr<ÖÏUGß¡éå®,G~nßÃH}Žx$òvï:g-ÆÒm^ 2„hF¼>A'Úqwèf§ÿzª`Oñø¾õVS÷Õ,Ó¤;8ï}R{ðÍgt³Â`'‹8Ò¯IËMĹÚMÂBGy‹3|Lð4Yóˆ; ½šhB&—¾cCÂý<RçmþQߟ }ý+ëD ¹/ð™ÓUdÀfxëZ² …c~ù }mÕH=R&GÒ1iê˜å¸åeà<Á™qY_ÓT`3bÿ ž:Gg>ÕbȬ^ê¡J^‘„¤IÌí[—ªuCžÊ½êvë¨Åæ¬5¶à;žM¨ÏZó³ó¸*¥‚¸¤ÉY„" c \Ÿß›Éàó©MäììL¹ì·qÿR§™Oî£uŸ ò‘CÊä>ƒ©¥›RÔáCù @²'€Ó‹c mج£‚‹„sIßÙdÉÙÆK ÿ:¹žó+5žÅ mÚ§8Èïf¹ÝX6ïâÿoµªŸó‡±H—ÿGŽob«&#ó“Ù´ÿ~V%lbô‹ÿuÌóYÙ.·ä ãŽ3‚âÊž/ТoÊÃ1j6#FL­‹Ð'#ZJë –\Xùëÿrûc“kUö3µzäùN<Òä€Opë_:Ú”Jh=qˆì„Ȇð›m¾?!¦Ç'ǯ 2óë æÐ|lf’eƒ.ÆjI´ÑDKòì @G7EÀ§Ñp–u’/•d¶SÒ†í±´`¡ßL½ø ž-ÆfîÈVÇJ Ñ†Ü ßkˆ“u#î¦ÝX©:ŒT…83µ£[t›(’êÃסkmkIâ*ؘ·-¡Ò£¹íz¶¾Q.”Yе¹þ}ŒB»?«è©„¸,1Ÿdר´Ÿ.=“¯6a éõõ¾‹0EÌ~øLÞÿAÎŒÇÍ<œIjÕ¥„?ÃÒbàÛ¸ ²ì”ÄÈŒ4ºZag²ûÊ%®“ÜO¬ýv\ßé–Ñ8ì3Dï¬\R¤Z¯ún_¥ƒ„Hü„0¸%‚Èù'»Ž«O%þ¹×‘šàôÜïÀØ/…;âôÅ:Ü‚´§½ÞtW]ü¤6¥åÓïóZY:k´R¡ð+`RÜ•^WLìҤ!NsiI\È(Ê͹7%£Ýo?ÑËD?7·Z& ±ÔúA°*iÇQC­ËF¦m6·u<ð×,»Úà¢Z6Ÿ±‘ŒÿN&á"ËΜÈJ’Tù`ŽØFˆ¬L/;Ü`mÃãE”•ƒõŽxîÊšôïÜhl—ïmŠ'WÙʼn:¥¢’ãÓ<»ãw.¸qùéÓ˜…fݨ¼[rVTvsâëØ š&ñêó¸Ù 72w·%§‰âHÍÍ¥ ¥²ýßm9P¬ºÏþl×7@‚²Ð =(f¹HŸ·Kÿ+±Ï´¸«Ù˜Ç;ž^XJ3Z‡Ü’B½Q˦d§¤Úìò_>û)ÓÉþjà¼}õçìYdÓ਼ø®ëì’ð;ÿuþ?ÿ~þ_ “g+õõµÊd—ÕѲkÅÆNŠöÿo“²–&oxïᤓ݄mdÖÍÎü‰V.´ÅqÖŽ¬òþ̲Š8hã$lîS¿U²wð´ÿ9‘¦¾¶¿½\$'èŒZ‚l të%híçGWÞ©‰+1‰d^±ÞÜ9Í/úˆ_ª^k„2wîó­Q÷­õ•ôÍÃcÊkŒîÔÚ·QâÏ·–ìsX+€ÊÿÔQ†WB]¦lQcì˜t:I´Xlö {.¼â‚ÈhIEõQüÈPgº¡¹(ÿ2XÝ/›É©™Þ“ø‹Äû‚1¡iþ¨YFô6Ò ÎbêÀkë~Ù2Ýv[v¡E¥)hz²QÛž=Ɖ÷ÆÍ«XÖ·ÿiùÎåYÓv`;“‰¢n—³Ô…yÔ/Ø7Ä/.gEVz°–´y‘qËoÁ±XXê”–O] ónÓVž3[žŒ?ĩ-ó¤ó–ØI] ÆÝVÛ„®4ø£å÷HÌ“'ždrr‹Šõ+»ÓM vfžŠ"Å2¶U%O|Áw ÂMpuå"ÂëÙ¥h9šúèÙÁfE‰6‹@ýtÎ삘í7y*7†‹ÀÏ–€JÉ%_C3êi$@1-Z1ká-p–Ò°Z@?ì·§7gl0¾7“Y³øÃK$Š$WÒã˜QWEföéâý×ÇÔ‰t­w:ðù¤ŽaÕÐT7çàT³>ç x„qµñYYh3nêf‰ô7õTj䊑‘Ñî °fVwg7Äwîyß-b×"ò7à.Ц9§)"Ä`à0Šý^ †Ë¾ºÊ{œåø0âÊœ–»ÝùÉ„ò˜-+íþ+/Ö®¹Êsr½ò:ÿ9Æ¥ëÿ4½}žš~‹ ý`¨Âu"Î9· ¿Î+i.•y×2¬˜‰4‡ýˆœMlíÿ{oª'øJ5£÷e†‚Ÿ3þŠÝÔ*4¡nåÑ›>aÏSŒÁ­ $òaBºð˜Žé2§WÐû~ ›Ûd ›»çìÉÑØóCƒ†4`÷T#÷«•Ó3”Òå»GµÒ™–j÷抌SÚÞr¾“Ö^Ž‹|鉹ð4Csª˜rg×£‘ ØkKÌ*éŽ]‡ËLá6x ý©!4^DœKã˜JPNž`Í¡@ßñÔ…ŒŠÉ º¯ôÚ5¹ßâü[çRÙ'Í_î0óŸ¯`¶3U†.i̛Ǔ-k%̇þÊÌÓXìO§UÇ9¨Í½LÉØG2ÔJ¸ÿÿ++—©|¯jäKì" ÁªO^ô¿qÌúXë5doêa´`ª‹¾Üóé¤ói…]3»‰Ú°½AlBUÉoo¸R2–Z7ྕÝñ¦©SùU¾Wü$Xp’¿W¹UÏ™iæïV–½Ó-)JàV•w÷Ç®7'i=Ò¥]Dþ|kF“Ú‰ÕëLØ%ëGIi¶VäfŒ3¥¤¿‡4\”B§Hß·kNní+}Ö÷ìJÊ4²dp“T™Åc©½øŽ…ü&ë§OÛëw<·ãë÷óÀŒ&±š¥,³WhÕPS’.ìBV"«_ú7›ÁHÑȬøÛ¡áEt¾F%¨ç(˜na~®+2 ý¾nR ¾ÿy¯|ÑOpÑ)W+nyÄÊs49 ×ÏZ:qÉba̦ª‹/PÅËUàÒŸ‚ Êöš}ä0J™'÷.‚Lj™0p‘?NQŠ7­Âì8ý9e•í ¬tö«§ÏãÁ"(Ç4ÇÖôw¡±k¾˜:q¯¦qä#NQ¿+8¨°¸ÂBÇÅj•X¢ž} Æû@X£Üñ ‰xÇé8½­ËuF´– ñµ¾Ø-Oã36ˆµó¶qµ.¢G\ “3›'ªµDGy®³€óÃ/.&Þ[±‰ïìw—X8ŸnipÝ[ÿDoïüãw“ý¬oâÀ‰nß|ãóšw˜ëL‚Ãå ¢BEj‘Ùž_N$ßÁ0¸ôNaãFÛ/1ðÈäy,Ô­IT8ïçºÎ|äåŠÏü³kqôa!b¯° › ¢ï5ì­²û§ô§ä&YïßxCv¥ ¢ úCðpßcsªÍÃÑ”ŒÓ|N¯(n”à*è~ü%ÄOјpDŸð´£Íb©r Á¢å3Þb)«QA|Ò(ý”ŠÉ º—ô>çøã±';]u‡/—ò"ûi™µ ˜Å>õDôX#&rÂ÷Y»U±Yöµ*Ӕѩü qOòR1aöè7þËBÃÀÃ]c…ÌV´%k>Û*œHW~ÖwªŠÇ11)¡Ï ß×jñ~“0Þ|0Bñj¡v©,79Ëç³íÕ¬s)åB!°#ç!ÂH°©º¨|Oö–k„Ëø#„Ää§=kº”H‚ŠL›?Ük ÚrÒPKÿ+W‹7ó2F·LÊ;Ï\ò“ í©0þo7!pD-"òö!¹ð ½>ç”umºêh|‡3µ”¢³¸O€­ƒov16"M|$‚UÎXí×3tµ-Ç·h&q^ÑàÓE˜@š®øyÔæHúný|Ÿî˜úPiÑuÿž‡Ð^wO"8N±µ¨c5ÔÑ*z á 1…¹Òt+„„ý•ƒûÆ´œFQXú$úö¸T×Ôw®cŽG_ŸøÛhË“ªþS¿ß^útî$4qSVª!U["å½þºÿ0£wödï¼Hï™QìÚ´:Ö 0‡k<:§‚Š0Lç¼ûG1-— ÓXGÇõ„ZhÂ1=vzá|rrÅËwŽcjÏCêÉÒ®jzLh}r4c‘6t%ÝEáçx/ó HÅ›v¡+3ˆ}µ·‘ØSoÞžê—IÃÚ4²ÒìT/Ö]\jòw=·rˆÅÔ³Z‘µ}\T/Ý;¢Ã^™UëMŒèýÅxfÐTdIðXìøF~±C$Ù3 8ÅXh|â_‰Ø² ºÁ',¶xQ TÍ‘zÄôsÝÔhb XŒB)£]ìíˆz| q"í` 9¡h‚Š«ŒÏÄ`Ÿ?t,TÍa†È˳·›ù¹Âð@/ಜA±+m˜3üB`ºäinŽFR½ïçhÊ5†rä=øõ·-š¶}‹}®ÑË´‘2OR/ÙOº?L…>~I~`ÒLå½?ží”!uŸ‡Sˆ# Fƒ)ácø°&kh!²&8+‚`³4ä0Ü%¶à†,—f2§NGtº¹æ­ðÄK ¦ÜÂi «Ø`†ëC*ˆÏA€Z7t(äI|hg‹5šk3ž«Q<´çÛ(ëú±dœm’Œo¿"“˜ ti4®Oa&C­ßïÈUHŒ­aW z}ºhUå=µ&ÏÀÌi¡|7Z…iM0˜5ɉÉç–½ÅÉÕ $€±¬á»³Ó7À¥f X¢O–ÅG ºöœcù[ã¼ÏEyA/Ç42<Ëñà Ô ö€Ÿ V|(.ŒýΤLÕSï¤m⌻¨ÇúbFŸ3êdÂÄVÄ"®t;Ø*ioƒpÂ÷X FðNÉ\õá†^„Ýü¨ˆ,ÊŽq©ä¶^Úiùú¤„žòɵÞ‘ÿ¤9ù +v]F7¾/ç}D‰Çʹ’—¿¹!bWã·ÒÎSš:¼Â¿V!Š!=H/;Ñ>@ƒóK³¾ʾŸÿYÙ2¡Êy·8Û elœc.žÜž‹1& ?ÃÑÊ^§˜%¿¼jµn9 ,ZÅpŒ·QÆz…øùJ"V¸èÒ¯U"^àI(û=¿‘ƒZ„°`˜Tö÷κ!%îî}ÕÕAØCˆÍ° *51OáÆtJ˜JÁ5ÿ È`‘ÀI?M¢†éÊÌ%d>Ý^†úÕûUÖZAEö|ßVòÒœ]<Ñ@ñ÷GºûªJðd’Ÿ‡¸Ü˜Ë®ïvép¼µttãY+:G_X¾ð ¥+LQ,` )'í † ‰›½6&`~UÐÆô|yž.Þ\f§ÙÙŠÆÆÂ[6Ç6ÂÄ sÔSze¬¸k‹øÀ[ÏY>á¢Ãé¾g8âq¥J~Ñ- Ê” Úèj4$Vè{áO}c‚S¹â;{£å/Žy †¹Ñ@L,¹‘ †ô•ú˜1o8e8"R+wž(Æ<#5¥J!É,¥+‰g!)ü™Á˳Á£q«5ÓS% °nFvkø©d(+„/"è!ˆ;Xsç•°_­¡A™…þ•ä_²µz%¸ñ†D·ZC«x˿ʯ uîî7Fw ®éƒIG…!”Ø%2Âæ ±ÿb=,6k¥OÍF‰ÙÅ¿Às¿{úk§2:øóÃÖ\ýÏÕ7‰âYbÙfºRˆÒ×5Ä.ïÊvòþ Å¬Í ïj™ã@ânî.òD8-šmðFìᬤä]¬d6ÓË%¦Ì¯ôLáÃl²ÿK…Ü<)ë.ßÏ赚úÜNÛÞÿ29rxoÝŸ-ºFØÌÏ!Œ× †Ø a$©`GÑ¥—h™xWâ ®~Pu˜áâó›È;.ĘW«‰ì« Õu"ñ<íQSÍÊ!f~Èÿú®çA%‚/$w³ˆIOfÞ¹Ù´ÚÚk{`ôÜŽ†´/Ô’@Kô°Ö bÓíÛõʽJô¢ý Î.ÑØðúÜü ØADlܬ4&ÕϾ›„%uåéc3Çê-@F ¥.O|âE#`_j2’Êž tX¡ÿÒ˜ÂÄÓ'‚ÿ î²aäŠäì×%I2 êøâº—¬Ã…bŽKì±`¬ža­“ÇaÄ.j#øž}8S,ß¹ò ò¤^‘Ξ÷rÍó#­V^C²EÙWÇÕ|fߎ gH6¯°}âÁÏL.o~,žÔ{;?YŠ£E»Äeš³GVœä'Êm) åŒÑ6@5vz=ÇClÞ2]„”Õ|ƒ£2&Ür„s›ïøÂ¥p]É­ ãM¯h ÃÒR- ˜×@@¦˜¬(/§¯(l«V²Á¤¢Ád|ˆ Ð/dó îóéæ`Š­¥ä›{j‚$‹ZÂöÀηcÚz¹:ûê¾BÈÌ·™\eS> P^‰Òž¡=­-Ë'b?`0RSMÏ‹kp$ñç¯Ó\—<àØ{ª{´{­`Ý{±û¹{³àt¿w?z[Ýàö¬ ©Í1˜ÌcÇÓñ«‡ïšÃþ @spnQø\|‰ë}…ÐfÝ£×Ø[Â>ôé´4Æ­Wï8ú$]C2ÚRûd«^Ûׂ‚×Ùô„¦´Zs;GÐÕ;€éßþ¿ï&8¼é ¶² -¦. "õB9‚:q±I¸3Œ7™¯õéýœe5Ék_r‚Ó÷ü{Ð7æ)> #ø}Gä%X,„¾ªŒ}½þ]ù·EG¡T-î.UÉ•¬Yacfçû9;\P½º&R)’<ÍtîÁ§UØèYˆû5 ¢  \MßMQÓG‡ ÔÀp“%I+ð?øPÊäI,¶°…*ª=ïãc¦UD‡º³íÒóWc¸íðî°¤àY,®Žù¤%ebæ3ŒŠ›ÚÞpo6NEbœb³58«2æ÷uƒ·× @^ž¯ö§{çù„w©ž¨âþì{_-xS7ÚO±ž,dϳ.­ÚäAËU-øáuBHÙÁ«òjñD«’A„”UWQg° T~)_›F4›¢6-ÞŽù¹†>aˆ×C?ÞÝÝjì“ï³ßùq †ú»ñ©éšß9 uå&¶T#Ñ2ÐνÔR·7%?XåÖï¥*çzPVÑ`©™€®–”tœÔù#ðõû`uý»|Ì]â§ ð‹óndG­-²sñ?˜‡ÁÊ(N @«kÞl% ˜ö¾ò ¹¼E±,#@ÿ8=’Q64’ګц“ áLRG¾rH7l|us*e›i®x³¨½) y_ÑÃg%#ž²¡Ð >³¶ßƒOècâÖ%ëö˜ñ`bç›mfËëÙþ~ <þ/*0>>Z¶Š· ZÚ³XÊÁjÉÓ„Yer„"\Å4ø;DHX}6Ni Â¹”Ì$ó«„ÀøpIÁÚô²ߌLD Ë6ç’× /µ×KE.læ >^* "Ê?ŸŽS‹M[ ºI$ðôô¯Äþ&]v°Ñ$ˆÆ+ôžùÀHQCÃ@­© æ¸Ç}~'½!_6‡j£¹Â£á¤Òž¡VO€Cœÿ/I%­ÐXf2"j½>5—¸>KcÙÁö- ïž7sCó"i–ÚIº£ºÃÖdò…ùœs¤¨Géæ"’ÿTŽâ±†…«×B2ðpÔT"À¡J!éYÓ&Û"~Ú°S{×<#Íaki.ÃGª‡uÜËOšÅô0²V{_>Ýò £j8Ç Ñ%‰Åõ<Ä×kÐr-¡3ºž%5ªóß<+Øå‹Án·3Äý’xDh'$ÍÍe#5»^±^0´Ÿ]GzUKD¹:⟞štkþo­+vÏXú¨ &>zü±bn¼¡‡S_ €«(bfLfï§W´¼b.ëuFj}HVEáú´çõ^pîñíø~­8ýZô;И?V¢ß?C¡Þ–‡zhïÌ2û„SðxôXoßJ¸£€`|m~Z<Ò€/%öÃÀJg?wa ºšê^%ñžÁX øåP8j^Œº˜ðÊ6FܧÔ|™Ø¢€&§`u¯Ž'NañÀ{k‡u¹†Jí¨•ÿ*û£=yÕ¶Z°Bû8€7”9ði1¾8Ïÿ`¿ÆàÐ ¶Í4¯ª…¢Qšñc½ƒÑNä&à(Öªj•€~UELÌ:a"}l „OXœ&¬Œj•K×ËiÖ–dVÆœŒù¥-ß°ªØú$ ¬ðægƒÔöÜ).·W „CÛïõŽÿ&`.¯EÚ‚3Ô ‹à½ÈLÖ+r¬ù7#u_w—åîMvÑ+`ú:vÑ(«"ž~i“çW%?"òÙéǰ^Ã,ïÔ›<£´²Ô”°Dwv5å;$ÿ`T2ÞiHt3u—M¿£ÓIëš6ÄjûQ±±`Ž!X1ý½–nýHç1à(‘þº¯•¢Õë̱j¢:pN/zt/Š´©8ŽéÚÏŠ+t®€Å¢X—UÝ`â¨äJÄ&ôéÈ,ùn‰ÚC~=ÍÄ›5®X„ŸqnÓ”†J*Ì›)›<¶ñ¹–}¦\}Q÷)¸W$ù}X2åJÜÁmwd‘a ‰µAãÄØõpªÁåIET¢.j ¢\(ZXˆ5$­>Žó˜ƒ(½løÉ6ݹŸý_øš«ŒNÂ\ Û£ 0ËAi’¥ZÔjbIìkï}NHÀ\¸á&)pÆŽu?ºùðk–Õ1èÓ&zDr¾•¡ïçì~¤[æa1q’›ßêæN§Ël-̰¡L|/ÃaèƒÏ۶ѹ] ®H2­7ÞژͲ”t—Ë6™ÝãÔVái‚9í:KŽídEf@Δ˜¤§ iêSð9â®ëç[´ô4›uT«¬ê·ËUt-‘:›0[žFÓ|àôõÛk›©'¥wUι×z¦7r¶ÈXo0ÓsJ¶Å¬ßE‚Г»W‚­ãe+ŽÒò]ÌÎ~6¿E#Mè¬/)xþ¥DBk‚/gÍÈ%âCýM©-S©†Pq?ì•£²9f(6í°¸æø° ãÖcPI)ƒ1âæë)4б§3Ÿ3c†ªËqå7´®7òùC¿°R1-{÷r£èl*Óct¡ ¤#(|é´ØE>ýj¶©úrÙŸÿwÎ>Ò—Ø!ÂbÜ=Žái/…¦Ãš« èi›0ö„Bˆab¬[J‹k´‰ 勪õ)ÖjãÏ­‚‘Yƒ}ªlÙþJ™¸`FÖG›MÁ²†¿gMó {P K‘‘šî­|ô”zÒz=t–ó5·°$/ðë‰Fç«’@5¿ö+жÊ©#ì›Å嘡!¤&ÝÃ¥r!:²v[6ðÝeÔr=ëtàCÀ@¤G Ã×Miò©KW#éÖ‚j³1Wã {Mfª™¨BuyK•ŽdÜÛÉÓ“ô¿Êû5 ³¤h.«ƒ§ gŒÚHׯ2¢5Ó:‹‡#±–cOM?Ú¶SEì•ׇsi˜%PUcl è,%‚ç“ ¯§“‘Å:§à£|€¥ÙëŒA9×=ù8±Id¥+ãö«þÛ2ú’§ÏDÇí?ýµä>|7¸/ꯧÈfpv;ýû÷Rmù%–Àa(ša"3æ|†giWtVê!HCm¸/%­ÓEØþdÇÓ4í‰r@h8ýþŸ§éú~Ÿ¦äk!šàűFð˜QÿsEL–¹ñùw·ŒÆÅØäœ¾›= ×!-íÜl9•¥V2¿sé/Óy`úÒEP¥ K?ðüDÕ Dû ¼iJƒÑô\UKêpS BÛyõ,iÀù¥ ³ÿ2U&<ÒOE­¼Eì¸PÍÜ™ ¸³hý=‚[FqN–;Oì¸@vT±ƒnýfñ?•Gˆ–a³«ITYdÊÒüO€ÉkNv6NŠm4<æRàð.±K·X¸w>™¨íþGhÀE±hsz‡€ T¯œãF\¤t*µ·üÀk:`zë€ )uàYXÀÂAÑBÏ æ·PB„"ëW8— -þ¿7Ç £Žü_ÇñüÇñü~{ †Høÿ%±¢5™ ±OùÓª³ôŽÖjCIà P Õd .ÐÊÌÅ¢>V^•áñÄÊwt«.I¶­X”E“’ ÈÓ_é³óÁѦÊiWz¿¿þ¶ª@¯\ :—£5]—ëJNïÈ» êy‰Ø_¬µ9Æ)›;Ô¿.­9¡äZ"Áµg«âve¢ È:…í³“\çB=hÚNm§hcM.Þ*˄ڦ{L±[×»$›ÞpÃApîö ›§“r¶‰+·‹4í¯>*1Å”Öyû(ô*íÄ_`Ð2ÅdU*l½tÇbÙÏx=R‘!dp¶³5úòí0ä0‡Éóe£8ÙKƒoANv·™A,–7øýê‚$Éëü:~¨„EDËcMýQÕ&a$…üx>W-°—Ä þ‡iNjݜ!ß§Ç&)³øe»¿T5Ù¨š9:@ä 1ñ¤£úC©õg€3ÇÏQYþ“úZ¾B#/[SÍÓ¨<øéõõè+–3Tù¾Cäø€ÜH Øã÷þ¿hÆ¢S2±íX_7“Ýrþ|¨H”°Ý,ºÙæ1u³›æM°±Vwò Ñ ãV« Ù¾{÷«è—ùrR EI$ÿmSq›„kFY_CM{äl(‡ šûi‡˜­BùTPÚḇo )g·Nðò…Ted8Û­ñ˜\žrX̽T~¢ ê[QÚ[·…–ÍŽD‹Œ0ª¾ä͔ØÁÒ­0dœ.Ó#vq7ü%q–-É“ ‰Ûq…4Ù4!±HþÅ*Z†þõFb¦@ÄS§z‚–¢F÷jŸ(‚µœëlÁàãDˆgï稙¤r¡Ad…+fÙ‰Ñ×l Ý/dº»øðõGÝГà¤ó|S‘âË;NmFO|ø8ÒU&D1Ï,I0‡Žk¯€dÎ x©I2ú½ÿÙic09¢ jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ µÿ“ÏÃC@ÖdºEžˆõwVL$ £ Î3Þ›U/†ßL—ú¤E¨ioÏ•ŽX5JÆ:ÏCMÙ8 E&ø¸t\Ic%YÊb¡__ö‘žáæì…3›ÍŸ_ü8¶èånéé%9£Z[ƒ:l©/jÅ_Apægž[öpÓîà™ð2>®I²Þ«[{U°à¦ôÆâ÷&%³l$÷‘V õp )¹õ]á aÛÕF¨0‚Q[*××ýº‘ `R­8ï³s˳¶œCšÈ—èCËÍÉkÞNÞ—º§ÛoµÁ"éý“7hê>cH5È5é.uG}¤NDÏwJk ºØÞ9w.À¶æâ¼íÑŒÿ¦üŽ^‰‚^VAÀ:ˆ€\}òC•Ðà}<þÌj8„ ÏÀÔ=šdPvˆjùó#€Ûo‡ÜÁ øO¿¿FŠFFMáy]ÜażÃüýx[Q“Ýáni$g¡Ϲ^›0¹ãùñïVß®Sý*’—kV ¨«ŒØDÊüL,ꌤÇ,˜¡}”SŸÿnrÄuŠ«gpø`¬“.|gõohæ9Níð-Z÷(Jä͈˜¹.â·ê³þˆv?ÿ€­˜€ ±ü&àRè‰OO'‹E¹Ôgï-³ûªÎψï|År œ?rS ”Àò GÀ¨V• «CKX¢3†«s$´n,„TØ ÝØTãÇájOο‡á[£;¤–°4Òxkà5edr¨P—нg#Q@\mªøu7Ê&B¢¡qtlš(çTf·¶?R*qn…,â¡y>,U-*¡&@¡¨äMÿ\í±‹õ ¯Q£Ì‚LÜÊQüm‚fÉ^ðãÚ¸v™;—PàcŠÜÃ<†ÅVçNdBýò‚]}œB}© Kùó7_GjPüHx­°´gg]ëÒo}@^z2ñ'¡©I–˜~¤û^ÞÄ©Žê°j‰U±C×ã%!|Å«p üî\ñEˆ¨}IÙ¡uŽ‘°ŒAÜ—½E<„•òàÓ¦Š{—u°+PÃô£Ù=¸—ÆŸ²ïùx®ŽŸOœëXà|–>QŒ¯I{ ~(¶xà?^©wTéf›H+ŸïÙQÔ[œ4£×1ã P^ÐXþ@éd÷c6ùÑêJTòVí¦œ°NX«¼"gÔÖÐ]†­ìZ5ò´a,&n~¿‚ü%¦_„—Kj»å°™{…’ŒÂ4¥ÎèWÙ»š³[RŽBŽÜ/fU(SÔCA¦]„¿OP3‡¶éõ Qò|°.z.o¡#’i³`i<ØaÑíÝÎ8gý-Þê]MV´|éä}̃Èd)×–û^+£ñÉø(ÐÐÔLåDûâB'~à!B3ñ¡ã|IeÊe½vˆ.®x„îAã¸ú]IÞ¶ÑqùHÑxÉ«$9<* HOÍÆ“xý&®k~vÃôkÿg½çWâí .Çé;t?<ÙOÉ“,pá“À6éЩ€{U 6X[žB ¹åœ‚Rb´É”ùëîÙôƒúE)JkñZb‰?ùP á<ÒÃí.‡ÚaÀÐ9WAGª$Eõ2mj½2Òc‘…¸ŠšÀurÄ3@WÚ—ä•aàf»2ˆó8å4$Âoy ™Qsãì~J¿´âl@6B2N#Aåt3¦iCW®‚\Ê1ОâBò´õ‰ø‹=+ž#Õ‹‡Û–,™…2}ª×-(†ƒäÎ{çß÷p’ æócnTÔ ÒÃíJÀþ?2¢Wô ·‰Ö\ úß-“¹—êîç÷:Y„>募Yô×±õ™ÑOñº÷†tuM Ìë³~ÌëÔ wZ~+âd“Ãs—"c€­±Ì½{=Œ«bihêY‹aÄ/wr@F@}ï@¢{Lw0Ðùª çU;'mæåÅøšÃú®—Ü1 µä DºéÐßbãËÄ/™x½v÷ÇA»ý×è0jÂÿpŽÊξì–}#ÇáÒìüú5Ï  »y<ÜÌuÙSéÞ)|K6à†™õ´ÁXã¬ÅÍ l¢Fú±#"ÿ>[Г©Š”²É£rÁ¾È7¡ Ò2Vi,H ™8Àh¯Ö)| ø*vPÒÆî¼€4w™¨‘¨Qi…kÀkQ†°k[}VÈ^b¸Ú³·qymxÓzòÀH²”%-©ç¨ F÷61]ŽA_Cž‡2 o¹EòrØa#Ój,’›^‹«73½jñÅpÔe‡ZRÑ‚ùÔk˺Ã9PÔŠGœ<¥õ†Ï°wü›ú üß¹]Äb êj ª´Ne\ªÒ Vý5l´µèÔ`÷e$/-Ð=—šÓæHfóð¶ æ¶À¥vT;<|ý\ø¡ŽH~ìÿUÚw;[¿jTG_²ÿM¯Í;¯Íf±·'>¦Î 4‚IÜ$ñe{o]™Ff«ñÕº…ÂïJÕskŒx%äçD”‚fÙKÄX”Ä2Õu7oŸ$œ‚íéÿ7“áŒ÷oÁ¦ÿ/"¦Àîñ6qÆ:ˆKöÆz¥€óàžÎC‘3çO`/µµ ( zü-bþ²Žž™³Ÿv yгÕÌ‹:)ÿpò´ß?Èœ›¼ÀÔþ¡ÕÓæÚ8'î4*T¹Žoö<@'ΰÏ~—‚oc2%ò/Ò%xV ƒ7µƒaT$×\\J-”xÃRÉÒç†Ïÿ yäoðÇ L¼w1¾™ 4< =‰)¹‡6FóøÛ'FÔ]Ê-®›Íy]\ŽkÃO)‰Ã*6²¿—úÄWbX{„"lM–ÜÊhè5pë—s²+ð¡}@£ÌN­nÌ‚ëã4B+tžÜGžšš?¡ˆei™´{wÅ÷X4LÙÅ:-N¼UZ$Ÿ·pdçó…-r—ÆqÌïuéùˇÁ{­E3jáÈšd<Ž(¾¥Ýa¯ÀXÞ_>ó@óoÆf©C¿žÄUw]ÀOߥm‚§;Ã+ ØÝÎ0å*¶¿å¡Éo¾ M¸Sñé†2[®ÓD渴-bUX#óš;a·’»ŠÀ_í¹E“DúéPÁ)»Üª'ü› •\Wù6b`¸{ºÊ¸#äGM “Û£XåÉLp]%vðùõIüj¬i2ƳCJ\Ž|^ë¥å;6ÇÑBqIÆi´jM%úàÈýc!™.rdp7g UâÁOáo®bnï´ÌZ‡})G€$œ(¡9=ìhJ—틌J‚V§r1td¿FœåÏø¹Lµî½÷J8ÐúDʳ„·7PDhDáE¹ÝSØf¢­¨¢eYþ­½ÃÈa±ËÒÜŒeXÐÿ)c&@{.ÌD ‹V _÷Ô™ÒÓyJsꃫê#ÖnAUæƒÜ :sí¬3eìoyš?Uå,ä_4Ð"î²qn¨¥Æ^Õ»•M«U.£ÐÅÉZ½¸g&«œJx£p>é°ò¯Ff åX›OÅŠEáö¨Ûq½…o™ÜÊÄQSq‡…¹¶{bl°{“а„Go¿D—Èiî»IÌZ ”fÃl¿1y–)Ž; „ÂûÚ9|´m¨¡„ÀúbŠ—‘`,DH. Vþï&ö·²Ð˜ddÈ Õ´ÔV/´ÉeÅÝÆã XÿA5݉K‚‚a¤,÷[j‚8.Ö?×õ ª>cò÷RƺýçW±h¨h°s_ê†êÜ+:"'h’(XY¯`³Ô\úÆ|¸ti½?§áä’\/Öh×ÀyˆÙšÚ:)ƒLâÝ Y¨Ö¢g#Nîºýô[ÉG}–âùP ÿr$ËS^»åÁ71nÝÕóÂ!Õ8O-t‰Fð³Z2¹nïÞɤ­§#±DúwŠFç½!P‰^Âä%ÃdÁŒdÖ³Ð&À8;µTé/Í=]dšqç Ž]ÐY¨®Î˜œ#ø[öüógëí z(/\«>ß” ™úÓ!1r“Ÿù‰]­+Ò"ž&ôA[‹ùù>T°Þ¬ÿ`×z ²kŠ“…s e0j;ìn¶>茳:aM>£ò”GßXJöF‡ÖÌ›·õô#bõÓ0Ùͼ´’P~Å`exÀ¥¡eîtYZøFEˆt0 †>@ýAìÜæ¼9s¹Ä”ðóô´:Åñި܆…Ýé+@ÐÛU”´¾­–¾ät‚TV^=îrÒPô‹_NÆÐÏa˶>RÏê:j²™âŒg ]‘ݲŠbqà€!Ú/J$ÑÔàÀ¨€;K;PÀ6æB[‹Œ©ìs ªV½‘!÷¼·¥F¸:Îçñ£pºTº—óPÇòí@yÛÜuÕ^Ï,ʰÄéêR$ gõæÞ¢£ŠÜ|O¾ÜdÀ¿eØç=sëF5†““Ï/†›®> U_O°åJé§²¢0‰?!‘ÃípÁ¾µäœ†kj’õgRÀÐd DZ¢ë`"rʦ¸“(‚¡±å3~Ò’Ž¾æÏ„Þ‡Ñç[Á¸_ ¡7H?´G)ž¿ƒ?Ý^žµû¢?ÖÏ5‚?hÒFvELñ±ÔÔ,r–œK‚¦Y…¿zb'ÏúÅ=gXçˆÙ¯w6FÒ̂ӊÙéä¢`gùv¥`ÓT*ºBÉ£- ª°Ó—Kz³y¿3£ReðtSs%l'×Ò¸ã˜;;|î‹e1zÁ婟aq¶*^}ËÛH†šcœÈ/[€e<¾Üi¸kƒ˜è©jAÇ@Ê$òë2|¢”õeÝ_2µž_–tF&Öcl3îŸvFÓã¤÷z!”6C%<;6mν&ì?SN*WUÊ//ÇáÛ¿ÎiƘUd@KýrNâà±µ% ëPV?¼$ôå"ÇáBÇàÛÁ,%hÒ“˜Å‘)8=+;C¬J€©pVA~7BFH’Þäš/#@¶hÄ A–âñްÏÌFã[éïk¸9S¨o#%tÔàÃ-æ»)! @¯¯§»~¼—¸Z%B‹«ëm[¬«€Vîã«T–Ý-\¨#´ñ À!tZ^Ö¸ž¼{s²,ƒ Åÿ9¾UŠÌ+aÀo(xàf†a}Ò³“à†!¼mÚP¥ýŸŒZmELÑ.V»_œ$¶`"Ê`¨‚ž &…ØO#ÅÂDÛÍòRI$’(ˆÕãYÿƒ¬k''þË$’I$‘ý•UNWqc¥ø3W;ÊTvˆÚZ|0yí±[áZB6ŸÞ'·¢½a^ZÝ æ+Яu¦GOŽZð™ó~7–‹ Á–_5N¼rH˜g9ÄöYÇáí+??YèüýI@A½ã+ï(¢ó^ù–$TãsÛÅ {RÌy6¤$EÎfAÀ½¹‚ ‡ KâÇT(KÅ|©¤SË5QK莅ŒÇÞ$¡ú…—‰«ƒŽ¥WPîîfãµü q7oNçëÏ#ðv +²‹AÁ„º:‰×7}Ù‰è*ƒo¥:)ޤ¬ÇN¯ØGt—œ`'ÍÇ.Q›=zÛJžSïìñYž8F]9v¨x™T‚á‹.E'ÖH¾Žº±éò k³‚Í=fËgÓ)ýB?:O/Xr¶ß¡É(×Èòë’ÿ¤ =NGp¹#‚G’¦üTfÖ¹£¯ðGÒ„BQð!—Á†õ4³¬>Âd–^¿Å9T—D@ÛÁ˜oy´(¢ûÆð­ã|¢ÈÜÍ}êxÄüå¼Ej[_Z1ºþâÐŽÑÆ+K(‚÷ }ßjÊžºóc¿à>¤tžÎ•"ê´éYü‹6úöà €ƒbvÁ‹uzL­&+1Ý{"„4ø1n=ak¼¶¦ÃewîU3d_ø<äøýtG¦N~YÍâù7MØŸnô]T&âm:(<*î#‘ì6:ç%…Éx™Þ_DOR‹p¢vh]lWEþµ›HÁYnIÚhÌÕ™Ùo¿ÜªÝK”+ýéX&-IÙëf}m;æ\ÜRX}Õ íµÁBK Ü|p­BNJ7µuoà—öéó/2ÓCÕHÞs¨"Ç£?¥>ÙÄ„b³uAÖ›—Ê»å;ÄKü+v]5P5Ml/,=žo>~T}‚¤HýÆ[$Ùúc²pÀMK6}¬N8‰ ×oÓßæÕ³ºýÒ7¢eiÏ¡ˆU{Gþ›¦ê¤¢è´’ªÕ”êUL&Å""YÊø‹ß5óo©BˆDÁ‹b)Ž~ûsÀ§Uè°§ª0Áï pÚ~ÍÇ/”dª>¯Ç‡õ¬«:Í7çG^O¨Â=ú¯„‹Œ¢Þ¶‰áµýMâ´ B:Çâ Éç«íJ Ðiæ*þÇAÐéÎ,!ÑÆ†nXx=Þ—›åÀKåj‚s‹¼s;V{Ň؈>Ô×ãc‚Öž~"*÷J«€§ —~Þd¸aŒ×Oîé…;#%äbœu:Í™’ôL–"å¿õa˜bÂRzü+ušojiÜ.ΊÑ+ƺ’:¾«‡<ÏæL'½Hæõ?ŠQúAKMÓƒ¥Û?‡žŠè¥ƒ> ž>Äb ÜŒäç‰ç? CuéNXÍ@Zñ‘Ii55ÂÇ<à­ªBº:èÄ|á8;nö×§z,)ô÷ŸèTð"êß3¿ñTiÇ’·TŒ+‹¢øô”ŒmÙñ þ»×åz_¶e(‡ØêHôõnóUŒÙìléA!¨; —/8æ.ggYý‡ûNõ4ë"½×špÞd Qš%=SÆu‰­}ÇòÔèYDLV0¦ ˜ì„Ÿ‘_ŒÓ¯ÝAÇT2l»Ì¥3Tó‰ë à† u.ó…5þ¨qŸxG¡’F)\ÔËÙHŠXøùîÖ•'×,u2RüYDä?Æ JIJ†‘;å¤Q ÀÀ)]@ÿ(¹ Qiÿz×¶«o‡@_lþ4ËPynùÎÐ7ݽ Ñ&zß‹Lƒ;‡G¸ïy>§ïú×Psü#vTsÈØ[2ÎÆÙº¬_Xð?q÷‘Jùòe"šºÄ;ShË\Î|Ì?Ô(¤Œ¿µ _ïŽ0afóc8š|°ðxÑl ðØvTcz&%Š@K÷_eÉ‚øÂPÜG¾Ó%TÙ]׫uJzmtS[FZiuGJT÷Ã+W÷¶ËyV|€ÙËh®®Œñ¢È8^#L‡“ËipÖ‘{Ôþ÷”S×Ŷ¤á:º»˜èÒ ›™Ìz½©%d` *õfóeÞäá ¦OO¼}˜41HIÎXÄ# +Au¯gDuù-£x°¦>ƒ’H Ÿîºyj&â;DŠ&†Û+E{6’¦Ç0½ƒ?à À8X”ï°ÔupüŒ&€R™·‚u¾¦Ôw<ìðO1CŒî€oúžèßUOÄÂ5Ô‡ACŸªûãƒÝW"P48›?ðä1$` µ£jƒú¹‚/ß2ú€’%¹èù-EV4βPÊ?q‰§./]!éÂ=ÜIÔˆR,ÿaa]§äà<ÃpÇñœ­nÁ©Gm¶%ûÀ·¥©pøY€*ŽMÆ…ýÚkoU&B–”“ëÏ¿c>_oôcBÍEÅBœkLÂN Ìqp‡q!KTzêý—¡´°–.¹öfj[ŸŒT„l9y+ÊÓf§ÂU/O8ß{²û=^×nd¸kë.3–×n™)#x/dµÃÖ¤%.¨hh°ÂŠ_lIÏq¾Ú±å2™…8ªH1;Îô«ÍH6ïùy(kP£ÎŠ£J ìG‘ž3«ç¬ô™ò1:¢q·Â0̵ôÊõqËùaO¯9€“§‚8³0·¬}£6QîbjDsX_zh—‚Vd’¨Z³Ê¦.˜ûuéºL+õµ$SÕ©?ÃÚµõtôÆÐºþP>ä]D”ª!ì”±!SÃvÓ2x …U#•Nò ïAXL~oÄÿS­‡ÙôLŒó%LéKãÅÍçЗÄ\”VúÓ$š3j5m•Kp÷¿I1'‡­úªÒ‘:å/F6~X ÕÙ«%A–ý°@„„8„»¥ê¦qNAüí³@:Rk´Öη™<™É Í_it8•E-ÃZ!牒vM›… gy£—ê8MláB~ÛIÉx¶¹|W{S‘•Z/؋ǡEÖ+þ9LçµÌ½PŠÔV²(çÛ |ŽÈÓ\)ë«jë`4FþÈcî/¦\Ä,Uû¸P£0Fãçu!*‹å õž³ô€Üˆ×¤$iý±TR‰:2¥å™¿üNGæød¨!§>ëÂ5Ò–w43þ¶Ñ½mWå[§Œ!+qؾïXnŸØ7¬ƒ+œ=¥‘$?ªîñ=@t,Èp¹÷¼Y½È†§/¶scG7†'O·ñJƒ‹ B?Ã…!áxÞƒÁì(.ÕŠIn+lÙÌÔÜâÎ8h†é6ÆÒP¿ŽVÔ>åÙæüÖ$Nã*Obáæ[9%½ÄBÒòqGG ê©Ce†ªÝý„5´½'âÜŒŠ´ûÕôA=w†W”2‡^~všUß%V€Q¦'|ê:ÿåƒÄæ[wâ<ÀSmþkXNzð,ÛÝy%×ÝÞü2•<»c8}_0":U´w‰!mÙÌq‚{”!³ Ãö¹ë³ïyÉ+µ$Xp<% Š­ŠTƒ¿•çã;0ý@G½æ? GõD·d p×T,?”–ê帟pˆ§@ã?Þ£$(ò|˜}õ äA þ2Q´M¿[°ºE¬ÌüÇó­D ÍÀÞñR´ãðÆ÷ƒ£¨ËLfQµ}Ö2@¬ïÅÌ·dao¤%¼{ha¸ž¾3ö$!­€.s_ÅžÖ½Š…¯’=;2|àŠ²i‡82;®A$¼¯#œì}V¯ÖguØŒ¶<%儦”lc•úÑÃq$Mq‰®kÀkzÅç9?dX=q’Îi–ìýbzC5w•b>ÃþÏL åâhôæ +¿ô‘¾c<$ûúÄ¢r,l/„©ˆä™îWnPiDòŒéÌ3=[†S©nÓ°ÈZ­uA±A«ÙURwÊd«­ª=ªìÝÖÁ=³Ú¹ÆÉ«7Å·mgå5ßú˜þ韖öPæ•ù»r<ÁTÍ-dé6ãßÈ|Â/É Ï9mþTÀ” Ó ç*he tš†HÀÜ¢ 'çSÔYìZtL¡ÁYf^S¬füÌl,0>ò¡c@Êĵh,ÇJÊÚìFÛðäóg6g½°Z`}wñÊÖf–p–i,³²®ËÍÆò*þáL ϯ¦*l1ýa§›%îÝp…Õ¢ &§¯Äâ‹v/$÷ä’òbÌ'ÒH6C•/{.‹ªÚÇb³/ÄN̲ûº:P7qðë¡búP—^Õ¢zâ|7>' 6ä§qJŸf³òZV°œ‚ãCpbHæH$“ø7/ͦw"{/köôáî6†K–`€ùc¥£µ,Íj.ÍcÆ8—*Î û¿ë¶³¿$ì›e߆†h¿öÃMͱôöD¿/×…tÌ 3T©‹ë¥ôúsÛ¬ò׉q{o¹'••#ƒ-…Ç¡Äd M*$0Ritìj&žpm1Î’ªðiˆ½Ë’ÿ‚T鯅d¾óî—(†gxµê· ),ìJáÓ¹T@ݯ Ç™^\ÀÓbŸ¥Öö§b„RSø¡ j_óà‹7ÉYüŸõ-P…¼·áo8àæ¯ùLXxnÆ@">Hؤ,,~G¼“ml R ïdWþÆ´äÒ”´%*V(²¤O-; [DŸ0Ä‹ú-RL­7_‘t½³‚QÃŒÂWfŽÔàܧÈÉøÜs(i+Œñ»¦ûÎDØ„£Ýꚥ•wî| ª^ê’ˆp3ÝP#ÕZpþÁÛÞeÀÔ]šÊ¡â:¸ÎÑ1Rð¾H²¼òYåç—a'Œ,esŒ¾„\p”çjvÕsVè%¯®ä8§´™«Ñdr–ñØùe0¬êÑdÑåÀÝ íp»Øî$ 刴x+“ôÃ'4¨ùQ}¨QœDkDHÄ%ñk’˜Íʨ;ÕÿyûÓ¿jGmͲ¸G ªðÚ!sJñ죟ꮪDº-e+¨$Iõ£1ºµ`)éño[4¾ÈªxJ )OëpN†ýè ZÂèd$¯”•¦ŒY]Üb‚è¯Ë×ÞÉUáMôcÛ—å™4›®ãÑâ¯Aî5;qŽÀTÄR¦Åw3«ââƒ/ó|Ííòú£–]ü6ý.ç´ôH¤V×{éñF‚GÓA6œeˆ(A)RYoR”¡4¸lö ò2ëâö~#yÕ‡Ž.(žÕ°›ÛOøœ‚#¸\uVÇ—‡ÍÐÔ»+ñƒHLXƒïR6hÄ"±¤¸´ _ðbO7G5”pŠ¥aó'ëâIÇ $ð99’V}ãÿ²ÃíÒh}º9Û§Àáas ÌAeþÜša¼›6% ¹ëýa@Åežï±vLé~ñ‰"ã|[UÛI ËÀ\Jü1™ttǬ þ|®ðýÄæ7S{s¾„gÚú¨ÉôX_‘4J!MØ›åJž´Î)-"¯¹MÞxé¯;â*_’l™VБDXZ&“çãDÖˆ¨ÿ[jß@Σa`Y9íæcB™ôßI;èq¼¶œ)Ýú“_Ú:z>Ò‹'•ú½]RNÂgÜ^®ãñh…d»ÈL%:„¢)H­pÍHkì Å]d+Ô4ŸÏ\låÇˆŽ±ÖfºA´7d¬w~ÕÐsgsÍœŽ‚ïF2?œá ÏÚ7ÖçÏ?¿ªôFq”bÜ\6ëÁ‡d®,jIÒîÑ~Éw*¬Õ%hõãÌÓÒì¨:›R81¸88 yŸ È\3ò>‚a¨9T‰–ñåøë÷;ûäÉø|¿\ ÓóGòçY/Ó®Ã.è°4nDà¬sp8ðäjp#µ?Æ}©3¨à±áÆ–×ÙA±––¡¾dãŒ?,q/ ‹¼×*uTè€nó†Ó«þÈS0ÔX Ö¬+]ÂoFË¡h=b1eÈ·çù;4A˜qФ”VÔiOÝS| Æû˜ö®Òc»Ðçáo^º¦0›Ygë³xÈÙ*V.î€Í¸‚ɯz°ás6š§fDÝ: •¥÷(«—òžyÄDf˜K¾³"~ò«´½|mƒÀ÷T±jŠã`R„ó-8Êä бŽaÃíÓ˜ü-x~(AzµÑ17Åoƒ3ØVÞõDÙS&Ô¤šn_ÿÿ|/¤ß®èŸ×»¸…€ü+n¾o›æù¾mñpY‡A^%ø\”³,ŽSa°Øl6 †Ãæ‘?Ϻ|,c¤™ö¶>¡ýhI`ºŒn~ ]²s Û¯›æù¾o›æë!®á¡¶ô5Ê‚Ï é¿{áŒÄRázÝðCùWò>pÛ°3ú›Ãª~\½½ó?/Np¬Þ»ƒùBj.P‹ÃMOÛ^Ìkî~:œÿ3„RÕ!nÂì.ÂëŽz^ .. ö6K úZÔ}¥¿¸åæ¬ÊÅ””s"|dž*/#¨`Pä¡]@wJ ÿIJ"¦³üÈåE‘Ìò¥ANò¤þåH_/•#pÏ*<ù¼¨ÓéRg%ÞMÒnA þýšï–‹Ú_Dѵ:c‚ÍfÅ<ç+à]8}ûd»)zîÿÌcVM êÂvûffI+Ô©Ðë é©ÉD޽£{JÀ‘ØÐM(îDgωkÎ#ÿg"/ÃuõhÈa/ÒŠœi£Ùð@®ÒËAmT¡CNé\ƒ>°’5¤Q%søu”|@¼D½ØüÚWñZo97Šäô©­¤Â4ªg5Ìø–*Ò‚d󠛈ñ×òqW† Xf#9û¿üóë‘Õž·ÿP3ü¦< G ãh¼’¸îÁç³ùMõꃺðwé-õçnWÔ×î¸.ÌL6m©̦˜v©¯2µº“rÎÂýÕ®]Mã9TÚx´v«{zûÏR5VØ pH}v¬WPàöÂÂ]IB»IZ)YtÂ{—žX?ªî’ø³¿Ô TŠ¿&ñµ°äWÔ™¢Œ´†‰âF=ßÇåøw‡üýEoÃÑü=qü;?þò?áÝæ?‡dßÃÑÏøv5ü;@`AÐÿyP„܃H$ÏxdN„‚WÇ«‰Åÿ 3A¾”Kù=¾ÉµÞ]uÔœ¼÷{Æž^óáÜnSΤ¥šDz§—Á-OxÚoÐñkÝ¿Ç<R1;ŠàÕVJ”ùîûÎ{ku°Ç8;®Û {¡ÖH?éœs¬kΣñÁ‚ÿZ'EÝô‘(H1¦Q·ÉÔ.”Ù¦4ZÌåÆtQÝÆd3êBKùH'D:®HzcÐY½6ÇH˜Ö¿¿Ý„éÅI®ë€a¿‡ƒC _a{qSÏ¥±E—éÜYÿyÊQ!ÍÁŒ<пo¢»iQ»„­™^ŠHicÓvAÓà¾ûǹfæ d3§äð9É4ég«¿Ø³ËÓ}NZ튥BÓ'®bUK΀€®‡àg6é[Þ¸š’ó ´®ý¨Ê"ŠÒB(Sô~ˆpù×!’þ5‹öbðp~bT< o@XdTܯUŠøtµK‡ê{r×A{>éuv èÖÔjZ¦Á#Ø[èæ“¸Øù!á18@k+­HÖÝóg2[áÇÞ}X؉£½L±«PJ*’“ľ”Ào±vôCp#.±ÂPQbnWás ‰ g5†ìËhÔVUðÂŽ ä&"34‹8Šu´bàðµ§Œa®àˆÆ:û~ Ï E½´i=îð¢3 {t\Æ‘—"Bo}2းĔo}F5 éËYqå¯ÚGM&ÛÞ¢6`ÐÇ8ÉÇõñÒbù±æ~JΞt,<ƒiBÝ×ÍÊwEÒôbÝmxzéz?é¿ü*>idzwÕ_’·ÿvl;xÞ îési†>q׺֬Œ«Ã„õæFœ4Z„‡÷<Âú•ÑÝ]< a2Öî 2Vê»Ì«O—4»¶— ÷¡D/9ùÝìuR·Ñç‹ µN–ù“ÛnÅš’¨ÔZË:­*XµP~=¯HUòlCÞTá ›£/¯×G¡Î6F"MУº5=¶Y¥èý‘/+ª«Å…&Hdüc7ü/$0mvK»']M”1¦ªì‘|ßaIû»­b;ÒàvP§áºtyñ^Ø›ó'áÑ3=ÙS9lë„èSú~7€aâqq…'‚xf/0õ•· ǤãðKšÔª«ó”ž”>ÃɹèjÛømb×+µS­ˆÉÝŽ6ÙÀ°Ý2i|¬Y²eÞO,R]>êþM×zÝ>z(Ëmå¹M|±WnŸ­NC¼w ¸n8\÷(Ú=Ì~¶1èßó[Žjvc((©miÅ®à8Àä´xì^ùqññ®¡ÖL¿…½JÒ[‚Vþ–Lð%3¢®-dXÁû½à‹çufnA·gŽcU”¹ä‹ÎJ=€BNÈúÞ˜«ÞÝhõìù}8—œeG@|?…Îãôd¤#´w½óBå”Ö3I#êq¾ã¶Ëˆ§ÿw'Áqû/.„FC™õ9ú:rù𥠲׷7˜ ̬6¶a ½“ÓÛ|]=ÕÈÍŒw#zl-4 ¹Áùr7êça¾â-öÞ^Î) $ûšÇ>ó”J¢s nÚ’öh«zP¢áH[\O .¾3tþºOŠè‹cíP¥ì†3R2¯Í_¦ÒÓîÓÙ]v[ªŸ– êš'cÍ‚<[ôq:蓺…ü°¾Jð'iþ^ˆž¢æ·äguUTS|>€Uöe¸Õ”¤¬düµÛÚN‡°Ç-Xúßz÷¯×¬üô¶T iQSÅœ‹&Zé¯Ê"fj>Þ¤pÐK£9üëŠßjr«è©Ù’¬ýbòÁ½µm g\ª°Zô=dÂèîq‡øÂï0yEפöNÓ3I@úú#QÞÒ s}ÏŒ•.CÑ„ã¸+n:°È\ ©‡.ðduS'46Î…7·eZT¡~¿ÐÕ0¼s¨:Iv”Ö5n†Qiž¸‹ž£ì:{ŒF8y¾ì*ãƒSMÚ¼‘ºµº0Û[l]ciúr FA×Tð¬ìÜ«`äp\Æ+½"q9þü°ÅÅ^Q2µ¸Ìð·<Ñzv ³éùȘvó 6 4+Cþ¡]Ц0J´mÌKrÇm þv üúZÑI˜¤·<·²V×q¶T3÷QmšS%É.™” ßHDÀ#X4呺Ãf ¥ŒüYkÁ?uðÔ›'×Þ …Ìv ƒóß„ùª"T^SÊJãf­UñØc¥~‘Kñáu+°Ò›Kb%h^EÌ´³°µy‰&«5,c,!³™üøÏ€ñú ÓE8)'Xú”y«‚WÏpYêqSLßV^mSN(psÆegßkÜL |€ÃÖÆ„(e%÷RQפf`n•7'^Zå6ºà±í#1UX=ëÑ!gZú¸Ð.ã»n©¬ –ÆÐÞé|ìMfÁ¢_jý—Ù³w.W²-"§z¥Ô÷M†ìÀHßX¼\íÈÝ®ªuÉ} —Æ{Ëм-It$8O|ˆ“ÃP#-®c!O¸¢,‹¯Rà,dèÄiA>^höMgêXX±¿Ù ÏwÀÝqðÌ 7bãËÒIp¬ªv¾yý2‰ek!`I$¶ŒÛ…?,ê•ú¤ì:Gý¾Uq•ÉâÆRÉÿW‡ M5Gk6äZ¶×œJg=-Bk˜Æ{ö?¤Oÿ/ WÚU¬²=dKEãRºú9Ùõ%^i 5rúHo­ÞT›Æ ;|(ÇÎ8tÿì+ÔjÎT¡ KF’û¢†Z™o$®ŸnC­jåS»Eqöß'Ì®GLAê5™Ö|çœL÷Òþ¬ pžFÑ8a [½’ 9Ë>W-(ßN¢Un˜JLÓ÷³5ÔMÙ…Nàr(ÐÔ<`AãIè(.XÛgø÷—Ó¤[ä´_õÒUbõ:þ³r+Ñ2ʼn–ôMo5¾gîJcZ—!HÁãkk`+QÒ´î$žîvQgŽlaeժżd#m¤c/Bh²å0¤åN·iG!é÷3ÏÉ÷ÑÊA4jî¡ âÔ˜ÒüقåÁÂÈ“€’Ú&?á zÞ¬Fˆ îü œ¾ù©¸,xšUa=ÜŒØÍêaJ6TLj!•pËý Øûþè”­Çñ^k¹ØŸŒôäýÖJÙª¡qäñz]2ªÒ_¿x%©d« ŠÑÄ19“WX0Û,K01²²u´‡Ø„6'ó´WW¡rŒRçr ,8S0–#/F¹÷7 g§ 7oÚ÷‹D­›Š·­\ÛÜFM³jƒx#1§ˆÆŸ¹d´ÒÏïÜ)2-ñ)ÃakyWô'ib8Zϼ‘ÒßkZ)¨ª‚{+u6G·P¢Eò•[Íaz}Å:uoã㜎ΠSZÜSÁ#‚è_O•/! Hʦ1‡p¥ûEþw@öï“ÒÇ'ÿÄšƒ*@Xù’yBmý1õl¾“.\Oc@ 0ÀçpÊ"-{ø\¢V¾Kʳ}ÃtWPþÜV¸)/Œ¼]GÌB<ï<þÑwùùã7\tsš¹‚Ÿ~D„º£å.²¬E­:P‚Zn°µsI’ÄŸËé/|D{Xh1•úýå3É¹Õ Rý'UH¹°\šsQèæš JŸšwð¤wZðÁ i¥-6O¬~‰éfH¹*åÃdžM£kÅ ÐUM|<Ȭ¯üc±¬¥Ù É£Dçˆó€5 W?´óÙÓW®ãì 1|ZXÙ¯hfA$£ÿbxÉïa‰êåù–pí×íFæn81T>IÃ…¸fI?†yÝ>é-ì5VA fõMúŽË9c¢K.óë˜U^kµ6*äÒ„îæ¯”º"øð\^6V±¿2]ÜœºVý‡£ð¯³þ{ŠÆ*^¦žð~´’BöRúö4ÕÃXÏTW”,¦#¸ªÆß:“¹:ç°4Ã| ‚•êùÙÁ"Ò×^³¨À»B™>?œN˜“ÔAöyF–¡H¦ÓXh½‚Íöd6h¹OŒe$ï‹ *\{èËÝ…¢çáÁÛaRÿ=X*Ë@؇+K½I‹ù:›Ãü#ˆø‹x—2QôW¨Y–Ÿ0£hb ¨ãÿGøÍ˜ˆS¡CÜvÅ„_d’í}g·G ±›îïÝ©—,Š]Û”ðWHÈ ç¸âC;O ú¾(ñG{*vQ¶ô8°j1ç&ʲҒÛ=ÝÍz,ÎF}Ï~o˜iÐìD{UÞÀ3,ë~eìßK`_q /AïŸ2ñFëÉÝ "aµ%{ÀOÆäûiÅ`çZV^@¹ÑÛùÍig;5æ¾|Ôâ.¾Ÿ%û¡§°c£ëhéËû?Ð@ŠƒÚÖMižM>î ›ˆëõ/ï6›•B*3Æj(PpmSb‰â»÷TÕè.£M çÑ2n¼G¥¦h9ÌE}爔;؃]•Â/ÓCßèîí…Xyzef@Ä;v¶ô¬WÒmßI„î1£«?ä7ÎKѶM-[q»|¸%‡„Ù €ó|ø\5ê‡,›¯ºšµ”Ul”2þæqk%`è½ã:D’¦ÂxS¿Öª{íŠh@ñHŽ´î ŒëìügöÇFÓ©B<É»§3SokÚ/§{ƒg°”¬ÊMg22ÈðJ§ö¥!ú¦(y /³Ãôz¶Ùv½Óœ"ìV2‚bЀ›+³ÉÕÕ:eò ÷ãy™–mHP*JÌ²à“¾Wez=ÒÌ‘f(º."wÖ”_Ë˽]¥0ñH4+~v‹¤D^ ¯3úØ3oU¡®L¯ÊÊÀ££èÌeªó?CŸ3º† Ñm×íðQEø}Æ ¨ôi\wߪ9xlÂOïU@‚ÕPqB×zf tVŸBÿÿhCo]@–BûÈÞùÝøëõíNC\Ž01ø¶kN'uDù 3“ÈþóÁö¸¥éµçD1zLÂvCéW-wk:>w¡),Þ‡3ÏØcU-ªÅtPªC\™íÜü}ò`G…¯ÿädæÊ¢vBhjiâ„]íê© 1ã{òÂôdœ¾ï̬:è>Ü ÅX&e1é´Mõ?ö&B)Új4hA„m€ìì>¡ñITnsë­áájèôì[Ùƒô÷59ËTšx˜Ñ•ã¼(Ó¸që¬6µ½Î ÏwhºYÐ9ëàë!LÕ6Ÿã¨(‹ÿ\€Ù [ü™D]ÅvíêÆé93‚7£ÀÆpq9æäžÐstOÄR¤_æßvÿ)»ø”‡s•¢\}.ƒpà.&–ËQZj7|S‹â(ó¦¼nChÛ“Úil7jýÉIúßâ4’I$’I$’I$’I$’GXî,·¦Uð×+d…Ü~súx„„R§ÑVd—ÄÛëøv8bzr‹Zzñ$"òsøU馽b×ðÄßÑK 醅Ã%~‚ÏÍÎúµQÚ–î¦U? ÇPúº¥UZÏg§Å Áøˆól”ÉíáO¥M&::,ÀÅXÁsœ72@¨‹ø´eꬣ’J¹$W º/7í×êfqT´[ž®çf0˜Ý¥Yî­zœ˜p}R;iqÃ]$ñ«ëTå¡iò+é°¡Žá²ìé„®¶ÓLA-¹7g’ú"ªHQk³tl?õ#i…·•ð3{üa#š¼H¦%Vgbs…­AK¿†®FµA"o#Užöl:ÝQŒÿM Äß4+¡EÃØ7b„剞›ê»ãV9$Öª«%£äô»ŠIdì ³SËŽ ¶z Èl2Š'@Û:~D5V±À¨ýë±.ùB«Ýجò¥‹ ‘}¸ÎÕ—Šæ¬ Ø•ŠP=sµhU82çàW/ E¨+ƒP¤,áÖ‡ÿ*âÿýÝ{4Û]¥5Þ#€²:îKÅC“µ¨Š¤k©s™ÖÝ«¾o=²#Qª Ã`Qn˜¹±!Npx‰û_ê+3V+bGg ÌáB«Í˜KKïý_µXÕŒßE6[¨ï“ºPi¯zèyJÝœ†ï;‹)‡‰×{£Ã !,XÎòù5jÂI°ÒŠ'·¨ïVÖãx6öt÷öH2vñ"Õ1ñÊCÓàã1,ªýÊ3Y©²>é0aN3k–¯›~­ŒõEev q=ä ê0 ×>Ö¼ø3† OéŒpý«!¿¶Z‘¶*T,[ï0]*}a¢¬%9@Õ|?çéYßH­õ´ºÿ!3UoüâvwpvªòöáfT²íb„Ï÷3¾±€ÎUÇÇ¡‹»½PŒó7 ÊÎ{„:oráT9™ZfÅ·Žôéóq´6 {A(ã¬MÎ/ѱ]Œÿ,ή%ùy'²ñST=*5){¿@Þ½!Gk‰œ§e%°èð,r-ÔŠ_­â1¬ñlˆû¦'tt$2ÙªÞ&k¸­|=p¦/¬ãÿ:ìzÃÿ?‚ã8ªýÄ»KA¯ºªô·ï㬋ɗJü;ÎOõŒ‚‚é#!â(¤üû„ËyrØévÿ.·;¬•,j²Ã/C)‡ä ¿pSêsJsÝî:1Réd-…; ÑËÇX°Ëß—¯?&ZYiøÃ¾©/HÜÕ«è¹Ø<n#Ùá>=h-ÏF‚Gƒabw¾ØO™¡Ég ñ¥û4÷ÓéEèo¼AKÁÛ@w½¼KÔ-Òçкò¸7óÖ‚óÇiËIÕåÔ~7vÆ$§2Ç ÄΜ"vXäÁ¹æøPmžù‚%0•ד¤ê qjüï¨ ÷€\“ƒÌÇ~ËLð‡¦€iêbºLÌÆBذš-.÷(ó¿kð}ædyEÒU à=AI6<`™Wº· Ïh¡¤[ ÀŽX\i€ô E|Œm”¾B_Ü$§þd¬*ÞÔ1€ÚáTžÇõwðÖÒ qõEä<5ªÿ?¹X" Rmó'Å•¥î?XÓ‘g ße™Zy®(žIŽgÐ9zA‘¿æÖª•jŸ<%õw†@ò;…Ow_·ç6“*hŠòt•ÇGÚdièlvaÓˆí9ö¥Dêm]Û#—°ªÝ*°jX‹½r.N¬%o‘Z²Æ`ß/;¤¡/â–2£Ò~drâ›röKïÈ`ÇŠ5ÿdÙmÆiäë‰K \UîÁ•­»!dãew¿Oô>È:6¦®Á²þ’ÛX Œôí|é½Ðx¥¹z‚EŒJq ê¥|åµøQ‘äÙÝr­T:ÑT9ÃfÎü,Âc/¥êøcåæ©0Šà1Šlæ&ï––¯‘€s| ëkÿuÉYª­œt>fíQÖOC9ËžK9¹o€"ç&Ú€X”!%þÈð3ý“L²’”Ç#%(íC—ð¨ vi¦¿(n†KÌd¶™wåhE~Z# Ø@Ecwߨs³øbï#‚1,y¡þºr¬m‹dVv³‡¶§÷\¯ˆCÁ]È(3çO=®†˜?Láe$“åW$ìAþ\ÿ,âwº›+^te [ ‰í ŠX6;ÅÕ¿0v®RÄmBAìlüC3.R:Džv·dºƒŠGÆoô7áD+üÀ$.?®5)ùPO©ÿjßZ—Û®wÐTFí©«šfQ„ƒ¨”{2+2Ý«çGñò6wj2%LKØ/D„éjoŸˆÎtî/Ê^¯[W=ýðÖÅV}CŽi8'÷#Ä ¨6Ymº&v§&Û#PÌ›dþ+I“µû²Å!ý¢o »Wp7:Ãg„?àu>¿ÿQc¦5Hw-¼ŒâYÊ»øÜ Í!K. ‹ZˆÀ³!!«ñúZ$±àqèðˆö8©få™Äe™Ä7ÀøÎïN¢%q{o!mšÁüÇ…­_ jŒL‡ø ‹ý77+33ì¼´àLÞö¡§‰&vàÅ3k¬ØºÂI6øNu͕զÆÙÐZb~»l4—.Çš—½êƒÐwV•žJþØupS -WƒažÒŠÅ<1x!µ õ Í;C߃ÏxI³l½Ñæ4_¬Ìõèèêî3ùè–Tá²ìfâÜÿ[ªTñHN;„yÐÇŸŒRøÛba%töÞ)]ñC(µXÍLZ³0™&^ùê€ò'E/o¶Yµ0ú¨¶r ¯ÆÉ¦ #¾‚QIÜ* øÂAœ4-öÆjGƒ„‚¢n½Ñ𕺊ãGpjÖ11Óá\6ýÆ8† [j=·Ž]­âÅ ýjw<£^ Ø7gŠšº&õÏ©ßgƒ±Lr_?EE5•½¾°›*ó? -3 Ìȸ’¸ÌÆíøjÁšwÿ~‰Döy2'²t¨žÚ9e،љ&ðêR:» ©žiKORRéƒÅff™)nú3A¶ ݤðDðÊžA@]Ý:Ĥ ß½/˜]V%³ZîWôÍÕ¼Žé<$ËcŠÀ;µÓ’½VJíŸr§ÁÃU§£Ž6 €Îƒ˜j¸ZÎ_'cè+n¿Ó(ÙÔ5þ÷æQéGLrpPÞCIÉnb‘Mâö¦9ûþñBT(ºï;•ÖÄœ‘¾ò,€2R ‰¬Eºâ!ªx €SU¼ïÜK|€¿¼¾¼ôPi˜µ)âÃÈ ûI.jÀ\tSI«E"ã^DÞ ü¥Àä| öˆ—!±‘ûæ%VÌ\ ±ÎÄÆ’µµf{×Y‚6LôPï¢cgE+Æ´Ú4¦Dì’<ý†ÕÓ‘ úc_Ja$€à4o«Ñt>Ksf^oÿg:aÎOÆ*&¯:U2(¸ì§#ø¢àš6ÓF,$T\@ß-{(å ï<Ö¬Mè~ni®H¡âCI‹¨/M³@ž±>x÷Ëštø {Í%Ÿ<Ã]qùë\|k¶67·ÇH¦ïý쌃æð¿õ®%Ç®rûùÆÃšÚËø²gæ(C0Áù™äÐ@‘mÅóÿüí¼Ö/ùb „ìcÐP_Ý“ÎâˆË¸¼U¦Ž§BƒÔÁpœoÊd”æf‡ëŒzú-‡r†¡’m^([f¼^ ÐŸ:‹4GË„ Âk=…Ô¢¦žÓSˆÛ¶cXÌ©’ kúr‰ªÕj–?Ý6Ï2(M €E"°íÙvjú=/ì?ð3ßóÙ+2Pÿwï(ާ?®•×¼«~mˆ¾`_J°ÞŒšk{nœ•SÕ!ý"Õ¸P@òØ÷?µJe»Ë$%ÿ@˜u:qº£ž3¨x"§,~Òb©”œ¤'Ü•ŽÛ„S ‹‘ÕÎÌzà¨$#FŠ“²WÆ}5·6ž Š¡Îü8g÷xzÊ›D™n³-‡P¨í,±ž-a/Pê6@ Óõžô(ª„Òê€ÂÓ%{”ÏóNQÅj)‚%}Íaªçé_M}…CC%G8ÊDݳot'#ËTϵ¸J?ÿ`£tp±}ò—ËÅQEÔƒ£iy»'èwÅDÐÕ&‚´³°Çà·ü¤É ŸÿX0‚1³…"&þqL³!\¡j¨Z¾ RKT2·/ñ’T‚<#º†s”²‚Ït£È+ðª¸x8h„Üú±,ÜÂHÂA#4E ]ŸÏÓè«ðî7^9îv¨VŠ‹îIMÙ¹ç7ùqZc×{%Í.djhœhöóA©Éê8oHô£"®.ø2_ò˜ÆÆlìµSœ• ¼Õ‡¹ Ø|>‰Õà±C6‚„Ú4¡GwÇ.MÁÃz÷W±f§Urmtœ~vÕZÜ˶²ûyœTïF_ÜýœZˆM!å}ç72‘X”«œú æÃYØ†Ú ÀÛD Õ5¥018\Æ2¦Žò~ã‚Gݦ¸¾wűVO®d•Ê<)‡`ó(ç/=T^Ã×ïÿ£_l±Sú£@]I÷wªÆNl¹N°…àqCy·Ü ië®n¸Ë¸mÚFÝè«Ìÿ*ô²Ù>\ bô*ûa]6çî2JmzPp€öDÿ)±š9X!g›Aì“Ô6C_ŒC#> ¼ÖOˆF³çð0×íôoÎÌeéú‚5Ðè…àaˆƒ.Àn’¬!óc¼Øï²mgˆ÷ÚdŒ¹åæ¢0@ ]—ô‰39 Sƒí$Ðp­ÐrïS ŸW²ª—u4‰ßSÎJIÁŠöµ³õòë¶=úõy€‹s_xOk'È×Êí Y'ÍÖ¬wû~'BÈñ-àm«£¦=וßf›¹¼4«ó³á¤`\€Èa~M ÿFb|áºÙ¹\ÑCI—¸47>´9äwtëþ}ºÏ=ä³ü¯§SÕ€ºOúG(ïêqØ ï æ¤È6lµ¼ÖYaþ:¯ÏGªægñ`lººÏ½HDb[q¿PPó„ÀÑÙà‡©í\[ª¸–õ¶n7ci’6G”\'³(eÒ*Y’ ¶S:)Qï!ŸÇªjáÚ[9=fº?ãŽÅÏ0®ÒMGÁ´xêÈ/jÆ=›¶qÁ[Í) è÷ƒNù5åÏ/ÀYgÐáñ¦WŸ âxk¡ Û`Žþ û/üTÙ\¡ÞÆ~ð©¤}xx#f?slü₇¡3!©<÷žgˆ}fu¾”yTê#j`,ZWX¡€¬Rk÷á0)ÌT”ä>xrÕvI uýž$õ?gL6¬tî$4qSVª!Z;£€ÍX¿•=Ñ2Ä–9ë§Qe4®µÄ¿W²ìj!SE%0®Lïô:Å‚7îÇ9­H fE ö2$êÁb½?(Üœ¿ 7Äm7J’Ø¢åQ?L©uì} Ø…öGYª§ÄõÀosè8Ì^OzM` €¹Œâñ€®ÐǶÿ5Œï;ivs¤A%£*Ô’U’=¾’í!³ãñõ¢Iµ¼.ôN>–R¡0ni @àëPÒl—P‹cÅ»Ë!š…öTVöþÏÍB7™®rÔ)’š>Ë”¶m± §Á—uÄÊ‚˜Èãw=±HÜAl¯ÀÌlГÃu#Lxd›ýBý¥‰Þo}øyÚq0ø?ÿtšg Â5šbÙŠmh:º³¢6ÃÏsù8tñ'M†8M™š¼Àe£ ;Í’ÓÒÊ^—®l (a¤3ÞÔ~3”´8¹¼ÎüõüI»ípw·ópöksúøŸÑ~Ò0ƒ‘^|»×¶XG…T_xܾh¢HÛ¬mïpÒ"˜¢ZØ{'u¥i¬lÕ…Xæ?êÆazw]ë¡lL GJöíGFÏo:¢Á«š†YlUã5pM4Li;‘÷|—˜WЪ\´¨¶‘ŽcÎ¸Àð]ì .¿–]µ 8ðñÕ.þÌß&°Œª¿àZŽiøüý’鉉W5ÓÔ¦:ÐU¥+çU<î ío=¦‰ù&ØàŠ”ó&¢ªö¹íÄ]‹¸†gö?ëÒ˜ü ²lí¹M–G¾œ}9•ÝÓ韽Ù~YÌkÆÌñßÌ2â´—VcßлÓåЕæ‚ó‹J …»ÙÀ•™‹²h7îé;D2‹¬Åîi\}»ÒÐîAÒ3÷M¢O²9 Vöቴ€D«ñj¿æ¿˜Ù³(—ñW¯µØÎ75#¾mð ªÌ¢²< ç5/‚˜¤³ÐÆWHW­þ ƒVãÍ 1$Ÿ‹Lú{ïç AžÏã¤6P´RÁ*l$ @Ò»Ìe¢ý<ŽhYÈdTǦ€w!€pVM®d(ÏÄŽŽÚÀÛ(ýf¸l,Õñ~a,*‡Ùn®L"DFóéRœ°Ÿ’ Zöµp.vƬ„eÀ®OG5 $e1}ÌÖ=xTÉN¿ÀÈÏXÉúˆ°¬)ïÉ’´ÆÛ?bƒs>ÚS*—³ èÆ8bo4ü0èòš`\;Ÿåͪ¶“G«yù°)0À’^˜yÁ6S<‘—á~OÁŸ›•†/Ìn»ä>þÁâ|qCFeóí ªÅëôÆI{6B„\ò‚Þ’òÎiËÒÆŸÚèƒSÏyÁy³lÜVpð™S›Ÿ£¥A¾(c’Æ4Sê2üç^ù³îWi؉DÁo¾ñP?ðäWrÿÓ(ïwÞŸƒ”¡ ]Mn+QHLnñõEÍæÍ?XnÔ5à‡„9œŸ nKƒ*÷!Û¿3bý0¼!ùä¸sybFmH m|7eÉI‹59ìÉA¬~pœì²gE\ûRYž¸‘Ó¾ªÛÆ¢Ž7}p '8BÚÇÓ–·óY6!èñUÀ.PLéböô”£íƒÍ¬DKØHHÚË_|Ë’4t·_t-ÞÖõ“?z(oŒ,%ŠcÊ\ì*’õ¶( !2•êê¦gÙÝŒx[véþ¸Äâf?á¸ÙxEà9¯Y;˜‚•ŸÂŽlÇÍ`wº±•vÊOÙ­ÃmùM¹ãèýŽ{ñ ¨>¾Óhçr)ÖžY_öÇÚrúkˆÀݳ !{·»^™)î¬n—÷‚޶àÇŒ µŒ R…Ký™m4i£=ᣗ Ì6¯+Y-`1œò;3þ”<¾¼&oÄMìCBWƒm…ïîTžh[Áš8?̯T“d™hHheG¬ƒHYêN‘´†±c–&} Ê`øÖ“6û7×AåÇÄe>©ƒ`„“X8 á Uæñ›Ú¤žŠ¢ í~j탺µ×d…±¾ ÿi%8_„ý$ý ¿Ü¥ÿ Ü’xúiÍÂ5ÈLË™™q©OËæÏ±v<ÙkTËåj÷dÝ9êð¡¢]Ê ®¨fSñ;£ÓÝwziÁ<°Ìþ¯ÖŧÊ;±ëZqyg?×¢$ sãs??^&œ_çåçì¹·ºNNµG‚9ÁY~³ç8««£*!¿t¼¶¶àƒs‹tWŒ³>9ø'ѯÔNÝ|z˜F Æšzá£c‰›®Ð;"â7o’Ð4E„Cõ™¿Š®ÓD—k^ý/TqÔKü$Я <ó¼¶u+¸éôãÌĈ:9¤1Ð讨=‡ ‘i HqÆ€¼¨·˜zs6 ’Ϥî6ÑŠãn¥z‚¨í­§‹±3ÆQ Ùïû¹t”6â­ä„5ë–6ÁTXDå=Þ4Ðf›Ý}Ö"þ¢ÁPi¦Ä°(ž—ž>“9s3se £M R¡"t"‘áçž^nú¡@Ìb!ŽÖ<«ÞŠàm½Ø}Þ=Û0¶ÞëÞíþìØáÑ?íøz+ðô÷ÑmÊÿ'³j¡ÏGŽ­¿s6n«Õ$8¨§1§ˆP]ˆAÆéGðœ[s$É8Ù@¶ó)dÀó­ŠåZ!ßÎOÄ6CДw@GmöEC=~ þ8“3›/&$¥ÀpɸïWžwˆ?-ÀDoÈùÒ¶e‘ŒH'dïd%Šì ºªñAQw±ãéÐWðœ"‹_<$“›&ì=™?–˜¯mªyD*Écõ}Í= áÿ"ž úÎò Šn¡[µÜM#x¬Ò“¯¤á5¸.d¸)ã S´ ¿ÆiaòșіÊD€ÑýŽ¡@Ô¢®øé7ÏêIì¥ô2Ýy5Œ¥½è`ÿª…¯’®7b溽òïÂh_Îc±5Š[êÓ@}u𵕖À6ÆåÎãðÒ¤1('–‰IjOòM°•[~–ƤS Sô~XnìºCÉ¢åÍ”ÐáûÈTÝqÛ@AŸkÈ;"HÑö1C–èT†‡rà ›/® œ°Ó£.e²×‚9§¶{õF¿‘î6ô=ƒ@ɯî)4 V(áØCŽ mÎy³¢„}³\j_ÑÀ4¾³÷¯ŽSsc¶Åqô§ ò8{³ÀÍbe¸¨;9eqTµ&G×jÿ4ô襖Âw¤_X´ŸÍJö>€Ïe¶Ô ÊŒIž9³œË!½H×(¨`6(½Ìiq½Íz–@çHgKø5ÉùŠ­Nò³ítIǺFÚh6®½eDp¯÷ù› &›Åôö† “ŧd΃¬Áí0ÛÑpFÖ%â'06z«Ÿö¿‰+³ÓÕ{¦ZJ=åuö)'>îÿ\à·…{fR 4g•O«'¼ s_X»öE÷l A¯‘3Š}‡µ0‚¨ød0x¨:Å ¢ l‚œ7®†œ°A®’—=2'Ì%N)[ñ@å*Ñ(A6êªe‚È©ŠÈÀŒfÙNµGÁZç.ºå”ýÈ,£Äyh…°’b¡üË< 0‡TY½˜'¹À:êžÙaÓ‹µÃ´øÜ6z‡Â@L')ýÒsh`o ÌÕWŒL =«˜`Œ1¬æG¦x«5+N {îrºJ>Í^Ü^jâ!­zª‡™±Œáûu3öèÄèø;Ñx~ÝIýº;wh;Ñx~Ý_¾­,‡ÃÓ°øz¨ñ)tΓ}ûž¦8%©^ÿTèãÅŸä-¨¬$ö¡ë"q7^Øl¬CŠ"[y„8›•ç{T‘íâ‡R%/ oáëÙ¤¹±KÒ‹êù½bY¾Í Ó8ß„ÚÍÇ‹ZcejJ>`ùîXch¡à…Ö¬IK¦ßï'á­Ô„^Ì_LjÕè÷ʰw£BæªRá, Š­[Êx@ÉXðG")â†u¡‹HƒÖQfŒ;5à´‹­HÒ¸C\;\pDé»—­zW 4"ìRÀ‡‘hÞ+â‘dßwôj!žmGÃ{—rÉx–­gRbŒ®ÂÓ÷‡½êµ§èþ7~m_g|«½C÷âe½¤~ŽóhîƒDÌ¢9ë‘™9êíš 9‡Ë!êBV/ÒDŸ3=îÂiÓ Ú¿¥Xøðj‹)Ú ÜáJ:‰n#‚õµ91jŽº’ÐK·¥ì®RLo-këFM€Ç2ÝÐx¾+ÓkӮ͎{“»Èá¥J“«X.c¿âœüq½×BߑَxÜ®º2ÔªÛ¥²ÀøÞ®D$4ó X½¾€”4R3“®;0ˆíyÒO,’'0¶åóš³ØÃoP_ôo¿SGa ‚JŒo4l "Ó¡Ãn‚æúÓâ˜ÕNõ2IŽÝš¹|ˆM’õeÌðèºï ð–x¨ghްzmÃxˆâPö8ôį»AëúÖ(L/ÀxW÷ ÏV*ni—Séòhô׌B®2$“6Cø©^§M 5׫âvH•(e@ônú³¦ÎåÁñ‚iËnÍ ‚rmJêvx Þq•¹þWh%3ll²N -­´ü2Ásí¿CJ]½³ü‘D f3ªÌSXêäª}µ¬÷™˜‡ûú•ã&™"Á"ã eîK=ŸêŽäÓ„Ný•ûíÍêý1‘öQ³¾´.pŒš$Ën0¢ÌÒõr:}>WÏè²6•WmØüí{å0¢Œèäè@l¤£¦iüA¡B:ö?GWæpÎ A ÝVk$+À®»RA!ä]«48à(ÒhËy:ä¬g¨ã:"{¥¦Boôúÿ ´;äñ§G}}ƒDSÚ• %êˆâ­ÇÔU1þy³Þºþå¡ÐTR9¤MDµÑ0#ò~Ú_ýÆŒ3®‘ʈA"bqð¦$¶xM¯¨ AwÈ׿Ùq@km@ :Íp€ËX8\VèÔÂïãMRj6”×_<‰ð™—98´>èKd[÷2²œŒ¡‹tQ¶ü.¶³V/~ÜÈfêF“ò8ù󢳄í®¹îîëx>HÙ5ÖþÈ_5>ñŒ ö‘è…mǵ•‘»Àw¶ Ë”ìfè<údCÃÙöãn·M.Ë\þiå²> aAÜçSþJÉL±ìN_ d4þòxùØçÉÑnI¡H5ôÎ,}w¯DBÈ赃È꬚Âû%,åŸìiß;³òsr+C‰@ úìûEmCeȳÒ“¤Ž+ÒDˆ=õs«Íó¥’98+ý¤ €ˆ6£Ìø”îl訃„}î©íE¼®Oë€lGÓêþJã÷ܳ4o¦@ɘjAY˜Ûp?ë^¦êϧvK«-4_ªVqèË—ïo fn–"•]vÎ÷TR'qF¡Õ…ô£Î,c<sLbáÍÊ%¦rÞj ™Â»”ÖÖÔxXW¨ó?Ê›ˆ‰öáAŽÕêqNzaŽª)ª©N 3 ˆÐÙÔ'5 ò¨3º(¨Þ-3u!Àûš§Y\ϰ©Læ;æ–"¨Ú®´€§eœk”Мðpþ˜Ó;ºãâ¥åÑ:Êm 0¿æÝ²çe4øR®ŒKíB>ys8—XÁC¥Nºr’rŽÑàú³¦;«À-T=çö|W½Qˆõ°>?ý±ò ÁÓ_œÎǸĹóX©AѶp¤3+†Žúk)dã˜Ïk¾ð¬þT¶b2¢»³ìÊñ¿5½×ä´|DVëÁ÷eŸwà‚F ܲùÍèGá[‹¶ÑðN* §Ûž¨(X”Oü^j,Ûìÿ.S$"é§ì™î™v½_Œìð ž…ÿˆêê…ìm£L‡¯hÉŸ_‡ ’°'Ð>ÁŽïÔ›Qù§ç&Xmçb‹¬Áâ~³©ö6 h<9lêOìv1Éé)ÌßðaQvK’—¸7.‹G+îÄVµë1êÆuçL¯‰[µÊc­–Ѹþ2§·-Ç4¯Ù,v‘ê­â¡£bçé"YcL(%a¤qÿ~‰6_0<ž6•šÒ;Îùìâ}®0.zCZcÔ½[¯aÏ>…Wr9}4‹¹¢/4*é{UÃÕ#{°rañøeš÷F‡@g¿~´ý<`¿šNA8;‹ãJ§[þwœÊÙJÇ ]âÊ1ý‚“+~5ù’›ë½³³.=ìva˶ °º«*µ–<&fJì›öÛ*µçÜ@G[AÖ@¯…ê¥WR€–@'smúØ»íhæÕÞyÿAæm{g ÆØ÷›;‰ÝF/ŒÜì­F¸çC`צ£[.­-³]˜ãhøIë`Å«¶Å§´o 'iøKk?\åf²Í«ˆˆ}^Jª‚Üþ0rÛ{u7“¥ûfÙ›bü'é_–­À½UO$nÑPË Ut<žÕK4%­:|{æÉB’A3FÝŠq#@ø~ì[ n|¸Å3_e†÷¤#¶-Þ– 7ŠÚçep#†¯ÿio®Üc|.ï/Œ¦ß7˜ú¼kaHïp%ŒKÈK—89¶æ›ßºž>‰mÄCTÒ¬ŠÏª¨¿›wìҺϙäÇjG½{‡ O*®‰$Eô—á ‰áûR?mÛûP¯©{Ú‰ü,hùê1óÖp¾¢OÛdÏœü|ˆ€v<üþÄ §ƒwk’νEF¥„Ϋ†DFLf×&HÀUîó¥Èp 1Ú¨x•À?º¥Ò"ˆoÁžÕÿ@‰#zžWRçZ/¸(À2SHí‹"üó*¯îJ!¯´ Zß[op;¡#â^ºÌ…µÀ€ÓÔ9+Q¤úœ‰¾¢¦°pï=­¡¾ñ ç$w2}«ìîÌKÌH|=šgsJ+ R²œ—|ŸÍE6ÕvJø]Ñ ØûNq¬óJYŽjh 5¯À{ Ÿ`†4k9;8aSŽ9„–³&÷5.|@x~íþ ï¿d¦3&S? €.¾©u4c••uÕ]Å7Ù ;YI~F• G}¸Pl³‹®¡ö+¢bsžYÔgVå;b&’6î¾mh²O7ÚDͰô8Ùt*µ·üÀbïâ£r‡#—ò›¼¥ «ó6kÛö¡’DõõF`F§Îw R€Šs6$ön—i¸ÿTèúÓ¢ÅÛêÁ5NÐa4Š REáÂ"×Þ¤ÇpŠ@Bsà†h$±T|›µeÙ® ¿E†‰ËǸ[Ç…ø LԢݧɓ2Sû m™@köFJ€&½?‘Ž$©hý8Dûë{7Ý¡‘D$ô8á0üz˜àVÓRD˜ÎÉø8Í×Lø!î_¦„3ƒx)/ËÿyŠ ðìj±Ùd¨~v?àZ™Ä^>aÕpëôC›Ø“ ïX°~°Ôâ%$ÔsD¨1ؼ5vsÿ.u³›†QÚ†îÁüŽ?±¿Ø+Ó]ˆÒ§ŸI ²waµu*²€ZR Mgž°å1 `‚y‰—|šbl’ê,ƒúÐ<ôʦi©MÑ W·ñ‡ÖæA ‹Ž&'–¾×/ý•ZÿÅI^¦ ºƒIÑ*ðXHEËè$¾•ož¼or,D|’'ÕhCJõ{ Ìã¤Ó° ©=pÚ#Äì²&‰&œoº¢Î¥ûæwAæ×Yñ}W1ø…>}–uRœ‘®œŽ¼Æ"€lUÙþ_K8 ¹aDxo›6Èmí7!ÿUoÖþŽçLü¢þ‰e¬–(øðŒrÅÈíŽS E£>$@òÛd†µ?B¶öC‰®ø9ˆg„c•úQ]¦]3çµ=ÝYWbŠí}þÇè0òý­·C;íîøkoíKý¾â—Ûë£ü4+¾Ô;íõï·ØøP‰¾Þ•†òÿWÏð9þéÿsŸÃF`*ï·Ù¾û}_çÕbp—Ûè»ßo²¤ _ða¾Þo·wÿAƒ‹öŠ~ÝÿC¶ás?o³öúÇßmg G}^‘:ú½x!ð³ûH¿näþÝ%ý¤€Šreˆøúˆ‚”"Fš- Þäp­ºù¾o›æù¾o›æÝ²œ ñc…m×Íó|ß7Íó|ß6ÿê-n¾o›æù¾o›æùºi‡aÕ·_7Íó|ú7ž(­%:f§€~#]¦Fðª·zø,åôÏ-éÁa¶øàá¨!aƒï=s•ÀÝ5œé6ZÞö.@£“æâÕ®Œ.wîWêçGUI:”òIÜ£ù£ûŠçqœ’½Ž‡˜máç1áÊ;$%7EÓ¦ñhüI¢¨Ò»cÛåix;2ì[A%‹Í“ÐéÒ´J nö ¾×Ñ_Ý·(£l€o-ª¢N‘9#c¥£n•@vø¹æî¾\ã’îƒÓQ¥n5¡~¶Ô`ñš8ÝhX<¢«ÈNÂÉR,¿«ñùë‘bß& §lÐò¬ûÿ7ãöžý%”¦$¥íA¿øì^€‰Û\%ct{RùpÅ-éeùÔb{ÙKþÙ ¢0Ç®6W mú;þ)*×Õ¨L[ø@Ô«V-­ç¬«¸FÆÖE Ci¡¬¬ãÂÐÊJ}µ¼\Ô‰ë3Ï=78ï8t"{ ,Ö ç¬¬)Á5N7¡†Û«ðãt’Õ‚j…^hæô1R@MÉéO Õè$Æoy÷?Ï ÄÁФ—]*áÉÝ kÙnMàöðN<ÇiÁÎ!ÖÄ\Ìêr»§=ÜqŸ`ÉâÆ1µ´„ì‡äN÷ìÂ×DdOj:@UwMm iñr2´à§»@ŸÚ©­õ¨6# Dyôl?Hß^KÞ%Í‘L¯°Ïr¦ Þ[ñ€2šì(h’¢óÏÏ>UZº~‘áyòÞ4™s:;OšiŽ÷¬{F´.‹³õ‰År´ÈýjIÊ£çŠdä] ÷3Qåm;¦5<’£_ÚŽ•ËntL,šñâ,l¼¦’èÉŸÏîðý™V‘eûp1˜Ç¹Y!–|&|`ß›_šªXk‹ÓJŸ{+ñL JlÿKTëõbµÏ[Xÿyƒ‘ÿ]N~™±ÚSãî¨5˜zJ"åõfõáK¬˜…‘¿Ñ—‰|‰ÿOSJœËêbb8ÿJ Û†áCôl)¢dS®8c"å¢eq3°À¦ ×O°lýý¯¸+»›H¡Úù…ŒVDMfdÆòÄÎkèèÒýƒ×}HoPa#’b¿æØ‰û9•¯4x05dî“Äjš òc) ìïD}¶sF1óµwÞ® ª0VXÛè`Ru$æ(SŠ3uª `TjU÷)õ=T1`î 4¨ÂïÐÝüxǃ"±m±ú¼Ïϲ1!5‡i¸礡ù­s‰‹ed ód Ü”¥4j$4ظœ{×k*Ž1Û’,Õäݺ:‚År©SR•:³Ø;¿^è¾å€Ë ð¦ôÌÂøL-_žˆY–Eµ‹­Ã‰4u”F„¯rcýøx׉w µ O`”½r 6¤¬2àuÕª%=J?úxëºgåò5ÿZÏzÂÆLµUm"Ü–j±³Bt"‚úÌ(صé×rãèܧCätù9z‡U`I‡Ù]^²)Àüò%h[0<+}5«7ê´áVDÓ î²ëì‚‘¬Cš^/·$h¿Þ*ÁýËDjÁšÔSdy›L‚/Äm뀔äû¯¿”UæÙ䂯F…ü9 -ºqÀ·ÄQ*à]ð ð ÃϯøÞ<ҀЮŠz²Iœmõ´2(™6ó"¦«Ã¨®‘÷]…Ù×Ψ¦ÊäéÙ!@ jµ|¼qŒn©a‹[¯›ý­¤Ûížj&:[¯`ºóAúT'@ *‡ë ZˆØ>o›æù¾Üª“Ürë1 j(ÿ+Š–ÀxbȳCL¿™S•{¿}Íc÷ªíB≺. ùÚ,ù¾o›æübê8Ü‘ÆäŽ7,Æ1>Ÿ#2U®¨0¨@§"ˆHª£vE  þù†Œ|>í–Zmô€”ûýÇQÒdÕŽTAÕ[Š$úÄýÂ,%ÎÑyyyyyyyyyyyy{n^^^^^^^^^^^\É®T\™zø[v0€ü+n¾o²Eeb憭€üCuŒFË꾆­…ÙTI]9Œ9dY*5Š ˆ/-ëTMs OX (]ÿY”e]ÎÌ=¬qÐ%F¾ŠŸJ£%LD÷Ç,¬$IJ›”!’ÜG¡yÊñí'Å…È6ÿ ë¡qìÕôêz–y¡8¸è—«s²QpíÉÉ“†¾‚Æ&$¼d*’’;ÝÆÐ°xNõíLÞ6Võ»’ú3ÇBw`…·ï}µý$ÏŠKré²I|DHèZüJJ!D·Ãzô[ž%šŸŸÍÓw8&;[•¨ÔØ’Ü&8ê@Øí÷Î!zØxGÔ|ŽhÁ§Ÿ¥ºÀ„çzÞTº~ò#ñ£ÙHÌØÛ þð_÷ËlãsqâÛ$wÜ6Q¦Ñ™®îUp‘9\xØhóʼn=´¯{ðiôHãm²0ÀR5}‚扣K’5SН%*CÄB*‹Xã$2áàÞ±ñÃìu¾¬÷ûM%>“ÁèQ™êß 1õAwæË”íïJ 3ÞT¼êx/»'*€S,ÄÏ ˜V:aÔí,ýÒ™~èÔnc©váéW?áÅœ¸ÞAµpGà2aA÷¬-TeÞÝÖ]pNÆÞ´w¥è õ)P®‰¤¦¬´Õò Þ_¾j}A£h™òë =ÛlmòémÛŒPõží+|‰íÎJw'Nn7vÁñJ~qåóѹ àûÞ±rÿ[Îß‚ÍnOi LúXš5ŽR°én=´¢Mõ$Jo½gó¢Œ3ÈJ³˜¸ “Sï­ù¹å®ì$ËÐ-™”ðèÖóéÈäPÔRpMjæ(”w‹Ô¤%G&ÈfŠÝ¶—Z», zë[\xíÚ­W³ûµì›XȇÜÁ>Ùóô¤¯zó«NR™¨BAÔ&5/k¤ó¸ÿ$)ùJÌ.‡Ë°óÛ5¼j˜ ô'ý4ÛÉF›q¾r -Ũ0ެ¦’¶Ù$Z©IÖéZ)‰; ã7ÌßJ¯ÝõZ-Œc;@7²Œ)‚æÆyFwÅÄî÷#ÑÕ3é!ñëÚafºŠ8½âiàçEÇ(ކavñ²ô,«¾’€ù„9¡´æ­ÿ¦LËòZ?‚ Ž-ólñ«ÇdÇÄÝŒ4 hyÞŸ¿WÛ-Gh>‹þ„ÇïJ ..éWp0Ì_œÓzÒ[ŽzgÛÝ€w%††{ǃoàsÎ¥ç·ÎIM¼i‚IFÙc9&µbŸ&¹7Š€” UÇa$ÌÃÉ”Œ‹X‹©¶#[ó v^P³Y׋|Öt4]òZ Kæú_Ë ’•l VM‘ÿN |`€mV8‚DCs7IÎuj ©  ÔÂ6€~«ºh(gÕ¼"ÈÀhG$œ˜¬ûÕÜgÀ[êõ²Œ•Ð*îoL™[KIÃ\ëcáÕ]Øw¯’²ÎdzM¦ÕÀê·JdFìª2€Ï—îÆh5“Lc´¬yúvíDqPõËœ)Ã86¶#”c©«¼½ô" Óo×IÂiξé/«ÎN$'ûyºZ&*«Ò(‰¨ë³áŠ‘g–2µ±Ý&}Ü@ bQKn¾Ó– R@úôýÐ r þý ¿©µ2e ZÂÀ$“KHÆ,ðÊg=qbF4¤Ãw’DÄ u{Þµmäò¿‚$¹ÇŽ©)OòàóG\ˆ¯¦‘¬Õ/âû~Y=Õñx¾7Ú]xÓT˜ˆZmV;ÝfÒ™â¿b=¢p$¡Äõ"Ä{«8×|‰"Ü’afHÊ›ºæý§½hûÏ u^~!"û­‹Þü“:qÃÍ\ä Gåžñïs™¬ûxÁãݘº=% ›uU?yø„%j{.ç+­à -sÓ[‡ƒ‚“K/äÜN®ûai,X CCjŒèNc&6—C¶Í «ï&o̡߯¡ #ixìäߦhl`ùÃx˃\·(w0YàA¤Ü…~˼3îBè?z7BŸ¾ òÇ=þ¸‡ÓÀOÀACXÌQšO"Ïrc2±1ö&±ñ¡ýK·Å‘^PBŠļ^w¤Qï\l O6¡Í2 O1µ2ÂÓn@kÁ67÷Œå[9_@X”ª;Z —]÷OHúlñf¥»öœ¢¦âE¸Š.3®7”ŒgSOß]¾õ<§Sü©€È4‹`:LäQ-ô\ÆðS¤79ôu–AÚxÈŠ=¸ŸZ(5®<ÌŽic‡É`šR‘7Ð({,"0-± ºd%öÎ 6È÷‡†‰)[¢ºU ‹í[Ði6£ì_{ä#ÌÒ zï³–¬¡<´eߎð. ;X‡JïÜ™*X[ºO_ÁvjÎR#h¿äÈYí`F0 GîCÜ1\ÆáVsòAíø°-Ôé*=:Æß Èd@mj y'è¯Ì[6£2‹ÂÞ¬ÍíãŠMn¡èÚ ÓôÑüý¨!Gp~¦ögÏqz˜y”/–w%¡LœÂµô¬‹wì:µèÀ ”³9)y a»r׎ųòê'ù7úÓr+Ö\RrÎ㿹75r¹ )îš–ÍrÏkÁI“ÃYvϲà”`×ÖÌN«\“¨uèŒÐúРk ´ è}'…¦!1ÌGºÏ9¬EcêÝéSìa¬ªŒzû»RÍàÿ?ŒgcïVzJ’|7ŠRÀ-›®(lOD2¡{ô»ã0P\n?oÔ/{a`g`„HÝ?œ1â®ð¶ådt#™ô2„ÏóI2ùƒË<1¦T7ªÑx*ì‡ÇTv+XñÍLøªõA˹ 7LŸv¦-¶ÆþœÃTàù9Ó±w|!ŸH7Àöb¾×”'Žr€Üƒ™njçý?ûúŒëAáïäδkUKßK;—ZÉô¢~'ú ³šMQõo)6ÃD)G6^˜ýË÷Y,«WnÔ_Êzûä,Èn ¼“ãfWSv¹ÄC¯™ÄLˆ4Ë ç,¶«‹[ÂÓDT«! ¸œw Ü“‚1‹>£Rë7Ì=Õ°Û>ý£w`c>Üu¥1ö»}a{„Ks|o¸;€0bIb?ñ®¬à@ló>»°vD¤¹½õèQÚòÈ­Úœ³Îswø…rú—ØÃgÒâºã=~þ´Ú)¶3ÙTçæ•¿ÿ5Õn²tãöº¹kUÓ³OÜ¥{?ÍLm«ig3èY¶oNÁãoâo龌àâì øî™Öâ±·¬ýÚ¨Äí±Òôå‰X}&T[o†.MÏ?DMoŠÇË•*g3Pr:tU^¡Ã¶ ­ª}Ê 70³)2n4»µSüˆTèÞ8MôO«KO‚Lné®zÞy¼ع¼ãÔ."dä%IÆã¢–8ß¹Élþ‚[矬Xwd‡Ž N1ª†µ-‘ZI¼³>ñÑy*Ï&ioéêäÀ/‹ÝdÑxuH•^gªaèU%Ã8/&×U#¨ñoû<ÇI:iRÒT÷ð¾­ éguH#ÊÌ ·£‘Ž—Ym´g\²ާ–«_™)ç:wˆ 1§3´LhÞO(yOQ5|ëJ3—ˆ!`{)'öý¼ñ*k4¦:™ZuÛwÅ9¦ð6žÅ_4‹%˜öFèò<ðLA$¹xÿT²Ù¾úsôi‚Nð0n(âdB„ ôú|¥ª_ׯ§éR±ùeÒR*ŠOŒ< [Xtôìab™þLXò—fÍÄ.hþæËŸ#±™Ý b>ùBj×W˜T¹vŽÎMŸÖ&Ê(‹óû?{Fq#kðˆd Õž©½f‰Ýo–\«ÿõ•Ü3}Mê¬ @)w”…‘u”³†ë=E¯@sõ•_Š©ÜÖ-ÿ!)õO”S'•8¼w@Î)Í;ùßËïÊxgðÉVY¯Âʼn˜d¾³ÿhÿBXYE‰fîÊf*Rd4cc6´2PtZæ’\•kl»v;´žâ‹[7J¦¡ ÀQu{ñ—dèaÿa(&cèÃê[{PòR]n° ?™Åsm¤¹ ¿ô\Žm&œTèm¥à³“C„Ó‘_Žë ×ùPAJ‡ˆÊßé«\^pÑ4›m»éX‰Oh”C?¾7[Ù[$çåRÝÙuÚɆö²03® ?OžzþVè´ú<-÷1u¸É^ ÒU ]ŠɶEªg~Îoõ„PÅìÝ”ÙÝäh ï§'?ÐȪöd¶)cßJ–>TLÖÎHDgBgzG„`\Ì„mÚ¥´èg"ÌK{¦Q6"'{ >,Ék•a¶‚@àù˜dïÏûÙfÿE™Ÿ6;Þ*îÏÑ…z¨¸ŒˆÛ g R™÷œ½6–‡êQ±!éü:m.½ԊÛðW8í½ÎÎ÷­‚ß·Xnªéª“œÀ9u Ø.á³ôÞnå=¸|‚1Ïÿ'“¨5ãé•ÿ•ÎKb¹q´UF†]fÛ°da7öÿ|%–Ï(RÙPq=²ª5ý1*[?äœ0Å­×Íó|ß7Íó~D(Wl:6·û›é¸qö(ö§pá²m»p¾We·F‹kåá*[EŠßlCëi}–*][àÂÙ³Õ”P° “[vÐò‰]zú{63/ÕÆ]Ö_[Æ3úÀ,WŸfì&B®fâ'îëµV|.½èÅè—‹ìo‡QËá´kÞíVµje`C@œv{˸FV(x÷Ò@y¡Õ=ó³8¨ U²ãú%S4ÃÃõ™ip]IÃCçq›»…cÊIÌP€áÜöÅG˜[l ‰SĪLê¹m8ÊÇœ…®„íÕ¾­FºûÊGwW¯y=FOewJ*Ôg¥µE 7ø曢¤kS’y¦Yrih4EëÜ7ÚÒëKXµR^<ø«ÓEaH¦™§´6Õù7yžýÕ6"ÉwßÊ,³l_¶üØS¿·™æŠËÖMï ØÝ>ÞË ™ÒHá`ú­d¼o÷è7Ô]ß»ie7på©Ùpy¨`j½w°¬€¦s³¾µ3Žt\ÊCâ>…ø.Ýjh÷þA8þ,}læ0ûqÀý̹5ª­”ÃF~W£$NT¦CXŽÒn-1#>dæ«ø°Úfî >‘}àŸŸ¹·6ЮOø ÖŠáïWŒû'"çøåè%¸;Tì±é);-pÀ³ë¬?Üî5BÌ)Ñ·véÓКJ‚ˆye%m&,ø2ŸŠe” 3³fPQîOà4Ýk‚øáï4„§/ϼäGàëCZ{/Ï!ÍçÓï,b}¥èîW.„ éR7¢È5QÞi Qlæ€Dû[{_È5fzþ¿£ØÌ7ÔÓ)êó"­v×-|iÔÚƒê=­] s!Ž$ŠýÉLú”Ø¿c«…BŒ±½̯É=“ös †cHåNä†^º Iá_¶T²òã–2íR¾ °ŒTM’—S¨œ¬n“$æã"Ç=è@öé“Ýö°Ê¡£û“°Øœ0jæ[ѵá fŽ¡f¶ /{7rîh™Û Òï|ž¹3ÿ(aé{÷˜.ݱk}ÛùÖ§4ÉòXžß;Õ†ÆM[Ñà©"µ‚I–Ï¥¥"t \ÏÚwê^Ci¨ûÞÿ!‰eð¯—Ôy?ü¬'tT¼{˜Kì~ljz`¿¯éêÚæŠ=Gà4nSñðøJ@5ZçÌG@¿`š7:¨Î]μ»Öh ˜#²ê¢ËTfê"âG@ªýC‹9s.–áx 7î­Ó¾E’üî€ Ê0•¸cOUª˜«oƒuÝ© =Jú8P‡F NÅ7)¬üÐñóÂÛÒÔÇÊqéâ§Sø”®4qq³ Ã}¸Æÿ*Øqh±¦ÚÎXôc¯T˜Y™ë™I0gË ænH‡á£FÖâCY4µàóœQÈ/¿šs*žX¼¢Tß8qÐäÆFÑ-ïŒ/Ë‘]?lëÜ%dU”„&µAŤªDäÅàI8L{ž‰³{¬­cvæÂ§~Ì{BüÎHŽ?¾ÿjÎöÚ2³8ªÙ'Qz%vdó±Ó¨ü¨Å3%6–E}ž2a¸sª²Pµ46h¸£h?Gf0‡DS Ä}[yl…E>ãÊÂpÈÊåµs1±Z"”ˆ,u›„0âw¬(î‰X™1þMÇËù€hœÑCãR)_Už^ôÃU\´ˆO+²Ú§OwõqWù1—§Ëæ…Ãh™yç‘P±«æ©hOÎ6ŽXxŸåKÉJÒÁ³Z“ÓI0 ün~!ÙxÒ›nOî='ꎫNmÇ'ì,å~ˆM—Êè;,,Íñš–‚||tž¸¶}3\ý—ÂøW«(—-}cN9ŸOˆ.ÞÛ_Ð8Ks‡,ö¢uÀžícÞ.cPÎÔÜÇÇŒ@Õèo¢¡ãÜn¯M«4Eý~R--’»x"å å(Zo':ìØ÷Çgè¶–YÚ‘ÓjÐ\«ƒ)ïûÉ·|s„Ft ãY•U8ÐÚ*9hÈaÉ_.E†kïpü° $æ5EˆÔ*I1Äsc«Ç²÷å"Õ÷qygR aµ•·þHA„Ü+h wýE¿Uvœâ¾^Þ²n oüÝ·•Å/÷.OX“‰\±ÇJ]Å·?"8§ ý² ”†Ær¡vQ´í82.X²‚øc½ˆÔÙ$‘Ôû5Váq!ÅCñ£–iÍÏ2[¬¨ßü+CÏ,ÿCÝ<6KË ‘<ˆl3ôå«‘ÓžÿR¥¿[šß ¬V–Ì×E,o‚1Ïÿ'ªI§s ›µæÜ¸6A–@ øVÝ|ß7Íó|ß…¡äÚ OÏ]õò/ãÐ,J^ú¿9Ÿ›ü–~›&Û²ÉZ%Ï«üM—ŠË"Ý<ãgð_é>‡@ qÙˆäyeö!-p(^‚¦X‚noa—²Ýàfø(Þf½žÁvÀ=ŽÙ,¿­€ŸNÓ>Î 1z<áÕ|³¤m&ò.ÏÀåãQÁs`úÉ W*s%Ý=—-îÃ-I¯¿'ÞxQVå3Ëã"\Á@ìŽRµŽÏîP¹°#WžMl«zqÊäÄ’=ÐÐiÿ‡ÛiðÍ•ø®¢ô Á@ìÀöºW–]:­ËÖæ‹ép\(ýäY4Òß(|­jþ‚´Ñf7 £U(ÁžYÔâÅÿmy¡Öèx7ø•¿ëÎF;9QìÒ!3öYìè-Ô†.‡ÌÒF§ø‡¤Ï–ƈթCµxKåÉæK~þñ­@è˜rŒÀÑ _¤‡.J&'Ö˜7†ZßDó|Dq¸¾¯eg¾üè-ᚇK¹HA–‘J-0ùDd7ÛÌ úÉa€A¸óϱôJ†|~ï<çµH’çÃÚêÜÌÿ0Ç U{ëXçm!4ñ ™Úä»…TîÅ—nm>]•å5[¯@D鑿ú¯p‹ÎÐPU0›ü”Ò*µ–˜í¯E9nš<í¢¨¼’Ãõ”•šdŽñDñ‘½P~õâPU£‡*ÑÎ jä«öÃ3°V‹!zR5’R™·€íƒÍÙ3[õg»b¦7YSv .›ù9{±ìzèÍÁ¬ælã4¾á mbŽMîZ$¯/¶"Ï^:{QQ`V0º¼¢÷U?õ¼©µø-Ïk>aü¹ƒ¤š7aÅI5»sÂÿhÚ¿ãµ,‘RVâPf÷øoˆÙáÈtÍ6/ËI€|mmLƒ›ìެV4^"6ŽÜ ìb“¶»Å¦ýË",TÚD °XÕæŸ?8T1ñyûQu–öø®Ó˜‰$µ¡o&‰…ÖT5ÿdο:•zMóŸdîð[´çgÏnú(ùŸ‘?™ê%©ø‹0â‹´b*Ê}ºÕ‡®²óä¹è¢Áù¡áß*U$(²a7–WÖ›(ûª$ê>Å•^©S5;ÂÙJ(ÓË×’ û¦´ïQyì<“DäDQ¿tªoÃÁvLl¹ X—ÒC‰ak€X¯4 .ä•AÁ­¦~fò‰ô.økbÂm@‰.y°Xßr€4„óß ë“,lt®.×U_dVód—Y”ab¨‹ò´¼ý«z¬Áž@è¢Ú!Î!»’c^4_"|&v9×ïf ó2‚ee(Ok¥rR, ‘ Wò,ã³ÿN¢>~ÈÀül}û÷¤ªUùß8‚‹U^|ïì·-®F(v`Ng[È—Ö( uqMàt‹ìšä:(‹ ÛÃ;µN’¾WEFÇ—×øÒÍhK`#f5¶8˜ËòƒÐSi…›žÑý^¬jɳý“ÎJUãÿz1öJ/à%Žïk®ÜïÙ€‚¼ã®¹­•…Þ+0†ÖszÞfìñŸ×#¤k§UdFÇŸ8 Iºj‡*0ã}ß©<«§H°xï%`ð ‹£.d‚\LÜWôÃm²·AúPÀÎÅÌIG±ÏˆÑáÎi•8qÞ± 8\liCÇ£¯ äujèZÚ\e=-ÆÃùx…Þþ‡¥uºDשœnš2"ò‚1ÏñÓ£Ç*ØÞ‚ƒŸà¹þÖ ›¬)¤ù‡÷áLX“û·nË!ÆŠ‡Æ`_…ø_…8¯»^~ǰr§2ÕGåOëÞò³<ØŽµ¦ !§…ùô[F±lŒïÛaóì/Ÿw½Jd p4dUˆÀb”³â¦ž·‰™«øÚVL$–c¬“àT/a‚ýwÜ‚z–{µ^ûNÑö unkϼןy¯=JVJ1d‹¾ïöÇDH§ØX0 0Ø7ÖfÍ+ÔáÅÈÀ0›]>HÅÒ0›~ãbñÛ÷ÐVO* È^ÿøj$ÛUŒ±¥6ûœmå‹#õ#íAc²i¸;>§´ºº9b)Ýn(/“O™%éP}H„„j…D%%Õ)ÿ& ¢ý¡€JT5¶{8o¸~ç˵¸¡¢åàžçÙîh˜¤ÇC^]\²óD> ¸óÐ4¶<Ê8îA[ÁZlDï¤(.š¬K0Åõ`løõK®‹Xœ8Ê¥gÄ`šÀ?#æÿ%b…qìî™n—/§|ŒïØ.%´YÃŒ˜GNªõmòÊPîà™!E öÝ~ÃÈT÷É.¡ˆNˆ‘;bÉûÎø¶â’¿É÷žš(«®²ÇœúîV³ 8#µ„°-g‰ŠÓ~㢷½¬c[Pîyñ.{@œZɮ۴÷ëÂ¥T„Kð²s¾›’t¼.²ö8~âSóèZþ%¨,×°¦‚û—!µëøŒáÿÿÅÚ¹/¢c¯ïI䬈ƒõT]ÏªŠ  È^³1¿ûN[kä~ž¼ÞÛžÄíTì´ºŒÂ¦«™ÅÖè[ÖGïùÙuǵØÊ`ZHâÀºK…o×á9š³/Íf€`K¶öB » TjÇô"^õŽÎëéVñE¨RS‹~'5l‡»~Íß Át©þ‹ü9J4ÁNšÖ´æ¢eÉ[Ê_ã™[Õ×#^°o-ÞÏŒú’]L[%,ÀŠ'¦¿J=Åÿ,"ÈÛDoÈ«žÉjŸ©ÛÃlOïçSÇŽ,ųѽ¹sS¹ô©„‘Ô^IV9[­Z*í“5¥ úÈÎಊþ“õŽÅ;i½Ð/I[{²ï‹Éò¡Sº'g}ä¤yEó½þaäm‹üÒ¿DÖéöBþ¹ZÑä0{Ì­AÈQ]…²S­U\gÉŸ"ÏìË´caj#3„NBèÉec0dô½ØÞ ·-Χ ;S¼™Æ,á1#/~Um—: Ž÷¢Auôj1Äd{Y½áx¹óþÊ ?69ðk÷߆#B1þ[¢Ø’àC00Ø<6ßïE¼›ê¨HÍ%²æÒÑËl!ËJ\_Æ “}W8Ì‚À˜8†yØûܪ¹¨i6ºsT©…T7ºlfT€Yªœ‹·8 UkG.2•ž„ììã”T>ô“HY¥{#§’Û’@&2 ~V‡ˆùwkDdf¬ÎÏ•€jwò\]‰“J]ѯ‡dÛÓØ™'pÝ{çÜûATߥJ{BO¿ei?yr…ñŸág$ìNÍI%—#5‡Hÿ|5û·î…Tw)ŽÑ„‚/.mÓ)ªÍŸrk–åh<=$nÈW«]KZÙ‚ÿse¥²¼wõ ¸Ìhq†M¿’þ_ãväGBÆ!àÒÒ«!¦‰¦™%z÷dQ¦…>î0YšÈÈy&7ÐíZ€¿sÐE¾ ghj;dÂ`$&®–>µ }:FjŸ4|'hŸÜ}ú(ÿB$UÅk×uGÑGœÒ“l}°À¦Ë5g/Û$yçt'º,•!T“S"ÓŽn>|íDXÏÈ͆?Ëx†Ë›p¡yª¤± ƲÅÏ1Ìè÷ïrü™hëN‘‰šª€á°­í`a~7IHL½ü‚†sõÓÇCýV"+™Î7”ÜZQõ?ÕbdPn‚KávÀétvP4è,Ã!YûàÁiÔ/ÊáÑü»•oäfÎRdHçöü XâK­§8Žñ³Û6:4ìA¬¡°ÉÔÿR€iÕÝ Þ/u29÷+°9‹žI¤!‡ž¼–”WžIšœ P¼&ŸõÕÍåqÈ"aš÷4O&s¡¸£kí¡q_ò‹m¦2“Y‚&}nþgE×AVA»}g·dDäûSÿ*Pʳ/¦5 Ói¶ÖBø ÓŸu·àWÌW  ÑŠ‚ qó;ZÉ8á✉Ê?­.rÀݲ”&ÛXmb… -é÷™R bõ,÷zk@_Ô½gA·d|ëR¸Þ¹¦ΫW)Z0-6ð[X¨®® }RM½¾Òm_’@«4h¼HAÆê©Æ¿Ú&é&˜zËUöïH”Bî'AÅ&žkd0Ú³¸®Ž0àÎHúm"ÿÒ=zª"ÑžSHìúK7+N<¥c_µ8eØ¢ÇÙ(ÙF•9ëmÐ>nü5+?sAùœº_Ü?e-á‘ã”F>KÎ9‹tT¨1…§iÖ£WäË’S;)lN,ÊÉDÈ7•rY-7uTÜ!É{—ÎÅ‘hì6þˆÚØøàÕž„Þ©‘#µš¡´(V{AuÔ©„ª‹ðl:î “t›?¯Õ2÷/«ˆqµ@½Úƒç³VãÈ«I¨â,Ý[n]Ò-(±Í]ç~0wÊàØ´\îêíÚ#ú» ‰zˆ±)lO ‘±1r£$W?ûØ&àühß/¾wV/œÿLÁЗ8f$›G¼8‡rm¸8NäîhÒ»£,rGÜ> Âi¼u‡Nek?kÜæÐAÓø=»Wn¡5Á#“5žg-ŠŽXL,ú÷½¬O¦ .f®±6š›¬Ýóî± mØQ­˜íÁõ›Z&%´ —CKY1ϸð;( ³7(=èAU~1ƒUš§š™Iö/ËLðaŠrŸÛ9X8y%ÐÈ2vï£u¥vží4Có<¤pÕòüôÆd6««R”•Ÿ.TtÚ¹ÝÌîxÐŒÖ|ˆ†3*ÃxÓs¢±p9g¦­®©ˆm9KƒŽ3£AûtOâ|&ßèjã—à‰ŒeIŠÐ®8ó°a_耠ºýúwŠÞo˜£fE_¢¶ù4sEG‹’Ö\HsìˆÅÁj˜®%áï-f5âî:+:•"Î\Õ˨kOÂ`ó¤×l»¡^d” (8GÈуI톹•gUW½B85ZŒ¯0J¤;3ÁŽëïhƒÜwŒÑê]4Vç€pǤñ™úM?4_^ˆyö|kÚ 0Ãh›èˆ*F>Î,q­„?„iÅ~f¥lª ùó=™ÉLÆK4|(Þ.Ú Ñ œcÔ÷QS¹ü© ­‚ >„·¦$‹Òñ(Á_}Ó6Žñöh™xRgØŸM\Ÿ ]PG ÄÒvZgDã Ôa}ñ«(Ž6¡LÔ—Ë_æ~ÃþÙªgÔkжÇq•£yûŸ˜÷6CŠA)„òHyä¬×‡.mÝÅ7^šèWÜþ¡¼§5Eô‡2LZÞÕ8 ´oÛÚ˳þ4^ˆå†O½¬ÁjQ]Ø7Q6çy+ª”É[¯Àk ž>%°ÿm-3£¨ìOCŸôœ¤G¸œi÷8ãczÿNÌp”é*Pö¡¡·4¦ßÅ´EÔ×r~n|‰eª:“V˜£J;oHÉ´ž¯Ì¦ÐÜw¹ÿI»þ\m²81öF³LÐS÷UÓ¼JÆÎŠ9Ì{ÀÝ ŸÃv“´>eèRJŽ'kt·É ¢©«Xo<Õì»s¿”1;jZçØêÀÂùàLÊÆãðà,Ðx‡°âƒšÇòfÌrô—$òb°RG½ôÞ$hðAšDÍçBË@­¦µ J¢æzûlc °[KðÇó‚sø³{äåö—¹b¬u»P}Ùt¿†D‘…eXì®Ml¬dÕ=·U‘-y|©æ÷ò7 Ú@Óô½à”P“ Ò¥ñþ"³æÉó‹ûE¦ÿÙgµ{ès43àNlãþ-§þsΕ\ÆqT¢ç‘žNNp[ŠF5´¨4¹"Ûœ¿kgS8q>;¢E-®J³5b×G±f™Ä’À†%Ž{ž±Ÿ CM¾@8€ñsÌ#„µ=8kÌÉœ¾¹äñ'ò°Übr¼¡ÈgøV .}w1›ôì³.œë@é(¡6ªLê ž„±ÅøûP ñ[€fÊgs3¬ŸJ©U ¤¸Zb¡7Zm(:꾯`¦·ÙCÖX}r6$ŒdOx,¨Á‰’ê–Ä/0òC®å±*Jߺ©Ó±mbõrÞE¯ÖíT’0”Ú°EÛ; ihr懕׺†V!“æ˜p~ *\s0sŒ—8|,<§®±à}{ÎÜ_ºhNõ+Oú.ÞS^Pv ¬Ô3îkT!°¿\OÆšcæ£áZB»ÑûÁáXEçÚ“¸Ì·)×á&gx43¼A«ô+éÝùƇíñPŸ¬Œß¯¢N*ÜSÊ="9XÄ :R‰ó¤£m˜AÄ VÕ.bžÚÓËMoÂ-“/Pv¸FߵЩâ´twóOŒZ´†_{•‰Ù„>W“Aæ|Ǹ<>”9-ÓÚLÿƒ)pf¯óÒ›É>žÓOÈÄh‘îwíøMø ‚žnW³°;¥ÀMs"fáãx-‚a0Ju4 òÑèf¡`ÿV ˜wÏ­qŽLìµ<œ9;‚€T€»K—@.ÆÐæ™Rn”*uOqާÖ9E-z –dr›û# ²ñ %H~ˆù7Šé' ë¬YK- Eá?Ù/IJ밂Á_ïZáwâkCQA@E|rï"Dè©MI>NëhýÜPxfïÚÎW¼™ë-“;É)L©R iF¡§nƒˆ)3¤ž]Œ!H$Ý·`3e½]¨_)ÖJÑôà!zÖ{¯ˆWP5kh9–Ûvšz‘è~]@'B"|õ|Q—Ø'iíDƒYDiÄ0B P²¡Ïµ”³F:Þ4#Ò²R¹ 2Èæe§<–Håïn^Å»rƒam ¯²¡Ã-}HÙ(i• úàþn2iH¢Äµ¤-÷SÊß1YØr·1¸kmdF@B<÷Cóõ…ÞKþÃÌmcÒ£×Õe»‰h­¼ˆ£Ø3"ë‘§å¤UÒ3ž`í³‹ÕÒ\–pUü†'®aô<ñLj¬’l½<œ”z½$J çŒuLhÉ»t‚ä—HÜqq¦Ç«Äao7à@TÒ1Q™ô,õ2ÅÉšýxƬÐrð8R ¦ÏËJ´‡M§@BJ ¼XÓ‰j¸[ŸrþQ½ªÜ4šÎÒL®@ß´àø§¦TªH?ˆ~[.ÓZGQAx93}U8Gdˆ”[­ý>ù`’‘ç*DheSQ³qGÿPD'ô@Åx{VyZS»¿üÝå9@ ÔÀKÑLO)ÞÂWŸ*ûW–†¤Ž]ŸiwJߣWÿ7ôÍãïLÄ7jè_‘BHJG˜,v ˆ@M··^b\KÙ¹Õc61¨S)/Œ¸1¿”¢l'@®ê«w³ÿÓQ‘Xœ³NAâ.MÊvÑÛlÓ® Åu6¦,¶Åä¢äZÈ šS=´ôEiC,smQDlQy®)¹°ïõ`t&ëJ{ukI—)Ýçßlšú´îÛwS GÓø\~Æ`¬îwEteMYåŽäØ3écšÊñ~‹›æâñdµéòIÔÙ»Vp†!" mrÐ4@pi_'¦‡.uFP^{»òûºI&'xn-—/*gµ˜¼ñ|4%?‰š-Ø»ÐáìKÔCW¢¼’Äe{‰õö“êÛ3ø¦÷T|R®rÝпeü7R ö-¶#Íù¾¥ÉÒjÏšr0Êâ6Hã]0§¯G:ZåYñË©:œÔv¬Q É5fÞk༳Z§Z‘ö;РBî’‡ÔTtëNYå‘…°›oÃÒåw]EìCž¶ÎOŽ”ë¼MºÅ±º8J —püZ$8ËŹQIøLã@ï à}?ÿL½t>Öç`ÄÑi7KÖZÇÂìŽ(Ý*<Ý:Û÷F ê²ÞÌLšwk+„ãã´Ôô—»šÅXd‰Þù^ j®åÝŸL×YàCôÅ…Ø•=©!óRÎO”„¼V^/ß·™íùI¦RÍ#¢aɲ¹¿a¿]J>LZTÉŠDO´½`[aÊZ;Âø¯ˆ ÏX%çBªê5ñ^\¤ÑÁt°Ï¢LÒÆ¿þüa"]"f;~ÛÇ:´¨/2Î嵊ºP €&¯“–æ~]®É­xláô‰0Ët î—f¢&‘ãpç¿èV¸Þ4o*ÏYFá%nqަ1³ºS2ˆ2S µPëJâŸcÄÀÑŽ^·_lØ¿ž†4M ²÷š­WG i{t S»ÁÃŒT+æè¯)$›Ji^üáÝ”}¬Ïóß·Y@÷mël!Óå¾OqüRYE ºm 3õEa.¸¾ÕcfáÒG?`*ï­ qdu›£ íHÑ®µÂß"ŠÕxùíóÖvæê«³·[Ø-;+5UÖ€†RÓ›ÎÈÛ·ÅöéRÂké"Á{)Bª¾Áx'yĨ/âq¸ÁƒƒqO þ½«˜íˆ‹ ›VPÞ ÷âê¼QW˜r>‹i™ƒ¯r&« iµ¼|¹e>ÚÇx«;$7¸Ýƒl¤ÆF;iWT÷r@!u8±x8êg¨¹rü[ò–¸83üªµ-i û¬;^öDjZ¼‘GZ;( îw±³6¡1ŸÂ å:]þ¢èp íõx{ð@c‡·ÄOiqO“|ƒ¿¶Ò/'¦á¶ÞÿT©$_ØÏØ+øSÜ4ˆÉÐ\rûkçŠÐ[×¥ûÔžèO}r´F#€Ò»™¢mvFTGh2 1=¶fš•ØI¼¡—(HœŽ+$âWã½µ<Îè·2²m©.ÀXžU ºî´øJôh}³uB›ÎT!3îóÐaij`SÊ×UÆÝ"Œù«hB š: ¼ÆK_rº§ïº†â .Ûš°›&°+Ë4*´#QÓqšv\oÈpl±—›¨9 Ñ^ÓCõ>´l4ôøo+âáŠJ+}¼µÈ¨’´P!Ì—#¾Dµ-'rÄžwÂ6Åd…óDg½nå­·­5V{Þ€ƒqý¥lAnpÊün¨-1\aÃhR6êò‹ŽÐ‚Ìzu.­'ÉÁ#É£þ´¬ÊD~À¹ÚœKàòè»÷ŸESmÕÙîßTé-ERcžÙ$àï©ÐÌøâÖ]asÖæ:«Š@u5w{ÞÜ{¥1ƪÐ-pc•£¢|V@¼áËq•BjŒœòD¡£} •ÛÏ"Ç'ü¢óÂ-áJäúbëx(}³=ß…Ãío§h®ùú9ÕG/²Š-~5xÄùV§òü’fŠÉÓà{ï¼r7'Axä\a%5ìø@S¶ZæC݉0•s–?»ê?˜ô¥ØC£®¥aå+Ä=d4pÜU$P‹ ù‘{ô$òžÅ“G m)…é½s|i’MÀ(ÿ|÷ô[o\âÕ«Rþ²ÓþpÐâd˜U,~¿RQ¿·®íèf¿®*;~MÔ…¤:º Sz\6?|KŵּJÂRu·ÐË? # 0ì à‰2#õü}vߺ;ürBÄùõó—¢Ó8¤§:œGF[òª!œyæ¿èÞ€uhdÖu»Š¯‡ 8ã–´»—šÙ£s-kpï×VZK ó öøÅV‹ÛÅ :%)Âþƒdß…EŠèñF<êBìÖ¡ãl®l„èø]ò—V†óGfyĹS öøOàÑxÐλ™)Ròò®0ïõ Ÿ Fß]˜öÉ‘«]ÅîÒçÇÐ E?ávÅOÙ8Æ€r„ìe‹¼^j-uðµÞ¢Ð!À~ÚE£TE%àÙ [(*~ÌÊ×ö…±.6,O!NãÕÉòܸ;ÂÕ,S¥ØÖÞnÛ ¥Šíè…sEítÑÏN8m ?Í“|ÈýC,£›½‚äëT‘çTèhXθ½ENæ^ë · ýæÆºI•¨±Kâ»Å’2óªî¼ÐÐrwU˜¥/-êÅÂÌÆã¼°8vó°îˆZXa¤Ñ×3À²9'0ðùÅ$k^×B•ù•ÜoîEQHT/šýõ%㢺X’(¾ß'­Bs,~KÈŽb£åîH=†£äf•ƒöX|u’‘ƒÿ8¥âŒf±Å·¡š²cn¢\mΜv3ïµþµþÉ9áÓ:šü°a‡Ó–Ͱÿu—]P3øºi‚NáS–„è?ˆPΫùËÛ­kÝ,N¯† wï:¿\ô"x—¾;p㈅‰ÿlvÉ1AЉõÿ °2gçêïuP{ûÃ.¸ƒÈM»%ŠçÄð*Ñ_«µÍO?º`øýý>[²øl]f_ŠAï*¬L×`Ça‰º%½Â«Ž¼);¤ »«pò®8sL¿¡¶^´‘gâ,†B£éœLòì3ê&@WŠí°ùù†òÚžÕaXƒrAÿJªƒè4õ^,„—¶s’ Q:æS‚ö5™®,Nà ¡Ï„^ÞÇzu}£,tŒ?×wÏð°ÞèC÷³ ib#Çúoª˜ŸwÑ2ÓÈ™´Çf–ŠC’ƒ³½O!F?',wdã:«òÞ匴޹=ô¥—he*Q¶Þˆ %õîNÁi!|¿µ ¯õ PDÿXxlPÒÞSÆÏW8wc*ÞsœþšŽ`Aa®±‰Ñø‹0»ë˜Ña½Ó¤‘iåa¶"ªþt¡WÒD†p£<¹Ù@œ°åŒQ2|ÛXÈ•¹gÚSŒ7š•NHÃìgQ'j”Æ-³zc˜Š^BPyv¾ˆ)F¼”—P¤ŽBm„Øý ,h òm,½˜Ð$Ü„F¦¹3˜%ph*0“T|Ž YÞ”«dïÖ­Á$éh×TGuK¤p?~gŠCÈW{“ ´æV<ËÆ Jµ¿wé¡vã|¦¿•¶“Öƒ±­+S'·c?™w\o÷Úí[o‡y3ò¸ŸfϦ“iV@jC¦˜òÅa»‘¥KIc"ð.´ ¨ÑԮ̈́PÞpÉ*ÖK!ÆPí‚‘ççT1'34&p^Ö>$;ÔZKK‹R"å‚üê{”OsŽsµðuMc4¤Óæä±ŽÙ6G´¬à£€°ìzD.D“—á %ÿMsJ(4ò!Yk®À#FÙä~ÍòuꎰÑam4ÿGîÅŽÛø'}t?("‰¿†w–VKiºö²â¯à`YâHFÎïH$òûéWð@%ýNÄ%z‚e6 ýL¿ôè ínïØ}Ü03‘TD öÒà‹LŽ)‰CXí…‡i;±:û/ÔfCÊÁé'*†Ân5[Fÿq{qs}_:³~?H ´‡9èOQ+¿§x(“k˜Ñ¬ô4¬mžgÿ}+Å«›”ÎG< |²›`òÃYŸG>%û}^öTdž ìùܸyŠpO°â ˰¼žfÞEbK¡Ët«Þ«ªÓÃ1ÛpCÇ (8€kšÄþµþ4É<6Ý:DUÙ¨ÙÁú5 íÑ®ŒäXqÁãwÉ/w²”F› ®¹T%+Í÷4VË(¹›96ו½35äñ¨1b<àýÅ€&?L¢I_0$øtíÚRéŠè/§cÙ JAÌ.ò®í˜h 7…, ŒS~͈¨äÂ;ÀA!Šx:H+Š!fE;B7xù:ø° (ê@OCóFØ!+õQÚP»Š0ÌÈàpvwgÄÍmÌ:õ¢Õ`~Ïc,Î • fç¢~Yõr­tŠÈ¾®¸ÚÙÍçh³0Ϭ4}¾Ò­`ï9ü4zÁÉ̯B@HKô(ÄÚ`@õÕ·¾E½xút¢qBNGöæTPnQ˜&œø„€}î  85©ÌlÉ Ö‹̽kŽGƒm³ìû’*´« ú¡¡ÐfÇ–á|R¹Àî?®XW¡¢é IÁƒ|ÍÏ}¹,ªiô…â{°Ó¨Žnõ…)ä[H¼áÅ#`Â`ÿs¯ÇÿYH{B;a¯k_©cWæ!|PNWζF–ÈQ+@Ièèo‘Ow8Þϼ*8½œÉ‹}'…ŸçnB.={4½ÙP”ˆ£ø$<о6õ ´´®ÜÕÒØ¹"¹5ëI âv}gÚpžNÊI´9û>®cRÁÿDbV¬w{š/éù¥ó‡Nåc= ëñšjS’UA«y@:‡¡ §?Aµ?&a‹bšç±gðáÄ4\œ…I‹«\£‡Ù.ØâŽŠ0gdUfõ°^«{Û)hÅÞ;ÆÇ2ÁŒ³³vÚÏß ÆŠí/ü-„„¢ëî®k ¿ãF 榥ô˜Qí‘“A›Ã$h±e \ßíƒo¨Vƒeë3&+¶Û:È+a^,ë5­u¨KãPGC`6k0fú’›Äÿ]·+æ@J`,÷=À †ëЊy­ª§E›0>šágö±ädöžÐ+Ö(Þ½tE@ yy˜(¤ÌÈÞÌú>È‚!5Ÿ–͇•Ò½=zÇý—˜pÐUX?·À£:ö?‡Xº £sºNñD $%þv}{ª£¦­»DV ­WxPœÌË –gwd·ìžk‰Ÿ‹ít›˜`“Ω™ôhQL:¦¨YÅði%êŸ{òBœ ÐL¯¬1Cv•¦dŸCƒøÇ3SÐCײÒÒ®ú׬䯠4èÛ_‘ ŠÊöÚÿtmð t>:cµþŸëA)!Æõv×DZAToyýd1/ß!ô^R\ň¶œ¹ÚÒ©%©a!.¶«s7‚,2‚;õýd1ÇCäáã8°S¡@”&ÌVÚÿ-¼¸%i¥Ö2¸·‰Fxp‡Ž)a¼h0ôJ¯ioŸ £<3ÿz#Þ0ü‡Ÿ¸ßÏùø•…dëÔ÷ÇQEêý‚æ1rð!ßhÌf³âú¨Ë³~ݽUQ[ZŠž;êâ %ÂÜÅÔJÏ3’Ý<_j qæ#árP(/_b×R¶.üùJó ¥Ù²6)ä¾s0•n¨§‘©BùK-Ÿ5í”-.$úEÃò˜~Ù6»Ã%@ aö0æÕ€f*T9¾Gìï•ú~ß tÙŸ– #^Eö€kÖ #Ì7Ág/§jÕpFÎ*‰´Ü_¼“çVœB…@ÐŒVàЀ€b ¨†‡ ÿ‡éaP! ‚ÚŠ²ä¹é¯áE¢R,ØÃú‘õYY÷ŒO¸€îd×h 6V™c·+dô­ÿvÿ há5Þ…‹›ïBtòÁˆ§iˆ7GʶV}ìY¬0+(bc¨‘ú§ˆ*g:K!FºÍׄˮ.|%“kzÄårŽcÉÕ9Îê¿5'\•Y«qß]uyúdS¦8 î=¨G0 Ýy={ƒ"‘÷áKj‚c¹+¥üqtJàÏäDJ<®£»†)¯fÄuZÔ7L±Ä ìfŒX a\®íÿf¨dx–°kˆ2R¨jfr5ÒB#!?œ^% Ö’¼Ï­ì‚÷0Ü]¥ç{Fgƒ2ŽìÐ?€Š7‘_Ë¡EóZ^À¼$÷jM9,›…$YÂÄÞy‘ûWøž÷´€ZºãÈ\ˆ¶1ŠÍ}¸éC]ÔyµQLÔãçÜ#s‚8ç{_ê/5¨-’‡ðNðËÖ9+ç0 ì¼ Rôç°³™îš9PTjÞà¦õŠÞVm¿½…4ÖíSPÃNÔC;èpÁów¡–ÛU",¶ \ƒê“A?à˜ '÷œá+P†}È„¶‘wÓÑhîáZ×ôÉJT>Þó ­â~¢m–núªv‚p'x}D0*)~LÓé\EJ`«m¯ˆÎÍÞqëè± ÜÖeèØA½(‰ 4…¥Í+¦ö8¹Mþéß@TÄO—ÑÑß ?µ_å…þîõöÃtiÅS¾Eÿ%LãŸY:{~¡‚.|¢Ãÿ°¥1(¸ÚÊi,uè‡pz¾ø˜Ò-UÛžÓ¡þ×}»tž¨é–þFÒ; öss-K6/RKEûþw†RûææyŒ“p½,Uc³’CÐ’ˆûßÊ8|‚} }¢ò¯Ë¾ xº c@ÎM(œöjüšþd}eIªê›¾_ßÁ­p’¾Ïo™Jlq˜È!ö•1EQvRu ZÔš¸>g"Ø yÎqCDKS‚q7í¾}kGîy!ƒH¢LDŸz4" ïÒffÕ¦ufñË`¸mKN¡èŸ.® Œ¢’Bf Ÿ °±=ªª‡Åî²ÇG¬#govÛ0V©tì²,ãt· "Ry岦”¤TÉÓÛ—ù7«& í<µ 0ä4s:+ñ¢Cù"ÁîAÀP’Ú@Ѫ ¯+¤yÜøŸOšõš—ŠÔT=Å|/<†co3Io¼¨²¸w­³Ÿö1@þ·–áõò£on¿ôøÇsxHpÞX¶ü¨”àÀ¾åUöGñüfN¡ ß'"ÿˆMYty Ý&šØ¬}àìÆ-¡¨MŸ·4™†MúqÂöjé×ð¦eÜshé¬å5Å ‡ÿDÆjUwü³µ²î­ÉÞ*«¼à ùÓ‚4D@b²r}=2s(ʯ“˜˜x`8û}Ê&¢-ªa—¯™+q/òá_«‘Ï% esW- ½¨ú½°7ÈOkjž €ã2­ö}/¦s§D‹Hˆ5åc˜{3)¦6ð ÷§V /½dž€{ý±ÂŽBßâ*zc~ŠòD¥Fãºâ¨ÉíÎ6’7€+æ™Üè‡s{é8—!\Cb õj•#]mHš[ât,0ó>œ;Šª³fÜ,¬Ûîú¨æQzÃôüÛª8MÇ!¡ åÙfíË\ï“kÉg y¼Ð1^à%Q6œ…ám˜r+¦öÑÌdNü­¹>ŒÃaƒ¡(wÜ¢ÊsÑp{&¬[ôFï!{©Z /+HËYµ0KƒxœÁ+™ïTZK¥x>à³ ùnö‰æŽ¨nâågCu¥”gMà4gpFô5f¾`}Oä©ÌT†M ôx=h6˜Ÿ¶6ŠÏ–ÿ+½¿Žß™ó~QˆS% …²øÑ€Ê£ÀhŒ {L+M¿á1! Öôw…å>—Å»¹IÛ¡Ð\€ÄÑjòÈó/Lºåïá'°°džç³Â]¥R{1ÊW«·*‡æÛ·ëõ³k¤üIû–©b‡qš T³ðvÊÇ ê‘Ÿ—7Vi÷5qM¨=â†âÏ 3³)Æ¡ÀÜgÊõ<‘ç¸-UM!*¨În…HxÃùÖ÷@•ËI¸8| =J­ÌÁp:kÙ´·‘\°¬*粜}çG;= íÀSm• #Pd€š¼ZÈv s‚0zO :P†Gì¼jÆÛZ¸ é‚„mãÆâ¯çñªÍ$öî ÆÉ-Ä1‚IöJ‹âY9·³´„ ~|°D/n•ß+(«I[KsxÅœŠl›£ém!‚¾=Š©2ÿ%*„#‚M¡V âô‰JðlÆ­nȳ®¾œÔ‰%íÉÏ9ØÍ~ñ· É–Kh–tÌB÷¬ñsYžf dB‚âl§ËôJÉ5*Mª·úŸÆ•\pÅ$y~(¢e"3²…¶‹‘º­ùþ’öôò*À#@Cçíгëõç¬y¨U®ašg"›ÉWªðjRï-á+7ÿVØ{·®p6{ùI}©l)Ø¢e‹òC)^ºþÄŒ´~n<ŒI‰§ŠÑ>â*ü0Qƒ¯%åW±¾+ J\vaãl¹ ¥åX³y’ˆh6Ë”nßëÞˆÐÉIÖT±Da2”å\—4Usª´³ÂHŒx½ÀP o©\NÖ„2º™'.‚G9™½ÑÑãssÈ57wà--§7›DSÓÖ=»b™%eV "]ÿ2ûr pË öF~¾ö2Lc³}´éê·†RyóJá¦ÑxH$KÂ’/ܵJŠ™œt”¹Q/„¬*>"’Þ?5_[¤¤ýPžÐF. 1‚^¥N¿ýdHØß¸µæÉÙ±üídV羪­üa²{«xà0¦–@¾žGÕ¯Fû§&UDÕG™-°ëƒ2TØÙê,½pÃâ †>0[‚dÊ\,SÆ>Hš ô÷ȶʽ´ÝÑ]açähñùë¸ûÛ† +¿žù ß9¼™£_MF×™rî‚Ig?u«¨ŠB…l{9ù³‰î'þÙ÷g=šN(K'›uE«‰ê:ú…§ìÓÃÿd§º5ÈqC@oqQ —"Ðøhó}gZÝ›¨µô*›*ƒÌ< î+°Â~Uiµè ¨}dÎGâq’8ÞÔDfš¦g¾yç›UÀ–S1¹î æ “ Íé~÷ôf~É{.¬ ÉK1Ëï©À¡ç‘›>ß"ÇÅ~¬4Or {†•º±‰ÝøS抮 #ÖZÀöÎË‘ÑÍm@BÚؠΩ|)ˆÚÊ'n÷’5ã©Zê¿W¡>Mw»(ÞƒæSQñw# ~å4"U®Š76<šLnZÝt­ê{øhDžº?bÊÓ>f¿¾+P¯ëûÌy¶Ÿà¯#²ÁMO8;M¤Àg_a®”YÍ‚êqÔ*VUtø—]ºgÑù2üå7™ôë×Ûû‚LàÈïØ=&Mm êÌÐñ‹ÏHãX6îR¨?ÿS­.I¿àE×\í‚Ó8†.{WÙSÝ6ùÁ² ! ˆ ]ª;ÛPe0Ñl;lg Eˆda !ÞBÀxïUŠhº¯ŠƒƒÕó]÷Û°¸N†%÷\“ÐdRÒ×Äk.ι7Rþí¤aF¶\½FRG9¹g†i9›LÑÏTíÄqkÁÂ_«Sü‘j-äžÖÓ‹óÆ[~TxÏÍ/³¬ý™Â—b»etص~¡÷hv°ªs»½‘%.çÁ4À@sÁ€†w>ÇþÓÞPn·¨@å×\ü RwýŠ‘ÂKÍ$FbA TÞ8¿z0r ò'‚»oűëÇa¶Z)×Ì0ÍíǾ‚Ò{ýâÃ'dw3‚`uDZ\*÷ÄQ%)èƒyPž™Œ,±ÅièƒU B¨øŒBÄÌÿQR|ŸJ´“=i¿m«û¥|¥6åÅ-¸C#gËâÝ©½GÁh¶"(m³Š¼a]àáðs©Ú&pMdgYŸ†¥SŽ¡¤Þη¬"” ¿í]{Á!ÄžÖ z.l^eâ©Ó$ä'(†iIæe§üB9ÎîDÏRL+È¡…›Cd‰Çœ~Orö ´°ØiÜùf£âÌàF©ê«8#gµ\/ÜMåsÑ_ Àœ¡+H·÷€Ð‹× ÇÏ‹ë ¬w‚Ÿàv¼–eù ü³}ë%w•ôIxMgÐc{Ú(˜ ‹LÚP” ÁÊË•Íï‹4ÁJTÆØ8eÿ8ÄÁé਒²¢²¨ûMDŒß\þ˜bLÉ]ôfby_† \Ê¥Æf÷J©»„ó(8àØmÐú¨Á]êà›ƒ<É®N¯ùå›­$KG¬dûÒ/{y [É-ƒà£’ÖévMß³aNL\ëíXÈCÑàŠ™z]gNáAÎQñŸu^Í £J«0ËfEÉ-@Î^LSèkíªNRr^*xϦ̓£\,Úþ ø|Òß©EÉ[×8ˆŠŽÝÈ÷„øÞ½•¸«ZbO¦¦o^ꬓ›Ì)õÂÕsñB-3+Ðõ/iº`sCÌ^×Ð%ÅÂlTk+[1‰¿ƒ¼×²+~øL* E¼ðZ°jзYŒ¸9+¶—B!QþqN »×qx}’çÇ.¬òÃ>LoÜú¬þ°W‰·Qþ´†…¡€¤O,ˆrÔL˜™éÄñ0 ¦Û‚ àpSϪç õé~à{,Ÿ½D§ ËŠ§2áÕ[“Þ>7ü²L)€<û;‹£J)ôX&@[€~œ8{1© á\“ˆÁ;ìà`$”›f¥„W +øvÝZ ‚ÊæÒÆ-S«\cg±¡©ƒ«zÓìn5nºBàûÐҫד†_‹ûŽóùfû:±o“8µv×Á©uR4=âê¦"Ô0!“?1¥cbÌ§Û TÖm’2Š9zá÷?0‘+/ÀÔÜîTa£ô%¬ý1 LJ &g´n ªx3E-÷!5›­²<'´õ‰KÓštQ¡Ë²×9œóXF~ÄÄ•<Âw]™ íf!Èmîõï¯*šH—&SP€èLó™(B+‘#_é)×›âpo•º_múÛ°íÚ ³½7}+¾Î['k{h¨öѼ$_‚nXÕXm/K­ óSayÓPYO"%ÅqÀ›ÏRG5ŽÎ/²¶ÛÙ·^Üü0§o7¼9x%V¶ls€‡¶§ƒ‘øsÇj#jìq“ËÀØé,Sž3å¯!Å’'Å0H<²û"}LK›·GW‘óEtNÜÉvè(~Û(}ˆ;»Kx>möÒÕ¤ ™Ò 9Ýÿ)øÛp—[°³ïÊ2ö¹Ýl:–R‘½ër) cZÍ­»ïnsÒ[†~ôŸåP‰#°â,ö¤Äz* '˜ÎþT&LŸ•.†µÊ5ý’ðëÆVÕû¾äLþ5Áå8ºÈ¤—1†…ENºjšFÐ…­ÀÜÓ½¢"û~|.L¢Í|Y™©¾Ø²fRŒuÁ[%ÅSÇÖÅa ¢xÌ!áWR!Ý+e`»R¯z«êµt|(N#føVZ~@úV1¤^—kÒ¼I´5Sšø¸H¡ÐÕ‡P¤es.œýk<0bÊ­tq´,ÿ=ç´!ÒÇ¢çuUäñÚÁëͰ*”5c>¢ê„ö©àE¦¿Û81ñÎlGÛNQö³ ’›€šWVõé´±4Ž|¸ÝR:²²¢ÍÙ³°ß°i9 mÖ§$[Yî»-"Ø4iû5x-ñMװߥðf÷½ãu™F–üÕ;Gz@W°‡té1Èý•‚AyÅ®}£Ê>bšÜÎ÷1g´ø¥”ª˜j™ùÛÚÜa°T@©waEà`{‹Šë^.ø'8¢H#ÍárâŒ>“XÃnà ØñàE›`ÁZÐgú¹ èa ‰B‘8Ëh:`/’(Œla2‡Áa~ `‚XùgŸ¿‡lè¡.y½ÀZ@e*L¡…>ˆ£¡<(¼­ŸA²P(Þbÿ…ý´µ*ÿM ·¬+-„J£Cj‘h°2óô˜u_Q7ÜVâ9ßNÌÈÒ?~åyõuÄ€|ÚÆ¼ ;þNZGáôŧÓ‰©a€‚ÍÀ8D¸Î# àù²ÎÚ! û"½cÉÇÆ¸8÷RšqXKÁ‚Ë•‚½ŽD– ̦1y´¸…ÍÈ©ÎÔÆ¨ ŒչçÌš‘|Úoîå®MéDþ*ß3}õä }SHAxö\ïÙ€¤¸ò8XBà}‡ŠiÃÛ—ò? nŒÔÈøA¸ÂSLoøÚ"ÿ ‹÷ÛîZLÙÈÅþ wz«äÅd5s@k C+ÿdø#R¹2LÞÂ!øT›³¾8FIú JœA²xOø´ÉkíT+ ê_B_ÓœS·;21·Á†i† 7ÿ£.¯od¡|…¤ø€Þ±…¶ u’Ú>šd$ù†7Wû­HxîYtÝ„©~¼U?­iØ“îÌ)ĹÐ,{d»5ÛMÙ²|lqþ}Ò¼ ÂÉ<Õr MÄ®VƒøÙY6p­°^jû5•ù¹‚ù–ZuGŒ¶=°Á¯ý‹I@öMˆhvÉËr!æ: ³zMß=þVyeÜ«Cã¸|ñV¶Ú¾Eâ^åç à«Ùúê±_«Û‡^B§çš7ÐkNaÆ9!ŸØ}¥ Šóá»ÃXEa"£ˆO‚]:¦‹÷Íþ³>; 2­É}™1|磇Çq®˜b:›Ê`ñ”ç¿¥$­ŠÐqcžB5õInäµyªx8ÃÆ…¾ÿ$~Äÿp¥âþÅÜ·ZÂôŒ½³w˜Vq4 ÌÿzX‹®ªè^:|W¾èþõhÍû, WÍ h+Qè}¬‡´ŸÝí±ÕUg_€XÖØ\…6l}Ù=vf¯.žøŸn¨§²LKž¡§>ÃãQ”á/*q®Ï[mž“Eµ7´êf*ó³¸Êò¼5 z»Ó†ø«…ö»’”4[b X ×4ëè„pñþ)G íwåñº:Kê㉠{ [ ØzÇq*$Ëkþ2;y¢\ÛHY-@”´%Ñ¢óY—´'—›Âš…3“"Ñr‰Ÿ1ýŽšå‡?òLG¡Æúãþ•Ós%‡× #h²¸ìÊ_i°‘u4GÖééAélü¥Åg]í'.Ò^ɹ–~_ŽRžúC÷ñ¿³ó4h€EÝEºÿ/w¤Œœ–þ>B¢8\DÑ€rÈådøÃG.¢I|§> vpŒ4‰û‰ëÛÎYÉá‚HºUg#@ÐH¸Êq|6N4¢ùAû¬PÐ9)dQ/ãÈtWŒë‚’9ýòAŸµfÏ®±]·1ý q½Ëy@É ³üB±Á3\»­- Ìñ*«“¡ÙŸx&‡È,Šñ=¢ è|ä1É%¯½sļÈ­ÓcvŠÔ…ô5 v8§ÝõaBGaåN²ËšgÒ#mQS S™G{&MÜómGµâ à$¸“n).%N•àaKŽ…íW[\Ñ.èFÜÙ´©ä’±x hZ4Ãì»­þÔm>h4Lò˜’¦~z‡Dœí€f÷(nájt£ù³ë—¢“äÛ£p ™m7<ê-Æ@uöNfÛþ˜E©ÈÁ5Êú*³àbÄš¿œæMmæ+ §®ØmJsŒ tÚ4“hxK·Ø8 OK²[ÔX:yâcåÉX)L¤9T»´t})[”Û‚º7ßfáV5oÇJì˜f)To“ÞÄþ¤ÐHŠ~´ÎXŸd¦ÉjN1Œfz‡;œtÐDÖµYÀ‚šú­ †q7…GAlÉ® ð™ðêNëÃ(÷ö!¬Ñ•’ µZá‰qwÒ¬´“ß;Â'’ ´ŸX•í>w*Ì5zêŠïýê|7Ùˆ­D^yéÙ’¨–Õb}KS&6YSJcГÇvx6ñ¤DÓàÕx@Ö´}ØÁi“‘F•ƒHÆνæ£èºüŠ9kEädŠº]ǘnD(žˆ Á $‡F9ê'{-(öÖs@¶]ýÏŸ'£ú7Æ/©BH‘AŸ0彨Ê‚d¯ °Î`kH¥üxfß0#¿S~xŸ·†Ð xèAo7ç-IîŸí–9'~¸ð9À¬Qó T¢iµŽ äÍÈÕ”N<ÒÄÁÀ·ü§ ‰ÓÚYƒÕ¸âȺ‘·¼;ÛªslòàrWä±NÚñUpµ¦Ûíò'ây‹¥FÀ²v·´Klíy˜.ýdÙIÇ%,jíOïVö­Ÿ”N?SŸ¬êôñ¿-´«òÒx©ëà¿2´±Ð_áˆ+<)Šœr¯ë‘;ìS·>T7^ɱ 6ò>4E{e™1p{•ó)ÅÞçß“9uÃ}08× [°#æK‘nÅkˆŒÎJ_Ü{x“±J$‘€s9›ºÃþwbû˜8‰Ars¤¤¤ çVÛº’17qÂ@Æçðè]ÕâÓáüÛ‹žwu†1ÅݺÖM‹2Ce]‡”F~“š¨Žÿo6Û²‡{» ed X’.7í,JÃK ‰Úlãf>BçÖP¡º+'Rw Ž!¦ÅhûˆŽœ)/ü‡ÿgr‰q÷ÀaVÒ;V&–W~Ek4~Ì—hý{¤£ø(ÞG`myÏø@ê[<)lÂeºˆè#ކ<²™Ž"‘<Ì-àü" ‰ª§àæÂG“Š0Äš@ê+KaÌýŒ†,>AõÌ€ÂßúÜÕFô(çíÒÕXIƒº”9¸€y²·"D¬56*.U“nÛõ» \Ÿ!ùš£fN„»R´äš‹ÇAìðEô¡O8MõþÙQ] Ñó° þp‹fnYeE9°hÄ¥õÔ~;¡1bB›µ#^ÜŠ„•dé L–ÝÔgšÊÇŸ4’¥Id]Qé¹äËHP†‡ ñBàÍjejÚкŠZïºìȇ[zŸ¨Þ­ôwT|£¬¥Ï’|éÖîÔuˆ+*hô‚ºÜT y½ö{wIÚ¹ªÁäbÉ7|¹ÐE-íbHç¾µ[AsjÑ׺¸&øËÛªýuRÑnø”qÊÚt)8àé’=øvJÈZðÔfið™T’‡WYÖ‡6yÙ]€,$ÔßáŠYÉ”ä@>õŸßYWßjÿ>º"÷²>úâ¾ûûìd@/{ÿ|>ç«ß¢Íﺠñ¦Äg´}±‘ŽR@Ê©j•$r‹nÝÙ\¹7H”CÂCf¿Žrr$œÓø·²gú¹§•¡Z|{?kϤwH¤]X1‚‚[åŽoÓ@ÞÞ»(&{MÈjh³´¿³>ÙûàÜ»ƒ Bb´±nÈEZøT±ÖØ8†`Ȳ±XŽæp#Æg–"S¤ÓÍô„õ; .n½ÕÆ6AX°.DzàŠ5Z;©Îú†ÿr‡›k£;¯övd4ÑGŸÎLkf§¡ÆÖX›}áÇ¿™KBƒjÿYüç¸ì>ÃéË~Ÿf®>“£ûn íñ—r½=O É‘à)Ÿåì•щp&½ó­Á:jzÔ„‹)w„ 3Œh¤«ÒcïRZ[%ˆõÀ„é΂2V?Á-¦ÉZ㻿w¯]Ž¯Â§]C:š@àÆ~g>Wß#þWæáµ]¾Öc½ø—77ãZ-ÓüÖÄFyx xåÈ¡{-5 _µ '›xkã™{Ü©Ï[–ƒs ‰BMÎ5.­»®U´8ò[y;ñ1Q³…ʤÛMX>šš ÑBáy«î ­¤8“’^MTyHÖc€›‹aÿÛØe±È:>tXo‹€Ø‘ßœª^óx Ž®‹"Îð•Âêubà´‹†OÏ‹j-'0J­‘ŠÄµ|AsT‰ö²!šXwü[Å\måÓîŽõÅRR¹ÚH ‚¹ €(~ Äk¥Fw\9<—ÿÿv®aMåÎtãcÑ\Ó…C/æj¥ñÃß5†ql ]3–L5ó˜Û}ƒÚàÎŹÕׄJWz û*z"žð•»;ÌåN·Q7Àðr¡;˜•šx‚áBɽ¦Ái0ÄÕøRÛK¬±“K‚!ÆÖFWmX£âîÌÝ8MN›Þ‘Ãýqn£òŽ9Ö¶"rõU§ Ž›J~9ß±¦÷+rL¡Š—Í‹ì¯Øú±ñž £ZÒ"ÈÐ1õeYp©:Ÿv`H2Ñðoz ó G4¸šðþK×õi™ôOd>ú0™,ÞùÊ‹4Š ôiÇHÊqèp;H?Ù¢†é6k*{„Ú]"j}G»mH½2tîàX®á‘ñ¹n­¤$‰¦·ÅôÐ QŹÛö"*Ð3¹Æ ¥QD8ßGW~1ô€w³6”ûB„ü\ÿgm‡m2šâ {»„Ö—äT¢é®]¦±gŒ 2Šò„*Ämœ{áNÑѵ ªÕ<6½F†Ož6(©l¯©xý›×ølì¶\Ý‚{mæÞ6‘‹žŸ2aŠìæ_ ‹i©nëTIð_ób/ÍàWâФ.MNßRùcPê¡ÖFu!ùl€ðu²‹!öŽ˜!µ8Æ«²\=œ9¼¬i˜ðoŒz@d!ŸÍ*:¾üŽ?<œN. œÂ$XÂXF¸y­= ¦[wX¢+éúj;žæ°—œ 繊2¦v‚~jœ³MCyÆ _ñÝ(Ô¯ÈéhOÁ†WËåU½{…⛂•É„Ý;ÕìMÝxø{6›ájçË·(…w°´Ódųæÿ{îqÄðЂYq×+Á.ÊûP(¬ãjWz‹Õ^—nsßÌÃø†.!i•¥ö„‘Pi‡Ç}qý+"‚ 4‡jÉæ>Où Ûzç—˜Úê+Ø©DË~ÐJîÁ c…ÛTFòG@{H®qdÕñP–kL™U‹.«0Ô&H^¶µ(ã/ˆ+[V‰ëhGU¸fšlÜWϧîÊðÊe/…oʤ¦!›MÉÄ],JòtVÈÐ㘑OX|×ß €õ%iQ…,R4B.">ìØåT¡Ãúç>%TUÐê \å)Ù+ çS×ùv•ÕP¶á‹MQ‚ yKû¤©ïú¼Æê_(¸&„ù5ßiâ+æ‰ø+þ:µw`$'|rÕÃÇnŒbCR×¥ÜÀÉ”ŠTJ62 GÊ?­$1™9Á ¥X£¨œäö š8 ÀxÂÖ4š= å:3ŽË,I3ÑQû¬§ô–fwJ­€ˆv¶»H®|6m äOšZMHÕy­ú5.1­ø1ðÔ*$+Q€)Aàø¿÷è4vÒü—<¼Ý{V¨‘y¹a[$=óã-†’V#˜Fµ6@ô¿¬·ƒ·&NþqÓˆ¦q³íÊ'$3ñZmnfÏž¬ÄÓÆi%NA¸Àÿ;¾lÿPÚ^nºGøl ß3›ïè:‹Ŭ.f Œ7—N_ ÜBzói’}¡¥"­[‘sÉi‹Ö†ÙF?<†Të„Ø lRìv LQA!Lœö·>;‰sÞlšðª®šEãËYµÍ¤];w€Ã;EXç BtçW†C£ ŽJíÝw-6å$v|t‰¬Ûêiž¢:Aú´ÓîFï/Y2ää.àX$‘jJk¼‹ïV¶¤QžÀW—½g,‡VfŸöˆX£D Ž®öéæy|=`:ÁªÀâVñ²Ü*”-§3ÃC#(#zÇù˜Ê\­ F‹€Öc¡-âE°VÕ•%dvF¾pOàÒzä\¸@¿•ˆæúrW¼¢š6hgš¡;TµÈ÷>ÅG)2R§Ü„yÐõ µ8Šúõ“ÉÒì¢ò©™\¨Gq9ƒãØ@-€Yrw,Ô§Ï”æZž±Ÿé%$ŠáŒZJC—ÈzM1éÍÅȘ²Bô8/\ ¢µ•bÞ¶ý*Ög‘Èæá &Ã#ÿV[Xší6.r,Ÿèåå±ûèêh×N¤“B ÇÃ|þó¤¯çÞ…e–¥7¹$â:’ƒè4žœ÷:)wÓŠ+ð²ÀO²U„QBsEHû4Ûyüܵß`k-FiÑ1ûìFì;ØÈKâ#3½ô6åäb£ØÇÞ˜"y« q{iÕ™]YƒmK5©Ù}Yu·Þ þü‹Âò?ôwôÔÈAÔ²j«äk  PÎz‡?]T #:«’ˆ éÛC2þmiZ;  ÊL+Ãy7Í Y“çb8×KN©‡±–Ô¡#k©<‘Vû¹7 ©ÄÙ‡L¤¢Âì’¼>ÝÛí]Âà{D¸†Rf€¡]? †«^a†Ãã¡cÒ’­•R¹ùŽòÏ5~àÇkW!Ô·þb ºÛ 5< ò<€‡‚ê]¢#YÓ#¼ö”´ñÏÈúYhm\»bÀ*0ÝÐ'-@Á*8,;ÇëEÒžÚ–Å!7zßo>Ü!ëÞøzžmêez¹e<¹ä½Iòîž* øaQøG¿]5ÇóLî>¼âÈ/ð1õÔ»G‡}´ÅΊº˜ÛkÉPbžnp­È‘kE'&|,k¦Ø3ɱjàØ½cv•v|ì BŸ@„dói°‚®Ì¡¿|FObà€F©¿ =Ë硇­ùÎ=\{ý™½ÑòPy#ÞFÆf@SYÍ ½»ןdÌÚ/‡†gNåBrŒ4e{éHŒŸüÙðB*´ÝEÑ8&Jüÿ X0¦:Nz0nó²nÄc@ùašµëžÙÖô/ÚÎÌXÝ7ìÁÀÆl}–³'+á €ë%Kxv€—5; —‡/é~Ûó Å…?qnÖ’Jt;aEÝÚ/îÏ$uð¦ÞŸ@¡Š}L×íRp°ÎÃÓ Îû±¡‘•ß"i±þd©òVòéÁJ‹ú“KŸãl\Æäž$ š\Hp·O¦=þ™ý‰n×W$×µNm`nnLLò´EÜkéa?˽©¡-mPʲÔ=ÀÓüÃ0·ˆTˆy„æÞþgÕ<Š9z’¿s"xþf]h}kç&˜ËAm·´-¤a´CXRç€\ScJU®ó>Šb´•ˆPÐ3‡êf ÞŽw6õr/Ⱦe†¼P>êRO^`ÑI5YZžé\¥õゆYc²à˜0?ŽVs¥uC•6t-ÅhÉõ}ëkîuqÌÓo›¦¹¸‡pN¬8úW¥RP%ñ4 ˜UG_™~ÀÛá5 Àϱßÿ7‰èŸÞ¥`V Ön3׳—ÈZŸ±IK§Z¥ú¹Ù»¹„R°ßv—/¢õGO5ù¢ä¨È@Ä9äâ¶ÒûÝ,*psMœ.½®tÉ;Ø0üç»xÍX7oš¾’ûÒðFÓ™¤ä3˜ñºÀLà ô*@`¯ûx£×ÁðH ¼­cÑŒÁ7÷Ĥs75.dœª«¤úorc%»¢øwÉeÚªò1/ú˜Î$·IºÇZ¤‹xseÑt#—À®pÿ{ýEz@*•PÃi&¾ŽÚ½à`³¦ÆÐ8ïN!©MOi…ñ"’4«B¦šgLÄøµk~RÞ^éûMÊ4ˆQóâ3Þ²Ù¢„¼ ÔŽq¸§p¬Ñü^YÕ¿!)BŠUÚQžä¶W&<¼ÛsÙo ®ÎúkЬ1*+¯ûrÍæÏî“Û"»“ãáúðíåßá ôìƒî«ì1ÊÝáúà­a}Òc‡¶d¬ÍvDŒ<ªþ‰H x"•Ð jëù¦j` ×çG¿G(¥zÕ—ð?bLfÄ»ò5÷R€‡“¸OÅ+ó M+.?¶.p„=\ÊoÚÕ—yÜðì561D'£N:û‰cuÁž²î*9Ä…† $‡¤&ÖšÍ"QTWÃäG&ûîpUÄ&zQú*·¬^b€aQ^í) 5úd,X‚µ¦d÷?«ºr#RéàP^Òm"ÇWV€â,:7Ž” w¯‘ã^ÇÉß|% !¨£pûüömöu(^|CP`e±~èäyÚü—$OZ€¤Ë[?¢ T£õ¶£‘ó>vÆLôgaïi4ËÇùC{,Àn(ýg:©ø}ŸQɰ̞‘_ø1š`+i½AÓùƒg>ÖÑžá÷xXW16m$ôÀÞîµX a>¶o¼ó>£UÍÿ1nïÿ]¾W¶ðî£Gµ¡%#n¥u!_ (cÁúÅ—˜©=ôô]SÈÝ@³¡Ú­€:Óm×üTyâ†4¿Dw«@‰¿®~h;L!#£ƒ_ -­S(Ä ®/ZØé4jæ6cˆ¦ûî£ãŒ;ÊìØ&á´´›€ôU©ˆ;íC‰19Û o¢HSB8j¿”&J5t¨×M èÄèG]Þðôˆl8Ü0¤8¹°µ½ÕɈ‚ÏX™êÐÇÇsö•^q9ÞøL ÑRJþ=@ïI ¥×jËÃ~—;”åÛT_µ ñœq¾ÓG¡bñlÇÀé á-+`ÍÊù‚NÞíI§-€OØŽ”{zíbÓÜ2ª Evâä‚ÁÖwþ.ËÄsÔpÍmÕÍ’Š§–,/¦äy>4^)G| UgÍV³¦Æñ —©ÀLga 4×Ã.¥3‹>ÔØs8!¬á€L³°7GˆWÅ$Dyg.'JúöJ]÷ óPŸ¨åÌÈ;¾Ý÷Ø œv~GÏC trC*C ÍÕ§41t•3ÚMJxŠG¯*Ê)¼Ör§Î”÷dkî…²…Ñ{ŽŒˆ9 ïwAj§\_2 ÂhºÆÐ¾4›<ÝN®tàõ›,aÃîàJ%<Ër®ª¯-Ÿ ×ê\CáÆ.Ñy~`RáÓB)P€@Dí6óúÕQÖ\QDq;×* ‘°õv]¤"Á+ &Kâu¯|rĸÇ6üvVžî¬F«{8Ÿá0DÜ€s¤íeÏþB±F©ÍCB;t)'¡’PÕR3å “­éPjÃ$­â*qJÌçÌ„±°xËë Ì ÚH©ÏÐûgúÊÊÒRK>qœå×VÀ™BÝ©ï ª&¢˜A!é î9Æ2ƒH»%§Ti== F éíR¥˜Ì›Ï[ëâ<ý‚þ#n­y–)ä÷Ä%¸Ô¿Þ½h‹èÛhsµE“m¯sFr3»»ÑnãèU!þ­N?Wgß«¡u}çÃßuèÃCú©/õjqú»L¾AJû͇¾íÓƒú©-ùút_?¶/ÏéÍCߣ¼=ú0£öÌ«RšCG8?¤°„àU™×iüЂìÒtýZƒ6õg.ÀÆ}pÈš‘Tt]ã"¤c2u>ÎÀquO3Å|¶ßF•Úá>¸áøR)ƒ43sꨔÔ0^ÖÀ[ÜÃaÖÖí˜eNÈ‹ûÅd¤Æ;Gú ŠÉFŸâmT½ˆ#Ð è³;»®_/Ë‚ÄÜ=õ¬›Í>s†“0;ñ)!‰Ó"®eö—l1%"„©¦ö]r޳1lˆÃ…Àü õÄ€Þ”ñõ<ÔZm™¤aéD$8ÝK¿ÎLf•Î6}>C›«}“`\"{á¦Õ«rók…3R¡¢é$yð¸Ÿ<ÚìE«Æ&ŽG2}‹î„‹ :+㎿zõ»}`”¶¹As`ŠáLL À˜$î›­}æ«€|çO$HœÉÝ£œ·k‰’Ž!¹üQk¿oŸÿdy§‡ë”Ý68mrÑ_6Ý͆unw!ÃŒ7 ôòþ¡FС]9ÂUrò+¯4ŽÚ㛣krÅ…žù9Æ0cxá8: ¬s¤ƒ¢g]Ýf¦®Cãz-_£¡Cž¢¿÷Äû©e"+PD6JÈœ…Ò~CÆå.ÔrM)k+FÅt»`ÝO˜Î—诋~ò<Í¢˜JéPØ7Çb”z—·-M6²Í˜I¤Â®ø1µðå©¶c¿”|ïöí¼g3‹‰fV]ë\LIÇñ¡3h((ʸ5ßy}Y|H,U{žË -ÓÜv‰»bE{ÿ;P{®0ƒIæT¶®¾sExH˜íbI9`.hò2Þœ°ú¯bÏŠYÖ¾ÊøêüW¶?вÃ?íGJüNS~=-Ô–!¦Ú%¬»žFÊívvr‚OhÆWLŠ€ø>½Î„Gw?çf_«Œüˆü‘Ju(ÔßXQÏéMl,¤&—ÛƒìR°¨ÕDQä˜e¥7ü?µùü=Ê´ÃYŠc;]抈××Zdøvô ÜóèÑO1°±¨šAIé×h$Éw»p¸ÕIY«}M‡¶'=WD ¿…YèÈÛs˜k’ÜݸyïGm9qwÙ¤»íʲù µŒäó§Ü£Ì?Øv¸Ð¯UGM…Š< ¸OT[wó+ °|YdÊ#Œ·<Ë'å–®?¤9¼Ö¹¤ôG•µy`öž Ħmgµ.ˆ ä^/—dÁ£1+à¼ßÁ2žºš*hƦWަ;.böîo»./ø(,bó‘j ²¶_ 9Ìà©è0é”Öê Nì'l„V0Å‹ :N0½]jŒ®hv¤óã{D¤¬âG¤‚l”©–í#MîOÛ.»¥×ûó8‚ÆZÔ z„ÜÆqÅ“ [r Ò~RÆEæ–‰ðm1ãÖì–÷…ñgRp‹í9öÊ g8Gã %Û12ÐPŽá2£QM¾`W¤vàDÁÍ ¨•þRpË]÷PêýÊUüeè M‡zè„ꈽ¾Í™¥+aƒµº4¡ZÁòF- tÏËêŒó;Ÿ˜ ŠFòï¡‹O0;Säãc9Q•¢´š´¿ž<Èò±îÃŽ¤„ò@/svµh©à†U1“—÷҄Ю{˜½±ŒVúÖÿZ!–ú=Î.ÐBiäÓﱆ+zëêpÝ»o*3Þ«Úëbu®™Bç"½î…œåç ­¾ôî™”$ù22R¬ ÒîŒr¨"ဳƒ(çþð7Ó¶*Ë“ÊÊñý9y¾Óš¬û×Ë›4 [ž¬7)Ë9ô·ãð2HVeÇó6<äFa¡4T»k¥ì¬Í÷ˆ'öH÷|ŸݱbtªÇ«‰C:]ç5aïbÚPõÁFrˆfwš´5/Y†5̶oÛ/þlèÙ~i,ÈHåßÿVQ ×4¥¿Z4W_ ¦ã«Ñ¹×4c|à¿aðlJÌ@²¼#Å…ŽˆI‡‡WÇÿ2-K~2˜Œ•î°¡‰—¾wŽž=¢ò]àóG¨¥<+ï$§_(–‚Ò-ÏÆ¸¶¹û?:ØKr"`’HZÈ4ÉŸ]Ý,Ñ*šðBp·FÞV¹ªÄtaÆ<;$r[Fñ4µë¹^Š4 ÜêÏðó˜3éêš1™r·Ùw½ùdzTëZ­FFan»Ðìÿ"ͧ‚#,[P\«#qšc=eEàû"2¤ÅhÓåMñTïM¶&ù›8Â`¨Î¡ ÿ3h0:c hë~P¾ì9¡¾-\ âžý%ÙÂhƒ) ÇNâÙ>Ê:7LM¸c¡IKâ‘…üßÊéÍßȃLÊŠ*ÿþ°¿'Š»Ëï8‚~„q2üö_TðE=aÆ«@‹c[èº!.ÚC5Ø…if›R3KºÇ¸^íý ÂkÝ4Y3g]~Ùû wdÚœö]$?Ï j_Å;„¦äØ'\¤¬©7oõȘ *¡øA9µ3ÕcE[bk[ÆNÎO“`µ‘BÈøÞJ;Êâ¦wì^^ó÷8²R]~ç>m¤¯ì^ªGÙ’NX2óZ¦AÊ Ûy²6oüÆÏã<âX;äVJçwðÛ|ò1`=êC_ü~ƒ@ÓŽ/ž­b½®Ÿå ¯î—c„°Ók|ê€ÑdòÛ j"GYÎÙ>ÍT†Wµœîü×é¡ Ž-ƒ=j9Ñõhwö2={ý‘Ÿ¼< †s«à§ɨ¹ŒNå¶ÿT`7$°²òžQŸ..$HWjGÑå£\¾›UàÝ„-¬8rì¢_x·h*ã¤OäÃô «°c”´C@¹¾ S™`#¥d »Þ9™õŽbi΢yrò„?`(÷ôú5út ´¦¦]3oÜþ7µîÁÄ §¹5VÊx1¯@¿— ïÖìum:áï¨2$Q#€;ÈY^¶Ø7«§ÖýÍv«qö©úq̉t="ËŽY’À´×Ë2ŽŠ/#IñýPxN´9ý˜=®@~·Õ÷Ŭ|RÜbÅñp[4Q`ä%ì3w÷ -+%Ÿ=üQPCŒi°*uúÝ?g°q·.‚åWb–6ñåI‘Ôå´ay×Ôð˜?Õ$Ù—ðê–,ý‰ˆãƒ #÷eëgi´?Êîf;sÐi… LJëŒÅFÄíCžûy ÉÖsÚµ»¢H¸;¼•ÌÐêêlñvG³¼\Ï,WT_ÏcAë>ÂÅ]¾öôx4´¶ á5ÿIueÝ^õX> ïS²¶À~Gª&ŠÉ-©NÛ€ª4ý¯Ýà톣y€[ƒ—îÞÞ¥2'…Ý­#µ×욃ªê]¥â¢‘’©%JýÓ ÓèÙg¶IlT¿´Kþ?Üâ¾=®›iÑ¿‹„÷ò Äçò7ÌXdåu+ÉT¬ãŒ<Åu•¡[Qdb00¬1†ªŸ”ƒ’” >JÂ"§ Ù4ת·Á(ª¡ÎTŠP3½béýwn)â(_êhÀÔš=s3Æ%®_Ó âÂéi[¶÷¤ˆZ¶ºgª0>ÁÖx+jº¥iµôÈs¿MŸŸY<$ž, §â(ÅKò)vk­UJÑš¦Õ÷€QDÆêAÖrëÄG‡^VŠsóÐýÎ÷=•EuÉ…H9*„þýMÛÞýØ_ 9ÅNÚ #ÛkÁçrQ ïú š,…ú ÃóaÝÊ9õ¨J¿žõ+Dãúyا’|É‹ÚËÃh†[d(¿?øh¯c<(R»¥Æ9àÄÂϱMòòÕI¢§öìdã2õì<ípú#($¬M°b£#~Ô®”Ú£Ór§ÞU$ÒÚ†î –‚SÔÆ[6y#j, é[à£OÅ´ ÊŸ€ þÎèn(»DųAT‡´=T3­[¡hxöQ1ݦ=þÙÌ„²í%;ß%BnS­üY]/úå(ÚÓo(äÙ•‹¤kò3ÞUÛRÜ_™Ë‘†ÿáKŒ%ebB4G|øVÕª¼G7é¾^ع %¯Èþtò¬RCÛ8ÑNFƒqè¶êßTÐ÷^“,éÆ=‡ðý,Ø ¥ó#ÁmÛ¶‘øñÞ•Ì?_E¬ÄLÏ,ÉP³ :Ë¥šOý?•$NX.gIç  ˆ\EÌSö£ŽŒ€SÀγ8Rl¡’¿™Ujjœ’’P˜0䚘÷¤oãG­D(ŽOBÐ%ÒyuàHJÎÚ*EC‰‡ÆDhèQ¶Rçy1€K8)MèK÷…† .ýgºviõ”½-6 &O¤>œ†Àó+Ž@Ɖ&ƒk:óUÿ´tóJ ã]w¡{DD3ÿ,Néäz™ŠzAÇ•vÅ”K~ÝàÔ“5ˆv«Os{ìñe£6»ÝÓTÜï³oð­.e¤ŠX†rMEd MÛtÐU[«¤8_xúZ×àø–´ »‹RJ—ÌÇ^›0ú÷å Œ—zzdéB¯2÷v¾ëýÏã7ºdÁBñ ñõš§0-É‹•\ïN?âú!á)ÂwÄ‚v•<ö<ùtCÎ#ž‹ô:5›'sѺåë÷ªqX>+nÒem—öCùÐõ¢p¯¦X0ðÚÚ_S±Ì*cnÍ}u¬J¯Žç £·"…¬Aï›Êçº×8éèý®Y.E»¾¬_­ÓÛ‚]Qåçõ[$ ¶‡ˆn­×AG³®’l$½ì˜QOö$ÄñŸC!ˆ ä‰\e,16sWýR u¹B…†ŠÙ»<"˜§YhÆ‹ '¸C|'Äe¨„«½vá9w€õ0~è^ñÕÊ™U!\kßUC®ôJƒ>EÙ‚òüñiUýž ‚½o1ëÖåéü÷° Þ_X›‡çDœéW¨³>"dè£,þ¥pé­sâ>oY ƒSV³ŒâÅDÚb1¶bÍN¤Èeį\ã• âÈû|’À¥V[Î~è^7²øý•×xríÑ èCZ 0GÌÒg£ðŠ«Äöê°i|Ì C®âšX”`òÛñ}í´óÔ÷ͦ„Ý‚A9SA¿]¯¹D{£9³Yf7¢ÕG…I§^Ù‡©¢{?´mºϋՎ×bûfŒ6ëÛPwb—ç3ìCí7C ^…¿Z)ìTµóò´^7Ž­G½èàØQ”» ÿWpOQ!/Öª˜UÀ£{zªá)·ž®fO¹µ­Û|¥µi&êþ½Ž;pm"µd–Å!H`Än‰*„ -™´~ä{êÇÿhórÂJ #„( X?¶jg#ÄŽÜ™*°ó=³>T[ù•ã.l"e{&@ö½˜±¼:‘ê+Mœ°£ 4.ßìßXFikbU£ë[G.zÒëMµC/Ù=€5c5_)5ónDÄ®EA×öºÖ<}Åiè™ÈåµÑ(øØ MÐQx#r»ãc£‚Ÿĭ5Ñ!äݻp}Îõå$‡õDK±(ky$y†\ Ô!ðT|ÚÙmŽþÀ,„ç-øÇººpI ¬Éô+B¯ ¾€N±8˜è¯a€WX@6£Ñ‹cyh„çDïÀÎü‰M"ç·ðÂ%)°Ó:ìžäÆ8wI;Ý©*’-½ : ,ÐïF}í¿§t÷à‘®1K÷9 þBþÁ6jøÏu|“ €Ù¾yù2áIW9áSáº\¦„Y›QfìhDãR¬j\1Vƒz#d†º3do>„ßUefuìMÿC0j’"#ÍE ‚ÉÂ0ß8"êR¢XC³±x¹vßP–?Hx‚-z–¹ÀHiFîƒýÓ¾ËFÑÏÖ\u oS6´òÖ4”^oºHZäƒö(_݆Ø|ÇŒøphx5“†óNž±•>ý‰lq„ö¥°e•PBi'³q–`>:+o^À•„ Ð)†;§F[¹ô7kn¥¨TFtŸý9;`ê•2æ{®Ó³K–â$j±ÆM©>óÿa®}¶T¸#Æ´VÒU3çÉbèuáúK«'<@ÖI,ÒO¯Ÿ !:•ˆ˜íÿ/B¾Üº½·>¢ìJ.qBš85_ª—…5ÁœËT5¶Š˜j·š6Šx\gn—Û¤zÊZã¥Ló—ŽNÇüÒ}Ï+4!EŸPm¨”×-žn?-áz„³xϵöÅz“ ΋Ã3’ˆú.¯T‡'Wsêwdfò1ƒ– Árò&ƒuÒ‡<ã›QVcS¸ž[Ã=Õ¨Y¢†n¸Åð ã²á3öþ6œMÿ|4Ãô¼ÿ3å}lSëÖÆ] ül÷ÏêÜ-LïØè öX-£€gáŽàŒ9ñˆ»7xR=Ö1x³«™Åå¨Ã J”Ü/ynøI›¤"h!ÿ(6YRµQžØGÙ^늒”DO°âIÈ]àÐq,Ó߯;Þu7ïÓ|þ ]³$èÄ#Ë ‘8èŸ ×7g†¬‰Ìc´:ؽæiÇ+î„Ø,u¬smÿbY% ‰HQÜj¬©Öùitê ]ÒÛõQz‚’…íjÜɾÃ%JXÓÕF9GDè9 2Ûn©ªý+Ç 8¯#A_¥ !ŒRl‹5hѧª½Æ¦ñ§ÁLh®h¯RÍV;Ø#œ-Ø' –…‘æ~pb¦CØ `£¹k[IJÁ<‚g—\ñ.>|-j  I·ÍË–yA1O¸dÞW6-Ö(‡<ýDvme~©o<Õ¶±UP †Sc~'“ ¥qŠê=¯-ô¡ãäÏô>>ïŠvúÁ{a~:ÄÑR¹€’ ,«³v¤8sO$ëΈéj#FQ_­ˆÑg#t:>u ¦Kªökj:ãfŠÎVìä›g0º£ëÔáe ¸â§"°íôw² /sþ.”(WÔZФµÁ6~æÙØÙÜ–±äò½`ûI¾) ZMþ0Ny-œÉ"«Âì‰:Q"Àn‹ƒì)¼¬_\RCñÛ=;©}QS©9âÝÞ¹sÃ8± bÁW£u–­¬)cé¹¢´‡Ù×ívÝ…C(|ßaØxáað®óäÄÇöÈùKÀÅͼ 6s?üH=s¾ê߅ߊզf‰Äy ,£ÌšMo¬öÀÊ8 =’B€ñ3Z^òTˆë• v[íQì5ÄŒ[\ͯW+?‰FuÜó=fÝQŸãW/ÔÅ<Ó¤F¼ô+®,mÞÔ+ÑïHr„©}«Ó;tò´0°BÚÛ¢CÈŽxlË m)¡>ÓŒ3›­xã@J²ÈÄ4ÔXS»/¬@RÀ ”Ä×Jœè¶5<îôùÚFGg ìáÛ)ÙãY¢_*?‰´Ke¹­Ã¥Ôu¼!mÏòMŽÍÈ©ã` ‰Žd,0SRß`dCˆ³Qó±@£¸ó ­¹ Âd˜i¶LÕ†xeýÝŽ¬Ál%óó[´Ó®‚É)ÛîÄ2Ù-G|YucªWGÌ ³­Î¥å›ûÄMj 7Ý 8·ã® r"q ¾<£ŽÕØUé¯!ij„®î9yl^^q•>‰ ò@3]óˆ+(Y§Ó*8jŠb çâ7¯?­oÃviÙŒ°Ÿ‚¬• >ÑYœÈü'ä/Ñ …™×Ýx Ì("QŸHÏ,%….Fò± HîÌMÁ…Ð&ëɹUaŽ`@úïC ÖÁÔdé×Xá7ʬ;‹­„Ìàëµ}EÀ"ò¼Aºþ'mšûEÊ|þ ¥Ñsrt15vWÙ6“÷£ ¸IJ#ÌÅ3,»µ0 ˆ‹ o • ¢M‹óVqž #°D^‚1Î÷ ¿,õ¡~Ûˆþ÷£š™¬Uéü9ë¢H)Ë™ˆ`úÌ«Æ7|ÊSÖýµûÙšè*¨]lÔ™’àÓ}ÔÉFöhÛÕàøFîx|ˆ†MCg É#¸”¢ëyrµÀ[´ï€ã&!€úTîôqµø9¸E™m¤üÔRÌ[KØìÜBU›¬wÔuŸƒÿ{´pFÛâœ|z%˜CÇP¡ò°†ù2ºf‹">þ'‘¶Ú¬ÚÀ½\´ö§ þ價‰šÃ?Ú®²ô=€:aGä#B¥8w¸ƒš_;eWÚ]rÜ×½ª 1Rl2¡8.~òÏaz^ÿ5~èHö úõ~úX^쎬]úœ¬kšqÈvGaªÙ.2ä踿Ӌ¿ÞÚü EAI¢^)5éeC¹²‡‰äbà ÜhÈ…G†¼G3—Ç^²o%=Õ4Ð ’ÀΤðþ†_Öª®´µãñw‚q¯ù^ŽÅîz±WTÓ¿¼¼ð¢€œµ´ðˆ´w–œýãl³£ä`ž¹ y*VjQ‹JJ<E¾ä&Ekâ>«¡5Җȣɸ‚RŒ5|ɄċGÎ]ä¸ð鸱K4·~‡å›QæxYMhL gí€0½$ïÝ3ÓE˜ˆëF¬Šº­ZËD%¢¢äA/‰p*4 ¥µj¬‘Ï‚†|åàÅÏê¸wi@âÅîr(X¾`Fd‡¤¿C8ÿ-4.íS-Z“+òÀqAlcÜy™´&¸¥ï¬9¦±^nŸç›I~;Y@8O–Ôþµ‘C°ìi×vUV±BÏ÷hZ^»½R•ÑfàpŠp=ÁoÕâ)ãêÚ¡zÉ ‘É%Tú´Cg'Í*Þ-”Lì·»<¨5žJ.„øþ÷O÷ÒJ·ñ5¹ö±+éÉ‹0VŠz5æ|dbe*·¨m!KÃW‘+ õО³Q”ÈS˜Ëâq„€Îu×íaGΙS¼“€§ ¦¨ç0åÅTJt:¨È¤æ"ÜEØêºíãú:àÃÌ&sZcpéHÛ£¸&xˆ{üÑ”+ á*IÊ€œµšÉ¤’ögÑM?ÊÉzç]dØmäZúÔ……0Æ•.í59:AÑþCü³_b8’"È™=‰eóbºŠZc]{w?sð37:ÀûðŸëˆ2Æ[« ‡6‡èoÿr®¬?s£ºî3“z&8Dpº´ÓÕItæ¹€¥¾ðiúåðŠQµˆæy¦èj¾øk>t,ç¶EO{>¦AëQ¸ Àeîn*ä¦.Ú›éWƒ:“n¿C®ÚqTýÓ¾"vSfjÄ &eó”#düb, r?Û+70Y¸E“ª;V?ò›añ7È×§)êD™Ș/"¢–¢ÃI ¦O> ;r*Õ¼û5ã¤Xc ÛQâOKÐ7`—¶a‡å”l=J…­î“)«bM úÍLJζ·õ?á?-éѵ&bšá¨áí‘éG;Žäm}¿œÈ @ŠžX}w|F¾ÉéŸiÌÞÜ3¿¯näÌ”§o¨þ¸°—P=ëŒ;Q‹ÆžbÃAAôœÛÛGŒ)Ñ•¨¾cø Î3”0¨Mܹ¹'€_ .X,žD nëÄÅÜúê1ÛøX?ô†>Ñ9‚Ñy› é×êê€àû“˼dw–ÐZ$îI‡pÓ;¦öûÜÙ_s)/a2P¾÷d^Íчߜ;³€g—Ž7ÎE—êK(à›è}Ùgñ Ø×þ{ÐSæŠÛ븥º#:Ö$1Ñôž8ëæ%À!SùÒä¢1áþõÁËþÕÙ%HZ.â1Öõ"…©²Ç¤™pö/,‘T•iU™Ü¹ôùoJÚ¼¾‰'#j`\AÞ UïË8V éÔÃg‹Õˆ\zFš@’©±OÿÉgÂBJN •µ]€?ÂÓ%¢§ÿ4ºu‰¹è–Ô2y3±ë·͹·¾©–Ȉ0=ÏQA™›–È!§Çkƒ0%»ãïÅÍ~ñÉ'6›ß…m×Íó|ß7Ö˨åá‡Á`-¢ ³ˆÄŸHÝ+jþyÏÿ1ÒV'±Üêì²Âo𿣯 t \Sr¨õfÀ5'eŒ’ó˜½Y(ïic’©±OÿÉgÂBJN •µ]€?ƒí±Ïÿ/@ÿj)`"ªÈ¦èc |DÐAb¶ëæù¾o›æù¾o›æù¾]ëÄ'ÿzÀë­ß’©±Oó'ô3‡0G;X $!%­¾¹Ùᄃ*ŽÍó5¦bÎ>kñä#zMÔּ湩Mº¸«…¬cÂè‰Ðã™Ú2¾²Û#æ×›mçÄ ògÚËýÙP#\°v¥ž 'B Â;¦‚!‰G¸_Ie^$MŠÊ3ËoI'k¿oØ=γ¯$ü®ËÞ¨A“ÝÊAúFÊnü¤HÑúõè¹dß)ùM@ $%;ˆ…ðJÿ s¤/6b1®ªªªªªªªªªªªªB 0’ƒv(|õè¹dß)ùM@ $%;ˆ…ðJÿ s¤/6b1®ªªªªªªªªªªªªB 0’ƒv(|ö0æàt„kY/Î*U £ž€¡{Ñ‚RûÁ 6‘­ômÛ>G¢ä’ô°î½Ïr¯áµIÜæ›$ž}ýRq<޽ܴ)yêç¿q[EmýrJuš]™Q,y†ºva]èÕðëÒ¤i}ˆûóýÈLÎ*ç§h­Ï9š}6ÓÅÈ·xª¡™”Aÿ!ÆFä° nfœ-o\œ¥P»ë :€%7ÅuëSû éÄh.ic¼k}ÿdç³è‡÷K«Èor°ݰƒå¦èÂ_sZ楲:Èd`ïÏš"l¨˜ûŽpü¦„–)³Ÿ‡*ÆÑH}÷‹~ÑfYùgڟèût3äþpj÷P7¥9íjŠdZ°(ò|_Ùþ…uh$ú²Å›ÒYdjœGØ71Š3™Ìž¨:ÞMþ½S>Ï>=N4šÿ)æ¨(ÁöŽ8»]æAh7ÊLªÖ‡¯`['vFƱ×U¡¸¨­ƒ+÷.„I[«HsEàö3B]û‚°bÖáMjaé£l_à\Öøeñ‰#RPsø ­ì«<½ÏŸ0.M­ûÚé\ýŠt‹‹»sª1äe?¥Ö´ñÿ g÷ùá€gÍ}q’#«·-k÷ Ø¿®¾~üç—fê ÇNC¥í”Ïi»â4ØÅÄu7tNCgíæ<Bs]"O}†vþô‚êU<_ H3\–×£J1ÿqß˃ÍÊݳùäªb/E·8ŠéªbÍVeП¢Éÿ€¾ŒŽ½'öpC+Åú[†‡;°åFÉ8Ä1—» oE¢Ád…`óX&ñÊ·æ‹Ê^~Žo O¡ƒØÖGû¼“È9gc ƒ­"Ëò'¶OÀ|ö1ùò­=‰ß†:Þ/ÔeŠb-¹h5b-õÊ—“O†}|“^ Ÿ¯…‹Ç Ú L Pþn1»‚÷@»÷ð7øê±sˆ ?ÿÙicnV Bðtransmission-2.92/macosx/Images/PaxHeaders.4960/InfoPeers.png0000644000000000000000000000013212442116641020756 xustar0030 mtime=1418239393.163740681 30 atime=1418239393.163740681 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/InfoPeers.png0000644000175000017500000000073612442116641022411 0ustar00mikedldmikedld00000000000000‰PNG  IHDR‰ ¥IDATxÚµ”ËJQǛĊ†qF§V*­TpáˆZxo BhÞ ‚.ݵ¯m£e«^¡ ‚hß#ôÙ|ýpÀ ŽÕ?8s¾s~|ç6Dô§ü¯p1LÓt%‰Ë|>ÿ’N§b±Ø9º%°4˜ceÄãq½\.‡CF3ºÝ.e³Ù+&J¹\ît0„šÍæùmQ¡­P(œ!R N‡ÍÒ€$$,•J'½^-ÓB¿ßg³tQáf£Ñ¨1A«Õ²ÀªDÞ%,¬×ë9VaµZµ€}üZKö'“É3Nš8ív›Æãñ rQ¡dTxQ©T÷1[2îcRô”yر÷Åb‘’É$ƒWzÌMD(ARCE™L†¢Ñ¨…T*5Eþy“]) ‡Ã.¼Ž[<¯´) ýH$!Œ}çÏqQh ƒO~¿Ÿ|>Ÿ@€ øfÒyá®Çã!¯×»n·ûŽ-.”€ª( ©ªJ‡ƒœN'išÆÚ¬}sø ²,¿Á±3/T€Á‘ QpÀ+äa*ÐÁž :—ýS¥ßÀ…ßÌp˜î¹Íª¹IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarPauseSelectedTemplate.png0000644000000000000000000000013112442116641024630 xustar0030 mtime=1418239393.147740407 30 atime=1418239393.147740407 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/ToolbarPauseSelectedTemplate.png0000644000175000017500000000013312442116641026253 0ustar00mikedldmikedld00000000000000‰PNG  IHDRH-Ñ"IDAT(Ïcøÿÿ?9˜*à? ãÕ8ª‘JIŽ 1ÙÒ<‹á^IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarCreateTemplate@2x.png0000644000000000000000000000013112442116641023657 xustar0029 mtime=1418239393.12574003 30 atime=1418239393.124740013 30 ctime=1457295922.642852846 transmission-2.92/macosx/Images/ToolbarCreateTemplate@2x.png0000644000175000017500000000031112442116641025300 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzôIDATxÚíÕ± € …á ¥Y2… 930Á+4—€úr/ù«k¾„)¥íñÀ[;3T_3 u¶‚@,·qÇ@(G%¨"ÌŸAÈ}ý°p6o0Þ—€È…«ˆx’yLˆœÏr$s•{|¨}€?~ ˜ùgT¦Œá'Ä™œ!w2ê‘IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarInfoTemplate.png0000644000000000000000000000013112442116641022775 xustar0030 mtime=1418239393.148740424 30 atime=1418239393.148740424 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/ToolbarInfoTemplate.png0000644000175000017500000000031612442116641024423 0ustar00mikedldmikedld00000000000000‰PNG  IHDR‰ •IDATxÚÅ”A À E'¡& H˜$L0 H˜„I˜$t=üCÓìöÉÖä…pyi ‹ªNå;áK­FÁÉ !Q0 a…ÙPGžÑá€ì¢;D :•YV#áN ›Ëîd„‚¼ÔÑa5Zî3F¾Î0>è…–°aŸÍá„7Øá¶\Ø‘»7±úÅÄúíƒåyñðYSâugIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/UpArrowGroupTemplate@2x.png0000644000000000000000000000013212442116641023546 xustar0030 mtime=1418239393.141740304 30 atime=1418239393.141740304 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/UpArrowGroupTemplate@2x.png0000644000175000017500000000031512442116641025172 0ustar00mikedldmikedld00000000000000‰PNG  IHDRó } ”IDATxÚíÔ1 ƒ@Fá¨$XZ›ö–žÃÒœ" x±š;oòÄÌ®¶þðuû¦Ü›sîk/up>^ä oH;H ‹k,À‚ÚŠï˜ ;&}óg#Ä0îÅ=$RÆO¬H«6~ÌD³¶ì 9†–µhP¡ŒˆJTh´ –C ù6¸\~-CkȶÁéoý 4ã»Ëzœ`IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarInfoTemplate@2x.png0000644000000000000000000000013012442116641023346 xustar0029 mtime=1418239393.13274015 29 atime=1418239393.13274015 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/ToolbarInfoTemplate@2x.png0000644000175000017500000000045212442116641024776 0ustar00mikedldmikedld00000000000000‰PNG  IHDR((» H_3PLTE£FÉtRNS 0@P`p€Ÿ¯¿Ïßï#‚Š–IDATåÁA„ ÀE3ÿíz&Þ¶j·øy娂Nv®Â)£œ6x”S†G8X€k#i‚¢HÀ7”ÖvøòÅNੜkáäM°O>V¢Q+‡ kU9ìp)‡×Á!ÂeìN¸„C…K9¸AJX㔳–„KXÚx»Ö”S p(;S¸¢Ñöˆ7þÀ¨ [ sóIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/RevealOff@2x.png0000644000000000000000000000013212442116641021307 xustar0030 mtime=1418239393.152740493 30 atime=1418239393.152740493 30 ctime=1457295922.645852897 transmission-2.92/macosx/Images/RevealOff@2x.png0000644000175000017500000000074412442116641022741 0ustar00mikedldmikedld00000000000000‰PNG  IHDREÓ/¦rPLTE :::;:;RQR\[\Ž”’””’”¡Ÿ¡¢ ¢¦¤¦¦¥¦§¥§ËÉËÍËÍÎËÎãàãóðóþûþÿüÿÿüÿ7L„O%tRNS %258<=?@@BHhhx€¦©ª´µ¸¸¸ÔÕÕæôýþà}äüIDATxÚ}“Û²ƒ EÁRA°é½µöjmþÿ»‡“ƒ3u=(ΚH¢úGëQpÖh•£kO _gzÑPF³˜Ü²¥‚v™Ü Ÿ»~ǡ߉]‰­·½}8ò¹m%¶R@7pN<Ä6²ÆâÎàÙuOwÉ\#Ðc?ä|ÞÈ,ûz­ ^=3ÃE‹e/¡FY<æ /æA–V9ãcœ5#Ÿã_9xÉo½,­îìIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/YingYangTemplate.png0000644000000000000000000000013212442116641022305 xustar0030 mtime=1418239393.140740287 30 atime=1418239393.140740287 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/YingYangTemplate.png0000644000175000017500000000026512442116641023735 0ustar00mikedldmikedld00000000000000‰PNG  IHDR ñbä+|IDATÁÁ ‚зAá]ºÚ‚x „ %ÚÁ\ hŒ.<´@HA3xR~ï ò4›=Uø9ÙkL:¨E\…IÍ â 1°ˆø8vVo쬌""âÆÈYDDÜ&gèEÄ×ͤh½l6/-P*þßM6I*ïWëIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/InfoOptions@2x.png0000644000000000000000000000013112442116641021704 xustar0030 mtime=1418239393.150740458 30 atime=1418239393.150740458 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/InfoOptions@2x.png0000644000175000017500000000464112442116641023337 0ustar00mikedldmikedld00000000000000‰PNG  IHDR((Œþ¸m hIDATxÚÍXkP”×î’ÊUnË‚‚wQÑ("ñQ!b1TA"¨Fn»²\‘«KV‘(,ÈUP¬ñR/ë¥i£&Ö¨5igZGiœ¦?ÚjúÇ·ïóy>æ‚;c¥Swæ™}ÏùÞçyÞ=çûÎ9ûý„ˆÞh¼ñÖG5 ÞJeañ–ƒÚÅÎÁY ¶à¾ÿG‘* ~ê6ÂÓ·ëËR÷Wÿ’€Ø}ÌÄÙ¸¦Ìý_ެJ.fü”Y rªº{GzNñç¶%ÃvÎ’;oþƒ”zM_³CÎHÏÉþà0÷]EѪÁ,î-'ÍpÏ„ì=G^zôüÐÕ¿Òžc7» 9ƒ¯i¢sëÑ×~õ±Äñ[Ê»øš«“ÆÝ¹èЂ&´¥8†uBvewÃ…?ÐxñÅ·±ùÒ#g×9%m7Ð>Ôûˆ õZÙØMÏÛÿÙ}%€4£H‡0œÞ~'8eÿÉ»d:uÚzþD5ü¶®¸ñVIÛož"nå~qU×ïiCΧ¿E\#8&Á4…¶êuGφáfie3듦KÏÊÞ ¦s÷©ùü}žæ›„6€¸õâ·Àú‘ ÚЀ4¡ýê£( st6.*yûqÿ u–Ö¶¸ozdRA±å2Uu²é¹?Pýé;TÙqL'oSãÙ{褸ö³ÛTyì:Õú}ÜȤÂ^hAÚð€×«ŠDëˆø­íù¦slÞÓý,">çÂÒhÝY´ =Ôpöî+p—FkÏB š²>¼÷¤ÙÃj¤§OHVyçó-•'(¯ú ìúÊ_£§nK¨î¾Ie‡®±±‡ .R\Úv…öuÝèË\¥´Ñ/xÂ5˜›Z¬Qö+ ¯èv¢Œ²Ú×yªŽýŽŠ.PVE'íj¹D¦_|E5'¾¤Í½”»ÿ”YìhêA.8àBZЄ¶ä/xÂ[Ô zYV «Ç¸ðØŒŠ'ç×SjñAª8röóHÉ€0/´™Í2JÛ)lµž¦ø‘Ǩ)&s¥¥´‡ƒ\p”Д´á/xÂ[Ô zéô2\Sí4Ñá yÖdUÑú­Õ<¿¢O!!oßIÉ<¹¨üß /Ÿ@ ÞÓæ}ís–ÑÆ<rÁéãC šÐ†¼à osÓ¬[—šá͘oem·:$Jwguz›´QåÑÏ©¤¥—tŸ¤ÔíM´`Y,ùÍ[|ï1vr´â™ó–?ÁµùKW#p¡!iAÚ¼˜ÇÀ žÂÛò¥#ȧ+õ°Q³½¦¦,Yq8ô#ýèM%ÏbÒË© æ•ó´äìí"mq3E§(hù:.2æï¶C™) [YÛÆG=DrÁЂ&´á/xÂ5 –>*¹Ç¦ï¦þˆÛ¼—vò´”µ]&ýŽVÒieÂ6╼ßldî{Œ@† âѦ•!¹à€ hAs /Ô0Ѓ‚Š­míÆÅ¦—¾«¶Uuó²qŽŸ¾^<] ÖèŒ\ÝǦˆ¢<€ˆ}íì#å<™§Ô‚6<à%û¢Ô‚šú/ÎCm‡:ù¬Ñ—¾³•r*;i{íY2ò/–‘ZTÿ& |Œ93lãÑ•ódžR Úð€—ì‹P jê¿þ9ò½ä»V_Jý±>«œŠLg¨¸þ<”RXG[ÊŽPNE,|¿”¹î( :€ˆ‡Oš179È\h@ šy¡ÔÒ7ÍÊU*Õg·1^Óf(â̲hí71:ãkõ%´¥ü(ñ/ÎàéH)¨¥lnã^ÚZÑñ¹fô/ÐÚÎÞkSqã·ÈA.8àBZЄ6<àOx£†þöM1cc&c #‚—™„Шä{ëô»(µ°–òkNó“ØMÉù5hKÛ×þ·ÈP÷ËÇA$;¨Ýƈ kN?ÀµŠöÏ‘ ¸ÐÚЄ6<àOá=JžâiùçÅ3*"nó_Ö¥—ðt즬Ýí”Ë‹-flfÃjÒê©æä×Ôzé¡„–ž@_»îÌ}Ò‹\pd>´  mxÀ žÂÛe ÅZ¥¸w4®îcÂV%oÿn]fÅgWROÉVþõ2²+»¤'2‰G%¥¨ŽJZ/SÛ¯щ[OÄ|€¸ÆK‹”ƒ\p”Д´á/xÂ5¼l?¶«¸ÓòØŒ«qY|4¯¢ÌòÞÐÛ)ÕÐÈ'ä}¤3¶ðI¤“7ýã¼;4Sb¾É,´œƒ\pÀ…´  mxÀ žð5˜Ýê\ø/cTÜ–½Ï㘼a[5q¬›¶PÆî ú’#¼é7QRáÚ˜_ HqŠ¡‰Òv–óÀù‘´á/xÂÛìV'H7ÆÔ ð„óq[÷›YñïEnøb~ØÚËh'äÖ¾´ý•¸Ð€4e}xÁÞò"mö¸Å˜ÂKǪ°µ›ïzûίåÿñܳ0<þÚúœjJäSŒŽO(Zc+m,äÂxm%Ї<þnE[ŠÁ]žp ZЄ6<àOsÇ-åƒâÀØÅXÌeülˆ¥UdLæž§q95”dà'“±>×Dhë·™(…O,b¹9Èmh@ šÐ†‡ðoåbnšÕŒ± Æ †ÿØI3 V¦):­Tµ(í.B;8JûÇŸ'~@üqa½Ä‘©;hñŠä»ˆ‘ ¸häWM¡í#¼Ôý¦×üu†“¸'F0Æ,^y.dÕ&z/:Bc2‰cð7ÞÜõsCc¿A;&£¯=áiLâ)}ˆ68à"†4…¶¼^å¼\äİ{ðA4dÚœ¥焬~>{É*z'xÕ÷C4:¾9qú¼Óè [›-±O@ð\ãC rÑ.4 M¡m ¯ÿúÿ±âÉÆT,R»Êöñ¾íè2\/î¡á£½wOò]DJŒðœZkÈA.8àBCh¹)Gíu_}8ŠûÄ$öÍŒYèsP[3ÆËFO˜)±“Æ#×ä‚#¸~BËÚƒñIEµxÒ&‹5k¢0òäÈL;‡lìì?s ä‚®ÐPË£7h¯ßÄúä V{Waâ(ÚãÄf?Plü‘£¡a%Oí ¿ÀdX KQÀH ÅØ"GÉ1ÿsð_–[(Fw(F±µ\Ìë¼\ÿƒwã`—]Ç"IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/RevealOn.png0000644000000000000000000000013212442116641020577 xustar0030 mtime=1418239393.129740098 30 atime=1418239393.129740098 30 ctime=1457295922.642852846 transmission-2.92/macosx/Images/RevealOn.png0000644000175000017500000000040712442116641022225 0ustar00mikedldmikedld00000000000000‰PNG  IHDRH-ÑÎIDATxÚ¥’1‚@E==7ÐS,wà x‚-X¯`!-5ņx<‚•¥±Ñy&cpâb‚›üdøó?|vfeN&p‚­ Ôp¯^âl^°KÀ£±¦µ Eq!Œ1Æ; †›˜Úi< ïûÛ0 ¶m/€Θ½Ævòö3²,*¢†£gb;Œ5Dã+ößàè¾ÆØ,06jüu´ÆwÔÔ倮ë®yžïmT§Ä·q`²f½œlnðˆÕ\UÕIÇñ±sfLÔhÿZ¹ÅKþR÷¹<ç#{IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/YellowDot@2x.png0000644000000000000000000000013112442116641021357 xustar0030 mtime=1418239393.145740373 30 atime=1418239393.145740373 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/YellowDot@2x.png0000644000175000017500000000243012442116641023004 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzôßIDATxÚí–mL•uÆÏsžÃÑÃá æ[fPibGo•Á°µZ‚½¸Ö†ôÂØ\³sÑ’ìCË­ÖVóƒ5]ä\-i‰mÖH@¬—EŒ%2—Q–ÄÕu=þ7Ϥq€Õú¢Ûo»¹ïë¾þ×ùŸy<þW.¸àB1µ–˜ÂÞÔÔ¬ò„÷”Zk÷–Û{Ÿô¡éiÇEµzšIó_°h^¹ÿg¨ó•0z¶ÌÁ‰óÑ¿3B®Wíö4“FZíü+ª‹<ÉuevM[U½Û21ôi~kY?»ªp„jõ4s5Òjg{±'YA¦@‹ÞÏ÷ÖtlL@ÿŽL 7åc¤k=FksƒÀèˆP­žfÒ¸ZíhWòš\sø'%Ö†æ }[Sñ{ý"Œ~½ øñ àlx20r†üÂú/õ4“FZwG»ò×dx_-´Òøp u¿Àðîé@ó"àh1pb0¸8EÞ!o«fï=àø‹ÔIëîh—§7ÑKž `ß®ïºöJ?~~7„Ñú4à`о-ºïzVF£žfÒH«wWµ%Þgå)ï˜LR]¹ÝñÝkœ­Mö…€‰@[8ÌÛ8’Næ’yÖìi&´ÚÑ®<>/·Ûå)ïX,“4©é)ú¶1ZÇû@³8dñ›ÄhªMÏ–FZíh×õ=ƒ$ŽXãPB‡¤Xïðk  aà+?ÐjÑÜ3!¤ÕŽvå!/z¦øXlsU3šŸwpú}Þ¨ëw¢>½hqQ˜^›ðJ«íºòº'Û“MßiÄ+@¹\©µŒ}I@‹®›üùHèÑLiµ£]y˜˜Mæ kL€¨ï?‘¤7¬;1PMÓ&š¶N£y8:OzÐ5—dÖüYµzª¥‘V;Ú•½ŽÓs޼' ãÃÕöG½›ù6†ià'L>бÐw;Y ôÞ(T«§™BI«wW5¥öN 8^ x}žõhçK~ü±‡šƒôæ÷Cƒ+„jõ WiµÃÝdÈ£â6«T_+IŒÀ6Ê,²pw™¯å§m<ü †è ß̾Ïú €S÷ë`¡Z=ͤ‘ÖÝÑ.=Zéu-™Ib=„Æ“4rõ]Ùž*œ3¿~Lä3UW̃}yÀÉå¤PµzšIãjµ£ÝÂ,O1½®2žþX,GB$ƒDŽXªôŸ®5!§Ggž躳„jõ4s5ûÂÐÎ#÷ê¯ñ¶b°I€Ì ×%åXOÔ¯sºOV1Ò ï—AÚHk¢Z=ͤ‘öÁ«Œ»7“Æ+AÞýcä$óàä[HþÆ»íM_¾ßls"†>Hâ5‡„[«§ÙËÔP[@–šï>ÝxÅMäoÁÅÿ#¦+Lˆ%äNRX4ß³æ¹eÞª7WÚÕBuÑÏΖKc´×‘Lr™ñ²'õBõ‘J昫Ì5ŸlÉ'ÂÔw[¥1Ú ’uõÖT^É|&D˜Ì"ó̵.&7›„©#d!¹Òh“‰_“%{I4·1“d˜0YBµéÍ2š ‰×î8‡Çý~H|&H‚9 D’ aõÌ,^Úè—ÑɈÄ6O´s>ÍÆ#Àß%½õ5÷ÐÿIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/Globe@2x.png0000644000000000000000000000013212442116641020466 xustar0030 mtime=1418239393.158740595 30 atime=1418239393.158740595 30 ctime=1457295922.645852897 transmission-2.92/macosx/Images/Globe@2x.png0000644000175000017500000005321512442116641022121 0ustar00mikedldmikedld00000000000000‰PNG  IHDR€€Ã>aËVTIDATx^ì˜OˆEÆ¿ªîé™þ3»3ãîÈ.E0!·Õ`¢{É!Dð`„\<©Oš\”I ``+©YšŠQš‰U7ßxîèXê;À³>Ÿív‚… é.üˆÅØázÝšvê5^wlˆ¼ç ÝÉ:#hœ«½BJÐYäYP¿fíÕ"ËEž?³B.Sq}g}¹±Õûîêù¿þ:yîÓö¡™Îc®ß8Á¸õDg¢1×m¹l³á»5xu “þ^8ÀªåQš#ÝL ô£ I–£  ‚!ELQRAEi–$éRšŠ«ý0úìÇõ[׿¸x*6üG:þÒÿÁùÙ“Á„¦4éxö=4ѦƒÉ†æ^hÓ9c*,Î@• ¥Ì†T‹ú*CϪÁto˜ÄiA@ü¥è sDI†Á0ÅpwEñøòÍÛƒË_¿öÍò¥ç3À¿ Óo];Òi7_qµSs³4êÓ:žE†;Êð a—ærV®ÌWOzŸVi¶n ¨!õ6c•å®T „#þ(C`ˆŒ¡À`wŒ~üë0JÞ]ÙØþàÊkOÝ2ü:óηOz~ýüTË;z_×GÓ!Ó]t]t|\e[ y!«èÔ•Omp ƒDÕøròÕ3%X¼ AõŒÎº.h#LâÆ`Œpœ#Œsìî&Ň¿lí¼þþ‹ÇÖ SüØvú™ã‹ï¾yïTpx¾ë¡n1žC-Wý×,®L·õK[!¡`û&Þ¢à\Õ¥©ROºÐh(”¡Õ›‚c¿Jó0ºVeV¶c¬Ý‰ÁA=Î0SôúÑÇë›·Ï^zùñUÀ_ÐÓ¿z¸Ûn~Ôj{´}óÓ>šñÉx[ª&”2APÚ¢­,omª‚ƒ¤¾ ¸€rYšNYï3TßÊ×ÏŒ•gõ#Õï ¨„@øáƃQª@@fؾ¾·ôÓæ«Ÿœ[ì™ï¢Å³°÷&à–¥eyèûÿÿšötÆ»º†®žèºšI(Ño8ñ‰ Bˆš¨1˜ÜˆÆäª×“ˆÄxAo!BèHË*OüôžY~¦ççkY.6. 3¢¯O¸‰Rت<?=øêƒžyÝû~ê%ü/ ¿ø­o½ñ=·þ§k/ß÷Ágè.4UMa¾è’EÝÓAíEH<ç)|¥€{[Ãî^Ë÷´¡BÀÞ^Êœ`Ò8X Cáã}@D ^#OTô|¯¨@ÜSøØ>žuáî?=Äê°BÝXìê(dïy×ÏýÃW¿âe?óá7|öÿúÞáÿ2 ðÚ÷å7\sùþß½j;5ÁÑå^¾·‹ùnŽÊÑŠ(OKŒ.]ÎÄ’­2YjbŒž¹÷,KèA\ôÕãÊb®•b³lÐJMôÎ{Q, PHM˜Æ}v¢ßË( Kª*ÀG·P»€Qø·† €ÚÔNBÞáj¯ØßÅë'×ǰ. õ—šuž?ë®×þëϽâú¥÷>Õ²0o{ÛÛž2Á_þSÓ_9Öÿµg_ºû7ö·qÖ!K4vϸhwÆh ¿ÁÏ2{ïpábNopãƒg¡M‚ånÆßÕ4cWÈÃ÷+R\Ù„›j……ˆ!Åzä©áë¦XÁ´Öo§Zî ;ÊG€ŠYù0µx@AÖ~öž¡€‰"7`ZA0,,¶R„ Ð[$PÞ#OõBwaþ-¿÷ç~éÕ×xäJpíO~$}Ñ•‡ïÚ‹—^7§›Ÿ5:E†‹m(ÖúçP:±Æ<Ñü²4ZÙ Í«jG¯°2(m(ÄIœí—ØÓ+`øW¬Ñ/˜+˜˜ù0lÂô½9^, ßx³’$ÐF ̪*Að‚D,^̬¾¼æ¤.Þ×Áƒ'jea½$•ƒáG.þÆÿð÷ô¼í/µxÎÏÿ×ìù×\üG—ík¿d4¢?±ì\;Å·_¾L%èWÖ2¶’TY{;­DaO7Á\®±9ipd1Ãþ^†^*xÀñµägý~ùÓ¸ÿôB’-¢|Ä”øféfJ’H%Ù[+KàµAž§x|c ¿úU ÆC-qŸ[TÙûéï@ \ñ¥õ¼n´B¢€T©éëºÛÆà‰MïwT[øÍ-\rx×ûÿæÛ¿´ò§ÿøÅŸüKç¿øÔëßñ–þþ-÷ž„F$'5ŒÍ{ÛXhçô¾Zih­ ªÆ£W¤SŒ>Õš÷H—n&|éÔñp ²hB¬–‚LŒ:‡ì¡±ÓWr ³3ñ8Ö¯žz °>±(k‹ÅÜààRgú’­ÊáîÕ PQ¦ðqˆÖï©ÔT9æ ¨rŸV@;ö¶4ÃÑÙ‘%Áä®í&Ò¸†«l JØù´ùæ¦[yæçù»îÚ{€üü¹æoý®ßÿì-ÇøæZO%ÅØÝÉÓYÏ^ à‚b¦l(¨XKñ>¹×Í`[^’cE9—«pŽËZÅûjK^ 1€Ávl¯]´N¤Ó¸QZx¥áîj§àç·ptï<¹/¼ ÛÎŒ1tÑòié´~Q‚sD±·^ äŠG¨Ü£•a?#ElÂ0rJ¡bÍêÑÓýôê«ßpÅþÑU÷þö߯r;ÃB‘àÄÈI)ŽÎ¥ç?pѮۨpÃ]OàÙí™Í¦]Àöfàó€(øxÌÃø9ŠÈ_ð°N´òÔÈb!ŽÃ$ ®ô°–H£w Àv-|Ïwßwü=ïyÚU·¯ÔÿfkspáÊúÎyÌÌO¬:K½žÛV¥Å*îÕ¹râuZkësËz†håà½3ØÓcÄ{0ݬ÷ÓÐÑN"‡ vºäAe)¼Óƒ _zh…ñ8¾^vé.´ç:¸åDHX(© ‚Šea€›)álÿ–1@b4*6¦„°½Û,=ÖÇŽ-âùLÃy5ô0D'•ÅhÒ`0®1ZÛÄÅ.¾óÚŸýø‘§•ܳVi'á'n¿ÿ$¼cÜây£ér)ˆVnb œëhÉTѳlzª$n ¾Ì *agN¸av¼ÓLù¬1¢›wüÐú» Í2ôS­á¶'úÃàÆcëÓR´_6xÑ¡„4ƒKRAôøB,¹EE˜]£N*M›4Rê•ÖO;™5€Ó#Kej%•Óè—‹ÝNk”ް·(Á°F:Ø4W\yðƒ_ úiÆÖ}äî{WÃÁíV&6qÇRöÍs~gâFw¯ Œ†ÈeÊØå~šxãq¼úºƒ´jç¡éu"† À×aÜ‹"Ëßõ: 4JÍr™”I-›@¨OòäÐa1z…Æú°‚ žp÷ÆxL¬D,À!1ûw·žûâïy CÁ·\Žþ½÷¼ðkÌkš¼à9W¡È3†ðØ7Oõ3ã:ψðýž¾\湩kЛ”–_Ê/T.7TÙœ$„±PS°2¬QE¯DíÏR*aiª‘ßKÌʾ;× ¬Þÿ¥Çðƒ/>‚OÞwN#-Z,Qý”d"%Ÿ‹ež^@ówau3…ŽQD2'v[à“Æú®­ÂZå0ªZ‰(úd\#Л*ØÚÁkZ *ÝØÄ•Göüæ¡ùÃÏk7¾e  _ü‹ú£¿û¯ÿÂïBvÉXìu |ì««ˆÑ3 HÌF´C~¡€täå¹x,¾#ÄLAs((¯D œD*ZÊ×™ÿfÜx^©0íîë—Œò¨5€F4J³®ës*”+— Þù€Røàm'´FÒÊè" ˆ@À/à£"Óû{%±Ý F¡i{ÃJa«öhgÎ2†Lä0¬Ö ªÆÂÕ–oêœcõ¡!t³=í~çYϾô×¼ù[¦_ùð/üÊãÇÏ,ìZèRóëªaÓ&¥ ´ÖÓLˆ.ÂöÑÑEºI @-ÂVDÒDÈžÀªˆ!"`‰Ãt©â9$¬Ê> nQšw®Œ§É[paʨ¤ÇÛ¶Ÿlß¶ë¡Ñ\,hå2&v‰IX§Óõ»n¦x $Œ°¡ ––+c…{­Ç\Káp7A]h¬*XdÊsT­@À‘¥u“ÂÕ5;—Á9x8VUYª1Npéþ}?rÑä—ý­WŸxÊàÖc«&ëtÿñÃŇþó§pÑÁý¸îÙWLÆt1AhÍ Yb~ÐA€´$©ÛÅ DO¦58h_;AÔh¡uˆô-²sä|Ô“i¿Q ÊPfùA{]X€¥n6óÜ]5´¡„_q°…>< ìé›Iƒ¦¢ÉùX˜.d Ñõ-sn¸F‘ë0¨8ÛÀQ ª‰!.àœ¯š%¨š€þ°Bwk]=ûÚ£¿àuOyðžÏ<üwÿåo}$ÿø _F­ \{õeaø¢1£SŠPü¼S%PÐ"Bž‹´+Q ¿³VÑàëÝìËž•‹AJ¯ÊÉV3Ï<Ã¥ó9Ú‰†‡\ P2(c2}˜q?c©Í!ÌøÏÛ×…RûÚòúWíÂz‹è0Û vKŽï 1'Y/ªÐË´ —VFË-#¹„S5[¥GeB_èæèu 8hXh˜Dc0ª1ÜÞ†5.œË~èà~dÏSªú…ÿT=pvò³eåðßþ¼úåÏøwØÁÏ—ú~<ª)´Óël³J,Q4¹W4fVÏŸãR>¦ž@Åk"þé½çù#*‚—­ñr©›j´t@a¢ÅKšÎºøº÷Ý| ú\¤‘Çý`ÏßÓ–ûÕv~ÎÀ((x2†bÎ3 A0§rŠ¡ 11¶„~7+‡IíI=>hQoU 'ŒNô–‹g5ÇØÓD!Izœªñ¨ÜökŒÊéhS]}õá_~Jàð ®û¶}.}ÞUGá‡à=‰–;·GO¬à/n}­V†þÂoþç[qýWãW?x+Þöÿ܈ÏÜý„@¦Rc‹ …;NÓFa'Ò÷AM?ž‹ÿ(ÙE÷.Ÿˆ"PpGº .Ì v¥‘Ô! KªX7×(Š>Ëðþ;OO±/€lô6â…Ú:Ð-S°ÃЉB'WÈ3)}µÖ´øÒIˆqðXj+äZšAE*e2Ô’N&ç VF«ܵéáæYÜx|ˆAý8župyª)ˆ¹v5K¤$Æoç>mÙ+Ì·~ Q¤;Að OAëßU(,å »€‡Çžq1U¸£f†UäøîC‹p˜y¢Ù{ÍŽ/YjáØØa¥’D£@ õïÏ6éþ=¯Ñx!’x ä83vxÎrŠÍXY ßzG¯ÒË5\­ÑJFÀn¡QM ýxáXËdÙYÇò©_T¸p´™<û9¿À¯>é °ôºÿ¸ëMßóÌ—7M Ûxên4Øéþ#Ÿ½ãd?ùîÏy ·{hŠ 0š–’è€3uƒÕÒaA·<¾‰—\¶g E˜X,†‹ˆ^šîy^éè À×{5S¹O,wd?бyE×лœ{ô+Ï… ÞxIO’;wîÔaØÑ` ^¨^ß}a—Šò±Æh¥€qÐ:¶¬5ì¡rLz­ó¸c½Æm#J­É3dC(S>׸rO “ùý«+Ib¨å¶¶Øp\Q™$Oj úÚ³ÿ'¿†þÚ×EáIU€Ë®¾ôõÇzLŸzìqì^^À%†ñ÷?tϺò(³ù¿xd­}hM&Ͳ ƒÈZ šMk˜,ÃcýG2†Än ™ ¦ó€™@ËEÍÓñ"b™èÿõ‹AL3v‰î³ëm-r8+®\Ç^¾€<çUT)ÈÌZßw°…[×jÜ´aqÒ58n® ÿ ’WJ•BšXß0!¦â%¨¡ˆ÷+ ÍSèe ½ gVk4–8{*ƒ²ª•¢nFã ûýxïE/|î5n{R`ÏBë-ƒGkL|Š;xgV·pÇý'Ðéu¿¦ãÔÊ&žsÅ!w=”&µ·ÔÎ]d¬Ï$6'^!ñšÝ¹õÆãKÇÖñ’‹—£Åí uHí'B‘ÀÄöp„”\Ó³V³?g–Ÿç"ôüš7 *‡ãý‡æ²Ásözn*†Â ¿f)Ãm› 9Ø& I먰ˆ•Sy¦jçø¹/£l **ÂdR!‡ƒm‚óÌOJëB” „ˆIÐÔÆeC©j,šÁ/¸úÀ?ðú'- \|ã‡ö“Ñe•j] Jº¸ÿl =¿oyíËñKïþ8Þÿ©»)¹~YM#RzÅy:Oî­`dúµÂj­`uŠ‚ϰtq"lE Dk–ƒi¿/*Á¬|;wÉ—)Ð ­+òúfsƒÏ\J:Z™C¼&×g¥^,[ÃŽß{ Cü§ûVñØê„k•Î3«Z²‘ÌݯYЧ†¬ÖD×ǃRò„Ó›%NmU8±U“¬2±žùRš4¶†u•µ<×.2¸Œ&œõ  …~eç5¿—ªjXt®ôQ=J×`w/Á|¦HÉî´Êî¯^Ü›vÓL˜1…hã*BÉ"¬)ôªÏ„"(÷Ó`ã-6Z·Ð23Ö‘£ÐÏ]5ì‰a/Ü»†Ÿú®‹ÑK4~û®u$ Hà1—™©¥ÿƒ«ð·m ˆ…ÙR4’È‹"$*š^àìVM,„LÞc×|J–° žý€N+EYÖМPv±âÉ*rNaRÖèK F’^à§Îûpèß¹~Í…þ˜q“ÑŸý‹Û±Y:¸ö2T{-RcR(mèö,ä¸dw41(ƒb%ÏäKÓFúéWqŒ*@ {© kšÏ¦™¶”Ø9»Çkç®Þ¥Î™öøz„0ÌÐÆ™GÙÁ!hâyîf\μäÒeäZ!ÕÀ­›5òVŽ+çS\ØJð·<ëo}Ÿ¾wM‘*6¬8¨FÕ€¨´‰ŠÖ<–·db±5¬y~Rz]N±ØJùœuY3Ûo¦q– S*B¢AŠ=‡bóÝ^{áþå'~ýŸ½æZw^=À¿ü²7Ýwã­xäôV×ûp¦ƒ¶ ²6›,†±-À“™7ØÝÒ(rn[ál`9ší`A–F¥×5 (¶š9΄·œÜ¿ð ñútVL›L ³Œ–rpÚnƬZàq˜Q†v, ØèLÀ×AˉŽ#_çPÑ$tüèåó@ìóݳ^BuÛHUŽñ°Ä'ØD§ÛBÑÉEÉ­‡£æ)*¾öŠ-se¤çQÖ‹&2˜§@'Mhaï›Ï1¤hg êt¨‚”‡Ê+d™FªHê É›;9¬p`®`h¡X'çq1‡bfg @ÓPçRÏýTÔЈ³±Yä¢ÒT«×ZÉÔb8kͰôïn;E¶ÓÉ øÝ;ÏòbÞ*àt‚¦‚ò0i‚ÌÉ7¼‡­e 4KrámX¿Êö–º)†“ Tiÿú Ñ4 ½CžèØJ—YGç5¼kP{ÇêÃ657‡nn^|^“ÀüßÛzÕsö/¼BCžñßé΂l,ñø&¥Å+Žjqz…B'Q„F½Ï¬LÚ ½ÂZé±2vhçÒK.KKŽž¥5zØ  ¬(¨,±¤à¦ü¯dOÙOû ÓŒnÆ$qSÜÀòú¬ÜL©Gò7V&5z½6ÒT(ãEb˜ˆZ­QÕR΂«ˆˆp¬ ´êñö5çù¹ëF1S7ð0;‘Ý]™Cè$À®–F9ª&¹¢ €Ü×DFVp‰Fm‚ ì 4µ¥4EÜçU®»öâÃI½fœ‡#¥Æ Zb[ðsñ‹E뫃 tÛÊÞö´M §Öª€ 4 E0—ºúõ*F­‚Åî\c_7‹%`bL/ýlÌKGÃGéïg’@AÏ–‡S³¾ý¬ íB8—XJ%¸þØÖY¼§(RÃó¥•Ï=`‹çòD±¾§qÀcÜöõ ˜uRº)/9‡÷ô U 1ñ¾ùÂo,Tœ$²Î³ãj´âhÝ\7G~¿&R¼(€sNJAçQ»w{}ö·ì]ê\áOž¥{$* ÞËôÔú†#VµÕ$4Z¡tÃpJÑÒxl–—íÍqÍ9ÝýÄä©JT)‹+¤tË,bsGéÀã$T^Ñ5'Û×Ô ŠÃ$<×L¥<›ÂNB*ôѱ¥çtNáoÑ­—BmÂÐÎH<&N£ÒFÊÓ„(‰ðÉJ'¹ûþ:xj¡a‚âXô ÃP9–QTŽ<å÷+›Ù>›a½VŠ ËBÇ$­g¡àQi:¡J=÷Ú€þyQ€4I:µÍÑE3.¯xNZA÷£CJ˜÷¤U³uéµÃ©§Î$´Îµ¡#ýiWG¡•*Zÿ\®àĆÃñ³#¸+–¤Q€b(ÿn¥ëo!apÞ. ¨ñÛY$RI8ªm£QÐq!ºXÄ{%’E²‰³4::‘{}À™RZ²û ƒS•Ç©5‹V®°«¥`© b[¥Ãæ˜ß‹Ná l`Žâ¨TˆVhçàL@¡ yy’ÈúFŽ—ÊV5žFP—*ë i| :Õ²V’Kĺ¶°e¥.=ºï(¡ó¡Y‚CçèÞèBÝÄIœ‡†$ª¨í:spN SŽš€ÅB!Í4ÒÜÈš{•Ã%‹)ÎÖZ#²dÀ)™gèÒª¼ O¢é„é6én)ôÔH‚{7TÌ8(dO?BQÌ'¹nÅà%¿=¾pfŒÃÝ Öhœ.=îßtV®~wÜwº¡°ª‰G]s…æçïOÎ,ÊÚ#×=¦ ¢õ´vσ\ 1èZ²'Ic0c†R‡Æ 9¶×ÊP(ÀUšDa4´J/pq•)4u¦®±g>¿ä¼)€saä-Vœ*AÞ$Ûש}>$Ðp´zNGóMä©XÚ©ÍM°Ø·”±¾g¥FQ ÉÖµ“’ﶇ¸v1ÅEKñ6Lü# ž`HlÝM‘·Y²gg|½sécŠâþ™_pãõ†ï.àʃOÏ1v³ûÌ^ûô£&xK¹aÃçôØaPJ–>˜8–´¬&¬tïTpâʽ§çJbÜÃ+ˆ@å6 )<ò\Cù›„yCGUYŽ‹­B]9¤Fhk,;‡”‰‹†šsð¼%aÉ;&^ÌòC°ÐŒy`âÑÔŽ‰³ ´SHƒFí-Ò\Á$ƒ¶Œ†÷ž‰Ž…A7Uhsq¤ÈÚ±ž˜A+(,w ºIŠÏ°îÖ(öhÝ"$ú)_Ñüg£1dì—Íì$ Bp3e|âÄÖ}‚±óØß5¸dwŠ3Cµ~Ã&Na4VF–àMY[# C@°³Î¤gë7Àxu¡!ÒÛ½„.c ÙƒG¡…!”ç &£m{‚CeÕ X†;g‘% Ê%C˳ݼç¼)€ ¾Cì¹nXnxk)|1/O ´°„ÊRã˜ñ† œ¸´H¨õ™ñèt28e˜<µði¾>83×’§}<¾eQM4Þ÷ ^{ÕøXG ã\J¿t'Æ=€÷LãùHÛž¦Ìd%çE:ÀEåùÝ{7P+ƒ^GH,“IÀC« vu5»u£*P`5-м9²</aPÃC+\ TkÁ2å‘ –—*A18Qä¼dò!H’9rðƒFà6›B¬ù«²¡»o´B»H¡B:ÃÈ´Z8o  ½ËĶ4] µLØ‘ŒñIšPèJ(©Û õ6Nð™æM’+tƒ`™ÝzžM0”æ¤ñ–àô­68¶Qá–3<{o•‹ÖÐHðX2xVŒ“µšÕþž,¦áBPÁ©{€á¹Àœ 8à·ï^AZäÐiÂþEmW%Õ3å¬àÄŠ•èêJ´0MÑÀà ‘ƒŸ)/„¤£‡J"œ¬ƒ\²Ìpoå{𖤀uŽu}h,='a,ö¼w°’ð1<°üLï2¹70oËÏŸ $EžˆÛ‚”%ð2]«j¹°‚ùkÐI Ú©bÍ?œ8,¹ûûA!ÓPFñË1èÍì}eâÑxaèx𧿢O¿wûê)üÌ+.”"Ú¦¤Þ7º”™´Bc¼SÌ# †K¼&5¹$´¸>6ÀXgh™”ÈàÆ–ÃÆÄ³+'øÇUó6á‚  †M'ÓKð¾ÛÎâ ×îÅî^Á_»xsy / ËO‹€JBBÌðEË¿xrˆ=íGæs|â±>(NÿðKøžÃ]¼ý†Lâ\ipá¢AI/àÐɤ”žn^iV!T þÐ!Ov/&,™´902¥è±RË⦡GÈSÀY©bò‚&ÌÏ<Ÿ'¨&ÂÊâ²xI0p¯ê¼ã’:u+Åx0F Àg<8AaÏ_¨µM U$Ffý}éÄ Í‘CR(.Ô¬”#h1)-¿¼£Gr¢e®ñÐ…ç¢ã‰C`‰f‘S‰<'^:-ÃH°áÑbßAQ×c0“4yvhq×Ê/¸@X½.¿։ðKZý A¼yeŒGÆ7oNPr<¼•gÂKl+ÕœÔyñRŠÏ¬{¬ <æÚÂæmjÏÒï@W¡«ÅE×$­G/LqrÍ2‘½ro‚Apr½ÆÞù„ Ÿºt˜ï%È´‡­%8Âx"lã<=I;×Xh§h¥§‚ŸØÆ@ªFòG…£kŸT &ƒp’gyç§ùƒÑ&†>@óÕyS€,5/—y©j ßTŒ­ibX·:F@C/Aˆ7φƒsó9Ë“ÑXÃ+ @ˆŽZ£U&h· ze­%#ÐEØØ±¡¢¡Ú>{b„¿ÿœ½øäCܵ2Æ5{ÛQØ1ž“€¤Z¸„ï½ÏØÕƕ˶û† ”ü? xü™S®^lá‚BC»-¥8K¸5tô Ý\á̸õdÃîœV³¿º…ÂB¡°Ü684ºþ\™Ò°y‚…Na}äáàM¢P• ­” av2ÀÇ9·uxYm 5€+ˆÙ²ÁpP¡?£•$ˆ4e%nŠáøܳ©µrþ 1Ú(&ù¶`ªÞÖÐHlÃ.Y¡()¦·Fy,ö4y€«ëz½ É'@’d Ö†iž:Þ³+£à[ô" I*t©ÒɼürK£M´0¡Ëv!àH/Ã'íÓrÏ@ÅÞ™çi›Œ¼&ÙiF ñCÇiŸQÔ%ð«7¯ÈDs;‡I¤¼gNãØªÃÉÕ¶¨W'/-¬ö-êÒÓÝ?äžµ?ÅwÎðå“5W¹dwÂל^¯Ñ-4™Pk[5ŠT£(rdÝÓ²²X_¯(üna`bókÒ4qjÏMǹÅj2l#¥y–1,3TÄõ¡pò¼)€…>%ñ¬APRHFk¹ëÚD{&<&S¨ƒ§‹ *l• •3,¼š M攑NaPM&‰F»Ð¨ ‡Nª±;WXÌ iSU±©BgøðC[xÕÅó¸zŸ}bŒ×÷² Ìš9Þ1±bÞq¦ñx¸ô¨=¸y¦ÈàR¦pñbëðÌ… _Ý´¸mÕÒ¢†•GËè®Æzß‘t…Â|K8‹ó Ö–yHA1_z ÅÝ…ÔùB¡îh¸˜TgΔ¬á{±ü3eƒV!ÕÐBKÖ-:)XçÛ÷;ØÚoIµ„Œ2MÐx™‚s¢$RVÒ{hcŽŸ7èÉqyf"`kK%ðSàÁó¼ )4‰bˆ–ÂØ‚¯±>Á$Ö–jC.Œ¢UµbL«¼C+^[Jä:ŽnÇvs?(8cðàÆ/ÜÝâ:Ãxp?péÑ@ÒKb,|lÐp0$¤ŸÅ‰Ÿ€ýÍjcuä‘§Š«¯”«c‹«s¼øÒ‚ðï­PtĽµrØú{œ´W^2aôNš8[ã:àhGãHÏà¡UKÌã…û ”ÎáÆÇƘŒ,Æý ®JQCp•…yƒ^Ë`¤4ÂV–ÿ_ø ‚%®` ðÊs}cÎ3z,Mƒ$ÙÞ’Ð륟Ïà¾4IÐé´ÈÛŸLL˜ ‡éØ’IIpŽXšIØË3:®ÊklN€åå“:ˆêipz¸ÛK)8oxTbm”zœ­¤Û¶·mXvÅE9ε^O°ÑÈ*ï»{ ?øŒ%ºÄ&®â¹« ?*áS=}ðÓžŽÂ_Û-¶w>PádP΢)ݨpl>ß½ŒµIƒ^âð·/î0a[L€Ï8‹…¶A]{ Æ'×Ôµ£%oö-=F‚‡¬‡ ~JWÛj˜Ý³äÛ³;EÙV('›Çäx¾'Ëâû÷I"DOå,ê•~ItÐ(‡Ic™ß™ÌÎç™AÑJQä)q³<ÝÞ¾9s漑B­>þðñí÷Çjks„Ѹdç@Œ„z­!q4ÑqaÁyÓ4AQ$X˜O™ð)-@P§¥)lc4ã¾÷B…’†ÍFíÙ‚Ý(Á‰›‘E.Q(9ô´ÆR!PèE½lŠüÕ‘æ}åBŠß3fyfàñº‹ ^ÿôÉ1VÆ`ö¬‘·RÞ[`XÜ¿6Á£ë5+€ù–FEåv4Á: † Ú…ÁrKá•W´™ÔX!s‡ó…“Æ¡v¯·ŽG\¯øá“¬®4 ™¶´ìŸôÚšå£sŽÕF Œ0;ù\`cmŒTi'GO&þ…âss-ÌÏw°°¼XÿÄ+žñ‹çÍÜ×{´h·\šš$ö繑öÔ4²MR—!X ×èèæ5´‰aÃÉhSYL|tÉ>E¢ZËdb¡R@; góÞÁ×ÃÆ1„t[ ’”p(ãúfºmCÑÈ †¿ùÈIüï×íå<= ±üü º ë¸*yÕàöÇÈæº¬ÃQdø -p`9'„Èz¾ùÌ‹¹&Ÿá‚[*¥ îÎAig-¯ë`øaʱ|€`R8hÔJCg M !›N$íN‚‰É$µÓ° ì¯Ïw v/$XxÖÜÊyªˆØ­mm[¦Æ¿zßè6&XÜâGþÖ¥è¥ Øšà‚nƆ8‘üÝW,âP7Ájéñ_Wä,.e×Ì\°mõ^r™Ê{œZܱ!¸ÊÑ z…n¢qçÃ~ïÓccÝÁëi[PÃÉÄ‘4«ƒ“§’±†÷V8ÿk«Œê€< lÕè“1È*Ç5&£ ËÐCvr…“5ª²ÂpkÛT¤‰wŠKó9=€1i–ð3c`ƒ¹ý¼†äÎyžì#ù ²Z‚³hw2´– bÔ5¸!"§~j°‡E0 £¡CÖÊ8þ4,’Ü!èI+N 1ø6—pwBX¥‘µ-iÑŽ&GœyÖá[ckÃQ€)Üòµ±åü‡?†Þ|‚rèPj<÷Ûvã;ŽÎc_;‹}‡€ùTÅøªñüÅe[­8;¬±»“2ÎîéZZã3Lbàšùe|æ±—-ÖŽÜ[yŒLÀhÐÍ@¦tc†CËØžIìªqÃÿ×Ò\BPÁc¾£QëÿS§GXUMU!ÕV¾ooQOjŒ#ŒûãQùn$—²‹ ó©ó®ËËsŸ9›eß•¦Fâ=@×¾±¶­—Y¤7{$D¯1yoùeåqöt‰Ýûæà…þ¦CÑñH `4q ¿%óXp Eì“—B0‚µ/¶·c½"yô¡Ó ²L¡&R(ehα>CŽ|Ö ñz‹JIOÁî{hŒ'N18[a×Á^õ¼}týG …¬•б´¡ßaã‘Æµ ”Š«–B n-Åxù‘.—zûð­–ÛJ`±ÔÍÉ`Ú8~þÔ(ŽÓú †NÄ…®†m¥<ú å-ÆÊÃW ƒa¿ÆæÆíÌ£7·m$9ºI@ÙÖè·46Ö†Ä`œMh 'É3!IÒηl?¸àݬ~%KµJS’4…µ «gVÑîõÐîv H8×À8ÍÇlg1y 8¬¢tÎT%iZäª$#h²¾®Ð©=t¦™ å™aiÙI)*‹I4rc`çlᤠì9Pr9T:ï4”Lã°ÖÖ.ƒ)£2Üvã&ªÉ |ß‹`_¡±*–”dqKÛ»0TxÉu<÷RRzH#ßwí>÷`»z82—ðI%·?<Àæ–ÇÈ:ŒG Á¬¼äCÑ©µ ŠèÀ`³ÁÚÖ¶Àn–rEÐÅmï “BÉø5di`((ZKÀ<Õȳ­NÑ”ãòÁó>¶bÓµ‡>ñ3ía2WÌ":2‚áHŸ‚"óguu¹ù²r˜Œ-eem"páy¨#$*h`·—`~Þ0öç©â(uÙðË'³«g%à9²r ¢uF‚‡Æ´å›i¡£µ‹„Hd߬›à‹_<…պƥöøž©f>—|ž_$fNÇÖ­“©Ê^/­¬páBŠ…Løyó©ÆáÝúUƒÇv-/\}Q› ÐpdQs½'Ðî°¢»¯·s€²¤«ïJ:–MÃp[ŽK.QNj <‰Þ¸Ûα°ÔÃî= hïÞu÷[_uù;λxé~S]¿´ë«­Ö™oÏó”Ø|“g¬ƒã³à‹PD&+;YNyL–ð±u“P:ƒbK8Ô - f¶ž®k‰‘½\Z¼*æDÛ”Xt;….Œ!™´vÂXV ˆ#Þ"H9wƃgÃia9Ášë"s9Ξ*á‚@ÃýðaÆ5HTT@Hž;çeÄž¢²n_@ñºtæžwQÇî£IÕ¶à Ïåy8Q;©áªZž0–´RɰfÕ`ÚFòªÐàø‰ $¤)ôºêQƒ¼[0ûo·r>Z/3柴'‡>°a‹•§¾g<®TYVpŽýkOv~:žE<:1üR Äæç2Zàdb)˜HÝåÆ)q\ÆV!Xtº)¿”ªA´j?ë´;¤ÑùØ®æ>ìèzé¤MùŒðlæð}GcÏuzçz Wîˆ ] €"ªÆþéú¿ã8ôa)xî…œÀ}eƒ,ónãC²¨˜ 66j”¥ÇdTcm£ÂÙS#iæØ†Âw–-*¸²Æ¨?fž`à1™” ?qbÃ!œ>BUÕœ¢êõ ÌÍw°¼«‡=û–üÒžo~îáÎÆ“²>ÀU—íýØ·tÿ]{­ŸdY +ÏV.©IÖ;Œ#óRƒ”ž¡Áp‹'°„)+Å{’,C’Á u,o ÏÆP™‚Ò‚‹k©dÖU¥Ù1ÔAš=UM´Þƒ %Êàu´ZÌøxÖzx¨pã‘ôð÷,h|ç=L*+\†HÙJ4Á&ÖêˆäÎ2zê§ö‰Dº>*‡‡rB Y9½…ö\†k¯ÝG×®^w¨ _[ÜtÓ þ?:]ÍG×dÚ£ 3{xgk¬¯V€kàë =WuÝiªe ×6l·ÅýoLÂÛÿËÏ_þä®vÉe¼ãì±cïjw •o¥‰žT–0ä(.Ø ý{ÖÝù.ŠvV'ƒ1“±‚Î[×\3 gÐÆÒ š3FP^2z g $U ”~&eàt2QÇJfÓ= âÃ(Há‘8%M=\µ¿ƒùÌl€Ê4ïc|#o ³ÇÂ#È1¢Û÷ŽJ!÷ûˆÿû Êæ<.<´Œ , IÖ9øÚóMƒk¯ÞßD«?Ôƒ«-××¶pÏ­ÇØyu®¡„Ð@GlS½³T„ßéˆðç;nË›÷<éë=´ëCw-Îýûµ­|ÛõŒG ʺ¤Æwº „ÁSW%ªIÅ­ =aÉ–&`]_Ö<Á;4e€J]½NS˜Èæ·ae&“‰6gª {—2X¯ÙŠÃ¨0Š`-]1˜=M„=Š8\hROýIN’söÞ…ÀÍÛs×!V€•ìRt˜=8š×œ—)_¹–Ââ¬Þùèê‰ È¾±Lš}Óˆ4²µ[)®}îE<·µ¾‰Gîy”JHá+vÿhùyÁÄ Ðëµ`uñà¯þе«O®°È׿xðÀG×ϬýÀ`®Ë)Þš =}Ä {´tŠ$#bÍç`hö°ùd‘Æ‹ µfð%Á4ÍpóW·6G/èÎU,ëRêùÒʇJó”Þ¤àP‰“Y€Ü0L­YêTáp§DàI\€Ùxzí,áãIuX¾™LÃU9ƒI=ÆCñÄKÈÉ œñp™B^xz­¦³ä̸´$…âœQG"ÏÄóT Éx§PD!÷\œb‚k­å>r%èî]Mê<ÏÓ4Ôx츗P±vâN{Êô¦ßISC£™ ¾¹…6ÎlÖ?÷‘_x©Ê€^àê qóô™O&• '„$‡Ã c]’&´¨á°DnÉ['k^"“P [Éø%\z Ž– ­Ë@êÉŒ£ N#X{陡K^˜SpM`¿>©,\®ƒ`BaåZÂM¤±=xïY\û¬ýQþâÄнœ J†’ì¼ç"EQò„.'{ëv ]&{ÂŘ'§håQðµåý.ÞóÀŸ²{ÚƒÒ)Œ¦›’?ÚÛq®ù…z ½ê«wŽç)bH¦Ì ûŽìp4ª. ÉReï{<œÀÉ’vY®°2È2%`‡‹òˆÓÃ&NåLd‹÷éDˆ˜ðb¹Òô4uŸÔÉ¥R¤Ì5Úêg<ù¶lf`­f]¡Ky¤»·ÝrW]sáœB01cx ÀEør-NGñØ{ÇcGwà(|KÑ9Z´ä–ÖÎ ß×V®QD1«gqæØ#0ù?3¤ a‰JëgÖߢðç:XXìáøZõKÿõ_|gƒ_O­¼âÊ]þ†‡7~õäê‡úý¡žŒK)tº-”“ãfµfýBpD b(ºuC@>0®R8Þi Qt!HÏ€è¢Æ¸F%à”æ{¤©Æyá˜w$™f§­7,Å=+À(o ­á=*–>ô7'lk‡8CY6LV¦y…ȃŒËãˆuñô¢Ðèây>Ð4<滛:’?ä5^<™Çlôæp6“T†DÛ~AË_\ì¡5×.½eåß~ËeK÷§{îûê`kðü¦±(Ë &Ià1@U*’Aä>84•Üuƒ  -G3]É+ÙàÓé58CѤWߨ½’Y¹DF¨}ì9@Öù•yÄ, Ë:CZÁ Ä”‘{M¾ÇñÏâ’+öGaÏž6åtˆqŸÀÏ;÷c$„iÒæ)l?+÷¸5rÞFK—c¾Ceàë”Îàœ¬  OIüR#`]ÿ¶åÏai÷|¸óþ3?ûñ_ûÞñ·L^qÕ²ÿèÝgß´µ²zkã¼æ‹_G:Ñú%Orðž`­ZpY(*h6˜„fYAËR¾ʤ@"ŠS;…ÉÄ“,ê``¶£¸©€4É0TœüË,$díd¸U#!C ACíXWøôg±gÏâ4‰+˜Àtê—I 1gèbh,Ï1¶×Ñý×–×½µÜè)¸9c¥À{ªI‰$oCkðñvÎjr :ힸýÅå9,ïžÇ°t§-/¼û[þàÈW^µçŽ?øò±?˜Lê¿ÝÔƒÁ£­j¡ƒÉ¤žv趯iº\N@Bœ‚æ± ‘`šá"X Iîa²„¹B]TcOÆ Is6Qªà¡5-’¯¡ç ŠÕ-‹ê<ÆÔÙúÃJË?gÑmµh}R+DM˜5{$7౟–~e …c¼w³òÏ;Yž9€X¸áóžiìp÷‰ûîNÙV&Ïg¬ùiñssm,íZÀž}»°¸¼àîyàä÷½÷Ÿõ´xtìó/Ù÷ÏžÞøß&£ry!>Cpc£ÏkuãçgÝÑr´4˜,*¶{M\Ë7Zš’Ǩ5Ö¢ð™Â®@¦0*ÕHŸgîJïQ'*Ž…©XÏ3G` UF,>XYÈÒq%‘D„›Ü}Ó£8pÑ"–vÍÓ,Ÿž)D„û¨ÎI> Â¥°…/ùÎ,4X„éu _öQaF›k,¥M–Ñê˜õy‚î\ga%Ûwy÷»xôñµMø_~Ú<;ø²]ÅÚõöÿÞæúÖŸ ûC3Ø"4 êÉ„#O ¤A¤4A‘†t¨ÙòîAb·ÄKÁé&á#ÊÈÕÁ T\^=7Æe ›eX[ļ7Õ“°üdrîm ÛØE<ÀhÄú_Á%¹w§ótç ì=°^ð_ îC˜@ÁÍ@Q·ÃÊ}Døf.^ö>Z~¼Ïyœ9ö0tÒ…1 Ÿf›[íN‹8·[`×¾%,ïZ@i}ÿ¥ÏXü±wxÚ(óKç>ú;Ÿô7‡[ýŸ†f2ÌP— \]¡¬k8šZŠ4Ï‚íW3ªžOûâÞÅû”b¨ òxœ Œâ“Ié15ÏóaÍ„M Ò#`S)æLî$ÓÔBb¼÷ì/¸´ÀÈ6Øxl ƒÕ]¾º–/¦“9!¸i9‘>Q.ǽXø4æÓóMóÏ{=Ï¿û&¨¤ dü<iª 3ó/ìÙ·Œå]ó˜[èúÛïzâÕÿêM¯yO3àöıGÞzðÒ‹^V•ås­õÊyAÔÂ`,Åh¸&m/b$¾6}Jà'‰\£hþ0²2—6†lbº}O/!ŒäÄ ;V$´ØøNó/úFCyøÇYæÙF°z(ƒ:(Xã±²²…ýG**YT*+šèüÎcK·…+ûÅ:9ò{Øîõü€]“Ç¡a%*p¿Ûɶã>¿½û–Â#m¾ãý¿òšÏÀÓMèËßö†—Ûw}úÞ¿yàÈ¡{lc¬màcÜG(Q1KÖÐIÊÌ>E®°KXײ&@¦¡cW×Ó&PLù#èÅÄc?uï1$PéÜ%<}ìa¨$G0-˜`”=Æo«•¢ÛkèÙN¦÷^°›î}«\»óØä%ïøéËjxºyõßÿÈKŽ~ò?|úÁ·8gßéœÍB,ýtŒÐ¡¬*±ÊˆõÇö …¢#3̸,. ×̾_Q6wlÐh"•+Íã !$På -Ö ªG­öT ôY±™@†:è 6ɲ¬`©‰C™¸¾ÄÿÙ‚ z¼à‘´ƒWO=$-Pø€Ÿ>N6§ågèö ,,´·g0°{ïq‰QiGú¹ÇžùȇÞÒÿ^7<Í<ÀL þÁw\úûïüÔý{ó¿BHaã4(T. GiÃW1~kŠò˜Öªʱ´œ³"ƒQ2'`ÇÂNrbˆÔ9yú§ÔýÆ34˜H5Ö"q•Õ\díT] @ˆÔåí” @ã'¨(P QÐ;A¡¸ÇT)ä¼ej‘Ó N¼–s’ÐòIêXXè`i×(ACíaµ‡j Y©”ŠVd²7V€(ù9÷¡SRÞ‹à+ âÜÔh*ÖårOŒí5‰p¦M!‰"ž[SŽ1î÷¡t­øÜÒÜÚÛn{–ÿkÛâRÂß½w:ͪ?øÐ—^öðÇþÙÿ§å?ÝC€Š¶Î¿ðƒå­ÿÇÿýgk/¾ðçÓ4I³|“JPV“Ò’FV– I$&.‹âH%oè©¿J Gºx˜†‚`´¸aåQ[Þ/–ç¥ï˜ê õ߯"àû<…bkV厽:Û¿3YDoøi> Ï3ŒÄѦÆpsPi¼ßQ ¤RÑäñÏÍuÄòw/²ÌÛ»ýrø±?ùóï|øÏþÏ{ÎôLÎwHž «ÿFÊ0õñ ¯yÑÛáw>qæÐ%ÿMVäiÑéc4ªùüÑ`k‡Ðˆëy×%’…J’h­žH,Ð# /Ö¹—ËÅ"Î(øD–_Œ?°ÄyˆV½‚HžÈ›B>wÉñ(ìèöÏϸ¿Ž¬ÕŒ"¡¨e\,ÂoÛ_Ú=]»·…î¸ûñ•/|úÓ/?þ¥ß}|f<ç ø©©ο"ìü ú_½ùü?ù¯|þ‹Ÿÿ‡^wass¨²µ-ÎVPè‚çUÃ*Á2ëjU€šBÄðQ`gI2tÍL›÷)acßÀ+JsÈz=˜¢§‘؆ÈÞ©Ñ_a~y *ºz‘ S%˜ô7سÏÛ=ÔÕõx„4oCé„a*5‚Ïó”1Ž.‹‹ÒÖ_èú~ü+_]}äÆ7ÿÒW§Â=WÀê©ÍÎ?6°ów|ðßþÌÝ÷~ù¯¾ì5ÿàç~ïkYï³Ù£s5‚mÓõ§©Áh0†"ˆR£áðEC!Ïž-JæˆaÂ’l=…\c9Ù nèÈSˆÂ„1ˆIœ‹”·´ZYÈyÊœ)<Œ`VH³Ãõ³¨ÆNA¥iv·,ËàššíÜN+#SJx|],ï^dÒ7)«æþø“ï:sÛýÆÉc÷M¾Îhž\áÏà)TÙ‚ÃÝ7Þ08ñÐoø¡Ÿúõ¿ÑŇ,ÏS¹ju lm 9 «•…Ñ)ªZøMÃvqôü^ⵇ2ðS:7Zà”«ÛÃ.ØéC§], ¡Ñ<‰í©öèôæà¨€¿˜¦Žt@2ÏÎ<¦èÎ!G¡s‹S;I;5þ¶Ëï’Á»´<‡¥]‹þ–¯Þ·yÓ—>ÿæG¾ôÞ¯°ßÐc~“Ÿó¡$ žÚ ?þ`kõTóÎúúwÿÝÿç7¼öÛåÈ%½ Ïœ<«¹…ú™Â0QH«u©™(6hØg×" ØHÊP"Íh°@„›=ä¼Wp^ÅŒ]‰n3KBœ!@lðÓ@ngž ÷²‹(|½jP£ÕCš¥È¶·T!Ï5³ü¹¹™<ós,îš ÃÁ¸y÷»þèO×øó_ßxâžÍ© ¿¹ð)ä§‹Pÿƒ×f[˜¥Õ¿÷ïéŽÝ{/ø¡}ÿO¼òù/¾îÍÍwŠÓídÒà5ªT!©µ¬˜Ùˆ"8§X²òõ" "Ž =÷lÓp/ÀQ*˜x/üDg#¶_t¤8Œ‘…„6*‹Ž*3ö7ÃUÌ-v‘e9Î÷köð{´øÞ6¦OFOÞJí ×ñôMŸûø?™yÙu/ÃáKŽ\Òêäj}-U£áÀƒx(ea8Å# ž ð*îô4N{'”nݽR¹˜GÈ’&)HÆ(Z‘ÎNËj ÖÏ!ÓYÒ%1ÕhYžµheÖì͉Åw:­pÇÍ·77ßtëŸ5kw~lëÌ£g"J þ‡â<žÜðÔoa¶ÍPnžxh2X?o‘0ˆ8ekNøs àEøïzxº)@Ø™¬|“ÍŸ»ÁÉÏ…`šê–¯|ñ$nú‹¾ÉZ÷í;rÅ݇®8Òš_Znµçt9©°½Éhzt×:@ÁQ´I(`Ùô¬ ˜(2{×F:ˆÞY’O‚ȉ›“¦€òê^ÁæV8¾²j×Ξ<í«þi_Öàê ¸zÞŽ\…à+4@°üÎÏüM¾—s„ûtÆÂ7e_oõ€ž |¶·ÜËÖ¨TRŸ xåª!žxà–ú‰‡î\1EoîÀáKö„tn1ë-Íívšf™ 3”–^ÊñXêaGoÌëb—ìp°ÕÙITš8ö Ïqöa+Œ‡#ô77&Õd0„«†vÒï[öáª-¸zÞnÁ»>‚¡Úñ9lèÄ:§‚Ê$i’¤YBðÞÖ÷ÎÉÓ·=ÁY×Ô.R|®w¼-á› \3†oFðv‚àF¬ëEØnr<æñ7P‚ÿ·y3Úu†Áp ÓÞÿIwsÖ©G2«ßdƒ¬ÝlT²üÇ'Bi?'1㶺“ ä,þó üÃlq_P¼·™Ãɪ°Úùý°¥Oäß^ç¢m)­MG‘×2þ˲νÒ{衟¯]q»5(µîRꫯóì%•Ÿ¶¡‡wøë!×|$‚¶gQ=@êÊø t‡N²ã»ìf “á°Þ ¸^ÚIúa…‰™oàÝLϦ§nV'L#Þ¶ÙJûÝàý«ð¢ÀÞQ™T +¶ÃïÝ úŸûùêÆ¹:½™Þ|™ÆÉQ¾1 ßò6¸±g?û¸ßN®¹ØÍlvгjq±øLÝ SQ­Cëè7‘lR’K‹ÕX¨Ò‰À˜ >ÉÑNf¼ºk‡U|¹Åy€ ¾oûÌvñéc´WƒýüvuZ>× ]OŸ1Ä0¶Âë?*ú `Wìí@6ÝM[ó íóä¼ým m »U@1ƒƒV÷,@Hƒ l@cBƒJŒ1׋"VÃŒd&Þïå<“çùƒ UU¹e  ÉI–æ¶‚pk03`’¶‡Ïàºv ðÑÍôD t§ñg•?è€¿ã ø¤4m1uà%€cÿ®I?qà‰Eøz¥ñ‰°®µ_b<^XôÞDäÆwùj Lu{0qúíç`ãub›:¯[’‡2o¯cßOÚ|2ûo•Œ‘,ÍN³ª‡à€¾8¬DQÿ‹CzåÑ¢÷ùߣΠ‹È€Á1S¨"IK½×XO,É“$œ·þ?¿j6þiYÃúIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ResumeNoWaitOff.png0000644000000000000000000000013012442116641022077 xustar0029 mtime=1418239393.13974027 29 atime=1418239393.13974027 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/ResumeNoWaitOff.png0000644000175000017500000000055212442116641023530 0ustar00mikedldmikedld00000000000000‰PNG  IHDRH-Ñ1IDATxÚ’=KÄ@† Aÿ€M°²³†…(ZXˆ½Øˆ‚ ÈV"*Øh-"xŠß­‹h#v ‚qsÉ&¹ìëîr£s 8ð;™‡Y6o-\©q‹°HKÖF¶{ŸåÒ„%²€PØ9ò3$2ÉXÀi½Þ!®óž!™®÷³iµ ñÑ2¹“5á*½ÝB¸ÖÍ7N$¹ùS*9›ã›…%5ôÕ"|ƒü±£?€VŠät–B:1£F¾xO_.øsþ|ho˜ DVa /ªAøžè­H\”ßß¼O—E¢Ý¡òUùã$'3Î󯩯—ŽBŸÏ£x»‡Úࢨü}³ 9¨LªÐ<ù„ cÔf?âÆ”eŸë}•ü9N5rÿù6mí|Þ·•IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/PriorityControlNormal@2x.png0000644000000000000000000000012712442116641023775 xustar0029 mtime=1418239393.14674039 29 atime=1418239393.14674039 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/PriorityControlNormal@2x.png0000644000175000017500000000017112442116641025415 0ustar00mikedldmikedld00000000000000‰PNG  IHDR ¹ðÜ@IDAT(‘cøÿÿ?)˜$Å£ @ˆ÷ñ(ÞéY1²&¬°(†alðh Š“Hóô Œ¸!¬Ë?\_Ûró IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/Transmission.icns0000644000000000000000000000013212442116641021725 xustar0030 mtime=1418239393.157740578 30 atime=1418239393.156740561 30 ctime=1457295922.645852897 transmission-2.92/macosx/Images/Transmission.icns0000644000175000017500000074442212442116641023367 0ustar00mikedldmikedld00000000000000icnsÉis32 ýýþþÿëÙÕ‚‹òÿýÿñßç _†°Í¾Üÿüýýúÿ@‘¶îìƒåÿüýýÿù¢Á¥©Ô‹]I_òÿþþÿ画ƒtfhNZ\_ùþûüþþmI‹TSTD´™[ÇÿN}ýÿ@K¢‚{zzÉÍpcû)`þüenšý¯n·°Ë°Uœ‘{ýÿM[Ëÿ­{Š‹ÈÌ‘W¾þ^þkI‡ÒãÇ¿ÉwXŒÿóŸkW³ÃÀ¤p4ÏíµYŠÿò·µ@ŠÇÀ±uxÿË–O„þýþóUa¹ÌäþâωEU®ýýûÿ–F“ÕÁžg]½î½ýýüÿÞIk|oGGœ÷ÿùõ€ý ûÿ…P^K™÷ÿüûþþ ýýþþÿêÜÊ ìÿü€ýÿêÕážb€¼ÿûýýúÿ}¶ür Ùÿü€ýÿH„àm%]óÿþþÿø{8nPc_^úþûüþÿlX4QUC²˜[ÆÿN}ýÿ?Q¨†|zzÉÍpcû)`þüem™ü¯n·±Ë°U›‘{ýÿMZËÿ­{Š‹ÈÌ‘W½þþkI‡ÒãÇ¿ÉwXŒÿóŸkW³ÃÀ¤p4ÏíµYŠÿ>ò·µ@ŠÇÀ±uxÿË–OƒþýþóUa¹ÌäþâψEU®ýýûÿ–F“ÕÁžg]½î½ýýüÿÞIk|oFFœ÷ÿùõ€ý ûÿ…O^K™÷ÿüûþþ ýýþþÿêÜÊ ìÿü€ýÿêÕážb€¼ÿûýýúÿ}¶ür Ùÿü€ýÿH…àm%]óÿþþÿø{8nPc_^úþûüþÿlX4PUC²˜[ÆÿN}ýÿ?Q¨†|zzÉÎpcû)`þüem™ü¯n·±Ë°U›‘{ýÿMZËÿ­{Š‹ÈÌ‘W½žþþkI‡ÒäÇ¿ÉwXŒÿóŸkW³ÃÀ¤p4ÏíµYŠÿ>ò·µ@ŠÇÀ±uxÿË–OƒþýþóUa¹ÌäþâωEU®ýýûÿ–F’ÕÁžg]½î½ýýüÿÞIk|oFFœ÷ÿùõ€ý ûÿ…O^K™÷ÿüûþþs8mkBryUÃñþýÿ<®þþþüÿÃ<íÿýüÿô³Sîÿÿíñÿóëÿwu…šêÿýýþø1mÚÿýýýýûÿÃ^ÿüýýþýýþúÿv:ýüýýýýýýýÿô,¼ÿûýýýýýýûÿ»XÿûýýýýýýþøÿP Ùÿüýýýþüûÿý>{ÿúýþüûþÿÃ;ðÿüûýÿÙYÿúÿéu .ïõil32 ª‡ÿ þÿÿüÿ­\t{†s³ÿü‰ÿþ€ý úÿ°alu“¶À¾ÇÄ·ÿýÿ°Q`u‡¶ÁÂÇÁ¦ñÿþ†ÿýÿ¹tyyŒ€•˜ª¼Â¡ººÁ¼„èÿþ†ÿüÿ™0:K…ªŒ‡ÈÍÛó·¤·¸xÿþ‡ÿüÿœ8w®¿¿·oÎøüÿº¦h9¦ÿø†ÿýÿ×FîªÅ²q¤úÅ¢€\JDI5šÿû„ÿüÿ“`Æ»¨™ª£†uœ}xjG]mg?Žÿûÿþüüý€ÿüÊ®§—“”…nT…f_RkeVobgòÿþ…ÿþãÁk‡meWGË¦šž¢¦ª®³·»¿ÃÇËÏÒÖÙŠ–¤­©´±¼¹µ¯²½¸¾Ã¾®¬{`‹ÿý²ÿüÿIEKm¤­²¶·¸¶¶³¸»³§’x?]ßÓÓ×ÛÞáåçêíïòôöø÷ÿÆvš¬¼¿Áµ¨¦¡¡|hODK=¹ÿü´ÿüÿ;K€H@IGDW£­±¶¶·¶¹½³±¸¹µ°ž‚]4°êÙàãæéìîñóõ÷ùúûûÿè{•ª¸¾»±©—Œ‡r]LFIK;ºÿü´ÿHüÿŒ:JGGIDKl£®¶·¸º»»¾½»°³À°¯¨‹n9híåçêíïòôöøùûüüþÿÿò|©µºµ¬œ’…ufUHHJHJ;¸ÿù‚üþ®ÿHüÿŒ:JGHBSŠ¢£§³½¹µ°µ»¿Ãžµ¶´°¬‘xO9Èõìñóõ÷ùúûüýÿÿþêɯr€¡­ª¦›ˆ{hRIFIIHGJ9ºÿü´ÿHüÿŒ:KGBa’¡°´°´½°¡™¨ÁÀÌÄÁ»¬«¨­˜zc3‰üòöøùûüüþÿÿöÚ¹¢™ wo“—•}lZIEHJHHGGH>Œ¿µ€·¸²äÿþ«ÿIþI=JEFqŸ©­µ·¸¼ª——ž«É¿ÄÈÀºµ±­®›„lDPêüùûüýÿÿþëÊ­šš—™{_||{o[NFGJIHHGFFEI# €¥ÿû¬ÿ+(/II| §²¶¹ÁÂÀ±š™¯ÁѽÃÇ»µ·©¥—‡lT4¼ÿúþÿÿ÷Ûº£€š–’ŽR_`[QFFKKJIH€GFDH" € ¤ÿûªÿJôì8 3OŠ©¬µ¼ÁÀÁÀ¿·š™œ¥¿ÈÄ嶸ª››•}nb4ƒÿþþëÊ­šš˜”‘Ї„MGIGDAGKFCB@A?@ACH" €¥ÿû¨ÿLýÿ¡_ljXˆ«´¼¼ÀÃÀ¿¼¾µ«¡ˆ™·ÁÀ¾±¯©¤›””„{kESì๣›šš–’Œ‰…‚{|M9CB@>ACGRY\\XSH?D € ¤ÿû¨ÿLüÿw)S¡­¾½¾ÁÃǹ¹º®¹³˜‘³¾µª«§ª¦ž‘oU:¾±•›˜”‘Ї„}{wtuT>A>:üÿ‡w½±ŠT ³½¸±»³¦¡¥™”•ŠŒ—ŸžœŸ•—˜˜“‡r`ANÍ“€|yvspmjheb`^Xdpljji€jiihggffefd?135$²ÿü§ÿ;þÿÙ˜Á­¢¤U}¬·º°­¯¡ šž’ŽŒ‰˜™˜š•‰Ž“ƒoZB=¸¨rytqolifda_\ZXQcmke`aa^`gg€fegatÿûªÿSþÿè”Ê·­µÄP¨­²¤°¥˜˜›”“Œ™˜ˆˆ{oqy}r`N=6˜¾krmjheb`][YVTSN\nkkeby𢧥‹ccgffeefS¼ÿü©ÿþÿÚ¢àÀÈÐßÀCƒ¨¤©¢˜š™•ŽŠ•“€-Œxpggf]L;/3yÍphgda_\ZXUSQONHZnee~ž…R=;V’´qbgeg9,íÿþ©ÿJþÿŸÖãâëóóxMŸ–›“‘Ž“Œ†‹Œ‰€xzzmp\TNE6.27`Ì„[a][YWTRPOMKJGOkƒŸ€=  S³jdf€edd]ÿü©ÿTýÿÑ­ÿõüþÿÍ@~–•—‘‹‰‡‡„…Šˆ€|fX^\SUG?76>;@9Qº¡Q\XUSQONLJIHGAV¡y4 #>LLC/Z§]geeddeX¬ÿüÿü‡ûþÿJþÿžëÿÿòÏ£GF“Š€‚||rx{qa\XNBC;79=@[F>B€DCA@@NDCDwÆzAKHGFEDC‚BAQt’¯ÈÓÒÏÍÌȲo`¡[f€dcdX¬ÿü‹ÿ'…Øÿý‹ÿ1ýÿ¨”šghqx{PI]YTQKA>517:=BEGEDDCAA?ISVIFDn³œ;IEDCCƒBD?„½ÍÕÓÐÏÎÍÍÊĤJ–^fddccd> éÿþŠÿ5 …Ûÿý‹ÿ üÿz|†–„pbTG€CEE2())-14€745@D??DNX\\[OHDi¶?EC„BCEH>›á€Ò ÑÐÎÍÌÌȽŠ%2«c€dc^ÿüŠÿ2… Úÿý‹ÿüÿˆ>SAA>=?BCCA1"cŽˆ€‹Љ†‰•“Y=HT`ca_[[VJFe‹ÃR>CB$CDEGIMD‡ÞÑÓÒÑÏÎÍÌÌËŲh mšZfcdbcdW¬ÿü‰ÿ2… Úÿýÿïà+K2€¤ÿûƒÿ?ýÓnuggd`_]\YOH`€¾s8DBBCEFHJLOSLyÛÒÒÑÐÏÎÍÌËËÉÁžBw_dcbccd= éÿþˆÿ2… Úÿýÿ)N. J£ÿøúúþÿð¦ogƒ¡¥•kfeca^ZXQK[~«—4EDEGIKMPSUYXmÔÔÒÑÐÏÎÌÌËËÊÆ¹ƒ?«_dbccbcb]ÿüˆÿ2… ÚÿýŽÿþ)J- A¤ÿúþÿä—kq•­¬£Ÿ¡Šghe`\cwnLX”²=HHJLNQTWZ]achÉÖÒÑÐÏÍÍÌËËÊÈía y“Ye€cbdV­ÿü‡ÿ2… Úÿýÿ)H, L¥ÿþχesœ®­¨¦¦¤ ¡~ddm|zIHY~¿THNPSUX\_bfini¼ØÑÑÐÏÍÌËËÊÉÈÆ½™:¤o_dccbcd=éÿþ†ÿ2… Úÿýÿ)H,€ ¡Ëu_tœ¨€¦6¨©¨¦¥ž™zE >Z}x¸uIUWZ]adgkorxp¬ÚÐÐÏÎÍÌËËÊÉÉÈõ}K§\d€cbcb]ÿü†ÿ2… ÚÿýÿW)G,  M`u˜žœŸ¡¢¥§¨©¥¢¶É”;'B]X{w¤–M^_bfimptx{zžÚÐÐÏÍÌËËÊÉÉÈÇÆÀ¨Z †‹ZdbccbdU ­ÿü…ÿ2… ÚÿýÿN)F+ =i~‘”’•™š›Ÿ£¥£¥¼Í¦T+Fk“¥bwyŽ®Xfgkorvz}…‰ˆ”×ÑÐÏÎÌÌÊÊÉÈÇÇÆÄº”2#¨j`cbd;êÿþ„ÿ2… Úÿýÿ)F+ ;f‚‰Š‰Œ€‘<•š›š¢¹ÌžJ ,Lr–¬±¶~t||¸llptx{ƒ†Š‘”ÏÒÏÎÍÌËÊÉÈÇÇÆÆÅÁ²wY£Zdbcajÿû„ÿ2… ÚÿýÿO)E*L|ƒ„ƒ„ˆŠŠ‹‘Žš´Ç”? 'Gw‹—¯²±°µ£w{r²†qz}„ˆŒ’–˜žÄÔÏÎÍÌËÊÉÈÇÇÆÅÅĽ¤R ‘‚ZcbcS»ÿüƒÿ2… Úÿýÿ!)C+U~~…„„‡ˆ„¯ÀŠ4 *M~¶å÷¿­³²vo¢¡w„†Š‘”—š ¦—¸ÖÎÍÌËÊÊȀǀÅÄ·+-«da‚bd7/öÿþ‚ÿ2… ÚÿýÿB)I%Qz}|}€‚}‰¬µ€,.T‡Àéûýÿô·°³²±¶rr¶’–™œŸ¡¤¦« «ÕÍÍÌËÊÉÈÇÆÅ ÄÄ¿¯pfXdbc`rÿû‚ÿ2… Úÿýÿ:(, 3v|yz|}}~~y£­u$3[’Èîûýþÿþÿë°²²±µ_otz¿”—š £¥§©«®©¥ÚÍ€ËÉÈÈÇÅ€Äû Kš{\c€bacS»ÿüÿ2… Úÿýÿ' c~vyzz{|{yž~ 8eœÐñûýþÿ%þÿß­²¸šhvl¸£™Ÿ¡¤¦¨ª¬­®¯³‘®ÓÓËÊÉÈÇÆÆÅÅ‚ÄÀµ‰$8«_ƒb d6/öÿþþÿÿ3€ Úÿýÿ'!}txxwzzyy‰i=c£Ùóûüþ„ÿ#þÿÓ©À_Syg¥µž¦§©«­®¯¯°®¸‰rËÊÈÇÆÆÅŃÄý«js–Xdbc`rÿû€ÿ*€  Úÿýÿ'8zuvvxwxyzv U‡Ñõûüþ‡ÿþÿÈ«!2xfÁ£«¬­®¯° ®²¡,lºËÉÈÇÆÆÅÅ‚Ä ÃĹœC¡s]cbcQ ¼ÿüÿÿQ+42215 Úÿýÿ';ƒqvvuwwu€MS—èüüýŠÿ ýÿnjyꮯ¯€°¯¯®­®¢©àÏÉÈÇÆÅŃÄÿ²„F©\cbcd15ÿþ„ÿûÿh Úÿýÿ'<œnttutvuyI+‚áûúúûþ‰ÿ üÿU[oi¼²¯€°¯¯®­«ª©¤šËÊÉÇÇÆ€ÅĂü¨c €Ydbc_‚ÿûƒÿûÿh Úÿýÿ'­wrtsutt{G9®õóôõ÷ùüü†ÿýÿÝ Asaª»®°¯®­¬«©¨¦¤¤‘ÃÌÈÇÆ€Å€ÄÃÂÃÃÂÁ·˜;§m_dbbcbdMÎÿý‚ÿûÿh Úÿýÿ'~œitsrtswV<¾öïðòóöõùüþ„ÿûÿ‡%p_”À«®­«ª©§¥£¡žŸµÎÇÆ€Å€Ä…à ¿°R¦[d€cbcd/=ÿþ‚ÿûÿh Úÿýÿ'1²nqqsqrwc<°óëîîðñóööùüýþ€ÿþÿú,db}¾©«©¨¦¤¢ ž›™™Š¢ÎÅÆÅ€ÄƒÃÂÀû¦] Œ‡Zd€cbd_‚ÿûÿûÿh Úÿýÿ='—Šjrprqqs?ˆëêêìíîðñòôöùþþÿÿüÿµRgjµ¨§¥£¡Ÿš˜•’ЉËÅÅ‚ÄÃÃÂÂ…ÃÁ·•4'«ha‚ceKÏÿý€ÿûÿh ÚÿýÿC'K®gpqoppsVZÒëçééëìíîñò÷÷úýþüÿW@-1l^¦¨¡ ž›™–”‘ŽŒˆ‹h ÎÃÄÄÃÂÂÀƒÃÄÃÿ¯z`¢Zeccdcce,=ÿþ€ÿûÿh Úÿýÿ>' ¦|knpnnriE¢êäæçèéêìíïðòõöøÿß J¹ÿÊ$eY‘¨›š˜•’Ї„oTÅÄĀÃÃÄû¤U–\eccdcd^˜ÿûÿÿûÿh ÚÿýÿD'i¢dplonmtLjÛäâäææçèêëìîïñðÿxiÒÿÿûÿ‰EUv¤””‘ŽŒ‰†ƒ€}zvy>‚ÏÁÃÂÂÃÃĵ‘-3­dc‚dfIÞÿýÿûÿh ÚÿýÿC(+ ¯oknlmnngC³æßáâãäåæçèéëíððšØÿþüüþÿô`E]šŠ‡„~{xurnpU<µÆÁÃÃÂÂÃÄÃƒÄ ÅÅ¿­unZf€dcef(Iÿýÿûÿh Úÿýÿ?(?‚“dlmklmoJußÞÞßààáâãäåçéêêúùïôùüÿüÿ¦5HˆŠ†ƒ€}zwtqnkig^5kÊÀ€ÂƒÃ‚ÄÅÄ»¢N {^fdeedf]˜ÿûûÿh ÚÿýÿA(;66¯eljlkip]J¾ßÚÜÝÞÞßàááãäåçåéíïðôúýÿóN/q†}{xurolihcZYa[<žÊÀÂÃĂůõŽ&?­bƒe hEßÿúÿh ÚÿýÿB(,B˜ƒclijkhoB…ÞØÙÙÚÛÜÜÝÞÞßáâäåçéëíñõ÷ÿ£V€vtqnkhgaW]yzulMYÀÃÂÃÄÅÄÄ‚ÅÆÆ€Ç À®o|—\gee€f g%Jÿùÿh ÚÿýÿC((›P¨aijhijkZNÈÙÖ×רØÙÚÚÛÜÜÞßàáãåæéìï÷ò82wolige_V]~¢°ŒumbF‡ÌÂÄÄ€ÅÄÅ€ÆÇÈǼ G¨ubgf g] §ÿÿh Úÿýÿ(*…ñ §sfgjhhkgB’ÜÒÔÔÕÕÖÖ€×)ØÙÚÚÜÝÞßáãæåü•jied^T]€¤¯©ªœyodWS²ÉÄÅÅÄÅËɀǀÈÉÈÉÆ·‹ L¬`hfg hC"åÿg Úÿýÿ(+|ÿllœ]jfhhfnPZÍÓÑ€Ò€Ó0ÔÓÔÕÕÖ×רÙÛÜÝßãâ-Mh[S^‚¥¯©§¨©§€pg[OwÊÅÆÈḬ́¹ËÉÉÊɀʂËîiˆ‘^ig hg"Zÿd Úÿýÿ(+}ÿÅ!­hehfggfh>¡×ÍÐÏÐÐÑÐÐÑ€Ò%ÓÓÔÕÖÖÕé†+Z]„§¯©§¨©©¨¬Žqj]RT¢ÐËǬ}Z±ÏÊËÌÌËÌʾŸ@%¬qeh gi[ ½v Úÿýÿ(+ÿÿJ†‹_fhfeghNbÐÌÌ‚ÍÎÎÍÎ̓ÎÏÑË[ƒ¨¯©§ƒ¨ª›tj]PKpÁ¸”d4CËÍÌ̈Íȸ‡[©`i‚h j=1S Úÿýÿ(+ÿÿ«:¬_hdgedi_BªÑʉˀÊ"ËÊÊÉÊÉÊÆ®©§¨©¨¨©¨¦¦¥¡yi^RBV¤N%]ÛÌˆÏ ÐÏÎÆ®c•Šaj‚ie, Úÿýÿ(*ÿýû*š{_gcfebkDqÐÈÊÉÊ„ÉÈÇÇ€ÆÅÅÃų¦©€¨§¦¤£¡žŸf^PB?U,•ÞÏÒÑÒÒ„ÑÏÁŸ8.±nhjijiijZ Úÿýÿ(*ÿùÿU£[efc€d^CµÌ€ÇÈÇÈÇǀƂŀÄÃÃÂÂÀª§§¦¤¤¢ œ›„d]ND8'$ÂÚÔÕ€ÔÓÔÓÒÓ€Ò Ì¹ƒgœbljjk€jF Úÿýÿ(*ÿûÿæ§mabebcdeD{ÐÄÆ‚ŃÄ&ÃÃÂÂÁÂÁĵ£¤¢¡ž›š™˜••†cZNB7.$ BàØÙÙØØ××‚Ö€Õ ÔÔÓȰP šmjkjld!Úÿýÿ(*ÿüüÿar•ZeadbbgUL¼ÇÄÅŃÄÃÄÃÂÁÂÁÃÃ¥žš˜˜—”‘Ž…`TK@5+#xíÚ€ÜÛÚÚÙØÙØ×€ÖÒÆŒyyhmllklko9 Ûÿýÿ(*ÿüýÿÈ$­acdadbag=ŠÍ‚Ä‚Á&ÂÃÃÉ·”˜–”’Šˆ†€]PG<2*" ²îàáàßßÞÝÜÛÛÚÚ‚ÙØ×Òµ.dxj€m llkoTÜÿýÿ(*ÿüÿþÿ=‰‡ZcdadbdSRÃÄÆÁ*ÃÄÅÆË¡‹ˆ†ƒ€~{\LB80(!(ßëææäãááààßÞÝÝÜÜÛÛ€ÚØÈAXtmnn€mlp_Üÿýÿ()~ÿüÿüÿ«@§]bac`cbb?–ËÀ‚ÂÁÂ…Á5ÂÂÃÄÃÅÍÓ¯‡‰†„~{yvsXH@6-$ ZûëìêéçæåãâááààßßÞÝÝÜÜÝÆ@eqƒnmnjÛÿýÿ()~ÿüÿþÿò!žt_bad`beM]ÆÁÂÂÁÂÁÀÁÁ€Ã0Êε•…~{yvspmkSC;2)!™ÿîðïíëéèçæåäãâááààßßÚêCvƒonnomÚÿýÿ()~ÿüÿÿûÿ‡Y¢Vea`c_c`?¡ÈÀƒÁÀÁ;ÂÂÃÃÈͯ}m~ƒ|yvtqnkhgdK<6.%ÕÿööóñïîìëéèçæååäãâáÞêÓVftppqpp€oqjÙÿýÿ()~ÿüÿÿýÿÞ ¦l]ca`c^fGhÈ¿À‡Á8ÂÂÃÃdzgAZw{wvrolhfda]ZC71)" 9þÿýüùõóñðîîìëéèççåâçðÉcdvqr‚qporiÙÿýÿ()~ÿü€ÿüÿawZaba`c`_?¬ÅÀƒÁ9ÂÁÁÂÂÃÃÄÆ¼¡˜Šxkhijhfc_[WUQ;1,%tÿüÿÿýú÷õôòðïîíìêçéôÜUgxsrqpt^Ùÿýÿ()ÿü€ÿüÿÂ)®]c_ba_bbFqʾÁÀ€Á$ÀÁÁÂÂÃÃÄÄÅÉÐÑÏ®‘s^VUVXVQNG4-' ´ÿü€ÿþüû÷öôôñïìíøèŸ^Zvyt€s rrsoz5Ùÿýÿ(({ÿü€ÿþÿÿ7Œ„Xd_ba_eWG³ÄÀÁÀÁ"ÂÂÃÃÄÄÅÆÇÈÊÌÓÙÝÖãxYE>AGA0)"èÿþ‚ÿýüúù÷óòüó°gVt|w€vuƒtl}^Øÿýÿ*-ÿüÿûÿžC§Zac_aa_h>ɾ‚Á€ÂÃÄÄÅÅÇÈÊÌÎÐÒÕÛäìíÜ»^=$ !Kÿý†ÿ ü÷þýÃqVs€{wx€w€v uvoo˜{ãÿýÿ(,¬ÿýÿ þÿò"žt\`c^€aXI»Â€Á€Â!ÃÃÄÄÅÅÇÈÊËÌÏÒÔ×ÚÝàåïùÿúÜ¢]+ ‰ÿû„ÿ þýþÿ×€Vq‚~|€zyxxwwxtmˆ³x <öÿþÿIN¸ÿý‚ÿûÿx`œXb_c_bab@ˆÊ¿ÁÁ€Â!ÃÃÄÄÅÆÆÉÊËÍÏÒÔ×ÛÞâæéíñúÿþÿê´q5Æÿü‚ÿ"þüþÿåZn…ƒ}~~{|{zyyzxo}­ž9q÷ÿþšÿýÿÞ «e`a_c^bdRQÁÂÁ€ÃÄÅÅÆÇÈÉËÌÎÐÒÕØÛÞâæêîòöûüý€ÿúÔõƒÿ ýþÿìœbp†Š„€‚}€{ sv£­Y+ŸÿýÿTw“Td`_c_ca@“ÉÀÂÂÀÄÅÅÆÇÈÊËÍÎÑÓÖØÛÞáæéíñöûÿÿþüûÿÿþÿýþÿó¨jw’‘‹‰‡ƒ†€€€~wtš·z€3ŸÿüÿÂ.©a^c``c^gK\Å€ÂÃÄÄÅÅÆÇÈÉÊÌÎÏÑÔÖØÛßáåéíðõúþÿþý€ÿ#ýþÿ÷³u}ž£“‘’ˆŠ‡ƒƒ‚|t·”-4¢ÿ-7’~\_c``c_e; ÊÁÃÃÄÄÅÅÆÇÈÉËÌÎÐÒÓÖÙÛßâäèìïóöû„ÿ%ýýÿû¾€ˆ­¶§œœ›”’‡ˆ†ƒy‰³¦E £i7 ÿûÿžE©Wd^c`acbMbÊ€ÄÅÅÆÇÈÊËÌÍÏÑÒÔ×ÚÜßâåèëïóøý‚ÿ'ýýÿÿȇ»Í¾°©§¤ž—˜•ŽŽŠˆ¬µ` `ãÿj7 ÿ\þÿò" s]c_d`bd]A¨ÉÃÄÅÅÆÆÈÉÊËÌÍÏÑÓÕ×ÙÜßâäèëîñõùýþÿýýÿÿÓƒt¤ÇÇÅÁ¸³°¨¡¡––Œ‰ª¾{1Äÿùÿj7¡ÿ[ûÿx_ŸUcc_d_bgFmÍÂÅÅÆÆÇÈÉÊËÍÎÐÒÓÕØÙÜßâäçêíðôöúüýþÿ݉gޝ²µ¾ÃÆÅ½³¬«¥ š¦Ç“*Ÿÿÿüùÿk7¡ÿ[ýÿÞ §j]cb_e_f[E±ÈÄÅÅÇÈÈÊËÌÍÎÐÒÓÕØÚÜßáäæéíïòõöýÿæ‘_|¢£¨«´ÁÇÈüµ°¨Ÿ¬É«A xöÿýüÿûÿk7¢ÿGýÿT|Œ\`ca`e_j@yÎÃÆÆÇÈÉËÌÌÍÏÑÒÔÖØÚÜßáäçéìîð÷ÿì›\lŽ•”˜› ©±¹ÂÇÈÆ½¯µÎ¾\€Qâÿýü€ÿûÿk7¢ÿEüÿÂ,®[e_daaea]DºÈÆÇÈÉÊËÌÌÎÏÑÒÔÖØÚÜßáãæèéïþë \cƒ‹‰‹Œ‘™ §¬±ºÆËÄÅØÒu €;Îÿþüþÿûÿk7¥ÿL7ƒYe_eabecCÐÅÇÈÉÊËÌÍÏÐÑÓÔ×ÙÚÜßáääè÷ë¦_\z„ƒ‡’–¡¦¯¸ºÃÝæ“­ÿÿüýƒÿûÿk7£ÿLûÿžF©Ycd_f`cfUKÀÈÇÉÊÊËÌÍÏÑÒÓÔ×ÙÚÝßßãñé¬bWs€}}~„‡‹“˜Ÿ¦¨«Æå«0ôÿýü…ÿûÿk7£ÿJþÿò"žw[dc`f`ed@‹ÒÆÉÊËÌÍÎÏÑÓÔÕØÙÛÛÞêè²gTn}{y{}€ƒ†‰Œ“™›œ®×¶Dläÿýü‡ÿûÿk7¤ÿûÿxc›]aebbf_kOTÆÉÉËËÌÍÎÐÑÓÔÕ€Øäæ¶kRizywxz{|~€…‰‘œÉ¿Y€OÍÿýûþˆÿûÿk7¤ÿFýÿÞ ­ed_fbce`j9—ÒÈËÌÌÎÏÑÒÒÔÕÕßä»qPdwwtuxxy{|}…‰†Œ¸Âp1¶ÿþûýŠÿûÿk7¥ÿCýÿTy“Yf`f`eefRSÌËÊÌÍÎÏÐÑÑÒÛâ¿wO_tvrruvvxyz|}ƒ€§ÁƒŸÿÿüüŒÿûÿk7¥ÿAüÿÂ,¯^ddagagdf>uÕÑËÌÌÍÐÕÜßÃO\ptppsttvwwyz{|w˜½–0 ‡öÿýüŽÿûÿk7¨ÿ<7ˆXgbbgahda9i¶Ð×ÙÚ×ɪ{PXmsooqrrtuuwxx|{s‹¶¤Dläÿýüÿþÿé×á¦ÿ1ûÿžG¦`agaefbica<>?J\jpml€nqqpstswxow¢´j 1¶ÿþûý•ÿþýý§ÿûÿx]¢[fchaidgefjkjk€mkjlmmnooqrqtvoq˜¶}ŸÿÿüüÄÿ6ýÿÞ ­ifcegbjbggfhihijiklknnmoppruol޵Ž& ‡öÿýüÇÿ3ýÿTpVjaheegfghghjijkjkmlnonpsoiƒ°œ7läÿýüÉÿ&üÿÂ%­gbiaicfhfhihijijlklnmoqnhz¨§K€OÍÿþüþÍÿ-7†[ggcgffhghjhikjkmkmpngrž¯_ 1ÄÿþûýÍÿ-üÿ«8±fbhdfhggihhkijlkknngl’³s­ÿÿüüÏÿ+þÿò"–”^dgffhggjiikjjmmhg‡³…!ôÿýüÒÿ(ûÿ#Ä|\hhgfihhjiilmhd}¯”1 oíÿýüÔÿ'þÿæKÏ[diihjjillict¨ CQâÿýûþÖÿüÿoNͤm\`cdfdaanŸ¨V€IÎÿþûþØÿ"ýÿÞ *¡Ë³’{yƒ’©®h2°þÿüýÛÿüÿ‡3|§µ¸´¬™l“ýÿüüÞÿþÿ@€ € wöÿýûàÿ þÿï5€måÿýûãÿþÿ÷uƒOÍÿþüþÔÿüÿ¿IX‰USWe0‡ +caQS—UXI¿ÿüžÿ·ÿûÿ`ŸÿûÎÿýŽüøÿ^žÿûàÿûÿ_ŸÿûÌÿýÿ³~ˆ…†‡‡†…€„ƒz&@Îÿüÿ~#4…1/.18CP?•ªÿüËÿüÿˆ4D@?@AA??BJUakqt}N“JÿýËÿüÿ†/@AEA<@HS_gloruy|‹;’æÿþÊÿýÿÇ¡¥“vWQ^fjmpsw|€„‡ŽŠ’¨ÿûÊÿþÿ¼†p\Yahkmqvz~‚†Š“•¥n’wÿû´ÿü’ûúÁNXeilotx|€„ˆ‘•™ž¢¤²?‘`ÿûÈÿþÿá“Ò¼llsvz~‚†ŠŽ“—› ¤¨¬°º¢ =ÿþ²ÿýÿØ ŽŸž£T•˾u|€„ˆŒ‘•™ž¢¦ª¯³·»¼Ð['´ÿûÿ`€É±‹Ž“—› ¤¨¬±µ¹½ÁÅÇÓ³)´ÿûÿbƒÊ¦šž¢¦ª®³·»¿ÃÇËÏÒÔãEXÿü²ÿûÿ`’šÌ¡£¨¬±µ¹½ÁÅÉÍÐÔØÛÛï”ÿû²ÿûÿ`“>¼Æ©´·»¿ÃÇËÏÒÖÙÝàãåîÔ7÷ÿþ²ÿûÿ`“ p×½»ÁÅÉÍÐÔ×ÛÞáåçêíîúCŒ5îÿþ³ÿûÿ`”(®ÛÃÌÎÒÖÙÝàãæéìîñóñÿ„Œ ÿú´ÿûÿ`”bÞÓÓ×ÛÞáåçêíïòôöø÷ÿ¿Œžÿû´ÿûÿ`—'²éÙàãæéìîñóõ÷ùúûûÿÿû´ÿûÿ`• mìåçêíïòôöøùûüüþÿÿû:‹žÿø‚üþ®ÿûÿ`—3Éõìñóõ÷ùúûüýÿÿþêǶM‹Ÿÿû´ÿûÿ`–ŽûòöøùûüüþÿÿöÚ¹¢˜£f‹r³€¶·±äÿþ«ÿþH#˜SéüùûüýÿÿþëÊ­šš—™x€‚‚€ ¥ÿû¬ÿ'› (¾ÿúþÿÿ÷Ûº£€š –’Ž‚† ¤ÿûªÿôì7 ™(ˆÿþþëÊ­šš˜”‘Їƒ„!8 "' ¥ÿû¨ÿýÿ¡_ko ™&Uë๣›šš–’Œ‰…‚z€13CE?T]aa]WG*  ¤ÿû¨ÿüÿw'%š&/Á±•›˜”‘Ї„}{wswI,EA8;Kbjkjihihg_G € ¤ÿû¨ÿüÿx)]W˜Ä”Œ‰…‚|yvspmmX<9AOckj€h€gffgeQ¥ÿû¨ÿ üÿt#u²Š —0 tЊ‹‡„~{wtqoliffUBUhnliihihhggffeffL ¡ÿû¨ÿ üÿ‡w½°‘)™MÍ“€|yvspmjheb`^Xepljjijj€ihggffefd=235$²ÿü§ÿþÿÙ˜Á­¡¤Sš2º§rytqolifda_\ZXQblj€ke`aa^`gg€fefatÿûªÿ þÿè”Ê·­µÂˆ—,"œ½krmjheb`][YVTSN\nkkecy™¢§¥‹cchffeegS ¼ÿü©ÿ þÿÚ¢àÀÈÐÞÁ=–%|Ìphgda_\ZXUSQONHZnde~ž„R<:U’´pbgf€eg8+íÿþ©ÿ þÿŸÖãâëóñ€ —, +bË„[a][YWTRPOMKJGOkƒŸ<  R³jdfeeded]ÿü©ÿ ýÿÑ­ÿõüþÿÏ9•/(>;Qº¡Q\XUSQONLJIHGAV¡x3 #>LLC/Y¦]geeddeX ¬ÿüÿü‡ûþÿ þÿžëÿÿòÏ¡O ’)7N=›áÑÒÒÑÏÎÍÍÌȽŠ%2«c€dc^ÿüŠÿ2… Úÿý‹ÿüÿˆ>SC1>f_`_\`lj-FYbba^\[VJFe‹ÃR>CB$CDEGIMDˆÞÑÓÒÐÏÎÍÌËÊŲh lšZfddbcdW ¬ÿü‰ÿ2… Úÿýÿïà+L5¥ÿûƒÿ?þדr†vfgda^]\YOH`€¾s8DBBCEFHJLOSLyÜÒÒÑÐÏÎÍÌËËÉÁžBw_dcbcce=éÿþˆÿ2… Úÿýÿ)L- J¢ÿ÷ùùýÿï¤lf‚ ¤–lfeca_[XQK[~«—4EDEGIKMPSUYXmÔÓÒÑÐÏÍÌÌËËÊÆ¹ƒ>ª_dbccbcb^ÿüˆÿ2… ÚÿýŽÿþ)J- K¤ÿúþÿã–jp•­¬£Ÿ¡Šghe`\cwnLX”²=HHJLNQTWZ]achÉÖÒÑÐÏÎÌÌËËÉÈ­a y“YdbccbdV ­ÿü‡ÿ2… Úÿýÿ)H, B¥ÿþΆdsœ¯­¨¦¦¤ ¢}cdm|zIHY~¿THNPSUX\_bfini»ØÑÐÏÎÍÌËËÊÉÈÆ½™:¤o_dcd<éÿþ†ÿ2… Úÿýÿ)H,€ ¡Êt_tœ¨€¦&§©¨§¥ž˜yE >Z}x¸uIUWZ]adgkorxp¬ÚÐÐÏÎ€Ì ËÊÉÈÈĵ}K§\dbca]ÿü†ÿ2… ÚÿýÿN)F,  L`u—žœž ¡¥§¨ª¥¢¶É“;'B]X{w¤–M^_bfimptx{zžÚÐÐÏÎÍËËÊÊÉÈÇÆ¿¨Y †‹Zdc€bdU ­ÿü…ÿ2… ÚÿýÿN)E+  'Gw‹—¯²±°µ£w{r²†qz}„ˆŒ’–˜žÄÔÏÎÌÌËÊÉÈÇ€Æ ÅĽ¤R ‘ƒZdbcR»ÿüƒÿ2… Úÿýÿ)C+T~€€„‡ˆ„°¿‰4 *M~¶å÷¿­³²)vo¢¡w„†Š‘”—š ¦—·ÖÎÍÌÌËÊÉÈÇÇÆÅÅÄ·+,«da‚bd6.öÿþ‚ÿ2… ÚÿýÿE)H%Qy}|}~‚}‰«µ€+.T‡Àéûýÿô·°³²±¶rr¶’–™œŸ¡¤¦« «ÕÍÍÌËÊÉÈÇÆÆÅŀĿ¯qfXd€babarÿû‚ÿ2… Úÿýÿ:(+ 2w|zz|}}~y£­t$3[’Èîûýþÿþÿë°²²±µ_otz¿”—š £¥§©«®©¤ÚÍ€ËÉÈÇÇÆ€Å€Äû Kš{\cbdR »ÿüÿ2… Úÿýÿ'c~vyzz{}{yž} 8eœÐñûýþÿ"þÿß­²¸šhvl¸£™Ÿ¡¤¦¨ª¬­®¯³‘®ÓÓËÊÉÈÇÆ€Å‚ÄÀ´‰$7«`ƒb d5/öÿþþÿÿ3€ Úÿýÿ' }uxywzzyxŠi=c£Ùóûüþ„ÿ#þÿÓ©À_Syg¥µž¦§©«­®¯¯°®¸‰rËÉÈÇÆÆÅÅ‚Ä Ãþ«j s—Xdbc`rÿû€ÿ*€  Úÿýÿ'8zuvvxwxyzv U‡Ñôûüþ‡ÿþÿÈ«!2xfÁ£«¬­®¯° ®²¡,l»ËÉÈÇÆÆÅÅ‚Ä ÃùœC¡t]cbdP ¼ÿüÿÿQ+42215 Úÿýÿ';ƒqvvuwwu€LS—èüüýŠÿ ýÿnjyꮯ¯€°¯¯®­®¢©àÏÉÈÇÇÅłĂÿ²„Eª\cbcd15ÿþ„ÿûÿh Úÿýÿ'<œotuvtvuxI*‚áûúûûþ‰ÿ üÿU[oi¼²¯€°¯¯®­«ª©¤šËÊÉÈÇÆÅÅăü¨c €Ydbc_‚ÿûƒÿûÿh Úÿýÿ'­wrtsuts{G9®öôôõ÷ùüü†ÿýÿÝ Asaª»®°¯®­¬«©¨¦¤¤‘ÃÌÈÈÆÅ‚ÄÃÂÂÃÂÁ·˜<§m_cbbcbdMÎÿý‚ÿûÿh Úÿýÿ'}œitsrtswU<¾öîðóóõöùýþ„ÿûÿ‡%p_”À«®­«ª©§¥£¡žŸµÎÇÆÅÅăÀÿ°R¦[dccbbcd.<ÿþ‚ÿûÿh Úÿýÿ'1²nrqsqrwc<°óëîïðñóööùûýþ€ÿþÿú,db}¾©«©¨¦¤¢ ž›™™Š¢ÎÅÆÅ€ÄÃÂÂû¦] Œ‡Zd€cbd^‚ÿûÿûÿh Úÿýÿ='–Škqprqqr?ˆëêêìíîðñòõöùþþÿÿüÿµRgjµ¨§¥£¡Ÿš˜•’ЉËÅÅ€ÄÃÂÂÃÂ÷•4'«ha‚ceKÏÿý€ÿûÿh Úÿýÿ>'J®gpqoqpsUZÒëçééììíîðò÷÷ûýþüÿW@-1l^¦¨¡ ž›™–”‘ŽŒˆ‹h ÎÃĀÀÃÂ…þ¯z_¢Ze‚ce+=ÿþ€ÿûÿh Úÿýÿ=' ¥}knponsiE¢êäæçèéêìíïðòôöøÿß J¹ÿÊ$eY‘¨›š˜•’Ї„oTÅÄÃÂÃÃÂÂƒÃ€Ä Ã»¤U–\edc€d^˜ÿûÿÿûÿh Úÿýÿ?'h¢dpmonmtLjÛäâäææçèêëìîïñðÿxiÒÿÿûÿ‰EUv¤””‘ŽŒ‰†ƒ€}zvy>‚ÎÀÄÂÃĵ‘-2¬dc‚dfHÞÿýÿûÿh Úÿýÿ@(* ®oknlmnngC³æßáâãäåæçééëíðð™Øÿþüüþÿô`E]šŠ‡„~{xurnpU;µÇÁÃÂ€Ã„Ä ÅÄÅ¿­umZfdef'Iÿýÿûÿh Úÿýÿ?(>‚“dlmklmnIußÞÞßààáâãäåçèêêúøïôùüÿüÿ¦5HˆŠ†ƒ€}zwtqnkig^5kÊÁ€ÂƒÃÄÅÄ€ÅÄ»¡NŸ{_fdeedf]˜ÿûûÿh Úÿýÿ@(:65¯emjlkip]I½àÚÜÝÝÞßàáâãäæçæéìïðôúþÿóN/q†}{xurolihcZYa[;žÊÀ‚Ã‚Ä€Å ÆÆÅÆÆÃµŽ'>­bƒe hEßÿúÿh Úÿýÿ?(,B˜„cmijkioA„ÞØÙÚÚÛÜÜÝÞßàáâäåçèêíñõ÷ÿ£V€vtqnkhgaW]yzulMYÁÃĄůÇÀ®o{—\g€fefg$Jÿùÿh ÚÿýÿA((›P¨aijhijkZNÈÙÖ×רØÙÚÚÛÜÜÞßàáâåæéëî÷ò82wolige_V]~¢°ŒumbF‡ËÂÄÅÄÅ€ÆÇ€È Éǽ¡G§ubgf g] §ÿÿh Úÿýÿ()…ñ ¦tfgjhhjhA’ÜÒ€Ô1ÕÕÖÖ××ÙÙÚÚÛÝÞßáãæåü”jied^T]€¤¯©ªœyodWS²ÉÃÅÅÄÅËÉÆÇÈÉÈÉÆ·Š L¬`gfg iB"åÿg Úÿýÿ(+|ÿlkœ]jfhhenPYÍÓÑ€ÒÓ-ÔÕÕÖÖ×רÙÛÜÞßãâ-Mh[S^‚¥¯©§¨©§€pg[OwÊÆÆÈḬ́¹ËÈɃʀËÊîi‡‘^i€g fhg!Zÿd Úÿýÿ(*}ÿÅ ­hehfghfh= ×΃ЂрÒ%ÓÓÔÔÖÖÕé†+Z]„§¯©§¨©©¨¬Žqj]RT¢ÐËǬ}Z±ÐÉËÌÌËË€Ìʾ @$¬qehhghgi[ ½v Úÿýÿ(*ÿÿJ…‹_fgeeghNbÑÌÍÎÍÎ̓ΠÏÐÏÐÒË[ƒ¨¯©§ƒ¨ª›tj]PKpÁ¸”d3CÌÍÌÍÌ…Í ÎÍɸ‡Z©`i‚h j<1S Úÿýÿ(*ÿÿ«:¬_hdgfdh_BªÑʇË'ÊËËÊÊËÊÊÉÊÈËÆ®©§¨©¨¨©¨§¦¥¡yi^RBV¤N%]ÛÌŠÏÎÅ®c”Šaji je* Úÿýÿ(*ÿýû*š|_gcfebkDqЀÉÊ‚ÉÈÉÈǀƀÅÄų¦©€¨§¦¤£¡žŸf^PB?U,•ÝЃÒÑÒƒÑÎÁž8-±nhjijjijY Úÿýÿ()ÿùÿT£[efcded^BµÌ€ÇȀǂÆÅÄĀÿª§§¦¤¤¢ œ›„d\ND8'$ÂÚÔÕ‚ÔÓ ÒÓÒÓÒ͹ƒg›blƒjE Úÿýÿ()ÿûÿæ¦macebcdeC{ÐÅÆ‚ŃÄÃÀÁĵ£¤¢¡ž›š™˜••†cZMB7.$ BàÙÙ€Ø××ÖÖƒÕ ÔÔÓȰP šmjkjld Úÿýÿ()ÿüüÿaq•ZfaebbgUK¼ÇÄ€ÅÄÃÃÄÃÃÂÃÁÃÃ¥žš˜˜–”‘Ž…`TK@5+#xíÛÝÜÛÚÚ€ÙØ€×ÖÖÓÇŒyyillkklko8 Ûÿýÿ()ÿüýÿÈ$­acdadbbg=ŠÍƒÄÃÂÁ€Á$ÂÃÃÉ·”—–”’Šˆ…€]PG<2)# ±îàáààÞÞÝÜÛÛ€Ú‚ÙØÒµ-cwjmlmllkoTÛÿýÿ()ÿüÿþÿ=ˆ‡ZcdadadSQÃĂÀÂÁ„Á&ÂÃÄÅÆË¢‹ˆ†ƒ€}{\LB80'!(ßëææäãâáààÞÞÝ€ÜÛÚØÈAWtlnmlp_Üÿýÿ()~ÿüÿüÿ«@¦]bbd`cbb>–ËÀ„Â…Á5ÂÂÃÄÃÅÍÓ¯‡‰†ƒ€~zxusWG@6,$ ZûëëêéçæåããâáààßßÞÞÝÝÜÞÆ@eqƒnmnjÛÿýÿ((~ÿüÿþÿò!t_b`d`beL\ÆÁ„ÁÀÁ€Â4ÃÃÊ͵•…~{yvsplkRB;1)!™ÿîðïíëêèçæåäãââáààßßÛêœBvoponnomÚÿýÿ ((~ÿüÿÿûÿ‡Y¡Vea`c_c`?¡ÈÀÁÁÂÁÀ…Á6ÂÃÃÈͯ}n~‚{yvtqmjhgdJ<6-%ÕÿööôñïíìëéèçææåäãâáÞêÔVgtq‚poopjÙÿýÿ((~ÿüÿÿýÿÞ ¥k]ca`c_gGhÈ¿ÁÁÀ‚ÁÀÁÁ€Â5ÃdzgAZw{wurokhfda]ZC70)" 9þÿýýùõóñðîíìëéèççåâçðÈbcvqr€q ppqpriÙÿýÿ((~ÿü€ÿüÿawZ`ba_c`_?¬ÅÀ€ÁÀ‚Á6ÂÂÃÄÄÆ¼¡˜Šxkhiihfb_[WUQ:1,$sÿüÿÿýú÷öõòðïîíìêçéôÜUgxs€r qqpt\Ùÿýÿ((ÿü€ÿüÿÂ(­]c_ba_bbFqʾ€ÁÀÁÀÁÁÂÂÃÃÄÄÅÈÑÑÏ®‘r^€UWVQMG4-& ´ÿü€ÿþüû÷öõóñïìíøéŸ^Zvyts rsoz4Ùÿýÿ(({ÿü€ÿþÿÿ7Œ„Xd_ba_eWG³ÄÀƒÁ€ÂÃÄÄÅÆÇÈÊÌÓÙÝÖãwYD>AFA0)"èÿþ‚ÿýüûù÷óñüô°gVu|w€vuu‚tl}^Øÿýÿ*,ÿüÿûÿžC§Z`c^ab_h>~ʾ‚Á€ÃÄÅÅÇÈÊÌÍÐÒÕÜäìíÜ»^=$ !Jÿý„ÿþÿüøþýÃqVs€{xxwxw€v uvpo˜zãÿýÿ(+¬ÿýÿþÿò"žt\`c_baaXI»ÂÁÂÂÃÀÄÅÆÈÉËÌÏÑÓ×ÛÝàåïùÿúÜ¢]+  ‰ÿû„ÿ þýþÿ×€Vq‚}{zzyyxxwwxtm‰³w <öÿþÿIN¸ÿý‚ÿûÿx_Xb_c_bab@ˆÊ¿ÁÁ€Â!ÃÃÄÄÅÆÆÈÊËÍÏÒÔØÛÞâæêíðùÿþÿê´q4Æÿü‚ÿ þüþÿåYn…ƒ€~{|{{€yxo}­ž8q÷ÿþšÿýÿÞ «e`a_c^bdRQ€Á€ÂÃÄÄÅÅÆÇÇÉËÌÎÐÓÖØÛÞãæêîòöûüý€ÿúÔõƒÿýþÿìœbp‡Šƒ€‚}~}|€{ sv¤­Y+ŸÿýÿTv“Td`_d_ca?“ÉÀÁÂÀÄÅÅÆÇÈÊËÍÎÑÓÕØÛÞáåêíñöüÿÿþüûÿÿþÿýþÿò§iw’‘Œ‰†ƒ†€€€~wtš·y€3ŸÿüÿÂ-©a^c``c^gK\ÅÁÂÀÄÅÅÆÇÈÉËÌÍÏÑÓÖÙÜßáæéíðõúþÿþý€ÿ#ýþÿ÷³u~ž£“‘’ˆŠ‡ƒƒ‚|t¶“-4¢ÿ-7‘\_c``c_e;ŸÉÁÃÃÄÄÅÅÆÇÈÊËÌÎÏÒÓÖÙÛÞâåèëïòöû„ÿ%ýýÿû½€ˆ­·§œœ›•’‡‰†ƒyˆ³¦D £i7 ÿûÿžD©Wd^d`acbMaÊÁ€ÄÅÅÆÇÈÉÊÌÍÏÑÒÔ×ÙÜßáåèëïóøý‚ÿýýÿÿLJºÌ¾°©§¤ž—˜•ŽŽŠˆ¬µ_ €`ãÿj7 ÿþÿò" s]c_d`bd]A¨ÉÃÄ€ÅCÆÈÉÉËÌÍÏÑÓÔØÙÜßáåèêîñõùýÿÿýýÿÿÒƒs¥ÇÈÆÂ¸´¯¨¡¡––‹‰«¾z1Äÿùÿj7¡ÿ[ûÿx_ Ucb_d`bgFlÍÂÅÅÆÆÇÈÉÊËÍÎÐÑÓÕØÙÜßáåçêíðôöúüýþÿ݉gޝ²µ½ÃÆÄ½³¬ª¥ š¦Ç“)Ÿÿÿüùÿk7¡ÿ[ýÿÞ §j]cb_e_f[D±ÈÄÅÆÇÇÉÉËÌÍÎÐÒÓÕØÚÜßáäçéíïòôöýÿæ‘_{ž¢£¨«´ÁÇÈû¶°¨ž¬ÈªA xöÿýüÿûÿk7¢ÿGýÿT|Œ[`cb`e_j?yÎÃÆÆÇÈÉÊÌÌÎÏÑÒÔÖØÚÜßáäæéìîï÷ÿëš\m•”˜› ©±¹ÃÇÈÆ½¯µÎ¾[€Qâÿýü€ÿûÿk7¢ÿEüÿÂ,¯\e_daada]DºÈÅÇÈÈÉÊÌÌÎÏÒÒÔÖÙÚÜßáãæèéïþê \cƒ‹ˆŠŒ‘™ §­²ºÆËÄÅØÒt €;Îÿþüþÿûÿk7¥ÿL7‚Yf_eabdcBÐÅÇÉÉÊËÌÍÏÐÒÓÕÖÙÚÝßáãäè÷ë¦^\z…ƒ‡Œ‘–¡¦¯¸»ÃÝæ’­ÿÿüýƒÿûÿk7£ÿLûÿžE¨Xcd_f`cgUKÀÈÇÉÉËËÌÍÏÐÒÓÕ×ÙÚÝßßâñé¬bWs€}|~„‡‹“˜Ÿ¦¨¬Æåª/ôÿýü…ÿûÿk7£ÿJþÿò"žw[dc`f`ee@‹ÑÇÊÊËÌÍÎÐÑÒÓÕ×ÙÛÛÞêè±fTn}{y{}€ƒ†‰’™›œ¯×¶Dläÿýü‡ÿûÿk7¤ÿ<ûÿxbš\aebbf_kNSÆÉÉÊÌÌÍÏÐÑÒÔÕ×ר俶kRizxvxz{|~€…‰‘œÉ¾Y€OÍÿýûþˆÿûÿk7¤ÿFýÿÞ ­ed_fbce`j9—ÒÈËÌÌÍÏÑÑÓÔÕÖßä»qPdwvtuxxy{||‚…‰†Œ¸Âo1¶ÿþûýŠÿûÿk7¥ÿCýÿTx“Xf`f`edfRRÌËÉÌÌÎÏÐÑÑÒÛâ¿vO_tvrsuvvxyz|~ƒ€§ÀƒŸÿÿüüŒÿûÿk7¥ÿAüÿÂ+¯^dd`gagdf=uÖÑËÌÌÍÐÕÜßÃ~O[ptpqsttvwwy{{{w˜¼•/ ‡öÿýüŽÿûÿk7¨ÿ<7ŒˆXgbbgahdb8h¶Ð×ÙÛ×ȪzPXmsonqrrtuuwxx|zs‹µ£Cläÿýüÿþÿé×á¦ÿ1ûÿžF¦``gaefbidb<>?J[jpml€npqpstswxox£´i 1¶ÿþûý•ÿþýý§ÿûÿx\¢[fbhaicgefjkjkmmnkj€mnooqrruvoq˜¶|ŸÿÿüüÄÿýÿÞ ­iecegbibggfhihijiklkmnm€pruol޵% ‡öÿýüÇÿ3ýÿToVjaheegfghghjijkjkmlnonpsni„°œ7läÿýüÉÿ&üÿÂ$­gbiaicghfgihijijlklnmnqnhz¨¦J€OÍÿþüþÍÿ-7†[ggcgffhghjhikjkmlmpngrž®^ 1ÄÿþûýÍÿ-üÿ«7±fbidfhggihhkijlkknmgl’³r­ÿÿüüÏÿ+þÿò"•”^dgffhggjihkjjmmhg‡³„ ôÿýüÒÿ(ûÿ"Ä|]hhgfihhjiillhd}¯”0 oíÿýüÔÿ'þÿæKÏ\djihjjillics¨ BQâÿýûþÖÿüÿoMͤl\`ccfdaanŸ¨U€IÎÿþûþØÿ"ýÿÞ *¡Ë³’{yƒ’©­g2°þÿüýÛÿüÿ‡2|§µ¸³¬˜l“ýÿüüÞÿþÿ@€ € wöÿýûàÿ þÿï5 måÿýûãÿþÿ÷uƒOÍÿþüþÔÿüÿ¿GV‰SQUb.‡ )`_OQ—SVG¿ÿüžÿ·ÿûÿ`ŸÿûÎÿýŽüøÿ^žÿûàÿûÿ_ŸÿûÌÿýÿ³~ˆ…†‡‡†…€„ƒz&@Îÿüÿ~#4…1/.18CP?•ªÿüËÿüÿˆ4D@?@AA??BJUakqt}N“JÿýËÿüÿ†/@AEA<@HS_gloruy|‹;’æÿþÊÿýÿÇ¡¥“vWQ^fjmpsw|€„‡ŽŠ’¨ÿûÊÿþÿ¼†p\Yahkmqvz~‚†Š“•¥n’wÿû´ÿü’ûúÁNXeilotx|€„ˆ‘•™ž¢¤²?‘`ÿûÈÿþÿá“Ò¼llsvz~‚†ŠŽ“—› ¤¨¬°º¢ =ÿþ²ÿýÿØ ŽŸž£T•˾u|€„ˆŒ‘•™ž¢¦ª¯³·»¼Ð['´ÿûÿ`€É±‹Ž“—› ¤¨¬±µ¹½ÁÅÇÓ³)´ÿûÿbƒÊ¦šž¢¦ª®³·»¿ÃÇËÏÒÔãEXÿü²ÿûÿ`’šÌ¡£¨¬±µ¹½ÁÅÉÍÐÔØÛÛï”ÿû²ÿûÿ`“>¼Æ©´·»¿ÃÇËÏÒÖÙÝàãåîÔ7÷ÿþ²ÿûÿ`“ p×½»ÁÅÉÍÐÔ×ÛÞáåçêíîúCŒ5îÿþ³ÿûÿ`”(®ÛÃÌÎÒÖÙÝàãæéìîñóñÿ„Œ ÿú´ÿûÿ`”bÞÓÓ×ÛÞáåçêíïòôöø÷ÿ¿Œžÿû´ÿûÿ`—'²éÙàãæéìîñóõ÷ùúûûÿÿû´ÿûÿ`• mìåçêíïòôöøùûüüþÿÿû:‹žÿø‚üþ®ÿûÿ`—3Éõìñóõ÷ùúûüýÿÿþêǶM‹Ÿÿû´ÿûÿ`–ŽûòöøùûüüþÿÿöÚ¹¢˜£f‹r³€¶·±äÿþ«ÿþH#˜SéüùûüýÿÿþëÊ­šš—™x€‚‚€ ¥ÿû¬ÿ'› (¾ÿúþÿÿ÷Ûº£€š –’Ž‚† ¤ÿûªÿôì7 ™(ˆÿþþëÊ­šš˜”‘Їƒ„!8 "' ¥ÿû¨ÿýÿ¡_ko ™&Uë๣›šš–’Œ‰…‚z€13CE>T]aa]WG*  ¤ÿû¨ÿüÿw'%š&/Á±•›˜”‘Ї„}{wswI,EA8;Kcjkjihihg_G € ¤ÿû¨ÿüÿx)]W˜Ä”Œ‰…‚|yvspmmX<9AOckjhhgffgeP¥ÿû¨ÿ üÿt#u²Š — tЊ‹‡„~{wtqoliffUBUhmlihh€g feffL ¡ÿû¨ÿ üÿ‡w½°‘)™MÍ“€|yvspmjheb`^Xdpljjijj€ihg€f efd=235$²ÿü§ÿþÿÙ˜Á­¡¤Sš2º§rytqolifda_\ZXQbmke`aa^`gg€fefatÿûªÿ þÿè”Ê·­µÂˆ—,"œ½krmjheb`][YVTSN]nkkecy𢧥‹cchffedfR ¼ÿü©ÿ þÿÚ¢àÀÈÐÞÁ=–$|Ìphgda_\ZXUSQONHZnde~ž„R<:U’´qbgeg8,íÿþ©ÿ þÿŸÖãâëóñ€ —% +bË„[a][YWTRPOMKJGOkƒŸ€<  R³jdfee€d]ÿü©ÿ ýÿÑ­ÿõüþÿÏ9•/(>;Qº¡Q\XUSQONLJIHGAV¡x3 #>LLC/Y¦]geeddeX ¬ÿüÿü‡ûþÿ þÿžëÿÿòÏ¡O ’)7N=›áÑÒÒÐÏÎÍÌÌȽ‰%1«c€dc^ÿüŠÿ2… Úÿý‹ÿüÿˆ>SC1>f_`_\`lj-FYbb`^\[VJFe‹ÃR>CB$CDEGIMDˆÞÑÒÒÐÏÎÍÌÌËŲh lšZfcdbcdV ¬ÿü‰ÿ2… Úÿýÿïà+K5¥ÿûƒÿ?þדr…vfgd`_]\YOH`€¾s8DBBCEFHJLOSLyÛÒÓÑÑÏÎÍÌËËÉÁžBw_dcbcce=éÿþˆÿ2… Úÿýÿ)L- J¢ÿ÷ùùýÿï¤lf‚ ¤–lfeca_ZWQK[~«—4EDEGIKMPSUYXnÔÓÒÑÐÏÎÌÌËËÊÆ¹ƒ>ª_dbccbcb^ÿüˆÿ2… ÚÿýŽÿþ)J- A¤ÿúþÿã—jp”­¬£Ÿ¡Šghe`\cwnLX”²=HHJLNQTWZ]achÉÖÒÑÐÎÍÌÌËËÉÈía y“Yd€cbdV ­ÿü‡ÿ2… Úÿýÿ)H, L¥ÿþΆds¯­§¦¦¥ ¡~ddm|zIHY~¿THNPSUX\_bfini»ÙÑÑÏÎÍÌËËÊÉÈÆ½™:¤o_dcbbcd<éÿþ†ÿ2… Úÿýÿ)H,€ ¡Êt_tœ¨€¦@¨©¨¦¥ž˜yE >Z}x¸uIUWZ]adgkorxp¬ÚÑÐÏÎÍÌËËÊÉÉÈĵ}K§\cbbcbcb]ÿü†ÿ2… ÚÿýÿW)F,  L`t˜žŸ ¡¥§¨ª¥¢¶É“;'B]X{w¤–M^_bfimptx{zžÚÐÐÏÍÍËËÊÊÈÈÇÆ¿¨Z †‹ZdbbcbdU ­ÿü…ÿ2… ÚÿýÿN)E+  'Gw‹—¯²±°µ£w{r²†qz}„ˆŒ’–˜žÄÔÏÎÌÌËÊÈÈÇÇÆÆÅĽ¤R ‘ƒ[dbcS»ÿüƒÿ2… Úÿýÿ )C,T~~€„‡‡„°À‰4 *M~¶å÷¿­³²)vo¢¡w„†Š‘”—š ¦—¸ÖÎÍÌËËÊÈÈÇÆÆÅÅÄ·+,«da‚bd6.öÿþ‚ÿ2… ÚÿýÿC)H%Pz}|}€‚|‰¬µ€+.T‡Àéûýÿô·°³²±¶rr¶’–™œŸ¡¤¦« «ÖÍÍÌËÊÉÈÈÇÆÅÄ¿®qfXdbc`rÿû‚ÿ2… Úÿýÿ:(+ 2v|zz|}}~y£­t$3[’Èîûýþÿþÿë°²²±µ_otz¿”—š £¥§©«®©¥ÚÍ€ËÉÈÇÇÆ€Å€Äú Kš{\c€bacR »ÿüÿ2… Úÿýÿ'c~vyzz{|{yž} 8eœÐñûýþÿ"þÿß­²¸šhvl¸£™Ÿ¡¤¦¨ª¬­®¯³‘®ÔÓËÊÈÈÇÆÅÄÀ´‰$7«`ƒb d5/öÿþþÿÿ3€ Úÿýÿ' }uxxwzzyy‰i=c¢Ùóûüþ„ÿþÿÓ©À_Syg¥µž¦§©«­®¯¯°®¸‰rËÉÈÇ€ÆÅÅ‚Äý«j s–Xdbc`rÿû€ÿ*€  Úÿýÿ'8zuvvxwxyzu U‡Ñõûüþ‡ÿþÿÈ«!2xfÁ£«¬­®¯° ®²¡,lºËÉÈÇÆ€Å‚Ä ÃùœC¡t]cbdP ¼ÿüÿÿQ+42215 Úÿýÿ';ƒqvuuwwu€LS—èüüýŠÿ ýÿnjyꮯ¯€°¯¯®­®¢©àÏÉÈÇÆÅŃÄÿ²„Eª\cbcd15ÿþ„ÿûÿh Úÿýÿ'<œottutvuyI*‚áûùúûþ‰ÿ üÿU[oi¼²¯€°¯¯®­«ª©¤šÊÉÉÈÇÆÅłĂü¨c €Ydbc_‚ÿûƒÿûÿh Úÿýÿ'­wrtsust{G9®õóôõøúûü†ÿýÿÝ Asaª»®°¯®­¬«©¨¦¤¤‘ÃÌÈÇÆ€ÅÄÄ…ÃÂÁ·˜<§m_cbbcbdMÎÿý‚ÿûÿh Úÿýÿ'}œhtsrtsvU<¾öïðòóöõùüþ„ÿûÿ‡%p_”À«®­«ª©§¥£¡žŸµÎÇÆÅŀĆÃÂÿ±R¦[cbce.<ÿþ‚ÿûÿh Úÿýÿ'1²nqqsqrwc<°óëíîðñóööùüýþ€ÿþÿú,db}¾©«©¨¦¤¢ ž›™™Š¢ÏÅÆÅ€ÄƒÃ‚Ã»¦] ŒˆZd€cbd^‚ÿûÿûÿh Úÿýÿ='–Šjrprqqs?ˆëêêìíîðñòõöùþþÿÿüÿµRgjµ¨§¥£¡Ÿš˜•’ЉËÅÅÄÃÂ…ÃÁ¶•4'«ha‚ceKÏÿý€ÿûÿh Úÿýÿ@'J®gpqopptVZÒëçééëìíïñòö÷ûýþüÿW@-1l^¦¨¡ ž›™–”‘ŽŒˆ‹h ÍÃÄÄÃÂÀÃÂÃÃÄÃþ¯z_¢Zeccdcce*=ÿþ€ÿûÿh ÚÿýÿF' ¥}knpnnsiE¢êäæçèéêìíïðòõöøÿß J¹ÿÊ$eY‘¨›š˜•’Ї„oTÅÄÃÃÂÃÂÂÃÃĈ ÄÃÄû¤V–\edcdcd^˜ÿûÿÿûÿh Úÿýÿ?'h¢dplonmuLjÛäâäææçèéëìîïñðÿxiÒÿÿûÿ‰EUv¤””‘ŽŒ‰†ƒ€}zvy>‚ÏÁÂÂÀÃĵ‘-2¬dc‚dfHßÿýÿûÿh ÚÿýÿA(* ¯oknlmnngC³æßáââäåæçééëíïïšØÿþüüþÿô`E]šŠ‡„~{xurnpU<µÆÁÂÀÂÃÂÃÃƒÄ ÅÄÅ¿­umZfdef'Iÿýÿûÿh Úÿýÿ?(>‚“dlmklmoIußÞÞßààáâãåæçèêêúøïôùüÿüÿ¦5HˆŠ†ƒ€}zwtqnkig^5jÊÀ€ÂÃÄÂÄÅÄ»¢OŸ{_fdeedf]˜ÿûûÿh ÚÿýÿD(:65¯emjlkjp]I¾ßÚÜÝÞÞßßáâãäæçæéíîñôúýÿóN/q†}{xurolihcZYa[;žÊÀÃÂÃÃÄÅÆõŽ&?­befehEßÿúÿh Úÿýÿ?(,B—„clikkhoA…ߨÙÚÚÛÛÜÝÞßàáâäåçèêíñõ÷ÿ£V€vtqnkhgaW]yzulMYÀ€Ã„ĀůůÇÀ®o{—\gef g$Jÿùÿh ÚÿýÿA((›O¨aijhijkZNÈÙÖ×רØÙÚÚÛÛÝÞßàáãåæéìïöò82wolige_V]~¢°ŒumbF‡ÌÂÄÅÄÅÆ€ÇÈǽ¡G§ub‚f g] §ÿÿh Úÿýÿ()…ñ §sfgihhjhA’ÜÒÔ€Õ€Ö,×רÙÚÚÜÝÞßáäæåü•jied^T]€¤¯©ªœyodWS²ÈÃÅÅÄÅËÉÆ€ÇÈȃÉÆ·‹ L¬_hfg hC"åÿg Úÿýÿ(+|ÿlkœ]jfhhfnOYÍÓÑÒÒÓÔ)ÕÖÖרÙÚÜÝßãâ-Mh[S^‚¥¯©§¨©§€pg[OwÊÆÆÈÎͰ¹ËÈ€É€Ê€Ë ÊËîi‡‘^ig hg!Zÿd Úÿýÿ(*}ÿÅ!¬heifghfh= ×ÍÐÐπЀÑ*ÒÑÑÒÒÓÓÔÕÖÖÕé†+Z]„§¯©§¨©©¨¬Žqj]RT¢ÐËǬ}Z±ÏÉËÌÌËË€ÌʾŸ@$¬qeh gi[ ½v Úÿýÿ(*ÿÿJ…‹_fgeeghNbÑ̂̀ÎÍ̈́΀ÏÐÑË[ƒ¨¯©§ƒ¨ª›tj]PKoÁ¹”d3BÌÍÌÍÌ…Í ÎÍÈ·‡Z©`iih j<1S Úÿýÿ(*ÿÿ«:¬_hdgedi_BªÑÊŠË$ÊÊËÊÊÉÉÈÊÆ®©§¨©¨¨©¨§¦¥¡yi^RBV¤N%]ÜÌŠÏÎÅ®c”‹aji je* Úÿýÿ(*ÿýû*š|_gceebkDqÐÈÉÉʂɃÈÇÇ€ÆÅÅÃų¦©€¨§¦¤£¡žŸf^PB?U,•ÝЀÒÑÑÒÒÑÑÒÑÏÁŸ8-±nhjijiijY Úÿýÿ(*ÿùÿT£[efb€d^BµÌƒÇƒÆÅÄĀÿª§§¦¤¤¢ œ›„d\ND8'$ÂÚÔÕ€ÔÓÔÓ ÒÓÓÒÒ͹ƒgœblƒjE Úÿýÿ()ÿûÿæ¦mbbebcdeD{ÐÄÆÆÅÆÆ‚Å€ÄÀÁĵ£¤¢¡ž›š™˜••†cZMB7.$ BàØÙÙØØ×ƒÖÕÕ€ÔÓȰP šmj‚kld Úÿýÿ()ÿüüÿaq•ZfaebbgUK¼ÇÄÅÅ‚ÄÃÃÄÃÀÂÁÁ€Á'ÃÃ¥žš˜˜–”‘Ž…`TK@5+#xíÚÝÜÛÛÚÚÙÙØØ×ר׀ÖÒÆŒyyhlklklko8 Ûÿýÿ()ÿüýÿÈ$­acdadbag=ŠÍƒÄÂÁ&ÂÃÃÉ·”—–”’Šˆ…€]PG<2)# ±îàáàßÞÞÝÜÛÛÚÚƒÙØÒµ-cwj€m llkoTÛÿýÿ()~ÿüÿþÿ=ˆ‡ZcdadadSQÃĀŅÁ'ÃÄÅÆÌ¢‹ˆ†ƒ€}{\LB80'!(ßëæåäãâáààßÞÝÝÜ€Û€ÚØÈAWtm€n mmlp_Üÿýÿ!()~ÿüÿüÿ«@§]cac`cbb>–ËÀÃÂÁÂÂÁ†ÁÂÃÄÃÅÍÓ¯‡‰†ƒ€~zxusWG@6,$ Zû€ëéçæåäãâáààßßÞÞÝÜÛÝÆ@eqnnonojÛÿýÿ()~ÿüÿþÿò!t_bad`beL\ÇÁ„ÁÀÁ€Ã(Ê͵•…~{yvsplkRB;1)!™ÿîðïíëéèçæåäãââáà€ßÛêœBvƒonnomÚÿýÿ((~ÿüÿÿûÿ‡Y¢Uea`d_c`?¡ÈÀ‰Á6ÂÂÃÃÈͯ}n~‚{yvtqmjhgdJ<6-%ÕÿööôñïîìëéèçæååäãâáÞêÓVft‚p€opjÙÿýÿ!((~ÿüÿÿýÿÞ ¥l]ca_c_gFhÈ¿ÀÁÀÀÁÁ€ÀÁÁÂ4ƲgAZw{wurokhfda]ZC70)" 9þÿýýùõóñðîíìëéèççåâçðÉcdvqrƒqoqiÙÿýÿ((~ÿü€ÿüÿawZaba_c`_?¬ÅÀ€ÁÀÁ:ÂÂÃÃÄÄÆ¼¡˜Šxkhiiheb_[WUQ:1,$sÿüÿÿýú÷õôòðïîììêçéôÜUgxrss‚rqpu]Ùÿýÿ((ÿü€ÿüÿÂ(­]c_ba_bcFqʾÁÀÀ‚Á€Â ÃÄÄÅÉÐÑÏ®‘r^€UWVQMG4-& ´ÿü€ÿþûú÷öôóñïìíøèŸ^Zvx‚t ssrrsoz4Ùÿýÿ(({ÿü€ÿþÿÿ7Œ„Xd_ba_eWG³ÄÀÀÁ€Â ÃÃÄÄÅÆÇÈÊÍÓÙÝ×ãxYD>AFA0)"èÿþ‚ÿýüúù÷óñüó°fVu|wvvuu‚t sl}^Øÿýÿ*,ÿüÿûÿžC§Zac_aa_h>ʾ€ÁÂÁ€ÂÃÃÄÅÅÇÈÊÌÎÐÒÕÛäìíݺ^=$ !Jÿý†ÿ ü÷þýÃqUs{xx€w‚v po˜z ãÿýÿ(+¬ÿýÿ þÿò"žt\`c^€aXI»Â€ÁÂÀÄÆÆÈÉËÌÎÒÔ×ÚÝàæðúÿùÜ¢]+  ‰ÿû„ÿ þýþÿ×Vq‚~{€zyxxwwxtmˆ³w <öÿþÿIN¸ÿý‚ÿûÿx_œXb_c_bac@‰Ê¿ÁÁ€Â!ÃÃÄÅÅÆÇÈÊËÍÏÒÔ×ÛÞâæéíñúÿþÿê´q4Æÿü‚ÿ"þüþÿäZn…ƒ}~~{|{zyyzxo}­ž8q÷ÿþšÿýÿÞ «e`a_c^bdRQÁÂÂÃÃÄÄÅÆÇÈÉËÌÎÐÓÕØÛÞâåêîòöûüý€ÿúÔõƒÿýþÿìœbp‡Š„‚}~}}€{ sv¤®Y+Ÿÿ7ýÿTv“Ud`_c_cb?“ÉÀÂÂÃÄÃÄÅÅÆÈÈÊËÍÎÑÓÕØÛßáæéíñöüÿÿþüûÿÿþÿýþÿò§iw’‘Œ‰‡„†€€€~wtš·y€3ŸÿüÿÂ-©a^b``c^gK\Å€ÀÄÅÆÇÈÉÊËÍÐÒÔÖÙÛßáåéíðõúþÿþý€ÿ#ýþÿ÷³t}Ÿ£“‘’ˆŠ‡ƒ„‚|t¶“-4¢ÿ7‘\_c`ac_e;ŸÉÁÀÄÅÅÆÇÈÊËÌÎÐÒÓÖÙÛÞâåèìïóöû„ÿ%ýýÿû½ˆ­¶§œœ›”’Œ‡ˆ†ƒyˆ³¦D £i7 ÿûÿžD©Wd_d`acbMaÊÁ€ÄÅÅÆÇÇÊËÌÍÏÑÓÔ×ÚÜßáäèëïóøü‚ÿýýÿÿȇºÍ¾°©§¤ž—˜•ŽŠˆ¬´_ €`ãÿj7 ÿ\þÿò" s]d_d`bd]A¨ÉÃÄÅÅÆÆÇÉÊËÌÍÏÑÒÕ×ÙÜÞáåèëîñõùýÿÿýýÿÿÒƒt¥ÇÇŸ´¯§¡¡–•‹‰«¾z1Äÿùÿj7¡ÿ[ûÿx_ŸUcb_d_bgFlÌÂÄÅÅÆÇÈÉËËÍÎÐÒÓÕØÙÜßáåçêíðôöúüýþÿ݈gޝ²µ¾ÃÆÄ½³¬ª¥ š¦Ç’)Ÿÿÿüùÿk7¡ÿ[ýÿÞ §j]bb_e_f[D°ÈÄÅÅÇÈÈÊËËÌÎÐÑÓÕØÚÜßáäçéìïòô÷ýÿæ‘_|ž¢£¨«´ÁÈÈü¶°¨ž¬ÈªA xöÿýüÿûÿk7¢ÿGýÿT{Œ[`cb`e_j?yÎÃÆÆÈÈÉÊÌÌÎÎÑÒÔÖØÚÜßáäçéìîï÷ÿëš\l•”˜› ©±¹ÃÇÈÆ½¯µÎ¾Z€Qâÿýü€ÿûÿk7¢ÿEüÿÂ,®\e_daaea]CºÈÅÇÈÈÊËÌÍÎÏÒÒÔÖØÚÜßáãçèéðþê \cƒ‹‰‹Œ‘™ §¬²ºÆËÄÅØÒt €;Îÿþüþÿûÿk7¥ÿL7‚Ye_eabecBÐÅÈÉÉÊËÌÍÏÐÒÓÕ×ÙÚÝßáãäè÷ê¦_\z„ƒ‡’–¡¦¯·»ÄÝæ’­ÿÿüýƒÿûÿk7£ÿLûÿžE¨Xcd`f`cgUKÀÈÇÉÊÊËÌÍÏÑÒÓÕ×ÙÚÝßßâñé«bWt€}|~‚„‡‹“˜ ¦¨«Æå«/ôÿýü…ÿûÿk7£ÿJþÿò"žw[dc`f`ed@‹ÒÆÊÊËÌÍÎÏÑÓÓÕ×ÙÛÛÝêè²fTn}{y{}€ƒ…‰Œ“™›œ®×¶Cläÿýü‡ÿûÿk7¤ÿ<ûÿxbš]aecaf_kNSÆÉÉÊÌÌÍÎÐÑÓÓÕרØäæ¶kRizxwxz||~€…‰‘œÉ¾Y€OÍÿýûþˆÿûÿk7¤ÿFýÿÞ ­ed_fbceaj9—ÒÇËÌÌÎÏÐÒÓÔÕÕßä»qOdwwtuxxy{}|‚…‰†Œ¸Âo1¶ÿþûýŠÿûÿk7¥ÿCýÿTx“Xf_g`edfRRÌËÉÌÍÎÏÐÑÑÒÛâ¿wO_tvrsuvvxzy|~ƒ§ÁƒŸÿÿüüŒÿûÿk7¥ÿAüÿÂ+¯^dd`gagcf=uÖÑËÌÍÍÐÔÜßÃ~O[ptqqsttvwwyz{|w˜½–/ ‡öÿýüŽÿûÿk7¨ÿ<7ŒˆXgbbgahdb8h¶ÐØÙÚ×ɪzPXmsonqrrtuuwxx|{sŒ¶£Cläÿýüÿþÿé×á¦ÿ1ûÿžF¦`agaefbicb<>?J[jpmlnon€qstswxow£´i 1¶ÿþûý•ÿþýý§ÿûÿx\¢[fchaidgef€j#kmlmkjlmmnooqrrtvoq˜¶|ŸÿÿüüÄÿýÿÞ ­ifcegbjcggfhihijiklkmnm€pruol޵% ‡öÿýüÇÿ3ýÿToVjageegfghghjhjkjkmlnonpsni„°œ7läÿýüÉÿ&üÿÂ$­hbiaicghfgihijiklkmnmnqnhz¨¦J€OÍÿþüþÍÿ-7…[ggcgffhghjhikjkmlmpngrž¯^ 1ÄÿþûýÍÿ-üÿ«7±fbhdfhggihhkijlkknngl’²r­ÿÿüüÏÿ+þÿò"•”^egffhggihikjjmmhg‡³„!ôÿýüÒÿ(ûÿ"Ä|]hhgfihhjiilmid}¯”0 oíÿýüÔÿ'þÿæKÏ[diihjjillict¨ BQâÿýûþÖÿüÿoMͤm\_ccfcaanŸ¨U€IÎÿþûþØÿ"ýÿÞ * Ê³’{yƒ’©®g2°þÿüýÛÿüÿ‡2|§µ¸´¬˜l“ýÿüüÞÿþÿ@€ € wöÿýûàÿ þÿï5 måÿýûãÿþÿ÷uƒOÍÿþüþÔÿüÿ¿GV‰SQUb.‡ )`_OQ—SVG¿ÿüžÿt8mk@#6HVm´b=`…ªÇÛëûÿÿÿÿÿþÿ½%aŸÎòÿÿÿÿÿÿÿÿþýüûüýûÿË -€Íûÿÿÿÿþûûûüýþþÿÿÿÿÿÿÿùÿ“%lºî­»þÿÿÿûûýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþú-3~ÉúÿÿÿÿÿþûýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿŽ=×þÿÿÿûüþûüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÚ D”Þÿÿÿþûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ3@–âÿþÿýûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿcVÛÿÿÿýûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ‰Úÿûûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ¢åÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ­àÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ§"–óÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ“öÿþûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûÿG zïÿýûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúÿLÛÿýûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüûÿ«ÿþûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûÿüm]íÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýûÿÝ:§ÿýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûþÿœDâÿûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüÿÜF}ÿþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüÿù‰ ²ÿûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüþÿ¹*,ÛÿûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûþÿØQIñÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýÿén `ýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿð‡LltaB]ÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿô‘ U¿ùÿÿÿþÿê‘–ÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÕuÛÿþÿýûûûýþÿìK÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿË/–îÿþüüþÿÿÿÿÿþûÿûR»ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿí¶úÿþûýÿÿÿÿÿÿÿÿÿÿýÿ÷3'ÛÿûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþûþÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÑ 'âÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ ÒÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿHéÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÚÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýûþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ—%ôÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýûýÿÿ÷ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿP—ÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýûýÿÿÿÝ%Hÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿß(÷ÿþÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿýûûÿÿÿÿà˜CÊÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿž˜ÿûÿþüûûÿþþÿÿÿÿþýûûþÿÿÿûÒ‹= ‚ëÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿS(öÿþÿÿÿÿøõþúûûþÿÿÿÿÿä¬g(4¡ôÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿà•ÿûêÄ“^KÿÿþÿÿñÒ£i2 N¿ýÿþûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿŸI.^Šm]6l×ÿÿýûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿR$‹ëÿþüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿß;©ùÿþüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿUÄÿÿþûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿNoÚÿþýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÛ!Šëÿþüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ–0£÷ÿþûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿI=¶üÿþûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿتþÿýûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ‘CçÿüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿEBøÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÔ áÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿœÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþA#òÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÑ gÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ‡—ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿû8 ©ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÈžÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ|ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷3 ]èÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÃK¸ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿv=†÷ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿò)+aÏÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¸Hšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿk 3màÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿî#P­ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ±:{îÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿc&YÀÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿçAŒùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ§ -cÒÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿXIÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿâ 4pãÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ  Q°ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿR<~ðÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÜ'ZÄÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ•CûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿG /eÕÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÕ K¡ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿn 5ræÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÄ"S´ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿö%=òÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿR(\ÈÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿmD’üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿv 0hÙÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿrL¥ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ[ 7uéÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿè:#U·ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ¯% >„ôÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿîf!*^Ëÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿù™DF•ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿò§c/ 1iÛÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿüØ r@M§ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿç·’qD8wêÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿòÅžƒb:$VºÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿùÒ§‹oJ)?†öÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿýݱ’xV3 *`Ìÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿ纘€_< F—þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿðÅŸ†hE& 2kÜÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿ÷ЦŒpM-N©ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿûÙ®‘wU4 9wêÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþâ¶—~^; $W»ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿ꾜ƒeB%@†öÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿñÈ¡ˆlI*+`Ìÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿ÷ѧsP0 G—þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿûÚ¯’yW6  2kÜÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþã¶—~_€ðÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿ滚‚dA$(\ÁÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿjG)D‰óÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿôˤ‹pM.  -c»ÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿøÓªuT3 Jƒ×ÿýþÿÿÿÿÿÿÿÿÿÿþþÿûܰ“{Z8  +d–Ûÿþþþÿÿÿÿÿÿþþÿþä·˜€a>"|]Ì®Agñ¹0…¥6µ‚~œCo>]ŸbùÛÁÀÉÑÄXxQ{F'Rx*wT¬ÃçjÓòæ ˜ƒÙr 495½ §(¸C ’Ëùˆê䀱ÐÁŠÞã7­†|'FÂ.î+­I­ü&1yÀ*éP¥A">íæîÜ|KD<×ëäþgµDºRY¨mü¦Ãí'‡ÚCÚ>|Ai±§âz{{‘Õœ3&«æýJÛ"àô“Rx «'²Ä8Úm¶ÐuM%‹}ç%.™Z ?Mž=K3Ë G&ôn$˜_§z!Œ=긢#a¬ý9n­4c ÂÁBN=°|±txÞFÏÌò~gñù €]ÚöM:ÿt<1á†*Ãsr‹Â)6פÍp‘ˆŽ€K`;bŸL4²‡3+ÄRЪmF⦶ÍA)¸* *ƒ2e;ýÌÿg6Zÿ[n¼ÿ`ðÓ”Íä1_Í»Møÿ$H7Bë©ÝÄgè4‡uü‹ó,0gï!Òöœ«;Ü¡dɯÎ&uw¿"TÐa—Öbò’¨þ‡¼f€éhÊr¤ Ȱ‰&§©4²¯×ßPfÖÂL¯¬RŽ…“¾?0ÏÎퟷÒë:±"•rëCþPÒ«#:>]¦sST<Ç¥·“Ï—Ôˆæo6np‹TŒ´lÄpÿ'¬Â;sžÕ!—US ôÒhž—mèƒf>þî€TãœÒùö×V!z=¦T~›‹óã(]i²ÌhÏÑf»lºL écw³æ“"¡ýìã\¡åšÏéV ŸJhðçfÝô¡Œe¥rõ-:‘¨I­=Ä ƒašÒ/>³Ï “6–ëÿ…Œš_eóÏuÿ& bÉÍçl‚ýIù0:‡gBo1»ÈBòýÕg•TZø&ú¥ƒ¨¶Âõ™hwdeQ›çïˆ2_†ж@ž‘cLË_%;µøZm­U´ò‚Xz–È î»0éiæfúÒ£<D6ˆà—\ cåÈ@û—ç“IâÓ/ìwJ—ë²H÷¾ð„Pˆ¹&§VÓÌï9¦‡vá6":ÑÑÝÃz¥æ!¸O{¢´bJO_ÐÒ@Cy“-ˆ¢zGð†;’[TËåòX:ô¸ŠN ·;';4,—Ug2äbuˆìu(=Ò{ÐI½ÅûN=ÁJÎûïs‹{¢w¤ÚìÂD7 ›zÃæùq Ƨð¯Ä•=1az±+x¦šý‚ž^W›R Œ Ý®ìd³Á^]í÷üp8\ ›+Ðöʧ¯ (ÂLMñrnU6™éçh¢Èûé&Ñ]¹K;Ág7ä6‹Âýë?Ëœ7cÒT¦éÖ/#Ô_—jüÓÂ}¸dòèã~î°=„8…öÅ´˜±#3 t¬fu#¤”½mj`ü{ˆÃ^Ô÷ê¼Fz“p"â€lÕ êª)Ûíù<„Lb½òÅùQcTòº†™ôƒ5ÃàVõÆvò"÷yÌÃóF1kÛÌÇj¬GE•{Û¶ Æ·dñL0ëÖ0×ij7‹`~ g1Г“PŽ£ñŒÑ‘Ë#Wx9ý~ÛÏϪøü:‰‡áÔ°ÍÚÐU<&Näplj¸W½ ƒc'‡ö³ DÖ acûò0œ'Ô€Ëê¶ý/ð9"=0ü—¬CcvùÎR‹Çÿd}´¿h …h5þíÏS…e`\&Ë»w£ 2/Hï’ ße:~ºUVÇq¡Bû#”Ê®Á—:jÖ·ŽGDÜü‹…½ÑÝñ¹—Š Ð¤Ð" ã Ö"ŸIÙ¥·CO™s²QËQЬÿLè¾ùyYƉ7#èqoòãȃBÜ6¦|-LL·>û3^ïNuñO¾Ö¾)íj>ÝH†1ë¼¢ïù’%øùAîˆ1¥»›C«*ÎZm.&óJ{úù“ZŽÝB†Øª6©ØÅžKË W9á}›À²Z 9Ë®Ka2^¤¼¼K×°˜Æ³? y;5ŽÁŒËÍä5.D݉™P &ã!ï`а~#<¨ñ±“˜Â¬ü¸P¦—lͰ'•¶iE\+ä¡Cs¬‰%±á%çdm•úU¹å'6_7ï·ƒŽfyÇ*9Â#jw\#¡ËÛž¾‘Rܪ¦^–ªùšÇ”ßì#.+\Zãi ¥ryêùŸz1_»|kÙWÃgÐõ¤¬.ÂÙTqöÔÎ̼’ƒa»?'W )J¸M“S´×§ø¿æ×m¯i÷*O4Z:¾þšq/‡²Ñ˜ËÓûÌbór¶^ð×d}f¥î`úÆZÊÅLªã¶¯sG\Œý±bpH"+qËuÑ+˜þÝ]Šuü¡Îä>zX8¼«ÍbU.aÕ‰¾lÒÈ^šBÂa:*$= @…Ç["Úvr C¥n¢“ø.jC ºEôá‹Qºd1\p[sZ-x@Æq}°/%Ǧ8ÕñV•Ƴ’ö o§¯–-ÏÕÚ5‘Á¦ˆü.Ã|)›AÒ…ßMM¾˸߮ÿQSg2=‡>ñ<-ÂÅL4XÕùónxµ<Ë-2¢R‰ê>¬Ðº¬/µu•0Ó9§díNÎà5Œ‘1Ç1ºÀdsj ïâ€$äðŠä`xÓ,Û1CGÐ$P!·Ì:‰B¬úø;öÝŽ¥ÇƒÕJv;:Õ˜rºvü{ ã7Ãû'¼¸åìU8Ø5Pq UúÛ?dlAÁà3FåÛÙæÆ=‘›3£j"JQ•v¥ìlÀõ6Ú^ŒfeÕQYG5Žßˆ§Æi÷Ã9ÒšÆ\†‰R àÁ-㪖xv@ÀfNØÊÁ›¶ÎôPæÐ™žhÂà€…%Q‰#oÃÓˆ4…¢HÉ{Ú,,i¿©Ë­A“ —ôo̪]¤W\ 7-Cåêè1ïhw¬´çfðE™‚X­¥‹9\@Ñœ$Õ¤>ãtj#ÜùÈ4QCœ½¼Ì(7-a|0ÄÄQw½7Ïw}·‡Ǻs‚-ͧÉ& ñ!C€÷å‚ÈPÇ—Ò\Bð©CÓdÁÍ(¨}²ð¸·ëÁ4>&{¶ ­ŠJ´P~ØgH…Ï™{zȶ)¯qNÔÅBYÐú¢ªy06ß{8 U±þä^¢ ½ à„AH+®'úÄÔP²Þ\DY«aK N#€+QoS(Ж#Oé×sYÈ9Ág«Oð¸̰Qh†ÂßK+´B7"d¡iË`íZ6‰oØK[HÂxc÷Õ¦;wÂRЃ!ŽÏa5ßgl6çmÃgðÍ”ºÌÉ TEø ý4Ëžå Ôm«“ÿ-˜‚(Ÿ:v©‡-XM½åY Ýw`—¦–Ûèt-<ŠÚ È{ʵ„ÒíÏæÂî^woóHxs‘ÚñQoN£9 é躖ÜTY Ðv8¢éh"âRG°à»{´æ7 )¨ÀBÍqevh˜êfJ|~ýϵ r}~„-æü÷ˆ­>õNà ¤èÊ¥yÖ9íÀî) š¹W!9â0µ\ fÓäÈçJ÷@H‘ ªß’(ÉXXú¡®}œ@‡zÿ7÷[¿Ûÿ@àm¹Í•ª%#%¶o¹“ß[%nâ|Š%Ö¿>á_­c·(`]¾·8ªZà2 x0t&ŒaèM÷²Ç+¼óÃE‚±œ•'®Ÿ~cI8kœ«¼U ûCÔ¨}@nÝ׊D Fæ•ç‹#à]£ÓÛq×ÌCÊ¥MÒïm/­Q lï[,ÀӠ麀 âõáÄa5ç†È{ÊO'õÉ$Ûhv»§ÒÃÙ“Sü“qa!K–§.ïx:ï½æ•UâzrûV)[Zß&)V¤¡ =ébh[F\žÁ:^€ÓçZlžŒ7y¯÷€—/“Úg´) d¾Ž5šŽX|o›a^7tèFé‡0ÇÍn«„ƒ°¢";"(!¤]hv µAiìžÁ,®ô[ v[êœÚ©ðGÈÆU±ðcÒ7ÐÙŽà7ÿ\Ö½úíhçûÎX#àäÍŸT¾=вœ$³ò±ÞT3<òþV'ˆ¸&L·ÍÃí¼áöÝ0}·È`½urá½Õ©-ø¤7Žà¨ãh?ú/ª+:Ë4H,EË¥Ž\åw§™òcšñ4-jN?#¿k§NEŸ«Ç˜Þ†Ò·tÆúµWµ Ø!PÕçI“þ‘Þ,‘YÞ_A (Þ±ñçÂû÷þKû¹»î:ùçÙµ@ª ¥¸µEqûà )ûðüªˆ ÌÙ¨&aÁÞ)ÜÒp t„„{I…Zuã1¤¬G«–$aŒ`9×M~e:úw}Rð…}Ôñfô]æñVx„-±SÐ+‰ùÈz³§Ý0uv¶´~?(_²ÔO‡aõ)¬@ú?±yròÜQù´EÊ_çŽu_î¢ޏ;lÐNe»ðã¿ô/IÚH¶`±²½t6Ô(¥¼%üïïÖ€Ü3¯yÀrw-TÏ×z"“w›ªjo@P{8ÕèKU[Åçùk¥¡|.¨q¶‰5W£Öö¯Ì¼¦Eúì8K1»ŽN ­·†ƒX¸Šíâ?¦é—Ÿ€fã/ BBR`N¡Ž¥¯‡QÐñ¯sÔ¬ô_6¯‰âä:Futî–»>H^ˆã±µ°#çí•í«ôûŸR8Ù\Ï[æ-Uï•Ïj茪ü²LÜÙ´2ñë]Ú¾d_§Òý¦޾X²Œl‰Æ×$&dÉŠÏH'¨ÐªKð;ép¾0çXǬ0Am Vìo*ÿeoÜlÞZ‡i\ ÜL– uQ¨‡^ÒRÍ¥C1º \px;þvСMD£OÙ‚E‚W=†ŸW]®ÄZ™Aù¤ú%}Do šZ'*Ý®¶ÉJáá»Æf#¥@ÎÖ„Ï& …/¬£ÇÚróÔ§6¨ó8žÉÎE z&¢º7 ê½9V»gË3Då8vòÃAeÎà˜›}æáÓÓ´…_MîzŽ"t¹àtIªÊZB”f#üÚE¶;O1#ðæåÃ;$~õ†EG`ÝÙ¡¶Çá¦qøi¼? -|˜–^/_éq¬Ôš@©ðÀæ9X[µä—S<°ÄsØ>@hOûÌ ÉiâBK |5o¥(~âî‹[ßJƒÒ=–°a)‡î ­øãq¢åMf†iÈš"ÚÄ¿AçÍGÍeú¢ðÐöÆ©O^2E}Fuw®T q¬[“¨ÈHÐcÑJ˜Ô¶d¶/—w€ËC(SˆŒ¸ŸÒ•hwã,®x’äµÎ3°à«[#FëF–ª'm„Í \*»Mvn×Â^av îÚ¿ž2öÒV«SÄEAº‚‚„Aä20ŠéïôaJ<üUá«z"˜µ-]t£-{8´yѸšÔU†=Ûôp3#rÉãã½ +ciÿ¥MòØA"áZâ™=Ô¦#…%!ì{HГ7Ç )„Y„C*ºÄ¨ÆäÝ™S‡¶kuJÉŠ-¶½ ‡-;Ó¥¦®§±:5’a§æ,xÙ±ßkóÖˆ}Uà¬Ð½}õ= Ýò-Ä æÓ‰6\©&#± åŸÈÀÈ~Öñ˜ií³ãã¯Õ<ìÓ!€ÊП9Lí¦ TøÞª3dËIA$ÿ[.­V»‹-KëÍH'þ&~p˜ñTÀ©¬¶é@åý€ÒY à÷Jí&Mù\·úšåÍNi«.!Î8²‹©xp'fºÑÕUJ¾N1Ö#ŒÊÔº"GMZ"[¾ŽDBëq|ÍÊÊ*ubÏ`æƒ Îi¥>()ðØ¨°®@ëW÷œÌ•GkT©šä±dÔ_ê{ZyîMŒQã“1slmÅýü'ÑêÍ\p ·a4—yEŽ ÉKyÑA²ƒÙi3†fr\=ˆG«ðDÇð‹5Äœ9݇3'ôé˜aòßàªä©Ü‘½Ó†sàHÇ:ýº°\-¢n]áM)羈‘x|]¦¥¸Ca|¹êü¤)¯û’Æ| 82äOn;þ2¾’QRð°[µ#6Ìk¥Ò‰EXaÌÇ©?¾_ôâYãŒÐê™hŠª²\àÓ¤x‡[Þi],GŸl“rª/ –ó«ÕÏZÈΦã¨Êñ›Äøuî¿—íèÍ÷å!¿Z4(hÄñ :ù(,EA¡È>Ö=&ÊÆß‹ÃbÏ’ÙïâÓŒ^‰/äR 1ûò«È—àöl¤Ø.»\ÍËé>ª ÑS§UO[» ÆÓ hˆ³.ï8R¦O£0‹Ú(ûuѯôÇát~î—8¦SÃV»_ls„a_9nQ‚Ùªo³ÒE¼^PE‡øÂiŸEǨkñûÏýWUë·Àà¯yéO.éJ‹‹Ð"†«yTÖpšFÍÒñ#V_æL†×æ–½kÁ£E÷©½H&£JÈ|ê`µ BÜÏêã|Bؘ‰jüQ¥f-qÁ%-HJ¹sa[±óËá|Ã)“rnÁÅýñ½Y´èf‹‘’—Š{‡ 7)Ù|UÎ|]øoÅ=îÚ$†]’ÒcâÀ>¨°NIÚÁ¬m)Kø¿âàë^Ùj…M‘Œ)ø!ýº+|c“ýš€¬b¾ˆcU¼V<8™m²g™ÖpEŒm/’âFv>ˆ‘Ýç>Íscôd[s¡Åá ›Búè X²àV\x”åWL=WÈ AéÉü6–¾ÜFs¬^.¿êTd‹ùô3Øy¼7æB†ê¸m_­Ó3o“L‚6›v©/5¬‰'B‡mÉg'V$»•sœéÁ½z q7ŒµÛѾ›£t8¶zšÎ±ÊMüXJ)¶)—ª°/Ö†yHºG¾€‚ôË^¾ÓHÙ¶š#2òta<17œãÉaxYA“!—§n‚׬öàHÒØA‡ô…¶¼ÁrÄ(î¹Yè…òŽNõOÿ]³ÔEEë]êò­~îÇÔú/‘e—dGP—©ÁØÇ£h(]Ð&? !p—`o`ëvžÄêÐ3âp×?Eý5jW'•º´M0ÝòTµ*¿>I¯šNuxR†üN›ß¶Ãnõ/¤ît³UEWy$ßê( pq Î¥.2#žÕ¨cÖ3Zõ§Mž’S¹&h '-;”²®Å\—L¢> š?ËypŸ6Ñ…g©RÐ2âúÃXxNñ¿3é3:êþôíu†~€¼±æƒõ%9Ú.û„\çXl1Õ_aœúàI–èÝÑo™T ç7GV‘Ô¦V¥a'´&˜FM%ÁJ(#ÓIÎ:VÕ!o´”GF½åuý‡ÊlpAY%Ûë?òÝÿk-þžŒ¦vNšV±æÂ‰Ú©JN`šµ‚bÒm;Üò÷ì%¡Ï‡mŸ ªÿæ7›eð°Åž¢ŒC³”‘Ÿö„/À¾²´ÿƒJËŲ ö\ŸgBW€GôÛ£òègd N‡Þ% ŽÞÄ"0íÈ· ïï‰N(HÖ¢íì®®ºÙEu'§,³T´È„ó3}"G½IPǰ™™8,8s},"ƒœ|&ø ©„:¬› <Žj´\û(ÇÑñ¼7O±•wbú:Ñœž¢‘€¿_'­Ço‚{·óCó§ê©ñK‚êÌVÁxؘMĨo‡ŽŒ’µáz¸Š«»½h!ïSd,.ˆÿb_Î0g¸¯? 'K ®o”Ì +w)³ŒV ¡ÓéHa%eäXЄFQÕŸ8gÑëÈŸûþ«wÝ_ÿlÇ„K„i_ÇQIÔ³ÜJíQï ~§!%˜œÛýûUoÐHÀTó`UNi[ÃAãÆžWÝäü’|L/¢ÿ®2@“©õŽÙ×ÄDÓf‡‰)÷”:{\8ìâš †ï't'"Q|Ye¤¦†%™e—çVLÌß9#‚~9Ÿ8­U$G¥ h¦pñ|V @5.!ËhË>Ñ ½ï¾ÝžÃœù‚»KðèYKÁíâeãRX¬ ˜”QîüÓÁuªK°è:‚Q¯ ôÏÈ‘;uJ•¤ñÞëmCGj’×Í–?Àzo· Å…Šå‚Íšà7œ· …£À£Waé‰AxöG÷š†×Sªæcø^‰O{*N¡¾[ÖôÌH#¶câeO§ú]h2sÿP€ÚräpÃøèJ0…,0"U?.z$P7óÌ#½qWT=c¬ãtú˜ÐÂÈjäp™o¦ŒƒƒäÍ+qþÏ îÉEà!vVûµÓ¶ ’ï÷‚«7EÑB xÅʎ埞rY^[Ò3æèA-§†$2üÿ„Œˆ.¿J褂FÎügc/Z®ó`ö»&×|‡×¿æ°¦P…6n ì®dÐÅæq€—uýUr;åÔz¿¾"¾›k¥­ê„,ø4bFÏF3ÍmƒÕ#W=„hâDî£!Yszõ YÖÿz«ÛêßõÛØ·CËtI|ç×Cr¬®}–°uóÈf)p°ÌÊÞb¼–.®¥CÚ±S,Ø!ÙíUýf¨î\É7"§¸°Žóo!¥Ñ5~t£~[wÑÇÓf[ê8 &÷ûbSöŠ5ÖìÀµB6רôœú&º ùR«óY¤«È¦B9ÎÚÑ­e“1-±}Xuö>aŠc©g‚÷Âú=¼f®‰Q½‹.¯÷—†'zKd Óä°æ)«BE6’ÐMõéðóªÇ*Ž9·Q¨N×2ïIáæfLj»²ƒå ÀX÷¿"[–>!ÈÔ,Gå£m ¬&,¡Z"œÑ̘Í­¨ÛÅՌڛ£íµöóÒÚfûE»…3XÀ‘ ÈÝ7’büܰñã9u Ô-ý£†ÿyHH7|iÜ¡5×HáÜ=|Í!'ÃŒêv„rúñ€„I6†Ü äî‡#éEgv¡íøí3MAó åU⪵>¹3:.e01õ »‰“°»%vSž©¨?.–_ÿ`ƒcÆl”UȆP8³/ŒÐDQí¡ Ò  Ýšewð p.Hê‹=U6~¿ëÙºC=Wªîݰ´TÊC^!7¸RÖW•½û¦>#<%#ÏÓHK “]ëc? þ:¸ÕV·ï‡/ùô .ÿ<ù—Äé…Mˆ0ˆžãóÀ^&îÇ ?=Ú}ln1íð_›…ÒNN~XÇt™FQ#’\ô„CR;…×ýpJ¬¹èЇż³)O~/,b A­:*JyÚhè ÞŸ…UBö (éŽ]z5ùŒ×€ÆaoØs& 4Ökc$gõ€Ã+FËhÁÉJÝŒ´'[öÅ&¾²li£çÉÄâÍáùöVïšÄâ€^æïÝyp2 jÔ•ô»R¡M—wp÷¦nx€wÌ3«×î#„ !"mV³¼ŠSžþÑS (øÖ ä¯ñ4?”°é`³æ?-¥oý´Î•†œLs ™‘zMúGúÖrÃÜï¶ç³†t6ÝÞ(]4®ðP€{ÁäNƒº{é-¿Ck&œÂ:tÐéŠØPù/kÆ=lëc'+ï§òRÇIZðýµ -Šdã›rî­y+,ùä푪H#—A…"”/‘ A$©êÆ7ãmÈù›hd]D3® »l=ï»Rö§§Ä{ó|Y ÷íuå`ú§lJº6µT”v/죕v/×§þÍ©.ò²ü‡£Ùù‘ ŸZá×ÂÎ,Å™´»Ež¾í“xå‹Ht$W‹9ÔÏÚdô<~ÀHA\õÛnÎxïš%çô·E1ÌËöʤ°8ž&7x1Ö”;Te¿ßÿ€*ªÎé˜Éäù¹~ƒ{Ë KzÕeÚšz3¬DRÃ6›B¨a{>ãʾ0P=Rú£›¸ô‰¤ª}uçFæ¢òÒi=:* z¹°gÍ!˜õ˜Ó­„qKˆdeL¸ÜðØ¹®àŒ ^¯Q úVš ¼kL¥¼ïŸ“ò3ZÉîN‡\)Ý#]fuÑ«.X‚¿ÈCL¼%¼"šB³«O¦R®?3Mž¿hU”ôÕ®×Z‘& ´JE¦BÊò÷Ùê 76Œ¦ÓeöÐÌF×cJ“6D¤ CžjK¥˜‰DlÛýýq”øI"'\*›oD²Žñ ×åS4½ÙÍ_áu¦ŠÅ!KµÚ§ƒõ^%°èÚ°Ž¥ýÒdñJDtësù<’šêÏAÝaßéfÕòùÛÃdÐeû8ÚlïΠ9{…)¨/Á(v#@9ôü)¥Jƒ%ÀyíäŠ•Ýøå (&•ðKϹ7ÓR®’Z˜Ò2*ˆD«þªUh½N×Z>°×KQOĪ1Ø9^øÞ åkàJÖ=ÙÎñ"&qƒa/°ÙvÀÖ àY7ÚM€Ñ» ÅÒ¢DL÷#“BîªHÄx³­q¡¡ƒ› £½vë˜.*¿Õœäýâ]Y‘ÖׄO>šïdD[…£Ež§"¯€¿²Oy.…æ~èÀož±8Ä Ÿø.`# êŠPEïÙõ@8ù¿uªñ–ýšÑç/¡šÞè.û®&YRÁ¨R0=uuVLœnœ|‚ßæûl¾„¢ÆÜ¬¾ ŒèbÚÌò^7Î ò‘"*Ç“üÑ ;[Ž­ÔìíÍ—ÜØ>(äX_U5 ž… ±kÁÐ×yâ>p7šzCyTäøñy«aNµm†µMÍóFpæ5+k£¹¡u½u§Öcmྯþùy@¦èa×?º"ݶÚϤäàö"¨ôWV";Ÿé_ÜBV\¹ò´l3ÙþöÀ»Ä¶«F#ÿ*Êkºgï³3ÞÎ=Ä€¶ÌÁ¾!… Ñß~k(5ÅA­ËeDßkV9œëç @Èã ƒArÝ•Á}«‡ɰ²$ (ª] †ùkö¶‡Ž<Â4Y-É;ÆjèZgêD„4]›û'ÏMî%yÕÅ€dÝ·4ñ(1Õ™qFŒïNþ³LGð͸>Ô4Hgh˜³gÎÂñ²pKÎl¤@…"ž½iAç î¥\ð„òN>Xœ#ÊË gë,KÉÿQ&ZÃûQ ftˆÝÒ¦Y‹0ç»8Å„*wù …Ñö!2Æðª—6'ÿ{hãÖj;|àâ²qï6òzßúsqÊnó(rô²àÚŸ'»@#£ smÓ`˜&ûˆâfÂÏ—fLJ§¢³,âÎEŠÜWŠgªðhYþî•u½äîË3m×(]¬*ˆóèÆ,ħŠfõh$NmˆS`%³\Ä ÿ2fvTKŠ^>Œ³"»`tüY.JNIw}Ãe{§}$ñãAumSdHŠñHÂv’(;Á¯X“õŽvQMÆk‡érd<6BÅ þ)-–Åv€‰[y>—}?¨!ªêFiƒP嘞Ìa|1^#ŽÅŠl÷ˆW×n]ÐàDÊ_x6±qYhpìÄuRíPdX ÝÚ|Šýª² Bݼú®éîÿHY¸ºQ\5Õ{«›q³Àç÷I-3Øîæ€U¥SO˜t‰Á'"©Rä¡_ ¬h‰Ünv¶M² pþ[8!òq† ¾U žÓR9~~yâ´A?[Ãé Ù+Ë(ííÆ–ÆéA©4 ÄO¸?WXʺþ®ë¢P\E”…•Ǫ.¼88t“+c}l8À:\ÁåÏCMphÄYþ/ Õ^eiûæÞBÀEÈr"i¶C>•c5|½áê­G0÷sCžSàYgÈ®À4Ö\ú‚ÍXÆh+Vœÿ;6ÁUJúÞK3®›ñÁ܈h1ÿ>дmy9>j$ü¬áD¥hÑ ŽºfNxÅà¼hÀZ„ÏâáÈüð¥˜.7”±A„ø{Ùmî¦7‚­A »–—߉cºsB÷® ©9 ö©ð2H ‡LU`3㼤1BR•ïG “_ŒŒãÞ§z8œˆ›Ú<©Øžð# ¦ÐF¶wÞ[v·ˆ"s*&‡@/5 –ù0ãâ| ^¯ž0x߆Ü£¶¦FдŒ¿ˆ&ä×_ªw4Û Ü@#1oaª"l\·¤ãù\½–í}•¯½F’u͉9ÂŒ xŒíÌñò1T\9Hp&ÕŸšc|4AöÄºí°ƒJ(žšª×œƒÉÏŽ¶'bÿÖÀPS؇àõ?Ï€²³Ý‹êzýÆî—œy3¼ !ÜW ÍŒ#² “•š/æÃeã¿Ó3;1°™#"Á|œòu¤Oì› \´oGS^DæM1Z0ÌØd9¯¶«ª‡1w;‰ ›Š—*P6Oß÷¥Ø˜ÓTq›ZüE‰ï•–6¹mDZQ«:éaxE :þ;Ó“ÒcUš0ÌS}ŒeÕÓh¾Áå¿3$q:1ÏΦŸ/ÁvÏlaN¨±ÏÕª’‡ êýgS!óÈ⤑ !ü¢|—nÕÄuý˜hOÐ0gü…¤œ`z Ø=™ÐnJA N©f`-õœ«ÈŸƒ¬¸‘§Eù7ä£ÍD1çÅ["¯ÆjÜ\…2Â’]-8´NI Ľé“ýS­\þO&mûÆÍ ¨&Úö>¼}“q©åÏqÔ™!á´Úó({[œ*Âï·Âµšc2xø£0Ñ+õÙ)¦þsË¡<;ÈlߨÆ~tÁ¡‚z~Ê/²Ö—Wö¶G5Jn`š00´CŠßÕoY0Ÿ÷ñ}é¡“ÉÙDbÝE%=N3ŸW+¯– “íҸä‚i­Üò{êBòöŸ¥)É%™¹eŽr†¶™OÙŽm±yÕ‹ ç~ ­îV¹H&¯p4¬ ÉÏ”ïp]䨅/BÇ7ƒªqÁ/»m”ì–Œ.Ø{‰:Êü³ˆèà'yOY»Kªñ⬩٠79JïÞŸÞì•MecTz“™M+Ž¢2Ú|~šùÄ×Ã0.¨ûj ßCö9\çši¼H$6Uæ9GÀЬÍ;YvÑÇ|¸CZúvhZ» ‰ê"Nú:Ûmº{ÈóÞÚ|z¸àqEÞGëÙÜ]‰T½¬¸`ÒaJüìŽÉà£Ä™-´ˆžšBÞSÒ¼=ZTܰèí:Õ·“Àîè½¹ø}ᮥ*œŸ …@±½¦Ñ©³û©ñJWß)î}Å¢z™NLì«\-TçÕt2`Ç‚±^šu2A|FL®CÄÑ>°§$hTÇ u½¡Ð=?£NßÞ— LûÐ~ù…ڄΗ7#ªÛ“ì€'áð |€ï;+™Ý3Á:¹HØ7γBî±JÁ ¼Lxa¸Ë¼¹åÜæ̉ãÉ™â„ü´_¡\@xÊÄÉ^IYm”•aŒ¦ÿ8ÙlÚEë9t+üh:uSûL¢z#I—2ko²Åæ¶z©§Ëhç5–¿hþØ‘èßû’LÐÏò8ÁMå.=d¬â#<“«GSKá ˆâ²:W«~ÆÎ²žúYÈïîeòaœ¬¿Ã%èjw’ˆj:”ûr¢¿Zv·¥¹ '…Ws®”Ý» -Ìþ%Yí`!«kn‡û ×P½ÉU&ô’áÉ8ÿÚ¿¡ÑªG1D#ÃZû[Ð@ ²j lÒ¾s]\F÷®5ãe¦æÇ!ZЧ:F"ôïCÙÔöY®2¨–jÎÀ=(Ñ8•MÇÑÅÁŒ¹PÓ•ô½¨eWÔkŒÿCRU†…Ì…c´EGð mÍÖÐ®ÃøÏü{ÀÙ3ò…ZT@ÜLJÐ+-NŒ»Fpøü؉õÃoÓåî«Æ9㨕;€µ¬9ã¡mèµKëf<Ùõ½Eëp{}P`”'ÀpA(AC½”™‰.†9–«d$ô}½c“Ç#–…S^Ó¯BC³9–`1³ÊnÃÙH¥N ¦+ pùBÑY±~àBLy/ "¯ó}âµ]ÄløÊt¸éA gŒÛ… ‰wG4ÐG%ÜNô,½(rßĈǹšÈ2új¿›VÁ‚6² G¶jŒ¿ŒÃÅžÊZ±¦…´Ë-ë‘—BлÁ†Òg›âº?wËÚú |itR[‚¦ÁjwIi r¤/‚}Oчˆî¬vRs’€:G¦¨ÄLà r€aº ýÃíꎫ©¨}½k€Ã‚¢K¿$«š­q†væ7Úµ1ú<éLë‹Ø$:Ë1Ã@:ìÒæŸÑym¹Á"÷*âOz $ë9 3µ¶é;Àéœ*K½ëB` ¿‹ý:e, ÿ4ƒ‚"¦ú(ä7mÂËŒû‚»$ë y# m`ÁN_ü+zhÞï5(d޼0ð¸Ä;v§ñ¤b¥Ìᙩ*Lú¦¹À‰FýÉåFz_0A¹^ù(xi™¤ ¿¶‡#@ )x÷ÊֻɊÿ)i™ža…ÏÔŽGÓú'£ƒÒž˰¼•{Qï‘ÜۖмËÏX&.nÎLr‘®³y;¢¶1ùþxx:FÀ(¯âîlÛ¯í ½Ÿ%:s—BÞ>ìøSÒ|u3CoílAcâã¸Ù]e¬èÈ yy~|Ôš*F0ý¼tpD\)ÿm…xšRÁîëÖvNÙŽòÄ·ŒÊÚ]'ïñlD¶Òà iù±Š¶3?… ׿kfb|e‹8]GÇVТÛ”ì) ‰EãÛ4ñ¥2½T`Ù‘*Óe¿[èû̺gEƒå4ùÖ8áCìàm‡sô£õV#ÐRœòú05^i¶3CﮕîÊ/ïn¸GÇÒ×€žãÈ9CߟºÑhŽ"Ö )÷dA¸¹B„Gnev¼D^7‰’®‡V¦gù  xn×35„ž17wR¨DX¬Ø¬7+å ÕTañ\ɽU‚èäÜjËO¢uªÏI{F !BrAPGíþI¥ù™ÏLœºPš.IžtïzD€zX9áH„åÄp·|ü;ã×±¤f<cJfÄßÏíô-aNÔM8·{²>ŽÿY:<†ž³Õ·ÁãhúQÙéú’"ËhtˆÇê«|=¸:FkŽû%ñG(zÒ"<&’l8ýå£CŽÑ‹Ð*~ g`šFÊ£ÿ%”ÜÞPìgÞ zc×-`O‹â0§ Æ <›SÁÃÊɱûWáܯ`}bVø~ä¶®Ñ š'Š©‡ªÓÓ2e²êÚ¢q¾·éªt‰¨6 tRÇëÈ—:ûÂÆr{‚øJ5Ûÿˆ–t¨&„ îæÓ½ç>>ï±?ÑÊLJ9.["L?KEÚø1‰]Çׄ *\5:^‡íËü!›h–l9ɇÔÙý£ì[>–‘ ÕèFè" ^SÈØÛäÌêX wBLIk¤o£–qÅ~ºº´¹Ç6$Ê1W…L¿AN×yhÚ)/ ìhB 2”¹Êà9Û³‘‹gùaŽ5ïE3Ÿú ~|ËQÙŽàÐ>êõ¹ägÈb]óa÷hÃG:ÎÙ:ï¾@á‹É'ÉØü/*õI—A1/¿!~‚ß×mpËá4t®üütNã3õ-úY"Ö(õç—}¬5 v òç B2H,G‹‘!ø¬e¹Z’7î^óŸ¼R@¨ôÃã ] ú4ìÒAëöÓWÞ÷žq ñ­¸€ õF¹åž½aŸ2¸i­ZÐ-ÚæV;þ` ¿qŹ6Mýô5ÀÊÏèÉææ³šQ)'Ò)/ÚÍžö²(øâVI ¡s6ýòm…¯gy/ª –ÐÓWˆÓä77~p"Œb-à§îñÜ&óÿH „$ŸèrðËMnÚù ï¶I\ïp:uzhNFÖÃÍIÁ;gÜ!yyš_}nOšz2‰Lkç–UTH5Èï”ÎàÉÇøv{‡Ÿ&•vTŠP•ˆ½øcú­*¨"øŠš+`/-‰¢`VEé˜{†vÍKñ!¤È ö+øÇ-é©ÒˆëÞ×J³HÐÉÞ{sUÃd^÷TD¾á¢D1 ûþë³uÛ…³É£ä‡I4Çù ®ø[Å-þé©`—Àz¤QyVZöfÂ)-ßdz} … ìM]5u…Î@è~òUr¢kÚ†íÏ®Ìn§‹q­Ã7—&tQ<̯ÀÕOíiào7õ»(ý ¦RÈEw€¡¾ê^yò0P³ŽÜkí ÑB"×I=, €áEð¡®ôÆÇ€ÈG;ÞU€Nþ_O—úÕœùI\û4=goöÔâÒ›¾ÖÛ¤vn}Óø§>_VGÖ+Í5ò»…èš7 Ì«‡$ì¼õãåj¤4n2é[…Ÿ³XM¯¦yÿYÙÿ1èäœJçßÀW‘»’qÞ´=jg˜gL÷¨h~ãÇj¡I±móM)¡ëgÎvD /ÞÄ–ò1¹|F¥èâ™»ùsNt> ô~sd¢zbÇt$ÈÀ$Ô(‡zq.®'¸”¹v8ädgÕ:¨ "l~OaÚ$¬íÃi FLØs)ꙆfÏxœÇ£ªˆç&`嫉èe]FOúù{ ²î"Ë?zãÌÇ©„)ë£4§Ô!\Óz'ëÿ_ð\ÒÁP‘÷é“’½«1a饛£âŸM¹~Ðþ¬sYÑæS­ŒxÁQƒ½o·i"ì Q;Hºá} ýkV2R¹,£q Ó'rq:ȬŸ¼Âç )6²æºi@».&ùþÀ¼ƒûØAc‘~(ÝãŠüÓx„©œaÔ].uH,0†Q,P``ˆ–›m²i}+èâh.‘WDbUe–{ U‰ÐçyQ—’ŽúŸØîœVœMN+ŒpË.aP¤…¥ÃI¿§;°_ÕÖß5‹‹\9oSÕÄàY ?ⵋôÊ€'ä,O£zb‰R ’³z2‚‡D€`ÇáÓl~;GáÓ(—Z³²bˆáœ ç4ãXµT­gnºVÅ2£ž! Ïa"Ϧ 'n†}œ,_ã¡E˜¾t4ØáyÚ?V˜cÑã²ïLÚ%E×'üÍÙÌo ÿdï_Á’Qƒø7­Æ«kø/Êü=.tô¡Ü—Ip»’)â’ ˜–¨O{F³tœT _x €—‹8ÂdÉO*¾Ù*¶ìõñqZÌWû¿¬Àš?znóQØ)>ŠÚ]² c͘—¨H|È3'K~÷P íÓÙä~ø_•!=³ëpÇ‘çüðô?MÆfh—^sO}\ƒ<&,{3è¥åY“ÉñmVΰkç(15á,ðÇ|.ŽmF/ùCbâ™&àoü] 9he8wwnoýLøºŽ)Žx‡½P ò— ²ó@ZÓ%BüLw½Âì7Ž:Ôq¿¿úMÓ’ŽKYÌH}¸·lne|-9#“¦8¾¥¨…=âqbaDE6-WN¶¼ ¢þGÐäi.Ž@DcëInzúžtüÞË<ÜyÔ n%eh[0>ËTþý^é”Ï8´QfÉà$-°¨Œd¥‰è³«WѰç) bö‹ï›ÙŠ3³üa‚ÍZ²Žò€¶'%¹IBWOàRÙË̾¿ÔÊÈ_É*(Ÿúòð¬„=²›t )°æÃ”Óq 7˜j]˜ÈÿQ9VZ²ñ CµQ²”“ sIFn*TàüÂà 9XnŒÃA¶X`¥¯Š^”<W¼Uqìp;®%ÙëªLaNIçr`2§s.﵃'¿‡¥%lpÀmA©^rД#bqJñ Z¤£:±²{ é|°þª+Ÿ} Gñë:‚:iACWDA!%h†`ŽN°Aòvä%‚UpE‘‘“Väùhv–Û Ëÿ8ÎrV™Ð½:rZyñ5.Ð!âï´nï±T”câ/H‹¶Š>BÔÊÐESì¼íŸK3,IȪmb4áS'yëfv–£Á'T!ܬDgÿa~³\="¦ ­f½ADZäjÐ(ñ˜¸_¢Ðô3°=Oº%C7Uö'jwN8ýÚCb½K¾œÍÒz £ãÓpü0ÚÜv0ŒÊ‡vÏeàÎM½Ù`ôjrsӢĩŽ5øæ÷¹\ÉZ €jKµíØÀô„¶¬âOrÖÛ_R6Lµ vòëî³½>›‚#÷WÜ÷E;dß“*Kt~zuµR3÷f¯Ý±)ë”"æq5wEvÃ$—¦5Ù™Npr´;¥f7®b8wó"x™c;(Õ•ðdUsÛÏÖ8b'Ò‡£§ðÓåEs0°˜ º'Ø)Jn¾Ýbª¢¶1â²®ò؉æïi0‹è*œbØZ/¸3̤—gÁvÏ9ʀ열ùÔ%J ªâì§ë‘ÀÈöÓK/Œwìí¾ûvÝ âæ6ëÜ€v—D#gÐ"RL+ê֫޼…ÅR^ ¿&=ŒI°áú–À¥Yi¨ÚTSRºD>f­·ü÷êCU)›hìܺ¿y<~ã*‰«ŠŽ²$y\žŠå nÆáxw qzŠ}†?Lcúi¡m£•Þ´µH…ÃNü0$Éò&Ù,G…ŸË“KÕ¨ÒCAÐ@øWþHz¬ÞZ±±ó¶åo{GXâ|3¬iR!ÑïY´A§êƧ£›æ‹«)Éå¸y9ÅŲ“Æ•¡½Ÿ Ș‡d¨j^MlìÀ®Ãþt·!õt‡û@Æy¹î¾™‘oóò}’;­ÚË%×mèÇ’SšÂXË “€°'¡é8 xù-î.¤ß†¡H€Ã‹•×JîTŠ#:å >Lëá"-ÿmyG:²|d ô+ m âAŠÒŠr?Òè¿:šQ„å¡¿®ùgŸñüBi¥L:1CE½ƒ°Æ‘\ „²‘ŠR3Ī6kö¸(KSëó¥6è¯nc˜3GÔãŠUíãÆÅ®ÛÜÝÿ[8ÄD÷ë÷ó » Ô°!ÌõC5à8ˆÔ þ"²ª=‡ÚÓÙ+£± ºÖ[µF…óP¸¥o «ú–/$%!/äJȰÏw"ØY^š›`ãY/+BbEË +XóñQì”åöúÛßo¦Wðõ»þÑyü=Yï·Ð3øzZßo±v·Ô“öúþßPOÛì(©*Óû$è-Óû†yIãTÐ;Š÷NÄ œ,É´l¶+6E÷½ RƒÎb*ü팛HŒæ ÷qæh¡¶mS×4Åa•M£.ÂA»bú8/tÌQ ù˜œ ›6 C1™H7ëlÉGF–^œ3þvÿT)}}´|ÊÌõ/^f±$¿æ0u-W)s¥û ¶Û‘xá»'_Ôñ4U¢_ZÕÆ¾í©Ó0ÞôåÌyW„3J¿…4ôªé“rÖªä<‘@=^5ÛÕn…G9©Û:dÁh9UÇ¥­RŽtÚ#x8yK»ƒÃ*žI$öP*&¦ï½¾s˜¯QeÃT”…L¸gýw7÷ëÏcsËâ¨d*Îz[Îúoà‡® à éûôFÕÄ5Ø-L* $‚~±*åÔðß”£ÍD/81 oOš`ð{~ô¡#Fâ)J•i2…½)%²Ñ4e)u;]hF ½%¹Vk§IÚ’0Ôà™*SH¿—*ézvay`h ƒ|˜ G{?ûs,?èìg½õŽ—ŠÖ‚4v¸«þÏ´ÇŠÒÙ^6íûM[èÌnpËÇYˆ4‹œ´Ip…-Äù:M‰­LÙ&*?ƒËòM¼°'Ú‰*Pe¬ÿ%¶:àWö5~efssbÝ´˜Y™«Ãàlì=‚°žØhôŒpG¬ù=D<ÛË­ë;Ï:@­%æˆ-¼ŽËRåá£û+àéöð¬wJgbVtßq5)ŸÉEî;,jÇ׈øµ T;DTOÖ´<9BÜj”t±ç k²gñÜI4þÆ8R'á?îI;U‘¼ !\u9²¹qÞÃFÄçÿY:a‚ÌàµÏ¨ƒ¯nÙØŽ¯ÈÚÇü5UP´õðqôP`©Òiã÷ÈŒ?رú.d†ð™Õ»ÍÚL›kÃ[Ða•¢;`&ç„ÅM¾Ð͘{ÐʃÂaÎD3HÎnÑ× iäRïÎñ¯g½ …œ¼¶Ô€Ï^ ˆi0ÖR éˆ<âRMgÙÓoß±ÆkTáL~L‚•æÃÿ¹Ì`,_Ć-^uQ½%µÄ_w¹R'ªµ–dÔ½ºó ³ék²a$~r®œ%â²×hƒéªÂ ì¢ÑðöK¿ªëmµ~†øgN»àMA•Ž(`WøñF‡½éÜé~T¶Ë­PÊkјd]aïï2©B”®HW{.çˆÙî£Äeºí"r2IéfNh×ëm%ïîù!ãý88iý?šê,™¦°'–¦Ÿ ÑR­bRÛçAøÛ6a(<ýþ÷fuöË÷øÍ2uT¨Òñä À¾ÛÂÏâX¸!Ï <’`û~˜epŸìëèßS¢åFŒÉ`ï™Ê£ÇØâ¸û,qKxèpÑ.ÏÑ­ˆÜÛlùHlY˜­©g®„3ùtOðúkàa‰ì¿ä!âZš>Ü€cß]¬ÓïéÁú °¤e EŠñ/Ì@¢*Ñ[Ô£µwý8®MØ…Tkw͸„î|ŒÂúÕ±¼!ŠS:Âe¶x‚)&pm—Ä œÜûBöŒ¯–ëº Ï•¦S¹h[Ž8þ*†ŒãÕ­€`‹í¶zÈËŸ!›Ám5ýViGQžÑ!ÿëŃÐ'€Y»3°‡¦Ái’èÜÙŽÒìÞ¯M:2èy‚¡ä€ ˜Lc0„¯´ ÔÅ€ò›CF.Ð1+jÍD.b<È£5¾LÂtg ut²ª„U TžÖj%ò@AåMݼ‰0×ÏÆ§‘´j£ã¦øÿ+a(è¢ÏûâÁïéû“æì@ ¡¡ØmL484ÉBä!ˆÛÀÀ±n]’ؽC÷˜ÖWýÞãŽ%§¢ú…C®‘¢+í°'¤›zIKÍßbËÎijðY.Á´]ƒ¥šPÿoÔnÝÄËö‹þœJ˜x“jÐHfÁcÙÁÆsl´œtÌ߃‹¤ Ja‚‰öY\ÀäÏV&^⇠ëÊ3ùžÅÇŠº£ß‘…Ëóúƒö ¸î¥ñ‹1Eóãé:`“ÿZ\Û›h¯U åø{¦MΆCÎB:=Ç’OA“ˆ©ô6õ^–F-ßD7òGÕ“¯UJJ¬œ@Áô°ÁVO Üöù”C®ÜÔ½7´f·íR¬å’©I^ó€å¼6¢¢y2³ÑÈ»‹®„²ÅNS^†-ððàkhä¶ÅulêdïÿF7à\òò3§˜ëð.Jeϼ8û Ÿï6:±ZUhÙvÈ2°uÃÈžŸð¼½‹0¹_(mh1¸ ‹7ýC8$×оš'g6LCí«–yRÍÃKï–â«BlW™§ÜAe‘Ö/íï\^àüräK)irxmÎé¼™æ3—½›ü$Îýˆ]¦úv{%mÅslŇP‹ì‘¼ þ‰tfé[!:ëò¹nôÜ<&*ýÛÓbó Ï ò™y­¢8%j˜ð=ð‡ MÿÌÂ`µ)?#dQþñ<ΓÓGbem¼l耻vc¹àYøVd|âÕÍñÑ=E»ŠÄ[¢S9¢ë[muuR7gÁÏrÛ'»EæÙ·*W‡âgð!Ü®+u#WGj7k_8Ä1—Lp—\Åz•S¯×½L~LSÙ,’F¡¤àK]ÖèÞf©È—uY2` ]©ÈéÞºV ¹T¹nòìVs‘4|§SÿvöDÑÇŽîO›GÅ‚yž]c% å¾SÄÓ`Ñ6FYò —'‡-î2ÆÆB@AIþReVµÚM"#ªÓúüEúœxù8Ô¼6ˆ;Ú½”€nî¹Y¡‰sJÌêáaOI—Ķ ·¾ššR™„ CJy›z¯ÀqÚù•SfÁ,_pšˆF M~çÒ2;¥ïšÛ=µv,!%On2…®¹šÔÞƒT˜v€u2ŸÁþœ ~¢±ŸYÍ<°"iHZÖ¸ŒÛ6Cî6d Ò@¼´¶´ÈÅÞfGÛö0Ü9uÄž'ˆÍ#?Ÿ0•â‘^¥!µ—ï'0Y?ˆ|Û’yi/I#`ðUÔÔÆë§\¢@,¬‚_0|VfiÕ6Â¥nî[o|ÒØW¯ÒnpÜ@#'·A·ñ KÐþmZƒ8ÒØí䬿àÐÑñ ·ÑÒÀaT¦& 6̸B$v™÷ÕrÐJø£=¤Ò¨dhYOhÂÕ*_,föóÀw¤gï­ôÚ¾ikæ¦bEöq€•?[;l¼H8öØOWÝöÜ¿G¾¿O~…4%Í™ÜYÐŒy–Bz c¢‡a‹¾óÿzøŸ5C¿'wx²Z‹&±%°ãŒáAÒ<á #•ˆêXd}¶{gIãÞôs×Ê8$E°Ä~d·ž¡|¦Þ¦A£ å¡6úCX‹­^Á €É’Æä4“_L*&¤ÙS¸T1Sœn¸yñ7E0á%ªÁ‡Í%µS4¢Qæ ›« ލ àít¯¨š³â.|ò_— âö °¾ÃÕ›5:âhð0Àõ]VÛþ žûU`î¿het’ Sðj`b@ÍåѵŒÎ¯$¤„tÀ›ÂùŒŠú1 ©çð±Ó©Éz‰ZÏ¢ÿZKìw´E×2ˆ'e²î\iþì;‘/à®ä¢&ÙÄ"«âF·16bÚPÑgë@Pµ’ÿjvmäö¯5Á÷¨í~Œg‡ŒüiÍO Çk,z}¤¶´”O@Rç’yÎŽ"½-m3®-@°¿rfqŠJF{Øœ pÄ·¶»÷¡E#(;b7"þálŒ¹Ï;³èµ •\ϯ±Ë• zï3U°Ã¶ÁpÂÌ8Eœye8ŠöÈ™a¾t/¦‹ÉV‡k<èmñ8¦&@”‡õ²ùîx[V91(ìÙÌΆ49¶4ßÅä? Áû • pK€Êv"̬ÐBœ¹‚SÜúh?YŠø}+®ÞóOþGa*²Í‰oM¡=2péH$ä´Ÿýs¹@{SóŠWTRܰXèOÇÜ,RþQ=žhPßM’ÓÌ—¸,vòÿ"xJÕ’ŠÏËm$u“»†è:5n»{• (!3*ÿ^=Eþ0|H')Øx›Ê=œ ÛÃŒz™]V[f[ÖRžLŠ¡> qu[£æå}GšŸ© iðru½“/ƌ҅ïÀùX”¥ï¬i õs<ã+)šÌCÂ_ÔºCiÑ/´ƒÝ E-FZžßÿn}Öm;…MÙ1"´?-žÚ ¼*XŸ]5iDX¸®©Oã®Ú ¶Ï^Æ÷ClAjZ&Æ),k/RCÏóºtX» 1¼êvºÈ×þkL`ÙÎľ„°¼hç%›GÜ$?⺫Šf õÛönñ­«q«üjáûtÁ½“[„Ì¥:UHè«¡hÞ]²ÀÜk[ð4ÚZÞ\ï?ÚöþTã¥Iµ=¾ cÙb(1‘,¿ fGŽ”ÎbÁweb’Plÿ5´/o–V|TWo&ˆJÆpyŠE’Ž)­œú»¿P‡g¿ò+vÔ«Õn # ÉrQV–ŽàÐQºš=š^ÿd4ǺÆpÆR§Æ Zeõ(Óêlô…oçO§±÷l«®B3qÞÌ BܵeÎMŽÅ, ©ŸužS}ç–ýž¦X!ÿy™ï”ÒàíVz¢LŽ‚;8ÏZ‰Ú²Ðeì?Ú•_ª»¬‘2·aŸ®Nº{kü]ÝÍ`DÉ^h ‹h[Ðûèw1lŽŽ×¾8÷¾m{†1ö~)½Ï>RI QH¶ÒöEVWÿHt(¶DgÉŒE åÍÂzæ)Û²Xü®$À4S>,YyôVýg ;€Ñåå™Bs*C£€;‰ß: “ mç`Ž´…ÙM¢øYmyrfb³¼N…C õÙÿ2"FGàçÒ§&¢PAý¡:ðoæ2ñð:“*kô]Y‰ 4J+Åtr“±E=*“·°æ3>ÅN$<Ám™Oå‡üîÌ¡#X|¨eïêÔN5œ®ü2E®NB ‘ER%p¤Ñäá‹ãر•Z'ÍÈØFprºNg¢ÄrùÁîY¯¼³ÌœýÊÑô/±ˆUµŽÑ?î~Föbž‡¹j`ª­‰íçöÊËÂ\Fé0 ã%Ž2MF¸Ä"E`˜KˆPçŸ ûEæWù°_ág­^»Ÿ£b‘<ñ\ÑKó—ŠÀ?¯UéCñXÌ_»T^IÏ£ )DB±-¢®Mg´½‰–E Ï'±ßÎ7*‹àƹ ç@Œ‡÷Jßñ.?dX/ƒ6ª|¦ÿ45(BÍPl‹ldÚßO‰EPþµQ}êö®iÊ®öA"LŒ=¨1?4ø ¸æV_÷/˜2ò¾’úèÞ{ûFp2GÛ­ DÅ¥e^NsIœ¾ËþZç5&7+«…7üq_­Ó¶.][18­• ¤¥$}QÉ|r!Rݲ'F%qgxdD.bë£]ŽY­1jSqüä6wÛå†7 ÕoS®Íƒ×ëª×e±âüƒ m!W¾I“Û3øýz´þç{ Á'¨êÔd'(ɼȷ‚Ìü š¯¬A‰ÙYˆ¥µÿß.Æ[<Þ|€Á¹“|Ú*ŠŽ/ÌŸì¾>Áïˆx å¿Ç¤:ÕçQŽ¢#UŸ™9ÛXnÅxVûzLÚCåÛ†åO.aÜïªÆÇx‘¨ßíµ¹½±s¢ôKÎMÏ9pv@q Þõò6ºèl®ï\‚ZæM6sj,ÀlCȺ’b'E•`36Tãó_÷Ê• ZW¹-; ±ÀS#¿ÈÈp»Ó&Ùúdª&è fÜËÏ['ËÉ-°m«_ô>¢>xð-bÈjÉNDW¤4ø¶gõ.Ÿ®e.Š\>>EUB£Qü{-ýRƒP—ÕË8SS„ yRx#¾|ØDc+ž$*dõ¦i#ûÅðb›¢õâAJ†@W  ²r¬Lc³k°b¼q)VE‡©ËÒÍj>6 Ý4”tÕxÏ­â+â’¥ç‚3“žSþî´î~lªÕÔÏjg6åˆI`M{…œ¥ò*f9vÙAN-ð{ˆæsOàÏ£X™^º| PÍ@+m\«±þˆVOW¬Â´Ù¸˜ ø)ñ ½Ë¡v'@:ÓþiS"Hu‚ºá†‘ÓûXd$K fš=tîâæBföù)lXrÍ’ ÈJGÞ†«~¨ãQšlÍPMË C½Ó¨wÔ<>c††þÞ\)ÖïÙ¯zÝÔmº]I•4µ8•t&a÷gw¥Úõ7ÿ/QÊÙþ¯*ÄT®¿ R\Ïõ¾¥#‡¯ûiKŠ¯Û½%N‡¿s¤¬‰<ÿ?1¡ZAøáx‡mE‡$êiðK1Á`ÞÇh>oÐL¨ÇݬS1KvÉü»Jö8žÂX¿ÎíO‘šžÜ†–ß.ÝF-äN8\Ú닸O“)é]dâóˆ&¼~²Ó›AñÀÖMì¬Ðêpd®¢4§ >3—3ÊòìA²|$Á?>›T=ô¾wD;Žç?’Ö­l“8ðIÍT3á±ÛKwÈ•‹aϸô„7nê°sœk'yA¦‘å’e‚õÙÀÛÏ‘#A˜ÁuO´ãA |D»ï`ïî“Ì‘Á=,Á¦š¾1<¥ÑF4ˆ˜¤A@Œ P#›²uK2sSŠÍ†úH!19Ã-úöma¬ØÁºÃv¤·á“5…Šò)µÙ‰ /Œå³#E*â´ñCãE½ºb üW&Ü|Ò‘g>AD€nšá<2Ö}wà-3¬¾Hë®?PÛs#݇%–ØŽ€ bÉ(Å”ýÃh7Îîç7†96ŸXR?8ò‹Ü] T¶“ tD‚ÊîÚô€"~Óú¼wH¤ûƒx\%š¤ž˜š»²sŠÚO§óOX;ÎI^ÝâÑQž{ín¦vZ¦rqz‹±´´øÔCU_Ðþx䯖Š/zhÂÊ^•p1åªÐ‘íino‚1ošÜ~Ž×šÔSN;ÊÅfÙØ? ܆)Þ¡tq›Œ¨hzoÜzÇ{™5-é‰ó5ÔµP¼­nÍ6)Š+ƒ?˜P,%¦L2ˆÂ–^å#©.ZJC·@ô5‹ÅßÃY0¢ÅÀÍDbæÅÎþ—jµÛüd› @ 5Âöj÷×× ØÊª”áRûL¹ í5ƒÏS¸·ý%?mk5Ã@¾À@ K!iﯳi[}(Cí–6,’o)Ž ²%><é*0³1ýfª‡šXaGUÈB“Ÿµê17iÀö)ØŠôSXÁv·ºó7Ï•¼£2úPë í% Ùò8Ü“àÛÊ/¹ Rµ†VöÌ$§ëX€.­ 4#áÚº7ÄHPþ?0˜ºM­£é¬½A3ƒfÄÄìv8× .¥YŠ‘Sxô"ÜW;­OñÆÿ+Ú—éwÃçÍ´ª…kÄ&É-3Š(QÎ_õNp.ª¤ˆ}Ÿè8^€þø- 1M(nþn¥:9߉5ðü\¼™§:ÀJ|N§ÖÎ/KÚßp=Ó­šÞà,þBLO÷â»A—`æ–©¶è›T¹¥H| ›T÷h¢Cÿ”…‰5iíÚ09œQMÃI›Ïu³|%›‚°’.m>ïÄMbÓ:‚6^ûÞ Y,]Ø|1Xî Ü\‚[Π͇þâ8e…eÕõ¾- Qv°Z$:5 ðÁºýѼ¿B¹±ú&úvamûv)<»jcér‹ðø!§áÄEóMU_…’&ðp7¢Êì¿À*¦uuüÚ×Gäû}f ñe­9 ¸¦°îI©ä<˜Ô?M%>¦ôãâ;_úF€3Ô‡Å_­gÃ[ËIÛÑ™cÚëõx´í¥Ë¾ÓÓ…îCTmIEåiä ?0éÇ9\Î+vvgc¨ýå,ïsO‰ú£»" Ü,—jmaöñ™ £¥8D¢¡¤j‹[þw¹åöòècæA´Cq^7—L±à_ÈÌů\õ„X(RgÓçË¥ÛPá„Ês2·àmu2 ®P²-ã ØC€bªC¸S—V…h¼g¨rðNÝÙu&²L†qö^ÕÅBèX!U&H€ø¾ûÈm‘꜄¶È£uÀ©ƒjI†£+Î'¼Ê´eWäçøïÇ@ã¤CríI`È@¯©^Kžúh¤È#¦¾«œ’HFŠ ›Ê:Çð(¹°M@ô…1?ËÕ\eÒ.9L;rµAiÚ¯‹É¿4€¤¥´y>:¿Ãt`ÔB¶mœ÷ "n'ˆÄHGTöÎéË9RN@¯1q›Þ"»Š±gTáÇ Å#È'TÓRo™ä/ö Œ•W{º(ªˆ0TýAV YKÌæT*JŠð)CmjHÙÆðfaß_ZKBjfîªäã«›T dOQÚ&ôaÏ ªn=!VÊ }7в¦+^£›hgX2'Êò:#‚°Ë]7$òQ¢—5]ûê÷Ùõ‹;M‰Ü"Þa±gš*%'.%·¸J<ý@n¾ñ~¤ˆÜtyø@º]Á;¡8 ey3Q„~tÔ8W´‰š¡xÍ]iöã|ù¶–¾€SîЮr¤ÉÚ±ŠD×B|BµâÊx@æ@#§w9.l)ñøÒb(;þ¡·iJ°A†Õÿ5ÿ9HÊŽÁPR&”{z§O/”_ãs‡ Àú£¦J€>uw´K£XçOů&È–Æeà3¬ì"iEv :ý6„bIJìm[¼”UØ÷lSñJ¢Þ½4¸[ÓsÔã¨Pr  £¬ü¸k´,0Ü6_òoÎù¸r©Wt¼‡rùQû@68²cTµS hY›USAKYô§«NÒW 4Àcbºzµþ!-KpG)î%¾ ò®z NKz±>…YǘgÌdf°dp]DÙåFÙ…rØÆ{pÒlWâLãÊæbôîÖŠn¬LÆänd4c[ünªŽªuª“Àõmª ‹ ÖÿÿÿRz©ï’a| Z)[Ê-rÒ{"œÜJ?¼Ùa mY²›ùÃV1Y¹AE‹wß ©<¯[Ù%m¿ Û£ÄO.Fed‰s~¥;‡ÙNšF«ù0÷¿Ü½ì>Óê#6Àü½ÝÚšámŸÕË?Á›ÎÈ7n½€¥1WÐVÈöV:Ø€Öx ÈÏC lû¾˜ œwhQNd îáµN³°³ =”ÌQ.ããŒuürx–2ܳ *_ Ù]¸õQ˜Ãbé(LÜÆ ͤ…9ô™‡¿†±Î+ŸÚ}M ö§}|§vøŽãxô“ª·ñ/œZj—Óî¥FÇëW¦·Æ~̧¨24#·FEIP ¤«ø¡+ñëOÓü0VáûuäĨ7loFO'rj…9Í“É9ÞzúºÝ–¯‡~<;¶ ©¾ê˜ÆNÊ=ƒD!—°kG‹„Å(š-\#á韣߅cÔh‚”’h5\°éã“WÑ(äoÉ(ʱßë^’é¨óß,ä´v¶fƒ³H{æõ”qÔñ6é?<õËI-¥T‡åXL¾ø¥qšÒ\+©sÙþ$ê´Þ{G ÕžKâœqRka‰]Ý1#ÌSÍáÜŽÞ7Ûnw×*¯\×Ç£ê©N|üÛeLn&óÏë“ìC(Ü\^”І!®SÄRª7>\4ÊâƽO§Db¯zá,t§Ó?a‚a£{\H†r²á&¥ÓµWìŽèRŸº#ˆ¬î÷ K„ böȆH…ƒ2Å3;Ù(Pѧ6‹ «|×yãäöÑaÔñ¨Å-dpFÅíî‘°àG„rÖ(•O¼LY-$ÙGá°½r(gZ F®rÛ‰VtýD¡æêDûJ.:aí ý…€`©rmèo\—‡Fct¥ä‘ÅeóYDÄ€azŒ-ïè†nM˜´J à#s ünÜ'6%–#zé¬.™,«7À„±ðû°çr´¤>âå‡]¿P†gelBÝL˜}h7å ñ÷¡g8ÚW¦ål•κkñŸ§Lå°ƒp)ð #›(I2}ÚW‚¨M˜ÖóÌpPô’h&P˜¤8y¡Ôøã6ÔÝQ' PÞΰ"æZ._ç3±ar»?ÔŽ(p¡ø£wŠÃ€?P €d­¨Í;ŸZÁÏ`;¡pD mhÞThÇc±À–èjõ#‹°ÅÂMˆH¯ƒ¸x¶¥0vSà ¶.V”Ò žW,1Ȧ¶6záo;ÇüBhœ, Ÿ2öAiSlýÆd¡MÏŽžªú„›ZÇÃuècòõ\ÜA»ò=Ñêæ×+™PÈ€ªp^öUiÒˆ«ÏÑ, ra6îlûÔ(¨×sbT^Ńúô!£dï€DGrVl­ë£QRYB’Z¯+}!ŠêŠOâ·ÙÁ¤# Ä3tx›˜=æôt#¢Ú¡8KÚZ™e%wŠöo€{ÌôM,ª—³ -„Ó=ÚÖS¬»ãþ 9r07¦Æ…ºí ²0Ÿ%üíúë*Ê(nP½ ìŒÐÈп¯ŠgË÷Z¶FIb@Azfý™8&½ü"B:ßA[é‰5D¯EiH÷z}è™øƒLFÚòÊ>ÝW y"d·f]æá,u¹º^Ý”rYrF×åú£žÓÿmHs©_-y‚Ô¾Zˆç-Ó‘î>”Ë~ê€åã½NŠ•¢w€ð‹Øªð!³ñl"ðÛÇ%=˜^‹®·c{ÑìfÏù¼û¥mFlVHÀi5ÙíĦãØõļ¥L8ßý¹LsÄiߘ·«vůc¬ ˆ ë?I§¶ÿ7it>Â.-Êã­X©(¯ë0%ó• šI½õ¨íÏåYÝ$¶‘VÜßx¦UŸ LB@üèqýWêÏéýŒ~ñ‘æ÷Z¯J^q.q."Z¿DȨEnÕ„éfO›š¾ø'´óGyöѾí]dQ\´j‘ëV÷âeÕ¶G#hvQ <‘¯1ÃËò?Û58ÛÃ×[ ùÒÖY“þ¸6ª(n0¦—B<à“ÑæŠÍ`+ð¼‘ʆۃÙuö¼fD/Ýâ &å*rªµÂ_.Á¼-;à‡º}u]¸4ö.D¦ùÍáí¸·¾Ã‹yþ9NGn>²Óó®ò¼E"¥SÊ釳V?Iü.’”UdZ ¢#.K#wâ¶—ù˜¨ É}*F­0HdM‰Ç†äÝKùã××ë¸çëŸua–‡‰‘*¼'„ã6¹Ãpº²8¤A³døí-ªGÜ0nßþÀuÖM³Nrs3pqîYÆ ¨³?³«,Ÿ;ìkŒyqdF¸f³ïÝ{(ŸÜ¥m§’fCò¤,°¹ÄßZ/š÷¡Œ*1e@ûæé©“,ë3<Ø]D Y"'«oç7G(RJ€p8lËuÚiG)OeRP›Ï«–ßÁðoçâuc4‹JaC¢Ü‰n‘j¾ð®¿8 Ü8ÉK†vs–]1›d"³Ù¿¯{VšNÃOüŸ¥€Á‰Zê(Œ ‰LM„j`µ;šhªíCl§D”ïI [Á,¡]ªt“­k«•„uœ.å<лWWmuzê½¥wã1m|“‚Š?x[¼˜×XN}e>¨Xo¹+Ñ IºÄFñ»3ŽÛê\j…e?Îl ¬EÆY%Æhq ˜Úú–£qýËû~ü‹{ЬŒ#L¼„s¿^ã#‰*Ý«æ7é”tY›‹ô«‡Ñ(¹µ‹ÿEi/Pr¡òJȽeŒrfÎc#‰yw¤ ¢±{{–-âs÷ÓòUÇ ÞÌÔIyZ~ ã[z¼(¥á°Û¿hÐèƒ –âÛI%qyšwÕGZ7ûÄ¥¤r:ÎÚˆ¶‘ôß´ C›É=£Åò”Éûfš…ë…çêsÉ}‹Üvw¿m­kÔÜãÐ’½Çn¯îî³<6M„󷳆¿{‹£/A(ˆ±¢i)½[ªLu€ê¹–Õ Oq÷òjOh¸¯6¾šUºDÛD‰z7Ac-4ÇÓ¹YÛ+µ«HŒm%äȲùÏ3¾0&eéã:RͿݽ7s(Ÿ¿ì®«r÷<:}g×ÌX%ô:QÄ•êT@anv€I¥ÒFMaÝœ ˆ¡Û ÷æSd~¢åG­~_A + àõÔLêˆO+ÐY^µÕ·Jó¹Mò©Êâ%“™%M€&‘W‹Vª×úåy¬Rs$­‡@À'm’lñôžŽ†ëó((ÛðnæIU¦yc!REéIÙMk>RGpC€ ™¶ ž'G:k\=yúÛ¹ýÔWçwž¢\!NÂ…Ê@¶Ñ»‚ àaÅ)¨)ŸhØ)Äɦ{0¥êÝ´ª“ûÌ´$ÐÐýûüɡޜ…RèKÇèBÝžvkf‡EÀ@]hÔykÝøS%åí \^ºèHè^ 6ögõ„5Ò<úgaÌp黾Jª]¶N‡¡IŸ£ ðl@8…m¡Ñ/ûæ¼®ÆJMKSû“÷ÚÓÒB;½S_hy?ªˆ EïÓ+OCäáI ‹7º.íÔBAÐë¥nßòœK¹ÛÕ ÑÉgè]ÊËÅe^³vnš Ô¥¼E°f'þ'ËÆ uÄõ|'"1œxT`?XÌA$Géäâ™'§ÉucigÊxªWðYõZrK¢ "š·œCó/йÖÞÍmËç¶ÔøCŸ­eõòfGºÉaõ¨©Ó[IY¦Sq_ìFHTló÷¹¹Ž3€¾S:È+¸:×U¸jZ…c ãòò~EÀpzàûœ![)§Žªcq$Ð’®w—ŸñCðˆÜO¢ûQîúé»W6ÕU 3~™kZ´—½< äP ¨,r’ñ"xa°ý^ÿzˆLñ޽b =2J‰”¬¹µ*&/UP`GPÆ=ù~ð×Òº"–¸@Íi™x©l9Ü ]Í3Î9îŸH™¨GÛÒN[‹Ó§Éì Â-Ú!“h„J3º&·ï—;óúÎrÜAöŒ‡Ëq;ºb¤7Ÿ{|–õš¿‰:a/ö©Dûq×Ã(ÛŽ2ì^Ý‹G¨–@þb³±a‡‚¬sá0 lEš“›EïÚ„&ëý†ŠÃ„\Ù¯ð;ù,ÒýÑþdÚPdúÓ±^›ë|õNB…2Æ&×wxê8…%zÚ|˜‘\Ö˜">¨Û¥\Ñ"­¡PÆ@&ß¾Ø÷ÚŸ}¸N-—³nKG»N“2-— §ëì§Î2ËŽŒ¾qGa›ŸêPœá¬~žÝ§/F:\&á¤ñP‚¸«2šÖ„T, ÍtZKE™Z÷ã[xÊC•Âðô¶AvÁ¬@¾Çùneiíò^ЇUÊ{kªß þzÇ«Ÿö–õea$2×±}l8!6lúål`½bƒ€nsþ%¨ÃfiÿT:ÍÜÓ]pLu(¿ÏÊÓãqqÚÚ n«G¾d {Ç~Ò~͆¨a!øßŠºªÔhïR9Uj£•¸HÙ^JÈc+©¶J n”X·#G×˺‘EèVÞúNî¿LO5D•Pràc2qs?žw5ï:¬J~NØr•÷T<¿ƒ§ ÕJ1"®øXÔM„R-m©!Ýû„:ZªV.ÛĽAnIüÃM(Y %Ž8©´§ýpK/ Åð…¬uð »¿E®µF¦NÉTÚFgžá 36„·¿ýè_c¬&¯Ø×V£â^gÒ'äíÌœ/‹Z{8²RœÑš/æéhÞ´ {ÿP>&kÅ—)ÎÂ~yeçÒ—ãØ5¡¢!•cɹ!…QR<òR{ºè âŠÂ­„ ‚ľòSóOxÎ|­g]¯Çû…ó.?V¼ÃFT¸Úcâ Ý’z±7 óWµ=_!Õ}è(cM×ï˜ÿè™R±!ö·RÓÖ®™5A¡°~·© ¹:Š ö¿Âš"H6Z¥W¨½I¤’I$’I$ßÜàÉU9¶@µzh‹aÑå)SFª»Z3¦öDW2£×·¨WÖ쉥‡tÈsñ MÐÓ:”WB>ýªæì8b‘~3ˆþœf—Ž*úcðEÌJ½5*ñ¿˜è?Hßíh+Y!8é}âõeíZiç/ã÷6ÜJœE©Œ%çB‡4(D’Ì»VÂQs8yõ¼ßr›aUô¼;jËwÎU hl©?hÀH.àæß-D¸ÀåOqT -á3”lb· aॺl°¦,Í~]zµ*¾³‚µý¾†ÐqÔz”ñpËâ;£ƒ™ýÖÖ ÊICWɪZN³[eý#æüCöþï©+…ÿWÙsµi'÷kÌªŠ¥¸•zH(¹§KhÂ@"‹œ ˜ÞŒQnàmß Lb”ì1LTz{,ê®÷Êáó†ýUh ̼ 6ÂÆ£|6‡+<{‚T”õÉ™õ‰™½ÜLÆŠìdÎw%ûÕünœ°2 EaÑQ$ŒÍVOÇФÇ(@¾ú•pø!F²Ù …ΞIɛȸ)»ø¨Û¨"ø¦=ò£ŒDѳ*òVˆ§¦D7èjä´„Û,gkO¼;ö)Ðt—EÿP¥þã6#Ä‹k }V”²Œ•þ„\ÝP+ñNÚnÜŽúœ$¼ü3’­Çç°ç穞 :^¹é8< åÌÃv„Ü!Ë›v 5FPjü¾Mw®›¸Ù7„å¿A{Kz#*—ïùA÷ÔzuÖ‰¥êW€!Õ–·u0G/ç^åºË¸‹¡»;Ôç—ÿ3ɾbŸæêê’GÅ«MÄ3ê¸ëeXÕ ÓäËŽÁ;qFïŸ “1t´,ªY@>ìþ?éÓîªÊAâ[„ 4‰y™QÛ T¢~É”:¥>ƒ]øÚ ÐæÚ€z¤×u&/CœÅË“)¢ lÛâùJ¾Œs5O {êÇ õåxEõ VH艮9(ã?ve­Õ¸ ½Lm˜êÍ+ÕàèOA Nl-¥åtB.pŸ8¤-*¢}²‰rQöcË^þQÅ›õ»Ž}˜ª]匭Zýc=¦¯î›ØÐÈ¡^k¨¦jéP=ªarjt(ÓÎ:"·ÞKq5Ï Ê-¦^ ®™â\äÒ'yDß²q ]ÒªÝnw'§:u§Q^[ð|Õ°WrÍ Š–Œ² ö"¯ÆVH¿t¤ˆÜÈøÔ0Yƒ¹joê(ÄEz ܬb;[tˆí9x)(xÀ*ÌÌO–v=í …Ç¢(?+­¡îìÖ‘å‹{TÝ€¶’@õ6¥—4wª¶Øàºpð0=:,ù5ºÖƒån­5•FLéÓß±ðlôB‰TZ.>Zü 2Òx&.à ${À"÷¦8tmBY) ´üškž ËÉ“@šÐÎÖïp¼CèÆE«&°ÕßXаÈIcè}. ‹ÐæO›Ç\a’>Ùƒ'ls„^šQFÞÜû¸9ôˆ½‡Cúè Õ:ž)~8~“þGm \è­5©²º%Ú})‡nD†u™w¢»3ƒ¼‡ïùC»zì…¬OÅ?9ÐkRnÐbu¯›ýÈr«²û»Ú$\[äÊ„?€;ù ‰‘69QœP;£ŸX¶ôÿwv5„¥›ßEo-è­Ã(ï`Â…[ÓŠ!—3~‰˜…ðr4œ”Æ,°¼lã–'ìÅ( F9Õ+`pª;cÉï_GD$bÚ<àÄØÁžKáàAw*~©““,µ”ûÜpëíäú°!h|u €èÆ|ˆxô*çÖÁÚeꢔË1÷ ÷ºBüÎTXác1rãEçÖE“,-K^XŒ­W%ÅsÊh¬ ÕÕ K%û I‚Ð<~aü²qb×t ÌÜèÏ.‚Ð~]‘i%xzÿØ €Ù=B’LZrP±ÃI¨áçßfE‘&Ø>8ã6u¸<8>sÔéL¨â“]_*›ƒ{ KJûƒÎµÏ½‡'‹rôæ-ôÉŒ †½$-—‰*îùL™ åΚ’àø®¸qÛ ÃV;5r57\¶ýý°Ù¨…B½ÇS†í·ùì7ó=]öiN\Ë%` <5Ï/´Å•Îtï¼4 ë2e™xÑß5KÌmØÁ®KúŒøã…nø|Â&é‚ði C¹÷¸ørsh/f3-¤Ì·jéO¨·bzÞO׈ áÏ”xíU|ÙÛOª·[¯ ¯:’˜(bÔc>,còe-"Aå¯òÐ9Š3úã~ä­½CÃxOs‡ÿt*Ñ÷4T’ I”[¦ör´ç(uÁã²²5ãÄ-+úî–‚Lobhâ£òöûVgS9&"_vÛW:ÀvX …ÿ@drDaÅ…ªq±rô1\õjÂÁD[»ÌO ñîõ)‘«NèäH_Yt(´ZqÏâÖ àã:¯7p‹Ò²òZl܈+ú¡TÙµ8ìÔL¢ °DĹ„—çæ&Ž½Ô›Uƒ€‚;‹¬Åÿè<ùè´²÷Ås‚ùp2]°’wâ!,Í38qÓað]vÏ›„Óz•"ÆÉPÂRBNadÎ/Z •‚Ç•”áìTk¤ —°cÏŽ› D3H¾Wi>âú/Â~|c.Ç?ôfÁj¢€çý9ý³p–z$Öš0˜»´Òþ.rM‹yË …Π̈Œv¡Ú€Pt-Ëw-¤uÛïÎ/%b9zHš¥T•껞’ÂWÈQå¾Þµâ›ö¦ýæfÍÚ±çÝœV²eº.öÍ­r B)\·v F.Ýugù»€BßL·kN£oUkôþÌ\˜Â¥©; Š—5ŒŠ'\5vÍ”–,BQúAasŸ ,›¿s`¯o¡Û¾Õz/îʳÞ"zñ~¯½u- s¤ ’/e+@˃#ÜÍm þëÔë1WN‰k«3YìÏÒ—Am¶×¦TÝý~“±0þõÑ^1r áPP «Ý«ô¨§ˆ}>rò(“X§WêX9 7±¶2 ?Ö•´ÜøùßSñ”£†:E炘:î’¡ˆÇÐù÷l¾¡ZÍT-‘ë†Õé¯p7=_XD|7„¬>]é¿í@ž”ZK E©öBçubu°Ó/‹À0íý²Uü½ïk³Â³^õžœGõç{U¼ð6hç«ô“aVË1ëü¿Œ¬ÕVÝa\{rþÇІ#4öVhDZ¢VÀðyÔ¨ö¹“ž§'¤;óÇ‚^÷Ï_±hÔà`Âkí‘ùSSÎ4>Âíe¶ ©ñlqpV6),q”¯SÓQ­TÃtÏ:•e7tlœÕS 3-`]Ú#0¨X_p{Ã32_¬L©ô”óVx—²Á¦/¯~2 A.“) ~ •Iza½ìÔ-ɱ—ðñ1 i–éÑ%‹Ø=»¯Ò§Œ·3•»àEÝ6LAo)ƒ+ Séã†Xà×=|—â[Å¢*ªÿWÄP~%}‹cÀlP²ÌøítY È4B›¾ºj2”VbX„¢H`ÚK‘™¦ítk*ùc õª'ëš‚J/xÒ®•Å "ªô‰•Z Û¿Œò‹ÿM^Ù^÷ƒ¾>3#„ˆ8¼¦ÂxsÌ`Õ€qÇ"—4WUטgêj¢†d'Ǽvh¼Á€Ö’ü¨—Ë*ÑÕ¸„wl‹ó‹$p›2;Õ•±²´ð›Ò.¢ë^–½ZiÜ=áÜó ¢ ¬•‡ ÆãòŸ3w¤ÛMôóû¼ ±pûÆ6»²13ûžÃþf²+þúêç“ØÁpçÏÕ¢±¤9øE ØD³³qÞ?HKÎ0‡[ø²nsÐëJtë_ÒT8bfBÏ8rƒ>­eTR¢}âæ¯:¾bÍoMy£ŽÕ¨QƒÝ.YD™JzwØfyùžPZpÈ_^ 2ëm1 æñ€\1]õ"5ÂÆ;6_ø<¶Ll…&~^V'åÔ NÒªÒ^_SØ 仼š«ÿ9V”›FŒÝKØG=ý›­â;wX{QíÂ,k?Þˆ€Ò û’È5c™Š‘ÞÛM3&L°»;S¥ò÷¸í“™ÙFVOr÷Ên#ÍÔãzkMø¥"Âí½Û~Gm€9’x'ýxû²›uQ·¶˜£›âÎÔPp÷íŸ.µ+ƒ¶!Ô2YŒ<+èÕ0í+y6ºa)¥¯ëª×Ü'ƒ³â? †ž‘<˜6Ç€À­m+vF¯“–Ä©LJƒïBñ¦9›¡k¾·BöÄô7`~Þ†O–þ¶"™0Ÿà0÷6ã ÇhëÅW‘<Ôrå•[¬eÞdSˆüña>í@—Bov bŽ•)Ó©< wòã ~¤Z³½‡Ùð4=Ro§(he\“œ~v}% ‹À …laWûè3„æëÎVEŠ¡ÜÞQëíQwLùn!(Ÿï Úðö3ïh;'<'è +Ïú{äÚ£¿E+ê0ÉW­s6s;m%XÁŒ¬Ÿ`.+(æ¨P§H‹ BÅ{6.6ÿPH3ÎMw%ný¾ÚÉ!S0*³·ü%Á‘ÊvÍ‚á{~3À¢ú»ßÒ‰$\M/ë„1c6F›HФR%XB·4¤SoçÚ’-²Ó°Ý|PЃ_×jÊÆ"Ý2ž³C- ˜ŽQ¹Ù»j>÷™íä.œ+?kbq²´†åWFÄZqÙÚ»÷~Œ)ÿtM›!B#d¼V²*béœ$ž á®/f¢*&ÇhF/Òõ½6óÎ-ZºOMùh^h‡h½Ó (½@Ðî¿[ýæõ¿=‘ˆ›aá JF?ôœôDHúÔäü¶Î‚çßÑ‹©?CòË$ôqÁsJ*É1Àt»í0{ÏÀ\O¼y¡4STpp¼ŠO-ÚË¢¶5à¬WJµF6¾cXlƒ#(5n®U&†C×¹ì¿NF‹_¡Õó‰ Ç<ÿ òÖò`Ž6_Ä­ÌmuÞsÛrjÚ^Eöï”ñõ=× ºaêÎÆ,hÃå"çåzø¿z¾1Œ…h5ÐóWq*ºÙ\h\Cp ²#—«äæzéÙ<©÷ÇŠ,yt‰Õ`|V^-#6–>Á“ý™¿âò`IWØKï€OÜçB#ÐÛˆn9²|i!oÍEXØ ¿Éo :I¥DÈOè¶ag‚Ð/Œ §§oB‰b½y@òiúÖÏÈÉÊI› š"In‘«&ξ—ÏÒ㎛õyËׯ9¤¤Wù´aFÕ!¾½äjϼnÏr€Y_׃©DìPÌŒ‚®1‹×éú]gÂ͉"Î+ç\à0DJò@=v-Ÿ%àp£ñ49A!³QXV‡A NþßÙAc}–±Š Çy›…ª×°ªÉ³Ï‚Òî04å‡ììà|LÕO@æ1¥Î ðaZΧßân i°—ñga.wºaÿ;˜¢u4WÃJKK„Ü gäîûK:ͺ¦¼Í :íˆ0ö´É')bÉîÏÕkœ~txS*A’SM«²Xµ½L¸¹™ŽnvåyZK¸½¯¨;ZˆÏ%ÿÄÔóÛÒ²¼šu’ © nõŠnDûíi÷÷‚ËI¾`VT˜÷ñ¸:M‚¥þóøïÞûå ²“UȯAiÆö+yC\„Û[‰(Ǿ)cæÝP·u;|x­7ðë“ÉJiÄocc£(›[‚9G“%ÂÿMK±d(ø®D`ÃØÛçÙLIm_¬N4IÛùaZ"jåHvjB ÜÞèü„tIX݈=–^ûAÅÛú2#ý`wÁ~”ý#ôÌcôTt ?¶”TDšŒÐ{B÷¼zïezÿ, ¾=0Õ~›öà5/QY¾øÖ¿ÆAÛú}XéÅݶ#ñáð:Å_ùY 1‡Pã%-"ölxµÁ± '〶֪þ+qv„‰ Qs²V»H²©uJáné >}Tà¡Ø’ÉTä¶œvÆÙ¬Ç8_àéžõ¯¾¯{é†îÏïkûì'¾¯`zßC}÷kßg@õDS.a×x}¹Ý% ä ùÚfΓøç·¤S‘üò¼å˜Èrõ½ñªi&¦èú368¡)R¦èMWÛAzïí uÃc¡8¾c`Buð'Óð=±05±p°Ô&Éy1VùG]´Pã=÷©¼*˦4–vŒï 橸œ|[»„=SÓÆ|}GäQ¨)uc«Ý+xØ#¤ M,rá: mTÊCb»ø Ð0nsºÞÔ´Õ ß ýIQªŒð†Où’öí:b‚wál+åĦö½ ë+BÔ®þNbYšÂV5g”Gé÷@dÛ逿ÈV u‡¿®´…]ƒ\úàŒ™wv“!¢´«æA ];‰Â’ù•îÞÇ[8ãЭþÀ7M*wÔËÙª–Mçe^Q'{)·ßH·¾;€à ñÖˆæ_ ‰Íó)î¶% Z”eå¶QÎ'(¡ÂØÖH%#!¼iÅÞ_¤‰„Ím›—Í ;þ™3ûCèéc!½Ü©Ûúñ¿8mφw>5…‚V!âyýú¶ºfΉ¬éÈ,K{ÒSñióûE e§Î¢*‡_`K÷¡ÛôY*–/ÍFO®›Ì¦”#ª¶{ºª#Pµ”IHÁqPqKÜ'=ô2¯—2e‹‹´É¯& ¤`Í$Ag¨Rî±0ÀU–”ÊH[¦û«’è‘§ü)é¶‹±^¶crTÿ/Ú›%÷Ã⻇¥Äs¦Úöá:<œ¥ÒcÔêЧƒ2oªuK¬ÙBô3DÕõc‹0éBçÅñˆ´aJ™O.E«ÛÁF§D=™h q†´J,=„“ «ê¾ä{„'ø?ê=Äeùd!F|ñL5½ü5Ì­y_äÏû´?hE•làÏvÁR!$ºÎ¦úŸŸ'nŒ ˆ¢®Þ”ñmDõ/†GF¼`¦XrhVpëƒ”ßØó;ÌÎñÜO¸?T@^m‘É #L_çB:–gb\']JwúXÅ›ÏÚAÒ’ËF(|Iñ& Ù ¢u¦«¨¦VIÇ<˜)rŸPHq‡édŒbº¹(šq{;{ ²ÃL™V‡”ÚÔÎ0 Æ—+y’«ë $ã(v“Ëð$lÃ`wAàÏ„ ‰üÆð\Û¹‚ƒwwVºÈŒAµPBk[ø§{H_zëeB –“ù£À­6‡'‡%âq9¹”Â;玱èIi¬*:Ñb(N˜åT/½Žï`pß¡dT [ ¹sÎúù†@uîÑ÷2}˜Ä’ä ½·ÓõC]…ÓMd‚×ó–*ºå5rl³€G=&6Q'ôSÞ8ô+å÷Ñ‘'^LΫ1=vØ[Vó‰5òœKÂÚn ´m‡Ôh–Ô&•Åñ~§¿˜¬À"Â}va0}àÿ"çQK,]Ì2°ÑÄ~˜§Kñš¤rêÛ€ªÏ5ââúMΛ¿Ñ ^W’t,µ`ºVèæ¾„z£;±è7©äÃ/,bëOìS†îã«oÑXÍá}‘á‚ E~H@¤Ýi WºVº[ª¶?*Ozv…—Ï‹úÐ˘„Duøÿaº!^פ¼@:ÈQ¾:x™q>.?»†ùê»;i¶Éÿ•.ѹI¥–Øi„|T¼ÑÏL…ÂùU§6Ë{Þz¼§´~bI_©¼Lgýëø¢©Ö#¡Ÿ_q»:p®£iu|Ä&úËý_lÐðñ;2@vgçÏéצÉ8L{håÄÞó)æÀ|n’¬qx™3d`)>Fë[ùK^ñìxÓ9Üsaù9Àl ÍïC@ë}? ÑÈ; rÅ:£<ޝ鉒H眫ÏcíáNDuÂiåüüñM“óe&GC,^Í--ËÿZÔr™bÒ5­(kö,O¢¬8°Ñ•]ºøð4€ÜF!=E|‰§IA7-ý›"ëR¼ËE«\K+'2ÓÎ!;uçÑûæANóZk/ó.U„I"SÌj Ý€–d×*EEzGÜyæl¢"CÏò"š«wøÂœº{ƺ^Ÿ"4ÃoOxßÇ H3´»kù»”Øfª¿jaøòßPãðØc¯nóí¢þB„5ˆˆºîÝz÷èYÖhùs™4‰N†öe9Lû~îë!x/»‹íDŠüš0Ê^°s-ÞŸ~—îCzô[(___D \eóëŸOhÒå½›S×Ê—«"ŸÛ­„ gð•4-$‡]Ýê)”×hG'±}ûèÓË*¨sž|z8F6‡.â|ÏŸºTŽ}wÝ Eº@éÆ Öø¨\[c<“«K7^|Õ}Ö ËèWþeO³¾×âI[óŸVY¹‰p¹‘SVJ4ÎUXC›ŒÉÌíäÀÔ%)˜>9ùžú`{ÑE¿wY€#!–=1&>ÉåzÔÍáx ðÖƒ®ì h¸Ú¢,ôòA$óšˆár† äÖã#t$²Óû‚îŽ[fQRW‚‘‘ÆTêמ×%Qn0½,/h ­WîYNö$rÄa>oJ, †ùú s¨yÏ—`I›°jdHËp]ì×!Òw µkùŠ´grú•cq+[·£ñCîô ËaA[ùÁiû m^b{ñ³ º³¢É²º3ªùZSϺ?TBY¯_…êQ¸ûò0?Ïz²;šÅ‹uøÆ`}Õ=QÀt'þèuˆ·ÿ)Ì3˜˜%„ƒˆe ‹¨h5c?ÕT°6[F+hË®€6pt#øJ 7­¶Þóç}ªÃ”ðŒÃX=sä.JÁilî"žöÊòºìëiyž¶6íú³X£í:²Äß¹=`KÛdĤX§Ž…¡”Êš,Í5®pØCNrÞ,s×ðÎP$2^–ü¯†¶¥±JdNÙ ‡Æ ƒŽ\ ÁÙ¿- úl,·&©áö²Ék­ÄŽýUžì†ðŽ€ÄÕË 'ys(H9õI±5œ<”ÜL`ÏÑ"•Ÿô`Ò¿#§ÆižÞ‡†€÷Ø‰ÔÆã"SS©™Å9WjŒxy ÉÀóß)í6)Ò½²¢¹©Õ7²ÙKo#šÔÙ§ÀÛƒyˆŠx‰Š¡ œÁ€K˜Ñ‡ñH ¼ÒÏRá_ÝgÞTR1¾\²¡¯[n=Îs°Îðvl.V)Ž  ŠIº9ªî(’àþ ;uÕ²,'þGXüpqUMî™­6änw;0ë¦!¹òÕLc¤Ÿû—9Íï¶«aÁ‚a'ŽŒƒŸ7~*ºµ?¼f …Ž01ií*©Ã@ e7-ãénM­Ü'JéMeúáï/TMF§B­î°V'+¯¡áúºÚý]2þÎC¾¾aúºéý]-C¾ÔþÒ`ý]pß?§hø}û‡}ç¨ÿkOÄä~}@/&y$IÝyJã@¶ÈÃIXºèYUäQGŠZ“!øö2/¬‰Â¦Ó3ûtZ Ì•™ç€Àõ)¹±žUðj< Ÿ”%ß‚ž®Úà<ä°©‚pJ 1‡Uo RŽ„qß!¦F é™Ï³é·aš±Ú‹~Mz˜³3žE©H?f¦,¡pÙÖA•d9ˆeƒ’ÎÚÎR\ÙC1}ç{|Ôž=”üu¥ÒEëm lûaîÿPÜÒ÷­Ð6¿Nñ•ö&2÷’äý«8[~¬ˆ¬$:þ‚ÒÍSë#W.j¥m£ž³ÞHZò‚QR;¬ÈâX aL™˜Éä7R7tÝ‹´?ÒÌ¡h®Ä@v.=¨ß $µ¾ú1%ñ+UK7ÿAìÄó޲Í?ç3‚¨üBn{a0Ë b”Þ*O;Ö;ðrJv3^WG¶a<(*úfƒÎyXÛ±<íÉC39Zæù§(/m¶&yëmwqÅh)s¾J—®)»×³u°’hŠg-ÛjõlÞ6C€µkV}hÇ!ÓPʦùsÄÒb¸F‡/q;°M˃oc;XôÅ+øÝ !úòîÍQùüQŸ¶1Œð }˜¼ÆoW芡¦¯<¹öíéT'õhŽ|2Å-Á»wç)"»GØE0ÓÓÁ¤÷pû €²Óëâ䣧ª@e HòËæœ¾_C²µ¾ËP‰§AÅûÓÎmûaŠEØCT¶ ß‚}‡žÎñοÃg-sÖd¥.$Z­`Ò(¼8q°—T¡§Ÿ´Š¯Ëƒ,ãŸæÕÓ×8¨ gYs 5‡å1ß®M3ZlGª|*kNSÏA0"a©Ôeí®ø>¼£i6/¥ü˜Ê±6îd•$ ¿lLޤV F…Wì4ò¤ˆ6è½¶T±9l\ÔU¥Y‹‘wG×X ЧÁBkxàï+})¨úáXq"½•æT‰t·’%ÀéØv‚Ë%êºy¿4ým ƒüB½úÁvç‚ôhV"­ËFxZÊ|ŽBÆ  Ö‘i»ÓT€I曀¬œ½ŸñL7$ˆê`žëêû€Xl6»ÿ>“C¯PbòV*•´ºÅÉâ7ËŽ—Uºq“«ä8ûƒìÙ~±0‘?@”aÛŠ\ÞD|(jBó=NØæÄæ†÷£;šÌ/­HÎõfqNôõ²£?—uBaõg¦g\á#ª^Á>à d=ogÒûßöcO~]©ýÜ=G@KðEøîÑÜï2>¿Dv°qΖ£'[ôR®‘Y½9úsmÉ­¦ •1ËÓ×¹U½ e>3¾ŽØVo³/¸Ld-Ë€èÅ;«ÑYóS%ƒ–9Ÿ Ý%¼,â«Í’×1Ò™ÀÕÜ-ÁñF=êQg%Eè­ë‚(ì8À׿ª;}ÕJ?˜ˆu ¨øê”f™QÆØð|Îåéêä—ñn ×X’òÝûQ‰PGÆŽ\D /»™Ú` .¿39ÓTz­)•Á´J½{è}OaÈm%¾_©D¾A$¼œfõ|ÂÒhˆáVÙßœoœß¾ºùb¹@´K'`ìÛ:9›“¸]þ[ÄLá÷Qâ;ŽÓËD„‰QÉ|Í Z—*óObå8´Ë„ˆÍ6×8þV}]´‹?þ¿èI~úuÖ R˜doùžõåV`[Éÿ³–3ЃãƒãÀÍË“ÛwÞ»¨8Δ˜o»îðŠFâ*·@2„òOtI&Ủ°¾O±©.ÔórÉE{BEᢅÁÿ9ÝO¯r°4ùð^Lù¹°):±iÛÃAÕ· …w ËM:ê²§ý#-ÙÏÌ‘Lz“è_k½#Ôµä™8é†îÿá&ds‰lÇÕƒöŽ{O±¾Ã2yANòR¹õÀ“EˆLg]ÏyÃM«q×ê²[$ËÙmá®À ûQ$Üùj\¯ÃEÇÞ–ÞbC/Ù´Ê”]?ø?zÖB‹dØä’ßY„¬ÌãoaMdvlüQWÛ@ºa‡ecºÞUÚîˆOB݃Öù/¾3É:÷>š0S€žF¨± µp¹0:ÎÚºê¨hm;Õå™ûl$#Ûrã»RÃðFýo5fýÌ-µ¶çíqûÍ÷eñ_ñ¿Ê§kÎåD-äXµu5Œ 1pÐo¿"ƒËÐqÕM% WØ!¦Ë1Ò´¬bEÞ¿¨IyDX~Åéã¹Ów¢{nÕÙó<Ö Ìè“xôLø÷çTüĵc>‡ãóCòÁ÷æ#s~ûá yÁÔ*ÒÂj×WýÎ\ºŒIqº­úp“س'ý±œL¾; ç€c«Ü²îÃÆzzæÐß©òVYžê°Ü iÒõùŃù,Q lôæ Ÿ! ô˜Ãe©{q%g©ükÃÖ^þé9äqD¤`ëÄ“˜ƒyDð¾+Úÿf8¯³vß2º÷à‡Ä ǦƒqÏ£2ÛîÀ%Y|Á(¾Ù)Kiפ!;Zà†b>åÓaÜ—6¼ýl=’:iL~Òó?3< tÚÑÇ”|6OÒXÕã¼ø×Zº\#æÐïöØr~å¥zT+Þ\>ŠmÓ)à`?ܧùÇ1´=A³€šá]ŸóÆäêã1>Ò•„ÍGäè!̲à`hgñiùᎠïg] «|kÙ@¨½0[ÄRØPMôDe—›ê"ÛPÙLDjæ}ÿS÷‰‘ÿE2–9®QBIFË©Ø4ÁÙ¿×iàòðÉå"³GàuÏ2(Fµ˜ zlDÃY{¢™)m—Ù.¢oôãÜ™´íˆŸú\²³¦…9:–J^XTŸÐ–ñ{Ü$¡øÐOü6‹ßñÛiù¿_X€¾$öÚÅ@$4Z2 FD\}STPž»™Zµ´uNiž¸í;‘S©àM(âÊ}+´ y¦ |¬û‚"j…u7q¿ÃÜ×l҃»‹í«š¥Iõð–Û¨Ô`¶ÞiÀIS˜wºˆ “I[±×Y©T_Ÿ™º¸2Ê{ÿWüØ{e(Gƒ{&ŽWB8QŒåJþç•n’äv/‚ÁÂÉvlèvæc›ŸŒ­YFÖXE;Ë:‡^GÞø8õeâÂpó4¦š®|iöÖ$BR.ê8w 1B`[ œoM?$ÙÉâ]Ô&‡…h´O{–ãô§Öú†·iTeh…DN=%Î8Ä7û#‹“üamÁ…¡‘Ç1øÕ:ø$»³Ô©¨0)!>ãAô®~Dæcgk%ó`n·Qu{Oõ© ÆuÇ€•œ9i°æ)äzwf>ÔJþ´½ Ô«‰Bò€÷U6mÉÝcÇÃkËió Í»µÎÖX|Rp©pDÕØ›‡Qf „Ý•„öµƒdò=o}à—¥S~òó«pIN¹ù P‚uEÛN•çæ8 ¢O®&!›Zsà݃Á/îëi™(ÑP¨ˆúéðÙk÷¾ÛÔÊ)mgk¾…kU‚‘‡¹P5d—ô³€îoǯyoƒXj„þzUÝǃ™ ~¨s»º]€Gåˆå‡£!…×AãŽÙ“…ŒªÃtÔz”¦—ž™2¿Š@¯ȘۘÖˆÞ2»÷çö;0HUð—dŒ÷ßÊ”­)ŒF´%Öi+Z7i{†ìL-l(ç<ãó8Kú|E rtà¯ÀÝK¶7CdÖ„Óƒ‚Aíd ư’Jéh‚òp“XÔד·6I©§Ûn÷͵Z…x¿¤¶•pû&’E>¬ÝõY¡€¶ }ù4Ì@LÿneY7"Ö©¥EÝ]z¸ŒÑŸ¯JÿYQêè¾( ÙÊkí‹Wâq¸Ü3b”kÿaÖáD°ùž½ =råž{;B¶ÝÑŽëÎgµÊënÏN¡€ÄìæW0ß®j=ØÚ{3|}î ôÁ§ý”ÙP ˆs]5–¨-„«²FâÕ…46Õ‘Í%‹×ÚÇ yPvÝ–¾¨BD®ä´[SPNdñ«ñ{§+£ðÜ8àyAbyºûÕw”E>Ñ4]«ßÛ/«2bI Tõ2uÆ­ÆR®yŠBOæ5þpZîXë`Ìp¨¯m¹ _ߑчGfgo¬ â ܱ (aa]öãßÑ'?üsáÿ»¬ø1æØ™"LXº÷Q€YÛiGhÕ®öî½(É™±É®´zÛ† R`œY½yÑå£jÎÁ >±¡ÖÍ ¶1• î=qøFSéóS*rÐ.¼&ÍÜ}V¦¢T^«,úÊÎ^€õxʬ@Œ#ë«v²¥]{ASmÈÍcUvpÆöé±dÌ):wô æÙäí–ÞôÉêÅ],ûülâlÆÎm¶ m¸¼Éœ²S'p ãr/£…Õ54utõå{‚–E>“yHYÊ Z^bÚKX=l¸¾`Ðû0‡GwÂ^íä‹%³Ë—E”ÿK;/!øÿq…·ò‹·* ËQÛ3Ÿ`«wE¿#(=7¢Ž‹òŒ­JF_:Ÿÿj/)ÌUR×ÚóÄ2iö¬Tqœ)KŒöû­=ô¸_ÌÊvfc¤ TaKAsüªòtâ• $iv’–;R¾ö7Ê•™læLüóñ³åÚízpzeSUà“J@ꦨ¦hâ±|J2½yé\K-CŒ×Ì‚ê~rü_ã?c7ÕXL¥ÿv¢Z³°øS¬‚¤v£ãýó+¥»÷ÓvÇ .Ì0ûS—¥¯+窿—N˜UþMÇ@½†ÔôÍË‚³ºØÀìmdÞ¸=ÚTíSêsÙPÑð™¸OÔéô"{<Ô$÷xgÙüÄ úTNìB²ðˆ(ƒ´¥Œùu„*+¼MHÊ3¡ƒþÔ1ýŒl!èÑ‹¬+´Ø'JÁ.{ÖÏæÂ5KË7=(c­LÁªÉëEnãÊ×£æh¶74&ÓØhýìÄ#î½¢ê;ªMÏn×ÏÕ~`ô+PðGtœq©±É”Zס©™»%Yš>=DÑî²°S÷Ã4„ÐÕFÑõ"sq1b qÇâPx½‡¿ á‘Ï8¤Ð?þ"„4֮˧ýØsPgtz¼#.NEÝl¦«k´âËô{Ö¼ *¥Ç+ Àÿ8 Mž*Wìcp¿œ¿2C—´eBe=AK8¾Gô}8¥m„º9‰>8~m¹©Eìhgß•‚cD”?›Ï g›QÐɶð‡6uF?ªœßÌsz/±i[@¾4ÌMñ¯© ÷­ b¾%1N_"òØþÊú*ewñÿvIÌ -ä¯ì“^K˜ØcHtì¹7çýãŸ=6å,)öà¬Ý­%¨PC2}·ß=VžÂgФ„'Û¦]L;rf”úHº€Î©Þw£ ”3âBá–º/×á}œW«å%õ.LMÈhMË:-'½‹pC[­Fl?ûHðø†u8ybvÜ/ÁéÚ—la2ŸˆG¹é `õ–}N'° Â‹Âv¤ûû’߅ψãIŠ~,bsepy˜ìàÈqF"#ˆ¦º(r Á¼^Þ0s~G.Ê×èÿ&·Ü•>kÕòPêÒfB¨Ãªdïˆë„¨¡™§xØþ2ÍŒ J$šÀãzÓã}g VB༆ÜÿZ‘ “°k'C«öÀÈñ¬‘tõ¹¢£9×ÛÛóÙÚ>PË‘¸\ ø¡cˆð=¥•¹.“X6o.ÙáµñÎã*ÝIŸæ·5u£­îe²µ{"²Væ0IýÒ÷[­퇋 8u¦®ˆ¹‹èé‘HG;@ÒÞîùDïLä½Ö±ëÌX^mˆZ‰B»YCb#£(—`ÅŸ™DH„M%¸­{`kwO'|2ô¶ˆæñœÊ‰ßŒË1GÚtíøëÒÄ(oao]¥ù ßÁ𴆦ø»S‰Gy-Œ:Ö½ tc*P©˜N.OI)]ùßü̘!H“ÕTGÙÁBF³çCkjÞœ{ôËñûÉäƒ[iâÄO)ÿ4¾¯¢QÂÑËïÜgÐÂmú½6a¯ôZyBÝú”&Ñ~öoZe‘ø¹^’T â†r“:_µ¶ªÿN*_ñÄ!K»\Œ9º‡ÔÞáŸö8‹@ðBN‹k˜ôVÇêJ«XŒè ‹QßbY‰". öc$1ïóÕ­º Ó–X0wâ?½wøÀ“î´—B ¹õ»{ÓOâªñ%îLÊFN·µi•ß«Ÿ´²\'Œ&õòo“õ¿VŽ8pëj3ž”°p÷ÈÿZ€jœåõâ —Ù2p‰úøõ~IÅ–“RHE½)Ù¹è}Ò H´ÿCjÑñ¹jĸjx΢¤ *þ~¸ýªË3„“NB8˜oD‘EW×,ÚÏM®·cRÑVJÓÓ…¥sö²ò_“‘×›-'\A‚à<åâ ¥ìT·jα–÷½ïãiÚ^fiÎGÑ)ˆÄè7Ün01¿„©íŒu•ù¶“åÚ‡ð7’ºGŽã9½•¯ÊóBdê™2 w¸põÀ^bÆcDSî‡zwéü˜6¾"®ÂÔO°\Ó§^÷e³Ñ.LÎî»×Ù+1޺Η ôâeÑ¡ yŠA(qEþr‰çGˆÔNÔíÍuæ­"™×,Ðí®Öõz(™ þN]ÙïüÐñE¸LìÈ7k̉Ì=©ò¼¡'_—ýž¾„,=ZµÈõ<¸ØÜÿA!ö¼@תª¢§<[ËP«Ã_ú[\»mÀG Fö`R`@‹7χrÆ~ŽaŒòcé [ìŒÈ‹/Q˜ŸÆYùõñ z¤œžãg¾]+æBÓOmõÑz@róÁý& /ÜdLÍ´dêb¼‡G>ç UVxJëWªòdÔ}ûû¦è¢þD#NnôN‰£›A@fç$j¯·Æì%ÕùÍIÿ5ÞÞØ+FcD¥`­&õà;R°Î1ŸaÅáњ܀¥êˆÉ™ùÚ"~Üþ´tõ®àö¶T5ˆ=D¥†¦h™•õ0:¾˜GÅy†Õ¹L‡¬5í&oI!²EÓV'"ÇOÇžûê3õ#ÿs Ëhɾ 3Í£ Q»áŠh&x#[âv¡ßE¤5tR¥+I`ý’NT}vPœŸ5}GL3x¼:Qƒå˜¯ngrLËT]@çk€ìà}ôd·ßcw?žVð’w{LB‰W¹”œé @‚ ²6¿„›ò}Æ›Ðj>!flsö¯ªf쬻h‹ÙK{™Sn¾˜kJÄeG™œÔ[7Ç@z¢þKc¾šƒ(ÕYåKÙ=‘¹l5ñEfð‚~Û©©ËËŠ9í S_í”ý¾˜âÞ7Úñ “O—õfúÎå»L2 ‚VçþÐÊËÀ© C_u*øÉá¸ê08jLWÑâ…çeŒW+ }ÖD,+b"È>/~G¦yØdÐÃóq¶]æ˜;(fœ;Ò­¡Þ%B­zë¸eÈH’%CoƒÀ u(þ„_P(äkg|eláúÖZ‚_ X@ùÛrºä`ü}•Vµ_¯úmGXS'×Ásópß÷:¢mÁP¨ c~m½÷F`qÀïöüÖÑ+?Á(ûb©*ój;u“‡n´T»`¡Î!è(”íVÛ©„õ)1ÆÞ*Íæ0žTŸ“žkÃAÑg$h%þ3k¢MzÂE&µàjhCº[عä¨4ñ)H`‘HFôä„!ÕýÃrz@+(Z¿5~eç/Xn™ˆÅ[Ba8ð/ë¿í …×53dg§Ï=¡ž×ÁÅ´—5¯Û{²ì¡ð·wµ6¥6 O>\úNKˆÂ‹UÌÁ!YŽÈ(U03ojK-k\—ï^‚IÈJ5oúŸ2†_ºV.A“E„lpK»K!˜™^Å–²­y*{ŽâvÇ@Ïcñ$¼î³ÑfÆQBãöì—íÓûêÑoÛ¡Xý»‰ûu*|û’|ý/Ãöì¯íÓùóîOÛ¡`ìé¥ùÓ’.G nØMnÕdgù¦Mö'EÞáÛ’ý¦fØg%ôTƒÚ¥ ÀwºÆšÂ5¢¢§÷­ƒèÂPWipã€þº#ˆèñ9ËãÂ02£¦·ª#§[±Ø/oÿlñ±_{ÇÜšðïÜŠ‹˜L8!u˜ÆF^‰Ñ`ìî'¸l,ä¢ù¸öÍ+Èùj£§Þue%‹ñ›ÈçrøU¬ÕîÆŒ1¶pn¯õ]Ðç3ƒ}÷Ç!iAæ×-zv0eXÇ8´€ôøZ…gHçXi“ö  £Û!E>~j‘™õ!Ã`[Ϊ$HH¸pì¢h3Œlºº|Ù`·Kfªý@óÎ<ü&ôžxb1™4Zê4Ï';cpz¹õÎ]G"I^,l9€ñ#ü5à$úC RO¿P ¨G 'íõøè7+2¨@ôlEìÁ›êö¸JŒ¶,f½#sgùÔY8‰jþy]C1&“ÞSŽ+ጔ\YÖaNoȵ[Cæ ~yB±ëP(ºÂÜ5ð&Á01s·©·6R^]N|û~,†«„QKhóôqL|4Юe—|h÷-›èÜl…ªô³¼§´¢‹;m¶û¼‡ÕAsÔ/‚Z²Ü¿7Z ¨Ñ&AÑqý×i;/Þ[b4úY÷J®h8ª4s2’$›0ºC˜Õhò™Î^‘£2Ý”ïê /Ý*æÊ±vë—˜¡mÿ^>]iÐ ð˜r&þYsà`PµÙ×M¼=nëø¿GÅâYìGG‰„‘Ñ  °J¤P˜µLë£Çg³]W\eÆ¡¥î6U£“b¨ôô6ÜÝÉ_Óë; êÓÄ@`¿ÍF±Cî¸3ªÇ'Þ“•¦¥÷ºkž0y?¢CüK\NÐÏwÞvæàc—mç8$zô­J #÷ųÚñ[ýF-îZå1„^K­ ñž^IRÙõ0)>cÌõsè‡Ö24n°!ümº´ +%بú®÷芾#§­¥ÞsŽ{ +^¢¦÷Uýp­þߌ³üÂe$æéî³÷ŠÎ»Jɽë¿¶þ‡G5…-(ÙÑþû·ëò”ûlj"Ñšõ#]J½ùÛŸÎ^åÇ„™?‘óÿ a|ýÐ ù+!/ì©/fO¯Þ®w¨Ÿ'¬¢·=ÈÀ®Ò:Ål¿{£Ï`4nDˆÿ`²îï|®N’ÙDìÔzÞºÑÓúý@…F 7îóq^ %ƒ®ç•\@Û¥A.ðé^|.r£¾îq»«@@Óe€5ï¸ ×úxgw<¢RÞ&³¢ ®D÷TæYÂAº>C– aH@ÉÝ‹¬´~)Ý™ ”ŒBY.ºvŽÄR­æˆë¦ Ë/áØdéXÍI饷x†žFp¨®U(Èr¾)‰ãõ?»!B‹—v¢CF¢Ýü ÍÕ:QÏÑ^)lk1(«[WÖGßÉt?y±¹ó¹®‡M¥ P+V‡iÏbÝ,΋§þÎWu±#‹XìTqtº…F,5ïpäúÊxt‰Ît‰>.õ‰z€ ÛNqWP™kn®¢-æjGPð•Q#ó?®ˆ¶µðP]<+¨C7]j å2¿Iú ë‡Èú>H_®•zWÇóEgM}ˆzÓ­Èèù»rùG•'è7ûÊŸ«?B”] q³¥ ÈËo0Šã³½ìÏåÙ½BpråwL‰ìþˆ#‘ ;%w«%‚Kf—ø­Ž)sFµ•3Ã@‡¯{ÆcxQújeôª9‚L^n¥^âíêE}…c3}ͺŸ+ÛËCAæê±4â&¸3–{ôÉ ÕÓ8äO¥¹_Ât.¹#Æã6!_và‚)ÃGýªú ÷%ô–Ên's”h‹„¡/¼S4\~ݧaÍaƒ’£jßóû„ñï]ÌêÇò·c.2Ãoýò/& Ÿø2•§ d A¿gå ŸÂ„)sïŠ3æu¥LúFÍI{ìG€ÑAÝ ¹g—Å<…òÔ³¾e$ˆ÷Åò%¼¥ð鋆›å‡8|%P5ìhy˵Ueô Šê¢s1;ˆ¯¯—ì ãþLN1‘MT$Xi'µ‰Ã@pòŸšåpÖGb]qL’ÌOîÚÞĹöLEY-¢Ñ%¸òãc‰=_úµ"BåÙ+È ™ÑÀâߨÛþ šStz{Ý3Ô]†FÁ§Œ7à¾$ÚQD’‘ó`Á2×âÃ*4@µçÊZ.4«&%EÈM/Rß¿ö8ð [†cJkH"‡u•‡µE(øVV×6Ê%É]ÄËï"‰`e™ê@¶B]â`†ˆTÛƒ¼Å$‘$;3â¥:K«ðÖ¿ÖÑ9I=’|7ûçµÏ½…ßZ †*×ÄØ5Ê`÷.ÕØ÷°Âæ·¿¨Û=kgëLã*`7{ æDP`"ßPº8¤ÇÁï©„a×L^îŒrÛ¡Œ–;ê"‹aéã䉎ÉúþÉÇ1%­ª‘R,³eÿ@é~B PÕÔ–)ú¤dÅX²Ü¼¹¨|2QžûU9ÁDïù6Nì?dn£‚ ñÎê”`öÕþ\FäRAÎT5«føWâdÝé4(¸Úu‚¯2ݭ˽¶äþÌnÇ(Ö‡hHb/šüOeXîuµ®Æ$8@½›Ù\%<¿Ù°Ú±<¤šÒf[Þ°ì5 `[ûKl’Ñš>ÁÁ= é™þe༠–Rd[a°öBB 8=bRÄÁœÈõÊb[¤Žt-Táh¯Áú}¼þLÖ]´ÏënÓëN"ükóÔ1ã§bÆÊ›u=óV5 ™Ës7&H°‡¿™1S©ÓJ1}*$†Ô8åö¥y Õ##Ç(an÷«ü8æê+>|“V#㤠k "¹{ôèJƒ8….ÿˆÌ0¿q3¡„ûŸ-ýqÝ>º ý£¦ŠKèF±DÚ­XøÙë•ÕÏ¢tx‹9rï¶ ´[“Ñ/g¯Õœ¼K>q7)OXÃÛ;yþná\ZaØflº`߇èTì¾£ij£ãbvï^[Ùó.;¢Nø´¶)’-S$O|B®:æÈ²Ž ™°eä7Äë¹ËÊuªálä{èSÿ"‡Ú¬—»þk¾£IÅ7€›À0"Þž€Xªu:ýr}Éæ¡â¹Psaå’“¬¿Ñ="™à¸Œ©‹‰^®gfêˆ]¥ñ- Æú‡òDlâ3¨óê%Áö1eÚÖžböö¤ËˆE€²³Íßž. Ò$ñ¬\E¶—ä .Ä”6t“9 <Ö°ÎñåÙ5¿oîæ2†nJên¶,u^6-Hp€wîyXô×üaZc‰H0òŸZåY ÃÖ“CY½µCIšd‘F…”Ì¿Pß9úƒ,üf^¯ffdzŸÆ®%æë,!í¯KJ¥Iúø˜J‡5®,¾T¶8¬FË~½NäèÇØ­j§ä³8õbö¨“Uê)©š»ñc›íXýÖž…ƶ=UtûôÑì¯"ÚØMÜ€6Wo]‰·D¨ó#Z‰Ùåm3¤ëÿ ‹¬Ö þƒÂlhߘ¸zò¸(ÓÕª¨@Ó.î_êöO&ŒG‡ós¬íꇅàÓéäFŒÅžÕr¹UéU5™Ú•`€mÊ+kÚßø±&lMÝÚ3Ù­©ÍãQ©ñ9'¢AbHÖ˜¢9ÿ#»pû{ìpî8…©uM®bØœ|†XSÅln  DÁ‹"jÇê52³Dᨼ82’üŸ‰iÚ¹¶¬~ï6²Ù‰-j­]†Î¬JÈ…ð”ý‚ét® ^f›ÏŽ®Ýð ŠÍ@ŽÎ~ù‘ ¿=@s'çÆh¬aV°èH¬Zñ˲åcj6P„JÍ?Ï?ñu¾sKD>´dÃsgýÖV[`“.³èËÜ…œø0 ‰ŸKj¾ßâ /”Ó¬–Óú²*ìt.%2wŒéíaIaý  g+%–:hÍÓ¥ÏòÝî uån:øwò#ªo7E¯\e…öãbK“pØWbûc˜ö…s)騑+«‹$Ïs½pá^Y#†Á?ŒÊ•W{¢~¥HAØ2,DµdÖØ*1ö“ÀZÏÞÇŽì¤=ш™â½pNÎaò,áH”šs9¡ü¦ù!Sï…•{ü:´ûL›×@8ᡇ¡ª¥ò;µqÏòºÆc-Ë´Ù¢¢E·…l¸À1bsTŒôï8VDÍÈÒ‰³Ô2×Ö¶˜{\»m0Rp îî«HZ‰@‡Ü[% "cJõJFtÓÑ•Ç\åS½,ŒzA-bt¸"•–Æv5M‘Rµ3-†ÝPë¡0ü°¼ ŽÃ'‹‡Ãİ7§š †x¨½úba:‘¼ÅcšŽ½A`Ò”¼å7F*´³’çnМu‹|Ï´ü`çÂþŽk|84¯ÎYÍ›±êÊöªÜË£¸›wLÛn…G€¬Œÿ‚Š‹ºËÀ6‰€p–s"ú ƒ%ÿMêˆ.N(+Ìw<ì‘”ª4, “0p3"o ?K†äÒ]U7Bt»éisUp45 l/ñ;<|.¿)œ&vûÂ^¨$kmYƒ& G|RS@ba%Aq†èÇÌPd”ú`×U¤` %Ä_€·b›šþ×ÙPÓnÏ™­ºéýÆÁŽMr°,¡ü]ѳ-%SBŠ2 ­ä™ÊЇì*o~Ýl‹®ÿÙic09H* jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ G=ÿ“ÏÃD@Ý8ÅœªÂ‰§æ ãG‚´—/Jíƒ ;››Ÿªj[q[ÁŒ! ]/f°l9ýÄó×AƒóyÖM‡s„`=£rˆ7áéØAZX7çmƒE†ôôkŽI÷.[Ž"ƒFA0%bÇE{ýØÂÂ*2¬ºv¬EÊH¾€#øþ…òºœVÿmN$ G½fÉêi]M¦5ÈqŠk¡û=ÿsx­ž¢EUæJtŠ ¼—&:®Ä­¦à.–][Üe×b:þÔ£yž×ê U_† Ð(C6†ÑÖȯÿ/PòÀ ™ø+Ä|Œ5-cæ×V€”=éMB¯u- å!‰Œ¾$ü¶€¤Ç¾èÊ?íÏÉ`@À;Dvnà]ÃE9<Îïj16Di»·Ð)a-¦ÕÈz'JExÏÁ˜$R_æ_áIa“•’EÙ¦’ÁEþ;P|ÝÒ1nÓ`˜û§þGúäãç]®zÈ!"ãW½ÀõE2¹¼t6J›/]}ëÛ|‘'P5Іh꾩[„m û±×ÅÜæ YQC†[†ŸbBó®rÔ¡ÏÂïP=€{³­Rùš ñ ÜŽý%é.îël2ÉRÑOwð?Ûln]?&Ã…{‹ PœÓtÃr‘ÿqúMˆ¬¥zƒÀ@Ôêþ%În pdÞôÅJ¥ºAÇ1ÏQrddl1Â*ÏèöŸ¿#@w<´_Ö† ®gé5Ö˜àšuŸaaÊRI²Q›gS)hwš»¯.èÁ}ç3Îɨ:¢ßÊ„öSìúô»ý„4¦cGž€"yÙ@šÁv}¡Mo+£`[§®D¸*‰yimcætãÆrbËüÚ ¿r‘;Ç¡þ©”~@*S âUùÏÎퟻÖë:±"•rëCþPÒ«#:>]¦e*7ãó·gù˜í\ÂWäëj Èéïq°£ÚG'æ¶Y8È(UÝ …zs{k-¯ØÛ 7ü­'êq xé‡9àèÒË€qd7 ì¶Šó„—Œ€ýRðÓ*­s[ëìrF:iêCŽÎ.e÷/aeYìh¹D–DÉfÖRÑ<[ó3ét±¨·5šý…/¶5ÌTÇfÒk™TÈ·ÂÉâS’ÌÈ{´]{÷«ŸTƒ<=Uoü^‡ðªí1ù)þ$•¾¡€Ûâ¿Wßæîú™ýØé'½Í‚¨¶Âõ™hwdeQ›çïˆ2_†г#/c'%Ë—ÛeZã­³îã……ö£Ã4ƒ<Þ8q´ä4 ÒÕõd¿^Iü%¹&; Úñ궃­Šäª¾âÿI‚9¥/ïYË-XÝÅí[KF´Q9•¦jWò™ÀÁXÄSù-ì<"æ-ý&¡ÑŽ3-(!tÑ)kžÑfvû1  Ë+NµŒ(ƒŠºKÈ$½…Éz!ZÜv: ¬¿Ï<ª¡9Û´©íó°#‹¦(ËÍíÅŠk”gnÌÃ*éÑÐFä¾Hz¾C±}Ä'›zŸçL§jÎèø¤^Џ{˜ÂÂZó/ßê²lÂ&.Äâè!8 &ËeôíˆI‰õW³?:Cj¹óäµË6Þÿ…,«cxâ1ö¯T¯þY\ÐÕ˜=O/~´:ŸCf›-µq %Åi8ýé úÝ9=mŒ>Æg½«^9'äõGb¡D¹ª¹œ›Ò8o©ZÎûÁĽËÜ&(éÝ|!·´¬¸ˆ¨> õ¨ÇÜ¥SìoÓ˜ß=Å«A›²‘:`M>0|ÎqÄdÄØO+†lç'é±¶@­Ï݇O¿Áëf…Îê–FÃ\y,ÈÀ~ë°´@pÿRUÌ)K$>œ¾ ®ßµ.×rÓÐÙOèc@%ÎÅ¿};Ÿœg .rt{ž=ÌÆØÐ²Èe ƒ³Ì½žß'†ÉnÀH4ëðgÞÄDG!â +c#$‰åíóö,SfÇ¥NÚÐÃí_‡ÚµÚ´,ÆFOÿàUÈ´Ô©—5ÓÒë`V%¯¬poþ°Nî© à¿í…`1Â"Ç+Ísâ‘Å#!GÕK6"ïŒÄñei.rW*¼ì3á“E॓†ÔçŽn+‰Ó˜qWI;òÊÍð"ßp#Šã Å *ocÅ—?¹ çNWcJ:8KœW<ŸT"ãê‹!‹ªáè‡bbUt$©Q‹¹L$ø‰ì÷žuêwChÿ=çý<¯ šðOá9#‘u„%²êÜKÛ>ïóÈ—IæOk÷@äƒwh}/èú< AA6 íL+»q(×xûà––ûø¸@sA  ¾@µÝ'ˆÄº_Ùf¶ú\º‘È”êëU':D*ÇáIGáJÇçM€EW~„-Næþõö¢âAºrÕ#(æŽ<9i¢Ž`¥îâÒb/ýÃ+؞Ŭ](•y=kùËðn“ûæ;óZYçy#îÍ"ˆð—…pèÛ‹ÿ6OèLÒX .²K‹"¦¿L¨¤ànfh»!³&Þ(‹ÿ }Ìm@h¢×]ÕgutLlMý˜µ%AÆ®®Bj˜+L³›sÞr8»ö'Äȹˆ?!ÜÉEãùޱXk’BË0i ™TÏôøì7¨&nscB½Ý÷nI}f?Bƹ'^˜kg-œÀÒñ!ôâ`Û åöVdëùFæ’§§ÍâŸã^)5È!ùéãÑÑx°:¨züÔïÿKqâúd&lͪjµ>ˆŽ‹¦(ò3MŠSH.³âÿ€- íÃ^v¯Q¢ŒHÈ0 €Oô‰Æf“ï(q  ’¥t—1´8;\¶š¿$»Ü¿Ï69íPŒK{Bòþ E»·f¼ÇA«”Ÿ áæ¾8sÝÓ"¹ —«­2Û¶zœÒÏÖM,0»ÄCÇo›Äȵˆò^u1uU0W›Û®×+yôk¿º–^¢(ÏÏ«Hü:Œ‡áÔøÍÚÐUÑ‚:?:̲KEt÷ãXÔxÐÐ:~eiÐI6SÝèGÞŠ “.Þ-ïäQ­ä³ó_bÈMñL G/€máR…0ƒ<´í°H4Ø‹ÞTœ%8ÊgÊMMVàÈÏO6@ùÐÃCw`¥gvA^×­ýh7ÀêŽ&ø*må'(Â'Ó´rc?‰²°YûcAþß™| øãí{[õØñ´ÿSÀt¿¥Â+hþá™ Õ6µ±°öï}”uŸbXJ0úÚ–£ÔÈtÃ.l t#‚ÌK'¡Øs?N4ƒ•FÔã¤I¿Ú€dzÍŽÅø„Ãï«?ÉXˆ2©Ä2ÚI8IqÃ+割°cì‹ìƒÓ¿¨–’ úŒï]Ülš|h! ­«Ö'þ*2©k:¾ÓbÆü‹§,Õl2xšõrj¹~œ$@^ÎS¹sÀÅjK=WŸMŽŸ™Ó„ºnH!“ÓG#wQH’Šë;Kä²ük<ã–º—GÆ0—z _…ÖúãÿmD£Û‚óiÙPjúãdîGæß—㉞ԗðæv¿Ùb}¥@ª]ú?‹TŽ)ëæÅf£á׉È" =ï;*㵄mß`À9Ú¢]dém ùðøÛ‚r*¶)¥”δá=hùŠñÆ^Þs-ÏÕÚ5µFÚ3B8j ™à„¾‹»OÀy=a‹¼ ËtŠý×$fÕÜÃ4뇪֠ŠJÁ\pXÔ¥Ó2ØèÛ·ªñÊ×4bõÙ•Þ¥Dm\´LºOFî"¼Ö]3åÿM.Ð:C´ç+|¡Åω`¹Î•ñ°z¶ã¾ÅŒÛ¤|ôèû\Å ®úçHh0®Âê+¹Fúéë'ìz5fV yñ³Ím5CRPȇbæO“iÚE<´ë†}Ç>±aá ßj uuÙrÆ;GÇò‰yM6q=¼@‘]°K4ÓãÀqÀù列1Û'ÍÏ—ý„ˤœýg{ë¸û[›ï°'¨²!Ò΋=!—MÀÚÒ#mï5ô† i2´ èž)ÏN×b*»w)޾ë¥iiÿl½h2ˆYÇëe¥±$\@\ª Vc$±´û{ªãŒ°|ÌWø– © Žp¡U7»Ondµbį–.É‘g áMÙô]‘W "Ÿ8³y¥Lp˜ŽòÕömÓ¹a‚çÛŸ&‰åCybl‹ ÎȰ ¢^Si«Pï†õffa°<ªd”¹¨¸IŽGkfÏåÖ‹ …K˜èNC„±> ç$jYÀ®D4ò¹ÑwØÔZ4èOðß§¦*4§Æ/)‡˜ûùyáSш.Í#¸!=†I•¶QFöÚNê÷ØDÞ–Tì³`?²Ü!Wyd[b†ÔÜ:4© ü¨¾e*:ãºÛ'§•$ ¸÷<ŽNµu™Ôâôƒ=¡¨‰pžƒ÷ðÉT2Ô‡‹›€Î>ã?´`ÿ;ÜN[ŠàV]È6K¼3g7+ìû|y®²hŸú7èõ’kGõ¼Þ¿§%’HÃ0è O»¢Ám(,P“·¡ï–D¡˜Æ^ Ë\kt xS懶Yd>‰ùMDAiÍê@æe•é?u¹}(Ç9&ùÇ\ªÊhL˜*±¤%ÂAPHß¶#s®€Ô>¸‰IðËÁmÌ5OF.\ºP¼HLµ‡$u>\j#5¢Ú:‰J’2ˆšYzQï„ð.%¥ÙôÔ/BÄjR«†EÊðüЫñÙþÆÛÃý5·zjø[]í:·A€vºšÚA‹«Õ‰Íì{xB¾×Üu–yùúµM;©oÊCG÷º·DµÉq›þxÆÀØ}ØH9ÑÓÆâ/ÓŒÒÌmæ¯oJÐ|ÍÒ·eû–\ò6^Ÿ!>ëà"¨üó:ÂÇñ5NOæTΕ<\–!€|ý<þÔ\œ˜᪭i×Ѹ-ýÌ~\óõÛA*QSZ\ÆP}ä¬!_þ¢RÀoÞ‚Êý¡!v p"è¿¶}Ù¾:éŽ4EGiŸG^ûCýãHÓ†ff‘dÄ”`(¢ãYïa“{çÄë!XŒ Û`;ν¤ð€é°£:ãU3š°À_„‹&D”„œEÙ&÷Ä#6—±A£ÑåÇñ÷§Âš¤ oYÆ 2xÿC Gm9’éÔù»9À+Ú$—‹!\=e¶îž…3Å3À(£ÂÄ»ûNìM'Q€qLkIDU.-œ¾Úk]f?a…’VpˆÊÂ|Ú}¨ 0&_Ò„:î}\åzùÅ71&á÷¿‚)@(ºÈ\àŒè…³G1Þ ”¥[ö¥J{ ‘»Ö\˜@AÔmæ° 2 u¼¡Z’ ß$¿”Ñ éj¢Óä[äìxˆ¡Á‰}ç¥CUÃ/.ã; @ÐÍßY›™Ý~¼~}ŸÀØ ë0»PŸ»V“ñRqŒØ¶òw[ëºûHs‚E¦ïihóâ‘™Q¹íΣö|žË5u‡ ?Ñ ã@d¼¾š8”Á’^Lf«On= b…` ¢D•ùx®Ðè\ äÑ<¶ ÁÂéà)e·8I„ߣÃú‚ô0wå»shëäDæ…ØZŒX¬¬ ×ÝÄq£Ž‡Ò:aøæôè#¥ÆÖbÔZT¶I& dôÓ®<ŽÝ;ðÁª?BÝImÈ.Y'O!µh Êbsÿ.:¼Ä¯þ)*¤ÏD æI1o™;E±)¥t*xN¼¾ y«:lÆ™9óf'áe Ýéã\ÔÊGp¾Ž×J_"³G‚+¬©§: ×Åå„b‰MŒŒÅÁÚžî×µŠÍ?YÃí¼áöÞp}º Y÷ªš’¿rñ$ßû´ç£PYÉód©»ñ9š0ø¬wƒdP‘E·s2õœÕœÁß(,iÑk&$g±Û+Sm;CCQ8¿Ú‹ñÚݦ< iž«Wª˜|¬b72Ÿèdé·®%P‹J¢ݾ‚f1ªÀ”šfÚu‘WõÁÜ’L?“ø,þɤÄÑ$?/²-(ªJ¼ ‰åKgR!ª,ÊÉ {Qá›W×Tض÷œÑ²ù²¯Øúðçgÿ:þT¦9ÏÀ¹—Sb|˜h-¡’ rв¤]í Ϧ-iFElt ‘²q ßÇp_î¢ޏ;lÐNe»ðã¿ôé, ¥`l­=p=Ê~å·4dÏy²RíGZÔ‰”÷aÙ×EøÂÉ<_Ê7Ù”mJþ=k3 ­`^ì@éT~ÅX¼AOÿB‹ÙŸv6Y45!dÀ8û…äz&é»Z¶*ÏÈ–$žrþ_a8©É’½ƒ5¹ô@cŠ'½m‹VO IèÇL&ǸÖÊåóWmªy¶ÿ ÿ]Ù“öNÔÏ@ܶ§|ÜÏɳßúŽ«“Ä!׃%Wë•^©UO7íÊÜ7ßó6¸ /͇{ù—^®B8 <ìš(ºX¤ÃÊ΄f0?|(5½„wlìjDNàU´aÓ…ûˆ>iF3¼¾pwŬÊïrÜÎ+úg©¼Ú~Kwþ’‹oí‘8ú½€jïÒkù¦,5?”/²ÒÊ ›«½z7 ¼i`ØR[›“ß×”Ûu¯e^÷Ñ¡e‹ ¥¹Pã·ª–Žj›¨€˜‡ç •Ÿ½ÿP,k)y×0Qà6FõòŠdÙ(ðŽ›ž `2,JýÉó3M-D®Ì”oõFÅ|¶¡1˜5©Øétj¢p»+éÑ̬åJí*üëy÷Éiø›©mpÚMæškQhâûéÒq±ãœk^¨CÉ£RàG¨øЗÅÓ‡Çá§3óÓèüôÜ|˜–^/_éq¬Ôš@©ðÀæ9X[µAÎÞÄRu‹s('¯%¿Mࢬ©î¿ DCóKçå=˜pæl7ã6H¤øaïú‹ì„? Æ£rDöÞb¥5¥S­ˆÔ-žƒ…ZWi7§þóu}üˆ\ôW=¬'£ í3à7ʼ‰ˆX  g21Œãíò ¢£4„ûE$Ùú Pž¢Œk˜Ýþ=Õzĺ¸Îo4iýwªÛNçƒ4 Å*Ü1£ÿc‰Hs)N踟•‹q§ý“beŒÔÚŽOÏÆq÷\ƒs=¸ÂRrÐc‚DJ h†ã57¹)¦ú’ÆÒ)ã§ML½Ï‹ãØfÒ2 hH5ôݺéIpö(¬¦\y·ðUêš,&##´CQ.F~à ¬-BkW3¼sª÷&5ùÕµNˆ- .ÛbСÆèIJ Ž‘ö8B£÷î*1Œ¼a»!â ‰¬ìL÷ù™>„LA¢ÿRQÊ¸É •ŸkÕ<ï× Ý® `ω\$Ž˜„k=³oiUõl°¬5Xi`SzçÇlzÚßöpWí§a[B¢Až>ÿ3ÿ3ü£³cQ°w™ÿtJZ§Ów«´ƒ§ŸXµØ&‡X^Q%›­‰Á0û]š\üÚ¥8êñ³*ìMG«ÅNT›×™Ëê{‰q!\ísNÖ`{Ø–þ#g¿¥P}w=vf–˜¤ð@^ID l[ý¤`5Š$É•òã¼ñÛ€˜7ðp˜m#­š~g¼3Û¤Äo·ɺhÞšÊв^X])Þ½œÅK,6kÇáù7°"œdd8cjpˆ:—Çáï‘??xXüýò@—8oÿ+…$ÅÛ^êÐx'±²áËÀdÕo÷p˜¿wL@9qç}åÎúí|p l%îG#ª±k§!Uââ:B!å º¤îW â¤‘ŠŠœÌ8õŠ'ì‹ ±}¾ ÎFm~BpÜÇ=i¤1+o#xæ€ÇÞê¶oßPB­=š©B«‰E‡ÀþT áÔ˜H¾4ÂKÐQë4;#Ù-$S~å×êgÕ!×37Jòáe*@…QO,÷¡½ÕdŽ÷X`9ºõ’rQkTFÑÿGŒ×ùÆÇ¿¶9òtwTVäûâXµÉ¸ÓÅbßYlnÖŠ[7vZçÎÕ¬¨sýr¼x`P_ÀÈî\ çÎ7Ýà'ù„¥™‡EWƒ2ˆüW3Ùiev·Ô¼ÔU¼¼ž7º®Tè2c¬9éô¬aŠÁƒóÏ$ñ·à[eÊtr£HY¬þMÖ»p,€˜íÌ#jñj¥„²A¶ÇZr3ϸþé#¨…ÍK«$B[×ÍÓœ3³VŒýŒ [vN›—"#Š îä"¢hƒxKî{¡,ý}0ã òÌ ‚H>Õ9iø—Ô9Æ- .G!L)Ù7N’¼&=«ÃnrøìÈ¿ š<´ ÿ6l}¼¡›Öh¡“ Õó¤´÷ëRõ Æá9]ÏuV]‘4‹2ø¸ÛƒÃùß=ð6™¼¾ñÜŒ×ÜfÍÁW ´ç~G˜Ã[ÌÀÕœ©_ Ñ ©I}áaÿLì‹Áô)aûØ­;iäRî‹ýÑ:Wkþ/qÇÝÀ±lâH×÷¢ÕÌ1íIw~³ÿ%q ¿¦–»ùssâÑ¥=.G®ýàÖÐ&-Sª¹Ü1/¡£5]5Ô±ìºÀ© ñµTáæuÈî4æ=U_‘vú͘Zª5ÏêãBò™ðÜ“9i®;láŠL4IMôb–>OBÊ«ßoÄ5ÜŸ Ãù ^9è:’U©Ÿ÷¼cæ?Y>sY`?¤¥‹2 ¯ß‘bý³åG ;ãJ%øâò¨eáÃÒÆÖÂ3&ŸbÙkÆ}ûºæJ<É·ýblÏÜoLVjɲ•“—æŒÍÌ—øí»ÅrcVP]åy1Ž»É›ì–¸&O¢…æ¬DØQ›dò† †Ë¨,=ŠnÉV|Sý’¤‡/ — 6üvÊkð_†?怲·VCí[d^6o³s¦£Kxæîµ2ƒî"ô&^ð¯‰-Í%AO²˜F,„cî¶\܆Ý÷l6¯ ÃLè,r/7¡ðFÕ!}5• Iœ SÉ,½1²&zfV‰G”l1©7_Ëêá±.I rüHbñJŒ³8 ÚÆdlh&Á°¥•?ŒBBæð`êl†ýcã9¦A2û«¡h4€sõD[ÈsSáÆÔYzïë¿PF]cx;DÙEn–ÐQZ h>7Ø–£¬¬…M{¢þ`—þ«‚3¦¿îˆ5Z÷MCZ éRe ¥˜8:[,øöÑ«i3Š)ƒ‚êÝ vÕVLZ¨3ö±Îeÿ=ô}!"îiqoÎÔŒ!J:táÊœßßG;Š˜M ¯[ŸÁÏŒS'ì=é"ä´÷T$ ÓÂÍ~ÉAéÈÌG¡t^LkF᩽ÛiÀo‘’©`c¦Æ³²'Ð%2§j¤Bo¡\ö?DË?>Ö+Àâçí?V1¸NÔøœ9 “pˆó0›Q^þËŸ—Ÿ8~šàE3ÎkÉ&£ÄfQ[o7øûÀÓ¦lU…8e>Lþ–ó].PŽÛãaõ_y V÷C™*rêåõh;Iy…òÇØ}EÀGü÷äÀ@é…qXávZméÚ¯ùÜ{(©å‘£ÞIÂ9Ñô*žøhrÎÉ¿ˆ)×u—zyþBZ¼ÎÙ†%ŽfËHø²@2ºz_†d@¯É®ÓôoS+_Õ 9yõæ: ß{ÆN.cµTà\n›M¡‹NÕ‹¢ì²Ó/Çh¨$ïC}»7¢jþdh­e˜s­kÀ"×¶¡9t¾‰éŠúÐe+L,…ÛÃ?áƒL…ÚKÛó_Ó%Ø«ùë§;¼NÍmŽ<†šŸàIøpW!…üÿC~10üŽ Ô•¸\©.k(½¸ 1Xçß<›Šê,É¡ø¢2­ˆ“z ].Y†¤ÝJ ßÕ¤Ÿ® ì ßÝ)´¡¸ÓZsÖ¿cÑI²2až-Íâõªß_úïc’k+ÙQó1|kͰë,Äýj„™¿õ™a¢Wœ¨AÅjy…²ZÎ&ð«4Tòt÷ßQP¸Q8Èö£°±(™“A¼×ìXïççl¹‚3 Àì¶ ²pº0£6çob¡Þ·nf ]m›‹~o¢®ÞÀ§üdR´eŽ,9MM¢5ÑýW$½‡yLGZ¼Sc$!‘RÙ%âx†F×TŸ·=e B+.°gá§ééÃöƒ Œ,)qí·7Õâ°>žX+¶aeS¡ý-åØ?õeÑ*³ƒ—yÀ! ZDút¡†<ÓHüêoþ*í‹/Á½‹ ³‡¢|ñ~×¹*§5Óº•dÔÔ"a9®oèÚâ©U OçÒÆÞ•—Ȫ¡0õ:fEÔ‹3‡…1pÞ´úZ¢s ¦‡¥Ï eÓr]©ÊîýêÌm^7¤‰ï÷P"ç’L†&žK.­FNÿ9…Uì~8Îr¶¢ùÉ>«DC}-)B1ïî6—hűÈUo«Yk£ãö׳,'¾FuT±d2QQ ƒ¨ôÏÚ{’–ìÏàì“Æ ¤°± ?s:øù6¡á…Ox~¬f7º‚×Z ó‡0LÊý—F 4/èÀnƒ1K¾d! ’îRA©m’‡gy6Ò ñLueÈï."L™p[ %1ªòÝ·áP«'†KêK­ºžó/Ôc[½£\ŒJ#á#Áx|ÕÞ /Cñ'Å*ËA¼ìÓ8Ñ )«ü\À-çÝJHpë Ct]7°ÿT^’Á±©_¿7@[!ÿâ÷–e/”I=èV’EÐߨ*QäÔx!2Ûó¼“à–$Ry«(ÑÚˆøÈ&ðâ7ÀÁÒŒ(ææ5 ‡–¸,ÄŠž]­é$ÁÕW M“N±" 8GÛ×­²ÕE²Æ×ÿ EÞa[E îÜ/ëˆYÐïã)øíiê@B7Äù-_"´BÖVV‡3Fiû¸IÊçjN!gˆ´³¥ÃC€˜+дÕau‚ò0#/ûé%ú6o~i«³Ž÷n#¦VßIË€z®‰õ‚ˆY~W=À•œÀíMC-èÏž&€@Xõ ñŒiv›ßà–NÁD8–7`Ͳ¾¶Jjsm^ͼTê\sžveÔŒ-ŸÆWnºÖµÇjCx÷e@ÉÏÏ êL£d†¶?t,0ìª*¢QaáyÁW€D¤Ñ™ •`S"}þC.ݯ>'/À ËÚ`~4‰J”çsg{ * x}«xyšjŠ|ôÉ¥ °è‰7ïào®4RãÙz9K¨öK“Ú˜«˜¾«n'nÌ¢=²¼'Â@ u<ùØÈ©Y½(ŽFßw䢒’íW<̹,^ œ¼˜Û.5J¼ç*¢ÊƒŸæÊ‹ð†n«Ô;Éñ…òæEIÖtê§¢ë»zn@ÊsôÄJ¼­¡X’Tè!‹aÙ¹7æí£²QT$ºG«FûúŠVuí·õ“ÖíÄŒùú ^§I¿ÌqßN å´àüYçò`Z`…ŠÕQd.„&Z¼û‘dŠAã!`ñ´®…žÁo´˜;jÞ!¥1®OhŒåÈ“Ž0¶œ»Ý8µ†jÁLÙêæxnèCÌÆ¼×Jp"·¿ÐÍ^ e’’6ÀhÁ§Á<¢†,Л¤ßAïm}Ò&O’rnÝýƒfRàc‰gé3yÍ ËFAû†ß2,ÏÐ'’X'l[ZæOcøé xºÄ !'Ùëál.¥»Ž/ÎPЮöOm;Ú¢±î_@ÚY-ËÌ‘uËëÒN%æR"ÑCôq±l!¤,rýªv..H¨2”(c(™bÛÞéêt²ZeGâNJ§Ýr°ƒ‡ÔG çÂìÊ´$Ýï;+!¯Ç”ø šo—ømb—[ý^8fú2üÞ²þ1e*Å’Àmñ¢x.+¨ihŒU4Dˆ5Žúô»kþñZv>Ž€_µ† >‘ì¶zÊ%òm•f žª¨§ôÚUvbüAkÀg\¡Ð"ç‹qwZì¬æ/^™önÿ4ßPc¾Ënë8µÖÛé›^[󭱎Ñøÿt7»‹U±bdP·rdÞª´mq)¾«>Äý¦,åÛ_7œ:HxÜ©¯-âêÑ ŽZƒýPÝúÉo¿ QËd/ Ñ›ó¿Ü3¬ «Cò·?èZh`#U-\ÕÍÕÚÿ~;qãõ-Ÿ5 8Pý#Xìs$J3ž‰ÀÐx‘ñkûñó`¯â¡¿)šUˆ¬ªÖ«úM»(—sà<^…Ej7Íï†sêìÆrH:ªsj‹Ö ñX÷¶"vÞ9„rn㵡ã΋–¹EõCˆ"Rb»¢‚ЉBCM/RôL}çàH±ŒÀ|»¢/¸J/˜‚óÌ•by (€:^•Š–zEŸe¤Rµ‚Œ”±pŸÙª¡ú` þàí(‘\l9æ”vÇ×ÿ’¡²¡(ÝóOd§_xcî”Ô±ÚjsÎiIR‡ÁĹéÊÓ?Ǽ;p–º¬‚À#Tc¶jõS£Ú7‘Íó„¢y]>¡UÞ¢”»æOsÏÖeéÀrñ—ç¢j[KNqKúù£5wyLà˜Xåœ[ÄÊ ÓƒT è?é,gÙž)D$ß Iôd[&‘“£BÍêxÖøeìqDŸ‘¼J+2§Ÿb7²£,ƒNmv \œ]ø³×a{÷ˆ£Ñn) V£;ªÉ³3•àñMB{;Œò°HUµyDÅè0@aÑ@¤/É4"¶š¹…ÑÂã 9cܱWû¥×—ABßfct•à®=I«% NZ¼áÝŠ\ôŒkg0Oc· 5$V“íº*B„¦ ¢Og ³q‹5oÛ™!ê{Zãn ìÀ!2P<Œé¬Óïœ>’ol;EíÏeî í7ÿP½Tß)@IÌL²ß ÌP/ˆìZIñŠpüjBCòb寇¸måíXàp×÷ ·9¢ô.êšÆXÓé¬:™á™Æ¸£XiX8¦YÅN&áùœ—xNi¤£D€¼øbU#¢\1¸8Up ÒõÛV¼€:9µüÞ³^ÊMbn]ommÕã¯Eßæ•Œ}JêJȈÂHe æ¨â}LE|èlü0±Øx¼é³g6ÕÉþä¡—l¦9/.ú Õ¼ÈÇ ­Ý*sèT ûóUæY·Ø1"ÎƉlWzyc¡AÓ– ð-{où07xØöÁîÎ#%P‹L—7¦á'Žó0‚ŽÑíµ$B´*½[‚Öª3î7ºÒy ³ªÅ:µðòl€~ ýÙÙŸÃqLfËâs;‘ßVX–«ÜŸ4ëBs›[» OXɹå è ½%ÉLB¤øî;v’-9ø!Á8vl]0¦ €Øœ_¥w¦F;<Þεàõ¥õ£)P>x üÜPãÙgxŽ[6C¬Œ|–úôMÆbò5k+¡•nŒE§¯Æ&€›ÎŸò¹îà6l7Éîðï 5ò!y O±F±˜œqt\o¬¨—dÄ6n‡egI9î7­lÔ[ÙÈ|,ëjZLVãË´Þ¹/Coñ:—\&ëÞÉ«^º²€ÌsÝwE :ôÒP‘p´¹ôm ¥÷ùÃÌçÐr=m\’G#åèeÑihy™OOŽN Û›B4.¥´$;[gø8#½r —k$lr¦î_Ò©ïÏ Æâ(‰ÛŒ‚qr!ª’*¤S£»…á5wn­ÔÀÜn_ î‡ð*[.j5t$ 7Š „N—ë*醜_a-¥HÙ;ú¿È³ì@.¼ ÿ<¹ im¢?r»îu°x0k‹ŽãÄâg…¦µ…¿Yº Olç !+qjߥˆ«4êj  *ÞŽ åGañ^õ™ŽJV¯˜„ `×Gö‡…°åii±4ꙵø¹n6sD™ ÈR•²ãð|¬› *‰½Sœ¼Ë¦ÎD‚Ð<“J¦Ã¿®÷z@æ‡7àRœ*ÌÃ}<ÌNhøÙª@µh±«¦Ò‰¼ DgÈ=§gLwMc)'ÚÛeú0àd·zH;òÉ¡ÉWùýt¸îÒÕÚøB—,5[†a}ï¾R«ï.ûYÞJâ$ÏoÙ胕Ÿ ÙË»NÀôªï£ÃëpâšSF—Wk.©`IBgD&¯C{8&m35"Ì|-›ÔC/^‰¿ôâ¥+§H"Éø¸0äSçÚ¡/u’ÁOáÖ’ôÊÐÚš;,gB¦tLo–/[z”-_[Ý{ƒSŒ¢ösmÆõÖb÷pŒqx3ï¦Ú_b·_|rKꊽ¹<YþÎ;~%9£ÍhçÑEØ@P˜î²“Ãz*Ž‘Gäi)œ ‘T‰Xý9•ñW­€é®Ê´}íÿ\ C÷Ö¸2‘`%ÿY¾$Z´ýdŠ ‰JéMš‡›SF_WÍÚÑHµe„ëúÄFã 2‹ŸÑ&#L é-Áý?µñåµ”þ0µHÿ ä߸xv¢ª(tc0õ7СáÆþ!EU´ÞŠçF®€ü´$¨T­ :áÏã>Ò»Ðø'SÉó|(Áv6š&˜þLÂ#¹¹ÄdnŽe­~ûPK¤µJÿ'ûÅÞ`tm©¥vž±ŽéJ#s#Gó‘BwD”²y§Ò2f~EøàÝY´{ˆÁòÙg]¦¯Ý]^ªç#¢ ý~$n¶ßŽ*CjŽÆ ôöõðs“†EGH·[Oåågèý™á½»¶JÏúŸªâ”׳\[äÔ”_*! úݯ«£—r–Îj8E!ŸC‰¥”§Óဧ/5¡"(–Hw>ðæZ èt»¨6ç_™áõ»xMàŸLu ÄÊÙÜ[)UæH˜ Kpû°dELw-´[½nŒAŸº’i™i~:eìšFä» o¨iÄ fa‚©’¶Uñâ—KéÅç*iá²DbUµýeªXL»~£'³´Cs#Yª7 ¤½‘wãAÉ[ˆ9Œx:+¥Èæœ&+¸ë ¼N„r\¨´Æ2$‘!øïÅŒÜ?Чµ¦fX^Oïƒk%ägßÜ4ª:ȦMîBIHö¹à¯ÁRÆûZFås“gKÀ ÙmŠZÀrquØŸ”“î‚)®à’hº`í Ì·È.¿Œ…ÃíëFo\ð}½”€—gîã¡â«¬¼Y|Ûûžº›7Z½!€Ã¾µ‚ÔälH°Z”ÄûˆR¬Q³ÖïnȦ0ODZ n`=Ou­±Ê-ðàþnû +¶š´ÅîÅÇâ&À–’\¨gnµ’6ò ¼R\Yò vÓÆ¸*›ˆëDZ„_)ûÐMSªÛíœo˜ÅJ©1¤óíH¹˜äb8‘(ˆ8%pm¹‘ïK3š´}Cf{BÒ`?Ì— '³ìßHr3J|ÍewïRKAÀ+ñ2õ+š`Ÿ˜&'‚t׿òGÑâ¹ W©v±â9ЙÀ­\Ë’BqwF#z†Ú2jîi} ’$l§L³ÚSvî½ÏFr²ïNã1í¬SO2¡ƒ¼Z•Ä_J ÆÍ”E"\¸ÛÄBr9àAýÔY2XÆ øEìF*~pÚ'–»l¦/ÐÜ´¥-%§«3èÚá%²ÏuðÌŸÞML?Èø=›v›É¢ûò´#²™:¥L1—ïåÈl±„åà~!âK¯Ó¸!”‹:ДB¡qKÍ‹b^W›Sûu„NÜqÞFê¨#Ï 1diÊÖç ¼ÔCü3¿¸5_Ähý»3³VEÈ£ü¢Ù»äk>LÔ =kÏTÊA©ð¶(ùÐÓ†ò¢—{hŠy¬}ÙÜ—-‰ì~Á:ÖOÕŽŒrIHscÊÑâ¡Â@½"Ÿ WðÜ™zkXßî`–æ¬×­•Sÿ& t£³ž©OiƒÈ¼Þí5ЂqŒ›ÅXš}ÀŠ7/æ¤6ñŸ%åÚgˆƒ6B Yäõ ðÇžÏÄð(Dn"Ìo⻄øôßõ„íæH)Å¥¨N W2nJW°ÛžZG䯝¶‚A0ðh'¹ô®eëâTofÒߤÜYvM`Lc…h“µ[GŽbÁ|_ÇI/,ˆ³¹ l#Œxˆ¶¡Cð¦øåòaýè\¢ý~m¼²fŠÖùTTË‹Œ4zÝ÷SÂÞj¶î9ßðvuU{¶š£Jv'ÍY=¿Ç‚Ç~ ™(ÏI9C‰Îq‡à>WYòsà ˜È2 Û.—ß/uëû#ÿy±H"ýòt;Ë(`¾ïSED‚»ÍR¹ï§æžÚϸ\`Ñ7ކ'î§\æ³RÞ;¦Ùìkí×R…{KWáG‹Í­ÇsÁÆàµ[õ–‡…R@´¶j®çNŪþ/IˆÇDâ y¸Ó4P!ì’ªDŒ.2ÃøÇOŠr¶i-OóÙŸžh‰µ>ïÐüƒÐN^cá2{ÁR:†d¯–€51È&C ’¤}Åh¦g:jiØ^š=(…úùDX-‘‡ËŽ‹Û› §ëÐ%²ª·´jDON`Tõ×o©=+1'ú™Á-\E´nIOT'àûÜNÂLÌÕ dI%ÇÇRv§J° )z…Jøæq`ƒ[OÔ‰°[SG¨Î–Ÿ¨Q~%sˆŠȆ°|>*¥‘ Ñù†7Â?@ÿYX>X6µãJö3Ó5n§Sò5V?lLøh¯;ÌÍ´}×B9g¡ÖÀZo*?)&P‰ù3~ªwÿnƒü«Üä‡WÉ%2Cð/?[‰¡õoÚù¢Œ…V!“ÀI­È¡‘eì_%89Ì)iÎÂå¶—s€À–f¡ä[”츀„­]!ãËB%)clÚs¹ ã—²‡ a’¨ý£W¡©q_߃p+[7ËfӺЇ[oHGÜ`šo¤ÎÔú?&Ôæ¬•$rãå•Wþ‡ÎÞ'|ú(qÊ»´’Ù9•êUôWþ×Ï/3ñãÏÛÀ \a•Íí„¿© ” i,›ãŠz¹˜ '>GøštQi\S*âË•~T]÷ H†.˜Q—¥ñ½U¯¢Uƒ†,׉_eoÓ8à 8pÂ(økxeiìF²Ùmò€ðP¼ƒª °}VJyMÆûB¾À J0¤sÙ«Â Ph¹hݘû¨JÜ’83Ø„fÆ—åRÊ~l¤-IøC‹$±Âh?4 ¹Ú%ÚGx.7o“^W› J Ô/ E¢ïåìÉ.Æ£6ƒׄPM@ Ƥóõ†¬.L?§›f©hÃFØ-òŒØahLÕ»-,ļû8ƒ# d yÍÁ%šm[ÜdœoI^TâB^ß6 £ØýpÁHèDZ/ʾŒªË‚ãƒïBä|²ž_‹ö_ª߆ãu 1ÈÇK¨¡zŒ}Æ û>EkF{cݲyf­zŒÆåâ-:ôW¥Ê´ #xÇáÔ~FÃðê—Z€˜4$&æÉŸ½]ûšWë0`ÞÙwg²„Y(+y¯E1ù*ò 0¶ñ/¤Tް(ä*^´þHEx;á™°_ÇQQ°vVй6,Â/8KÀÛG$¤üùY÷=¼«ô  w è€eÄ^|´¶}×¾TʉBð‚@ñ¥Ž´lÖ¹¾°(SAËÞ;½V¬©óˉš™‡pµc¡™dغcYºn!@æÐYùZÊë…EªOŽ^Zú‘~³wÙQØu¼çp’žýº´ì¦l˜-K úf©G¾T]Š´•®F«hÌàÊHã ËÐ@•Ý,ϲԗ‚SoÈT|œ®{Ì󙿯üÃ[ç÷™$Ô[µF§œ,Ncºë_É©õúæ@³§ü)„Mú¡0•mÙ{V¬ÉEè$×ThCêÕ§g鈱åžÃAè¿£ÞuEsRõçíð(rkS¦ÚÌâ?³qû+j»4­|Œ¶bÁœ˜;•îÁ>ü´;öÄÍHbÙ þö ÷Ù —ষŽÕó]ÌóÁ›7‘úÕ®ÿaqûéøþì‹ïôµgÂÁ‰}¢ Dfþ 0›ÂIõR|¼š¡SK1#…¾ÞŸFYQ,eº\¯˜Ò§aÑsN<^; ò}Q/«v‰6à3dS… À¾knèöÜ))s8àuŠwô¥u;@ÏóBÔ>îÖ™<5„”ô`%øß®öË|püþÙMžÚñ´CŸî)±K»þ~ÈÉ‚ÿAQº ³Q ¯CôE£”—þö5 ¯«ò«©õ:¨Íé”åU$ÙÁÛH«XÚ¿‰ûŸqüÏwˆCýoæâá¿<Ìl[`ý¦Zµk^‰ñÞ¦êœíjË~y6¡q‹-Eu¯ºº…¬Xp)o:ˆ ¢=ø X}7š¥Í¹ Þ“"3‚ú°ê«4qJD»Þ ùãF7áPV’|á8¦(±õþVb"‹¥ÆœûI®P-B±ÐOµ«38”PQX®cú7¸±ÓO.ó³4wÍwFáI¦ö·›öBj–™i 2l­k2ŸDPƒ½áܶúg3·mª½[\;1 ŸbynÖ…>­GV ßä_x­uÕOW’Ëü/ë«Aâõ—Z¡Ê#)7Ùgjú0Ïh\ÜÍJÁBx3˜ÌTÜ6ÙÇýêBRQj38‘ª§S§ž%{åÔ(” [+\è™A±õ¤3ŸÆ ºI•w¢œÍã³çK‰Ð½QüßXÄ/×ÛÓ©ûìr#¤gîwƒ©çÒâtc‚/U0eJ, e.€0dmïå¥BЙÝKŠ£zïç( '=3ÑDŸÆ®h+cÝv!‰>‰ÌêΗz­ý@š[½rÞP˜Ãã1¨›\SÛ1vyNpã(ñF‚¬PyõÉÜ’ªvݨå½#Æ8%6ÕÓi>f ZE±ü¹ÛcÏ™k¼ûDBôÅ\{KË`ÄoQÈ4‹ì)Qd£ì@Ë%€O±/Û¤A¶KKtÂ’¢Û‰Ü®4¨¹ÏVç?»5d|iψäÞ±#õ¤llÕŠ³x$«©— i[&ÎR@ýT}ðåCŠnªŽ©R‰8­ªucª2%lâŠ$bˆê¬\)ßÄÇRÜrº¶U³¡–òkb¸\]°—¸YækŽuð;&AUî>“…aéýÛÆ‹´ß‘`œh$¼IÊW_é4(DÞÄ\Ín«IQpÓÉžÀLT,Ŭü€ ‰g¼ ìb… HÀ’?q$ÈSÊó/gñ;?yM6ÓG³wë6·®¹ÚM¤§ÐâÙÐM[8jS•­´àÚ•™{ƒ~æ”ï‹lPe(±‡×¿ŠéÑMg‹ãåQúÏÈôáArÆ!_6ù—¾óÌëßr%͹xEÀÕ½æ€íxG—«í7ÎWnĶ˜¾j~öx•¯e…_Fë•͘˜³eT6QýïQø™¦¨NWº;Ù®¬ Kòq…qën± ±8QÿJ­° Z&ÔCœ`Ž \,Æ\„Æ¿x­-F˜Æ ³|1`ÆÐêÎïTÞÔSmðAS-n;e€°Tî™—u,ügÜ®@º'9ìüEB8††§/žAõV}g€ùf$!¼6ä~Cä~¤©ÀO“n%/—óXÅ1FxÿR~~Ò™f†—Šr絜DõL Â:Zrz»awÿxôkqi°óFlˆšZØ?γGn^’6DAšÔŸÙJyl7æÛ¨5 ¤xÕ¸TõØò«RôG£uÕçuÕzÔ[—6Ç?l[ òÝfxÒf™½©œZMGhQZbµ×òRm«Æ'u?z©¢…ñJ D4¼èûºR#¿Ûn[úÛÞ¶øzW¹R)1Îúݼ;òñÁnÑM´4Ι«œC†g !øÂsМç(x’<0ˆW €Ó °‹"|W÷Óž¯J$Éí-?OaüÍ3 i©Ôš `²ÁDS×"¾¸“í:p> qbFYã5~¸:RZz/3àñé0vü¡¬šÕ—â´Í•œÈ*CÇÝc –I¦KM¢˜ö²_vþ;ô˜ž« ±…[èU Áº üjiû=[ ërW¹KÔŽÀ•p_5/®1ħe z@!ºsÒöÏ%AÈÄ…6+5ŠÒxûÎÃ@}AÉO+ÖÉTû¬#‹8S©ó¨âkF‚êç¼ ß@[î¶ü›Ün££~Ù2Ê'ç(™JÜyôö·$"aüœí˜’6û·‚ ìî@odQÙe7ãè=$[Ña‹a˜ÌnÓ™ÿ[õޏßm¹Öûô´Õ îMšòó%µ…z‰— ênª6((+Ùsm}¯„ÞK{äöÜ/ÖÕ† k§fÕ—†bH ’1`gŒÔWs: ö¬çs"×A@kGçcŽ #c´¤”½©ýT™ñR(kÃϘËü2൧I½ÿtˆf³åüí ½·êÐb)C=«4t»„üjg"bq“}¶}·y^àû0É”µ ¥ü©„'ôòšÏÿ§J?ErÈÀ«¶¦³7îŽ1üÜ­DŒ‘çžhçcŒq~á°”¦h1[—,Ç„S¸kK}½G¾-´xˆT½kËŸ´PÑà oâéýcHlU߬öF1jÐùÅ9±ÿ33E4I|ÔÆóÏ«„/¦5(”„¥®æz{[ýÉÞY?™ëDT†E’G}(âŒÎ20¸jþöÏD„q©àXÿQcÀ’(÷Î2Ÿ€˜ p+”aÕKÁá|¡@ÒÈæ£Œ"N+Ö«Ñ ZB¾zPä4 h<Õnú°^îUŒ•få}ÿA÷Öï‘6lUCaÏCŠ|8[6x¥Å¦2¹[!`nèMΣÁô¸4kƒb‘Ô_j¼´ŠT ö¥Íø8â çJÁ Ô [u›ÿK%HZPm¼Q–#ä´%–/¬p„èÀH €:Vš>ƛƦô‹ì…!8(1v“÷ž~îó”â—p8Q÷ð5b °¶ýPwé –¶È6ÕBóÚZÒÁ_É=³@þz¼kL®ÀvB ½>÷6ø1'«aÇ—3üªÍë)xáø]óŒE.Íú'üé,ÔÑ7nÒN 4’îÚ¦´«!޵•Q¢$ €†²U¶5­&%,Ð(/΢Z·ßÿB…³5YûÈbÚVá5ïÞæÞ…ó²Ë##t·Þå‰Ï$üõP½ðAT0ïÂÙo×C—Ôp¶QO k!mPšÑ¢µfäæl47,}ºt+i±®úKÓn°<:cºÈî¦ìú#ÑÝ\Ž8Ý.ÆC¢šü¤&ì#¬áUÆ+¼Ñ‹Àþ´ÇGì¢ò1A‚•0VØÑÎŽ¤µZr v{LްJ ´¤û@)ÝÿRîßÎ(ec½ óÀ5 §ÚÛE\ÍE‚?WÓדQ{ƒ¯V ‡b¹Øf¶ÔAÄX,ØAQ Ž÷ª„Âýï¶×„vªÎͶ*\žë æÑ7~Ù|½‚¼«Mv €H”¹² MSvµ®-©"`Wš…)vö¬“6I ^šÇω´xg p‘P‡IˆõoíyOµA&vøÖÏhsQà:¤ñ#%Õ"Â2¿tÅU¨Ðm绳ë=?*F–eÔ5^‡!4ê£Â°Sàj#ÈÚ;úl¬çÂ𠺺¥ÐînMuªv 5Äú—I~Õ&4’p”Ù^REhæ}‡vS<×<èPߨþç;%ùs´Byýjù˜6 …*¬^SÅ]ÇI +Ç5C¥„ j$Hz@f¹xg‘¨ë6Ú_§¥ §þžpŸ,Ö¸«„˜0¹ŸÒ¨ùMjŽv&ÌÆù+_~¿O&7 à_ B‹ç!… ‹ª*Ó™áD¶fFð¦'Ù¥Ý:´ pgn­w6ˆðìG^†#ë@$¬GN4&<1>å€ Òvnº‡o¬s•'“íõ¸Ëkg ¢m EFºTîÃà¶g1½=.Y”Óׯ¸y™fwÿ¤97›Op[ñԛ¿¸Ëh¸#M¯·eÁÛ0€g¾Ç=XW3›ÈÃÎO,Q…m¨¥¿™piVä³\VÜÔÉåÚå|øÚ9ì5ÐÁ~‚Ñ„ç%y‚U···Ó8ǵûxzÈßý:Ö¢v­ô»¶Yh“ôCh@Q.8(–™>´³âúSsg¾$ÇÙ<Þ:.”+.ÉFz>Ý<` \Dƒyᇌú0 ¢³]ó7ªÜA(¬ÝªÂpävÑ庡ïM÷!ƒ_ò1è!_ƺS S>àñêfÎ’W~üE/ d‰è\ëíë`L•©øWJ7fBňø{#ÿF´‹êí„©\LP½t1ÌÍêlÉâæ8ÚC„a r^Öe-ŽB2OoJU‹ ò ‡!]M1ùTÿ'r8}~lwxÌ Ã[z®ÊÏ’±Ì1ŠËó¶íy¾ø4XØs ôŸÒí·;Áäìи0—KóŒó¤Ÿ!…™#E;Ð °—Õ,!Ð]3$°ÏZäµ ñ .=¿ ùWnÐf"ð´ÀšË~Iè¼É¨`vé&b‚d hÁGY’w‰ì1êZkêÕ¹ ×®…Âu¤ØŒËŒý{+0‹qE…ú´š¨-!ü%:t½ñchÚÓî—í²^í!tLåÈ=|Nø!ß=5ÖyÚBMâÙ™…ä3¢Lÿ`¶©$½%ØÅ6®àdÜø‹‰§k 0_ÔóöÙžwéH—s?¡£•ÿQJwª‹’ jM÷~§ ÿ¯K¤\¡…vde(«a/sÖ,%©CçaˆT· d>#š%ZÓç+gN H9û¹ë¬LÿpLý™hTÌ%“Ú%¬f…1„ÊNÖ^§×<Àdé!]kuªì Ràš¡TÞœô—/ ¡` 1·‡dÈ.4ròþì˜3W±Ž Ò¹¹…oøóõ:Îrû@+­ãå®Ä€üó«òBŸ2yË$mW î•GAØJLý>,üQË2‘Îq‹¢RÅ`,û¶ìNö{N@â_xJŽiàbÙ^G͵ŽËiyíjvVFĽ˜ÍŸ/^5ŸŠ¿–ŸìV5àd|6~ä4¿Ë?—EŽd¸%#زz©Æhi¦Í2ÍÊA¾Óà»uزTò—ÍãlòøçÖ™V¤SʘšçÍÓüH=Qº²ÁÕÝå‰)9øtp¤È°—Øÿïrù[žÓ&䇨(ŒyÕc.Ñ!ŒsÊlˆý«–Ú\ÿZiYÇÔ–)¿êµ3ÕÈcJ±ÿvG";ñÞ²8ŸŠqû·Ú ±Œ.Ç€‰Žî~xg0œÿ î0„ÛØz#|Îý³aò‹´—?¹n2]èËpˆ¶_m.9GrôõDÌy®Û3v¿­²=õí£ŠÄj\DI:Y»¹Êuß—%WFhЧšâÀ¼Îb¯‰½/H‚¾ÑÍ`3$U”³‰õ²P¨ßÿb¼.TBi6g˜M Òakþñj„ßuÃ8géfÀ²x‡&ptò±ó™ÉþàOX’”Y–¨÷ãö vbX^Ï}Ø#DNçmé9Z[…øn§ðT OáQE´©Kh«)–¹Ú«Óþ\—nã<û"´#³J™1¥g%iwxK5†Zj0/Ë1Òž®IŸ×à”¤·;>S1z?è+„›îµˆds@óS„R[Ú%ú Ír ãã'ñèÁÀÏÌÑO¤W×XÿGزé5ta>Q±Ÿûµ$u%]ú _‚mᕲ”¯S£qxúrxÐsF*žJàâ¾kEŠv¹¥‰2jVÐãû|'Sõø¢mú\£#Ë H¡JGÁ“Nb7Þû* ¼Pl‰ÎDª©æèƒÇnf°ý/Ôb6å÷PÐÃÈ94÷4F ¼§ó!¥ËEÑSJk ±×IÇ_³`€ÀÉÝ F‚’yà #Ì gQÜÈÖHdó׳yq¥à:ZÉ\úlÅTÜŸµ…¯Y½24€S°îI û#RTªeéZãÃXJÆlR§“6J7Å’ÐxwÒ ¶£GZ¬ã?DX7Žá³£ÚÛQÚfÑ}¯õÒÀ¯­…çÖØ]®‰=,›ýSýGð½ç÷¦™ð…%ýŸè,êéâ¡\‚MZ½ÿgË~$9Ò³UQôºÒÍ?3¢±Sw@/·{o.ÑFN,œé¾"$ c²Ÿt2±D‚—y[¯æçƒ!¤LTG£M=QcSfé+ ¹ûypQê ¶·¶ˆøR²£ö·bxZ¶¬¢lP.fAßô:q2u™…"T!èl»£„-‘‘x ±$²¯ŠVñæ‰Òçýü"¢È;SÑK}¿ ©’84KiÀ\ô"ÜWIã´÷QìðÌù­RæEuvÄw~@ï“\[žGZêLnŠÆ\¥ ӾѾ¥·Aû”é2ŒÁ0èc~U•²ãåêåœ;#œä¦*j¬ûÂVz‚åBføÎÌê‚,&íKñ9r 7zOÓe½Æ#çeƒ®ù)Ö)Gø# ¾. ³ö„-%£‚ÍR—êu+ !² –ý¤4a˜Dºë3Ägc¯Ù‚*¿3Ö…71¦ æßñnh%Ç~ß6•5(°ðb.ó€[à ƒùJ|TB$9‚këÍš…á9Á]s²Ì ߤ©µÕ¼9{s¨«‡Q‚Á좻*¢Ýj@–úÊnž zÁP^»}àŠ¹Æ÷Οè§‹‰Æ\Y³\ô;>ó '#ˆJLÕ†P#ç²8kþ¯Õ,ë4¹»¶Üå¾-›ò”DžšÉüòßÔBvàX7–wœOËFnÝC¶ 5«k¸Ü½Ü26ßjzs°›Žw6¦=pê¹~=Ñ<©62"{”TzH¶5<,Dþÿ`ÛÏ“ªçwN÷<ôÍ^wùíUÇ ‰‹_(cuNúP.Ǹ´°ÙWƒà” ÃÇ«_•/¬¬ –ñSÙÝÀä‰úùŵñY› JR·áöƒ´]˜¯)¬ÌB>œ | VNOK†ý dø™poÅeêÊä;ˆZ:«õ ELÚ’f[áà+co€˜DÐ' wS®ï=‰G4{8£òI¥y}g—åqÊ–¢ȃ —pA„ºÑX'ŠŒ<éT6bä÷Ó©ðÕý¶vj׺P$.ðFÊÔÜ_bxFzÙoÃc\áðt÷wû˜SÚÍýŒ ó¼Âí‘€Å%˜¥T7Ò©ÀF<CRlÏ›5 —^¿øsÖÀ4%‹âÐŽ_@|“·á¸‰À~%à²/ÂST|;úJ‹g9sD>sµSÉBT­+õþ— _ÃÆAQup¯…Š£Ûù€¥V«7ö§ÇÈeâ+ƒ3è0"—‡º„Vv-‹ÇxV„n™fz}ngiFVçíT¿âÁÇ–%cù|è¬99mÜ”hºíGÁÀ½­nµš3†#Huƒœô•(÷¡q^L§lô[˜FŒÃ⌓•”(ÄFen&ÙÏþ}–Ö5¦»#<[ŸùÁ;¤$œtQº±eÂ’´¡.XÖjl ¥¶UþÕHK:ÞÚùÜÂîìNÖ¯½¡Àœ]_ã‡íi‰}¦5±T ô¢•Ù2‚ÑጎDº ºX#¡_dÉ‚#žÞÏ8X^X)—Ý’×µôå,xŒñÜÈ?m‹˜öœŽ$H‘Â3Ø:õÀÔ¹•0DÐöÔX—’µŠ ‘Éæ6ìɈÓµr>á_\tK?ŠPÞ V»áƒÍÃ_ÉžÃ}u=j„D0;¼;'jÜÃÑ×g¯§qS‰Ÿç&¸IѬ§Ÿ6Ò œ•çË9êÂÙÊð~3×ô…70^'÷æ&Bg·$1y¦ã^91N’ ›TÓ´0 ‘º\w†ÿ*xdžšªY¦—ršºVŽbVò¼ ˆúªE¤B‹W¥±ÂÌKÂÊšs›à;¸òWxŒÎ…&Š˜¤ëÕáv–®e9Äý?kÝi!]§¤e·P`t5_¥k Ê\U¼Íy¯,—ɤjÝþEUT¬ÁjžØ¢å2Ù_¨m(JÙ]ÖOö%5þéïl™¯Àù|ÌË»ÇÜÊY¹òg§ ×½/e9:!\ñY ™—?Ü!uc€¢‡›¥½ILŽu÷ñyÆff¼•¼.L÷»09ò*$“›ëO-»'ð“i²¾ÃàÐŒ>¬¥ çÚp‹?¼H´">üxìŽöi~¦¥¸Æ‡?ŠŸ_ù$x§@û«g'–*_†m? ä¤|:™"VsÉK]<ú½ÚT\‰àãï8Ü$OSŒœ«j髇AþÅQsUƒ4an渚­7¬;šÃË[oÀÌë‡Â¹Æè¹9•¡_éõ:»å²ÎÁšÇIåöÉx¾ò~Öª¾; »¢2·ÂofËÞ ~çÇxŽ+ ËŠ¼ÿT¢3Ð `¯K§8²x­]p…ð¶ØÂñ£7ÈIùäÓà•úséLøk,(ˆ‡ï˜s‰ ’µ}Ò"‘Ò¥_Óƒüm0 LæWšG']  ¾aⱓçy[“ªÇ@¥"”5Jx ZsÏã;þƒ™Â¦Uèî •wŸ»X¡l9–j‹ù«g+@Ü9ƒ¸Œ¯0ûö–C«Áƒ% 5}I¶ò‰b™U$Ÿ^tvl–”HΰþÿŠÓòç®g0Œ »ÆÒ9âà1éÊÄÖ»ã±pb¶ß3c(¬Œð,2ÊHãÛV~¥V#Œ,np(àÚXq}d$8E%/Ïî¯gž«M¦ÞQ¿¦ú‰UýÆ©uZP³@írwÓ`é\©ÞÙ¤ âåûDþSŸÐ¾Õ6ÞaŸ¿Ó&ç$ávÅoŒuÊÈ:§’þê íó²OŠ·èÇúÏ “t¿E˜÷¤0×§¯)kà:¬e]‹N€ ~S PÌ×7øµ`àŒ½Ì– {5+LbÓÎUésQ51òBÖ¯‘’Xµ›/5ÁGÄvbúîF?™î’|¹ëݲêá{dk  P¹ªÖzx;\—Vï 7òú“:(N§e}-\ðw¦ä"m€œ¹²úmµ<éVír`ƒ¤"«’>÷éKrŽ70oMª] er$ø•ÎÄœVRCççV†dÕ8îºÁ„)'µ¹ÎÕ!.ʦ¥G«L¦ÛY=p7 Qf›Ð™…9oØ6ÉÚ›‚QÒÀjž;£OˆÜk˜K1¹£ô¯ùñ÷z?fA…¹VLÞ"ë>Ës@µ—Xf‹…$ÊðÌxˆ¶“¼¶ éO”˜´}]VÁ£L$`«ŒO&\$ &û°¢‘äÜ®íK@ßÛðáÀùÕe_æ'¨9˜MBD´2K¢qli£žÆ—øH®w+„½5ÜÂ[$XWàÔÝ4@¦úÚßG•ú—ް4‹£Ä0-—Í!Ó´[¯Ý¸NÂ×å5¸L„)7Á—ǹŒ–¸í"˜¡æK¶¾/ÿSV*D«mÕø`|¹RoâªÌs‡ˆ§yŽ5³êñV•8miêIoã¹Ha¿ö¢8p!¾%òÔÀ„£ÖÚ(ÅþL˜hÀz+–¿Ín/L±Älž­«.ç©ù ‹)hyÌQéXï,6‹éJ@þw$¯Ï)¡úÁ°3Š»ND^ˆ«ŸÆ`¿òœ©ý_%÷ÆÈùæ©mpŸ(¤‘Y)s²ïÔ²ð‰yû÷•±_#ÚyZë%e<Üx´¬x –F6ž«zteú±²ÔO±•£ÊArGçYøYÈÍõc\½ãpã™ I%Ò˜n=Œ”ÇEH Wx5/a²vœ°wSFç'7¿ñ)⬿*i˜@f9Lk£"‚½W©ê’aõh­CVµßèZ‘e¡À´J+Σ¨’]í`—kÀ}Zo»2ÎñüC´RðK2÷CjuŠgžŒéÅËyˆ‰KÛr/¦p±Ç¹IúÓÿýïbZ9[´Q|,t™Ê'öÒ.À¿@W¯F¿X†Ú'Òµ ºnŒà×\wBÝš¦FŒEYVü†wñÙþ‹`;2vPD†Szp™ýÝPëúDO4Ñ>_Þ­æùcXLpMkÛÕú|¼©t«°dŽ´¨Å¶B­´É,Šù¯,Ÿ\hP¤Q‘'“n£iñhRgö¢¯ýùÉ>5þøæH¥‘<›î@"¬jb¬AÇcâ-"ާŖs÷Ô˜ÿeΈ³Ý[ÀýPÎ$›¹PT XܽøÁ: ·c>ìçؽ“ãõÀC^<rt˜²FØûúëvã"K„ËñÔg”ÝX¤7S=0zº£^ªõi¦ c(¦¦µ»R1JcˆmØdµþ*Ú¼‹Ç_k]Ôñö£'ýºî€&àˆF©DJþP†”ÜŸÁL^Äo¹‡–CfŒ²9»Ý—ô¥4±Ï®15¥¶ ¥áŸÒTdZ]픵 ¢Sç ÞÃRö[„Û°¶˜ƒ™Ÿ¨jõa[¶M¥\|ñ¦z^®þ!í•÷Ã"ôˆÌp˜¼w8¡ð£TTg{¿Ô¶ÒŠõy¢,Þ Eñeך`~uÖbÎòc ƒ]Ÿ8_öìq¿KÛü-€eñ 5úG?‚Pyb‹÷ ÈÜ´®s6*ΣqMÂØ&¤Ä °c¢ƒÇIÇI)9‡ØÿK%X)@™aª‡ád¼–mØF’ÄÎR"¢™:hétŽ®%Ú(ÚahÔ]ÓI\b®`kà$ sÆŽšhX\S¾Ð*b®ì“óÖ R¤.¿åòj{!¡ƒ—ISÇ-Õ8‰C¤m—'¨TC§ß™œ¶ h††·Oè¢öì«Å•'>=.’ÔHnåþN™SÇÃôå9Q@,ªmiW´"¼rj+9¸°rVý75Ó¹Ùùu„²ìWû„²XyÃ8КçÇÀX«| \[×^ ”Ô jfaK¶ØxU¤Û½þµºøµë;»öÑ¥6Q–¡°¾bÅÆ®8|ÎãSG‘=_*ÅßO— …µ‘×'·Éõ{çOï¬.G´Û#dÉrL–žeNk¤À!S@5\-bÅÂ~ã¦Íþ L®OÞ9éMcrôV¬ÎOÕFŒyx1ÈÐîJ84;ÆNðïŠÄ¼àb öÄ8ãΈp\³v“º„—RÂÝ-Ú_•vX­¤+®´±òÜfX ½Œ‹ê½¹ƒGÉ\Ï9 ë7½K*z®rX§Ø´–­]]µ/œsæÃêO‡…¬„IžU–´ˆ¹Añ‚]¼XPÔå ˆÍ_û3P?~Ù÷(›Ë7EA0ot;»„÷¾Fe»èþ‘y£ƒôͶΚ!÷Æi53ÿá!j`’¾5§C–±í34*¦-jØøzŸþþfûâOö”Na‹Ÿ4=Ä<­$6öEÑ`ŸÄ+!¢¹pç°^ •?јm2æ:¨©ê“9I‡„ã”B¯Í¬É:v;N\îÛýÝ씈掯*¤ïՄЊ88B ýd®½ËÅÀs¼ycRk%¼F°œÖý»´€Î0¢C"T{[¨‡ÎÛÁ»™TqöI¬ÀNŸ‹&hêK$ Wºô?©{/ø7uúRgãßhÕ’ŸºÒa†Po™9·gq¼wóަ[¡ÞiëTÛT»ö´ãÉ…Xt¢@-~Խ׸ª¦ÓN'÷G~úe¶ì¬.àDr Á±_ý‡>M†• dY•eî±é§‚ÁRu•s†'yÊugÒy]m$¾%½½”áŠÞqÝ%€»§‰â7FÕ,t“€t¯ÌtР£R7±(§E~Ÿ\håŠ)ù¾N+󫦖òÔ©wªö‰áæ"—•h§²É¯žæ+Áûd¬×¸oëÅ7/ì.ŽÍ¯Ó¸)e^ö“ÈñÇ`¡•+ ÊŸW§—GúÄÈÄøàµÙaí:˯ތÛ\FKw/Ü^þB½¢`c’ÆóÖ—ˆÏ¶_{sƯ¦ÔìðÀ“ÊG“ùÃ^XÖ;ºuXž„ÿ0¢ð¦  ›@VÐ!(ªÑ8¡G‚æfÜ_ ùÇ^YWèHúª/N'uÛ·Æ(©‹ù­žO ë $wúrÑÕ1SÚ ½güéÂXhY5GþÕË|fç´ü '*Ç¿kÈ¢ÆãQG”Xy2e&Ìß® 9òÕ!ÁBW©M¾'"·¢š8Ôs«<ÎN|!÷]`Á)Þ0«)ºe î¡H£äØEÜýñO“¢YÆR7ù*ùHçtö±ãIJÒî¨Ðk K­zä<‹_ïtvïçK ¢J¡Ù|«Å²«nºwÌ3mÍpA;·8ÌÍ4~W0]£-Þ„)]` úÔ³NEõš ºå«Ò\Ðjtˆ³ m¤—l/Ž5úæ¨ ×ŠŸ  ïû‘é䨛k‘’Eõ‚N¢ÇÍ ® ’šŸÍ1Å›ŒD@;zïF8f`¾™›‘ø$‰™¯² f¾˜äRŒˆÀYн"âáÀ,Ô{Œ|ýÊ6^ë§9Ymu8~‰Äò”` ~¥˜Ö’¡#ÇÖ¡ÍO~ð*ÊôªRHM/ªŒÕu Dã¢v~¤q²èö£^55ˆÕðŠ(í§Q-hXXƒµlËô{±úv šf A7·ÉhŠ]ÖJ~º•QâJyôZWËÀ%E=ÏX?Ðp»=¼Á„vÄcHªÒù—’ZE:ŸxÛ›-逎åfð©Jh³%›yd…KÌÀÕ¨àÝ¢<ü’ñlζ:*ëܽ-A¨½!°¶Á[DRwÑöõ7ßÍÄ»åˆ}µw|VG¡|½ñÁ%«á3I±ü°îµ8·Sç¼Â.Ýî òjæyÆSÚ¦Éó¦U•NÌ `€‰¹—tì,€â˜d²³õà‘BÊ|q.ÔÑzl>Y¹GPÎeÒ:möØX uG1D1Žõš¦v;8–¯«ükõÉBø¦²JÊ}Æ× ¶sOñØyæáÀ“ ãÈ¡Œ™ g+™Eù¦åBôÉ0à`ër¼@‡Ha¥<,‹ÎÖaÚÔB­öõþ¡ƒ=v}ˆ0æ9‘ Þ7FLëÝII–ÿ‘¡ñäu /Z¥¢ç²¹·`Àhð"ËUœk¼A‚ð…¼²kd·˜+u[pIJCÖÔeì“nù ù|úM[³Y nO*?Ty¶z‹òÆA­KA†J6pØ, “D_~ ›%ÊGœuNi^ýÑGsŽG¿úZ«ùäMŽÿf|‚¤k <9¹˜†™‰¬€ÓËjÑÏ2\&È\8P¢ºYíy–)1€™7Æc¯H6ëÇå$Øz,|À|póõ°Ϋßl;Ì Ç%ŠCã'KD ÅÙÉSšeÆØt¿'"3uƒýzîÁ.7*1lEpÄ»ôëÈäc¯ô™¶©(Zˆé=aïÊ5FÍÅ £Msï<2*µ©¨í­4n1®¸¶as럦¤xt“2&ä "ÞÉ$@ Ð>î%íÔfJöË|@m=õ‘bú°ÉžÞ3x•§ýHÚ|M¤B ¢Ö‰B ’˜¥‡”诚_ªóSŒßlô‹æ]ÄÎ_:êUksш/4 w "Ö Gþ©Ú±dvi-_(éc¨Léi¸üKEÎ ò¼ar*v0£ÿÂ΃Üœ ƒA×TÀ†arU®¾`+lòü’öä(K¤(&h¾ º˜#ãe¿ /¡u9ÿ7A€ÿ^3 }­oAiMýwâèp¶«êcÞÞ7ù4MºJùäåªrKl¡ý©cŸVYŠbEyÁÜÒ@d—Dæs?æç ´}ÈŠê¬^]ú|BÆ[~°` Áy¹n=c›_ÑåàÄØÁžKâi/Ý"‘U¶W]µªF’If ÃÉÚõý^%1ÿz5°Œ+u¡(ñ,0†tO*¦š¢žËJÂÑÒzãñàWüTƒUykQLñs‡öº1LQX®ñ›ÕŒ}¤X,ÑèO9Ò[…ŒUŠþÚam`x(!Õò!Z*ªÔÑq_ÉÚ˜ŠÅê¶x‘+% •ÐD˜´»›zŽÅ» ”gƒ"ŠÕÌ!‚†M·¨mÛ­™ê”g:Ê#3™ä`·çÚhᬔX¹M7[¶? ]ƒ[”­ðé{T·£ü€*³¡Ÿ†Eà( [÷…fH¬økæ!RL8Ø[UøJÊ¢ƒCâDÝ)5Ž'?n¯Ñ¤·êwŒùû‰h„‚Ŧ^PƒB,¿µÚ9Áytº-miŠTÖí¡ô"¨A(Qòœ÷`å£JY£W$"à0i,¢¿»fí]™îé^H†$t¨;º¥Æ6´áÝ£}µ Ì‹6-èØQ|<[-½1à{ë•J83=12¨þ>DÌPK´f€¾\È@RQ[1 ÇšcµˆË*ž‰Øo±ST•nŒ“¶  .iØÆˆ^¯+ —6pªÌ2ú½ÊV¼ ãxŸ Ì£ßêˆt,¬Hóµî8<äò0g¥z;¼%HRï .„Ìèh$*œš·9U=­,ݼÁ1yò±O Å=° ó>·÷¼Þ?éüæŽÌ…¸15ìVÛÿMBÓ–~`N©wÁÃÒ9>Fr˜}¶å}¿+?€P˜§5ºìno³&´8ûÀ^aƒàˆsõp§x.L6aü»)ðª5ñ>DQ¶¤«’Œ‡ ÖTˆLF[Ç̘Ý!/9µVZ†v$óºäÂêÚ;^ò¿;ú¨›†…óèù²ë[ ¡¾5ñEwyJ“±·LŽòä6v­ÍÄ$„„[+F<›·¼é…‘]P¯câŽå#’:u]ŸI3·[î»aKŽÀ`ׯNà5±z D†m¿6 êÇk¤µw9²ÛÿjÄødh>@݈.­èhŽ9egþµ~M8’;5ò$!+ðìŸ:áÈ3 &nÇ1Àñ¹*„iÕ±  +/d;Ê©RåçD*±OëZ`mʸò©ížÿaEß—{G€nÂöGKoêú.?‰¤Pƪî&bô-nÉ¡³wÓÕ騙Üï.í*ÛÓ•TNi”ð »2-Ý  ¶ÌID Et,PúlD`‚ÙªF[X²‰AÍ¥ˆq£ñh5À÷ÃÛΡM3Î i¶Á¥X–[e$#hÝfëP¡c1Ðt?ÜìÉ¡™Í «v÷gÇêÇ—.Bž‹7PZ°Ø´ëÆ\+ûІN9V^ŸÎ6F|ì]Fq—-øº| F«Å–äÆ¿Û"ÔL0x8¨"è $·5ëBÃDÎ{ÑVØ&õv³Èµ3éQoOÐ µWhþ}°"BŒ›½¥±,¤"!KÞ½ø§6r‰DOEÄIŸöíQx3 KÃ'ð~ÒtHμuöȯê…,› kûœ†WíwcO FÑ0Ì-PA éè«ÿP¸£å» éˆ(“iöÏ\Uµ¯Y©‹Â6SlÇññ¤¡p~ŠAß²Èå‰yêNfžÍÔÁ›Â°r1‰üƒjú+¤§ …Áô_Å‚†ddÞU}7Éð‘ìsVÛné8A-ÆŠ§–N9׊‚¬^ (Ž„Pÿ\ Ä¥:/˜¼Î‘q§`F«çwš'u÷ÿtΫ38÷‘+ÕœÊûô†¿5IQ¸î`utÑ U) ¼%ÊÚ÷Šý(Zµ™¦|>Ì)¶£‰*)Ã}ìëòÍy8ÄË›TsFëFúš-dà cÝkIZâOÖÒ ñúh¯›µz‰£²éŠÉ•ôèô¼‡-T ­ðÂö*àÒHE¢p4‚ k;EÈ›âÉäˆP ‹¥ŒXgÕò¦¸ OQG|)¬°YÿK]OÔ‘Al8Œ¥bÛ\û‚oÕ?ìiÚôn­ ïwïܪõ„841A³,VìSªpnÀÉ ¹ÌæD€;¹’Í—fErPLýí äʪÁC›ëL@mÄû4H%¤(ßÞïˆ cñ’:Bæ˜rêñn4é¹Ù"멬¨Ÿ–™â£ÂÑ‹-´ˆOaµgĨh—KUúMc/^`¸StÁ纫‡9¾¸TAgõƒì÷¥¯àÎ ¢—“, °¥ƒMV1Ôø6ÁO·xñ¨ñÞ` b½Í.Z}ò¡p¢œV‚Ú#ÿCC¨–JêC=´e}ø¢uüQ?Àÿ u×mS“ªûlnÔ×WÜÄ€†‚ìmQŠ™ôld†” ¼—J.™]“ ëEûî´L&K®ÞBî§% ò²qU¼qýÌu2w©ÈNjåü‚(~Óû·“¾¦ôr[bê]¤õj[¡ ] ]>.ävÁ‚S‰C„.ã `ò òòÇx$Tâ[9H “4 öÎ"jüÆ>ò5;¥*©°môN7OÖ…|gÀXÑOŠ–²ýyOm&æÜ]8tîU3YâB(jÌšõ2¯5FY)ëR}¸O·¢^TÏð²’^{Ý«†in%¡ƲÅV9ŸíhïÂO5¿ù±>%ÔÇ—àñ}}ÙO™Xâ²ôÛÌô›gw4R3]PçSNµ]Z'"Kâ°ìj2rÌTb¾2-X³Ð­ Óä@±DÁ¯}omÊØšoA‰•ñlí•wMbžkì¾°Ù³†,ߢó¤ŽJ$—ýßqlò" ®ý²¶@#Ý,©0Mi=NYÞ "®V|ÿpçg,wS¯„¼Okv–\žŒæôJ$ðCØíIäÅCBû¸ÞÐó ë¼µ>¯yÈ}i’3:rz$¦ÀÞ¿´ü¼,\âÕøEî߀ÎÕßÿúÌjÑÌ!E¥ xAŒdâ§‚™õ\Ö L¾>‹õE>Ú†ONéÙÂr IÑflüõ·´ØQ ·ÓAeÜ’4,œ/VKMh$¼- ¼Æ‰"†##:Ý$´oÅHUÐtì®l®ÄË>äYˆ,ÿ8¸É@%„²9å>I¦¯Š¿G麃ÆX.eÂ?Ÿ¨¬i¢û FÐÜh}å·’7±ï8'±Çm™²=ËÂopuPÝ qâ³Å}E¡’˜óaþAÞ‚=õH+/õ(¹ßéÿDt©beL)÷•;3?æðí‹dø@}©HŽ˜Åx$0†îú|âõYJ›53z¦š† fÆA»Ñíˆ@;\]ÇZ§Ø46#¶=Aè`"V‹QãûÕj:Põ©VÚö;à¨ðXfF —.oÜñe%K™¦,ýbŒø—Kù´ †Ïlµ,Ê5UµÄ,‡R7Ô]dÝFùŽ´}&<‚ÖØù]˜Š(ËT"è¼Q½K,¾—ÇɇÁ7Hü9\ ˆCbe©7rÏÍ-Ѓ?K*@‘3Ÿ^áŽ\xôC1kŽ~«/y;(¿ó™ý/b,G*$JØ“V—”µ%·eä\Ys _w±|æ7:YnƓ٠G€[ý ¡G€""‹O†Æ–‡ŠÛY[,šõ÷üz t˜24* oïy¯NyÅ’êÕ¬ÍÍ4AË{R¡; ¤CçÒé¨þÁû-MãX `sß7fj;$î^ާRÀ·c.8N= ©T»xã_äé¯á5~>ÀmLüg·Zm…èj¦JÉn‚.ªà*îÝ’)Ï/Å [»S'k †¡ ÓºN—PXçÕ9v¤÷]pÓ°1&î Þ£‰²!.1ÇÎÌI3€ÄÓ+h§!ŸNI•ͽÖQsÕG@¼Žu.a#‚¨´Ñž‹ê¾I©ÇK Qk¯ðþ3ggý¨*³OtþHcÃÄ…¦2yU|&±¯ç;‹iÌ4ÞûŠŒ7®ž¡Ó›ÜI}òt¨‚Q «äz&œ8!Ms5:(xC´j…3fml¨»þI~µØÔúe,øæ?µkµ fÒéoº$]â’°\qü¥¯šì‹#–#LÒY7EG?…úOˆFNÝWüÅa’7i)ÞÓ9³J'Á7ÏÆýRŸÔ1eÿ¯þÙ¨”ºhq‚+»©Ë«*à pDÁézZMJA5Þ6œÛkÖS¯=Ûøº@–“wÿ¶ ’èÌ ü{ž¦èh\%»ãé·ÑÞo‚ŒBe¼tApª½\¥[Co/F]¡É"ËAê@Åèæ2¢÷M¬†Áe2žŽœ%Ç6Hñ—-à²@É Ìd0£ò«på%šYž¥|ùˆP 9`Ÿ.RhÚ›rb‹€´L)jÇsôÔ S3ª YÏez3pÎRrˆbÈí.r[”»ŸRçU¢Ë +áˆ"Tºž?£ÂŠ{S:&¶p7W7‰ œÔ?$ï` '1bXXEŒÞ<ötù©Fc?uùÑ0î2Eø§b06[K.Ì7ϳÆ¿E19úÓ„$Ñ/áÊ7R±?®ù¦¤þNÚ,Ȉ²ñ?õ²äØ&¸Œ L–´äÀ©µ-x¯éDÏLQú£ï¾‹DˆWŠwk^€Jsc`W‹šy®ž^< 9r¿>Zœ§‹ P’¸Ü^…d-vE¾w‡~6ÇŸ–›èê¡B¤C‚Ï ³Âœ-“ÇÃOj¸Ô‘­Ø¡/ÛÁÂߦÁ ]äK~àz[$ iûŸ·C¿–ùµgBŒâ.ž9#úîsâ¦â? A’uD¬)¢ŠtŸ…¤%e‡mm w-úŸìfµ¢-ƒ˜íã—'s€ %!Zf}@ûŸ­ãQë¶'3EsWúò !ÄK3ö?Ã×Ñ0&˜mHxúÍT BvbaÆõ’8L-Nu([<)ì^øbÏLì«fe¿à£`€À®‘(ç2]m@Tc@cœ©,‡Ìd¶æxzÂPÕ­Rè«àó½n.–®ö¢aÂñ”®,àXg—ß,¯î«ã‚õ™H.Ž•àtÆž¥ýÚÒàuÏ{—ßkýõÓ{®ûÛ¾úÿwÔüðï‡ÑŸÃô ø}³ô2†Ï"®nˆd 4Ì‹áAåYï~}FÕØrEÀ/ÖöGþ'FÆ:iÿxÖß÷“nÂPÁ­ÞˆK7ùníËj§&1ç­Ÿk÷}òÊQû/EàXCà"âð,í<* "ds aÎ5‰^µ@—ê쟣hÛm‰eÉrýSeMå¦Ï%_q•`ðv‹<­v0p(Cž OìYÝ߉eõJBKŒMg¶ÀÀ(@&“1×<ÍäQè…P¡~Í*]q¸vGíÀ‘ç–ãg6ª-}Ã"…Îõ2¸l8£a<³[H³0Dµ¿cñª®0œ%Áï¯u1l"¨ 1Μü¹l°­[ÄÎX FäÝÃ×v+ U`˃¶«ík‡·åߌa;»Õ£óã»$“ }­KÀÎÀ%Ó„Ý•(¶Ãö8çŒ'*öãç“'Q8ùu²¶•_.ðÑuTÈYà€ËñmÒ×ðmfýe ,B™ãga]_phþ¯@pìé  ÈRù#V»a ²™ð™¼•ö ¡/ÉúF¥ÐVm<@(³~áöÂÓíÉãïõ„h\öí;¾J—à „-RäÀòd>KöH¤|6DÌyÜ&¡=[ºQÞöΛžLš9ø™½³I½Ÿ4mÙå·b¡©»ðAoæt7‰¨ivz÷5`JÞHñ¤J¼vzè¦l-”uelV~¹?šU)™],«GÇ@ÓìSÖ§ËÎÂ]@*Ò{tmËt‰~nŒ£¹ï¡”‘Rñ/ŠÅ.b™—f‘óÊZ¥B /§t®ƒ]2<èò$b (ª@-¥ÖîY#Íô®~¬Šˆqt«²¿‰Ð¢ºhÇÿ@ÖnUSûÛ*ÁRðìÚ˜tÍ;NWöwýæU ›¿·ôô0‰©2"k……šìß•†dÄ„lPàQ­ÂŸ§±à9¼~Ô2÷Ñû^ú†éËNîÚ’Ö³òˆoÞú›ãÀG.+ž|Çëðqîpàµö”æd"£Ú•Ÿû¿*™¢l. †ƒjÌ>•¤]kás0À§ ó!bŽ11oGÄñÞBC9Ôf‡*LÎ÷P&!õ5ìÚsÒ04¯ÃÁg^U/“ªÞpÒÀèÓ¶=j:n…öï+®‚vðp‘XVËÙwêM÷ŠË•uûÒˆÃ&$'c&9Ùrcóc 3Gºè¬Û®Ísx·ïy›wð)ì÷.*¹ìí‹ÜL¨Šý³Wmø?B0ÿ8cÇq#¥$Óx…TÆ<*B ¶W­wLÛN.› 0!`Òk˨¼õž?–I/ãÎòbl ·5¦e1Ú)´(|ʦ‡|u ¾Y•˜CpG"1è™^{›ˆe1ˆ±Š+ÚC±Ñ«„7Óc¯v؇}mÌXþœ,ö6(w6ÖŒŒ…Tí®ôwÑSà:Cõ®?o›I€p‘§ðíÌ5ò¡“"uüÄ“€UïKm?€\K¾þòõÚq¶®Ån嫈ó ZB3µ=S=oàXÎÔßöħµ Ê— ®91ñ±i¯@ßòð ?ãV6 1V}&ðÖ§¾4ò=ÎUÃ(Ã^8úèpP¿ø¤ŠTiêjÊ?uõBXœ: h$C^dVˆoÙ^žàY/šÃ±‘JjšqdÂ4ìßIfz¿±c½Ñ@2W`ÅY˜PàµhV1žö`TÑrmâº*\RAÄ"ÚÃy_¬úÐßïÚ\Ûâ©/â'þ¸M¨š¼ž‡í÷9½%¹ \¬(ÃÖž¢”SíJTûzoÇŠ\_ú¶n¹°Þ˜ASq@Z¶ÐÚPI¸„Fé¥Ñxn¸ ÒwÿjÓ§~{¢7çÊ#‘Ë=WAahªžJù£U¤³+“i$äñ"²Üê>ëRÚ jd¨ö»>{žâò€,VÒÉG³îܰ–ò´2Ý£wàf?Öp9ˆ‘x9Ѓ\5) „ ­ ÷DNê@ðÝäÝ ,€¤ó¢©1)¤¦àãA°oÄhDaw¶¬¨~ÍT+|—î›Ê†o‚~(mi,²Sû—>f“.œˆš­{…³póëΊÓ.ávD‰²ölRãž‘‹¨ ËŠý ÔÓy™X{›“²k}«ˆ%z`=ÿ:&}Öô­&fÌ+X]íåOm<)"² ø*}ÃÁÈWÔ„Å\A ¯HNX[7:Àë*Ò§MGx»-¡@òä$¼ ÀS„­þÇw´Ïnï;õAßjb¯­'øv§‰ÁÖ‚ÿ] ÊÒû¾¨²Ö'Ï刋©ä÷w£.x‰'f+¾×ž®"}þ~µ6¡;õ§_hE1²™ª,%!œ§‡mé¡[ŒÊ‚lÄÀŸ™npeîÖÎôÛ¸7Yâ6Qˆy3°!w™®¨Qα¥ùeËÔóÂSéuÏ5E3¦P¨xmX[!Ð0&.|·‹…PùS|Šál¬×ßXXSlLOw{x Øà`ÆÿhÂènE^öY½ô䎔.&ÿ2èùOŸ`‡éè¶·Ó]Í:J|6Ξ;w-ÿZÍÊÌ©ù :P=IÙ'ßçt{ÊžfÎ>~·W¿Qw·…ÕÈ ÿ¢N°.B%¾3 ¶õy 9un\éñ.½‚B¬mº¨Y’oøðWBPÙ¤÷(ùϻšï'NÌ«@°ìõÜ|´«ç¾ååœo­n븰„*Ì//Ï1²ò±>^{ïÈO÷‘ ÉæHß>Ð6Ö$èÒCx›Â©âµ-sšaÚ™KÅÔò…±ÍJµI|øF>z¥I—¸vå©ÐN8…-r÷±5v™¸ õ¢(?ëdÏÒÖnUjcUcJçîöpŸ…:dzÙX‚kØðDë§³Q*+¢¯v,ßió|³!W* O®7+a€bg[ 7Ñï;g>Â5‹Ñ™Ç÷åÏŽøÏI" *` úã² òxßfDó„"œk÷ÍÈßòqÿc%žÇ9Üàüs\™zo·ðR@{nŽïƾ;©´Šæ3 u?Eà¤èÀ(ê³`Äw_ôÊ^U÷‘¹«":óVÇÿ@Ækìð´é9åC-gH$AShm„q£nüå< w)†ÉË í|[´–ŠÆsÛegøÂɸuÚ“¬ŒÀŽ»IÜÞvò5X“ðxÅß3û‚í³Ç)ÏÚz¹~ÁzÃsvÖ<&cNt–ÚU&ÀBgEžS ½ÊÚŽ3f‡YØŒ®%=—7Þ*ñÛ1G|ï¬ÖžïH‡žŠyY´U9R&LdÙ¬éÆ'n°%3ŸøZ2€º‡þí¾ø þ‘.ù×I´•2êFÎ^ööPy´oáû{!ý½\Áß~ ﻸ~ÞÌo«©X|>àAßrðý½ªþÞ½¡ðý%Ãáú:ÜáŽ"ÎêÝ®%î ¼1¼ø?h/.NÐÚà9uà[?ȯ¾sœÙj‚ r~’ÇgFnBˆÞÀÎOé–oyÇ"0Ýb†ÝbÈsJdª«è„Jxq¡AÒ-"V£‘¡ÌÚ—ˆB÷ôðŠœ‡ßÛÆ ^—\¼ä’XA§-§±`ú6~U²(Z7Ðç™)Õ©¹ (Qí‘?L^•ë tYz/„ýžBX]Ÿ,CEGA)X"zã¬kHe@oËTÓJP–ÊŽ:¾­~å &.°!îv§å$j\\É«~ˆf‰«v˜€ÜÏÜÚ[%ÂRs1\»ùÈŽF \G¨Œ{qa‘~TÛœî">²É.eŽYЬ§fÔ(:ïå`êzÔŸé!Ÿ_“Êxž§uxÀl €ì<3ÍÇFìð€h ‡~ VÎ]U?i¨ÆÀÓd©ŽË«‹­Ä¬êO¹Ý󦯗³áf?Ûhú4¨k9°8åPoø˜ï˜ø(v,ÛŠò~vÛºRùÊ ÷ûFD/*8 ù˜aâ½çÎ{u!´WCF ! h¢IêUÒäi°0“½n½CQI1Ï£€üÿ/ÅUí!]ÛÑ^>WT¥)±<$ÁŠiAÒbù«PDG\POê{c˜e5ýæ%‹*¿yI×—µ@š*ŠbqÅå‰0Ô¢àV@}iêsF[·ÊO<°(úßB(O ¡Tã\Ý_ëDTð`r¸ÿÒ£®k匮­')º“˜Å=:¸ª[ÕVä Îk7<'w™ZÐî4ïÀêQ)Ì)£+›šëÆ)Óí»Êk_!õÖßäÉN$Ï9ÜpØòa“òpø#î]=(x81kDÉæ ª†j/¤¼ÇwSL„Éà˜ôUéðöšÝú(ÒØ 7Ž]Qзì±ËÊ Qã÷ì_+‘+Ú¡Fq& É‹?g¨¬#Tg¾r¾¼1†Û-øgüø]*uâ#±þÒ¶=Óûæñ[í•j- á‰Øu¹\EaôšµÒÕÉ$X72óšf%Š…AÁú¬*U~Aåî<úã˜ê¹CäzÒ&úý lŸÄ̾å<|²IAtr@¡&l!×gç¢uÝ6d·>„k’72DÅÜ'ÛÕ0å§úE“X¦È­yJsäžw›©|s%ŒÅl¤)fÖa³À ¹WáÉ²Ø R%œ)Ã1ê6Ldæ•~˜™¡ëPž¦™hÇ0cÖ´ý³÷¤ÿH¶'2ëïn ñHì¾X|&Å"‚³ü]5Ý×X݆± ðòK:ÃPá…Ô·µÜÖ |A½úßýUB HÀ*Ñ»bC—ãa®þIT¿Ô“%7ñÏ3l*»Ÿ÷|™gb²v^6×,¿Ç=¯þãÌ›j”çì§nÙcª ŠéeaLX>Ÿv¶+ù߬ k\7.• ñj/|ê0B¥É™¦—®£?˜¢Íd‰·Pó|–­ÐBô»†©Á¾+ˆŒÃòãÛÍÅXS(6×êh™ë!5€³ÂxÕfinÞ³ª­ÑlŸ€—-ŠÏA!zZôÎyåÒÔj©ýû$ ]#ØÇð¢<Ú“3ç¶YE²g_o¸Õ7¿~ÚV0þŒìyöã.Fû­Ÿ.£LÚóuεqбzuMò[{2jºý4ÞÚk(–ßÊ—#ÅêµiT™!ÈP#óÔÓÎÚz¿ç‰(9Oª‡˜m‰*dGµkL (à9&uçÓÿ?¸:F8ÇäèFÐ@~¯µt±ÜdëÐêèÌvGÊs^€ÇÙ˜.Dp…qLa©¢Tê?{užÇÇ8 ØvÙüjvKÑ×­ex'²%Ãß¼’¥›a=›Æ«_øâÀC¬J–TD…COgz£u.UUè£ÿm$†Æ íS‚Ë€H~üæûàn\å¼5ßû+ÍïXêÞ®6€¢¹Ô‚üêaoý­`š KÛaòëÀšÈDüäÎÐÃJ)tHò)4¹ýÊ!7Ú›ëG»ÜzhÇa¹û9iàÜ|šLÀ†åXd•Ô:¥™ÆOÎç}+6vòó;vŵKZÕE?”Öqp [O`ô,ùñц\ ”_M¦7éQéç1¢àÀ°‹‘ª à\pbØa r~y®d2_÷qj4Û )6ë#¸†Ñó†Í†p¼G_ˆA³|×-¦¾ÚŠÏt3¶D ;¡{M–oz²Öà©Hûb` ¯’˜‘9ÎʾΉ¹fت/M^Î$’-ê-Lñ­y¡[¤õÂÜðz|›]o²1ß©œ¦S¾X‡(¦€\¯œmE r†]]›\‘ÿhé¾h•s Ј,•<8.S‡çv‹}´ÔYI@KçP‡,Õº:zõô6ܵ}ÄÖJxŸï Ë( %ÿ{'Oÿ³gß3è½\6 y*¡taW›R’…/’® Ì ¢J±©¹e V$l‰Ä‹Ñ“¯+Q¶ø.Tohò®Wʳ[×1÷†P3À<…Žáóå18M' ¥\¯µe-¢NC÷9¦¾†3––ì<$«æ/ ¸u¥®H€É;£øØÐ>±ª\Ÿn…1ÊUãú4•’NÉ•&×…”¸Èf‘G¸ö›DÈeÞ›å†Ïë/Jåu 7 "€â@½ü“e2>Á.!DÂ…vìú=’ ­á õåן`ë±íq£d\š)b06ó9ne9ïfŠè÷ ;{ñ ¦˜Ö7$Ôòƒçü×DÛU€ÕájLJÜå}~™Š'U! ŽÒŒ¨pË>ogF@óÔͺ£8i†ëaÕåÙðŸw¯Ÿƒ9g޼F„Ì Ÿ¦ìSÅâdwVÉ;n;‰l/øŸïw@ß8É7ø°o•ZÓÑeñé û…« »Àfqž½ß®#Á¡¦¡œFO§ \Ýb§DÉ ®Wˆ9†ÿ-W.Ë\ŸLÈCMNe¨\Äô[ i{Ib´È„X<Ìw‡>ß,8)sWr2Xɶ³¶3‘Ra³²ÝÂ/81MYEô\™$hh§“³+q]ªNv1Ö‚(,„$D~75'„"A²™ý,À.·•Þjƒrÿ0^óí½DÌÉïCÈð7WÄ߸¦iVaD¨m>„-˰ïÕj6„Ã|E[,3Qåv?J3y_êVˆßü+`”÷?€Ù©T%ÚÈ+õ7)xp¹¢+©g Ëîµ4sÀW'IS"·ívÌ©éB‘“s ×OUÉê ÌeŽÊwX¡Ú¦*K㎩ƒèx°ÍHdî¾Ösm\̨wxu ËŒuˆ+[þ øŽì<›Ñ{BX4*µÐ‹m›è‚.|mgf)P¥÷JQܤœâÙ”Â(¥ÊÆ’ÃõEßá}À‚¾¢­.“¥°G"lÃû9 á á{í ÝcÝú6ó ^â”™ú1aë–9/ ÔV«+ø/ÏÄ eö]ém‰³c–\§ò¤m’Ð S“pÔ@¯“ݶ-CQ@‡ê*·Më É3Õ2ÔìB9þÚô‰*l{¿!•?ÒÖ©²ªÒÏ7®•jü.ÒYcàÈ˨W·=¢&‘¡i2zô+òsáĪ×ö©m”'ädH`”ðFèlñ¢|“>;*òQëLBqÌB×:GÎ1¤‡Ÿš|¸ª¿Æz÷T“fe|!Q0ÖNCÒx44u.·ÁÃCàRBð“ñ¡¢y–2Ò6ôØe¥eG[€’×ßSªÝ5›åg?8¥ 6Hª‚áYÿ/³rgI5CWáÇ)Ÿéè]ßÔ•FŸVLµG{Áq¹»üádP…±÷TÁ-’Ë»kKŠàÉÀµ„aRñ2åO½»ÜÀ Õƒ¾¨6[Ê…Êè`”7€ºŠ¶õÏeFÍÅU 1¸9zÀ›;¬Á+'`Âñ^çyh”;£Âò–ŽB|DhHyp#DáQÄ_eÜï‡ïdqjŠï¥v´gì¹\£0EáP‚%'DJBDy©dñ¢Pw\þÿ_˜÷(¢× DaK¨ÍcïÆY›«Ms’½§½ä¨ìŒÎ"¨Šª0c¨áö½ ôÃn¼{ŠãéçgÞ¢&o©7ÿZ{D[%Ï ?Í›HÁ8tpÊ4Êw-J ·aíQjô&Ñy^lÍJáã{ÿ%7¯Ò~¢Œ­x+ ˜tIŽbó’˜EÑ:‰ç²Xé• ¡$?ûsÓCre43ÍõøÐ© §¹¨¨|‚[}H@‘D¿eœ‡O½Ðí$–ÀÄ¿¦fºŽ‡¨•¿ÒÑ*]2ø=+=Tušªz„L· ´@|]®÷”ºÛï Ë"äpµ>Uækò¯bÞÀ+3n!’š+Hè<­]Üm%'¸¥×níws~ ÒÙ¦ûuæ–©aÌUêÌ—ìÈ fÅ}†á­R+û…QÜ͹ìSXÆU`d²W™œÕk”èÝióøÅíÖ‡M\(ÙWÎx Ý¥¾±UkÍ£Œ=„Å£V´šÒB“zð^Ò@œóÙóàY‰ EšŸƒþ©ÅÔÃNÔƒ/¶EnÕ”£Žk­Ñ>:ŸîÁOY¶eƒ„"øÝÝ¡îd0Ù·7UØ&4uzRÒÒŠuGNõÃe(8þŽã™P_RKònèÄGi³”Ç»èT½ùîD˜Öñå9Šrëézßí É먟 ²qê^çì§“…š”šÍIø’9ªnðã;¸óMv^HO”iù³—ðM CÛå¼)t}KÐIÒᵆn*&×S‰Î½‡.é§Ðuv£dF¥²œ°d¨)>Í^³Iâ$iD(¼¡%DÙàƒÉ "%xÎ…ØHlËݺf’mÌ€(ýê®;P¹ABdí]AÕÙ”Ñq_¼Ð•×Õ²?+‘`rHq=p‰t§¬TGˆŽ¢e(–×]M6”øÈí˜GEnõ¢ÿ 7bþ° ,¶þ?œâ÷@u¾!Æžðp~ûW¯l´OÎÍ[ÍÒ£9êZ’wµ¶5îÒiO|3^qêý‚Yªe~ ¤¤JA:oø3&b)¦ à¥Pḣ«)‹ÔU–gÀoÞkt÷»kóûXªôŒ;´‹ÄGtÕQ‘1þ­^öÐÍrò Š©+K.„FË,‚¸SéŒêŠ=ç'jq8-dC¹É™-°);‘ò-þQdíñ[ËŠpD5fšKSÌ#i”[it»çæ•f€» WLõ(mâzu^3Ы{Ã?£„SZlSOƒ°´á.‡axöR—gf¢ÿtãî®büÜ–ò§šÑ..ÝþH½ö¬Í|Ecô 5ÑÛÀäq›E_ÑÅr“Ô±Bîç!y±Er}6ˆô8~>XašfuæÖA~äiñKjDZß[º"U½(GÿÿÊËæÐ;ÈŠ;Öw@ËyCç›yú•™¨²ûÓô ‡Ø˜P¸ú)Ь–F>rüiüãוắw °® âø¼5[tÇf\v ý1ná–{Ó`šëŠå ϸYˆ‚ìøçã]À¬;Î{_¤ð3Dÿ:8›ŽÙÿ /Eì¨s5OG·¡Á¼›kÚÂg»ÓŸèþë`””0,ÞÝÆÚ¶¬³bá…éÝõFqWÇ+³ Ä×õô„Ù+¹v~ÖooÚ>žÍ¡~Šîá÷Q÷€OtK©ö>Ú°A+…ÇÊö°SÛt­D³NÂAû„ƒQBŸ<‰¾Òñaž˜aÍÙ ƒü'é§©X[GŠ®V;÷IuªªÞ¥o4rÅñí#r\د+õ&:­DÊvme˜Á>q˯†ô$Ë“iölåXDgØ‘4ÖŠ){G:Ž"wšïItd¨&ð[ÉòÒ˜ÈH>AÉøûÇ(~f?Ñ5ä¦]Aƒ^ÁZ¥¬³íÅÊÓéÌt:p=%ƒ'–ˆO½64‹·qTMkVaô&^OÁ€Ð•™áXˆMKH%š|Ü‘M n–ýðVÓÓ*ÉëÎÓŽ3Ä£ y¾mQT­,Sˆ‰ÑпXðÏRÅ0 ¾Œ'ûÙôž÷®ktu E ý÷ÏÄ\>eþ|LÕÊd&|°Dd|WOŒ¼n¼K’ì†)uË^ »zž‰}Nr4*Ø!²¤&Á²^S!št€…‚"J!D™"¡ÃS>±¢0?pé¤ÿ*¼É8I¢¨LzÆí.‚¸LjÓV}°Vð¯3 bÅmœ,aY©Ùt lÞ¶dÕ’¨ÔÞh1gÆGv Ïé„5ŽJ-þäà»f :Ôd¢Å>6ª>-¯Ä©­a7hŒ|é9‰m¡3—§PÎCïçì\A7ÀÝ·0tîJ¡fH3þ¼ó³Up ˆ ®ö&×YcO¨îvæ?ê…¦,×Oþ³Òk”kËȽö"cꓸ}®N-°¬(+»òññ@~W߸bðû2s³5“L‚ÌRxŸc ² à:м•|$õMgñËkç¾â´ ¶g%ä¹Ðˆ2¿ÿxg‘G¸ ǯö,àÆ6ÅHfϬªBÙyaÏÒ ðëB^±¨–lÅ#g¼?ã\ßÙvmËÞËû}R¸CdÑòeL¤j2öé€ Á[]¨G F©%"µT´è`‚Ì Š—j¨pcZRbvª¨ï«4Lf¡ å¯r74¿¡ îRo™ ö•ÔG®>ªÕ"Á_Ý„2K͈·BDzØW|ý"cÀrÐ|“ —V¥‹Îw´^ƒð…ט½Æ"Ùã µ2iëð•Sö—J¸«’ýiʤñ’L¹ôˆÔèÃUm=Cò…zTôÝÿp*çó+æ§sÆdùCqÙÌ @:taba™E5¡ß·ôÜE=ÙP`Ÿ(7<ƒhÈmÅv¦?LE`Gåi+Jü¤­àª?{ôu‡ÕÏh *yJÆÉKÜG ‡Ç³Öt†ñ#vÂV½¬i; Ä©ýÅ  X.™ÜÃ%4Qaú0Ù6j·•Ü@"nÚ)z8®éÂfˆ ‰«½©È/‡¹¾›ÉÝ"ÑFÔ A#ºt(šÛ®WS‘æáÐÈ{е‰9¸·ã>™b(ŽL?>L fųqŒÑrèsÑÿ%ñÒ6ìóò¡uãrmoÃÅí´I~϶ýP¬öú‰ÍhÏ †ß’5ÕÊ #÷¼= Áˆ©>qžÑ¾xÈ•çˆc᫾GuÞz{{|û£U–dð¸®^^¸(UΰÕa=){ú»Qþ™ l­êRö®k˨ê,ûÓd¿œ8(»Pìl£äÏ"~Y©Qõwuî>NTÈÓ$9FÇu€­é;nÀjx‚òGÚÐÇ¢Ú°Qi Âuœü­†”¹¼ÓB¯9HQ«Yåˆ –½za!ýNl¥fšÄR½Qü©EÆñæÑø¨¾E½jQÌ›ãpŒÉ¹Ûš»CN¥j9Ô ˆcï¡ü“4ö|äz€ÐÞ¥‹íŽçK¹ÁF+Ç’zLƪ’쮃jÖ›¯ÚIö9ÂILv¬¶xÀ’¯’­¡°¯ÀnÕ r„\É.\Ÿ¢1²ËVìYrg6pÇ¡ÆLû>¶jí°ð…zîå¡…BodAxË!{Ì»•‚ØC#=¬<Ñz•½9ÑŒ=¶¸ËÑÏÖg:Mæâ3EXí}÷­¦k‘½¦feø;4-á¨ïç¹à%æ”÷;5©÷v”Q39c¯8úãSì?í °lÆÝŸ™RÖrTŠÒB®Ç‡ XP(€—;Ä’fˆLLŒ´ú «í܋С,ì—òè&xDÑ8  ¨¿O 8±CUUdž, û“#ü‚H®Zü†SUÍ%„®"§Ô—÷*áëˇê^òæ*©Ãi äÍzšúßÄ]Ió}ˆ.•a0k‰ºÖš`Ê3û“ žoAØ,H8¥7¿šN¹€LÉ3Óá‡Õ’‡œÐ`wPwaébÞÆ2ç…r HžŽõ°’O ñk­¡AߘaÐ×<µpcÎÅ®Át\ŽqCÓG˜›¹fÍ/rS¹ãáúx¯~N¼j®ïá–ÖX4ï=ù=PÓÏ>4¾«£+ô¹ ëbáO\Œ5‡œE¹ÿNדܷ ’z|<¼’Ó‹fœ¡wŸŸ¨áô4Rßzu]N¡îš¸T{ÐÈã¯à ²Aü¡8Û¨#rˆ×ùXÆÄÊRSSZìouÖèˆL¦Ò,VÏ ”ê?e@ ÏÐ/ãmÛ1ßFwܾá9u$]˜õNbÂWŽE}FB¶@×Ç6lPò3µ÷s +D¥½)¨Ê™Ùûn/üjQô›RŒê'5Ñ^ Æd $a 2ßðÚ™Z"àË…bÔàXœ§'c®è×çWtZ_×GW¾ÌÝ|¡) ¯ñ¥Ö,@òŒÁÌ—4Aã›L^¥ª 6›ßž“ƒMÉñ2¨¦=œHº¸@BQñè.kV ¬™4ï1²ê ¢þ¹e÷‚¢p›Ï¦à‡ÛÑ $]f¬Å†DèwØ4u(r‹w˻Ŋ¼K0]Jïâü<¯Jæ’ôË` k9sütP"ÑSüû—L´dBàdí_Û9 -¸þuˆ±ôëÑÄcLÀ?-YÆÀ½ßââ§ä:ÀÆÜ#¿·@رTwYÀx¡dãµÂÃìë]ì?¯A%p#ÚU¦Î°0^|]WþÞzÈŒÑ7$dù É9AômÉ3EÒô|±ª“Ã÷…ŽáÅ‚¥SŠ!ŽÚa4(Öamã&’ˆ/7™'•ôgØãømoðÔ{íÑÿpѬ Æþ¹>«â}Zá¶ÃT'Õ ŸÃIòˆÙ,wQæ©£:<š%j%Áê¤hShÙ5Òú^i‹…ù;®×‚”AQ3NõãPlxÉÿ-È_”yWr4¿3­è«¨5L7ë*¨tGѵ’بY 0ãõ_Ú8`;Ü3ˆ:vs8‡h32éH§žŠ –ÊrðGo9JËàк1âíüiÀ–ê5jpÒ¨™™oõ®ŽÑå<'Š‚TœÒ%8Ÿ°+hÝâü&µLï½:Uk¨È+ 9Qc›•CoÞ=C:uaÁ¶ð ¸ç…%O—»W‰èýäE¸L £qï™5yŽÜJTj„/J¾E”\*#‹õ‚äœü^–ÕQ)ˆ´f§ä =uÞyUÐ ¶¶ºÜ®^ zÔqN²Yíu%dâõ`ÜZ½fW¡ÃIeœÑk¦îJ§]±ÄjͺYe„)àãâžÖ?>šLH™ª!-»b£àáS@l„èªfR}ÌÓ$]‡“µ‹"¦æ´.©ŠÍï£o1?ŽJ/ƒ˜Å$JÆ¥^C\_Ö,¾k´JOoÝUÕÄ Qp¨+Èb•9ƹ6$/Ü5ÏU~q3ZÌú7v=¬ ‰çTžú™¢4:®y¿ÞßòÝÈrõÙ¶% |3¦½”‘)†äÁÉP?ÓLÆñû×E‹cØóà«Û× ¸†@¦À"K¢í2 jŽQãû¾¬Öó§ù^EÙŠ”ð÷:â«Ü‡2.y€B-XÉ­›ÎV1cøn¼ÚéŒs Ý茛([÷[:éN?YÈÓÈ^]lõµX f±ø@Íïò|îÃÿLÃÙdSO—$xÄØ}>?)B€7û6Eá9ô;šª’X$è9<ƒSм5œq1MEhÕ™}8ºÊý8 Vh†Œð`XËZ.T˜ú;cå”pM¾®»àØ»‰ý­ÀÖâSO©ô†mPòáÙ’) ¨žÞÓª>‘ÂWë)‰¸µLd4sœã‹ÿW%ŃüU¤á‘§ãÚÅþóêL­ó9±±#·¹˜¨©‡F(#î®ê“b‘-¹â”Є¤»*…#,Á+ŽÒyõ4o „(g¾žíH„.+¯ÞLY¶§èíšäâ6 ÷Í„¶5Òñºxe÷¥ PX£I|Ç‹gfÜP;&‘*Ð2¥ž]©ÿ*¹È1²Ä蟺 ´à£L!b¾s‚Ew¸/ª-§^ÒÂØt B©,Â;2SúYþ´Ñ¢ËÔr`à6æbØo@T¾QY÷,"[œËk}#Ï5§È6ráǵt*³ê¦ìˆ{õSEîÔÙõ£A8AUHpÄ3£ø”GøÓK¨^~ˆP*¢/ÙÈjÏ¥ätu°\qì¯,è+´®LÕÒdŒ˜x&Н5Ù3ãàɆ–g2!,ŒsÜ™°uô´±˜76ÊIÈ8&ŒØsŒÖÔê¹\aPT֡㢦‡–§ó©W»ÉG­¬at¥ò‰Ãã?"ìã™+±·s±«®m©AéÝ-¼ÌéÁt¯¾¶8tÅýTv÷XÇ*õ? f™™Ø‡cYˆUÌ—%=ø)jn¨68¸‘1®ÐûÃû4C÷§)Ý·¦wÜpqŠžZ«~×u¯àÏæÁùûcÍYo“ûÇxn„ÊŒT°y_öj^4„oŽÇdجT‰Ÿº‘³q„”[¶v¢V+oõàßÚEo.˜V—­R{BhCm£ø:må® M­\¦¤p  CÌj®Ð× ‚¨Xƒ½Ò ªÑÔ~ž÷Õu+§ð~k¼k¢ XDÆv)06´)¾¶Æ ˜Ùe6º|ý[[c¾“‡[È(Öeo¼úOÎc¸½ÊZà±û'¼£ãÞÍ•»Ô#«²úÄ5«î1£—‘ijw¬”@W‡W*{¢,,Ó”_æVU¿Ô}¬°ã©FùvÝ-XM[µ,ü§%P®<Û,9Çè¨Á¦·Î4Â1hKìÅ_´¼Md_ªÍ„! Ê¢áË;5Ãõ¶§·²éS²ð؇œ†°)­·ÿX|¯®a+$!Þ®¼êÒrBØHšÞS-®W`è½x‹PñϪ#]#°}%” àEöC1°îZóW_*T1¯Fˆt4´Nx¯;Õµ"/™¤³cÄa±á60(@¡B+ yc3¶Êéq<œD[-Àa=.Eö ¶ûÝí^eEœ1—&!Z¨ÍVø:ð;rª9f¢•Ázû¨×uþu*>M±¶X56e8ݵà¹pÆ´K:éuÌz’•l}mÖ¢&‡¿ `Sx˜>5'¥2DBxg±YÏQ@LNnÆT¸™FáZ­ƒl½2¶¸âuXt0~J2ŸÝ(v¾Š¦Œvè3èhòÜðKÙ%>/Zdž8qMU#5g›´ˆz Æ8ªzMô0¦Ñ“Ù£çj÷øÓŽ14>h;öä-;¬¨õUÇTÔ Xò3|Zõ ôU;„QÝ·ÓVdD4©þËšOFÐŽÃ’P¶ÒzÞí' 1M^0FÀÞŠ_@Šsvc-R¶šP%^J#emŸpl‰5|Hî :z¦C0€ÏòÄ`ü™M~*)²œh8îºBÔeézp! ÂÁ`È}ÆTw“«Ûy´ö}2Ç8ÁÒÛ!µÖ”JFƒ¥»í  ò† ½›˜‹æ)á¢á6Îmê²z•_K.ôL¦Ï3b©é,Íó‘ŸU õ}—ákÞá•3zÕ~“K½LD=3Øßþ¹m<€ ĉŒÏ޾¼5—¤Ö> *Ý}ÚÀœbú‚Í/²ò`‘tµ2´dGPß÷‘øyXï¶kÞµ´t:äU4*–<ƒISÌ´ïÍ"ù I?"ÂÌä±þÈÎD)ˆ€¿R–ì ÷öD‚á\éPVM‘¥+ ú¢Z_YæÌàÃÈj ”ÀÊìþM ü„7Œ‹ /p&Œ¦—”ì¶óÉ2 •|øu‚€°ÊGÛ1Ǻ8U\@v«ºå.›Áp‰ž9£¤ŠæË|KT+¸8Z—,C¸l;]bߌpé"ÃÜUI’βžr›ƒVR¡%H¸îvøÈM0ÑØÒ JA¦ÈAÁ…±>œc¹ÚBî 2ƒÝ¤×›ÀÁÜ (­?4Ñv6 ¼àŒ} Fû/®G{mª04‹îæã {~¢=qdaÅ,›ï =újf¤ã:±£®£kŒ*$W#Ø¿ý=‹mÊ+kÚáäæÉC↻à½Ú»¢Xö®½Õ©|Ôðöu©¢W³8¨;íëµ,µ ž´p¶ÖöBØ8¨Ø ¶$)ïÔ ™£[iKzV:½`n+Žòp¦ßk kòyGXS“d,{^ý b¡Êás‰{uøGž9²Õ’ ƒ N–7Õ?ÖHHð¶ ×îÒ ú[›îÁâÝ£0{FD9èHö1dÓÁ’Ž;ìLŸ¤ ›%`:ÎÒŽñ¢‹½u·(¼R2PïpGÚŠkÖ‘³Þ_}ç ¼˜¬XšÂ>ävÖ¢ø Å‚¦7𲜃.3—ûpcwHU^Mðd<9Óª}@\/±µL [¢D ìxÞMxô…Âç”E]Ž#L<ÛšWrÒÀz÷‚8Z HëöÅËó˜d[½Ýªtk&L«”‚8%„JN¸;…¹“ïü…ò±jJÛ>P¢°›säÞi>1òú ]n ‚.ð7.h8WÖn•{š e™ôR6YiCZq¯õ[$z›û)áã¿SöBqO²Ÿ[¥Z-öj&⓼ ñ%Öôâ7ñ³~¸à ïwÌV “-k:¿?/|éógàlä‰ÌP]:w«Ô ½’5­OÖÙ(öí»–'=ì/·²Ä­Ê×>Ö`CšPPÁв0ץФN©ï  %Nrަì:²åIÃQ…Õz¹®õ\~Ì{Ò*ˆÌa5^ϹiöôHàõ  œŠ¡@#o‡ßÏý¢­ø¡t¿Œ#ùÁ,úçš´Ãîë’±£ˆMÜÙ ó==6Wl auYíˆ(ç®W%îÒ¯ž}*qØ¿Ø ‡ÖVc7;W-/cS ùêš¾5®-aðŒ¹ß©.—ÿ=°ô&À5>'>å÷´ñ‘LW‰ˆÅÛŠž½Ý_H˜Q}Õ?ÈNY:ÄKÞ§cDÄ Húm‘uÅê á\c ÖFr?ݺ¯Ï€>H!Æø $¯C(rZJ±ÓF>|¬e¬[º:(ª’Îéã[Û,?ŽŸ„Gå¤4’B ð8Ãþ*Y’eá‡ë»AÙûc:´j«òÌÒz„>½ËdúÛ³9zjÅûoÃ˨ä:"+Õ³½ü©†,ž*a" õü6Ïøwõ¿‡¤›øz]_o«ßðözþ-ÿgßLû}k5öúõÿ¶…ø_‡¶%öú¸ßnŠsü7;øzÿaè®þ„_ÃÕŽû}iÿC|¿áÓEöú£wÛîõü=Bo´ÃøzíP_áqñ¾Ý¾Þë?áè|þ„?ÃÕø{$ÿöÿaÕµöúÒwÛí‡ü=pÿ@‹ø{ÿ¨Gð³éÍI¼§Ü5ª }uû†. 'ÌÄÌFi`Ó²Îsæ©€ÙÇšùR²ÚIâ–‚)r“ì!QR>IÍpØ©Ú>NgNRÕ" DÓlICY¼$Ù8™œK™¶8? ëÑÅìú<í‰ðfâ–WM¦LQ@²$˾|8°€©ÎÞÓTc”ô¶ §âqþñÄzRÿES'š  ß:Y& î.Í˪w¾Ö¥) ñtâvnÄô¢Ê#ŒôeoåÞ¡S•ÐÉŽµE×Ü=|†<åFA‡­ž´¦Òïg`y+Ò»=ªÿq‡µ&Ct7´ÆŸ¯u€ÏüjiÅ.º„¢\f¾Û~¶r òÚ²RÙ6ކF |¥×m· –´ÕF…Or c.?Ånb*²Y ¨Ç÷Ÿ!X,ÀQ*¤´¯ªrÓ6}ÍR. LS7[Ô1r'0?Á,yxZ€Ý®RðR4X¾þã“wD]v¿~bÞý>)vÉE²Ã9È—öÆa®1ö‡‚Vˆóßó«ž‘2'‹6Å$Å1˪³¤KƒNZetê«jiÿIAñ¢á&ŸÿѼ™–Ê8¸Iü0‚)×d‘$ÿAÙîÿ÷7)zo}>QOŸ¨zKÃæ(ÇfðÒœ¦õ Y#ÖèY ç'ê0‡\[)Xå]fØ´Ýíâ*#›ÈqÏ®Z⸥6•Ü©Xàl8Éc„GÀÛužY/7¨Þ7S±-ÜM/‹øä, ^ôúS¹¸S`±Y]óF¸€vÚjq x™ñƒ7Ê1;ìÔ:ö²d¿ŸQc0#Æ“«ºÛ¸Xü‰ö\xQ$¢U¯mQ‡4pŠ ¶amf«Ò‹©˜¢¥=ÆóšJ‡ëY§xCËm£ök»Ê«¿œ&š8µ3·.ÿ[»š£…äÇ–´biÄætêöME¯äaóöPèJ® ³f"êYQ4I~. ؉óuì'å%äáàÜš¼*ƒ ëhÑØ»mÔÚ’ ¢krZ=ß”R[F•Uù¬ª_,ûÓb˜­¦Òb9ÜKÙ&dtßqJ €¶[éìJ„„R8ûÒôÔÕT´ QÒÈÛ%è)þáµÑt±"ÄOØ£•ÕX¸ÌHR~3 ¡¾ŸÃ²báÜEÊ–Úg3­ˆƤ\ÔóÇ›Skc[B5 —ÂÒ©2¾ì~—«vöué²Ä*âö{IO5„Þ¢°…°V:i™Ô ö¢£Å>”-‚v5ýÂôfñ —øA^ŸKpÙOíÖ>ã`$.dzNRÆR}ÉYžéþ  kâãIQ˜߈—¦èû;UèÒ’€•M˜”S ôPÍ ¾…1—m€!7—û>·üøÌg2Ž^ˆ¸¿ª#HªíLÖÛ ËC€lf_­TÖO^Í”¬¨âo{Ùž–†—ÂE÷)ß±$J¥ªø?ëµ=¼ÞÉ ³€$FÝîíSõe™¼6üÇÏ0Ò·\[èù‹QÏ)œÁ¯7ôy)Š/>k»;ÛŠeòÊÙjšå/>_wa0-£S'F×Þ]€‡3Ú¾ž¤\>­0Ígñ±…«©‡FÒ3¬ífq¦OP-U&Äô‘Z˜nÏlÚ¹8ù­~¼””ïG:ý†,G” ŠŽUÆV­C0ç;LF½½þç‰ÈýœõÃÏ©¯èÖÒ’†^|1ÉÎéãn»ÿT5tän\4µÂB…Ò)ѾÉ ³9©2ÒP‘ùÔbßnÊ1 •\ýßtëëÇŒý¸ —Y{Á’O¥_Þ;`¸PK¤"–Ó""±rÕM)GŸü«ñÑlj?r¯}‹qþ…8¾é2:ÿH–2nëúÓæŸe­…eÄS¯ž ÉX©µìùÆáA,R3{yXY¶Æú™Ñ΋é-ô ¨?_>-µoO*üu$Žå:âjBpÆ~;äîÞ78ãÐͽX{½ëkz=2ÇömÃ`«xQÃÆ¿e©†”èrîFƒyx €éßÃ%0çdùžÆÒ” á£:åríõ0;áÄÿ+\­Þzµ(b×q!ØJTÎÃÿ&T]Ò¦XÑl ç››Þ€ sYÛJ’ªŠÃZü +p2W¸6/)åõ•0*UN_fÍH©Cq¥C¶àL!Øûůf¬7%„Uý™VÅ·`q“üÙr¶åÛ#M_å›c+ÎGVµ÷çðìÛí¾øôiD&Õù 1ÿs})Bñö™âÅm [YÕ´Úõ3ØU4¹ëŸ$Õò¾dFBºÐCÍ$ÿEÉ''%è6éõTi (™ÌÃK½cgE0d·k_Ë’P`Ÿ•ÑD&OªçsLÝÎͬ´Ä?Ä éC­_kXYö‡Ø¤ “lû‹gÚÛ@;H„¬G„¯ ”m‚ÜæåoUú/°¨cÙL©R4¥Pç|eòº©·] |:“$š¯óÇkºÕßwØ´¬SmÇÎÓ )9*¶^•ìö8¦½ð ñÚ/郥[´÷„ r³#W8†©/µ* 7)/ð}(î-a\üðbÉ+ð=Öaþ$Ê£ƒº8l™³9whp'…u1Q0)Êýõt¢/W7ªÖ¸òÎq"t•÷Jb,ôáwüMwt&ö”Šhƪûq®¢ò ã§qÃæãPñµÐ˜Ü/ïr²WvØ-²ô¥’72˜oîÿj¦©g&Qò@ÎJ;èÅ"«ƒ¢Êù•—Î+«+N~¦M)‹=>õ» ß7,÷šœIKHC8Ü~ã./^ç_>Ž›w-ÿa_ }T:>™|½5º-nWvHŸQ²¿¤ÀÑ-Î)RÀ#D ÐÈàH’ÉŽD»«ÑX±ñ­oÔÇ—x¶q O«AAƒqgèH•ýºªí{'JÀÝ;l¬HGP†šõXËãLz±z6î¹]òk9òÒ«kpV Œûãøm]ÈF:~_©¥ÚlÄ{ŽÂ>kŠY0>…Ž™/¯‚¸Ì»Ô[ÜY£LoÿKü2H³KrV>±·½cW^Ù$v•á쉹Ôgºt¶õ’+†qúzáj•ôÑ3ÕÝO´]´Ëæ—ù¿ªÜ_O2\Ÿ¸™”½_$Óîµ# wLA¢ÝÖöEŇ×hzXö£ûnŸ†€ò‰ÅP5¤jÚ9eÓÖvãMZSeZ´W3Z~ h†#YQ?ìîìÝe°åá·NÏG+—,ÆŸöÓÑV2Y8 ÎÞc ‡)âgÅÂÃ,»#>«ÿO(oé¶?¹Ò4JŽä­ hŸp*~—y—È{Vi .´¨ªs$ÚsŒ¤ÉáŸÍnž‡æÎ­> 6XšÍ.8ñÑô_ ÊeëG{i ŒM kSE„@¾‹ ´.Åq¡ñ溜”–^ÞŽxôÊe=6®j¢V,¿ã¢ü ç.°"Ú)/H„8DKÁ—NØÌ³ïäÓÌ¿Zg²iÈSÃSÈLæðéˆT|\y^Üx¤’yÂÑkÙ õã“V cûï’fÈŽ£sKš˜ªO¬d:gmé†ßàgÊžÕ^ô"£¤zì@̯ˆcz5k8GñEt2L¬[ÒÈ1¢àAÎÆÊÞîx“NÏÑ}¼¸-ØîÆ 4åö%ðO¶²[܄ؔrìèÝ1¼S§i0é™\Vp,Ð=Š0XЧPŽw¡ê¶<€‡]„l—Ö@¼í^¨ ¨KÖWÇf «#ÁÉ-“Ñ“Y†ŠîÌÞhèìúÃ^õ™2íù!eöõµL8m:÷žT3Ž"¤>kBºP!$%PõzÇýZÁÚ‚£0&ù†”9EÂar>J-ó"”C|˜®Ä‚Þ6@ü`‚©óÒÔúàý½åÈÉIi7‹}ÌÈBhiúK™î÷–ãQâÆòœ;Â@XÃ4FtÆ/·¥/ße;_|%ž½”e)Z#,>|ôpÍ•º5ý­½íù$Ç dÍc¡Øž‘x\Oƒ“ߦÂUoõkË'Ö2¹ä”Yå. ®DHá´\6¾·‚J Yç¾7 ž²úÜ:ð†'{øý£^;|±kb%E—'h²ÓÄ»ú ºÃ"Cä_M uEüUì5/úôØ~»jò³€Š"½žá"L… ¥|™;RüîÒÁÚñ剾1 K‘ØË–»ôà *ô÷npÍ·ªš •듸ÙËbé7ÿ7º¤£,¬(¯têáj;‰7›ÇÞ×ÀÄFծש ÊR(?ï+ãÂáØbR b7ÔÇôs<e<4år¦ÚyÆt“'ÅV8µzÀöª7svHd­¬…Hò*Kµ¡ï{à[…sQ:C54™ïöÈ´WªÂŠ”î^•Í_‰£½C8Qâ<(®Ë\½¯Ê Õ5TìóÀFP­S¤ª‚Rw²«0†9høhB¸?rÏ`—Üïè´1úºTÏ |Ãn[g\MG¬±q´´Kä;?.µ–:# å7žA$#e9Š ¿zÒ•W˜Ëîf/&{“@[âÏ>aûÏÞŒ¹Ë@EœÎª¹¦ÄQÈÆH)ŠÙJùs쯔~ßBK¨ÍÚpYøP‚†?“§hý>=9;vqš22c ÿ}·¡˜ð6¬{êÕÙXå™:»ÏÙÿ~ÿ?OfXêL±Cp½;¶åÝÆm½ÌVæåÄÁû0¨§ªQ4=ÓBKNIcµí·N\¼êˆÿ¼‡ÃúÍcôþp!UýB5ýÝe µUM]E‰TÌ´³üv•\+av‚bÐ4‘¡=!ŠvœìLÓW)ÇÓº ’G¿º|zG㘸\tv} ÓjLá°>9Ä!ñ|nÂÍÁ ¹¬È·"øù±BûÁ8z§w%V¾™§gL󤟕ؔp;犖ʈGò€%.LûÅã=¹Yf¿ÛÀÏ*¢÷˜Ç`|R†ðþåÁèz’ÂÌx?’lÄP%§»º®Â$‰ÐKs½LõnÊ•ø0#G\ðC(.Oº®©X..`"R¾ãÇL¾½ÔÂÛ×>ŸiQ§ëOmÚÚB3Ä”‹dGø6¸åõË$Iµ–O¸Š{Ô>¶dKÑλã1“a©0JJ‰Ãܶ–Ô`ÿOzÛ\“_£$˜Â\OR!§lt6õò¼}e’(ª¿¤Àä1™ƒ¢;v%… ÿZ‚5›4Aî"™ W³‰×)DW5æZMÀÅÝþò¦€’z#’ͱdŽͪÍÓ¥g Ñ~yØÛNKý[Z<÷È—5ú$ÝÉAÚÿhl–ZS¥äY¡¶ Èýô ÕöÜ' ’6ë69o›À?)Y÷€Ãlûd¹R5ÓYw²†6FêÏ[kà“¸wx“†¡-È’¡§oŒfZ°·¯_fr_Óûv•šÏ$×÷d\èÆÈ }¤ö€¥òÇø»6K×™ŠÂº^h˜¢#¹? R¢µ’2ÕèÎSÞ&ÉLCuq(¡ÜeH:ÏñlvwœÛÞÐ|¡É¦Ÿ÷dB°Á)K…€èœø‰ ³Ãû™³v»‡‰…qLÔàCBª“•¶ Kn‹ð+ ʼnLJ<ƒ#ª;õxm$ü ò±Z4–ª.i©®uŒï9úÚËú|pM¾µmŒ/ƒKÕ¥~x^D}̹qÅT(—Òµè!°ÑŠÚx¸þ|4Rã^ð³ePŸâ%?§]† ÈSJ2óÞ º°êÎú™ (¶-iXFƒ]²ƒ+ ø%š­úçf !ÿZ½Ò®qø™¾ÜE¯Þh»wG]»„—ؼü‹>qŽ'‚z¥â¡É¬—(,£€Dj½‘±YÛŸbOsÇS3·”TaM4îåÖ´µˆ§u¸Ä:ù¡_œI–¬Œ°U„]lP™R,#QlÕ©þdƒ&B€ÈP’óp–Õé¨nͤÃÜa‰7Õ`k—”¨ãdFÑä”úŸ¨ŠÍA4æÓRúܧ~!¾J©µ"þFææÈL—”.ª™Í&äLEÉÆõÁµifiã‚õúÃñPæí%#xÀ½4‰\y\GÍmX´˜)ï.å}/a£GŸS,MàY#ͼ6Þˆg)­Ä¢n¿?kÖÝz €G÷ú ‚ÕVìÅý6—D]·pâözî˜øYÌE¬^ä” ó‡`¸<"–è¤q#ôŸý­ž>¯ =O&æ3tûœsÕ·©BkÄSÅÕ8VÙoÆ4RaµD?Ö0·q–M¡;G•®)ÓF[£ ÙX ý÷‡6şЖC¿[ÑhÂËÚ.{@Ä^ãçÀ‰À2•+žl›Ç7¿/*àZËlsÙ$2{ùLd’Í&7$8„ °L]«Ô$«j§ŸC¶‚ª,µDz½ôˆ1d²,yî©Í÷µÂL³]²""Ÿ›ÿ@5B Çȱ%NS_ÙztU‰àNØŸ¼lØÛ¡çÞ& ™£Î!æ£àœ·^„ÛV•«ÉÛk.Š×¾"Ó”wt™ZÇ„ ‡‹ÄMþ€¬2´‹ -ÃdÍ*sž<µ`»Z·.•$̲0\úL²‚¸¼îg.J7#ð7ƒpû³æ$ªeËÚåÙ^“;®Äf kKŸ´çe½óÉÝ/Yd0ú¥±;SÒÃO?[›A³jûc¬–WÒ‹¼Ÿùòa9yÄĈ:9‚˜XÌvn3Ò Kúy¯·š ß[w•Ôt×ùà¥lÑ K­~à ¥ÎSVáI¥È &D•)ӘߚaÎÍÇ|X4¬«† úóˆ‹:f2Sª-–Îpô ‰…±¨ã°1ÂÕ”3Ó˜;¸6¹/¸%ð°Œü6æ–³'ä´d­1Ÿ(%Ê»Ñý¸¼ˆ+/KõõÕ|„ÄT“]óíÛÝ^dc_;^Ä÷18§ZR!F%²fŸP çùÌ÷œvðêäöT²Dë!'ä[nðmvTá² Wme¢aK,?€™Qw·3bf[~³g¬˜5âO›ä]gŠ£0ëg¯ÞM,5­”œ‰óÔ!kºõrÐa]àP©®}Û (´?óëí˜ #¼§X®ª2UD5¯?tây_¿%!©ž}IiƒvÈ­ØÕâ&…J|è±è€+Û‡§“ŸTÈý~ûùíÜFÚ@ë‰Ó ä–G\Ì쳊¸› ¼¾°&ç¡1ƒùy8ß™Ïy½ÐŽ(š›[‰£q3ø ùíõ?žIð9yˆ?$iç}PÓ<ÌhF`Û·ê#&')9l%rF³6NÏèVHV$¦s–¤#ÑE‰AÉ5ŒÚÕ öÄзL™ñ‰{¸°›C”6jEîäp&$³NW·oÖ×QÛ±A30þä’"·ª“f›`ŠÜ´^Ý¢o½ç½ÂR›»b¿ãëí`>*î:/‰'¾r„\IO[6¡‘IïÂïq÷q^Ž)º}ŒÞŸ‚b ŽçýK]àOůì¾n;“¸YÉÁ-s8~§]>ÎÙƒéœû›Ï\;v²Ðœ/³(íR=’S€Ò¿Úß‚ R“ˆšDqç»löò!\7h §§+Ð¥UØz¿2NªSÐsÁ}vlò” Ûý¶Á x`³ž5”ú6üœ“*œÃö9-ÿ<2|TЪîyC.jÇuç_çýŸ\˜9œã# ð"Qù,hišó÷[#ÅT,|ÑÖ0™QTŽÙ¥Fz÷3þ@|Yð{„õ¯ ¿:ÈÛsœ)‡pRëøäœyg½cµfÌëZ /‘%=D(Â1owùP¹ÃÇäõ>‘÷e!ãj³×”‡Änò)jl˜nÛX›˜É”]6ò‘êÎ8j_ðÄK×â=#£±Û ¢¹±Ôg|eÿc×èÖ˜ïªøSð#[û ^xª0!jrz€eC7ð ãG‘kÛ(ï5$«7d‘„ý†Á*Ax€ÆúžÙ¨;èD‡¸ø%ÔØÀĸubŠÔ¥“¡ã–ñtK­~ßÇ¡è}ú»—‡¸M`ömø#@0éÍô3F°yŠJd c="ŒÐÁWдx£Gn“$_ù {“#v3`€[Ų’z)þûˆ±“t4ÖjgŽ3Âk"à•’fKy ·ƒ)9qx£:%åÀ=Ç),IŒ9)P»aøác:¯Zh£™Ž'aÂ}ÎX6®ËéÀá”›+ŒA#¢èMµî¸€–µ8P=4䋤9‚nRê˜siš\…ƒŸ|*ný1ŽÀ+–Û¡¡bó‹ï£^@àS(m$wû÷ÓYšYÝfGª4$ËíbBÍ v=é3_£˜ž¶ÿSEø:îaVÀj9ŠÑÜ Ñ”0”*ýá%ÖæÄï¼G{qšo© ßõ[à3…j’ =@`Éä×'Ÿ†ÚPXn~“Ó_®rx:·V&ç(£¿ç8§]÷N¥qV_ªMl»ÙƒÝØ·Jâ%ãÕ9›ã‰¹;ÿ"¸ð¡Oª‹ì„sÅ ÈÊdk Jj!u³Í~†1GÖå›÷ ;AËW’ZŒwAщè* “†-µiþì¨s9à¦nk*}øœ¾{Eè¡JTOÞÏ2 ÉÙ-sPYìàW×7é󠣘-F ÆõzîÌ9<׹ЎwoÒÞdJ‹ †!Ÿà½^×AجK`™xÎ3"è_Ý2ÔÑ#¸I3µ²Ìè}2w ØF6œ%úÙòî¨äöfÛ´©…^‘«V£Î† ÷ˆ'ýþdØ•zÄ÷„ÝdÓB€÷hÝBáé rÎf•òÿ"k0eú9³—Q1#X³ªžu¤éjP‚Àn½°¢½¦$ZM.¬[YÊ‘—_ëu2ÕÒVuMp{óŸ›+Âg]}#,»%t'BÖô8)·r)&f‚¶"‰'éSƒE :íW|@ã§ï²rºWFömH´XگŠ(k8/öæ-i‡<×þyÍe¼Éï·Bl«FáÔ—;2¬6 ;ÍÍ›Îůú[£_"ï².’¼./ u2ð/6vE¾)}9ùe·7’ ÚOöA¾3ÈþsC‡E™ê퇖ýÉOpÀšmw°3/µÔB›ÝA“Ë'á©¿\,ù×¼žþ7Ѧ. H°0ƒÞQLŠê‹?Ų¹gÍúªÀ‹ ú–^•W’—ÆÅ%¬ìg¢Oþ­Dïë’ƒýǾùþêÆœüaÔ£X±ª5±,ÿb‘Œ9ªÇ7A½ZL?[º@”[hÑOQ Ò‹H¡Ž”чŽú×þÎÝ6Å"y/gÞ+ýñ…1¹#Å3ʉ%õi£Ãb›(°”{ªÕu- {gO/31JŽ%…çÑ¡šµàÖ?ã?<•_ŽNÁ½ÓÞ Üœá,ƒîgýFIÃT…1<»‹NÉ„ã¾cŒ -AN¦9â§ë’žˆ›ˆt£vUý“’ŸWú*Æü$Ämä‰Ù$ü¢lߦjšÃŸÜ"vw‡šÿ “ÙG@I¤ôxvº9 ¦r7¡ƒSÌ‹:(…µÆ*µ03-šó¥´µ…l…ÈñÙ\u'›*Äúiœ –€€PÈhóMQÑ֪Ʃq¤@ílé˜bùü;©ŒÌu'p³àYü>ç8›‹cŽÜoµ6j³aÇ{»(‰õk¦×˜]#å|o_€4gÁüO¬Ñã¼5ÿkB:Úô‘å«Tˆe÷WOãÃÑï…Ý…øV/bÏa¾Žš² ª5­†W¾9–—‘ynTEËì<ÅìR‰lŽØ4& ˜¥úŽR׎ï+Y@öô4¼Ê b㌉v°0}‚Ëe*,°¦ïO ýþz­UÕ¥¯”oý “LÓG%]¥ÿ= É¥PÁ—ýua@ Êe5$™rf½™)8Á ›ü_O¢n±.,Lç|(‰q«˜eЋڠœsªB_Ž>Ágø#¤ÈÞó€íÑü'˜ß—ÑN ]é5àºÖܽá©ëËe¸®‰Ã›TemÈÄru6<˜xL g‚îÆF¡•Q&ÑìǘÚóêâ«ñ² #FÇ;tÉBvD.ÁpÍŒ­ShžðãMPËÓ'ÓÖÁ%vе¼¯ÔGP SèQÙÓÖu‰ù樅˜œ¹ýÁP—ð4<>ßÖÝD +ÞíK ÐiXW-Tœ³cÔ¢2ቼR:?ª8‚­yúåg¼,®¹ãUº½0§t$Ö÷”µ´š×©/PŒÝ¯ä„Àqñå.+Nì“à[™±dÃþ¬Ûd„T82 Gn·_Gé3#æšÚ»pm ÕÝrì¶`&nçå÷|9ƒo3JÍZ{žÑAGD˺=ÕÎèK®#ÅIógx¸¿´ñÖþÌtL«X—ë  »ñ;««•Gƒ§dR„úC¶” “&crxAÓMÓѧ¬§_¦=äu:Ó;W’þ<ÁޤCƒ Ô³ivB¾ ˆ3Ô•±i‘̳–G ‹fOe¿ÝAçÀHB°6§!Ú}xâ`zÇ|xFðͦmu¤{Dó"^;Üÿ;öö"eùŠ/>zXϤòmbUãÚ—P!är Ì5ÍÒõ;öƒš+ÿM”³ß,û¼ÖDå‰#w蓲ßÄ`4Aý[‡ZƒÐÒ&œ|ú+A¡,&n9¦u²¸à ¾‘믛L8Laø4;L'·š/Kå‰o’3LÇ2c@…úÇf$‹ô ÌbÊ/„\ßÛø7;ð {)ò”ö„»¶Ô&€«os1¯"ÕØl›Ñ4Ó šš<éi"‰Xñ>OûÞÈXK®þùrD=Nµ„Z<;Hñx¦º#^¿¦ý›Ö=»Ÿ£ÉÌܰºÍG°ÂzýËöºøÄçsÇ“$Ûñùª(Ö3QØÔí´œ÷@7$X']J¤áíÞ̘˜Ú‹}7:Ô¨hø3#&èø8÷É£jñvˆž> D·åZUðƒ:£#tjç\“À‰W û¡_»“;ð³ïõ’Óîæ«›ê›`´Ddñü=pDSêÆ¼…拸À¡$1U–¡¿‡#§åV×`ò˜Ì7Fç6É·lÄ2pŠ B͇[c¡O+pu(—&u|)Ú®8Z¬¡½?õ­|¯“è2.|xæ°§†E8m"b~±èOŸÌËLK…)›Œì]Ù,` t½Ké!'8 ªfiñ:b©°'Pš‚ÃR@x`Ô'ÊØKÛ6A×yqoðïq?líWq\õ6VWÚ¿Ëre»ûsº+𠵃ŒiVñ8DIJÑôÌÏ÷Êl" ù>ïÑ+ ¾£7NàßE®pþ.ùÐüÓÔ­sò„ÙÌ‚=rê+§5O$rÄÂq¬Böt·Y«#–ÊXŒ@¶èhÚîÿDaÛóoûr:¹ ûÖ[Úvé¾#ÔüN;' Î],.úC|Ëh§'¶+a{MÒ#?¹>Œ­Xæ„ÄTýš-L[ÃlAמ.kô>Q•ÁncÓŠPcÃ?³²ÊjS¡ë…ö_Lè Œa®((â ñs Ÿ[¨/hµ†ªwVý 1[‹b廵ì\Þ³Lê {¢Ê³øvÙw†Äò›ÒÛ3£8ÃÜÌJè²Â5aÊ'lêNlÀ«[¢n”ëÒ-x°ZXºÀÖ¬/íV¯Õ ¹›¢'UfðÁ¤—c ý£B“à5§Q×{‡x $Ö CËœ€oÕl²6võš)Ÿ|$ÞAE;Àˆi_´XÈíÚ׃h‘Z2n’Z)'¤Þ'ƒFÇƒÚ ÷×ÚZºS"ž  ¬/Ý>Ç$ù z¤¥àoÞu‹‘С^UŸqáш-–Åo ¡¡4¼µØ8Û±XËü¦?ó,(k÷u.ÏgkKÃ}0pÍE0çR¥+Ü(¬‹Úþf }7d?´ß>ÄM‹Ý?›?g:Úð+e¤Þ@Zÿœ…o1KÉÿ!Ƽ)(À….žE#@Ñ|ÿ©ªÎ>á…ÐÜs¸V*C‡WU€BÆ¢ˆzX9ù%%ÏLûgO¡#ŒU{&Š¡Ä ,ÁZ¦|”a5Õñ³õIÈJ•ÂIu¯§k1 F·‹Æ D %¡NçBMö‚O„Vek¿I“Y¥ùŠÉU(nh:¾LÝc¦â°Î”§šå3´D"$G牑ê%c"Øÿ/œvÃà{vñM¤Î@ÅÉ ›EKÊæçÍ`6r¢•3â¡*´?Wè=»ú¿`›@®‹Õ¥\óá·óÀ:0TsSaíŒ F2¶Èáµc‹oõÿ!×b\ËßõrQZûºi¢ùs˜ø‰‹´¢6|€;¯;wÎ@}]Ä5²8n1yOú ˆ°Á=ô‰×¨€m‡Á´åõ7Kº¥½cYÓ/ŸØ:ÿjôTø¿ ½QžB•½*ÒúÝ´¡7A"q Ð Q³*k^/`sH+Œ+æS 8½IT“åÓõ|Æ5²zÖ¬¡£\_ÈÒm¹ÌÃVÓ¿¦òO4“ò[|Ó?uþÒа80ëyé[1ÉR°ÆŒÑ|=A±þVýAgGö¢—åÛ¦Œ'{fòú- Úº(ANFǘ³3ðw!½PJ*$ë4KuÉ|…´:#ߪ&ï!ø¤>Vü•`Å͹¤®ðd¢ŒUì!0¼½&ÿ>µÌùÜU}…¨è­ž¹ …Ûçn¤s R–R m ¨Xe¹óÌCU£$†¬¼[doLË£RP ^/tÂÂÏ›„ *õÝè—¬OîV‡PþC E l2@ÄtÛ;ÂÅ£w¬øŽUÀ£fÊï0¦U®o»õƒÚ¸"x6ë5=Åòù?{£†nŠ÷òI€è4+ü¿xœ)í_uWQ)^œ)²R‰ò7»ùPª°8A`›2);ŸS âôlö«<ß5±ûöR]+©WÊo+Á§Ž{×B;›rÄ Aõ&»–ðy§é9Z/ÆËZÑ[}˜Fyó•7\ö¾ÀfÚ H…S¢SªÈÚgËÒã4 ¥ÊhS Å÷ÞªîÊdéng¦«¿Ûãï’›š¢Ïêó0²±×iÈ{Ñ’С®}NÁ¸6Šú߀?>†c¯&F%Þ|ß.'N©ËœˆÌõu'†Ø©>j¢«ÝY˜³ÿ êí,†a8àlma,ü0WÝŽ•¶BÔïlËCLtÂGcñQÉu`ЉVäR1cU&÷°I4F¥ŠUdã#ÐV~€›† "–Ð×Ô¡!'uc2&ÀÛìxµÄÑaá|¡]B†Ô±ÂßO¿~0Râi÷ª‡ƒ¬%Ÿb)íÜL¬$0Ð7] rÃoº_œê)»?ûƒïy&‘ %ä‚hƒ/™EÔüZ‰òÃ@ô5lúª„a¯..a™{ùƒ­#š–V#´Z‹˜bÒþ'+µžò&©TÄ{ÈÏ Èêw ZI¥üÙÀVNü[nTþ×mü!§_ 6º 暪t˜)AoÙ]nL çÑCùw|(If·¹ÏYö"o¥ »QzÀÕžÆo#EX1•D³4CF6 ÜÿV¡ñ‘ÐuI¹T\ Á†¬ãÞÓ÷:pB‚¹]·ÃÂjN\ ÷”qÔ»¼Òàåéiõwe)Î|2Ð;7 Ñ?ܤ%ÓÒMr~ RLiZÅqnbO]‘ §ð³¼ðãXÍ[(¶þRØM~‹ µÜqÍ5ª<¯/‚wâ(#4ž6k©àíÒ7Ô{…ï·¥f;€¨Ã8þÖñþÝêÙžŽlòÛ°ã¼}óŠn:±òš“Ì ãêÒíhà@HüßÔð|.×–®ÐüÍ)áZ!»eFXcøPǪÆUŠŒ±²V´}f¼ª¢ÚO£î›;ÚUZg·bÅÊ(RsçŸ ÷FdLðjÊxÒõØË4×WåâI }"9¿±B4B;Ÿ{Ó©ÛOÌk>£$=svÔ^±†ç—qx¤• (ØâMweН{½ž)Ö©÷5“î~0lï”ZAþJ¾{©Ò`N<±cáƒjþäZ{Ûå§kåÞ'Åà‰/Ë#ÅPÝô@b Æp_‰.éÌU*­yvi€&9…¼|%«YñÖýϸtǤ}”€oòcGT )e8J3Çõ÷¾O©|^®þQ H$o‡xE‚ ÷ljÙûO™  Éy™Ã’kh¸ø!è \ÜVÖ­y€%ƒÂ;—(EêxËÄ'/°-òèÖÑïfEVj\0ì·ƒ™úR‡ÀKÉ)UR—RçcKÛÑ7bf˜cÝwh3·¢Àü‰¨Žð‚TÌ‘gºü»nBÿ|ûZ¥e<–~—s¸6›ö¾V@ÂÐK+tÖ[_n oÞõ´opn%„ø¯š¼ÎcŠ–¿ˆXº×;H}p§Â°–]•ìoF|?}Ѓëñ*XŒ¿ôÏû”óƒëi°Ðrøœ|ƒ¯bví6†*8—Ûpâç@ÑfªÀ{Ô©G¨q½³É6°¢kÐÒÙTuÀ=Ã6ûüIwÑàJoQÑ °D«ƒ БlFÁ².Ý4BÈðpP?ôñòŸŸFx"[{›q$Fùn€aÜzÿaç¡ü5B4`n‹«ÃwÓ‘á«ø«“›Î½ôä°5ØZf59zKާˆ‚ ­Üݾm5u7„TŒ«â5 ¯bmv•š3g6Ò>£ówª$u4¹[j4ªçH«Ù£@±™‹Øb²µò$:ƒç6Zóxssµ? Ûb÷÷X±D HùeäÊÿpèsŸÓsI –íñ¥áIY‰ˆÁ)0¼ei+&í9!•È—»Ñ,ü1ò?Ê­{DÖ_eÜA3¸¥joÝq´\¯ ÁÛ÷¿Õ ­™%œ*=6e„>a܆üWY‘ üЇ'!Ñbä1¦ ÞÇÁƒN; 㥈‘íÕ¦xMú&*ÆÑ£ïiçÙ‘ìK-ÅIêùH6Q#§½… dìúY BŠyCžS2Ïíá"møá XØ8ì5˜A?‹/GÐk-ò ¿ƒ³=?Ûïo1h©è®¹é €Z‡þ‚gw¸“æëœë¦c ß(‡Õ·Vþ4u÷~äØcµ¦Gª;aLT`5¹î8Ùkô¢oVŒåyË[´m” ¸J Šðvq8“óBnVÜ™˜.}×ɳw9î[v)ÂF&ñÞù„‘:aíkYÃääAS-ýr÷‚TwyÁN*÷·ÿ~åkÄŠf‘Œð{ŽÜœm%•¥xßQm‚FŒ$ʸÇj˦%ú¾_v¹±šÛÕ˜móJ8·o˜Õ&¥wðIJrhˆbœøÅç¹.^nø*Ù€žýý ;$–g¯8&(á\Dof–âË"¼ƒ¼ ÷8±ŽèÆà\ËüËçAàT˜ÓÃ>_ô5ƒÞ=!x¿­3‰tÍeàþ ìi™É5лFÖ U'ä-5¶¦ÀÞv§˜%ë`mfMõþÊtY ?ê y , |!„îå^dliг'=œÐ¹ï†‹HQ³áA?pIÞÆ³“è†#¢Q]5‘zä~†Îneß}wT|vÊ“þé^:)`•ý'Hk@_ñjÎuƒÇ¹üÍvœh`̉®óê·t•¥‚BˆY(?=‹ÂCl (| ¹x…(t ?ö¨Sy cûÂ`kL™ÂéÀ»j cIa}ìGìAlt?z‚xÆaT‡.&©‡ q¥Š'ü霥ÙUUÆr{ˆÙäšâ-¢ ÃA•äIQú Æî WÜ`GÈ}‹¦+ ´¸mBÕ¥ÒóÐ’<°£‹JÛmO–åŒòNZ·æ•çƒyzbFö¶Öó}Åbcï·È ºËÐ2ÙÞÈ-hQÜwÇZ§Zç$×Õw­Ä—^S;¢ä Ÿ×Ç<窴€ka?‰û½%·N,¶‚…×·‹|tHâA0õJÇ¿]3aóá;pIdN:¼¼¸£5¤àùñÙu%¨M+·/Ëàë–M¿ÚYêG¶þŽV§^ÿZã6 ÎHåõzþ`ÝþFzWvQÚfM «¦ç²å7Ý_vÛ—ëÿdµú0Œ®»ÀÈÊæ¦½hÊ9v7n 3±7+Wë/ØéŸYf¦"X]t[˜ÇYƒÍhÕ8/û èN—¼ÿIIn«páöO<“+„þEbC©…ŠìÐ2 ¢>I—7,-û,÷¤&ôHxš‰Af¾?ù kziÿu]»a¹ý;¦r±x-ÉsvïÌr‡¢G©yߙۛcØ|n;Œ\¯Ñ ý{#ÚW"ïÄÈóÎ¥u›ÀçÏh‰&¸e%ŽÛrnZ·HpÙ­–Þ+Âr½)™¬E‹$ñÄó–þêLpcj¶F¡ÜáV4È€¦u‚U,‘Ñ—tÕ•è›4`¶NÖ‰÷XO.ÞšZ…l{ØA:ú´; h)Ÿ¦ÜV wÞ{Â*¸qÐÆ¡惜J›YŠwÜTÇÈàÅ[3ÐÎDš§üWÈ»,úœÁ©HßúŸæ ~èÜ›“ßN ¸!j4¬ò?]@®iøÜÄ@HÏiH2ˆTÂ…éâÖwèxALŒe×eÙ+Á26æaƉ¹’éåµ!h6BǬp ¶‰]ÎmñP{^Ú9@E42žEÔ†ïØŽJNæ+:œÝg†dßµþ³=o2¦Ëº0Âëˆ`ÎÊ‹ "¥ð;¡ácN¿»™’¹+ãqÚ°Oém“¡›úßð®ÿéUª.pšÌ.YÍ–Þm.9£vD+÷m›C‘E Q©u÷Œ¬µy’´u*˜ŽDR˜Á*U×Eì\jÁ:Z¾h…u2Î`D[/€”æs¥fÔßÏ'ª€dgœ)9-­æô•„GzI±5‰¹¸=Þ\~r¯ú·ÇLÇW7‡£_¹! Ùª>„Vs·Å`ö÷Ål¦üæ±àÏqÅùvQÜ’áxôTõr-<•–ò÷®FÞhðê3æKA‹ÌjPzÀ/a+F$·Æfe'^G”ZŒÑYkxðÒi e¹ H ‚;žþÙ'x–ð„Tб‡ÔÔBa‘œŠ.çŽåç´ºÆc ÓDˆ8÷ݼL“ôø‡j“ ªãr¯4³BW´bu]‘ºjar³Ê$zfì —1zTS³å Õº+ù“þâ¨rÒuƒíQmúrD;íq}$A¶ü’Ãuü6Í+Ó\*¯fÂ…C?áò‡<þtVÎÎ$g ,É€\±yÓoDù  !‚Þð¶­XYxÙÒ®ì`FÇ1bj7½1þ#î:^¹3)¤˜ë|öwo\pô¸_ÕpJ +Âm[¬hP eˤyp9ÖÍC Ié´è$¼ËH…d[̓ó€ýùJ…†ù°œéƒâÐ4)’åò*Ÿdxþ—µÏóx‰i‚ð*pÀ¡îvû1ßRò{UÒ¤ÔCøÉ6Å¿vlê€c  Î#¬!tÅ¥lñFò[~q9òø4³?h•ø£\ÌÝ#§–9&¤Î抸Úî•qÛ[&ÕI[¿Z½—àEÝÙ«KâíÜ€ë4¤BéFtVKÛŸœhõMáùoËÆR^!ÛÿZkÖ§M/ÇK¬ÄN`_¶²¤rðÀÈ4,vbÒ¦íHO%úª”P×eʘŸ`]-Ú-L@ Zô¬´hwxÅΦ#pÌzò¬×ñ«‡ï´bͱY#HJ8Ã9½þaÔ9âûA½Çý!(BüyP‹,nÆ3]rz½áIªPe—Ÿ MA­o]ÞèÎwêLpÉÊyôڔˬ”bTAPÆð÷+›çO˜ôu«,ÄAè[¯ÁòdpJsæ‰Zå¶à ‡|¢ØKdè3Ñ+ðåÅùjä*µÀD¾è7­g´E°OmÁ.J%”â ´ ’9ÕŠÓã‹SÓ5Uñ…Ÿ2Ù(ŠEdGÒ¬ÜgZJqÔ˜Ùî³'6ÁTgƒdÊÀü›’l¤¸FýwÁÓd9Ð|m )·v´bÔåö‹KAƒÍÛIb¤‹òI&WÔw½fšj”†TCÍå}ÿM)rÿvSú°÷ ÚëÌ…³Q÷@uʶ™€|©mb§Jåæ§EqÿH-4Ï[R½žÇ/Ö|7òŽŒ€¸«Øå°•¨‚Tš ñCzué%íGîˆö8“ÔÙ³C…*r½'œT剥ŧžœ®Ÿ ´G™úvÓW¹{ á„L¤Ðý–ÀóÇy³Fa,Ëß´ˆJ#•‡âY<ÚQa6̓¡ß0*ÖâvµÕTø7,M8Òa¸óŸ ÁB{s ô˜!ÛãÞ¹é*°fÕ°vš4ZÔ“ÍvQ7ï®ÄMáÇDHÚÞû@ƒ—Ü#º’ßÌqÝ Ãí1¡îïúD£Mý ¬¥+ŠI8Fû@—ŽEøqÿ…|lalAq,)3P¥^»ËCÈÂ7̵ÞÁÔ™oÂïOà-o€k?µ Ì Mž5ØNð5Ëfʶîÿa·#©Å FÒâ,ÒS1 Q©/õô tÄS…~¿’p` ,…Ðf[ñóTƒDÜiÓ#% ¿ÿÓËZdýÆG9üÙ¾ä¿wx)^ýÇUn@ȱ¿¥ŒÒ£h`¯< aIÉ*ÚL»x q¢r]iB•’Ãâ‚&œ’@ÀÕÏ}0žéÝÖ1H[ÉŽA •'†s@ ;Ïe_0ŽÚ’¿ãArê¥ÁØèÖÔ|V‚‡Ú"VôËŠù®…äÀ†Þ¼›%MëTÖ)%· ÷±#%ÜVjvðg…ÊgWýÕÝ ”âØD)G(»Ýa'\¸CÛ¯iî”áÅ4“NǺx3’N{/…¾»Ì÷\†7Ã;4ÿI>Ì¿ oA¾ÖËúTÏÜѸÍ.{,Ì"^ö—ŒàEྑ¾² ½l"ʸûAó˜þû$Ù PÚF".þDÐÅn»Í‘=y:+ åã¢ë а©=†‹WêÂÙ-¿Ù ˆúYÑNÓù±Üãè‹ðçÕ–JF/_Aß +^{‚itr(WðòóýVæAãß«_F‹Xn¯Œ9åfrPï=#(†Ãõ®6l˜©7ÿ\m’ %8À³)‰VÎõÃÚ³èJ¯rýµÈJg·€\`íˆwãÕ¬!›½á÷éí!ا%÷àrV€£ž“ëAEœNý£ž`¹t¹ÂQ¨á0ã­J„³ßt¡uÕÊ:%)=Á–†1dÎEÿ\ûa"(w¥1­aùGpIé6`œ“×±¾ÿ癃-æî²83¡mÁè=:ÌÃGè ³Ü&BTösë<Ëi¼ÚõÆ÷–Žè:(М¬ÅP5ݱöàù¯ýä²1:±¤ô{¥©(Z·°–»¹:í̵¼ D¨Œ °øGw¶Ñq²ö«þ½X'®9ž@ð0ƒ3… ÿ#ŽâA/Œ l¾>§{w täÂu³¡¯·‡*1+éʈ+Ƀ¿r— =FˆþÜ×_$’&áò(àí<-!dxvεÍj+½]mäW(Š ØÙA˜‰@#ÿ 9-i%Æ…˜9aÙ5öЈ.Ýõ̽‹Yw…íƒ5×%¹Zé/¦«'³GÛC¹ÙŽ˜]ÎsüåÄÑäZžâA|A1"¤ˆØÁcÄ*k©ïÚLöëót\  a™N¢ï!šÕɾ½XC§Ö¥¾n›üx³±k| ˆíÊžSÝ}Éa“D§‘M¨üÑ8|ÔOÿqr `”ZBëŒAÑæ„L•’ï2Â1_Æ Ì8Áf¢2’¿­e÷£s_ÿkrŽaìÖyÒL§á{‡ÅûŸï¯3|ψ#œôVhMû±Ò~#„Id: 2˜œéäÜF‚«ƒÿ¥Ê¶<­^vXŸ:é–vÀÍÅÂ5ÀGé·z—¹§vŠ;˜Ýk´!Ð.LR¨·£2 y‹›KÑY먭bHáB(T1+Ègc6…8›Y¨¶ —{Ô ¥eñ”YICÑ¿#Ôn›Š´„Ó½Æ8ÔŒ‰²½"—±Zp°ívë{á‹JýìÂ4F9qÐÓ̇ºÆE›Ñç°—!s$+c v@”ÚÊ‘Rzˆ9u6x×{5©ŠÙPG7-ˆù²tU…ê²cÙ]ÆÉ«2Iì¶1±­Xga\P"™÷íòáî09¼ÇK +r ´"똮rÊ’%à™ > [´3ª#§bfs­NÇÜlòó_‚ Ęï ߃ɖ‘‹ÏäPÞEìZ\]êt÷iJQ3”h_$×w0·òjÌrS@b:öÝ‚jd2;šè˜ù DLÓW=k:tå[a”×ß:~%ôþ܆Ýì6{ÏO]™DM”{%d/ åÝiKóìQ«q“­§š<¼ÚÁ/MŒ:rd’FPLÕÆ]²"J®ÇQ-ªÕveôÐ(]1lÑhX¤ƒ¤ôA†1BçøJdc¯¶JIR jøšN-‰,|'¤ØAú!ƒT¢ußœh{_×!«Zº$ż~L¼-ì$Z”h`чÒñ‰m9º牻ª³º,ÃTO9AbŠnˆçÛ Eͨº¡t°+fiÀÑø¤ ý¤š2ÚxUŒ·àìüÆGE ±ì¾"ˆÝôCø3L 1Ä%ØKjÆOÞ uþ*˜Ýø6’¬+Ï%tàIÒèê”ñLª#´%‰O’öÕ‰rO?'Ä1/˜Ø#3Fb¬†È™uP24Úé?©‘óŒÜÓ-ä²ï­Âu=Wû²w0 çX/>j!šáÖŽö5ºv*Š…#bé4Hq€|Ç[·^ô hº°Ô|aq ßbÈ1ŠÜO|è›ÎOoK¤zœEõL?½jn ÈôÁ½Ð Z¿TrÍ\âã1ãÊ¢÷âÇ"~;çåîN¥`ô]ñIòT)ƒµÐ,03Âü‡®SßnCq!@‚×éM ¾¨Y`4or€ Œa{‘ýD*Ò ú†lV^[Åœ;/þSÕY~‚a6v9áÝ‘ÍQ§{ëÉӸǛBŒ!¸jh³˜"¥Ò°’Ž!Zcìõ®»ÊÚ´;o±ÛëäÝFû«/hžÿ%S¹¶S˜¾òÆ@GY ¨¼Ñáâõò_‹‹ÕGHÆëH°³µñã/;ÇÚy‘€ØÖƒ€QQÀOÃÉ(riš&lÉBaÖí¨šØ6àÒIž*„K©X-Æ,ŒúöÕScÓfîŸò»eOšITšl’…”y¸%FdÆ2_l5Û§¾Ì¬f*—çøi±šÇÚ“¨P¹î´Fæ`C³¢—H|‰ÇáfîÍ>ÕØç¢whÓ£T©aµx&›X¡e’$“ñn¬œb—ëªÚª»Ñ˜Û àÉŠ/hüx깬¤—ô®Ök¸4ÉÇÅáa‘e6Þ䤔ìÔRlLãTÈ–Öˆ÷ãÌÆÏ#»}úžBÕ(“Õ1Ð)›ik”u1½è…‚’鄪´õ ù¨²˜tà%·.´Ù`xÀÇÉú°Xð¬)b­MÚ89ˆGÀN)¾€Ý ØS°*²uYp-[ì¿EŸ$D³Å¿u.$ÞBKá»&ÖwT7ü=ú¾Ö ³Ãħ;L»²ë·Rix}d²‘ÀíÊÝ®ö˜üCs°¿·Ùʬp+ï¾TÃÑÅçžogþDäðêÁÂì®Ý‘O¹µˆÛN¿z&IoËÏ!à¹ZT ~#G† ¯ðé5PÄ/õçRë™Wc:s§›TÛjàZvæZ®4’¾;2CŽZ¯Ûim–Kóo+¸–œ#p§ïhÓM-âyÒŽZÖ3"Èì+ä* N5aR Z7"ýШýÏLkï×4h’®lù,¤þBJ¡Ë~:ÊŒúÔæÄaökª:_öHr˜)ÇŸëYÇ_&×reòCWá‹æ™=ÔŠ­xªyŠ…zÐVHThØHÛR·*¥—<ë½u£DZ4]¥£g®DbI°d¬ò/*(TÔw£†—jna;ä»/~a"CË~ÞUèu½Qa{˜é£oã^ þÊ£jµ­èÖ¦ª/å¼)#ý1&DDBi—[†\¤k)N?_Æq>þMÃ[ÖtµÝzac²œñZTÖU|†.°Zð±”yKOÝ™¯ó=F´Œ’á‡=~MÈx{•ïà;wñ¼û!p|™Žþ6Œî=GM}à6£e$§Cê*­=û\,Ï™"õ÷œ½ð¡ZŽéý:YÑÕb]- ¾×ål€•T)‡¸¤:$‹êŒ«ãNŽ„Å{ßãzÒÕ¢IãS«9Dª+¼›H´×šjs¾0‰0gù]+ù‘ú¤ôNN£Ð pìÙIÓ:7fP›P[E©<Ý„´E}Hwøþ¶éU‰˜OfîˆÙÞ)‚0Þ”Mâp#Á¡‡"A5ݸXp¹~ŸJtÓâânÎDO.3 2´n;eeÃzІtþ$‚yaè7z¬‘påâUÄN xƒQÀj¹¦+¶„,Òd¯7û*Â'Ø‚Ýf:X£÷B§›G>6cŸ‡0òŒÁ”;Û?ï]‚Iic ?ÛM9õôkŠtþ °Gžy}‹zLøY;4¦¶ *›®•yvËýÙjxg‹(3 ÿ>§š§· ôö_á'™Š\Üoó%^«LŸqrd¢Æ#®F' œ /Õ5øÕ”±>CðTÈcSá'uÊ ãÿ8 g8hZ±-±‹+ޱ_}kê§X KÓ9?|ä0-–•_-°Ð´žT€Ü_àð £K"È š·ü–&òl>¬¿ÂO{‰|@ÏyqkZªѧ:• €ŠûcôõªÍŠl¤qù-~}û%÷D‘ÏBQ«AB}Lâ9"P½.j‡p3À_ë(É“™ö[úlÇ?¾úcšæXÉË-QÔþ,‡v}5"ï|â8ëó TÂ1(ýÊØÆàñª›/Ù‘çö€‡©1åkhû t„wnÔ}ÏvzÎÆ…XŠ—èÏÝ×ó®P5xD:ùõüµd¶y_ÒKå – Y ?{M©.ø†\5BÊ:¹³G˜Ø4Ša–·ðÓÜ“"î 8qô‹*œùRö¬´fKƒ'YZ[º#,"uŽ©V1÷tw]RMƒˆÑÑðg7.ìö?±¾€¼/vÚŸ~‡€gR pà½iÏÏø5ÉãçÒL“ù×Úv5Ex, Å®vªgf^X9y=Õæ¹V1̯¿|enR°n‡Ã¤ŸÏVvûB]‘>KÄÐ ¶ÐÞcŠnCú¾Ô+y¬ÅJL6^öHZ™²vO5Ê“]‹šÁ8WΟ¡oQøæO£¾ËÖ‘õÁQ?•{Œg!)ıß5Ùji]ÞN6æb™§¤¿ÿ®¦FH½:•îø†º›ÁgnþêÏ~I4¹Â5VÎ.Sº¾[ÕÔH „£˜àHØÍÆ¿Ž\-Ó'„ŒÄíȈ"ÇÔØL4¿2øÛ û]‹œ ÈÔ uV‹"5&-þå•F²E1þ|ƒËÿDªßx˜Gÿ?‰ ëYˆ¼M)a =K¯køz”¦ã2k7þ6,; ÷¸ôÃ`ý ÛE3"Ž_¡~ºLñ óI¥ÂýòLoæò!MžR<8.ø¡rEn€Ío6,À[•aµùøL!EøÜK}†ÞØç‰ mÉ`?Q²Ëê<>4 ¼Ã•eåJô*¡¢É‹HûÑ|ü§¿ö,‰Ê•¶RþßQ3|:O|—*åÇøZ¢ÃïxHé!!úHì‹Ø·ÑJë˜Ô‡BÂc¦Õê’gÿ"¼EG[ ¹§qƒªÿ1ƒM¸PIþ°+Åúaúâ‰O\1;þÉ/˪²D®C…efbõÃWJ‡äá Žî¸§¾m·—¢®þ‘‡Lrð̆CýU!þ‘à©@KÞt8%­Ï‰À.Øwçïðž.÷hƾæçŒHä“×Éà…—ûÆá8Ò#¾È),wõ26h®íÑtíáÃçáã ñ»ËT%®žºN¡i§ÎrbIÛìÆ8@Œ)М–$ ÿ?wÛÐ\bR&XŽæ—ÝU€ƒ?7Žó÷Cêž‘sÑÏvfáÀPœT(ãÑÐŽÉ$‰´\Û˜B®ò°3ª‚u‘ ¸EnE ìkï!%^?Ž]6¾Û1Ú _”…ŽNñ‡]›6×$×E€Í4ÐJ°9fù‡ü,|u?ªLºQûŠ?Ðüs|Æ£‡i¼ áÊ^3<í# ô­á:¼4‡QB¤„ËÓƒ~&£ÚD’ ûihùXæÞ®oxÚ7vDð½;OuBÜ¡Ìó-ò¤Í­W,ÂÊL|-§wE^ÛiýVî+§iPW¯”›øW¼RE>½A›¦È8.u¤HíôÑÒXÀ'BHu+¡^ßòó©õÝ̧tåkü n†XÇ©¢¶\šµ Y&¤’T1áÔ›·kómÌ/žº>:$90‚ž>ùÌÑ7ÝÉéCi;‚jµ™cò€zÚ6`íjŒ4ÃýorQª¬ûϲþ’s)ytj¯ wW(«.1±€òg™eŽrOˆKÓ²1Žï[Eºjƒà×ï¯kà•ê0;/³†ÐœÜ½Î<Ç&/È6Ó™o6áwiù™a¾ösˤÖgc}Ž—0AÓQô|Æ"n35b±¦êÅ)47¶ Y*úØh±:t¡\¶„ ØÐà¦' ¾ÛÚ‚·IÆ!0®‡ŸCÚŠmËAU€i!ÕöfÏü¦S¾³­iâ¨R}2 Dwv‚ÞóŠ·—.tûºàæè¥_QÒÉò¼ë‰E P*…ÓRË1Í^Ú@ÿ!?`6ù©ltؘ¤ ©/¤Ó‡}Vëò–i¶g}¹–µõ¸µ¾«ÛõÍó$ËÝ A”û/pòß…²|x¹©îB¤ø"Ò–½ ¥îšõ¡6Ó$ŒªG¤˜ø0PÌ“</*ÜýT õ‘«›}r[·kFúp‘|a²?͵Ao[Ëlªá8Hü:Dµ Ëe@U¾üº¬Ú“(–žÊl wÓ5V' s¼:jØÒs袖AzŽþoüxÐÖ´IŠ ]g+ø]e*€þ*4OS70%PÃ2h:ìïÑ-ÍìžnÚ…¼x¼žõm„Cã–¯ö±äI #$øM ˆSô ²ô®añäWRtL«× £dnÔj¼4F•Œ#kί®—x“s–ÞE6‘ë³# ÿJ‘v10ˆë§Nã³ÕŠC¬Ÿsž+¶Ñj#8]!þÒÑÉ5u`h mT•éò•­þ9;ˆ¦mÖÓK˜>­*-ŸeDÁôê3}T(‚x¤?ð/Á¡(À”¢ïW‰!JC„ Ødè[5uBhb"l´ËäsgÌ=ü£pý5²Œ¨(rò€7(!žÀ'•©·7ó=»¯Cþƒdp ãtùâlñ wäÉ‚{Úé·¼ÈÞ¤Êr¨†&¦˜‡x9nºæÎÂ2ËÊsLßbèHøÅSNíìDÙË UZïòüÜûÿdq0"‡Æ8‹%ÅÏÉÚ*ÓÑ`L9”ƒNÐW h=¹ô9A~.ádÁɧ`•(&%3𳯤7I7eúʹèÍ+Þ…Ýr¸ªD`Å”­i¡ÔÆ•!¡Þý§TñÆÛ¯3âxôu$)Kè ˜pL ÌÇÐJj¢‰M` –ªB¢Ž[Êí!9*ïw Ú7,ùe4eE"œ±×ØYÏpÕ0`[ÑÌùyÛ4V¹SÿAá>¦nL¸"q!ð±«Â»^¬\P„éF{ßZÌÌ»ŠÂŽ€ÍA¹•Ÿ¼¯ bÿh14Kñ'œ´bI’ŸÔ|žÿSáLÝ"ºVcíëñ¹/P0m(›¤åzO‘LÛqÆN€‰ˆÓç4Âq¿‚â*-ßO¡ë&”Eßç¶MmöŸEç«"¬m&m‹{{qàé[%³êÓí—ÎkáM62/Ø åØ*ž*¢D;  Â$ˆ„ú`¡-¤ 3"Y8]²U1Œ4Ö‰uWÛíb=Ŭ Ô)•u¾YîjÝámkk¹¤PøàßÑf-dôÅùc:’Ù•²1aŠV½U†œ…ôÎ ÏHž¯Bv'h²”jéVFà.ô暉°›c7Óp¨QΙ·¯L’Xh,vVí•ÆD™6Ѝ]ÝÙßYõÒüFË¿%mWI¨,Ó…dG¹ƒPYÑp6Y¶od¬ ­!Ú7’ך{±³gÀqC³Ì<_[ î@Jä¨ÅMBi†–s3ÍR &EÉ0ÿ2aPqùöK®’-u«€‹ÔkϲÂueìd‰·µÐ+ÉÇ2¶M”·í‚QÒ‚´ƒ”ƒécý£ÕR`Slñ@ÖVQ/UY!Á/pÌU#âÿ6[ü~ÝÀãE}R\ráđﻕÛζ½º•ˆ‘ÿÂG ‰[èÉ7;ƒ#Ìò²ó°¼¼°P.Bÿc««WªèïŽ>ŒGînd Ab«ÿQpôª+x n£ ¤Ì>QbŠ Ï’¯~â=7Ÿ”Õ›_‡øŠ¶ +%Ø8”6Ÿ[ÕIN)NÂ7 &kx‹]¸¯ªü#2]‹ïƒn©ëŸ¨U^èAFJ^Ä=ÐÐù¢®=¶P¥-\°Î?Æ–¨@†|è³Ëoç ²÷MÈs#9ßJýŸÊжÃçV•í94~>Lñ§·õVø]#ì–È©=¨ôªÖÁ¿ŒêJôMw”౺l©òŠBš‘Vß>‰ó޳ñþµÔüÒaš&ÁM1¸Ú·Å GEýüC˜zÆ@ÜC£gNÁàU~ÎOµm›­ ãÈs8é{1a/”°Ó8öFíýà¬~µuDw.ˆ<ÂEÞMŸÐZ­ŸÙ„ñt‚Ttâa¥âutü膸£«?ûùÝ”¸Šòj•ü˜ó“þ~ås@ñº: <Ê”L,;¢’ŠQ ‹Šî§¿v ÿ‚´Ÿf¬¥öå0ÇÆ­èùÂ4!ôW1 OžZH$o-m–£+,46Ýä ÙüßO³c¿]CÄ¡V—\r¿œ!†9¼çàÕÿ,]“ž"ã¡UóÕ™NÐíÂ^èSús¹Ç´ÛÍ0”Ë1ô!øªÎ' ºÍíÒAôªv™•®¹Â2M¡~jxl¦¢Ùϵœg0=jmo#Ë^Šs)ͰãÙüKÀù8.…©(sá­?ÔÉŸRâÁæåˆ‰u@ß’*¨Tþ¼cçi®ñ I \_f²ýè©C ([Ñœ‘SáÊÀ\íù8øJïôqo¯<…¾±×1&2Æp1’#øû‡¥;xÈTAð%Â=ƒ¬“¨ Út ȯ°a—céÖ½îæÒ»Kñh}À 08Ÿø|0*ë§„€Œ±¹£§Š Àö8S=b\Ët|ñ`Aya÷¤IW®² õ™ƒà®Và}Ç÷ñp©&Ýö¨,['^ˆV˜Â"Ë0+¤½0Ù¾Î2.*Œ»‡&§üL©ª/Ñgk @4\æY“)Ï=š´æWžkÌ_²d‡yÈaJ–ökï‚ÃvƒH!½ }w¥30`7ðÞ.ñ%\ê{ä¨"GÓGb­8űÿqìõ rCxÉÔé~ϰ{ß:ó_$¶ÓÓ+ZhšŽìï†Zõfå¶áïôÐEÚÊœÞPY‰YO­>†}è%Ê·yér<®êVgÜ*ØZPñÿ[ã3T6€(ŽÜÔãWHùVœÖʲxªa&ñ¥£9q“pEÃÏkê2WnúC!â-^ú…õÅÙ‚U½dq ‹´Ç“¤#i³dÌIÅý…ƒ>ŽF¯ÿPÀ³£•Âb°ëØ¡(tÆr®*Žék¯ÕÑ1Y¼£†ïÍD‹Æ[âpû¨:óG‰4¤0Egø‘ü°éNùMÕ˱]n46ùzç½B¶‘¡[ -}œuö\Ôø£âôôýü#¹áˆ42ôt]R±ÉÛñC(WžjMºVtFG†éß=·ÒZж/Sßa×g3ç:àãCÁN’3¸¾dl¶Ø©WF™yXHýëÞ6´’äšLS­4¿“vû§?æ³Z©¿¦3gzm_(`¦YPéXıÝ>KA;Z eÑFƒ‘ÔʵòjÁ$9BEI«*¥£ÙÇ•¹_¥²s¯wìš‘9’ˆ;Ö, ê¹F8Ÿ+V-U“¿mÏ!: kzÉ[دtÅFÞþÌkÞXÉÛ ¢:±B51v¨Â5m˜%ªMÈ£î¦%'^•Ðeœ’xÑ+oœÆ€‡·±ugqeà¯éH ³‰Ë“ØèDPAÔ™ÑÒF;“B= ªT”ÂÄû¦¢…vÌ@âönØ…,UÖ4žÊhb±ÍbÆÕµüíj™¿"˜ûË¢=†Á:áuÏŸH`Švìù{M‘ðà5¶fÍP³—[4âŒ~E1FÙŒ}s §3 IÅH˜˜!¶Â(SYs~r*¸@‡;Ûìôˆ-2 ÿ‹E¡˜˜ÕÜY8ÒBçj€@&ߘñOG¡ñ=0—…D)€ð•¨š#›” ëL!}”Å»½_¡=²*'xÖŽ"~K Ü”Ñ7³Ó±› Ö>_„âOš~4ÿ4-ò^Ät¹^|F‹`¡±;¼2ǃTTk­uë‹nÚ®7jÿ[ðqMk¶äñ±Éä x‡— /»&hÂGKD'Ønå‚Ë‚kX7O)ñ–dÏò0^/DÍ~uÊBLlµmp.ŸyÔE'17…Hãc!6©AéNŸ=Úb—Öj2xì©”åØÈ>Eï°>EŠ®ðóðoQÊ ÜºzOÓÕ>9‚̼˜²‰}Åö%`Åø¹àwXJ²…Ó33fÕFË6ÌφZÇRuO 4òxuzÖ×¢4íò¤Ÿ E³]Òo«x˜À\³R¢˜ñxNì ìƒ(5kFÚ %äÁ‹¯5ÕŸ;KЇŠR:È 3buÏú zÌþûªçÝ N­G]£Ì10Eq‘qT›îÛüQU¿¿$¾@rHØçpX™<ŽX£ö⎨¹‡d0e%Ö¤Î%ˆ>7)òÐê~öB¼ù*úìX4˜åÌ«z½2‡ùHåc¬8ÎøH±ý°¤ŒÂ-éÑzÄú—W‰ó(k(®¼¹PÇhF§Ö=¼ ̳|]o¼ÕmgÓ Û«Ø; Ï…žoê ñà @à¿GÕá„ê¹÷À2PåM„üú`‰¹ú«Žàá·Ü|Ÿ¾: š!ûñ|vt¶¹Ù—´yª¼üß %¦Ö¿ä|"ØBÉ"`Qd‘á(2ˆòŠ""éøJkV(¤Yæ–'¬üï@6‚X]_sAÖíK’bÃE­| sR.‘½-áÈ¢ )pawx;)fµð*‚)c`l«÷ß}R(Ó\lIʇ8ƒ™FÿT ü)Z—B8&°×* :Ä^Šì‚ž †(ïqo,.Æ`CD ˜¼ÏàÂ08\x/`£Éx`9e!ù–Y ȱ\RyGe’•v†Sÿj˜ØKô–bH@ԇĢUFuÀµ¢sÞº¿ riÄBúKBìgŸ£4Œ8n§ZMÃ|•Ð d;Èc€ÅöКÛL%©…T= X½ ªði¦Ðgd®ºìLŽ•·ôle!YnÅAçýZEw=≭RÊxÆzP“DÎôT"ZŒ *¸¼c-lô!±Î?7Œ•ê1&ZxúRJº9âªÖæÍëB®ìÊùa»Þ¹ ©Ìô‰›W]?ºaˆÝ@4dMÈ9ïð È{1Ëò#ùgµWO ŒoTæ4¶¾hxÇÑáò’&‹üžá{x¾äçŒ{Ü¿nTËmû&Ì)挨B9ü*Ú–ì&BLL°F 5Uü† + ]¡_€n8M¡Š]¶ÇU×—z`ÙqïÊŸ1?áJ…£Á•rAVÇŒû®òˆÀß“TÏD¯±Cl43q/´>à-‡ VIµòPçP:²iCµ¾B –ƒ8 ÖiÒ}²ÎAh"·€¢â7IdmÅÕ¾ŒeȈN_,#߇èèî÷-«GÎôj¸â²pæ%áÕ¤Ær­z¤{½$ü ó¾¤ÈŠþ”u¾õ¤*Ù†hð–jñå°2Ùñ¯>ôÿI6H®x½[_1BâÖÒÞªê@L©Ö~i¿*· `~Ç;!èHêärÀ§·Áä%ýÝÔOð—éôΉžÐ­µš-'PfY!è‘HŽ«Ó6‘˜O!çfxÕ„ôRö^°îP16Îær1pÈúŠ$G-ÌiIýé©éHóK _攳`ÛÅí[H¶?Þä8n7ûõ$Ò%0Öè“YÿUÂØ¶vôè†gFæšk]³Œéyò7}}ŒèF¦±=ÛcDD‘wòú°Žî9ëÍîžm;qjÐ~­!VùÓyzMèë’„^úÇ,af!ˆ å…‹åÐû>ß'Ûšü•ôÉÆEøA;0ÉxõNjؓYuïWS‡FÕ>Î÷gE›8\°å:*xŸDòw ái6k × +>X—¸WEÊÆE¢ðÕ֬ެÄïxqNÐIëÁò€OzÈÍ”9%ÑäB g4å»çKÄëŒK»jµþÒRý¶V0xrÞ/=S÷Q¨×Û& }j@A ÷]JA'…,<üºÓ_üž2žûÃãÕ»¯hˆÊ´ÜÄÅ䋟r>žP.ÿ*µOÙ¶¿h`Ÿyý:I7¼þt·wN† ËSDÐ`Gjó¤M—úøm-Kº0Çâm¦ a܈DãN…«,W’G´ç†U}mk‰Ô†Î&¨ *jSH²´ï@œæ’vºq1ð«¬ïK¨n•, 4—´œ6“]ïBÀR*ªÑ$]I®@Bùx”³<œ‘«ÅÎlÀ°×SÔõXí‹ÊŽˆl2üã@@Ù¸[K0ÊÈì½™“š`‚}Шóù-כ̪ágŽÁˆëŤ#(>]4{Vì*‰‚Èy⎭]áŸC Á“Ö‚wy¾UZð42Öâ þî”òÛÜÌY¶'å‚=úÜ€£.Ú&á9÷'¨Ð±V1´RœÊŸˆ$ÍÛÑz´—UVzŸ9 ˜ºG­_´Uª*³ºÈÛp^Ât#ɰÆß&F&¸š—ó9É¡ç¾Äa{ý\ƒÌî¨YaöDéÒþà å5ö½š‡«Wr`Τ„µ @¤j5ìA“Ž’ÈUp{d@8\8qKY¢©ÇmÜ ¿áîsEÛIÉ ËÌ—\Ýù(C,Gå\¹àt¢“w¶Ã~·çÆ©ñáÍÇ€¼I×Ã!1ÀÊ•ú¤Õµ©-šÕ¬²6\-ÂY_,]¢Ïc&Ý_ûg+£V á]Ë©ªÁ°HFB§‚ ÌJc,¸‹¯WxŸØ±#ã—áq®>ß.ËT¥Kz Aø^N{ØÕ˜°?¢£¤?ìÇØ¶„¼è7é!“b?j¾á„ŠÌóôZ6˜Àø7Œ–-.ºûØŠP‡PþŠnÔûEà[Ð6GPIen«ÂRÈW¾ýè·jmû¡é‚·´„AA`€îú;ƒãÿxÞP[›ÓËÆ7_ýÞ5[Åyu.Ï»[+„‚>ï™ãvƒAþÔâó;k0ä,bú±‡¹ 7¯$žmSºVjÙÜí¥Åýé^ßB¾ò`þ=êâ:–­'tÁ(Ö?He.G(a„\¸Z›bÜ-°$ÛÌ5ž3…vøÓ!SŠaÛ@ª_œq ì,~k³Ç¡ñœÉ¢"ð”a ›Š ¾–À7è9¾5Êûuš¶sŒšyC#CNxóÞ-l”2>悘J³ ˆ?Yæ 'pNÿ(Ü"/AÊ ºš1‚òµ®Â1ˆA™ík‹ Ž‘¼Jæ¢7çUô=½@“…u€¡oÔ>ˆÖ\¥FŽ“¾©ÑT%­’É àþ³§2¹‘6$ÆLìœiĨum{¢Ô6(ëx:š¥ª›c$`*ôûAòyâQ ì[IiŠ•í$ÊØÏôCHBœý±êÏNÙ¨Óa„@M …¨˜zØÇ³ú.ûû³ZÈϼßXþÉ·-cÇL NxWªJbPÇÑ"³B¤?¥&\XÚ1ÕW|”YHâ1šL±±Åé4˪„GŽýÿgÆ>û|,“`º‹æ¥(ˆ)ørùÖ^𢉋“ÈÿEIn<²XÒ-;íK&º›ö„8Ë=˜@~h4º8 •Ûñ2cÍU„._–¼b¹óé™SÙîëÜ“Ñ2 M™…ù+$˜ŸSwŒ”=Ì­[F²W'9µ8M†ÔÝKðrŸ…=nH˜ó…"˜5]6š¢6mFÞ²ˆ,-4:%ÈÙŠÃ"ÄÒÞã±ãäïaó6¢.Œn.¥×hÝÔ¨Röªä jG`ÐDâ ™ìMW>‹òÁ·!8¨Y+Ö}ÅÔºì€Ü-*G²˜;Ì-´c)òŒsju¯ªz5K®Q2÷tDLo±#Æ êÅ+G öQ0 xà5b œ˜¥ì¸¡æÇÃú¾z3èOÏšŸv†ÛpgˈNKXjòÊ8…1Â*ÇK-÷ä¥üëbíŽãi`¨¸·µÒX6­J[)¼U<R§?9{ÇHJ„ƒGG¿=¼ÆfùÈ»TItœõwHàÅs­sn2ÝJî —}ð7ÎåMxÄž€þ§¶uAçÙ™šÊô.à u©¦¾½úŽ´„ð„¤ºóë]–MË>üºMÇŠ м¢¸ÈTVêÖé…¶ôÑ)Z±$_> ŸsY¥·‡õj#“c–+ ¥wß/²<^⋈§ƒñÙKb¸q¼ˆµuzÐàôÑ$ïµL F{ÓåT¨Ôß¶z sEöËƮLJé×ù"»;Mï°ãйG³X®fÎ^´×ŸüY)Ý,éËÙCî’ÑÔWU<1 xA¶;eé¡J#èEؘÊî‚2 ÀùÕÌï­)çá.˜ù/ãÂ"ÍèÐ¥ÍËâ'úceëÛºØ (OпYÁ/i6 ç*íLÎÍ.E#Ƚ‘+æAoYì.¬ºÑ;¢ÏÐò4aá³s è¯`7 ÓËò—ߨvmò«À5€-‹ü¦7}69ŠÁÏœñY ³#€>=žcH²WeíGD„èÜÏŠY±`üì–öcüV«ExRU­xñU¿Ÿ2ÿ„ÑšÉ~k䂸4PmØÒàTÓ› …¿ã; Ñ«—Iv™ÒØÉLD«q¸Ú¾júH>¦.éúA,ýá,5söý`Ý,‚‘u7ât¢,¤“Ëbž‰&’2ŒHuR.“ñ*#Ö¸Ò”QñrŠ'OùƒØèßàb2ºÌ*6f@ó‹üÝ%þ¸/Ó—õƒmŰÕ““ñcp²L¡% ÄVSÞK7 I·mIÓ¹'ß,Ö.¡ ;KeÖy}Q1uèXÀ¨üï¹}džÿ)W›ãE)¼»?é„«t÷0kåT}ÏaÚ¥B³®šKš ¨{ €#öh7ÎçîhÄ”³¢ ˜¨+™Â'UÏÀI§¯¹ýÒNÊ&ö„dOŽ÷gõ÷`Š‹!á˜îÙZï9«ZO’A.}„ujùeƒ‰‚n¹øš¿ÞíåVpÎpLAüˆê^šfGYY”W˜Àxèiõ˜±HIiˆ­ sð ÄÕUÄ:Š3-ÝåÐ>yÝÁ_óÇð{Gx®‚7ÿ3¡qùÐhÐs^/ ¡#eðÓôI) r·x®÷›_u2Ì >#ÍTDž'r-ðVÚÙV¦DêÔç"‹ÂN/äÛ^[“_„9±Æ9 O˜ZôâÐçÈKU¥£÷ÎËZ’ÍÓ@ýO~™d’(Æìî`õ™m±5Ø”WžQœ*1p¼‡“X§ð™­cYk=@·õ Kûø,— ‹|Þ/êûm«Ž_Å#½¨*Ñl¼²l\MÁô©§–iÔÔØ±Š,³ ëMÛ|"L•ÊÞÆI¸ûuÆ*e ºƒt#t‡L¨±¨ÏˆG?”¥äW»$êí Š{8‘íÕñsîD‰‰bò }᪠‚Ïz¹!“‘ÿz8¬dyFŸ¹D»šSPƒˆ±<|:h<«H°ï W8”`Ñêªâm™Ñâ´>¦añÏlúM‚åq¥šþìãyªƒ@oGê]8bzGR5”@ÄøêÞ œ–Õ4ñú8›D q“»ý.ü%¬—>«^{<c#Si¥yŽÄx¼ÕZ:zGt;ÒRü6%·Â±‹l{á6nÕßjÇK[x?éïâR²;‚"¼ŽÇZqÒ¡·H£åŸe²&"kä# æbº|¥±,,m2óñ§ÌYV} ƒ‘Ú±»¥Ç–Ž‹k>Y´…«5ƒ°÷žQŠ0÷Ì»r­ÕÐß¶ªx:Óšž$ì—K’“‰}Ï$yÂCðU°4unÈbÒÕ~ðOÜ/lŠÞ• f±ä÷%׃ÙËKAn×Ò˜C`Ìô‡§æÂf1ÜÔ-%QâØwªMù›–²½a§hP ÒYõsá$Þ%×sŽ7QÌŽ 7-ñ>YˆiØ…Ö[";§ç,- âÆCø<)먅¹#Øó”ôÈ 0áûþƒ]¿IL…©GÚš¶ ìÿrôföš¯‘}T5EWÚÐúÿb4|bd@«ÍÝkMÁ!û}íLò'§ˆM uà/N á àηy|£2P}Tl/2å‘gÄgþñ—™ííý•ÞOS>FG×qHøœ¹ô3¯?fÛžþ .Žä–éZ“÷NRËj'( ÜùN`@­°éh¼=sL`“Kâ-¾[›Ú!“cŸ:å2ØTΆxjdØ)}ŠsHÜ·ËL´2`9hÀ°sB)Þ‘/Cç6â&*¼¤Jtâ,ã )„Ê‘ö÷9}þí‡È’“Û´:'êap!ªxiS0ábÇ4ºôÃÒkžÎ²þñ›¸4èyk¯Ÿ[mèæÝ§x{j}ÿ ß¼˜x"¹†ƒ‘Äoâ‰r+¨µm”f¢x©îœVcëZ±h<¼™ÅÙU3KÚ¹^u&ÇÒZªwÈÐØ èÄI2 »1ä¼ïžÑƒ…þ/ð ñ7JSV÷æþlf€ý9>S£eÒ¹÷ñŸÀÜçúµ%a?× +‡KÁÊÁ»n¶Rè½÷Zêžu,ü†{¶|éqÕy}r ˜ÄeôxÖDbï·•——à N/÷xô}úÝ'¥ æ|Ýh‘Ćù‰ÄÔIðz-W TU&génóçÞç[Ÿ™Ý‘3¼¶¶þÁåòRBò¬ÛuߦœÿÅÉÝò§@‘FY]Êa)Ú¾Õ?BCž´H¹jd/¡"ô°âÑ´²Â€Àر[íOük¹†Ä¯Õ´¹4˜úé2ͦ¤¸Ð8Ue¤½Û=† ¤4ïþ¯ßÖO‡õÛ;w‚f™Ð9;±õ˜5S K­Ñ‹%e‡IŒËØØ«†Îœ÷³•ý<«¼Ô 0 åz‚ÖMa¹mQR|®€^@}@ïÊHq°mð¢$ƒrÞÿ\6‡jqV¦fgÜxÎ@•üp ¸OIv?d;v3K\x)Ú²ÿ@%’ô£\âx¥@˜/_sSµÝêÿ[—pÙ|MWܦi0¹½ ¨ùÚîd‰¸K§>auªäK~X6"u‘(&‚ñ|°¶(´îÀ²ñ›PÚJ&Aqz¹v?7«Öè‹Ï€ùÍ:{ŠI;Ò±~óàôþ¯6ªî|È™%óxŸÞ—yùÍ_ k~.¯[û‰ì¨=\ˆ|…)âƒòXÆl½§4fêg›ß"t#ø$Þm»ÁfÄ>¢íê¯ÆdxR4€ ‡¤}F‚wIÌo¢8z%’+7ðCˆ–r*³RˆÙÕ–‹J§¼û‹Sº1[1õè*Aå'*TeåÝÜêäëyÙ¦¥ö¦àÙÁé5£…ZÞ­K_’·õÄGp.=Dó1Pé))#™Q“ ˜@Œ\ŸS-°–aÊVT Ólñ³û4Ÿ‚?‘%´c(¬fZñG¶&!¡ÎvÕªƒ,îF©yJ›4DAn]£Õðb«Ðti3?·º‚5ìpp¤C#ºàq\ÅЄ´ö©Ü®cwMî}¯ ”èÿ4"»Š~@,=¿pÄb¿”ßµ>í¼V±y%äjÖÉtÌÑç[Å!k²!é"ØMY9äŽó™ZlSÞ‘a›TΨ‘s¼å([EËcŒN…3‡OXÂs¯gl Ù˜¦e¬¬åã÷ãþ¼G›j¤üQ@ò3^ÂSW­»Ý|!{­Hû²B–ní ið¯¼wDÎâÔúèË‹ù~’♬¡n3ü¦^+2—͉ìS¡ýŠ—ÁY`Â_9GÚœ¬À^Ú•Š±I¼ž3HJ1VC‘Ò#qG1Au‰l²þj&âúàÖ®¿Þ…„Œ)+߀a«›Ì‹šßu㕦û ÂG»¯ ›ø,•Ð>Ã2> Ài!À føcâ]žv´†_h—Kõ€H2&ù:LKµyJ®XÌøå”S6˜˜Î¢ÒÛÑ'†x£õíq`Pq¹^¢DÞ ´XH¤ëVûkAúMÎÍ"ƒ‡và¾jQ£T{îÇÖ $WÍPw%qУÔû½éúˆABÈkò-\4ZùÀà©ïfp›å ë—]Š!Š^ö:ý(8§þˆ~B- 7E3ÿFñv:œNÊ&?BF¯$`ÛôM´”¡Ä(á+˜Osá²àá²O7 &Ù%t÷xo%«ÛÏÉw&0¥O<&\aeÐ1èõÑ/?í0€¶ .£‘<¸VñÜOjº¸©ã*(:¡«ë»Ø œ2U¡ý›Z—¾313*‹âߎD”h!¿(;üþ\ûÕu,4¯h˜iuߢãåv‘uå $˜åà¦Ø°Î&‚Éâó¿k.$-§=Gv8s‚cñÈÞ+)ßjNœw¢?yàn¥[@¿D[¨vÕPlD#¡þx9öÅ‹¤ŽD Üèײ•–Úï&éÁp¬Ø®œ¦%"«ƒ2Ú!½”‰¯s» Nq‹9!¡ùâÿŸ®…g ™£³ËËHh™†#·:ó«Äöñ-QíˆÍ8 ÙâDœ‰ôaÚ[È}ò™¢²Š?&F2åJ\b€õTçu6qª\¤«üxÍ •]ŸC°Óª G’´dPë~Ž–§897îFË*‘\P‹DT&—2’ˆÊH žC·ºø%‰íï…À™Ê;±Y«¢p6ojòM±œ•üsEâö¦›ÁØ¡²rÚ7²m¢û~3`BÜ¢1T°«æ8qÄÌ®2T³ ýâ_A™.oø-¬d<_35¶Z¿Ç±‡d±lûò5´ZPÊXî½¼ÛY‡ÇÖ{ꬅ‡ýlàBç9N·ƒÎOOKôP5ŒKŽ" -Ì;¥š—tãÓþµB$fÐN@'£Rt(°ÆuÜÞi¼èõTy{’¶;ùŽRµ×ئÿUÞØ‚ÀØpaAMëºdô°¢r]¿Ú­2Ùw<¸B8Ÿ.>¾®åž÷ž=wĦdíØo¡àÏI j¨/ßQvÝ"CüÌí¡"Æß,ÑE‡NʸnºÒ¥aŽ€¾ãÈQô™­´pîàœ†ÈÄ"~Ã턊x}}u 9iÿeo‡'¸¨G]Ë)zkƒP æ|w±,ÿfã˜*¶ú˜ú³¿›üW{I”ƒ]'FÀ CG—êQ"©1ûXùÏÁ}tˆ7†…÷‘ô«(ɼäLÅ_ Öf*&) 7¢ H«òÖ\¢Øù~2»XWCŒR1‡ÛÓĆDXÆC†žhKÃzî p$ÌEž%¯ r’Ïññn‘_^’ÜÛ Ú{¿ÃØ'qw<šAÉúøp­bñp(~|<‡5«âæÏJ Ê‹Í^Mæ™{|ßvØ”½7Š­…¯w|°ó^#û¸?Ê}9`nir??½éô@³LËo¢l †åÉISR)ö$óxu܆Z á vÉ 3)ÞhZ30!µœèè>·î±l‚g:—*Mº§¯AHÍ üsY—»ú^öƒoÓŠL{ÐþáÛÖÜÝÔºÞŸ: oÈD° žw`và”¹£7¢Á»°ufAáðÂm´à`r8V ì¼6’N‹óoXêvÚxµú]¹*÷‚Vy .b«i§‡bà;]»Ê`qr&Â8©Y›'[!Úø…ÖÝéNÒUð¢æè0?*Žfã‘§¿þ!Ç,ýJÖ, cy2É`˜*Hñ„ïs¢÷0:Hßà±À÷çûxˆ:*ï¢Ï¦§‘‰UŒ¢m8æºÇó-H!6ÈÝ¿7Jl+Žìð ¨qÝ•a„åȱþþJ0»Ü’Þ®Õ%ÔÛ´fOøC‡CÇ0k"s Ïw?MÐd\ž'ká]#úÛ Ó,mA‹´¦â­Aº²ûyÖ¿'2 Š.v•t*;Ì‚Y×Dp"ð¥Y¨oÉõ%¾8ª ÓÔ÷H¨Û'­±¡ÍŠé€»‘žS”Ú<Ê…³uOT>SF…œòûcî²qãÃä!d_“ý•aZLh(ÅÆ<©‹Šé¶µÓšCOÚZ\Wªšä¸ÝÇ2M²’&D¢ øm;ò‰ÃÁë=o“<&e7Ö…N£àdÄæLÊ•®vü¹TÝœP2œ¿h„Úh3¯v§ôaðávzi0i-Ü„3` mCOŒÕ¶ey@é¨þ$A ³à4nÿyÎB‚ÖöˆóêÄIhÇ4Nº¯øÛ…‹Êæ\Oîñð9¡©B6Ðñˆ®BÁ|+½‚òü™ïZ‰“h@‚ù‰#1uÓyQ¡ÅP=§{;amij„ÐËU–GVðîÕdœ»Ô 冰JÚsy5æØÞº¿êâÀÆg„X7Å{›ª#€ (€AÄ×ü¶Œ»"û)r}í¶¨‘1¶^}3eã?fÁô'\Úfv×D[§|¶O'º½4çj’Á)ój)å©» $:tM%Q¼üLd•+c‘å”-JCäv¤ÁÅJú‘m{ùu/X‡%Ó¥arsÙRŒš8W¦¾ßV…z…VœÛ»sisT˜ø'b£†’,h_y‘•d­z¥KÆdÝ›Fë>º†ÙµìÝðϹv¢†Pa?* ;ÔДÀGLF÷V–±ÆSf³e|âÃËNÉ!9ÍýN•–Äi‹\Ó‘Dåî:ÂfÛjKKÆtè öÙ]GíÐl„rTŬ_Ä% éÂ0dz3{,@&„Vµµ²®ÂAåò3ÄÅŸÝ›((Vµð›çÑà+š£mÜ#þ­g§#«ªÍ¿máü•W\GÞŒÜøUjÚÞ‡¤“ÀÄéïs/(»"¾jqß8rï•TfN<ù6éA¨ ²'ü‹r¤¹ò‡÷Úð.çÑÞÔAθWþ-Ä“D¶w±«5"Ñ—¸CºDײPñ‰Í@ÁŠÅw ãÔ `Ôwï­Ia¼ÚÅ  ³:‘ƒžü(Z´¿öVÕ“8¯F)È.¢åP1¥©Xß,d—¡»Mz·;1ÔS3àl˜ÒÁN[—Añ£›ê¨µïþ¤RIŠ ж×GØòÙº™¥ŒºuœP´hç$¢ ¶ª±xÿ\W#óŸ«d ùñF‹î…_m•R-‹¶Y Æ=X"®¥N{vù.MÈ HÏùF¶ôö ^}j_ú@,Å“¶€ Ë’¤u-"ü•?`çGF'aeº=uÔž?: Fø¥!ôŽdž_°š^å1ÁÛsöø øZ{4‚2¼\d~?)ìáZN*”@AÜ.ÙÄÄ¢5¢Á.W®z÷!™,,éº#±7Õ›m6ôŸ±Têçë¦wng9/”É…ý\}æ Ä”wóåü¿®4×Ùg]s3EY4çÚH8 šÛÈ7îɾқAâºc3ËðÉÙFWäŸ'»Òå³_Ed.{lêôÅ¥“ÀùZñ8C¢»lZ¹V+§Û?;nPÍ_½˜=§‘«Yÿz—¦á &vó"îû¬O̹¿pú5hÏW¼‹IqL¨E2 d¨(mNd+$%§ÞVšNw6èͼʂ-Ðÿ4 i—ĞÚ:ôÒ4ôÚq¸Ž˜>Ç´ê*˜6öÀ|Ëá‹$Ë|djR;zOåðƒ<šJ©xWYçÕPrrŠÔTÛÇ+æMÁéц|QùÈŸòè‰0$Ð!8‹"&]6W¯œŠTêoÎ#ÑRžœŒH9q¯KþÖ_]*ð£ÃËÛžÓÝ ŽNGŽ6RhL ’µ, úàó7&S³¤–í®gMœn ¶Æ¶¤»È:VªyXhþ˜•Ÿ¢iŸ”‘ÝÍå€È²7E¾®%%뾂`ïí…ë|/š„ûØêúÅ?ë4Fêx’Ê”w L"ü Ô3ÃE7)l¢ßWl„€¸ &n™;.H~¿Õ­ºô›TÆŒBXtéÉŒ Í”p£C }Å&èìß)|AøX°š× âIZ†ù›è<µjì‚$/ž6õS€\¼™ÕRÇßÁÀðçÕ….㢵#ÕŽ7Ãszª‡zp‰œOê‰]ÖìÂ*Âí—Ì­|#sŽ`ž¨U¶}` í8~³Blgsm©}_ö²rÒÖÕ±A\ÖÁÒƒ­A|bWþs–‡P&+ »¨]vÀ´ÄT89¾Ó)›iРN‚s..Û×;³#N\‘Ãó+]¤wÜzØzÃîsEö¾¥˜VÃ{»Î«æcÝ7æÆW ~è4¨Á?¶2HR#4@ÌœÈâðYivÀø¸Â('Bñö¶…X<ˆ'H ;*2Gb7›Þê#¢€›Uê—IÌwÿml5ŒQyǶ›6§¿³HÐú{‚-ˆ½™+ÞwYrÂPQÛÅõÃî`ëÔJ™ÄØHX¨cL g‘Êv¡ ǹ ––3Pg§LÔÚ+Ûð>úB>ºž2MÅ׫µEÖCŠæÐŠt|Ä,ãi;ù¨z‡/ NÒÈk¥iŒm½sÓ)ÐHë¡^c¡ó'XjåóŠÀ§R@gϤù·‡çüG}å,înK³Ó-¢cUVÎú-É9¿¿äØïØŒíÐB¡ÉÙnÎ}’–RÑKºÛþÄmNÞß*ï3ˆ¸MÒ1k´#‚<~O#°WŸŠÁ#EjÄÙñ™çßÐ2òÈ09nØ&†MX3_䲞܊û‘b)­G“ ΜÚsJ˜ óøïÕÉܨ”oÕP×Éhƒ6ÐÐ/3è-uU þMä äÇ8nß;­nû+D¶¿'ÖB ñÞNÿTîv±ç­è¯öÞedW¼ÅLµuÀöQ‘8r¾ø+°•½i•É.qXR ¯NZ“®ººÌK:«ŒõùL“„¦U^–— ¨~â<>© ùþ„н~ZÐ[”¼=õ=Ò6{Š×rZ*é¸~™÷2:ŠónÕZ¹[Ð —ºgÆ>?ÐÌz*ÔKàeìpÓ¨Q2\ƒg¢Àclë‚ âçmåj&S%Š$Ô‡èÐp486X,yüÓƒî¨3Mx$ßN]4 *E¶B)2^¡ÙÚÞgÚÇNg±-Œ)rMíû* ìÞ.Ç«é,Ö²¥-˜NRXíè-ùsê{8`fˆŽø6©¶yom L¾ÒËè÷@c±XŰ놴´ž$½–æ—ÉSoÝ ³mH2ïæŽç÷›,°&„"άçëlM©ˆ†«!ÅÈM*âÎÿy7^]XÛ«Ô½÷¤±~H¤¼&p?'ˆ.Ùý§)+(ú¶‹Ù…«üDš}ÅJÁî#ëì’&Åÿ){3;Ø(' Qœ‡Óç‘}îÞ@îe¾×¥ÚÓq¹,t‹ -Gñþ±ÑÞêTd¨´T´H€Òb’7wM¹¶'¢|2Û÷ÜM¼6Nª³ÜX$>î˜/â˜ö èöæóKLé¢A-*ÔÀ'ÖÇEm¦=U÷L"2ÉK¢½©ÏV¨˜#àí²""$·ÃÝš/ØP>;¹k5AÓHBVðJTØ3§iyñjáj7Jº¬3UNòƒ•j"RœÚy«¸ƒ`mß’Ó5`}ûd’Æsa`Dîéÿ4}dÜi¼ÓÂöJÇðøãkmÿp~!«AFƯ•ÏI¹’4 =kv<Ñ;ÎôNY ³/[ËãB‹ó@:Ì_ ,,0DÔ@ ]ÒoauŸXv[k],\Ê Î7­Êhì\´\½Ùùìs­µ¡±ºLóGNüz½À;©¾Ÿ„ì ìJÍâ–– ›,7¹~ÕÓrLð„Mo’m@#  £ÿcz‰Ø<ÛõcÆg1ÀXa×¹õ++‰€³ Š®C¦Ã ˲ªt©u’òñ[y…ûËq ðüZtzôYr/Ûq ¹¦†¡ ¡ß¹ÐòM™æVÍÏ«ØÔd˜0aO=¼=ø”Tu©x`…@·I‰jì{“gãüǾ`—ñEïT}3G[×í –VƆ€$—Öî.(ÀÔ\*×Ñ .6+^è6«K+{JS¸t¶Òø ãyT–g‘Ž™ô ï{ãci 5:˜gèï¶hâ¾$цæmÉþëí¹xQFWtVkJQq@ºÇ.Ô‡Ép–ýjÜß OEAjMëÿEêÄì(pÀ cЕ‘Û¬? O@0ÓqíwÑO†ÔÿFfW€ƒáܵh°ZèŽv†Í Kƒé)³(/ŠDB¯5Ìw¤÷ì*å&\³â&Ñÿg“Mȗʳ/÷ _–©Xlø æ]_šfb®‘2ç‘ö|Gß*A/²[Õ”³ÈÖemïõ™°œ‘«Ë‘t bñó³öõª§ _„šyïÐѹ §ý&§îX¼î‚‡´‘ f¾‹{ú‹}@½9¡¦Þ‡S+µš÷2ï\J :x¿ò Ÿ+Ý’FN b VU—¤DÁ§Œ÷l›5·úÅù”(ìn9ñHBJ|tGï[M$–‰¦dJÕÜí%‘½~Où!6 é†d?¼î7©Þo ’²žØ‹ÛV;A¡×¹qÝK1.Ž =v­ªúZEµôCø>+ˆÔOésvyד-ïáNEÊ \k—à*ûŽÕ¶Y;•8ÂB#JQ”ŠÛF-ðÏœ+=‡ö8tÚ9/ŸF¸& ÎϺÈnPR(~ÊÔÙ_:d+b°¨fSgyܲ)ˬêxZ•Êe!Õä>CéP1ÉyyŸ«}=ä»…³’@ Ïá1þeB¶‡#ƒ­ôa+#‰î1ÅÆ‘Á ½ºUwÕ4_ž©²ºà©.!fâ2Æ”j8±Ÿ(mæ÷ço‡OÅÌgÜ^Dþ¿ã­º!EË]…ÜwÏ“=acç‡òg¬…ß‹ahe¨ýó‘v ža§ ‚ô›ÀÀ£Ïq¢xVLsç4ZË¿î•6$^acŒW¶×ÕSHÒ¼İ1ïÚµÅ>p?¢}ö°Œ¬#š+ Æ%HÓ·@ 7Sý{daT/¹=°QZ¾h¾ÝÓÁ%€i÷v-1+Ç,{ÚÈóÒizçÄø3ÊZ‚a0ì~’hv)?:ŽYâ¡ä³„sø„£&U\‰–»8’Ùÿ^O Ž~fàðÆÆòÍNžf” “èÚå¤BŸ¢žå„©Ü9Ž#OýG×'OŠ€tÃK=vO–c9Ù®Ñé¬m‰€z0Æ/ÇŸ÷˜U‚¶ƒR@¦7²üÊièï¨öù¾q ÝÛ³Iøçœ‘P>:Ê·ÙKÃÔ`…›Zžè—Åéz9]1Î’Q…«àÌ•Ÿ[϶PµÊÿjÀEn—Eñ‹ –ΚÝß÷7r>D@ûä}==·" ¦°TQózyxRÃ)¾XL@Y#.A(§í¨Çò¿÷~áî¿V呱ÿ fÇ?²jh8KÑ–n†«¹­˜øFÃxèùÚ®<_¦üù·ÁЯ„Ùƒñó¹Àöcë êðéùÝw1Ö å~¬ëÝHIS [*ÆÕ“ßH-”:–˜Ï]ÇQqq.îY+È]ÐrÚ"Ù „–JaNëãV‘e‘¬¤¿ß"•¶ÔøHŒƒÏ‘X âãO=#ÏÊ^ο'P÷åžã¯®±ŸÝUx ½=ô›wø'} mëW'”9­-›W™`A2L—Cõv‰ìE ›vzÂ}ãF¾Î‡ÝПkHb2³|8Uû€®>Kè¬Ï6b­yoµn_‘?Èàtãˆ&ôCÖ9K`ŠDökõ˜¼L9>‚¿ÈÑýâkCq§Ÿ=†jòÊHäø®²„êƒØ)á˜¶Ý“ÓØŽÇD(Ú—PІãVË!SOŠÒµhy2Nfx¸ZQáxÃvÅô»n7Ýv ûÑcýv9FÓ5Ðö+Ę ÓkÏá‰a¹Ö|pÿ`#ô™—¤P;‘Êîxn> ’ Y”¼‚ŠjV—è'CµL§öŒPQm¹Öæ«8 Ø…4!ù€ŽYK•Œð(Îw‚!ù» Èg›4(¬ú¢‡*+®=»1¾vX׿½nEJùXvˆ QBR ›41ÆnƒB:ÑêL0° ÈÛŒí°»óË,C,…Ô=Lâã¡fûˆaá+Ñ3¤:Zä÷†—<¯bìÚYSâ\®mÑæ‡«è=ˆÿk|b u>í_7ÌÜÓ ®yˆnòé—“»ûÏÎz ˆBÉ.EêáTÁÃÏ !‚J¾›s2;:Ëê0j;i.dL¼3×è+ðÉ@¡´Wp6B<Ç÷¶'¿œo&~EnDþ{•âˆC>7¾Dl êZtÕgÆÍc:v›HsˆÈ“H艨>¿wb™©$¾u|—ø¿ .»6J¿¨\¥ö!,¯{E›nu¯±4´§~°(ˆ«R~ðcƒ¾·¾ @_,ßßZ/¿²œ›âÞw\5¦G#œym¾P%ÔKÀtŸ ÀqÙÏÌCòœCcn"ã+1h¡àXT­©$ŠŽ ‘j­öïG$4ÂÈl.5ZHÇœŠòLµ†)mQ&RÉ“¼3kHçJMŠ€‡ºÿ"í] $b˜Ö•–&cOÀýÊ^“-äÂu=¿ôƒ$În²ä×F&¦r‘,=§/S] ©@Ñ ji’qW¿‚8`GŒ¢“º`VÌ#•e`PôK‘Þ-L™ÜÙ5J5/âù°ÿ –¡®ÑgÏp#ÀŒ%3³!׽ߨ¤ˆä…5J#(:>£eW+m¶?ñ½ùV´þ£]¶2”ú%ù˜ÕÝà j&Ú3ˆ‰7Æ*Vè(vw‰3Q1¨s b8kœ ªK5r¹­ØåðH.ƒéSmÿÿr®¨­„x›ó5TmΜÖ¾7ïš‚Ü,ê»Ó¼_üsô|®ýjÆäl'жu¬p…{ë˜17ã5íïYåŸm\çûYd¼7nÞë°fón·A¥ðH§ÅOȺÑ4ÿ78È>¡“ص´,ò§y®<Ý!×éÆyj†Õ(2rüB«çX¦’+ÚÇé)ÛDÄX+ÈùT‹=ÇœŽÑ?©Õ¸àK!Q‡¤wmyè5RÁ¾º4ê¡¢Ùˆ¶+ø¨d9^&°=¨:ž¬ƒÄˆ‡³³3ÜK˜Uƒ<1œèéº[ŒøÖZæïȃq½ò–pÏ[¯~â£áv/$O‡T^—¶laÄàãPI-G<òé ù®…{sGÁjÂü z·á,šȰ çˆStÜ ¹WÝõ:ÏÏCÔ¹4ÐkмÊ}ÓS2ÖSÙï~aŒ„JР§(Ãf.–!.Jг¯z|%ôÎP>Øß-•ý)[2ù›ŒÐqÔš™–¡@ôÑEs³ý—¬õi44Æ;olºèç<Ö8¼ ýü-“ÝZÌÜÓxü>{•ü‰Çü¯¹à'\ xnòiË#BuÙ÷‘¼;"Ö^-߀ŠJQ{{GʱzÉ€•ÅÚ‡ÑKL\ˆ³þ¡ "wHµê¼{™R;L€>G²Â…ötÚc(èÛ_Q»Ä ¤¾©ÅëðetÛÑ, åW ÿP%s‡L´¢5:啯;–Ö‹—ûUú.ù­ÉÖúzø¯4mKW@öAEø!ÕD¸âårLH›Ì-;.o¸)“¦6<·œ Y‘”ø.›Æ¥†æ¡ôËv=È–Ò+û3,¿H³õ‘–DMO)ôPæ)øÞDë…Gé3šGZ2• ç ÍÇu-3 ÆnxZY/ÌZó“‹úñ”>”£»B„}é kæ…wJÈUUÀ ôMZ.'Q¼Xfk+]÷xR}õbß[(¿`Ë&DZç±$s?/ÜâmÁCÚnÙÛ@(b‹¦ŽÏØ}ä’Y­‘¼®º6åÓ8¤E*8_a¹ßÊñÌhèñQà ú—§Ég)г•h£ñÐáÁÖPÔÓÒ­’>ñV‚Ó«J¾ÕÔOŠ2CÉÐÓÝ!¦t‹ßáúüÆúÐøçiÞ˺÷" ¦hóˆ…¦ƒrŸè®éËúˆ÷?_ÆhŽx|ãÂê¼Ð£„³<˜k4y!·“’ðs"Ûs=zuñF¦$s»›Ú+]E²¤ÐKããø”ý#¿Vµ€×8V³­S.òœä ñÅLu¹ek뼫=\.Þ#¼{Ìéªß©ôJ|Y’wÏ×|ÉE²¾KÍ‘÷Î8Èî1¼@è\[ß–;PÌêt[åróX™ô”í·¨‡Hd³ª¢AÇ£¯]§dm½°ŒX€œðäò4°—ÅåùFѼp)ò?,ŸÏ*öf6±ìCÊb†šÃ¶È 8€Ô,Ü„ÇÏÙÔ¨‚8E'ÙÆò˜ƒ/›Æ`K%$Yþƒ‹Ì"=–¾›¶@ÉÁ7ªn¤I´É°ë[iÕ…ö–+_êXžG²s\íæ©HÔáQ=Õ­˜‘˜`@¼3[Â÷#'Ígj½ÞŒÂUSäá¡ýË1‹?B2×!L«7öÒ~ãàîuçY¨‡ö7P˜-4ú¢á":eæVb¨¢#}å#ÀYj9ŠÓµs{ªÂÌX·h5?,G%þkv&néd˜ z&(ÉÓÎÏÓãaMœû4«PÔ_ MgïêÄì„[ñv—œr’…@œ˜™úD3Ô‰äÖ•ªŸ¬r Zi9RÃá9žˆÝʪ®¾RYO®ÕP‡É}Ž­æ…›2!”ÄÌȾN¦_ yÒîçÕ’ÇŸ» .Kg¼áÖûfÎ/án‚ßÅMûmEÞÓ¨Ú9Æløš$‚˜µ)Uà»úñº²½cõÙäµH ,y÷8ÜY*ÿ8¹1CY"¹gX9PIá9çŽUZZuÄB0-qE4ËÈïäOn®y1?írÑ4g¸Ù|’Üâ—òذÜʘògõå¡v»ÓÞÜÀG¹Ž‹C<‡cËIâ°…—YÀæŸ0ï6¶•]º‘5+¼M3Ï¿“9frZS÷PYÚ -ü䉔£}¶"´ÊýÇKGOÏ+ƒÅª\÷¼“RJ•ð 7ùî5Šá§©ÔP£@W|VUj—{STikéú§S÷VÃÍÔµâ]#ÿ/Ub #WutnÏ›ãÏB@´81§Å0—€ñ*ŽI' ‡¾ü4JŸÏ6Ö(Ê)¦1ãæåH«_ Ë®Ñè¼"!u½ª¨½}9»'täø%ï ÊäEc¥w›BŽIçÚad(ÎçNã àÔo6%ÔÏÝ ‰»I‚Ørò-E–æ¼ìŽ*ÍÀÞ*kŠØ 1·¥žv­ }Òdm®Íh ,|ÓRÀ%[ü3dò;îœÏ‘yˆÅpgˆ‹&è>Ú+wÌkj¤žTâKðT='ÿN ¢à‡XÌ—ä0£¾›š˜p”$f Z³TÐnZ¼8Të ;²1Ãsï$ÜŠ™tÞSñÎÇÊCuÇ3éx8S0×2TLº?(¥«¬¤Ù–ÃǶÌÒ)—½Æ‰{G9ÃëÈ!ÖC2ÌX°ô‚“8îã.q‘q]?†^MÕ­›jnLy¼81e‰Cø×š˜x]B¿ÎõL5¬³Ñçz‘¹[ urIŠ[Rü&*O‚I“rè¢{ŠËh®ñßÃrcŒ[—n=Õx§ /¡ LÀ8\ þFסþŽ0ଔɤ9ûE ÷z–a.ér<  Z­ÌÇhÿi7°g¼0‘ˆû:ý•~«Icz¶0ËÆà¯qøÃÃúãx^xS¥«©,ЧÅ+… •ª¶‹2 CP&dÛó=^5V=N™Š¬õõàe#¿xTm`Ñú€¨@V6àÙã=+ƶ$»™f$&ÊS'Gºe!"H:¼ÊøÒÈ—B · ;Àr>.ÌREØž¨ÞTYسWþÜþÑ­ Ûy¡'bz¿¿la˜Ð-…³`–xÓnÑÒd24^Û'ò¥®®i«¡èóOS[ÒYwF CÏþÞ]?–Q¼¶ ìN¾¡ÚEýè[»Ú‰3 H¦K©6.èI7RèÕ|æ2ƒÃ¾yL»‹Î42·ÅgZ?ʾ… ×ÿ|Íß[Üþ—s/pjÎùoþè¸#xy5uÓ,Ÿs+Ø ²`”ÎÈmæÍñžùæc6äÅÂô\r=kÑWXëj~°ž¿aSDFÀò,‡Aá7¡9ŽÌª“µ,\ù8RÁ½å:“·ÝYÚÒi`r­„wu ÕT«r§6ƒ‡¾|楋AˆÞkÃÛ¾kIUZ[(®”›Ù'ÌÔÌIâ)º‹ü=E[0y/fEÃiîS¬ÍoY§ôõ¸žEX éë3˜fÑ-i9 SµÁÎu6‹õ.jbJáO$ !GWÅ+±Ú꣜†}ùë59ù"h“Ôf˜ûÒ¶QªÚd¢x¾Éⱟ Ô Ïn…=°ºë#MgI˜Ã;­—(q‹ø¬,Rl”;ƪãXšXh?œ±F¢ðªœWi•Óp9_+ʹ‹° ±3õÒ·=«à½?‰ìÖ[‰ÞZUxwYË¡¹YPCI§¤”Ø”Š˜ÖöaB ÜˆÙÙÝ,“G€÷ÑQF¹;Ù²o_¤hïË­Yðܦf©úm%ì^Rnd‡NÞ¹h ×åÐzÉ$³E¼¥º¼rVŒBæP4›…v<”ưKú§È†ürÂ5uIuÒ"Š-·EYqÓp£7¾S eŒHØ$§r\á ñÞ,±{D ¡U ÿ{9:‹Ä‡ÉTU{dxRIóQ \üî˜4°<6gìèjÆ<ÁÜ 0Ø[ "êнfÊ:§ðç%…ÐêÑ8Ìqö#S·÷ㇿ‚{=²¡¬SÜ„Øk.¬7ïK©†n8ÙÞu©œY6etRhìᕇ&å°Usíæõ‘¿ÇˆhÍ P„ÄdzòŽ ôªIçanÈš¹ÐZÆÅìç (?Y¢n¾IîƒÀšßY•µ][KHj–áHº½^0Ÿ°›?DuÈ’‹8h«y›þ©,ÈM³ãµôÚX4C £Yà`“ú²aRÛKÐÆx;6§Ç˜®Oz*¥¢NdƒèÑÝ«pKøÀVì*©MˆU_µ¹Qÿ§Á+yïwî‘°!y[ˆ‰¶•e;l3ŠƒEH›:ŒG%ÅÈDPÓ„Ë„o³(h+ ókDóEßrO´‹ÞˆØ{ïØÆz¶ü:­õöêaªkÓÿZ[j :̉Â; x§'©V‰¦·&ç4D¾ßân•Jj2sc?þdöÄ ;¦Ø;',‚óôlóXÒ ©",9Œ&.ÒL&‘ÄÝ¥§ü¤´€J òräÍdŒl1­tÁpÿ?êè² –fêÊÕléõ@ØX)õÕ{§§ßÔ·.NpePGà«Sôº*6hl¢æwKnõ§áë/Ãõ™w\îõ7áý¿Ãô“ø}ü~¢ïÃëíÖ³û°>õ¯½‘ïÖ'»'ïLû÷Gûô!ï¿~‹ýö ×3¾›_‡Ó_Ãé/äúU_U÷Ãè‡äû“Úçäöœüžð/‡é¦v”ø\Ù½!Eßkü5ñƒ%µ4Ãæî×]võoŸ¢ÃOãè÷kZë “é\ØÐ¼mkìñv|þªó†ÒËM)0Â0r$”(üå ãò'µf|vrBÛ*e­W [†›T·85n² CˆÅˆŽÒOË9Qǽh²"‡ùSšß‚ÐãK£Py÷y{!úâp£.ÒÒ.-Ï-·v a×Ï/ýòj0„nLšš*ðØé8Ý-êŠ9í&(y å¯:›p°3 `àÀªVWdª(+§|’Ù­ Â÷ȲLÕ~0ô ß±¨ øÖ—*_×1ܾt%¤ûš;úµ&ñt¶‰ø–!Žý”º}Lwžì>–,‚±údåv>š£î —Æ„$ô3Ñ3º±mŠÃ»…°™hÊûÉh²ÂYWa¸>©ÿŽkljë¦imDù9<Ÿ,UÈR+ûmh3zê¯B†èÖµS)ÓdBÛ舕¡ræ´íÇÌ€Pie^S²}ã°€4T”ÃÁ Òzå9–²—¶ž{tK`*ck épxƱM½ÕÂÅÁìCþçÅö‰MŒõ£ÑAGyútÝ$ƒ?BJG$ª»™wô«9Üpu¿•…‚€¢vAèa£Þƒa¼E~OÉ™o²¾ûžÈ ݪm-¢ü\w¦Úk|Û­×^\•¯zzßúänóï-•æ‘r•ϼVjÐdü´[PT ½Pºƒ$´X*Âêõê,à];—›r &³³ä¤S7„rù¶hê´2ñ¨2оÑ2µö ,Ï® [õP²%ÎÂèŽp±BP;µ«É,EÚlËêQÉßWë®&&j‚IáeÓýhk“„•§G9¾Â=‚ò ##¢ÄV& Ô…öv»ˆaÏAv§'!ZS"óä;ÆÉ¥S¿>’D ÿHoÅ‘¿9)ˆ”ªŠÛ»È?#%­Á–lìta cW`ó@ “ ¬v’˜¸$:3ì’I–ôÈ<­ü¢öus‰¶HÀ»»ÜPOÞ*ðúŸMe®™å“ÔŠè‡yÞõo¢¦"žÄÊ ,nïÇ!¾xÍʲqÒðˆqá.p6Cµ›záLñ©´(Ñ7+5|1‚wëüªCwì” ;åjõ,‹å·Ð8ÝwjÀ>á ›ßç ¶£4{CÜE³OÀÜëûr a øì"I¯£OÛ'@Ûűàò±_>)ŽcUÐ1{ë?€Þ.µ‹ºY‹TAó.|“›…ܘ&I>"}Yæqüÿ€Ç§–þˆá45†dûHszÑÝ\#äúÍH) ûÅ TÍ’z·Tr6¡p4¢C ñƒ2mË•³uF Øh+%E’êÆ¹óNK4J ßW±« îm“z98}ÓŒT2ßÐzX^üøIqãQŸv:èN6HZS,rf–tNÙRÈ€NjeóH†’+ zÿVŽ?ž:r†ÁMݺôB¹’CëhüYUì£;J´õxd9W½!âJì0^§ÄTŒ [Tš~˜AþJ0QµÔLfŽË‡ÔÍpït‰œº™š»½cq³Í7“÷ý­<±¼?4‡š‹o‚·’@Ñ„ºº Zˆ3ý&wm½ÁøÝ5m*vv5…qxáP{ßH?¡dþ"¾X“\„_‡O÷Ì»hZµmËåJï ÷‹F™W‹lbÙ”ê×5’À'Öë¨üX8,¹µ›ø”‡©DÉ]lU¯ã÷RÜ‚§gdÕ¹ý‘®ŸÅ8'„ÒPç:ÔøÈ"G“·El¤ ÆÄבÿ1çD긄™±+®ÛY6ŽÄª°a&Ð7‡–óü¿iS7¢ˆZäõû~°¤$Rúô͆ÀyÕ´6è|âÜ"ãPv—ÕMå ¨I©j3MæôÚäíí« Å“kló4çXtq„‹Fslv›Ía±¶»o'LÂõt@k䌱2ßÈÄ>à î&…B«´‡Ù0+á΋ò‘%TÑØ.ôU¬?¸.Zm5ëòW¬>n_suëËjpyŒ½ã†UÛa™±¹f)oÀ¹1XA°¨€<íåœfSØàãzüúB‹;¢¹4ô3Õ¼ä‹üÒÈu|UÇi¥WÛ^ôÐ£í¶£.•²±ÊU…y÷ÛŠ§µÕ /÷¾Ñ‹öÍ¢DLoígËžLUà&鸖HU^,íP^*øÉ^Ê2—^bÝ{ýï´Rît°àæ]ÓΩÙz„€–¶ ¯=Ò C¬^:Ÿ*Ñ}°ÓµŠ@Î6uL|Rw©°íqÏ«„=®µsâž‚?<âS5ä¿©T˜L*ާ×$ ÊŸ…gSÉWa†_®„ݾ‹XøPE[z´v(N¥äÍi`2^©ZÑV ôüv|?œ>ƒIj&•S³%~C5ð#L¬ds\ŸK6A|wKe”<€í¸ÂGd©,™¨°ßºŽ}¥¸›ÕÔ°­„´æ®Þ÷&œ¢ú/Î> ò.Áµ7ú>6•‡›óYý—”U ’_­_Ù{[êUÏ3âUö…E¥î¢¿Ø ô²ä m¿±“=ñŠMe£BÔ!8Ëtžœ·Ìqv@/&#ÈÌ#Å!UQÇó‡ù¬OÓdÌ|YÛo@w¤ßoÖ•x"ô1ƒ Â…ë6[Ì”3érñA8éÿaMÈN)Íÿ0´•‰ÌxÜÛÑTˆT^ô°ÛÀÖ »u’Vžgm·q‰Äxµît׿umP×Ir6•êsæE–ªëH,õg ¼ŠÈ3ÏÇ|{IÔýÕh¶ów Þ8ŒA¦´ð3«l,Ld\ ÷n`³ÀGœ_þı<,ËØ’FºÈ¦ŒIK»!ØÑJ<ü…oä…S'ú¯ÏÓŠ½ìôмfÀ>™æþ£5ÓŸAé¢ÿ}ä_€C‚ÔBr?ØÁR¬Ü£ÖªMÜv1–‘°k„Km®` N°S% B)é€È¶ò\902Õbv‰¶¹:PØX7Óî’œŽ•·ø Ý6ès?Ÿ‰]É·ñ‚}NÌ^@F»ñGÊféŽÏ¢Ð;UÄØ_¯Î¿—Z¨u}úm`”ÁT1¾,šTúÛŸ]b·F*7“„"y¨.:7ö?1FÌץݻå3pÕ6çòÍC‹C?§ž8áñw7Xxèë˜ÍQ›õ6Aµ0ÒCHa°2ærf»M†úwW¹Ë2ª ßÌ/À2P˜\7Âê0[‰_Ã^Æ`¡¯ÔRGñ"t…ÈicÏ¿¸ñaeü·YQŸ»iï'E-²Ø }E¡_,ŸèÆ1õ°®ÄKdI˜‚Ä/V[&Ä¥º;ó!OÜu¶T¶5>O·t×Y ðCs†·ŠÀÈç²S’@I ¿½h;{ÎÍ8òrt¥¥ž^À}•2ÍÑPÐöyRﬕ^v­Ê¿@QÅc†v’qݘNyT°ÄÆÒRF_}ÅII*©91}ô`òØá|Ü[æ$¶ß×2åнì_M—Gjù<2Ùéù*2þÿ‚k$žÉw_J±ÀñLÁQFØŽ´’qº©ÚR'o¯zúÖįzF,rþ,ÛûÌÑ4*C#EŠb»õÐ['ûÖÕ±.Ê/ Ö‡0)ŒƒØ=ƒ»\üQðŽ°°¡°»—ŸÔ¨[Äݧí| èi,œ¼69nSÁÂK?ŠD Í)%yE ‡-ø‰P òÅc|qSD.E6â…"~g-6©Ei¤à®R†Î_/ þè}—®¨ñ$.¯G§ÊÝ„HÈLÜ{Æô¬}p`Ùò±ð:×Ï?[­Ó²Dz~rTÍÿ{œòžÇ •ãŮ䞟n ά´ûO£µ½þíOý¹5†Ä+ñHü“Ò ÒíqüÖqKR@¸iΣçaiÃQ|Þ»13³ü-gXë‚?½œõöà}È|/Un8˜FòuµƒR~É^»“¢G)G/^}~ÀŸªàâxXÚòQ§•uý ?áîŸOßYbUe*Ýæ6£²œL #E µã_Ï€ NqÊý›@³õ­®ƒò´;8JUC<9vDˆ®G~û˜ólº|Çùv»"zN.¦ù:7îsºVÚ8Í"þšƒo(y!2C)Ë^Êóª ] ØTžŠeˆmd¹;‚ðã²3p²*œú)9 ä·ÍÔOö/ñDEo@GNG;²Âøbd\5 gZxP; ¬*¯$ưÉäçµ0£ŒÅ|o±ýÖ£ÀHÀ£ Æ›Eöa\?²‘7kxèˆmg5½X|/¶é¥ù ÷·âb¶¶—¹9'ït·|@Kü]Þ;¦^úo Ä¶f2/B™T»wŽŽCcÑê.i¤Fp®Á±ÉÜÐðLM•=ÄŸëîi©šÆolšÍ6ïlƒìSÒ >fDq4þ^Ø.áNQ‚ø²„º­ù¸ôèb¥E]mçI£è¤},%DŽ#ǸYép‰}?‚ùjnËPa‡^CÊp ÄÕNœäËØyâr#Ù'±§êŸE»¯ð98éÿ-v.M…M­Ä®9JÑ*šèêNÙðSä€fH邊G¨4M—ÓÀá^çÛÌ4$Ùþ–X„[ctêÒL·ë{ ‡ÁrE ¥êaÆC`/CºzUãZDÅ}U*ÊÓ«Í|Çn¢…òKI<"ÌO"AÞ–?Ýò‚Mæ\\ð«Dâ·B0±êD9b]£Ö’_ü¬ój]7¦UyBeï MšÁ”ÂåV¥oœ8.xù3Zp57!Ž'س®² séb4¡ÍM¦Â· ¥GÈØ%!EÅ sõÖ²z;”Äv*+BVª‹d±BÇDÀ`¬ ô-†É½A&~h–B͹ãä¢nº}¥.m/㪤pZ©³|þ'ôVWψ‚Iº”ÁÿQ¤ Ø¿­&Td)‰Á iªÉÚà­ÕœiqÓÝÆÂ>¢ÛB;•lìùÁi.ÇúbFc¨ÏEv™fç$ã8|‹¹{oL©{ù3''ç4â1^´®‘ÊGêX¸x#Dýdѧ£äB®‹â6 ½ÝìH(¦ÚAèñ…É69¯ÝK•þSÅ)Ï€ø¡á42UçRš ¡qôÏzîB‡Ç»’¯QŽ%+÷¢Á y)0ŒôÞ–Á¼C„\+nÉ« Ž[*)òr¹9-bz™]ïOVH²‹æËMLN"Æ¢¥×kà…pÅ5U ËeÍr:qaØn ÙóïhW¾HZkQ¿Ú¸ ÝÆhs%¢L4O½1Ü §PÐe¡SMU£w\fkìP¹ï)ürvš´Ý×p¬M )lC†Nû}–rµ'QEz%7Š0™­eû1û¡Êü{œâöX¯ÍN‡Šâm<Ð.HóO‚Ì:ÖKòãz?8•r[Ä4;ø•+û‘BZ?g£FõFóÅïúH|I§¯ÆyFÆ_%Ý5È/!BÊÂr¹3š„]ùíŽcV¨!úúD,N/=¦Yòÿ ™¨f&› @‰gÀ´ï²ûÏŸoF U%¯EQÿDººbyÌ4Õ3`¢ðo¥l@Oõ-”¥C˜¢Ç÷¢~øQÿX™âhKè]ÜPíÔ‰-5 †XY&>oWŸo¼cõ®^VßE/xžšm˜Õ÷Ùíß#d:¼§%áŠî8˜ÚßX~ i> T€„ÿ}Ç3}sÿJÊŠgÜÈÙ‚åÂxNK”wî¿•¶ŽöîQôÿ„0(àßä6{Ã’ºd±bh6§4‹OöaõÝ?-Pí\9PJ8«FiŠ'«-‡ÄØÞd®7±CÍ\u bÝÌþ.#V®ª¢ðQ &I}Y¦j†ör;±žäÿY¯ñþ ŽzÛ":‰*t5òs¯?`!ÜŒÀöd ©k¼V1–9¯4òßò„Q«ßÈ=€Ä@©Ú¿›lÏwYÜCJ8Á–õûs‰‘ó+¬R­î¢ã'VóôÌÀ…’+0+XJÓŽ™èIàû £ÚövîÓ>¡Ì¸x ’ÃlŒ-[Ÿg]vràÉ`7®¿À—€qRÂãrÖ{%Œ¤µF Ø0e <±,,€‘>¬í~µ§ä?åÖ üÄ7§”ÙÅ3×ü¾Ä±€0„´~;ß.(³âp'AI>—ÂÂV[ 'Ñ/QßkTA…iÕ ðÕGÌVúí6[ê‹ö–Sò§ü1º™½–G8|Ùé燛œ'¤S.ÙKÍ’5I:âiç~êÕ ÓIMnÿéžlD¶V]£¡p™DÄót×`{SL‹¨¼ð¿&ª y»Q‡d»nb¬†êÓºíûI”‘ñL„êiíéÖ´8¸¬3AxåXþ_M¯¾ºØA;‡q2~Ê6€‘äj=çËÁà}ÝM4‡«ý/¿Ú”¹mtx® i†RæðÇæÙ²`-tr]›fÞò~zøG7DÉÿ:ñ0¥bÔÝW'ì`Ý0× úãpì´gOˆ®XF „ .ànÆ%³nÂM¤pƒ(L,PÔï Ø}4ñêM„_$Ã”ŠƒG¨a=Ú–³Hö‘B ò?9öÓ;o˰ ;ñž"ò˜}¾8®†«ó*²Þ¥fÚi¤J}Š‚ÛÂkǤ¿cìUìõ‰# ™JÎsŒTø^ëA×AYÏZI ˆ&ò1ŽÔŠºv«qÏ2@Ös;Ô_ˆ‘ D0‘ú²$ÁÐÝÕ©´|V‡J¢ª‡Ní€M©H4/ËëÍ–”sà "ú›0Ì×öÈiQ‰ÄDY9!ÉL24Dj ½ˆßÔÒ°i4EK×|ýOÂbTÿ>-¨‹M‚S¢Õȉæ £ÕV-;G½É>-Uö6Jè æƒ½'ÐqÉÒæ1+¦e=Æ&.ì Ó¯I³ºb³ueß *RvB>K¶91`ë!×LSŽ%eÍaû1&§jaÚô¦°ï "¢Á» ¨$PˆÈšE#Íäó¹©Aσ}–â2C€ºµ%Ì4¦Z_‘6Ú¥àîØ?û{ÂGZn¿@±q©:ÙÓ8"БwmHR±“wל<§ÆëªúXÔc=B6U©¹$SÚ“ñX¹¶ˆ*Ë]„¥WÇÉub˜ßѸ78‹ú°ä‰¸d6C/N[™¸˜?€ÎQwÙìèsúç5²Ãð=ÝÉŒûýYÌÚăQ3¨BRÄîZm–e…‹Ë’•«'¥:0{öžX‚;‘³r2c1¬¨<=ø¸Ð Eלß9⌠=e›þO ÂáѾAàÊ‚ˆAÎÿM¯-Ζn4‡Q.§³ØªbÀ/¡µå.°ÉpæFFãg«7ÖZËÐŽÛ‡f0f°ñ0AžÍ¬[5+~Y–…œº‚¬:]ê5G®hL+áñ]Y$5Y{ÊÐ^ÕUÕ0õHHÛzV¢—GæG>:’Fòº²˜¿]dN—á«É 6ô!ÉSXj÷äþ¨~i³l"u‘P9³ ®ï·ì¹©;¹—Åq"ážIn’Øh\è6à Ã28â,º¤ÉvKN{ÿwßçÆÌ´Öðó/A¬í‰,åûñ£Ï-Â%Ysω¹ ªAÚ °?8‚´ t¥Û’pѼ;€î!   (*c â$¥ z^†´§68Z•ß±ú2‹®<1Þ£>§µ|:¬@HAþW¯fJ˜²VQì_J°)q»%R ¸BVeu½JøÙ“FLR_UºÓéìºv¾G8½éÏQóGÚXÉQ@ÁÆŽž, o×)”ƒÜ¶³ç_0xútŽV|¶Ð‰o~3JÙ×bE3ËUš¸Xµ"ꈨǔ ãkn6“xÑÞVÚ¦üºà&ïÃ=«æ U)ø{8PMA:ŸIã7lfÔv$]‡xØõ3ÈØ0I»|ê|1Í̈æ„ÓáŽÛêž`À>á|äüW´„R±¨›Æ}§(LÁÎ==’û8DÐT‹±/9Dä›<©q²>§¼8Í^q>ÅÕŒ¨ž Ø[°÷¡ÈU= D ]ÂåïkÞ_Uµ¸ô2½c6&~ËXu ÞÉÛ‹PndçŸ?¨‚Z«0ý9Q¯æû$. kWÎÖp)dNľ;= !íy!š:tÃU<¸¢ØF¡ÑuEåGÕ2$XH?(·wãiû.‡*õHÂÓÖÑÕ<1O%ŽÍ?½C¡«²¹>V· üEšÔh;œÓ*8Æì«vè%¯Ã{¤¬lnk¨Â˜«k§*Ã=e—ho£ÅP³‰ë Ø'J5Œm$Jè—€­ÖÙy¬"Ç Z¢;£…/_­¸F7Ýne¢1³Û<×3H$"B ¦lwÎ÷—0ªî鍸Ê%u®ù*ñ÷‡kРh3Œé¥õư`ÚÉÛ­>uuxÖ:’´+#‡q)£#–•×TF:¡kSÀÓezän4­#\õÿJæ1'¼wA¬ArŒ?°@°¢XNÓ6õxŸ™›pr(ô=·# yƒÓ,Ö§Y¬÷Þ3¶MɦYwÞÆ…ö°ÃÕ›å@ɹZçG‚1HH‰v ð1ˇy¸Z<²èOYHˆœQƒzká–IÖàVǵVHÈ› ý‡ƒ=}b|ãlr+_Øv‚üN^ý´Y2-ÿ}™ÔÅyØ‘C Ö.vŸ8¿jØ{ØY0iPÏâÍ¢ äÕ ã—ñÑ·‹RBìîaV"`Ø6ÉŠdßÖ×$ÝðqC·Ìêùw·™’f é€ä]輄ìyÉ<©Á¤fž}¦¡œL97œ‚\ pÊcD,g·˜ÃÜÕß 1#]$–©r…¹¿ÓŠM‡G¾šÎm³›4‘|“x7ÕO-K'Y0¬©’F/cjÉûzÕ¼áúW|ÆV¬ÿ|í¬¨^«â"i©ê¡YÙ¸ ¨4}qeÞ}W¹8ã I½~dbIš:jÏTTèR”€ˆ¸S'(aãÍÞ^yœ;»S,…ejC¬ Œ^8ª¿ ²±AUb.™¿}ŽW_¯µ^ µ…‚ òŸjƵÖ~/«#È5uåÑ)W«±wH=¡$_ênFè[çJL炽ìréÊ7wHl£†ÍµÉåïY*oßÏtŽk‚V®ˆ0^£É –*–…”‚¬qö|íËÔ¿?Útÿ ¦À¦&|¤5…qª»žé]MTHá!J çbôà§úí;ì#½§p!öÕÿ$HŸ;Ô©gÒOo¬«îɼ=ˆ´¼<“JqÊtÖ®ú§ÝÖ:_º€Äœ-‘ 1Ät‹ÐÉ2~e/VYk¿¤áU`á#*F«´'|åó’ÊÚDZd¼cŒ§¹’~c`}-%Ø÷ÁO­—ñ }“½˜^cËÿ_õû*ä épÐÝ¥mÌÅÏ 1~ÆýÑkô „&6HŽ¡zÌÉý$ƒ¹4¨ìÐ`ºiíYÀ‰“µVoDâÑ9±yŽ„ tÉœE<ó!T¼B±õVðóÃú°[ÄwwŒe[M2_”`P€ Å#ÐX¥¼ÍEË9À%2Lš9–Ñxšë(­OÙqœ×WBA}ª”ÿê²¶‡÷Ž%€Yj%gáJ“6ƒBýØ@8æ\êÂV@¬ûä|qAúóŽälS-ƒ1Ýñ™gŒôw±L}#ÐÐË:š-Gîñçæ+Ì 5_·§_`’°5ðÞu+¼+'Èë ég”ä)xÐgëö½å|ä˜U2êúÆ£35ßùCÈÎ×üèW¼Ü0°à¶GSõr§5JisÓÄoñm™VªÀ÷EcIQ ÈôòÉŠ†ßm®µ¢dA & Ö‚R§ÇVþ~èCÀõ+·}„£ÙF8VÍïPÿSÜ™!<[„åTèü5‹of÷”¢ÊpÔ’·¢ù*îÜò©nc~°¹;XŒÉ!ªˆ1§S…uW Ÿ:p+,íµVF{†:¬r­˜dò;ÓTk{ûd|á²dÇ éÀôEoª´h¯[9Â|βsa/êgÒ%‘^Jö/ ƒ‡ š*vÎ{9%LL´+›¸w¹Á½ÁŸcvIÃì°ïó?«í¨T•XÑ/2m?A¿“^Þ°ébi›gï>) ó­E¤@”I¹Ç„6±SAÕ×ãLØt>ƒ9]jqâ÷š¤ÐÛ*`'Ìþ³ìÚÅjÿñE†W"ÓñȨ}=Œž>!m¨jo{-Ø"?À,j…àE†ëÁg˜"`³Z£Út6ì¾ú»8õ§,±Ah37-$½º\dùmØÚ¸‰+%®¬ƒ†òw¬±cH]eo§õÎQfÄþ(¸:¡“{˪1HÛ ÑZÿ/ÂÊJnjC §Nyý‰ý¿Úú«Né̸€îð;eç Ãm*bË)³~fûЉ*ÜÐöݘfé»ù£—ŒrƒúßÇFvòò>ÐB}‹Œ´æ¢ÜÍœž/Ó.vñ}’¨TÉB^)œ–°|3Ó ÝÒçxò~ÿ;À%ÿNçülÑÁ¤9i"Þß«,(/¹þ«RZÿ<Ò@‡rÔgñ!Ò5ØÂOðHè $¿ÂZ‘¬Qͳßsø ¯U¡ô“GØÆÀnÄ©ßÚäH`c'ú|Zî8?É Æø›£«e@ÎzÿER¹æÜLƒ¢ë¨v*ÔÄ#4bc`ﲜM‡ýå"’ÖÁWzœÚ­bñ`Çac)ú†ßnïæ­õޙɜ"åó¹äIY/ÄÁWÿQ꿈vÊ¡’õ¡7àÿKâvÛüb¦”yGBë^>VâîAÇß‚_–áÖh5p8õU@˜ 6М]®†jæ÷¹ Äõ; ¿¾W€>Ï÷¡’üC™"ÔCÒWA4 nÖ5î,Â)¢‚DÍ–À®j¤Pó8Ë3à2Õ¹RJ»NÚ4¾—ºß¿y©º±²ïYxó9å­]¾ÿ9À€ÐÃŒ)¡wv1L÷öxt¥ÈAûýž^¥Îø_eû+ §›REkr-ˈ–“g¿?³ƒ]}t4ÖdóÚš=%|•cºte0Q»•0íT ¬âEª/Àê„ëãNÁN™TDý|Ir8 •0Vâ¢T9¿,Œ&‚Ê„0æí|>/”(ž¶Ði`˜´ˆ¢œuJ.Íq Ñâ–ÌMÀ>Ãò™‡´¢O Ƽæ|åh÷¦4ñÖÿmåËù\~ÌZá*½1[ኡԘìBª´€› œÑõèM6ž^Œ¼Õ~?w‰BöÿXŒGýy?Ê»âæ€Lh÷£ÌñhkÀ;Ê'›}Ø›@(ú…Ò›‰èaytÝ+fu-=¨pé!žå–¼NX¿Æå×vâÑ[²!U8ňû‘píú NƒÁи["¿lG³¦ÿwòù1y…œ*FP ?Ðó—7|LKãÍXãáÙsØqm¤Á2㊠=_àè}qÈe†Ù 4óÁ9ä„åŒ,öcÍÌ·o♯‡r/pcBà¿TK³»W*+긲•ï}ÐV –ú ä²MYâðI¥3õüC(„Ú _sþëËu¿ƒN=÷¬ßÉ2/Õܶ·Nh€•°ŽEqçëWѳSä°*ÌÝ_ sNª£pšTЊ۹¼ªáUô»|6¨>ÿ(ÅϤîÕäÖ°J¡š¯÷*K33åë?%üŒœ›Å“­â˜«áO!…µßAO‘$z¶#NÝT¨ëωVú1èÿ@v§Lz'kþËÝë/zTëÔŠãsé ÝÏ`Î`ܾ7-r#õ;8ÕýN6eR“˜‘@ÞŸh"ôIýÛ¸¢“‘z§UÖÞËìã %å£å»s*ŸÇðÈÓgJËÇx;Yh›KÝ÷lø©ú‰ÆâOEÂGÏ=ŸÜEâÊSL4ø¼™^ÌvVY%I¶<o{1Ú {.Å/ ÔT%BQ–§ÿpànKE2´’uµ+èU‚D ŒnIf±PqÀÉL¤¢:ÌqBæÄöSKá>oI–3¯ù .ÀEÅ •¶'ëî l1vèõ©?SÍÁë¶ Yu¬-qìmÑòÂ8;œÕ'|Çq’Zä=²"Œ rtd7¯ý+¿Oq'ÜþƒØÇÍý–P&É_ƒçœÔø’½ËÈ8Å»ômã[„Õ»[F›ùr+¾¦ÓÚƒ³çAwI¹8‰œ¸“t”ßûQ[ûãhv9ˆžÒÿÁ¹&!Ø+]/?_Ði˜àí”…ê—Ñ!³NßLt®+N2$c}æ³¶bœ\üFzó¨iFf$uÃ=–#0Œƒùb—óu¬*ŸÕðBÌbF®ùÜ/=mošCJJ”`S) Ÿž=a_!1–Ïád,«…];,ýÏoSšn-"öô F¤ÿmþŽ>d¥Æ£¼½Û¥ÆæëÇ·<ÍÿÔf%½ìÍþÅì–P®¸ñÜþ_“Zb¡«ée|ÅÊžš$Îljà€Ù¥^0F>B’)ßÑÇŒ6éî,…â‰ÓkD L ÷Ô Ì€»üD‡(!¡)‚±XPh§V%? J„Zx:ã0,Ž,Ùë®òמl£ÔžÃý èw,|L;‘R‰oPRÚöJÀ䋺«•ø·¿NÄ+l9…NÛ0aßæœß*ÏŒ@4^ GÊBä”—*^R! ²}ˆ/ ‰ˆ p¢Duo¢ú6S‰çxóLX¶íí¾sæ~<–œÎ§äVa|pF‡ƒ>¶Îþ¸uEj1A¯¯`Í _#=*¡ÿ| ›G˜‡Éà9j!#–!W7VsR¦ê,p‘é¢ iŠ3¡»˜>R²ßv¶f½7 â Þ6ì"žSX÷m•^Ð>A#¡Cä>k™Û(ë–6®ó«›&%?^j¡ÆmãG îOK"fE6ïÂ@+À£LRK·äF}Ñ©±":m%^Y g}5¹D𖸸_a7K•:÷e‚ÀíºV†éÙÒ*ö]2°iV^Q€óÁ¥§¿Ÿ@f®\áù€$?©éRˆtFµ¦n®6‘RÐÒD©º˜jëOÌbašÚjWË›¤†dùL«ë› 8žÎ)L–`z}°Ý/d&Hø‹&ä*÷íÿxÊάú+Òt¦þnÚ2púÖGÈR²¢ògÓ9G¡O}¹Ýõ¬ÛˆHú«‰+/6üçÚDlþ&½&­[¬u-—aÞ¦ä(gÐéi7Ò‰± &"ûÝÐ}*ÊrÖÄʉ‚ÜÀ¿%Š1Èö`ÅÇ"¶—ÈòB3ts‰Ñ&«eÔGeï"ŸÒòŽpŒlÃ;+e½AGc…cf"ï$C»`)p“i€ÒSn¡ºÍMzÊœ‹íº z.ý4°y{tú?¦yBUHÁ¾þÁ;€o©‡9õiUcWÑ„ê° ­‚"gi$CD5s«9œ:=„È×AѵÌìE,úã±q Îáé•ãsF¸qYQÀŸô¿Q¸¡11žÒòO@‹gÍ ]³úØN7}ü–šÕÅ )Wàìe^ŸQÃ.1üîB§Ä̱ś<4áŵ֬»“s>],’›Fò3R§Ošm[ q#;˜±ÇuÙùÍ+ö÷uÿf¥“ów3¬Ȩ^HIÖDTš¡ZÈü/åØ_ýab7/ðzóùZ(wz'BÐU¬¡jÕö B¢#OîÆÇcp¥J¼ZœÒOAørÀ5Gé 3%ðH*êékXð bŽ|Ã%ˆ &ˆíˆÑù+á ;½”rGÉ4Y}ÃýIùawÇE¬\™éò¼©Âú‹Øsüxx‰«÷–†7¾Oª ®W‡:P˜!µTg<ûy÷ÈD?*T<2ÄØN×tf” “RÏ{#þá‰5ûa™Üc„™­ìf­6¥ØÍ ãäFO 5"ÁÖ5?]¦¹Éh¨è@¹Qä³·LCs¼kq,)Z…F.@Œsf¸ü¬¶€™lM5½DnUòI›Å>·ë€–œ”ËìFK™{r¿(4°©ôf²uâ蹩ïŸóý„í³ÉI(YÚj»g‹M=i9¢YLsfÊï¡€íUrž²q7ø×f'¨šëIºTã§ê饴ü[¦yYd“&W›KCrµ³Û¨ñ¼H }<ÆÔ”ÆB”,ž(áuòœêN!Ê´4¾I›ÿj#"l0À Ù[âºÆyxô·}0±¬JqW–{pζÖéÅ>º'Q’ÌÑ×kÖ˜÷~¸çMÊe˜\pð]‹C| mݱ.6‰üe¸M—ßAFqƒŸÔ¾(Žœ(Š‘Ò8V×mƒâ—&¶&®ñÇ'/Çô:*íWÙtH¯r|L¼Rå%…i×ðÁ@œñœ€p˜@c¥–ôé4Rý:ô?º\ÙóhSìé¯ Ã(ÓƒYsîH W—8Î7< K*94DcîLœÏFݦ9S¬àre|N°¾Ù#¤ù"¡€J]Ƈ~r“~‹Sa–ƒßòÅÝ-y¬ó!˜ÁjÐ VS5ÿnL'7´¬C!y"sUÃmíA…°‘i•+­Ä®Äð‚³5ô6<⺹N`-ˆìAiž¯%.¼«ø(V?s³[Ò4†D@•NTƒø Þ·RpOÙ㈉$à:«‡ñþS§QßÁ—L‘ÇpØ‹®*)×(hÜv_—¹³¬¯TÍu*”—*½­gÆŽ»iµ=‹ai%Ñ¡LÐÚ+áŠ\)>$T.ë$7ˆy„Ý0u@$¹b­TG‡Ix&B[÷šU¤ †çÁ‹—I’ÙRÁ‹`µýÖÄ!öeÖ`lG¹ò›æ>18 ºp._@'X‡Öd3¨ç³Î/JÅ|N³„mnBpâeÑTËêÑ'–¨Ù¼gŒlÙáŒÒïFL> nŽ´ JPx«^…Œó(ÁWØ@²jB3³4ø‰‰ËbæÔ¥ôò¤ëþdA`4ŒÕ)²/H:†úÆ7j|9`.MI­MÛz"øí“‚lê[:»˜ K?$ê¯×A*-Ò.øzA$¥áÆþõ?Ü"üÇÄÍ”#Bø—/îªz1\X;Î .»z€îks.Ä9 JR}U&º—"›èaˆi¼´ÄÎc„ 2kk;Ðý©OáØZ"ü—‡qÍN~¤ts·Y;¿¾s„Ìèëžw|GÎOýê bñ.âžmµ»yôÇæûÀö)b«åáCªùÃú(»ÎôÅ?ð¥åR÷Bêë÷½ƒá¥ªÃÆÂ’,ªË.æëÖ‘"+†‹ :pîfΙ6‡Õ-‡}ã«n™ŽJ­“gú2@ý¹VPœ&„:¸'»¸é…ÖV™>o P¿+r½ßkþ¬*§èÎŽô*&¸,²äI(£—\NÅxü;²øøw|?}þлÃõ«ø~“.‰ø~£³Wi8ßWEÿ[Ú¦ý^£‹êèöúº‡í èL.öáýpü?V?‡éR过ê{ðûÛv£…ú·õvþßQÇêéßõtG'ÓZeâø}FüŸaL~O|ÃöýþO}7Ãõ-|5Àé˸úkK„Lµ¶‰ç‘(ù•å¨1üm:­ã9®r&n™¶5§ÝœÝÞ»½­T`lؤQ…´ó H‚^Ž9×œŠ–߈uÒ>ò:–”õÀBEU š5V¿êçàLÀj®èZBÆ=wÖWª¸GgC•8 aéÙØZ°^èm抻‚NÈ'ÝZY(’̹°\Ã9ƒ‹÷4òîàt©„,fàž·WÍÜs… rìÇm®}©Ð‡¬#Ú™•3Cá¸.„]öëv€[vÁjäV¢ÖAí!~ýÕtúCP»`»Vå°e0G½÷»ùÅm[Ùee&( ½hÖÐê’@1¥2kðj üOuõm\ÕÅÀõ\³=ëÅ4¾+õóõ3è°è%κ³YÜ©k;$Vúñ²÷¡eÓ± ´½b_OÊDæ´Çör®nÝH.ì‡?:8ƒöœ‰VNmŸÛ X¨2^6g¥%1¼§ÃeàþŽ$§ |s1Œü”h÷;£û“gœö•|½Ê7^RðÏ{Utšäm8²ök%ä­ÇwO:ÆjFÓZ%Úú¿Ùé g¤ü¯dh-ÝÛd`Ù5"ÿAG?K˜¼LIFuQTŹѰ?D4t_[s{S©Fµ ÔÌ-Ë+šXÿ øË'â8ÄFs¯ã 'b@5u½Ê.4;¹Á§M’ÖŠ|V}A$[ÔD~vyLóP BÔw8v;.;꿟­þ÷Ñp2ñãµØ—£A|œk–"d“ ã´­8k¥°´|´gë iEá šÏ¿$ Á°íízH ¨VŸÐ’s?`—9¯(|Õ¹ 2Ÿä<Å+:„¥–&¿­IF– I3ó|ÏêÒD{=3´N¥ëmŽø¼ÉVº*è£;IÄ­l¡eÕ ­BãÐL’ôƺ‡Ñ’e€¡º>ôró’‚QÓCþ¦Þ²¬ÿ2=h¼±¡…àwÁhÇñäáÅÃú'ûéÔg‡ñ=F¢“bîw0']l¹^“­%PšåÉ‹K—|ÆÏÐÏ,¹ü>}ŹÑ>*¬? Qñ Ýð‘Mñ¾›lÌ„uQ÷F³~ ƒ÷|Ïq.òW6‰\Ûô£ð<¯{õ ùT¤:èÊ}€…B*¿(ÊcŠòô4 àæD€¯p oÞæÖÿ€b\#kxØÇ|g´öm ×›ªÛáíǹõ{y{UçD±L#‘ÅnTLb²c²à®çšáTPu$/Éšå?*e2£¹ÚŠORÁSC9Y=9=RN€úÄÛÈ»8öWÆŠÆ’ŽÝÖ¼‘mŠ$+˜ÇWý>ÓYtš˜-:Ó€Ù–#Dü§¬œç%äó’ û0Q?uIÁ&×TÃñcàÓGqñ5‚Ý Ñ€ö¹€®c˜PÏ} ¨õá3[ì}…dXz€ßäüd%¨•@ºdL¼Pø-çGEç+‹þ°n‚/o˜ú_+ '7Õpàfý½S¥—÷X4ó«ä6aµ1"^I¥Œ†Ø|ÔÆókd¢Ù¿ýºÂÿY{`0Îoìåÿ©0>ø~t G©åT$+£çß`Zæî1ã{0“ d·#-N ÉáîWÖnß®$<ûmÞµÙú­ÿ'oÙi”åÚø¿beÀw˜’?­0+éAfp´¾¥²7X²Hˆ´”D7ž}=‰Y‘guÍÄvÀ‡X#€²GÉãåçwP„}¤4áOC6¨Tg™Ì»E›ÐÊžãMä™ÂKáœ/Ò:Ûõb%K‡ÖúfP—Ìt@Py“åÌ·±ÕP›Å¤ /É'z°ôºÄ¡4ë/ÂÄd||¹/Ûœ“(v]P2HðH\#þ3¬N3Eo®Íýãô-€á8!í ;1£j°"96¢ŠÙ½‡ûB,à5ÖÙM/õ,Ñüý` r¼u°8ÂX—Æ1~6.ƒ YF”¬(3cNËó5=òs>ª%É`ÿLzOqtZqo¯Sm :äXCÎ2*¼9 Eã qôE[Ÿõ]"ܧZH\í©H¸fŠDì8B{n»8 Ft¥=l*¤|þŒ\âÜ êóØ¥â¹Ù¦A{ÔcælÓû›_ kýƒñïz¦\MM^A‡UÇØµ´B?.¥ß½õ‰B\¥ç×<Õb2e/à¤bQnÎÒ‡ º‚Èé8?øãÝ›½ Äý½„5d¬6“$|u%_ó4ì6%6˜tYÑ{XV∧Ä>»qu™'„Ñ‹—wNeGa¨ÛÀ½·±)–K š¾k¸A&ôêœ}õ,´\SÇaÙÄ5uÁ¡t±;ˆ!ÿ™D ËMçÏ»5Ø þ±›Á%Þ2V Y: à=Œ]ã˜_Ú뎒5ðÞ}F0?¤×d_Tq“øsSÍ«à †Š‘Ìñn©ó'êq—j#“ú§Ø ¿®ˆ™ÐwìQu¸U¸¿/šIIzÐÔõ„° ¸©é¨g,êV`¢¿ûèÄAÙh¡c0˜U¸¬½†Ea3þ™”§òŸ€o6ÿ;}nïðˆH2:—½‚|–i“྅þ†I‹ÿ@ìV˜­è£ÈXòÌÜ3꣭â⇖ÎJ  ìSäq]óì—i&"p÷„Ýj°0ÌÀ~ªv¾j/.nÈ/D~y_™©~Œè¦(FĪæ$èFMEºPî5P–sùTø"¸½ì:ï}£•6Ûx,2½ý:É6¡Ì $ÉÛ;B´—Tô¬ð±yJ—RÕ¾uz,sKgé/…€oûçkMÑ÷Œ£ÿFôëÖRDŒ8e°Ö8f+»¸G‚B" ©*èþºu„vªƒ2þmÕ¯±ÃfÉZÌ,K城%\òÓé|Æ,÷ÉûÂôÆŽ”8Pè‡sí|û‚†˜1Å$Õs戕6ïaÿXÕ!î ;–‚–/‚´:ÞŽ²Üš5êÂ꘳áU[&X’zµ·@!ÊPç¿&·2‹Çÿ#üÊ^=€ÇW‘]r™Jè•>³Š¿0ˆãùbò>Ô¥3îÄõxUÙä`à£ðï CMjÅ^’£ÔLILôaàû|JÏÓÖsèÓùyóÀ6\dѼ;~Ø&}öðÏÏNV3 LÿQò*¾©¹˜Ýúßž­§âPh×ÏÛtcH;_µÒ†à‚›æ­(E؆£J‚Á2‰+ûu ì²zûlÂZ'ÌVØœãí™­d¸ATêèp{6ÃóœÊùR'‹"áLs«àý0·Ô(\Ð ŠýÊjƒf.âHZJ+OWñxLò³dátÐþCBáêµhÀšк9›jó ˆwj,#˜ ¯°¿«TpV¦pg°ÇÍDÿãŽÊ㯃ps1îf‡€–w•Öv‰ 32:v±úˆ=ˆ²óœdŒ)U”­Pxн{Ãw€R¹¢Ö¸\(bJ)кã‡üÅÔ‘a×4sŽL´.‡FˆZ•¢ö ,»}?Ð솚à»õõe~¸qÊäv0!VSì);¤N¥dÞöo¨ÆÔ1Â.³Wý(u(€zmþ5Šv!ÞÊ2QÈœ«9ä¶µ¶Tχ÷¬ÝAÌþÿ;›½G…f¶§ÊÂdzLÅ£×¾3…¹cm?¦UŽÌ8Úf䨒á,ß)GŒ¬ZrrCÅd¡¨¨•Ç£Yð‰ Ì{%a N{Ë&§Uª¹ÝºèJuLS S~î^ð–DZV‹6…VÓëZŠ€¢ÂZMâ‚ø±ëex5@‡³Ý¬…ùEtNòæ?h2˜¯ü`šTœ“\ÎJ—Õ(Rà陇­1§+$ÎûTôàçˆØë^»?o+Š%=iªcÔÎÖW……Cßž¨XSã—!1Çjž Œÿ31›$³ h}»þ(C„4óŒwúy¥—ÜC¿mð]úp {åŸ*SaÊßDeL?Á kEº¶ô²Ðhe-]}•':d?§æ00ô[ÌÉL+âP›ý¯¾m=ÓÞÓÖXß{NûqÇñ\õGˆ èm€–Qè¢úí—¸cÏçDK•Äý‡n[#Cè(Ù"öÛ…ÓÏÀº›…µn˜É`ß!e¼×¨=2kÈ„QzbW‰‘‘×ö ®()Ñ2»^ÓáIuo2˜G+A·™\à;Ù`s¦¬Ô=X( ¬`äÜY¬ ¬[˜xpL×ý$YXÙS8Ë¿œ¡wÙt~„“M¦°@S…¨¬-Ö@ìýæðÛ¤FE±ŠñÛͤ+s¹ÉZC¹#¼>!úZÝpþ~ßû¨†»¤¸)ž8áT’Î1GJ¤Ã~àˆƒ§Ž›]K-Žjä;á4ÆÜ¢ü`M«²ÌÆNN"߀5(lEûÐ…·V×Z¥—ÈCNËYŽãjøz§ðHåJD¬*ºKÝ€_!© îÚL->ÇY^‚ÉÛþ®6Ù‚#Ómbe÷¤˜ûp5?„n”ÂP94O¤2¿Z«M ðjkÆPI— œjd¦Ç훫‰mÆCbR8Èê;¤^æ­ÉÇχ*{ml^ƒ'0iô¬«±ñRÝà =Œ0–qS»êV®¸Û¬}'·& ·Å䣡ƒ8oÄ>ÃßÚã•5¢§öÊ×ÑOí(È4Hw„·I=I3Ç–]ÙbÐáŸòºp¨CÃõŸ“7_eÉè±¼€iˆïŸÔÙ¨E~L£êÇŽðv<‡'ÞHPˆ‘yò¡^ÇA‚ÉT*„«“}èå@+tÝ`%Ìð_ªàÜí›6P“}é÷TóL;Jà«U'N3´îA>Æ@?$Nm`«)ç³R ƒ¼ÏU(HÌSëjB~õ q’âžqåªQ Ó©ô^…†(̵W¸·:ó0íR¢€ô—¢F‚Ü%÷_³ÑÎ ¾ |éÒŠpšŒA8ëi$æpAhæo%äÖ§—£51he£gËîa½Ë&7‡Ë¤39x™K´š”Všû–¼öÔ÷ Û!Ù{€ëÒJÍÓVíJ-m-,KU7Õ^£\PE>w ÕÀaL;žSMsVp1ì’|† ªƒø„OÐÅ6šÿz¹yÂ@ÈÉvýÌÚ}¶þww{ˆä»=9W…½ÂvkÛSòCæŒ~ÅÛcv Eü̼n#’?¼,ËC´ÂïŽeÏ:Žþ[öu{mK#Ïm1×$jÈ×FÔKLpt§?ŸH¼‘|ÃMÔŶ¶ü¨û1#æ›Qr{Þ8Õ¯ðnœÄƒ3?É·¹?‘Ü\-¹ÈK™Qð2éWõD¯2EuKÛ±­©­§í÷ÀÐ*7:ò¿á0a?=,óˆ£÷>ÔèÒàìàkM%JßTˆÕ]ÄÝ{ü“°ÈQI®úf? +œ#~ë'öö‘éIlò¢Á8Ù|öÒx¤!îïű<â6lꨫD¼w?ô|î‘,è‘=ÿ`cx• ¶Î}v[!±9ãJëÉ®q­ý0³€¡äC6ô¢ò-Dy“鳨¢ ?Þf£GôA% AÞ?4äz.&¼$ó»Èh/€·,Hn˜ ‡Ô±¯¬Y>jMØi•E”/ì&‰Cñ•tÑe+Lƒ'3%¬§OmÚVüt¹áÂb!ù‘؇j˜ ½0®Ü®6ÜW<ÀÂÓÛäéç#u eÓ")ÿ,f¢Áêùè­u¶:YYØ<p®­ÏM?tÊß©0š÷˜ÅµzeN×ÿ(vÌækQ‰ø´RDâŽ.>Õ¹omÜ/}|Î[ðº‘jÔ<³DmŒ~§äB„FCÁ…cmòxÉ”nÔ]šú'‘V²k}Õë ²<‡åH¾}mÑ'×ÙX£°CóõÏ@M¢s¨²É¸,´d„ Žàa=hcHH«þ6éÅͼťƨeÏÚ œ|Ù½fqúOÖ´÷ºßWyG3Ô²)î•pöäžÛb§haüxQò ‘pÒúþ¹êpÁ´)\e÷À;LYk‰¨{ãó…¼÷®Ù4qÔ;c»dßÐÂ3£r;sÕ |Sóhaß#„pqJ+F¥µ_@ðK‘1Þ¤Þ¤7¹$f²4‹&#oMˆ;;íd¹³Ìôà60;Í)žMîím8³>/éð­Ò2¿b@a™bOÔçÜj®@P®Ìî§AR‰À;¦/ýزñq7RÐyÏõsØ®yìø7hÏÁª e¯q¹rx@¨t¬mö†}œÓóÙq¼Ö¬²àûjV±‚а€€S xKŠÅ•bYBÖÖÊïùH–îšoî¼Íеë$.뮞ЄxÏÓô¼*&³çwȳ9è΋.jX& WU’šß)l_ÅŠ2”z™=ß>ƒáDœ´ê.¹ð#Àúp‡ˆ¿b,°› ûK”ÉKRI˜R-A²tèÏeC­$‰G¬$ÐÚœjŸJ¼>E î©nÆ:sEÑtV™+”TGJ¡â¹0™vûËqÊ òÁFî š Uø¸Üê!d*cº1Çšrf€YÈÞD!G‘¿É¥«&Nz+]çÕÀɺîï›Ò<óß%“ÝHWi©T3FY§H|àš` âNÉåvüŽœJ¶Yù³"4Ÿ¾÷óš¢óá^¡d*¤BG Ù:"{"÷vHŒhØ cê$|¨‘tÔFŠSЇQ­°[xK^½ý³ÔÆ6¯ëö>L7ÅMäo6‚-Þå{q„ Ê¥fjð]1Òä-UûÉœ~•¥ ¥ª"ƒÙäça÷²Z'¨r­ {#ù+Ap(¹å8ÈXY§wL¦òjWnÉÛH^Ÿ!5p:}[ÉYczœ+P[N|ج ÏHtuÕúUÃÓo44U¿ÖÇ]•ùìÏë\¨ }|ÒvE§.•VSf5h]¯Íg$=¦dÆmè*`"Ë|ÞácæE <9/úXŠÏó¾UÕã…¤•§grÛÊÖv4l ºÌ8eö Ý2…JÇ€léE #'f¹$×Ò¶¯f39 ò­ÍdŠœfa-ÿ;V |zT‡Õ|~È,•×÷u縀ˆO2\Q軤)äÂO•½ t¯uéx8‹]Ì ’baÜH É/“ê §ËÕ ªE¦æØ)Ð?Gq-²º¤%©Ñ¬á¬[ÊÚܨÑ;>¼záÍs§Íûn±_µ_›Rc rïh–³vÄÍ"µ'^"Ü•:!LœáÝÙ}ÚxÑ÷TQnZY ­ºg¾Ý }h ðlnN£ VþÇSÚ„öÏPdfd8έ±¬Ó¨vŒ¡h¹ S S1l¼†-V fX– ƒÓæ°çèäË`o˜þ¦¬ðú§ÓŸ.;f½p+ЫuI –åͨÖ5PbÎ×¼í÷e•öo8¶Qz¢¯Y鎛(  ÅYa.}(”û ¨ÚÂi_Üc™‹Ó-¼N”gôÕöÉÛôÍsç縥ùQßÄ{Ùy-®âªÒ®m‰c¸#,cȱ÷­c èÿp”R1 ßÓLÀ<;À¥ópöÁe½AÿvuûKüuгaïak¡ÐÛh_ê_´vGÃ!ïcI^uKîfjI–¿AþZº±4Åä› ½vGëbUwQ0o=D‚]ô!yÖ_ïÜÅKÖ¸U%‘»%™I,ÒP“è;_ã²ÍL,º\B‚¬ØÛ­ÉÆ´çõê ÷`köÔŸÙŸô¨œ|† Ÿ¯J˜mg,Úù?ûíê1HĨÞÔ¤&I[‡¶Yf|ÊýÓ*qú§ä:‚’º”³|ÄûÙ ùc%ÍR'Ž•Ï5Ïa7`HàxñSñkå0ÉlH*c‡œ~P6guÚX'ûy‚š_ã{p·Çb@å~ ¸EòªK´É§ V°ûz8ËK1Lȹgµ³ÙΖE86¥œ€âÀ_dö-•šÔ¦5iY„f½LÅRøXÄD7|S8RÁΔž,ø÷äÖnüëæ@.OŽfqުŬï5×=>HêÚ‚²hÔ­ÕöZÅšòtƒEê[pÙz'´/žÆ6ÏdaœëcÄq!½~×FZq·:0ƒÜ€øí ѰðY(Š‚šT"üùË69ö/ëb*‰¬™XÊ[>L@S¦ðp*Ú¾ S‹’Ô€ÓôiORGÄ.óø‹®;|F½Ïݧ’é½më;½h}s]òÚówrJþÛ~árzCþêgþ!®Ø`n —¢À”:f:áÇv¨SOÇ©d–9XJìù);²sÍ?é°!`ùÓ´¶¥Ìéþº.÷ÞÚŒ]SÓ+>ˆ.¢`Z)¼Ù.f|#ÔçÒÍõAz@;ƒÁ·`†Ã°BênØŸó¿9ˆíls³ù8Àñ/Þm Löu‘­^kÜ4¿lh˃Ry¤sš=‘çjt]öiÿG&ýîmJrà»U¢JÞXŽ=Iÿq.}©ïÈ(TAvH&Š˜%y™opB§˜v©ì¿•îØYïc;³h.Ÿêm‚–U*WÇŒ?€jl9±;¦…èû Cýô&'’cËXòü ¿§£¥œVÄá-ë:(R3=œÁ,.Ë,ˆÈÄ¢xxÉÊ»óÇÆZ¬l,z/]¯‘˜[¡O2rš™Û·LXèQ™ª³!д»Å¥Ê[ªÚ`þî1%–úüAaÅZúÞìˆLßÂ|UÈ2ŽÐ8övÍ‚Žï×ÙÂ7­z6Ÿ>\„"ìÏ@ìÐö“à›¹À_®a§k•tÇm°` þŤt€ÓVvÒ@ÒC[à •@T’ž§—¨r‡Ð3,ùoU‡ ë!ÑTøŽÏeÒj Õ<¦qÃ&˜Žz¢ÃÆd/x;]R]üªx­º°¥Zö9¹¾%ÀÞü w€å¿^§Ë½®·Cò«\R%[‹ÂxgŒõ„_–¬ÑÌ-ÚÙnZÐCo?qU?îÒ™3×aí伺ŽéPxèˆy˜žÁ“1¦–,•L™ª/Ë%¢ÃÆá½ø˜ŠQß?Ã_y×™ hk%ä16©‡ºiˆ=(…VLZ@b”jÏÎÛCGE‘2îNn/„—›Þ>;z­¹v÷Ÿ¡¼ÍGpbû–ÄNù0QïuåÛ™å#ö8ÂOöl)Å‹ ,ÜèÜœmà Î÷Â7œÖVr²ÚàÑÜ…šÅt|qy8Hé~b<îå9 Z òÚ[í•òm~l®et&¬Ù° A§ ê³ÿ:¶Ûð˜ÞŠ–0Àn‹¥¶:ʶ†ÐËíªһ8sKXɺWÙÃW@øy6¿ÝDâb=m‚4Û‹ñ–\ Èµ’Í.Ї,é\ñ3-fl¤Q¿‘šâl»,z:‚RBa‚Tÿ]ÆÔµºAH‚IpïŒÐAU§;Ç„pø[Í»­C©AaE=)Ëy±mQ¸ûmmÕSéKrµ!a_~ÕÈ"µ¤.¶Ú8ê¶üí4À£»¿ý¼í†áÜ?dUçÆÿ+b\äÀ¸·H-Tâf£Vr<Ê•‡ò~+ÿ-ã?¢p¸‡>H‡´(°ŒU|™*ø¾C/#*­.kkåBÃH½“-É—3eœ å@Ô¢¸yð_êÙ,ò敦Æ!.Wù-œTc¼ Áûkólj%ø¶EÔÝ=€? ;³RÈ5.¢œ4"söv3Z@Cÿk,Ž.ØoÞüo»[¹ãs¢˜hˆ0ûRƒ±e3µÁ¦¾Ã3LÏÜ68ÃæJyj‹‰äö[¯KÒnjÇ]–k…ÍžDç^ô¿{Õ¾&L Ë37Qð -1ÊÀµíê7›žQäwÉ5_CZÌ6)”c¯N´ìMGoœBã'«âpvÚÑm×,Ùñ½V§ËñªkIû@åð\æýËýùB zåùÅœöNáGùožC†`!-)Ö ÔŠýÂîqU?:Ï|M:&èj^ù´âd£žW8â7¾².èÚ€´S`±OR´ qã¸-l|ÏkêÁïƒ ÙNAŽ~ ˜, G|¡'~“ìЈ­n ­}‰ðh™øˆÏK Ëÿ|¼0ïvR¼Æ’X©šÞ›x"yU¼-P|{¦•WáJ%ïw¶²éÀÚûé­fÛUÎUÚÓU!EìÊç»&2ÎvYU¸RE jIa%’­ðæÄß±Á:æ·‚lçœ!œG>Ä ÎÈ\5»™s²ú|“4üÀ_Añ*wæbGÓI‚^„Ú=càOl€QøQ §,±P  'P€†w9î¬ÅöBíBÿq]”eF[䥉~—NºÎÒŠšr Ç3¥¡Ô¯6 ˜y¥~ñœyÆÜ‹é’ͯ Áj +)2+ÑøfëS#Ç&§Ì‡eX‰É÷H¯d=%3¨LÙ¨iO{É÷²BP0ºõ%7aȱÒTü°<ÖVÆ5öKσ㈓½k·€òìºne}É×Z;Yqûþtx—Ž$y괵ܪZPûªºÏÛÚVí¤Ë¯LЄ@6>ˆÉcÔñÌL[㎠ÿ õmY&{ý):Ê`ÐNù¶”é˜*XêFÒϧdŠå «{1ÇWJºÕ“ìÓÁ:¯>´h×TÆõ¨dÏoö4+¸˜P¶DȪ›SÇáýOåÇÚM”\ÁÐ|O—x;*?#Yz—“„MÏ#n›ß¿æ#«Ä8š94?v®?ØK[Xs«Àiú½Ÿ³àu)ì$¿×é5N¤ÃþSÐÁœ”'®[cAû$íožâjÐjFãœs–¹×;Ô RccÜÅ ?ŸËì‰1YW‹¤¯‰9Š/Ì£ #õÖëÂ[Û·öóÆZH—¸®åì¸@öº\ +gS/zyDôƒßÇp¬ÖûêÂëL”)¦ õÛ¤`çñü'wM=¶œ¸2Ú<ߤkÝd>øþÒ 7’7WÙ hûõëMjºr™`wßq"~Ô}ëBfƒ†øŒŽQØ1jÚÜÒ¶%dRüIbé'(ÈÄžíô}ãn0)øFºB®àº`–?jh¥ñW,Qš5£¿§Å+™òƒ™5A^›»ðû™[ý'­† WC²—÷Ŧƒƒ³…ÓÕÆGùw‹íÚ¢žÀtGßúð@ßMÚ5±åië J_cq?cx#ž† X’¼ç úvS©ß×íbI%S9œéDÓÍiN‹üFÀk<êö“ù­­ÐñÎÁóS¨Ùr9AÑ1á¸EF¯üÿµ—}è­#´Ù>yõàkºÝÍ¿Weì.¦Гû´dÆò+Ô«ã%×Û-àý×UáÏá±6eD”Føá|^\ê eüiÐX£Ùrº;S¢Uì$°¾_\4Æá$á5oóìU ³0¥û~,ò÷Ïç`»G2«}3¤ÜS1{˜¦¹lXŠ‹u‘o)cŽ ZÜ3·îŠûµzŒ@N¤¦<–>rP—±kl­¢Á¹q×·Û²ó@ùQh°†¢ñiÙÔU¤€ëÔÌV„Œ¡W½³Mµ0kë¨*æ3E@j¹§1Æ®öÙÁN2éš't…V“9§Í³QõéW(ˆ³câ€uÞÄ®ì XbJêîÙ…B!Ë0c)µ­Fà AŽjÔ–p0ruè/˜›ñfà³s™¤g'oF†™ðlU×ékŸÕáX€Éâ ~rgÃ’ÎÐE µ(‰çÅð™æåv¸M5ÞIøÁ˜Ržvè`øÎs¤ Þç¿÷÷*Dà\tz²¿(CÅ©vO*bÄóñDúúÓ€€<¼ºÀún9©ª³–3ôQ®¤MºÁØ}  7E©að0=¨Î½ÏC•­4!«+ü$ÙIøã»^üûhíµ3ê ¹²œ——´|ÜÎ×GíÄ ™²\ÊLO(F¿ò5h¦ãŒÅÛͱœúkõ¨» Ì53üUQ«Å`Þòo$2ö3žõ÷\ð7F€µÉ´Ò<ƒÑ ødÒ+ILø]!£d\g•<õ4ñ|ò°ÝdŠl¥ž “²†Mí­±;ßï ú}ÿO«‚£ƒ|,­6ùöá)%j–ï7´ƒù9σÍÍy]û* "@ñl‡Üs“…q.÷"%Ã&Šo(yÕa¶Y°5ÆÈx˜}#þ³ h08”O{JO¯â7ü|¥“6M7GGÛT\|â¡ÕJÀX˜DᣵyµvÅ®þ¹oÌÖ1ß8}x’Ý4vúÕ~0¹×ÆNlDtÓw‡±¸Òã7döó‘©r¬b |àîúÚ½W‘ôT6°¨9½’Ù|ú[µ!ÈýE¿Íƒ´.º, ic.ÚŠD_‡óµDGàÆÜQã(OŒQ W t¯ÐhରþÚ4ö= ‡Ùx"—w 8 ,‘]õ IÔ/Ø™ú´ßºL’A¿àF‹tÓ#úé.ˆˆG'ôvÞÇ@÷j}ý[ãpuË©Z`¡ióPÆÄÀ?¶¹ðml7À`h%íN¨ìkۜvÒ¿Iâ‚ôêàdØó«ôİ[³í ݺ+† M[!4Ÿm7-¼a®|œ¹æ4‘ÄMËaûÂëдŽéó_"cb€òh±ôþ¨òʼn5±Éã¦ÎÜ;‡’u?ºDúk(JL8¸~懀È8ÆÝ-(GÝ<¼Àp­˜[‘½ œg|y*ÌúB¥È»Š’Ä›ÊyLjú "=îÝ¢ÌiÙ#¸Žv.C€Ísão™Û}é²ÉwãÚ;buÅJùæT4gp·@ì«ÿXt|4'¦ÞD(7u}­ì¸?ØàŒêPcUt~êÛFAq‘^4žÍÄ}ÍÆsu)º!.V3 K/ë)FÚ忤Ž;9jj^MJv>Þ'b¨|ØJMôÆï¢«ôV.SÙR›uÄšÙ½êÉdžŽRÁóÒ "Ž}Ø e¶d‹>'Ï[ ÷£ü­EÔ³ZØ”W‘ñÍíD¹ŸG3|e× ®Ä «Ù6·`µPUçüœÉ;ž·°eW{ ¥MQºÒˆüQÓÌzƒ§mQ™¹îIE‘<÷È€ÃLÉG™É±^µá×JŸ*Ô)ZúíÀ“¥äÞã’‡_p ôzç+œV•gAÏdÉQÄ÷#IÆ2Qx(/‡óžwãa¥¬ñ^5‡“›Œ?œqRÆØ DR¯èVÕ#´w%÷Îçc¼ˆe6p‘¶340ÚÂ)ô²^ñëÆHÍe’¿ð''„•{Ÿþ}Û>˜V›ùËËî\×Yv³‰øŠÇÏΡ¡©»lÝÀòB²H1‘..Ž•ÏoÄ’2£ì{hlœ|Q(:ªäoít ú¹Í2ßžú]XÑ$^Æ+²â½±øt`.LŽ­èSœ‘yˆŸÿ¥d¥’|ôÑ­:ž¥”à-òN抿G'€RÃϣʒ¹õ·¿åVÿLÑÎôÔ\_Û%$–véeÕj˜q-šUÞSÒ†+1å%Ÿ´àÏFüñ^y$´·0$©$Þ¼åŸ#2¥P§×€` гÍ÷›¬ÖÅÛRßÐ…ïãBtôÀè¬c‚„ÓI_ïç x@Ä•­·»ÁAcíäNÍ¡»Ð«×œ•ê]× ÛsaIrƒáUÀmÞê`\é7xÚp¦C¢™Öøöb‰Ú¾&7ØpÞ?xdŸ Éš0‘&´ò!–ÛóÛñ”€/TjŠºäøŠ¸£ûÓ›ªG­ß0ܦONÓÂóЏjÆqœ‚ÔLü4ôMªˆüöéž@UoDdNáè"£Ù*Óä c–“æþ¹½úœêáZµœâï:¢;É¢^ÊÈÃ]»s’Àwo8ÌÒzVê¯é `]Ž­ñfm5‰I/ئ›á×â+¨±;šbßd´ÕùR° ðÖ-èDªÄš^\â)åj“Á¿„OdŒ?òeþT¡úUo†Î_¦Ý½„³•ö¥â¶Î¢³;@³%IV¥qõ–ÞZ®4C±…5úE´%¥òq3€•9UZÝ؆ӂ²ó0FeDTDèôà–½™ûÂf=ÈõxÿÊè1n‹º©êïVyí3©ÐÂê’°kÒQV;Û…JÉ[Ö¡ÝG{]Ó5PÏ|‹r4p3ep«î•D–(Þ¶“uŠ„ZžðR3úwÃþÞÝŸ€ÒU²ÛûŠÅKßÁ´v&ƒºLqëzP"_7ÒóÒú±kè‡~íÝ4æ°ü»Å±€1š¡Bïvçª/ßü ›3¬+Èåý¡Åš¼õ£=2¦†Î°7¬Ä”§¼–¹iÍâÑRnL@7)ú_ôÒøRÆ52Î’þèü:®‘—«s†áÐ×Ú/òi3–›S’žÛHÌ{›o‹êkÏ45†¿ÕцÏj ÇzÍŽŒ{ÓÊ8ëÐE+w*pt²r¹×œÆ:< âçê”hjg˜Ð ºêŽ`½ÛßK¥D§‰™ê0k-ÿ ^gÑùØÕH·ûŒŠ*j´c¶ËW¯ÝS çŠ@âQ·ïúTâa^‰#kÂN‰´s—U¼L™<1þ’4‡¤„)à µ”cC- ÙÌŽv–züÇD_dÚ¿ ½k'³¡¢S®$hÌëY(+ %žžß;_JŸ˜/{ëÕJLg\¶™¤æðåénJÖ}D•0ŽWMÄÄ÷ÜÉ66màÒL* äNx¢œ7Z¹Õèêô0ëÒ_C>ÃØ<ðqíPGܹ IàbÌëñ¡5—òÍÞˆ­(…+¢zUKói®ÐxœÃxs õ¨ðQ¨]ËÉ2܉*ÍÄüäNimV¡BõÜ} âUqÅM,.“.WЧ7_–=<ææ•Õjo\þãÝ£´„¦M¿Å JB <µÓN®¥ã%5hD,–ù·[õ/¿,ÌBd^ΌаSæ^h@£„±_··ŠŽal6U«Lƒ¾ó=rS¤¥a¯q£*Vœ÷6n§‘›Çƒ a>ÑßïK 7q kHÅâU4£ÿ/ñìFm£Ã{T‰ÎÁç}¶œ«bˆY»úTñKiߨ&Ö|> XFK…×8Ääü#¸?uðð嘖ùÁ:n’Î}ˆƒVèîþÁùÝ-‡è(«ºr¸÷ÍË¿‘K‹MÁÄ.ß‚m‚iSñZE QÉÌ–ýIÚ ãï,€:HŸsO[†·¯Ë‡íç½ßýZל‘9ƒ0ò•&zË«²n•| â1%ãgoâÊO£B±Œõ´Äs Îv"‚ø_&Ú½Vv *J¾¬k&Ït!ãëÈt²O‘±ØXcçÆÉH¸¤ À‘©ßö[ÄÈŸwZ†T0lªû%;0‡R>ƒj[¡s bTý1¯Š ¿ïëÓœ#ô¬H¢+Î’Ï£¢¬‡’h%ïS°›~ÑgˆÔ^•‡ãtÖcÉ׌cÇ—?bmýX*ç?Þ¿†)«t¹"±z @kÜ>Œ¼2¹g'#´ñê‚Ì5q§_f?ÅO݈EðÅí›}¬á8qÏp8ZP4ŽÐ±óHXš'BYi` 2Æl˜:êžîýæ>vï.N¾ÿD8Üıê'ìMý»TÙ3‚ ¸Ã;P‘ÈEŒíms_Œ™È¹¬”šÊqhdºÓ”köŽî}Ûwµ¸ %%<÷U׿T¼Æ1üÄêž!šÅ7ãö °hÌ’8»OÿœV¢K]ÎŽÓR0’*ï_Ë/R2ÕfæzKE&¾›‰Ì*­—6‚ lz*÷¦Op+c£â*âëéùS <„yTãà ÙF‘Q¢Ì« ¿}:z ¾ß.Ü#ÕU²ŠÔL9fçÖý™Ð—è­\‡s]&,ášÏfÔ¢¨zØ gMx NF~óÛ?>ÓÍ'ì„Äù¼Fpε xWDKäx!¬‡õïšÜޱч¦ï+ÕøÈîÅœ”@ŸL9|]™&£Y»mÉ"¼MCSX…—è;RŸP¦Òõ«+éý)9ö{4L™à…ªÙÑÔšLö>C/&cêÈm ΂*N½8s¿˜ˆñ\ÓŠé"'çrNãfü’¸Jâ]üÎ/«¹ 0÷áÿJöN¥:  ÖtØ$>¯ü±X7•!E³r³Õ­„ÿNõa­dÀf@³[ ÇßÖ ÊMâ³ýyZøÎ²¨le—vøyhuú†-ü2ÖcÚ^r¯Ö±Ð$Ë‚×xT>EÙ+ðà¶-‘ÿ6Q9æ×»¸Š±L¨0eŒ_HÎâÒ×ÇüàÍ}KzÔBcÒñ¿èJü°1(£½0Œ“¬žx«ãS›™˜*r}磪“ç2ßó— ›ò¹â‹°‹ÿu74Ô fÃMj€*PÜãLï©·1ì~™ˆæ)ƒHÃýó›Õà2Žêyu†n*MPyMö̪Þ\"°YíøÅù¨2²¾ÖíP§zŠ¿ÍØTz.æ8ñâ¡ïý\&`Ó´UÛÈÓÒ¥~²RóJËéòë[BƒØ¦ò9u–Ç®ny+‹2!e®/â›´i®àÛÙúÖ;gÛL‡Ùât×Ji›õ©¶\®çl¸+bÅ6H€òÚhïŽCi˜5{œãœ{/ª6µl÷œÓÓLˆ$9åšýl.žNn—;ÜåUC^“ßD0ˆÜ¥žkmÚ‚¯æ3“u f&,ÇçÆéø„^5±Uò¦spdêzsšÚéiéwf!Œ7bu¤,0Kq< ÷âè¾¢É dv>$K=3=Œ;›DN¡@À+ì°~ô‚'©ÅOJ}¼ŸBê!eÿléEâ{¤³Wù7Ž‚kmÝû`›4¦ŽøV‚¬Âà ›°‰”Kînì%¸ÿ\~lkœÂëzàž‰Ög_¦*†Ë¶Ê ãZ[}8K2‰8‡¸¾/Œ²H"'i_jï E¦b½ò禡”Zvp0ÚX÷CÚKAd—8ŽÕ*îµ# ž\’ ¹¦Êf%hn­ó³´)lT´•°Nƒ{ˉf ~ã ÈÇ­N36Þ}»fÑ#4O슶2Þ óÚÀ"š ªM*Zûß•7 @ûÏsª”Òaáe(›ÿNÄìDO]kß)÷ø‡fÝz‰1ð†’)>ç22UÃ:yP š½£k=žqrK¯jÕ+æ÷c(¾»ÚM°ä7k1€«¥ªBsÇc=1“?à2ó¨2:Öìy Ý™7û¤›†½Ú‘¤Çâ)ÜGÜE™~Þ†® QJ»³'ÕqU;±ª_ޤÚëh¡Ôä1ó ¶A§D_­®ê¿;*ü¬º)V³|w©u:¦¼?9|©lëñjRµýS=NWÌtõ»8/SA Ø3}JÍ;¸Ãˆl{´ÆE8´«U{»…z·³ìÕiÜÑ@«rùä¶ÇÙÈÄö5Vª…¡Ûî·Çã_Û0©ïÌ( à½#à¿îÿ ø‰~}:l²¢Z òŠnêô伨–>Sòþ!&$"ÿgþÌÕ´C<Àï´¤¬½\HÝ¡IsX¡-k3ÂnN^×nK´lƒk9£˜iÖÈÍJ‰Üyùê°[X‡ÊF •E³¡Éíëv6º¦'" â%,yÌD¼}m®G][ewH°Õ+Z7ÿ3+ä /†,{ª kÊÅ#ƒG§4ËEgD¹Á„à…²Õ±ksmC“°ÿ8¢0Èפ5Q •)x 8‚Þ«(áX^J§_ZÜ®SßÁ&Ú­Ö )AEÂW¨ÌàÁà  kȦîØÌo½fnÕ=ûG (¯zÛvªK‹¤¯ïéÈÑ=`¢vÄ óÆiÃX/Èe8³)ÐûÑšd ³ #¤‘ÒÌÚ¡I,–­Ÿ  ™"ÕG_™„œ†bóM¦S:z0•A kvóVòÙqð ŒþظÝ*Çâø"qì(Ï~Ò¾óg> µ [Ó„?àè„«8yØöTvn”YÉ:® þ0RXôgPxkÕò<%úÁ£z5NÂö2*õùDÆRë+½«íÛ)m¹ †?#`ºm¡úÝWÆi…»¡g 8C# HßÀýR~&m!|Æj%?¦’UÄÁh÷l7"ã=¬ï‡×™z `X…÷öà.´­Â,UçÑœtñç ¬Ê ^í6óÒd­_/Ææ ;MMßͪ‹‘ÖNÒí ¥åÞ`_Ô1²„´ [%‰ü‹Ò3ÆU‰©d¨ß¸œçä$И‹Õé?J;"д`Âà7‰ã{'lq°£{T.ŸE©ˆÈ_4Ð9\ú£ ¨Ix§€p ˃ÎÕóÒI‹z&Û¬8¯eŸgTJGªÈ# Ç’bȘÑA6ÀŽ¿¥ì<þœ»nòÐË0/M¿ª Òe(B ±Ÿô2‘¢—Â<†¥L‡ƒÖqe·$Ù¬“i\¶‹/ô×Ñaj6ü(Lqòhmo)`£â7¿†{RLj›% 3ñ Ž1&ª1WÓQÐx𤢣îU{u=¦-ãh¤¿dPÏu,Å‘SØ$'jspE¹åA”‡œ‘𠣡ÙxIРût»AD@ýe'²“ÄçcõÑWvpr›<™ž‰ãÖ3^Y–éÆnS,cijî$øá¾Q# S’Œr,gë='µ\ÀÜçxýÒΕÛóÕ²³ãyºh€¯¨ ª[›6‡„ðÇ›Ü !ºúm‚\a§#€õ}áœv Â’nÊÁ1¦Ú7þz‘8k‰$¯ÌÓò=K+ÈË(×çÛŸž×ÝÚ妮—pOüç@?µƒœýR¿ÎlÃË ’YÇ .·I*°Âuzb¥òtÝ®#kAPœ@ÊØ5º³•ƒnB:¹‹·<åK¼îh`—fÉ–[cjÜj_û¥Û€n©½êàµ(!±Åä%î´sû  Û€– >™À VÞ©j|ËãØzS‘ÂrÄK0D(¤•× ýž×ÜÏ"¢9ÃÖ %z8»Ï)ÔlÂÿJ§ÿ7àVÃô²–3:…<¯RÀYîÍ;ëlœu #zq¸ƒ$2¼µg¾GáõÑŸ¾#ûfåv4*žj娲lú‘z¸”øè0-¤ÀF®šëñ'Qi@„˜#© WU…Ù4„‹¬Ö2H9êU‘Ÿv­Úp–¾øÍÿa@oß—È)`¿U ¸¢þ6çµn_XÃT·EÆ.pe8êFèpÔÝ— MËö>ëƒqvÀË ìÁw¯ÕH~eƒ„Ý˯em®N/쌠sån°Tù·2G²Šï¦”¸rìŸö=~î™ßwµ6½(Y.D¡(0?caPPL®”ó“êõ?g°3º‘X‚Ù]-BQNÏ`™%nf÷í"D:{¢±zŸ’¦WÊa|®W&²éØÕz¥ †Ëª•šÍÓv‚Tæ­,‚¶xêÕ¿w;SˆMh߸ÖÁæ Áœ!£–+— R9ãcÍõ‚jŒÃõvuñ°f¿c%½Š_ðtfˆÒz±N#î¸U_Úýo>_•íŠÕœ†Æ´/Ì`ÔVžpüÖ .߇Of?‚Ëœ§*Ržã›¹>r¬;÷ôÕˆX÷üÕ¦YäH­äëó/ʉ«!¿vv£õv±J\D7ñ½^@ÆçMÀ k T£®ÛÂ>¡@ÒïŽùÜYï} :=ÁùƒãÓH–û3›Ô TÅܰ:£‹ë¥ÑwP­á£Qe#¡¼=KSîNßÇ °D'×0Od±ä«¾ØÏiÔÆ‘°Aá`—½&2q-$‚b‹„a··ÃÍŽôL‚ºXN9`â¼µÉ?<%‡5fÈ÷ìjW ¡Xבϰ©„cÏ«vi ‘ë­¤•J§«Ñ°&ƒÿÎü_I&öK;;ÿ×-²Fb{NyF~·ÄŒ¢5E&xYJ ßÈE w®hp3Š“ÛÊ«”ûnœÔ’‚œ.êUÏV»@Eaaw¸ ò*VéÎj{póÖc.Ž(_ÑÃÓ˜Ël¾ž¬ÞóÑErtÏêz q Š<ÇWË}¸¢è„ä÷=H{“ò‰ºê]oTyëæÉÞ¥Fùþ÷÷Kzå&Ÿïïxû©¨qñáÊ 'áÝE(¸Ì5N$Á,¹¤\È–Ñ4Ò'ÅûŸ³µ@Å’0XØWHÑÚ_¼°É»oà<{8^ÉùìdÞ `Wi#¸kÏ—kÕ¼©@ôtv¨ü\¦ä­±•ˆöû e)ª™Ù$),KçP'³ …ÖYÊœç˜ù¦‘-ŸÚÅAc¬Tfhr•Üz#HÕh1Ëq!’V¬ï<.·³„0Î F®«®…Es¨vˆØ@¾:ή Á¾>U7M:̃Úzâ¬O§&3˜«ÿ:…9)ÿwOpf®6øànûfãexÆ3c#é’qÖ«lg­’ÞL1¬o^d÷UÔÓ\Ví¶V£ä°¿‘M¾Ò ÔÉ"ü ™Ê³·XÖV´!ÊEAU„O¨”Ïâ»:™û9ÛT)ñ³˜p;´`Œz¦t¨‰¤ÝBà‰¶èzþÔIÑl—*ÚÐõ_Ñ–ð_$Hgøíó˜ýµzXîÀVV†¸„vÕì¹B€”uz«Ë$çmÌÖã³ê‡%€=<ú/íPˆËlßXïàªTM%îXŠ;2S?Wç‰)»ýòø+7Â6‡Ë|Ár{©5kBúð„VÊÈìÀÌÖfÆCy| †ÇÂz§ïDáÅ,/ÜS&ØWǦ‰Â{Üš-xZ&¢ à¶°C{åž’1iß_âG¯"‡¶ò{å‰E¡N$nPC-¹xzŒnÎ&É€Áªø~mÇ£S¡g|7‹·zÈ%)/û2ôðïv&d¿7€ÐŠÑ³ð|êŠm~¥¸Ø0«(ùë4mŸXe"ÛƒútÒYqÃWÝ“›³6¼­Œ¡¥â!ÅÃòרbEJ _ŽŽGχ…%&ÐÓq72 Ã\ŒWÜØøbɘd •dD) ;’¨´jÃçqïcLð>n-µ ·†tª½FC!±åÅ,³²¶*ÓµAèß!xp0,pºû<ÝN³nZÎn{-ò‚Ö6^:÷dãT§b¾%¡ZÜ4µÏ ÍqWº“³”pöã…‡±šJñ#ùEÃM»¹KL0ÃÆ>çüúAb¸Èšú ˆ4Î áÓª¡C†>îû+¯Îé×ùÑAšn[]Jì¬8­¦ií?,Ï'K~:þû°G‰$däÜQ¨6˜ä.Š+;´áœœœÓ¬$ý=§ÝOÛ³~P[iÃFݬ/jÚÆ÷|×½8@–¶ÝªT“Õ‡!Ü}OOñ˜aŸ•½;^¹¡•ÛOhTé£K#Yݹý,ÎZÂOa;ûä*›^c+¶t …#Áð(p'ÿs#3ªküÒQm)ôR6?+£&š—ý1i'<¦Hô­>}¸AûÖ ¦é™‚:¿ØÂ¤Ýc#cyÌ^íÆ,Þ÷-ŽÓY…Ÿ `Ó³¹5q{€+ÔÑÉF˜è´ïš‹Öã¼ÃÑS¨‘Š 5@#Aͨ £´Ç–*#%¤4k=³í FßÛ4‘„-©1Iðõ°ÅãиPb”ÜÉëe•°cXÆeêRúBoÓEzjþd6fÐ#éu$Qx>(ùòѾÛò„˜êêÅ,u¾Y™üÇ.‹T ^÷°óƒ‚¸ÍÇ#[¼}Í?ßà×q%_”Ø‚Çù!¾œQNÃs<ôˆ»ùª|aâFÂÁMÓÿi¿Ê‡8Ù›7#çTBŠð/pMŸn…›­¼@üËbp÷;2Ý&?œ–¶ÉœsÆ^&žoW™Ÿñí²"û²ûž^ae ONTcâefoYEíxzþMC¶2×®Zïï=Ïî}¬ô¥&‰2Žþßó†X®@¹¶öϸlïÇ)™®+ ßÏ×ÂýÃèÊ–ëöœÈ%eWß Ø87Љù9Ì£®ïg¥”`J;Ì%4µž™ýðææÈ‘ÿMÅFާfm²Eáãmg°ªÕÐÈv£§>S×vhuC4Éqšë®R•wåüùÓj³b‘…È8(=g9‰ø7R]òÓeG÷{ø¾–‰YF zà¶½f`A}­)©qÏ7™3F6kõ¦šÚ`r”'õ ËdÔá“k;Bè@X M„éƒ:i/Æi iÔÕ2ù=ÖÊ wÓªÓ ™×Ó½4LÛßëß­œŽCÇÒLÿé¼G“?è¾óï(ºeëEEæ£%àt…‰÷‚ ¤ë#(@‹ÖU0pÒàÒÇëwžè]ØcÑ^–¹9}w#’¹AÉ2#y}óæ’s͵døZÆŠë›M/kQX`®ÝeY>%tÖe¥ 2½d°ºR°±|à¾)=¼0a’Bé©UHˆŒ*3·[Æ´û£Ë¤íé5°lð¹ª&^X wä&jgf˜MÁVI—YŽ_£Ë¹ßºÒP^ÿñ«8[Bÿ·{Ø+$8±Ræ+XTèÛ6ì(àEk&~æ–ó8°»©ly‚¬ƒhºø?áÍ&tƒ,ZLJ"Àn#Ê)?ë±yš ÊÍ$](Uåô£L÷ )ô.ݤ³s®tõz ¬Ÿ GÃtŠ)–æW1R¿M__p!ˆr\ÿ%2©Ž %„…ö5Nz™cY€êäP{äŽÇ~k%áV—4iåκ ʼnãÉs›oVrjS‰¶-¤Ð‹vʬáy×­P¡3ÛÁÙWwƒ™¾EN¢Á`‹»‰{¹\Jòf½‹&›Ìͨ¬MÊ”´v S›–`I@V ÓÆí–Œ+ É"b´OÞÅmÐu›ýÿ³*}žñú;gN¯òÑ^~Ä=Sò “"Ö½Ùª¥;‡q@ÎöG-Ìc&^ÚJu1p¹ç!XÏßx$ Øln쥓…kØ.a¸ÿlÏQDJŒ4§7jôÿ%ÿ0žžXÿ;È0[ô€ÐÓŽ"ÖôÃnrؾ±^2 sY#·¸sÜ(?wÁtg#õhÇoþŽ8Q_h€Ti›ËÊ~4n¸¤åÚéŒ.TV9Q”›°WÓfŠÌmÁJ‘õ¶ÊýR¿l®±Z‰^Š]ÌÇynˆ[õÐ=w¢Á…” ΣQC%ɤX`·WDZÌëèÊEEpSò»lÆœ@·ó]DŒÑ–ài„)T÷gd}€lÆ‚Öy_\Ýæ*ç#Í “u§|¦|1p’äb@·€=[·‰­âÛ ‡ß,ù¹M$êƒø¢=u%ô_–!Ü“ÿošÐŽÖ!ž/×Ç‹ˆ:Dßáúò( YåtÃŵ¢º¶6MAý é_s/Ч·Š”s‡Ífÿ:wr’NIûwÞQè›Xþ¦2¿®5?Smz;¿L\4GéÍ/beÝ‘·:T® ÆÙ‹”Àý¡ÃT¡¦cVÄf4ÖÑW åÍ¿™V›æ™€é_E—¦ô‡òq£ãü‚¦óÎy+30?³Í¿h,þM“ÿi¸™?—Zt?ôxÉÜþŠ“ ] ušFóeE‡p [)ÍÓKñT—Mbbr©B µŠ‚§7•.½ –\sÏ¡ö¦O6rC¨^{oZYöØlÖÓeBáÿvÓ ¹_Ów˜°d¦‘]ß—U#”8H÷oýw8îøþCå-omÏÕ¦q’¡q•‚Slí‘Õ]z—UOðjꂬ„¸¡Û“ ‡ÕvÇañuý¢$@ÉZÙç]õÏôó¸ý ñðÜI_©,ú¨ÛçR’ð÷ĉp7©A)óz¡k(j7‰p££c<ŒÑ"Ó§¹]²µÃÎÙì1õ@6Çü$º~J~öþËù?εîhŒ#άæíWÌš5@”<~mfüZ“ì@õ)ðh^‹ë´}‹·ì3¥à–,™n¹Ü¶íÀi$>žaÒ$xû½DJ ”þƒïzúªÇEŸÜxCŠ9&Óƒ¢2}+É*îñö~l­4I³#…VV=«f©ÿ[^¢F!³ÄÈRÔ"oè\€û8ÝAz•Ù‘å?†Ä¾e±Bl Ò‘è߯˸í·Sp:wöU¹ÆÓÂp¿°Kd5Ä_ð· >¢ÉHÂå#X |;¿_n÷¼*UHg‰!ý9CŸë,·¬›dÁxt5}ÇÐìØOY)ÇÙb¨\ý@A÷î2³Êf‡ËÙ#ˆ¾:š0aüºWBÑÛ”ÐÇ~{ÏWq™2Ç/r¯éu,yí4Å#Q%M?mp Ñíê(½îݬúðô:ͽnûHÃa/hEÖ½$âð(v|ÁŽEP­™':½&C…úÊâË?PVÝ(MÍËfîÁ¥ÏzމpKí¾ðƒ ñ@_ …ÙÓtÛ£œÈqÀJ9r÷§ 2¿à®ˆ0õ‚B4²Nk¬Âq’Ú¡µ•™Œ^êú£Ýý“¿Éb¨üíÚIy­òöÁP·Kü±=L"HO^@5NܨaçÕ9[ý§±u.qUQ¢ 7V¾"E—Žþà)˜CúçÔwâçµÊª„1Œü¶¨¯¨,Ö¿øù×Ç©Ñh€šQ`œÎ2rÓý1««,½½˜² “qTÞÙ K8¾È7õœ.™ &Üéhh؇ CÂï“!Oîã\+R—&ñ{'þÊÇÝß®äÑ^XJÒ|–í™X6É[~‰G©÷Ó¢fÄ" Ñ*à}a(ëJ%‹Ö.”a$!&ì¥+`¢µP&­’<ÒÜSS!B)X¦ÖÏo¿%|'G.õ¨êœ«]™Nôå¾ìt¢óËGÅk ¦ññÆB q‹æ‚CWtþìÜOólUM:C±4Öö"÷Uj¡¸ þ͇1ÒÒ«GÛN§oaÿwÇ|_ÒïU/h…l%Ðç‘Ù‹IÃH_+77Šð±Ö×´J^Xn›Äð ©—nãGƒ µ•÷½é,5^ e?ù0—¢Çk×Ï6Çð@ïoÅO€LÑfF×gAûd_£XtÙ°X5¯|ñ©”q‹_]´eUþ`H-³œð¢£/œ‚Éð}ƒNú“9Ä^°TQæÓ¾Ær``é4`dÄ/ã=§#±'-V@ÙF::l׋àØúo»/…² 3íºÊBîÈ9š¯Þ޶α(á§[ â’ûìÛ QÔÁ›|(ç\ç½±oÌ›æÿá;Ô€¢}\J n±*Õ”ÿo À:L•ƒ¬[Þ \j §hx nGSOøœ_‹-´˜øg‡4Žý-³ÕNS#Í¢ŒtûU:L‚~•êĪg­%P • Ë>@à%Õö±Lë·%s´n“¼. ·@ËÑnËéšÞ±€Ððå­››/¸+ü[>‚L‹N›ž&.ArÔ,ïbYnïãhh#s¡°e°¥Z¼76'Ú§›”´Œ;ÅÀ?ª˜"åÏW^øg,=Ræ¡jrÆÁ’Éx‰Py¾pÙ×áE™€“sˆ-+•$½b‹fôƒuA“a‰=›pB&‰ø Ö„Iñª)Ãéâ<$è¢d„¾»³N1ÃN/øöN`é¨3Žx¯/šJБtÖûfpâN ì ÁO]oWß‚¹ ¯Õ«a4}¿ AõcN)¡1@¶¦÷€2&‹2Ø$`c+ê žF,ì´r3O(æ#Å9¡¨.zç­ëB›Å³¾¯3È$èÀþÙ­ÕÜHtÒüéí¨0{6øÓØŠüÛ¸¡O*º©k‡h0)( ‡É@£ðhTF¯µ+­$p(ìw’mx-оyä¿;ùµ‡sž¹üå¡«JÔX5jEù÷a/bp˜ .Ší_Dq;œæù»ôŽGÕ›SÊ[±G¹&1 páä…ÿ†Ù¸¿Ì:8 ¢‘¾ešWÊóÃýcÆ4â.%ãˆ9%¶Ž3’󾔡A0‹5J Æ^@š¬MPvÉ9·s”Ú]¥üx€E ˜‡Éà-%^aqÏS` ï$ùGÍ®i£;S·B²(ãÏLSã£ÿ|ÑúÞðI|v‰>¸dõ¿ü ?azÝÁoÒØÅŽ3oVj ¾7ËotÚqè*r‡Ð¡#³†yñ® Ú„!†!ðAë= ¤¨P!Á*íþÈ¡+ô¯ˆâ¹a ¦ë^Ô•0L¬€î9¯ü/ßž}ØXWÜs–²ÍݰSéÒæÕÍqé÷ä/ümïêÑòÁã\X ¥¡Øh=t’'û‹úýÛFµér÷ Œå?ÿ,Äî¿ó$¯&س"¬ï.Ö¬EG DÝÄÍ vqj¦j¤J†5¿ƒ?̹&ãÿe÷ gFa[‡ç'~@>Q).ê’ü-ÐÒ%mÒ~×WÑ;îÚrœ\•\ šÒúÍxNÄäžhñEtû‘À/žþ¢¦½"ÊÕ]S­7SÈB\¥ìþNÕØƒ¸,™/£¾Û¬sC‰ :1Ê&Ö>Z—WyHű«ûùå6§¬wø€º–jeíÊÔ ]È€ó£ÄR®z2Ä_Ä—Vëþ»GÊœy‘ ^ClaÓíÀÓ½.I̶¤4ÄÂãÓO÷Le.dÇRϽÂ\k,Í‘Yà.–²¤AI#¥ºY2ôÿM³Šþ;i‰lnF]ª¿xzÜi­iCáˉ…¸—q+‘™"pS™\‘ ¨ÌzÂ;GeÛSdžÅÏ4úëTòû3ajÐ÷Tu[ÐÆåA½õ/%¨ýiyÜgœú§Ð(j‘ÔåÉO.«~\ ÏnÒ€GdÉÃÅ@‘$å µžóTˆP*^2šÔd¥œ]Äb?ú›5º $«·‡É’® õ˜eÄØýŽ$#ó· Rz!iI-Ì3ôW,\nñÈdâ}íu‹Cª{[eÀ6Ðò©þ=¡EvÅÏË9®gÔ$ãΔ~…Àx „ù)ÿgn¸ »è›b}Ñ2Æ·cYÇü^…®Þ؆ôW‚N_hCA-¥°¹ó¢å±’Ôúï¨x>1êo9î£I— ÕÈ\ÕSÉI¶¯ k‚Tÿš„ã|ÝRÞ§¤VU…É+4"°f ³F ˜Ìíù4—Ƥãì¢ÊúœÙ±iûÝz¯Ã0';ä¦ T}F²½*Ü3Q#Ñ—xðJ:h¡Ù j8:$* —†cr…0Å»)uNŒ9÷ü0Þ3°Œæjš£®3WÃHVÁ'Z®˜”CÅñIVE© ‰0VÙ[(¶¹0°‡®ÇzŒEYÄ ’$÷ÀIÿo”Ìafb0V¥™ÈáN\Øi„(g¥ƒáÃMûذÕ9»ÞΚDk›â¨ðý¸òQ˜}\UšÐ´©®zÕ•ú¾´…,IÇQ&+Sð^ ›ìQ‚„éÆˆ/’š?æKk°©É6}dIqgë©sìã -@Ô;ß¾7xøåeDŽ©Ø}1Ý­_ ýõ¨¬·—,cx¤Öyè–9k Ô|0HZ‡r¦¥,ò¤â‘Ð"¹7øÑåqéôxÝäü”c}õ×ÜìÍ•ÅQ It“ÎÍÀG ñsÆV0D Ö -²¡Æ]ZÕyefQ^“Gôf#À3ÝZÓgÚ<(§hxï’ËHÌâ„P9Ùç!C8Øñ¹&Ø•²™Ë•HÌcH³¾S6 ûoòßlþ™xå€srêäwÊJÆ ùƒ1Uù_'+©Hð€ù/_Á_(ö©A8hQ(mtgµ!Cp¹5^er²•ofuʘ¯yK®iÿJ*zñB½`ú~Í ½ ÎŽr…£‰?f¶‰Ë2à·sÈïLÔ|n+˜-Ö­'½=C› PÞcÕTa†‡ƒOX2º->[;Ã/tÄòVˆ€KÝMŽ9ä Ø~ж(Çüžšîq¦($´î`Þxb³èbûŸ$€`ìzLÄÅÀøŽ.Æ91‚ý†Øn1Ô®QV¼$ýrFÓÊJÖxû$æ‰$Ë£'¢ ŠZÒAlÚî ºe†lÃÃv<ÔtVÞžSâ¬OÂwß„×"Žm 9ˆ½zYëùÍ%v:L3uúí‚­ŒÛxÛŸX9~íz@m axŠ‹õ7-1ŒY.™Ç ›:©Þ¨NW%$ñ×<‹ûZ6úD4Qç.])¥™‚}áŽQÃoÝITNK(Dƒ+6}Oõ›]¯.ºT¯ƒ»>àGtÎäTГ„$xh 9¸‚ŽÑ öå=Dh€´ÎΛwaâ¶#r)¾É ú׬ Þë|& ö#¦¬I{-'ÿ0·Š“dÜ£Ð:¹_@ ˆýwóRÄmÒöx-S‰»SÍ­4›Ç)7vîç‘!oõøF–´3¥¨š)èêðÎxày†³Jäl”ÛÔ\NÜÉŒƒz1 šmÃ%¦ìj.u\¬j`úïR΄Û+˜!8€Óœ‚‡¬„¶è-®ÆƆðÆKYêáüoƒm— Û˜1§à}Íe€Åüì¤?/^)¥À!8¨…Ötëªòáàüwid|Ê.®{Fk_ØäاD1丗#Ò~b˨4_Œ;\r ÕéM5‚mÓ¥×&€¸Yö ÐT¢ï—'Â9½ŒZ¦[iôo»Æ»í^ÖFÿ ’Ú`ƒ5-@—ä¤%ÂåUýÝ{BÛpC/ã³óÀPØ*w^¤^¬Müvo{orî¤ÝYL†ï4ô>w8Ê~’ çx˜X®‘˜±è¹†Ó!ùµPŒºÿ?4,-ýfYÊoVÂ>7f éÇ?–q!DUNÝò{n  ²ö(hqÙínˆdï2äKШN»€Ñά´%4ð„ßÐ(=S/øT²yRR¸Œ†çPšuєĜ¸-ì+É÷'“«í³I$©‘¸†(õ¹ïªÞ¶Ø H»æƒù^c´5³Ž:¤¹ðò¶¥Ãê²ã7‡²þÒˆ•Ç\HErq£ä Vó¶7>–lutöG­´“’ú{Þ¯›]º,b£Ÿ¶g Sê…cuŸùâö>Šû¬ ˆ‚|^À üã3°Ž¢e8ä­õOѦεÙe1P!üT¦`lDÚ_ÊüE6©‰1¸÷áé0»ÑˆpëmÎj+tN{´øëýôDíÄßÛOJVDùÒ>XɃ }‚†)>EË|hÙ ![Z:Oôá0·45ÑeÖ' &+C”Ð&rÚ fw5vÍnýû$$‰spŽ® Þ'1&”B+©+iëGDv*í½'°‡@½•«˜ðóÍ´uš›S°ªm‚e½äYAö÷n!­ØÅ…FJ?Wa ð}Kˆ¡ÊH¹¦Z‡M-où„'s¨X™:kŽXôÄj@}³ò—t6&qÙzÌsëA× Û(*Ó‚èJÄ|‰æÒ¼¡4«¶K@½yÏ\MûÂ#É60ÂzåTíRÓ6ål5ùå×~.ü±òç†Ï øñ £2°óB ZÚ([n+Ì R )k>¸ÙJ0€H`¤Mã%Ÿ›í§/¶­ÿCaÃG¯¶¥ŸR”ú¨¬¾}U>BýWl«R?V~§.ÛG~Úkýº°ý·¯í¤jgíyߪÓýA—öܰUþ­8Ÿ?@§Ïi÷r‡³áNB=Â-W}êêT…Ú¾†u£è„oUŠ›èA;üЙŽÀìhnœÁæ bÇc@Ò¦W³$’©£ØçmŸ4äx$–KÁiŰã“­Áì”PŠØCç]2Çn§êôýÄF{Jõ™GmTw›g„ýAë=Ñ©Š_Å9h¥B›U\•ËÆpýœGÄŒÁøG®n:K'cY\òbèžϬ«$¦Lc;íN'8U(ׂt^3Ê—ˆ¼VW½Ÿ›]DI„˜eiÍÏ?8ª6!ŽO¶- ©ê¥ˆJÀ0 zûlviL°Y–Ù7s‘ÈÀGB3uŽH¡È˜~u§lc±}|Ì5Á}«I¤õ¨øÊ6Ú#*Îá+ mqï:ÚÎ] |8åÖöÍ~:áŽÈFc{‘߀BÔ¼$ÕG‡ !ÿ ÇïÍK²ÓÆ\¡ï¡ aåþZ2j¾Áî½Ϥ.¹ÚÁnkl}rÌ ®2S>Žu÷e·/‚Už+жÍ=`q#©ÀDxa¶Óî|ÝÎz¬¾ñ¿ÊTýŽáµ¤/€PH^ºï·Œà/S¾ŽÑ:›ã[AÌ€x-ß'E¤QàÄ Æ·ôh‡›¨PZQnñ¯±DÃÆ%<û±LÁr·©@hø©Ž_üùØ×ˆî¥eÛé^ª-áªGïîT™Õ?-‡_5÷;D?©Ï²E ë­ëFB×ï¨ÐT Žú·3ÞßSøîÇX¤<`•i—*ÇÜ‘ÒJb´ Ã[xh×8¥Éùâˆ;¦Ã(ßݼ-»ýhu÷&Fr;Ç1ÊTyˆÛ»úvé.#¥¬yaëÍÇ…/rpŠ|™iØTØ d*žð“` ɑŘXHíïþl Êb¤¨ndŒºÚŠà¾Õ¸-· :áŠ5ãw5¦$;¥±7CĶÿMå‘[ÿ0qVÂÉ’¶{„žóRu] „ yæL“Õ  w|ï·ó×Q:öžÂ,H:÷ïi2ð4…‰ù¥ÊM5Z¡s`¬Í¥y™Ì•é × –I©fóÍr„›½ÆŠ2 £,–ý$‡„ÍKCçß½@ÕÁ^®ZŸÛâ/ù3Ž8fÒLM’D/HçϬe´ ª_+ÔŽƒh!Âû¼â>Þ„4ÈÉIj+«øæTE 1®á'ë"¡ì ßxËÛ‹½wCuæ­N7(βn·*Gs´¨ÀÖÚô%À‰o¼§2òéš j,s˜œyÚÛǘxˆ™lõ©’®G9¹£k#¶æõQ~dbŒ.iäë]]¸¥Zj2Hw ré0AYoH ~ƒƒ6 ùd k'R0]ßÒþPøf|’‚€S}K&‹Œœ¯¯ª– êËè,ÂÚ¦¿5¦¡oþ8ËŸÌÆ%Æ¡Cü8ˆ‡jGdª}eç Ûΰ–;hà$•õ(˵ÖýŒé›ò:SÆ3GF:õD’nçŽ,à8`^âemAaWè ¹õ®­Ê)ÚšXSØ×%šý€`šfÏóMnofoz륢€³zt“–r"R]D”§G+GoøÈ껹†šž‡·µqéÆfòœæ”p–?Ï®{ ½gü“J…g¼\5t^,VòPšX*Ú´ã2{ú§ÞprKŒs*~—ÈÌ…€XK½!˜á'×Óðíûí¸µI Tæ÷ã†î Y’ªëå.ŽMV”|å‘pÆ¥sºž0#-º Sf>š–Bç» üMßóœy×~ÂQ§qm7ú ¾ZÔS…~«šMá‘Ç|7)& SZib"F¤ø’¢L-‹´Õ½Ç&šI46Á™}õÇ¡ªçjx&¶~PמÂäÔ±=Y¡è„’¬™T¡Û âq˜°Ø%/Cì<•…¸ ÚC¾ÔÕλ¹‚ ýKM =¦´Eäf¥!WBr8ZHj}…ØFÐf˜ý&ÂaͽöTVÒ~yß×þlª)x€âú™0>‰`ð…+d耹6'B1Ö/¨³Vù+¹p¼|ÚŒrX þr‹³:Š™±NÑ™Ðá@ÕÀd‡I¨×07,„õ9ßâ?pt° Ð…Ð!óë¹Æ‹g „–ŒvF òÖ3þójƒ ¥Ór1Âɲ)A=‹‹d;L`Ì@ªyíœSß»%À••S±¢¡lܧ¸37åøPR²ŒìßÚBªÆ…Æn8Ä|f\5ERpÔ(Ýé{ 3‹óUªD®Mb9fÒÙ ¼¿=ꪒŒˆC6gÛsºÊ,‚Ç ù$Çx1F¢¦\éÛL5Xyë’’2ÅxÊÄÊp¤ÓXp§n)ISy˜˱…£xÿ0ÿAˆòœÏK͉‚S]FÔÍ¥ñ·,áhÊgs¦áµºŽ_ Zà§Ô9ÚyL›ùj–¤ÑÍeÔ*£.B.®³Ô°t[bc,F¾{Îdï{}F†Ò*ÓW(Ž<„ÄFA$¯‚·ÃÉŒqÓpdëuµ¼à÷»øo€']\’£ý#k\¶˜Ûf¨ Þ­øŸ)=ŠÒ/Rq–à»òüßs©É&©Î±|`~©5‘EÆuoQ˜rv¶3€…™Qæu¬vã”Ki9‘Âä“Yg|hltøöqßÔ@7dÂʯû–ÒVKï7ïZr:v4:mž)©w,Ôð€SI¹Í¶ý £­™%j_¢Ðp/16=Æ>0_ ʹ¤êÔF¡m¿ãDÓUõF´BQÞ .áØ‹Øä"ð­¿|KKTcH09u:‹s L÷›áo‹ ü¼ÑZ OT±ô¬æ’ÏäÐ1Ue£e×£.Ôˆ‹´C^ÌÈx&‡¡`3…NGSÕÖ²P¿|8¨ÛÓ…×®LÞFt÷‹Ê>…-¶ËHbVŵ£^ üHM˜U[Ø‚1© »ŒãÊ 0h(n—–%´ÅúpƒÇ!ÈhÞ=Cx&lº´=74¯#½ÇKAÍ/]ì)”©Nv1Îý§ ÝDµÉ€ÉÝ?¡ÐµvnÌû4þ\\ìcu¸ 2Dpx1À¾žyEÞÌj¡’ÇÖ‹Ç×Ñá‰á¹@iê,‹§„êD’d•#=¾ò_‚m—NAÕ ŠÒjL‚az'rX0¶¬"Q…9úñA8ßKL¨Æ  §Ü“Gò4Óˆ8fyê9Dr—Õ'Ç™‚•ÂÇ×õeãÂŽTréèNËÙŽIal¬(šÝ誖ÈNkCÖ`; ¢ÉIóóXKJ%Ò8š§Ý$/¡ÝfØÄàj§ÒJA$¾ø¡­…?Iœ>Jв¹–j=V3W8 ¶W\Å¢ù+¬ÊEnYl[öŒ´þjS&Wë÷ÿ/AøÉŒC Y …¬öt7t›ƒdœóyXÑ\Ÿw};Š)¸¯ä®Ã,ïèatÃ? ”¦Ý¶Î:IUe¶8 ëÆØI÷ ’àHgÆâë½#ñÉ i„ÍN'Wç¶ÏD2‰L*ìRÎ1«ü#u‡ÅÃáôÌ8Åbìþ²ÑÛT“–x‡i1³>&•En%»Ò `Œ4h†¥²~T­µÄ•f ¸^Š8u š˜µéu´1â#j8w…Ù}ƒaÎ’M>§K5câpûDÓj°ÉÅÆÛ&z! —¸]€Xhí”-;Ïïðßë%­•Ó%em2@Ø™ IÛÚ¥ ÍT)>Ñ”h÷1`ìSzþ劳ž'@PY¢ùô§Ø½ö·$w·P)ÜëÍï‘|‡ÃgJ³»bλ‰ãNH×ìÈIu‹¿´¥] GŠ þH^Ÿ½+Ä×:G¡hØŸ7mïX™Å:mœ#¯Žnˆ5<Ï£ †-D©UÌãn.,ç«þÝ“PýdÈK½ÙJŸÏ$Ù×±4(´I ’‡+üõØ@ $6 AµB1Ÿ¡+[™TÅv¦~47¼`ö8 IÀåŸø®eÁÔ_£ßMç}ºÁ$nuò,]ëÌS× œë¬$Ù=Û‰Éî`Løx®ð­n—<ýþ¿—›âÝ}ÞÀ{M? Uµ£ù—?3¤+C®4ò—¦iä §àœ¹¡åS! XÐnEÉîÌ‚R¿ÓºhWJoqg"Îv A)X*vì' DRLY\ÂÇ#Ë|¸L[ìO]Q`'FºHÂŒ‚Ž>Z#º3¹³1³ˆ×Yq¤&˜7𸡠+IvZMwÞ²ß1À£zúÛks:0ÎaꈭéÄU¬c"þ#ŠK^Ú‰Ãc%î­×=–‚B÷©´‹R6oÚG&­Yd;¼þœ.n‚Omá4|íZ°,JN_â!£Wø&D¿‚ÊÔߟ ç]q]ðkÛE&7ðæ“)÷Ò†¯ñ˜EHOT$âS9n¸–í*6ô‚ô¤=ºz>æùãîm3²Òlº…TL.žæôÿnóXáuR°èí>Š-雉ü ¨<äè¶²[µ þêªÊJ>-Áäv~ÃiÔ§Ä®VÖÏÅ\Z"÷”Ô¢û¯<ÅÈ@"Zj8³d™í+‹ÿ0Zy›¿à/å¢&y ÕXGÐ\¶pÌ_%؆ùa> v2ø$yz±™à6à×­ Ý¥âV]`$ºfaXC"Ö’¸©¸ü3;N/Úð¶‘{/À…~–¨ƒAaH[¼2ÚC Ñ£Ë/D+–àœ©ÂT¬EбÙp~YÑWì΄ö²Þâm„QªZ|C57´˜å‡Öa #Õu&A2ýÏÿìÙ’ ÎBGŽ’¶ešôEEŒ‡›&£ÂWNÛæ$¬;`ö°¶K]t³$³dŠ•\g¹*[ÞÀ¾O°ívèÔÝõ?'aA‚òŸ“-B4KÌ¥ ôwTÔà€íªÿ9f·¯·žù‘ç틨_-%B^œã®‚BAN"IÆNÔ8èÐUÊÍíOã¹d™éÐí¿8|¤}"EP´WXc+åÿ{°`] ÑkªÛÄÑPò F¬…°ËÐJ9~L ¤’w/ ¸÷õiÛâJp³n“o”ŒÑŠßÀ†µìóL+üœD ¿™Š]híLBM±H[Ç ÙHl)I{ë 3*ɰ@§´$¶å`|ðc<¼>¢tM¢0*ë÷gi%ÖtL<Á8.²X)0Ž™¥«»ÖT¥(àdmQö 'ûw-’{ ÀÔÀÍìàÚÔŒ §³»)»ŠÓÌgbröûÀ–¤<uÔ /—¯š1u<^‘Ûý÷¾¨Ùû~ÆAÃAØÔ‘9@ÛÉ‹mqGJf+{5é1I‡àÕÝÖñJS~Œ^Òæ•WÛÓ×Êfp·õ|#Âø$æ3PaMGu{¹Cû3Ò'œ±¹v[AÓðâš%½q©A¸µÖ"gÂÿj7Ñ @n9×·ÙñL{–¼…Ø^‘.idA),YíctT Wî¹K.ëèØø›IN{¯†õ€›q/æ¶—Í¡µ}ÚB=$Ø‚lÔw"^Ÿ¡ÈDsý¤Ú6âb˜(dGôî_ yéØò‰«À”»h´àª·±X3øR®6øTMo‘ù@Â¥j‡€‰¤­†åæ]uõw/ü'ÿ€ûåäååìcw®™Íz}\×EF’n\gEKÒŽ8F¡.ˆ¾w°Y°h“ñ Iw.‰NQ–Ý×­SÅP¨YC<,¤¼‡~©*|(~o—N”›;ðfÐ`ìÕ9>@‹1üZ·OŠò¤Aq±. …àÑú=•Ç´Ÿ:¡Râæ÷ÝÒJ¦ElÛO¼ÊŽyK8rØL5=àpEÝ%‹!Òìi¥·5ÆK¿7÷ÞùàÙS[Õ‰6Û%J—B‘Œ¢»ÝLÎtì «ØÖÔ–ž¨Þr'd°ö¿«£¦çÑŠ5º ¹,–T ¼[ª=µ;9—Y nùÒ¿-”Á7l#IçÞÑQÝ •œý‹ßâG„à2Ë&ÿþV°ÿWx}`“%E˜ædZc<1Ò³4eH±+£ßF|çØ<™³/¯"‰Fæ¬Øù5…†áO¸[ìQ6?ì ¡'ÝRRi:aÔ1ݲ-϶…r~M}Øù?ý¢”8bI'ÜDD{yxñ#ŒC¶¥{ÀöcœWðÿÑ@"ðþ.Õà_ãcñÇÓð.n{Â1ìá9 ªV1èû‘­Á}ˆ¬t^¬îÁýhµDZØÉtÞWÏë,ß E¤m†z  .âmüèÓ7av¡oÆlƒd_ Û“Q?CÑî£Ú«T5ILeºý¡ötÿx·¡*¡­3Äê=x¯¨*VH‹=ÖFç½.‘ˆÀSʤF—¿—{êZjJ&1]±™kt\¤Ò¸QæŸ*B™î£øÜ„9»û¼ó_3Dv«^ª9É76ݽ"ND¯Ô¾ˆãáD꺾½óĪV†@6 2PÁ¸ä{aB!óN›<š'0yÿ@A]z”(ëb㳦  u剺» ¥q©ŸÿOOþîš6&÷Ê2ëBF…¯Ãÿ:0–†›ò°~É’òD@Õϧ¬#Ù½yR‹£³ÇÑiôÜ‚<—›9i1Ü ðy¡Ã¼PÆáp£í}¹i•(¤”Õ˜3Ú@®,A Êý“E¢w¥—»gh?tB@O·Š‰øF€É'I^¢I†ú½ÈiìñÈlF96”keºfü h¶þùTÛEʼnûÓ\„‚̇€Ä§gÞNË7é~kèf´t‹frí£G_µŸëg~‹åvË« ×úïÈHu¾ñëCî‡ì3ÝÉW»Ù‘/·~;M1²¹—Åæ°þŸ:]g[aÊ(8¹}V[ìˆ9g|——ÔëÎÆñ1pB= §Ô[æãØül`[lçY/i£~Ë[¯†m £-™p+ÂM³ê×ÅÐ/;#@«Â0ƹ¬æÚ–ί½Í¨—q¼ËÃúe‡D 5K¦±Âæst\?,jì™ ûv ¯ÊÖjõíµ/›€I¤y/ ï=ïBªx'jÚêí7h-–Ò&Ê0p®›8Þ¦±‹´u“jp‰2e°£±˜ð‰egkì¨Ì¦¸ý~¨È½À6ZâTûê¦ uÜ‘aP]UØ—Ú!+²–yÒ :EÚÂûá’Š§Úà¬jFnel' +É„'ô)Ãôì)ža »rw@. ¦óÂó6%'²tö/§u¡ÏÁ±l¾´¾ â¹ö÷UÊ»¯‘낱5iI¸OÞ+‚EF´dé·PÐ#÷÷¨3W S ³ aU4è·Jߦ}þ­ ÇÉH¬çuéK›„z®©Ñ1ßÌ‹þ²öBÞŸ y=µß6âÕM¸*¥68.OI§áÊÄ)!öuø㳈Q´-°VB@˜¦u@3‘– ßÚÆÒKÜ©£Ã&S8‹2F{ÈýÐ@•ÀŠ÷ØÂ'1iËCóaK‹õL¶EI­,ª$JÖ‡ÅÒÜ>æ–Ï>ìJ¸%Ñ‘¶JÎz^Õ †ÑkïÞé{Þ*øf†ÂÎW8†2p9®ñ±»p¥M]™–™Ž¿ø}ˆ‡—`¦Ð ó;vgã%'ã úŒÛü1¯¾ëìvT²øQ•Ý”‹CYèh…ÃkbÑ2ˆd€{×$®Φš¥jÿ F‚~ô*ƽµþY\¶ß±ƒ°æO¦§ù2W´ %=¾DšqÆß+¼êZ½1­;$Ìú#¨Þ(MšÆ‹$%ojÓôn%W¹]û åHH @Y±ST¹|9,r´¦u$ƒKíµ°«™«Bvña¢h¬/Gv—œHŸCbfÐEdk˜f° Å[ÕÚ ЧnÊʆ‚,é–µOÎ&:N‘ƒÃm{#ÑwFrµ×ÈJPö©¨UGµË ã£ãÍÖ(ïô<°¡ñqÛ´¯RW\\Y½G=Z9ÝØ" ÐG®Uÿ µ0‚uæZ·®é®>±ØJ>ɽ9ù-žò Y¾%^YæÛaý&†ƒÂ©Žû:ñFè&·¦ S»NÊßë] >q0åyÞb°†Èÿ]l…F­­eh¦\¾ö{*¤Â"ƒêW2Æ]—{aÜZ¸g³¾¢3ËE%ÏFÕlvlÔÿtÉ„ÿÙicnV Bðtransmission-2.92/macosx/Images/PaxHeaders.4960/Magnet.png0000644000000000000000000000013212442116641020277 xustar0030 mtime=1418239393.138740253 30 atime=1418239393.138740253 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/Magnet.png0000644000175000017500000000270312442116641021726 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzôŠIDATxÚµÓyPUeÇñï9¼¢¸$æÚä†hS˜ãÒb¥“iÒúG5•f–©•9F5VVZ-¦ÎH9n™&&!‹Š &hB)9ja”©åžéo¿Ëœ?·ËâhÏÜÏ;gîó¼¿yæ=ðg‹Wš9¿¹D¶3Ë+Á S—õ7´þåú˜ñÇ"#ï>W×@¸ ±„&²Ä£Þ° ÐùdD«áåN>íœ@œŸ[FŒØ^PT¹«l_MѬøå1ý^®´¬¾UÐÊ B#<ÕÐòˆªèý\ñ+Ó·”–ì®ÚYZV½·SçÇN)TÀJk€«òRqè¨9|ìt­Ý{ËÍ–ÉGJGÆÎ; ‘5 oÂÒ­w ¹íÍ‚…K*¾ÿq¿9tôTíœßÿ=˜²&Ãé¯+mêKÅEе'À_RÖ"èœøè˜Ën’V§›Ôo²ÌêôìZk2Ö›œ·Þ)™×NO<àài—I`φÙÏMÉIÏÞX\ýµ³’¿^k¾X¶Ò$>ûüÕ½Ô¹K°oÒõP]hY&µCóÉÛÌüñMâ‡óL^a±É÷TòÛ 9¬±€ƒ .ÁRÀÈ´Q±»ã{“87Á$Lšl »Ã¤téj6Û¶ÉsÜÒl\剂{µFsÖå dÈË={™={½ñ$DÜĺ r,O@ó×;v|zZL?“¦Bθfþ&á Wi¾OøÉ“ r<ØBh¤"5«'ÜìëI 0ï¸Üó/® y€ñ—)qÒ†¢á4^A¡åëI’@3§B:*ÎW˜¦ý Æ_ºÌ”¸ §ñòØÐe¦ ÐÌ÷¡háÐbäý Æ_¦Ì‘+›ÀöÂÕ¾žT 4ó3Ø´ç+bíãoƒ,ß%mê"¡¿¯g­š¹Ê6â'À[°¹Œ¿\ùRbᵦÞaì*0ë%ÐL…Û´­àÈÚÆ_¤ÉlØ\AãåIß8oP ™s Ä½KZ<K Á’%›¡&nlê/« ôÉ…óÙNø@ó^…l÷°$ì.xc£³rÙ²S2a¯b·,”Ö¾¶–€Y'¹õŸ¸ß€po†Óè/[ò¬»€>Øb9ì>­µúþ³U²ê™•)ƒ`êlC÷%p<L kä;ùS¤¦¶-€Äù°`äëY•˜ÝÎ뛓çà h†«l‰ É©`ê“ì¬ðˆTú9&’$ ͈SX “xp•%ázúÀR¨þLC>—ÉtVê<[ÙHßré “€ˆ@÷(X®ëÂ,ûÄA ÐK¼(K"Zˆx8µÌå4þimz•ƒ¥Kˆûª>s9èðš~ð.Ú°4£²$T¢¢aæÛpAÍæRÄCõ@HúJs±h¤l —èN0e2ÖóÁEzOâàd7˜\'-Ŧ‰e;i{ÃÈÁðÅ8ý&˜Y˜!/À¹[auÜô–bs‘eIˆ\%1Õ â‡Â†G¡|²‰ã£p•c b8äõ„š¦¿t’P±¹„òH˜¤· ”¡2BFI¬Œ”a2H¢¥£„KX\†²œ ^i.­%R:8ÚKçP¯xšzð¿‰ÄhßõtIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/Groups.png0000644000000000000000000000013212442116641020343 xustar0030 mtime=1418239393.140740287 30 atime=1418239393.140740287 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/Groups.png0000644000175000017500000000242112442116641021767 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzôØIDATxÚÅ•}LUuÆ7.oÚR6Ú˜6Ôe±eÈeBš š¨¥ IR„º•’Ä»  ±U PH2­Í—sÃײpj((/e‘{Y‹„MAT@’{Î}ú=ì²uÜsþ¸›ÏöÙ¾û½<ŸóÇÙ~€GÊ#ÿ€‡Å¿èJ F/÷‘î±"x¿øVlÚâÜâË«vÈÖøÒr¸v²›ƒÑÛÛAîç?ejtn‰9ãh-ä«·PÝ­¢ú¦mlº‰*p˜5î¨`7Ñ9;-tJŒ‡§—–íÕ˜ÚU|er¯9-gs³Šô¦ä4ô!µ®WЃœú^p-[ìu즃.:é–f.\ž¹~ßyìnµ"ã Í—€äº3÷‚1wÝF[÷0ÇÍ=b¯ŸgœvÐAtKaÉE-Ÿ¹Ì&à” õ6$žìBk¥Ži뾋ĊØ(ÎhõÐE'ÝRd®¬äÕb]-4Y{Þ†øÝ8ÔØŽS.Öâêæ]]yuƒˆÜ"[¥°,YI­êGÂ`Þ­ÀÊ=è¿w£éëŠo¹§«ƒ®´ê~„e™ivRa[¼Ü‰Õ'ÄUB“Ø ‹÷wbë‘K`l6Rå&ļޏ“ª®ºè¤[ xyiaÄöÄéÇÒ64‰9:„ù¥-ø¾æO”ž2cÁ. bŽÝ×u—ºè¤[g0†<—PÜñzÁeDᅢ¨òaD6,’±ë"Ê:Ä|kš÷ØM]tÒ-‰<óø“—M_]Ü’}s ÿBxÙ-„Ó뜲„íºI8kžg'»é ‹Nº’¯`º»Á¸`RÈ’=Ób Úg¬••™ëLp%ìd7Â5_8ƒ>iœ`¼`š T.ˆ¼ébØÉî9v—߈Ûw—À_ȯóõžìJÜÜÜ‚ìÝ“ÆçÿãiðöY›‘[te[’lý|}9\I¾èÝ-tÐå Ÿ8~ÊÔ”e%æïÒjqNüTÍ&-?¨N¹âˆæùfY»é. ãéá国Ór(»M%Vü–oCSдyl2ïãô§}8Ò‡:1sÍÙv²›ºè¤[zmæòÌ’„Ôæ¡>¨O׿bºŠ_>ºÑT$_Ç…4U×]:袓niÝÜ¢–Ã_ùMVÔn„.Îm°â`¼£1½oF͆aÝ÷颓n)õUY9¾¶g“€_upæCkîâ똌¦ì®qOW]t¦Í¯á¦9²bZÑ…Ê•À)TÄ£2³ ªbƒ=œ¹Æ=]tѹiŽx ß›^ØVaÆÑ¨ñs44ù1ÊŠ½‘£ªÄ {8‹µkbOÑÕAtK¡—f?_…ݯ\Ç¡y*‡A“sñåK¿Ã\Ó…VÁbæšž»tÐE'Ý’ÁݲjJqÇ– ‹Ø1«{_Äþ`cL¸¿{Öm…^%bþûtÜa7tÑI÷Èk8á±ÉËâž,îüdr%rŸº„mfä?mqJ^@+¶\&bÖ>ÏNvÓA¯¡‡›qÁlÏ%{Þö)hÿÀOVýLp%ìd7tÑI·³×p¾‹} éx–Î_C£ý¥ ´Ý ÃNvû ¼ìN‡¸Ù¿È ð] ;ÙM]öü.À:î0IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/Remote.png0000644000000000000000000000013112442116641020316 xustar0030 mtime=1418239393.144740356 30 atime=1418239393.144740356 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/Remote.png0000644000175000017500000000254112442116641021746 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzô(IDATxÚÍÖkLSgp/Íç43-‚â ”*rRQ´@Z´§§\ RºáÐlfš±ÈE"¤›Hq8¯É"’mDY¶a fqfA0˦Æ/ºi}>©óößó_™Õž„Å¥ÛI~9oÏû¾Ïóïi›žqÿ«£¾¾~²M|Þ´Üf³=lhh€'±ž¬7 ð°§§N§ÝÝÝÁzQO) €¾¾>¼3~“§¸ðä7Êg’/|¼ÿÔ‹…îÄh6aJ+D‘°ÅYÁ¬+‚q­ ÚxÉéH KFü¼Õˆ R!*0³â\ÍŒ•,#Y´ kçg¸ ^ìN¼ 7¹æŒ"Xt›¯±À¸ÚÝ ©H Kjþ¬˜“ˆØÙ*DS‰âoQŠx Á«‘²@÷2ùY«L0© —lFNR> ªlèbôÐ,Óbm˜k¦ 0®Ui58(F“鎛špÀp•©»iFBP"â(àÊà$¤-ÌtG>€Ÿ,U®DLÈ>N„.rô‘FìlèÞÞË¥—1P:€þ²~\*»„¾²>ô•ö¡wG/œ%Nt~xõ™ 0*s‘±h½;ò„hbŒbl–4Þ) Áž4+2Cõ¯!@Xn€èi|,÷nÖÜÄ=7¤Æ5ºhCuH—ŠIÊ3!)H&:š;”}w÷ߎhZóíÂò”z” Ki|"¿ ƒ{ÑVÜ1ÜíÂtd,H‡9¦»…Ýh,lD£ùKT髤k"7.6  b#ºJº€£À©ÂSìš ÙÆ%Â3á쬇¸x}¹* „®‡~Q&JÔÛѵ§ C-C²áŽãíƒr áQÇ#\9p•ëÊ‘³Ä(©M¯ácWò?Ã%"g@Ci³ È£»Q|ÃŽaŒ´`øÛaüúõ/è¬=‡Në9üÞúð#€€§gŸÂ±µyáYräÐ$³ñùáFIû'm¸ö>œû{ð©úcäQP"­7+³Q¡)ÁÏG.€oJÚØ59òÞ[š+#Gb˲Jg‹2ÅQøÌ°“Tbs´YZ÷>±e[ùYò>Xfƒ<ØË›qÿÊ=à€ÛÀ½«÷ÐZv‚Í…|€-ùcÒiû¸<¸õÞ~ütìmë~ù[—o³£›mØcÁ¶X ïû'{ål‹4{‚ûôÍ&<@æyà?ðz.^ü e›Wb»%]Î{>€ÓyµeÔ–Š,Ìk`¥ž¾ý.¥å,‡={,g‡B¡O§ Ä‹¼I¦“Ù$œ$5I#ë´ZíwÕÕÕp‡Í±5|­šï 給óÚ^¬ï9z°o¼Ð\A‘h’È‹¥MEEÅ€Ãá€;lŽ­ákÕ|o4¯¥x‚÷r 0x“)ÄŸ„%‰%*²Š$X¬Vëúº:¸ÃæØ¶–ïQñJ^ÓŸ÷ðæ=]Lâ“ï’9$”oŒ ‘¢(6577?niiÝnG{{;:::$§OŸf¤ñ™3gÆ&¶‡ïUòZsxí)¬—»^ćLã $ˆ³Í>>>Q3fÌPûûûkè]j5sçÎMgèó”^‡„„hh¬öõõâ ƒy ¯9÷ðz9Àx2‘xóÏȼE¦’·_ÓT^Ë×öf½f›%}þ6áI…“@IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/TurtleTemplate@2x.png0000644000000000000000000000013112442116641022410 xustar0030 mtime=1418239393.142740321 30 atime=1418239393.142740321 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/TurtleTemplate@2x.png0000644000175000017500000000044112442116641024035 0ustar00mikedldmikedld00000000000000‰PNG  IHDR$$ᘘèIDATxÚí–Q „0 †'a€„I8 H@B  “€$ ¡JšãB¸…ÂxèŸ|/–omFˆèU¸ ¹ Õ¦4 Ó3“@ÌÌdyÃC‰ÌÀÐ ÈÀÝb­T ˜™ö.<ÐÁ)ØZ/U5—Ñ锵Gµª‰[›L€ŸC‘Þûè:òQ@“é+É ÓìeºJ"ã^&>Ô¦™ÙxRO¡˜á")„ÌLÆ‚hñçN†BS0Ƞͨ?YÌ+´[t)œK­"Wç ™‰nø­Ò…4²£dtmIêHÐãWXr!r¡× ­‡þ1·öðfIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/FavIcon@2x.png0000644000000000000000000000013212442116641020763 xustar0030 mtime=1418239393.135740201 30 atime=1418239393.135740201 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/FavIcon@2x.png0000644000175000017500000000427512442116641022420 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzô„IDATx^í–[lW€¿™9sß«½q|iœ:v\Ç&Ô8$4¥‰Ú´…¶¡j)¢©xDBŠÄ ÷D…@*•@E¢ˆ *(E4½(iCiÓ[œ¤±±Ó4‰oI6v|w¼ë]¯wggg˜u¶jÀ­šðÌ¿úv.:çüß9çßÕáÿqèšúȪU¿ÚÞ¶ó±[oÿfïîÿþü®]?Lß}÷î[¶ìÚÓаå¶]s= s…!ñáa­^ݺµ®aóÛ·}êž;îÚoiŽQ_C×5 ‡‰ÉÆÓôö&sÏ=óÜþ¡¡7~?6ÖwÈýÏáp}[[ëí»×4ïøÒçء߾£žˆ)!IHàƒøË ŸÅ¼G_ÿEö>Ùíw¿ùì“ÉäëOOö_µÀš5íÛÚÛï{dmû]7|êc|¢S`kP,•B²ª)ºç Ȳ„¦ TEZ‚!ŸƒûŽñÎá—FFFžýv2yd+™•A]]û¶¿¼§dÞÔå5]Ã’±Ä|ÞgzÉgrÑ#U”H¦\.dK O;d%…dÚeß±IÞ<}‘´YUæº7±ñ–ûš«k>³v^‘@8\ÝÖØ¸óÑ…RG“Ý|-×m¨GG˜ÊËÌy‚¼a2[R9Ÿöyídšçßš$9ïâª2.ú'J•Xð :ÍÑ3&—êfø¦_C}ׇ X]ŸÝÝÐ|Kgcg5-õ,é¢Â…%ÏÊLf$†§žxi˜}o&YBàÈ:‡ƒDe‘ÓcY?0ÀÓÝ#<ýÂ!zÎ “24bÛ×*ZëO›ËBá²…¶Eb;~qèÄ‚2p~mUñ†*P$$EÆ“ à¸!s]S‚HÔÆE& ™$QR…C§'HžŸ&ëø\(z%sBj´Uõþå8S'©„à½Ð=¯æÁãÃµÔØ€7xýH/zmˆ¶¶Z\À-®)øÁ€áh(Hªܲä¸ô&çÈËZð,³X’qAWÁ<Ðt [ßòõlöøs@á¿¶ ´Ñ~/«×áGÃ`ëHÕ!¦3 AÞl2yi™¼+1“-’^*1‘vøû+ƒôMÒýÚiòN¡(hº@64$S‡EJÖ°V·ß¶~ý-+j@Uë6jˆú±0X:ª¡’_Ê•o—ÑdÀÔ4¢¦‰‚^?Éäè,¥B‘pØÀ¶4,]`jÃȦSC‰Å©km§PŒÝ¼B@Ñëoð °M0ËÉfÀüô,§†“º¿ì¶À2@W}4ÍãèÛ#¸Ù<‰˜E$¤2Uìÿ@`*ÂRq …´/X×±ië Y¯Ù,‡¢Ë¦Â؆ …<=Brf Óð±u8Ü;Àó/åä`’ÅTŽD4DÈÔ e –dU¦J¨,д±™®;‰&ê6¬0cMZ¼ÅÒÊ3/›—g³,D>yž‘³ãDMÀñhl¨%=»D˵ ZšTÇL*å™W®J9ù²DÄÖÙº¹ aGQ¬Ðꕪ&IBF¨2–®,CT®:ºl+1Aßà87o½–;n¬¥fU„¹é ªR°ËÒVyÙ Yî§kå1.½³†„ÐdM—V HÞ˜çÐuÓP1*ƒ˜†† ÙD"UœìŸàåW810Ig[ŒÚU1¬o _*ÀÊ6Øf¥oyÅØ©c¯Œö½üã·<þà±2P€zofgfr³'ÊLŸ;›ZÈDŠæ5‹¹"ž[B ÈàúD•<ãYžøçS¹³œxëPßþ?=ÚóÌo5qêX¿"às…¡Õ@ $ºMÛ„h¾#Ö¸í[n{èñí_{äÐÝ?xjìþ‡÷g¿øóý‹?~ìã»vÿôÈ–Ï}÷u>ýEo½³Üg¹/´TÆÒ®f À,ˆÙ 44¡â+¼¤ËʰB©ø »H%Ç-‚ë@jÈy tU5PA¹D"À ðdðËü—¼äx ˆÌP¯ÂŠø7Ï®#¼û6ÿIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/InfoFiles@2x.png0000644000000000000000000000013012442116641021312 xustar0029 mtime=1418239393.15374051 29 atime=1418239393.15374051 30 ctime=1457295922.645852897 transmission-2.92/macosx/Images/InfoFiles@2x.png0000644000175000017500000000120612442116641022740 0ustar00mikedldmikedld00000000000000‰PNG  IHDR((Œþ¸mMIDATxÚÝØÍŽÒP€aû«ÌÐ6³è$ã 8J†bŒeF£1êF;7nüYy ^V„[`ÅM0ð³‚;8¾CÚÐMshËIÑ/yÂöMèáëáŽb¯ý{FKE2» Ô ã0¦œà0t:4Õ 8),ñ 4•:lø‹Å"Ñ|>­VKA :ް,ë6ò5Lèª ”p±Z­-—KÑn·E£Ñ·Óív£È7° ï:Pƒ‰2j)#U:¸H_wôL–`@Ûu ‹ú¶¶m¯##<“ÑÁ9ŠN·ŠÀ`›À~¿¿ŽŒãàD'8€Q@ 0Åh4ãñXL§ÓõéžL&Q`LhYµ¼X`jDFçpSJ7…'x¶ƒÀ‡ðÒj0àBlËó<Ñëõ”æÞ¾ï‡‘j  ’eS„‘ª7?Äy6E©4ÐE=Ϧà™Tè!ȹ)”6rlŠý  ëmqss³Þ³Ùlý¹’€ý” W]‘ð¿ð?ðßð8E~Å[¼Ä5®ÐÄ%j8–¼n)|‡'x„sTC§ðáÀ†^TàsÜÇ\8(‡J°a@+*ðqwL1zWT`Ö&&›¢]˜ Qÿw`°ƒÀº¢ÀÍëVNpT:¨à>à>oé#Þãg(g ”¿ò£†K4qµ¥&ž¢%NÚK“§¨†HTQIØÒI{í´QB9äl)¾)¬Í¦O–‹»cÊÈ6…ªÿ¨µL¤#ü HŸHÆtÓã¼IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/PriorityLowTemplate@2x.png0000644000000000000000000000013112442116641023434 xustar0030 mtime=1418239393.147740407 30 atime=1418239393.147740407 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/PriorityLowTemplate@2x.png0000644000175000017500000000054412442116641025065 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=ø+IDATxÚíÕ¿KqÆq ÒÀ±¦ZŽšÛ#hIkow-ˆjŽšÜkŠ ÕµF‡èHBÿCmN&¡Oïà áð×ݽážßÏádFRªþ?0ÐOÓ(ú™TSØøÝ¹†'”TE°“Ý~z8@ã–Ã>ºšÈ¬à ² ,cÔ–p;Ùí6уü¼A Y *‹"®ÑìØ‘;„ì uì!@\ÏÔ}G»bº„¬ƒ[T°Þ÷kf<«øL2vÄ7‹È>q3”Q°2Nqç32î²c@ x¬GTqdUÏÚ½bCU@Ù¸²†g²ÐwFjê[Ò´‚qvÌŽ¡ˆwSÄ &ªŨaâòx†¢<Ë#‘´ ky–h«èïé´ƒ]¤Öæ1là?ùZ&A¾«èIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarOpenWebTemplate.png0000644000000000000000000000013112442116641023441 xustar0030 mtime=1418239393.149740441 30 atime=1418239393.149740441 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/ToolbarOpenWebTemplate.png0000644000175000017500000000047312442116641025073 0ustar00mikedldmikedld00000000000000‰PNG  IHDR‰ IDATxÚÕÔ±jAÆñhŒ¥opU ¥Ä!uÚ´IšmÅ'ˆ…mÒ,ì„<„â#X¥Mu\" ‚…¤»ÓÉ¿˜B÷\I2ð+Ž>æn‡;‘?u¸ÀU„¯‚#XÄH‘!E´o Á]ÔÑÀ#^1Ô3h0Á¥>—ÐF5\ãk˜]¾1ÇܺÃ;Víò-DÝ:a7H!›CÔU\¡‡Oȱ/ðtË3<ák%Ž4/0óLñœcàœey¯œ@<.6ný_$¡—âzCAû*XB`CÖF<*Ú×Z-ãùøS”Ñ‚„,¶êN:Bgc2s´ŸÃoý³Àί€˜.°ËFIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/CompleteCheck@2x.png0000644000000000000000000000013112442116641022143 xustar0030 mtime=1418239393.149740441 30 atime=1418239393.149740441 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/CompleteCheck@2x.png0000644000175000017500000000045512442116641023575 0ustar00mikedldmikedld00000000000000‰PNG  IHDRºWí?—@iâäз֮õ‡^Ü}Z…8-òL>îú£3oñ’¹.íÒª(ÆDé4´²¨zHyºÄ€ã³na†Þ´æà±2Ö: ¬‘h#ú$xTs¹|Dz+Þ7µõ¾û­ ‚ üÂÐqŵ×C¸l â“ÒÄ)œg´E+W*Ó'·øÒKg£œ uï‡×¯'•JÏÏBOê!h FÏŒëÆC2Œœ(µøys¢J¹`•Å(½Ž^*TP0ÐoW:½ë¾¾þL)€u»æÏ½iãO¥Ìå—÷‚+bPm¼k^k0Jƒ 9xäåÒ4ý¼1ÉÆÇQ¥ƒt¾!ÓX+Oñ“²0@ªoÑÂé§ï{ÐÔJ“É(ºíˆ‹Ë?´ÖéìéÃHÓl›sÉZ0F€H“Êvñ›§Gyà©Ã7C®³Žž9@ £EC›ó¬…Œ…‚¯ÐÑY\qõU“Û~õ‹Ó¥XÎ_»Æ*èÍ4Š ™Æ‹xhQuE臔Ë5¬¶\¸xþAò]ƒä;únløIÒÄhè°`Uôìvºm7rÙÁ+DÅ®g§DЀ5£AµJij’Õóà¦ËrÞ`ƒÇªÜ²i+³ ÒXã` Ýœ1c!c¢žX¾ èªMʵ„3ïv ƒRGÜSaä ÙÂb‡ÖXŒRÔ¼ õò_¹¼‹kV÷5ýtå$B…(Ò¤ä…vŠÄ£0‘Æ:…¹ƒ2ÛÑcür­ ¤He‹BæóÒD“4Qš["h,Æêµ€¬®rÛ'YuN±…Çc“5J¥Ù¨r­hå^;ÐH!s9™ÊŒ_³sÐ⢤Ö%8Ø´ÐP­¬YšgÇË#|óçO´Ü7ÄUËr-w¾:ެu¢öÖF“v5Ð >5ß„µ0©O‰ ©W===vÒhðƒÖJkV®c$–VdH¥ó\°x°éÄóëì®Iç£âÐâÔl´ ~]Eàõô±“Æ/{ \¶½“þÑÝÐPñÀêÖTG@ÚŒu°6EÚM³jñL~³ÄñI¤ÐFÎHSUL‚2A¬µþ›/¿–¨àÙ[whëa TŽzf“+É*Ñ‚z]3Йfé‚®æü¡ÑiNLùd‹ Z´²3:šàcƒ›¾ŠŠÄ;¸uG\6Íî&gê8•ƒ~NMM”ª5ðª‰(¶‹uh¨z>KÏΑϦf6S®ä¦µó¹ýútÝ' :îí/Y ¢5¢š*{•W{&Öf;[ €ªŒ)¿²ù +`bræ[Ò¤-*ÔÔý€óÏ.´dà#—-äËŸXÊ=¿=‚ç©h9Öλmj*BQÞÿûmaid(N¯iNÎì 0Q±cÇwlÜD-ÔÓÓàUb'Þ¼ÑæŒ2œÕ™iøøŽ#Üð½gÙÿ†ÂuÓ˜XjZZd£8BðC fìøö›âÊUñhg‹ „?öâ ã;6>$8~Ý‚5y?«k'ƽ‘¿¼ÚµèÓWX‘Ïø)°VF"™Æu H·ˆp‹ sQ!Z‰Õ"^/Îð8¢Þ¬kSÞð®ùNmlÇö˜ZÓ±†èýÝMSÌϬòF•‡ÙUèÿJ·8Ðí—A‡H!Dì""…ʼn€Y‰Il´‚иì¤À?¾odø‘ßZ;ñüÎÌôlÑ›  HTudFû''¦^»›°ù|î¬ÕçYãÈ ª ¶5"Ne4F: º*ˆF$X¥õøK÷nyãñÏßV†‡b0Ó1ïjq$ϸq `@èŠ- íY¹²wÙ7®í|ÇgÞëæ‹¹æºn6G±F¨šç—l~æäÞ»6ûã»^ˆöcpÓ€Ô“òr¦“+z::M¡3^ébðÂÍÍ]ÐqöºK ƒkV¥;—Îwss¤SÌíº66”ŒzcOnÙVG‡ìåØàT;¸3}ÈØÒ@(Æ qte£=Yé ÂÉ¥¬®Õò¼8J:þ¯¿WÀjqQèdaü3‡G*pcPùز1èTlò4óâ_O€«ÅcÐÞ5Þêñ›H¤¼4ƒLÇæ6R?Kë¬'±… `öí:am“ˆªGÐ9 ÀFoMZ2öLý™'*µ¿£¦IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/CreateLarge@2x.png0000644000000000000000000000013112442116641021613 xustar0030 mtime=1418239393.143740338 30 atime=1418239393.143740338 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/CreateLarge@2x.png0000644000175000017500000000336012442116641023243 0ustar00mikedldmikedld00000000000000‰PNG  IHDR€€i7©@·IDATx^íMh×Ç÷Þ}<9HN§Á C—Mw!xg„¶!‰ÓºH[bEQ’&Pc¼xÑ–® ]$Yd°üÕÆ%Ý¥-qR !Y–@„nB°)vJl KzÏz3÷ôq¹Ì…'‹QûÞ<ÍèÝÿa>äÙèüü?çܹúRÂx+¡DJå£zIa )@ M‹ÜC:‚%£Í*·ÙÄ* "»ê4)÷ÞøœáHú³µ99–œŒÞa¥½võÓ¿üîÊÊ5nÒÁ*[%‚’  )S¾ñ ( ÈKFæÎ]¤ûťߜû÷¿¸M†©ªt ¦hQ‘\…¹³Áø«vAzx~ùò±Ç™#Å(EE*`˜dªE`<ƒö¡€ìЉמûs$Ánp¨Pªð 08ûŸþíS9Z©]à?¯J¥=„ þ_@hÏžzãG?t…P ½CV, ¸0ËFëä™ÿ€Ùjhj"`@Xc29±ô“Ç‚= €¾ä;‹‹;Ì$¿ZªÆ ;’bò¦×$¹÷XÖø˜çÒçÞ¾Â*]eEö „ú÷ƒP\¬ÐbšóÒÙŸ½j%Á–Ð%§`^^RCv¦VRPÌåÏ–œu¦¼ ~Yâ‚Æö€€@üýŒÌ? ‡  Æ¡€ìð[¿~ñt'Ã’5ÚŠKêÓOÈÉC¡ ½( ,÷=ùð™6èb±HãÖ¸ô_ )Á¢<"Ðà>¶}kH õôS]¥MŽmX (Ÿ² ‚xsç䈋0%Äc²Å–ï<ÂyVÙ$¯¡>ã¯Üê{°Ÿ'x ],…2Œ³¿`ûŠÄáòa=ë1CŠFÕ®|Æ2[u“ež)ø)ïï­@X#†² é{H.èN0IJÂ&ÔÌï Û>ù^¨b ÖÛß"@P[w yqugíÒ¯£n–< /ÃÚ_UÀ?ï»â‡ G9‰.¦bÝÈN[aq'ÁüÛxR;[ì"'ʧ¯»-.P@(“òrÀ†ÄT ·ÅeÇÊU´LEL„aQ·&(%IoýXþÍT«qjP¿Á¶/±†9`0”@­†= JiœU먨±+PŒ«‚ Æh±@ÝÆàÈ{‚è€`üÆ`tÀ.~‡ÈÇ\âÓqÊu€ŸóPýð1¯3}Íëœä¡º¸8Rk_¬€¯¥¾Z³IêÑÚš?€†­5{VѱD± ŽÐ÷t%p°~%°Àïêà§Y‰ ²È‘ú­áH/v¢cl¯wâ†H܉â¶xýDHóÄ)K è€ ˆâŒÛâq Ö @|ø6_rw=0Mð$¯l÷d<ÞŽò^Ýâ‚8ÅÑñh‚p´$Õ8#€ÚA0ž"€ ˆ"€ ˆ$:`ï)ˆ"€¸7D¢"€ D€`±4Q‹ @rº4Q›ä2Ør2Ú꘥EÚ€ ê²Á*ßÐ&#€;¬s ¡Í õWF‡5VXãÎ0dt¸ .ýMýeéÒaÛtÈ`ÉÙrÚ$˜†ÈɸC‡ÍÁ~¯pàiÉhcP(ê­Ð¸s²òôAÉ|½¶)0Þú/TÏ”Xá/eXIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarPauseAllTemplate.png0000644000000000000000000000013112442116641023610 xustar0030 mtime=1418239393.142740321 30 atime=1418239393.142740321 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/ToolbarPauseAllTemplate.png0000644000175000017500000000032512442116641025236 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿaœIDATxÚ­“A „0 E•ï ô\Ãlz7=_éEêªÊIJø3…Œ…·ùýyºH'"š~œY¹=2{'Lb Ó”¢Y ÞLeÈ JÇ|˜Sò§t{Á _~á_Y•lfÙÎ6d‡ £ 9 ‡Cp  8É!H(Ì®‹ (ddÒ ý"Eæ;Z$íDk•£ÚÉ`—Îãé/.QŽóqx=ŸIEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarResumeAllTemplate.png0000644000000000000000000000013212442116641023774 xustar0030 mtime=1418239393.159740613 30 atime=1418239393.159740613 30 ctime=1457295922.646852914 transmission-2.92/macosx/Images/ToolbarResumeAllTemplate.png0000644000175000017500000000043512442116641025423 0ustar00mikedldmikedld00000000000000‰PNG  IHDRµú7êäIDATÁ¡JCÐã˜VAT,,˜‹“‚`±N”Á°ø~ñ•—ý«Á ?`4nƒ%Á*ìÉ÷æ®ç ¥0R©M ´ºf"âIDéºj‡Î}‹…@ËLDéÖž5ì‰R (D|ÙÀJÀX,aÅ©-ôÍDŒ ¡oàN»QAC-@)>DDD LÅ3øñ+b Eiæbéň!Ð1šX·oÛ¦w1×èû¯N¬j:3K×ÐSŠX¨Eü¸h)ŒUjmšÀ?„Óp†¹ƒ´IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/ToolbarPauseAllTemplate@2x.png0000644000000000000000000000013212442116641024163 xustar0030 mtime=1418239393.135740201 30 atime=1418239393.135740201 30 ctime=1457295922.643852863 transmission-2.92/macosx/Images/ToolbarPauseAllTemplate@2x.png0000644000175000017500000000050612442116641025611 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzô IDATxÚÍ×A ‚@€áRlÕY¼«@hç:wiá­7®Úz€¨Mn‚zý‹ §è4¼qà#þ‚0ψõ»p[°x9ÄÈQ¡Æ ï¯jTÈû HP¢ƒÌÔ¡Dòo@Šâ¨EêpÀò§KŽè!žô8Î H•‡ûŠH1¡ܸƒ¶Äa_ƒh*àñ0p ØâbpÁV È ‚L 8œµ€Ú0 Ö®†W-àeðÒÄ,ZÀÝ0à¾Ê°2 ¨´€Ü0 ×btâ±Ã¨4(§NÃDÁöØ)Äa_‹dÉ`xB×(T×ÂX×kÉ=ÃŒµ3Ó.t¢-/:÷ô{c‹¢°âÐØ‘cQ²XuÑ„Ðoçî³Àü3&Ì?]À•˜w¬s”?篙{´LæJùSjô:]Å5\{Og2+33{èFGºÒ¹æxªMûÎnKuú‘KuX–r ±?T#Zøø[O£~œ2aîñ*¼—Q‚é)×”š‹°Ã×0kïU¼»'þ¬=W°$-©?búþ<ÖÊ×Öû|:Ð…Nt£#]ŹÝM“3?Þí²D‡éQéÐ~W…ª,‡œ@=1aÎÑjÌL+_ÂUìûá&L8Ê ÕM8ʼngP!Ï5#åòMøí¾‚iŲ¶ Ç럃.t¢é:@œÅ½±Æê…ÎÃ?ÔÁui "N”àËs„HðÙGQŽ˜0ã°~I×±*í ,ǵÂä•Âr¬:” ßÄ<ÌH×sU²Ð‰nt¤+ÅÝ^ÓÉÕ;Ìy‘¾‘éXw²áòq‘U˜žaÄÔÔRxm•SNçânÇ®3¹˜°åÞ‘µÜC­ ®™˜T"{T«–‡nt\t tvú@[¤¸@|°dr*TcRŠ^IåýM6F¬Ø‡œŸŠï(9¿¬õŒÉæZî¡j¦ÏA Ð[Ó?H™·¯ ÄkTÄ„ñI•ðŒË‡KÄ,ŠÍÀÆû›Âu½|¶äƒk½öšTÍdöç(Ð[Ó;@[Ügž‚i; 1+©ö˜ðö¨C20.©žÛ‹1rãE KÄÑïón+Ÿxü2†|”Œ×#/ÁsG ת–…ÐŽÓâo‚Ît×8N\v¬W€‚qÚK˜º«^ U“õH0aôN=Þˆ¾ç5Ç0*|7J+ uü—XŠáKâ1<â$Üc 0:¾’kUÍB7:Ò•Ît×´uÑsŽ‚áŸ¤aÒ¶bxm/Û» *£vVÃ=®#¾ºŒ¥" ò Lµä UFx¯I†Søa¸lÌû–2xì4ªžƒnt¤+é®y´å‹®›­ çû1U€q›‹à±­ î; ÛMx}«.Q71lýyôY”„ˆ„Sà0 ”tô[¼Ο}ט"¼ñ¯óMªf ÝèHW:Ó]#îãèà´î³ ;¨[ðˆ.Âë[ª1rTÃm« .±z¼Y€A«Î Wp6gdãÓ=Ð;t?œÖžÇðM…pÙ\ÉZUϦ èFGºÒYÜ; šöM­Ûz8NÓg(²òÜ6ÝnaDŒ#â 5⵨r Ù«/ ïÇÇ„ã¸ö{ ýú^‹Ö³FÕ3é@:ÑŽtmjýœ‡¸·4m„nÖÝ]Ãí§)p˜þŸœ…ó†BAØX g]%œc$ü7¨1÷ª«Àà¯naÐùBo,Â0E¯Ê„û03³×xЉnt¤«8; 6‚æÁVxµe¿ º.þ Èß>8€ëò0ð³ŸÔåÓ¸¾"®s"Ïù2_ °F]¸?]j¼è(®¯kAó¤ùSà ôµêæ²ÒÎOk°{GA'ÿt›=>:^«®¡÷ºê°–Ô†óªÑkõ503³Ó.t·âØÇìj#g³2³9{?³‹½ð‚ð´ð˜Ð„î¿üQÔ| š?m[ÁQè)ôúr³³23³Ó¡£`#XÑ‘òt¶üË0o£±ù{ñ¤ðŒù"Ú vBÁ¾À¬˜Ý,n-Æ'd¼N/`±w 6-ÈÄÞµ¹8®Óã\¬©! Y+ÀÌÌNºÐIÜþ{oеçä%Ácu _½ŸŽ¬/ËqjSµªœ$‘Õ8YUÎñêçÑ.5^âXwop°½§ßÂ7¥ht¶-úG?7ÂÚjYj‘` k~ýÉ 2!=° ióô8Prh®žs|§ÊÌÊÌÌ^ãA'ºÑQ\}ÿ­7تyûÎ ÜuzqA‘±º«*‘j”PPŒ@Òæ°N1f\Çÿ«Øî»§çaß{Å|ÇUϤ]èD7:ҕοô}-Û=ßM‡õSÒpècù,«@ú|2æBUTcÿìR옚˱kvöÍ*aêçÒ…Nt£#]ÅùçÞ`Ûæ‡Ë­¸Ä ia!RBKq(°és *‡…ƒ³«øn!t^g`9bÞ9‹ÿ80Ë µ&ÕϧÝèHW:·µêì q¶ó›7T‡5o¥!9¨{ç•#m&Tç:Í€>ùøÜ3–ã+ï,lŸ’‡”iz©5ý&èFGºÒÙÙNzƒ“_ ϤƒvòEìž} û¦pÀª“êoÂ^?=¶xåb{,ÇgãÒ7!{ü*¤Öø›d éJgºkÞë«-šÓO‡8ŸëòÝ,Ä~_#R| *û}D~Jv{—"zŒ4a]öÃr¬y3Šç%ìò.f-רžƒnt¤+é®y¯—$nâ ½ÞP•=Þ&$M¨BüÛ¥ˆ} Ÿ<‰ÐÁÛa9>r‹Çgn'ðÔ°6YÖp­Úy̞⬀ޚÙ=˜±ù IoAUß2"ÞS8Ï(¼¤ÇFá?×rMâX£êyÌžâzk¦;j‹gvSðõëW¡sÏÃ.#< »F±Í½Z—\D¾}ú²ªÛÊó]äø3ÐI-×p­šYèFÇâJgºkƵ_vlFW«Î`ãßsçZŽnP®FlQ­sVö? åý,Ün(Y`Í&çë²FnFU³ÐŽt¥3Ý5ýÿ2>bš‚à—Sð…S¾R€mÎP­Î&Ä «‚2ø"ú~'ç$ã€î‚¥»ÌGˆ¼“©-â®U5 ÝèHW:Ó]óÌÃ/º¼Û^>b°¦×%¬ïsºþeØ<ª;À„è~zlè]€ð—O!è¥È>y5ƒÏÝvÈ»“ØÐ+QRË5jf ÝèHW:‹ûϽA÷gƒÓ¦>¯ Èn/Ö¼|k_¾í+•ˆyª-D½jDdrDtÏÅâ®YX<0åEåùÃ.™òîG©)c-רv>]èD7:Ò•Ît4íZ<ôœ‡ok­á!³°¼Ë%¬èr_:”BçUÐ ‘ŽÕøÒ¾+;]AH‡Llò9%œ”ç ™ËÆöŬ‘Z“jçÒ.t¢éÚâ¡¶ÿÖtt|Ì5Ü·¥¿–Qøà¹ ,kwdEûñiÇbl°­ÂF[Ô‹¯mMØÐÑ€õа¼ÝU„½p^ø–Ïœã;ÖÔ÷fefÉžó‹èFGºÖÕ|¥÷ct>O+ ³[&#´õY,i}AU·>îÜêüõˆÅgÎñêçq_ºÔxÑ‘®t®³7hÿˆËŠIÖ&?¥`ÊSјi•ŒÀ§3l}‹¬¿­7!ÿâœìw eOÂgÎ…°F˜•™™t¡“ƒ¸Ñ‘®t®«7ø’Яùƒm½G4[˜5éq¿ºZ(¿)â’I'ºYô›ÖÕ|©¦7hÕèùI=§Œ|$ììø¦‘¥ÞÍ4˜•™™t©ÕmGW:Óý×öɰûœ¡½A:Ð…Nt³¦+é^»Ò¤VoÐæ6½Áþ „šÞ`:˜]ÚÐŽ”¿Soð óMÙXô]™Y­Þ U­Þ`+3­ïS˜Í²7HñftúÕ½A¡‰ðGÞœy“G;uÞ˶/â¡\ÅYëùE¨ÙjCÄð'7)JE"ø€ëÅ÷}|À¼ó…Òh4Dð‡· J§ÓÁl<¥(ý~_€²Àˆ `\~ˆÒ4UéwüA ÒŸ'_¥`ó߀n¯›‡á–ïV³•‡5™àž¸€³÷#™ð§í=™ð³÷U™ðK»2áì×c™Ð²!¯JéŒã8oª_Í`^L2Í,2ëŒÍlæÌ†-¾i2¤¼Æbª9³ø– Ûß}¥rDû$IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/DownArrowGroupTemplate.png0000644000000000000000000000013112442116641023516 xustar0030 mtime=1418239393.144740356 30 atime=1418239393.144740356 29 ctime=1457295922.64485288 transmission-2.92/macosx/Images/DownArrowGroupTemplate.png0000644000175000017500000000020512442116641025141 0ustar00mikedldmikedld00000000000000‰PNG  IHDR _žüLIDATWc`@e4ÌÈ€zÐ0=ð1+ìP9†,’0 ’c`âR,’¥P90âV$ÉV¨ 0BR`„. ÁPŒðC1 ‰\Ýs« IEND®B`‚transmission-2.92/macosx/Images/PaxHeaders.4960/Globe.png0000644000000000000000000000013012442116641020112 xustar0029 mtime=1418239393.15374051 29 atime=1418239393.15374051 30 ctime=1457295922.645852897 transmission-2.92/macosx/Images/Globe.png0000644000175000017500000001577112442116641021554 0ustar00mikedldmikedld00000000000000‰PNG  IHDR@@ªiqÞ pHYs  šœ«IDATxÚí›y°d×YØ眻ôíí­3of43ÒÌH²6[–°b$y‘ ;$&Ev (òE I¹˜JBQ)¨8P„œ&› ,ƒ…-¼ay‘d£ÝZF³IóÞ›÷º_wßål_þ¸=ãaJ¶FŽ $¡«¾êûzæ¾¾ßï|ÛùÎ÷àï^÷úÿú¥þº¿ðÇßùé}»–7f™¹aqþUcOTµýÌÏ~ÿ+6ÿŸð¿ð±tqPÜd’äö}+ÝW-ô;/_d»ûEJ?O˜¹@ã"ÎG¦M i¼ì”îDY6÷ŽvªO>¸9ž=ðîýúð€þ•¿¸)OøÁ—_¹ç-Gö /Yî0ì$t3Cb4Zµ_,óÿ/"‚RŠ…™ ¬O,Ç6KNl–'¾ðè©ßq.þ÷_ý‘Wéo-€kè·Ô«oºò {–{o?²oxËk=­t3ƒB! ”‚D)£P@”¹ `ô—H‚À¤ö<¾QñÈ©)ëg¦ï;}fò3¿øƒ7}îo€·¼ãã×ìÞµðËk˽×]`À•k=òÔ°T$¸Ø®¬V ¥ Oæ×ó{]¢´ ëù‡F(¢A„Í©ã±Ó3Öw,ÇŸ½ç œüñ?ø©o~æoÀmÿöCæªC»r÷RñöD‘ÜpéÃ^Jšhެ8穃b¡H˜4^nÈM "Õ-ˆ™‹‘s4PˆQHBDp¬¤6v_Ÿ±]úÉcOoýØï¿ç]GßóOå¯Àwýò={¬ö~÷úƒƒ[Ó$aeØ!*M–j®Xí}`yÐÁhØšYf^1Ì5™Ñi0Z¡PxBª tŒb« Ø ¨¹5­À•õ§Bk¨]ÄÁhE?7DVê\0 ž;zF˜UŽËV{Ûqœœx‚€Á{ÁG!œu4°Z(† |æ©O¯O˜Nkb–Ýÿé{ŸzÕ½ïøÖòEs·þ—O¤o¹õȇSo¯Iµbm±Ëî…c4,¡Ÿ'd©9gîsýHM‘j:‰Á(ÕFyÕVAØY/Zk&6²o!gRY„~n8]\l­¡‰`£`ƒÐøÖ2J/ÕºÍú¸acT‘E·§¿8¸âÁñ¡ßçØÝÏ«›¾?òí¯øU;«nŠ1b´bPd™çðØFp!´õ É<Í) ž'g NòÄPùÈî~N#¡…Œªñ,õržÕ<¹9£‰P¨E¨C+V@´ÂÛuäôÌcŒ"hŨ¬*Syómoú¦ï{Q,à·ïyúÕg6Fÿy6«è$†¢HYvÈSÓ8Z“˜y™77óâ§9÷Ïç <;µ4Ög–:Â_>;åøŽ¥Ÿhö-<6 eÕ]œ´·Ûsî Œê@?‡ž©¨jÇx§Ä7–»û·ŸèÝüîÙwN¾fêæŸV«+ƒ;άŸ¹diا“ºEưŸ£Ak1 ­ê<A^Z™j:Î8S9F^aÑœj„QyÍ»9Ÿ<:fcÖ°í^iš@ë¡ý¢`˜öö [u@ lUŽYÃÑgw¨Ëk-©ølÏ¥{÷?úwÝñ5»Àçï_}ÿÞ~rS¯ÓA!h­QJEd^¦Æ¶T=[Û·5|›Ë›(”óÀ•h0Jáé™g&­i[c'œ˜4‰æú l©Œå^ÆÌCé…* VZŸ7£;އ¶,JA#M ð—RùÈxÖ°µÓ°V¨·\÷¶Üð5Y€zåO¨-'ïšníì9°g…1â}Œ9­k{È–¨ÐˆR­X,ÒÖÇç æ)Ï̳Ví*Š´%m¢Ë™f)U|j½áÛ ðó¾@¤µ˜ý”Kz†&2ñB=¯ ]\d¶+GGCN CdcTakKhÁ9z‰RY¯[=ý±ß¼û¢,¾õŽüðrú?xð©ô3_| A±ã5gº»¡7@çyž¢³1 Î._´æÚਹ—´YAÚ¼î¤ šl5¤h­p.¾¤ºžGG ŸßðÌldj#ÖGÎÌÖwŸžqâLIÓ8šÚ±=.I$xŠLsøÐÚáG²›Á=tçÅÁ+.[½½ÞÚî.//ñÊ—áÏŸ®øìºÐÌ÷î> •4!rÆF¶ƒâCOÛ•!΃ H«²ÐnfÎ6@œ´®àæ›Øï<2 M4.‚ŠÏóë÷œàžcþð‘Mö÷[ÈMˆ”.bC¤‘£Û (aR{ž^Ÿ|@‰"ìÌ&3ËÖ¨DÍ&ûn¾åšëŸK×ä9?lf¯ëa}sƒ{Ÿ€|ßAÈ ö.äLf§¨,b ¥ÈRÃj÷ËÍt›ü£bThÕf‰ó ï ¢PíÞÛž@å"ƒ<åºÃ«ª&0ö¬tX?=AÅ@ ‘¦¶œÙžQ• "‰Öm'JäÌóȳôÉàý-Z b:EJ¯ÓT9³Y‘70«…2—;ˆVèD³ÐÓ¬u5˜„iˆD'7\ºã£Bkái ˜k Á 1jî>YÒM M*ßô<ô„ÃhaÐ×(/ĸýÒ”Ç6#:¦’pêYËRêÒ±^$ú¹fgji*‹m;£)©Œ†,5dZ}îy zùDzÄ|¡õ?ñ<½TÐI$Í„iãðiBž)R":DªÊ³·gÈ0ˆŽ7µ9|v³¥ØÝM©£ðè¶Ç+áòÂzadOŽ,·îïód"¼j%ã}{¦e«¬Q‘i Ô]EWªDxø¡šQãè(ÇÁÝ)i x×`‡wŽDËÃEnèws:œËvu>ñ¼n|É®»ýt&J‚"lScëßätò”a'e±cðFaUÄ7éÌ‘‰âq¥©$`2CPš{¡_>wªâ–ƒš€â¥}Ãf¹~rÇ—¦ø$e¡ßáÞ35Î ƒ¡æ†½Š{Ÿtä(^w¤àý÷‘Ʋ\(¢óìŒ-Û‚Èh…m<ÞZzÊSNktt( ósHXZì²°<¬~ôõ—ž~^ßú’…S?ôów­t-5Bž)¢kpuM’¥$YJå*¦ÞSÇ”¤'Ìj¡³a(£¦;HÙ½œ±^ÃV%<ý¬åλ×9²'ãÀ¾‚A×0ZèóÆËº<6òD­ø¦Õ.!FœÃ4pà:ƒm<÷<¼…rÂdÐN‘)a¼ãè$ÂdâPxj-Œ6§ì*"¾iØÚ˜°½±M‘*V—z$IBVt¿xÑ›¡}ûV>ñPn¾CK¤šN,.âKÇ[BÓ°¾]ãÈÙ*’ÂãÇÂî.*÷ ÖödlŽ=i®Ù®!Í —/³…ÑŽÀ–ã¾ã§YÊßôòU–3& ‰Àá¾ÆEEŠ}7®ð‘‡w0ec9yº¦žXŒºI»‰xö™’AâÙÞ*¤ž}Ë9=ÝgýÙ!‘,M>~Ñ=Áýûwj0(ètRœF[|Ó¬£œTŒ7'œ>±›Ìhf%¡noV&²kšÆã¬g «…°˜G èŠ4ÕýŒÞꀞ~ýž¦ñ‰ Ô60sÊJ7‘Y¸þ`Áõ ^yhÀb®Ð¸ú²E*4“’éÖ„3lU#!0͘Nk†ºyÊÒò¦Ÿ¹h X\Þ¹¼<|G·ØP³Ò2›Y¦;3²"Ct`e!eV6±n»ÂbÁ– v–%Š]E ª‘¬œj÷ÎA#ŠÝ»RLÓg§ LióºB¨Dh‚‚`}¤¶ë"ucIìŒn>¼ÍdsB˜•DÛ0›M I Ün8srƒÔ´¾à’e–—‡îôNñþ‹ð/]yòmïüÈ}GŸ8qãx4Å&Šj:cKiz H…D¶ÉÒR¥ÚDðm¯!zOtß8\ã°Uëû¾™C¨œµL¶¶QhÃ.ƒ^ƾ»8ò’xÇÝõsÿ(|Í^ù’K~iýôè»·Ö·o(g%ãI…wÒAD¤mC[ë²nAš®NQQ˜nZÊQ‚ÝQuÄ$Ø©ÇÄ­áØé’íb›•Õ&I $Dž`=Þ:BãpuCSY‚µ­;4–Í ÊéŒÁÂÁ°`ïÞeŽ\y…A÷η¿õõw=Ÿ~Ï àÊÕŽ{Ãwý³·\sÓ?üüÖúæ`2ám$Ér‚³(i£µ àƒ¢.D'D“T«lƒ˜„ôÞGnþæo)—Woo§êé kí¼çß¶½’¤‘±.`Œ"Ï4ZE:™"KÚy ƒ ÅÏWّЮrÏx2<¶¶­Ÿ÷î‹·–ÉöePJcº¹f÷ÚG.ßÇU×–|èÏ¿í£¿ñSy±ÆäÔy{õ™»ßwÏ-o|Ó`yyå•ÖZåšvåP†,KIL{d®lã©+O íÁE;0D”¢óˆwD×úy]Z’Xc$ nžî¬Å7íKðß4ìlQJ“èH/7¬­-päŠK¸ú¥‡åî?ûø÷ßçϽ÷¼9ìÀù¢ïûÄ?úŠ×Ý–îÝàQIš¡ƒ³¡C$BŒ8ç !|ĺ@S$Î œ8ÏñÎc+G]6ÊA¸Æ\ 'ú/ËÎÖ&(Cj`Ð3ìݻ̕Wàò«. þÓ»¿ïÞ;ÿÓ(/Ï7 ÷Bh@Çàõç>òÇŸ:tí ëW_ÿ²Û²N®½ó4U…m,õ¬Ä»6ï $Ä{¼óDß^·i®-pB]ÑI#J„0€#®.Q±åc2º„•¥/ÝÍU×\ÊÊÚòÎ]wüö÷þå‡í®¹Âòõ´3—äÁÏ~ü‘éÎö§oºõµ·¤F-(%Û\Mô ÁY¢w\ëëÁµâÑZˆhç?»¼¥è$mHDqu…k¦tû=––ìÚ5àðå{¹æ¥‡™L&÷ÿþ;ö»?ðÑû.H{Q¨ èóÄ 19}üñ3OÜÿ©»\qÕàò«®¸Z$hp1:¶§Â*¢Ä¡h®Utˆ·ˆoMM íuª…<Ÿ·¯5$F‘f†Ô8†ÃË‹=ö]²ÌK®¾”Å•~ýÁ÷þî/~üŽ_úééö©ùSø+y A½çVHè=`pàÊ—ßpË·üã–¤{í©ãÏ0™TLÆSšÆá]$…Äv :ÆvàY¡ÎÍõ=Š^¿ž6 “€Š%y§ ß/XÛ³ÊpØ•G¾xß'ÿâƒïù¯vrú)1"3 ™‹ü–ðU]B½À\ úÀ°ŠÒ{]}ÃÍ×}ãm·Z=Ø¿~z]ïìLÛ3FeH’œhšÚ`Ò´ÍÉ;9Y·‹""â¾ÂC¯W ÁúÑúɧÿÂ_|¸¸ñ'ÙvæjÀž \ ü‹à| È€ÎÜU` ؃Ò{:ýÅý+¯yÉ®ý{£é’,S(Ñí@•Ö†³9tvàRCˆ[×LÆ[±šŽ¦[Ïß°;Ï>&vúÁGâ DÖ-` ”óÕ·ç)ÿupBzô%`جK(½€Ntg°Ü鯮&݅ż;(ò¢HcÄdN{ôà/1J9¸r6iÄ73_mâÊÓ»‰ÄMà °qžò3 zŽÕ?kþÏÔ )„Îp!„âl,˜»Ãp~Ý ”ê tN:(ÓÁ¤9˜¥Ì|ìAÚ}¶DKô%ÁM‘0E¤¦ÀÎy2J”ªižCùx±)Q]l)üVp6&dçIg£˜_çó÷ô<™T~wDZ¸óVµžK5—ú\ÐSÊ!âæŠ?WðãÅÀéðüÀx¾U$罟/çß§.¨Øä¼ çÍNœrþµ¿Àßã)ð¢SáÅþÁ„úJ¥ñsˆù ×êÅ/›:!^#^å‚'~…€÷\\ ˆç‚r! ¯v/XÏ¡Ès)ø\о ÅϾþ7K™ÎŠdÕJ^IEND®B`‚transmission-2.92/macosx/PaxHeaders.4960/main.m0000644000000000000000000000013212442116654016257 xustar0030 mtime=1418239404.001926414 30 atime=1418239404.001926414 30 ctime=1457295923.338864681 transmission-2.92/macosx/main.m0000644000175000017500000000324612442116654017711 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: main.m 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2005-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import int main( int argc, char ** argv ) { if( argc > 1 && !strncmp( argv[1], "-v", 2 ) ) { char * env; int debug = atoi( &argv[1][2] ); asprintf( &env, "TR_DEBUG=%d", debug ); putenv( env ); free( env ); } return NSApplicationMain( argc, (const char **) argv ); } transmission-2.92/macosx/PaxHeaders.4960/ShareToolbarItem.m0000644000000000000000000000013212442116666020542 xustar0030 mtime=1418239414.192101039 30 atime=1418239414.192101039 30 ctime=1457295923.498867402 transmission-2.92/macosx/ShareToolbarItem.m0000644000175000017500000000165312442116666022174 0ustar00mikedldmikedld00000000000000// // ShareToolbarItem.m // Transmission // // Created by Mitchell Livingston on 1/8/14. // Copyright (c) 2014 The Transmission Project. All rights reserved. // #import "ShareToolbarItem.h" #import "ShareTorrentFileHelper.h" #import "NSApplicationAdditions.h" @implementation ShareToolbarItem - (NSMenuItem *) menuFormRepresentation { NSMenuItem * menuItem = [[NSMenuItem alloc] initWithTitle: [self label] action: nil keyEquivalent: @""]; [menuItem setEnabled: [[self target] validateToolbarItem: self]]; if ([menuItem isEnabled]) { NSMenu *servicesMenu = [[NSMenu alloc] initWithTitle: @""]; for (NSMenuItem * item in [[ShareTorrentFileHelper sharedHelper] menuItems]) { [servicesMenu addItem:item]; } [menuItem setSubmenu:servicesMenu]; [servicesMenu release]; // can't believe we're not using ARC yet! } return menuItem; } @end transmission-2.92/macosx/PaxHeaders.4960/TrackerNode.m0000644000000000000000000000013212505250243017525 xustar0030 mtime=1427460259.976235195 30 atime=1427460259.976235195 30 ctime=1457295923.620869477 transmission-2.92/macosx/TrackerNode.m0000644000175000017500000002041712505250243021156 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: TrackerNode.m 14341 2014-10-17 05:12:00Z livings124 $ * * Copyright (c) 2009-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "TrackerNode.h" #import "NSApplicationAdditions.h" #import "NSStringAdditions.h" @implementation TrackerNode #warning remove ivars in header when 64-bit only (or it compiles in 32-bit mode) @synthesize torrent = fTorrent; - (id) initWithTrackerStat: (tr_tracker_stat *) stat torrent: (Torrent *) torrent { if ((self = [super init])) { fStat = *stat; fTorrent = torrent; //weak reference } return self; } - (NSString *) description { return [@"Tracker: " stringByAppendingString: [self fullAnnounceAddress]]; } - (id) copyWithZone: (NSZone *) zone { //this object is essentially immutable after initial setup return [self retain]; } - (BOOL) isEqual: (id) object { if (self == object) return YES; if (![object isKindOfClass: [self class]]) return NO; if ([self torrent] != [object torrent]) return NO; return [self tier] == [object tier] && [[self fullAnnounceAddress] isEqualToString: [object fullAnnounceAddress]]; } - (NSString *) host { return [NSString stringWithUTF8String: fStat.host]; } - (NSString *) fullAnnounceAddress { return [NSString stringWithUTF8String: fStat.announce]; } - (NSInteger) tier { return fStat.tier; } - (NSUInteger) identifier { return fStat.id; } - (NSInteger) totalSeeders { return fStat.seederCount; } - (NSInteger) totalLeechers { return fStat.leecherCount; } - (NSInteger) totalDownloaded { return fStat.downloadCount; } - (NSString *) lastAnnounceStatusString { NSString * dateString; if (fStat.hasAnnounced) { NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateStyle: NSDateFormatterFullStyle]; [dateFormatter setTimeStyle: NSDateFormatterShortStyle]; [dateFormatter setDoesRelativeDateFormatting: YES]; dateString = [dateFormatter stringFromDate: [NSDate dateWithTimeIntervalSince1970: fStat.lastAnnounceTime]]; [dateFormatter release]; } else dateString = NSLocalizedString(@"N/A", "Tracker last announce"); NSString * baseString; if (fStat.hasAnnounced && fStat.lastAnnounceTimedOut) baseString = [NSLocalizedString(@"Announce timed out", "Tracker last announce") stringByAppendingFormat: @": %@", dateString]; else if (fStat.hasAnnounced && !fStat.lastAnnounceSucceeded) { baseString = NSLocalizedString(@"Announce error", "Tracker last announce"); NSString * errorString = [NSString stringWithUTF8String: fStat.lastAnnounceResult]; if ([errorString isEqualToString: @""]) baseString = [baseString stringByAppendingFormat: @": %@", dateString]; else baseString = [baseString stringByAppendingFormat: @": %@ - %@", errorString, dateString]; } else { baseString = [NSLocalizedString(@"Last Announce", "Tracker last announce") stringByAppendingFormat: @": %@", dateString]; if (fStat.hasAnnounced && fStat.lastAnnounceSucceeded && fStat.lastAnnouncePeerCount > 0) { NSString * peerString; if (fStat.lastAnnouncePeerCount == 1) peerString = NSLocalizedString(@"got 1 peer", "Tracker last announce"); else peerString = [NSString stringWithFormat: NSLocalizedString(@"got %d peers", "Tracker last announce"), fStat.lastAnnouncePeerCount]; baseString = [baseString stringByAppendingFormat: @" (%@)", peerString]; } } return baseString; } - (NSString *) nextAnnounceStatusString { switch (fStat.announceState) { case TR_TRACKER_ACTIVE: return [NSLocalizedString(@"Announce in progress", "Tracker next announce") stringByAppendingEllipsis]; case TR_TRACKER_WAITING: { const NSTimeInterval nextAnnounceTimeLeft = fStat.nextAnnounceTime - [[NSDate date] timeIntervalSince1970]; NSString *timeString; if ([NSApp isOnYosemiteOrBetter]) { static NSDateComponentsFormatter *formatter; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ formatter = [NSDateComponentsFormatter new]; formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleAbbreviated; formatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDropLeading; formatter.collapsesLargestUnit = YES; }); timeString = [formatter stringFromTimeInterval: nextAnnounceTimeLeft]; } else { timeString = [NSString timeString: nextAnnounceTimeLeft includesTimeRemainingPhrase: NO showSeconds: YES]; } return [NSString stringWithFormat: NSLocalizedString(@"Next announce in %@", "Tracker next announce"), timeString]; } case TR_TRACKER_QUEUED: return [NSLocalizedString(@"Announce is queued", "Tracker next announce") stringByAppendingEllipsis]; case TR_TRACKER_INACTIVE: return fStat.isBackup ? NSLocalizedString(@"Tracker will be used as a backup", "Tracker next announce") : NSLocalizedString(@"Announce not scheduled", "Tracker next announce"); default: NSAssert1(NO, @"unknown announce state: %d", fStat.announceState); return nil; } } - (NSString *) lastScrapeStatusString { NSString * dateString; if (fStat.hasScraped) { NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateStyle: NSDateFormatterFullStyle]; [dateFormatter setTimeStyle: NSDateFormatterShortStyle]; [dateFormatter setDoesRelativeDateFormatting: YES]; dateString = [dateFormatter stringFromDate: [NSDate dateWithTimeIntervalSince1970: fStat.lastScrapeTime]]; [dateFormatter release]; } else dateString = NSLocalizedString(@"N/A", "Tracker last scrape"); NSString * baseString; if (fStat.hasScraped && fStat.lastScrapeTimedOut) baseString = [NSLocalizedString(@"Scrape timed out", "Tracker last scrape") stringByAppendingFormat: @": %@", dateString]; else if (fStat.hasScraped && !fStat.lastScrapeSucceeded) { baseString = NSLocalizedString(@"Scrape error", "Tracker last scrape"); NSString * errorString = [NSString stringWithUTF8String: fStat.lastScrapeResult]; if ([errorString isEqualToString: @""]) baseString = [baseString stringByAppendingFormat: @": %@", dateString]; else baseString = [baseString stringByAppendingFormat: @": %@ - %@", errorString, dateString]; } else baseString = [NSLocalizedString(@"Last Scrape", "Tracker last scrape") stringByAppendingFormat: @": %@", dateString]; return baseString; } @end transmission-2.92/macosx/PaxHeaders.4960/InfoGeneralViewController.h0000644000000000000000000000013112442116654022415 xustar0030 mtime=1418239404.000926396 30 atime=1418239404.000926396 29 ctime=1457295923.27586361 transmission-2.92/macosx/InfoGeneralViewController.h0000644000175000017500000000445512442116654024053 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoGeneralViewController.h 13481 2012-09-08 20:22:05Z livings124 $ * * Copyright (c) 2010-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import "InfoViewController.h" @interface InfoGeneralViewController : NSViewController { NSArray * fTorrents; BOOL fSet; IBOutlet NSTextField * fPiecesField, * fHashField, * fSecureField, * fDataLocationField, * fCreatorField, * fDateCreatedField; IBOutlet NSTextView * fCommentView; IBOutlet NSButton * fRevealDataButton; //remove when we switch to auto layout on 10.7 IBOutlet NSTextField * fPiecesLabel, * fHashLabel, * fSecureLabel, * fCreatorLabel, * fDateCreatedLabel, * fCommentLabel, * fDataLocationLabel; IBOutlet NSTextField * fInfoSectionLabel, * fWhereSectionLabel; IBOutlet NSScrollView * fCommentScrollView; } - (void) setInfoForTorrents: (NSArray *) torrents; - (void) updateInfo; - (void) revealDataFile: (id) sender; @end transmission-2.92/macosx/PaxHeaders.4960/FileOutlineController.m0000644000000000000000000000013212644245522021617 xustar0030 mtime=1452362578.834700483 30 atime=1452362578.834700483 30 ctime=1457295923.111860821 transmission-2.92/macosx/FileOutlineController.m0000644000175000017500000006032412644245522023251 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: FileOutlineController.m 14662 2016-01-06 11:05:37Z mikedld $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "FileOutlineController.h" #import "Torrent.h" #import "FileListNode.h" #import "FileOutlineView.h" #import "FilePriorityCell.h" #import "FileRenameSheetController.h" #import "NSApplicationAdditions.h" #import "NSMutableArrayAdditions.h" #import "NSStringAdditions.h" #import #define ROW_SMALL_HEIGHT 18.0 typedef enum { FILE_CHECK_TAG, FILE_UNCHECK_TAG } fileCheckMenuTag; typedef enum { FILE_PRIORITY_HIGH_TAG, FILE_PRIORITY_NORMAL_TAG, FILE_PRIORITY_LOW_TAG } filePriorityMenuTag; @interface FileOutlineController (Private) - (NSMenu *) menu; - (NSUInteger) findFileNode: (FileListNode *) node inList: (NSArray *) list atIndexes: (NSIndexSet *) range currentParent: (FileListNode *) currentParent finalParent: (FileListNode **) parent; @end @implementation FileOutlineController - (void) awakeFromNib { fFileList = [[NSMutableArray alloc] init]; [fOutline setDoubleAction: @selector(revealFile:)]; [fOutline setTarget: self]; //set table header tool tips [[fOutline tableColumnWithIdentifier: @"Check"] setHeaderToolTip: NSLocalizedString(@"Download", "file table -> header tool tip")]; [[fOutline tableColumnWithIdentifier: @"Priority"] setHeaderToolTip: NSLocalizedString(@"Priority", "file table -> header tool tip")]; [fOutline setMenu: [self menu]]; [self setTorrent: nil]; } - (void) dealloc { [fFileList release]; [fFilterText release]; [super dealloc]; } - (FileOutlineView *) outlineView { return fOutline; } - (void) setTorrent: (Torrent *) torrent { fTorrent = torrent; [fFileList setArray: [fTorrent fileList]]; [fFilterText release]; fFilterText = nil; [fOutline reloadData]; [fOutline deselectAll: nil]; //do this after reloading the data #4575 } - (void) setFilterText: (NSString *) text { NSArray * components = [text betterComponentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; if (!components || [components count] == 0) { text = nil; components = nil; } if ((!text && !fFilterText) || (text && fFilterText && [text isEqualToString: fFilterText])) return; [fOutline beginUpdates]; NSUInteger currentIndex = 0, totalCount = 0; NSMutableArray * itemsToAdd = [NSMutableArray array]; NSMutableIndexSet * itemsToAddIndexes = [NSMutableIndexSet indexSet]; NSMutableDictionary * removedIndexesForParents = nil; //ugly, but we can't modify the actual file nodes NSArray * tempList = !text ? [fTorrent fileList] : [fTorrent flatFileList]; for (FileListNode * item in tempList) { __block BOOL filter = NO; if (components) { [components enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(id obj, NSUInteger idx, BOOL * stop) { if ([[item name] rangeOfString: (NSString *)obj options: (NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch)].location == NSNotFound) { filter = YES; *stop = YES; } }]; } if (!filter) { FileListNode * parent = nil; NSUInteger previousIndex = ![item isFolder] ? [self findFileNode: item inList: fFileList atIndexes: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(currentIndex, [fFileList count]-currentIndex)] currentParent: nil finalParent: &parent] : NSNotFound; if (previousIndex == NSNotFound) { [itemsToAdd addObject: item]; [itemsToAddIndexes addIndex: totalCount]; } else { BOOL move = YES; if (!parent) { if (previousIndex != currentIndex) [fFileList moveObjectAtIndex: previousIndex toIndex: currentIndex]; else move = NO; } else { [fFileList insertObject: item atIndex: currentIndex]; //figure out the index within the semi-edited table - UGLY if (!removedIndexesForParents) removedIndexesForParents = [NSMutableDictionary dictionary]; NSMutableIndexSet * removedIndexes = [removedIndexesForParents objectForKey: parent]; if (!removedIndexes) { removedIndexes = [NSMutableIndexSet indexSetWithIndex: previousIndex]; [removedIndexesForParents setObject: removedIndexes forKey: parent]; } else { [removedIndexes addIndex: previousIndex]; previousIndex -= [removedIndexes countOfIndexesInRange: NSMakeRange(0, previousIndex)]; } } if (move) [fOutline moveItemAtIndex: previousIndex inParent: parent toIndex: currentIndex inParent: nil]; ++currentIndex; } ++totalCount; } } //remove trailing items - those are the unused if (currentIndex < [fFileList count]) { const NSRange removeRange = NSMakeRange(currentIndex, [fFileList count]-currentIndex); [fFileList removeObjectsInRange: removeRange]; [fOutline removeItemsAtIndexes: [NSIndexSet indexSetWithIndexesInRange: removeRange] inParent: nil withAnimation: NSTableViewAnimationSlideDown]; } //add new items [fFileList insertObjects: itemsToAdd atIndexes: itemsToAddIndexes]; [fOutline insertItemsAtIndexes: itemsToAddIndexes inParent: nil withAnimation: NSTableViewAnimationSlideUp]; [fOutline endUpdates]; [fFilterText release]; fFilterText = [text retain]; } - (void) refresh { [fTorrent updateFileStat]; [fOutline setNeedsDisplay: YES]; } - (void) outlineViewSelectionDidChange: (NSNotification *) notification { if ([QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible]) [[QLPreviewPanel sharedPreviewPanel] reloadData]; } - (NSInteger) outlineView: (NSOutlineView *) outlineView numberOfChildrenOfItem: (id) item { if (!item) return fFileList ? [fFileList count] : 0; else { FileListNode * node = (FileListNode *)item; return [node isFolder] ? [[node children] count] : 0; } } - (BOOL) outlineView: (NSOutlineView *) outlineView isItemExpandable: (id) item { return [(FileListNode *)item isFolder]; } - (id) outlineView: (NSOutlineView *) outlineView child: (NSInteger) index ofItem: (id) item { return [(item ? [(FileListNode *)item children] : fFileList) objectAtIndex: index]; } - (id) outlineView: (NSOutlineView *) outlineView objectValueForTableColumn: (NSTableColumn *) tableColumn byItem: (id) item { if ([[tableColumn identifier] isEqualToString: @"Check"]) return [NSNumber numberWithInteger: [fTorrent checkForFiles: [(FileListNode *)item indexes]]]; else return item; } - (void) outlineView: (NSOutlineView *) outlineView willDisplayCell: (id) cell forTableColumn: (NSTableColumn *) tableColumn item: (id) item { NSString * identifier = [tableColumn identifier]; if ([identifier isEqualToString: @"Check"]) [cell setEnabled: [fTorrent canChangeDownloadCheckForFiles: [(FileListNode *)item indexes]]]; else if ([identifier isEqualToString: @"Priority"]) { [cell setRepresentedObject: item]; NSInteger hoveredRow = [fOutline hoveredRow]; [(FilePriorityCell *)cell setHovered: hoveredRow != -1 && hoveredRow == [fOutline rowForItem: item]]; } else; } - (void) outlineView: (NSOutlineView *) outlineView setObjectValue: (id) object forTableColumn: (NSTableColumn *) tableColumn byItem: (id) item { NSString * identifier = [tableColumn identifier]; if ([identifier isEqualToString: @"Check"]) { NSIndexSet * indexSet; if ([NSEvent modifierFlags] & NSAlternateKeyMask) indexSet = [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fTorrent fileCount])]; else indexSet = [(FileListNode *)item indexes]; [fTorrent setFileCheckState: [object intValue] != NSOffState ? NSOnState : NSOffState forIndexes: indexSet]; [fOutline setNeedsDisplay: YES]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil]; } } - (NSString *) outlineView: (NSOutlineView *) outlineView typeSelectStringForTableColumn: (NSTableColumn *) tableColumn item: (id) item { return [(FileListNode *)item name]; } - (NSString *) outlineView: (NSOutlineView *) outlineView toolTipForCell: (NSCell *) cell rect: (NSRectPointer) rect tableColumn: (NSTableColumn *) tableColumn item: (id) item mouseLocation: (NSPoint) mouseLocation { NSString * ident = [tableColumn identifier]; if ([ident isEqualToString: @"Name"]) { NSString * path = [fTorrent fileLocation: item]; if (!path) path = [[(FileListNode *)item path] stringByAppendingPathComponent: [(FileListNode *)item name]]; return path; } else if ([ident isEqualToString: @"Check"]) { switch ([cell state]) { case NSOffState: return NSLocalizedString(@"Don't Download", "files tab -> tooltip"); case NSOnState: return NSLocalizedString(@"Download", "files tab -> tooltip"); case NSMixedState: return NSLocalizedString(@"Download Some", "files tab -> tooltip"); } } else if ([ident isEqualToString: @"Priority"]) { NSSet * priorities = [fTorrent filePrioritiesForIndexes: [(FileListNode *)item indexes]]; switch ([priorities count]) { case 0: return NSLocalizedString(@"Priority Not Available", "files tab -> tooltip"); case 1: switch ([[priorities anyObject] intValue]) { case TR_PRI_LOW: return NSLocalizedString(@"Low Priority", "files tab -> tooltip"); case TR_PRI_HIGH: return NSLocalizedString(@"High Priority", "files tab -> tooltip"); case TR_PRI_NORMAL: return NSLocalizedString(@"Normal Priority", "files tab -> tooltip"); } break; default: return NSLocalizedString(@"Multiple Priorities", "files tab -> tooltip"); } } else; return nil; } - (CGFloat) outlineView: (NSOutlineView *) outlineView heightOfRowByItem: (id) item { if ([(FileListNode *)item isFolder]) return ROW_SMALL_HEIGHT; else return [outlineView rowHeight]; } - (void) setCheck: (id) sender { NSInteger state = [sender tag] == FILE_UNCHECK_TAG ? NSOffState : NSOnState; NSIndexSet * indexSet = [fOutline selectedRowIndexes]; NSMutableIndexSet * itemIndexes = [NSMutableIndexSet indexSet]; for (NSInteger i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i]) [itemIndexes addIndexes: [[fOutline itemAtRow: i] indexes]]; [fTorrent setFileCheckState: state forIndexes: itemIndexes]; [fOutline setNeedsDisplay: YES]; } - (void) setOnlySelectedCheck: (id) sender { NSIndexSet * indexSet = [fOutline selectedRowIndexes]; NSMutableIndexSet * itemIndexes = [NSMutableIndexSet indexSet]; for (NSInteger i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i]) [itemIndexes addIndexes: [[fOutline itemAtRow: i] indexes]]; [fTorrent setFileCheckState: NSOnState forIndexes: itemIndexes]; NSMutableIndexSet * remainingItemIndexes = [NSMutableIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fTorrent fileCount])]; [remainingItemIndexes removeIndexes: itemIndexes]; [fTorrent setFileCheckState: NSOffState forIndexes: remainingItemIndexes]; [fOutline setNeedsDisplay: YES]; } - (void) checkAll { NSIndexSet * indexSet = [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fTorrent fileCount])]; [fTorrent setFileCheckState: NSOnState forIndexes: indexSet]; [fOutline setNeedsDisplay: YES]; } - (void) uncheckAll { NSIndexSet * indexSet = [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fTorrent fileCount])]; [fTorrent setFileCheckState: NSOffState forIndexes: indexSet]; [fOutline setNeedsDisplay: YES]; } - (void) setPriority: (id) sender { tr_priority_t priority; switch ([sender tag]) { case FILE_PRIORITY_HIGH_TAG: priority = TR_PRI_HIGH; break; case FILE_PRIORITY_NORMAL_TAG: priority = TR_PRI_NORMAL; break; case FILE_PRIORITY_LOW_TAG: priority = TR_PRI_LOW; } NSIndexSet * indexSet = [fOutline selectedRowIndexes]; NSMutableIndexSet * itemIndexes = [NSMutableIndexSet indexSet]; for (NSInteger i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i]) [itemIndexes addIndexes: [[fOutline itemAtRow: i] indexes]]; [fTorrent setFilePriority: priority forIndexes: itemIndexes]; [fOutline setNeedsDisplay: YES]; } - (void) revealFile: (id) sender { NSIndexSet * indexes = [fOutline selectedRowIndexes]; NSMutableArray * paths = [NSMutableArray arrayWithCapacity: [indexes count]]; for (NSUInteger i = [indexes firstIndex]; i != NSNotFound; i = [indexes indexGreaterThanIndex: i]) { NSString * path = [fTorrent fileLocation: [fOutline itemAtRow: i]]; if (path) [paths addObject: [NSURL fileURLWithPath: path]]; } if ([paths count] > 0) [[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs: paths]; } - (void) renameSelected: (id) sender { NSIndexSet * indexes = [fOutline selectedRowIndexes]; NSAssert([indexes count] == 1, @"1 file needs to be selected to rename, but %ld are selected", [indexes count]); FileListNode * node = [fOutline itemAtRow: [indexes firstIndex]]; Torrent * torrent = [node torrent]; if (![torrent isFolder]) { [FileRenameSheetController presentSheetForTorrent: torrent modalForWindow: [fOutline window] completionHandler: ^(BOOL didRename) { if (didRename) { [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateQueue" object: self]; [[NSNotificationCenter defaultCenter] postNotificationName: @"ResetInspector" object: self userInfo: @{ @"Torrent" : torrent }]; } }]; } else { [FileRenameSheetController presentSheetForFileListNode: node modalForWindow: [fOutline window] completionHandler: ^(BOOL didRename) { #warning instead of calling reset inspector, just resort? if (didRename) [[NSNotificationCenter defaultCenter] postNotificationName: @"ResetInspector" object: self userInfo: @{ @"Torrent" : torrent }]; }]; } } #warning make real view controller (Leopard-only) so that Command-R will work - (BOOL) validateMenuItem: (NSMenuItem *) menuItem { if (!fTorrent) return NO; SEL action = [menuItem action]; if (action == @selector(revealFile:)) { NSIndexSet * indexSet = [fOutline selectedRowIndexes]; for (NSInteger i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i]) if ([fTorrent fileLocation: [fOutline itemAtRow: i]] != nil) return YES; return NO; } if (action == @selector(setCheck:)) { if ([fOutline numberOfSelectedRows] == 0) return NO; NSIndexSet * indexSet = [fOutline selectedRowIndexes]; NSMutableIndexSet * itemIndexes = [NSMutableIndexSet indexSet]; for (NSInteger i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i]) [itemIndexes addIndexes: [[fOutline itemAtRow: i] indexes]]; NSInteger state = ([menuItem tag] == FILE_CHECK_TAG) ? NSOnState : NSOffState; return [fTorrent checkForFiles: itemIndexes] != state && [fTorrent canChangeDownloadCheckForFiles: itemIndexes]; } if (action == @selector(setOnlySelectedCheck:)) { if ([fOutline numberOfSelectedRows] == 0) return NO; NSIndexSet * indexSet = [fOutline selectedRowIndexes]; NSMutableIndexSet * itemIndexes = [NSMutableIndexSet indexSet]; for (NSInteger i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i]) [itemIndexes addIndexes: [[fOutline itemAtRow: i] indexes]]; return [fTorrent canChangeDownloadCheckForFiles: itemIndexes]; } if (action == @selector(setPriority:)) { if ([fOutline numberOfSelectedRows] == 0) { [menuItem setState: NSOffState]; return NO; } //determine which priorities are checked NSIndexSet * indexSet = [fOutline selectedRowIndexes]; tr_priority_t priority; switch ([menuItem tag]) { case FILE_PRIORITY_HIGH_TAG: priority = TR_PRI_HIGH; break; case FILE_PRIORITY_NORMAL_TAG: priority = TR_PRI_NORMAL; break; case FILE_PRIORITY_LOW_TAG: priority = TR_PRI_LOW; break; } BOOL current = NO, canChange = NO; for (NSInteger i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i]) { NSIndexSet * fileIndexSet = [[fOutline itemAtRow: i] indexes]; if (![fTorrent canChangeDownloadCheckForFiles: fileIndexSet]) continue; canChange = YES; if ([fTorrent hasFilePriority: priority forIndexes: fileIndexSet]) { current = YES; break; } } [menuItem setState: current ? NSOnState : NSOffState]; return canChange; } if (action == @selector(renameSelected:)) { return [fOutline numberOfSelectedRows] == 1; } return YES; } @end @implementation FileOutlineController (Private) - (NSMenu *) menu { NSMenu * menu = [[NSMenu alloc] initWithTitle: @"File Outline Menu"]; //check and uncheck NSMenuItem * item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString(@"Check Selected", "File Outline -> Menu") action: @selector(setCheck:) keyEquivalent: @""]; [item setTarget: self]; [item setTag: FILE_CHECK_TAG]; [menu addItem: item]; [item release]; item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString(@"Uncheck Selected", "File Outline -> Menu") action: @selector(setCheck:) keyEquivalent: @""]; [item setTarget: self]; [item setTag: FILE_UNCHECK_TAG]; [menu addItem: item]; [item release]; //only check selected item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString(@"Only Check Selected", "File Outline -> Menu") action: @selector(setOnlySelectedCheck:) keyEquivalent: @""]; [item setTarget: self]; [menu addItem: item]; [item release]; [menu addItem: [NSMenuItem separatorItem]]; //priority item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString(@"Priority", "File Outline -> Menu") action: NULL keyEquivalent: @""]; NSMenu * priorityMenu = [[NSMenu alloc] initWithTitle: @"File Priority Menu"]; [item setSubmenu: priorityMenu]; [menu addItem: item]; [item release]; item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString(@"High", "File Outline -> Priority Menu") action: @selector(setPriority:) keyEquivalent: @""]; [item setTarget: self]; [item setTag: FILE_PRIORITY_HIGH_TAG]; [item setImage: [NSImage imageNamed: @"PriorityHighTemplate"]]; [priorityMenu addItem: item]; [item release]; item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString(@"Normal", "File Outline -> Priority Menu") action: @selector(setPriority:) keyEquivalent: @""]; [item setTarget: self]; [item setTag: FILE_PRIORITY_NORMAL_TAG]; [item setImage: [NSImage imageNamed: @"PriorityNormalTemplate"]]; [priorityMenu addItem: item]; [item release]; item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString(@"Low", "File Outline -> Priority Menu") action: @selector(setPriority:) keyEquivalent: @""]; [item setTarget: self]; [item setTag: FILE_PRIORITY_LOW_TAG]; [item setImage: [NSImage imageNamed: @"PriorityLowTemplate"]]; [priorityMenu addItem: item]; [item release]; [priorityMenu release]; [menu addItem: [NSMenuItem separatorItem]]; //reveal in finder item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString(@"Show in Finder", "File Outline -> Menu") action: @selector(revealFile:) keyEquivalent: @""]; [item setTarget: self]; [menu addItem: item]; [item release]; [menu addItem: [NSMenuItem separatorItem]]; //rename item = [[NSMenuItem alloc] initWithTitle: [NSLocalizedString(@"Rename File", "File Outline -> Menu") stringByAppendingEllipsis] action: @selector(renameSelected:) keyEquivalent: @""]; [item setTarget: self]; [menu addItem: item]; [item release]; return [menu autorelease]; } - (NSUInteger) findFileNode: (FileListNode *) node inList: (NSArray *) list atIndexes: (NSIndexSet *) indexes currentParent: (FileListNode *) currentParent finalParent: (FileListNode **) parent { NSAssert(![node isFolder], @"Looking up folder node!"); __block NSUInteger retIndex = NSNotFound; [list enumerateObjectsAtIndexes: indexes options: NSEnumerationConcurrent usingBlock: ^(id checkNode, NSUInteger index, BOOL * stop) { if ([[checkNode indexes] containsIndex: [[node indexes] firstIndex]]) { if (![checkNode isFolder]) { NSAssert2([checkNode isEqualTo: node], @"Expected file nodes to be equal: %@ %@", checkNode, node); *parent = currentParent; retIndex = index; } else { const NSUInteger subIndex = [self findFileNode: node inList: [checkNode children] atIndexes: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [[checkNode children] count])] currentParent: checkNode finalParent: parent]; NSAssert(subIndex != NSNotFound, @"We didn't find an expected file node."); retIndex = subIndex; } *stop = YES; } }]; return retIndex; } @end transmission-2.92/macosx/PaxHeaders.4960/FileListNode.m0000644000000000000000000000013112442116621017645 xustar0030 mtime=1418239377.041464392 30 atime=1418239377.041464392 29 ctime=1457295923.08886043 transmission-2.92/macosx/FileListNode.m0000644000175000017500000001327412442116621021302 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: FileListNode.m 14036 2013-02-19 01:29:25Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "FileListNode.h" @interface FileListNode (Private) - (id) initWithFolder: (BOOL) isFolder name: (NSString *) name path: (NSString *) path torrent: (Torrent *) torrent; @end @implementation FileListNode #warning remove ivars in header when 64-bit only (or it compiles in 32-bit mode) @synthesize name = fName; @synthesize path = fPath; @synthesize torrent = fTorrent; @synthesize size = fSize; @synthesize icon = fIcon; @synthesize isFolder = fIsFolder; @synthesize indexes = fIndexes; @synthesize children = fChildren; - (id) initWithFolderName: (NSString *) name path: (NSString *) path torrent: (Torrent *) torrent { if ((self = [self initWithFolder: YES name: name path: path torrent: torrent])) { fChildren = [[NSMutableArray alloc] init]; fSize = 0; } return self; } - (id) initWithFileName: (NSString *) name path: (NSString *) path size: (uint64_t) size index: (NSUInteger) index torrent: (Torrent *) torrent { if ((self = [self initWithFolder: NO name: name path: path torrent: torrent])) { fSize = size; [fIndexes addIndex: index]; } return self; } - (void) insertChild: (FileListNode *) child { NSAssert(fIsFolder, @"method can only be invoked on folders"); [fChildren addObject: child]; } - (void) insertIndex: (NSUInteger) index withSize: (uint64_t) size { NSAssert(fIsFolder, @"method can only be invoked on folders"); [fIndexes addIndex: index]; fSize += size; } - (id) copyWithZone: (NSZone *) zone { //this object is essentially immutable after initial setup return [self retain]; } - (void) dealloc { [fName release]; [fPath release]; [fIndexes release]; [fIcon release]; [fChildren release]; [super dealloc]; } - (NSString *) description { if (!fIsFolder) return [NSString stringWithFormat: @"%@ (%ld)", fName, [fIndexes firstIndex]]; else return [NSString stringWithFormat: @"%@ (folder: %@)", fName, fIndexes]; } - (NSImage *) icon { if (!fIcon) fIcon = [[[NSWorkspace sharedWorkspace] iconForFileType: fIsFolder ? NSFileTypeForHFSTypeCode(kGenericFolderIcon) : [fName pathExtension]] retain]; return fIcon; } - (NSMutableArray *) children { NSAssert(fIsFolder, @"method can only be invoked on folders"); return fChildren; } - (BOOL) updateFromOldName: (NSString *) oldName toNewName: (NSString *) newName inPath: (NSString *) path { NSParameterAssert(oldName != nil); NSParameterAssert(newName != nil); NSParameterAssert(path != nil); NSArray * lookupPathComponents = [path pathComponents]; NSArray * thesePathComponents = [self.path pathComponents]; if ([lookupPathComponents isEqualToArray: thesePathComponents]) //this node represents what's being renamed { if ([oldName isEqualToString: self.name]) { [fName release]; fName = [newName copy]; return YES; } } else if ([lookupPathComponents count] < [thesePathComponents count]) //what's being renamed is part of this node's path { lookupPathComponents = [lookupPathComponents arrayByAddingObject: oldName]; const BOOL allSame = NSNotFound == [lookupPathComponents indexOfObjectWithOptions: NSEnumerationConcurrent passingTest: ^BOOL(NSString * name, NSUInteger idx, BOOL * stop) { return ![name isEqualToString: [thesePathComponents objectAtIndex: idx]]; }]; if (allSame) { NSString * oldPathPrefix = [path stringByAppendingPathComponent: oldName]; NSString * newPathPrefix = [path stringByAppendingPathComponent: newName]; [fPath autorelease]; fPath = [[fPath stringByReplacingCharactersInRange: NSMakeRange(0, [oldPathPrefix length]) withString: newPathPrefix] retain]; return YES; } } return NO; } @end @implementation FileListNode (Private) - (id) initWithFolder: (BOOL) isFolder name: (NSString *) name path: (NSString *) path torrent: (Torrent *) torrent { if ((self = [super init])) { fIsFolder = isFolder; fName = [name copy]; fPath = [path copy]; fIndexes = [[NSMutableIndexSet alloc] init]; fTorrent = torrent; } return self; } @end transmission-2.92/macosx/PaxHeaders.4960/fr.lproj0000644000000000000000000000013112666747213016644 xustar0030 mtime=1457245835.339999059 30 atime=1418239372.488386365 29 ctime=1457295922.76485492 transmission-2.92/macosx/fr.lproj/0000755000175000017500000000000012666747213020347 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/fr.lproj/PaxHeaders.4960/InfoPlist.strings0000644000000000000000000000013112664476420022240 xustar0030 mtime=1456635152.034497176 30 atime=1456635152.034497176 29 ctime=1457295922.76485492 transmission-2.92/macosx/fr.lproj/InfoPlist.strings0000644000175000017500000000017212664476420023666 0ustar00mikedldmikedld00000000000000/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = "Copyright © 2005-2016 The Transmission Project";transmission-2.92/macosx/fr.lproj/PaxHeaders.4960/Creator.xib0000644000000000000000000000013112640354045021011 xustar0030 mtime=1451350053.934176163 30 atime=1451350053.933176145 29 ctime=1457295922.76485492 transmission-2.92/macosx/fr.lproj/Creator.xib0000644000175000017500000006047612640354045022454 0ustar00mikedldmikedld00000000000000 Fichier Fichier transmission-2.92/macosx/fr.lproj/PaxHeaders.4960/PrefsWindow.xib0000644000000000000000000000013112640354045021661 xustar0030 mtime=1451350053.931176111 30 atime=1451350053.931176111 29 ctime=1457295922.76485492 transmission-2.92/macosx/fr.lproj/PrefsWindow.xib0000644000175000017500000055251112640354045023320 0ustar00mikedldmikedld00000000000000 ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer NSAllRomanInputSourcesLocaleIdentifier NSAllRomanInputSourcesLocaleIdentifier YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7MTgsIDE4fdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPEQ3uTU0AKgAAAGiAOuBP8AQW DQeEQmFQuGQ2HQWBOuCQ+KRWLRSIxOLxuORaMx2QSGFx+RSWRSSTSmNyiVS2HyyXTGFTCZTWIQObTmDT SdS6eT2VT+gSahUOTzijTGi0mO0umSukU+UwEAAADwEAAAMAAAABABIAAAEBAAMAAAABABIAAAECAAMA AAAEAAABIgEDAAMAAAABAAUAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAESAAMAAAABAAEAAAEVAAMA AAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAAXwEcAAMAAAABAAEAAAE9AAMAAAABAAIAAAFSAAMA AAABAAEAAAFTAAMAAAAEAAABKodzAAcAAAy8AAABMgAAAAAACAAIAAgACAABAAEAAQABAAAMvGFwcGwC EAAAbW50clJHQiBYWVogB94AAQAIAAkANQAXYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA APbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAARZGVzYwAAAVAAAABiZHNjbQAAAbQAAAGkY3BydAAAA1gAAAAjd3RwdAAAA3wAAAAUclhZWgAAA5AA AAAUZ1hZWgAAA6QAAAAUYlhZWgAAA7gAAAAUclRSQwAAA8wAAAgMYWFyZwAAC9gAAAAgdmNndAAAC/gA AAAwbmRpbgAADCgAAAA+Y2hhZAAADGgAAAAsbW1vZAAADJQAAAAoYlRSQwAAA8wAAAgMZ1RSQwAAA8wA AAgMYWFiZwAAC9gAAAAgYWFnZwAAC9gAAAAgZGVzYwAAAAAAAAAIRGlzcGxheQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAG1sdWMAAAAAAAAAIQAAAAxockhSAAAACAAAAZxrb0tSAAAACAAAAZxuYk5PAAAACAAAAZxp ZAAAAAAACAAAAZxodUhVAAAACAAAAZxjc0NaAAAACAAAAZxkYURLAAAACAAAAZx1a1VBAAAACAAAAZxh cgAAAAAACAAAAZxpdElUAAAACAAAAZxyb1JPAAAACAAAAZxubE5MAAAACAAAAZxoZUlMAAAACAAAAZxl c0VTAAAACAAAAZxmaUZJAAAACAAAAZx6aFRXAAAACAAAAZx2aVZOAAAACAAAAZxza1NLAAAACAAAAZx6 aENOAAAACAAAAZxydVJVAAAACAAAAZxmckZSAAAACAAAAZxtcwAAAAAACAAAAZxjYUVTAAAACAAAAZx0 aFRIAAAACAAAAZxkZURFAAAACAAAAZxlblVTAAAACAAAAZxwdEJSAAAACAAAAZxwbFBMAAAACAAAAZxl bEdSAAAACAAAAZxzdlNFAAAACAAAAZx0clRSAAAACAAAAZxqYUpQAAAACAAAAZxwdFBUAAAACAAAAZwA aQBNAGEAY3RleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMTQAAFhZWiAAAAAAAADzFgABAAAA ARbKWFlaIAAAAAAAAHHAAAA5igAAAWdYWVogAAAAAAAAYSMAALnmAAAT9lhZWiAAAAAAAAAj8gAADJAA AL3QY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgA bQByAHcAfACBAIYAiwCQAJUAmgCfAKMAqACtALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEB BwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB 2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC 9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUE YwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYG JwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDII RghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4K xQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4N qQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ 9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsU rRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y 1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcd cB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9wo DSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEu Fi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0 njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7 qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdD OkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxL U0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT 9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZd J114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm 6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBx OnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8 IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuH n4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02T tpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qg aaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUSt uK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67 p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZ bNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6Lzp RunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5 x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//9wYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKDnZjZ3QA AAAAAAAAAQABAAAAAAAAAAEAAAABAAAAAAAAAAEAAAABAAAAAAAAAAEAAG5kaW4AAAAAAAAANgAAp0AA AFWAAABMwAAAnsAAACWAAAAMwAAAUAAAAFRAAAIzMwACMzMAAjMzAAAAAAAAAABzZjMyAAAAAAABDHIA AAX4///zHQAAB7oAAP1y///7nf///aQAAAPZAADAcW1tb2QAAAAAAAAGEAAAoAcAAAAAySceAAAAAAAA AAAAAAAAAAAAAADSJSYnKFokY2xhc3NuYW1lWCRjbGFzc2VzXxAQTlNCaXRtYXBJbWFnZVJlcKMnKSpa TlNJbWFnZVJlcFhOU09iamVjdNIlJiwtV05TQXJyYXmiLCrSJSYvMF5OU011dGFibGVBcnJheaMvLCrT MjMKNDU2V05TV2hpdGVcTlNDb2xvclNwYWNlRDAgMAAQA4AM0iUmODlXTlNDb2xvcqI4KtIlJjs8V05T SW1hZ2WiOypfEA9OU0tleWVkQXJjaGl2ZXLRP0BUcm9vdIABAAgAEQAaACMALQAyADcARgBMAFcAXgBl AHIAeQCBAIMAhQCKAIwAjgCXAJwApwCpAKsArQCyALUAtwC5ALsAvQDCANkA2wDdDs8O1A7fDugO+w7/ DwoPEw8YDyAPIw8oDzcPOw9CD0oPVw9cD14PYA9lD20PcA91D30PgA+SD5UPmgAAAAAAAAIBAAAAAAAA AEEAAAAAAAAAAAAAAAAAAA+cA transmission-2.92/macosx/fr.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013112640354045022542 xustar0030 mtime=1451350053.932176128 30 atime=1451350053.932176128 29 ctime=1457295922.76485492 transmission-2.92/macosx/fr.lproj/Localizable.strings0000644000175000017500000011451012640354045024172 0ustar00mikedldmikedld00000000000000/* Inspector -> selected torrents stats -> bytes */ "%@ bytes" = "%@ octets"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "%@ files" = "%@ fichiers"; /* Prefs -> blocklist -> message */ "%@ IP address rules in list" = "%@ adresses IP dans la liste"; /* Inspector -> selected torrents */ "%@ magnetized transfers" = "%@ transferts aimants"; /* Blocklist -> message Inspector -> Files tab -> file status string Status bar transfer count Torrent -> progress string */ "%@ of %@" = "%1$@ sur %2$@"; /* Torrent -> progress string */ "%@ of torrent metadata retrieved" = "%@ des métadonnées du torrent récupérées"; /* Torrent -> eta string */ "%@ remaining" = "%@ restant"; /* Add torrent -> info Inspector -> Activity tab -> progress Torrent -> progress string */ "%@ selected" = "%@ sélectionné"; /* stats window -> times opened */ "%@ times" = "%@ fois"; /* Drag overlay -> torrents */ "%@ Torrent Files" = "%@ Fichiers Torrent"; /* Inspector -> selected torrents */ "%@ Torrents Selected" = "%@ Torrents Sélectionnés"; /* Inspector -> selected torrents stats total */ "%@ total" = "%@ total"; /* Filter Bar Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "%@ transfers" = "%@ transferts"; /* Inspector -> Activity tab -> have */ "%@ verified" = "%@ vérifié"; /* Inspector -> Peers tab -> peers */ "%d cache" = "%d cache"; /* Inspector -> Peers tab -> peers */ "%d Connected" = "%d Connecté"; /* Inspector -> Peers tab -> peers */ "%d DHT" = "%d DHT"; /* Dock item - Downloading */ "%d Downloading" = "%d Téléchargements"; /* Inspector -> Peers tab -> peers */ "%d incoming" = "%d entrante"; /* Action menu -> upload/download limit Status Bar -> speed tooltip */ "%d KB/s" = "%d Ko/s"; /* Inspector -> Peers tab -> peers */ "%d local discovery" = "%d découverte locale"; /* Inspector -> Peers tab -> peers */ "%d LTEP" = "%d LTEP"; /* Info options -> global setting */ "%d minutes" = "%d minutes"; /* Inspector -> Peers tab -> peers */ "%d PEX" = "%d PEX"; /* Create torrent -> info */ "%d pieces, %@ each" = "%1$d pièces, %2$@ chaque"; /* Dock item - Seeding */ "%d Seeding" = "%d Envois"; /* Inspector -> Peers tab -> peers */ "%d tracker" = "%d trackeur"; /* Torrent -> status string */ "%d web seeds" = "%d sources Web"; /* time string */ "%u days" = "%u jours"; /* time string */ "%u hr" = "%u hr"; /* time string */ "%u min" = "%u min"; /* time string */ "%u sec" = "%u sec"; /* time string */ "%u years" = "%u ans"; /* time string */ "1 day" = "1 jour"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "1 file" = "1 fichiers"; /* Inspector -> selected torrents */ "1 magnetized transfer" = "1 transfert aimant"; /* Info options -> global setting */ "1 minute" = "1 minute"; /* Create torrent -> info */ "1 piece, %@" = "1 pièce, %@"; /* stats window -> times opened */ "1 time" = "1 fois"; /* Filter Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "1 transfer" = "1 transfert"; /* time string */ "1 year" = "1 an"; /* Open invalid alert -> title */ "\"%@\" is not a valid torrent file." = "\"%@\" n'est pas un fichier torrent valide."; /* Prefs -> blocklist -> message */ "A blocklist must first be downloaded" = "Aucune liste de blocage existante"; /* Create torrent -> file already exists warning -> warning */ "A file with the name \"%@\" already exists in the directory \"%@\". Choose a new name or directory to create the torrent file." = "Un fichier nommé \"%1$@\" existe déja dans le dossier \"%2$@\". Choisissez un autre nom ou un autre dossier pour créer le torrent."; /* Move inside itself alert -> title */ "A folder cannot be moved to inside itself." = "Un dossier ne peut être déplacé à l'intérieur de lui-même."; /* Create torrent -> zero size -> warning */ "A torrent file cannot be created for files with no size." = "Un torrent ne peut être créé à partir de fichiers vides."; /* Create torrent -> file already exists warning -> title */ "A torrent file with this name and directory cannot be created." = "Un torrent avec ce nom ne peut être créé dans ce répertoire."; /* Create torrent -> blank address -> message */ "A transfer marked as private with no tracker addresses will be unable to connect to peers. The torrent file will only be useful if you plan to upload the file to a tracker website that will add the addresses for you." = "Un transfert marqué comme privé et ne possédant pas d'adresse de trackeur ne pourra pas se connecter à des pairs. Le fichier torrent ne pourra être utilisable qu'une fois envoyé à un site de trackeur qui y ajoutera ses adresses."; /* Open duplicate alert -> title Open duplicate magnet alert -> title */ "A transfer of \"%@\" already exists." = "Un transfert de \"%@\" est déja en cours."; /* Filter Bar -> filter button */ "Active" = "Actif"; /* Inspector -> tab Inspector view -> title */ "Activity" = "Activité"; /* Add torrent -> same name -> button */ "Add" = "Ajouter"; /* Inspector view -> tracker buttons */ "Add a tracker" = "Ajouter un trackeur"; /* Magnet link failed -> title */ "Adding magnetized transfer failed." = "L'ajout d'un transfert aimanté a échoué."; /* Filter Bar -> filter button */ "All" = "Tous"; /* Groups -> Button */ "All Groups" = "Tous les groupes"; /* Create torrent -> failed -> warning */ "An unknown error has occurred." = "Une erreur inconnue est survenue."; /* Tracker last announce */ "Announce error" = "Erreur à l'annonce"; /* Tracker next announce */ "Announce in progress" = "Annonce en cours"; /* Tracker next announce */ "Announce is queued" = "Annonce en attente"; /* Tracker next announce */ "Announce not scheduled" = "Annonce non programmée"; /* Tracker last announce */ "Announce timed out" = "Annonce sans réponse"; /* All toolbar item -> label */ "Apply All" = "Appliquer à tous"; /* Selected toolbar item -> label */ "Apply Selected" = "Appliquer à la sélection"; /* Confirm Quit panel -> title */ "Are you sure you want to quit?" = "Êtes-vous sûr de vouloir quitter ?"; /* Remove completed confirm panel -> title */ "Are you sure you want to remove %@ completed transfers from the transfer list?" = "Êtes-vous sûr de vouloir supprimer %@ transferts terminés de la liste de transferts ?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list and trash the data files?" = "Êtes-vous sûr de vouloir supprimer %@ transferts de la liste de transferts et de supprimer leurs données ?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list?" = "Êtes-vous sûr de vouloir supprimer %@ transferts de la liste de transferts ?"; /* Remove trackers alert -> title */ "Are you sure you want to remove %d trackers?" = "Êtes-vous sûr de vouloir supprimer %d trackeurs ?"; /* Removal confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list and trash the data file?" = "Êtes-vous sûr de vouloir enlever \"%@\" de la liste et de supprimer ses données ?"; /* Removal confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list?" = "Êtes-vous sûr de vouloir enlever \"%@\" de la liste ?"; /* Remove trackers alert -> title */ "Are you sure you want to remove this tracker?" = "Êtes-vous sûr de vouloir supprimer ce trackeur ?"; /* Stats reset -> title */ "Are you sure you want to reset usage statistics?" = "Êtes-vous sûr de vouloir remettre à zéro les statistiques d'utilisation ?"; /* inspector -> peer table -> header tool tip */ "Available" = "Disponible"; /* Preferences -> toolbar item title */ "Bandwidth" = "Bande-passante"; /* Growl notification description */ "Bandwidth settings changed" = "Réglages de bande-passante changés"; /* Groups -> Name */ "Blue" = "Bleu"; /* Add torrent -> same name -> button Blocklist -> cancel button Confirm Quit panel -> button Create torrent -> blank address -> button Removal confirm panel -> button Remove trackers alert -> button Stats reset -> button */ "Cancel" = "Annuler"; /* Torrent Table -> tooltip */ "Change transfer settings" = "Changer les réglages du transfert"; /* File Outline -> Menu */ "Check Selected" = "Cocher sélectionnés"; /* Torrent -> status string */ "Checking existing data" = "Vérification des données existantes"; /* Message window -> save button */ "Clear" = "Effacer"; /* inspector -> peer table -> header */ "Client" = "Client"; /* View menu -> Quick Look */ "Close Quick Look" = "Fermer QuickLook"; /* Prefs -> Notifications */ "Configure In Growl" = "Configurer dans Growl"; /* Prefs -> Notifications */ "Configure In System Preferences" = "Configurer dans les Préférences Système"; /* Blocklist -> message */ "Connecting to site" = "Connexion au site"; /* Torrent file copy alert -> title */ "Copy of \"%@\" Cannot Be Created" = "La copie de \"%@\" ne peut être créée"; /* Create torrent -> failed -> warning */ "Could not read \"%s\": %s." = "Impossible de lire \"%1$s\" : %2$s."; /* Create torrent -> failed -> warning */ "Could not write \"%s\": %s." = "Impossible d'écrire \"%1$s\" : %2$s."; /* Create toolbar item -> label Create torrent -> blank address -> button */ "Create" = "Créer"; /* Drag overlay -> file */ "Create a Torrent File" = "Créer un fichier torrent"; /* Create toolbar item -> tooltip */ "Create torrent file" = "Créer fichier torrent"; /* Create toolbar item -> palette label Create torrent -> select file */ "Create Torrent File" = "Créer Fichier Torrent"; /* Create torrent -> failed -> title */ "Creation of \"%@\" failed." = "La création de \"%@\" a échoué."; /* Inspector -> peer -> status */ "Currently downloading (interested and not choked)" = "En téléchargement (intéressé et pas étranglé)"; /* Inspector -> peer -> status */ "Currently uploading (interested and not choked)" = "En envoi (intéressé et pas étranglé)"; /* Message window -> table column */ "Date" = "Date"; /* Message window -> level Message window -> level string */ "Debug" = "Debug"; /* Info options -> global setting */ "disabled" = "désactivé"; /* inspector -> peer table -> header inspector -> web seed table -> header status bar -> status label Torrent -> status string */ "DL" = "DL"; /* Inspector -> Peers tab -> peers */ "DL from %d" = "Réception de %d"; /* Torrent disk space alert -> button */ "Do not check disk space again" = "Ne plus vérifier l'espace disque"; /* Donation beg -> button */ "Don't bug me about this ever again." = "Ne plus jamais me parler de ça."; /* files tab -> tooltip */ "Don't Download" = "Ne pas télécharger"; /* Donation beg -> button */ "Donate" = "Donner"; /* Donation beg -> message */ "Donate or not, there will be no difference to your torrenting experience." = "Faites un don (ou pas), il n'y aura aucune différence sur votre expérience de \"torrentage\"."; /* file table -> header tool tip files tab -> tooltip */ "Download" = "Téléchargement"; /* Torrent disk space alert -> button */ "Download Anyway" = "Télécharger quand même"; /* Growl notification title */ "Download Complete" = "Téléchargement terminé"; /* Blocklist -> message */ "Download of the blocklist failed." = "Le téléchargement de la liste de blocage a échoué"; /* files tab -> tooltip */ "Download Some" = "Télécharger certains"; /* Torrent table -> group row -> tooltip */ "Download speed" = "Vitesse de téléchargement"; /* Stats window -> label tracker peer stat */ "Downloaded" = "Téléchargé"; /* Torrent -> status string */ "Downloading" = "Téléchargement"; /* Blocklist -> message */ "Downloading blocklist" = "Téléchargement de la liste de blocage"; /* Torrent -> status string */ "Downloading from %d of %d peers" = "Téléchargement de %1$d sur %2$d pairs"; /* Torrent -> status string */ "Downloading from %d of 1 peer" = "Téléchargement depuis %d de 1 pairs"; /* inspector -> peer table -> header tool tip */ "Downloading From Peer" = "Téléchargement depuis Pair"; /* inspector -> web seed table -> header tool tip */ "Downloading From Web Seed" = "Téléchargement depuis une source Web"; /* Inspector -> Peers tab -> table row tooltip */ "encrypted" = "encrypté"; /* inspector -> peer table -> header tool tip Inspector -> Peers tab -> table row tooltip */ "Encrypted Connection" = "Connexion cryptée"; /* Message window -> level Message window -> level string Torrent -> status string */ "Error" = "Erreur"; /* Inspector -> tab Inspector view -> title */ "Files" = "Fichiers"; /* Filter toolbar item -> label inspector -> file filter Message window -> filter field */ "Filter" = "Filtre"; /* Inspector -> Peers tab -> table row tooltip */ "From: cache" = "De : cache"; /* Inspector -> Peers tab -> table row tooltip */ "From: distributed hash table" = "De : table de hachage distribuée"; /* Inspector -> Peers tab -> table row tooltip */ "From: incoming connection" = "De : connexion entrante"; /* Inspector -> Peers tab -> table row tooltip */ "From: libtorrent extension protocol handshake" = "De : protocole d'extension libtorrent"; /* Inspector -> Peers tab -> table row tooltip */ "From: local peer discovery" = "De : découverte des pairs locaux"; /* Inspector -> Peers tab -> table row tooltip */ "From: peer exchange" = "De : peer exchange"; /* Inspector -> Peers tab -> table row tooltip */ "From: tracker" = "De : trackeur"; /* File size - gigabytes Memory size - gigabytes */ "GB" = "Go"; /* Transfer speed (gigabytes per second) */ "GB/s" = "Go/s"; /* Preferences -> toolbar item title */ "General" = "Général"; /* Inspector -> tab Inspector view -> title */ "General Info" = "Infos générales"; /* Status Bar -> speed tooltip */ "Global download limit" = "Limite globale de téléchargement"; /* Status Bar -> speed tooltip */ "Global upload limit" = "Limite globale d'envoi"; /* Tracker last announce */ "got %d peers" = "obtenu %d pairs"; /* Tracker last announce */ "got 1 peer" = "obtenu 1 pair"; /* Groups -> Name */ "Gray" = "Gris"; /* Groups -> Name */ "Green" = "Vert"; /* Groups -> Button */ "Group" = "Groupe"; /* Preferences -> toolbar item title */ "Groups" = "Groupes"; /* View menu -> Filter Bar */ "Hide Filter Bar" = "Masquer la barre de filtre"; /* View menu -> Inspector */ "Hide Inspector" = "Masquer l'inspecteur"; /* View menu -> Status Bar */ "Hide Status Bar" = "Masquer la barre de status"; /* File Outline -> Priority Menu */ "High" = "Haute"; /* files tab -> tooltip */ "High Priority" = "Priorité haute"; /* Legal alert -> button */ "I Accept" = "J'accepte"; /* Add torrent -> same name -> message */ "If you are attempting to use already existing data, the root data directory should be inside the destination directory." = "Si vous êtes en train de tenter de réutiliser des données existantes, le dossier racine des données devrait être à l'intérieur du dossier choisi."; /* Torrent -> eta string */ "inactive" = "inactif"; /* Message window -> level Message window -> level string */ "Info" = "Info"; /* Inspector toolbar item -> label */ "Inspector" = "Inspecteur"; /* URL sheet label */ "Internet address of torrent file:" = "Adresse Internet du fichier torrent :"; /* inspector -> peer table -> header */ "IP Address" = "Adresse IP"; /* Download not a torrent -> message */ "It appears that the file \"%@\" from %@ is not a torrent file." = "Il semblerait que le ficher \"%1$@\" de %2$@ ne soit pas un fichier torrent."; /* File size - kilobytes Memory size - kilobytes */ "KB" = "Ko"; /* Transfer speed (kilobytes per second) */ "KB/s" = "Ko/s"; /* Tracker last announce */ "Last Announce" = "Dernière annonce"; /* Tracker last scrape */ "Last Scrape" = "Dernier scrape"; /* Prefs -> blocklist -> message */ "Last updated" = "Dernière mise à jour"; /* tracker peer stat */ "Leechers" = "Leechers"; /* About window -> license button */ "License" = "Licence"; /* Action menu -> upload/download limit torrent action menu -> upload/download limit */ "Limit (%d KB/s)" = "Limité (%d Ko/s)"; /* Save log alert panel -> title */ "Log Could Not Be Saved" = "Les messages n'ont pu être enregistrés"; /* File Outline -> Priority Menu */ "Low" = "Basse"; /* files tab -> tooltip */ "Low Priority" = "Priorité Basse"; /* Open duplicate magnet alert -> title */ "Magnet link is a duplicate of an existing transfer." = "Ce lien aimanté est un duplicata d'un transfert existant."; /* Inspector -> selected torrents Torrent -> progress string */ "Magnetized transfer" = "Transfert aimanté"; /* File size - megabytes Memory size - megabytes */ "MB" = "Mo"; /* Transfer speed (megabytes per second) */ "MB/s" = "Mo/s"; /* Message window -> table column */ "Message" = "Message"; /* Message window -> title */ "Message Log" = "Fenêtre des messages"; /* files tab -> tooltip */ "Multiple Priorities" = "Priorités multiples"; /* Inspector -> Peers tab -> table row tooltip No Ratio Prefs -> blocklist -> message Tracker last announce Tracker last scrape tracker peer stat */ "N/A" = "N/A"; /* Filter Bar -> filter menu */ "Name" = "Nom"; /* Preferences -> toolbar item title */ "Network" = "Réseau"; /* Prefs -> blocklist -> message */ "Never" = "Jamais"; /* Inspector -> tracker table */ "New Tier" = "Nouveau tier"; /* Tracker next announce */ "Next announce in %@" = "Prochaine annonce dans %@"; /* Group table row */ "No Group" = "Aucun Groupe"; /* Inspector -> selected torrents */ "No Torrents Selected" = "Aucun Torrent Sélectionné"; /* Groups -> Button Groups -> Menu */ "None" = "Aucun"; /* Donation beg -> button */ "Nope" = "Nan"; /* File Outline -> Priority Menu */ "Normal" = "Normale"; /* files tab -> tooltip */ "Normal Priority" = "Priorité Normale"; /* Torrent disk space alert -> title */ "Not enough remaining disk space to download \"%@\" completely." = "Pas suffisament d'espace disque restant pour télécharger complètement \"%@\"."; /* About window -> license close button Blocklist -> button Create torrent -> directory doesn't exist warning -> button Create torrent -> failed -> button Create torrent -> file already exists warning -> button Create torrent -> no files -> button Create torrent -> zero size -> button Download not a torrent -> button Magnet link failed -> button Move error alert -> button Move inside itself alert -> button Open duplicate alert -> button Open duplicate magnet alert -> button Open invalid alert -> button Save log alert panel -> button Torrent disk space alert -> button Torrent download failed -> button Torrent file copy alert -> button */ "OK" = "OK"; /* Remove completed confirm panel -> message */ "Once removed, continuing the transfer will require the torrent file or magnet link." = "Une fois supprimé, la reprise du transfert nécessitera le fichier torrent ou un lien aimant."; /* Removal confirm panel -> message part 2 */ "Once removed, continuing the transfers will require the torrent files or magnet links." = "Une fois supprimés, la reprise des transferts nécessitera le fichier torrent ou un lien aimant."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact it. This cannot be undone." = "Une fois supprimé, Transmission n'essayera plus de le contacter. Ceci ne peut être annulé."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact them. This cannot be undone." = "Une fois supprimés, Transmission n'essayera plus de les contacter. Ceci ne peut être annulé."; /* File Outline -> Menu */ "Only Check Selected" = "Cocher sélectionnés uniquement"; /* Open toolbar item -> label */ "Open" = "Ouvrir"; /* Open address toolbar item -> label */ "Open Address" = "Ouvrir Adresse"; /* Open address toolbar item -> palette label */ "Open Torrent Address" = "Ouvrir le torrent à l'adresse"; /* Open toolbar item -> tooltip */ "Open torrent files" = "Ouvre des fichiers torrents"; /* Open toolbar item -> palette label */ "Open Torrent Files" = "Ouvrir des fichiers torrents"; /* Open address toolbar item -> tooltip */ "Open torrent web address" = "Ouvre le torrent à l'adresse"; /* Inspector -> tab Inspector view -> title */ "Options" = "Options"; /* Groups -> Name */ "Orange" = "Orange"; /* Inspector -> Peers tab -> table row tooltip */ "Partial Seed" = "Seedeur partiel"; /* All toolbar item -> palette label */ "Pause / Resume All" = "Arrêter / Reprendre tous"; /* Selected toolbar item -> palette label */ "Pause / Resume Selected" = "Arrêter / Reprendre sélectionnés"; /* All toolbar item -> label */ "Pause All" = "Arrêter tous"; /* All toolbar item -> tooltip */ "Pause all transfers" = "Arrête tous les transferts"; /* Selected toolbar item -> label */ "Pause Selected" = "Arrêter la sélection"; /* Selected toolbar item -> tooltip */ "Pause selected transfers" = "Arrête les transferts"; /* Torrent Table -> tooltip */ "Pause the transfer" = "Arrête le transfert"; /* Torrent -> status string */ "Paused" = "Arrêté"; /* Inspector -> peer -> status */ "Peer is unchoking you, but you are not interested" = "Le pair ne nous choque plus, mais nous ne sommes pas intéressés"; /* Inspector -> peer -> status */ "Peer wants you to upload, but you do not want to (interested and choked)" = "Le pair est intéressé par nous, mais il nous choque"; /* Inspector -> tab Inspector view -> title Preferences -> toolbar item title */ "Peers" = "Pairs"; /* Inspector -> Peers tab -> table row tooltip */ "Port" = "Port"; /* Preferences -> Network -> port status */ "Port check site is down" = "Vérification impossible"; /* Preferences -> Network -> port status */ "Port is closed" = "Port fermé"; /* Preferences -> Network -> port status */ "Port is open" = "Port ouvert"; /* File Outline -> Menu file table -> header tool tip */ "Priority" = "Priorité"; /* files tab -> tooltip */ "Priority Not Available" = "Priorité non disponible"; /* Inspector -> private torrent */ "Private Torrent, non-tracker peer discovery disabled" = "Torrent privé, utilisation des pairs du trackeur uniquement "; /* Message window -> table column */ "Process" = "Processus"; /* Blocklist -> message */ "Processing blocklist" = "Lecture de la liste de blocage"; /* Stats window -> label */ "Program Started" = "Programme démarré"; /* Inspector -> Peers tab -> table row tooltip */ "Progress: %@" = "Progression : %@"; /* Inspector -> Peers tab -> table row tooltip */ "Protocol: %@" = "Protocole : %@"; /* Inspector -> private torrent */ "Public Torrent" = "Torrent Public"; /* Groups -> Name */ "Purple" = "Violet"; /* QuickLook toolbar item -> label QuickLook toolbar item -> palette label QuickLook toolbar item -> tooltip View menu -> Quick Look */ "Quick Look" = "Quick Look"; /* Confirm Quit panel -> button Legal alert -> button Transmission already running alert -> button */ "Quit" = "Quitter"; /* Dock Badger -> quit */ "Quitting" = "Quitte"; /* Stats window -> label status bar -> status label Torrent -> status string Torrent table -> group row -> tooltip */ "Ratio" = "Ratio"; /* Groups -> Name */ "Red" = "Rouge"; /* Action menu -> status string toggle */ "Remaining Time" = "Temps restant"; /* Torrent -> eta string */ "remaining time unknown" = "temps restant inconnu"; /* Preferences -> toolbar item title */ "Remote" = "Contrôle à Distance"; /* Removal confirm panel -> button Remove toolbar item -> label Remove trackers alert -> button */ "Remove" = "Enlever"; /* Main window -> 3rd bottom left button (remove all) tooltip */ "Remove all transfers that have completed seeding." = "Enlever tous les transferts qui ont terminé d'être envoyés."; /* Remove toolbar item -> palette label */ "Remove Selected" = "Enlever Sélectionnés"; /* Inspector view -> tracker buttons */ "Remove selected trackers" = "Enlever les trackeurs sélectionnés"; /* Remove toolbar item -> tooltip */ "Remove selected transfers" = "Enlève les transferts sélectionnés"; /* rename sheet button */ "Rename" = "Renommer"; /* File Outline -> Menu */ "Rename File" = "Renommer le fichier"; /* rename sheet label */ "Rename the file \"%@\":" = "Renommer le fichier \"%@\""; /* Stats reset -> button Stats window -> reset button */ "Reset" = "Remise à zéro"; /* All toolbar item -> label */ "Resume All" = "Reprendre tous"; /* All toolbar item -> tooltip */ "Resume all transfers" = "Reprend tous les transferts"; /* Selected toolbar item -> label */ "Resume Selected" = "Reprendre sélection"; /* Selected toolbar item -> tooltip */ "Resume selected transfers" = "Reprend les transferts sélectionnés"; /* Torrent cell -> button info */ "Resume the transfer" = "Reprend le transfert."; /* Torrent cell -> button info */ "Resume the transfer right away" = "Reprend le transfert immédiatement."; /* Stats window -> label */ "Running Time" = "Temps d'exécution"; /* Message window -> save button */ "Save" = "Sauver"; /* Tracker last scrape */ "Scrape error" = "Erreur de scrape"; /* Tracker last scrape */ "Scrape timed out" = "Scrape échoué"; /* tracker peer stat */ "Seeders" = "Seeders"; /* Torrent -> status string */ "Seeding" = "Envoi"; /* Torrent -> status string */ "Seeding complete" = "Envoi terminé"; /* Growl notification title */ "Seeding Complete" = "Envoi terminé"; /* Torrent -> status string */ "Seeding to %d of %d peers" = "Envoi à %1$d sur %2$d peers"; /* Torrent -> status string */ "Seeding to %d of 1 peer" = "Envoi à %d sur 1 peer"; /* Create torrent -> location sheet -> button Create torrent -> select file Move torrent -> prompt Open torrent -> prompt Preferences -> Open panel prompt */ "Select" = "Sélectionner"; /* Create torrent -> select file */ "Select a file or folder for the torrent file." = "Sélectionner un ficher ou dossier pour le fichier torrent."; /* Add -> select destination folder */ "Select the download folder for \"%@\"" = "Sélectionner le dossier de téléchargement pour \"%@\""; /* Create torrent -> location sheet -> message */ "Select the name and location for the torrent file." = "Sélectionner le nom et l'emplacement pour le ficher torrent."; /* Move torrent -> select destination folder */ "Select the new folder for %d data files." = "Sélectionner un nouveau dossier pour les %d fichiers de données."; /* Move torrent -> select destination folder */ "Select the new folder for \"%@\"." = "Sélectionner un nouveau dossier pour \"%@\"."; /* Status Bar -> status menu */ "Session Ratio" = "Rapport de la session"; /* Status Bar -> status menu */ "Session Transfer" = "Transfert de la session"; /* Share toolbar item -> label Share toolbar item -> palette label */ "Share" = "Partager"; /* Share toolbar item -> tooltip */ "Share torrent file" = "Partager le torrent"; /* Main window -> 1st bottom left button (action) tooltip */ "Shortcuts for changing global settings." = "Raccourcis pour changer les réglages globaux."; /* notification button */ "Show" = "Révéler"; /* View menu -> Filter Bar */ "Show Filter Bar" = "Afficher la barre de filtre"; /* File Outline -> Menu */ "Show in Finder" = "Révéler les données dans le Finder"; /* View menu -> Inspector */ "Show Inspector" = "Montrer l'inspecteur"; /* View menu -> Status Bar */ "Show Status Bar" = "Afficher la barre de status"; /* Torrent cell -> button info */ "Show the data file in Finder" = "Révéler les données dans le Finder"; /* Status Bar -> speed tooltip */ "Speed Limit" = "Limite de vitesse"; /* Growl notification title */ "Speed Limit Auto Disabled" = "Mode vitesse limitée : Auto-désactivé"; /* Growl notification title */ "Speed Limit Auto Enabled" = "Mode vitesse limitée : Auto-activé"; /* Main window -> 2nd bottom left button (turtle) tooltip */ "Speed Limit overrides the total bandwidth limits with its own limits." = "Les réglages en Mode vitesse limitée priment sur la limite de bande-passante globale lorsque le mode vitesse limitée est activé."; /* Torrent -> status string */ "Stalled" = "Calé"; /* Stats window -> title */ "Statistics" = "Statisiques"; /* Action menu -> status string toggle */ "Status of Selected Files" = "État des fichiers sélectionnés"; /* Action menu -> ratio stop torrent action menu -> ratio stop */ "Stop at Ratio (%.2f)" = "Arrêter au Ratio (%.2f)"; /* Torrent cell -> button info */ "Stop waiting to start" = "Arrêté, en attente"; /* Donation beg -> title */ "Support open-source indie software" = "Supporter les logiciels open-source indépendants"; /* File size - terabytes Memory size - terabytes */ "TB" = "To"; /* Transfer speed (terabytes per second) */ "TB/s" = "To/s"; /* Create torrent -> directory doesn't exist warning -> title */ "The chosen torrent file location does not exist." = "La destination du fichier n'existe pas."; /* Add torrent -> same name -> title */ "The destination directory and root data directory have the same name." = "Le dossier de téléchargement et le dossier racine des données ont le même nom."; /* Create torrent -> directory doesn't exist warning -> warning */ "The directory \"%@\" does not currently exist. Create this directory or choose a different one to create the torrent file." = "Le dossier \"%@\" n'existe pas. Créez ce dossier ou choissisez un emplacement différent pour créer le fichier torrent."; /* Open duplicate magnet alert -> message */ "The magnet link \"%@\" cannot be added because it is a duplicate of an already existing transfer." = "Le lien aimant \"%@\" ne peut être ajouté car il est un duplicata d'un transfert existant."; /* Move error alert -> message Move inside itself alert -> message */ "The move operation of \"%@\" cannot be done." = "Le déplacement de \"%@\" n'a pu être effectué."; /* blocklist fail message */ "The specified blocklist file did not contain any valid rules." = "La liste de blocage spécifiée ne contenait aucune règle valide."; /* Torrent download failed -> message */ "The torrent could not be downloaded from %@: %@." = "Le torrent n'a pu être téléchargé de %1$@ : %2$@."; /* Torrent file copy alert -> message */ "The torrent file (%@) cannot be found." = "Le ficher torrent (%@) n'a pu être trouvé."; /* Open invalid alert -> message */ "The torrent file cannot be opened because it contains invalid data." = "Ce fichier torrent ne peut être ouvert car il contient des données invalides."; /* Create torrent -> zero size -> title */ "The total file size is zero bytes." = "La taille totale du fichier est zéro octets."; /* Open duplicate alert -> message */ "The transfer cannot be added because it is a duplicate of an already existing transfer." = "Ce transfert ne peut être ajouté car il est une copie d'un transfert déja existant."; /* Torrent disk space alert -> message */ "The transfer will be paused. Clear up space on %@ or deselect files in the torrent inspector to continue." = "Le transfert va être arrêté. Faites de la place sur %@ ou désélectionner des fichers dans l'inspecteur pour continuer."; /* Create torrent -> blank address -> message */ "The transfer will not contact trackers for peers, and will have to rely solely on non-tracker peer discovery methods such as PEX and DHT to download and seed." = "Le transfert ne contactera pas le trackeur pour obtenir des pairs, et il dépendra exclusivement des méthodes d'obtention décentralisées (PEX, DHT, LPD) pour les échanges. "; /* Removal confirm panel -> message part 1 */ "There are %@ active transfers." = "Il y a %@ transferts actifs."; /* Removal confirm panel -> message part 1 */ "There are %@ transfers (%@ active)." = "Il y a %1$@ transferts (%2$@ actifs)."; /* Confirm Quit panel -> message */ "There are %d active transfers that will be paused on quit. The transfers will automatically resume on the next launch." = "Il y a %d transferts actifs qui seront arrêtés si vous quittez Transmission. Les transferts reprendront automatiquement au prochain lancement."; /* Create torrent -> blank address -> title */ "There are no tracker addresses." = "Il n'y a pas d'adresse de trackeur."; /* Transmission already running alert -> message */ "There is already a copy of Transmission running. This copy cannot be opened until that instance is quit." = "Il y a déja une copie de Transmission en cours d'exécution. Cette copie ne pourra être ouverte tant que l'autre copie sera lancée."; /* Confirm Quit panel -> message */ "There is an active transfer that will be paused on quit. The transfer will automatically resume on the next launch." = "Il y a 1 transfert actifs qui sera arrêté si vous quittez Transmission. Ce transfert reprendra automatiquement au prochain lancement."; /* Create torrent -> no files -> warning */ "There must be at least one file in a folder to create a torrent file." = "Il doit y avoir au moins un fichier dans un dossier pour créer un fichier torrent."; /* Save log alert panel -> message */ "There was a problem creating the file \"%@\"." = "Il y a eu un problème à la création de \"%@\"."; /* Move error alert -> title */ "There was an error moving the data file." = "Il y a eu une erreur lors du déplacement des données."; /* Magnet link failed -> message */ "There was an error when adding the magnet link \"%@\". The transfer will not occur." = "Un erreur est survenue lors de l'ajout du lien aimant \"%@\". Le transfert n'aura pas lieu."; /* Create torrent -> no files -> title */ "This folder contains no files." = "Ce dossier ne contient aucun fichier."; /* Removal confirm panel -> message */ "This transfer is active. Once removed, continuing the transfer will require the torrent file or magnet link." = "Ce transfert est actif. Une fois supprimé, la reprise du transfert nécessitera le fichier torrent ou un lien aimant."; /* Stats reset -> message */ "This will clear the global statistics displayed by Transmission. Individual transfer statistics will not be affected." = "Ceci effacera les statistiques globales de Transmission. Les statistiques individuelles de transfert ne seront pas affectées."; /* Inspector -> tracker table */ "Tier %d" = "%d tier"; /* Filter toolbar item -> palette label */ "Toggle Filter" = "Afficher/masquer le filtre"; /* Inspector toolbar item -> palette label */ "Toggle Inspector" = "Afficher/masquer l'inspecteur"; /* Filter toolbar item -> tooltip */ "Toggle the filter bar" = "Affiche/masque la barre de filtre"; /* Inspector toolbar item -> tooltip */ "Toggle the torrent inspector" = "Affiche/masque l'inspecteur"; /* Download not a torrent -> title Torrent download error -> title */ "Torrent download failed" = "Échec du téléchargement du torrent"; /* Growl notification title */ "Torrent File Auto Added" = "Fichier torrent auto-ajouté"; /* Inspector -> title */ "Torrent Inspector" = "Inspecteur de torrent"; /* Torrent -> progress string */ "torrent metadata needed" = "métadonnées requises"; /* stats total */ "Total N/A" = "Total N/A"; /* Status Bar -> status menu */ "Total Ratio" = "Rapport total"; /* Status Bar -> status menu */ "Total Transfer" = "Transfert total"; /* Filter Bar -> filter menu */ "Tracker" = "Trackeur"; /* Torrent -> status string */ "Tracker returned error" = "Trackeur a renvoyé une erreur"; /* Torrent -> status string */ "Tracker returned warning" = "Trackeur a renvoyé un avertissement"; /* Tracker next announce */ "Tracker will be used as a backup" = "Le trackeur sera utilisé en cas de problème"; /* Inspector -> tab Inspector view -> title */ "Trackers" = "Trackeurs"; /* Inspector -> Peers tab -> peers */ "Transfer Not Active" = "Transfert inactif"; /* Preferences -> toolbar item title */ "Transfers" = "Transferts"; /* Inspector -> Peers tab -> peers */ "Transfers Not Active" = "Transferts inactifs"; /* Legal alert -> message */ "Transmission is a file-sharing program. When you run a torrent, its data will be made available to others by means of upload. You and you alone are fully responsible for exercising proper judgement and abiding by your local laws." = "Transmission est un programme de partage de fichier. Quand vous démarrerez un transfert, ses données seront rendues disponibles aux autres via votre ordinateur. Vous et vous seul êtes entièrement responsable de l'exercice de votre jugement et du respect des lois locales."; /* Donation beg -> message */ "Transmission is a full-featured torrent application. A lot of time and effort have gone into development, coding, and refinement. If you enjoy using it, please consider showing your love with a donation." = "Transmission est une application Bittorrent complète. Beaucoup d'efforts et de temps ont étés nécessaires à son développement, sa programmation et son peaufinement. Si vous appréciez son utilisation, pensez à montrer votre amour par un don."; /* Transmission already running alert -> title */ "Transmission is already running." = "Transmission est déja lancé."; /* inspector -> peer table -> header status bar -> status label Torrent -> status string */ "UL" = "UL"; /* Inspector -> Peers tab -> peers */ "UL to %d" = "Envoi à %d"; /* File Outline -> Menu */ "Uncheck Selected" = "Décocher sélectionnés"; /* Status Bar -> speed tooltip */ "unlimited" = "illimitée"; /* Torrent -> error string unreadable */ "unreadable error" = "erreur illisible"; /* Save log panel -> default file name */ "untitled" = "Sans titre"; /* Torrent table -> group row -> tooltip */ "Upload speed" = "Vitesse d'émission"; /* Stats window -> label */ "Uploaded" = "Envoyé"; /* Torrent -> progress string */ "uploaded %@ (Ratio: %@)" = "envoyé %1$@ (Ratio : %2$@)"; /* inspector -> peer table -> header tool tip */ "Uploading To Peer" = "Envoi au pair"; /* Torrent -> status string */ "Waiting to check existing data" = "En attente de vérification"; /* Torrent -> status string */ "Waiting to download" = "En attente de téléchargement"; /* Torrent -> status string */ "Waiting to seed" = "En attente d'envoi"; /* Drag overlay -> url */ "Web Address" = "Adresse Web"; /* Torrent -> status string */ "web seed" = "source Web"; /* inspector -> web seed table -> header */ "Web Seeds" = "Sources Web"; /* Legal alert -> title */ "Welcome to Transmission" = "Bienvenue dans Transmission"; /* Groups -> Name */ "Yellow" = "Jaune"; /* Inspector -> peer -> status */ "You unchoked the peer, but the peer is not interested" = "Nous n'étranglons plus le pair, mais il n'est pas intéressé par nous"; /* Inspector -> peer -> status */ "You want to download, but peer does not want to send (interested and choked)" = "Vous voulez télécharger, mais le pair ne veut pas envoyer (intéressé et étranglé)";transmission-2.92/macosx/fr.lproj/PaxHeaders.4960/InfoOptionsView.xib0000644000000000000000000000013112664476420022524 xustar0030 mtime=1456635152.035497194 30 atime=1456635152.034497176 29 ctime=1457295922.76485492 transmission-2.92/macosx/fr.lproj/InfoOptionsView.xib0000644000175000017500000012121012664476420024147 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/fr.lproj/PaxHeaders.4960/InfoActivityView.xib0000644000000000000000000000013112664476420022665 xustar0030 mtime=1456635152.035497194 30 atime=1456635152.035497194 29 ctime=1457295922.76485492 transmission-2.92/macosx/fr.lproj/InfoActivityView.xib0000644000175000017500000012747612664476420024334 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/fr.lproj/PaxHeaders.4960/InfoGeneralView.xib0000644000000000000000000000013212664476420022447 xustar0030 mtime=1456635152.039497262 30 atime=1456635152.039497262 30 ctime=1457295922.763854903 transmission-2.92/macosx/fr.lproj/InfoGeneralView.xib0000644000175000017500000006271212664476420024104 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/fr.lproj/PaxHeaders.4960/AddMagnetWindow.xib0000644000000000000000000000012712662757243022446 xustar0029 mtime=1456201379.30886279 29 atime=1456201379.30886279 29 ctime=1457295922.76485492 transmission-2.92/macosx/fr.lproj/AddMagnetWindow.xib0000644000175000017500000006541612662757243024103 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/fr.lproj/PaxHeaders.4960/MainMenu.xib0000644000000000000000000000013112644245522021126 xustar0030 mtime=1452362578.748698976 30 atime=1452362578.747698959 29 ctime=1457295922.76485492 transmission-2.92/macosx/fr.lproj/MainMenu.xib0000644000175000017500000021503112644245522022556 0ustar00mikedldmikedld00000000000000 CA CA YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7NjIsIDYyfdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPEQ7OTU0AKgAAAUiAOyBP8AQW DQeEQmFQuGQ2HQ+IRGJROKRWLReMRCBOyCRmPR+QSGRSOSSWGRuOyaVSuWS2XS+DyiYTOaTWbTcATKcT ueT2fRqBz+hUOiTadUWkUmlR+j0unU+oQqm1GqVWkVOrVmtTisVuvV+WV2wWOyUyg2W0WmMWK1W23Qi2 W+5Wq43O7WO63e9Vq83u/VG+3/BUrA4PDUPC4fFTzE4vHTXG4/JS7I5PLSbK5fNSHM5vPWuz5/RS3O6P TQ/S6fVVLQ6vXRnU6/XbHZarabXTbfcaJ172U7vgQ3euvf8HjQjh8Xj8vk8vnQbm8/ndHpcfqdXg9fsb vtdva93va/weHV+PyafzefR+n1Z/2e3N+/4Zf5fPJ/X7Y/8fnF/v+MO/z/sHAMBL/AkCr3A8ELvBUFrn BsHLfCEIrbCcKLSgIAAPAQAAAwAAAAEAPgAAAQEAAwAAAAEAPgAAAQIAAwAAAAQAAAICAQMAAwAAAAEA BQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEABAAAARYAAwAAAAEA PgAAARcABAAAAAEAAAFAARwAAwAAAAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAQA AAIKh3MABwAADLwAAAISAAAAAAAIAAgACAAIAAEAAQABAAEAAAy8YXBwbAIQAABtbnRyUkdCIFhZWiAH 3gABAAgACQA1ABdhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFkZXNjAAABUAAAAGJk c2NtAAABtAAAAaRjcHJ0AAADWAAAACN3dHB0AAADfAAAABRyWFlaAAADkAAAABRnWFlaAAADpAAAABRi WFlaAAADuAAAABRyVFJDAAADzAAACAxhYXJnAAAL2AAAACB2Y2d0AAAL+AAAADBuZGluAAAMKAAAAD5j aGFkAAAMaAAAACxtbW9kAAAMlAAAAChiVFJDAAADzAAACAxnVFJDAAADzAAACAxhYWJnAAAL2AAAACBh YWdnAAAL2AAAACBkZXNjAAAAAAAAAAhEaXNwbGF5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAA AAAhAAAADGhySFIAAAAIAAABnGtvS1IAAAAIAAABnG5iTk8AAAAIAAABnGlkAAAAAAAIAAABnGh1SFUA AAAIAAABnGNzQ1oAAAAIAAABnGRhREsAAAAIAAABnHVrVUEAAAAIAAABnGFyAAAAAAAIAAABnGl0SVQA AAAIAAABnHJvUk8AAAAIAAABnG5sTkwAAAAIAAABnGhlSUwAAAAIAAABnGVzRVMAAAAIAAABnGZpRkkA AAAIAAABnHpoVFcAAAAIAAABnHZpVk4AAAAIAAABnHNrU0sAAAAIAAABnHpoQ04AAAAIAAABnHJ1UlUA AAAIAAABnGZyRlIAAAAIAAABnG1zAAAAAAAIAAABnGNhRVMAAAAIAAABnHRoVEgAAAAIAAABnGRlREUA AAAIAAABnGVuVVMAAAAIAAABnHB0QlIAAAAIAAABnHBsUEwAAAAIAAABnGVsR1IAAAAIAAABnHN2U0UA AAAIAAABnHRyVFIAAAAIAAABnGphSlAAAAAIAAABnHB0UFQAAAAIAAABnABpAE0AYQBjdGV4dAAAAABD b3B5cmlnaHQgQXBwbGUgSW5jLiwgMjAxNAAAWFlaIAAAAAAAAPMWAAEAAAABFspYWVogAAAAAAAAccAA ADmKAAABZ1hZWiAAAAAAAABhIwAAueYAABP2WFlaIAAAAAAAACPyAAAMkAAAvdBjdXJ2AAAAAAAABAAA AAAFAAoADwAUABkAHgAjACgALQAyADYAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAA lQCaAJ8AowCoAK0AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIB OAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQC HQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MD TwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE 0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0G rwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII 5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kL gAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQO fw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR 6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsV vRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0a BBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQe vh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij 8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWsp nSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Ev xy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2 cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9 oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJF VUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpN k03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9W XFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ff s2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNp mmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0 FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/ I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSK yoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+X Cpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj 5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqx YLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/ er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXO Ns62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDd lt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHt nO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+ S/7c/23//3BhcmEAAAAAAAMAAAACZmYAAPKnAAANWQAAE9AAAAoOdmNndAAAAAAAAAABAAEAAAAAAAAA AQAAAAEAAAAAAAAAAQAAAAEAAAAAAAAAAQAAbmRpbgAAAAAAAAA2AACnQAAAVYAAAEzAAACewAAAJYAA AAzAAABQAAAAVEAAAjMzAAIzMwACMzMAAAAAAAAAAHNmMzIAAAAAAAEMcgAABfj///MdAAAHugAA/XL/ //ud///9pAAAA9kAAMBxbW1vZAAAAAAAAAYQAACgBwAAAADJJx4AAAAAAAAAAAAAAAAAAAAAANIlJico WiRjbGFzc25hbWVYJGNsYXNzZXNfEBBOU0JpdG1hcEltYWdlUmVwoycpKlpOU0ltYWdlUmVwWE5TT2Jq ZWN00iUmLC1XTlNBcnJheaIsKtIlJi8wXk5TTXV0YWJsZUFycmF5oy8sKtMyMwo0NTZXTlNXaGl0ZVxO U0NvbG9yU3BhY2VEMCAwABADgAzSJSY4OVdOU0NvbG9yojgq0iUmOzxXTlNJbWFnZaI7Kl8QD05TS2V5 ZWRBcmNoaXZlctE/QFRyb290gAEACAARABoAIwAtADIANwBGAEwAVwBeAGUAcgB5AIEAgwCFAIoAjACO AJcAnACnAKkAqwCtALIAtQC3ALkAuwC9AMIA2QDbAN0Prw+0D78PyA/bD98P6g/zD/gQABADEAgQFxAb ECIQKhA3EDwQPhBAEEUQTRBQEFUQXRBgEHIQdRB6AAAAAAAAAgEAAAAAAAAAQQAAAAAAAAAAAAAAAAAA EHw transmission-2.92/macosx/fr.lproj/PaxHeaders.4960/GroupRules.xib0000644000000000000000000000013112666747213021534 xustar0030 mtime=1457245835.339999059 30 atime=1457245835.339999059 29 ctime=1457295922.76485492 transmission-2.92/macosx/fr.lproj/GroupRules.xib0000644000175000017500000004164612666747213023175 0ustar00mikedldmikedld00000000000000 name comment name comment fFlatFileList.name allTrackersFlat fFlatFileList.name allTrackersFlat transmission-2.92/macosx/fr.lproj/PaxHeaders.4960/AddWindow.xib0000644000000000000000000000013112640354045021272 xustar0030 mtime=1451350053.934176163 30 atime=1451350053.934176163 29 ctime=1457295922.76485492 transmission-2.92/macosx/fr.lproj/AddWindow.xib0000644000175000017500000007272312640354045022733 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/fr.lproj/PaxHeaders.4960/GlobalOptionsPopover.xib0000644000000000000000000000013212640354045023542 xustar0030 mtime=1451350053.930176093 30 atime=1451350053.930176093 30 ctime=1457295922.763854903 transmission-2.92/macosx/fr.lproj/GlobalOptionsPopover.xib0000644000175000017500000006371212640354045025200 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/CreatorWindowController.h0000644000000000000000000000013212442116654022161 xustar0030 mtime=1418239404.003926448 30 atime=1418239404.003926448 30 ctime=1457295923.016859206 transmission-2.92/macosx/CreatorWindowController.h0000644000175000017500000000512512442116654023611 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: CreatorWindowController.h 13323 2012-05-28 19:43:53Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import "transmission.h" #import "makemeta.h" @interface CreatorWindowController : NSWindowController { IBOutlet NSImageView * fIconView; IBOutlet NSTextField * fNameField, * fStatusField, * fPiecesField, * fLocationField; IBOutlet NSTableView * fTrackerTable; IBOutlet NSSegmentedControl * fTrackerAddRemoveControl; IBOutlet NSTextView * fCommentView; IBOutlet NSButton * fPrivateCheck, * fOpenCheck; IBOutlet NSView * fProgressView; IBOutlet NSProgressIndicator * fProgressIndicator; tr_metainfo_builder * fInfo; NSURL * fPath, * fLocation; NSMutableArray * fTrackers; NSTimer * fTimer; BOOL fStarted, fOpenWhenCreated; NSUserDefaults * fDefaults; } + (CreatorWindowController *) createTorrentFile: (tr_session *) handle; + (CreatorWindowController *) createTorrentFile: (tr_session *) handle forFile: (NSURL *) file; - (id) initWithHandle: (tr_session *) handle path: (NSURL *) path; - (IBAction) setLocation: (id) sender; - (IBAction) create: (id) sender; - (IBAction) cancelCreateWindow: (id) sender; - (IBAction) cancelCreateProgress: (id) sender; - (IBAction) addRemoveTracker: (id) sender; - (void) copy: (id) sender; - (void) paste: (id) sender; @end transmission-2.92/macosx/PaxHeaders.4960/Torrent.m0000644000000000000000000000013212644245522016771 xustar0030 mtime=1452362578.779699519 30 atime=1452362578.779699519 30 ctime=1457295923.586868899 transmission-2.92/macosx/Torrent.m0000644000175000017500000020257412644245522020430 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: Torrent.m 14667 2016-01-08 10:05:19Z mikedld $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "Torrent.h" #import "GroupsController.h" #import "FileListNode.h" #import "NSApplicationAdditions.h" #import "NSStringAdditions.h" #import "TrackerNode.h" #import "log.h" #import "transmission.h" // required by utils.h #import "error.h" #import "utils.h" // tr_new() #define ETA_IDLE_DISPLAY_SEC (2*60) @interface Torrent (Private) - (id) initWithPath: (NSString *) path hash: (NSString *) hashString torrentStruct: (tr_torrent *) torrentStruct magnetAddress: (NSString *) magnetAddress lib: (tr_session *) lib groupValue: (NSNumber *) groupValue removeWhenFinishSeeding: (NSNumber *) removeWhenFinishSeeding downloadFolder: (NSString *) downloadFolder legacyIncompleteFolder: (NSString *) incompleteFolder; - (void) createFileList; - (void) insertPathForComponents: (NSArray *) components withComponentIndex: (NSUInteger) componentIndex forParent: (FileListNode *) parent fileSize: (uint64_t) size index: (NSInteger) index flatList: (NSMutableArray *) flatFileList; - (void) sortFileList: (NSMutableArray *) fileNodes; - (void) startQueue; - (void) completenessChange: (tr_completeness) status wasRunning: (BOOL) wasRunning; - (void) ratioLimitHit; - (void) idleLimitHit; - (void) metadataRetrieved; - (void)renameFinished: (BOOL) success nodes: (NSArray *) nodes completionHandler: (void (^)(BOOL)) completionHandler oldPath: (NSString *) oldPath newName: (NSString *) newName; - (BOOL) shouldShowEta; - (NSString *) etaString; - (void) setTimeMachineExclude: (BOOL) exclude; @end void startQueueCallback(tr_torrent * torrent, void * torrentData) { dispatch_async(dispatch_get_main_queue(), ^{ [(Torrent *)torrentData startQueue]; }); } void completenessChangeCallback(tr_torrent * torrent, tr_completeness status, bool wasRunning, void * torrentData) { dispatch_async(dispatch_get_main_queue(), ^{ [(Torrent *)torrentData completenessChange: status wasRunning: wasRunning]; }); } void ratioLimitHitCallback(tr_torrent * torrent, void * torrentData) { dispatch_async(dispatch_get_main_queue(), ^{ [(Torrent *)torrentData ratioLimitHit]; }); } void idleLimitHitCallback(tr_torrent * torrent, void * torrentData) { dispatch_async(dispatch_get_main_queue(), ^{ [(Torrent *)torrentData idleLimitHit]; }); } void metadataCallback(tr_torrent * torrent, void * torrentData) { dispatch_async(dispatch_get_main_queue(), ^{ [(Torrent *)torrentData metadataRetrieved]; }); } void renameCallback(tr_torrent * torrent, const char * oldPathCharString, const char * newNameCharString, int error, void * contextInfo) { @autoreleasepool { NSString * oldPath = [NSString stringWithUTF8String: oldPathCharString]; NSString * newName = [NSString stringWithUTF8String: newNameCharString]; dispatch_async(dispatch_get_main_queue(), ^{ NSDictionary * contextDict = [(NSDictionary *)contextInfo autorelease]; Torrent * torrentObject = [contextDict objectForKey: @"Torrent"]; [torrentObject renameFinished: error == 0 nodes: [contextDict objectForKey: @"Nodes"] completionHandler: [contextDict objectForKey: @"CompletionHandler"] oldPath: oldPath newName: newName]; }); } } bool trashDataFile(const char * filename, tr_error ** error) { if (filename == NULL) return false; @autoreleasepool { NSError * localError; if (![Torrent trashFile: [NSString stringWithUTF8String: filename] error: &localError]) { tr_error_set_literal(error, [localError code], [[localError description] UTF8String]); return false; } } return true; } @implementation Torrent #warning remove ivars in header when 64-bit only (or it compiles in 32-bit mode) @synthesize removeWhenFinishSeeding = fRemoveWhenFinishSeeding; - (id) initWithPath: (NSString *) path location: (NSString *) location deleteTorrentFile: (BOOL) torrentDelete lib: (tr_session *) lib { self = [self initWithPath: path hash: nil torrentStruct: NULL magnetAddress: nil lib: lib groupValue: nil removeWhenFinishSeeding: nil downloadFolder: location legacyIncompleteFolder: nil]; if (self) { if (torrentDelete && ![[self torrentLocation] isEqualToString: path]) [Torrent trashFile: path error: nil]; } return self; } - (id) initWithTorrentStruct: (tr_torrent *) torrentStruct location: (NSString *) location lib: (tr_session *) lib { self = [self initWithPath: nil hash: nil torrentStruct: torrentStruct magnetAddress: nil lib: lib groupValue: nil removeWhenFinishSeeding: nil downloadFolder: location legacyIncompleteFolder: nil]; return self; } - (id) initWithMagnetAddress: (NSString *) address location: (NSString *) location lib: (tr_session *) lib { self = [self initWithPath: nil hash: nil torrentStruct: nil magnetAddress: address lib: lib groupValue: nil removeWhenFinishSeeding: nil downloadFolder: location legacyIncompleteFolder: nil]; return self; } - (id) initWithHistory: (NSDictionary *) history lib: (tr_session *) lib forcePause: (BOOL) pause { self = [self initWithPath: [history objectForKey: @"InternalTorrentPath"] hash: [history objectForKey: @"TorrentHash"] torrentStruct: NULL magnetAddress: nil lib: lib groupValue: [history objectForKey: @"GroupValue"] removeWhenFinishSeeding: [history objectForKey: @"RemoveWhenFinishSeeding"] downloadFolder: [history objectForKey: @"DownloadFolder"] //upgrading from versions < 1.80 legacyIncompleteFolder: [[history objectForKey: @"UseIncompleteFolder"] boolValue] //upgrading from versions < 1.80 ? [history objectForKey: @"IncompleteFolder"] : nil]; if (self) { //start transfer NSNumber * active; if (!pause && (active = [history objectForKey: @"Active"]) && [active boolValue]) { fStat = tr_torrentStat(fHandle); [self startTransferNoQueue]; } //upgrading from versions < 1.30: get old added, activity, and done dates NSDate * date; if ((date = [history objectForKey: @"Date"])) tr_torrentSetAddedDate(fHandle, [date timeIntervalSince1970]); if ((date = [history objectForKey: @"DateActivity"])) tr_torrentSetActivityDate(fHandle, [date timeIntervalSince1970]); if ((date = [history objectForKey: @"DateCompleted"])) tr_torrentSetDoneDate(fHandle, [date timeIntervalSince1970]); //upgrading from versions < 1.60: get old stop ratio settings NSNumber * ratioSetting; if ((ratioSetting = [history objectForKey: @"RatioSetting"])) { switch ([ratioSetting intValue]) { case NSOnState: [self setRatioSetting: TR_RATIOLIMIT_SINGLE]; break; case NSOffState: [self setRatioSetting: TR_RATIOLIMIT_UNLIMITED]; break; case NSMixedState: [self setRatioSetting: TR_RATIOLIMIT_GLOBAL]; break; } } NSNumber * ratioLimit; if ((ratioLimit = [history objectForKey: @"RatioLimit"])) [self setRatioLimit: [ratioLimit floatValue]]; } return self; } - (NSDictionary *) history { return [NSDictionary dictionaryWithObjectsAndKeys: [self torrentLocation], @"InternalTorrentPath", [self hashString], @"TorrentHash", [NSNumber numberWithBool: [self isActive]], @"Active", [NSNumber numberWithBool: [self waitingToStart]], @"WaitToStart", [NSNumber numberWithInt: fGroupValue], @"GroupValue", [NSNumber numberWithBool: fRemoveWhenFinishSeeding], @"RemoveWhenFinishSeeding", nil]; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; if (fFileStat) tr_torrentFilesFree(fFileStat, [self fileCount]); [fPreviousFinishedIndexes release]; [fPreviousFinishedIndexesDate release]; [fHashString release]; [fIcon release]; [fFileList release]; [fFlatFileList release]; [super dealloc]; } - (NSString *) description { return [@"Torrent: " stringByAppendingString: [self name]]; } - (id) copyWithZone: (NSZone *) zone { return [self retain]; } - (void) closeRemoveTorrent: (BOOL) trashFiles { //allow the file to be indexed by Time Machine [self setTimeMachineExclude: NO]; tr_torrentRemove(fHandle, trashFiles, trashDataFile); } - (void) changeDownloadFolderBeforeUsing: (NSString *) folder determinationType: (TorrentDeterminationType) determinationType { //if data existed in original download location, unexclude it before changing the location [self setTimeMachineExclude: NO]; tr_torrentSetDownloadDir(fHandle, [folder UTF8String]); fDownloadFolderDetermination = determinationType; } - (NSString *) currentDirectory { return [NSString stringWithUTF8String: tr_torrentGetCurrentDir(fHandle)]; } - (void) getAvailability: (int8_t *) tab size: (NSInteger) size { tr_torrentAvailability(fHandle, tab, size); } - (void) getAmountFinished: (float *) tab size: (NSInteger) size { tr_torrentAmountFinished(fHandle, tab, size); } - (NSIndexSet *) previousFinishedPieces { //if the torrent hasn't been seen in a bit, and therefore hasn't been refreshed, return nil if (fPreviousFinishedIndexesDate && [fPreviousFinishedIndexesDate timeIntervalSinceNow] > -2.0) return fPreviousFinishedIndexes; else return nil; } - (void) setPreviousFinishedPieces: (NSIndexSet *) indexes { [fPreviousFinishedIndexes release]; fPreviousFinishedIndexes = [indexes retain]; [fPreviousFinishedIndexesDate release]; fPreviousFinishedIndexesDate = indexes != nil ? [[NSDate alloc] init] : nil; } - (void) update { //get previous stalled value before update const BOOL wasStalled = fStat != NULL && [self isStalled]; fStat = tr_torrentStat(fHandle); //make sure the "active" filter is updated when stalled-ness changes if (wasStalled != [self isStalled]) //posting asynchronously with coalescing to prevent stack overflow on lots of torrents changing state at the same time [[NSNotificationQueue defaultQueue] enqueueNotification: [NSNotification notificationWithName: @"UpdateQueue" object: self] postingStyle: NSPostASAP coalesceMask: NSNotificationCoalescingOnName forModes: nil]; //when the torrent is first loaded, update the time machine exclusion if (!fTimeMachineExcludeInitialized) [self updateTimeMachineExclude]; } - (void) startTransferIgnoringQueue: (BOOL) ignoreQueue { if ([self alertForRemainingDiskSpace]) { ignoreQueue ? tr_torrentStartNow(fHandle) : tr_torrentStart(fHandle); [self update]; //capture, specifically, stop-seeding settings changing to unlimited [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptions" object: nil]; } } - (void) startTransferNoQueue { [self startTransferIgnoringQueue: YES]; } - (void) startTransfer { [self startTransferIgnoringQueue: NO]; } - (void) stopTransfer { tr_torrentStop(fHandle); [self update]; } - (void) sleep { if ((fResumeOnWake = [self isActive])) tr_torrentStop(fHandle); } - (void) wakeUp { if (fResumeOnWake) { tr_logAddNamedInfo( fInfo->name, "restarting because of wakeUp" ); tr_torrentStart(fHandle); } } - (NSInteger) queuePosition { return fStat->queuePosition; } - (void) setQueuePosition: (NSUInteger) index { tr_torrentSetQueuePosition(fHandle, index); } - (void) manualAnnounce { tr_torrentManualUpdate(fHandle); } - (BOOL) canManualAnnounce { return tr_torrentCanManualUpdate(fHandle); } - (void) resetCache { tr_torrentVerify(fHandle, NULL, NULL); [self update]; } - (BOOL) isMagnet { return !tr_torrentHasMetadata(fHandle); } - (NSString *) magnetLink { return [NSString stringWithUTF8String: tr_torrentGetMagnetLink(fHandle)]; } - (CGFloat) ratio { return fStat->ratio; } - (tr_ratiolimit) ratioSetting { return tr_torrentGetRatioMode(fHandle); } - (void) setRatioSetting: (tr_ratiolimit) setting { tr_torrentSetRatioMode(fHandle, setting); } - (CGFloat) ratioLimit { return tr_torrentGetRatioLimit(fHandle); } - (void) setRatioLimit: (CGFloat) limit { NSParameterAssert(limit >= 0); tr_torrentSetRatioLimit(fHandle, limit); } - (CGFloat) progressStopRatio { return fStat->seedRatioPercentDone; } - (tr_idlelimit) idleSetting { return tr_torrentGetIdleMode(fHandle); } - (void) setIdleSetting: (tr_idlelimit) setting { tr_torrentSetIdleMode(fHandle, setting); } - (NSUInteger) idleLimitMinutes { return tr_torrentGetIdleLimit(fHandle); } - (void) setIdleLimitMinutes: (NSUInteger) limit { NSParameterAssert(limit > 0); tr_torrentSetIdleLimit(fHandle, limit); } - (BOOL) usesSpeedLimit: (BOOL) upload { return tr_torrentUsesSpeedLimit(fHandle, upload ? TR_UP : TR_DOWN); } - (void) setUseSpeedLimit: (BOOL) use upload: (BOOL) upload { tr_torrentUseSpeedLimit(fHandle, upload ? TR_UP : TR_DOWN, use); } - (NSInteger) speedLimit: (BOOL) upload { return tr_torrentGetSpeedLimit_KBps(fHandle, upload ? TR_UP : TR_DOWN); } - (void) setSpeedLimit: (NSInteger) limit upload: (BOOL) upload { tr_torrentSetSpeedLimit_KBps(fHandle, upload ? TR_UP : TR_DOWN, limit); } - (BOOL) usesGlobalSpeedLimit { return tr_torrentUsesSessionLimits(fHandle); } - (void) setUseGlobalSpeedLimit: (BOOL) use { tr_torrentUseSessionLimits(fHandle, use); } - (void) setMaxPeerConnect: (uint16_t) count { NSParameterAssert(count > 0); tr_torrentSetPeerLimit(fHandle, count); } - (uint16_t) maxPeerConnect { return tr_torrentGetPeerLimit(fHandle); } - (BOOL) waitingToStart { return fStat->activity == TR_STATUS_DOWNLOAD_WAIT || fStat->activity == TR_STATUS_SEED_WAIT; } - (tr_priority_t) priority { return tr_torrentGetPriority(fHandle); } - (void) setPriority: (tr_priority_t) priority { return tr_torrentSetPriority(fHandle, priority); } + (BOOL) trashFile: (NSString *) path error: (NSError **) error { //attempt to move to trash if (![[NSWorkspace sharedWorkspace] performFileOperation: NSWorkspaceRecycleOperation source: [path stringByDeletingLastPathComponent] destination: @"" files: [NSArray arrayWithObject: [path lastPathComponent]] tag: nil]) { //if cannot trash, just delete it (will work if it's on a remote volume) NSError * localError; if (![[NSFileManager defaultManager] removeItemAtPath: path error: &localError]) { NSLog(@"old Could not trash %@: %@", path, [localError localizedDescription]); if (error != nil) *error = localError; return NO; } else { NSLog(@"old removed %@", path); } } return YES; } - (void) moveTorrentDataFileTo: (NSString *) folder { NSString * oldFolder = [self currentDirectory]; if ([oldFolder isEqualToString: folder]) return; //check if moving inside itself NSArray * oldComponents = [oldFolder pathComponents], * newComponents = [folder pathComponents]; const NSInteger oldCount = [oldComponents count]; if (oldCount < [newComponents count] && [[newComponents objectAtIndex: oldCount] isEqualToString: [self name]] && [folder hasPrefix: oldFolder]) { NSAlert * alert = [[NSAlert alloc] init]; [alert setMessageText: NSLocalizedString(@"A folder cannot be moved to inside itself.", "Move inside itself alert -> title")]; [alert setInformativeText: [NSString stringWithFormat: NSLocalizedString(@"The move operation of \"%@\" cannot be done.", "Move inside itself alert -> message"), [self name]]]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Move inside itself alert -> button")]; [alert runModal]; [alert release]; return; } volatile int status; tr_torrentSetLocation(fHandle, [folder UTF8String], YES, NULL, &status); while (status == TR_LOC_MOVING) //block while moving (for now) [NSThread sleepForTimeInterval: 0.05]; if (status == TR_LOC_DONE) [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateStats" object: nil]; else { NSAlert * alert = [[NSAlert alloc] init]; [alert setMessageText: NSLocalizedString(@"There was an error moving the data file.", "Move error alert -> title")]; [alert setInformativeText: [NSString stringWithFormat: NSLocalizedString(@"The move operation of \"%@\" cannot be done.", "Move error alert -> message"), [self name]]]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Move error alert -> button")]; [alert runModal]; [alert release]; } [self updateTimeMachineExclude]; } - (void) copyTorrentFileTo: (NSString *) path { [[NSFileManager defaultManager] copyItemAtPath: [self torrentLocation] toPath: path error: NULL]; } - (BOOL) alertForRemainingDiskSpace { if ([self allDownloaded] || ![fDefaults boolForKey: @"WarningRemainingSpace"]) return YES; NSString * downloadFolder = [self currentDirectory]; NSDictionary * systemAttributes; if ((systemAttributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath: downloadFolder error: NULL])) { const uint64_t remainingSpace = [[systemAttributes objectForKey: NSFileSystemFreeSize] unsignedLongLongValue]; //if the remaining space is greater than the size left, then there is enough space regardless of preallocation if (remainingSpace < [self sizeLeft] && remainingSpace < tr_torrentGetBytesLeftToAllocate(fHandle)) { NSString * volumeName = [[[NSFileManager defaultManager] componentsToDisplayForPath: downloadFolder] objectAtIndex: 0]; NSAlert * alert = [[NSAlert alloc] init]; [alert setMessageText: [NSString stringWithFormat: NSLocalizedString(@"Not enough remaining disk space to download \"%@\" completely.", "Torrent disk space alert -> title"), [self name]]]; [alert setInformativeText: [NSString stringWithFormat: NSLocalizedString(@"The transfer will be paused." " Clear up space on %@ or deselect files in the torrent inspector to continue.", "Torrent disk space alert -> message"), volumeName]]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Torrent disk space alert -> button")]; [alert addButtonWithTitle: NSLocalizedString(@"Download Anyway", "Torrent disk space alert -> button")]; [alert setShowsSuppressionButton: YES]; [[alert suppressionButton] setTitle: NSLocalizedString(@"Do not check disk space again", "Torrent disk space alert -> button")]; const NSInteger result = [alert runModal]; if ([[alert suppressionButton] state] == NSOnState) [fDefaults setBool: NO forKey: @"WarningRemainingSpace"]; [alert release]; return result != NSAlertFirstButtonReturn; } } return YES; } - (NSImage *) icon { if ([self isMagnet]) return [NSImage imageNamed: @"Magnet"]; if (!fIcon) fIcon = [self isFolder] ? [[NSImage imageNamed: NSImageNameFolder] retain] : [[[NSWorkspace sharedWorkspace] iconForFileType: [[self name] pathExtension]] retain]; return fIcon; } - (NSString *) name { return fInfo->name != NULL ? [NSString stringWithUTF8String: fInfo->name] : fHashString; } - (BOOL) isFolder { return fInfo->isFolder; } - (uint64_t) size { return fInfo->totalSize; } - (uint64_t) sizeLeft { return fStat->leftUntilDone; } - (NSMutableArray *) allTrackerStats { int count; tr_tracker_stat * stats = tr_torrentTrackers(fHandle, &count); NSMutableArray * trackers = [NSMutableArray arrayWithCapacity: (count > 0 ? count + (stats[count-1].tier + 1) : 0)]; int prevTier = -1; for (int i=0; i < count; ++i) { if (stats[i].tier != prevTier) { [trackers addObject: @{ @"Tier" : @(stats[i].tier + 1), @"Name" : [self name] }]; prevTier = stats[i].tier; } TrackerNode * tracker = [[TrackerNode alloc] initWithTrackerStat: &stats[i] torrent: self]; [trackers addObject: tracker]; [tracker release]; } tr_torrentTrackersFree(stats, count); return trackers; } - (NSArray *) allTrackersFlat { NSMutableArray * allTrackers = [NSMutableArray arrayWithCapacity: fInfo->trackerCount]; for (NSInteger i=0; i < fInfo->trackerCount; i++) [allTrackers addObject: [NSString stringWithUTF8String: fInfo->trackers[i].announce]]; return allTrackers; } - (BOOL) addTrackerToNewTier: (NSString *) tracker { tracker = [tracker stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; if ([tracker rangeOfString: @"://"].location == NSNotFound) tracker = [@"http://" stringByAppendingString: tracker]; //recreate the tracker structure const int oldTrackerCount = fInfo->trackerCount; tr_tracker_info * trackerStructs = tr_new(tr_tracker_info, oldTrackerCount+1); for (NSUInteger i=0; i < oldTrackerCount; ++i) trackerStructs[i] = fInfo->trackers[i]; trackerStructs[oldTrackerCount].announce = (char *)[tracker UTF8String]; trackerStructs[oldTrackerCount].tier = trackerStructs[oldTrackerCount-1].tier + 1; trackerStructs[oldTrackerCount].id = oldTrackerCount; const BOOL success = tr_torrentSetAnnounceList(fHandle, trackerStructs, oldTrackerCount+1); tr_free(trackerStructs); return success; } - (void) removeTrackers: (NSSet *) trackers { //recreate the tracker structure tr_tracker_info * trackerStructs = tr_new(tr_tracker_info, fInfo->trackerCount); NSUInteger newCount = 0; for (NSUInteger i = 0; i < fInfo->trackerCount; i++) { if (![trackers containsObject: [NSString stringWithUTF8String: fInfo->trackers[i].announce]]) trackerStructs[newCount++] = fInfo->trackers[i]; } const BOOL success = tr_torrentSetAnnounceList(fHandle, trackerStructs, newCount); NSAssert(success, @"Removing tracker addresses failed"); tr_free(trackerStructs); } - (NSString *) comment { return fInfo->comment ? [NSString stringWithUTF8String: fInfo->comment] : @""; } - (NSString *) creator { return fInfo->creator ? [NSString stringWithUTF8String: fInfo->creator] : @""; } - (NSDate *) dateCreated { NSInteger date = fInfo->dateCreated; return date > 0 ? [NSDate dateWithTimeIntervalSince1970: date] : nil; } - (NSInteger) pieceSize { return fInfo->pieceSize; } - (NSInteger) pieceCount { return fInfo->pieceCount; } - (NSString *) hashString { return fHashString; } - (BOOL) privateTorrent { return fInfo->isPrivate; } - (NSString *) torrentLocation { return fInfo->torrent ? [NSString stringWithUTF8String: fInfo->torrent] : @""; } - (NSString *) dataLocation { if ([self isMagnet]) return nil; if ([self isFolder]) { NSString * dataLocation = [[self currentDirectory] stringByAppendingPathComponent: [self name]]; if (![[NSFileManager defaultManager] fileExistsAtPath: dataLocation]) return nil; return dataLocation; } else { char * location = tr_torrentFindFile(fHandle, 0); if (location == NULL) return nil; NSString * dataLocation = [NSString stringWithUTF8String: location]; free(location); return dataLocation; } } - (NSString *) fileLocation: (FileListNode *) node { if ([node isFolder]) { NSString * basePath = [[node path] stringByAppendingPathComponent: [node name]]; NSString * dataLocation = [[self currentDirectory] stringByAppendingPathComponent: basePath]; if (![[NSFileManager defaultManager] fileExistsAtPath: dataLocation]) return nil; return dataLocation; } else { char * location = tr_torrentFindFile(fHandle, [[node indexes] firstIndex]); if (location == NULL) return nil; NSString * dataLocation = [NSString stringWithUTF8String: location]; free(location); return dataLocation; } } - (void) renameTorrent: (NSString *) newName completionHandler: (void (^)(BOOL didRename)) completionHandler { NSParameterAssert(newName != nil); NSParameterAssert(![newName isEqualToString: @""]); NSDictionary * contextInfo = [@{ @"Torrent" : self, @"CompletionHandler" : [[completionHandler copy] autorelease] } retain]; tr_torrentRenamePath(fHandle, fInfo->name, [newName UTF8String], renameCallback, contextInfo); } - (void) renameFileNode: (FileListNode *) node withName: (NSString *) newName completionHandler: (void (^)(BOOL didRename)) completionHandler { NSParameterAssert([node torrent] == self); NSParameterAssert(newName != nil); NSParameterAssert(![newName isEqualToString: @""]); NSDictionary * contextInfo = [@{ @"Torrent" : self, @"Nodes" : @[ node ], @"CompletionHandler" : [[completionHandler copy] autorelease] } retain]; NSString * oldPath = [[node path] stringByAppendingPathComponent: [node name]]; tr_torrentRenamePath(fHandle, [oldPath UTF8String], [newName UTF8String], renameCallback, contextInfo); } - (CGFloat) progress { return fStat->percentComplete; } - (CGFloat) progressDone { return fStat->percentDone; } - (CGFloat) progressLeft { if ([self size] == 0) //magnet links return 0.0; return (CGFloat)[self sizeLeft] / [self size]; } - (CGFloat) checkingProgress { return fStat->recheckProgress; } - (CGFloat) availableDesired { return (CGFloat)fStat->desiredAvailable / [self sizeLeft]; } - (BOOL) isActive { return fStat->activity != TR_STATUS_STOPPED && fStat->activity != TR_STATUS_DOWNLOAD_WAIT && fStat->activity != TR_STATUS_SEED_WAIT; } - (BOOL) isSeeding { return fStat->activity == TR_STATUS_SEED; } - (BOOL) isChecking { return fStat->activity == TR_STATUS_CHECK || fStat->activity == TR_STATUS_CHECK_WAIT; } - (BOOL) isCheckingWaiting { return fStat->activity == TR_STATUS_CHECK_WAIT; } - (BOOL) allDownloaded { return [self sizeLeft] == 0 && ![self isMagnet]; } - (BOOL) isComplete { return [self progress] >= 1.0; } - (BOOL) isFinishedSeeding { return fStat->finished; } - (BOOL) isError { return fStat->error == TR_STAT_LOCAL_ERROR; } - (BOOL) isAnyErrorOrWarning { return fStat->error != TR_STAT_OK; } - (NSString *) errorMessage { if (![self isAnyErrorOrWarning]) return @""; NSString * error; if (!(error = [NSString stringWithUTF8String: fStat->errorString]) && !(error = [NSString stringWithCString: fStat->errorString encoding: NSISOLatin1StringEncoding])) error = [NSString stringWithFormat: @"(%@)", NSLocalizedString(@"unreadable error", "Torrent -> error string unreadable")]; //libtransmission uses "Set Location", Mac client uses "Move data file to..." - very hacky! error = [error stringByReplacingOccurrencesOfString: @"Set Location" withString: [@"Move Data File To" stringByAppendingEllipsis]]; return error; } - (NSArray *) peers { int totalPeers; tr_peer_stat * peers = tr_torrentPeers(fHandle, &totalPeers); NSMutableArray * peerDicts = [NSMutableArray arrayWithCapacity: totalPeers]; for (int i = 0; i < totalPeers; i++) { tr_peer_stat * peer = &peers[i]; NSMutableDictionary * dict = [NSMutableDictionary dictionaryWithCapacity: 12]; [dict setObject: [self name] forKey: @"Name"]; [dict setObject: [NSNumber numberWithInt: peer->from] forKey: @"From"]; [dict setObject: [NSString stringWithUTF8String: peer->addr] forKey: @"IP"]; [dict setObject: [NSNumber numberWithInt: peer->port] forKey: @"Port"]; [dict setObject: [NSNumber numberWithFloat: peer->progress] forKey: @"Progress"]; [dict setObject: [NSNumber numberWithBool: peer->isSeed] forKey: @"Seed"]; [dict setObject: [NSNumber numberWithBool: peer->isEncrypted] forKey: @"Encryption"]; [dict setObject: [NSNumber numberWithBool: peer->isUTP] forKey: @"uTP"]; [dict setObject: [NSString stringWithUTF8String: peer->client] forKey: @"Client"]; [dict setObject: [NSString stringWithUTF8String: peer->flagStr] forKey: @"Flags"]; if (peer->isUploadingTo) [dict setObject: [NSNumber numberWithDouble: peer->rateToPeer_KBps] forKey: @"UL To Rate"]; if (peer->isDownloadingFrom) [dict setObject: [NSNumber numberWithDouble: peer->rateToClient_KBps] forKey: @"DL From Rate"]; [peerDicts addObject: dict]; } tr_torrentPeersFree(peers, totalPeers); return peerDicts; } - (NSUInteger) webSeedCount { return fInfo->webseedCount; } - (NSArray *) webSeeds { NSMutableArray * webSeeds = [NSMutableArray arrayWithCapacity: fInfo->webseedCount]; double * dlSpeeds = tr_torrentWebSpeeds_KBps(fHandle); for (NSInteger i = 0; i < fInfo->webseedCount; i++) { NSMutableDictionary * dict = [NSMutableDictionary dictionaryWithCapacity: 3]; [dict setObject: [self name] forKey: @"Name"]; [dict setObject: [NSString stringWithUTF8String: fInfo->webseeds[i]] forKey: @"Address"]; if (dlSpeeds[i] != -1.0) [dict setObject: [NSNumber numberWithDouble: dlSpeeds[i]] forKey: @"DL From Rate"]; [webSeeds addObject: dict]; } tr_free(dlSpeeds); return webSeeds; } - (NSString *) progressString { if ([self isMagnet]) { NSString * progressString = fStat->metadataPercentComplete > 0.0 ? [NSString stringWithFormat: NSLocalizedString(@"%@ of torrent metadata retrieved", "Torrent -> progress string"), [NSString percentString: fStat->metadataPercentComplete longDecimals: YES]] : NSLocalizedString(@"torrent metadata needed", "Torrent -> progress string"); return [NSString stringWithFormat: @"%@ - %@", NSLocalizedString(@"Magnetized transfer", "Torrent -> progress string"), progressString]; } NSString * string; if (![self allDownloaded]) { CGFloat progress; if ([self isFolder] && [fDefaults boolForKey: @"DisplayStatusProgressSelected"]) { string = [NSString stringForFilePartialSize: [self haveTotal] fullSize: [self totalSizeSelected]]; progress = [self progressDone]; } else { string = [NSString stringForFilePartialSize: [self haveTotal] fullSize: [self size]]; progress = [self progress]; } string = [string stringByAppendingFormat: @" (%@)", [NSString percentString: progress longDecimals: YES]]; } else { NSString * downloadString; if (![self isComplete]) //only multifile possible { if ([fDefaults boolForKey: @"DisplayStatusProgressSelected"]) downloadString = [NSString stringWithFormat: NSLocalizedString(@"%@ selected", "Torrent -> progress string"), [NSString stringForFileSize: [self haveTotal]]]; else { downloadString = [NSString stringForFilePartialSize: [self haveTotal] fullSize: [self size]]; downloadString = [downloadString stringByAppendingFormat: @" (%@)", [NSString percentString: [self progress] longDecimals: YES]]; } } else downloadString = [NSString stringForFileSize: [self size]]; NSString * uploadString = [NSString stringWithFormat: NSLocalizedString(@"uploaded %@ (Ratio: %@)", "Torrent -> progress string"), [NSString stringForFileSize: [self uploadedTotal]], [NSString stringForRatio: [self ratio]]]; string = [downloadString stringByAppendingFormat: @", %@", uploadString]; } //add time when downloading or seed limit set if ([self shouldShowEta]) string = [string stringByAppendingFormat: @" - %@", [self etaString]]; return string; } - (NSString *) statusString { NSString * string; if ([self isAnyErrorOrWarning]) { switch (fStat->error) { case TR_STAT_LOCAL_ERROR: string = NSLocalizedString(@"Error", "Torrent -> status string"); break; case TR_STAT_TRACKER_ERROR: string = NSLocalizedString(@"Tracker returned error", "Torrent -> status string"); break; case TR_STAT_TRACKER_WARNING: string = NSLocalizedString(@"Tracker returned warning", "Torrent -> status string"); break; default: NSAssert(NO, @"unknown error state"); } NSString * errorString = [self errorMessage]; if (errorString && ![errorString isEqualToString: @""]) string = [string stringByAppendingFormat: @": %@", errorString]; } else { switch (fStat->activity) { case TR_STATUS_STOPPED: if ([self isFinishedSeeding]) string = NSLocalizedString(@"Seeding complete", "Torrent -> status string"); else string = NSLocalizedString(@"Paused", "Torrent -> status string"); break; case TR_STATUS_DOWNLOAD_WAIT: string = [NSLocalizedString(@"Waiting to download", "Torrent -> status string") stringByAppendingEllipsis]; break; case TR_STATUS_SEED_WAIT: string = [NSLocalizedString(@"Waiting to seed", "Torrent -> status string") stringByAppendingEllipsis]; break; case TR_STATUS_CHECK_WAIT: string = [NSLocalizedString(@"Waiting to check existing data", "Torrent -> status string") stringByAppendingEllipsis]; break; case TR_STATUS_CHECK: string = [NSString stringWithFormat: @"%@ (%@)", NSLocalizedString(@"Checking existing data", "Torrent -> status string"), [NSString percentString: [self checkingProgress] longDecimals: YES]]; break; case TR_STATUS_DOWNLOAD: if ([self totalPeersConnected] != 1) string = [NSString stringWithFormat: NSLocalizedString(@"Downloading from %d of %d peers", "Torrent -> status string"), [self peersSendingToUs], [self totalPeersConnected]]; else string = [NSString stringWithFormat: NSLocalizedString(@"Downloading from %d of 1 peer", "Torrent -> status string"), [self peersSendingToUs]]; const NSInteger webSeedCount = fStat->webseedsSendingToUs; if (webSeedCount > 0) { NSString * webSeedString; if (webSeedCount == 1) webSeedString = NSLocalizedString(@"web seed", "Torrent -> status string"); else webSeedString = [NSString stringWithFormat: NSLocalizedString(@"%d web seeds", "Torrent -> status string"), webSeedCount]; string = [string stringByAppendingFormat: @" + %@", webSeedString]; } break; case TR_STATUS_SEED: if ([self totalPeersConnected] != 1) string = [NSString stringWithFormat: NSLocalizedString(@"Seeding to %d of %d peers", "Torrent -> status string"), [self peersGettingFromUs], [self totalPeersConnected]]; else string = [NSString stringWithFormat: NSLocalizedString(@"Seeding to %d of 1 peer", "Torrent -> status string"), [self peersGettingFromUs]]; } if ([self isStalled]) string = [NSLocalizedString(@"Stalled", "Torrent -> status string") stringByAppendingFormat: @", %@", string]; } //append even if error if ([self isActive] && ![self isChecking]) { if (fStat->activity == TR_STATUS_DOWNLOAD) string = [string stringByAppendingFormat: @" - %@: %@, %@: %@", NSLocalizedString(@"DL", "Torrent -> status string"), [NSString stringForSpeed: [self downloadRate]], NSLocalizedString(@"UL", "Torrent -> status string"), [NSString stringForSpeed: [self uploadRate]]]; else string = [string stringByAppendingFormat: @" - %@: %@", NSLocalizedString(@"UL", "Torrent -> status string"), [NSString stringForSpeed: [self uploadRate]]]; } return string; } - (NSString *) shortStatusString { NSString * string; switch (fStat->activity) { case TR_STATUS_STOPPED: if ([self isFinishedSeeding]) string = NSLocalizedString(@"Seeding complete", "Torrent -> status string"); else string = NSLocalizedString(@"Paused", "Torrent -> status string"); break; case TR_STATUS_DOWNLOAD_WAIT: string = [NSLocalizedString(@"Waiting to download", "Torrent -> status string") stringByAppendingEllipsis]; break; case TR_STATUS_SEED_WAIT: string = [NSLocalizedString(@"Waiting to seed", "Torrent -> status string") stringByAppendingEllipsis]; break; case TR_STATUS_CHECK_WAIT: string = [NSLocalizedString(@"Waiting to check existing data", "Torrent -> status string") stringByAppendingEllipsis]; break; case TR_STATUS_CHECK: string = [NSString stringWithFormat: @"%@ (%@)", NSLocalizedString(@"Checking existing data", "Torrent -> status string"), [NSString percentString: [self checkingProgress] longDecimals: YES]]; break; case TR_STATUS_DOWNLOAD: string = [NSString stringWithFormat: @"%@: %@, %@: %@", NSLocalizedString(@"DL", "Torrent -> status string"), [NSString stringForSpeed: [self downloadRate]], NSLocalizedString(@"UL", "Torrent -> status string"), [NSString stringForSpeed: [self uploadRate]]]; break; case TR_STATUS_SEED: string = [NSString stringWithFormat: @"%@: %@, %@: %@", NSLocalizedString(@"Ratio", "Torrent -> status string"), [NSString stringForRatio: [self ratio]], NSLocalizedString(@"UL", "Torrent -> status string"), [NSString stringForSpeed: [self uploadRate]]]; } return string; } - (NSString *) remainingTimeString { if ([self shouldShowEta]) return [self etaString]; else return [self shortStatusString]; } - (NSString *) stateString { switch (fStat->activity) { case TR_STATUS_STOPPED: case TR_STATUS_DOWNLOAD_WAIT: case TR_STATUS_SEED_WAIT: { NSString * string = NSLocalizedString(@"Paused", "Torrent -> status string"); NSString * extra = nil; if ([self waitingToStart]) { extra = fStat->activity == TR_STATUS_DOWNLOAD_WAIT ? NSLocalizedString(@"Waiting to download", "Torrent -> status string") : NSLocalizedString(@"Waiting to seed", "Torrent -> status string"); } else if ([self isFinishedSeeding]) extra = NSLocalizedString(@"Seeding complete", "Torrent -> status string"); else; return extra ? [string stringByAppendingFormat: @" (%@)", extra] : string; } case TR_STATUS_CHECK_WAIT: return [NSLocalizedString(@"Waiting to check existing data", "Torrent -> status string") stringByAppendingEllipsis]; case TR_STATUS_CHECK: return [NSString stringWithFormat: @"%@ (%@)", NSLocalizedString(@"Checking existing data", "Torrent -> status string"), [NSString percentString: [self checkingProgress] longDecimals: YES]]; case TR_STATUS_DOWNLOAD: return NSLocalizedString(@"Downloading", "Torrent -> status string"); case TR_STATUS_SEED: return NSLocalizedString(@"Seeding", "Torrent -> status string"); } } - (NSInteger) totalPeersConnected { return fStat->peersConnected; } - (NSInteger) totalPeersTracker { return fStat->peersFrom[TR_PEER_FROM_TRACKER]; } - (NSInteger) totalPeersIncoming { return fStat->peersFrom[TR_PEER_FROM_INCOMING]; } - (NSInteger) totalPeersCache { return fStat->peersFrom[TR_PEER_FROM_RESUME]; } - (NSInteger) totalPeersPex { return fStat->peersFrom[TR_PEER_FROM_PEX]; } - (NSInteger) totalPeersDHT { return fStat->peersFrom[TR_PEER_FROM_DHT]; } - (NSInteger) totalPeersLocal { return fStat->peersFrom[TR_PEER_FROM_LPD]; } - (NSInteger) totalPeersLTEP { return fStat->peersFrom[TR_PEER_FROM_LTEP]; } - (NSInteger) peersSendingToUs { return fStat->peersSendingToUs; } - (NSInteger) peersGettingFromUs { return fStat->peersGettingFromUs; } - (CGFloat) downloadRate { return fStat->pieceDownloadSpeed_KBps; } - (CGFloat) uploadRate { return fStat->pieceUploadSpeed_KBps; } - (CGFloat) totalRate { return [self downloadRate] + [self uploadRate]; } - (uint64_t) haveVerified { return fStat->haveValid; } - (uint64_t) haveTotal { return [self haveVerified] + fStat->haveUnchecked; } - (uint64_t) totalSizeSelected { return fStat->sizeWhenDone; } - (uint64_t) downloadedTotal { return fStat->downloadedEver; } - (uint64_t) uploadedTotal { return fStat->uploadedEver; } - (uint64_t) failedHash { return fStat->corruptEver; } - (NSInteger) groupValue { return fGroupValue; } - (void) setGroupValue: (NSInteger) groupValue determinationType: (TorrentDeterminationType) determinationType; { if (groupValue != fGroupValue) { fGroupValue = groupValue; [[NSNotificationCenter defaultCenter] postNotificationName: kTorrentDidChangeGroupNotification object: self]; } fGroupValueDetermination = determinationType; } - (NSInteger) groupOrderValue { return [[GroupsController groups] rowValueForIndex: fGroupValue]; } - (void) checkGroupValueForRemoval: (NSNotification *) notification { if (fGroupValue != -1 && [[[notification userInfo] objectForKey: @"Index"] integerValue] == fGroupValue) fGroupValue = -1; } - (NSArray *) fileList { return fFileList; } - (NSArray *) flatFileList { return fFlatFileList; } - (NSInteger) fileCount { return fInfo->fileCount; } - (void) updateFileStat { if (fFileStat) tr_torrentFilesFree(fFileStat, [self fileCount]); fFileStat = tr_torrentFiles(fHandle, NULL); } - (CGFloat) fileProgress: (FileListNode *) node { if ([self fileCount] == 1 || [self isComplete]) return [self progress]; if (!fFileStat) [self updateFileStat]; // #5501 if ([node size] == 0) { return 1.0; } NSIndexSet * indexSet = [node indexes]; if ([indexSet count] == 1) return fFileStat[[indexSet firstIndex]].progress; uint64_t have = 0; for (NSInteger index = [indexSet firstIndex]; index != NSNotFound; index = [indexSet indexGreaterThanIndex: index]) have += fFileStat[index].bytesCompleted; return (CGFloat)have / [node size]; } - (BOOL) canChangeDownloadCheckForFile: (NSUInteger) index { NSAssert2(index < [self fileCount], @"Index %ld is greater than file count %ld", index, [self fileCount]); return [self canChangeDownloadCheckForFiles: [NSIndexSet indexSetWithIndex: index]]; } - (BOOL) canChangeDownloadCheckForFiles: (NSIndexSet *) indexSet { if ([self fileCount] == 1 || [self isComplete]) return NO; if (!fFileStat) [self updateFileStat]; __block BOOL canChange = NO; [indexSet enumerateIndexesWithOptions: NSEnumerationConcurrent usingBlock: ^(NSUInteger index, BOOL *stop) { if (fFileStat[index].progress < 1.0) { canChange = YES; *stop = YES; } }]; return canChange; } - (NSInteger) checkForFiles: (NSIndexSet *) indexSet { BOOL onState = NO, offState = NO; for (NSUInteger index = [indexSet firstIndex]; index != NSNotFound; index = [indexSet indexGreaterThanIndex: index]) { if (!fInfo->files[index].dnd || ![self canChangeDownloadCheckForFile: index]) onState = YES; else offState = YES; if (onState && offState) return NSMixedState; } return onState ? NSOnState : NSOffState; } - (void) setFileCheckState: (NSInteger) state forIndexes: (NSIndexSet *) indexSet { NSUInteger count = [indexSet count]; tr_file_index_t * files = malloc(count * sizeof(tr_file_index_t)); for (NSUInteger index = [indexSet firstIndex], i = 0; index != NSNotFound; index = [indexSet indexGreaterThanIndex: index], i++) files[i] = index; tr_torrentSetFileDLs(fHandle, files, count, state != NSOffState); free(files); [self update]; [[NSNotificationCenter defaultCenter] postNotificationName: @"TorrentFileCheckChange" object: self]; } - (void) setFilePriority: (tr_priority_t) priority forIndexes: (NSIndexSet *) indexSet { const NSUInteger count = [indexSet count]; tr_file_index_t * files = tr_malloc(count * sizeof(tr_file_index_t)); for (NSUInteger index = [indexSet firstIndex], i = 0; index != NSNotFound; index = [indexSet indexGreaterThanIndex: index], i++) files[i] = index; tr_torrentSetFilePriorities(fHandle, files, count, priority); tr_free(files); } - (BOOL) hasFilePriority: (tr_priority_t) priority forIndexes: (NSIndexSet *) indexSet { for (NSUInteger index = [indexSet firstIndex]; index != NSNotFound; index = [indexSet indexGreaterThanIndex: index]) if (priority == fInfo->files[index].priority && [self canChangeDownloadCheckForFile: index]) return YES; return NO; } - (NSSet *) filePrioritiesForIndexes: (NSIndexSet *) indexSet { BOOL low = NO, normal = NO, high = NO; NSMutableSet * priorities = [NSMutableSet setWithCapacity: MIN([indexSet count], 3)]; for (NSUInteger index = [indexSet firstIndex]; index != NSNotFound; index = [indexSet indexGreaterThanIndex: index]) { if (![self canChangeDownloadCheckForFile: index]) continue; const tr_priority_t priority = fInfo->files[index].priority; switch (priority) { case TR_PRI_LOW: if (low) continue; low = YES; break; case TR_PRI_NORMAL: if (normal) continue; normal = YES; break; case TR_PRI_HIGH: if (high) continue; high = YES; break; default: NSAssert2(NO, @"Unknown priority %d for file index %ld", priority, index); } [priorities addObject: [NSNumber numberWithInteger: priority]]; if (low && normal && high) break; } return priorities; } - (NSDate *) dateAdded { const time_t date = fStat->addedDate; return [NSDate dateWithTimeIntervalSince1970: date]; } - (NSDate *) dateCompleted { const time_t date = fStat->doneDate; return date != 0 ? [NSDate dateWithTimeIntervalSince1970: date] : nil; } - (NSDate *) dateActivity { const time_t date = fStat->activityDate; return date != 0 ? [NSDate dateWithTimeIntervalSince1970: date] : nil; } - (NSDate *) dateActivityOrAdd { NSDate * date = [self dateActivity]; return date ? date : [self dateAdded]; } - (NSInteger) secondsDownloading { return fStat->secondsDownloading; } - (NSInteger) secondsSeeding { return fStat->secondsSeeding; } - (NSInteger) stalledMinutes { if (fStat->idleSecs == -1) return -1; return fStat->idleSecs / 60; } - (BOOL) isStalled { return fStat->isStalled; } - (void) updateTimeMachineExclude { [self setTimeMachineExclude: ![self allDownloaded]]; } - (NSInteger) stateSortKey { if (![self isActive]) //paused { if ([self waitingToStart]) return 1; else return 0; } else if ([self isSeeding]) //seeding return 10; else //downloading return 20; } - (NSString *) trackerSortKey { int count; tr_tracker_stat * stats = tr_torrentTrackers(fHandle, &count); NSString * best = nil; for (int i=0; i < count; ++i) { NSString * tracker = [NSString stringWithUTF8String: stats[i].host]; if (!best || [tracker localizedCaseInsensitiveCompare: best] == NSOrderedAscending) best = tracker; } tr_torrentTrackersFree(stats, count); return best; } - (tr_torrent *) torrentStruct { return fHandle; } - (NSURL *) previewItemURL { NSString * location = [self dataLocation]; return location ? [NSURL fileURLWithPath: location] : nil; } @end @implementation Torrent (Private) - (id) initWithPath: (NSString *) path hash: (NSString *) hashString torrentStruct: (tr_torrent *) torrentStruct magnetAddress: (NSString *) magnetAddress lib: (tr_session *) lib groupValue: (NSNumber *) groupValue removeWhenFinishSeeding: (NSNumber *) removeWhenFinishSeeding downloadFolder: (NSString *) downloadFolder legacyIncompleteFolder: (NSString *) incompleteFolder { if (!(self = [super init])) return nil; fDefaults = [NSUserDefaults standardUserDefaults]; if (torrentStruct) fHandle = torrentStruct; else { //set libtransmission settings for initialization tr_ctor * ctor = tr_ctorNew(lib); tr_ctorSetPaused(ctor, TR_FORCE, YES); if (downloadFolder) tr_ctorSetDownloadDir(ctor, TR_FORCE, [downloadFolder UTF8String]); if (incompleteFolder) tr_ctorSetIncompleteDir(ctor, [incompleteFolder UTF8String]); tr_parse_result result = TR_PARSE_ERR; if (path) result = tr_ctorSetMetainfoFromFile(ctor, [path UTF8String]); if (result != TR_PARSE_OK && magnetAddress) result = tr_ctorSetMetainfoFromMagnetLink(ctor, [magnetAddress UTF8String]); //backup - shouldn't be needed after upgrade to 1.70 if (result != TR_PARSE_OK && hashString) result = tr_ctorSetMetainfoFromHash(ctor, [hashString UTF8String]); if (result == TR_PARSE_OK) fHandle = tr_torrentNew(ctor, NULL, NULL); tr_ctorFree(ctor); if (!fHandle) { [self release]; return nil; } } fInfo = tr_torrentInfo(fHandle); tr_torrentSetQueueStartCallback(fHandle, startQueueCallback, self); tr_torrentSetCompletenessCallback(fHandle, completenessChangeCallback, self); tr_torrentSetRatioLimitHitCallback(fHandle, ratioLimitHitCallback, self); tr_torrentSetIdleLimitHitCallback(fHandle, idleLimitHitCallback, self); tr_torrentSetMetadataCallback(fHandle, metadataCallback, self); fHashString = [[NSString alloc] initWithUTF8String: fInfo->hashString]; fResumeOnWake = NO; //don't do after this point - it messes with auto-group functionality if (![self isMagnet]) [self createFileList]; fDownloadFolderDetermination = TorrentDeterminationAutomatic; if (groupValue) { fGroupValueDetermination = TorrentDeterminationUserSpecified; fGroupValue = [groupValue intValue]; } else { fGroupValueDetermination = TorrentDeterminationAutomatic; fGroupValue = [[GroupsController groups] groupIndexForTorrent: self]; } fRemoveWhenFinishSeeding = removeWhenFinishSeeding ? [removeWhenFinishSeeding boolValue] : [fDefaults boolForKey: @"RemoveWhenFinishSeeding"]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(checkGroupValueForRemoval:) name: @"GroupValueRemoved" object: nil]; fTimeMachineExcludeInitialized = NO; [self update]; return self; } - (void) createFileList { NSAssert(![self isMagnet], @"Cannot create a file list until the torrent is demagnetized"); if ([self isFolder]) { const NSInteger count = [self fileCount]; NSMutableArray * flatFileList = [NSMutableArray arrayWithCapacity: count]; FileListNode * tempNode = nil; for (NSInteger i = 0; i < count; i++) { tr_file * file = &fInfo->files[i]; NSString * fullPath = [NSString stringWithUTF8String: file->name]; NSArray * pathComponents = [fullPath pathComponents]; if (!tempNode) tempNode = [[FileListNode alloc] initWithFolderName:[pathComponents objectAtIndex: 0] path:@"" torrent:self]; [self insertPathForComponents: pathComponents withComponentIndex: 1 forParent: tempNode fileSize: file->length index: i flatList: flatFileList]; } [self sortFileList: [tempNode children]]; [self sortFileList: flatFileList]; fFileList = [[NSArray alloc] initWithArray: [tempNode children]]; fFlatFileList = [[NSArray alloc] initWithArray: flatFileList]; [tempNode release]; } else { FileListNode * node = [[FileListNode alloc] initWithFileName: [self name] path: @"" size: [self size] index: 0 torrent: self]; fFileList = [[NSArray arrayWithObject: node] retain]; fFlatFileList = [fFileList retain]; [node release]; } } - (void) insertPathForComponents: (NSArray *) components withComponentIndex: (NSUInteger) componentIndex forParent: (FileListNode *) parent fileSize: (uint64_t) size index: (NSInteger) index flatList: (NSMutableArray *) flatFileList { NSParameterAssert([components count] > 0); NSParameterAssert(componentIndex < [components count]); NSString * name = [components objectAtIndex: componentIndex]; const BOOL isFolder = componentIndex < ([components count]-1); //determine if folder node already exists __block FileListNode * node = nil; if (isFolder) { [[parent children] enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(FileListNode * searchNode, NSUInteger idx, BOOL * stop) { if ([[searchNode name] isEqualToString: name] && [searchNode isFolder]) { node = searchNode; *stop = YES; } }]; } //create new folder or file if it doesn't already exist if (!node) { NSString * path = [[parent path] stringByAppendingPathComponent: [parent name]]; if (isFolder) node = [[[FileListNode alloc] initWithFolderName: name path: path torrent: self] autorelease]; else { node = [[[FileListNode alloc] initWithFileName: name path: path size: size index: index torrent: self] autorelease]; [flatFileList addObject: node]; } [parent insertChild: node]; } if (isFolder) { [node insertIndex: index withSize: size]; [self insertPathForComponents: components withComponentIndex: (componentIndex+1) forParent: node fileSize: size index: index flatList: flatFileList]; } } - (void) sortFileList: (NSMutableArray *) fileNodes { NSSortDescriptor * descriptor = [NSSortDescriptor sortDescriptorWithKey: @"name" ascending: YES selector: @selector(localizedStandardCompare:)]; [fileNodes sortUsingDescriptors: [NSArray arrayWithObject: descriptor]]; [fileNodes enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(FileListNode * node, NSUInteger idx, BOOL * stop) { if ([node isFolder]) [self sortFileList: [node children]]; }]; } - (void) startQueue { [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateQueue" object: self]; } //status has been retained - (void) completenessChange: (tr_completeness) status wasRunning: (BOOL) wasRunning { fStat = tr_torrentStat(fHandle); //don't call update yet to avoid auto-stop switch (status) { case TR_SEED: case TR_PARTIAL_SEED: { NSDictionary * statusInfo = @{ @"Status" : @(status), @"WasRunning" : @(wasRunning) }; [[NSNotificationCenter defaultCenter] postNotificationName: @"TorrentFinishedDownloading" object: self userInfo: statusInfo]; //quarantine the finished data NSString * dataLocation = [[self currentDirectory] stringByAppendingPathComponent: [self name]]; FSRef ref; if (FSPathMakeRef((const UInt8 *)[dataLocation UTF8String], &ref, NULL) == noErr) { NSDictionary * quarantineProperties = [NSDictionary dictionaryWithObject: (NSString *)kLSQuarantineTypeOtherDownload forKey: (NSString *)kLSQuarantineTypeKey]; if (LSSetItemAttribute(&ref, kLSRolesAll, kLSItemQuarantineProperties, quarantineProperties) != noErr) NSLog(@"Failed to quarantine: %@", dataLocation); } else NSLog(@"Could not find file to quarantine: %@", dataLocation); break; } case TR_LEECH: [[NSNotificationCenter defaultCenter] postNotificationName: @"TorrentRestartedDownloading" object: self]; break; } [self update]; [self updateTimeMachineExclude]; } - (void) ratioLimitHit { fStat = tr_torrentStat(fHandle); [[NSNotificationCenter defaultCenter] postNotificationName: @"TorrentFinishedSeeding" object: self]; } - (void) idleLimitHit { fStat = tr_torrentStat(fHandle); [[NSNotificationCenter defaultCenter] postNotificationName: @"TorrentFinishedSeeding" object: self]; } - (void) metadataRetrieved { fStat = tr_torrentStat(fHandle); [self createFileList]; /* If the torrent is in no group, or the group was automatically determined based on criteria evaluated * before we had metadata for this torrent, redetermine the group */ if ((fGroupValueDetermination == TorrentDeterminationAutomatic) || ([self groupValue] == -1)) [self setGroupValue: [[GroupsController groups] groupIndexForTorrent: self] determinationType: TorrentDeterminationAutomatic]; //change the location if the group calls for it and it's either not already set or was set automatically before if (((fDownloadFolderDetermination == TorrentDeterminationAutomatic) || !tr_torrentGetCurrentDir(fHandle)) && [[GroupsController groups] usesCustomDownloadLocationForIndex: [self groupValue]]) { NSString *location = [[GroupsController groups] customDownloadLocationForIndex: [self groupValue]]; [self changeDownloadFolderBeforeUsing: location determinationType:TorrentDeterminationAutomatic]; } [[NSNotificationCenter defaultCenter] postNotificationName: @"ResetInspector" object: self userInfo: @{ @"Torrent" : self }]; } - (void)renameFinished: (BOOL) success nodes: (NSArray *) nodes completionHandler: (void (^)(BOOL)) completionHandler oldPath: (NSString *) oldPath newName: (NSString *) newName { NSParameterAssert(completionHandler != nil); NSParameterAssert(oldPath != nil); NSParameterAssert(newName != nil); NSString * path = [oldPath stringByDeletingLastPathComponent]; if (success) { NSString * oldName = [oldPath lastPathComponent]; void (^__block updateNodeAndChildrenForRename)(FileListNode *) = ^(FileListNode * node) { [node updateFromOldName: oldName toNewName: newName inPath: path]; if ([node isFolder]) { [[node children] enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(FileListNode * childNode, NSUInteger idx, BOOL * stop) { updateNodeAndChildrenForRename(childNode); }]; } }; if (!nodes) nodes = fFlatFileList; [nodes enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(FileListNode * node, NSUInteger idx, BOOL *stop) { updateNodeAndChildrenForRename(node); }]; //resort lists NSMutableArray * fileList = [fFileList mutableCopy]; [fFileList release]; [self sortFileList: fileList]; fFileList = fileList; NSMutableArray * flatFileList = [fFlatFileList mutableCopy]; [fFlatFileList release]; [self sortFileList: flatFileList]; fFlatFileList = flatFileList; } else NSLog(@"Error renaming %@ to %@", oldPath, [path stringByAppendingPathComponent: newName]); completionHandler(success); } - (BOOL) shouldShowEta { if (fStat->activity == TR_STATUS_DOWNLOAD) return YES; else if ([self isSeeding]) { //ratio: show if it's set at all if (tr_torrentGetSeedRatio(fHandle, NULL)) return YES; //idle: show only if remaining time is less than cap if (fStat->etaIdle != TR_ETA_NOT_AVAIL && fStat->etaIdle < ETA_IDLE_DISPLAY_SEC) return YES; } return NO; } - (NSString *) etaString { NSInteger eta; BOOL fromIdle; //don't check for both, since if there's a regular ETA, the torrent isn't idle so it's meaningless if (fStat->eta != TR_ETA_NOT_AVAIL && fStat->eta != TR_ETA_UNKNOWN) { eta = fStat->eta; fromIdle = NO; } else if (fStat->etaIdle != TR_ETA_NOT_AVAIL && fStat->etaIdle < ETA_IDLE_DISPLAY_SEC) { eta = fStat->etaIdle; fromIdle = YES; } else return NSLocalizedString(@"remaining time unknown", "Torrent -> eta string"); NSString * idleString; if ([NSApp isOnYosemiteOrBetter]) { static NSDateComponentsFormatter *formatter; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ formatter = [NSDateComponentsFormatter new]; formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleShort; formatter.maximumUnitCount = 2; formatter.collapsesLargestUnit = YES; formatter.includesTimeRemainingPhrase = YES; }); idleString = [formatter stringFromTimeInterval: eta]; } else { idleString = [NSString timeString: eta includesTimeRemainingPhrase: YES showSeconds: YES maxFields: 2]; } if (fromIdle) { idleString = [idleString stringByAppendingFormat: @" (%@)", NSLocalizedString(@"inactive", "Torrent -> eta string")]; } return idleString; } - (void) setTimeMachineExclude: (BOOL) exclude { NSString * path; if ((path = [self dataLocation])) { CSBackupSetItemExcluded((CFURLRef)[NSURL fileURLWithPath: path], exclude, false); fTimeMachineExcludeInitialized = YES; } } @end transmission-2.92/macosx/PaxHeaders.4960/URLSheetWindowController.m0000644000000000000000000000013212442116621022214 xustar0030 mtime=1418239377.042464409 30 atime=1418239377.042464409 30 ctime=1457295923.647869936 transmission-2.92/macosx/URLSheetWindowController.m0000644000175000017500000000756612442116621023657 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: URLSheetWindowController.m 13254 2012-03-13 03:39:56Z livings124 $ * * Copyright (c) 2011-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "URLSheetWindowController.h" #import "Controller.h" @interface URLSheetWindowController (Private) - (void) updateOpenButtonForURL: (NSString *) string; @end @implementation URLSheetWindowController NSString * urlString = nil; - (id) initWithController: (Controller *) controller { if ((self = [self initWithWindowNibName: @"URLSheetWindow"])) { fController = controller; } return self; } - (void) awakeFromNib { [fLabelField setStringValue: NSLocalizedString(@"Internet address of torrent file:", "URL sheet label")]; if (urlString) { [fTextField setStringValue: urlString]; [fTextField selectText: self]; [self updateOpenButtonForURL: urlString]; } [fOpenButton setTitle: NSLocalizedString(@"Open", "URL sheet button")]; [fCancelButton setTitle: NSLocalizedString(@"Cancel", "URL sheet button")]; [fOpenButton sizeToFit]; [fCancelButton sizeToFit]; //size the two buttons the same NSRect openFrame = [fOpenButton frame]; openFrame.size.width += 10.0; NSRect cancelFrame = [fCancelButton frame]; cancelFrame.size.width += 10.0; if (NSWidth(openFrame) > NSWidth(cancelFrame)) cancelFrame.size.width = NSWidth(openFrame); else openFrame.size.width = NSWidth(cancelFrame); openFrame.origin.x = NSWidth([[self window] frame]) - NSWidth(openFrame) - 20.0 + 6.0; //I don't know why the extra 6.0 is needed [fOpenButton setFrame: openFrame]; cancelFrame.origin.x = NSMinX(openFrame) - NSWidth(cancelFrame); [fCancelButton setFrame: cancelFrame]; } - (void) openURLEndSheet: (id) sender { [[self window] orderOut: sender]; [NSApp endSheet: [self window] returnCode: 1]; } - (void) openURLCancelEndSheet: (id) sender { [[self window] orderOut: sender]; [NSApp endSheet: [self window] returnCode: 0]; } - (NSString *) urlString { return [[[fTextField stringValue] retain] autorelease]; } - (void) controlTextDidChange: (NSNotification *) notification { [self updateOpenButtonForURL: [fTextField stringValue]]; } @end @implementation URLSheetWindowController (Private) - (void) updateOpenButtonForURL: (NSString *) string { BOOL enable = YES; if ([string isEqualToString: @""]) enable = NO; else { NSRange prefixRange = [string rangeOfString: @"://"]; if (prefixRange.location != NSNotFound && [string length] == NSMaxRange(prefixRange)) enable = NO; } [fOpenButton setEnabled: enable]; } @end transmission-2.92/macosx/PaxHeaders.4960/InfoPeersViewController.m0000644000000000000000000000013212666747213022135 xustar0030 mtime=1457245835.363999472 30 atime=1457245835.363999472 30 ctime=1457295923.307864154 transmission-2.92/macosx/InfoPeersViewController.m0000644000175000017500000005445212666747213023574 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoPeersViewController.m 14706 2016-03-03 22:27:45Z mikedld $ * * Copyright (c) 2010-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "InfoPeersViewController.h" #import "NSApplicationAdditions.h" #import "NSStringAdditions.h" #import "PeerProgressIndicatorCell.h" #import "Torrent.h" #import "WebSeedTableView.h" #import "transmission.h" // required by utils.h #import "utils.h" #define ANIMATION_ID_KEY @"animationId" #define WEB_SEED_ANIMATION_ID @"webSeed" @interface InfoPeersViewController (Private) - (void) setupInfo; - (void) setWebSeedTableHidden: (BOOL) hide animate: (BOOL) animate; - (NSArray *) peerSortDescriptors; @end @implementation InfoPeersViewController - (id) init { if ((self = [super initWithNibName: @"InfoPeersView" bundle: nil])) { [self setTitle: NSLocalizedString(@"Peers", "Inspector view -> title")]; } return self; } - (void) awakeFromNib { const CGFloat height = [[NSUserDefaults standardUserDefaults] floatForKey: @"InspectorContentHeightPeers"]; if (height != 0.0) { NSRect viewRect = [[self view] frame]; viewRect.size.height = height; [[self view] setFrame: viewRect]; } //set table header text [[[fPeerTable tableColumnWithIdentifier: @"IP"] headerCell] setStringValue: NSLocalizedString(@"IP Address", "inspector -> peer table -> header")]; [[[fPeerTable tableColumnWithIdentifier: @"Client"] headerCell] setStringValue: NSLocalizedString(@"Client", "inspector -> peer table -> header")]; [[[fPeerTable tableColumnWithIdentifier: @"DL From"] headerCell] setStringValue: NSLocalizedString(@"DL", "inspector -> peer table -> header")]; [[[fPeerTable tableColumnWithIdentifier: @"UL To"] headerCell] setStringValue: NSLocalizedString(@"UL", "inspector -> peer table -> header")]; [[[fWebSeedTable tableColumnWithIdentifier: @"Address"] headerCell] setStringValue: NSLocalizedString(@"Web Seeds", "inspector -> web seed table -> header")]; [[[fWebSeedTable tableColumnWithIdentifier: @"DL From"] headerCell] setStringValue: NSLocalizedString(@"DL", "inspector -> web seed table -> header")]; //set table header tool tips [[fPeerTable tableColumnWithIdentifier: @"Encryption"] setHeaderToolTip: NSLocalizedString(@"Encrypted Connection", "inspector -> peer table -> header tool tip")]; [[fPeerTable tableColumnWithIdentifier: @"Progress"] setHeaderToolTip: NSLocalizedString(@"Available", "inspector -> peer table -> header tool tip")]; [[fPeerTable tableColumnWithIdentifier: @"DL From"] setHeaderToolTip: NSLocalizedString(@"Downloading From Peer", "inspector -> peer table -> header tool tip")]; [[fPeerTable tableColumnWithIdentifier: @"UL To"] setHeaderToolTip: NSLocalizedString(@"Uploading To Peer", "inspector -> peer table -> header tool tip")]; [[fWebSeedTable tableColumnWithIdentifier: @"DL From"] setHeaderToolTip: NSLocalizedString(@"Downloading From Web Seed", "inspector -> web seed table -> header tool tip")]; //prepare for animating peer table and web seed table fViewTopMargin = fWebSeedTableTopConstraint.constant; CABasicAnimation * webSeedTableAnimation = [CABasicAnimation animation]; [webSeedTableAnimation setTimingFunction: [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionLinear]]; [webSeedTableAnimation setDuration: 0.125]; [webSeedTableAnimation setDelegate: self]; [webSeedTableAnimation setValue: WEB_SEED_ANIMATION_ID forKey: ANIMATION_ID_KEY]; [fWebSeedTableTopConstraint setAnimations: @{ @"constant": webSeedTableAnimation }]; [self setWebSeedTableHidden: YES animate: NO]; } - (void) dealloc { [fTorrents release]; [fPeers release]; [fWebSeeds release]; [super dealloc]; } #warning subclass? - (void) setInfoForTorrents: (NSArray *) torrents { //don't check if it's the same in case the metadata changed [fTorrents release]; fTorrents = [torrents retain]; fSet = NO; } - (void) updateInfo { if (!fSet) [self setupInfo]; if ([fTorrents count] == 0) return; if (!fPeers) fPeers = [[NSMutableArray alloc] init]; else [fPeers removeAllObjects]; if (!fWebSeeds) fWebSeeds = [[NSMutableArray alloc] init]; else [fWebSeeds removeAllObjects]; NSUInteger connected = 0, tracker = 0, incoming = 0, cache = 0, lpd = 0, pex = 0, dht = 0, ltep = 0, toUs = 0, fromUs = 0; BOOL anyActive = false; for (Torrent * torrent in fTorrents) { if ([torrent webSeedCount] > 0) [fWebSeeds addObjectsFromArray: [torrent webSeeds]]; if ([torrent isActive]) { anyActive = YES; [fPeers addObjectsFromArray: [torrent peers]]; const NSUInteger connectedThis = [torrent totalPeersConnected]; if (connectedThis > 0) { connected += [torrent totalPeersConnected]; tracker += [torrent totalPeersTracker]; incoming += [torrent totalPeersIncoming]; cache += [torrent totalPeersCache]; lpd += [torrent totalPeersLocal]; pex += [torrent totalPeersPex]; dht += [torrent totalPeersDHT]; ltep += [torrent totalPeersLTEP]; toUs += [torrent peersSendingToUs]; fromUs += [torrent peersGettingFromUs]; } } } [fPeers sortUsingDescriptors: [self peerSortDescriptors]]; [fPeerTable reloadData]; [fWebSeeds sortUsingDescriptors: [fWebSeedTable sortDescriptors]]; [fWebSeedTable reloadData]; [fWebSeedTable setWebSeeds: fWebSeeds]; if (anyActive) { NSString * connectedText = [NSString stringWithFormat: NSLocalizedString(@"%d Connected", "Inspector -> Peers tab -> peers"), connected]; if (connected > 0) { NSMutableArray * upDownComponents = [NSMutableArray arrayWithCapacity: 2]; if (toUs > 0) [upDownComponents addObject: [NSString stringWithFormat: NSLocalizedString(@"DL from %d", "Inspector -> Peers tab -> peers"), toUs]]; if (fromUs > 0) [upDownComponents addObject: [NSString stringWithFormat: NSLocalizedString(@"UL to %d", "Inspector -> Peers tab -> peers"), fromUs]]; if ([upDownComponents count] > 0) connectedText = [connectedText stringByAppendingFormat: @": %@", [upDownComponents componentsJoinedByString: @", "]]; NSMutableArray * fromComponents = [NSMutableArray arrayWithCapacity: 7]; if (tracker > 0) [fromComponents addObject: [NSString stringWithFormat: NSLocalizedString(@"%d tracker", "Inspector -> Peers tab -> peers"), tracker]]; if (incoming > 0) [fromComponents addObject: [NSString stringWithFormat: NSLocalizedString(@"%d incoming", "Inspector -> Peers tab -> peers"), incoming]]; if (cache > 0) [fromComponents addObject: [NSString stringWithFormat: NSLocalizedString(@"%d cache", "Inspector -> Peers tab -> peers"), cache]]; if (lpd > 0) [fromComponents addObject: [NSString stringWithFormat: NSLocalizedString(@"%d local discovery", "Inspector -> Peers tab -> peers"), lpd]]; if (pex > 0) [fromComponents addObject: [NSString stringWithFormat: NSLocalizedString(@"%d PEX", "Inspector -> Peers tab -> peers"), pex]]; if (dht > 0) [fromComponents addObject: [NSString stringWithFormat: NSLocalizedString(@"%d DHT", "Inspector -> Peers tab -> peers"), dht]]; if (ltep > 0) [fromComponents addObject: [NSString stringWithFormat: NSLocalizedString(@"%d LTEP", "Inspector -> Peers tab -> peers"), ltep]]; connectedText = [connectedText stringByAppendingFormat: @"\n%@", [fromComponents componentsJoinedByString: @", "]]; } [fConnectedPeersField setStringValue: connectedText]; } else { NSString * notActiveString; if ([fTorrents count] == 1) notActiveString = NSLocalizedString(@"Transfer Not Active", "Inspector -> Peers tab -> peers"); else notActiveString = NSLocalizedString(@"Transfers Not Active", "Inspector -> Peers tab -> peers"); [fConnectedPeersField setStringValue: notActiveString]; } } - (void) saveViewSize { [[NSUserDefaults standardUserDefaults] setFloat: NSHeight([[self view] frame]) forKey: @"InspectorContentHeightPeers"]; } - (void) clearView { [fPeers release]; fPeers = nil; [fWebSeeds release]; fWebSeeds = nil; } - (NSInteger) numberOfRowsInTableView: (NSTableView *) tableView { if (tableView == fWebSeedTable) return fWebSeeds ? [fWebSeeds count] : 0; else return fPeers ? [fPeers count] : 0; } - (id) tableView: (NSTableView *) tableView objectValueForTableColumn: (NSTableColumn *) column row: (NSInteger) row { if (tableView == fWebSeedTable) { NSString * ident = [column identifier]; NSDictionary * webSeed = [fWebSeeds objectAtIndex: row]; if ([ident isEqualToString: @"DL From"]) { NSNumber * rate; return (rate = [webSeed objectForKey: @"DL From Rate"]) ? [NSString stringForSpeedAbbrev: [rate doubleValue]] : @""; } else return [webSeed objectForKey: @"Address"]; } else { NSString * ident = [column identifier]; NSDictionary * peer = [fPeers objectAtIndex: row]; if ([ident isEqualToString: @"Encryption"]) return [[peer objectForKey: @"Encryption"] boolValue] ? [NSImage imageNamed: @"Lock"] : nil; else if ([ident isEqualToString: @"Client"]) return [peer objectForKey: @"Client"]; else if ([ident isEqualToString: @"Progress"]) return [peer objectForKey: @"Progress"]; else if ([ident isEqualToString: @"UL To"]) { NSNumber * rate; return (rate = [peer objectForKey: @"UL To Rate"]) ? [NSString stringForSpeedAbbrev: [rate doubleValue]] : @""; } else if ([ident isEqualToString: @"DL From"]) { NSNumber * rate; return (rate = [peer objectForKey: @"DL From Rate"]) ? [NSString stringForSpeedAbbrev: [rate doubleValue]] : @""; } else return [peer objectForKey: @"IP"]; } } - (void) tableView: (NSTableView *) tableView willDisplayCell: (id) cell forTableColumn: (NSTableColumn *) tableColumn row: (NSInteger) row { if (tableView == fPeerTable) { NSString * ident = [tableColumn identifier]; if ([ident isEqualToString: @"Progress"]) { NSDictionary * peer = [fPeers objectAtIndex: row]; [(PeerProgressIndicatorCell *)cell setSeed: [[peer objectForKey: @"Seed"] boolValue]]; } } } - (void) tableView: (NSTableView *) tableView didClickTableColumn: (NSTableColumn *) tableColumn { if (tableView == fWebSeedTable) { if (fWebSeeds) { [fWebSeeds sortUsingDescriptors: [fWebSeedTable sortDescriptors]]; [tableView reloadData]; } } else { if (fPeers) { [fPeers sortUsingDescriptors: [self peerSortDescriptors]]; [tableView reloadData]; } } } - (BOOL) tableView: (NSTableView *) tableView shouldSelectRow: (NSInteger) row { return tableView != fPeerTable; } - (NSString *) tableView: (NSTableView *) tableView toolTipForCell: (NSCell *) cell rect: (NSRectPointer) rect tableColumn: (NSTableColumn *) column row: (NSInteger) row mouseLocation: (NSPoint) mouseLocation { if (tableView == fPeerTable) { const BOOL multiple = [fTorrents count] > 1; NSDictionary * peer = [fPeers objectAtIndex: row]; NSMutableArray * components = [NSMutableArray arrayWithCapacity: multiple ? 6 : 5]; if (multiple) [components addObject: [peer objectForKey: @"Name"]]; const CGFloat progress = [[peer objectForKey: @"Progress"] floatValue]; NSString * progressString = [NSString stringWithFormat: NSLocalizedString(@"Progress: %@", "Inspector -> Peers tab -> table row tooltip"), [NSString percentString: progress longDecimals: NO]]; if (progress < 1.0 && [[peer objectForKey: @"Seed"] boolValue]) progressString = [progressString stringByAppendingFormat: @" (%@)", NSLocalizedString(@"Partial Seed", "Inspector -> Peers tab -> table row tooltip")]; [components addObject: progressString]; NSString * protocolString = [[peer objectForKey: @"uTP"] boolValue] ? @"\u00b5TP" : @"TCP"; if ([[peer objectForKey: @"Encryption"] boolValue]) protocolString = [protocolString stringByAppendingFormat: @" (%@)", NSLocalizedString(@"encrypted", "Inspector -> Peers tab -> table row tooltip")]; [components addObject: [NSString stringWithFormat: NSLocalizedString(@"Protocol: %@", "Inspector -> Peers tab -> table row tooltip"), protocolString]]; NSString * portString; NSInteger port; if ((port = [[peer objectForKey: @"Port"] intValue]) > 0) portString = [NSString stringWithFormat: @"%ld", port]; else portString = NSLocalizedString(@"N/A", "Inspector -> Peers tab -> table row tooltip"); [components addObject: [NSString stringWithFormat: @"%@: %@", NSLocalizedString(@"Port", "Inspector -> Peers tab -> table row tooltip"), portString]]; const NSInteger peerFrom = [[peer objectForKey: @"From"] integerValue]; switch (peerFrom) { case TR_PEER_FROM_TRACKER: [components addObject: NSLocalizedString(@"From: tracker", "Inspector -> Peers tab -> table row tooltip")]; break; case TR_PEER_FROM_INCOMING: [components addObject: NSLocalizedString(@"From: incoming connection", "Inspector -> Peers tab -> table row tooltip")]; break; case TR_PEER_FROM_RESUME: [components addObject: NSLocalizedString(@"From: cache", "Inspector -> Peers tab -> table row tooltip")]; break; case TR_PEER_FROM_LPD: [components addObject: NSLocalizedString(@"From: local peer discovery", "Inspector -> Peers tab -> table row tooltip")]; break; case TR_PEER_FROM_PEX: [components addObject: NSLocalizedString(@"From: peer exchange", "Inspector -> Peers tab -> table row tooltip")]; break; case TR_PEER_FROM_DHT: [components addObject: NSLocalizedString(@"From: distributed hash table", "Inspector -> Peers tab -> table row tooltip")]; break; case TR_PEER_FROM_LTEP: [components addObject: NSLocalizedString(@"From: libtorrent extension protocol handshake", "Inspector -> Peers tab -> table row tooltip")]; break; default: NSAssert1(NO, @"Peer from unknown source: %ld", peerFrom); } //determing status strings from flags NSMutableArray * statusArray = [NSMutableArray arrayWithCapacity: 6]; NSString * flags = [peer objectForKey: @"Flags"]; if ([flags rangeOfString: @"D"].location != NSNotFound) [statusArray addObject: NSLocalizedString(@"Currently downloading (interested and not choked)", "Inspector -> peer -> status")]; if ([flags rangeOfString: @"d"].location != NSNotFound) [statusArray addObject: NSLocalizedString(@"You want to download, but peer does not want to send (interested and choked)", "Inspector -> peer -> status")]; if ([flags rangeOfString: @"U"].location != NSNotFound) [statusArray addObject: NSLocalizedString(@"Currently uploading (interested and not choked)", "Inspector -> peer -> status")]; if ([flags rangeOfString: @"u"].location != NSNotFound) [statusArray addObject: NSLocalizedString(@"Peer wants you to upload, but you do not want to (interested and choked)", "Inspector -> peer -> status")]; if ([flags rangeOfString: @"K"].location != NSNotFound) [statusArray addObject: NSLocalizedString(@"Peer is unchoking you, but you are not interested", "Inspector -> peer -> status")]; if ([flags rangeOfString: @"?"].location != NSNotFound) [statusArray addObject: NSLocalizedString(@"You unchoked the peer, but the peer is not interested", "Inspector -> peer -> status")]; if ([statusArray count] > 0) { NSString * statusStrings = [statusArray componentsJoinedByString: @"\n\n"]; [components addObject: [@"\n" stringByAppendingString: statusStrings]]; } return [components componentsJoinedByString: @"\n"]; } else { if ([fTorrents count] > 1) return [[fWebSeeds objectAtIndex: row] objectForKey: @"Name"]; } return nil; } - (void) animationDidStart: (CAAnimation *) animation { if (![[animation valueForKey: ANIMATION_ID_KEY] isEqualToString: WEB_SEED_ANIMATION_ID]) return; [[fWebSeedTable enclosingScrollView] setHidden: NO]; } - (void) animationDidStop: (CAAnimation *) animation finished: (BOOL) finished { if (![[animation valueForKey: ANIMATION_ID_KEY] isEqualToString: WEB_SEED_ANIMATION_ID]) return; [[fWebSeedTable enclosingScrollView] setHidden: finished && fWebSeedTableTopConstraint.constant < 0]; } @end @implementation InfoPeersViewController (Private) - (void) setupInfo { __block BOOL hasWebSeeds = NO; if ([fTorrents count] == 0) { [fPeers release]; fPeers = nil; [fPeerTable reloadData]; [fConnectedPeersField setStringValue: @""]; } else { [fTorrents enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(Torrent * torrent, NSUInteger idx, BOOL *stop) { if ([torrent webSeedCount] > 0) { hasWebSeeds = YES; *stop = YES; } }]; } if (!hasWebSeeds) { [fWebSeeds release]; fWebSeeds = nil; [fWebSeedTable reloadData]; } else [fWebSeedTable deselectAll: self]; [self setWebSeedTableHidden: !hasWebSeeds animate: YES]; fSet = YES; } - (void) setWebSeedTableHidden: (BOOL) hide animate: (BOOL) animate { if (animate && (![[self view] window] || ![[[self view] window] isVisible])) animate = NO; const CGFloat webSeedTableTopMargin = hide ? -NSHeight([[fWebSeedTable enclosingScrollView] frame]) : fViewTopMargin; [(animate ? [fWebSeedTableTopConstraint animator] : fWebSeedTableTopConstraint) setConstant: webSeedTableTopMargin]; } - (NSArray *) peerSortDescriptors { NSMutableArray * descriptors = [NSMutableArray arrayWithCapacity: 2]; NSArray * oldDescriptors = [fPeerTable sortDescriptors]; BOOL useSecond = YES, asc = YES; if ([oldDescriptors count] > 0) { NSSortDescriptor * descriptor = [oldDescriptors objectAtIndex: 0]; [descriptors addObject: descriptor]; if ((useSecond = ![[descriptor key] isEqualToString: @"IP"])) asc = [descriptor ascending]; } //sort by IP after primary sort if (useSecond) { NSSortDescriptor * secondDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"IP" ascending: asc selector: @selector(compareNumeric:)]; [descriptors addObject: secondDescriptor]; } return descriptors; } @end transmission-2.92/macosx/PaxHeaders.4960/WebSeedTableView.h0000644000000000000000000000013212442116666020452 xustar0030 mtime=1418239414.200101177 30 atime=1418239414.200101177 30 ctime=1457295923.648869953 transmission-2.92/macosx/WebSeedTableView.h0000644000175000017500000000303112442116666022074 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: WebSeedTableView.h 14226 2014-01-19 01:29:38Z jordan $ * * Copyright (c) 2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface WebSeedTableView : NSTableView { //weak references NSArray * fWebSeeds; } - (void) setWebSeeds: (NSArray *) webSeeds; - (void) copy: (id) sender; @end transmission-2.92/macosx/PaxHeaders.4960/InfoTrackersViewController.h0000644000000000000000000000013012442116646022616 xustar0029 mtime=1418239398.19082683 29 atime=1418239398.19082683 30 ctime=1457295923.308864171 transmission-2.92/macosx/InfoTrackersViewController.h0000644000175000017500000000367012442116646024253 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoTrackersViewController.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2010-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import "InfoViewController.h" @class Torrent; @class TrackerTableView; @class TrackerCell; @interface InfoTrackersViewController : NSViewController { NSArray * fTorrents; BOOL fSet; NSMutableArray * fTrackers; IBOutlet TrackerTableView * fTrackerTable; TrackerCell * fTrackerCell; IBOutlet NSSegmentedControl * fTrackerAddRemoveControl; } - (void) setInfoForTorrents: (NSArray *) torrents; - (void) updateInfo; - (void) saveViewSize; - (void) clearView; - (void) addRemoveTracker: (id) sender; @end transmission-2.92/macosx/PaxHeaders.4960/InfoWindow.xib0000644000000000000000000000013212664476420017752 xustar0030 mtime=1456635152.152499203 30 atime=1456635152.152499203 30 ctime=1457295922.450849581 transmission-2.92/macosx/InfoWindow.xib0000644000175000017500000003270612664476420021407 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/BadgeView.m0000644000000000000000000000013212442116625017166 xustar0030 mtime=1418239381.874547218 30 atime=1418239381.874547218 30 ctime=1457295922.933857794 transmission-2.92/macosx/BadgeView.m0000644000175000017500000001164312442116625020620 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: BadgeView.m 13340 2012-06-10 02:35:58Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "BadgeView.h" #import "NSStringAdditions.h" #define BETWEEN_PADDING 2.0 @interface BadgeView (Private) - (void) badge: (NSImage *) badge string: (NSString *) string atHeight: (CGFloat) height adjustForQuit: (BOOL) quit; @end @implementation BadgeView - (id) initWithLib: (tr_session *) lib { if ((self = [super init])) { fLib = lib; fDownloadRate = 0.0; fUploadRate = 0.0; fQuitting = NO; } return self; } - (void) dealloc { [fAttributes release]; [super dealloc]; } - (BOOL) setRatesWithDownload: (CGFloat) downloadRate upload: (CGFloat) uploadRate { //only needs update if the badges were displayed or are displayed now if (fDownloadRate == downloadRate && fUploadRate == uploadRate) return NO; fDownloadRate = downloadRate; fUploadRate = uploadRate; return YES; } - (void) setQuitting { fQuitting = YES; } - (void) drawRect: (NSRect) rect { [[NSApp applicationIconImage] drawInRect: rect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0]; if (fQuitting) { NSImage * quitBadge = [NSImage imageNamed: @"QuitBadge"]; [self badge: quitBadge string: NSLocalizedString(@"Quitting", "Dock Badger -> quit") atHeight: (NSHeight(rect) - [quitBadge size].height) * 0.5 adjustForQuit: YES]; return; } const BOOL upload = fUploadRate >= 0.1, download = fDownloadRate >= 0.1; CGFloat bottom = 0.0; if (upload) { NSImage * uploadBadge = [NSImage imageNamed: @"UploadBadge"]; [self badge: uploadBadge string: [NSString stringForSpeedAbbrev: fUploadRate] atHeight: bottom adjustForQuit: NO]; if (download) bottom += [uploadBadge size].height + BETWEEN_PADDING; //download rate above upload rate } if (download) [self badge: [NSImage imageNamed: @"DownloadBadge"] string: [NSString stringForSpeedAbbrev: fDownloadRate] atHeight: bottom adjustForQuit: NO]; } @end @implementation BadgeView (Private) - (void) badge: (NSImage *) badge string: (NSString *) string atHeight: (CGFloat) height adjustForQuit: (BOOL) quit { if (!fAttributes) { NSShadow * stringShadow = [[NSShadow alloc] init]; [stringShadow setShadowOffset: NSMakeSize(2.0, -2.0)]; [stringShadow setShadowBlurRadius: 4.0]; fAttributes = [[NSMutableDictionary alloc] initWithCapacity: 3]; [fAttributes setObject: [NSColor whiteColor] forKey: NSForegroundColorAttributeName]; [fAttributes setObject: stringShadow forKey: NSShadowAttributeName]; [stringShadow release]; } NSRect badgeRect; badgeRect.size = [badge size]; badgeRect.origin.x = 0.0; badgeRect.origin.y = height; [badge drawInRect: badgeRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0]; //make sure text fits on the badge CGFloat fontSize = 26.0; NSSize stringSize; do { [fAttributes setObject: [NSFont boldSystemFontOfSize: fontSize] forKey: NSFontAttributeName]; stringSize = [string sizeWithAttributes: fAttributes]; fontSize -= 1.0; } while (NSWidth(badgeRect) < stringSize.width); //string is in center of image NSRect stringRect; stringRect.origin.x = NSMidX(badgeRect) - stringSize.width * 0.5; stringRect.origin.y = NSMidY(badgeRect) - stringSize.height * 0.5 + (quit ? 2.0 : 1.0); //adjust for shadow, extra for quit stringRect.size = stringSize; [string drawInRect: stringRect withAttributes: fAttributes]; } @end transmission-2.92/macosx/PaxHeaders.4960/FilePriorityCell.h0000644000000000000000000000013212442116641020543 xustar0030 mtime=1418239393.768751049 30 atime=1418239393.768751049 30 ctime=1457295923.127861093 transmission-2.92/macosx/FilePriorityCell.h0000644000175000017500000000326412442116641022175 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: FilePriorityCell.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import "FileOutlineView.h" @interface FilePriorityCell : NSSegmentedCell { BOOL fHoverRow; } - (void) addTrackingAreasForView: (NSView *) controlView inRect: (NSRect) cellFrame withUserInfo: (NSDictionary *) userInfo mouseLocation: (NSPoint) mouseLocation; - (void) setHovered: (BOOL) hovered; @end transmission-2.92/macosx/PaxHeaders.4960/BlocklistDownloader.h0000644000000000000000000000013212442116666021276 xustar0030 mtime=1418239414.199101159 30 atime=1418239414.199101159 30 ctime=1457295922.939857896 transmission-2.92/macosx/BlocklistDownloader.h0000644000175000017500000000403512442116666022725 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: BlocklistDownloader.h 13251 2012-03-13 02:52:11Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @class BlocklistDownloaderViewController; typedef enum { BLOCKLIST_DL_START, BLOCKLIST_DL_DOWNLOADING, BLOCKLIST_DL_PROCESSING } blocklistDownloadState; @interface BlocklistDownloader : NSObject { NSURLDownload * fDownload; BlocklistDownloaderViewController * fViewController; NSString * fDestination; NSUInteger fCurrentSize; long long fExpectedSize; blocklistDownloadState fState; } + (BlocklistDownloader *) downloader; //starts download if not already occuring + (BOOL) isRunning; - (void) setViewController: (BlocklistDownloaderViewController *) viewController; - (void) cancelDownload; @end transmission-2.92/macosx/PaxHeaders.4960/InfoActivityViewController.m0000644000000000000000000000013212505250243022633 xustar0030 mtime=1427460259.976235195 30 atime=1427460259.976235195 30 ctime=1457295923.257863304 transmission-2.92/macosx/InfoActivityViewController.m0000644000175000017500000002560612505250243024271 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoActivityViewController.m 14341 2014-10-17 05:12:00Z livings124 $ * * Copyright (c) 2010-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "InfoActivityViewController.h" #import "NSApplicationAdditions.h" #import "NSStringAdditions.h" #import "PiecesView.h" #import "Torrent.h" #include "transmission.h" // required by utils.h #include "utils.h" //tr_getRatio() #define PIECES_CONTROL_PROGRESS 0 #define PIECES_CONTROL_AVAILABLE 1 @interface InfoActivityViewController (Private) - (void) setupInfo; @end @implementation InfoActivityViewController - (id) init { if ((self = [super initWithNibName: @"InfoActivityView" bundle: nil])) { [self setTitle: NSLocalizedString(@"Activity", "Inspector view -> title")]; } return self; } - (void) awakeFromNib { [fTransferSectionLabel sizeToFit]; [fDatesSectionLabel sizeToFit]; [fTimeSectionLabel sizeToFit]; NSArray * labels = @[ fStateLabel, fProgressLabel, fHaveLabel, fDownloadedLabel, fUploadedLabel, fFailedDLLabel, fRatioLabel, fErrorLabel, fDateAddedLabel, fDateCompletedLabel, fDateActivityLabel, fDownloadTimeLabel, fSeedTimeLabel ]; CGFloat oldMaxWidth = 0.0, originX, newMaxWidth = 0.0; for (NSTextField * label in labels) { const NSRect oldFrame = [label frame]; if (oldFrame.size.width > oldMaxWidth) { oldMaxWidth = oldFrame.size.width; originX = oldFrame.origin.x; } [label sizeToFit]; const CGFloat newWidth = [label bounds].size.width; if (newWidth > newMaxWidth) newMaxWidth = newWidth; } for (NSTextField * label in labels) { NSRect frame = [label frame]; frame.origin.x = originX + (newMaxWidth - frame.size.width); [label setFrame: frame]; } NSArray * fields = @[ fDateAddedField, fDateCompletedField, fDateActivityField, fStateField, fProgressField, fHaveField, fDownloadedTotalField, fUploadedTotalField, fFailedHashField, fRatioField, fDownloadTimeField, fSeedTimeField, fErrorScrollView ]; const CGFloat widthIncrease = newMaxWidth - oldMaxWidth; for (NSView * field in fields) { NSRect frame = [field frame]; frame.origin.x += widthIncrease; frame.size.width -= widthIncrease; [field setFrame: frame]; } //set the click action of the pieces view #warning after 2.8 just hook this up in the xib [fPiecesView setAction:@selector(updatePiecesView:)]; [fPiecesView setTarget:self]; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; [fTorrents release]; [super dealloc]; } - (void) setInfoForTorrents: (NSArray *) torrents { //don't check if it's the same in case the metadata changed [fTorrents release]; fTorrents = [torrents retain]; fSet = NO; } - (void) updateInfo { if (!fSet) [self setupInfo]; const NSInteger numberSelected = [fTorrents count]; if (numberSelected == 0) return; uint64_t have = 0, haveVerified = 0, downloadedTotal = 0, uploadedTotal = 0, failedHash = 0; NSDate * lastActivity = nil; for (Torrent * torrent in fTorrents) { have += [torrent haveTotal]; haveVerified += [torrent haveVerified]; downloadedTotal += [torrent downloadedTotal]; uploadedTotal += [torrent uploadedTotal]; failedHash += [torrent failedHash]; NSDate * nextLastActivity; if ((nextLastActivity = [torrent dateActivity])) lastActivity = lastActivity ? [lastActivity laterDate: nextLastActivity] : nextLastActivity; } if (have == 0) [fHaveField setStringValue: [NSString stringForFileSize: 0]]; else { NSString * verifiedString = [NSString stringWithFormat: NSLocalizedString(@"%@ verified", "Inspector -> Activity tab -> have"), [NSString stringForFileSize: haveVerified]]; if (have == haveVerified) [fHaveField setStringValue: verifiedString]; else [fHaveField setStringValue: [NSString stringWithFormat: @"%@ (%@)", [NSString stringForFileSize: have], verifiedString]]; } [fDownloadedTotalField setStringValue: [NSString stringForFileSize: downloadedTotal]]; [fUploadedTotalField setStringValue: [NSString stringForFileSize: uploadedTotal]]; [fFailedHashField setStringValue: [NSString stringForFileSize: failedHash]]; [fDateActivityField setObjectValue: lastActivity]; if (numberSelected == 1) { Torrent * torrent = [fTorrents objectAtIndex: 0]; [fStateField setStringValue: [torrent stateString]]; NSString * progressString = [NSString percentString: [torrent progress] longDecimals: YES]; if ([torrent isFolder]) { NSString * progressSelectedString = [NSString stringWithFormat: NSLocalizedString(@"%@ selected", "Inspector -> Activity tab -> progress"), [NSString percentString: [torrent progressDone] longDecimals: YES]]; progressString = [progressString stringByAppendingFormat: @" (%@)", progressSelectedString]; } [fProgressField setStringValue: progressString]; [fRatioField setStringValue: [NSString stringForRatio: [torrent ratio]]]; NSString * errorMessage = [torrent errorMessage]; if (![errorMessage isEqualToString: [fErrorMessageView string]]) [fErrorMessageView setString: errorMessage]; [fDateCompletedField setObjectValue: [torrent dateCompleted]]; //uses a relative date, so can't be set once [fDateAddedField setObjectValue: [torrent dateAdded]]; if ([NSApp isOnYosemiteOrBetter]) { static NSDateComponentsFormatter *timeFormatter; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ timeFormatter = [NSDateComponentsFormatter new]; timeFormatter.unitsStyle = NSDateComponentsFormatterUnitsStyleShort; timeFormatter.allowedUnits = NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; timeFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDropLeading; }); [fDownloadTimeField setStringValue: [timeFormatter stringFromTimeInterval:[torrent secondsDownloading]]]; [fSeedTimeField setStringValue: [timeFormatter stringFromTimeInterval:[torrent secondsSeeding]]]; } else { [fDownloadTimeField setStringValue: [NSString timeString: [torrent secondsDownloading] includesTimeRemainingPhrase:NO showSeconds: YES]]; [fSeedTimeField setStringValue: [NSString timeString: [torrent secondsSeeding] includesTimeRemainingPhrase:NO showSeconds: YES]]; } [fPiecesView updateView]; } else if (numberSelected > 1) { [fRatioField setStringValue: [NSString stringForRatio: tr_getRatio(uploadedTotal, downloadedTotal)]]; } else; } - (void) setPiecesView: (id) sender { const BOOL availability = [sender selectedSegment] == PIECES_CONTROL_AVAILABLE; [[NSUserDefaults standardUserDefaults] setBool: availability forKey: @"PiecesViewShowAvailability"]; [self updatePiecesView:nil]; } - (void) updatePiecesView: (id) sender { const BOOL piecesAvailableSegment = [[NSUserDefaults standardUserDefaults] boolForKey: @"PiecesViewShowAvailability"]; [fPiecesControl setSelected: piecesAvailableSegment forSegment: PIECES_CONTROL_AVAILABLE]; [fPiecesControl setSelected: !piecesAvailableSegment forSegment: PIECES_CONTROL_PROGRESS]; [fPiecesView updateView]; } - (void) clearView { [fPiecesView clearView]; } @end @implementation InfoActivityViewController (Private) - (void) setupInfo { const NSUInteger count = [fTorrents count]; if (count != 1) { if (count == 0) { [fHaveField setStringValue: @""]; [fDownloadedTotalField setStringValue: @""]; [fUploadedTotalField setStringValue: @""]; [fFailedHashField setStringValue: @""]; [fDateActivityField setObjectValue: @""]; //using [field setStringValue: @""] causes "December 31, 1969 7:00 PM" to be displayed, at least on 10.7.3 [fRatioField setStringValue: @""]; } [fStateField setStringValue: @""]; [fProgressField setStringValue: @""]; [fErrorMessageView setString: @""]; //using [field setStringValue: @""] causes "December 31, 1969 7:00 PM" to be displayed, at least on 10.7.3 [fDateAddedField setObjectValue: @""]; [fDateCompletedField setObjectValue: @""]; [fDownloadTimeField setStringValue: @""]; [fSeedTimeField setStringValue: @""]; [fPiecesControl setSelected: NO forSegment: PIECES_CONTROL_AVAILABLE]; [fPiecesControl setSelected: NO forSegment: PIECES_CONTROL_PROGRESS]; [fPiecesControl setEnabled: NO]; [fPiecesView setTorrent: nil]; } else { Torrent * torrent = [fTorrents objectAtIndex: 0]; const BOOL piecesAvailableSegment = [[NSUserDefaults standardUserDefaults] boolForKey: @"PiecesViewShowAvailability"]; [fPiecesControl setSelected: piecesAvailableSegment forSegment: PIECES_CONTROL_AVAILABLE]; [fPiecesControl setSelected: !piecesAvailableSegment forSegment: PIECES_CONTROL_PROGRESS]; [fPiecesControl setEnabled: YES]; [fPiecesView setTorrent: torrent]; } fSet = YES; } @end transmission-2.92/macosx/PaxHeaders.4960/InfoFileView.xib0000644000000000000000000000013212664476420020215 xustar0030 mtime=1456635152.265501144 30 atime=1456635152.265501144 30 ctime=1457295922.432849275 transmission-2.92/macosx/InfoFileView.xib0000644000175000017500000003320012664476420021640 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/PortChecker.h0000644000000000000000000000013212442116666017542 xustar0030 mtime=1418239414.208101314 30 atime=1418239414.208101314 30 ctime=1457295923.433866297 transmission-2.92/macosx/PortChecker.h0000644000175000017500000000350012442116666021165 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: PortChecker.h 13251 2012-03-13 02:52:11Z livings124 $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import typedef enum { PORT_STATUS_CHECKING, PORT_STATUS_OPEN, PORT_STATUS_CLOSED, PORT_STATUS_ERROR } port_status_t; @interface PortChecker : NSObject { id fDelegate; port_status_t fStatus; NSURLConnection * fConnection; NSMutableData * fPortProbeData; NSTimer * fTimer; } - (id) initForPort: (NSInteger) portNumber delay: (BOOL) delay withDelegate: (id) delegate; - (void) cancelProbe; - (port_status_t) status; @end transmission-2.92/macosx/PaxHeaders.4960/GlobalOptionsPopoverViewController.m0000644000000000000000000000013212640354045024357 xustar0030 mtime=1451350053.372166402 30 atime=1451350053.372166402 30 ctime=1457295923.176861927 transmission-2.92/macosx/GlobalOptionsPopoverViewController.m0000644000175000017500000001412512640354045026007 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: GlobalOptionsPopoverViewController.m 14635 2015-12-27 01:48:27Z mikedld $ * * Copyright (c) 2011-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "GlobalOptionsPopoverViewController.h" @implementation GlobalOptionsPopoverViewController - (id) initWithHandle: (tr_session *) handle { if ((self = [super initWithNibName: @"GlobalOptionsPopover" bundle: nil])) { fHandle = handle; fDefaults = [NSUserDefaults standardUserDefaults]; } return self; } - (void) awakeFromNib { [fUploadLimitField setIntValue: [fDefaults integerForKey: @"UploadLimit"]]; [fDownloadLimitField setIntValue: [fDefaults integerForKey: @"DownloadLimit"]]; [fRatioStopField setFloatValue: [fDefaults floatForKey: @"RatioLimit"]]; [fIdleStopField setIntegerValue: [fDefaults integerForKey: @"IdleLimitMinutes"]]; [[self view] setFrameSize: [[self view] fittingSize]]; } - (IBAction) updatedDisplayString: (id) sender { [[NSNotificationCenter defaultCenter] postNotificationName: @"RefreshTorrentTable" object: nil]; } - (IBAction) setDownSpeedSetting: (id) sender { tr_sessionLimitSpeed(fHandle, TR_DOWN, [fDefaults boolForKey: @"CheckDownload"]); [[NSNotificationCenter defaultCenter] postNotificationName: @"SpeedLimitUpdate" object: nil]; } - (IBAction) setDownSpeedLimit: (id) sender { const NSInteger limit = [sender integerValue]; [fDefaults setInteger: limit forKey: @"DownloadLimit"]; tr_sessionSetSpeedLimit_KBps(fHandle, TR_DOWN, limit); [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateSpeedLimitValuesOutsidePrefs" object: nil]; [[NSNotificationCenter defaultCenter] postNotificationName: @"SpeedLimitUpdate" object: nil]; } - (IBAction) setUpSpeedSetting: (id) sender { tr_sessionLimitSpeed(fHandle, TR_UP, [fDefaults boolForKey: @"CheckUpload"]); [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateSpeedLimitValuesOutsidePrefs" object: nil]; [[NSNotificationCenter defaultCenter] postNotificationName: @"SpeedLimitUpdate" object: nil]; } - (IBAction) setUpSpeedLimit: (id) sender { const NSInteger limit = [sender integerValue]; [fDefaults setInteger: limit forKey: @"UploadLimit"]; tr_sessionSetSpeedLimit_KBps(fHandle, TR_UP, limit); [[NSNotificationCenter defaultCenter] postNotificationName: @"SpeedLimitUpdate" object: nil]; } - (IBAction) setRatioStopSetting: (id) sender { tr_sessionSetRatioLimited(fHandle, [fDefaults boolForKey: @"RatioCheck"]); //reload main table for seeding progress [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil]; //reload global settings in inspector [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateGlobalOptions" object: nil]; } - (IBAction) setRatioStopLimit: (id) sender { const CGFloat value = [sender floatValue]; [fDefaults setFloat: value forKey: @"RatioLimit"]; tr_sessionSetRatioLimit(fHandle, value); [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateRatioStopValueOutsidePrefs" object: nil]; //reload main table for seeding progress [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil]; //reload global settings in inspector [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateGlobalOptions" object: nil]; } - (IBAction) setIdleStopSetting: (id) sender { tr_sessionSetIdleLimited(fHandle, [fDefaults boolForKey: @"IdleLimitCheck"]); //reload main table for remaining seeding time [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil]; //reload global settings in inspector [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateGlobalOptions" object: nil]; } - (IBAction) setIdleStopLimit: (id) sender { const NSInteger value = [sender integerValue]; [fDefaults setInteger: value forKey: @"IdleLimitMinutes"]; tr_sessionSetIdleLimit(fHandle, value); [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateIdleStopValueOutsidePrefs" object: nil]; //reload main table for remaining seeding time [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil]; //reload global settings in inspector [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateGlobalOptions" object: nil]; } - (BOOL) control: (NSControl *) control textShouldBeginEditing: (NSText *) fieldEditor { [fInitialString release]; fInitialString = [[control stringValue] retain]; return YES; } - (BOOL) control: (NSControl *) control didFailToFormatString: (NSString *) string errorDescription: (NSString *) error { NSBeep(); if (fInitialString) { [control setStringValue: fInitialString]; [fInitialString release]; fInitialString = nil; } return NO; } @end transmission-2.92/macosx/PaxHeaders.4960/AboutWindow.xib0000644000000000000000000000013212664476420020131 xustar0030 mtime=1456635152.265501144 30 atime=1456635152.265501144 30 ctime=1457295922.412848934 transmission-2.92/macosx/AboutWindow.xib0000644000175000017500000004207312664476420021564 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/BonjourController.h0000644000000000000000000000013212442116643021006 xustar0030 mtime=1418239395.810786043 30 atime=1418239395.810786043 30 ctime=1457295922.973858474 transmission-2.92/macosx/BonjourController.h0000644000175000017500000000313512442116643022435 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: BonjourController.h 13491 2012-09-10 02:01:07Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface BonjourController : NSObject { NSNetService * fService; } + (BonjourController *) defaultController; + (BOOL) defaultControllerExists; - (void) startWithPort: (int) port; - (void) stop; @end transmission-2.92/macosx/PaxHeaders.4960/FileRenameSheetController.xib0000644000000000000000000000013112640354045022722 xustar0030 mtime=1451350053.372166402 30 atime=1451350053.372166402 29 ctime=1457295922.42084907 transmission-2.92/macosx/FileRenameSheetController.xib0000644000175000017500000001345712640354045024362 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/TorrentCell.h0000644000000000000000000000013212442116641017557 xustar0030 mtime=1418239393.770751083 30 atime=1418239393.770751083 30 ctime=1457295923.558868423 transmission-2.92/macosx/TorrentCell.h0000644000175000017500000000417712442116641021215 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: TorrentCell.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ @interface TorrentCell : NSActionCell { NSUserDefaults * fDefaults; NSMutableDictionary * fTitleAttributes, * fStatusAttributes; BOOL fTracking, fMouseDownControlButton, fMouseDownRevealButton, fMouseDownActionButton, fHover, fHoverControl, fHoverReveal, fHoverAction; NSColor * fBarBorderColor, * fBluePieceColor, * fBarMinimalBorderColor; } - (NSRect) iconRectForBounds: (NSRect) bounds; - (void) addTrackingAreasForView: (NSView *) controlView inRect: (NSRect) cellFrame withUserInfo: (NSDictionary *) userInfo mouseLocation: (NSPoint) mouseLocation; - (void) setHover: (BOOL) hover; - (void) setControlHover: (BOOL) hover; - (void) setRevealHover: (BOOL) hover; - (void) setActionHover: (BOOL) hover; - (void) setActionPushed: (BOOL) pushed; @end transmission-2.92/macosx/PaxHeaders.4960/NSMutableArrayAdditions.h0000644000000000000000000000013212442116654022016 xustar0030 mtime=1418239404.001926414 30 atime=1418239404.001926414 30 ctime=1457295923.376865328 transmission-2.92/macosx/NSMutableArrayAdditions.h0000644000175000017500000000275312442116654023452 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: NSMutableArrayAdditions.h 14226 2014-01-19 01:29:38Z jordan $ * * Copyright (c) 2011-2012 Transmission authors and contributors * * 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. *****************************************************************************/ @interface NSMutableArray (NSMutableArrayAdditions) - (void) moveObjectAtIndex: (NSUInteger) fromIndex toIndex: (NSUInteger) toIndex; @end transmission-2.92/macosx/PaxHeaders.4960/tr.lproj0000644000000000000000000000013212666747213016663 xustar0030 mtime=1457245835.363999472 30 atime=1418239393.871752814 30 ctime=1457295922.876856825 transmission-2.92/macosx/tr.lproj/0000755000175000017500000000000012666747213020365 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/tr.lproj/PaxHeaders.4960/InfoPlist.strings0000644000000000000000000000013212664476420022257 xustar0030 mtime=1456635152.117498602 30 atime=1456635152.117498602 30 ctime=1457295922.876856825 transmission-2.92/macosx/tr.lproj/InfoPlist.strings0000644000175000017500000000021312664476420023700 0ustar00mikedldmikedld00000000000000/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = "© 2005-2016 The Transmission Project, tüm hakları saklıdır"; transmission-2.92/macosx/tr.lproj/PaxHeaders.4960/Creator.xib0000644000000000000000000000013212640354045021030 xustar0030 mtime=1451350053.039160618 30 atime=1451350053.039160618 30 ctime=1457295922.876856825 transmission-2.92/macosx/tr.lproj/Creator.xib0000644000175000017500000006023012640354045022456 0ustar00mikedldmikedld00000000000000 File File transmission-2.92/macosx/tr.lproj/PaxHeaders.4960/PrefsWindow.xib0000644000000000000000000000013212640354045021700 xustar0030 mtime=1451350053.037160583 30 atime=1451350053.036160566 30 ctime=1457295922.876856825 transmission-2.92/macosx/tr.lproj/PrefsWindow.xib0000644000175000017500000057042012640354045023335 0ustar00mikedldmikedld00000000000000 ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer NSAllRomanInputSourcesLocaleIdentifier NSAllRomanInputSourcesLocaleIdentifier YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7MTgsIDE4fdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPESRuTU0AKgAAFEgAAAAAAAAA AAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABwAAAAwAAAArAAAALwAAACoAAAAnAAAA FQAAABAAAAAHAAAABQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADAAABCQAAAQoAAAAJAAAACAAAAAYAAAAGAAAA DQEBARUODAk8EA4KQxMPDEATDws9DgsHKw0JBiYKBgMcCQUDGQcDARMGAwERAgAADQIAAAwAAAAIAAAA BwAAAAYAAAAFAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAsAAAETAwQI QAMECEcAAAFBAAAAPQAAACsAAAApAAAAMg0LCUVfUESncF5OuYpwVMSJblDCZ04xr19FKalNLRqZRiYW kzEZC30qFAl1FwUCWxIDAVMDAAA8AQAANwAAACoAAAAmAAAAGgAAABUAAAAJAAAABgAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAgAAAA4BAgIaDQ4UWg8QFmQRExNgERISXA8PEEgODg9FCAkKTBYVFF5tXVDAgW1c 0qaLaN6nimXdhWpFy31hPcZrSC24ZEEosk8yHpxHLRuUMxsSei0YEHIbEw5bGBENVRUPCUgUDghDEAsG NA8KBS8LBgIdCQUCFwEAAAUAAAACAAAAAAAAAAAAAAAAAAAABAAAAB4JCww4RE1WwVRdZ9l8gIXkf4GG 5Gpqc9NhYmvPQkZMxkVITMlwbmfqhoBy8d/Jm/ns1KD758+W+ObNk/fhxY/24MKN9dq3gvHWsn/wyaJ0 7cOcb+uyh2DkrIBa4ZNrSdWMZEPQelAsvnBJJrVNLRaSPyQRfQgFAiAAAAAPAAAAAgAAAAAAAAAAAAAA BAAAACMLDQ5AUVtk0mVvee2ZnaL6nqCl+oiJku1/gYnpX2Rr3l9kad99fHjykIuB9ufUpP7136n/99+h //ffn//12p7/9dic//HOkv/vyo//5LqD/9+0fv/QoG76yZho+LGBVu+qek/qlmU42oxcMdJhOxuwTy8V mQsGAy0AAAAYAAAABAAAAAEAAAAAAAAABQAAACoPEBFIbHN33ImQlPbf4eP+7O7v/+fp6v3l5+j92t3h +tbY3PrGx8j+yMbB/uPRq//p1ab/9d6a//bfmP/225b/9tmU//XUi//10oj/8Ml//+/GfP/rvHH/6bhu /+auaf3kqmX94KBX+taWUPidZDHvglEn2RgRC2EGBgZFAAAAFQAAAA0AAAAAAAAABgAAAC4QERJMdHp+ 35OZnfjr7O7++fn6//X4+P/z9vb/6uvu/+bn6v/U1tn/09PR/+LQrv/m0qf/9d+c//fgmf/225X/9tmT //LSiv/y0Ij/8syB//HJfv/wwXX/775y/+61av/usmf/7Kdb/+KdVP+pazf4jVgu5h8ZFHsMDQ5eAQEC HwAAABQAAAAAAAAACQAABT8TFBleiIyT56ersv3v8fH/+Pn5/+Xm5v/f4OD/z83Q/8/O0f/k5ej/5eXm /9TQwP/X0Lj/9ear//nopv/33pj/9NiU/+LBi//hv4v/6sqV/+vLk//pwYL/6b58/+yyZP/srF7/6JtP /+CRS/+wa0H+mWBB+kJER+EtOD/IBgcJTAAAADcAAAAAAAAACQEBB0YVFRxljpOY6K2yt/7w8fL/+Pn5 /+Pj4//c29z/yMTE/8jFxf/i4uX/5OTl/9PRxv/W0b7/9Oaw//joqv/435n/9NmV/9+9jP/eu47/582h /+jOof/mwYv/5r6D/+uzZf/srV3/6JpN/+CRSv+3dE7+oWtP/ExPVPE3QkvZBwkKUQAAADsAAAAAAQEC DAoKEVggICh3naGn7Lu/xP/08/X/+vn6/+Tl5//a2tn/taya/7Kplv/Hw7//zcrJ/9vb2P/f3tb/6t+1 /+7grf/25aD/9OCc/9y9k//ZvZz/5N/b/+Tg3//axrn/28Cp/+25bf/vtWD/7KdS/+mmWP/Vq4v/wqKO /WRma+tKUVnRCgsMQgAAACoAAAAAAQECDQ4OFV4kJS19oqWr7cDDyP/09Pb/+vn6/+Pk5//Z2dn/tauU /7Knj//EvrX/y8bA/93e3f/h4dz/5964/+rer//35qL/9eKe/96+kv/bvpz/4+Hi/+Li5v/XxLv/2b+q /+y5bv/vtWH/7apS/+mpWv/ZtZf/xqya/GNmbOZJUFjLCgsMPAAAACQAAAAAAwMDEBoaHHEyMzWQsrW4 8M7R1P/09fX/9/j4/+Hj6f/a2tz/xLya/8K4kf/Ovp7/08Wq/+fo6P/p6uz/4NjB/+LYt//25qb/9+Sf /+jGif/lxJD/49jP/+DV0f/PtJ7/0bCP/+u6af/vuWD/7KRS/+ekXP/TuqP/va6j+UpSWc4xO0OwBwgJ JwAAAA8AAAAABAQEEB0eH3c2NzmWt7q98NLV2P/09fb/9vf4/93g5f/W2Nj/yL+e/8e7lP/OvpX/08Sg /+Xk5P/m5+n/29TA/93Ut//15af/9+Og/+vLh//nyIz/4NDD/9zNxP/KrZT/zaqH/+y8af/wu2L/66RT /+akXf/Ru6j/uq6m90NLUccqNDupBgcIIAAAAAoAAAAABQYGEyktLoVESEqkxMfK893g4//09ff/8vLz /87Ny//JxcD/zMCp/8y+oP/Ms33/zLSB/8zEt//Lxb7/xL21/8nBsf/v3KP/9d+d//XXiv/uz4f/xKmK /72iiP+4mXn/v550/+zDaf/xxGX/56ZZ/+GkZP/GuKz/rain9DA5Pq0YIieOAwQFFQAAAAEAAAAABgYH EywxMotHTE6qyMrO8+Di5v/x9PX/7vHw/8rGxP/Fv7r/y7+q/8y9of/Ksnz/yrJ9/8i+rP/Hv7P/wbiw /8a8rf/q16H/8Nuc//fZiv/w0Yb/wKN9/7iae/+4l3T/v51x/+vDaf/xxWb/5adc/96lZ//Dtq3/qaWm 8yozN6QTHCCFAgMEEwAAAAAAAAADBwgJGDg9P5pUWVy5z9LV9eXn6f/o6uz/4uTk/7y4s/+3sqv/wbeo /8S3ov/HtIX/yLSC/824lP/MuJj/xbKe/8eznv/WwJX/3caT//Tdi//x2IX/y6Vs/8Scaf/BnnP/x6Nz /+y/Zv/vwWX/4ats/9iodv+0r6v/mZqf7hgbIYgDBgtpAAABDgAAAAAAAAAFCAkJGzxCRJ9YX2G+0tXX 9ufp6//n6er/4uLi/767tv+5ta7/w7mu/8S5qf/GtYz/x7SJ/8i1j//HtJL/wa6b/8Kvm//NuZP/1cCR //PcjP/y2Yb/0Khp/8mgZv/HoXH/zKVx/+y+ZP/vv2T/4a1x/9eqev+tqaj/kpSb7RQXHH4AAgdfAAAB DQAAAAAAAAAPCgsLJktSUa5ob27M29zd+O7u7//r7e3/6Orq/9fZ2v/U1tf/1dLT/9PPzv/CvbD/vben /6+oj/+qpI3/oaCa/6Ggm/+tpJT/uKyS/+3Tjf/01of/5bxr/+K2Zv/dq2X/36tk/+24XP/tuWH/4rSD /9Wuiv+Uk5X9eX2E5hERE14AAAE/AAAACAAAAAAAAAATCwwMKk9YVrNtdnTQ3d7e+e/v7//u7+//6+3t /9/h4//d3+H/3Nze/9nY2f/Jxb3/w76z/6umlP+nopH/oaGe/6Ghn/+to5j/t6mV/+nQjf/x04j/6sJt /+i9aP/jsGX/469j/+62Wv/tt2D/4bWJ/9Svj/+MjZD7cXd+4xAQEVUAAAA2AAAABwAAAAAAAAAeDQ4O Nl9nZ8F9hYXd4+Xn+/T19//08/P/9PT0//b3+P/39/n/9/j5//b29//t7vH/4+Tm/7CvsP+rqav/wbu9 /8S7vv/Fqqz/yaul/93Akf/jxor/89F4//TRdP/wxWr/78Fm/+2zWP/rsl//3LiW/8ywnP13gIXtXGlx 0g0OED4AAAAhAAAABAAAAAAAAAAjDg8POmVsbcaDiovh5ebo+/X19//08/P/9fT0//j6+//5+/z//Pv8 //v6/P/09vj/6+zv/7q3vP+1sLX/x73A/8q8v//Iqq7/yquo/9u+lf/gxI//89R8//bUd//yyGz/8cNn /+2yWP/qsV//2rmc/8mxofxweX3oVWJpzAwNDzcAAAAbAAAAAwAAAAAAAAA5EBIST3R/f9SSnZ3s5+vq /fT29f/r7u3/6+7t//Hw8P/y8vH/9vf3//f4+P/5+/r/+Pf4/+rj4//k2dj/zLCv/8epp//Eo6T/xael /8/Drv/Vyar/8dWF//XUff/zyW3/8sRo/+2vW//pr2X/1r+s/8G0q/lWX2LSPEdLtQgKCigAAAAPAAAA AgAAAAACAQJDExMVWHuFhdmZpKPw6evs/fX29v/r7+3/6+3t//Dv7//x8PD/9fb2//b49//6+/v/+vn5 //Hq6v/q39//zK+t/8aopv/Hqav/ya6u/87Gtv/Uy7H/8NSJ//TTf//zyWz/8sRn/+yuXP/ormb/1MCw /76zrvhPV1nJNT9CqwcICSQAAAAMAAAAAQAAAAAODRJsISElfpSYmeiytrb68fHy//v6+//z8/P/8vLy //Hw8P/x8PD/8vLy//Pz8//8+/z/+/n6/+vq6v/k4OD/xbW1/8S1tf/j3d7/5eLi/9PV0P/U0sX/6c+W /+3Nif/xwmv/8L1l/+moXv/kqGr/zcC0/7Wxr/Q5P0WwICctkQQFBhUAAAABAAAAAAAAAAASERZ1JCQp hpOWl+ivsrP56Ojp/vHw8f7t7e3/7Ozs/+3t7f/u7u7/7+/w//Hx8v/6+vv/+fn5/+rq6v/j4uL/yr6+ /8q+v//o6en/6uzs/9fa2P/X1s3/5s6b/+rMjf/wwWz/77xm/+inYP/ip2z/yr61/7GurvMyOT+mGiEn hwMEBRMAAAAAAAAAAAAAAAAgICJ/LCwvjHh4f9qJiZDpqKmr8rCxsvXAwMD6xsbG+9jX2v/c3N//5ebo /+jp6//v8PD/8PDw/+rs7P/p6+v/7+3v//Du8P/09fX/9PX1/+vt7//o6OX/3Myw/9zGoP/tvW//7rho /+Snbv/dpnj/vLWx/6Kjpu8kKCyLDhIVbAICAg8AAAAAAAAAAAAAAAAeHyBxKCkqfGVlbL9zc3rMiouM 2JGSktujo6Tjqamq5by8vurBwcTryszO7s7Q0e/X19jx2NnZ8tfZ2/bY2tz35OXm+Ofn6Pnn6On85+jp /OPl6P7g4OD+08ew/9TCof/ruXL/7bVr/+Kmcf/apXr/trCv/5ueo+4gJCaCCw4QYwECAg4AAAAAAAAA AAAAAAAEBAQWBQUGGQ4ODiwQEBAyExMURBYWFkofIiNbIiUnYSstMnAuMDV1OTk8gz4+QIlNTVGdUlNY pGRmbbhqbHO+fH2D0oKCiNeSlJjllZic6Z6go/ShoqP3pqag/rCnmv/gqnj/5al0/9ageP/Lnn7/nJuf /4KIkOkTFRZjAQICRAAAAAkAAAAAAAAAAAAAAAAAAAAGAAAACAAAABEAAAAWAAAAJgEBASsJDA09Cw4Q QhESF1ETFBpWHh4fZCIiImowLzR+NjU6hUZJUJlMT1afX19ktGRkabp0dXrHeHl+zICDhdqDhofejY6L 6pmSie7WoXT83aJw/siTcPm8kHT4iouN83J5gNwQERJXAAAAOQAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAIAAAACAAAABQAAAAYBAQEHAQEBCAICAwsCAgMLBAQEDgQEBA8HBwcRCAgIEwkJCxsKCgwdDg4O Jg8PDykPDxAvEBARMxISE0EUFRZJHyUlbzMzLoWlfFbjr39W735PMdVtRi3LODk5pioxNI8FBwcuAAAA GgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAYAAAAHAAAADQAAAA8AAAAUAAAAFwAAACMBAgIrDBITUCAgHWiPa0jTmm9J 4Gk+JMFYNB61JicmiBohI3MDBAQiAAAAEgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAACAAAA AgAAAAUAAAAGAQICCwsIBR5GLhmHTDEakjQcDWwqFgpbCggGHAQFBRAAAAAEAAAAAgAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcEAg8zIA9tNyIPdiYUCVMfEAdEBAIA CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAEAAAMHBQIYBwUCGgYCARMFAgEQAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAKAAAACwAAAAkAAAAIAAAAAQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAEQEAAAMAAAABACQAAAEBAAMAAAABACQAAAECAAMAAAAEAAAVKgEDAAMA AAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAESAAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMA AAABACQAAAEXAAQAAAABAAAUQAEaAAUAAAABAAAVGgEbAAUAAAABAAAVIgEcAAMAAAABAAEAAAEoAAMA AAABAAIAAAFSAAMAAAABAAEAAAFTAAMAAAAEAAAVModzAAcAAA80AAAVOgAAAAAAAACQAAAAAQAAAJAA AAABAAgACAAIAAgAAQABAAEAAQAADzRhcHBsAhAAAG1udHJSR0IgWFlaIAffAAwABQANABIACGFjc3BB UFBMAAAAAEFQUEwAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWRlc2MAAAFQAAAAYmRzY20AAAG0AAAEGmNwcnQA AAXQAAAAI3d0cHQAAAX0AAAAFHJYWVoAAAYIAAAAFGdYWVoAAAYcAAAAFGJYWVoAAAYwAAAAFHJUUkMA AAZEAAAIDGFhcmcAAA5QAAAAIHZjZ3QAAA5wAAAAMG5kaW4AAA6gAAAAPmNoYWQAAA7gAAAALG1tb2QA AA8MAAAAKGJUUkMAAAZEAAAIDGdUUkMAAAZEAAAIDGFhYmcAAA5QAAAAIGFhZ2cAAA5QAAAAIGRlc2MA AAAAAAAACERpc3BsYXkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAACIAAAAMaHJIUgAAABQA AAGoa29LUgAAAAwAAAG8bmJOTwAAABIAAAHIaWQAAAAAABIAAAHaaHVIVQAAABQAAAHsY3NDWgAAABYA AAIAZGFESwAAABwAAAIWdWtVQQAAABwAAAIyYXIAAAAAABQAAAJOaXRJVAAAABQAAAJicm9STwAAABIA AAJ2bmxOTAAAABYAAAKIaGVJTAAAABYAAAKeZXNFUwAAABIAAAJ2ZmlGSQAAABAAAAK0emhUVwAAAAwA AALEdmlWTgAAAA4AAALQc2tTSwAAABYAAALeemhDTgAAAAwAAALEcnVSVQAAACQAAAL0ZnJGUgAAABYA AAMYbXMAAAAAABIAAAMuY2FFUwAAABgAAANAdGhUSAAAAAwAAANYZXNYTAAAABIAAAJ2ZGVERQAAABAA AANkZW5VUwAAABIAAAN0cHRCUgAAABgAAAOGcGxQTAAAABIAAAOeZWxHUgAAACIAAAOwc3ZTRQAAABAA AAPSdHJUUgAAABQAAAPiamFKUAAAAA4AAAP2cHRQVAAAABYAAAQEAEwAQwBEACAAdQAgAGIAbwBqAGnO 7LfsACAATABDAEQARgBhAHIAZwBlAC0ATABDAEQATABDAEQAIABXAGEAcgBuAGEAUwB6AO0AbgBlAHMA IABMAEMARABCAGEAcgBlAHYAbgD9ACAATABDAEQATABDAEQALQBmAGEAcgB2AGUAcwBrAOYAcgBtBBoE PgQ7BEwEPgRABD4EMgQ4BDkAIABMAEMARCAPAEwAQwBEACAGRQZEBkgGRgYpAEwAQwBEACAAYwBvAGwA bwByAGkATABDAEQAIABjAG8AbABvAHIASwBsAGUAdQByAGUAbgAtAEwAQwBEIA8ATABDAEQAIAXmBdEF 4gXVBeAF2QBWAOQAcgBpAC0ATABDAERfaYJyACAATABDAEQATABDAEQAIABNAOAAdQBGAGEAcgBlAGIA bgDpACAATABDAEQEJgQyBDUEQgQ9BD4EOQAgBBYEGgAtBDQEOARBBD8EOwQ1BDkATABDAEQAIABjAG8A dQBsAGUAdQByAFcAYQByAG4AYQAgAEwAQwBEAEwAQwBEACAAZQBuACAAYwBvAGwAbwByAEwAQwBEACAO Kg41AEYAYQByAGIALQBMAEMARABDAG8AbABvAHIAIABMAEMARABMAEMARAAgAEMAbwBsAG8AcgBpAGQA bwBLAG8AbABvAHIAIABMAEMARAOIA7MDxwPBA8kDvAO3ACADvwO4A8wDvQO3ACAATABDAEQARgDkAHIA ZwAtAEwAQwBEAFIAZQBuAGsAbABpACAATABDAEQwqzDpMPwAIABMAEMARABMAEMARAAgAGEAIABDAG8A cgBlAHMAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMTUAAFhZWiAAAAAAAADzFgABAAAA ARbKWFlaIAAAAAAAAHHAAAA5igAAAWdYWVogAAAAAAAAYSMAALnmAAAT9lhZWiAAAAAAAAAj8gAADJAA AL3QY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgA bQByAHcAfACBAIYAiwCQAJUAmgCfAKMAqACtALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEB BwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB 2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC 9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUE YwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYG JwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDII RghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4K xQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4N qQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ 9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsU rRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y 1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcd cB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9wo DSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEu Fi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0 njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7 qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdD OkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxL U0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT 9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZd J114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm 6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBx OnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8 IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuH n4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02T tpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qg aaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUSt uK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67 p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZ bNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6Lzp RunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5 x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//9wYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKDnZjZ3QA AAAAAAAAAQABAAAAAAAAAAEAAAABAAAAAAAAAAEAAAABAAAAAAAAAAEAAG5kaW4AAAAAAAAANgAAp0AA AFWAAABMwAAAnsAAACWAAAAMwAAAUAAAAFRAAAIzMwACMzMAAjMzAAAAAAAAAABzZjMyAAAAAAABDHIA AAX4///zHQAAB7oAAP1y///7nf///aQAAAPZAADAcW1tb2QAAAAAAAAGEAAAoA4AAAAAyc58GAAAAAAA AAAAAAAAAAAAAADSJSYnKFokY2xhc3NuYW1lWCRjbGFzc2VzXxAQTlNCaXRtYXBJbWFnZVJlcKMnKSpa TlNJbWFnZVJlcFhOU09iamVjdNIlJiwtV05TQXJyYXmiLCrSJSYvMF5OU011dGFibGVBcnJheaMvLCrT MjMKNDU2V05TV2hpdGVcTlNDb2xvclNwYWNlRDAgMAAQA4AM0iUmODlXTlNDb2xvcqI4KtIlJjs8V05T SW1hZ2WiOypfEA9OU0tleWVkQXJjaGl2ZXLRP0BUcm9vdIABAAgAEQAaACMALQAyADcARgBMAFcAXgBl AHIAeQCBAIMAhQCKAIwAjgCXAJwApwCpAKsArQCyALUAtwC5ALsAvQDCANkA2wDdJU8lVCVfJWgleyV/ JYolkyWYJaAloyWoJbcluyXCJcol1yXcJd4l4CXlJe0l8CX1Jf0mACYSJhUmGgAAAAAAAAIBAAAAAAAA AEEAAAAAAAAAAAAAAAAAACYcA transmission-2.92/macosx/tr.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212640354045022561 xustar0030 mtime=1451350053.037160583 30 atime=1451350053.037160583 30 ctime=1457295922.876856825 transmission-2.92/macosx/tr.lproj/Localizable.strings0000644000175000017500000011336512640354045024217 0ustar00mikedldmikedld00000000000000/* Inspector -> selected torrents stats -> bytes */ "%@ bytes" = "%@ bit"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "%@ files" = "%@ dosya"; /* Prefs -> blocklist -> message */ "%@ IP address rules in list" = "Dizelgede %@ IP adresi kuralları"; /* Inspector -> selected torrents */ "%@ magnetized transfers" = "%@ mıknatıslı aktarım"; /* file size string Inspector -> Files tab -> file status string Status bar transfer count */ "%@ of %@" = "%1$@ (Toplam %2$@)"; /* Torrent -> progress string */ "%@ of torrent metadata retrieved" = "%@ torrent üstbilgisi alındı"; /* Torrent -> eta string */ "%@ remaining" = "%@ kaldı"; /* Add torrent -> info Inspector -> Activity tab -> progress Torrent -> progress string */ "%@ selected" = "%@ seçili"; /* stats window -> times opened */ "%@ times" = "%@ kez"; /* Drag overlay -> torrents */ "%@ Torrent Files" = "%@ Torrent Dosyaları"; /* Inspector -> selected torrents */ "%@ Torrents Selected" = "%@ Torrent Seçili"; /* Inspector -> selected torrents stats total */ "%@ total" = "%@ toplam"; /* Filter Bar Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "%@ transfers" = "%@ aktarım"; /* Inspector -> Activity tab -> have */ "%@ verified" = "%@ doÄŸrulanmış"; /* Inspector -> Peers tab -> peers */ "%d cache" = "%d önbellek"; /* Inspector -> Peers tab -> peers */ "%d Connected" = "%d BaÄŸlandı"; /* Inspector -> Peers tab -> peers */ "%d DHT" = "%d DHT"; /* Dock item - Downloading */ "%d Downloading" = "%d İndiriliyor"; /* Inspector -> Peers tab -> peers */ "%d incoming" = "%d gelen"; /* Action menu -> upload/download limit Status Bar -> speed tooltip */ "%d KB/s" = "%d KB/s"; /* Inspector -> Peers tab -> peers */ "%d local discovery" = "%d yerel keÅŸif"; /* Inspector -> Peers tab -> peers */ "%d LTEP" = "%d LTEP"; /* Info options -> global setting */ "%d minutes" = "%d dakika"; /* Inspector -> Peers tab -> peers */ "%d PEX" = "%d PEX"; /* Create torrent -> info */ "%d pieces, %@ each" = "%1$d parça, her biri %2$@"; /* Dock item - Seeding */ "%d Seeding" = "%d Besleniyor"; /* Inspector -> Peers tab -> peers */ "%d tracker" = "%d izleyici"; /* Torrent -> status string */ "%d web seeds" = "%d web beslemeleri"; /* time string */ "%u days" = "%u gün"; /* time string */ "%u hr" = "%u sa"; /* time string */ "%u min" = "%u dk"; /* time string */ "%u sec" = "%u san"; /* time string */ "%u years" = "%u yıl"; /* time string */ "1 day" = "1 gün"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "1 file" = "1 dosya"; /* Inspector -> selected torrents */ "1 magnetized transfer" = "1 mıknatıslı aktarım"; /* Info options -> global setting */ "1 minute" = "1 dakika"; /* Create torrent -> info */ "1 piece, %@" = "1 parça, %@"; /* stats window -> times opened */ "1 time" = "1 kez"; /* Filter Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "1 transfer" = "1 aktarım"; /* time string */ "1 year" = "1 yıl"; /* Open invalid alert -> title */ "\"%@\" is not a valid torrent file." = "\"%@\" geçerli bir torrent dosyası deÄŸil."; /* Prefs -> blocklist -> message */ "A blocklist must first be downloaded" = "Önce bir kara dizelge indirin"; /* Create torrent -> file already exists warning -> warning */ "A file with the name \"%@\" already exists in the directory \"%@\". Choose a new name or directory to create the torrent file." = "\"%1$@\" adında bir dosya \"%2$@\" dizininde zaten var. Torrent dosyasını yaratmak için yeni bir ad veya dizin seçin."; /* Move inside itself alert -> title */ "A folder cannot be moved to inside itself." = "Bir klasör kendi içinde taşınamaz."; /* Create torrent -> zero size -> warning */ "A torrent file cannot be created for files with no size." = "Herhangi bir boyutu olmayan dosyalar için torrent dosyası oluÅŸturulamaz."; /* Create torrent -> file already exists warning -> title */ "A torrent file with this name and directory cannot be created." = "Bu ad ve dizin ile bir torrent dosyası oluÅŸturulamaz."; /* Create torrent -> blank address -> message */ "A transfer marked as private with no tracker addresses will be unable to connect to peers. The torrent file will only be useful if you plan to upload the file to a tracker website that will add the addresses for you." = "Herhangi bir izleyici adresi olmayan ve özel olarak imlenmiÅŸ bir aktarım baÅŸkalarına baÄŸlanamayacaktır. Torrent dosyası ancak dosyayı sizin için adreslendirme yapacak bir izleyicinin web sayfasına yüklerseniz yararlı olabilir."; /* Open duplicate alert -> title Open duplicate magnet alert -> title */ "A transfer of \"%@\" already exists." = "\"%@\" dosyasının bir aktarımı zaten var."; /* Filter Bar -> filter button */ "Active" = "Etkin"; /* Inspector -> tab Inspector view -> title */ "Activity" = "Etkinlik"; /* Add torrent -> same name -> button */ "Add" = "Ekle"; /* Inspector view -> tracker buttons */ "Add a tracker" = "İzleyici ekle"; /* Magnet link failed -> title */ "Adding magnetized transfer failed." = "Mıknatıslı aktarım eklenemedi."; /* Filter Bar -> filter button inspector -> check all */ "All" = "Tümü"; /* Filter Bar -> group filter menu Groups -> Button */ "All Groups" = "Bütün Öbekler"; /* Create torrent -> failed -> warning */ "An unknown error has occurred." = "Bilinmeyen bir hata oluÅŸtu."; /* Tracker last announce */ "Announce error" = "Duyuru hatası"; /* Tracker next announce */ "Announce in progress" = "Duyuru sürüyor"; /* Tracker next announce */ "Announce is queued" = "Duyuru sırada"; /* Tracker next announce */ "Announce not scheduled" = "Duyuru zamanlanmadı"; /* Tracker last announce */ "Announce timed out" = "Duyuru zaman aşımı"; /* All toolbar item -> label */ "Apply All" = "Tümünü Uygula"; /* Selected toolbar item -> label */ "Apply Selected" = "Seçileni Uygula"; /* Confirm Quit panel -> title */ "Are you sure you want to quit?" = "Çıkmak istediÄŸinizden emin misiniz?"; /* Remove completed confirm panel -> title */ "Are you sure you want to remove %@ completed transfers from the transfer list?" = "%@ bitmiÅŸ aktarımı aktarımlar dizelgesinden çıkarmak istediÄŸinizden emin misiniz?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list and trash the data files?" = "%@ aktarımı aktarımlar dizelgesinden çıkarıp veri dosyalarını Çöp Sepetine taşımak istediÄŸinizden emin misiniz?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list?" = "%@ aktarımı aktarımlar dizelgesinden çıkarmak istediÄŸinizden emin misiniz?"; /* Remove trackers alert -> title */ "Are you sure you want to remove %d trackers?" = "%d izleyiciyi kaldırmak istediÄŸinizden emin misiniz?"; /* Removal confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list and trash the data file?" = "\"%@\" aktarımını aktarım dizelgesinden çıkarıp veri dosyalarını Çöp Sepetine taşımak istediÄŸinizden emin misiniz?"; /* Removal confirm panel -> title Remove completed confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list?" = "\"%@\" aktarımını aktarım dizelgesinden çıkarmak istedinizden emin misiniz?"; /* Remove trackers alert -> title */ "Are you sure you want to remove this tracker?" = "Bu izleyiciyi kaldırmak istediÄŸinizden emin misiniz?"; /* Stats reset -> title */ "Are you sure you want to reset usage statistics?" = "Kullanım istatistiklerini sıfırlamak istedinizden emin misiniz?"; /* inspector -> peer table -> header tool tip */ "Available" = "Kullanılabilir"; /* Preferences -> toolbar item title */ "Bandwidth" = "Bant GeniÅŸliÄŸi"; /* Growl notification description */ "Bandwidth settings changed" = "Bant geniÅŸliÄŸi ayarları deÄŸiÅŸtirildi"; /* Groups -> Name */ "Blue" = "Gök"; /* Add torrent -> same name -> button Blocklist -> cancel button Confirm Quit panel -> button Create torrent -> blank address -> button Removal confirm panel -> button Remove completed confirm panel -> button Remove trackers alert -> button rename sheet button Stats reset -> button URL sheet button */ "Cancel" = "Vazgeç"; /* Torrent Table -> tooltip */ "Change transfer settings" = "Aktarım ayarlarını deÄŸiÅŸtir"; /* File Outline -> Menu */ "Check Selected" = "Seçiliyi denetle"; /* Torrent -> status string */ "Checking existing data" = "Var olan veri denetleniyor"; /* Message window -> save button */ "Clear" = "Temizle"; /* inspector -> peer table -> header */ "Client" = "İstemci"; /* View menu -> Quick Look */ "Close Quick Look" = "Göz At'ı kapat"; /* Prefs -> Notifications */ "Configure In Growl" = "Growl'da Yapılandır"; /* Prefs -> Notifications */ "Configure In System Preferences" = "Sistem Tercihlerinde Yapılandır"; /* Blocklist -> message */ "Connecting to site" = "Alana baÄŸlanıyor"; /* Torrent file copy alert -> title */ "Copy of \"%@\" Cannot Be Created" = "\"%@\" Kopyası OluÅŸturulamadı"; /* Create torrent -> failed -> warning */ "Could not read \"%s\": %s." = "\"%1$s\" okunamadı: %2$s."; /* Create torrent -> failed -> warning */ "Could not write \"%s\": %s." = "\"%1$s\" yazılamadı: %2$s."; /* Create toolbar item -> label Create torrent -> blank address -> button */ "Create" = "OluÅŸtur"; /* Drag overlay -> file */ "Create a Torrent File" = "Torrent Dosyası OluÅŸter"; /* Create toolbar item -> tooltip */ "Create torrent file" = "Torrent dosyası oluÅŸtur"; /* Create toolbar item -> palette label Create torrent -> select file */ "Create Torrent File" = "Torrent Dosyası OluÅŸtur"; /* Create torrent -> failed -> title */ "Creation of \"%@\" failed." = "\"%@\" oluÅŸturulamadı."; /* Inspector -> peer -> status */ "Currently downloading (interested and not choked)" = "Åžu anda indiriliyor (ilgili ve izinli)"; /* Inspector -> peer -> status */ "Currently uploading (interested and not choked)" = "Åžu anda gönderiliyor (ilgili ve izinli)"; /* Message window -> table column */ "Date" = "Tarih"; /* Message window -> level Message window -> level string */ "Debug" = "Ayıkla"; /* Info options -> global setting */ "disabled" = "etkisiz"; /* inspector -> peer table -> header inspector -> web seed table -> header status bar -> status label Torrent -> status string */ "DL" = "İD"; /* Inspector -> Peers tab -> peers */ "DL from %d" = "%d yerinden İD"; /* Torrent disk space alert -> button */ "Do not check disk space again" = "Disk alanını bir daha denetleme"; /* Donation beg -> button */ "Don't bug me about this ever again." = "Bunu bir daha karşıma getirme."; /* files tab -> tooltip */ "Don't Download" = "İndirme"; /* Donation beg -> button */ "Donate" = "Bağış Yap"; /* Donation beg -> message */ "Donate or not, there will be no difference to your torrenting experience." = "Bağış yapın ya da yapmayın, torrent deneyiminizde herhangi bir deÄŸiÅŸiklik olmayacak."; /* file table -> header tool tip files tab -> tooltip */ "Download" = "İndir"; /* Torrent disk space alert -> button */ "Download Anyway" = "Yine de İndir"; /* notification title */ "Download Complete" = "İndirme Bitti"; /* Blocklist -> message */ "Download of the blocklist failed." = "Kara dizelge indirilemedi."; /* files tab -> tooltip */ "Download Some" = "Birazını indir"; /* Torrent table -> group row -> tooltip */ "Download speed" = "İndirme hızı"; /* Stats window -> label tracker peer stat */ "Downloaded" = "İndirildi"; /* Filter Bar -> filter button Torrent -> status string */ "Downloading" = "İndiriliyor"; /* Blocklist -> message */ "Downloading blocklist" = "Kara dizelge indiriliyor "; /* Torrent -> status string */ "Downloading from %d of %d peers" = "%2$d kullanıcının %1$d tanesinden indiriliyor"; /* Torrent -> status string */ "Downloading from %d of 1 peer" = "1 kullanıcının %d tanesinden indiriliyor"; /* inspector -> peer table -> header tool tip */ "Downloading From Peer" = "BaÅŸkasından İndiriliyor"; /* inspector -> web seed table -> header tool tip */ "Downloading From Web Seed" = "Web Beslemesinden İndiriliyor"; /* Inspector -> Peers tab -> table row tooltip */ "encrypted" = "ÅŸifrelenmiÅŸ"; /* inspector -> peer table -> header tool tip */ "Encrypted Connection" = "ÅžifrelenmiÅŸ BaÄŸlantı"; /* Message window -> level Message window -> level string Torrent -> status string */ "Error" = "Hata"; /* Inspector -> tab Inspector view -> title */ "Files" = "Dosyalar"; /* Filter toolbar item -> label inspector -> file filter Message window -> filter field */ "Filter" = "Süzgeç"; /* Inspector -> Peers tab -> table row tooltip */ "From: cache" = "Kimden: önbellek"; /* Inspector -> Peers tab -> table row tooltip */ "From: distributed hash table" = "Kimden: dağıtılan komut tablosu"; /* Inspector -> Peers tab -> table row tooltip */ "From: incoming connection" = "Kimden: gelen baÄŸlantı"; /* Inspector -> Peers tab -> table row tooltip */ "From: libtorrent extension protocol handshake" = "Kimden: libtorrent protokol uyuÅŸma eklentisi"; /* Inspector -> Peers tab -> table row tooltip */ "From: local peer discovery" = "Kimden: yerel kullanıcı keÅŸfi"; /* Inspector -> Peers tab -> table row tooltip */ "From: peer exchange" = "Kimden: kullanıcı deÄŸiÅŸimi"; /* Inspector -> Peers tab -> table row tooltip */ "From: tracker" = "Kimden: izleyici"; /* File size - gigabytes file/memory size - gigabytes */ "GB" = "GB"; /* Transfer speed (gigabytes per second) */ "GB/s" = "GB/s"; /* Preferences -> toolbar item title */ "General" = "Genel"; /* Inspector -> tab Inspector view -> title */ "General Info" = "Genel Bilgi"; /* Status Bar -> speed tooltip */ "Global download limit" = "Genel indirme limiti"; /* Status Bar -> speed tooltip */ "Global upload limit" = "Genel gönderme limiti"; /* Tracker last announce */ "got %d peers" = "%d kullanıcı var"; /* Tracker last announce */ "got 1 peer" = "1 kullanıcı var"; /* Groups -> Name */ "Gray" = "Gri"; /* Groups -> Name */ "Green" = "YeÅŸil"; /* Groups -> Button */ "Group" = "Öbek"; /* Preferences -> toolbar item title */ "Groups" = "Öbekler"; /* View menu -> Filter Bar */ "Hide Filter Bar" = "Süzgeç ÇubuÄŸunu Gizle"; /* View menu -> Inspector */ "Hide Inspector" = "Denetçiyi Gizle"; /* View menu -> Status Bar */ "Hide Status Bar" = "Durum ÇubuÄŸunu Gizle"; /* File Outline -> Priority Menu */ "High" = "Yüksek"; /* files tab -> tooltip */ "High Priority" = "Yüksek Öncelik"; /* Legal alert -> button */ "I Accept" = "Kabul Ediyorum"; /* Add torrent -> same name -> message */ "If you are attempting to use already existing data, the root data directory should be inside the destination directory." = "EÄŸer var olan veriyi kullanmaya çalışıyorsanız kök veri dizini hedef dizin içerisinde bulunmalıdır."; /* Torrent -> eta string */ "inactive" = "etkin deÄŸil"; /* Message window -> level Message window -> level string */ "Info" = "Bilgi"; /* Inspector toolbar item -> label */ "Inspector" = "Denetçi"; /* URL sheet label */ "Internet address of torrent file:" = "Torrent dosyasının internet adresi:"; /* inspector -> peer table -> header */ "IP Address" = "IP Adresi"; /* Download not a torrent -> message */ "It appears that the file \"%@\" from %@ is not a torrent file." = "Görünen o ki %2$@ içinden \"%1$@\" bir torrent dosyası deÄŸil."; /* File size - kilobytes file/memory size - kilobytes */ "KB" = "KB"; /* Transfer speed (kilobytes per second) */ "KB/s" = "KB/s"; /* Tracker last announce */ "Last Announce" = "Son Duyuru"; /* Tracker last scrape */ "Last Scrape" = "Son İstek"; /* Prefs -> blocklist -> message */ "Last updated" = "Son güncelleme"; /* tracker peer stat */ "Leechers" = "İndirenler"; /* About window -> license button */ "License" = "Lisans"; /* Action menu -> upload/download limit torrent action menu -> upload/download limit */ "Limit (%d KB/s)" = "Limit (%d KB/s)"; /* Save log alert panel -> title */ "Log Could Not Be Saved" = "Günlük Kaydedilemedi"; /* File Outline -> Priority Menu */ "Low" = "Düşük"; /* files tab -> tooltip */ "Low Priority" = "Düşük Öncelik"; /* Open duplicate magnet alert -> title */ "Magnet link is a duplicate of an existing transfer." = "Mıknatıs bağı var olan bir aktarımın aynısı."; /* Inspector -> selected torrents Torrent -> progress string */ "Magnetized transfer" = "Mıknatıslı aktarım"; /* File size - megabytes file/memory size - megabytes */ "MB" = "MB"; /* Transfer speed (megabytes per second) */ "MB/s" = "MB/s"; /* Message window -> table column */ "Message" = "İleti"; /* Message window -> title */ "Message Log" = "İleti Günlüğü"; /* files tab -> tooltip */ "Multiple Priorities" = "Çoklu Öncelikler"; /* Inspector -> Peers tab -> table row tooltip No Ratio Prefs -> blocklist -> message Tracker last announce Tracker last scrape tracker peer stat */ "N/A" = "Veri yok"; /* Filter Bar -> filter menu */ "Name" = "Ad"; /* Preferences -> toolbar item title */ "Network" = "AÄŸ"; /* Prefs -> blocklist -> message */ "Never" = "Hiçbir Zaman"; /* Inspector -> tracker table */ "New Tier" = "Yeni AÅŸama"; /* Tracker next announce */ "Next announce in %@" = "Sonraki duyuru %@ içinde"; /* Group table row */ "No Group" = "Öbek Yok"; /* Inspector -> selected torrents */ "No Torrents Selected" = "Seçili Torrent Yok"; /* Groups -> Button Groups -> Menu inspector -> check all */ "None" = "Hiçbiri"; /* Donation beg -> button */ "Nope" = "I-ıh"; /* File Outline -> Priority Menu */ "Normal" = "OlaÄŸan"; /* files tab -> tooltip */ "Normal Priority" = "OlaÄŸan Öncelik"; /* Torrent disk space alert -> title */ "Not enough remaining disk space to download \"%@\" completely." = "\"%@\" aktarımını tamamlamak için yeterli disk alanı yok."; /* About window -> license close button Blocklist -> button Create torrent -> directory doesn't exist warning -> button Create torrent -> failed -> button Create torrent -> file already exists warning -> button Create torrent -> no files -> button Create torrent -> zero size -> button Download not a torrent -> button Magnet link failed -> button Move error alert -> button Move inside itself alert -> button Open duplicate alert -> button Open duplicate magnet alert -> button Open invalid alert -> button Save log alert panel -> button Torrent disk space alert -> button Torrent download failed -> button Torrent file copy alert -> button Transmission already running alert -> button */ "OK" = "Tamam"; /* Remove completed confirm panel -> message */ "Once removed, continuing the transfer will require the torrent file or magnet link." = "Kaldırıldıktan sonra aktarımı sürdürmek torrent dosyası veya mıknatıs bağı gerektirir."; /* Removal confirm panel -> message part 2 Remove completed confirm panel -> message */ "Once removed, continuing the transfers will require the torrent files or magnet links." = "Kaldırıldıktan sonra aktarımları sürdürmek torrent dosyası veya mıknatıs bağı gerektirir."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact it. This cannot be undone." = "Kaldırıldıktan sonra Transmission izleyiciye baÄŸlanmayacak. Bu geri alınamaz."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact them. This cannot be undone." = "Kaldırıldıktan sonra Transmission izleyicilere baÄŸlanmayacak. Bu geri alınamaz."; /* File Outline -> Menu */ "Only Check Selected" = "Yalnızca Seçiliyi Denetle"; /* Open toolbar item -> label URL sheet button */ "Open" = "Aç"; /* Open address toolbar item -> label */ "Open Address" = "Adres Aç"; /* Open address toolbar item -> palette label */ "Open Torrent Address" = "Torrent Adresi Aç"; /* Open toolbar item -> tooltip */ "Open torrent files" = "Torrent dosyası aç"; /* Open toolbar item -> palette label */ "Open Torrent Files" = "Torrent Dosyası Aç"; /* Open address toolbar item -> tooltip */ "Open torrent web address" = "Torrent web adresini aç"; /* Inspector -> tab Inspector view -> title */ "Options" = "Seçenekler"; /* Groups -> Name */ "Orange" = "Portakal"; /* Inspector -> Peers tab -> table row tooltip */ "Partial Seed" = "Kısımsal Besleme"; /* All toolbar item -> palette label */ "Pause / Resume All" = "Tümünü Duraklat / Sürdür"; /* Selected toolbar item -> palette label */ "Pause / Resume Selected" = "Seçiliyi Duraklat / Sürdür"; /* All toolbar item -> label Dock item */ "Pause All" = "Hepsini Duraklat"; /* All toolbar item -> tooltip */ "Pause all transfers" = "Tüm aktarımları duraklat"; /* Selected toolbar item -> label */ "Pause Selected" = "Seçiliyi Duraklat"; /* Selected toolbar item -> tooltip */ "Pause selected transfers" = "Seçili aktarımları duraklat"; /* Torrent Table -> tooltip */ "Pause the transfer" = "Aktarımı duraklat"; /* Filter Bar -> filter button Torrent -> status string */ "Paused" = "Duraklatıldı"; /* Inspector -> peer -> status */ "Peer is unchoking you, but you are not interested" = "Kullanıcı size izin veriyor, ancak siz ilgili deÄŸilsiniz"; /* Inspector -> peer -> status */ "Peer wants you to upload, but you do not want to (interested and choked)" = "Karşıdaki kiÅŸi sizin yükleme yapmanızı istiyor, ancak siz istemiyorsunuz (ilgili ve izinli)"; /* Inspector -> tab Inspector view -> title Preferences -> toolbar item title */ "Peers" = "Kullanıcılar"; /* Inspector -> Peers tab -> table row tooltip */ "Port" = "Port"; /* Preferences -> Network -> port status */ "Port check site is down" = "Port kontrol alanı çalışmıyor"; /* Preferences -> Network -> port status */ "Port is closed" = "Port kapalı"; /* Preferences -> Network -> port status */ "Port is open" = "Port açık"; /* File Outline -> Menu file table -> header tool tip */ "Priority" = "Öncelik"; /* files tab -> tooltip */ "Priority Not Available" = "Öncelik Kullanılamaz"; /* Inspector -> private torrent */ "Private Torrent, non-tracker peer discovery disabled" = "Gizli Torrent, izleyicisiz kullanıcı bulumu etkisizleÅŸtirildi"; /* Message window -> table column */ "Process" = "İşlem"; /* Blocklist -> message */ "Processing blocklist" = "Kara dizelge iÅŸleniyor"; /* Stats window -> label */ "Program Started" = "Uygulama BaÅŸladı"; /* Inspector -> Peers tab -> table row tooltip */ "Progress: %@" = "İlerleme: %@"; /* Inspector -> Peers tab -> table row tooltip */ "Protocol: %@" = "Protokol: %@"; /* Inspector -> private torrent */ "Public Torrent" = "Halka Açık Torrent"; /* Groups -> Name */ "Purple" = "Mor"; /* QuickLook toolbar item -> label QuickLook toolbar item -> palette label QuickLook toolbar item -> tooltip View menu -> Quick Look */ "Quick Look" = "Göz At"; /* Confirm Quit panel -> button Legal alert -> button */ "Quit" = "Çık"; /* Dock Badger -> quit */ "Quitting" = "Kapanıyor"; /* Stats window -> label status bar -> status label Torrent -> status string Torrent table -> group row -> tooltip */ "Ratio" = "Oran"; /* Groups -> Name */ "Red" = "Kırmızı"; /* Action menu -> status string toggle */ "Remaining Time" = "Kalan Süre"; /* Torrent -> eta string */ "remaining time unknown" = "kalan süre bilinmiyor"; /* Preferences -> toolbar item title */ "Remote" = "Uzaktan Kontrol"; /* Removal confirm panel -> button Remove completed confirm panel -> button Remove toolbar item -> label Remove trackers alert -> button */ "Remove" = "Kaldır"; /* Main window -> 3rd bottom left button (remove all) tooltip */ "Remove all transfers that have completed seeding." = "Beslemesi biten tüm aktarımları kaldır."; /* Remove toolbar item -> palette label */ "Remove Selected" = "Seçiliyi Kaldır"; /* Inspector view -> tracker buttons */ "Remove selected trackers" = "Seçili izleyicileri kaldır"; /* Remove toolbar item -> tooltip */ "Remove selected transfers" = "Seçili aktarımları kaldır"; /* rename sheet button */ "Rename" = "Yeniden Adlandır"; /* File Outline -> Menu */ "Rename File" = "Yeniden Adlandır"; /* rename sheet label */ "Rename the file \"%@\":" = "\"%@\" dosyasını yeniden adlandır:"; /* Stats reset -> button Stats window -> reset button */ "Reset" = "Sıfırla"; /* All toolbar item -> label Dock item */ "Resume All" = "Tümünü Sürdür"; /* All toolbar item -> tooltip */ "Resume all transfers" = "Tüm aktarımları sürdür"; /* Selected toolbar item -> label */ "Resume Selected" = "Seçiliyi Sürdür"; /* Selected toolbar item -> tooltip */ "Resume selected transfers" = "Seçili aktarımları sürdür"; /* Torrent cell -> button info */ "Resume the transfer" = "Aktarımı sürdür"; /* Torrent cell -> button info */ "Resume the transfer right away" = "Aktarıma hemen sürdür"; /* Stats window -> label */ "Running Time" = "Açık Olan Süre"; /* Message window -> save button */ "Save" = "Kaydet"; /* Tracker last scrape */ "Scrape error" = "İstek hatası"; /* Tracker last scrape */ "Scrape timed out" = "İstek zaman aşımına uÄŸradı"; /* tracker peer stat */ "Seeders" = "Besleyenler"; /* Filter Bar -> filter button Torrent -> status string */ "Seeding" = "Besleniyor"; /* Torrent -> status string */ "Seeding complete" = "Besleme tamamlandı"; /* notification title */ "Seeding Complete" = "Besleme Tamamlandı"; /* Torrent -> status string */ "Seeding to %d of %d peers" = "%2$d kullanıcıdan %1$d tanesi besleniyor "; /* Torrent -> status string */ "Seeding to %d of 1 peer" = "1 kullanıcıdan %d tanesi besleniyor "; /* Create torrent -> location sheet -> button Create torrent -> select file Move torrent -> prompt Open torrent -> prompt Preferences -> Open panel prompt */ "Select" = "Seç"; /* Create torrent -> select file */ "Select a file or folder for the torrent file." = "Torrent dosyası için bir ad veya konum seç."; /* Add -> select destination folder */ "Select the download folder for \"%@\"" = "\"%@\" için indirme klasörü seç"; /* Create torrent -> location sheet -> message */ "Select the name and location for the torrent file." = "Torrent dosyası için ad ve konum seç."; /* Move torrent -> select destination folder */ "Select the new folder for %d data files." = "%d veri dosyaları için yeni klasör seç."; /* Move torrent -> select destination folder */ "Select the new folder for \"%@\"." = "\"%@\" için yeni klasör seç."; /* Status Bar -> status menu */ "Session Ratio" = "Oturum Oranı"; /* Status Bar -> status menu */ "Session Transfer" = "Oturum Aktarımı"; /* Share toolbar item -> label Share toolbar item -> palette label */ "Share" = "PaylaÅŸ"; /* Share toolbar item -> tooltip */ "Share torrent file" = "Torrent dosyasını paylaÅŸ"; /* Main window -> 1st bottom left button (action) tooltip */ "Shortcuts for changing global settings." = "Genel ayarları deÄŸiÅŸtirmek için kısayollar."; /* notification button */ "Show" = "Göster"; /* View menu -> Filter Bar */ "Show Filter Bar" = "Süzgeç ÇubuÄŸunu Göster"; /* File Outline -> Menu */ "Show in Finder" = "Finder'da Göster"; /* View menu -> Inspector */ "Show Inspector" = "Denetçiyi Göster"; /* View menu -> Status Bar */ "Show Status Bar" = "Durum ÇubuÄŸunu Göster"; /* Torrent cell -> button info */ "Show the data file in Finder" = "Veri dosyasını Finder'da Göster"; /* Dock item Status Bar -> speed tooltip */ "Speed Limit" = "Hız Limiti"; /* Growl notification title */ "Speed Limit Auto Disabled" = "Hız Limiti Etkin DeÄŸil"; /* Growl notification title */ "Speed Limit Auto Enabled" = "Hız Limiti Etkin"; /* Main window -> 2nd bottom left button (turtle) tooltip */ "Speed Limit overrides the total bandwidth limits with its own limits." = "Hız Limiti bant geniÅŸliÄŸi limitlerini kendi limitleri ile deÄŸiÅŸtirir."; /* Torrent -> status string */ "Stalled" = "Etkin Olmayanlar"; /* Stats window -> title */ "Statistics" = "İstatistikler"; /* Action menu -> status string toggle */ "Status of Selected Files" = "Seçili Dosyaların Durumu"; /* Action menu -> ratio stop torrent action menu -> ratio stop */ "Stop at Ratio (%.2f)" = "(%.2f) oranında dur"; /* Torrent cell -> button info */ "Stop waiting to start" = "BaÅŸlamayı bekleme"; /* Donation beg -> title */ "Support open-source indie software" = "Açık kaynaklı özgür yazılımları destekleyin"; /* File size - terabytes file/memory size - terabytes */ "TB" = "TB"; /* Transfer speed (terabytes per second) */ "TB/s" = "TB/s"; /* Create torrent -> directory doesn't exist warning -> title */ "The chosen torrent file location does not exist." = "SeçilmiÅŸ torrent dosyası konumu bulunmuyor."; /* Add torrent -> same name -> title */ "The destination directory and root data directory have the same name." = "Hedef dizin ve kök veri dizini aynı ada sahip."; /* Create torrent -> directory doesn't exist warning -> warning */ "The directory \"%@\" does not currently exist. Create this directory or choose a different one to create the torrent file." = "\"%@\" dizini ÅŸu anda bulunmuyor. Bu dizini oluÅŸturun veya torrent dosyasını oluÅŸturmak için bir baÅŸka dizin seçin."; /* Open duplicate magnet alert -> message */ "The magnet link \"%@\" cannot be added because it is a duplicate of an already existing transfer." = "\"%@\" mıknatıs bağı eklenemedi, çünkü var olan bir aktarımın aynısı."; /* Move error alert -> message Move inside itself alert -> message */ "The move operation of \"%@\" cannot be done." = "\"%@\" için taşıma iÅŸlemi yapılamadı."; /* blocklist fail message */ "The specified blocklist file did not contain any valid rules." = "Belirtilen kara dizelge geçerli kurallar içermiyor."; /* Torrent download failed -> message */ "The torrent could not be downloaded from %@: %@." = "Torrent %1$@ yerinden indirilemedi: %2$@."; /* Torrent file copy alert -> message */ "The torrent file (%@) cannot be found." = "Torrent dosyası (%@) bulunamadı."; /* Open invalid alert -> message */ "The torrent file cannot be opened because it contains invalid data." = "Bu torrent dosyası açılamaz çünkü geçersiz veri içeriyor."; /* Create torrent -> zero size -> title */ "The total file size is zero bytes." = "Toplam dosya boyutu sıfır bit."; /* Open duplicate alert -> message */ "The transfer cannot be added because it is a duplicate of an already existing transfer." = "Bu aktarım eklenemez çünkü var olan bir aktarımın aynısı."; /* Torrent disk space alert -> message */ "The transfer will be paused. Clear up space on %@ or deselect files in the torrent inspector to continue." = "Bu aktarım duraklatılacak. Sürdürmek için %@ üzerinde yer açın veya denetçiden birkaç dosyanın imini kaldırın."; /* Create torrent -> blank address -> message */ "The transfer will not contact trackers for peers, and will have to rely solely on non-tracker peer discovery methods such as PEX and DHT to download and seed." = "Bu aktarım kullanıcı bulmak için izleyicilere baÄŸlanmayacaktır, aksine aktarım için PEX ve DHT gibi izleyicisiz çalışan yöntemleri kullanacaktır."; /* Removal confirm panel -> message part 1 */ "There are %@ active transfers." = "%@ etkin aktarım."; /* Removal confirm panel -> message part 1 */ "There are %@ transfers (%@ active)." = "%1$@ aktarım (%2$@ etkin)."; /* Confirm Quit panel -> message */ "There are %d active transfers that will be paused on quit. The transfers will automatically resume on the next launch." = "Åžu anda etkin olan ve çıkışta duraklatılacak %d aktarım var. Uygulamayı yeniden açtığınızda aktarımlar sürdürülecektir."; /* Create torrent -> blank address -> title */ "There are no tracker addresses." = "İzleyici adresi yok."; /* Transmission already running alert -> message */ "There is already a copy of Transmission running. This copy cannot be opened until that instance is quit." = "Bir Transmission kopyası zaten açık. Var olan oturum kapatılmadan bu kopyayı açamazsınız."; /* Confirm Quit panel -> message */ "There is an active transfer that will be paused on quit. The transfer will automatically resume on the next launch." = "Devam eden aktarımlar uygulamadan çıkarken duraklatılacaktır. Uygulamayı yeniden açtığınızda aktarım sürecektir."; /* Create torrent -> no files -> warning */ "There must be at least one file in a folder to create a torrent file." = "Torrent dosyasını oluÅŸturmak için klasörde en az bir dosya olmalıdır."; /* Save log alert panel -> message */ "There was a problem creating the file \"%@\"." = "\"%@\" dosyasını oluÅŸtururken hata oluÅŸtu."; /* Move error alert -> title */ "There was an error moving the data file." = "Veri dosyasını taşırken hata oluÅŸtu."; /* Magnet link failed -> message */ "There was an error when adding the magnet link \"%@\". The transfer will not occur." = "\"%@\" mıknatıs bağını eklerken bir hata oluÅŸtu. Aktarım gerçekleÅŸmeyecek."; /* Create torrent -> no files -> title */ "This folder contains no files." = "Bu klasörde dosya yok."; /* Removal confirm panel -> message */ "This transfer is active. Once removed, continuing the transfer will require the torrent file or magnet link." = "Bu aktarım ÅŸu anda etkin. Kaldırıldıktan sonra yeniden baÅŸlatmak için torrent dosyası veya mıknatıs bağı gerekecek."; /* Stats reset -> message */ "This will clear the global statistics displayed by Transmission. Individual transfer statistics will not be affected." = "Genel Transmission istatistikleri silinecektir. Bireysel istatistikler bundan etkilenmeyecek."; /* Inspector -> tracker table */ "Tier %d" = "%d. sıra"; /* Filter toolbar item -> palette label */ "Toggle Filter" = "Süzgeci aç/kapa"; /* Inspector toolbar item -> palette label */ "Toggle Inspector" = "Denetçiyi aç/kapa"; /* Filter toolbar item -> tooltip */ "Toggle the filter bar" = "Süzgeç çubuÄŸunu aç/kapa"; /* Inspector toolbar item -> tooltip */ "Toggle the torrent inspector" = "Denetçiyi aç/kapa"; /* Download not a torrent -> title Torrent download error -> title */ "Torrent download failed" = "Torrent yüklemesi baÅŸarısız"; /* notification title */ "Torrent File Auto Added" = "Torrent Dosyası Eklendi"; /* Inspector -> title */ "Torrent Inspector" = "Torrent Denetçisi"; /* Torrent -> progress string */ "torrent metadata needed" = "torrent üstbilgisi gerekli"; /* stats total */ "Total N/A" = "Veri yok"; /* Status Bar -> status menu */ "Total Ratio" = "Toplam Oran"; /* Status Bar -> status menu */ "Total Transfer" = "Toplam Aktarım"; /* Filter Bar -> filter menu */ "Tracker" = "İzleyici"; /* Torrent -> status string */ "Tracker returned error" = "İzleyici hata verdi"; /* Torrent -> status string */ "Tracker returned warning" = "İzleyici uyarı verdi"; /* Tracker next announce */ "Tracker will be used as a backup" = "İzleyici bir yedek olarak kullanılacak"; /* Inspector -> tab Inspector view -> title */ "Trackers" = "İzleyiciler"; /* Inspector -> Peers tab -> peers */ "Transfer Not Active" = "Aktarım Etkin DeÄŸil"; /* Preferences -> toolbar item title */ "Transfers" = "Aktarımlar"; /* Inspector -> Peers tab -> peers */ "Transfers Not Active" = "Aktarımlar Etkin DeÄŸil"; /* Legal alert -> message */ "Transmission is a file-sharing program. When you run a torrent, its data will be made available to others by means of upload. You and you alone are fully responsible for exercising proper judgement and abiding by your local laws." = "Transmission bir dosya paylaşım uygulamasıdır. Bir torrenti çalıştırdığınizda torrent verisi diÄŸer herkese açık olacaktır. Bunun yerel kanunlarla olan uyumundan yalnız ve yalnız siz sorumlusunuz."; /* Donation beg -> message */ "Transmission is a full-featured torrent application. A lot of time and effort have gone into development, coding, and refinement. If you enjoy using it, please consider showing your love with a donation." = "Transmission tam donanımlı bir torrent uygulamasıdır. GeliÅŸtirme, kodlama ve ince ayarlarına çok fazla emek ve zaman harcadık. EÄŸer kullanmaktan memnunsanız, memnuniyetinizi ufak bir bağış ile gösterebilirsiniz."; /* Transmission already running alert -> title */ "Transmission is already running." = "Transmission zaten çalışıyor."; /* inspector -> peer table -> header status bar -> status label Torrent -> status string */ "UL" = "YK"; /* Inspector -> Peers tab -> peers */ "UL to %d" = "%d için YK"; /* File Outline -> Menu */ "Uncheck Selected" = "Seçilinin İmini Kaldır"; /* Status Bar -> speed tooltip */ "unlimited" = "limitsiz"; /* Torrent -> error string unreadable */ "unreadable error" = "okunamayan hata"; /* Save log panel -> default file name */ "untitled" = "adsız"; /* Torrent table -> group row -> tooltip */ "Upload speed" = "Gönderme hızı"; /* Stats window -> label */ "Uploaded" = "Gönderildi"; /* Torrent -> progress string */ "uploaded %@ (Ratio: %@)" = "%1$@ gönderilen (Oran: %2$@)"; /* inspector -> peer table -> header tool tip */ "Uploading To Peer" = "Karşıdaki kiÅŸiye yükleniyor"; /* Torrent -> status string */ "Waiting to check existing data" = "Var olan veriyi denetlemek için bekleniyor"; /* Torrent -> status string */ "Waiting to download" = "İndirmek için bekleniyor"; /* Torrent -> status string */ "Waiting to seed" = "Beslemek için bekleniyor"; /* Drag overlay -> url */ "Web Address" = "URL"; /* Torrent -> status string */ "web seed" = "web beslemesi"; /* inspector -> web seed table -> header */ "Web Seeds" = "Web Beslemeleri"; /* Legal alert -> title */ "Welcome to Transmission" = "Transmission'a hoÅŸ geldiniz"; /* Groups -> Name */ "Yellow" = "Sarı"; /* Inspector -> peer -> status */ "You unchoked the peer, but the peer is not interested" = "Karşıdaki kiÅŸiye izin verdiniz, ancak karşıdaki ilgili deÄŸil"; /* Inspector -> peer -> status */ "You want to download, but peer does not want to send (interested and choked)" = "Siz indirmek istiyorsunuz ancak karşıdaki göndermek istemiyor (ilgili ve izinsiz)"; transmission-2.92/macosx/tr.lproj/PaxHeaders.4960/InfoOptionsView.xib0000644000000000000000000000013212664476420022543 xustar0030 mtime=1456635152.117498602 30 atime=1456635152.117498602 30 ctime=1457295922.876856825 transmission-2.92/macosx/tr.lproj/InfoOptionsView.xib0000644000175000017500000012116012664476420024171 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/tr.lproj/PaxHeaders.4960/InfoActivityView.xib0000644000000000000000000000013212664476420022704 xustar0030 mtime=1456635152.118498619 30 atime=1456635152.117498602 30 ctime=1457295922.876856825 transmission-2.92/macosx/tr.lproj/InfoActivityView.xib0000644000175000017500000012747512664476420024351 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/tr.lproj/PaxHeaders.4960/InfoGeneralView.xib0000644000000000000000000000013212664476420022465 xustar0030 mtime=1456635152.118498619 30 atime=1456635152.118498619 30 ctime=1457295922.876856825 transmission-2.92/macosx/tr.lproj/InfoGeneralView.xib0000644000175000017500000006271412664476420024124 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/tr.lproj/PaxHeaders.4960/AddMagnetWindow.xib0000644000000000000000000000013212662757243022460 xustar0030 mtime=1456201379.333863216 30 atime=1456201379.333863216 30 ctime=1457295922.876856825 transmission-2.92/macosx/tr.lproj/AddMagnetWindow.xib0000644000175000017500000006542412662757243024120 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/tr.lproj/PaxHeaders.4960/MainMenu.xib0000644000000000000000000000013212644245522021145 xustar0030 mtime=1452362578.781699554 30 atime=1452362578.781699554 30 ctime=1457295922.875856808 transmission-2.92/macosx/tr.lproj/MainMenu.xib0000644000175000017500000046032112644245522022600 0ustar00mikedldmikedld00000000000000 CA CA YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7NjIsIDYyfdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPEgABAG5NTQAqAADwSOvr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r 6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s 7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P8A EQEAAAMAAAABAHwAAAEBAAMAAAABAHwAAAECAAMAAAAEAADxKgEDAAMAAAABAAEAAAEGAAMAAAABAAIA AAERAAQAAAABAAAACAESAAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABAHwAAAEXAAQAAAABAADw QAEaAAUAAAABAADxGgEbAAUAAAABAADxIgEcAAMAAAABAAEAAAEoAAMAAAABAAIAAAFSAAMAAAABAAEA AAFTAAMAAAAEAADxModzAAcAAA80AADxOgAAAAAAAACQAAAAAQAAAJAAAAABAAgACAAIAAgAAQABAAEA AQAADzRhcHBsAhAAAG1udHJSR0IgWFlaIAffAAwABQANABIACGFjc3BBUFBMAAAAAEFQUEwAAAAAAAAA AAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAEWRlc2MAAAFQAAAAYmRzY20AAAG0AAAEGmNwcnQAAAXQAAAAI3d0cHQAAAX0AAAA FHJYWVoAAAYIAAAAFGdYWVoAAAYcAAAAFGJYWVoAAAYwAAAAFHJUUkMAAAZEAAAIDGFhcmcAAA5QAAAA IHZjZ3QAAA5wAAAAMG5kaW4AAA6gAAAAPmNoYWQAAA7gAAAALG1tb2QAAA8MAAAAKGJUUkMAAAZEAAAI DGdUUkMAAAZEAAAIDGFhYmcAAA5QAAAAIGFhZ2cAAA5QAAAAIGRlc2MAAAAAAAAACERpc3BsYXkAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAACIAAAAMaHJIUgAAABQAAAGoa29LUgAAAAwAAAG8bmJO TwAAABIAAAHIaWQAAAAAABIAAAHaaHVIVQAAABQAAAHsY3NDWgAAABYAAAIAZGFESwAAABwAAAIWdWtV QQAAABwAAAIyYXIAAAAAABQAAAJOaXRJVAAAABQAAAJicm9STwAAABIAAAJ2bmxOTAAAABYAAAKIaGVJ TAAAABYAAAKeZXNFUwAAABIAAAJ2ZmlGSQAAABAAAAK0emhUVwAAAAwAAALEdmlWTgAAAA4AAALQc2tT SwAAABYAAALeemhDTgAAAAwAAALEcnVSVQAAACQAAAL0ZnJGUgAAABYAAAMYbXMAAAAAABIAAAMuY2FF UwAAABgAAANAdGhUSAAAAAwAAANYZXNYTAAAABIAAAJ2ZGVERQAAABAAAANkZW5VUwAAABIAAAN0cHRC UgAAABgAAAOGcGxQTAAAABIAAAOeZWxHUgAAACIAAAOwc3ZTRQAAABAAAAPSdHJUUgAAABQAAAPiamFK UAAAAA4AAAP2cHRQVAAAABYAAAQEAEwAQwBEACAAdQAgAGIAbwBqAGnO7LfsACAATABDAEQARgBhAHIA ZwBlAC0ATABDAEQATABDAEQAIABXAGEAcgBuAGEAUwB6AO0AbgBlAHMAIABMAEMARABCAGEAcgBlAHYA bgD9ACAATABDAEQATABDAEQALQBmAGEAcgB2AGUAcwBrAOYAcgBtBBoEPgQ7BEwEPgRABD4EMgQ4BDkA IABMAEMARCAPAEwAQwBEACAGRQZEBkgGRgYpAEwAQwBEACAAYwBvAGwAbwByAGkATABDAEQAIABjAG8A bABvAHIASwBsAGUAdQByAGUAbgAtAEwAQwBEIA8ATABDAEQAIAXmBdEF4gXVBeAF2QBWAOQAcgBpAC0A TABDAERfaYJyACAATABDAEQATABDAEQAIABNAOAAdQBGAGEAcgBlAGIAbgDpACAATABDAEQEJgQyBDUE QgQ9BD4EOQAgBBYEGgAtBDQEOARBBD8EOwQ1BDkATABDAEQAIABjAG8AdQBsAGUAdQByAFcAYQByAG4A YQAgAEwAQwBEAEwAQwBEACAAZQBuACAAYwBvAGwAbwByAEwAQwBEACAOKg41AEYAYQByAGIALQBMAEMA RABDAG8AbABvAHIAIABMAEMARABMAEMARAAgAEMAbwBsAG8AcgBpAGQAbwBLAG8AbABvAHIAIABMAEMA RAOIA7MDxwPBA8kDvAO3ACADvwO4A8wDvQO3ACAATABDAEQARgDkAHIAZwAtAEwAQwBEAFIAZQBuAGsA bABpACAATABDAEQwqzDpMPwAIABMAEMARABMAEMARAAgAGEAIABDAG8AcgBlAHMAAHRleHQAAAAAQ29w eXJpZ2h0IEFwcGxlIEluYy4sIDIwMTUAAFhZWiAAAAAAAADzFgABAAAAARbKWFlaIAAAAAAAAHHAAAA5 igAAAWdYWVogAAAAAAAAYSMAALnmAAAT9lhZWiAAAAAAAAAj8gAADJAAAL3QY3VydgAAAAAAAAQAAAAA BQAKAA8AFAAZAB4AIwAoAC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUA mgCfAKMAqACtALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgB PgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0C JgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08D WgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME 4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8G wAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI +wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4AL mAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8O mw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegS BxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V 4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e 6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/Ak HyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p 0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv /jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2 rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE9 4D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVF mkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN 3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxW qVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7Ng BWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp 8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0 cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/ hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqL MIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqX dZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+ak VqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/ 9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbO ts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3Zbe HN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7Zzu KO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+ 3P9t//9wYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKDnZjZ3QAAAAAAAAAAQABAAAAAAAAAAEA AAABAAAAAAAAAAEAAAABAAAAAAAAAAEAAG5kaW4AAAAAAAAANgAAp0AAAFWAAABMwAAAnsAAACWAAAAM wAAAUAAAAFRAAAIzMwACMzMAAjMzAAAAAAAAAABzZjMyAAAAAAABDHIAAAX4///zHQAAB7oAAP1y///7 nf///aQAAAPZAADAcW1tb2QAAAAAAAAGEAAAoA4AAAAAyc58GAAAAAAAAAAAAAAAAAAAAADSJSYnKFok Y2xhc3NuYW1lWCRjbGFzc2VzXxAQTlNCaXRtYXBJbWFnZVJlcKMnKSpaTlNJbWFnZVJlcFhOU09iamVj dNIlJiwtV05TQXJyYXmiLCrSJSYvMF5OU011dGFibGVBcnJheaMvLCrTMjMKNDU2V05TV2hpdGVcTlND b2xvclNwYWNlRDAgMAAQA4AM0iUmODlXTlNDb2xvcqI4KtIlJjs8V05TSW1hZ2WiOypfEA9OU0tleWVk QXJjaGl2ZXLRP0BUcm9vdIABAAAACAAAABEAAAAaAAAAIwAAAC0AAAAyAAAANwAAAEYAAABMAAAAVwAA AF4AAABlAAAAcgAAAHkAAACBAAAAgwAAAIUAAACKAAAAjAAAAI4AAACXAAAAnAAAAKcAAACpAAAAqwAA AK0AAACyAAAAtQAAALcAAAC5AAAAuwAAAL0AAADCAAAA2QAAANsAAADdAAEBUQABAVYAAQFhAAEBagAB AX0AAQGBAAEBjAABAZUAAQGaAAEBogABAaUAAQGqAAEBuQABAb0AAQHEAAEBzAABAdkAAQHeAAEB4AAB AeIAAQHnAAEB7wABAfIAAQH3AAEB/wABAgIAAQIUAAECFwABAhwAAAAAAAAEAQAAAAAAAABBAAAAAAAA AAAAAAAAAAECHg transmission-2.92/macosx/tr.lproj/PaxHeaders.4960/GroupRules.xib0000644000000000000000000000013212666747213021553 xustar0030 mtime=1457245835.363999472 30 atime=1457245835.363999472 30 ctime=1457295922.876856825 transmission-2.92/macosx/tr.lproj/GroupRules.xib0000644000175000017500000004157412666747213023213 0ustar00mikedldmikedld00000000000000 name comment name comment fFlatFileList.name allTrackersFlat fFlatFileList.name allTrackersFlat transmission-2.92/macosx/tr.lproj/PaxHeaders.4960/AddWindow.xib0000644000000000000000000000013212640354045021311 xustar0030 mtime=1451350053.040160636 30 atime=1451350053.040160636 30 ctime=1457295922.876856825 transmission-2.92/macosx/tr.lproj/AddWindow.xib0000644000175000017500000007304112640354045022743 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/tr.lproj/PaxHeaders.4960/GlobalOptionsPopover.xib0000644000000000000000000000013212640354045023560 xustar0030 mtime=1451350053.035160549 30 atime=1451350053.035160549 30 ctime=1457295922.876856825 transmission-2.92/macosx/tr.lproj/GlobalOptionsPopover.xib0000644000175000017500000006372312640354045025220 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/TrackerCell.m0000644000000000000000000000013212442116666017531 xustar0030 mtime=1418239414.206101279 30 atime=1418239414.206101279 30 ctime=1457295923.610869307 transmission-2.92/macosx/TrackerCell.m0000644000175000017500000003302012442116666021154 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: TrackerCell.m 13434 2012-08-13 00:52:04Z livings124 $ * * Copyright (c) 2009-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "TrackerCell.h" #import "TrackerNode.h" #import "transmission.h" // required by utils.h #import "utils.h" //tr_addressIsIP() #define PADDING_HORIZONAL 3.0 #define PADDING_STATUS_HORIZONAL 3.0 #define ICON_SIZE 16.0 #define PADDING_BETWEEN_ICON_AND_NAME 4.0 #define PADDING_ABOVE_ICON 1.0 #define PADDING_ABOVE_NAME 1.0 #define PADDING_BETWEEN_LINES 1.0 #define PADDING_BETWEEN_LINES_ON_SAME_LINE 4.0 #define COUNT_WIDTH 40.0 @interface TrackerCell (Private) - (NSImage *) favIcon; - (void) loadTrackerIcon: (NSString *) baseAddress; - (NSRect) imageRectForBounds: (NSRect) bounds; - (NSRect) rectForNameWithString: (NSAttributedString *) string inBounds: (NSRect) bounds; - (NSRect) rectForCountWithString: (NSAttributedString *) string withAboveRect: (NSRect) aboveRect inBounds: (NSRect) bounds; - (NSRect) rectForCountLabelWithString: (NSAttributedString *) string withRightRect: (NSRect) rightRect inBounds: (NSRect) bounds; - (NSRect) rectForStatusWithString: (NSAttributedString *) string withAboveRect: (NSRect) aboveRect withRightRect: (NSRect) rightRect inBounds: (NSRect) bounds; - (NSAttributedString *) attributedName; - (NSAttributedString *) attributedStatusWithString: (NSString *) statusString; - (NSAttributedString *) attributedCount: (NSInteger) count; @end @implementation TrackerCell //make the favicons accessible to all tracker cells NSCache * fTrackerIconCache; NSMutableSet * fTrackerIconLoading; + (void) initialize { fTrackerIconCache = [[NSCache alloc] init]; fTrackerIconLoading = [[NSMutableSet alloc] init]; } - (id) init { if ((self = [super init])) { NSMutableParagraphStyle * paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; [paragraphStyle setLineBreakMode: NSLineBreakByTruncatingTail]; fNameAttributes = [[NSMutableDictionary alloc] initWithObjectsAndKeys: [NSFont messageFontOfSize: 12.0], NSFontAttributeName, paragraphStyle, NSParagraphStyleAttributeName, nil]; fStatusAttributes = [[NSMutableDictionary alloc] initWithObjectsAndKeys: [NSFont messageFontOfSize: 9.0], NSFontAttributeName, paragraphStyle, NSParagraphStyleAttributeName, nil]; [paragraphStyle release]; } return self; } - (void) dealloc { [fNameAttributes release]; [fStatusAttributes release]; [super dealloc]; } - (id) copyWithZone: (NSZone *) zone { TrackerCell * copy = [super copyWithZone: zone]; copy->fNameAttributes = [fNameAttributes retain]; copy->fStatusAttributes = [fStatusAttributes retain]; return copy; } - (void) drawWithFrame: (NSRect) cellFrame inView: (NSView *) controlView { //icon [[self favIcon] drawInRect: [self imageRectForBounds: cellFrame] fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0 respectFlipped: YES hints: nil]; //set table colors NSColor * nameColor, * statusColor; if ([self backgroundStyle] == NSBackgroundStyleDark) nameColor = statusColor = [NSColor whiteColor]; else { nameColor = [NSColor controlTextColor]; statusColor = [NSColor darkGrayColor]; } [fNameAttributes setObject: nameColor forKey: NSForegroundColorAttributeName]; [fStatusAttributes setObject: statusColor forKey: NSForegroundColorAttributeName]; TrackerNode * node = (TrackerNode *)[self objectValue]; //name NSAttributedString * nameString = [self attributedName]; const NSRect nameRect = [self rectForNameWithString: nameString inBounds: cellFrame]; [nameString drawInRect: nameRect]; //count strings NSAttributedString * seederString = [self attributedCount: [node totalSeeders]]; const NSRect seederRect = [self rectForCountWithString: seederString withAboveRect: nameRect inBounds: cellFrame]; [seederString drawInRect: seederRect]; NSAttributedString * leecherString = [self attributedCount: [node totalLeechers]]; const NSRect leecherRect = [self rectForCountWithString: leecherString withAboveRect: seederRect inBounds: cellFrame]; [leecherString drawInRect: leecherRect]; NSAttributedString * downloadedString = [self attributedCount: [node totalDownloaded]]; const NSRect downloadedRect = [self rectForCountWithString: downloadedString withAboveRect: leecherRect inBounds: cellFrame]; [downloadedString drawInRect: downloadedRect]; //count label strings NSString * seederLabelBaseString = [NSLocalizedString(@"Seeders", "tracker peer stat") stringByAppendingFormat: @": "]; NSAttributedString * seederLabelString = [self attributedStatusWithString: seederLabelBaseString]; const NSRect seederLabelRect = [self rectForCountLabelWithString: seederLabelString withRightRect: seederRect inBounds: cellFrame]; [seederLabelString drawInRect: seederLabelRect]; NSString * leecherLabelBaseString = [NSLocalizedString(@"Leechers", "tracker peer stat") stringByAppendingFormat: @": "]; NSAttributedString * leecherLabelString = [self attributedStatusWithString: leecherLabelBaseString]; const NSRect leecherLabelRect = [self rectForCountLabelWithString: leecherLabelString withRightRect: leecherRect inBounds: cellFrame]; [leecherLabelString drawInRect: leecherLabelRect]; NSString * downloadedLabelBaseString = [NSLocalizedString(@"Downloaded", "tracker peer stat") stringByAppendingFormat: @": "]; NSAttributedString * downloadedLabelString = [self attributedStatusWithString: downloadedLabelBaseString]; const NSRect downloadedLabelRect = [self rectForCountLabelWithString: downloadedLabelString withRightRect: downloadedRect inBounds: cellFrame]; [downloadedLabelString drawInRect: downloadedLabelRect]; //status strings NSAttributedString * lastAnnounceString = [self attributedStatusWithString: [node lastAnnounceStatusString]]; const NSRect lastAnnounceRect = [self rectForStatusWithString: lastAnnounceString withAboveRect: nameRect withRightRect: seederLabelRect inBounds: cellFrame]; [lastAnnounceString drawInRect: lastAnnounceRect]; NSAttributedString * nextAnnounceString = [self attributedStatusWithString: [node nextAnnounceStatusString]]; const NSRect nextAnnounceRect = [self rectForStatusWithString: nextAnnounceString withAboveRect: lastAnnounceRect withRightRect: leecherLabelRect inBounds: cellFrame]; [nextAnnounceString drawInRect: nextAnnounceRect]; NSAttributedString * lastScrapeString = [self attributedStatusWithString: [node lastScrapeStatusString]]; const NSRect lastScrapeRect = [self rectForStatusWithString: lastScrapeString withAboveRect: nextAnnounceRect withRightRect: downloadedLabelRect inBounds: cellFrame]; [lastScrapeString drawInRect: lastScrapeRect]; } @end @implementation TrackerCell (Private) - (NSImage *) favIcon { id icon = nil; NSURL * address = [NSURL URLWithString: [(TrackerNode *)[self objectValue] fullAnnounceAddress]]; NSString * host; if ((host = [address host])) { //don't try to parse ip address const BOOL separable = !tr_addressIsIP([host UTF8String]); NSArray * hostComponents = separable ? [host componentsSeparatedByString: @"."] : nil; //let's try getting the tracker address without using any subdomains NSString * baseAddress; if (separable && [hostComponents count] > 1) baseAddress = [NSString stringWithFormat: @"http://%@.%@", [hostComponents objectAtIndex: [hostComponents count]-2], [hostComponents lastObject]]; else baseAddress = [NSString stringWithFormat: @"http://%@", host]; icon = [fTrackerIconCache objectForKey: baseAddress]; if (!icon && ![fTrackerIconLoading containsObject: baseAddress]) { [fTrackerIconLoading addObject: baseAddress]; [NSThread detachNewThreadSelector: @selector(loadTrackerIcon:) toTarget: self withObject: baseAddress]; } } return (icon && icon != [NSNull null]) ? icon : [NSImage imageNamed: @"FavIcon"]; } #warning better favicon detection - (void) loadTrackerIcon: (NSString *) baseAddress { @autoreleasepool { //try favicon.png NSURL * favIconUrl = [NSURL URLWithString: [baseAddress stringByAppendingPathComponent: @"favicon.png"]]; NSURLRequest * request = [NSURLRequest requestWithURL: favIconUrl cachePolicy: NSURLRequestUseProtocolCachePolicy timeoutInterval: 30.0]; NSData * iconData = [NSURLConnection sendSynchronousRequest: request returningResponse: NULL error: NULL]; NSImage * icon = [[NSImage alloc] initWithData: iconData]; //try favicon.ico if (!icon) { favIconUrl = [NSURL URLWithString: [baseAddress stringByAppendingPathComponent: @"favicon.ico"]]; request = [NSURLRequest requestWithURL: favIconUrl cachePolicy: NSURLRequestUseProtocolCachePolicy timeoutInterval: 30.0]; iconData = [NSURLConnection sendSynchronousRequest: request returningResponse: NULL error: NULL]; icon = [[NSImage alloc] initWithData: iconData]; } if (icon) { [fTrackerIconCache setObject: icon forKey: baseAddress]; [icon release]; [[self controlView] setNeedsDisplay: YES]; } else [fTrackerIconCache setObject: [NSNull null] forKey: baseAddress]; [fTrackerIconLoading removeObject: baseAddress]; } } - (NSRect) imageRectForBounds: (NSRect) bounds { return NSMakeRect(NSMinX(bounds) + PADDING_HORIZONAL, NSMinY(bounds) + PADDING_ABOVE_ICON, ICON_SIZE, ICON_SIZE); } - (NSRect) rectForNameWithString: (NSAttributedString *) string inBounds: (NSRect) bounds { NSRect result; result.origin.x = NSMinX(bounds) + PADDING_HORIZONAL + ICON_SIZE + PADDING_BETWEEN_ICON_AND_NAME; result.origin.y = NSMinY(bounds) + PADDING_ABOVE_NAME; result.size.height = [string size].height; result.size.width = NSMaxX(bounds) - NSMinX(result) - PADDING_HORIZONAL; return result; } - (NSRect) rectForCountWithString: (NSAttributedString *) string withAboveRect: (NSRect) aboveRect inBounds: (NSRect) bounds { return NSMakeRect(NSMaxX(bounds) - PADDING_HORIZONAL - COUNT_WIDTH, NSMaxY(aboveRect) + PADDING_BETWEEN_LINES, COUNT_WIDTH, [string size].height); } - (NSRect) rectForCountLabelWithString: (NSAttributedString *) string withRightRect: (NSRect) rightRect inBounds: (NSRect) bounds { NSRect result = rightRect; result.size.width = [string size].width; result.origin.x -= NSWidth(result); return result; } - (NSRect) rectForStatusWithString: (NSAttributedString *) string withAboveRect: (NSRect) aboveRect withRightRect: (NSRect) rightRect inBounds: (NSRect) bounds { NSRect result; result.origin.x = NSMinX(bounds) + PADDING_STATUS_HORIZONAL; result.origin.y = NSMaxY(aboveRect) + PADDING_BETWEEN_LINES; result.size.height = [string size].height; result.size.width = NSMinX(rightRect) - PADDING_BETWEEN_LINES_ON_SAME_LINE - NSMinX(result); return result; } - (NSAttributedString *) attributedName { NSString * name = [(TrackerNode *)[self objectValue] host]; return [[[NSAttributedString alloc] initWithString: name attributes: fNameAttributes] autorelease]; } - (NSAttributedString *) attributedStatusWithString: (NSString *) statusString { return [[[NSAttributedString alloc] initWithString: statusString attributes: fStatusAttributes] autorelease]; } - (NSAttributedString *) attributedCount: (NSInteger) count { NSString * countString = count != -1 ? [NSString stringWithFormat: @"%ld", count] : NSLocalizedString(@"N/A", "tracker peer stat"); return [[[NSAttributedString alloc] initWithString: countString attributes: fStatusAttributes] autorelease]; } @end transmission-2.92/macosx/PaxHeaders.4960/ExpandedPathToPathTransformer.h0000644000000000000000000000013212442116643023234 xustar0030 mtime=1418239395.809786026 30 atime=1418239395.809786026 30 ctime=1457295923.065860039 transmission-2.92/macosx/ExpandedPathToPathTransformer.h0000644000175000017500000000272312442116643024665 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: ExpandedPathToPathTransformer.h 13251 2012-03-13 02:52:11Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface ExpandedPathToPathTransformer : NSValueTransformer { } @endtransmission-2.92/macosx/PaxHeaders.4960/InfoPeersView.xib0000644000000000000000000000013012666747213020415 xustar0030 mtime=1457245835.354999317 28 atime=1457245835.3539993 30 ctime=1457295922.438849377 transmission-2.92/macosx/InfoPeersView.xib0000644000175000017500000010100712666747213022043 0ustar00mikedldmikedld00000000000000 Multiline Label Multiline Label YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7MTQsIDE0fdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPERxuTU0AKgAADEgAAAAAAAAA AAAAAAAAAAAAAAAAAAMBAAcVCQE3Hw4CSlArDoxSLA6RMRoIZygVB1sSCQBCDgcAPAsEADQKBAAyBgAA KQUAACYAAAAeAAAAGgAAABAAAAANAAAABgAAAAUAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAABAAAA AQEBAQUEAgENFQoCOyERBE9cNRSWYTkWnEgsEXlAKA9vKhoJVyUXB1EgEQVJHg8FRhcLAzsVCQM4DQgC LQsHAikIAwEcBwMBGAMBABEDAQAOAAAABwAAAAYAAAAAAAAAAAAAAAEAAAACBAQEDAUFBRENDA0kEA4O LhwPCFYxHg5so3M3zrqEP+DQlUjm0JNH5bd8N9mwdDLUnF0lw5VXIr19SRqqdUQYo101EYtUMA+COB4J ZDAZB1wcDgJLFgsBRAUBACYCAAAdAAAABgAAAAIAAAABAAAAAwYGBhEJCQkZFxYXQRsZGU0jGRNrNycY gKt7PdnEjUbq56pV+eqrVfnUk0bwzYxB7Lt2Mty0by7Xm2Emw5RcI7x8Shmoc0QWn1UwEIFLKQ15MBgF ZiYTBFsIAgAuAwAAIgAAAAYAAAACAAAAAAICAgYODg8qGRkaRlBRUc9WWFjjSEtN2FBOSdmPbT7rpXtC 8Oq2Zvz1wG3+98Rx+/fEcPv0u2P59Llf+PGzVfjwr1D37aFB8uqaPPHbfy3uznQo6I5JGst0OhWzGgsC PwoDACcBAAAFAAAAAAAAAAACAgIHERITMh4fIFFdXl7nZmdo/VpfYutfYF3qjW5H76B7SfHpuGz99sNz /vzNev39zXj9+sNq/vrBZv76vFv/+rlX//2sR//8pkL/8Y0y/+OBLfqcUR3bf0AXwh4PBksNBgMxAQAA BwAAAAEAAAAAAwMDCRobHEQpKixjcHN16YGEh/+foaf8oqGl/JSEef2diHP937t9/+zGf//90oP//M9/ /+auZP/ip1//2qFY/9ufVf/tnEn/8JpE//GPOP/jhTP6jlAg3HNCHcsoHxiAGRYVZgQEBBUBAQEHAAAA AAQEBAocHh9MLC4wa3Z6feqJjZD/s7S4/7a1t/+fkon/pJOC/927gP/pxID//NKF//vOgP/hqWL/3KJd /9KaXf/UmVr/6ppK/+6YRv/ykTn/5Yc1+45XKuB0SifSMikjmCIgH34FBQUZAQEBCQEBAQQGBgcSJykq aTk7PYiFiJLunqGo/+rl1//y69r/2M27/9TFr//VtIb/2raA//XMgv/1yH3/1p9i/8+YYf/Cl3j/xZh2 /+ObUv/pm0v/8ZpD/+eWRf+lfFv6kXNd+FpaVu5HS0vRDg4OLQQEBBIBAQEFBwcHFSssLnE9P0KQiYyW 8KKlrP/y7tz//PXf/+PWvv/dzLL/0rOI/9Wzgf/0y4L/9cl9/9qiZP/Tm2P/w5h6/8aYeP/lnVT/651N /++aRP/ml0j/q4Zn/5h+av5iY2D4TlNT2w8PDy4EBAQSAgICBwkKCho3OTuLSk1QqpCXofOorrT/8/LU //340v/v2qT/6NCa/8atkP/IrI3/8cuF//fNgf/zvGv/77Zn/9ugZ//bnmT/86lY//SoU//mlED/3pJG /7mYfv+okYP6Z2dk2lFUVLwNDQ4oAgICDwICAggKCgobOz0/lE5RVbKUmqP0q7G2//Px1P/+99D/8tue /+vRlP/IrY7/yKyM/+7Hgf/1yn3/98Fs//S7Z//goWD/4J5d//SsWP/1qlT/5JNA/9uRR/+7moH/qpSF +WVlZdBPUlSyDQ0NJgICAg4EBAQMDQ4OIkZHSKhbXV/Goaet97e7vv/17tn///LS//vbkf/20ob/2rOB /9euff/er2n/47Jm//jAZ//3vWT/35lP/9+XTP/7r1L/+65Q/9+SQv/Vj0n/tZmF/6OSiPVZWVm1REZI lwoLCx0BAQEJBAQEDA4ODiNIS0yuXmFjzKarsPi7v8L/9u7c///z1v/53Jf/9NOL/9m0hP/VrX//16Rk /9ynYP/3v2f/971k/+KcTP/imkr/+7BR//uvUP/dk0T/05BL/7KYhv+fkIfzVFRUqz9BQ40JCgoaAQEB CAMEBQ8OEBEpU1ZWwWpubt+yuLr7xsvN//f39P/9+/T/6uTL/+LZv//Cq5//vZ6S/8GDYf/Jh1r/9b5k //vEY//0sVL/9K9P//6zT//6sE//2JRP/8yQV/+kkYP/kIV/70BBQoktLzFqBgYGFAAAAAUDBAUQDxAR KlVZWsdtcXPktbu8/MjOz//39/n//Pv6/+ro2P/j3c3/xamm/8CcmP/CgWj/yYVg//K9Zf/4xGP/+LdW //i1U//+s07/+q9O/9WVVP/JkFz/n4+B/4qCfe06OzuAJyoqYQUFBhEAAAAEBQUFERISEi1bYGLWc3l7 87i8wv7JzdT/7PHz//P3+f/3+/n/9/Hu//evsv/yo6X/25mT/9qci//ntmz/7Ltm//zGYP/+xF3/+rJL //SsTP/OmWT/v5Rr/5CEfv96dXTpJigoYxYYGEQDAwMJAAAAAAYGBhQTExQwXWFj2nR5fPeyt77+wcfN /+Dm6//n7fH/8vb3//Xt7//7srT/96eo/9yioP/ZpJf/37Ju/+S3Z//8x2H//8Zd//mxS//yq0z/zZpp /76UcP+Jgnz+c3Fx5yMjI1wTFBQ9AgICCAAAAAALCwsgFxcYO2BhY+Nxc3b+jJSe/5Ocpv+gqrX/p7C7 /8XJz//Ny8//4Lu4/9+5tf/EvLv/v7iy/7ygeP/Dom3/98Jh//7DXf/3q0v/8KVP/8efff+3mYL+fHh3 8mVmaNkYGxtNCg0NLwEBAQYAAAAADAwMIBcXFzlYWVvSZmhr63uCiu+AiJHwiZOd9JCao/aws7r4uLe8 +cyyrfvMsaz7tLW1/rCxrf6tlXb/tpdr//O9YP/8v1z/9ahK/+2jT//Bm3z/sJSA/XVycuxfYGPSFhgY RwkLCyoBAQEFAAAAAAkJCRcNDQ0jJiYmZCsrK3M1NjaHOTo6j0dJSq5MTlC2XV1dzGFhYdJra2zgbW5v 5WxydvNtcnT2dW5i/oV1Xf/bo1T/66lS/++hTP/km0//oH9l/4t2ZvlVV1fSRElLtxARETUHBwccAQEB BAAAAAAICAgTCgoKGxsbGkkeHh1UJCQjaCgoJ3A2NjaROzs7mkdHR7BKS0u3UlZXyFRYWs1XXmLdWV5h 4mJeVu1yZlPxzpVO+t+dTfvqmkr/35RM/5J0Xfp9al3yS0xMxDs/QagPEBAvBwcHGAAAAAMAAAAAAQEB AgEBAQMEBAQKBAQECwUFBQ8HBwcTDg4OJRERESsXFxc5GBgYPR0eHkoeHx9PIiIjYCMjJGknJSGONi0i nY1aLNOjZi/g0H059Md5O/NlTjzbUEM6yy0tLoYjJSdtCQkJGQQEBAoAAAABAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAQEBAggICBIJCQkWDg4OIA8PDyQREREvEhISMxcXF0MYGBdMGRgWcScgGIJ5SyLCj1cm 0cRzM+28cDXrVkEwxEA2LrIkJCVvHB0fWQYHBxMDAwMHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAABAQECAQEBAgICAgQCAgIEAgICBwICAggDAwMIAwMDDAMDAyIMCAQxQCMMeFMuEI6VVB7IjlAe wCQYEFkSDg1CCQgIHgcHBxYBAQEEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAATBwMBITMbB2ZEJAp8hEkZun5GGLEaEApBCQcH KgUEBA8EBAQKAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgQBABAcDgRKJhMFXE0nDItJJgyDCwYBIAEBAA4AAAADAAAA AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAMDAQAMGQsDRSIPBFZDIgqDQCEKewkEARsAAAAKAAAAAQAAAAAAAAAAAAAA AAAAAAAAAAAAABEBAAADAAAAAQAcAAABAQADAAAAAQAcAAABAgADAAAABAAADSoBAwADAAAAAQABAAAB BgADAAAAAQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAEAAABFgADAAAAAQAcAAAB FwAEAAAAAQAADEABGgAFAAAAAQAADRoBGwAFAAAAAQAADSIBHAADAAAAAQABAAABKAADAAAAAQACAAAB UgADAAAAAQABAAABUwADAAAABAAADTKHcwAHAAAPNAAADToAAAAAAAAAkAAAAAEAAACQAAAAAQAIAAgA CAAIAAEAAQABAAEAAA80YXBwbAIQAABtbnRyUkdCIFhZWiAH3wAMAAUADQASAAhhY3NwQVBQTAAAAABB UFBMAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAABFkZXNjAAABUAAAAGJkc2NtAAABtAAABBpjcHJ0AAAF0AAAACN3 dHB0AAAF9AAAABRyWFlaAAAGCAAAABRnWFlaAAAGHAAAABRiWFlaAAAGMAAAABRyVFJDAAAGRAAACAxh YXJnAAAOUAAAACB2Y2d0AAAOcAAAADBuZGluAAAOoAAAAD5jaGFkAAAO4AAAACxtbW9kAAAPDAAAAChi VFJDAAAGRAAACAxnVFJDAAAGRAAACAxhYWJnAAAOUAAAACBhYWdnAAAOUAAAACBkZXNjAAAAAAAAAAhE aXNwbGF5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAAAAAiAAAADGhySFIAAAAUAAABqGtvS1IA AAAMAAABvG5iTk8AAAASAAAByGlkAAAAAAASAAAB2mh1SFUAAAAUAAAB7GNzQ1oAAAAWAAACAGRhREsA AAAcAAACFnVrVUEAAAAcAAACMmFyAAAAAAAUAAACTml0SVQAAAAUAAACYnJvUk8AAAASAAACdm5sTkwA AAAWAAACiGhlSUwAAAAWAAACnmVzRVMAAAASAAACdmZpRkkAAAAQAAACtHpoVFcAAAAMAAACxHZpVk4A AAAOAAAC0HNrU0sAAAAWAAAC3npoQ04AAAAMAAACxHJ1UlUAAAAkAAAC9GZyRlIAAAAWAAADGG1zAAAA AAASAAADLmNhRVMAAAAYAAADQHRoVEgAAAAMAAADWGVzWEwAAAASAAACdmRlREUAAAAQAAADZGVuVVMA AAASAAADdHB0QlIAAAAYAAADhnBsUEwAAAASAAADnmVsR1IAAAAiAAADsHN2U0UAAAAQAAAD0nRyVFIA AAAUAAAD4mphSlAAAAAOAAAD9nB0UFQAAAAWAAAEBABMAEMARAAgAHUAIABiAG8AagBpzuy37AAgAEwA QwBEAEYAYQByAGcAZQAtAEwAQwBEAEwAQwBEACAAVwBhAHIAbgBhAFMAegDtAG4AZQBzACAATABDAEQA QgBhAHIAZQB2AG4A/QAgAEwAQwBEAEwAQwBEAC0AZgBhAHIAdgBlAHMAawDmAHIAbQQaBD4EOwRMBD4E QAQ+BDIEOAQ5ACAATABDAEQgDwBMAEMARAAgBkUGRAZIBkYGKQBMAEMARAAgAGMAbwBsAG8AcgBpAEwA QwBEACAAYwBvAGwAbwByAEsAbABlAHUAcgBlAG4ALQBMAEMARCAPAEwAQwBEACAF5gXRBeIF1QXgBdkA VgDkAHIAaQAtAEwAQwBEX2mCcgAgAEwAQwBEAEwAQwBEACAATQDgAHUARgBhAHIAZQBiAG4A6QAgAEwA QwBEBCYEMgQ1BEIEPQQ+BDkAIAQWBBoALQQ0BDgEQQQ/BDsENQQ5AEwAQwBEACAAYwBvAHUAbABlAHUA cgBXAGEAcgBuAGEAIABMAEMARABMAEMARAAgAGUAbgAgAGMAbwBsAG8AcgBMAEMARAAgDioONQBGAGEA cgBiAC0ATABDAEQAQwBvAGwAbwByACAATABDAEQATABDAEQAIABDAG8AbABvAHIAaQBkAG8ASwBvAGwA bwByACAATABDAEQDiAOzA8cDwQPJA7wDtwAgA78DuAPMA70DtwAgAEwAQwBEAEYA5AByAGcALQBMAEMA RABSAGUAbgBrAGwAaQAgAEwAQwBEMKsw6TD8ACAATABDAEQATABDAEQAIABhACAAQwBvAHIAZQBzAAB0 ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBJbmMuLCAyMDE1AABYWVogAAAAAAAA8xYAAQAAAAEWylhZWiAA AAAAAABxwAAAOYoAAAFnWFlaIAAAAAAAAGEjAAC55gAAE/ZYWVogAAAAAAAAI/IAAAyQAAC90GN1cnYA AAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANgA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwA gQCGAIsAkACVAJoAnwCjAKgArQCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkB HwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB +gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYD IQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwE mgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkG agZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIII lgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsL Igs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgO Ew4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8R bRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIV NBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZ axmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHewe Fh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwoj OCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo 1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu 7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01 hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8 pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANE R0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpM cky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtV KFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpe bF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+lo P2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwckty pnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9 oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6J M4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSV X5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobai JqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxav i7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9 j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bM Ncy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvb gNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXr cOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8 B/yY/Sn9uv5L/tz/bf//cGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACg52Y2d0AAAAAAAAAAEA AQAAAAAAAAABAAAAAQAAAAAAAAABAAAAAQAAAAAAAAABAABuZGluAAAAAAAAADYAAKdAAABVgAAATMAA AJ7AAAAlgAAADMAAAFAAAABUQAACMzMAAjMzAAIzMwAAAAAAAAAAc2YzMgAAAAAAAQxyAAAF+P//8x0A AAe6AAD9cv//+53///2kAAAD2QAAwHFtbW9kAAAAAAAABhAAAKAOAAAAAMnOfBgAAAAAAAAAAAAAAAAA AAAA0iUmJyhaJGNsYXNzbmFtZVgkY2xhc3Nlc18QEE5TQml0bWFwSW1hZ2VSZXCjJykqWk5TSW1hZ2VS ZXBYTlNPYmplY3TSJSYsLVdOU0FycmF5oiwq0iUmLzBeTlNNdXRhYmxlQXJyYXmjLywq0zIzCjQ1NldO U1doaXRlXE5TQ29sb3JTcGFjZUQwIDAAEAOADNIlJjg5V05TQ29sb3KiOCrSJSY7PFdOU0ltYWdlojsq XxAPTlNLZXllZEFyY2hpdmVy0T9AVHJvb3SAAQAIABEAGgAjAC0AMgA3AEYATABXAF4AZQByAHkAgQCD AIUAigCMAI4AlwCcAKcAqQCrAK0AsgC1ALcAuQC7AL0AwgDZANsA3R1PHVQdXx1oHXsdfx2KHZMdmB2g HaMdqB23Hbsdwh3KHdcd3B3eHeAd5R3tHfAd9R39HgAeEh4VHhoAAAAAAAACAQAAAAAAAABBAAAAAAAA AAAAAAAAAAAeHA transmission-2.92/macosx/PaxHeaders.4960/BlocklistDownloaderViewController.h0000644000000000000000000000013112442116616024167 xustar0029 mtime=1418239374.02041262 30 atime=1418239374.019412603 30 ctime=1457295922.949858066 transmission-2.92/macosx/BlocklistDownloaderViewController.h0000644000175000017500000000404212442116616025615 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: BlocklistDownloaderViewController.h 13251 2012-03-13 02:52:11Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import @class PrefsController; @interface BlocklistDownloaderViewController : NSObject { PrefsController * fPrefsController; IBOutlet NSWindow * fStatusWindow; IBOutlet NSProgressIndicator * fProgressBar; IBOutlet NSTextField * fTextField; IBOutlet NSButton * fButton; } + (void) downloadWithPrefsController: (PrefsController *) prefsController; - (void) cancelDownload: (id) sender; - (void) setStatusStarting; - (void) setStatusProgressForCurrentSize: (NSUInteger) currentSize expectedSize: (long long) expectedSize; - (void) setStatusProcessing; - (void) setFinished; - (void) setFailed: (NSString *) error; @end transmission-2.92/macosx/PaxHeaders.4960/FilterBarController.h0000644000000000000000000000013212442116641021240 xustar0030 mtime=1418239393.124740013 30 atime=1418239393.124740013 30 ctime=1457295923.137861263 transmission-2.92/macosx/FilterBarController.h0000644000175000017500000000466112442116641022674 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: FilterBarController.h 13414 2012-07-25 12:49:11Z livings124 $ * * Copyright (c) 2011-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @class FilterButton; #define FILTER_NONE @"None" #define FILTER_ACTIVE @"Active" #define FILTER_DOWNLOAD @"Download" #define FILTER_SEED @"Seed" #define FILTER_PAUSE @"Pause" #define FILTER_TYPE_NAME @"Name" #define FILTER_TYPE_TRACKER @"Tracker" #define GROUP_FILTER_ALL_TAG -2 @interface FilterBarController : NSViewController { IBOutlet FilterButton * fNoFilterButton, * fActiveFilterButton, * fDownloadFilterButton, * fSeedFilterButton, * fPauseFilterButton; IBOutlet NSSearchField * fSearchField; IBOutlet NSPopUpButton * fGroupsButton; } - (id) init; - (void) setFilter: (id) sender; - (void) switchFilter: (BOOL) right; - (void) setSearchText: (id) sender; - (void) setSearchType: (id) sender; - (void) setGroupFilter: (id) sender; - (void) reset: (BOOL) updateUI; - (NSArray *) searchStrings; - (void) focusSearchField; - (void) setCountAll: (NSUInteger) all active: (NSUInteger) active downloading: (NSUInteger) downloading seeding: (NSUInteger) seeding paused: (NSUInteger) paused; @end transmission-2.92/macosx/PaxHeaders.4960/FilterButton.h0000644000000000000000000000013212442116666017752 xustar0030 mtime=1418239414.201101194 30 atime=1418239414.201101194 30 ctime=1457295923.161861671 transmission-2.92/macosx/FilterButton.h0000644000175000017500000000273512442116666021406 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: FilterButton.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface FilterButton : NSButton { NSUInteger fCount; } - (void) setCount: (NSUInteger) count; @end transmission-2.92/macosx/PaxHeaders.4960/NSImageAdditions.h0000644000000000000000000000013212442116666020453 xustar0030 mtime=1418239414.195101091 30 atime=1418239414.195101091 30 ctime=1457295923.367865174 transmission-2.92/macosx/NSImageAdditions.h0000644000175000017500000000271612442116666022106 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: NSImageAdditions.h 14226 2014-01-19 01:29:38Z jordan $ * * Copyright (c) 2011-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface NSImage (NSImageAdditions) - (NSImage *) imageWithColor: (NSColor *) color; @end transmission-2.92/macosx/PaxHeaders.4960/NSApplicationAdditions.h0000644000000000000000000000013212644245522021672 xustar0030 mtime=1452362578.780699537 30 atime=1452362578.780699537 30 ctime=1457295923.356864988 transmission-2.92/macosx/NSApplicationAdditions.h0000644000175000017500000000331012644245522023314 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: NSApplicationAdditions.h 14662 2016-01-06 11:05:37Z mikedld $ * * Copyright (c) 2009-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #define NSByteCountFormatterMtLion NSClassFromString(@"NSByteCountFormatter") #define NSUserNotificationMtLion NSClassFromString(@"NSUserNotification") #define NSUserNotificationCenterMtLion NSClassFromString(@"NSUserNotificationCenter") @interface NSApplication (NSApplicationAdditions) - (BOOL) isOnMountainLionOrBetter; - (BOOL) isOnYosemiteOrBetter; @end transmission-2.92/macosx/PaxHeaders.4960/ButtonToolbarItem.h0000644000000000000000000000013212442116666020746 xustar0030 mtime=1418239414.211101365 30 atime=1418239414.211101365 30 ctime=1457295922.983858645 transmission-2.92/macosx/ButtonToolbarItem.h0000644000175000017500000000265512442116666022403 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: ButtonToolbarItem.h 13251 2012-03-13 02:52:11Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface ButtonToolbarItem : NSToolbarItem { } @end transmission-2.92/macosx/PaxHeaders.4960/GroupsController.m0000644000000000000000000000013212442116666020661 xustar0030 mtime=1418239414.204101245 30 atime=1418239414.204101245 30 ctime=1457295923.188862131 transmission-2.92/macosx/GroupsController.m0000644000175000017500000003655312442116666022322 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: GroupsController.m 13340 2012-06-10 02:35:58Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "GroupsController.h" #import "NSMutableArrayAdditions.h" #define ICON_WIDTH 16.0 #define ICON_WIDTH_SMALL 12.0 @interface GroupsController (Private) - (void) saveGroups; - (NSImage *) imageForGroup: (NSMutableDictionary *) dict; - (BOOL) torrent: (Torrent *) torrent doesMatchRulesForGroupAtIndex: (NSInteger) index; @end @implementation GroupsController GroupsController * fGroupsInstance = nil; + (GroupsController *) groups { if (!fGroupsInstance) fGroupsInstance = [[GroupsController alloc] init]; return fGroupsInstance; } - (id) init { if ((self = [super init])) { NSData * data; if ((data = [[NSUserDefaults standardUserDefaults] dataForKey: @"GroupDicts"])) fGroups = [[NSKeyedUnarchiver unarchiveObjectWithData: data] retain]; else if ((data = [[NSUserDefaults standardUserDefaults] dataForKey: @"Groups"])) //handle old groups { fGroups = [[NSUnarchiver unarchiveObjectWithData: data] retain]; [[NSUserDefaults standardUserDefaults] removeObjectForKey: @"Groups"]; [self saveGroups]; } else { //default groups NSMutableDictionary * red = [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSColor redColor], @"Color", NSLocalizedString(@"Red", "Groups -> Name"), @"Name", [NSNumber numberWithInteger: 0], @"Index", nil]; NSMutableDictionary * orange = [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSColor orangeColor], @"Color", NSLocalizedString(@"Orange", "Groups -> Name"), @"Name", [NSNumber numberWithInteger: 1], @"Index", nil]; NSMutableDictionary * yellow = [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSColor yellowColor], @"Color", NSLocalizedString(@"Yellow", "Groups -> Name"), @"Name", [NSNumber numberWithInteger: 2], @"Index", nil]; NSMutableDictionary * green = [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSColor greenColor], @"Color", NSLocalizedString(@"Green", "Groups -> Name"), @"Name", [NSNumber numberWithInteger: 3], @"Index", nil]; NSMutableDictionary * blue = [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSColor blueColor], @"Color", NSLocalizedString(@"Blue", "Groups -> Name"), @"Name", [NSNumber numberWithInteger: 4], @"Index", nil]; NSMutableDictionary * purple = [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSColor purpleColor], @"Color", NSLocalizedString(@"Purple", "Groups -> Name"), @"Name", [NSNumber numberWithInteger: 5], @"Index", nil]; NSMutableDictionary * gray = [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSColor grayColor], @"Color", NSLocalizedString(@"Gray", "Groups -> Name"), @"Name", [NSNumber numberWithInteger: 6], @"Index", nil]; fGroups = [[NSMutableArray alloc] initWithObjects: red, orange, yellow, green, blue, purple, gray, nil]; [self saveGroups]; //make sure this is saved right away } } return self; } - (void) dealloc { [fGroups release]; [super dealloc]; } - (NSInteger) numberOfGroups { return [fGroups count]; } - (NSInteger) rowValueForIndex: (NSInteger) index { if (index != -1) { for (NSInteger i = 0; i < [fGroups count]; i++) if (index == [[[fGroups objectAtIndex: i] objectForKey: @"Index"] integerValue]) return i; } return -1; } - (NSInteger) indexForRow: (NSInteger) row { return [[[fGroups objectAtIndex: row] objectForKey: @"Index"] integerValue]; } - (NSString *) nameForIndex: (NSInteger) index { NSInteger orderIndex = [self rowValueForIndex: index]; return orderIndex != -1 ? [[fGroups objectAtIndex: orderIndex] objectForKey: @"Name"] : nil; } - (void) setName: (NSString *) name forIndex: (NSInteger) index { NSInteger orderIndex = [self rowValueForIndex: index]; [[fGroups objectAtIndex: orderIndex] setObject: name forKey: @"Name"]; [self saveGroups]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateGroups" object: self]; } - (NSImage *) imageForIndex: (NSInteger) index { NSInteger orderIndex = [self rowValueForIndex: index]; return orderIndex != -1 ? [self imageForGroup: [fGroups objectAtIndex: orderIndex]] : [NSImage imageNamed: @"GroupsNoneTemplate"]; } - (NSColor *) colorForIndex: (NSInteger) index { NSInteger orderIndex = [self rowValueForIndex: index]; return orderIndex != -1 ? [[fGroups objectAtIndex: orderIndex] objectForKey: @"Color"] : nil; } - (void) setColor: (NSColor *) color forIndex: (NSInteger) index { NSMutableDictionary * dict = [fGroups objectAtIndex: [self rowValueForIndex: index]]; [dict removeObjectForKey: @"Icon"]; [dict setObject: color forKey: @"Color"]; [[GroupsController groups] saveGroups]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateGroups" object: self]; } - (BOOL) usesCustomDownloadLocationForIndex: (NSInteger) index { if (![self customDownloadLocationForIndex: index]) return NO; NSInteger orderIndex = [self rowValueForIndex: index]; return [[[fGroups objectAtIndex: orderIndex] objectForKey: @"UsesCustomDownloadLocation"] boolValue]; } - (void) setUsesCustomDownloadLocation: (BOOL) useCustomLocation forIndex: (NSInteger) index { NSMutableDictionary * dict = [fGroups objectAtIndex: [self rowValueForIndex: index]]; [dict setObject: [NSNumber numberWithBool: useCustomLocation] forKey: @"UsesCustomDownloadLocation"]; [[GroupsController groups] saveGroups]; } - (NSString *) customDownloadLocationForIndex: (NSInteger) index { NSInteger orderIndex = [self rowValueForIndex: index]; return orderIndex != -1 ? [[fGroups objectAtIndex: orderIndex] objectForKey: @"CustomDownloadLocation"] : nil; } - (void) setCustomDownloadLocation: (NSString *) location forIndex: (NSInteger) index { NSMutableDictionary * dict = [fGroups objectAtIndex: [self rowValueForIndex: index]]; [dict setObject: location forKey: @"CustomDownloadLocation"]; [[GroupsController groups] saveGroups]; } - (BOOL) usesAutoAssignRulesForIndex: (NSInteger) index { NSInteger orderIndex = [self rowValueForIndex: index]; if (orderIndex == -1) return NO; NSNumber * assignRules = [[fGroups objectAtIndex: orderIndex] objectForKey: @"UsesAutoGroupRules"]; return assignRules && [assignRules boolValue]; } - (void) setUsesAutoAssignRules: (BOOL) useAutoAssignRules forIndex: (NSInteger) index { NSMutableDictionary * dict = [fGroups objectAtIndex: [self rowValueForIndex: index]]; [dict setObject: [NSNumber numberWithBool: useAutoAssignRules] forKey: @"UsesAutoGroupRules"]; [[GroupsController groups] saveGroups]; } - (NSPredicate *) autoAssignRulesForIndex: (NSInteger) index { NSInteger orderIndex = [self rowValueForIndex: index]; if (orderIndex == -1) return nil; return [[fGroups objectAtIndex: orderIndex] objectForKey: @"AutoGroupRules"]; } - (void) setAutoAssignRules: (NSPredicate *) predicate forIndex: (NSInteger) index { NSMutableDictionary * dict = [fGroups objectAtIndex: [self rowValueForIndex: index]]; if (predicate) { [dict setObject: predicate forKey: @"AutoGroupRules"]; [[GroupsController groups] saveGroups]; } else { [dict removeObjectForKey: @"AutoGroupRules"]; [self setUsesAutoAssignRules: NO forIndex: index]; } } - (void) addNewGroup { //find the lowest index NSMutableIndexSet * candidates = [NSMutableIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fGroups count]+1)]; for (NSDictionary * dict in fGroups) [candidates removeIndex: [[dict objectForKey: @"Index"] integerValue]]; const NSInteger index = [candidates firstIndex]; [fGroups addObject: [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInteger: index], @"Index", [NSColor colorWithCalibratedRed: 0.0 green: 0.65 blue: 1.0 alpha: 1.0], @"Color", @"", @"Name", nil]]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateGroups" object: self]; [self saveGroups]; } - (void) removeGroupWithRowIndex: (NSInteger) row { NSInteger index = [[[fGroups objectAtIndex: row] objectForKey: @"Index"] integerValue]; [fGroups removeObjectAtIndex: row]; [[NSNotificationCenter defaultCenter] postNotificationName: @"GroupValueRemoved" object: self userInfo: [NSDictionary dictionaryWithObject: [NSNumber numberWithInteger: index] forKey: @"Index"]]; if (index == [[NSUserDefaults standardUserDefaults] integerForKey: @"FilterGroup"]) [[NSUserDefaults standardUserDefaults] setInteger: -2 forKey: @"FilterGroup"]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateGroups" object: self]; [self saveGroups]; } - (void) moveGroupAtRow: (NSInteger) oldRow toRow: (NSInteger) newRow { [fGroups moveObjectAtIndex: oldRow toIndex: newRow]; [self saveGroups]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateGroups" object: self]; } - (NSMenu *) groupMenuWithTarget: (id) target action: (SEL) action isSmall: (BOOL) small { NSMenu * menu = [[NSMenu alloc] initWithTitle: @"Groups"]; NSMenuItem * item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString(@"None", "Groups -> Menu") action: action keyEquivalent: @""]; [item setTarget: target]; [item setTag: -1]; NSImage * icon = [NSImage imageNamed: @"GroupsNoneTemplate"]; if (small) { icon = [icon copy]; [icon setSize: NSMakeSize(ICON_WIDTH_SMALL, ICON_WIDTH_SMALL)]; [item setImage: icon]; [icon release]; } else [item setImage: icon]; [menu addItem: item]; [item release]; for (NSMutableDictionary * dict in fGroups) { item = [[NSMenuItem alloc] initWithTitle: [dict objectForKey: @"Name"] action: action keyEquivalent: @""]; [item setTarget: target]; [item setTag: [[dict objectForKey: @"Index"] integerValue]]; NSImage * icon = [self imageForGroup: dict]; if (small) { icon = [icon copy]; [icon setSize: NSMakeSize(ICON_WIDTH_SMALL, ICON_WIDTH_SMALL)]; [item setImage: icon]; [icon release]; } else [item setImage: icon]; [menu addItem: item]; [item release]; } return [menu autorelease]; } - (NSInteger) groupIndexForTorrent: (Torrent *) torrent; { for (NSDictionary * group in fGroups) { NSInteger row = [[group objectForKey: @"Index"] integerValue]; if ([self torrent: torrent doesMatchRulesForGroupAtIndex: row]) return row; } return -1; } @end @implementation GroupsController (Private) - (void) saveGroups { //don't archive the icon NSMutableArray * groups = [NSMutableArray arrayWithCapacity: [fGroups count]]; for (NSDictionary * dict in fGroups) { NSMutableDictionary * tempDict = [dict mutableCopy]; [tempDict removeObjectForKey: @"Icon"]; [groups addObject: tempDict]; [tempDict release]; } [[NSUserDefaults standardUserDefaults] setObject: [NSKeyedArchiver archivedDataWithRootObject: groups] forKey: @"GroupDicts"]; } - (NSImage *) imageForGroup: (NSMutableDictionary *) dict { NSImage * image; if ((image = [dict objectForKey: @"Icon"])) return image; NSRect rect = NSMakeRect(0.0, 0.0, ICON_WIDTH, ICON_WIDTH); NSBezierPath * bp = [NSBezierPath bezierPathWithRoundedRect: rect xRadius: 3.0 yRadius: 3.0]; NSImage * icon = [[NSImage alloc] initWithSize: rect.size]; NSColor * color = [dict objectForKey: @"Color"]; [icon lockFocus]; //border NSGradient * gradient = [[NSGradient alloc] initWithStartingColor: [color blendedColorWithFraction: 0.45 ofColor: [NSColor whiteColor]] endingColor: color]; [gradient drawInBezierPath: bp angle: 270.0]; [gradient release]; //inside bp = [NSBezierPath bezierPathWithRoundedRect: NSInsetRect(rect, 1.0, 1.0) xRadius: 3.0 yRadius: 3.0]; gradient = [[NSGradient alloc] initWithStartingColor: [color blendedColorWithFraction: 0.75 ofColor: [NSColor whiteColor]] endingColor: [color blendedColorWithFraction: 0.2 ofColor: [NSColor whiteColor]]]; [gradient drawInBezierPath: bp angle: 270.0]; [gradient release]; [icon unlockFocus]; [dict setObject: icon forKey: @"Icon"]; [icon release]; return icon; } - (BOOL) torrent: (Torrent *) torrent doesMatchRulesForGroupAtIndex: (NSInteger) index { if (![self usesAutoAssignRulesForIndex: index]) return NO; NSPredicate * predicate = [self autoAssignRulesForIndex: index]; BOOL eval = NO; @try { eval = [predicate evaluateWithObject: torrent]; } @catch (NSException * exception) { NSLog(@"Error when evaluating predicate (%@) - %@", predicate, exception); } @finally { return eval; } } @end transmission-2.92/macosx/PaxHeaders.4960/CreatorWindowController.m0000644000000000000000000000013212644245522022167 xustar0030 mtime=1452362578.836700518 30 atime=1452362578.836700518 30 ctime=1457295923.024859342 transmission-2.92/macosx/CreatorWindowController.m0000644000175000017500000006375712644245522023636 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: CreatorWindowController.m 14662 2016-01-06 11:05:37Z mikedld $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "CreatorWindowController.h" #import "Controller.h" #import "NSApplicationAdditions.h" #import "NSStringAdditions.h" #import "transmission.h" // required by utils.h #import "utils.h" // tr_urlIsValidTracker() #define TRACKER_ADD_TAG 0 #define TRACKER_REMOVE_TAG 1 @interface CreatorWindowController (Private) + (NSURL *) chooseFile; - (void) updateLocationField; - (void) createBlankAddressAlertDidEnd: (NSAlert *) alert returnCode: (NSInteger) returnCode contextInfo: (void *) contextInfo; - (void) createReal; - (void) checkProgress; - (void) failureSheetClosed: (NSAlert *) alert returnCode: (NSInteger) code contextInfo: (void *) info; @end @implementation CreatorWindowController + (CreatorWindowController *) createTorrentFile: (tr_session *) handle { //get file/folder for torrent NSURL * path; if (!(path = [CreatorWindowController chooseFile])) return nil; CreatorWindowController * creator = [[self alloc] initWithHandle: handle path: path]; [creator showWindow: nil]; return creator; } + (CreatorWindowController *) createTorrentFile: (tr_session *) handle forFile: (NSURL *) file { CreatorWindowController * creator = [[self alloc] initWithHandle: handle path: file]; [creator showWindow: nil]; return creator; } - (id) initWithHandle: (tr_session *) handle path: (NSURL *) path { if ((self = [super initWithWindowNibName: @"Creator"])) { fStarted = NO; fPath = [path retain]; fInfo = tr_metaInfoBuilderCreate([[fPath path] UTF8String]); if (fInfo->fileCount == 0) { NSAlert * alert = [[NSAlert alloc] init]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Create torrent -> no files -> button")]; [alert setMessageText: NSLocalizedString(@"This folder contains no files.", "Create torrent -> no files -> title")]; [alert setInformativeText: NSLocalizedString(@"There must be at least one file in a folder to create a torrent file.", "Create torrent -> no files -> warning")]; [alert setAlertStyle: NSWarningAlertStyle]; [alert runModal]; [alert release]; [self release]; return nil; } if (fInfo->totalSize == 0) { NSAlert * alert = [[NSAlert alloc] init]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Create torrent -> zero size -> button")]; [alert setMessageText: NSLocalizedString(@"The total file size is zero bytes.", "Create torrent -> zero size -> title")]; [alert setInformativeText: NSLocalizedString(@"A torrent file cannot be created for files with no size.", "Create torrent -> zero size -> warning")]; [alert setAlertStyle: NSWarningAlertStyle]; [alert runModal]; [alert release]; [self release]; return nil; } fDefaults = [NSUserDefaults standardUserDefaults]; //get list of trackers if (!(fTrackers = [[fDefaults arrayForKey: @"CreatorTrackers"] mutableCopy])) { fTrackers = [[NSMutableArray alloc] init]; //check for single tracker from versions before 1.3 NSString * tracker; if ((tracker = [fDefaults stringForKey: @"CreatorTracker"])) { [fDefaults removeObjectForKey: @"CreatorTracker"]; if (![tracker isEqualToString: @""]) { [fTrackers addObject: tracker]; [fDefaults setObject: fTrackers forKey: @"CreatorTrackers"]; } } } //remove potentially invalid addresses for (NSInteger i = [fTrackers count]-1; i >= 0; i--) { if (!tr_urlIsValidTracker([[fTrackers objectAtIndex: i] UTF8String])) [fTrackers removeObjectAtIndex: i]; } } return self; } - (void) awakeFromNib { [[self window] setRestorationClass: [self class]]; NSString * name = [fPath lastPathComponent]; [[self window] setTitle: name]; [fNameField setStringValue: name]; [fNameField setToolTip: [fPath path]]; const BOOL multifile = fInfo->isFolder; NSImage * icon = [[NSWorkspace sharedWorkspace] iconForFileType: multifile ? NSFileTypeForHFSTypeCode(kGenericFolderIcon) : [fPath pathExtension]]; [icon setSize: [fIconView frame].size]; [fIconView setImage: icon]; NSString * statusString = [NSString stringForFileSize: fInfo->totalSize]; if (multifile) { NSString * fileString; NSInteger count = fInfo->fileCount; if (count != 1) fileString = [NSString stringWithFormat: NSLocalizedString(@"%@ files", "Create torrent -> info"), [NSString formattedUInteger: count]]; else fileString = NSLocalizedString(@"1 file", "Create torrent -> info"); statusString = [NSString stringWithFormat: @"%@, %@", fileString, statusString]; } [fStatusField setStringValue: statusString]; if (fInfo->pieceCount == 1) [fPiecesField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"1 piece, %@", "Create torrent -> info"), [NSString stringForFileSize: fInfo->pieceSize]]]; else [fPiecesField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%d pieces, %@ each", "Create torrent -> info"), fInfo->pieceCount, [NSString stringForFileSize: fInfo->pieceSize]]]; fLocation = [[[fDefaults URLForKey: @"CreatorLocationURL"] URLByAppendingPathComponent: [name stringByAppendingPathExtension: @"torrent"]] retain]; if (!fLocation) { //for 2.5 and earlier #warning we still store "CreatorLocation" in Defaults.plist, and not "CreatorLocationURL" NSString * location = [fDefaults stringForKey: @"CreatorLocation"]; fLocation = [[NSURL alloc] initFileURLWithPath: [[location stringByExpandingTildeInPath] stringByAppendingPathComponent: [name stringByAppendingPathExtension: @"torrent"]]]; } [self updateLocationField]; //set previously saved values if ([fDefaults objectForKey: @"CreatorPrivate"]) [fPrivateCheck setState: [fDefaults boolForKey: @"CreatorPrivate"] ? NSOnState : NSOffState]; [fOpenCheck setState: [fDefaults boolForKey: @"CreatorOpen"] ? NSOnState : NSOffState]; } - (void) dealloc { [fPath release]; [fLocation release]; [fTrackers release]; if (fInfo) tr_metaInfoBuilderFree(fInfo); [fTimer invalidate]; [fTimer release]; [super dealloc]; } + (void) restoreWindowWithIdentifier: (NSString *) identifier state: (NSCoder *) state completionHandler: (void (^)(NSWindow *, NSError *)) completionHandler { NSURL * path = [state decodeObjectForKey: @"TRCreatorPath"]; if (!path || ![path checkResourceIsReachableAndReturnError: nil]) { completionHandler(nil, [NSError errorWithDomain: NSURLErrorDomain code: NSURLErrorCannotOpenFile userInfo: nil]); return; } NSWindow * window = [[self createTorrentFile: [(Controller *)[NSApp delegate] sessionHandle] forFile: path] window]; completionHandler(window, nil); } - (void) window: (NSWindow *) window willEncodeRestorableState: (NSCoder *) state { [state encodeObject: fPath forKey: @"TRCreatorPath"]; [state encodeObject: fLocation forKey: @"TRCreatorLocation"]; [state encodeObject: fTrackers forKey: @"TRCreatorTrackers"]; [state encodeInteger: [fOpenCheck state] forKey: @"TRCreatorOpenCheck"]; [state encodeInteger: [fPrivateCheck state] forKey: @"TRCreatorPrivateCheck"]; [state encodeObject: [fCommentView string] forKey: @"TRCreatorPrivateComment"]; } - (void) window: (NSWindow *) window didDecodeRestorableState: (NSCoder *) coder { [fLocation release]; fLocation = [[coder decodeObjectForKey: @"TRCreatorLocation"] retain]; [self updateLocationField]; [fTrackers release]; fTrackers = [[coder decodeObjectForKey: @"TRCreatorTrackers"] retain]; [fTrackerTable reloadData]; [fOpenCheck setState: [coder decodeIntegerForKey: @"TRCreatorOpenCheck"]]; [fPrivateCheck setState: [coder decodeIntegerForKey: @"TRCreatorPrivateCheck"]]; [fCommentView setString: [coder decodeObjectForKey: @"TRCreatorPrivateComment"]]; } - (IBAction) setLocation: (id) sender { NSSavePanel * panel = [NSSavePanel savePanel]; [panel setPrompt: NSLocalizedString(@"Select", "Create torrent -> location sheet -> button")]; [panel setMessage: NSLocalizedString(@"Select the name and location for the torrent file.", "Create torrent -> location sheet -> message")]; [panel setAllowedFileTypes: [NSArray arrayWithObjects: @"org.bittorrent.torrent", @"torrent", nil]]; [panel setCanSelectHiddenExtension: YES]; [panel setDirectoryURL: [fLocation URLByDeletingLastPathComponent]]; [panel setNameFieldStringValue: [fLocation lastPathComponent]]; [panel beginSheetModalForWindow: [self window] completionHandler: ^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { [fLocation release]; fLocation = [[panel URL] retain]; [self updateLocationField]; } }]; } - (IBAction) create: (id) sender { //make sure the trackers are no longer being verified if ([fTrackerTable editedRow] != -1) [[self window] endEditingFor: fTrackerTable]; const BOOL isPrivate = [fPrivateCheck state] == NSOnState; if ([fTrackers count] == 0 && [fDefaults boolForKey: isPrivate ? @"WarningCreatorPrivateBlankAddress" : @"WarningCreatorBlankAddress"]) { NSAlert * alert = [[NSAlert alloc] init]; [alert setMessageText: NSLocalizedString(@"There are no tracker addresses.", "Create torrent -> blank address -> title")]; NSString * infoString = isPrivate ? NSLocalizedString(@"A transfer marked as private with no tracker addresses will be unable to connect to peers." " The torrent file will only be useful if you plan to upload the file to a tracker website" " that will add the addresses for you.", "Create torrent -> blank address -> message") : NSLocalizedString(@"The transfer will not contact trackers for peers, and will have to rely solely on" " non-tracker peer discovery methods such as PEX and DHT to download and seed.", "Create torrent -> blank address -> message"); [alert setInformativeText: infoString]; [alert addButtonWithTitle: NSLocalizedString(@"Create", "Create torrent -> blank address -> button")]; [alert addButtonWithTitle: NSLocalizedString(@"Cancel", "Create torrent -> blank address -> button")]; [alert setShowsSuppressionButton: YES]; [alert beginSheetModalForWindow: [self window] modalDelegate: self didEndSelector: @selector(createBlankAddressAlertDidEnd:returnCode:contextInfo:) contextInfo: nil]; } else [self createReal]; } - (IBAction) cancelCreateWindow: (id) sender { [[self window] close]; } - (void) windowWillClose: (NSNotification *) notification { [self autorelease]; } - (IBAction) cancelCreateProgress: (id) sender { fInfo->abortFlag = 1; [fTimer fire]; } - (NSInteger) numberOfRowsInTableView: (NSTableView *) tableView { return [fTrackers count]; } - (id) tableView: (NSTableView *) tableView objectValueForTableColumn: (NSTableColumn *) tableColumn row: (NSInteger) row { return [fTrackers objectAtIndex: row]; } - (IBAction) addRemoveTracker: (id) sender { //don't allow add/remove when currently adding - it leads to weird results if ([fTrackerTable editedRow] != -1) return; if ([[sender cell] tagForSegment: [sender selectedSegment]] == TRACKER_REMOVE_TAG) { [fTrackers removeObjectsAtIndexes: [fTrackerTable selectedRowIndexes]]; [fTrackerTable deselectAll: self]; [fTrackerTable reloadData]; } else { [fTrackers addObject: @""]; [fTrackerTable reloadData]; const NSInteger row = [fTrackers count] - 1; [fTrackerTable selectRowIndexes: [NSIndexSet indexSetWithIndex: row] byExtendingSelection: NO]; [fTrackerTable editColumn: 0 row: row withEvent: nil select: YES]; } } - (void) tableView: (NSTableView *) tableView setObjectValue: (id) object forTableColumn: (NSTableColumn *) tableColumn row: (NSInteger) row { NSString * tracker = (NSString *)object; tracker = [tracker stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; if ([tracker rangeOfString: @"://"].location == NSNotFound) tracker = [@"http://" stringByAppendingString: tracker]; if (!tr_urlIsValidTracker([tracker UTF8String])) { NSBeep(); [fTrackers removeObjectAtIndex: row]; } else [fTrackers replaceObjectAtIndex: row withObject: tracker]; [fTrackerTable deselectAll: self]; [fTrackerTable reloadData]; } - (void) tableViewSelectionDidChange: (NSNotification *) notification { [fTrackerAddRemoveControl setEnabled: [fTrackerTable numberOfSelectedRows] > 0 forSegment: TRACKER_REMOVE_TAG]; } - (void) copy: (id) sender { NSArray * addresses = [fTrackers objectsAtIndexes: [fTrackerTable selectedRowIndexes]]; NSString * text = [addresses componentsJoinedByString: @"\n"]; NSPasteboard * pb = [NSPasteboard generalPasteboard]; [pb clearContents]; [pb writeObjects: [NSArray arrayWithObject: text]]; } - (BOOL) validateMenuItem: (NSMenuItem *) menuItem { const SEL action = [menuItem action]; if (action == @selector(copy:)) return [[self window] firstResponder] == fTrackerTable && [fTrackerTable numberOfSelectedRows] > 0; if (action == @selector(paste:)) return [[self window] firstResponder] == fTrackerTable && [[NSPasteboard generalPasteboard] canReadObjectForClasses: [NSArray arrayWithObject: [NSString class]] options: nil]; return YES; } - (void) paste: (id) sender { NSMutableArray * tempTrackers = [NSMutableArray array]; NSArray * items = [[NSPasteboard generalPasteboard] readObjectsForClasses: [NSArray arrayWithObject: [NSString class]] options: nil]; NSAssert(items != nil, @"no string items to paste; should not be able to call this method"); for (NSString * pbItem in items) { for (NSString * tracker in [pbItem componentsSeparatedByString: @"\n"]) [tempTrackers addObject: tracker]; } BOOL added = NO; for (NSString * tracker in tempTrackers) { tracker = [tracker stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; if ([tracker rangeOfString: @"://"].location == NSNotFound) tracker = [@"http://" stringByAppendingString: tracker]; if (tr_urlIsValidTracker([tracker UTF8String])) { [fTrackers addObject: tracker]; added = YES; } } if (added) { [fTrackerTable deselectAll: self]; [fTrackerTable reloadData]; } else NSBeep(); } @end @implementation CreatorWindowController (Private) - (void) updateLocationField { NSString * pathString = [fLocation path]; [fLocationField setStringValue: [pathString stringByAbbreviatingWithTildeInPath]]; [fLocationField setToolTip: pathString]; } + (NSURL *) chooseFile { NSOpenPanel * panel = [NSOpenPanel openPanel]; [panel setTitle: NSLocalizedString(@"Create Torrent File", "Create torrent -> select file")]; [panel setPrompt: NSLocalizedString(@"Select", "Create torrent -> select file")]; [panel setAllowsMultipleSelection: NO]; [panel setCanChooseFiles: YES]; [panel setCanChooseDirectories: YES]; [panel setCanCreateDirectories: NO]; [panel setMessage: NSLocalizedString(@"Select a file or folder for the torrent file.", "Create torrent -> select file")]; BOOL success = [panel runModal] == NSOKButton; return success ? [[panel URLs] objectAtIndex: 0] : nil; } - (void) createBlankAddressAlertDidEnd: (NSAlert *) alert returnCode: (NSInteger) returnCode contextInfo: (void *) contextInfo { if ([[alert suppressionButton] state] == NSOnState) { [[NSUserDefaults standardUserDefaults] setBool: NO forKey: @"WarningCreatorBlankAddress"]; //set regardless of private/public if ([fPrivateCheck state] == NSOnState) [[NSUserDefaults standardUserDefaults] setBool: NO forKey: @"WarningCreatorPrivateBlankAddress"]; } [alert release]; if (returnCode == NSAlertFirstButtonReturn) [self performSelectorOnMainThread: @selector(createReal) withObject: nil waitUntilDone: NO]; } - (void) createReal { //check if the location currently exists if (![[fLocation URLByDeletingLastPathComponent] checkResourceIsReachableAndReturnError: NULL]) { NSAlert * alert = [[[NSAlert alloc] init] autorelease]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Create torrent -> directory doesn't exist warning -> button")]; [alert setMessageText: NSLocalizedString(@"The chosen torrent file location does not exist.", "Create torrent -> directory doesn't exist warning -> title")]; [alert setInformativeText: [NSString stringWithFormat: NSLocalizedString(@"The directory \"%@\" does not currently exist. " "Create this directory or choose a different one to create the torrent file.", "Create torrent -> directory doesn't exist warning -> warning"), [[fLocation URLByDeletingLastPathComponent] path]]]; [alert setAlertStyle: NSWarningAlertStyle]; [alert beginSheetModalForWindow: [self window] modalDelegate: self didEndSelector: nil contextInfo: nil]; return; } //check if a file with the same name and location already exists if ([fLocation checkResourceIsReachableAndReturnError: NULL]) { NSArray * pathComponents = [fLocation pathComponents]; NSInteger count = [pathComponents count]; NSAlert * alert = [[[NSAlert alloc] init] autorelease]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Create torrent -> file already exists warning -> button")]; [alert setMessageText: NSLocalizedString(@"A torrent file with this name and directory cannot be created.", "Create torrent -> file already exists warning -> title")]; [alert setInformativeText: [NSString stringWithFormat: NSLocalizedString(@"A file with the name \"%@\" already exists in the directory \"%@\". " "Choose a new name or directory to create the torrent file.", "Create torrent -> file already exists warning -> warning"), [pathComponents objectAtIndex: count-1], [pathComponents objectAtIndex: count-2]]]; [alert setAlertStyle: NSWarningAlertStyle]; [alert beginSheetModalForWindow: [self window] modalDelegate: self didEndSelector: nil contextInfo: nil]; return; } //parse non-empty tracker strings tr_tracker_info * trackerInfo = tr_new0(tr_tracker_info, [fTrackers count]); for (NSUInteger i = 0; i < [fTrackers count]; i++) { trackerInfo[i].announce = (char *)[[fTrackers objectAtIndex: i] UTF8String]; trackerInfo[i].tier = i; } //store values [fDefaults setObject: fTrackers forKey: @"CreatorTrackers"]; [fDefaults setBool: [fPrivateCheck state] == NSOnState forKey: @"CreatorPrivate"]; [fDefaults setBool: [fOpenCheck state] == NSOnState forKey: @"CreatorOpen"]; fOpenWhenCreated = [fOpenCheck state] == NSOnState; //need this since the check box might not exist, and value in prefs might have changed from another creator window [fDefaults setURL: [fLocation URLByDeletingLastPathComponent] forKey: @"CreatorLocationURL"]; [[self window] setRestorable: NO]; [[NSNotificationCenter defaultCenter] postNotificationName: @"BeginCreateTorrentFile" object: fLocation userInfo: nil]; tr_makeMetaInfo(fInfo, [[fLocation path] UTF8String], trackerInfo, [fTrackers count], [[fCommentView string] UTF8String], [fPrivateCheck state] == NSOnState); tr_free(trackerInfo); fTimer = [[NSTimer scheduledTimerWithTimeInterval: 0.1 target: self selector: @selector(checkProgress) userInfo: nil repeats: YES] retain]; } - (void) checkProgress { if (fInfo->isDone) { [fTimer invalidate]; [fTimer release]; fTimer = nil; NSAlert * alert; switch (fInfo->result) { case TR_MAKEMETA_OK: if (fOpenWhenCreated) { NSDictionary * dict = [[NSDictionary alloc] initWithObjectsAndKeys: [fLocation path], @"File", [[fPath URLByDeletingLastPathComponent] path], @"Path", nil]; [[NSNotificationCenter defaultCenter] postNotificationName: @"OpenCreatedTorrentFile" object: self userInfo: dict]; } [[self window] close]; break; case TR_MAKEMETA_CANCELLED: [[self window] close]; break; default: alert = [[[NSAlert alloc] init] autorelease]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Create torrent -> failed -> button")]; [alert setMessageText: [NSString stringWithFormat: NSLocalizedString(@"Creation of \"%@\" failed.", "Create torrent -> failed -> title"), [fLocation lastPathComponent]]]; [alert setAlertStyle: NSWarningAlertStyle]; if (fInfo->result == TR_MAKEMETA_IO_READ) [alert setInformativeText: [NSString stringWithFormat: NSLocalizedString(@"Could not read \"%s\": %s.", "Create torrent -> failed -> warning"), fInfo->errfile, strerror(fInfo->my_errno)]]; else if (fInfo->result == TR_MAKEMETA_IO_WRITE) [alert setInformativeText: [NSString stringWithFormat: NSLocalizedString(@"Could not write \"%s\": %s.", "Create torrent -> failed -> warning"), fInfo->errfile, strerror(fInfo->my_errno)]]; else //invalid url should have been caught before creating [alert setInformativeText: [NSString stringWithFormat: @"%@ (%d)", NSLocalizedString(@"An unknown error has occurred.", "Create torrent -> failed -> warning"), fInfo->result]]; [alert beginSheetModalForWindow: [self window] modalDelegate: self didEndSelector: @selector(failureSheetClosed:returnCode:contextInfo:) contextInfo: nil]; } } else { [fProgressIndicator setDoubleValue: (double)fInfo->pieceIndex / fInfo->pieceCount]; if (!fStarted) { fStarted = YES; [fProgressView setHidden: YES]; NSWindow * window = [self window]; [window setFrameAutosaveName: @""]; NSRect windowRect = [window frame]; CGFloat difference = [fProgressView frame].size.height - [[window contentView] frame].size.height; windowRect.origin.y -= difference; windowRect.size.height += difference; //don't allow vertical resizing CGFloat height = windowRect.size.height; [window setMinSize: NSMakeSize([window minSize].width, height)]; [window setMaxSize: NSMakeSize([window maxSize].width, height)]; [window setContentView: fProgressView]; [window setFrame: windowRect display: YES animate: YES]; [fProgressView setHidden: NO]; [[window standardWindowButton: NSWindowCloseButton] setEnabled: NO]; } } } - (void) failureSheetClosed: (NSAlert *) alert returnCode: (NSInteger) code contextInfo: (void *) info { [[alert window] orderOut: nil]; [[self window] close]; } @end transmission-2.92/macosx/PaxHeaders.4960/sparkle_dsa_pub.pem0000644000000000000000000000013212442116653021015 xustar0030 mtime=1418239403.999926379 30 atime=1418239403.999926379 30 ctime=1457295922.558851417 transmission-2.92/macosx/sparkle_dsa_pub.pem0000644000175000017500000000223212442116653022441 0ustar00mikedldmikedld00000000000000-----BEGIN PUBLIC KEY----- MIIDOjCCAi0GByqGSM44BAEwggIgAoIBAQDCmwiukT/0+w4njL6UQlOQhZFpMJ8Z S5kAJgtjxPcjO1mqZXsj8LdZ1ivH5rgJCy47M0l0Jc5Sij4FzhDDF+qnWv6IN1Gh YTHjk1jd58FzDufA+CU9awrqfHasW5RioRAyOxDgLFMvDIvSju1NgMdS6we6W8uF bWzTaKymVghP2Czt4OtxBMuC472lLV4oPB0U7iPrD1+yvuqydToGJrnWaC2jepo1 RJNSHDxFP0nA7LKIvfGL9svh6oWc9vIxtVtiXQHIaF1DQeUbvtwfdqxRyj59LqaN 142ws0+KSf1PkjbzFvgStZc4qZpgxp5ngu1Kom2ApHgcF4u3fY31YTfBAhUAmNY5 g9wXM/sXQpsr3XEDc/8ly40CggEAZKKAEYCuqU34iPllcsgrvBhjjcet8KPbQwFf rlJYicLo6TVJ+iY5fyGDA7+ebxuh+9GSrGOp9Iwo2fsVg4NOR1XhYVj79Iq8HVRZ 4mCX3mttD9gUOLfAjEDhsrQXwZOIHbybM90URjoDlNdJqeTegdmeL+h0ziNUWfVx fH+t1IXnoZDWciDr7+M8P9mXcvRZjWDJ1YUPg5R0ySbpQo23kArSSixtsM9Htehy /OANLXXTx/51wnK/u9HEA6/LqOwLHZCa33IFvYB9AbrruWeKxij75Q3tZAVRTmLd jleGwCAiPYlgBmm+qulnLsre0VBSOuwlRlzL7qo1Zy9kaxCgQQOCAQUAAoIBAG0w T5MaX3ssKUytA3/ql/KymeyG4aVFi91+kcVduNyzv4TOYEUb5gXO163xi8nPmzjI SrL21ecRGSrN57U53X5P8+LsnGdDImcFKCoY6LGKKyR32pr9RcYbWAKekerQbkSD 1erDUyJCGXXHNLN/2mNU7F2ymwspQHa5c1DHOzrld/sPtytJ1wi4EiheG120Vol9 FTErwQZFN9kIzRRzuSc79Sst3l/xa/0DDED43dWrYFDjFvnwlFzLaqez5m36zsgU mNHCHMpMsX7FZygechDZZHbpt3+nwbJhHA9M7mT3/t+3WisKQmAr1fPRjBW2TO9y axbAM9DuXJx0wpksCLA= -----END PUBLIC KEY----- transmission-2.92/macosx/PaxHeaders.4960/FileOutlineController.h0000644000000000000000000000013212442116641021605 xustar0030 mtime=1418239393.768751049 30 atime=1418239393.768751049 30 ctime=1457295923.105860719 transmission-2.92/macosx/FileOutlineController.h0000644000175000017500000000371712442116641023242 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: FileOutlineController.h 13986 2013-02-08 13:02:16Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @class Torrent; @class FileOutlineView; @interface FileOutlineController : NSObject { Torrent * fTorrent; NSMutableArray * fFileList; IBOutlet FileOutlineView * fOutline; NSString * fFilterText; } - (FileOutlineView *) outlineView; - (void) setTorrent: (Torrent *) torrent; - (void) setFilterText: (NSString *) text; - (void) refresh; - (void) setCheck: (id) sender; - (void) setOnlySelectedCheck: (id) sender; - (void) checkAll; - (void) uncheckAll; - (void) setPriority: (id) sender; - (void) revealFile: (id) sender; - (void) renameSelected: (id) sender; @end transmission-2.92/macosx/PaxHeaders.4960/InfoPeersViewController.h0000644000000000000000000000013212666747213022130 xustar0030 mtime=1457245835.363999472 30 atime=1457245835.362999455 30 ctime=1457295923.296863967 transmission-2.92/macosx/InfoPeersViewController.h0000644000175000017500000000373012666747213023560 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoPeersViewController.h 14706 2016-03-03 22:27:45Z mikedld $ * * Copyright (c) 2010-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import "InfoViewController.h" @class WebSeedTableView; @interface InfoPeersViewController : NSViewController { NSArray * fTorrents; BOOL fSet; NSMutableArray * fPeers, * fWebSeeds; IBOutlet NSTableView * fPeerTable; IBOutlet WebSeedTableView * fWebSeedTable; IBOutlet NSTextField * fConnectedPeersField; CGFloat fViewTopMargin; IBOutlet NSLayoutConstraint * fWebSeedTableTopConstraint; } - (void) setInfoForTorrents: (NSArray *) torrents; - (void) updateInfo; - (void) saveViewSize; - (void) clearView; @end transmission-2.92/macosx/PaxHeaders.4960/MessageWindowController.m0000644000000000000000000000013212644245522022154 xustar0030 mtime=1452362578.798699852 30 atime=1452362578.798699852 30 ctime=1457295923.350864885 transmission-2.92/macosx/MessageWindowController.m0000644000175000017500000005052612644245522023611 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: MessageWindowController.m 14662 2016-01-06 11:05:37Z mikedld $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "MessageWindowController.h" #import "Controller.h" #import "NSApplicationAdditions.h" #import "NSMutableArrayAdditions.h" #import "NSStringAdditions.h" #import #import #define LEVEL_ERROR 0 #define LEVEL_INFO 1 #define LEVEL_DEBUG 2 #define UPDATE_SECONDS 0.75 @interface MessageWindowController (Private) - (void) resizeColumn; - (BOOL) shouldIncludeMessageForFilter: (NSString *) filterString message: (NSDictionary *) message; - (void) updateListForFilter; - (NSString *) stringForMessage: (NSDictionary *) message; @end @implementation MessageWindowController - (id) init { return [super initWithWindowNibName: @"MessageWindow"]; } - (void) awakeFromNib { NSWindow * window = [self window]; [window setFrameAutosaveName: @"MessageWindowFrame"]; [window setFrameUsingName: @"MessageWindowFrame"]; [window setRestorationClass: [self class]]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(resizeColumn) name: NSTableViewColumnDidResizeNotification object: fMessageTable]; [window setContentBorderThickness: NSMinY([[fMessageTable enclosingScrollView] frame]) forEdge: NSMinYEdge]; [[self window] setTitle: NSLocalizedString(@"Message Log", "Message window -> title")]; //set images and text for popup button items [[fLevelButton itemAtIndex: LEVEL_ERROR] setTitle: NSLocalizedString(@"Error", "Message window -> level string")]; [[fLevelButton itemAtIndex: LEVEL_INFO] setTitle: NSLocalizedString(@"Info", "Message window -> level string")]; [[fLevelButton itemAtIndex: LEVEL_DEBUG] setTitle: NSLocalizedString(@"Debug", "Message window -> level string")]; const CGFloat levelButtonOldWidth = NSWidth([fLevelButton frame]); [fLevelButton sizeToFit]; //set table column text [[[fMessageTable tableColumnWithIdentifier: @"Date"] headerCell] setTitle: NSLocalizedString(@"Date", "Message window -> table column")]; [[[fMessageTable tableColumnWithIdentifier: @"Name"] headerCell] setTitle: NSLocalizedString(@"Process", "Message window -> table column")]; [[[fMessageTable tableColumnWithIdentifier: @"Message"] headerCell] setTitle: NSLocalizedString(@"Message", "Message window -> table column")]; //set and size buttons [fSaveButton setTitle: [NSLocalizedString(@"Save", "Message window -> save button") stringByAppendingEllipsis]]; [fSaveButton sizeToFit]; NSRect saveButtonFrame = [fSaveButton frame]; saveButtonFrame.size.width += 10.0; saveButtonFrame.origin.x += NSWidth([fLevelButton frame]) - levelButtonOldWidth; [fSaveButton setFrame: saveButtonFrame]; const CGFloat oldClearButtonWidth = [fClearButton frame].size.width; [fClearButton setTitle: NSLocalizedString(@"Clear", "Message window -> save button")]; [fClearButton sizeToFit]; NSRect clearButtonFrame = [fClearButton frame]; clearButtonFrame.size.width = MAX(clearButtonFrame.size.width + 10.0, saveButtonFrame.size.width); clearButtonFrame.origin.x -= NSWidth(clearButtonFrame) - oldClearButtonWidth; [fClearButton setFrame: clearButtonFrame]; [[fFilterField cell] setPlaceholderString: NSLocalizedString(@"Filter", "Message window -> filter field")]; NSRect filterButtonFrame = [fFilterField frame]; filterButtonFrame.origin.x -= NSWidth(clearButtonFrame) - oldClearButtonWidth; [fFilterField setFrame: filterButtonFrame]; fAttributes = [[[[[fMessageTable tableColumnWithIdentifier: @"Message"] dataCell] attributedStringValue] attributesAtIndex: 0 effectiveRange: NULL] retain]; //select proper level in popup button switch ([[NSUserDefaults standardUserDefaults] integerForKey: @"MessageLevel"]) { case TR_LOG_ERROR: [fLevelButton selectItemAtIndex: LEVEL_ERROR]; break; case TR_LOG_INFO: [fLevelButton selectItemAtIndex: LEVEL_INFO]; break; case TR_LOG_DEBUG: [fLevelButton selectItemAtIndex: LEVEL_DEBUG]; break; default: //safety [[NSUserDefaults standardUserDefaults] setInteger: TR_LOG_ERROR forKey: @"MessageLevel"]; [fLevelButton selectItemAtIndex: LEVEL_ERROR]; } fMessages = [[NSMutableArray alloc] init]; fDisplayedMessages = [[NSMutableArray alloc] init]; fLock = [[NSLock alloc] init]; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; [fTimer invalidate]; [fTimer release]; [fLock release]; [fMessages release]; [fDisplayedMessages release]; [fAttributes release]; [super dealloc]; } - (void) windowDidBecomeKey: (NSNotification *) notification { if (!fTimer) { fTimer = [[NSTimer scheduledTimerWithTimeInterval: UPDATE_SECONDS target: self selector: @selector(updateLog:) userInfo: nil repeats: YES] retain]; [self updateLog: nil]; } } - (void) windowWillClose: (id)sender { [fTimer invalidate]; [fTimer release]; fTimer = nil; } + (void) restoreWindowWithIdentifier: (NSString *) identifier state: (NSCoder *) state completionHandler: (void (^)(NSWindow *, NSError *)) completionHandler { NSAssert1([identifier isEqualToString: @"MessageWindow"], @"Trying to restore unexpected identifier %@", identifier); NSWindow * window = [[(Controller *)[NSApp delegate] messageWindowController] window]; completionHandler(window, nil); } - (void) window: (NSWindow *) window didDecodeRestorableState: (NSCoder *) coder { [fTimer invalidate]; [fTimer release]; fTimer = [[NSTimer scheduledTimerWithTimeInterval: UPDATE_SECONDS target: self selector: @selector(updateLog:) userInfo: nil repeats: YES] retain]; [self updateLog: nil]; } - (void) updateLog: (NSTimer *) timer { tr_log_message * messages; if ((messages = tr_logGetQueue()) == NULL) return; [fLock lock]; static NSUInteger currentIndex = 0; NSScroller * scroller = [[fMessageTable enclosingScrollView] verticalScroller]; const BOOL shouldScroll = currentIndex == 0 || [scroller floatValue] == 1.0 || [scroller isHidden] || [scroller knobProportion] == 1.0; const NSInteger maxLevel = [[NSUserDefaults standardUserDefaults] integerForKey: @"MessageLevel"]; NSString * filterString = [fFilterField stringValue]; BOOL changed = NO; for (tr_log_message * currentMessage = messages; currentMessage != NULL; currentMessage = currentMessage->next) { NSString * name = currentMessage->name != NULL ? [NSString stringWithUTF8String: currentMessage->name] : [[NSProcessInfo processInfo] processName]; NSString * file = [[[NSString stringWithUTF8String: currentMessage->file] lastPathComponent] stringByAppendingFormat: @":%d", currentMessage->line]; NSDictionary * message = [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithUTF8String: currentMessage->message], @"Message", [NSDate dateWithTimeIntervalSince1970: currentMessage->when], @"Date", [NSNumber numberWithUnsignedInteger: currentIndex++], @"Index", //more accurate when sorting by date [NSNumber numberWithInteger: currentMessage->level], @"Level", name, @"Name", file, @"File", nil]; [fMessages addObject: message]; if (currentMessage->level <= maxLevel && [self shouldIncludeMessageForFilter: filterString message: message]) { [fDisplayedMessages addObject: message]; changed = YES; } } if ([fMessages count] > TR_LOG_MAX_QUEUE_LENGTH) { const NSUInteger oldCount = [fDisplayedMessages count]; NSIndexSet * removeIndexes = [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fMessages count]-TR_LOG_MAX_QUEUE_LENGTH)]; NSArray * itemsToRemove = [fMessages objectsAtIndexes: removeIndexes]; [fMessages removeObjectsAtIndexes: removeIndexes]; [fDisplayedMessages removeObjectsInArray: itemsToRemove]; changed |= oldCount > [fDisplayedMessages count]; } if (changed) { [fDisplayedMessages sortUsingDescriptors: [fMessageTable sortDescriptors]]; [fMessageTable reloadData]; if (shouldScroll) [fMessageTable scrollRowToVisible: [fMessageTable numberOfRows]-1]; } [fLock unlock]; tr_logFreeQueue (messages); } - (NSInteger) numberOfRowsInTableView: (NSTableView *) tableView { return [fDisplayedMessages count]; } - (id) tableView: (NSTableView *) tableView objectValueForTableColumn: (NSTableColumn *) column row: (NSInteger) row { NSString * ident = [column identifier]; NSDictionary * message = [fDisplayedMessages objectAtIndex: row]; if ([ident isEqualToString: @"Date"]) return [message objectForKey: @"Date"]; else if ([ident isEqualToString: @"Level"]) { const NSInteger level = [[message objectForKey: @"Level"] integerValue]; switch (level) { case TR_LOG_ERROR: return [NSImage imageNamed: @"RedDot"]; case TR_LOG_INFO: return [NSImage imageNamed: @"YellowDot"]; case TR_LOG_DEBUG: return [NSImage imageNamed: @"PurpleDot"]; default: NSAssert1(NO, @"Unknown message log level: %ld", level); return nil; } } else if ([ident isEqualToString: @"Name"]) return [message objectForKey: @"Name"]; else return [message objectForKey: @"Message"]; } #warning don't cut off end - (CGFloat) tableView: (NSTableView *) tableView heightOfRow: (NSInteger) row { NSString * message = [[fDisplayedMessages objectAtIndex: row] objectForKey: @"Message"]; NSTableColumn * column = [tableView tableColumnWithIdentifier: @"Message"]; const CGFloat count = floorf([message sizeWithAttributes: fAttributes].width / [column width]); return [tableView rowHeight] * (count + 1.0); } - (void) tableView: (NSTableView *) tableView sortDescriptorsDidChange: (NSArray *) oldDescriptors { [fDisplayedMessages sortUsingDescriptors: [fMessageTable sortDescriptors]]; [fMessageTable reloadData]; } - (NSString *) tableView: (NSTableView *) tableView toolTipForCell: (NSCell *) cell rect: (NSRectPointer) rect tableColumn: (NSTableColumn *) column row: (NSInteger) row mouseLocation: (NSPoint) mouseLocation { NSDictionary * message = [fDisplayedMessages objectAtIndex: row]; return [message objectForKey: @"File"]; } - (void) copy: (id) sender { NSIndexSet * indexes = [fMessageTable selectedRowIndexes]; NSMutableArray * messageStrings = [NSMutableArray arrayWithCapacity: [indexes count]]; for (NSDictionary * message in [fDisplayedMessages objectsAtIndexes: indexes]) [messageStrings addObject: [self stringForMessage: message]]; NSString * messageString = [messageStrings componentsJoinedByString: @"\n"]; NSPasteboard * pb = [NSPasteboard generalPasteboard]; [pb clearContents]; [pb writeObjects: [NSArray arrayWithObject: messageString]]; } - (BOOL) validateMenuItem: (NSMenuItem *) menuItem { SEL action = [menuItem action]; if (action == @selector(copy:)) return [fMessageTable numberOfSelectedRows] > 0; return YES; } - (void) changeLevel: (id) sender { NSInteger level; switch ([fLevelButton indexOfSelectedItem]) { case LEVEL_ERROR: level = TR_LOG_ERROR; break; case LEVEL_INFO: level = TR_LOG_INFO; break; case LEVEL_DEBUG: level = TR_LOG_DEBUG; break; default: NSAssert1(NO, @"Unknown message log level: %ld", [fLevelButton indexOfSelectedItem]); } if ([[NSUserDefaults standardUserDefaults] integerForKey: @"MessageLevel"] == level) return; [[NSUserDefaults standardUserDefaults] setInteger: level forKey: @"MessageLevel"]; [fLock lock]; [self updateListForFilter]; [fLock unlock]; } - (void) changeFilter: (id) sender { [fLock lock]; [self updateListForFilter]; [fLock unlock]; } - (void) clearLog: (id) sender { [fLock lock]; [fMessages removeAllObjects]; [fMessageTable beginUpdates]; [fMessageTable removeRowsAtIndexes: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fDisplayedMessages count])] withAnimation: NSTableViewAnimationSlideLeft]; [fDisplayedMessages removeAllObjects]; [fMessageTable endUpdates]; [fLock unlock]; } - (void) writeToFile: (id) sender { NSSavePanel * panel = [NSSavePanel savePanel]; [panel setAllowedFileTypes: [NSArray arrayWithObject: @"txt"]]; [panel setCanSelectHiddenExtension: YES]; [panel setNameFieldStringValue: NSLocalizedString(@"untitled", "Save log panel -> default file name")]; [panel beginSheetModalForWindow: [self window] completionHandler: ^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { //make the array sorted by date NSSortDescriptor * descriptor = [NSSortDescriptor sortDescriptorWithKey: @"Index" ascending: YES]; NSArray * descriptors = [[NSArray alloc] initWithObjects: descriptor, nil]; NSArray * sortedMessages = [fDisplayedMessages sortedArrayUsingDescriptors: descriptors]; [descriptors release]; //create the text to output NSMutableArray * messageStrings = [NSMutableArray arrayWithCapacity: [sortedMessages count]]; for (NSDictionary * message in sortedMessages) [messageStrings addObject: [self stringForMessage: message]]; NSString * fileString = [messageStrings componentsJoinedByString: @"\n"]; if (![fileString writeToFile: [[panel URL] path] atomically: YES encoding: NSUTF8StringEncoding error: nil]) { NSAlert * alert = [[NSAlert alloc] init]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Save log alert panel -> button")]; [alert setMessageText: NSLocalizedString(@"Log Could Not Be Saved", "Save log alert panel -> title")]; [alert setInformativeText: [NSString stringWithFormat: NSLocalizedString(@"There was a problem creating the file \"%@\".", "Save log alert panel -> message"), [[[panel URL] path] lastPathComponent]]]; [alert setAlertStyle: NSWarningAlertStyle]; [alert runModal]; [alert release]; } } }]; } @end @implementation MessageWindowController (Private) - (void) resizeColumn { [fMessageTable noteHeightOfRowsWithIndexesChanged: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fMessageTable numberOfRows])]]; } - (BOOL) shouldIncludeMessageForFilter: (NSString *) filterString message: (NSDictionary *) message { if ([filterString isEqualToString: @""]) return YES; const NSStringCompareOptions searchOptions = NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch; return [[message objectForKey: @"Name"] rangeOfString: filterString options: searchOptions].location != NSNotFound || [[message objectForKey: @"Message"] rangeOfString: filterString options: searchOptions].location != NSNotFound; } - (void) updateListForFilter { const NSInteger level = [[NSUserDefaults standardUserDefaults] integerForKey: @"MessageLevel"]; NSString * filterString = [fFilterField stringValue]; NSIndexSet * indexes = [fMessages indexesOfObjectsWithOptions: NSEnumerationConcurrent passingTest: ^BOOL(id message, NSUInteger idx, BOOL * stop) { return [[(NSDictionary *)message objectForKey: @"Level"] integerValue] <= level && [self shouldIncludeMessageForFilter: filterString message: message]; }]; NSArray * tempMessages = [[fMessages objectsAtIndexes: indexes] sortedArrayUsingDescriptors: [fMessageTable sortDescriptors]]; [fMessageTable beginUpdates]; //figure out which rows were added/moved NSUInteger currentIndex = 0, totalCount = 0; NSMutableArray * itemsToAdd = [NSMutableArray array]; NSMutableIndexSet * itemsToAddIndexes = [NSMutableIndexSet indexSet]; for (NSDictionary * message in tempMessages) { const NSUInteger previousIndex = [fDisplayedMessages indexOfObject: message inRange: NSMakeRange(currentIndex, [fDisplayedMessages count]-currentIndex)]; if (previousIndex == NSNotFound) { [itemsToAdd addObject: message]; [itemsToAddIndexes addIndex: totalCount]; } else { if (previousIndex != currentIndex) { [fDisplayedMessages moveObjectAtIndex: previousIndex toIndex: currentIndex]; [fMessageTable moveRowAtIndex: previousIndex toIndex: currentIndex]; } ++currentIndex; } ++totalCount; } //remove trailing items - those are the unused if (currentIndex < [fDisplayedMessages count]) { const NSRange removeRange = NSMakeRange(currentIndex, [fDisplayedMessages count]-currentIndex); [fDisplayedMessages removeObjectsInRange: removeRange]; [fMessageTable removeRowsAtIndexes: [NSIndexSet indexSetWithIndexesInRange: removeRange] withAnimation: NSTableViewAnimationSlideDown]; } //add new items [fDisplayedMessages insertObjects: itemsToAdd atIndexes: itemsToAddIndexes]; [fMessageTable insertRowsAtIndexes: itemsToAddIndexes withAnimation: NSTableViewAnimationSlideUp]; [fMessageTable endUpdates]; NSAssert2([fDisplayedMessages isEqualToArray: tempMessages], @"Inconsistency between message arrays! %@ %@", fDisplayedMessages, tempMessages); } - (NSString *) stringForMessage: (NSDictionary *) message { NSString * levelString; const NSInteger level = [[message objectForKey: @"Level"] integerValue]; switch (level) { case TR_LOG_ERROR: levelString = NSLocalizedString(@"Error", "Message window -> level"); break; case TR_LOG_INFO: levelString = NSLocalizedString(@"Info", "Message window -> level"); break; case TR_LOG_DEBUG: levelString = NSLocalizedString(@"Debug", "Message window -> level"); break; default: NSAssert1(NO, @"Unknown message log level: %ld", level); } return [NSString stringWithFormat: @"%@ %@ [%@] %@: %@", [message objectForKey: @"Date"], [message objectForKey: @"File"], levelString, [message objectForKey: @"Name"], [message objectForKey: @"Message"], nil]; } @end transmission-2.92/macosx/PaxHeaders.4960/FileListNode.h0000644000000000000000000000013212442116621017641 xustar0030 mtime=1418239377.040464375 30 atime=1418239377.040464375 30 ctime=1457295923.083860345 transmission-2.92/macosx/FileListNode.h0000644000175000017500000000506012442116621021267 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: FileListNode.h 14036 2013-02-19 01:29:25Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @class Torrent; @interface FileListNode : NSObject { NSMutableIndexSet * fIndexes; NSString * fName; NSString * fPath; Torrent * fTorrent; uint64_t fSize; NSImage * fIcon; BOOL fIsFolder; NSMutableArray * fChildren; } @property (nonatomic, copy, readonly) NSString * name; @property (nonatomic, copy, readonly) NSString * path; @property (nonatomic, readonly) Torrent * torrent; @property (nonatomic, readonly) uint64_t size; @property (nonatomic, retain, readonly) NSImage * icon; @property (nonatomic, readonly) BOOL isFolder; @property (nonatomic, retain, readonly) NSMutableArray * children; @property (nonatomic, retain, readonly) NSIndexSet * indexes; - (id) initWithFolderName: (NSString *) name path: (NSString *) path torrent: (Torrent *) torrent; - (id) initWithFileName: (NSString *) name path: (NSString *) path size: (uint64_t) size index: (NSUInteger) index torrent: (Torrent *) torrent; - (void) insertChild: (FileListNode *) child; - (void) insertIndex: (NSUInteger) index withSize: (uint64_t) size; - (NSString *) description; - (BOOL) updateFromOldName: (NSString *) oldName toNewName: (NSString *) newName inPath: (NSString *) path; @end transmission-2.92/macosx/PaxHeaders.4960/QuickLookPlugin0000644000000000000000000000013112664476420020165 xustar0029 mtime=1456635152.28450147 30 atime=1418239416.234136033 30 ctime=1457295922.602852166 transmission-2.92/macosx/QuickLookPlugin/0000755000175000017500000000000012664476420021670 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/fr.lproj0000644000000000000000000000013212640354045021712 xustar0030 mtime=1451350053.468168069 30 atime=1418239416.351138038 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/fr.lproj/0000755000175000017500000000000012640354045023414 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/QuickLookPlugin/fr.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212640354045025623 xustar0030 mtime=1451350053.468168069 30 atime=1451350053.468168069 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/fr.lproj/Localizable.strings0000644000175000017500000000126412640354045027253 0ustar00mikedldmikedld00000000000000/* quicklook file count */ "%@ files" = "%@ Fichers"; /* quicklook file header */ "%@ Files" = "%@ Fichiers"; /* quicklook tracker header */ "%@ Trackers" = "%@ Trackeurs"; /* quicklook web seed header */ "%@ Web Seeds" = "%@ Sources Web"; /* quicklook file count */ "1 file" = "1 Fichier"; /* quicklook file header */ "1 File" = "1 Fichier"; /* quicklook tracker header */ "1 Tracker" = "1 Trackeur"; /* quicklook web seed header */ "1 Web Seed" = "1 Source Web"; /* quicklook creation info */ "Created on %@" = "Créé le %@"; /* quicklook creation info */ "Created on %@ with %@" = "Créé le %1$@ avec %2$@"; /* quicklook creation info */ "Created with %@" = "Créé avec %@"; transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/tr.lproj0000644000000000000000000000013212640354045021730 xustar0030 mtime=1451350053.477168226 30 atime=1418239416.491140437 30 ctime=1457295922.602852166 transmission-2.92/macosx/QuickLookPlugin/tr.lproj/0000755000175000017500000000000012640354045023432 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/QuickLookPlugin/tr.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212640354045025641 xustar0030 mtime=1451350053.477168226 30 atime=1451350053.477168226 30 ctime=1457295922.602852166 transmission-2.92/macosx/QuickLookPlugin/tr.lproj/Localizable.strings0000644000175000017500000000131712640354045027270 0ustar00mikedldmikedld00000000000000/* quicklook file count */ "%@ files" = "%@ dosya"; /* quicklook file header */ "%@ Files" = "%@ Dosya"; /* quicklook tracker header */ "%@ Trackers" = "%@ İzleyici"; /* quicklook web seed header */ "%@ Web Seeds" = "%@ Web Beslemesi"; /* quicklook file count */ "1 file" = "1 dosya"; /* quicklook file header */ "1 File" = "1 Dosya"; /* quicklook tracker header */ "1 Tracker" = "1 İzleyici"; /* quicklook web seed header */ "1 Web Seed" = "1 Web Beslemesi"; /* quicklook creation info */ "Created on %@" = "%@ üzerinde oluşturuldu"; /* quicklook creation info */ "Created on %@ with %@" = "%1$@ üzerinde %2$@ ile oluşturuldu"; /* quicklook creation info */ "Created with %@" = "%@ ile oluşturuldu"; transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/pt.lproj0000644000000000000000000000013212640354045021726 xustar0030 mtime=1451350053.474168173 30 atime=1418239416.487140369 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/pt.lproj/0000755000175000017500000000000012640354045023430 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/QuickLookPlugin/pt.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212640354045025637 xustar0030 mtime=1451350053.473168156 30 atime=1451350053.473168156 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/pt.lproj/Localizable.strings0000644000175000017500000000126412640354045027267 0ustar00mikedldmikedld00000000000000/* quicklook file count */ "%@ files" = "%@ arquivos"; /* quicklook file header */ "%@ Files" = "%@ Arquivos"; /* quicklook tracker header */ "%@ Trackers" = "%@ Rastreadores"; /* quicklook web seed header */ "%@ Web Seeds" = "%@ Web Seeds"; /* quicklook file count */ "1 file" = "1 arquivo"; /* quicklook file header */ "1 File" = "1 Arquivo"; /* quicklook tracker header */ "1 Tracker" = "1 Rastreador"; /* quicklook web seed header */ "1 Web Seed" = "1 Web Seed"; /* quicklook creation info */ "Created on %@" = "Criado em %@"; /* quicklook creation info */ "Created on %@ with %@" = "Criado em %1$@ com %2$@"; /* quicklook creation info */ "Created with %@" = "Criado com %@"; transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/style.css0000644000000000000000000000013212442116670022105 xustar0030 mtime=1418239416.350138021 30 atime=1418239416.350138021 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/style.css0000644000175000017500000000041612442116670023533 0ustar00mikedldmikedld00000000000000html { color: rgb(0,0,0); font-family:'Lucida Grande'; text-align:left; } th { color: rgb(50,50,50); font-weight: bold; text-align:left; } td { color: rgb(80,80,80); text-align:left; } img.icon { vertical-align:text-bottom; margin-right:8px; } transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/QuickLookPlugin-Info.plist0000644000000000000000000000013012664476420025267 xustar0029 mtime=1456635152.28450147 29 atime=1456635152.28450147 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/QuickLookPlugin-Info.plist0000644000175000017500000000345512664476420026725 0ustar00mikedldmikedld00000000000000 CFBundleDevelopmentRegion English CFBundleDocumentTypes CFBundleTypeRole QLGenerator LSItemContentTypes org.bittorrent.torrent com.bittorrent.torrent CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFile CFBundleIdentifier org.m0k.transmission.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundleShortVersionString 1 CFBundleVersion 1.0 CFPlugInDynamicRegisterFunction CFPlugInDynamicRegistration NO CFPlugInFactories FDF02409-6B04-4738-973D-1AADB4FC34D8 QuickLookGeneratorPluginFactory CFPlugInTypes 5E2D9680-5022-40FA-B806-43349622E5B9 FDF02409-6B04-4738-973D-1AADB4FC34D8 CFPlugInUnloadFunction NSHumanReadableCopyright Copyright © 2005-2016 The Transmission Project QLNeedsToBeRunInMainThread QLPreviewHeight 600 QLPreviewWidth 600 QLSupportsConcurrentRequests QLThumbnailMinimumSize 17 transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/GeneratePreviewForURL.m0000644000000000000000000000013212442116670024537 xustar0030 mtime=1418239416.289136976 30 atime=1418239416.289136976 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/GeneratePreviewForURL.m0000644000175000017500000002200012442116670026156 0ustar00mikedldmikedld00000000000000#import "transmission.h" #import "NSStringAdditions.h" OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options); void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview); NSString * generateIconData(NSString * fileExtension, NSUInteger width, NSMutableDictionary * allImgProps) { NSString * rawFilename = ![fileExtension isEqualToString: @""] ? fileExtension : @"blank_file_name_transmission"; NSString * iconFileName = [NSString stringWithFormat: @"%ldx%@.tiff", width, rawFilename]; //we need to do this once per file extension, per size if (![allImgProps objectForKey: iconFileName]) { NSImage * icon = [[NSWorkspace sharedWorkspace] iconForFileType: fileExtension]; const NSRect iconFrame = NSMakeRect(0.0, 0.0, width, width); NSImage * renderedIcon = [[NSImage alloc] initWithSize: iconFrame.size]; [renderedIcon lockFocus]; [icon drawInRect: iconFrame fromRect: NSZeroRect operation: NSCompositeCopy fraction: 1.0]; [renderedIcon unlockFocus]; NSData * iconData = [renderedIcon TIFFRepresentation]; [renderedIcon release]; NSDictionary * imgProps = @{ (NSString *)kQLPreviewPropertyMIMETypeKey : @"image/png", (NSString *)kQLPreviewPropertyAttachmentDataKey : iconData }; [allImgProps setObject: imgProps forKey: iconFileName]; } return [@"cid:" stringByAppendingString: iconFileName]; } OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options) { // Before proceeding make sure the user didn't cancel the request if (QLPreviewRequestIsCancelled(preview)) return noErr; //we need this call to ensure NSApp is initialized (not done automatically for plugins) [NSApplication sharedApplication]; //try to parse the torrent file tr_info inf; tr_ctor * ctor = tr_ctorNew(NULL); tr_ctorSetMetainfoFromFile(ctor, [[(NSURL *)url path] UTF8String]); const int err = tr_torrentParse(ctor, &inf); tr_ctorFree(ctor); if (err) return noErr; NSBundle * bundle = [NSBundle bundleWithIdentifier: @"org.m0k.transmission.QuickLookPlugin"]; NSURL * styleURL = [bundle URLForResource: @"style" withExtension: @"css"]; NSString * styleContents = [NSString stringWithContentsOfURL: styleURL encoding: NSUTF8StringEncoding error: NULL]; NSMutableString * htmlString = [NSMutableString string]; [htmlString appendFormat: @"", styleContents]; NSMutableDictionary * allImgProps = [NSMutableDictionary dictionary]; NSString * name = [NSString stringWithUTF8String: inf.name]; NSString * fileTypeString = inf.isFolder ? NSFileTypeForHFSTypeCode(kGenericFolderIcon) : [name pathExtension]; const NSUInteger width = 32; [htmlString appendFormat: @"

    %@

    ", generateIconData(fileTypeString, width, allImgProps), width, width, name]; NSString * fileSizeString = [NSString stringForFileSize: inf.totalSize]; if (inf.isFolder) { NSString * fileCountString; if (inf.fileCount == 1) fileCountString = NSLocalizedStringFromTableInBundle(@"1 file", nil, bundle, "quicklook file count"); else fileCountString= [NSString stringWithFormat: NSLocalizedStringFromTableInBundle(@"%@ files", nil, bundle, "quicklook file count"), [NSString formattedUInteger: inf.fileCount]]; fileSizeString = [NSString stringWithFormat: @"%@, %@", fileCountString, fileSizeString]; } [htmlString appendFormat: @"

    %@

    ", fileSizeString]; NSString * dateCreatedString = inf.dateCreated > 0 ? [NSDateFormatter localizedStringFromDate: [NSDate dateWithTimeIntervalSince1970: inf.dateCreated] dateStyle: NSDateFormatterLongStyle timeStyle: NSDateFormatterShortStyle] : nil; NSString * creatorString = inf.creator ? [NSString stringWithUTF8String: inf.creator] : nil; if ([creatorString isEqualToString: @""]) creatorString = nil; NSString * creationString = nil; if (dateCreatedString && creatorString) creationString = [NSString stringWithFormat: NSLocalizedStringFromTableInBundle(@"Created on %@ with %@", nil, bundle, "quicklook creation info"), dateCreatedString, creatorString]; else if (dateCreatedString) creationString = [NSString stringWithFormat: NSLocalizedStringFromTableInBundle(@"Created on %@", nil, bundle, "quicklook creation info"), dateCreatedString]; else if (creatorString) creationString = [NSString stringWithFormat: NSLocalizedStringFromTableInBundle(@"Created with %@", nil, bundle, "quicklook creation info"), creatorString]; if (creationString) [htmlString appendFormat: @"

    %@

    ", creationString]; if (inf.comment) { NSString * comment = [NSString stringWithUTF8String: inf.comment]; if (![comment isEqualToString: @""]) [htmlString appendFormat: @"

    %@

    ", comment]; } NSMutableArray * lists = [NSMutableArray array]; if (inf.webseedCount > 0) { NSMutableString * listSection = [NSMutableString string]; [listSection appendString: @""]; NSString * headerTitleString = inf.webseedCount == 1 ? NSLocalizedStringFromTableInBundle(@"1 Web Seed", nil, bundle, "quicklook web seed header") : [NSString stringWithFormat: NSLocalizedStringFromTableInBundle(@"%@ Web Seeds", nil, bundle, "quicklook web seed header"), [NSString formattedUInteger: inf.webseedCount]]; [listSection appendFormat: @"", headerTitleString]; for (int i = 0; i < inf.webseedCount; ++i) [listSection appendFormat: @"", inf.webseeds[i]]; [listSection appendString:@"
    %@
    %s
    "]; [lists addObject: listSection]; } if (inf.trackerCount > 0) { NSMutableString * listSection = [NSMutableString string]; [listSection appendString: @""]; NSString * headerTitleString = inf.trackerCount == 1 ? NSLocalizedStringFromTableInBundle(@"1 Tracker", nil, bundle, "quicklook tracker header") : [NSString stringWithFormat: NSLocalizedStringFromTableInBundle(@"%@ Trackers", nil, bundle, "quicklook tracker header"), [NSString formattedUInteger: inf.trackerCount]]; [listSection appendFormat: @"", headerTitleString]; #warning handle tiers? for (int i = 0; i < inf.trackerCount; ++i) [listSection appendFormat: @"", inf.trackers[i].announce]; [listSection appendString:@"
    %@
    %s
    "]; [lists addObject: listSection]; } if (inf.isFolder) { NSMutableString * listSection = [NSMutableString string]; [listSection appendString: @""]; NSString * fileTitleString = inf.fileCount == 1 ? NSLocalizedStringFromTableInBundle(@"1 File", nil, bundle, "quicklook file header") : [NSString stringWithFormat: NSLocalizedStringFromTableInBundle(@"%@ Files", nil, bundle, "quicklook file header"), [NSString formattedUInteger: inf.fileCount]]; [listSection appendFormat: @"", fileTitleString]; #warning display size? #warning display folders? for (int i = 0; i < inf.fileCount; ++i) { NSString * fullFilePath = [NSString stringWithUTF8String: inf.files[i].name]; NSCAssert([fullFilePath hasPrefix: [name stringByAppendingString: @"/"]], @"Expected file path %@ to begin with %@/", fullFilePath, name); NSString * shortenedFilePath = [fullFilePath substringFromIndex: [name length]+1]; const NSUInteger width = 16; [listSection appendFormat: @"", generateIconData([shortenedFilePath pathExtension], width, allImgProps), width, width, shortenedFilePath]; } [listSection appendString:@"
    %@
    %@
    "]; [lists addObject: listSection]; } if ([lists count] > 0) [htmlString appendFormat: @"

    %@", [lists componentsJoinedByString: @"
    "]]; [htmlString appendString: @""]; tr_metainfoFree(&inf); NSDictionary * props = @{ (NSString *)kQLPreviewPropertyTextEncodingNameKey : @"UTF-8", (NSString *)kQLPreviewPropertyMIMETypeKey : @"text/html", (NSString *)kQLPreviewPropertyAttachmentsKey : allImgProps }; QLPreviewRequestSetDataRepresentation(preview, (CFDataRef)[htmlString dataUsingEncoding: NSUTF8StringEncoding], kUTTypeHTML, (CFDictionaryRef)props); return noErr; } void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview) { // Implement only if supported } transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/de.lproj0000644000000000000000000000013112640354045021672 xustar0030 mtime=1451350053.482168312 29 atime=1418239416.49714054 30 ctime=1457295922.602852166 transmission-2.92/macosx/QuickLookPlugin/de.lproj/0000755000175000017500000000000012640354045023375 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/QuickLookPlugin/de.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212640354045025604 xustar0030 mtime=1451350053.482168312 30 atime=1451350053.482168312 30 ctime=1457295922.602852166 transmission-2.92/macosx/QuickLookPlugin/de.lproj/Localizable.strings0000644000175000017500000000126312640354045027233 0ustar00mikedldmikedld00000000000000/* quicklook file count */ "%@ files" = "%@ Dateien"; /* quicklook file header */ "%@ Files" = "%@ Dateien"; /* quicklook tracker header */ "%@ Trackers" = "%@ Tracker"; /* quicklook web seed header */ "%@ Web Seeds" = "%@ Web-Verteiler"; /* quicklook file count */ "1 file" = "1 Datei"; /* quicklook file header */ "1 File" = "1 Datei"; /* quicklook tracker header */ "1 Tracker" = "1 Tracker"; /* quicklook web seed header */ "1 Web Seed" = "1 Web-Verteiler"; /* quicklook creation info */ "Created on %@" = "Erstellt am %@"; /* quicklook creation info */ "Created on %@ with %@" = "Erstellt am %1$@ mit %2$@"; /* quicklook creation info */ "Created with %@" = "Erstellt mit %@";transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/GenerateThumbnailForURL.m0000644000000000000000000000013212442116670025041 xustar0030 mtime=1418239416.290136993 30 atime=1418239416.290136993 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/GenerateThumbnailForURL.m0000644000175000017500000000210712442116670026466 0ustar00mikedldmikedld00000000000000#include #include #include OSStatus GenerateThumbnailForURL(void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize); void CancelThumbnailGeneration(void *thisInterface, QLThumbnailRequestRef thumbnail); /* ----------------------------------------------------------------------------- Generate a thumbnail for file This function's job is to create thumbnail for designated file as fast as possible ----------------------------------------------------------------------------- */ OSStatus GenerateThumbnailForURL(void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize) { // To complete your generator please implement the function GenerateThumbnailForURL in GenerateThumbnailForURL.c return noErr; } void CancelThumbnailGeneration(void *thisInterface, QLThumbnailRequestRef thumbnail) { // Implement only if supported } transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/pt_PT.lproj0000644000000000000000000000013112640354045022330 xustar0029 mtime=1451350053.47916826 30 atime=1418239416.493140471 30 ctime=1457295922.602852166 transmission-2.92/macosx/QuickLookPlugin/pt_PT.lproj/0000755000175000017500000000000012640354045024033 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/QuickLookPlugin/pt_PT.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013012640354045026240 xustar0029 mtime=1451350053.47916826 29 atime=1451350053.47916826 30 ctime=1457295922.602852166 transmission-2.92/macosx/QuickLookPlugin/pt_PT.lproj/Localizable.strings0000644000175000017500000000126112640354045027667 0ustar00mikedldmikedld00000000000000/* quicklook file count */ "%@ files" = "%@ ficheiros"; /* quicklook file header */ "%@ Files" = "%@ Ficheiros"; /* quicklook tracker header */ "%@ Trackers" = "%@ Trackers"; /* quicklook web seed header */ "%@ Web Seeds" = "%@ Seeds web"; /* quicklook file count */ "1 file" = "1 ficheiro"; /* quicklook file header */ "1 File" = "1 Ficheiro"; /* quicklook tracker header */ "1 Tracker" = "1 Tracker"; /* quicklook web seed header */ "1 Web Seed" = "1 Seed Web"; /* quicklook creation info */ "Created on %@" = "Criado a %@"; /* quicklook creation info */ "Created on %@ with %@" = "Criado a %1$@ com o %2$@"; /* quicklook creation info */ "Created with %@" = "Criado com %@"; transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/QuickLookPlugin-Prefix.pch0000644000000000000000000000013212442116670025242 xustar0030 mtime=1418239416.290136993 30 atime=1418239416.290136993 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/QuickLookPlugin-Prefix.pch0000644000175000017500000000011712442116670026666 0ustar00mikedldmikedld00000000000000#ifdef __OBJC__ #import #import #endif transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/ru.lproj0000644000000000000000000000013212640354045021731 xustar0030 mtime=1451350053.481168295 30 atime=1418239416.495140506 30 ctime=1457295922.602852166 transmission-2.92/macosx/QuickLookPlugin/ru.lproj/0000755000175000017500000000000012640354045023433 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/QuickLookPlugin/ru.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212640354045025642 xustar0030 mtime=1451350053.480168278 30 atime=1451350053.480168278 30 ctime=1457295922.602852166 transmission-2.92/macosx/QuickLookPlugin/ru.lproj/Localizable.strings0000644000175000017500000000145012640354045027267 0ustar00mikedldmikedld00000000000000/* quicklook file count */ "%@ files" = "%@ файлов"; /* quicklook file header */ "%@ Files" = "%@ файлов"; /* quicklook tracker header */ "%@ Trackers" = "%@ трекеров"; /* quicklook web seed header */ "%@ Web Seeds" = "%d Ñайтов раздачи"; /* quicklook file count */ "1 file" = "1 файл"; /* quicklook file header */ "1 File" = "1 файл"; /* quicklook tracker header */ "1 Tracker" = "1 трекер"; /* quicklook web seed header */ "1 Web Seed" = "1 Ñайт раздачи"; /* quicklook creation info */ "Created on %@" = "Создан %@"; /* quicklook creation info */ "Created on %@ with %@" = "Создан %1$@, Ñ Ð¸Ñпользованием %2$@"; /* quicklook creation info */ "Created with %@" = "Создан Ñ Ð¸Ñпользованием %@";transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/da.lproj0000644000000000000000000000013212640354045021667 xustar0030 mtime=1451350053.475168191 30 atime=1418239416.489140403 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/da.lproj/0000755000175000017500000000000012640354045023371 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/QuickLookPlugin/da.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212640354045025600 xustar0030 mtime=1451350053.475168191 30 atime=1451350053.475168191 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/da.lproj/Localizable.strings0000644000175000017500000000124512640354045027227 0ustar00mikedldmikedld00000000000000/* quicklook file count */ "%@ files" = "%@ filer"; /* quicklook file header */ "%@ Files" = "%@ Filer"; /* quicklook tracker header */ "%@ Trackers" = "%@ Trackers"; /* quicklook web seed header */ "%@ Web Seeds" = "%@ Web Seeds"; /* quicklook file count */ "1 file" = "1 fil"; /* quicklook file header */ "1 File" = "1 Fil"; /* quicklook tracker header */ "1 Tracker" = "1 Tracker"; /* quicklook web seed header */ "1 Web Seed" = "1 Web Seed"; /* quicklook creation info */ "Created on %@" = "Oprettet d. %@"; /* quicklook creation info */ "Created on %@ with %@" = "Oprettet d. %1$@ med %2$@"; /* quicklook creation info */ "Created with %@" = "Oprettet med %@"; transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/main.c0000644000000000000000000000013212442116670021323 xustar0030 mtime=1418239416.488140386 30 atime=1418239416.488140386 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/main.c0000644000175000017500000002221412442116670022751 0ustar00mikedldmikedld00000000000000//============================================================================== // // DO NO MODIFY THE CONTENT OF THIS FILE // // This file contains the generic CFPlug-in code necessary for your generator // To complete your generator implement the function in GenerateThumbnailForURL/GeneratePreviewForURL.c // //============================================================================== #include #include #include #include // ----------------------------------------------------------------------------- // constants // ----------------------------------------------------------------------------- // Don't modify this line #define PLUGIN_ID "FDF02409-6B04-4738-973D-1AADB4FC34D8" // // Below is the generic glue code for all plug-ins. // // You should not have to modify this code aside from changing // names if you decide to change the names defined in the Info.plist // // ----------------------------------------------------------------------------- // typedefs // ----------------------------------------------------------------------------- // The thumbnail generation function to be implemented in GenerateThumbnailForURL.c OSStatus GenerateThumbnailForURL(void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize); void CancelThumbnailGeneration(void* thisInterface, QLThumbnailRequestRef thumbnail); // The preview generation function to be implemented in GeneratePreviewForURL.c OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options); void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview); // The layout for an instance of QuickLookGeneratorPlugIn typedef struct __QuickLookGeneratorPluginType { void *conduitInterface; CFUUIDRef factoryID; UInt32 refCount; } QuickLookGeneratorPluginType; // ----------------------------------------------------------------------------- // prototypes // ----------------------------------------------------------------------------- // Forward declaration for the IUnknown implementation. // QuickLookGeneratorPluginType *AllocQuickLookGeneratorPluginType(CFUUIDRef inFactoryID); void DeallocQuickLookGeneratorPluginType(QuickLookGeneratorPluginType *thisInstance); HRESULT QuickLookGeneratorQueryInterface(void *thisInstance,REFIID iid,LPVOID *ppv); void *QuickLookGeneratorPluginFactory(CFAllocatorRef allocator,CFUUIDRef typeID); ULONG QuickLookGeneratorPluginAddRef(void *thisInstance); ULONG QuickLookGeneratorPluginRelease(void *thisInstance); // ----------------------------------------------------------------------------- // myInterfaceFtbl definition // ----------------------------------------------------------------------------- // The QLGeneratorInterfaceStruct function table. // static QLGeneratorInterfaceStruct myInterfaceFtbl = { NULL, QuickLookGeneratorQueryInterface, QuickLookGeneratorPluginAddRef, QuickLookGeneratorPluginRelease, NULL, NULL, NULL, NULL }; // ----------------------------------------------------------------------------- // AllocQuickLookGeneratorPluginType // ----------------------------------------------------------------------------- // Utility function that allocates a new instance. // You can do some initial setup for the generator here if you wish // like allocating globals etc... // QuickLookGeneratorPluginType *AllocQuickLookGeneratorPluginType(CFUUIDRef inFactoryID) { QuickLookGeneratorPluginType *theNewInstance; theNewInstance = (QuickLookGeneratorPluginType *)malloc(sizeof(QuickLookGeneratorPluginType)); memset(theNewInstance,0,sizeof(QuickLookGeneratorPluginType)); /* Point to the function table Malloc enough to store the stuff and copy the filler from myInterfaceFtbl over */ theNewInstance->conduitInterface = malloc(sizeof(QLGeneratorInterfaceStruct)); memcpy(theNewInstance->conduitInterface,&myInterfaceFtbl,sizeof(QLGeneratorInterfaceStruct)); /* Retain and keep an open instance refcount for each factory. */ theNewInstance->factoryID = CFRetain(inFactoryID); CFPlugInAddInstanceForFactory(inFactoryID); /* This function returns the IUnknown interface so set the refCount to one. */ theNewInstance->refCount = 1; return theNewInstance; } // ----------------------------------------------------------------------------- // DeallocQuickLookGeneratorPluginType // ----------------------------------------------------------------------------- // Utility function that deallocates the instance when // the refCount goes to zero. // In the current implementation generator interfaces are never deallocated // but implement this as this might change in the future // void DeallocQuickLookGeneratorPluginType(QuickLookGeneratorPluginType *thisInstance) { CFUUIDRef theFactoryID; theFactoryID = thisInstance->factoryID; /* Free the conduitInterface table up */ free(thisInstance->conduitInterface); /* Free the instance structure */ free(thisInstance); if (theFactoryID){ CFPlugInRemoveInstanceForFactory(theFactoryID); CFRelease(theFactoryID); } } // ----------------------------------------------------------------------------- // QuickLookGeneratorQueryInterface // ----------------------------------------------------------------------------- // Implementation of the IUnknown QueryInterface function. // HRESULT QuickLookGeneratorQueryInterface(void *thisInstance,REFIID iid,LPVOID *ppv) { CFUUIDRef interfaceID; interfaceID = CFUUIDCreateFromUUIDBytes(kCFAllocatorDefault,iid); if (CFEqual(interfaceID,kQLGeneratorCallbacksInterfaceID)){ /* If the Right interface was requested, bump the ref count, * set the ppv parameter equal to the instance, and * return good status. */ ((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType *)thisInstance)->conduitInterface)->GenerateThumbnailForURL = GenerateThumbnailForURL; ((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType *)thisInstance)->conduitInterface)->CancelThumbnailGeneration = CancelThumbnailGeneration; ((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType *)thisInstance)->conduitInterface)->GeneratePreviewForURL = GeneratePreviewForURL; ((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType *)thisInstance)->conduitInterface)->CancelPreviewGeneration = CancelPreviewGeneration; ((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType*)thisInstance)->conduitInterface)->AddRef(thisInstance); *ppv = thisInstance; CFRelease(interfaceID); return S_OK; }else{ /* Requested interface unknown, bail with error. */ *ppv = NULL; CFRelease(interfaceID); return E_NOINTERFACE; } } // ----------------------------------------------------------------------------- // QuickLookGeneratorPluginAddRef // ----------------------------------------------------------------------------- // Implementation of reference counting for this type. Whenever an interface // is requested, bump the refCount for the instance. NOTE: returning the // refcount is a convention but is not required so don't rely on it. // ULONG QuickLookGeneratorPluginAddRef(void *thisInstance) { ((QuickLookGeneratorPluginType *)thisInstance )->refCount += 1; return ((QuickLookGeneratorPluginType*) thisInstance)->refCount; } // ----------------------------------------------------------------------------- // QuickLookGeneratorPluginRelease // ----------------------------------------------------------------------------- // When an interface is released, decrement the refCount. // If the refCount goes to zero, deallocate the instance. // ULONG QuickLookGeneratorPluginRelease(void *thisInstance) { ((QuickLookGeneratorPluginType*)thisInstance)->refCount -= 1; if (((QuickLookGeneratorPluginType*)thisInstance)->refCount == 0){ DeallocQuickLookGeneratorPluginType((QuickLookGeneratorPluginType*)thisInstance ); return 0; }else{ return ((QuickLookGeneratorPluginType*) thisInstance )->refCount; } } // ----------------------------------------------------------------------------- // QuickLookGeneratorPluginFactory // ----------------------------------------------------------------------------- void *QuickLookGeneratorPluginFactory(CFAllocatorRef allocator,CFUUIDRef typeID) { QuickLookGeneratorPluginType *result; CFUUIDRef uuid; /* If correct type is being requested, allocate an * instance of kQLGeneratorTypeID and return the IUnknown interface. */ if (CFEqual(typeID,kQLGeneratorTypeID)){ uuid = CFUUIDCreateFromString(kCFAllocatorDefault,CFSTR(PLUGIN_ID)); result = AllocQuickLookGeneratorPluginType(uuid); CFRelease(uuid); return result; } /* If the requested type is incorrect, return NULL. */ return NULL; } transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/it.lproj0000644000000000000000000000013212640354045021717 xustar0030 mtime=1451350053.472168139 30 atime=1418239416.355138107 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/it.lproj/0000755000175000017500000000000012640354045023421 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/QuickLookPlugin/it.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212640354045025630 xustar0030 mtime=1451350053.472168139 30 atime=1451350053.472168139 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/it.lproj/Localizable.strings0000644000175000017500000000125712640354045027262 0ustar00mikedldmikedld00000000000000/* quicklook file count */ "%@ files" = "%@ file"; /* quicklook file header */ "%@ Files" = "%@ file"; /* quicklook tracker header */ "%@ Trackers" = "%@ server traccia"; /* quicklook web seed header */ "%@ Web Seeds" = "%@ seeder web"; /* quicklook file count */ "1 file" = "1 file"; /* quicklook file header */ "1 File" = "1 file"; /* quicklook tracker header */ "1 Tracker" = "1 server traccia"; /* quicklook web seed header */ "1 Web Seed" = "1 seeder web"; /* quicklook creation info */ "Created on %@" = "Creato il %@"; /* quicklook creation info */ "Created on %@ with %@" = "Creato il %1$@ con %2$@"; /* quicklook creation info */ "Created with %@" = "Creato con %@"; transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/es.lproj0000644000000000000000000000013212640354045021712 xustar0030 mtime=1451350053.466168034 30 atime=1418239416.292137027 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/es.lproj/0000755000175000017500000000000012640354045023414 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/QuickLookPlugin/es.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212640354045025623 xustar0030 mtime=1451350053.466168034 30 atime=1451350053.466168034 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/es.lproj/Localizable.strings0000644000175000017500000000126312640354045027252 0ustar00mikedldmikedld00000000000000/* quicklook file count */ "%@ files" = "%@ archivos"; /* quicklook file header */ "%@ Files" = "%@ Archivos"; /* quicklook tracker header */ "%@ Trackers" = "%@ Trackers"; /* quicklook web seed header */ "%@ Web Seeds" = "%@ Semillas Web"; /* quicklook file count */ "1 file" = "1 archivo"; /* quicklook file header */ "1 File" = "1 Archivo"; /* quicklook tracker header */ "1 Tracker" = "1 Tracker"; /* quicklook web seed header */ "1 Web Seed" = "1 Semilla Web"; /* quicklook creation info */ "Created on %@" = "Creado el %@"; /* quicklook creation info */ "Created on %@ with %@" = "Creado el %1$@ con %2$@"; /* quicklook creation info */ "Created with %@" = "Creado con %@"; transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/nl.lproj0000644000000000000000000000013212640354045021714 xustar0030 mtime=1451350053.470168104 30 atime=1418239416.353138072 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/nl.lproj/0000755000175000017500000000000012640354045023416 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/QuickLookPlugin/nl.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212640354045025625 xustar0030 mtime=1451350053.470168104 30 atime=1451350053.470168104 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/nl.lproj/Localizable.strings0000644000175000017500000000126012640354045027251 0ustar00mikedldmikedld00000000000000/* quicklook file count */ "%@ files" = "%@ bestanden"; /* quicklook file header */ "%@ Files" = "%@ Bestanden"; /* quicklook tracker header */ "%@ Trackers" = "%@ Trackers"; /* quicklook web seed header */ "%@ Web Seeds" = "%@ Web Seeds"; /* quicklook file count */ "1 file" = "1 bestand"; /* quicklook file header */ "1 File" = "1 Bestand"; /* quicklook tracker header */ "1 Tracker" = "1 Tracker"; /* quicklook web seed header */ "1 Web Seed" = "1 Web Seed"; /* quicklook creation info */ "Created on %@" = "Gemaakt op %@"; /* quicklook creation info */ "Created on %@ with %@" = "Gemaakt op %1$@ met %2$@"; /* quicklook creation info */ "Created with %@" = "Gemaakt met %@";transmission-2.92/macosx/QuickLookPlugin/PaxHeaders.4960/en.lproj0000644000000000000000000000012712640354045021711 xustar0027 mtime=1451350053.464168 30 atime=1418239416.287136941 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/en.lproj/0000755000175000017500000000000012640354045023407 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/QuickLookPlugin/en.lproj/PaxHeaders.4960/InfoPlist.strings0000644000000000000000000000013212442116670025304 xustar0030 mtime=1418239416.290136993 30 atime=1418239416.290136993 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/en.lproj/InfoPlist.strings0000644000175000017500000000005512442116670026731 0ustar00mikedldmikedld00000000000000/* Localized versions of Info.plist keys */ transmission-2.92/macosx/QuickLookPlugin/en.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000012412640354045025617 xustar0027 mtime=1451350053.464168 27 atime=1451350053.464168 30 ctime=1457295922.601852148 transmission-2.92/macosx/QuickLookPlugin/en.lproj/Localizable.strings0000644000175000017500000000124612640354045027246 0ustar00mikedldmikedld00000000000000/* quicklook file count */ "%@ files" = "%@ files"; /* quicklook file header */ "%@ Files" = "%@ Files"; /* quicklook tracker header */ "%@ Trackers" = "%@ Trackers"; /* quicklook web seed header */ "%@ Web Seeds" = "%@ Web Seeds"; /* quicklook file count */ "1 file" = "1 file"; /* quicklook file header */ "1 File" = "1 File"; /* quicklook tracker header */ "1 Tracker" = "1 Tracker"; /* quicklook web seed header */ "1 Web Seed" = "1 Web Seed"; /* quicklook creation info */ "Created on %@" = "Created on %@"; /* quicklook creation info */ "Created on %@ with %@" = "Created on %1$@ with %2$@"; /* quicklook creation info */ "Created with %@" = "Created with %@"; transmission-2.92/macosx/PaxHeaders.4960/TorrentGroup.m0000644000000000000000000000013212442116666020010 xustar0030 mtime=1418239414.194101074 30 atime=1418239414.194101074 30 ctime=1457295923.576868729 transmission-2.92/macosx/TorrentGroup.m0000644000175000017500000000522512442116666021441 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: TorrentGroup.m 13434 2012-08-13 00:52:04Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "TorrentGroup.h" #import "GroupsController.h" #import "Torrent.h" #include "transmission.h" // required by utils.h #include "utils.h" // tr_getRatio() @implementation TorrentGroup - (id) initWithGroup: (NSInteger) group { if ((self = [super init])) { fGroup = group; fTorrents = [[NSMutableArray alloc] init]; } return self; } - (void) dealloc { [fTorrents release]; [super dealloc]; } - (NSString *) description { return [NSString stringWithFormat: @"Torrent Group %ld: %@", fGroup, fTorrents]; } - (NSInteger) groupIndex { return fGroup; } - (NSInteger) groupOrderValue { return [[GroupsController groups] rowValueForIndex: fGroup]; } - (NSMutableArray *) torrents { return fTorrents; } - (CGFloat) ratio { uint64_t uploaded = 0, downloaded = 0; for (Torrent * torrent in fTorrents) { uploaded += [torrent uploadedTotal]; downloaded += [torrent downloadedTotal]; } return tr_getRatio(uploaded, downloaded); } - (CGFloat) uploadRate { CGFloat rate = 0.0; for (Torrent * torrent in fTorrents) rate += [torrent uploadRate]; return rate; } - (CGFloat) downloadRate { CGFloat rate = 0.0; for (Torrent * torrent in fTorrents) rate += [torrent downloadRate]; return rate; } @end transmission-2.92/macosx/PaxHeaders.4960/URLSheetWindow.xib0000644000000000000000000000013212640354045020502 xustar0030 mtime=1451350053.195163328 30 atime=1451350053.195163328 30 ctime=1457295922.475850006 transmission-2.92/macosx/URLSheetWindow.xib0000644000175000017500000001312212640354045022126 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/Makefile.in0000644000000000000000000000013212667111010017210 xustar0030 mtime=1457295880.170130644 30 atime=1457295880.170130644 30 ctime=1457295922.402848764 transmission-2.92/macosx/Makefile.in0000644000175000017500000004751112667111010020645 0ustar00mikedldmikedld00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = macosx ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx-pthread.m4 \ $(top_srcdir)/m4/glib-gettext.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTO_CFLAGS = @CRYPTO_CFLAGS@ CRYPTO_LIBS = @CRYPTO_LIBS@ CRYPTO_PKG = @CRYPTO_PKG@ CURL_MINIMUM = @CURL_MINIMUM@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYASSL_CFLAGS = @CYASSL_CFLAGS@ CYASSL_LIBS = @CYASSL_LIBS@ CYASSL_MINIMUM = @CYASSL_MINIMUM@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DHT_CFLAGS = @DHT_CFLAGS@ DHT_LIBS = @DHT_LIBS@ DHT_LIBS_QT = @DHT_LIBS_QT@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_MINIMUM = @GIO_MINIMUM@ GLIB_MINIMUM = @GLIB_MINIMUM@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MINIMUM = @GTK_MINIMUM@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAPPINDICATOR_CFLAGS = @LIBAPPINDICATOR_CFLAGS@ LIBAPPINDICATOR_LIBS = @LIBAPPINDICATOR_LIBS@ LIBAPPINDICATOR_MINIMUM = @LIBAPPINDICATOR_MINIMUM@ LIBB64_CFLAGS = @LIBB64_CFLAGS@ LIBB64_LIBS = @LIBB64_LIBS@ LIBB64_LIBS_QT = @LIBB64_LIBS_QT@ LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ LIBEVENT_CFLAGS = @LIBEVENT_CFLAGS@ LIBEVENT_LIBS = @LIBEVENT_LIBS@ LIBEVENT_MINIMUM = @LIBEVENT_MINIMUM@ LIBM = @LIBM@ LIBNATPMP_CFLAGS = @LIBNATPMP_CFLAGS@ LIBNATPMP_LIBS = @LIBNATPMP_LIBS@ LIBNATPMP_LIBS_QT = @LIBNATPMP_LIBS_QT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LIBUPNP_LIBS_QT = @LIBUPNP_LIBS_QT@ LIBUTP_CFLAGS = @LIBUTP_CFLAGS@ LIBUTP_LIBS = @LIBUTP_LIBS@ LIBUTP_LIBS_QT = @LIBUTP_LIBS_QT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENSSL_CFLAGS = @OPENSSL_CFLAGS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OPENSSL_MINIMUM = @OPENSSL_MINIMUM@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PEERID_PREFIX = @PEERID_PREFIX@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POLARSSL_MINIMUM = @POLARSSL_MINIMUM@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SYSTEMD_DAEMON_CFLAGS = @SYSTEMD_DAEMON_CFLAGS@ SYSTEMD_DAEMON_LIBS = @SYSTEMD_DAEMON_LIBS@ USERAGENT_PREFIX = @USERAGENT_PREFIX@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ WOLFSSL_CFLAGS = @WOLFSSL_CFLAGS@ WOLFSSL_LIBS = @WOLFSSL_LIBS@ XGETTEXT = @XGETTEXT@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ ZLIB_MINIMUM = @ZLIB_MINIMUM@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ transmissionlocaledir = @transmissionlocaledir@ EXTRA_DIST = \ Credits.rtf \ AboutWindow.xib \ BlocklistStatusWindow.xib \ FileRenameSheetController.xib \ FilterBar.xib \ InfoFileView.xib \ InfoPeersView.xib \ InfoTrackersView.xib \ InfoWindow.xib \ MessageWindow.xib \ StatsWindow.xib \ StatusBar.xib \ URLSheetWindow.xib \ Defaults.plist \ Info.plist \ Transmission_Prefix.pch \ Growl.framework \ Sparkle.framework \ sparkle_dsa_pub.pem \ TransmissionHelp \ QuickLookPlugin \ VDKQueue \ Images \ da.lproj \ de.lproj \ en.lproj \ es.lproj \ fr.lproj \ it.lproj \ nl.lproj \ pt_PT.lproj \ ru.lproj \ tr.lproj \ AboutWindowController.h \ AboutWindowController.m \ AddMagnetWindowController.h \ AddMagnetWindowController.m \ AddWindowController.h \ AddWindowController.m \ Badger.h \ Badger.m \ BadgeView.h \ BadgeView.m \ BlocklistDownloader.h \ BlocklistDownloader.m \ BlocklistDownloaderViewController.h \ BlocklistDownloaderViewController.m \ BlocklistScheduler.h \ BlocklistScheduler.m \ BonjourController.h \ BonjourController.m \ ButtonToolbarItem.h \ ButtonToolbarItem.m \ ColorTextField.h \ ColorTextField.m \ Controller.h \ Controller.m \ CreatorWindowController.h \ CreatorWindowController.m \ DragOverlayView.h \ DragOverlayView.m \ DragOverlayWindow.h \ DragOverlayWindow.m \ ExpandedPathToIconTransformer.h \ ExpandedPathToIconTransformer.m \ ExpandedPathToPathTransformer.h \ ExpandedPathToPathTransformer.m \ FileRenameSheetController.h \ FileRenameSheetController.m \ FileListNode.h \ FileListNode.m \ FileNameCell.h \ FileNameCell.m \ FileOutlineController.h \ FileOutlineController.m \ FileOutlineView.h \ FileOutlineView.m \ FilePriorityCell.h \ FilePriorityCell.m \ FilterBarController.h \ FilterBarController.m \ FilterBarView.h \ FilterBarView.m \ FilterButton.h \ FilterButton.m \ GlobalOptionsPopoverViewController.h \ GlobalOptionsPopoverViewController.m \ GroupsController.h \ GroupsController.m \ GroupsPrefsController.h \ GroupsPrefsController.m \ GroupToolbarItem.h \ GroupToolbarItem.m \ InfoTabButtonBack.h \ InfoTabButtonBack.m \ InfoTabButtonCell.h \ InfoTabButtonCell.m \ InfoTextField.h \ InfoTextField.m \ InfoActivityViewController.h \ InfoActivityViewController.m \ InfoFileViewController.h \ InfoFileViewController.m \ InfoGeneralViewController.h \ InfoGeneralViewController.m \ InfoOptionsViewController.h \ InfoOptionsViewController.m \ InfoPeersViewController.h \ InfoPeersViewController.m \ InfoTrackersViewController.h \ InfoTrackersViewController.m \ InfoViewController.h \ InfoWindowController.h \ InfoWindowController.m \ main.m \ MessageWindowController.h \ MessageWindowController.m \ NSApplicationAdditions.h \ NSApplicationAdditions.m \ NSImageAdditions.h \ NSImageAdditions.m \ NSMutableArrayAdditions.h \ NSMutableArrayAdditions.m \ NSStringAdditions.h \ NSStringAdditions.m \ PeerProgressIndicatorCell.h \ PeerProgressIndicatorCell.m \ PeerTableView.h \ PeerTableView.m \ PiecesView.h \ PiecesView.m \ PortChecker.h \ PortChecker.m \ PredicateEditorRowTemplateAny.h \ PredicateEditorRowTemplateAny.m \ PrefsController.h \ PrefsController.m \ PrefsWindow.h \ PrefsWindow.m \ ProgressGradients.h \ ProgressGradients.m \ ShareToolbarItem.h \ ShareToolbarItem.m \ ShareTorrentFileHelper.h \ ShareTorrentFileHelper.m \ StatsWindowController.h \ StatsWindowController.m \ StatusBarController.h \ StatusBarController.m \ StatusBarView.h \ StatusBarView.m \ ToolbarSegmentedCell.h \ ToolbarSegmentedCell.m \ TorrentCell.h \ TorrentCell.m \ TorrentGroup.h \ TorrentGroup.m \ Torrent.h \ Torrent.m \ TorrentTableView.h \ TorrentTableView.m \ TrackerCell.h \ TrackerCell.m \ TrackerNode.h \ TrackerNode.m \ TrackerTableView.h \ TrackerTableView.m \ URLSheetWindowController.h \ URLSheetWindowController.m \ WebSeedTableView.h \ WebSeedTableView.m all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu macosx/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu macosx/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." @BUILD_MAC_FALSE@clean-local: clean: clean-am clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ clean-local cscopelist-am ctags-am dist-hook distclean \ distclean-generic distclean-libtool distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am .PRECIOUS: Makefile dist-hook: rm -rf `find $(distdir)/ -type d -name .svn` rm -rf `find $(distdir)/ -type d -name .deps` # Use Xcode do make the actual build @BUILD_MAC_TRUE@all: @BUILD_MAC_TRUE@ @(cd .. && xcodebuild -alltargets -activeconfiguration | grep -v "^$$") @BUILD_MAC_TRUE@clean-local: @BUILD_MAC_TRUE@ @(cd .. && xcodebuild -alltargets -activeconfiguration clean | grep -v "^$$") define PACKAGE_RULE1 $(RM) tmp "Transmission $(VERSION_PACKAGE)" \ Transmission-$(VERSION_PACKAGE).dmg mkdir -p tmp cp -R macosx/Transmission.app tmp/ endef define PACKAGE_RULE2 mv tmp "Transmission $(VERSION_PACKAGE)" hdiutil create -format UDZO -imagekey zlib-level=9 -srcfolder \ "Transmission $(VERSION_PACKAGE)" Transmission-$(VERSION_PACKAGE).dmg rm -rf "Transmission $(VERSION_PACKAGE)" endef package: $(PACKAGE_RULE1) $(PACKAGE_RULE2) package-release: $(PACKAGE_RULE1) strip -S tmp/Transmission.app/Contents/MacOS/Transmission $(PACKAGE_RULE2) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: transmission-2.92/macosx/PaxHeaders.4960/BlocklistScheduler.m0000644000000000000000000000013212442116654021120 xustar0030 mtime=1418239404.002926431 30 atime=1418239404.002926431 30 ctime=1457295922.967858372 transmission-2.92/macosx/BlocklistScheduler.m0000644000175000017500000000662212442116654022553 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: BlocklistScheduler.m 13492 2012-09-10 02:37:29Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "BlocklistScheduler.h" #import "BlocklistDownloader.h" //thirty second delay before running after option is changed #define SMALL_DELAY 30 //update one week after previous update #define FULL_WAIT (60 * 60 * 24 * 7) @interface BlocklistScheduler (Private) - (void) runUpdater; @end @implementation BlocklistScheduler BlocklistScheduler * fScheduler = nil; + (BlocklistScheduler *) scheduler { if (!fScheduler) fScheduler = [[BlocklistScheduler alloc] init]; return fScheduler; } - (void) updateSchedule { if ([BlocklistDownloader isRunning]) return; [self cancelSchedule]; NSString * blocklistURL; if (![[NSUserDefaults standardUserDefaults] boolForKey: @"BlocklistNew"] || !((blocklistURL = [[NSUserDefaults standardUserDefaults] stringForKey: @"BlocklistURL"]) && ![blocklistURL isEqualToString: @""]) || ![[NSUserDefaults standardUserDefaults] boolForKey: @"BlocklistAutoUpdate"]) return; NSDate * lastUpdateDate = [[NSUserDefaults standardUserDefaults] objectForKey: @"BlocklistNewLastUpdate"]; if (lastUpdateDate) lastUpdateDate = [lastUpdateDate dateByAddingTimeInterval: FULL_WAIT]; NSDate * closeDate = [NSDate dateWithTimeIntervalSinceNow: SMALL_DELAY]; NSDate * useDate = lastUpdateDate ? [lastUpdateDate laterDate: closeDate] : closeDate; fTimer = [[NSTimer alloc] initWithFireDate: useDate interval: 0 target: self selector: @selector(runUpdater) userInfo: nil repeats: NO]; //current run loop usually means a second update won't work NSRunLoop * loop = [NSRunLoop mainRunLoop]; [loop addTimer: fTimer forMode: NSDefaultRunLoopMode]; [loop addTimer: fTimer forMode: NSModalPanelRunLoopMode]; [loop addTimer: fTimer forMode: NSEventTrackingRunLoopMode]; } - (void) cancelSchedule { [fTimer invalidate]; [fTimer release]; fTimer = nil; } @end @implementation BlocklistScheduler (Private) - (void) runUpdater { [fTimer release]; fTimer = nil; [BlocklistDownloader downloader]; } @end transmission-2.92/macosx/PaxHeaders.4960/FileRenameSheetController.m0000644000000000000000000000013212442116666022402 xustar0030 mtime=1418239414.192101039 30 atime=1418239414.192101039 30 ctime=1457295923.077860243 transmission-2.92/macosx/FileRenameSheetController.m0000644000175000017500000001277612442116666024044 0ustar00mikedldmikedld00000000000000// // FileRenameSheetController.m // Transmission // // Created by Mitchell Livingston on 1/20/13. // Copyright (c) 2013 The Transmission Project. All rights reserved. // #import "FileRenameSheetController.h" #import "FileListNode.h" #import "Torrent.h" typedef void (^CompletionBlock)(BOOL); @interface FileRenameSheetController () @property (nonatomic, retain) Torrent * torrent; @property (nonatomic, retain) FileListNode * node; @property (nonatomic, copy) CompletionBlock completionHandler; @property (nonatomic, copy) NSString * originalName; @end @implementation FileRenameSheetController #warning remove ivars in header when 64-bit only (or it compiles in 32-bit mode) @synthesize torrent = _torrent; @synthesize node = _node; @synthesize completionHandler = _completionHandler; @synthesize originalName = _originalName; @synthesize labelField = _labelField; @synthesize inputField = _inputField; @synthesize renameButton = _renameButton; @synthesize cancelButton = _cancelButton; + (void) presentSheetForTorrent: (Torrent *) torrent modalForWindow: (NSWindow *) window completionHandler: (void (^)(BOOL didRename)) completionHandler { NSParameterAssert(torrent != nil); NSParameterAssert(window != nil); FileRenameSheetController * renamer = [[FileRenameSheetController alloc] initWithWindowNibName: @"FileRenameSheetController"]; renamer.torrent = torrent; renamer.completionHandler = completionHandler; [NSApp beginSheet: [renamer window] modalForWindow: window modalDelegate: self didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:) contextInfo: renamer]; } + (void) presentSheetForFileListNode: (FileListNode *) node modalForWindow: (NSWindow *) window completionHandler: (void (^)(BOOL didRename)) completionHandler { NSParameterAssert(node != nil); NSParameterAssert(window != nil); FileRenameSheetController * renamer = [[FileRenameSheetController alloc] initWithWindowNibName: @"FileRenameSheetController"]; renamer.torrent = [node torrent]; renamer.node = node; renamer.completionHandler = completionHandler; [NSApp beginSheet: [renamer window] modalForWindow: window modalDelegate: self didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:) contextInfo: renamer]; } + (void) sheetDidEnd: (NSWindow *) sheet returnCode: (NSInteger) returnCode contextInfo: (void *) contextInfo { FileRenameSheetController * renamer = contextInfo; NSParameterAssert([renamer isKindOfClass:[FileRenameSheetController class]]); renamer.completionHandler(returnCode == NSOKButton); //TODO: retain/release logic needs to be figured out for ARC (when ARC is enabled) [renamer release]; [sheet orderOut: self]; } - (void) dealloc { [_torrent release]; [_node release]; [_completionHandler release]; [_originalName release]; [super dealloc]; } - (void) windowDidLoad { [super windowDidLoad]; self.originalName = [self.node name] ?: [self.torrent name]; NSString * label = [NSString stringWithFormat: NSLocalizedString(@"Rename the file \"%@\":", "rename sheet label"), self.originalName]; [self.labelField setStringValue: label]; [self.inputField setStringValue: self.originalName]; [self.renameButton setEnabled: NO]; //resize the buttons so that they're long enough and the same width const NSRect oldRenameFrame = [self.renameButton frame]; const NSRect oldCancelFrame = [self.cancelButton frame]; //get the extra width of the rename button from the English xib - the width from sizeToFit is too squished [self.renameButton sizeToFit]; const CGFloat extra = NSWidth(oldRenameFrame) - NSWidth([self.renameButton frame]); [self.renameButton setTitle: NSLocalizedString(@"Rename", "rename sheet button")]; [self.cancelButton setTitle: NSLocalizedString(@"Cancel", "rename sheet button")]; [self.renameButton sizeToFit]; [self.cancelButton sizeToFit]; NSRect newRenameFrame = [self.renameButton frame]; NSRect newCancelFrame = [self.cancelButton frame]; newRenameFrame.size.width = MAX(NSWidth(newRenameFrame), NSWidth(newCancelFrame)) + extra; newCancelFrame.size.width = MAX(NSWidth(newRenameFrame), NSWidth(newCancelFrame)) + extra; const CGFloat renameWidthIncrease = NSWidth(newRenameFrame) - NSWidth(oldRenameFrame); newRenameFrame.origin.x -= renameWidthIncrease; [self.renameButton setFrame:newRenameFrame]; const CGFloat cancelWidthIncrease = NSWidth(newCancelFrame) - NSWidth(oldCancelFrame); newCancelFrame.origin.x -= renameWidthIncrease + cancelWidthIncrease; [self.cancelButton setFrame:newCancelFrame]; } - (IBAction) rename: (id) sender; { void (^completionHandler)(BOOL) = ^(BOOL didRename) { if (didRename) [NSApp endSheet: [self window] returnCode: NSOKButton]; else { #warning more thorough error NSBeep(); } }; if (self.node) [self.torrent renameFileNode: self.node withName: [self.inputField stringValue] completionHandler: completionHandler]; else [self.torrent renameTorrent: [self.inputField stringValue] completionHandler: completionHandler]; } - (IBAction) cancelRename: (id) sender { [NSApp endSheet: [self window] returnCode: NSCancelButton]; } - (void) controlTextDidChange: (NSNotification *) notification { [self.renameButton setEnabled: ![[self.inputField stringValue] isEqualToString: @""] && ![[self.inputField stringValue] isEqualToString: self.originalName]]; } @end transmission-2.92/macosx/PaxHeaders.4960/Credits.rtf0000644000000000000000000000013212442116666017272 xustar0030 mtime=1418239414.206101279 30 atime=1418239414.206101279 30 ctime=1457295922.406848832 transmission-2.92/macosx/Credits.rtf0000644000175000017500000001347112442116666020725 0ustar00mikedldmikedld00000000000000{\rtf1\ansi\ansicpg1252\cocoartf1265 \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;\red127\green127\blue127;} \vieww14160\viewh15100\viewkind0 \pard\tx440\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li100\slleading40\sb40\qc \f0\b\fs28 \cf0 The Transmission Project \fs24 \ \pard\tx440\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li100\slleading40\sb40\qc {\field{\*\fldinst{HYPERLINK "http://www.transmissionbt.com/"}}{\fldrslt \b0 \cf0 http://www.transmissionbt.com/}}\ \pard\tx440\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li100\slleading40\sb40 \cf0 \ Lead Developers \b0 <{\field{\*\fldinst{HYPERLINK "mailto:dev@transmissionbt.com"}}{\fldrslt dev@transmissionbt.com}}>\ Jordan Lee, Mnemosyne LLC <{\field{\*\fldinst{HYPERLINK "mailto:jordan@transmissionbt.com"}}{\fldrslt jordan@transmissionbt.com}}> \fs20 \cf2 (Daemon, Backend, GTK+ client) \fs24 \cf0 \ Mitchell Livingston, Digital Ignition LLC <{\field{\*\fldinst{HYPERLINK "mailto:livings124@transmissionbt.com"}}{\fldrslt livings124@transmissionbt.com}}> \fs20 \cf2 (Mac OS X client) \fs24 \cf0 \ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural \cf0 \ \pard\tx440\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li100\slleading40\sb40 \b \cf0 Project Contributors \b0 \ John Clay \fs20 \cf2 \fs24 \cf0 <{\field{\*\fldinst{HYPERLINK "mailto:john@transmissionbt.com"}}{\fldrslt john@transmissionbt.com}}> \fs20 \cf2 (Website maintenance and troubleshooting, Mac OS X help documentation)\ \fs24 \cf0 Bruno Bierbaumer \fs20 \cf2 (Web client patches) \fs24 \cf0 \ Juliusz Chroboczek \fs20 \cf2 (DHT, network code, BitTorrent code improvements)\ \fs24 \cf0 Daniel Lee \fs20 \cf2 (Patches) \fs24 \cf0 \ Tomas Carnecky \fs20 \cf2 (Profiling, patches, and detection of sneaky bugs)\ \fs24 \cf0 Diego Jim\'e9nez \fs20 \cf2 (Patches)\ \fs24 \cf0 Kendall Hopkins <{\field{\*\fldinst{HYPERLINK "mailto:SoftwareElves@gmail.com"}}{\fldrslt SoftwareElves@gmail.com}}> \fs20 \cf2 (Web client)\ \fs24 \cf0 Malcolm Jarvis <{\field{\*\fldinst{HYPERLINK "mailto:mjarvis@transmissionbt.com"}}{\fldrslt mjarvis@transmissionbt.com}}> \fs20 \cf2 (Web client) \fs24 \cf0 \ Kevin Glowacz <{\field{\*\fldinst{HYPERLINK "mailto:kjg@transmissionbt.com"}}{\fldrslt kjg@transmissionbt.com}}> \fs20 \cf2 (Web client)\ \fs24 \cf0 Rashid Eissing \fs20 \cf2 (Mac OS X Transfers preferences icon) \fs24 \cf0 \ Hugo van Heuven, madebysofa \fs20 \cf2 (Main icon design) \fs24 \cf0 \ Andreas Nilsson \fs20 \cf2 (GNOME adaptation of main icon)\ \fs24 \cf0 Dean Ostetto \fs20 \cf2 (Mac OS X Turtle image)\ \fs24 \cf0 Rick Patrick \fs20 \cf2 (Mac OS X images)\ \fs24 \cf0 Jonas Rask \fs20 \cf2 (Mac OS X Globe icon)\ \fs24 \cf0 Erick Turnquist \fs20 \cf2 (IPv6 code, support)\ \fs24 \cf0 Maarten Van Coile \fs20 \cf2 (Wiki Wrangler, troubleshooting, support)\ \fs24 \cf0 James "Kibo" Parry \fs20 \cf2 (Updated Mac Retina images) \fs24 \cf0 \ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural \cf0 \ \pard\tx440\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li100\slleading40\sb40 \b \cf0 Previous Developers \b0 \ Eric Petit <{\field{\*\fldinst{HYPERLINK "mailto:eric@lapsus.org"}}{\fldrslt eric@lapsus.org}}> \fs20 \cf2 (Project originator)\ \fs24 \cf0 Josh Elsasser <{\field{\*\fldinst{HYPERLINK "mailto:josh@elsasser.org"}}{\fldrslt josh@elsasser.org}}> \fs20 \cf2 (Daemon, Backend, GTK+ client) \fs24 \cf0 \ Bryan Varner <{\field{\*\fldinst{HYPERLINK "mailto:bryan@varnernet.com"}}{\fldrslt bryan@varnernet.com}}> \fs20 \cf2 (BeOS client) \fs24 \cf0 \ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural \cf0 \ \pard\tx440\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li100\slleading40\sb40 \b \cf0 Mac OS X Translators \b0 \ Jorge Carrasco\cf2 \fs20 (Spanish)\ \fs24 \cf0 Etienne Samson \fs20 \cf2 (French)\ \fs24 \cf0 Marco Cavazzuti \fs20 \cf2 (Italian)\ \fs24 \cf0 Anton Sotkov \fs20 \cf2 (Russian)\ \fs24 \cf0 Alexander Bykov \fs20 \cf2 (Russian)\ \fs24 \cf0 Maarten Van Coile \fs20 \cf2 (Dutch)\ \fs24 \cf0 Guilherme Fernandes \fs20 \cf2 (Brazilian Portuguese)\ \fs24 \cf0 Sven-S. Porst \fs20 \cf2 (German)\ \fs24 \cf0 Tianhao He \fs20 \cf2 (Simplified Chinese)\ \fs24 \cf0 S\'e9rgio Miranda \fs20 \cf2 (European Portuguese)\ \fs24 \cf0 Daniel \'d8stergaard Nielsen \fs20 \cf2 (Danish)\ \fs24 \cf0 Emir SARI \fs20 \cf2 (Turkish) \fs24 \cf0 \ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural \cf0 \ \pard\tx440\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li100\slleading40\sb40 \b \cf0 Third-Party Resources \b0 \ Nick Mathewson and Niels Provos for libevent. <{\field{\*\fldinst{HYPERLINK "http://monkey.org/~provos/libevent/"}}{\fldrslt http://monkey.org/~provos/libevent/}}>\ Greg Hazel of BitTorrent Inc. for libutp. <{\field{\*\fldinst{HYPERLINK "https://github.com/bittorrent/libutp"}}{\fldrslt https://github.com/bittorrent/libutp}}>\ Thomas Bernard for MiniUPnP and libnatpmp. <{\field{\*\fldinst{HYPERLINK "http://miniupnp.tuxfamily.org/"}}{\fldrslt http://miniupnp.tuxfamily.org/}}>\ The Growl Development Team for Growl. <{\field{\*\fldinst{HYPERLINK "http://growl.info/"}}{\fldrslt http://growl.info/}}>\ Andy Matuschak for Sparkle. <{\field{\*\fldinst{HYPERLINK "http://sparkle.andymatuschak.org/"}}{\fldrslt http://sparkle.andymatuschak.org/}}>\ Bryan D K Jones for VDKQueue. <{\field{\*\fldinst{HYPERLINK "https://github.com/bdkjones/VDKQueue"}}{\fldrslt https://github.com/bdkjones/VDKQueue}}>}transmission-2.92/macosx/PaxHeaders.4960/ExpandedPathToPathTransformer.m0000644000000000000000000000013212442116643023241 xustar0030 mtime=1418239395.810786043 30 atime=1418239395.810786043 30 ctime=1457295923.067860073 transmission-2.92/macosx/ExpandedPathToPathTransformer.m0000644000175000017500000000330612442116643024670 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: ExpandedPathToPathTransformer.m 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "ExpandedPathToPathTransformer.h" @implementation ExpandedPathToPathTransformer + (Class) transformedValueClass { return [NSString class]; } + (BOOL) allowsReverseTransformation { return NO; } - (id) transformedValue: (id) value { return value == nil ? nil : [[NSFileManager defaultManager] displayNameAtPath: value]; } @endtransmission-2.92/macosx/PaxHeaders.4960/AddWindowController.h0000644000000000000000000000013212442116650021246 xustar0030 mtime=1418239400.335863589 30 atime=1418239400.335863589 30 ctime=1457295922.908857369 transmission-2.92/macosx/AddWindowController.h0000644000175000017500000000636512442116650022705 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: AddWindowController.h 13602 2012-10-30 00:22:10Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import "Torrent.h" @class Controller; @class FileOutlineController; @class Torrent; @interface AddWindowController : NSWindowController { IBOutlet NSImageView * fIconView, * fLocationImageView; IBOutlet NSTextField * fNameField, * fStatusField, * fLocationField; IBOutlet NSButton * fStartCheck, * fDeleteCheck; IBOutlet NSPopUpButton * fGroupPopUp, * fPriorityPopUp; IBOutlet NSProgressIndicator * fVerifyIndicator; IBOutlet NSTextField * fFileFilterField; IBOutlet NSButton * fCheckAllButton, *fUncheckAllButton; IBOutlet FileOutlineController * fFileController; IBOutlet NSScrollView * fFileScrollView; Controller * fController; Torrent * fTorrent; NSString * fDestination, * fTorrentFile; BOOL fLockDestination; BOOL fDeleteTorrentEnableInitially, fCanToggleDelete; NSInteger fGroupValue; NSTimer * fTimer; TorrentDeterminationType fGroupValueDetermination; } - (id) initWithTorrent: (Torrent *) torrent destination: (NSString *) path lockDestination: (BOOL) lockDestination controller: (Controller *) controller torrentFile: (NSString *) torrentFile deleteTorrentCheckEnableInitially: (BOOL) deleteTorrent canToggleDelete: (BOOL) canToggleDelete; //if canToggleDelete is NO, we will also not delete the file regardless of the delete check's state (this is so it can be disabled and checked for a downloaded torrent, where the file's already deleted) - (Torrent *) torrent; - (void) setDestination: (id) sender; - (void) add: (id) sender; - (void) cancelAdd: (id) sender; - (IBAction) setFileFilterText: (id) sender; - (IBAction) checkAll: (id) sender; - (IBAction) uncheckAll: (id) sender; - (void) verifyLocalData: (id) sender; - (void) changePriority: (id) sender; - (void) updateCheckButtons: (NSNotification *) notification; - (void) updateGroupMenu: (NSNotification *) notification; @end transmission-2.92/macosx/PaxHeaders.4960/PiecesView.h0000644000000000000000000000013212442116666017374 xustar0030 mtime=1418239414.198101142 30 atime=1418239414.198101142 30 ctime=1457295923.424866144 transmission-2.92/macosx/PiecesView.h0000644000175000017500000000325612442116666021027 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: PiecesView.h 13251 2012-03-13 02:52:11Z livings124 $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @class Torrent; @interface PiecesView : NSImageView { int8_t * fPieces; NSColor * fGreenAvailabilityColor, * fBluePieceColor; Torrent * fTorrent; NSInteger fNumPieces, fAcross, fWidth, fExtraBorder; } - (void) setTorrent: (Torrent *) torrent; - (void) clearView; - (void) updateView; @end transmission-2.92/macosx/PaxHeaders.4960/InfoWindowController.h0000644000000000000000000000013212664476420021463 xustar0030 mtime=1456635152.264501126 30 atime=1456635152.264501126 30 ctime=1457295923.328864511 transmission-2.92/macosx/InfoWindowController.h0000644000175000017500000000515712664476420023120 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoWindowController.h 14685 2016-02-27 20:29:57Z mikedld $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import @protocol InfoViewController; @class InfoGeneralViewController; @class InfoActivityViewController; @class InfoTrackersViewController; @class InfoPeersViewController; @class InfoFileViewController; @class InfoOptionsViewController; @interface InfoWindowController : NSWindowController { NSArray * fTorrents; CGFloat fMinWindowWidth; NSViewController * fViewController; NSInteger fCurrentTabTag; IBOutlet NSMatrix * fTabMatrix; InfoGeneralViewController * fGeneralViewController; InfoActivityViewController * fActivityViewController; InfoTrackersViewController * fTrackersViewController; InfoPeersViewController * fPeersViewController; InfoFileViewController * fFileViewController; InfoOptionsViewController * fOptionsViewController; IBOutlet NSImageView * fImageView; IBOutlet NSTextField * fNameField, * fBasicInfoField, * fNoneSelectedField; } - (void) setInfoForTorrents: (NSArray *) torrents; - (void) updateInfoStats; - (void) updateOptions; - (void) setTab: (id) sender; - (void) setNextTab; - (void) setPreviousTab; - (NSArray *) quickLookURLs; - (BOOL) canQuickLook; - (NSRect) quickLookSourceFrameForPreviewItem: (id ) item; @end transmission-2.92/macosx/PaxHeaders.4960/InfoTextField.h0000644000000000000000000000013212442116666020035 xustar0030 mtime=1418239414.207101297 30 atime=1418239414.207101297 30 ctime=1457295923.240863015 transmission-2.92/macosx/InfoTextField.h0000644000175000017500000000263712442116666021472 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoTextField.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2009-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface InfoTextField : NSTextField @end transmission-2.92/macosx/PaxHeaders.4960/InfoOptionsViewController.m0000644000000000000000000000013112664476420022506 xustar0030 mtime=1456635152.314501985 30 atime=1456635152.314501985 29 ctime=1457295923.29586395 transmission-2.92/macosx/InfoOptionsViewController.m0000644000175000017500000004523612664476420024146 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoOptionsViewController.m 14685 2016-02-27 20:29:57Z mikedld $ * * Copyright (c) 2010-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "InfoOptionsViewController.h" #import "NSStringAdditions.h" #import "Torrent.h" #define OPTION_POPUP_GLOBAL 0 #define OPTION_POPUP_NO_LIMIT 1 #define OPTION_POPUP_LIMIT 2 #define OPTION_POPUP_PRIORITY_HIGH 0 #define OPTION_POPUP_PRIORITY_NORMAL 1 #define OPTION_POPUP_PRIORITY_LOW 2 #define INVALID -99 @interface InfoOptionsViewController (Private) - (void) setupInfo; - (void) setGlobalLabels; - (void) updateOptionsNotification: (NSNotification *) notification; @end @implementation InfoOptionsViewController - (id) init { if ((self = [super initWithNibName: @"InfoOptionsView" bundle: nil])) { [self setTitle: NSLocalizedString(@"Options", "Inspector view -> title")]; } return self; } - (void) awakeFromNib { [self setGlobalLabels]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(setGlobalLabels) name: @"UpdateGlobalOptions" object: nil]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateOptionsNotification:) name: @"UpdateOptionsNotification" object: nil]; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; [fTorrents release]; [super dealloc]; } - (void) setInfoForTorrents: (NSArray *) torrents { //don't check if it's the same in case the metadata changed [fTorrents release]; fTorrents = [torrents retain]; fSet = NO; } - (void) updateInfo { if (!fSet) [self setupInfo]; fSet = YES; } - (void) updateOptions { if ([fTorrents count] == 0) return; //get bandwidth info NSEnumerator * enumerator = [fTorrents objectEnumerator]; Torrent * torrent = [enumerator nextObject]; //first torrent NSInteger uploadUseSpeedLimit = [torrent usesSpeedLimit: YES] ? NSOnState : NSOffState, uploadSpeedLimit = [torrent speedLimit: YES], downloadUseSpeedLimit = [torrent usesSpeedLimit: NO] ? NSOnState : NSOffState, downloadSpeedLimit = [torrent speedLimit: NO], globalUseSpeedLimit = [torrent usesGlobalSpeedLimit] ? NSOnState : NSOffState; while ((torrent = [enumerator nextObject]) && (uploadUseSpeedLimit != NSMixedState || uploadSpeedLimit != INVALID || downloadUseSpeedLimit != NSMixedState || downloadSpeedLimit != INVALID || globalUseSpeedLimit != NSMixedState)) { if (uploadUseSpeedLimit != NSMixedState && uploadUseSpeedLimit != ([torrent usesSpeedLimit: YES] ? NSOnState : NSOffState)) uploadUseSpeedLimit = NSMixedState; if (uploadSpeedLimit != INVALID && uploadSpeedLimit != [torrent speedLimit: YES]) uploadSpeedLimit = INVALID; if (downloadUseSpeedLimit != NSMixedState && downloadUseSpeedLimit != ([torrent usesSpeedLimit: NO] ? NSOnState : NSOffState)) downloadUseSpeedLimit = NSMixedState; if (downloadSpeedLimit != INVALID && downloadSpeedLimit != [torrent speedLimit: NO]) downloadSpeedLimit = INVALID; if (globalUseSpeedLimit != NSMixedState && globalUseSpeedLimit != ([torrent usesGlobalSpeedLimit] ? NSOnState : NSOffState)) globalUseSpeedLimit = NSMixedState; } //set upload view [fUploadLimitCheck setState: uploadUseSpeedLimit]; [fUploadLimitCheck setEnabled: YES]; [fUploadLimitLabel setEnabled: uploadUseSpeedLimit == NSOnState]; [fUploadLimitField setEnabled: uploadUseSpeedLimit == NSOnState]; if (uploadSpeedLimit != INVALID) [fUploadLimitField setIntValue: uploadSpeedLimit]; else [fUploadLimitField setStringValue: @""]; //set download view [fDownloadLimitCheck setState: downloadUseSpeedLimit]; [fDownloadLimitCheck setEnabled: YES]; [fDownloadLimitLabel setEnabled: downloadUseSpeedLimit == NSOnState]; [fDownloadLimitField setEnabled: downloadUseSpeedLimit == NSOnState]; if (downloadSpeedLimit != INVALID) [fDownloadLimitField setIntValue: downloadSpeedLimit]; else [fDownloadLimitField setStringValue: @""]; //set global check [fGlobalLimitCheck setState: globalUseSpeedLimit]; [fGlobalLimitCheck setEnabled: YES]; //get ratio and idle info enumerator = [fTorrents objectEnumerator]; torrent = [enumerator nextObject]; //first torrent NSInteger checkRatio = [torrent ratioSetting], checkIdle = [torrent idleSetting], removeWhenFinishSeeding = [torrent removeWhenFinishSeeding] ? NSOnState : NSOffState; CGFloat ratioLimit = [torrent ratioLimit]; NSUInteger idleLimit = [torrent idleLimitMinutes]; while ((torrent = [enumerator nextObject]) && (checkRatio != INVALID || ratioLimit != INVALID || checkIdle != INVALID || idleLimit != INVALID)) { if (checkRatio != INVALID && checkRatio != [torrent ratioSetting]) checkRatio = INVALID; if (ratioLimit != INVALID && ratioLimit != [torrent ratioLimit]) ratioLimit = INVALID; if (checkIdle != INVALID && checkIdle != [torrent idleSetting]) checkIdle = INVALID; if (idleLimit != INVALID && idleLimit != [torrent idleLimitMinutes]) idleLimit = INVALID; if (removeWhenFinishSeeding != NSMixedState && removeWhenFinishSeeding != ([torrent removeWhenFinishSeeding] ? NSOnState : NSOffState)) removeWhenFinishSeeding = NSMixedState; } //set ratio view NSInteger index; if (checkRatio == TR_RATIOLIMIT_SINGLE) index = OPTION_POPUP_LIMIT; else if (checkRatio == TR_RATIOLIMIT_UNLIMITED) index = OPTION_POPUP_NO_LIMIT; else if (checkRatio == TR_RATIOLIMIT_GLOBAL) index = OPTION_POPUP_GLOBAL; else index = -1; [fRatioPopUp selectItemAtIndex: index]; [fRatioPopUp setEnabled: YES]; [fRatioLimitField setHidden: checkRatio != TR_RATIOLIMIT_SINGLE]; if (ratioLimit != INVALID) [fRatioLimitField setFloatValue: ratioLimit]; else [fRatioLimitField setStringValue: @""]; [fRatioLimitGlobalLabel setHidden: checkRatio != TR_RATIOLIMIT_GLOBAL]; //set idle view if (checkIdle == TR_IDLELIMIT_SINGLE) index = OPTION_POPUP_LIMIT; else if (checkIdle == TR_IDLELIMIT_UNLIMITED) index = OPTION_POPUP_NO_LIMIT; else if (checkIdle == TR_IDLELIMIT_GLOBAL) index = OPTION_POPUP_GLOBAL; else index = -1; [fIdlePopUp selectItemAtIndex: index]; [fIdlePopUp setEnabled: YES]; [fIdleLimitField setHidden: checkIdle != TR_IDLELIMIT_SINGLE]; if (idleLimit != INVALID) [fIdleLimitField setIntegerValue: idleLimit]; else [fIdleLimitField setStringValue: @""]; [fIdleLimitLabel setHidden: checkIdle != TR_IDLELIMIT_SINGLE]; [fIdleLimitGlobalLabel setHidden: checkIdle != TR_IDLELIMIT_GLOBAL]; //set remove transfer when seeding finishes [fRemoveSeedingCompleteCheck setState: removeWhenFinishSeeding]; [fRemoveSeedingCompleteCheck setEnabled: YES]; //get priority info enumerator = [fTorrents objectEnumerator]; torrent = [enumerator nextObject]; //first torrent NSInteger priority = [torrent priority]; while ((torrent = [enumerator nextObject]) && priority != INVALID) { if (priority != INVALID && priority != [torrent priority]) priority = INVALID; } //set priority view if (priority == TR_PRI_HIGH) index = OPTION_POPUP_PRIORITY_HIGH; else if (priority == TR_PRI_NORMAL) index = OPTION_POPUP_PRIORITY_NORMAL; else if (priority == TR_PRI_LOW) index = OPTION_POPUP_PRIORITY_LOW; else index = -1; [fPriorityPopUp selectItemAtIndex: index]; [fPriorityPopUp setEnabled: YES]; //get peer info enumerator = [fTorrents objectEnumerator]; torrent = [enumerator nextObject]; //first torrent NSInteger maxPeers = [torrent maxPeerConnect]; while ((torrent = [enumerator nextObject])) { if (maxPeers != [torrent maxPeerConnect]) { maxPeers = INVALID; break; } } //set peer view [fPeersConnectField setEnabled: YES]; [fPeersConnectLabel setEnabled: YES]; if (maxPeers != INVALID) [fPeersConnectField setIntValue: maxPeers]; else [fPeersConnectField setStringValue: @""]; } - (void) setUseSpeedLimit: (id) sender { const BOOL upload = sender == fUploadLimitCheck; if ([(NSButton *)sender state] == NSMixedState) [sender setState: NSOnState]; const BOOL limit = [(NSButton *)sender state] == NSOnState; for (Torrent * torrent in fTorrents) [torrent setUseSpeedLimit: limit upload: upload]; NSTextField * field = upload ? fUploadLimitField : fDownloadLimitField; [field setEnabled: limit]; if (limit) { [field selectText: self]; [[[self view] window] makeKeyAndOrderFront: self]; } NSTextField * label = upload ? fUploadLimitLabel : fDownloadLimitLabel; [label setEnabled: limit]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self]; } - (void) setUseGlobalSpeedLimit: (id) sender { if ([(NSButton *)sender state] == NSMixedState) [sender setState: NSOnState]; const BOOL limit = [(NSButton *)sender state] == NSOnState; for (Torrent * torrent in fTorrents) [torrent setUseGlobalSpeedLimit: limit]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self]; } - (void) setSpeedLimit: (id) sender { const BOOL upload = sender == fUploadLimitField; const NSInteger limit = [sender intValue]; for (Torrent * torrent in fTorrents) [torrent setSpeedLimit: limit upload: upload]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self]; } - (void) setRatioSetting: (id) sender { NSInteger setting; BOOL single = NO; switch ([sender indexOfSelectedItem]) { case OPTION_POPUP_LIMIT: setting = TR_RATIOLIMIT_SINGLE; single = YES; break; case OPTION_POPUP_NO_LIMIT: setting = TR_RATIOLIMIT_UNLIMITED; break; case OPTION_POPUP_GLOBAL: setting = TR_RATIOLIMIT_GLOBAL; break; default: NSAssert1(NO, @"Unknown option selected in ratio popup: %ld", [sender indexOfSelectedItem]); return; } for (Torrent * torrent in fTorrents) [torrent setRatioSetting: setting]; [fRatioLimitField setHidden: !single]; if (single) { [fRatioLimitField selectText: self]; [[[self view] window] makeKeyAndOrderFront: self]; } [fRatioLimitGlobalLabel setHidden: setting != TR_RATIOLIMIT_GLOBAL]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self]; } - (void) setRatioLimit: (id) sender { const CGFloat limit = [sender floatValue]; for (Torrent * torrent in fTorrents) [torrent setRatioLimit: limit]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self]; } - (void) setIdleSetting: (id) sender { NSInteger setting; BOOL single = NO; switch ([sender indexOfSelectedItem]) { case OPTION_POPUP_LIMIT: setting = TR_IDLELIMIT_SINGLE; single = YES; break; case OPTION_POPUP_NO_LIMIT: setting = TR_IDLELIMIT_UNLIMITED; break; case OPTION_POPUP_GLOBAL: setting = TR_IDLELIMIT_GLOBAL; break; default: NSAssert1(NO, @"Unknown option selected in idle popup: %ld", [sender indexOfSelectedItem]); return; } for (Torrent * torrent in fTorrents) [torrent setIdleSetting: setting]; [fIdleLimitField setHidden: !single]; [fIdleLimitLabel setHidden: !single]; if (single) { [fIdleLimitField selectText: self]; [[[self view] window] makeKeyAndOrderFront: self]; } [fIdleLimitGlobalLabel setHidden: setting != TR_IDLELIMIT_GLOBAL]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self]; } - (void) setIdleLimit: (id) sender { const NSUInteger limit = [sender integerValue]; for (Torrent * torrent in fTorrents) [torrent setIdleLimitMinutes: limit]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self]; } - (IBAction) setRemoveWhenSeedingCompletes: (id) sender { if ([(NSButton *)sender state] == NSMixedState) [sender setState: NSOnState]; const BOOL enable = [(NSButton *)sender state] == NSOnState; for (Torrent * torrent in fTorrents) [torrent setRemoveWhenFinishSeeding: enable]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self]; } - (void) setPriority: (id) sender { tr_priority_t priority; switch ([sender indexOfSelectedItem]) { case OPTION_POPUP_PRIORITY_HIGH: priority = TR_PRI_HIGH; break; case OPTION_POPUP_PRIORITY_NORMAL: priority = TR_PRI_NORMAL; break; case OPTION_POPUP_PRIORITY_LOW: priority = TR_PRI_LOW; break; default: NSAssert1(NO, @"Unknown option selected in priority popup: %ld", [sender indexOfSelectedItem]); return; } for (Torrent * torrent in fTorrents) [torrent setPriority: priority]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self]; } - (void) setPeersConnectLimit: (id) sender { NSInteger limit = [sender intValue]; for (Torrent * torrent in fTorrents) [torrent setMaxPeerConnect: limit]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self]; } - (BOOL) control: (NSControl *) control textShouldBeginEditing: (NSText *) fieldEditor { [fInitialString release]; fInitialString = [[control stringValue] retain]; return YES; } - (BOOL) control: (NSControl *) control didFailToFormatString: (NSString *) string errorDescription: (NSString *) error { NSBeep(); if (fInitialString) { [control setStringValue: fInitialString]; [fInitialString release]; fInitialString = nil; } return NO; } @end @implementation InfoOptionsViewController (Private) - (void) setupInfo { if ([fTorrents count] == 0) { [fUploadLimitCheck setEnabled: NO]; [fUploadLimitCheck setState: NSOffState]; [fUploadLimitField setEnabled: NO]; [fUploadLimitLabel setEnabled: NO]; [fUploadLimitField setStringValue: @""]; [fDownloadLimitCheck setEnabled: NO]; [fDownloadLimitCheck setState: NSOffState]; [fDownloadLimitField setEnabled: NO]; [fDownloadLimitLabel setEnabled: NO]; [fDownloadLimitField setStringValue: @""]; [fGlobalLimitCheck setEnabled: NO]; [fGlobalLimitCheck setState: NSOffState]; [fPriorityPopUp setEnabled: NO]; [fPriorityPopUp selectItemAtIndex: -1]; [fRatioPopUp setEnabled: NO]; [fRatioPopUp selectItemAtIndex: -1]; [fRatioLimitField setHidden: YES]; [fRatioLimitField setStringValue: @""]; [fRatioLimitGlobalLabel setHidden: YES]; [fIdlePopUp setEnabled: NO]; [fIdlePopUp selectItemAtIndex: -1]; [fIdleLimitField setHidden: YES]; [fIdleLimitField setStringValue: @""]; [fIdleLimitLabel setHidden: YES]; [fIdleLimitGlobalLabel setHidden: YES]; [fRemoveSeedingCompleteCheck setEnabled: NO]; [fRemoveSeedingCompleteCheck setState: NSOffState]; [fPeersConnectField setEnabled: NO]; [fPeersConnectField setStringValue: @""]; [fPeersConnectLabel setEnabled: NO]; } else [self updateOptions]; } - (void) setGlobalLabels { NSString * global = [[NSUserDefaults standardUserDefaults] boolForKey: @"RatioCheck"] ? [NSString stringForRatio: [[NSUserDefaults standardUserDefaults] floatForKey: @"RatioLimit"]] : NSLocalizedString(@"disabled", "Info options -> global setting"); [fRatioLimitGlobalLabel setStringValue: global]; //idle field NSString * globalIdle; if ([[NSUserDefaults standardUserDefaults] boolForKey: @"IdleLimitCheck"]) { const NSInteger globalMin = [[NSUserDefaults standardUserDefaults] integerForKey: @"IdleLimitMinutes"]; globalIdle = globalMin == 1 ? NSLocalizedString(@"1 minute", "Info options -> global setting") : [NSString localizedStringWithFormat: NSLocalizedString(@"%d minutes", "Info options -> global setting"), globalMin]; } else globalIdle = NSLocalizedString(@"disabled", "Info options -> global setting"); [fIdleLimitGlobalLabel setStringValue: globalIdle]; } - (void) updateOptionsNotification: (NSNotification *) notification { if ([notification object] != self) [self updateOptions]; } @end transmission-2.92/macosx/PaxHeaders.4960/BlocklistScheduler.h0000644000000000000000000000013112442116650021106 xustar0030 mtime=1418239400.336863606 30 atime=1418239400.336863606 29 ctime=1457295922.96185827 transmission-2.92/macosx/BlocklistScheduler.h0000644000175000017500000000302712442116650022536 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: BlocklistScheduler.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface BlocklistScheduler : NSObject { NSTimer * fTimer; } + (BlocklistScheduler *) scheduler; - (void) updateSchedule; - (void) cancelSchedule; @end transmission-2.92/macosx/PaxHeaders.4960/PeerProgressIndicatorCell.m0000644000000000000000000000013212442116621022402 xustar0030 mtime=1418239377.040464375 30 atime=1418239377.040464375 30 ctime=1457295923.408865872 transmission-2.92/macosx/PeerProgressIndicatorCell.m0000644000175000017500000000664212442116621024037 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: PeerProgressIndicatorCell.m 13340 2012-06-10 02:35:58Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "PeerProgressIndicatorCell.h" #import "NSStringAdditions.h" @implementation PeerProgressIndicatorCell - (id) copyWithZone: (NSZone *) zone { PeerProgressIndicatorCell * copy = [super copyWithZone: zone]; copy->fAttributes = [fAttributes retain]; return copy; } - (void) dealloc { [fAttributes release]; [super dealloc]; } - (void) setSeed: (BOOL) seed { fSeed = seed; } - (void) drawWithFrame: (NSRect) cellFrame inView: (NSView *) controlView { if ([[NSUserDefaults standardUserDefaults] boolForKey: @"DisplayPeerProgressBarNumber"]) { if (!fAttributes) { NSMutableParagraphStyle * paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; [paragraphStyle setAlignment: NSRightTextAlignment]; fAttributes = [[NSDictionary alloc] initWithObjectsAndKeys: [NSFont systemFontOfSize: 11.0], NSFontAttributeName, paragraphStyle, NSParagraphStyleAttributeName, nil]; [paragraphStyle release]; } [[NSString percentString: [self floatValue] longDecimals: NO] drawInRect: cellFrame withAttributes: fAttributes]; } else { //attributes not needed anymore if (fAttributes) { [fAttributes release]; fAttributes = nil; } [super drawWithFrame: cellFrame inView: controlView]; if (fSeed) { NSImage * checkImage = [NSImage imageNamed: @"CompleteCheck"]; const NSSize imageSize = [checkImage size]; const NSRect rect = NSMakeRect(floor(NSMidX(cellFrame) - imageSize.width * 0.5), floor(NSMidY(cellFrame) - imageSize.height * 0.5), imageSize.width, imageSize.height); [checkImage drawInRect: rect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0 respectFlipped: YES hints: nil]; } } } @end transmission-2.92/macosx/PaxHeaders.4960/Transmission_Prefix.pch0000644000000000000000000000013212442116666021662 xustar0030 mtime=1418239414.205101262 30 atime=1418239414.205101262 30 ctime=1457295922.495850346 transmission-2.92/macosx/Transmission_Prefix.pch0000644000175000017500000000006312442116666023306 0ustar00mikedldmikedld00000000000000#ifdef __OBJC__ #import #endif transmission-2.92/macosx/PaxHeaders.4960/InfoOptionsViewController.h0000644000000000000000000000013212442116672022474 xustar0030 mtime=1418239418.294171335 30 atime=1418239418.294171335 30 ctime=1457295923.288863831 transmission-2.92/macosx/InfoOptionsViewController.h0000644000175000017500000000570112442116672024124 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoOptionsViewController.h 13480 2012-09-08 18:09:02Z livings124 $ * * Copyright (c) 2010-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import "InfoViewController.h" @interface InfoOptionsViewController : NSViewController { NSArray * fTorrents; BOOL fSet; IBOutlet NSPopUpButton * fPriorityPopUp, * fRatioPopUp, * fIdlePopUp; IBOutlet NSButton * fUploadLimitCheck, * fDownloadLimitCheck, * fGlobalLimitCheck, * fRemoveSeedingCompleteCheck; IBOutlet NSTextField * fUploadLimitField, * fDownloadLimitField, * fRatioLimitField, * fIdleLimitField, * fUploadLimitLabel, * fDownloadLimitLabel, * fIdleLimitLabel, * fRatioLimitGlobalLabel, * fIdleLimitGlobalLabel, * fPeersConnectLabel, * fPeersConnectField; //remove when we switch to auto layout on 10.7 IBOutlet NSTextField * fTransferBandwidthSectionLabel, * fPrioritySectionLabel, * fPriorityLabel; IBOutlet NSTextField * fSeedingLimitsSectionLabel, * fRatioLabel, * fInactivityLabel; IBOutlet NSTextField * fAdvancedSectionLabel, * fMaxConnectionsLabel; NSString * fInitialString; } - (void) setInfoForTorrents: (NSArray *) torrents; - (void) updateInfo; - (void) updateOptions; - (IBAction) setUseSpeedLimit: (id) sender; - (IBAction) setSpeedLimit: (id) sender; - (IBAction) setUseGlobalSpeedLimit: (id) sender; - (IBAction) setRatioSetting: (id) sender; - (IBAction) setRatioLimit: (id) sender; - (IBAction) setIdleSetting: (id) sender; - (IBAction) setIdleLimit: (id) sender; - (IBAction) setRemoveWhenSeedingCompletes: (id) sender; - (IBAction) setPriority: (id) sender; - (IBAction) setPeersConnectLimit: (id) sender; @end transmission-2.92/macosx/PaxHeaders.4960/PeerTableView.h0000644000000000000000000000013212442116616020022 xustar0030 mtime=1418239374.018412586 30 atime=1418239374.018412586 30 ctime=1457295923.409865889 transmission-2.92/macosx/PeerTableView.h0000644000175000017500000000263712442116616021457 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: PeerTableView.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface PeerTableView : NSTableView @end transmission-2.92/macosx/PaxHeaders.4960/BlocklistStatusWindow.xib0000644000000000000000000000013212640354045022201 xustar0030 mtime=1451350053.575169928 30 atime=1451350053.575169928 30 ctime=1457295922.416849003 transmission-2.92/macosx/BlocklistStatusWindow.xib0000644000175000017500000000755412640354045023641 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/ShareTorrentFileHelper.m0000644000000000000000000000013212442116673021714 xustar0030 mtime=1418239419.188186655 30 atime=1418239419.188186655 30 ctime=1457295923.508867572 transmission-2.92/macosx/ShareTorrentFileHelper.m0000644000175000017500000000366312442116673023351 0ustar00mikedldmikedld00000000000000// // ShareTorrentFileHelper.m // Transmission // // Created by Mitchell Livingston on 1/10/14. // Copyright (c) 2014 The Transmission Project. All rights reserved. // #import "ShareTorrentFileHelper.h" #import "Controller.h" #import "Torrent.h" @implementation ShareTorrentFileHelper + (ShareTorrentFileHelper *) sharedHelper { static ShareTorrentFileHelper *helper; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ helper = [[ShareTorrentFileHelper alloc] init]; }); return helper; } - (NSArray *) shareTorrentURLs { NSArray * torrents = [(Controller *)[NSApp delegate] selectedTorrents]; NSMutableArray * fileURLs = [NSMutableArray arrayWithCapacity: [torrents count]]; for (Torrent * torrent in torrents) { NSString * location = [torrent torrentLocation]; if ([location length] > 0) { [fileURLs addObject: [NSURL fileURLWithPath: location]]; } } return fileURLs; } - (NSArray *) menuItems { NSArray * services = [NSSharingService sharingServicesForItems: [self shareTorrentURLs]]; NSMutableArray * items = [NSMutableArray arrayWithCapacity: [services count]]; for (NSSharingService * service in services) { NSMenuItem *item = [[NSMenuItem alloc] initWithTitle: service.title // 10.9: change to menuItemTitle action: @selector(performShareAction:) keyEquivalent: @""]; item.image = service.image; item.representedObject = service; service.delegate = (Controller *)[NSApp delegate]; item.target = self; [items addObject: item]; [item release]; } return items; } - (void) performShareAction: (NSMenuItem *) item { NSSharingService * service = item.representedObject; [service performWithItems: [self shareTorrentURLs]]; // on 10.9, use attachmentFileURLs? } @end transmission-2.92/macosx/PaxHeaders.4960/NSApplicationAdditions.m0000644000000000000000000000013212644245522021677 xustar0030 mtime=1452362578.780699537 30 atime=1452362578.780699537 30 ctime=1457295923.360865055 transmission-2.92/macosx/NSApplicationAdditions.m0000644000175000017500000000322312644245522023324 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: NSApplicationAdditions.m 14662 2016-01-06 11:05:37Z mikedld $ * * Copyright (c) 2009-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "NSApplicationAdditions.h" @implementation NSApplication (NSApplicationAdditions) - (BOOL) isOnMountainLionOrBetter { return floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_7; } - (BOOL) isOnYosemiteOrBetter { return floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_9; } @end transmission-2.92/macosx/PaxHeaders.4960/AddWindowController.m0000644000000000000000000000013212612560135021253 xustar0030 mtime=1445650525.072277165 30 atime=1445650525.072277165 30 ctime=1457295922.915857488 transmission-2.92/macosx/AddWindowController.m0000644000175000017500000003446112612560135022710 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: AddWindowController.m 14587 2015-10-23 04:09:40Z mikedld $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "AddWindowController.h" #import "Controller.h" #import "ExpandedPathToIconTransformer.h" #import "FileOutlineController.h" #import "GroupsController.h" #import "NSStringAdditions.h" #import "Torrent.h" #define UPDATE_SECONDS 1.0 #define POPUP_PRIORITY_HIGH 0 #define POPUP_PRIORITY_NORMAL 1 #define POPUP_PRIORITY_LOW 2 @interface AddWindowController (Private) - (void) updateFiles; - (void) confirmAdd; - (void) setDestinationPath: (NSString *) destination determinationType: (TorrentDeterminationType) determinationType; - (void) setGroupsMenu; - (void) changeGroupValue: (id) sender; - (void) sameNameAlertDidEnd: (NSAlert *) alert returnCode: (NSInteger) returnCode contextInfo: (void *) contextInfo; @end @implementation AddWindowController - (id) initWithTorrent: (Torrent *) torrent destination: (NSString *) path lockDestination: (BOOL) lockDestination controller: (Controller *) controller torrentFile: (NSString *) torrentFile deleteTorrentCheckEnableInitially: (BOOL) deleteTorrent canToggleDelete: (BOOL) canToggleDelete { if ((self = [super initWithWindowNibName: @"AddWindow"])) { fTorrent = torrent; fDestination = [[path stringByExpandingTildeInPath] retain]; fLockDestination = lockDestination; fController = controller; fTorrentFile = [[torrentFile stringByExpandingTildeInPath] retain]; fDeleteTorrentEnableInitially = deleteTorrent; fCanToggleDelete = canToggleDelete; fGroupValue = [torrent groupValue]; fGroupValueDetermination = TorrentDeterminationAutomatic; [fVerifyIndicator setUsesThreadedAnimation: YES]; } return self; } - (void) awakeFromNib { [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateCheckButtons:) name: @"TorrentFileCheckChange" object: fTorrent]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateGroupMenu:) name: @"UpdateGroups" object: nil]; [fFileController setTorrent: fTorrent]; NSString * name = [fTorrent name]; [[self window] setTitle: name]; [fNameField setStringValue: name]; [fNameField setToolTip: name]; [fIconView setImage: [fTorrent icon]]; if (![fTorrent isFolder]) { [fFileFilterField setHidden: YES]; [fCheckAllButton setHidden: YES]; [fUncheckAllButton setHidden: YES]; NSRect scrollFrame = [fFileScrollView frame]; const CGFloat diff = NSMinY([fFileScrollView frame]) - NSMinY([fFileFilterField frame]); scrollFrame.origin.y -= diff; scrollFrame.size.height += diff; [fFileScrollView setFrame: scrollFrame]; } else [self updateCheckButtons: nil]; [self setGroupsMenu]; [fGroupPopUp selectItemWithTag: fGroupValue]; NSInteger priorityIndex; switch ([fTorrent priority]) { case TR_PRI_HIGH: priorityIndex = POPUP_PRIORITY_HIGH; break; case TR_PRI_NORMAL: priorityIndex = POPUP_PRIORITY_NORMAL; break; case TR_PRI_LOW: priorityIndex = POPUP_PRIORITY_LOW; break; default: NSAssert1(NO, @"Unknown priority for adding torrent: %d", [fTorrent priority]); } [fPriorityPopUp selectItemAtIndex: priorityIndex]; [fStartCheck setState: [[NSUserDefaults standardUserDefaults] boolForKey: @"AutoStartDownload"] ? NSOnState : NSOffState]; [fDeleteCheck setState: fDeleteTorrentEnableInitially ? NSOnState : NSOffState]; [fDeleteCheck setEnabled: fCanToggleDelete]; if (fDestination) [self setDestinationPath: fDestination determinationType: (fLockDestination ? TorrentDeterminationUserSpecified : TorrentDeterminationAutomatic)]; else { [fLocationField setStringValue: @""]; [fLocationImageView setImage: nil]; } fTimer = [[NSTimer scheduledTimerWithTimeInterval: UPDATE_SECONDS target: self selector: @selector(updateFiles) userInfo: nil repeats: YES] retain]; [self updateFiles]; } - (void) windowDidLoad { //if there is no destination, prompt for one right away if (!fDestination) [self setDestination: nil]; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; [fTimer invalidate]; [fTimer release]; [fDestination release]; [fTorrentFile release]; [super dealloc]; } - (Torrent *) torrent { return fTorrent; } - (void) setDestination: (id) sender { NSOpenPanel * panel = [NSOpenPanel openPanel]; [panel setPrompt: NSLocalizedString(@"Select", "Open torrent -> prompt")]; [panel setAllowsMultipleSelection: NO]; [panel setCanChooseFiles: NO]; [panel setCanChooseDirectories: YES]; [panel setCanCreateDirectories: YES]; [panel setMessage: [NSString stringWithFormat: NSLocalizedString(@"Select the download folder for \"%@\"", "Add -> select destination folder"), [fTorrent name]]]; [panel beginSheetModalForWindow: [self window] completionHandler: ^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { fLockDestination = YES; [self setDestinationPath: [[[panel URLs] objectAtIndex: 0] path] determinationType: TorrentDeterminationUserSpecified]; } else { if (!fDestination) [self performSelectorOnMainThread: @selector(cancelAdd:) withObject: nil waitUntilDone: NO]; } }]; } - (void) add: (id) sender { if ([[fDestination lastPathComponent] isEqualToString: [fTorrent name]] && [[NSUserDefaults standardUserDefaults] boolForKey: @"WarningFolderDataSameName"]) { NSAlert * alert = [[NSAlert alloc] init]; [alert setMessageText: NSLocalizedString(@"The destination directory and root data directory have the same name.", "Add torrent -> same name -> title")]; [alert setInformativeText: NSLocalizedString(@"If you are attempting to use already existing data," " the root data directory should be inside the destination directory.", "Add torrent -> same name -> message")]; [alert setAlertStyle: NSWarningAlertStyle]; [alert addButtonWithTitle: NSLocalizedString(@"Cancel", "Add torrent -> same name -> button")]; [alert addButtonWithTitle: NSLocalizedString(@"Add", "Add torrent -> same name -> button")]; [alert setShowsSuppressionButton: YES]; [alert beginSheetModalForWindow: [self window] modalDelegate: self didEndSelector: @selector(sameNameAlertDidEnd:returnCode:contextInfo:) contextInfo: nil]; } else [self confirmAdd]; } - (void) cancelAdd: (id) sender { [[self window] performClose: sender]; } //only called on cancel - (BOOL) windowShouldClose: (id) window { [fTimer invalidate]; [fTimer release]; fTimer = nil; [fFileController setTorrent: nil]; //avoid a crash when window tries to update [fController askOpenConfirmed: self add: NO]; return YES; } - (void) setFileFilterText: (id) sender { [fFileController setFilterText: [sender stringValue]]; } - (IBAction) checkAll: (id) sender { [fFileController checkAll]; } - (IBAction) uncheckAll: (id) sender { [fFileController uncheckAll]; } - (void) verifyLocalData: (id) sender { [fTorrent resetCache]; [self updateFiles]; } - (void) changePriority: (id) sender { tr_priority_t priority; switch ([sender indexOfSelectedItem]) { case POPUP_PRIORITY_HIGH: priority = TR_PRI_HIGH; break; case POPUP_PRIORITY_NORMAL: priority = TR_PRI_NORMAL; break; case POPUP_PRIORITY_LOW: priority = TR_PRI_LOW; break; default: NSAssert1(NO, @"Unknown priority tag for adding torrent: %ld", [sender tag]); } [fTorrent setPriority: priority]; } - (void) updateCheckButtons: (NSNotification *) notification { NSString * statusString = [NSString stringForFileSize: [fTorrent size]]; if ([fTorrent isFolder]) { //check buttons //keep synced with identical code in InfoFileViewController.m const NSInteger filesCheckState = [fTorrent checkForFiles: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fTorrent fileCount])]]; [fCheckAllButton setEnabled: filesCheckState != NSOnState]; //if anything is unchecked [fUncheckAllButton setEnabled: ![fTorrent allDownloaded]]; //if there are any checked files that aren't finished //status field NSString * fileString; NSInteger count = [fTorrent fileCount]; if (count != 1) fileString = [NSString stringWithFormat: NSLocalizedString(@"%@ files", "Add torrent -> info"), [NSString formattedUInteger: count]]; else fileString = NSLocalizedString(@"1 file", "Add torrent -> info"); NSString * selectedString = [NSString stringWithFormat: NSLocalizedString(@"%@ selected", "Add torrent -> info"), [NSString stringForFileSize: [fTorrent totalSizeSelected]]]; statusString = [NSString stringWithFormat: @"%@, %@ (%@)", fileString, statusString, selectedString]; } [fStatusField setStringValue: statusString]; } - (void) updateGroupMenu: (NSNotification *) notification { [self setGroupsMenu]; if (![fGroupPopUp selectItemWithTag: fGroupValue]) { fGroupValue = -1; fGroupValueDetermination = TorrentDeterminationAutomatic; [fGroupPopUp selectItemWithTag: fGroupValue]; } } @end @implementation AddWindowController (Private) - (void) updateFiles { [fTorrent update]; [fFileController refresh]; [self updateCheckButtons: nil]; //call in case button state changed by checking if ([fTorrent isChecking]) { const BOOL waiting = [fTorrent isCheckingWaiting]; [fVerifyIndicator setIndeterminate: waiting]; if (waiting) [fVerifyIndicator startAnimation: self]; else [fVerifyIndicator setDoubleValue: [fTorrent checkingProgress]]; } else { [fVerifyIndicator setIndeterminate: YES]; //we want to hide when stopped, which only applies when indeterminate [fVerifyIndicator stopAnimation: self]; } } - (void) confirmAdd { [fTimer invalidate]; [fTimer release]; fTimer = nil; [fTorrent setGroupValue: fGroupValue determinationType: fGroupValueDetermination]; if (fTorrentFile && fCanToggleDelete && [fDeleteCheck state] == NSOnState) [Torrent trashFile: fTorrentFile error: nil]; if ([fStartCheck state] == NSOnState) [fTorrent startTransfer]; [fFileController setTorrent: nil]; //avoid a crash when window tries to update [self close]; [fController askOpenConfirmed: self add: YES]; //ensure last, since it releases this controller } - (void) setDestinationPath: (NSString *) destination determinationType: (TorrentDeterminationType) determinationType { destination = [destination stringByExpandingTildeInPath]; if (!fDestination || ![fDestination isEqualToString: destination]) { [fDestination release]; fDestination = [destination retain]; [fTorrent changeDownloadFolderBeforeUsing: fDestination determinationType: determinationType]; } [fLocationField setStringValue: [fDestination stringByAbbreviatingWithTildeInPath]]; [fLocationField setToolTip: fDestination]; ExpandedPathToIconTransformer * iconTransformer = [[ExpandedPathToIconTransformer alloc] init]; [fLocationImageView setImage: [iconTransformer transformedValue: fDestination]]; [iconTransformer release]; } - (void) setGroupsMenu { NSMenu * groupMenu = [[GroupsController groups] groupMenuWithTarget: self action: @selector(changeGroupValue:) isSmall: NO]; [fGroupPopUp setMenu: groupMenu]; } - (void) changeGroupValue: (id) sender { NSInteger previousGroup = fGroupValue; fGroupValue = [sender tag]; fGroupValueDetermination = TorrentDeterminationUserSpecified; if (!fLockDestination) { if ([[GroupsController groups] usesCustomDownloadLocationForIndex: fGroupValue]) [self setDestinationPath: [[GroupsController groups] customDownloadLocationForIndex: fGroupValue] determinationType: TorrentDeterminationAutomatic]; else if ([fDestination isEqualToString: [[GroupsController groups] customDownloadLocationForIndex: previousGroup]]) [self setDestinationPath: [[NSUserDefaults standardUserDefaults] stringForKey: @"DownloadFolder"] determinationType: TorrentDeterminationAutomatic]; else; } } - (void) sameNameAlertDidEnd: (NSAlert *) alert returnCode: (NSInteger) returnCode contextInfo: (void *) contextInfo { if ([[alert suppressionButton] state] == NSOnState) [[NSUserDefaults standardUserDefaults] setBool: NO forKey: @"WarningFolderDataSameName"]; [alert release]; if (returnCode == NSAlertSecondButtonReturn) [self performSelectorOnMainThread: @selector(confirmAdd) withObject: nil waitUntilDone: NO]; } @end transmission-2.92/macosx/PaxHeaders.4960/TransmissionHelp0000644000000000000000000000013212442116630020374 xustar0030 mtime=1418239384.823597756 30 atime=1418239381.881547338 30 ctime=1457295922.579851774 transmission-2.92/macosx/TransmissionHelp/0000755000175000017500000000000012442116630022076 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/TransmissionHelp/PaxHeaders.4960/TransmissionHelp.helpindex0000644000000000000000000000013112442116626025661 xustar0030 mtime=1418239382.264553901 30 atime=1418239382.264553901 29 ctime=1457295922.57785174 transmission-2.92/macosx/TransmissionHelp/TransmissionHelp.helpindex0000644000175000017500000011757312442116626027325 0ustar00mikedldmikedld00000000000000 streamtypedè„@„„„NSMutableDictionary„„ NSDictionary„„NSObject…„i’„„„NSString•„+SKI_ANCHOR_DATA†’„“– ’„—˜peers†’„„„NSMutableArray„„NSArray•–’„—˜/html/peers.html††’„—˜network†’„›–’„—˜/html/network.html††’„—˜script†’„›–’„—˜/html/scripts.html††’„—˜ ax-index-link†’„›–’„—˜/html/Index2.html††’„—˜TransFAQ†’„›–’„—˜/html/FAQ.html††’„—˜remote†’„›–’„—˜/html/remote.html††’„—˜ax-index†’„›–’„—˜/html/Index2.html††’„—˜menus†’„›–’„—˜/html/pffirewall.html†’„—˜/html/pfrouter.html†’„—˜/html/scripts.html†’„—˜/html/remote.html†’„—˜/html/tracker.html†’„—˜/html/FAQ.html†’„—˜/html/troubleshoot.html†’„—˜/html/usingt.html†’„—˜/html/network.html†’„—˜/html/gettingstarted.html†’„—˜/html/portforward.html†’„—˜/html/check.html†’„—˜/html/Speed.html†’„—˜/html/peers.html†’„—˜/html/Index2.html††’„—˜GettingStarted†’„›–’„—˜/html/gettingstarted.html†††’„—˜SKI_INDEX_DATA†’„„„ NSMutableData„„NSData•–x„[30720c]Bud2ppF% ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBud2N£*Ó  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±lastÿÿÿÿÿÿÿÿÿÿÿÿÿfast«preferÐ!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿuÿÿÿÿÿÿÿÿÿÿÿÿuÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿBud2N£*Ó  vÝÿÿÿÿÿÿÿÿÿÿÿÿÿIADefaultTextAnaysiskSKMinTermLength  kSKStopWords6arethansuchwhosethoughhowbesidesbecausetoowillintoevennonwhywouldnbutwhomshouldwhichaboutwasbetweenhavewhenforeverywouldalsoyesthesecouldnorwhilewhothenmaybewasnwhathadeverthatetcwerewiththisawaywherebesidenowdidthoseisnbeencannot kSKTermChars' ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfile Index2.html%file peers.html¼file Speed.htmlÁfile check.html9 fileportforward.html ™ filegettingstarted.html þ file network.html ˆ file usingt.html ž filetroubleshoot.html ÓfileFAQ.html¾file tracker.html–file remote.htmlšfile scripts.html-file pfrouter.html‰file index.htmlfilepffirewall.htmlNfilehtmlÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfilehtmlfile index.htmlfileFAQ.html¾file Index2.html%file Speed.htmlÁfile check.html9filegettingstarted.html þfile network.html ˆfile peers.html¼filepffirewall.htmlNfile pfrouter.html‰fileportforward.html ™file remote.htmlšfile scripts.html-file tracker.html–filetroubleshoot.html Ófile usingt.html žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ F†å ¥ÅE…%å%eÅIADefaultIndex @€ @€ @€ @ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ DT!Configuring the Mac OS X FirewallDTTransmission HelpDTPort Forwarding a RouterDT Script HelpDT Remote HelpDTTracker InformationDTFrequently Asked Questions D TTroubleshooting a Closed port D TUsing Transmission D T Network Help D TGetting Started D TPort Forwarding FAQDTTroubleshooting Manual RecheckDTMaximizing your download speedDTPeersDIndexTIndexÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ% preferenceÑ preferencesÒ  prefsÓpresenceÔpriorityÕprivateÖ privately× probablyØproblemsÙprogressÚ proportionÛ proportionalÜprotectÝ protectedÞ protocolß  protocol'à providersápublicâpullãpurposesä qualityå questionsæ#queueçqueuedèqueuingéquickerê quicklyëquitì randomí randomlyîrangeï rateðratherñratioòrc4ó!readôrealõ reallyö reason÷rebootø receiveùrecheckú  recommendedûredüreduceýreducingþreferredÿrefers€ rejoin releases‚relevantƒremain„remains…remember†remote‡ removeˆreopen‰resembleŠ respective‹restrictŒ resultantresultsŽresumereturn risk‘!router’ router's“ routers”rule•rules–run—running˜  safari™samešsave› savedœscarcescheduležscrapingŸscreen script¡ scripts¢ sec£second¤secure¥!security¦see§seed¨seeders©seedingªseeds«select¬selected­selector®sent¯server°service±services²session³!set´ settingµ!settings¶setup·severely¸!shades¹shapingº!share»sharing¼shown½shows¾similar¿simpleÀsimplerÁ simplyÂsimultaneouslyÃsinceÄskipÅslowÆslowedÇsmallÈsoÉsomeÊ somethingË sometimesÌsortÍsortingÎspecificÏ specifiedÐ speedÑspeedsÒ  spreadingÓstalledÔstandardÕ!startÖstarted× startingØ stateÙstaticÚstationÛ statisticsÜstatsÝstatusÞstepßstepsà stillá stopâ subnetã successfullyä suchåsumæsupportç supportedè supportsé  sureê swarmë swarmsì!systemí tabîtableï!table'ð!takeñtargetsòtcpótestôtextõ!that'sö the÷, ',theirøthemùthenúthereû thereforeütheseýtheyþthingsÿ thinly€this throttle‚ throttlingƒthumb„thus… tick†tier‡timeˆ tips‰toŠ   toggle‹toolbarŒtorrent   torrent'sŽtorrents torrents'total‘!tr’ tracked“ tracker”  trackerless•trackers– traffic—transfer˜ transferring™ transfersš   transmission›   transmission'sœ transporttroubleshootingž#trustedŸ try tune¡turn¢turtle£twice¤two¥ type¦ ultimately§unable¨ unchecked© unconnectableª! unencrypted«unique¬unless­ unreachable®!until¯ unverified°up±update²updating³upload´ uploadedµ uploading¶ upnp·  upon¸use¹ usedº uses» using¼ usual½ utilities¾utility¿ utility'À utilizingÁ!valueÂ!valuesÃ! variablesÄ variousÅ verificationÆ#verifiedÇverifyÈversionÉ veryÊviaË viewÌ  vuzeÍ waitÎwaitingÏwantÐ watchÑwayÒweÓ webÔwebsitesÕweeklyÖ!welcome× wellØ whatÙ  whenÚ whereÛ whileÜwhiteÝwholeÞwhyßwikià windowáwirelessâ wishã withinä withoutå workæ workingçworksèworldéwriteêwroteë yesì youí  you'llîyou'reïyourð   yourselfñ zeroòzipó! μtorrentô μtpõÿÿÿÿÿ*'airport 'announce' 'application' 'apply 'automatically'bridge'bridge''change' 'connections' !'create' 'debug'  'distributed !'enable  'end 'files''ignore'launch 'leecher''magnet'micro 'nightlies''peer!'port'save'scrape''seed''seeder''speed'start 'status' 'tier'tiers' 'torrent! 'tracker'" 'trans'# 00$1'%10&100'128(15)168*192+2',200-!2001.21/2560491521 500012603655354 665706able7above8accept9access:access'; achieved<across=!action> activities?!activity@ actualAaddB  addedCaddingDaddressE    addressesF adjustGadjustedH adminI adslJafterKagainLairportM  allN  allocationOallowPallowedQallowingR allowsSalreadyT  alternativelyU althoughValwaysW!amountXanYandZ    announces[ anonymous\!another] any^app_ appear`appearsaappleb apple'sc applicationd  applicationse appliedfareg ash  askedi#askingj assignedk associatedlatmattachn autoo! automaticp automaticallyq availabler avoids  bandwidthtbaru basevbew beforexbeingy beneficialz best{better|bit} bittorrent~ bleedingblock€ blocklist  blocklists‚!blueƒ both„ box…  boxes† brackets‡ broadbandˆbrowser‰browsingŠ!bs‹ bugfixesŒbuiltbuttonŽ by  calledcan‘ cap’case“cases”cause•certain–change—changed˜changing™ checkš checkbox› checkboxesœcheckedcheckingžchecksumŸchoose  chooses¡choosing¢chose£ cipher¤!clear¥click¦clicking§ client¨clients© closedªclosed'«color¬colors­comments®commonly¯ compatible°complete±  completely² comprehensive³ compressed´! compressionµ!computer¶ computer's· computers¸ configuration¹ configureº configured» configuring¼ congestion½connect¾  connected¿ connectingÀ! connectionÁ connections  consultà contactedÄcontainÅ containingÆ!continueÇ! continuesÈcontrolÉ  correctlyÊ corruptedËcrashÌcrashedÍcrashesÎcrashingÏ! crashreporterÐcreateÑ criteriaÒ currentlyÓdarkerÔdataÕ debugÖdefault× deletesØdeletionÙdependsÚdesignedÛdetailedÜ developmentÝdeviceÞdevicesßdhcpà dhtádialâdialogã differentä digitå diræ directlyçdisableèdisabledédiscountê discoveringë! discretionìdiscussídisplayî distributedï!dividedðdlñdmzòdnsó doô  documentationõdoesö  doesn't÷don'tø doneùdotúdoubleû downüdownloadý downloadedþ downloadingÿ downloads€ dragdragging‚dropƒ dsl„during…dynamic† each‡  easierˆeasiest‰edgeŠ efficiency‹egŒ eitherelseŽenable enabled enabling‘ encrypted’! encryption“encrypts”!enough• ensure–enter—entered˜! environment™ especiallyš establishing›etcœ ethernet etiquetteževeryoneŸ example  examples¡ exchange¢! exchange'£!expense¤ experience¥ extension¦external§ extreme¨failed©faqª#ÿÿÿÿÿÿÿÿÿÿÿÿÿ$faster¬feature­features®few¯fighting°file±file'²file's³filename´filesµ filesharing¶fill· filter¸ filtering¹finallyºfind»finds¼fine½finish¾firewall¿  firstÀfixedÁfloodedÂflyÃfolderÄ followingÅ forÆforceÇformatÈ formatsÉ!forumsÊforwardË  forwardedÌ forwardingÍ foundÎ frequentlyÏ#fromÐfunctionÑfurtherÒ furthermoreÓgeneralÔ generallyÕ getÖ getting×#givenØ givesÙglobalÚ goÛ goingÜ goodÝgreenÞ groupßgroupsà  growláhappenâhappensãhasä hashå haveæ haven'tçhavingè heldéhelpêhelpfulë hereì highíhighlyîhinderï!holdingðhomeñhowò howeveróhttpô iconõidö identifier÷ieøifù  ignoreú! illuminatedû immediatelyüimplementationý! implementedþ! importantlyÿimprove€in    including‚!incomingƒ incomplete„ incorrect…increase† increases‡ increasingˆindex‰indicateŠ individual‹infoŒ information  initiallyŽ inspector instanceinstead‘  instructions’ interact“ interface”  interface'• interfering–internal— internet˜ invoke™ invokedšip›ipv4œ is    isn'tž ispŸisps issue¡issues¢it£  it's¤ item¥its¦ itself§ just¨kb©kbitªkeep«kilobits¬known­labels®laptop¯ large° last±latency²latter³!least´leaveµ  leechers¶left·let's¸ library¹lighterºlike»likely¼ limit½limited¾limits¿linksÀlinks'Álist  listedÃlocalÄ localipÅ  localtimeÆ locatedÇ locationÈ logÉlogsÊlongËlosingÌlotsÍlowÎmacÏmacbookÐmachineÑ madeÒmagnetÓmainÔmakeÕ makesÖ manage× managementØmanagingÙ manualÚmanuallyÛ  manufacturedÜmanyÝ mapÞmappedßmappingà maská maximiseâmaximizeã maximizingämaximumåmayæ meançmeansèmeasuresé!menuêmerelyë!messageì methodí!microîmightï mindðminusñminutesòmodeómode'ômodemõmodemsömodify÷monitorø moreù mostú muchûmultiümultipleý  multitrackerþmustÿmy€name nat‚  necessaryƒ need„needs…network† new‡newlyˆnext‰ nightliesŠno‹normalŒnormally notŽ note notificationnow‘ now'’ number“  obtained”!of•  off– officially—often˜ok™ onšonce›oneœonline!onlyž openŸopen' opening¡opens¢optimize£option¤ options¥or¦ orange§order¨organize©originalªos« other¬  others­our® out¯ output°outside±over² overcome³own´ pageµpart¶ particular·password¸ pause¹peerº peers»   peers'¼people½per¾!period¿ periodicallyÀpexÁ pick pieceÃpiecesÄplacedÅplusÆpmpÇ portÈ  port'ÉportsÊ possibilityË possibleÌpossiblyÍ!postÎ potentialÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°°large¯laptop®labels­known¬kilobits«keepªkbit©kb¨just§itself¦its¥item¤it's£it¢issues¡issue ispsŸispžisn'tisœipv4›ipšinvoked™invoke˜internet—internal– interfering• interface'” interface“interact’ instructions‘insteadinstance inspectorŽ initially informationŒinfo‹ individualŠindicate‰indexˆ increasing‡ increases†increase… incorrect„ incompleteƒincoming‚ includingin€improveÿ importantlyþ implementedýimplementationü immediatelyû illuminatedúignoreùiføie÷ identifieröidõiconôhttpóhoweveròhowñhomeðholdingïhinderîhighlyíhighìhereëhelpfulêhelpéheldèhavingçhaven'tæhaveåhashähasãhappensâhappenágrowlàgroupsßgroupÞgreenÝgoodÜgoingÛgoÚglobalÙgivesØgiven×gettingÖgetÕ generallyÔgeneralÓ furthermoreÒfurtherÑfunctionÐfromÏ frequentlyÎfoundÍ forwardingÌ forwardedËforwardÊforumsÉformatsÈformatÇforceÆforÅ followingÄfolderÃflyÂfloodedÁfixedÀfirst¿firewall¾finish½fine¼finds»findºfinally¹ filtering¸filter·fill¶ filesharingµfiles´filename³file's²file'±file°fighting¯few®features­feature¬faster«fastªfaq©failed¨extreme§external¦ extension¥ experience¤expense£ exchange'¢exchange¡examples exampleŸeveryonež etiquetteethernetœetc› establishingš especially™ environment˜entered—enter–ensure•enough”encrypts“ encryption’ encrypted‘enablingenabledenableŽelseeitherŒeg‹ efficiencyŠedge‰easiestˆeasier‡each†dynamic…during„dslƒdrop‚draggingdrag€ downloadsÿ downloadingþ downloadedýdownloadüdownûdoubleúdotùdoneødon't÷doesn'tödoesõ documentationôdoódnsòdmzñdlðdividedï distributedîdisplayídiscussì discretionë discoveringêdiscountédisabledèdisableçdirectlyædirådigitä differentãdialogâdialádhtàdhcpßdevicesÞdeviceÝ developmentÜdetailedÛdesignedÚdependsÙdeletionØdeletes×defaultÖdebugÕdataÔdarkerÓ currentlyÒcriteriaÑcreateÐ crashreporterÏcrashingÎcrashesÍcrashedÌcrashË corruptedÊ correctlyÉcontrolÈ continuesÇcontinueÆ containingÅcontainÄ contactedÃconsult connectionsÁ connectionÀ connecting¿ connected¾connect½ congestion¼ configuring» configuredº configure¹ configuration¸ computers· computer's¶computerµ compression´ compressed³ comprehensive² completely±complete° compatible¯commonly®comments­colors¬color«closed'ªclosed©clients¨client§clicking¦click¥clear¤cipher£chose¢choosing¡chooses chooseŸchecksumžcheckingcheckedœ checkboxes›checkboxšcheck™changing˜changed—change–certain•cause”cases“case’cap‘cancalledbyŽbuttonbuiltŒbugfixes‹bsŠbrowsing‰browserˆ broadband‡brackets†boxes…box„bothƒblue‚ blocklists blocklist€blockbleeding~ bittorrent}bit|better{bestz beneficialybeingxbeforewbevbaseubart bandwidthsavoidr availableq automaticallyp automaticoautonattachmatl associatedkassignedjaskingiaskedhasgarefappliede applicationsd applicationcapple'sbappleaappears`appear_app^any]another\ anonymous[ announcesZandYanXamountWalwaysValthoughU alternativelyTalreadySallowsRallowingQallowedPallowO allocationNallMairportLagainKafterJadslIadminHadjustedGadjustF addressesEaddressDaddingCaddedBaddAactual@activity? activities>action=across<achieved;access':access9accept8above7able6705664655353602500011491520256/21.2001-200,2'+192*168)15(128'100&10%1'$00#'trans'" 'tracker'!'torrent 'tiers''tier'status''start'speed'seeder''seed''scrape''save'port'peer 'nightlies''micro'magnet 'leecher''launch'ignore'files''end 'enable 'distributed 'debug' 'create' 'connections''change''bridge''bridge'automatically'apply 'application' 'announce''airportÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄõμtpô μtorrentózipòzeroñyourselfðyourïyou'reîyou'llíyouìyesëwroteêwriteéworldèworksçworkingæworkåwithoutäwithinãwishâwirelessáwindowàwikißwhyÞwholeÝwhiteÜwhileÛwhereÚwhenÙwhatØwell×welcomeÖweeklyÕwebsitesÔwebÓweÒwayÑwatchÐwantÏwaitingÎwaitÍvuzeÌviewËviaÊveryÉversionÈverifyÇverifiedÆ verificationÅvariousÄ variablesÃvaluesÂvalueÁ utilizingÀutility'¿utility¾ utilities½usual¼using»usesºused¹use¸upon·upnp¶ uploadingµuploaded´upload³updating²update±up° unverified¯until® unreachable­unless¬unique« unencryptedª unconnectable© unchecked¨unable§ ultimately¦type¥two¤twice£turtle¢turn¡tune tryŸtrustedžtroubleshooting transportœtransmission's› transmissionš transfers™ transferring˜transfer—traffic–trackers• trackerless”tracker“tracked’tr‘total torrents'torrentsŽ torrent'storrentŒtoolbar‹toggleŠto‰tipsˆtime‡tier†tick…thus„thumbƒ throttling‚throttlethis€thinlyÿthingsþtheyýtheseü thereforeûthereúthenùthemøtheir÷theöthat'sõtextôtestótcpòtargetsñtakeðtable'ïtableîtabísystemìswarmsëswarmêsureésupportsè supportedçsupportæsumåsuchä successfullyãsubnetâstopástillàstepsßstepÞstatusÝstatsÜ statisticsÛstationÚstaticÙstateØstarting×startedÖstartÕstandardÔstalledÓ spreadingÒspeedsÑspeedÐ specifiedÏspecificÎsortingÍsortÌ sometimesË somethingÊsomeÉsoÈsmallÇslowedÆslowÅskipÄsinceÃsimultaneouslyÂsimplyÁsimplerÀsimple¿similar¾shows½shown¼sharing»shareºshaping¹shades¸severely·setup¶settingsµsetting´set³session²services±service°server¯sent®selector­selected¬select«seedsªseeding©seeders¨seed§see¦security¥secure¤second£sec¢scripts¡script screenŸscrapingžschedulescarceœsaved›savešsame™safari˜running—run–rules•rule”routers“router's’router‘riskreturnresumeŽresults resultantŒrestrict‹ respectiveŠresemble‰reopenˆremove‡remote†remember…remains„remainƒrelevant‚releasesrejoin€refersÿreferredþreducingýreduceüredû recommendedúrecheckùreceiveøreboot÷reasonöreallyõrealôreadórc4òratioñratherðrateïrangeîrandomlyírandomìquitëquicklyêquickeréqueuingèqueuedçqueueæ questionsåqualityäpurposesãpullâpublicá providersà protocol'ßprotocolÞ protectedÝprotectÜ proportionalÛ proportionÚprogressÙproblemsØprobably× privatelyÖprivateÕpriorityÔpresenceÓprefsÒ preferencesÑ preferenceÐpreferÏ potentialÎpostÍpossiblyÌpossibleË possibilityÊportsÉport'ÈportÇpmpÆplusÅplacedÄpiecesÃpieceÂpickÁpexÀ periodically¿period¾per½people¼peers'»peersºpeer¹pause¸password· particular¶partµpage´own³overcome²over±outside°output¯out®our­others¬other«osªoriginal©organize¨order§orange¦or¥options¤option£optimize¢opens¡opening open'Ÿopenžonlyonlineœone›oncešon™ok˜often— officially–off•of”obtained“number’now'‘now notificationnoteŽnotnormallyŒnormal‹noŠ nightlies‰nextˆnewly‡new†network…needs„needƒ necessary‚natname€myÿmustþ multitrackerýmultipleümultiûmuchúmostùmoreømonitor÷modifyömodemsõmodemômode'ómodeòminutesñminusðmindïmightîmicroímethodìmessageëmerelyêmenuémeasuresèmeansçmeanæmayåmaximumä maximizingãmaximizeâmaximiseámaskàmappingßmappedÞmapÝmanyÜ manufacturedÛmanuallyÚmanualÙmanagingØ management×manageÖmakesÕmakeÔmainÓmagnetÒmadeÑmachineÐmacbookÏmacÎlowÍlotsÌlosingËlongÊlogsÉlogÈlocationÇlocatedÆ localtimeÅlocalipÄlocalÃlistedÂlistÁlinks'Àlinks¿limits¾limited½limit¼likely»likeºlighter¹library¸let's·left¶leechersµleave´least³latter²latencyÿÿÿÿÿÿÿÿÿÿÿp FF% …å¥Å  P  F0 @ %` IADefaultIndex €€x€ @€ @ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†’„—˜ SDMIndexData†’„Æ–³"„[8883c]SDMIBZh91AY&SY&DÊ\ÿÿÿÿÿÿøû”ëÿB¿ÿÿðg@í¬1€È À †`*Þ=g¥à󯦕µ­©¶Ó­S´ÈMœ²¹¶bèãM˜úëÆòkºF”ûÛÞ‹j¥ ûjçwN­}wÝî¼ÙljfÚ­µx=:òÊíá:õKlw¤Ü”½†„¦’hLLL€hFM1¨&Ôž¦h£C Ȇ€ÐhÓM5OÈ"d£(hôe4ò€õ<¦‚M&©£Fž¡RÔÐzA  Ð Ðh$ÒHˆOSLM4i¨d˜›Tm@hm@È ÐD¢i*~ Ô0hÍ#`h40ƒLC3S#L 馦 ‘&šFðÄôšh£bj5ÔɈN?Ùûþ¾O[#øþpxÿxø/{¶›{·2,_[#^ißBÜí-è>ì¡z y°_wŽK]A%=®ð\(ÅkS9r‚•º­@T¥lTTkR¶È@÷’6ÈLͲI t„%BH¨¤Š²”JDA‘TøhçùÙ¼|bƧûŸ{µ$ÞÇÚöiúÈš#–Ô¸îÜ0±CÚ73bÂÑöh) ]øÿ_UG8ÛØy¤Àƒ?âd±dÇë’Ÿò,Þ„Œ²ÊÂ7"r)¾–Ã>äðøÜ~$  º€TFzÅýêZ¢|¼§ÃøÙ=ôdŒË5sú˜··Ò/IN{†ö£Õ¢jé߾ϓ4¹vÙêS¤iÌxC¯¨¡ h¬‡Pˆo?¶£Xß#R ‰" £½ÆJ*h¢p“¨2sæ"wàÓXQ ó¡Ùºì Ö9 ¸uð’¸ØŒKð7¬U8S›3òùf¾›šbéî ,Ô…n“Ý4 ñøa]a‡o=æÉž8ãš$NÒ%¼¡ÍÊ©¢Ã”̢ȅæ/.ä=™2›Ðø$ö.< I˜TaŸ#‰nÝN± B›¬µ®Åí²4‘áǬ› àlã$ÀrNH‰¦ ‹¹T Ö+Õ1††ó64ÏFP¹ÃÜÆBEÁ.ÒÌ\ÔÒl@y‹q,;rÛõÄÚ¼ÂD1ð5uz¤Q \_Fº†Ð¾ó4/ÏfPƨc ħÙÃeÓð‡áW U †0^xG¼ø­üÆ_K‘M®è“ÎqÞ/Œ.BŒ ©M(hÓÃD‰ªªã A¯I8gÙ~$s³¸–$iÊ 3 hyY»¢Ì þ¸Øòhadø Å„UÃús¡ÑçÖcõSÿÌ|ö/Ö„™qzüèûÞÒ` ÎÍRfiþ‡×ï¬.B…OÖ–ÄÞ'õ‚¦5B4Œ=˜íZ06âåƒ0lc\«‰¼sÊŸ®ÚldñËó'£Òª =m¥¥eüΞÎ^pv—½£ÍÞ7×ÙWE­§ ¤Ü]%›y±ú^N}Éõúº0~=F³šT³oŠ´¥b+i‹8mRŽm¤–0‚ -6·¯o.øÝ|›ÉD¯ÜÜsåºÜŽ÷§â8¹fͱó[4Øê!µ¾ä–Xµz PvŒ`udûÞ Àh»[OÍ%@\S{ø–…©’˜”[ׯyC65/,ý4Ò\Áˆ‘£¯Î4€mj*o\o !‘kr¸"blð;½¨§‡‰áZ[[g**—c“#iÁb$5H¹ÞÁªkšT;µŒÞuà_‹âJY ão1·o ®|ì¬åš@Öp²Ð2%K–ѹ‰M4Ç*AâQF¼UभG¡TÁ`ü|Û9£¯ŠûŠO ïSÚHŸ„ëu$:ïµ&BÈDÊv<A¯¶%º‰xøvúi9-’N+uÛæo‡ãð ãÂ!ÃcK—¿*!§SL„)€†$“ ɳ‰aͯ*ÇF¨8ôÍQ“&GQw¾¢\»m¿”¾M«&TfFVj¦ÖôÄ.¼Å^¥÷°0¢‡ëñP®îÅÛÇâLjm6ÛmÎeâCèÑì5ÕIáçÂd&Á»‚TP©¹iŽRñSÁ<‰äe ¬n'Y‡òc<ÉãÜÒú䱌¨ÂÖœ–»'¡µ†ëµ÷³K žÓ;7Œ„ã”ÑTp¬Òª+2¸ ‘•¶ÛeN{»ÉåÒzŒœ°ºu;ž¨R7ÃY¦Ö­ôFÞñ—#Z3êz3ñê–Kº ¬µ?´øße£s×îÇnÖí$˜ß§cí_O]qÊ $’P@ü@>ÊÝ"NÔv@§ˆŠdàáΓ¢ ­lc–£”Á|¬Wg,$ûEÜbÈÓÔbª(Å5¥£iPDÁ0`7F×@B<Üú²¼+yzêI>ä#bap¦‡CP„ÌÀ16[]œtOŽÐÝÁ¯o~Á|ÀIléß97ŽiZ)J8Ó$7??È0)KÍt#dµ‹+~c–z£<Ô蚤ÉPÃWB ë¼³ôù*èÛY=%EgºÜ@ç8L€zûü(eÖFw¥uRŠTÛÎq©ïô÷ùöö.=ÍHÜ(v£NÊ-²¥ª’­ó ,él"ÛJb©ÚAaÒ`3e³ým° %uö‘F ˆ “Ò=úh¸÷vtSË镜å¡_XXgr1 ‹¬çÙ§µ³íeÚ›²i œµr®ØLIêʦ“JÅĆɦ ¥C føf°"蔊;š†ÝXtwû¶ ³õºa0J…ï‘°@p€R3>í5Pd#ßqˆ½‹0è!$)»@ñB)b¸¿ƒ‰zædO€“I¶4TÊx1`ÊÎÎmò©rƒØ W­öŒ!7!‡òÈp3ˆ7¤‡ØØfX„2\¬ %©¡$ ¥…¹álö Ä9šÔ•Y ±JDSËt‰éÒ°®ûaDRñ:s8j¹ÓMÍp9—}§4 ¥˜eb¶8P,ŒC HúÌeŠªHèâÂC†Ô<æclâÌS5}*ši´e¿ä-¬Ø8‹Ü2&f¥ì23šÍ[H¦dÉ„OŽŒIØãáûvíã¦áÍak~×ׇrº«†â—ÊPCCœÚµ4{Ó˜9‚„†´,Å£_¤0S±^1ëiŒÁ¨`Vµ…j¾d¬ˆyõ>Ïç}±q©N3¼9¿¾orÞ½G\ɤ=†ÅØB‰F6ô˜нG¬‰ÏTˆc¤I‰Z€1ýæó Ê^ 7lEuVàœü0ÛSYv:í1Ý—ip˜;Ød@à@‚3”H/Ó‡Dœ°xŒ¥«dD;S¤ôñºX—® |㦗iaS 6CÂi7D‹Í£Éࢾµú{JŒb4HzôCG4ç†ÁœÍSU¡^\¾—ßàxªL8‚P¼û<°²á¤ùìú¾.”ŸëËÞyÅÑ.+\>µ"j&"C‘-K¢Šwâ³-‹BôÐ îÒ%б4ÇX¾]‡W\4[ ¬· 8¶-d™9y{Þ[Úg–‘ƒŒ‘Ñ‘ŒÖUnôqTÇ,ÃyÄF† (“&,N¡¶szÛooÕõDó੨J%/î]Ð/ ey5·ŠN ThI¢ s7+ä ,Âxvh³·Dà Í2‘VŸÒ3RtÝçB>kó÷\ëB•Ù²y“¿/M2èðgŒiœ~y¯Ÿ#S€ÝVÌ2)%ÊdšV•#‹àxä¹P¸qq8é­HI$©¬Ãè6ZnGÉ€ÕKî FlaŽ6„t‡R}Ò·_… iÕ[ìû«ÊÁ\qlo(q.\²h3è¦ô*Ùa¾wóÕ&VÌøöuŸ(UØ¥³—tue‚·+Ò‹Ø6b$ÒPÓh² 'Ï`)ã` u$ù(ö⢠˜tògÑD¡n8ËÕàŠ”¯]ð¥‡H\D¢æ“é/"üm×|Ôµà4׿')43TòcrED6&ˆƒÜ& ùÍÊlØù.òå‰îßX¹Û b®×Lâ[Gµøð÷È›ÍJе´L›iEé ‡Å Ë&ÊÈ”ÄGéÀóŽ C¡ ™Íù}2û¶†6qÕ•ýÐ^gD*¬È¼X¶Ëj$Xª¡O·­\*ÞÜ i±² †êX¿²hª`Ž¢~‹„¯ rØK%D‚9Ôe+¶€ªT@ݹ„*QùÝ’S òHTY½Œ4 Ì9òz1^±ôL9&ãK?}™¼1òwc¤bv©e²—Xq¤’dsl7h3'‡Ž Å1­T.±_^GêyWtž}°†6r‡+I³vîbK^x”6Ž4Í=&-Eä±Ë—Þís9·YQF¡™A¦[˜&F°)ŦÕ²¹¯F4ªçBv$ª˜Žë+MS"„»²Sy¿ÝqO¨ÜPãs+1“ã8b`ë Rª¡)0=ÑÜÎ4ßä|¾Ž„yÃNw£»]Ðî)¤Ð3HÃ[%©"Iuj1AAáW5fd°ÐÒ¤ÒT˜ÊÅ öЃh‹\GMèŤ^D0 iŠD¬C0ºÉaüD†AÂÂͶÍa£]eìëH^‚­tk ! :±æƒæá¿i¥…Ef®­M<}>NýöÍ|[7(@o€@n  Èx¼Ý«…+X^M·¡O@À¢HDµšÎÍZN~xÐZ;ükÚ¸¸÷ÔxCˆk‰IàR€nÜo7áÔAG0hhB¢LbS#Ö‘KiL)Ž’ h%VXD ,€ …†Ø1–ÚÀ²@œCµC5&Ã,ܶ›¸ÌaeLÆ…óÜÂÍzsZ‚5±6E‚ÔÓ4¸P»R&î&JíR˜ÂÈ#ØRpw×ë(DXFbûÍE¸ˆzCˆ`¸HSÛ”j9{°0Î@°é«µåo‰Áœø„Ó(Š1UñôHu´+ D’T€{†‘¤=M·vòü¾í{üáã(àÚ³$-@ÚbGl<¨yY eŽS°'\½çZ|¬<Ѓ¸trvx­Ç 馽^+v“—Èþ-löL“&Uß—9b LA3jC§V_cè™™¥ ˜ -„fbbZ+¤€(’èû„QÀßæ ª–†×3 r“É%cXÑPˆtlÜ™dÈažá@Q&K9‰äa䶉på=ýº8ÜyAÒ€Q 6©üJ ³I­ŒZ†)4ÝÙ`ß.«¹\”Bª¤@áÇX—ÍFþ8†h¨C2z¥U š0Rprç™—O+e:ߣ‹9‘wZÉˆÌ tAóÈ"ó¿»6—ÑëµsÛ`5ˆ4 È Ã!QÈÒSÚô‘àzhêIn¹ù‡¶ï‰ÜÂòûCp`9DÉÛk €ìZꫨ7JÝ.‘ìÍ{¨lÝZ Æ+T„ ºix<'¯½°ŒsZ9© ÜQ+©¶ÎÖ¦Îʉ·½ˆXŒN°7f9ª%Xâ|äI“£GˆêËÓ¤ÖcqVçWÉã9Ž4êz‘Pé®&PmŸ†„P9)(P¡¢Õ–†hÐDl‚d(sG™“GEiè™nÞ‰" ¯M)ZP˜A’ŒÛŠSuî‘Gã%R0_ßY>•”¡¿uI‡H0ǸéúeÕ2"¢ýVË›åY°CÊàQ¦bŸ­%(œµásM¨¹VL›!ÁtD f!‚\A ÷l8O Ÿ„üÃg.ÎHÉbÓÊc˜Ã½¿‰†´Îz“¤"J¤{<"úˆêjhñ ÝÝÛi6RˆsáÆûcƒÛ®Lºp …… ."“,øÜ9IP¬ÙåRƒó¦ƒp†¤‘´! È¡ˆânˆn&”«ŒÆ+“’Ã:–ü àe ƒ2Üú0 h°ýû5_#H0CÀ4bk%è…P”f¬œKa@Ö]è…RXCØ!‹D3îä;­(„¤’L‘Ơ߈rмÖÒÜ?f‚–*¤A¨!²³èEí^LKUi¶èœ£¶º'NL‰„ài‡E=Zúé;”Æ‚vžP8æIÙÝúvCµ·\c-EC í›´*,)Z\´—›’ÀXÝ¥a Kä/âh`6÷Ùz7„AUwŸ#r×îjÊÛ¹4nãÜxT6­ûžwŒõòNLó¼ZWJ1„aÆè^ßg®Æ‹‹'.ù–öî¤6Í»v¸Ï2-âM@ŒÊd‹PÉ·vzÓÛ›£7UTs5wW~í–š¤YîšÈlЪ|ã±›¤ -Ž÷‡æo©m©|5 רëW‹ÓF!œö´(hªå'pI”_wcØÄ(^v×<ž–©#<_yvpBJÇ'_|±¸ ì^î"¦æ\Cb$¯jt3îy=n•”¾f´O6;ù ÚÔo]éç.æbX.M ñNúÞAäG>9xøU†«îѤ4êZ»½BcȬôQ?©ˆÄc»&¹‰ãj`#r9-v^›Š> QÒp!;÷w²óxJévaå q†/…äá_:ÔpRƃ„›4¸ÍC²·gq†n"ãç—l¯”xP/ÔÏ?˜!1¾W\™ª–§O¶a‹ˆó«d%í¹¨gÅ/˜L¶é r})u ç­iåus1lW—–rh’T¬Ãì‡o"ó¢1i޼©ú”Ñ$¹óØæü±DB³Û¶¦Ÿ¬ ÅãmŒcAnW.Î7Z×3«Æ©ßÑà‚ªòmÝŒg¦…Iæœ<:W­N`EõÊL¶ÛfÛÝšÊÎ3á¢ûÛc\è#·±Õ5@CÞdžƒT‘I‰Æ‚ŠgDdùX#!¾×V]ˆ Á~M¼L·gc7é&G`ïVD²1¹~0f®âËÂNþ•sTmì©m“y¦0³”Þ¶×™©ß×çj\è·†åtέ3¡ˆ¸‚´|÷•‘PÕË[úï}fyÄaœ4C¶R’m¨°‚­I‡ƒé<õqæíqx Ëë,ûš/àï.ðüÄÕ4fÔ-[dÞ– ãŒ>a ™lã¢F{g«ÎÝk, È=l ÜÕ73¦1ÌŒùzÔàS)] %ÌmÛ´®yª*·â"²Ýªªd†ög: ìÑ<§ .M&·»Gnž)›¨NW1fñ2‰¨wË;€[ìúž& g,K·rö:7U5c´¾ à…ÛÊ0p”; Wù",õÐÃtÈ?h|óÕ@=_fl…iH޽OÅ^cfHõÅ÷ÜW=ÖÒl!®€Q:‘WÙÏäÀ®Dq NÜ*Iø:öò‰íåŒG>˜¿èØ,t6d8?AÙ)SìPá– ¦9œdP&Ì•€²<, ¨·þµ“BÛ++%x¥`9E Ød ãnéãÚÌBå áI7fÉ4Ê‘eO¾KfìÅ Ò«»8¤ÆCÆãˆ.™Ì“8¡§¡&…dPUPÆ*Ãö­‚+ 1B°Ý¬Q˳ Åñ&ÂM’«RUsZ©:P/PPœ~m†èL6aþö¤àÑ6HTS‚bEîdš‰ÆäI 3«8%zÿ¯*© ©`¢ì•„àȰàÍ™¥ŵŒb‘d‘‚Δ¬Ù iˆlš@œþ*CC•¦ÈªMÜŽ §î¸ÁC…¤4œùbî‡Cˆ•î”@Ek C9èi1íN¤8m±‘¼[Špa²É¡S¬<–ÅRnÔS11€?ÁÍš×ðä'Õ"¡œl®0•¨T¯‰¨cÁÆ" j­ªè·™(0н ˆ¤SŠTQV2¢ˆìÕr0®ü(T›;¤©t± ÉP®ÉX­›jÌTUÙ%`,œ<, Øv3Nüü3È•y«³™Y‰m%IÊØ!¹øM3\ô+½¡2t‹8¡X•ŠlÖLdÝRg~LLýZ¬eââÉžLÀßë¶ÿ¸E>pVAGGó«z´K*x"V ºx¨y ‹-´A¬à(6ˆ ñaÔ»SBJ÷æ`’BÐT.‚H"ï |Aº(,!"  )|W&†)v"8 «H„àýžîý“ÊÅŸ% ÁfÁ×läÀ:8A@á:š— i ;_Ž‹±ª?L?óþĿ鴓hýqk«z‚‚Ú/œ)‚,"‚H¨$€ ) ¬ *È£"Œ‰D%ôe`ÿgåkeÀ#v0• J*e$^?Ÿ¼ ¤ˆ‘IóOŒù·æYd®8×2• ‘¸W0}CÿrE8P&Dʆ’„—˜ SKI_VERSIONS†’„”–’„—˜ SKI_HIUTIL†’„—˜45†’„—˜SKI_SYSTEM_BUILD†’„—˜11C74†’„—˜SKI_SEARCH_KIT†’„„„NSNumber„„NSValue•„*„––‚ÜF†’„—˜SKI_CORE_FOUNDATION†’„Ò¡Ô–{†’„—˜SKI_FOUNDATION†’„Ò¡Ô–A††’„—˜SKI_USE_REMOTE_ROOT†’„Ò¡„„c¢††transmission-2.92/macosx/TransmissionHelp/PaxHeaders.4960/gfx0000644000000000000000000000013212442116630021160 xustar0030 mtime=1418239384.396590438 30 atime=1418239382.265553918 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/gfx/0000755000175000017500000000000012442116630022662 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/TransmissionHelp/gfx/PaxHeaders.4960/queue.png0000644000000000000000000000013212442116630023067 xustar0030 mtime=1418239384.395590421 30 atime=1418239384.395590421 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/gfx/queue.png0000644000175000017500000001435212442116630024521 0ustar00mikedldmikedld00000000000000‰PNG  IHDR–*Þk5»±IDATxìÑÝORaðgš®µZ´uו­.ê²­¶þûr®6ç–]ta5ÐDA9äå  @N1MÁ™Å—œD" ¡Æ Ï9Àkmnܲù¹8;û=ßßÙsöõ Üú†[µW®¿hi …‚jp‰Ïïºs÷ÑÕ›MÜûµ $@sóó§OƒKÕ _È«F&Oâi¨©gPÂlÅûvT$ÇÐ… ¢B6˱_Cç!†¦ËC˜…¥){Ê0 *æ ¨øß¿âB..PþÙbê|’Í‚ê!Û§Ø!(C•²0i‹¤Æqëi"ðûS:zÙÛ?ÌÑ0 #”Û†š í!“?øµ©P*Õš‘Ãhì÷^ •eâÑ£“ÓÀjVÏØv}Þ)æ^÷}›[ðøs$e^[õ áCóË.›UI™ ÀdtT§Kú] ßÿϋa˜my3vüg7xȦéL&O,9íÃrrgÇ7ˆã[H2z@RzP²±èðî†W]Ë8A–‰/ŸÍ£r9n¶»æ¦Õ1:9›G *p(Xj­®áv]#—SsÍf›G0©exÝBÉ S(IöòE=}˜¤ßÞÖAà²Ö–6³’ãC0‡ ªí£ìÒ¬EÖ/öòtÔ§Î7/»2„ÓjÀä#FʸºöC§7no®Ø½&JIšç&tZ·gM¡&¶<^—´€XnçÌWÇj2Ö¨©1Rãö¬ã˜D?,îíéûµ”Pic}Ã0Ìl&½¸8?éL“6Ñ \…"ç Ûq,}x`0+©¹Lrdt̰±c(Cƒ9Ùµ¼µ²°²ò8 Ä4õc~dßÞφ¦7d“rò»;†.XQ€;øã€¦i»îÿúüÒòè*!‚0™—G–Ó5)©CK©W?½üʱþW>éù“þ7O d 2µË¬¯L/¬QanjljvarbB3‰®æûû.ÎÌÌœ9}:'éô®íضí¨4AòùÕåEQÇÖiF¨òÌÔ,MVz{i~.[ФôúÜÂÊÆÊü™ ýÓ“c“s+–¦LNLNMOœ9}F5ìBzãÂù³ƒcº®ËRa}m¦)M|ê²6?sip„:Ÿ¼28>=;240<4šÉËàö„Ç*H !dlq½¾*Fy¥÷06&N±PÅ0Gæ×êm6Ÿ”0vvlH¶ çÅPÌ6sÓ3“UMáx¥ï’¬Z6Ð"ðX7S ­&×|BashèrE<®”]{¢1Ÿ J¹òª?âY\°mK-œ>sf÷ž]Ô[k÷ŽÜòÊÊÚ"_PõÌFV2‚bPð9YIolÞÖ¶­i}#g+“Í˺ž_ËøC~ËV˜ _¤W-]ª” <áûõF…ñFŠr øËuþe{»6T€‰i˜«««µuµŽãȲœH$‚Á å/•JÕÕÕÑyWMM „ÈeÇA–i«}“n+kk«‰ÄÚZb} ZI¬'›’GŠ£Ê-ÐÜ«áÉnqqmµ¤¼~õæ½i¥ë-*•‚<φa¹\P"ãñ8%2‰ ĸ¤Q@ H0X~`{cmE^;ø¡·4Ô˜P½«¼2Té%}Énùë#T [ª[í©áo7ÿo¥êìíV •@ùggçØøe4Ö×׳,KS®xÐïb[[›Ï'z!ýüU´¦Ü]ù#Â8ŽC)ܪ¡yišææêÌ·ùÈö@Õ´ù'ÁŒ ^š[JhªjYf1ýåÜèø$– Ó²è•ÚØPU–UðøÐÀèô}ö¢¬(‰õ UÕ¸M€a«†ö®Ç•Dnæ–^JßÖƒðüÔHÿ¹|EHTLPâm ¨ &J ¢Nñ=<¸8=£Ú–fÚ÷ì¾[5tÛ”ó™d_ÿ ®Êu­»äÌjß…¾Çk[Ókc ª\ð—…¥B®¶²ÎçC™œºïчS«‹P,GZa-)K‹aâ«ðóë*ã±(Ѓe¡`8Zá#‘ж®»ë*ýåñGÙXlÛ±íÛ;[š;Z[ëÛÚ[#ÑrBH¤²ª¢<®Œ¬×nk'j6'+,+Ä*C¢?!ãÅXU¤û£sçÏüâûÇf–3«óýC Ç~öÉk}ðɉÉÑ!z$iaj|x|J¹#¯?÷α¾·_~îÌÀÄpÿ…d*}ùâ… —Æè+ ^8ñú›‡'ÇÆ¦§&Ö+óË”ìñ¡ó?úÉóW®ô¿ðÂ+Cãóë+sÔ°³'?ýð½7ŸÿåS'N _î¿88’ÝX=ùñÑ£ÇÏ­ÌM<÷óçWÓzjuæùçž{uÿ³S£^?tâýwŸÿùÏN^—’óÏÿâ—+‰ÄÀÙÏÞ>xx|bôà+¯¹Ø7:536Øwid2³¾xâ䉼j"€gÆö¿úÚés'_;ôÚ‰‹ÃãýÇ?>ÝwþÌG½vqd–Ö¡ý/î?p xL—•Áó}óK+Ÿ}xäƒ÷OŠ"ðñï¿}p5±vpÿ/<ôéÑÃ9úê+ß}ýõ#‡|ã펼uºo„R~ó}©¦êº¦³°”ônr`‚ö<´··»kÏÎ%Ÿ=qüØ‹/¾ðòÁ7׳Æ{8u¼¶6öÜÿõȑΜúøòà ,½pôùœ43rò§?{û˜n ŸR,`éšá0–t]~ö_þéèÅqÑÇß÷ÀWÚ»vÜ{w¯&åŽôþýäß^;p0£‘¦Jÿ±ƒK—úççgú/LöŸy÷Í_eUCË®ûô¬ÏÀÛT¹±¥©¢<ÜÐÔ¨©Ä‹5UQËÐ!âókS}ãÓ>†]ž_ g>h6_,²34|æØ{ï¼ueàâ¥+4¸ëë—?üèòüRó¶v³‹…Çzp~vQ„*óÔÀ‚µ1÷âKè!#ïZÊÈ &çèù»OÖ×Ä^y¿ªëµwýå3O]¾|¶¶s÷ÓOï}÷×o5víùÎÓOŒN"›†ª*ZqíÒÝŽc§(»dÒB~lÛ}>ÀÝ_¹¯±¶º¦º©§«gil QÀO<õX[sS]K{kWç¶mÍÉ…é3'Ï ‘Æž]­ݽuõ mMÛšºïÙÕÕÞ<:ØŸÕ˜¯ã•‘°¡IÛw°Œqîì¹¼bý¢iã÷íÙÖÜXßÔÞu÷®™áKÀ_Ù\Ù¾³³©}‡Èš曚Zwöî 3 «)ÕJ'¦Çf>ùçOíݱÿ¿_àý¡òŠÊï}ÿo}zf>QðqL^5”̺a_°¬i[uAR£Uu 4äknnûÊý÷ÚRòü™ó¼Dø`w{íñcG[æ¦G¯L-µÖ—;yªºÒwüØ Ý×´·§3bN—{vuVTT¤VäÛ»z{º·÷îÞ/¤¾öôÓùå /½úÞž={ׯû~uäì_|ï¯æGÎxãHwOv0¸ipÅï)ctRA±Lãð»o<ùä#ù‚¢µð‰¼OHi$BhÙ”ÇAáb2ç ’Ïçc9ÂpœA3Ür¨žábXA°c€”B²‚(pE[s,C}S™|Ž©[6æéC1.ùGç%Ù'ŠÔ¿·x‹FWe £ O 6ÔÄÖUásœ{–D‘%0!¿Û¦ R‰á}À6XÞÏq Á¶nØþ@ÀPe 9¿Èb0¦o†ÚÀáP.›-¯ˆjJÁ²AYÈŸÏKåá2UÓÑÇA`Ø»y°ˆH…¼/P&ðœ·\Bý0,g(홫*£ùl0B¤¢LÊfdÇ+#ÎÍœ„Šªî{â™ùÅu†e)…µÓ2¿sðñÇö}pa¤``ˆ½-5ÔÂÛrY&ðaLÜdE4N†aŠ\ÒÜœ¥2ô ƒ‹—öf½ä¦éKi í©L\”cìõ Ô¸ÚÆÛOöú tµg°‡FEýP¥×–¶r›SÓÒ#½V¥a#q]à¢ôè­Bé¹¼'b7Úß®ny1OteLEÞ B[=¸ à HožÂ‡ûöâòËrÔ~žç^~éyzÒòÔ•9È2^ª7߉ûx‡öö´6TÇ6VF&f£a 93_Àþûïéº|î\sÏ݉™Q›ñ² E2šºwv4Õ¨Šb;Ä24ËÁr6¨¨ðùü¶© ¢879ohx^Ênh¶¸­!Òwi kç!ÆWž]_–tû®»ï B}‚H´ÐÎÞlé’$‰þra $ brevn%yÏž=«SciEgÁˆ‰VÖ47ÖbŒÁ퉅Ï,.'Šj‘ªêT…g5o®¯vÇÊ“"ƒÆÞÙ E7ç×ÓM5q¢he}Øg/¥•Xˆ¯Ö$——&Ægc-Ûiƒ+ƒ—y‘1u«†€ÔÔwbÇvl̳ŒmëCs" uÝ’ ²mç4MÉ0;&ÒR,¶­U]ÑâõôÜ!K2ÃÂL6'©¦£ç5$x1—Îá†ZpÛƒ¸] ,lÕ1)æ$E‡`L‹Ë(ÏRc þÖÖ*)•hiˆq ¤ç¬UýÆ·¾Éúýa¡3V݈±“$ŽáR©¦¾A·Yâ(\(VI¿.¹,ÃòŠ÷ùCŸÀÈÊr!Z·-3 ×Ú±³¦±‹F”ÏåãU1ÖˆXÞír™TE¼Îï9Ž/dsáXœXßÔ„Ö³AA`ëª5»ŠŽåNðs,ƒ1·,Ç”ï[KhÝò6.èn=äÕ…PƒK¡þþ{‡„xãšbq ãuž¦F›ÇŸtÃìŽz[kWÖWé=oUÅ3ƒ®#wM„y™îPö1Fî§Ò4M–å¼Ï ½ná^¼¯”›êZ:¶M=C×£ç¤hXð<ÓæÞÓq1,L­±·ã‚*]rKïBÔT5°X—´ix¶~ BœÍdè’ ½ßÜÜì8ÎWýöÒJ²Ø‘‚ß|„‹¿ÍäÖÍC€ Åæ€À0mŽeU¹0r–çyð†;°Më‘òÊð…`å%fϬÿC?žI§ÊCþL&7<4¸½«ÂÍ! !qIB@òsš-pTáÞݲΩ¶í8T‰mŒ‡k.‹NJµխö¿gÜœ·[*TÊ‹í¢e˜ä´ç‡fß‘™g–>Èð÷ü¾T*ÓP_wi`PÓ4è­xÀº ‰wh;Vru‘wç7p«cuËDíQBˆe™}þåÝÎî ÿ_¨‡­þ¨êÚê{ó®×zs…k½•LK6Ì¡B`Y6àCÄ_O–Orûìü‰ì Ó£Sµµ5”¦šêŽã0µwce=ò¨ËÁ{{Û¶×Tüî=#Å$s{K7@’Ï“ø{íS^Ïú|¾ óÐàÏ~—œÖg`÷_Ç^­¯_ZZ¢ÃïöŽ„ši¼(`›@1TO¦¹õî¯õ䘦þx3-–åKD;„a ãÄÀ™îélÏ~ë<{óJ•®x×‘ĺ’ X`\][pϾ IQ¾öÍï.¯¥LÓf$ôºÝ !à:3bld²j´²"‰ lÑ)™/àgÄ ~bi¬¿Œ±µŒ¤ ŽVSÕ,Ll“áxÓ4Î-.u÷ÞÃë-QÜ¥2À±¶¦…7 Ð4]Uõ⮈rHnìË j.97·dØÍ““#Õ5õº¤Ë}¹¼Æè`5TÝÚ ÌLŒ‚ë:z#Pº<>'Ë2íÊ%ÕŒ–û!+Z¦E°¸P îà: _|jsj!7˜à˜´uõÖnë¤ ²élE´b‹@ÔÐèc!ìC…"±öŽNÝЫ*#ŒãkoçQÔt“…¶é0–¦˜Cİ_Ìý?w½+KÜô°Œ)CåÒuµ ÅÔ† „–»ï{ˆÊbcs‹·ð €¯µ<ºuA™þ:”?‰‹;<Ü·Wø?¢|±zÄ%JIEND®B`‚transmission-2.92/macosx/TransmissionHelp/gfx/PaxHeaders.4960/group.png0000644000000000000000000000013212442116630023077 xustar0030 mtime=1418239384.393590387 30 atime=1418239384.393590387 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/gfx/group.png0000644000175000017500000005423712442116630024537 0ustar00mikedldmikedld00000000000000‰PNG  IHDR–á¥DÛÌXfIDATxì[ tTõ¹¿Ë™Ì2YBÈNBH ,#‹OÊ"u±¯9Öç±EDk‹E±…ú´–ª]ž@0U°X­¢"d×°A $1K€„É’™I&“Ùïò~¹ßñž03 X¤ÏÉÇ™;ÿùßïþÿßïÛo`uÖt‰r'Ây(òù|Ý¿WWW÷ÕW_µ··ûý~Hÿßã8ƒÁ””4hРQ£FÅÅÅHdpß!ß#¨RåUgŠÌ†Ó<*Þ.¢ÑhD¦ZVVÖÒÒ,É ‹Èm®4®é;Dúž••uÍ5×@jsÂ.$¶‘?ÑìvûñãÇ_[[›Û펭š’±,®Æ4,CÑÖ…»@kU*..wî\uu5ÀƒÝãÈÛ† 9ƒ²sħ¦gÍKIiXÙb‚ÈÚàԱ͠OÄhÀ/Éçá„`…PMD Zð%8Á ¶4T5Õ” !Y©Ú}ÂæöI:ž#Iñ:ƒÑoµÆC-ŒFK’Ðyè_¯Þ~ß¼?~ÑÕëß}¡œ{çþjãóOþb¤Ò#êâLV‹Ñ pªØÀYg5ëxŒÀÇl±&$Ä[,Fu$ Qkþi­n–£x‘bc¸Õj…Ñ„G&§×ÓÓƒÐ/4a„iÓ¦0˜à 7äääÀ÷½ã†UYY þLL‚³íêêBþ ÿ}²" ™ùY ¬ t I)ƒrC2EBDo¬ú…ô5ÂûcµðüðÐÜ.VJl:Êžª¬ó)Îr8¼qÈæðJzx˜8=ÇtÚ¾ö©{î›}ÇM3g¾ºùó²Ã}ºÎÖX»kÅ‚;—o©°û$oSMéú.oÐ×vàíeóž)ÙQãd &“•±WÚðð’]õ>Á$Øüü÷OŸ~çc‹×žt"€°¨j.\2†*€„ù+°Aä›4iÒm·Ý†<€¿ôôtàJׇ i(AO¡õõõõ±E¦Ýò…ÿŒ†£HlÎ諯þèÁ²c ’9%kpš{ÃIÛ#ÍyPpE&Ó‹ò¦PûÎ#ÇØôE Ü=#ÛÛ´©ª©Í--ŒóØþžùcÉ;ebjáµÅ#†ZôF‰3›“ãPJöè¬äD³Ñ}ºlÿÞ]»+=‚æ|nߎwÿUQÓê7¥¶ÚÊßÙn°* »—¯^¹ÓÆÝ|kQ\ÛþÕËßitÿ“¥kD1Oañ—ؾ $$õñ Âæ §N:cÆŒ)S¦ "¡ Ÿ‰b¦ák˜qÃdÁ™Æ/jˆ0\¼GKYQ—:<ÛÐv¶åXiysc£GHÌ™Ác[²òÒ}½J±¼¨Îèk(=\ëR’g̽eúäN0'œÞt¤ál§,xšíùtÛ1ÛÈ{/xüÉßþîÙ[Æ>¬ sôFgvÓOŸ¼õÚ!IfÉëèq9í.Å`J6mæñöŠ÷¿¬=ëÔV7ì=.ß~{Q²ûð?7mÝ]aÎ)œuÇôüŽ]×¶yüäy~•%B¼äÞxH&©+2>¢F8­0#ÿ cHÈS á‡Kl6Û–-[JJJÊÂàÂb q»”Î8?¸ñ(“™åycÖðt=#Çæ ÍH Ÿ˜]¤gylç’‰tw‰QTèôòÉÒ/:j®&û'ï¿óÙñN_H¿Ï¡Úæö'Ðé2$ëÞÙ“2-|\BJJ²)Ù¢çõFˆ(!9).NÇ1 ÏÁüôÈ›yAoÊ™xÛ¨¼àѲʊÒÝ{«¾:åÿá#“­ÁÎs§¾»ÛvàpÅi·yð”©ÈÚ#W)*à€,YrªŒ !•€QÅM"ÙA°Ôz%@ •ömÛ`…HgïCä" 2`sQ1—ÇϤR‚× Ïò¸ýƒ³'Þ:}È ,¦; ëÓ ¢Ä`/½hs$5Ú]¢'£þš/>ïìxBþÝ«_~ýÝ­'ÒRâÓ¾¨­®·I‚Å*ø|ÆF›Ëô{{¼þßýF àñ‡&“|I÷8ILœ4û{C®­;¼kÕª²¦šÑgå[DÞd¶ ½kM>dÔø·Ï[´páõƒâ \x7€“¥^~°?V5O öT*l¸z"Àö"1ÐŒ éL ñ’ŠExÈÆÆÆC‡!RMy¡òœ/ZJ#›E1ƒd÷ ç¡èy!sX†¾qó++~÷«E¿Y¼hñW—q†ÜÂÁqFƒ,}C„ ^p=l/9+÷”6Ç<ð‡¶îܱ}û–Mÿ|ëùÿÉË •­jê2fä wØ%ë7WÚŽöæ»ÓÍê‘d"Œ·kjsyÂ’Ã#—ǰRöØé‰_î);e¥ÍüA` †Ò%!Oð):KzAÎ@òŠ"ð‹ðê0,†e‘•E eüäÜÂÕ 7¶$¢n ãðŸ³gφ-"o„Å@â™*‘G½P†•Gp)"“B[ޏi IâÍÖ”#˜êz>Ë2¸xlQqñèiiŽ/;!cLŽÅh5è Œ`Ò ¸V»„íóÐX%J-…ÃN£>ëfqpcÿ|Ï?,#oâ˜$É‚4XÞZ4åfnÍŽåÜøÙ7àÅ]P©rcï~êORâå%‡‚ðЋÄÂi?~<ûº3¶7€2Ç' αıð›JXƒ°b¨¸'<.çáÄ€"u–)µ¡ùˆ‚h— fØ´iÓéÓ§á…Μ9ƒ6Z9øyMT¶ŠJH\ Ÿ¦Å j±"pb>YxR­'‡¼¾n{—˘œ®S$.¤¨ýŠ"º®.ƒu@ºÎãét¸“d6J¢·ÓåòËV‡ \èÛ£‡¶aƒÐ’ éuËSЦç 5€m‡h2F¤ —2nb/½=ŸlÍ:cÈID’%ˆ¯Ïã•õ‰ÙE“†¡(¹]>Y7¢xÀ{ºzB€ö—U<._`Å §ÇTMÈï“)ùã3 9Eb°B”:Ý]þWÊšÍ2–B ¥¡ÏÓüʪW~þß‘"—Aö~ØÑ£GçEˆÞš‹@¸}ûöñãÇc¿â+PÄTô{˜ ¨BĊ½‚Cßž$¢ãŽ;GçÌ™V¢!=Á@K·@ÜÅ9¼Yo<ä” š²±jHW;Ý|gÆÀê¹·zÊö¶Q7@˜ƒµaˆñ¸)ü9”‰„Å|ô©ì4H£tÎRc§Ú†ð©] .´ï5D‚¹¹9……ÃñEãâp:)½$FWÆ&þóÄ^Uü©›§¨Pu‚ \Œ… þÌ«å âh˜UªÓa—%ÑéìB‹ÌŽůðŠQ?Q†oïèƒpx}ÇÃÞ‰8å뎶"Ù>ÝØ<T6/Štœÿ§vBtÞ·Kºâ»_§h¢–T"û!ÉÓyß.¿À!1éÛÚŠŒÂõ‰Ä¡Æô +W\Ñ|šì\9mµgÛ:Íù ¬ ëo*?d3fåšù¸³£`âwE -íO¢îˆ zTг,Pà /õÁ…Ö8@‚„K¼bã×rhûo½÷g‹´R«0êÁàä;½kÝÓOÌytKËj€´|üÉÎ_/-ëV»ï®/>÷âß· ÑRÂtɾ}ͳÓ']7~º­ã¯»~Ò´;?¿©á»n¸†"Ù"„‘ `b3ËB¬8NÔk@ÄÁßUE4òc[Ÿ÷䊽TrD¼íñ%pm´´Z@Måª]Ÿ¼´tùI®zö’™3êuªy;[kË ¢:Ur•©æÆÚYMEÕ[áÛñþê×ÿ´¾ÊT\|MšY§ˆ>·½Ùôuy¢X(.  k@j_ÃîDý²ðÑË'ÂLküjÏGÙ>¤}å0©·'ì8•TCTàà]Ť±ÃÿaÀǘNUaB¯½øëWJ7-^µâ…GG&11) ´|U;ÚN2|NAéëïÕé'n`œa¨5ŽñzK|šÙ`âÂ=÷¿þñÒïW¾Ï\÷ðú÷×­}íÕW__óÖ†lxeÑc3²%p5íÛwª½£yÛæ>ÜþE‡*r{]Ùß×ýmÍšµŸì=ÒæSa@¯Þuv÷ΓgÚ{ÔMx;Nוî©t©k uÔ¬©;Q¦¾bÇ›o–¼½¹üLwHMãYÑÓ^µë›àõæ›Û4tú”+ µ(¨Qߎ „QP1øY¦Qˆ³Ãì7ÌS3JÕyº+Þxzƒ.ëžgžxèÎT† %ü âYƱýƒ/[•¡·ß{ï÷?z}C}§‡Wð!‚?݇¬žiŠ®¨6X³~s«-ï®å% ÖaŒ~3¤ffddAwzº¾Úúð¼§—¿¼ò±Çæ¿Pòa·ÛY½q峿ôñ_/Z¼pñ/ÿ÷¯öÔwK¬ð6|öÀ—m*;#õn£µìã·çþdE¿÷.þÊVü酅Ͻüç•/ÍŸÿÈOæýlÙÚõ!üRµgã³=¾`ñâ…¿œ¿üò&—ôm9oÂïš CQáXüãx˜£šºˆ +QÊ08QÇ@}ØEáň~Çãö‰2ôvìX÷”ÌO]0ëû“2€ÁEõMútù§bkü Ë_óƒÙºKKk;º C…n¤G÷aòªMGZZ«›Û¹bþl¨UxƒÄHGƒÛ§*'víµöQb@‚ÁØudãŽw?«È™ðÀæ—gV¿¶ð©w¶5*Jí'ïmÞl¿§¾©úèþ%?žœiúÖ(¸–‘ÊçSßA {}¥ÄÑÿÞÆÙÀÁ‘`Xs70jÒ3Óïºâ”ÖüümWMýàëíèojHíò«••QW4HÍîJ~¹ê_A¶ÍGZƒÞÃF9ÿð&»‹vwqJA4L®^Úøáóïå·:âÊÛ¯¿ò¬SN9ïÜQ÷Þvã Mv¼ýÙ¢E»`-§s•í¨‚záñ‡{²7;yÜ#¿îd@ªÛ“ÖÀ’+â/)—¦ÁQa,ÊÆÙÛ'?7¿„aQöÕÛ?,^Î…‡¦C²òküf„ ¿ûð'f|äIÍ€–¦•l)ٴΞ•îZôæ7;›fÔm™ñZ¸EŸSÇÜùä„ËZ®ùþÇï—mÃß„‹&V¸*Ñcžb³$Ø:”б ¦äõ:03evä×]ôáÿ^= uŽ[gYÝ~ŽÐ ”.ºk¢·Aÿ~'žÑ¥U}Äh~ǹ{ê½Î8å=zÕgŽÊ¡‘4µCÎ7àý§Sv®÷e¶é˜žÂXÏîpè!…ê«O Dtµ9ûŠÇñ4¾çŽç^4Ý ÝU¿ûIƒú7df‡'·}›Nõ2Òˆ+HkzôЧ„ËO»ã‘ñSœÒüø‘wÝvïI™ZØ÷ž ûÝ:ãÝ[?úõä¡ÇÝwï çŸ/MÕìÕIÍÕ Õ¿õçgo½.l:RÒú?ñÞÈã:g‹­¿¬[±èùWG$twö˜'O8¾ã¿ezÏ̉­¥¦iªþ$«Hîô¶3XJŽýà­ý[xð /¶iÓiÆžýè£,—³^½zUéKQX²)U…ªÿI 4 Ód a7å Û”\J3Zb³B@èº`–¦)“†d Ò¤é//ñ‡I8œî´T·C'6LDB/SF(BÓÁPD’Ëå ¡š‚Â~kÎ ÷ùxGOBx¿}⃥ž^cÞwHÐ[®{Ò50Kû£28b˜ =Egûê_By§|ñÅÖ*˜µµGDZ»@ŠxÒ%HGAü"©®PFaÄšcˤ̲š±oÚ[;ÀÉÍ'£J؄ɉX=²ýS’»=CÕk]d¿±°œi]1m5°d&ÃþZY©='-Å©!nnš`²ép§F‹`Ä^N@$°¨lA™t”p¥yâÓUµúæÐ´Ø‹j i—•f$H# ÌL ¤Ã…t4¡I¶k°Zþ k9vÁ6!Ügkÿ-Ä%%ªBEŠí0šŠÿ’YW!Y*›Ø*ˆu"±×@VÚ¯H6Ú•û{®¡<”L€³í]wMޏòZàØmI‹ŒÌ5aÓ–¸Y3…’`Ájèɺ’*¢,«?b08AHåš´/bß=ÅÑ ½lfS¼À Jz’þ¼Y&Qõ[_ûžm&ûý64¨’£ìÏm {£„T#ĵo]]‹ G¶ z0ªÜµ&þ.ªÇq´®ÖÀ¨­0kŽØo\îGýÔž8ΰ[Tuš`xÁñ†Õ¾9á§,YÁjš‚}BÊ|Ÿu‰)ví…¥dì_”Š2×Á/U)u%Î 0ãó=T½AQɺñ>ïLæ ¬Ì‚íœ4RígbCJ,‰* “jذÇpIÔ¨6%”lÇÆ£Š2¤€PuIݦjÏo)j ¼yåÊÛ·«îÐòƒ±bZ †9ˆišVˆÂ ߇””h,¹ ì‚m¬qKg– ÁˆéRM¥Ñ¤iÓCédÙŽª]«¬(j †8ˆÃáhݦå¯jG(Ó5Mhš+Ív€©(ÄU’M[:Ħ<›¬W¥§W„¡² G=i9NKÎíVÝ,.¶ÌJíGuEªrb!ù…É÷$]üÓ…ÄrõWªëýü´ìZ,ß#MÓRÝnOéÑï¿¢'#~ ±¡‹Slja£y½¾rËç®´Ôz(·£¡ƒÛë=“Íjª ©+Õ߬ÊÉ…äÏPý¿V}—SÍ[ïçÿ Žz­]è×nó–«e…¥{¢ G„NR- Y¨,dý[±¨1bõ‚Ñco¨5R&v7JQ:2Šäß~u0ãàøõ¯9ïQw‰¨Ê¯³ ˆm‡ã«”œ¼×¨{ªÑO=ªƒ•xÌÉ*&ímýi˜9iÅîÀ€+£ökíH­ê ]Úæ3cÁKH-_*[)Ë—/·BXa=ªq Vú3ö%«˜\Ýã øŸ3±C""†ý¿; L¹÷•fjᔢè 6$&ŽéǨ€‰£$FB´P¿YJ^ã?³ñ’ :eU`Þ£±¥xPÑ*[Ÿ*ÇöOŽˆÕ4¤ÉVé¶`RY\ÐAI9Õº’­]ª…7Ú”n¨ü¦‡°wö>eetu@Áÿ?„ê X©˜ôß•RV§b |7Ä\mÏVY*õTr#|À’\7¤”ÉOYèÌ,$˜`ˆ/Êíí§üí$.™ïYKâ¯ûcQFuT6ÞInf)vEµÆª‡µ‹t`IøÿlHu–€ b“­HÞ{CZéßú ­b¼VRÆKû¨ê„€ê§ñ¤þå³µ/V1œÑ%̃¥)AR'Ø*ŒØzo­hµâ;ö‰Ð4T2i¬€â1ÄØ6!Ù3ÚYnc{ÿ„ªU+ýHmÛ'«ìú¬“’Ù´ !¥ awEj#N²xû2UÍïžýûE‹>üø У{÷œºuÞyçÝH$2xð‰¡PèÛE‹B£w¯^Ö)s¢BLš®Å;pÔPα„J3®¾å¨]$Çâ(ÕlHÕ3ÖiV¶ÄN®ÈÉúU-³*%W>3™÷å—y r;þøH(”Û Ëí>õÔS¥”M šZÊÔ©SW2[˸VPööí;Xkö¦i"j[¾yÉÌ«ïý©ïeWœ×¯u¶Ã”ÆÎ­¿Ì¿ò%Ü>º_ûÆYÒ4¹Úž•™Ðáhòø_Oª\¾ÌT9áO,DT’„U“d6Ÿ\'ˆŒHä9s®ºâŠ6Aœ†©ra4Š¢JsâĉM›¤¦¦Æ³2D‚eæÌzëÝo6ÕiöÔÕƒ»f Á²MËf=Ä—œÙ½C>t]C"–¨ ¡U9‰VœÉ×ÿÔ»«©½jN•M°H n¸F±Ùvk\Æ]4¥´v°þ®ÐkÌlµ–ö¾G"l¬~°ÎõÒ²š;îãS–oüqu´]Ö<î#îz÷õk‡Öá¨kºµêbÒ@pûwïNà–£:´î.êu¨Sج<üú[Àû{w#Ù'0Ù¦4ñŠ…ó·W Y´ãL®ÎÉËlÕAq“☠ÓAŽÆU4LÓ–¼C ë¶d×F‚Þ€Ö¬ÿµgºzÜìÎôÔí™ÜÜR(P´´xgfýÂþ­5áÊÎsÒÜß6ý´ "pI÷‰'ô®Ÿª ¤eëzj$bù6-ñ{6NsƬÛݺoë¶°«Ñ°p¤–¬Î¨±Lr zÐA Ïj_qTeGú§ b5 ØfÝé2thúõ÷™õcèC«CI#àeWç!cÏúææë§»Üׄ뜬»S‚ägx…ýã ¤¹Hæf¤d¤#bH’”ž¦’S™‚¡“ N‚…ƒ¯<»OëzÂt¸³óòé”KôÏM?To'ÁÄö¥_âz›ÒìþQ¨ ˆ•ãÔ&æx´-¨þäF<ªzJˆ¬ì,ýÿ‘ð.;+;Ù`N‚¨nß3.½hÑ£^ûlúŸ"¥Þ°ßQYÏ¿°zÎ ¾ oHƒoúæ‹¡§æ’а!%8Œ€v÷bYn0Òê:°gøž­»0r`¢ÈpÀ?¥`tŒ,ìÆÑŽkI ˜[5/vD.Á Á” cEök@¿»2*^ý_ÁN0wîçÖ?ˆjñù|Ÿ|òI,¬BšÄPfòyÝ^;æÜæ©@0ä÷2z\<ô„Cõ•ÏŒ{`ÚÔg¾eÌÛÚ êqÄáy@(2¼e‘xÍ2ƒ¾PÀŒDà¬ßñ”»Ïh³nò„17ÜÿÌs“~èñ'füPòOmô3³mïdQbý±-vï*I`׮ة‚ˆm‡*—Kòù}ÖhÂÒÌ0M{½CåÓúë0³õöö¼PQÍmÖ/©ò›j)®º‡wèÐ"7Ó¥¡gnûÜ~ÞÂû˦"jv帉Ç=wÞýËRw¤v¸åÙû.8®5GVƒ‚C»§¸5{}.5¿]W?7Ì€î.8úÕ§žyÙ-/Na‘Ó²ÛÙmÎd†´ÿÛR;uD,u`4˱õ55T-T÷ /_a/3¢—aBä÷nœ¹!’&œ.lÊÝ»Áí&¢±«Ú•fD–¯ûò«-¹Ú¶jž›ÂRr5#ÐÚÞ4³ErCZµA~¤vëlÏn@ì­æUoGªd®"&,ƪ՚ÛÍy¹±äØ –»KiÕï""eß^”êF|™^z7ÿ܈›Þ*Þ¶=¦¬V½‡_|ËÈ“š¤Æöïnÿüà›Æ^]!aòInk­ab5Ž’IµPYĨŽ/ú<'Ô«×Wg –T÷«ù±iâ‡eHOãõÉ“¦l‘J~êt"ÆÒeè~RÝj3X†Ê7}1w®ï¨ÓìTYÿõ7Ïß{óFßÃM3¼¿üº©ÇN?Å÷ï-b¦PZìÔØO*¤d¢Z'aÕW’ªŠ ÛàP2¤d†´ã–Rí/ÖȤPbW ¹ÝLàÝ»±k7JJ+ŽÝ—ì†uÑ4`©kÝ&Í=¹ÉO|åí|`êÔŽª¿ëåÉ3Š KÍåñÔué): K6¯[öõ+vF$‘±uù×ß,øô§-DBÀ»áýg¿ãŽ;Ÿ}ãã?¼¢–&¥Ü#˜¯¬ ]€$ˆe|X’j„QÙšû/t#U¾Ü0 ’׋ˆ›ÊãÖ4ƒêY5&‰EˆD"å`¹rê´hÓ»}dyDç.>õ±[.iÛê'á‚ðÃ0S0Ç£_j¢â†HÄžÝ+Èd.3Íó¯yðœ­ëm™Ϥ­MÞ—f¿Ó…YОÆêñ !È#(l„dÑ2vÿþÌÿNžzC –{µœ–²YûÓ˜¹jà fHÅQ$ˆíóÊv¤`+Q¹µ%ô·Ì¤„Ùç'—Ó–PÐûðY)¨0€ Ú5ožÕ¼ùé‹.ºqæ ×ÒœE<Þ¿6~wÅÖ)¤ï7x%<©©™¶½ðÞ+Žn›«›ZJFÝÜ­r¥d:h¤”šÐÀˆË]mšq•ŽðQ”5·µ%d[åVÏÿkvȆÉç‡%aÄ)•Œ ]CTÂ=7HB¡ À¿aæuÛY‚í*Çö ¤Á¿eçö¹Ë|£Ú;V¼q÷óý˜×}i© ; êkÞ²Dk4fð -% àÚ·Lš8:UžM–„‰]£Žª`Tícïýþ]:^?¥:eŠ“Lœ ¡ 4r—ù…­ªˆÿ­1»>{ß®o›¥ÿòÉÂ?ZžyÁ]sõÒðβ`0ݨӰ®'_ÝwÓu?è¼ù× ºê–›~è¹íß1bÎ¥“ï¾zÕW=›¥ûËDf³þ#.êUŸ%¸¶J5S1®­t5‡HLõKêÊ> ÿü’3'ïØM 8µX³À•ƒ GL””’îÜc$&R< ­(ï³¶ý2÷ݤÈêÐsäu·^Ú»‘#"óпmA®´œ6‡ >gøüû¾™=‹N?vüaë¶Èõ2˜…§°ÿóSž9請>{cJXjuÛôÞw¤j;jaš¸ºÆ U )i“š{®š˜Sÿ϶´š^S×Ñó0žû¶i›ÌHeˆU5Œ¾ÆdöÉdÑó0™’’Þ•<»]óå—×$ï¨å?çÓãí²„§y¿sf,8ŠÄÕ™‚þ/¿Ó?9ll­]`K^2EªŠQÁ2~’þ$ÕYátbÔY0 󽹨¸œ[rÅv("exx@ó²s­˜«ý¾•Œ{9Q¨•bÔr8îVfA¶( QÕˆT€öxÀú˦ÀÕ`k„úu骋è‚3aš°³-íq¦‘'9YÌøOa[“ e  JS`b-,í§XUÔ¬¨¦Öï¶m;dœ7þ!e…@ÝëØ·ÞÌÿ93‹¢¢¢`0èr¹S$›¯)#D"@q¿ ] „¬¬ì¼¼†.Wjb /ÛÛö/výÕksK0˘Ϛ‚Û!e•„JH Š£›Äö†/ˆÁLÒN;Ù¸Q£fÍšû|>e lyûeddÔô>éAt]/,,lРÁ¦ÀJÈJ7ƒˆeâÈÇV’ìY €P(¤$´ÊRÊý áAÂá°õmÛÊ™¦¹‡„•MÕœBÅC“`?KâoÖ/iVߦ@×ÿnç6#Iš… èè¶)J< 1«Ì°5lŽÀŒp˜ÎÇÊ C×Ù~oµašìp¢YsôêCi©£ŠÒô/ÿêÓ¢Ô¶–kM^††ÛFMÙHAD¥7K7Mþú+Z¹™Ü¦-Z·Aô‘Z·µ¶Ž6íS‡ÖýŽy_ Lß»éÛ{»t9¤ ¿aƒÜ [wƽ߬õþ ÿ/^wñÌÏ?ÛaàÀG³ ¦¸g®R 5ŽibÙœ•…ºõ`{½T^%%!@ÄÁ~Z†Þ}­{”áÀöï–.­sú%§ölç)^6ûÃׯ½aÝÃS§ôÌ‚FØ'zJ†+².ì÷šý$$«¾%±ƒPóÐîÝ\¿1PZÊÌU„ Ö4¸R©¤Ò¬Ô“y ýϾüªSÉÄ.—yþ-¿½b÷³Ý³Häöf¼:sÁÊHã–'^vMÿlÄ(þiÎÌ—>ýÒë×gǽ ÐUÇù¯P•ŽÑÎÏHÔ4‘Aø¼ˆ„U¿ËÄÐÞóE(Pñl 8Rl'À·;Õ£‰ 'Þúá´{_{éó_Ã.ïW¯+ufÝtq§l'm[0ë¡I§-ÚÕ¬UýÝ%—­ˆh=4†:5,³Ó¸2ÛbJ0×ì:nп—}.2ŒxÞ=bH»€5a Ì1# ”E´ñ§… x=>ýøëêôë×2‡…HHjJk]ÃGÑ'ïóÆu”– MDUs¬-`–ð{…q*Y>’'¯Ó•oφY‡œxý»'^(®–'Þ=åÄ»QO« Æ=qÁ8Ĉ :$ ò®W–ˆ5‡Ã‰‹.eÓà÷gÓ¦Õäp2«®ˆH„3³xÀ@Œ O:öÂAtiAf,B“а Õl£¬üï:ºèr°HÅVí)‘@Š iiÕxD×HèRs|‘T€IĶœj"¤y*Ž¿ÀAtR«Y NÜ%$Dg–&1ˆ¤÷Fd÷†„ƒÔzDÔÔ&H¥´Wip¤Ê/+®›iŸ£†Q†U¨ Å"àŠàˆ½ph¶û˜K±`2.]M¯‡B¡M›6YÑm-C»)·ë¢å—ŸŸo[Äb˜¥á+÷ú!hzŠÛ“–š¢‰ÿžØ‚@‚I‰èR1jÖvƶ ·B[¦’VìTËfÒz´¢æ&àñxÊËË­Û,‘Ä–/§ßû°Fš6mÚ´Q^£¦u†Nûa‹ÿ1tR¹ˆªmÚ_¡af+(Ÿ+JÌU'ɻʲ<6 £¸¸¸  @×uÄ1ÃÅ¿N?ç‚q?§õ<ýþkjìæ@i±F|­l”ã¤ÿž„ “`89k 6¤V´Í^æv_hÝVYà`ñïó®¾ûã’öWŒ{Óî a#ƒ»v†Ò³\065wu±_+h\òà#3‡Üòرyeóž™úÖ÷+JµzùÍO¾jÜÀ¦i¡ï§?»6³ã¡ýú·ÉÀ;f_ÿrú)'víÛ:ëÀ’t&IÅ#ÔÓ~˜ÚQo#‘Hr;©$4¢ éÛ¹þ·/~Ͻwòõ'Yú)„+§ž á-¿=å¹k[6o°vç¶Þ^¹ó·o¿[òãÊma=¸ü§ùKv6¬÷ä¥íË–¿ôÈÇm]Óê¶³A¼kÞ¿é¡™ç·êaIx H…©K]cbÄ*X‡-a5¥*”Uÿt]—RV…ÝÒ8±²ß[²a3¡S‡\—UAº·ü×5¿ÿ”×öŽYï]–›^7òsα·=:º}óœ¢éo8çÆWßv~מÃ+rÎgo}2öì e;–<3õ‚ãZwn™… ÝŒ¨xO¬¶ìA²æ¤0,"F5þûv-Ü£ŽšAß®kz("M, (ßñÇåÙÍšÕuùJѬÇ)/¿{KSDéqL²’Ý›7ý¶bk ìtdºa©.írØŒ;ß_qØöu¯=¼à”ç&uè˜{.s³°»@âX²;†ÜÆ¥)-µˆÆ’÷&¡-p%¿ä¬œ¦={暆‰8FéÊùÏ^0øžaó–]ux;“ÑÎíl›Žá?¾¾ïükúb‰Áh˜R_?Ä&ÐðÒC úªdâkžª¿üYt˜ÑµY÷¹FªÙ}¡d“!m9A*—o b˜UPÓ´Ä 8j^¯já )twZš‡±øÍÅëèÔ¸Ó;Ewåùé´§DaÈP<ËÚ¦›ÏõcÝýJ¿ôógLù¹$ÉvÎðC}ý­ËNŸ40$O»±S£Ì”s×^(×|¢è’¬<›j¶/L–pßÃxêµìy]ŸàÃ7h(ž¼õòAu­Ž[çr8Â&q,_ " ›Òß~XrQŸÞmZüüÛ3æùÃÜÙ.ÎŽƒú¶þê?}{~Ú¨GËËp óBf’sö NHYA5íBg駆3É !ÂQ*_×Òvºáþ»½·¾ôÚ¤k–~øbA¶#\¶qíó)ÿd§KB»wùv”Ú&‡Ô;þäÃ]8mäÐÚ7e5ÔN8ûš´G®?¶CÃFGhÒÿ-|°ùÄKŽÈKsкFj2À¤–DUíÓjZB‡Ãá÷ûíBrý³'Ž@@MꤥÖï5þþǺÕyâåÅË×­ÙÉŽ”´=/ºåÔ>Mrt ÷„3†´ 4tÇ$ÌzÃØmÏÍüvEwíqîÕ}:Nžö} 2@v–³cãŒõ].iï! 8P%„Ðì Ü ™¨I„ÖšËêÕ«­56§Ãi/Šª`‹ª¥µô³¿Y#‰ÌvÇÞóÔ±¨‚ ¯•¨xÝ®§ÝÞõ4Äzôɰ‰”|ùñ²ŸËrÏŸrxÊlÁ¦¾2©²hƒ€š–ÐÊö#¥\³zUÕ4Mc°…RQJi­½Y«Ÿ:u²VÚPì^òÕªÕkë¶ÜÁ…Ý!5f 2 Re¢«á©½Ú­[·®]»V¯´j†ˆ»Ãè»_¿T¯ÛèÀ6S|Aû=m‘RèAO­WÐ"—ð *]-p QBÆá€G—IVNEŒä„[©ÝÖ„$(8é¢S¢w; ¼÷“bÈ Ã¯*’bí è.8Ó«1J>ˆ.$„$I"Ý\‚Qó0KyÔ¬†Ð7”ˆÒdèœÕ”šô¦Ô: ‘{$ä+ÙUêõû¥p¹=V.Ë4·S£ÿ 57ÃŒç0KVž `ªÑj( ¬ÿJø6sFcN«!Àö›*Ë+F X”ñú/Ñê8RQ ¹ê£/¼á‰Å+·I@¤5Ê;uÜ»]Ú¹ÎQB’1¯Û"ߌDÍûJìZÁ©¹peT” cá0‘€îag:v­„y,P˜¡âŸŸ=~ÈÍ;[¹â)GçiØúã;ÓŸ¼òÄ~Ë_~뎣Zgã¿„0!‰Y°XI¡EH˜DûaTCa/H#iR¸ ár„¼{Ùº=8TÆ2á¨x Š×|qù¤ï<ÇžÕµ—ŸÚ»§Å©\9î¦Ë³–¿0uÎ’ &Š—,øúƒ-ÿþÅQ=úOÛBƶï7êèþýzö-¯.ÚäcXpÑ‚Y¿òôÜ?6,y`à1Çò³æo!†ï·×î|ÂQG÷“S¦MýêÌoÖù`X;ų£Žì?bÌ„ï·ýÓ²‰%3Ø^%’ûgzh† DóW ?Eüˆ±BØg]ß3\‚´víW.ü£ñù£GÝ>^áRòº ¹zD»ò?ZðS‘ÜòÍë÷Œ½zÌMl(F‚N‡\÷ó/ë×íp׫G»V¿] |í·“¯¾úÊY+¼éÙie+^x|˜‡_ùjC`x×Þ{ýèwX“ݸî¦Åï>tû„5>Hþç$Ô(ÞåIÛ¬›5@€j¾!e6,¼\qø±²* ¾è 0'(X¾cíBÇæÙ):G´¶ýRvmÞZ\ÑÅEë~Z³+ûĉ¯¿ñøémrœ”Ý骻žyoæÌYOï·ó‹w¯. ¤•™«×/ÙλèõYoL½Éüõ§¯üD–ñÖS?-<ï¹WÞ™õä5çÞ€vïÞVq@ú6|y÷ø§¾mqÞ³^y㮓:­|æ¶ÉËÊ"ÿœ†:$ˆ+ ¨8¤JÛš‚ >„ÝV)Á€£¶?¬ÌʆåÛ73(h°ZZŠá$=5Åé ß¶òü.]¯¹çs…M‹®ívlÙüó²Ÿvl*nÐQû¡¸<Ò,GNëSßŸÑ @vËì† ¢¹T¼ë·oM?öË«úæÈëqùɽƒs~ ±@dÇwï¼à.Â;wüøã’ß7êQú‚å[Ìn­ Ñ?´À&%‘`X°ˆkF Ô8L2Ì‘i°Á`Šé'Òhˆ +5¤zvÝæ‡÷!¼ï † ¥.úC"5Å‘*‚e2SwµmŠl®úlÊõcï›óãNjY ­Ñúëò8Mn‘ájØÈ^ù"¦i/îkW¦ƒwy}lf”y¾°HÌPé.Ï–YÝðÖ£ÌBwÔiÙñ‚l§À?†ž˜5öR¼6pM÷…AD|Ð\`3aA˜ICEc[9€—ævx²‹?úiÓ1]š4N 6}øI¸çÚå;1 SÈQ4çšñ³ý—­xÿbÏöµo_Ñ{ªƒË%„˜½²Ò:#4…îN‹í{׋—ÃãÔ!Üuw·»òé{/?­k–Y!¢3Õ“žâÿ˜„$Û­&“„ÊðRÓùd„ñ[’€ Š)—h9ÇT!a€Ì@åUZn‹^wŸhÜ2挖î—î<ï(„×Í}â¢sÞöu¸ï˜î-5ü2% t7w®ý}S0¿KûV¹õ‹W¼óúv则:±ÌJËŒ™… ²ë•=}âåOLÝyå½÷?úÖ§››öï1’Ýý´Ë"/=ÿÅw}†š cçn¿+3íŸZBЄd– bbQƒ5‡J*CÄÇÖöZX±²u,9´ÁÝ•ÛáÉmwÅ„goPÆ]—õ0Ȣ謹ïü½åèûÖ¯Y (ÙعÝ—F4:ü„ºÞ__ºîˆ“Ïúàüœnù ¹têËü!—ûж…c7šþ¢­¾’Ýz»c†NºéÜ”ù/|Ëgáü^G5;¶§§º@© ¸qêõƒ¾}åÖ^½ <æˆ' {ðëâ°Áÿä~¡ n‡zaÞ{MÎtòoaH8Ò†LÌ{N ¢ˆŸÛÙ™¶§gšpfu¸øÖIms¦Í\²rƒß &Ž=rÐyã‡uÉ@Çž}BÛâœtØPvKÆ^šñåÂ_|™ëf—Ÿÿ°I–ªÒ¹ç5<*=z#!ýñwþ¯°û!NkÜéÜ Ïv:bÖKŸ–åϬùxiYƒ|,Òš^4îþpÖ´ùKVM-³Q³Öyé*Mû?3œ@’Y€E<¯<¡Æ:Zœˆo¢d t7 Ù6@VÑQM6•ɭNT«k‰¸[ô¹~BTEþ€aùHDk9üÒ[‡_Š8=ú · Çž1ôX1 ;ÞpKGT ½[6þüåRo^端rl\óÁÔ·åy_žjË /»þîËP+ÐÙ”NÒ˜Ù´S©$3í‡I…p¢Ãyl±æC –¦«l¿·á´:²`u¼ÎtìW„wåÒ7.þd¤Ç‰Ç¤,ùn~°Ái]zm­v®‘j:1˜91SqÍo5ÈáB—K¨Ë%ˆ"ª¸å#·ïñ·­þåœ?¶””´¬GÛ¶n–›îD­D$äæÅÄ;HwfäÒµgß~GöîÔJéW ÑY²=%Žç%gá DB×ÅÀ‹ÌD°»@> ªâA„ù\uOkàƒMK«Ô@ì5O€w‡QÆ F¬‰‹lá€ÇMÙ[ö}˜?18Ö€J1³‚j^CöñÎrÁn¹‚4¶@qG5 LÔ8_ëå¡"i…µ|Û¶ÍÅ%åñ¸3žÔ¬º ëxRtñŸ‹Á&H0$Ø –Ìû!,°„¹^~ mY¢ s“´›ö˜5s€ŠËÄ&ë¶¶ÚIi¨„÷×Ù_xóãKÖÁÆáAÿ ßNѽqúKB]“†i‚YbA¡CHFMÃ0KäZ«z¥À#4XÆ¢>±Šë,t¸Sdf ¯5…á ("Í pÖí;ºœ{Ä7OjšÊþ’EE[Vîn”Ÿ¦ýãÎÅ÷¬× –xaR$‚ø¦ne?m Eo“PÀ¿}õ—W<¼"ïŒû®ºväÑmrPA[˜áÞ>#5Íã÷wfþ¸¹L´i±ë†±“G=óö…]j>¹óîûÞ\ä/ì0òñé#› Ølü쩉·LžgÔévöíŽî—¥¼eÞëßÿ¼Ž?3÷•3®˜-\/½õòá»k¯[ HˆÄô“¤ô«aLFÈ/¡r6%f«à¨~ƒ÷°ñïÞ´þ—m_xV?K?…æLÏpÂ"¼kÑW3^|÷çüÆ-²›5OMÉ([>éþëç-(nÚÿèàÚù3ÿ7²Þ“ÐÄ£/þ¡)ÓßYѸ{ÿïš™×\œõø=§õj•^þã’wàíÏ< ëæ—/{i“9iu¯>³«^;%¬¼ÕI_g“¨a*ôƒ/ÌN £Òˆ”c*ÚUÐRQBY^ºcÕj ]‹:NUAZy銢Ò?ú3ñžaÙnúð’Û^ý¾ßˆ'ž½khhîSW ¸â®³ÆômÒ<ôòc|8ôž÷¦œîÚðæE‡>ûå™ÝkÕÞé ¯Ûâ]Q˜3ê‚G&v,žqX'-XfÔZ ™ÉDq ‰’ûù‚£zuD%ä„XĪIeÝÒØDÐ>UþÒ…£ý§ßzܱvé÷õî×<Ó ¹»y×Óžxüâz°X1ìÖéFø£¹x¿ÝdKVn.çÜõ¿xtJ¨ôóÏg•¬Z©b{)‡ýzVဧޘ|€ºÍ²æV䨵j½{,3›ˆDà×Ù%a@Áª/„ÝšØÓv¦ goàmk6apÌæÈ,[óí‹#OšxÎW?ÝÔ¯£µqéí1»<½^næ¶…ï>òýû0t§«ia³\—zzÝœü-,¼rÈ šîöä—_/×L.ð¤ÔÉEoØ4% ªÍ¡ƒXÓ–±‰…Tí*j6ˆ°_ƒ›£©„CPÑ{ ‘âv{€ï^ÿê—¾ [eÂDª»N{j—¥§ ›e6¼n׎6CÆÝ0qü€ÜXh MשtÙ¦F¯ÓǾõÊØ É*® 3°ÜmH©FvJûýÏ™“Â"ð1™l{püyŠJÈ>S„Q OýÖ}Ì×ßqîxêžÎjê„–.d ˆ#CåÇ·°šž;Â1bÒ´šyÜýGÀå%;EfÝô®Óý·~8çêy¾rTc¾]ÅFV]·I)«Ôi-mHIJOÓÏÕÄûássˆËR4Ja˜ÌLñV\e%hÖ=A”Vª…©õÚ^4qz ëéÇžóÍŒë{4ÿcÛÆõza®TÜUì+Ú‘°qö¹âÕ›ËyrÆùí>«›*C‘qÉ´GžîÃ÷nsÏÔS{wnY—#oÞySŸüߑ͹¬Ä·µÈi"Š lÛêÛUjpmvNÒž2ƒ Nþ"È:ìËBÂbê_‚R(Ë‹­€éäTNüÅÇÍÙ ø°ÓE™{ä‡&‘’Õæ¬kïj•{È{ËVÿá ³#Å“Q¯Q»þ›çh@ÁÈëFŸªãA WÞQÏÎnýî7?o•šžš‘Ñ!7Mr»¾~‚£Å[/-õ“Ó•Zph^ºŸ~Ѩ–ƒ\Ù±:ßùÞ‡oªß®ƒû¢ŠC$‰íÛtÍÅú!®Í™" F0Ài‚£e“ñ·  ·§.ç™Åæ :‘®Ò&Úíd“a¦‰úmèTÒDjÓÃ.sª ï„¡ƒQgnçaWt†=©×sШžƒP‰:ýŽ?®â¸[޼¢%ö/ „ „"Ð":C“MF%Œ–…ˆKÈB5¤±/OõG¡M”Ù0Xš,%{C‰kÈøKíÄP–ø>R‰F–jeD0a¦ £)õn/†9àÞÛ;þD˜R·Uý…fö‡Øb)XÖtÖ´hAc;˜ºˆq 5b†ŠÇ­â÷Äê2âu–» à¿úAuh‡ŠaÖ USmî!ÆŸ€«¿^K 0TƒY][“Bõj»b¬“2þ"lɨ²Å!ƒqiË—©r…£ø#á ÈÔ^­ŽªX!v3ûï(aÎòï °£CB$Ô8ixuW¼Ø ˜UÕx4 T d15 ÚGà// Háòd¦Â ”—”QjNšK×|„C]B·[a€Qó)(%s˯!? þ˜øSÈO}ähÁºh=ÅòKæ?ýÇÂÖváoKú}gÀ`¢˜~¾²Ë–.Ýá3̽TÁ5ïÍüìW†AáÝ,xù‰i 7lóÿ;Úá¶Hs;œÉÒ&³´³7Õ<’øK¡mƒhÆèÉÔ¢¨‰Öt—ÖEÑJh»­Û€€£dÕÜdžw9ôŒIóþ(‘¶Á”±ã‹×&têÒëíU»ü2–Q–¢‡âÉÓ¾}nÖ²dÛOSï¾îßV•«n_Ý ¢§¦¦êº ‡@‡ìTÌûÇCÍdÞÙH|ªMdX-ï9YfƒWâÔkÝ{Ø ×M:ûÑç>>¾õ9ý <Øòéôw}N¿úµS[g{´Äù¾²ˆ5s8MÍÉt‡«žhžåðèÉ-3Å ú(¡¡®œ¬½Öu¥~Ƥ Ò âX:X°€Z©¬9b64ðþØÁªà‡DOY}kÂ]¿å‘gÞyLpÎÌ[Ö¿÷öç³þèóÚMƒrܪ0m›uÕ.Mš´pÊÓkL ¬Çµ "vBð¯ýâsú4mZÐüäI¯ý!PÑâw^|`ü¬5¶~Ì}vÂýO½0oQ…åãš9wÜûêü_¶„kI­¡PÐëxÁPĈHi2uÔ$Ì!p ®_€+ʸ– åÊ[¾l{ùÞzSNѧÏ?9qüèkÞ_¼eàÝNÏMÑå?Þ8úâ)¿”9òâ¾Yų/þæÆ€©:ø8 ŽýN7ÎyîÆ×MXßô´ ÎvdÚ“w^:þåÏw’ØöËwOß÷ÁXK^yíñ‡Ÿxÿƒ•BåfŸ°¥ÄGµÆTN”•{½å¾`0h&˜°á˜~>Ž>ƵôÊðGo«ii9}ÆÝ6¢óúO»÷‰Å»ÚŸ~Ûvκ硹[ÓûЭ·<4jxÃÏ߸{áÆ2‰ªŠhN`Ûûo¾ùê·Þso¾çÁÛï¸ïá›Oûvú”çgmH-lÖ(ôýŒßJðú¾_¾uÛo¿¯Z²-îçÆÛ4išY[$Ô¡‰˜]¦i@¥ì:\ÃËñQÜ€Á R³6‹è ¡„¢úªô‹o½îÝyÃ}…޾ô²Ö Þºèó¬Ì¶áõË§ÍØè[üc°lå¦r³M¶&(éw ›~ö w§“€Œvw]>xÞ£;>û>0ñÐ6}2ù~ƒ·›ùΦv]›y4Î\6oSY§Õ_¯*¸¼uAO­Y!ÔU‡'ˆb¶k¬¶,PÄ~bÁdpLA&{ÿ>nQê'R i¥†šÛ&+?³CÓSûdÁ†µìºž?|1}å‚é’S\iºvkš‘B€DÌ@ŠË™®z PŸBZ³VYé[d¹³~~³ãÉüìï2¶Mm3äáaGåï^¿aú´™Þ’OòF¿’›]{„.4MHƒF ±?&ö „À~¦À¬¼jŽÖBF€ö2_w@r0ä nT`Š-þm‡Ž»yÒMG×G"“«Z°1ÈŒF86;áåK>-öyšfd¤6Io3°ç5cï}+ÇõKrÆùO_߬iwoÌñÿ¨y®GG­A€™„…"‚d´&†‚B@uP€¹¢Àö@†+"«$Š5¤Éx ’Í/¸8uåô'ž™ø‰øŠ6o-3’šƒЦ}ŽúùIs·€ÿOON^EY­h dçwê|WànššÕ"-ßl\g íÞ*=Õpí1¼`h,™ÀdÆò³±ö” 5Kö‚0ãIFT"_{…€rpù^¾0Ù¾Õ›Sb5KÓ¿üÝ þœ>¢å[©N3ÒÆ¼¶ð’ž ¨t‡/ì 0 9ì ™_PÌS®½nwàîNî<»‡B»ô&ƒ¯sÕÉÍ4ÀS·IûcYÖ¿oaa]³•îiö ?¹Mš¦\«òT0Û6x,‰µý—쀈ê[£úy@Ìœ4'?° È’`κð±ç½…mP¯M©Û}øu·e·ÿüÇÕŬëiYY‡7ñãÐѓꚞúN0ê·>éÎ)ëuk–ÁŒœ–}.¸ù®ÜŽŸ®.COíÐï„£oŸ©YË.ìwß³Ïní< sÓfê|ÊeOÔ?"ÐÿðtAàÚ•–MKe<Ø8 NÏd¹Æö€‘•×3D¦Ó i¨w·Ó†Çå„*8ëµ?éÜö'Uy}çÙe¤åv0²Ô*pv‹ng_×-9E€3½A—‹/VW²Ûw=²}×Z¶›ªb°IS‚¥úp`âýÌRgœh ¯ »Aª{Ƕ  fз¥ *˜÷r‘@IÒ*T1Q¢¤Û¸v¥~Ø›ºFdÚù—IYR+D (ˆþþ ÁÀ`5!üÛâÎüùŠÂ\K791T\™$ %3$$1”)³z­3V95ÍAXÚ‚ˆQâÏ2yCE°)í*Ó˜Á Yuæ4D¦äš¨‘IÜ*1 “öµË ²ç –’˜ˆ1DåöGµ§‰Õ16"&jŽƒHÀŒ0CAQ°„ˈ€ÔË@qñ¨R[¬ibÓ–­7mE ŒvbËTRê[½æw)MŠ’T—¸ _{Il«O$)c3z„Œ#BÓ4ÓÓ3¶m]½f­®iùë‹¿[Ńï*_¹jmqñÎzõêišfõ”¬se·Íú#™…ý,‘TJsâX†XJ)·nÝò˯¿E érjB± À7"V6ªü_„ˆö(SâŸ(1Q8Â7nÞZ´%777;;Ç–TCª •UÔ¡E/±d11 ‚ªÂÏ2ïñ¤çæ6رcÛÒ¥K Ã4ÍH$b˜q¤4eepü×Húö……&DìoëO]s躦;,êÖ«—S§Þ^gV RÂGÑI Å`bõÆ ’ÇÞœ˜+T4—«Aƒ†ÿ׎å6¬#Q­ºôìÃ/ì'_ŒaœYA|@´û/Ab~®žW³SïÄûy/3³kŠ?/‰šR³VrÎt¾®†ë=ÿóÚûçê©ÚÜÞðã¤rWAE@” ãûïÍÌJ¼åN87àÏ>…œ„Õ¥?Ï„ërÏ,±äATQJ¥^€2ÀÀ!gQ)Á#É̘8“µ[li+ðMh™²LìДj<¸©ªÎŒ ¼  ÈÀˆ‚" &6d&ÉÞÛ1kñ ¸ÁžÔÝ…oÂ"±{V.ˤ_n&bJÍÍJ/4:Ãfàã 1„ îšK†V™°Ï?[ç T`†?Ïj ÀÕ†÷ÁŽ: ÿ_,D9  @%Sµ~÷Z=ÝúŠ~úêËúM®c*öpù/N§†›"¨â§˜„`mu­ì=—½YÌ…ïç bw³rÔ+›9ø›”¸½Üÿ ™ÙlPÜúÃÀ€Q<¢¬E±!¨‚•¾)Gç’StãRÊ’X)S‰¸š÷Ýõ2ÝÁ¢ºðŠ=JM§2G+:IÃÀf‚Õp™Û¹Ús|ß…Ï–‰ÚŸ<£úcPTåÃk`ÚoDf¦ã¤&„t‡­Qõ}‹73óãÏŒšah»ÿ޵N¿/õÔÁqbV–’µÒÇP]ÝÕ“Î7õµ§ýuˆ”œ„Â5V_{n÷ÞÉ{öì&\òmX*h% ˜ø¼BøØŸ 9JåöBA˜„NAE q¶[ 5Eç¾,6ï%óÆP߈€ ˆO0É2±Nø°æœl÷ÇÚ‡åœ$I(4årIè½¶BûÛWkŒ²¿ü|„ÛñÛ†ÙøŠóË×C'Èâ-ÛA¹TBÝtØ‹p½‘Ø%ûÄ|ñ€¥äíG.ÊF·7â¸DzàzÜŽÛ¼‚táÚW°Ûmœ—N¥CÌg#T m«Ëj#ò=øQŒžï¢Þ0‘¤ jµ:úIÛ"¿ *õ&¼¶ƒv'D/ à]á³Ê÷›?Ëÿêl koõB QKÔÔÞááá{{{?Ê38mF£†Ã!žžžÀ)Ä€“Š‚ E5N‘eKaÑθ-` ‘³qÝb+À‹9ŒòNNNpúéÃD/ôP­›°EÕ/eœ~.£^oà²| Ïsññ׈úÜOÇh·Zè§Ò§ô5$0½žeа®Púô¦iÃ2›p]ÇÇǨIÞZÕ|5”ÎÎ î0ßàââ†Ø_M\‰ˆJå j—U4Äï·ßOðÇi åò9L§ƒÀ³Q©â_GͨˆýéÍP÷½ ò9v;gúørøPXµô¬©£££gaÑHÁL& ˆãŠñxLñ|¦èrvN8Ú¹2Ž6æ!ò{½æ‘÷×Ïÿ˜c»f¬ô8‚ßv„]NfôQè£ÛÏø •}D;’~Š(Ž‹jYÝ” ™eœ˜“¶,áÃó|¸í¼N 1 Fã;r(ì½èy r¹sþÅy·ÅqªñUø,,jJ kßèõzèt:ð}Apå³Â‹Øj×1oŒ ðᆡæ£8©•¢SÜ=´œ6üŽŠñ<ï%}\U_âTP÷©òéžõÞh'mÇa íÌÇ5Ç/ü;®¸Ï<ß·BA]þ£ä…ʼnÅqöŠQ¹ó8.νCÝÝ_Ç»Ÿ…®UÌã_ÅÛŸ­~æ„ÅïXü^Å×á;ÞñZP;Ôл°Þñý„µ\~Ãzµ$d¿|]1õ3õÕ<ùì«÷;æúþgA¼¹°¾ zé ¬ O ›\c¥…¦‘#·Z­ÕýÖŸ÷˜Íîµ ¹2'÷¼šX¯W:þÅG矪±~Äãz•óÓû󨽼ëé§¡På`íéd%xÚ™Cù¬×ŠóF]™ð>+w‡3›N1_,¸g¨ýŠ}àq³‘ü ,x>+žsjÞ²ê“~“‰ä®Âa³yäw0[õÅššŸêm>gÌË^¸Ò‡g©{`o‡×CêÜØÏRqàßhg‰ÓŸ"äÌÞÙ“âλ=æ`?ªÖÓæåoó¯ž^',™ÈAþtÖ拎ÀLJRÕV+Ja… ša [VþT§? þŘ¹=5ŸaüéM¯ö¢7ÛéÎζk·­mÙvÕ® –Ù%œá|ˆJ ‚¢B r @ „„I"" ”""Ž{¸h?ýNfzïÅ3ódæ=<ïóûæ—çÔ!OM@–™OEE9EÕ­"ξ(øߺCAäÁÎ× ¯ât¹ihzÄ¿÷„æôÀ^øØ ¼äý»CJ2ãœZ¤¯õ.ªº.Þ¾yÍÆf€7‚œÀÖ&þMᩉzÍFɹ´¶ëèÑ´³æß öðjw¿oÕõbcc¨ojF–w™'«¼äí>œQ+ÖTV‹™[UµŒ†™_ecí9û‚¼}Qßöö5%JŸm±µþ”ìÜl6vß2m$!5’[èz´äÈeŒM;i©R’š”FÑÎæºi²Œ»õx¹ÿ†yûi×*™Ôb±Ma¶9° êq=õ /l ß¿¶‚âÛÚô³¹µÍ±ˆoÅIiIe·ïãš³š&£±CÏúŠ›ì¬Lü‚ã^Mi)2&‹œ¾DqUAŸ®—µ–½×o‚‚³3brñîí!mu·¨ëáçŸ~ä'އÕô™,9-<îê¡ôF>Y™tMÐÿè6™ÙY(¥,yW)»¦ '+µv@Ìí„–À„s µÑI³ÉM“@㘛úa j‡f¹/P£·ÓouMJ!.AÂ;šª®Q­bb°/Oÿi¼”{wÊ8wþ”©uÀi©.âןýƒÑLN’„°‹1ôjµ\8{žaë<ÿùù„ØÐSüSšÉ¥ó_s)QAž<‘ËQQôt·ηQ  ³¥Šsss6ªn–ÑÞ\ÇÅp ]£3ÁuÔÚ“Iâ¾ äîÂÅP*îT‘ÅIÛGh,/D*•òùoOž¢€›%%d¦É)T–Q©* %KEq¦œêÛ•¤‘œ1‡?Ò§}À×—$„‡‡Ø; üð#­÷Š©íŤoE¦¬åFfá—ø6ì ÷ëÚ˜0›ÙXr’, M§÷é9ùGY¢YiF>Cªb—ÏžE’$'&5—ógN‘Q ¤µñ>¹Ê|Ÿ’¶k€²RIE5¼ <§ 9C†_ýòÔû°Z,l®:ˆ‹àèø5aq21Ä;Ä™? ‚²¯–ÒÕ5Äpg3Ÿ~zŠibÒPÈQ•W›LFz2FÇuE9ÄKã‰OË#":’á‘1*ʯ“UÊîÁ>·³Å牬 #´PI¿i†ÕíîñÕùp†GÇGD“[  4±†Òë4ÔT"ÏJ§Eb:ëÈtIyS.éÈOv´™Îþa»˜Î~'*Š—ÚL™_)_⑾ҧ,y¡!ÓD…<Ž‘$?.ÑýV>úÇœ÷ÈË0Ú„bÕôÙñÃ3:~kúlzm¨þÙ†ú§ô±–Ø‘$ô=jƒ~| ¡õ ·kЪ}„ýcŒ»f¸á aÁ·ÀUÂBò®ö»¸|å:F„Y¾!~ <×k¾ÒuMBÑÁÑšš03Ä‚GÔ¥þ¼ÏíhnÕ¢¡¶õwpa°Ó÷z²ûXÜV¸§3âJ÷$*ŸZTžÂ÷†è“qõǤ'>Ûm—«‘E壪¼ -?5AS_ƒœ³…x Ìù…‹ði$ë0m1 üF-|ó³(9—‹1Ç,{; i|€W¯ðË£û8²ïs˜EúœÃ„}ÿü7«.!¿¤ç„–w¶þà•à­Xñhš}ø²î r~‘G0ž‚Sõ:”Þ} nÐÜZÌ\½PˆúÆV$âa´tjÑÓ~Í?ÝÃÕ+%(ü¦Âo(Èσ¶³V«Éä ¸’Ó[žã…k eÎa`d7nTÁãÂd4 ÷I Oų» ±ãúÅRä~ý5î …=—[ˆ¯ Šð«™«“ì ïdÅâtÅËq=ýÂAÖd‚ȆÉj‡¼¥? "@Ÿ+‹¹9^Cá,üó5JÝÆÍB¿ÑŠx,ÏÌsp³Ðã´`px„ïDšT—Ó‰H|AKË!,q_i·àRóós˜2cÒê@8«T;^±:mt _‹h4’á¨@ŽGÆåÝb†i;ËŒK¡ä¨¿LI“ׂ–éT –“åÈNpvpw°bÑóç`ýYpà_ñZ:òËb烺£ªXï¿ÿ¾ž×½^ïŸo˜òØå¯ùe±óAÝ¡©*¯˜f*ÈAö¿ ¶ð_=ÏÑØ9Íc;jÛR`Ã[„ˆµÝL“aKÇ;4F˜Lf^yÎ(/õºt&–…ÓéÜ’ŽyJYJšááa¾Ø’.õºv&^c6 [ÒÈ×ÄIÃx&Þ@5›}µm î¨*Öž={ô|ÆC“¶¯Ö“˜&ÐíßÀÓÀ:–WØXSÒ­I›£h|jÂÍ>?¾ïóAÂÆ+t\ëáuý"*zq³w!¶šøÅïºàS¬uòWý+2OÚ3Јòp»ÝÜÀåF¬* ÓÉ‹ ‡õµÌòHÇëÄÜ ÌDCp°ù°„÷ÃYF­¯(ÊÎú©ñ ßÂvñʸ|+D…7‰å· Œ3mÛAÝ¡)k÷îÝz¹sS±‹br!Š/Æ^á„(r§&6à Ò¹O§Ecà†gC·ןzqã©GàWŒ÷dÇšý8ÒÀÁÈ àPó".=ôâæ&Ú=^T=œäãî§Ë‰GZˆay6ŽY·ƒCzøf‚XòÆ^4›êÅÁq8øò™40(..ÆÁƒ9,Ã<5ZÞý¦˜1ŸJ0>>Nf“™ÊÅtE_qÿ–f%®”E¥êïïG]]X/>¶AYFÁ‹ GKE È8Ó¶ThêÐï¾A ‡p¶÷·\Àe3°çðíp«‘‚>´ÄíÎa\ër£²kZÀU\øRûyÆ9®Ã±û"¬ŸGéOnT¥Ñn\ÓNˆAžF4²yåFðÅKxžÅមÇÃÎxMËðü"+ Øv`Ãieø²Hõr›üàöã}ãÝwßÅÀÀ€|ÏI–ÊBë§šÇikbbƒƒƒ|4Áé‰S¢š\…ÉJª*«½½'NœÏé P^^N«¤ ç7­640¾£V…™SEã÷7­a÷@çv»ü§}±Ð¢â²}0àGÝ=®tØñm‡- ×:¬8|Õ‹£5³8\åÅþR/¾l²‡æo‚W[ °;œÜ€U^ì-a~"Ž.mòòs1ðØŸ%Šå0óÓÀ†ó% Õ¬£j~b5“'OR±8@´X™ÐqÊTäQÙX–ï,™¯Óé5¹ü¦E£â±œ"eΟ?‚J®ÕjqôèQ*=•T!—Ó.§U™×v#ãc ¾ c…i¶S±\@QÓÞ:ÔêÕo4Ý„—ü z¾¯«Õ>CYÛ$.·™QÞnÆe)nÂáâì+ðàD‡J<øèŒE S(צÒ2åïñ9I!‡¿vŸ%%%àFTTV`iYAG°<¿j–SäÑjäääàwÞÁ®]»°wï^$;LM.ôiÔò8¸äGëÈ©ŒV‹ ¤Z/Z2Z7µöQ¹êëëñá‡âÒ¥K8räŽ?N‹E9 ¹Th›¢¯¶ß~ðÁz6†’ ¿ß»Ë‹cKøûÉWøÇWëȯ ˆAâ3–è››…¦µÅMc(mE)Ã&6KßÇËœø4Ï…ON»ðù7.ÈÆ¹ºq”µ– !ÐÈWË¢¢^l •…>§NtÐY5Z“ÉDD‘Ï6óÏDÞ~ûmˆ·• Å¢‚8p@n“¢F£‘SžJ_ùÁîéá‹ç^Ö‹²™§€ü²|ll,cû:;;QQQ*:ý¬ÊÊJyi¯K…¦U–ym3ØêŠõÞ{ïée0,ÏŒ.§ ½VôZáž¶ Ó˼4:)œv¢êN 럡è¶Có„ýœ!Òû”´·ûQt«[ â(<ž™Íu’å±£ Z#9]AË©ihhˆÏ4¨ ¤KÓTx1¤%b¾j_òÃTv¦:1ä‚B¯×sSåÃtÖÛ¤e\M&éøÃ¡%ÍÄ+C]ß(M-ºCR} ÍÊÓ ¨ÿ[`µLÂ"À8Ó2aÈ0Š‘q1ô"}3Ti™6<Ê©B–÷¦`yúEì|ÆUóÕ°¯Ì²2óPym)‹àâuubÛ”}µ} îP‡¶ÚnxHì~[rÿu ¿,¨;¿k»«AÞ à+"Ë{4ò9¿åƒenx„ ö¹Ç"¥+†³ÈÞnàä® ‡>úgŠ®ÂdsÀÆiÒd‚Ç;ïÌ4L“Sðû`¡‰6ôaïÁcÔl…Ýá‚Ï7‰)‹PÌPúå»,²×fÖÖWpùLt#V”æŸBu}3Ê N#ÿL).æåàðñ/ðÃ÷Õølÿ!´¶üˆ/NçàôéãØ(e¥È½P¥0O¾S*EV±‰4åWÐ?nCCu Æ #8vàSœ:sšêp»ñZÚÚpì³ÃÐܹ;­M¨ºr…¥•hÐÔàÙ*béÈ"«X„¼«Ë/w8ÅÍ/ø”v‡±èç^̤ß/EÈý­Å TîÛ˜,èïÆ¥¿:CB-MÐÊóÒó£ÌS…’¯ü÷o¬X¿–ÂMÿ‹gž@jŸgÉŽ|*?uŸ‹ôÒIþk¦ÎŒ‹ÖQþÿ ¥íõxg¡79`œr`xÒ‰ä—Óømqy¿nF„ã§L/è˜ï„Íáúo{ïÜhzÞyJ®­r•ï¼Îë½ój½ön9øìu^¯³Ï¶|{>—-Y¶¤³<šÑ„™ž™îéÜd3çœsÎlæ@€‚9€ˆ0÷„‘¼þÝ˧ø©9½£;nBi¨zêã÷†÷{Iüù~O~x\§§Ÿ]‘±2gauSÛ½•|·^#õ°ŸîL–y‚€|éb‡ ø †Ãš^@$É*ûô´6ÓÕÓO |¤ÆJlž['Wu/þñ³ÁCMB}$­†{˜&LlÙ·89Pk^òŸý±{õœÑ2¾È÷Ü™æ×’Æù¡h ?0ÉI6ñ©˜~;ÕÀÇLó ‰&~=ÝÂýXÒ_òµ‡üMÙ4ÿ1f’‹³ðÛi&~9}¶‰5ÎŽ5­>o]ŒÿêV`á'ãÌüÀIž­™Vª…3Qþ~¨À:<:ÂëÚàÆ«·PÉ^ÕõÆMã•TQžŸJf~5™tèX\µrptÂÎÖ©Iit7W““_.‘¾õµ­ õÑÞÒͰ\YA mÝtVó £ÂÂ2fÈËËgÊ2CAF"‰IyŒ éél(¢°¼R2$ggæ1µhS ûxdg'GôšøUªøf# üyŽž¿Êã2üMþÿG¦ÏæŒñ¹<=ù‹>˜$op™§KôüQÖ8¬è‹ycüa–‰æÑi<.‡äg_Z%³WÆ“?¸ÄS…:Y;§o¦‘)<—Ø%åíðaK^›á =-UDߎ%'=C¤’—^ºKQA¹E¼ôì³´ô±½½§€u,ÀJOÍd¬·ŸŠŠzRïGñüs/¨< O“‘KCM)Uu´”gŸ˜IMyÉ)I\{õ6±qiä•“VH]queY4”ד®æÒÚ=ÍëO>v'V›a‰ïº=EßÔÿüú!?—¨N¬$?–8Ëdù‰Ä~1ÑÄN˜àGb§øäq¾ç¶…ßL5òsÉSülÒ”œXÿZµÕêW9;>à8äcÃéá;oMò›)ãüû˜~)ÉÈÏ'Mòöé!;n—°ö‰% ìïÐÙÖÄäÌ<ÆqzôÒÒÚ‰ejŠ1}_/“sK¬¯Ú xéjlàAß ÛÍM,­Z™±LHæb•›uµÅ56Ö™WímÝÌYÌ466c¶ÌÐÒ܈Þ8ÍúÒ*›KØ6¶èV‰6žaмÆÙéñÇîÄê6.ð“1T:1þÏ­ÙèXæ—˜þ2gŒ_I62:½Šq~ƒ_N4r¯q‚eÇ6ÏUùÝ4#¿“fŸWì–VØßÛæïÊÌüc™‰:ý:wëMü|‚‰>ó2s«V¶=Iö« ðbý N¬oœµïó®x#aÊjI»N%o‚ôk;äõÇr«>Ǻ䩮Âo¡ö*÷/’Z¨9²öñ×Çœ°çv±´¸B(üHpÐöûîB¿4ËŒûÈÕ¥€õã±f:‹ø½»¸Ün¢u9]þ<[ÇÏ$LHâ5«]ñZÄ·Mq|äÙJ3¿šlâ·Ó'x±ÚL àgyuݽ]þ(g‚¿È31<ç ¦Yña16ÄÈïpï°º¾!ž X܉ðïãõú´,~_ªˆ£œ^b®¥_*HËU{,c]Ú¸/’L7ÛÛ;Z&= x „Ô˜P•]Tau øÀ„C¸êÞÞ–ñûÞ=¼¾ZÚÞžWèUc‚¡Q…ˆß™M¨8”ë©Z7Àžwÿ²` ¿‡ú§Ð²÷ ytbgwWöQ¦z´nnðö™üúÕ+k‚Ïšáí2{æøO±~)ÁÀo¤NðÆqHÛò·e“üTÜÇ!?cs|ïm3¿“¢ãSQfñ x·Å;¸``^1ùSŠ3ðŸãMüpôWj-¼ýú‘ðb°äÕRQ”ÌÕÛј,Óˆîì4+V§˜|L“SxÜN––—X_YfÓfǺºÂ¦ÝÁÚÒ"v‡G2ôIZÄp¶Ê"Š*šmmäê;,Û÷Ø·¯’›œ@e}=mM¥¤edRš›LZq-=½½)0 ö´0¢%.6ËÜ) wÈ)¬àô7yÐDBB*½Ýƒ¤¦“—ULzr õÍõLήr¬27=«À·/Õ)V—&hcsm-çŽÚ÷"&óuØ[Ì-­ŠS]GKy啌ê,œ|4J`ùš_¢a|Óô.Ç–¥ãï Ç責U?Îo%ë¹^k$ºÉ¬úí(ùN2;&¸V7‰ÝfEg™çÅÚiµ~Ц±9:ÇçØñ8)z0Á¯'©5j Üj0s­ÞBZ›‘ÓÓó˯‡ XYqW‰KË$'/òš²3ŠÉKO%YQAqy%y”×Uóê‹O“[\FQjm½$ÆÄÑ;6‰ÃåAåí”à‡Ýié…4—çñ¥¿{ž™u{ÖJr²xíÅÈÎ-b¤»‰´Ü,žþ‡§É«l'ö‘—ÛŒ/ ;)Žþ!=·¯=Í­„dN_‹‘Þ&’ãïðÜ•«tõOPš‘DŽ¢§þáELókø¦Ç²Á'^œ Q· {xßur|@km).oÝø ‹këädfQRTAeY>Wo½Fe{ËVYéÉ´÷ ñ ¡’ŒœRIRTÝšƼ}tÔVW\MCm5qqI<èdvq‘†Š"ªkºèj­ 53žþ^:ëÈÉ/c/¦©®ƒAOzZ2Ccçê…²òJÑë'Xš¶˜’ÀN/'Vee3ƒ½(Ï)§s`Tt_©‰qTTÔ‘˜ÆÈ¸ŽÎÁ>2RÓxð G(‡Q½‰ò¼2ªÊ²(¬l¤»¹†„èXjšèh푊_ uL·aŽ_IÐóRù˜ðJÝÆEj†¦ùí”qRZ ôϬs³ÎÈ:“œXÊ_Kœ•ÏVë&/©9׫Çy®fŠ›5:^ª±ð§™£ümÁ˜œXúÉY:&Ö˜_\bum¯TšIn1òÀ²ÎôüdžºáP2 KVb úArJªØóK†^¡ {^/ûŠBá\Ãá Æc‰Ä¡x QUìîíI›rÛag{[­y$¼”d…åYj®ðl{î-l[[«{Ÿw $Y‰Õ~Tû¾ðO¾}/PH9¬ÖVýaÉ\ÈžÌ;Qóöð‚²_Å¿IRÞP0 IrƒA?aáåd_H`¯ÓÁö®O4àÕ‰ÕªŸçSÑ“ü~ê?;ÁÞî3+6~4f’ÒÁyÞ|Vº,¿‘bä0°6õwùö÷øÙ„ ~;YǨñ¿—2ÆOÅ›ù/‰Fþ$×ÄÉa›Õ*lŠËéÀáöðïï¹Rc泃–yÿùË…Ñ}SIyÂ+z—d!ïnÒ9Õ2Ó=”¹šdy‘ÉF6/©´/2*?±‹ÌsZ¶¹°€M1ß2öXÖPý©'¶.yÞÙ£ìu'×§¥þ>‘ìƒjîeSÕc¿Ÿf8~Ü„ôˆÉÿ`'ÏU5‚ô¯ÖLð3qF©`¶e³‰=wmM‚8ÄLãTÀú¼ÔŽÌ)¦ÝÌK׉Tø FQ-xî6šù‰#ë6‡¸«¹ž ?~‘ =Û;¬©6õ' ÒÃQA*ttÄ2³ KVÍQðt~’i_ZÐGwcC†)Öf¨klÆérÓÝÖŠä==eaBGS[ƒ#v\6ÆÌxÝ6ô== ô©ûã“3ܶeÆõcÔÔÕ‰ 0ØÓAUSÓ3**J™^ÝâXí¯£µYr›ž)ÐM†¤Ä܌ňÑÔ´çS­èPæj‰B´l„—ë0k 94ðäë{àÑ8mÎñÑ…KÏ…©I„ŠÃZZ”\ìmºþã]Í#Sx·]J²ÓñÅ|Ô@2Mϳ¾åäo õâÝàÝq3;¿À¦ê‹i0òåÒ fW­LÍ-±½³‹ev…u»äyï1Ìó“÷uÄ7ذ»˜š_fjq]¶ |>g˜ßJ3Ñ=>+*oÚÑOy‰ŠT ŠÌ ÛÝå?¬ö%ý^v¼ûÈ&é %Læ¼^üÁ°0áòŪuwwö.¥™ ³µ¹ÉÞ¾ŸPÐÝáß-›m‹]) «î÷±;]ˆÿV(D ’´á¢’ð¸53Γâ=*–ý,?k ulšý·˜e¾¯émaq‘àþ¯çO²ô"1NÍ-H_BóÏULâr9Y[YfÇieyqžmskôDbTzB¾])²®ü”·ƒ?KâÇ¢ÇÔß4°ÎžÒT”EjJeeuX×ÑÌ8[lÚlRçxmyq’©É:tãXLãlØÌÏXX\³ª1¤&‹41ižÀ«ØÛRKMM[ž=l8ࣧ±šÔ jxùÚ-̳Ke&’šUÃ[_{‹®ºJ^yù6›®}lK&ž}-žÉ±n㉋~…ûÉ„OŸ¨ ù§ ðáñ!›•“°_ÀðËqcüë&2º¦99 ±·íÆîtó·Œü׸aõ*œàzí$)Ý+òÏhŸæ,éSXuuøB‡¢•ßÛvñÖIX­»)ú?Î6ò³qÞ>ÒnXâ{o™i›ëË7 ¬j ³°9]¤ÅD“IEQ&Q÷¢xY1¸÷’HÍJ!=5¦æ2³ÓEšËÌɧª¸€¤¨û”äPšŸElô-e¼M±º/ÌË¡¦º׎W€¥N.ƆÃÛ7LsY®2¹¼ÀÜšƒ¶ºrf×ì¼~vBmv&Ï|áY7vØZ›ã O½ÀõW_ 87‰›w^åvt"þƒã'ÈßýHÔJoEˉŠÁYQÜ«Õqµn’Æ£¤;Ðûù^«3];"ö¾²nÃ3¢“× Sœüƒ}òfR* Ê{'(œ£{t—ÃÆSùCü_©C8mÔ÷+EÑ©›âì›Ö)]Õ%$%%ÒÕÕGKU%9ôt4ST\FAI9c#æqÃCÝtõvQ˜&•¬Rãï’‘šMEq!qÉ©t65’“SÄp1÷chjïbey‹ðá1a¯›ë/¿BÛÀ8íuÄ'$K­œú†.R_§½ºœ¸˜d7=8­4TµÑÜÚÄx_;)÷IË.Á~b^…šKTOWLð}·L¶øvܼyz„cËF8ÖîÎŽx+ì8·àíSvÜNQr¾q`dv“O\™¥jt Þ:RLºAñmcÊÎh&¡cþûÿ-ËÄÇÕ!u‹|ò• F¾ùKÓ.iŠYE“•ßVETcð¥]îiŽ€Ovèבæ0ìçÅ ?=Žuë<ùÚ†˜aVV–%Í”² À‚û{”õOñ}×Çé›XÓŸ¼¯çK…zÎŽƒâó©Ûj Û³Ëüh´‘ßOäSw ˜æVEs¯|µX]]žxyiéýô ; iÕÁÊê<{°‰][ ˜W¸d £®§g'ÌŒ`wïrtQ‰k×®¯7–“M.¤¯¥Ñ f'MTÔ5ã?TóŒf­Rtm~г™)óÅ…å̯؞dpÉk¨idš{Ë@ãè û{;ìzœfW ¿›8À¸g5Ó¾%ÆùÕÄŸ¿-çgcÇñ¸Ý¬¯¯ HÅåXPÀxò‘Õ9ÉÜ`í¨µCû»4©g}ßqy¶ÚÃû,91¦ ãtwÏÑ7ØBmC5iÙ™T××SÕÒHq~6ͽt6×RQYG_WÑ·oR_WMll,C£ý¤'FS\ZÎÒ†CcÞÑu·ž–GQN ÉÔ6¶qëùçiíÔóÖ'dÞ~†Äìj¦ô<õù§hèÏÎ'X­#~âî0u}FìÖMúMóÔšùl¾‘g ølžÓÔ‹K‹â·>8n–Wç— †øø!Ö×Ö˜0©´àR^F)ˆ™™›gxz•Œ–k A­ÙgšcȲDqç8’mà~ŠÓ“÷XË3&2óJ©¯,"¿LQQ)i™…ää¥SVRLjJ ñQ·‰yí&Y©©äd§îc“2©,Ì#3=ƒªê<Ûû„åÄ ¡ïk'61³aŒWnPWÛB»jí6Þ|ý„Šô»$e¦ÓÕÒ¨ª‹>Kq}»x.<©Àz]«vhZiåtÇÙAw[Ï北 l;¬¼qrˆ×#ýï¸fàås——7NùŒÜ¿»k“JñcˆÝqcCÒLîîl3³¶Å¿zÕH\«þéTÂÈþÃÝq¾ÿ¦‘§ËMðÕS9ýÞç` ïbl¨Ÿ¹ÅUÚ;ë¨iÀåq+ra+û¤i “y†…™iú‡uì8èÇôØúûúXYß`Ëæ`)vtƒÌ/[Y_šÇhž– ÓÏǶÇËÑaÓ.¢ïÂÜù²ž¨Fÿtv ¾ïJƒÏÃ?õ#³*Jg\ž­öðþëôäÞž\»>j‹ÓHŠOãÁP?½£C ›WŠA7BJò}j;FÅìP]”JrVã&#YIi4wt1;·!:°ƒ€—ªü\Ê*Ú@sc} vÓÒÔDJ|%uÍ_òÆŒˆúÆÙ%‰ÂIiS 0°´´ 1ž*–ö“Ä*íâšÆ¹Û`¤¦Ï€ms•¹¹–—…G5MIOR“Ž;õFfçæ1OÏòšZ£qÀÄæúª0êJ£ÏêÊ }úI^­6¨g/sú0ïš6ýÂÿI]¿î§$-‡çíbæ¹\)U«²*æœÇ}¹9ç÷ï¨Âú.‰r#$ÑJëë;¬-»Y]ñ°¶rîoåb~ÁͺúyqÉÍ̼“•KýKms .»±¹%Ί».;ÛŠvi¹±vÝv‰æ±ÚlZ®,!‡ŒßÂãv‰-òÃõ =ÉO‹°@iÎtböù£t.¤È“G%|%rF®—Ö‰æ–l²Øé0ícÜã£råuªW¨0;¹ß4æ]Ë7%¦­,î%Ç@aÔ/çÇ Q6ICI<Ò Åwë(„!91|^/»Û;¬WáQp—[·^¤©g”IÝ(ㆠ†Æ LÇèîb]mh`x”Åõ-|þ€lî[ïù(7¡-ÄþпÍí»×™œ] $-ž¶öN ÊZÈÉÌ¥º<Ÿû·îÑ3h@I¿_j+ó-÷‰|$†áCÖQØOyaµµ­˜ô#,¯¬2¿ä`¨½‰ÂÒFt8nç×ñE€Ö{!Íêø±ðuEZŸÚ\X`½ÿVX`E>`E>ä'¬È'¬È'¬°"Ÿ°"Ÿ°"Ÿ°"ÀŠ|"ÀŠ|"ÀŠ|"Àzò€ùD€ùD€qô‹8ú½ï$óx<âB¡o-Rß›¼mÞ°4ÿ©šÔsdsÚ±¡o ÒX˜÷L!ñú*HÂ~"¡w!)²ù^%ÇœÓéŒP„¾ FÞ3°Ž.R:jE™"¡Çè½—•S¤ªæ¸NÇ̚Ī:ÍhE¤|Úó‹’n#¡ïúK2›{Zøò—_ãÚ‹ÏÓÐÕGmu£=¼üj<“FÕ5ÍÌN[(/k`Ïú—•t‹PXã ĤUS—Ã+Wnð¥Ï|–ûwbyéÕ®|á/yæÅ«TU”ò™¿ø+¦×Z×}CŠKòƒÚæ-ÄÜ¥¸ºŽÁžNâbiëî§²¼š¾Îf)`4é‰KLf~ÓÍññ“|bEè½0ïÂW]d{FþDr°«{iCr¶Ÿ—¹€*¬Nó.™a.×f‡Âh¼Wø¢MúßѧÕiફ&q<6WËO*}cäžpø|-É^syžF’ ñHÀÿ¨ÿò3.·JyáwæY ‡µŸß‘TÚ”@£=[~Ö YÉóí[®ZÊL­\ñ¥¿‰´?*Ž ûˆKǾk“Ì´"Â'g86–i­k$p¦§¡–U«ƒm‡£“c–,tõâ „Ôý)«3FFFF(¯iÅ8:(Éî½>?áp@æ.­Ûp;·†ØÝvã ñ¸\êb×¹IUE'‡·g‡€ê ‡ƒR3Z+Ê]™“Çܺ‹ƒPPúCÁ ÖM+û>¿ÔN ¨{ïînµ¦Ñ gw?ÈÉQˆÆÒBÖìnFº[¸s#«k_€ïßߦ´(Ÿ¦®A†û;IÊ)dË餤°˜ÝÀƒÍô릥چme’ØØ8ÆL ¨/Ȧ±­ŸÕÅiRÓR˜]µqrà£0%ܼb’ãR±9ìæç³<ü“ ,)ÒßVÎç>÷E:»:)ÌI';-‰ºªbÒãÈS÷¯Ý¼Icc Y©‰”WT²nwsx|‚scžèW^ãù§ž"--“{7¯‘žWHme©jnUq&q1÷¨«mäÎk/QRSKRT4£z#9YÄ&ÓßÙ̽¸,ÊË*¨.¯V ð*PáÞœãÿþëÏ‘^Ü€a ƒ±1ŠsKIOΦ¼¼‘Þ:Z†ÉHJ§¡¹ƒkW^dÍéPèZ«XØØbǶH^Q áã3Ž/²8Ï™F¨­)'¯²žÎ¶úÆgé®mÁ¹dÉl¢§ÇÄ[o¿Í´¡›Ï|á Ôu³³í ­¢Œª†.pëJ ™˜Ýà8¸ÍÝçŸ!Aêé¿üG’““xéÖ ¶ýG=ÙÀ:ä8´O^B&•åÜ¿q—ä”Tò²Ó)ÌÊT?'“—™FrZ.-uÕÄÅÅS]WÍ&ý8; }ó™©É¤T’­@ÔÒIAFIÉÉÔW267ÙIɸvvh*,'*1‘ÊÖF\ÞÐ ,¡p0ˆoß/ŠSïî®ÔdqzvØñ¸XYÛþuÕæõùXY^fgw¯–¨MÍÝ'pnØ …ñºln9.ænâóyñ«yÁ@÷–-‡ê_[—W¢ms-—§ÃΖÝÉŒnŒ Ë23FÜ»>¼{ûœž=”LÍ.§«ÍÁÖò÷nÝA7µŠÛaÃáÞÁn³âöìáQkíîùÔžÂll¬cÛr±çõФ<¯Àº¡€uJµ­-Ÿw‡Õ !iszv¥nÐʺUþiB?K‹Kx÷}ìïí±±¾"ÏS…+åï°·ï“’ÈûÞ}õL©3$<–ßï#~2x,Iµ-Õ½ŽŽ¾Ÿõˆa&ô¢(€–"R»jex/ñÒ§1æSünu§5s£Çеkc/|yîÁE:Êã‹ûGóe¿hsdíG÷Zžzm¿š° ëhmÚוּ<ú½/ï÷òßCƽûõã,ù£z›tw?d³ªDœ€CSE( ɽúYêÏ/. Ÿ¢H“xä>àcmyMÚä´ ðlïH¹_ ˆßç•ëζÿ¡%°9 퓚ÊÎÄÊê2uU ê&èë}@QI1ÕÕUXÌS”•Ð×ßK]e3]m ôötu—ÁQ**ÊYZ] (3‰âÒ –6RK'°ï¡º¦–éé9ì.7ó3\ hmµL-nr)yòñVhßMRBžý¦¡rr*ÈMŽ'>­š²Ê< «ÈOΦ²¤œ¬ÄJ2 yúÙg¨®¯#;;•”¤8nF'P”AQA555ìîX¾=7£ºaZšYÙØdjj–õ•y›èèê#t1},¥ñÓ†óÊ^LX¦©­®``hËô*+k‹,.¬ÒY]I|l<ó$‹S tv´02ndp°ÑQêk˜›&7'—½‘å%áóËïÅîr±e]geY­µº‰Ã¾)ŒíÆê2{þ`ăâã̼k¹ÛÈ.L='b|>>:æDý¬”Œ¢´sÏÉE%ѨŸJÿ©ÌÕ 8\* ðˆá‡‚C!¹×ÜÿPE<+¾UuÙìpôuéêX@v¨î’9Fžô=’̤]ñ‘„¤è°„GDz6štu ‹Ø}|I ”ë×ïÅg^Æj`z´µ&‰iô ¤Mùgx$ý£dùB’@_ž©æŠyçöÒ0ÚÚþŽÄô£è@~ jîF2WÖÓŠ+¨ý}l% î{hmh$|tŒu}•Ý}Ü.[¶ úFÙ„¤âj~nÆE)bÍÂâÃÃÃLÍN°¸¶…”41OJaŠ@ ŒoOt>Ç'§,O饲}^I-º^V×ÖÙÞõªq{´V–1¿²usUNC—Ã&¯H»ÕŠ×Ĺ¹DIQ 6«­-§è‚¿è¸¥ Ñ!…É©L-ÛE§¤tmRszyq™=/~5Þç÷³írbßÚbh°Ï^€“£0u9¬ØœbÒ¹þê6&ï¹I'ÚÖôª¾¸Œ\6ìv ròÙöÐßÖÀƒáIÞxó fŒC$&¤ 7ÍôïÒXUF^Q%‹‹s$ÆÞ£æž‡G~râ¢IOÏ!êÖ}Ö­›d¤¥|M:Rúm×NvF–Ôd®)Ê"½¨‘ì”8ÚšyñÅ{솎ÙÙ\äË_ú<ñ™Eä¤Ñ;0Àk×^£{ðÅT•—“Ÿ•A^f2±±yTQZ]Íâ†Cª¹mKÜ}é^xêoINIçÖµ—IÍͧª4ŸÌ”$*Ôšñ±QTUÔpý•ç)®ª!ñ^ƒÃcjoÙ$$—ÐÛÞÄí˜ Š‹Š)-,ÃêÞ“ŽcÕÂ?ÿ9’ókÐõ´0Ü;Lnz©¹”73Ô=@Kýi‰iÔ5¶)]aÃíU‰¡½FíÑÎöæ„2O‰IçA{+½úYzêÛĤ³b1ÓÛcâí¯¾ÅðƒÒ’¢IÌÊǶl¡²¶†¦Ú*Ì‹V KYØðpä÷pç¹gHIÎâ…/|…ØØû¼|ïÿ!GW`…ýÛ$ÞºEm}#W¯^#!³Œš²BRÒ‹ÉÏ,a/xÀàƒ&*«ëII‰'&)‘¾¡1r óiéîdl\Çõ[·êi¥³¹‘Ʀ^²cnRÙÚMKL:G¢£ÈÏÎ$·¬žÜøXÜnŠÕ}|bM5eŒéi­j Aªgdœ‚¤xò‹ÊÉHO$%íܤËk÷3i©.äFL=îý- jïõd'+ åes/†Òâ*¢¢bÈ.h“Nt|­ Õ$¤æWê}OL:e1tôëél¨efÕÅœYϲՅoÛʳϽ(E¸j+ˆMKc~}“ÌèûŒM­¡ëj$%³’£³‡x6–‰‹¹Cû çú*åEùdfb1é©©íäL8èuQ‘Åî¾—¶2µÌLj;Z?Þ&õ:‘ׄuËK]·=ÛØv|>?{;D¡ð£¼NÅ«À»·Ë–Ã¥úvÙÝó*à„U€PèÜ« ÀÞ®‡á~ìÛûì{}ÚsÄã@«ËâßÛÁáò°¾–Ý)ŠS)LtîÝàqár{pØíRÌí´ãÙÝcwÇ#JÖyã8Ósë,LYØÞóá÷ĤVówv¶q{vq¬.?Óü¦ü;{ûx\Nv½~1Gy÷ 9õ¬Ô«R”¹K3SØœ;ª/„ÝnÃåÙ!èßgËá}ˆz…Kõ2›Ã)ÿ4~ï.V›„IÉkxo[æ„EHAxÁpXbõÔÏê” §Â×}ÜM:‡Efh×w1C\ô¾K¿"­_„€wò—þGϺ¼—GíÚýåç¾Ãäón{;ºäöhîåu´}=þ{jû~¼OÖ|¼Mcæ/õ<&´hÏùØ›tÞC$t„"$y¯À’Šå‘òiú!ÁÈ{Ööö6.—+BúF$y¯À-»ºWt&JCxÆV‹š>Õ 0ý H4ôÚºúV¢o*Z&m,/0<4̘nœ……)B‡Ç(W!©˜*åôOe¬Ëaedt”…¹æV•è ­ªªŒ×Üiˆ´hi_š™f{×÷„˜d"&‘–¬+s|ùs_ 5¯šúšr†ûÉÏËírïà½T7wòðÍ·¨*Iå¯_¼ÍPw;Ù¹ôuÕÓ=¬g°¿‡ìÌB&''È)*cyc“ŠÂõ:køû/>ÍÜÆö>±*­ñ¤Ý¾ÃØÌ*Å©)Ä޽ϕ¾Â³Ï?§´ê×øüg~WbÒ¿AEQÿx+…)Ý ñ1©D߹—ž¿FÜÝ»Ü|õ¢âbøÂŸ"-%–OÿégT{Ï~ùy^xéef6<`=IÀ:==f¨»[4͆áaFGbp¸á±1Ú›«©jìàðøŒIà ÉéY ô 1ÐÓG~N&åÕD]}–ø”Ìæ r²R3()ȧoTOuq>IE8÷ü=Q¯ÂˆwÃE £Cá‘NNÏéTcÐ5·Ñ—¨éˮʯ?<•à‰ÃiWãå*€Ü˘H¦š'Xš†ørùÝÃws5sLø‚7»ä’" ‡BÒwI’x<ÐAè’\æ\VÔjtpy­ÿXÜu4­üåy—ÇÊ5r2~ÔÀ’‚á>r²âIÈÈÀ<¿ŠÇeÇåÙFò…ž»žüxƒSËøÜÜ»ú ñ)ö÷h­)çðìMöÝkÜŽ¹GOO'W^|–ªªJR2²Xµ9´“/B°ƒ»$ÇÝ&¯¸ªê rÒ))­$-9žû·ï“­€ÒÔ2ÆàH7UmÍ2&;/Œ¬lnÞ|•D5.9)…¼œ,Ú:©¨€‰’’bRãîRVYŽÕ*‘ÐòÊì©/¤¨¬žõåyîGcÝ à\4Óß×EOCÝÔt4SQ×Çà@?CÓ‹„}»ô´7’ž‰mcQíëν0!Ÿ‡”¸[dåçqç~½½]¤%¥²lµ„ÀŠK³¼K”ðºÕ.L»sk“íÝ}qçðKJæ ~ÿùÕ/n%!Õ¾¾±A oNÏήºnŠ‹ˆŒñÄ×ãX'>ñã“ø|´g9vl[Nœv6»ë"[MPæú}ŠüçkI›zŽx(ˆ‰GêÚú†êú%«¯J""ÎÊã·Z×µ½ËGÿ*ŒH…—™æo`Ò†Y=~<Y®ÇÊãǘuågôx„HâC(ë\fêßTßãcDx¸Ì¼?ÆÄk€*’K¾¨ý}}}Ø=^Q(ÀˆK°¨ŽY™™eÓµÅÁy"Ü3Õ~¬EDÝ·I@9cÐ39³*à|qÍÓ‘¬¥©6"ôñ–øÁ[ú;¸}?••¥J ó˜Z˜¥¼¼˜Q£…æš"’ãã2Ž28e¹iÔu6–SKUC qq1”äQ[SÍ®7ÀáÑ1޵ ‹(ÉÎÆé c|PO\L*ñÑ·ˆOM#:*–ñÙÈø„K[k‹T•×251C{C#Këkt¶7`žš¥¾ºŠ®ÞÕËÌ*ëªorrœ«Wþ²ÚF6Öˆºá D_[úŒ¢›Z4iléd~nšæ¶Næf-ÔÖ·I¨YäÄúøëQj#ÍL#)ŽŽ5JÌ6gÌ»ºž)äßÃ49gÏ'm—ó„j|Ô±¬u>ï×ÃÈøäë½’fꉘWž`}úÓŸ6½õÖ[ròD(Bï•vPz¬ææfÖ¯ÿú¯›”ƒ< ŠÐ{&…†X‚)‡ÃñÉïú®ïúžoû¶o{áÛ¿ýÛË5*jŠP„Þ5**?ÇÐ9–Î1õ Åï|òð¿C!íGýª¢ß‹P„Þ#ýîv~ôKç˜úÄ?ÿó?¢¥¥åÛ~è‡~è;¾ó;¿ó{βEè=Ò÷cçCçX:ÇÔ'!Å€}òü;g¼"¡÷JçØ9dž§ÿ”+1Ï ª-IEND®B`‚transmission-2.92/macosx/TransmissionHelp/gfx/PaxHeaders.4960/scheduler.png0000644000000000000000000000013212442116630023721 xustar0030 mtime=1418239384.393590387 30 atime=1418239384.393590387 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/gfx/scheduler.png0000644000175000017500000001323712442116630025354 0ustar00mikedldmikedld00000000000000‰PNG  IHDR•,ãm¥fIDATxìØ_ˆ]Õðo­µÏ¹733I42 IPDmM[0±„¦>Y¥XÐDñ)­Å4E…‚P -ôE%úP()›h-ÉC+}(HRücÓ´…ˆ¦šI4“d2™™{ÎÙk}=3>ÆÄvšáþ8 {Ÿ9O÷cíµ÷–í»žÐ[¹!!f§"ˆÈ¹ièîÉv^ƒ¢†ˆûèÍ?þ}ó*™(ÃÉ€ »móv!!˜!º7d´ ¸Œ ! SUiz—ݵ}óJ=œ DÕÌt2D” ‰#$3 Ò#0ßúRŽ@@HDD!ˆ(I…Qfd4‘T$ÚŽ€Ÿÿì'˜W}IB‘ )¢áYªá-€²{¡&‚pW‘;vb^õ¥R5GˆjH€ˆp‚ EA†@DÀ¢(HDE©›óª/)¡B1kfˆV@î ¢”RH ³"}ó*A%‰9=W3’IEÓЪBÀÔDejj’3\ ´È ‰¾y•¨B'3 *À(ŠBÂ!Õ,¥ÔÔ5 éÁpÆüç×—<7*jI;*ÚPh*A@„—eáŒ@x€A^ÙúùðÃGÄK/½„ÿ¾ U —–EQvŠ¢“º¥u“&3ƒ 3I…ª@Š"f3šªsvüøñóçÏǬ-[¶lݺ5fµ/ÛÅçˆ 5ÑŠöKbáR w2²g*BpSA@DE•D€aŠ” Š™w"soß¾}O>ùä{ï½wðàÁÅ‹:tèý÷ßê©§ž}öÙÏ%B +¤|k´sìãî…<Ä´ˆš‚ŒäBJ4ÑÄ$ÁCàbIÍÃ#ç,* ƒ¢ÉÞ4™¹Ð™š,ºIKsì6lØ´iSD<ÿüóË—/߸q£™µY¾ñÆëׯi?¸ÊVJ@ÄPtÏLuùúÔ»£:ÅÉ¥iòÞ/ÛίI5Eº¨A†9/ˆóƒŠ’Z4Ù“G˜ÕîeJM8œbšsXa]tr#¹®“j0’Êû_Y–»ví:pàÀwÞyéÒ¥³gÏšÙš5kn¼ñƉ‰‰¶¦”"WAT‘ʧýøÐÔ'Ý5ºz°40™›9þÒ¹ÝßVæwN6¯¿3½q…mÿb©p„ã—DÔLôpÌJbÚíG €H&* )rî!Z#<ÏñGˆÃ‡w:ªª†††{ì1yñÅ/O9²}ûv\ ³¢–EO¿6yvhƒ–t¢%)-¿áÈIýõ™uËÓïþ–ªÕø°72|ñK«Á\ã4™ˆÌŽTœ™Ìb„‰*TŠJ„ÓCUR2ÅÌ4æ`Ïž=?þø‰'sÎ>øàØØX[‚<ð@]×m/l»àÞ½{wïÞWŠbn‹~ñûéøˆ¤ÿñ¤%KßžZûÚ‰eùúuCÃwÜ6¸aEá×¼Ôí–^5UU‹Š¥”{=°N‡©"DÄl²»w;ÝHª:—ú»ùæ›—-[¶dÉ3kÓ:}út[s.^¼¨ªîÞvÄÛo¿}||ü —P‘&ë¾ßN_m×-b&>ÍÈr»÷ iÓª©¥¼¾ìM4U’×üýgYôšˆ ©„{0LÕš LL,êLB13&s‘R=]šLçÔ´ž{î9/¿ür›\›â+¯¼rß}÷©ê«¯¾ºvíÚº®oºé¦;vhw¡WÖùDüî-˾’õà›õ¥&PP@Ŭïn®7T½‰ 1Þû¤©Á`®}I 9ûÌ_wfÙU%•™ M‰`&¢÷²(ÂÝdNû—cÇŽh÷œm~m l#|æ™grÎ펴]QUuÕªU³ß\©MrÇš©S“²²32<ùè6¹aˆœ¨õWòwN½}üì­ƒUž¾DÏX@’×APA¨Yëˆ2™ @uæP:Ý4ì”EŽ€)Á¹ß_·›Ìv·rË-·´m¯Íïž{îq÷výl§m„/¼ðÂC=´zõj\©¨ë©‹Nž®ïÚX|g+8ž«YšÊŸ~sé῞¿pNšÞ4=3 Hª›&"P‘”4Â=èTFÎÙLÕ4©5MåK >CMçØ>Ú²kySSSíQáèÑ£mrUUµmÛ¶­=ηõ×vÄ«ëDô¦Ú¼¾óõ[/^¿0QU@0bvi•é‰ñ»×-Öõ:~¡ wÁ‚"ßûÑþ:×uã7Õº®šºPXbxÝô!º! *9Ÿ=sò‡?؉9¸¼H^¾-Þ¿?ÉGyäܹs+V¬h³l­ëWMTñ©ïD„`¡‘ÝOìo<QM÷@V½*Â(SrÏuU‡GÎM™,Fw0€pçØ''÷î¹s£³¥àî>øàíÍ f¥”rθ"}òý'öW¹!Ä› çž!AFxÌPD„g2êÜ\87zÿ·¾¶~íJ|F+W®pæÌ\µ¾”Ô\"3ŠnéM-bªêbuoº®*QQ2ñç·þ¾nÍ øŒFGGÑ÷9Q)‰*EX$ š)3+Š™ŒsÓÔM BD›Æ#P–£§ÆÞ~÷æOŸm¹ëÛ0“ª¨‚îž­ŠÒ©JD0"²ÃÃ=Šˆš5Uõá©3§N]Ôí,¹n}ÿs €çl¢€ `f¦"ªt3Рª&±0TE-J®ëÉNýó£Õ\o=’$Éu€Ï9f™uéêîéÞ¹\]^ô$x!½J W¿[ü  3\p—=Õ]•îfGJÌȇ|ȇ‡sË_º»zÕ^vMbÍévW¡ÛUÕmÚíêaE€ÏÛ6B_ŸŸA) « †Ý4lSt» JîvÛä)ÐÕÀí~õöÀ, Àªi{䈔} H¥t·1´ÏÚ÷ec­Y« g„$1†2nw£Hí¹×$A ÖœµV¼-° ·%‘¬•¨yÙ/eÈðªZÝ ) )›« ŒƒÀ8o§‡»ð˯ßr˨¹RBkz¢*Ó–k¹P´Cá¢ÝMƒ Å¥Zklc;½ŒµO´ ¯Z°«VæPݵmm÷Z«[‘1¢n•AAz|¼ðþîWAÙ ²»m7,Ãncäåº7@¢ºE2R’݉©ª–{­‚›àé4Þ½—ÒšýzÙ!W—›«;BÛyHF$E6Ðm´ç\ud02¶»“ß,÷¬Âjm€ØÆ`ûúº¯*˜{RA¸@H l[ã㇇xÿ/?ÿé—?þÅ`ÃÕ½ºšŠ7É€)jz|z§ïúóÏÿÿõoÿ `B½fw=çrÙ«e˦{ÍÙ] $ŽÈãB·DI0¼º×bƒt»jwµ}K$f@¬Õ]­ J·¢!ÉÕsMhwn—»Û@D ¤L¿… àîŽ#$B#‘mÀ^U”"@„¾ûðþéñÞä¾ÞtK!23#bl›ã ŠcËÌèv¯  «J¡ˆ¹æZûTèüð™Ý¥n&p>ïïO^««C 0a‰1Fºú|þðÝǹãõu‡c@)D€«;r<><ž¶ítÞ~÷Ó§£Ú^®×ª~}½¾¼¾Æþëÿ™ì†ûòz©®Ìa´ˆöëÜGæ¬ut9€^¶ÈÓi«µz.4L¸í¶¤ªî.À CjÛ„í·ÆùDÊ0)$ƒèj©¨Zû\í  |h E0"òí£‘·ÛE€"HÝ%dfŽˆYýr$w.IsNŠ M2cD¨] ÈmRµª$ºÛåÝk¢ºº«`ä!C¡ê®n@5æbÄ–äýÝÑï¶v[@)s„„m*ç^ûe¯†rÕª‘©L€kÕv:=½÷ý÷ßýðýûsÄšý—/ÏÏ_ž_¾|Euü—¿ûÇZ«»Ð%h_ÓF¦ Ï^Êh÷6BÂÈh—B"áCh;"ºª»ÞΛF¬º}·ÄÈ pè*6چ̑9£Ý Q Ϲ PDu3xÈLåhâ-4Åñ¦Ê122m0”áö¬•6Ü2c8Ä €íÎ1`E`ºzÍ.6€»‡û܆ÀUµæ¤Yîˆx¸»™& tû(ôww÷÷çû‡{D\.W€A2l)4\õpÿáóûqw~ùvqU„ ‚|ôŒ¿úý?üôñÃ÷Oïî’Z³¿=×]†"##„RËu:Ÿ)ÚM² #UÆ2"G(«ëzä·J”«†™1}À^«àÕ]pŽUmH¤0€”¶\uhBK …b»g·%*Û0¨HaƒÑô­ê3‚ív+ÂVûuç¶Ó)Ǧ” æØòtÒ6ân ³Áˆ`""\-#H‘a[¡6’v„"?>==>Þ)0ÍÚkî“ÄývÊrí»¤žÞ¿:6sµW-Þ@d†2rÎÚ×úðý‡ßÿ§ï?ÿøñþ|ЫŒ>’w<ꨌ‡»óÃÓ†âïï”´œ[ !%V¨Ö’½my½ì[Æì6]îZÎ`¯ q®Õí5k®J±v»Àîëå*Ê®ö¹ *„¶ß’iŠX€(¯®*‹ ä)ÀÈŒs^.—ýºˆ[ì†oR¡¹–û¨°S­U«E"4ç\«Ng·ITDȰÝmÐhnÚl©²GɆ«v Fˆ 2¥ˆØN[uKÊ1ŽTýð»/¯×_¿|“” “6æ>³“ížKä–©7U½¿^0+#º*R‘™ ÷‘¡o1NåŽ<—±—_^.(ß?<4ny§„®BC) Š}dôò|m4Cã¿ýý\+E‚û¾KÉÈ5÷ÛùRk†dd­y\¿ÍÈt7)¬.WUWµÄÌA Ý’x0@ô*¶]mͶEuù0ÆØ¶L‚ ç»:Q¤Hƒ@ÛªÛ†måc#¤ 1hÀ©[“gÐ4•«VDŒ‘"DÒf›@— ¼­(ÖZ0ȃ`Ø>Jçý‡Ç/_ž¿=¿Øònw7Ëë:»K#2”__^//—µ/—)Â@Ù]}ÈEmïs}ùËë—/ßÖš i úà9†»ÝeÿòËóÿû¿?¯ªÛ@)þûßÿc©©Ö"н‚Ad*hÀ†ÛºIf¨«ôªÃ¬ªî‘6z-×ò*ØF»MÀÝ4‚ ²mŠØ¶‘"t¨9«:2VÏÈ ¨ 6$ѰqR†á|K*ìx[ D ßf cˆŠP¤f$à¡ ©»3â8º$]¯ÓݶW×m†Têxw_Ÿ_jU»ÆÈŒ\kººfÍ.Ü6§{¹\¾sâ>«öëDÛn†¼ª«iS bl›€µ¯ØFn›AŠhÔj·ðôêµ÷¿ýëó/üÓ×o/±Å¶%y`[Äš×PŒ *Eð2§Ý)*`î.¥S ëXV×Zå „Ë«—`Øè‚¡Û—iJÑÄ*m@IDã²1¯ûZ5Æ€À‚›(R»×ªöo/•Ð6d£`ˆµ¥îþ­»12OÖu µë·a–e+R$”ÎÛ¸\'Û¨ÙɈÈêšß íÛ0ñpw>¿~{½Ô2ÉnO¸­î²—«`€sÎ ·í”n)Ä96Æ8î^juyÛ†¯¯¯k&Çýùã‡w#õ/üóó·—Ëܹ16¶Ëˆ¿ùÿ›°ÈȨ[™¸à.€³&n]‚”YU*ˆUE“)Tï—k@‡©»ÝåZ"AtuŽqÛ¨±m$œO›(W¯5ÝÑ.ò–<´ÁA c ’}h‹$˜‘Æ-78d亮µª×Û™¤°½ì‡íöRã@ÛHàvÃî‘Yîc³j5lw‡È`D´ö­lö¬š³Èê&ìZÝ%2DÃí6 ‚ÀØÈ‘ùxwÊCxww÷ùwŸ(åR 7@QQµ˜z|ÿôá»§Ÿ~ÿùé㻣¶¿|ýjêM®j*ÄßýÃÿnØFh\Õh£}èê®%²Wa7ªW· ‡„6 À)ÜÖÚ8RÆbÄ í¡)àZ%6ˆŒà‰6HnÛ6rHZU:Dt;#À¬²áöÜW*Pn;3\ª>Ÿ·Œ0Ü6…Ììê}ß 4`cß—ûÜçå·?ÝŠêv7’½ÚÝ Ü_÷^åFٮ굺KâÛ¥#cli G )"7)R0Oâ§§ûŸþãÇØ™©u]×ËškF&E¼ÕÜ㻇§§‡OŸO÷±¬o×}Í*w•†H0þæþ€²(û>I±:¥`¬µxÛtÓv"¯9^×n‚vDÔ*ØÊAÁq«»Ho$ËQÊ‘“"ànRn „䯡`Ûy’ŠŒóÝÀoÇ!mŒH·«»jÙˆFWCÛyœO§µ*2#E»«º›¡”j• ’#C„ÄZ}¬Ù6½¯”(@DWÛîƒ ¶$€k®!B4Ð]½Šâ-r1BbH‡ˆq[“ÌtÍ5 ßeüøï¾ÿøï§sÞÝÔ8æ—Ë>ؾ=÷îþ|º±sýúëëË××½pó 3RXtUÍvõYÑUµfÁ-Ðw§SõÚ9cE÷„œP¬U ó4F h\_/s-Iˆp¹mƒûª-²íª:m'†x…µR¦ÄqÞ‹„AÀ`Õ:Ťn °KÜWW“Ü5©´ÝR¤Æipl§Q½¯IHb¢íj¬UU®êÚçîÌÔˆ°]µæ €@*öYsͪ"buÏëîÙ«*3Ǹ.åîµFÆíh‘ lŒ ã\õüü\á^ëþéñ&˜q÷°Ý·kõ‚Ñ ÕÝ×ëõñúüÒÆ1Éîki(Eó†DáÕ{vaZl{íÓ6èˆÓI¬Z”H5fdîóª}@»Ç¶ˆZí#¯óªY«MÒD(@u­ZrÈ1ªº‰ÕjR‘šsqÜðÞÚ&ÕÄl5rŒÓPðÂë¯ÿö!’ÙAÒM(”bSâ[…[¦«)¸eÎê¶\ z.cÍpF®òêZ·©o-µ £ àóÃýiÛ.¯ÚsÎ*`‰jXêÔèîñ¸¥‚ä}èÝãÝ_ý‡/¯óŸÿÏ?»=¶!²šsŸ*bÈí^PFŽèêrÛQ—ùZ½V­µ®µ äÛo3Qû×ÿ«j)´Vuy¿Îr“ØBÝUíéê†Ëv[Bu“€íU]+Á‰®y!©Ëû,F™+#s€ ³y ~ øì&  V‰2qe§±¹úrÝy `®9÷9GŽ.ÃVpHcD·sl4Ý#Û½æTDH\{õì¶MÔª¸E¡ †»P¥n„)­ö\Kä™[ìs'™ß}þôùóç—o¯û\¹m¦Eå)Ç)ŸîïÌï>})é~ävÚ>|úðùÇOsÖŸÿô…ôé4’µ6¨~ýó×?ýüå¹VUÒPÙA1 ¸®ºÎ=FC)‚™)RÆÿø‡í®¾rIEND®B`‚transmission-2.92/macosx/TransmissionHelp/gfx/PaxHeaders.4960/open.png0000644000000000000000000000013212442116630022704 xustar0030 mtime=1418239384.394590404 30 atime=1418239384.394590404 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/gfx/open.png0000644000175000017500000003623412442116630024341 0ustar00mikedldmikedld00000000000000‰PNG  IHDR–r>¶¿!ú· ?ž§¤ÌdÂB±P­ÖÀk]ÏÅ“úé¸Ѹž|Ài6?G±ˆc¨i™ÇXàòP±ÑhJI_¤=hØ µm<ÈHð$L<¡$æëB¼„1XmP spr+B[QÜš €•Rè¬6æ%í‰)™ú£Ø"X0}²KÃ.Ú@3sÔ")î 34fÁj+ƧÍIv_ˆ‚è0›Ãë4jtjÈ2AÎz‰Ø«ÅÛÜÓº(¬"1II ƒVg À¬]c_«ßùèÓ•Í–@ôR"Ž`}ä@éGÏ?aõš•JˆÖ—‡¸„Ûõݸ×Η&ý0Ô{:Þ«ï„A¦T2f÷6Q€DUA¶V Y*û´@Ýn1fs¹Àó0£•kW’£(Ž%ÅB†aÀçê¢íé6ZJ¬„Ç'2Q­$™ÙT9V^!ŸýÏÿ®”^™ñ ;6yè[oƒ®];ÿâÑ·¿¸øÂ¯œ;wýw¿óÒ¹+s?¹ö«ãgêùë§_{y~ñÕWßxñ—߸qýƵ‡À“Bi€tÝß¾õÖüôéW^9yñ⥥¥¥K—.^½zõÒ… —¯¼yyié׿¹ É… —ÏŸ;¿´¸tå;üÊåËçÏ_\Z\ ã /ÁIºG?·¤|ãÆõó‹“Ï&Ÿ+N>ç9ÜòJI©â(*¶[þ3Š}ßj`M˸y ì•3ùL/ŽclAFùR8P{²-N  “B©€t]×󇇇GFF껕z³µrÿÞòÚÚÚÆÆÆúÆÊêr¥²½¾Ša_Ò¨××××¶*»kk+»ÕZug{ck ü½åÕµ•åv·§R=Bø¹%õh`ùæè\ 9ýP(Š'Ÿ|º*eT†GdÔ ò#¸Û‹”(ñ]ÈÑܤÓîæD!ŸB(ˆ¾ r±ö‡À™,:£e'içI/²9ö™ò5™ªáƒÖŒe3ÜçÝ0I_ÀGQ”^¦LÅd„À0Ø!&¹:Qß÷x]à­’v1Ö ÔÊ…BB4’år9:h6›¼KáH "Û—^§ÓÁl&““Ïç€" CˆC.‘0‹Ùl6K$íƒz½ÛFï­V ˜”åŒ'TL$±&XSšL¡9 _àáŽi4˜eüÉ&=l˜>ƒƒƒ´É{sç”) ꀺšìµÂ² ~ QäN Böûú.‘è,h³ŠMôúŸh¥£„^DX@ úõzýwÞùðÑ-†"}¢°›×T«ÕnݺU­Véî#>¨…8îß¿¿³³s÷î]rn><ÁCËM8‹ ybH';’v»ýþûï¿÷Þ{ËËË #ÔÄ\Ö××ç;w0†,"cx|²_]4Ž>þøã>ø‰3„„Úɔѡ{÷îݾ}r0„³vY@ùl¥—[iærÄ žBèW—bx@ÊmŽ~`9p;B‚a±S"5ƒÖ¢+x"V4µ£œv x¨ ôfwww]$ÃÝ ãh0†È<ÀxBÎ|Ò ¹ï?ùä“ñññ'žxÑ $´meeWd‰Ê¢Ùòm&ÿOd~Á/–þ»ï¾‹'ŽN[[[7oÞÄëYw,Ëææ&"™œœD#1d FKºV÷öJœ˜&ˆeQü2C·Nyx²‹T6æEì"%ûZˆ!–—9žÀ³Í`L>|}ñý† cœ¦ˆƒ|  IŒ!Jl`ZÀ®2¿u(´ »ÆùŽ!þ³nÁ”` 1r<¹Yl0LÇ. "Kgm ‡ z;Þm9¡ÓëöHÄôaünQ)—»?ÊÄÁlQzXÇ&c4 “6}€ÂÛm.•JˆÛ´ÙŽS€Á‚’½'€€*c­ 4›v쟼– Ød{šP2ìfz1‰8p@>::ÊñLö#ɧÜÏø¦1`»,GŽ)—ËÂÝ¡C‡à+YD…wÆÄÄjÂ¥¡±Ì €º‘˜È‹@¢…1:r…&ò+ûþÕ 30 ËCCÅ—~”çsT3HsÄ@ÐQ`(IgA  E¤ÜèÒ,1\ž\Sà £œvø&y´Í2 ^öZq"1Åx°V84OÛ‘AÚrX’7ÁPbÎqÆ]¨ e±];$–…+ÌÔ–ß‘Ú!áwë^µñç¿þS¹¾çùý )” /ÿA¦RɪìƒV’ˆ!ÿ0ŒÝ{ã.ÝTÊu-Å a)$ ¦ÝJÓ)YJ’¥Sš§,€Uk¿üí_Žà@ê …AvxdüðÙ3gΞ=ûšþ§Ió$2fÊ,"Þ&JÍl €m-‰IÎûÓýß”Á[ÃdRéa@’ð›–K¢DZžÌˆd'e«'¼¼þúë'^=•ýv~ì{ùñï.O6Jõô¯Äþûš¾t_³Á/^µ<…"OËúÒPŽüM†ÝJÞ÷ƒLFOéH Ï'È÷}£N-€,2saFƒb ) ¿ Ä_üv¾ç%3¢Ä®˜=e“dlÅdMtB´­OžïñN10X@#•¦ÕÕUDq“"Ækowgcs+ŠÎCÀ6ª{^o¯²U«7*[›ÍvWÆÑÚêZ»Ók6ªë›Ûë«ëk›ÛÇQ·Ölá/ ;{U sB¶[ÍííJ\ÝÛÙÙ­îTVW×…T6ñð%'!®›<ÂtZz£ ¦Ù¨íUëzµ…£dÜ]Y]ß©láO'++«@Öjõf«ÅÜP\aq©÷º•íí:JÙiooo·;ÝV³¹µ½S«U——×:¸ÚÖ¡ØÜWþÍÄKî%•9àDÄ(Ñé°¿)û‡$þ™ -ê_l ÑÆI7Fc£È‘*K°ÓjòëVéØEPêBJìv!$ÿV.ô•wDF§&8ò6“>Lò 4ØcL'ñÐÈ«ŽçúJçˆM#•ôü~‚8ÈXàFîë;Zè~£VE%ŒA­ŽJIl&T¥Dy@ypÃ$¤Ûî¾_¯Õ£è¢õßA@Nv`4Ì ŽžŸŸ_XX8sæÌÔÔÔ±cÇNœ8~zjzzffvvÌüÜ<$3ÌÎáì³°0fáÌÜÜ\vzzn´ÌüÜ\33c@MOOÍôÕ§fgfá455©…¹¹ù9(‚€Äø+FÈ 9’A ê033=‹ôuÍ05§«1;3 :}ê4êe‚ ÕOž<©YÔŠ}B¡P ¡;­éÔ©STÄP˜Eñ_~åd~ì;8Ëä'žu2ùñ0722vøôéÓSš ëx’7̉ ‘Ñ"OÌH’ȯ"%s´‹fÃ’e4u6|²n)ŠÇŽÿ"?ú]ÝÂüCSä‰ôKN_“ç¹;»5Çù”C7¥’¥báèO_(–Jü^OÃègŸ) •Á™é$i¾[—j6 |Ixû \Á’F/Û0Ê9ËT î …A@hÞIåR¹P,/ Ã`ögÀaÊT–>õ8ÆÓýš 8Ž{óö]Çõ=×w²ƒã~näй³ãa €6ò™’2èÙ€Á€@ö$ŠŽ])•g+H~ofyï€ÿ¹\¶úùåcHÎrJtL1!`¡ F3.}ˆ4"–c­õØæ®ïO»3®žgÌàNË„Z×;Ek9!AüùfÍ'}*)íáZ%—ýÌTOòt½ôfÜ·Eé íÆñ ¥þÖ²,wïý4ÝkÆÛ¬»– ùpN°Æ –‚¯B­uÝìÛ_{oeYUÞ‹Ÿ=œ;ߺ÷ÖÜóÜÌÐc”¿ 2H“˜hPhè¡™³ IÌRyË÷—·^–IŒ>ó¢ñéÓÄh@¤ž‡®îš‡ª[wžÏÙ{¿ß>ûöárW•Õ.°A¾Uuêœ=ì}jgûû~ß·{ÏŽöž5ð§=‰’îĶcCƒCû÷Ü¿ÿ³¿x~÷ž½O>þ³½»w?þ؇ì­W‹3ùZWGxï®çv½ð܃{öèO³…ªhT3³¹ñÉ4µÜl¡P­Ö²™L©ÚÈLÍ(ÑÈ—J¹ô4V®Pô 8—˜MÔøðˆëªÉ‘£÷¾°{ïaÊøÝ;_8x,–r¹Ã‡?~ôÈ¡=ç²Ùéôl>3søÐááÁ¡îÞ%™ÉÑt¾–ЇŸzòéxW_93º^s³1¿´‰mUóJ& !Aª«÷ÂóÏ‘ò$·ÑÝ×k3KR›ÛœqfxoO6‹TÖ'fs;—ö÷9õEªå‚ !é6\!‹¥j€sl‰„"DI ¥R ìá ž(fÛÖ-H€pŒÛÛ¶ï¸ïµ6nŽõží»PRÒÝ·>›Ëö÷uäÃïMç¦ 5ð5j³ÎŽˆÙHÚŒ&b³™eœkU•ÄE0O„$Øæ£!1‚Í)ׄ1 Ý¿†“3ŠdF¯†’uŠÂ½¥|²v·DwIF)52d·¼pêA% gB“$›xæv8ÙâÉjBö^K+R ÙÍ?|ãÇhfB8…ЇxÓa±ZË•ë`§´êŠ‘taØû˜ÌÍ䊌’|.ë¸27›žž?2<24xlf&]k¸ÐiJøq~&“sêÕá¡á™t:“ž’Ì/ ‰›œœ†X(† "¿(\œZujrˆ”‰âÀôl„A@8>>‘žžNgrFõÚ"â_¹gzd„ßÂÈl ºÍƒšjr„l8Â|úµjÙÐ1ì@´#ž™Ì@Ä–ììD¤N©\t…ìØåJR[Іë¸ÓtWcÞÜ«ùA<ñy0’ÐK»ÂýŒSJ9õLpŒ©•î…xlÚè0Ý;I¥\r¯Ê˜­¸M”(U@ ¡ |¨! ãí!¯b„ yËww&Õi2žä{ açS^â¶iyŒö !úû:¯¿þš‘Ù2ã> A:‘²¿#Ð×™¨ÔBŽ›®QŠ?f|­'›Vf|3WƨA˜»2O¢È Ò\¼”^”ã¢Òf!Èbl®ZmÌÔqH§¥ÀcS7T'6±aÆÀ÷þ?Y-—]Eâ±(êkeú÷æ:o”~ÂQsc“õ“­{ˉ21f`DµpÎÑ>€H)±ALÏæþñ›?–ÓóŽÿu 1B%L€TͶ 9£“…Æs.c ×?ÿ?äÌŸ¬Ñò(UµÀUÍÖOh]Э’e _½s^œ‡Á+cÖÀ=f& lÀ¿†GµZÕ"¶oVɑޯ Òp)k·®‡;R².¤p‹´Ö(Õzß–ëÄ¢üÇî_ŽÂ­Sªwf„óÇÔV¬PÛ#xf4…@…l \À›aKfAÙúúÝ–RêÖ¥SkíêÚÆiGC[‘ ç×éz¡hE°ð„RŒŸX”}ÀZ>¨©ãjÆè©¥¸a˜T2 \zÖ*¤n/  ;ò­k˜Ñ"hž±R?©—š¯ûé[ý‰Ä()‰7¾ÄÆÏþ} ù•!Kk2J¨òãL™ÃÅjƘ@?/‘/ZVøÖ<­¶à‹Fñ€âõœÐÎÁ3¡hÏ€lýOJ‰¬öÑÆ`Ÿ·HjÍ÷ù„mâVË ÄCAr¼¤p¡‚ÛäGÇgÜ6›<Ö ;"h&6Æ jñ°°L*K V•KÅ@0¬×Z½Ü@Úðÿ67[x@ðhÚZ/k)ƒu æ‘2nšEQ%ª 7 ¡4×u…—D½zÑ$%tÔ¸š}­t]hÄ!8†Â=ŽxŽ4@gT…Ö¢’T'e¬ŒPÛ‡(‚yÇ ŽD¼Tn©Nð ù|ÙIg©Í­>&pËuõbÇ|³h-@u‡ŠÆÀôl¾œ±–i8rÙÊå¢Vu‰]-CáP±\C“NM§¡ÿ_µ~m¹X D"øÐ”T)†4™|-ªŸ£BYK–ôW5\8ƒ6‚<¾dIg¬Z©–ª5ÂìH”Ècƒc‘ݬ§+Q)•R=}A¦Ò3™ºS‹'»±h­\œÍ-Bs™l4©ÊÙ´d¡r!—ìê PÒjé’Þ_!Ly4—y`ÓU),4 mö?Æè׌£ƒÅ:âøêµ•‡ÍÒ†ö,D)”E"ÑP0”L$•tøÇ::;SБp#Îx*™`„ ë‰`°‰„ %ܶ»zº\¿  ;ŠÇ#àšÐ8Ô¥) Awdë-¦¶Î¢”á'\Õê ügÁH2Ò Í´=§po¢ßÑvwuAtËt¼?^æ¾’0ÎI8uë5$zÅ㽨Ä&R]°DI$h”p4¨é7§#9 W*©ˆ"ÁØ!Äòe}úýßûå*_âQ;®7íèfmVÍ1 !Á\—ÞÞÎlNˆx+Ê%í~d.sÎ9‹j5?SôFQ_¯æ³9õJ1pS×i)`ËþÓ??"#Œ5YØÛúÃݰHZ{Ã'Oñ:->  üÖ÷ž¬Õ¥E ÷½óèUÙc)#fgã÷'s5=ÃÜ·~ø–e$Ú-}È¿šLRF¥Í!ýø¶É¬š|!ƒ!SÈ‹BuÌäPo{¯2µø¸ý× )%¤ç°ÅB[Û!©ÎΠgË9&ÝÌû÷pìdÕû÷opp$Ÿ›=pðpzf ‰!FºÊNíÀž]GA•{*âÃ'gs­»š»_*'F ޤg&ŽB¥£#ƒŠPFÉäÄ$–Äc£cöï?:p6¡ùlöàþ½ƒ#c`çkp›iÄÜJ‘Jµ†9œüòôÒ™ž<à4á:h³r¡ˆ˹Y,ÐÜ}}],Y±¤+[v–õÄì~^‰F§'¦Î¿ä-Êuò™>ãÀ¨0 OLNä ¥§„(•™M[Ìæ”`X­ÔÛw„âD ©4.¸Þ(üûC6Ë Éı©éÙ®Tf³$A#LŒ 2ÓŠ>çÃqÇ©¸î%6»ùtZH ÚÓ³¹T"><:Ý•«ÈÐ^­Õr?ý †ŠÁÑIÎÈ+,\ÂÆiÙò+V¬4ƒüËõ™c+¤pzzRúÀ{¥T0VÄÿ p¬'qcH¾Ôû†PnqkŒü)cR¸”jmƒ±w\ Ëßb±ðøcA‘gr[Þp'„ôâ)) ¥Æ(å o–5KP¾4U@PˆÄÞ,«¼T:™ô2ú+X¿ÌRÖ¨QÀ(I~EKKýým<㬋/yÃ"44¸vݺ—cAƒæãÄ¡Iɵy7¢<Õ¢µw\g¸Ð–vàgXA «ª¸ 9’Ú Z]UŠ$z ^YK”S×Uã*E§gZ$KT«nÌ“JÊ×Ö†ÒóZPiÅòœ¼Ö^_üÇ–Hй_$%ÄõL™Lz_kï ©[VªX"Vĭަõ·v—ÀMW_¯Ù£!o"щ+¥´\œ1c'¥è_±úŒ .A"S3ໞzòÉã‚ÄÇ_7ÄŸóþòé[ÙŸˆ¥uûýÉgi»÷¿`!\ß,ig™f?M©ÖÚÃ2ÊÓÚ›É !µ'¹V§»Ü¿'èG®t•ðZ¤Yî„( Ê„ôÌ eôkàt c?üæw]ÿÎ÷Üè:i¾¡#ÅýÏ>Á¹íóÀoqlTÌ„ipx•ù6æÌ#£ìô}´-½ɔۀ¼Ždó9p"„bü6!ŒÛPkà¥fAÔêßµu•ë ,ÙÅ“Fà‡5<ÂÈÒ~¼&)]‡xãZKÇjWÙƒ¼{³‰ÓP`¹qlçzû´|_ /³@‚¾ç®‘&DšŠ* ‡q˯À”é W‚¨Rœàðæ5ºPQÆ®¸òšK®xg±TòZ¹)»æÃ·\ù¾?QÇq:Bê)£ûΗŸýÉ÷íHô/þò¯’!þè÷¾õ¥o}Ï äÐüþ¾qÍYçíØz{9“þò¿ðÔÞÃ-‚Y’Üºí®½}ïýïÇÞ§ícG¼ã¸’°>ð'×\ù¦C;ŸøÊ÷½uó'H-÷ð>7”¥ù黿ùw=ùü!N)¦î½gÇ7þŒè:ãÒ Ë‚ýk/»øœÉÁƒ_xøK~ç¶Îh»ÏÏ|öÿ¿æƒ¹ââsÒcÇþúÁ¿×È?êÛ½ÎéRn¾4F¥Z…"¡®U½ (îµ2ŽR„d²Y`ÇîsÑTÔ¥[oóìK¤ä¬CiŠ_2™~ƒn·áÌóþôSÛá¡ÊïI͗쌙WŸý #ñkn¾sâØìí/¼ðüoüÏ/ìÌ~úoꎲ¯ë»]ü»÷ ¬é•xçUWlúïŸÿ'–ظ~åƒ÷~iÙ9oºùM—ì«l\Þ¹zùª2ó~ôÄM¿Ã¥ozãÁ'ÿ¯6z Ø/‘Q)þ±[nçP©–f¿óíof2;6ÿ±Õsöùkú¾üÕŸLeêúñ;®xÃ¥?üZX+O¢am ê¼æšßÍð¾eݳæc7o¾óÓýñoúåÞ{ßGnÙöןý|_*üñ›o½õÏýáMïºïsÿ=I+ MÇhéýsߛώȊù¶ÝÜÖŽÏŠ˜Š(í’Ó}QÉÎͲ|¤m\¥æ”ꕾÖe+W¡à9½i·RBƒ¡”ΈÒjao¡¤ïŽÚ,—¤wŽ&³)Äá®ë [Ù¿àü Vžyé™=ü™ÑòÍúgÔfŽŒž¿*QŒ,ÝûØÀÐäÙ—¬ç<°jùÒgößzËýc‡fÊW^qñ‘#·žwÑ̾/ì; …µâT¸/JM qvt<ó÷=°ùO£7]{õÿÛCç½óýãÃoÿÝÖ­=ïò+/¶vÓ¹çw¬¾øò7žÿì#?úö7¾þùÏÜ{x×S?úÅàÙË¢{wï:44qVo ‚‰Ø”x÷»ß‘ÞûÌÞÝ0ý[ß“BÓ÷ªÇðXs“|!ð\d°zf–ÁtØÝÓ‹Æ„8(!E2ޑ͆H/õ›¥_‚<·0‡sV-;PäbžhUñÿ)%ªÍ„ø½Ð8Õ’œë]Fµ…Á›qB ý^èùáGÞZ£^匧'Ç>÷ÐgCKÏÿ‹-Ÿ¸°Ãyü‡?ºôw®¹þ=ïxæ‘+ÔC{~¾ó½ïÿèŠ>{6“_¶öŒ]{÷ L Gw}ã‡{/Útöèð±ñ\õo½ŒÃkÏÝvÛ™»840°~ý:ˆLW,]ý–7¿‘ù“ŸrëÅ÷ÿågzR‰{6ßúþ|ôa„¯YþÙO+|â‹ý“Z‘*ŒAš/ë€- ‡R•wåMî-P2‘nvÿv0Oõ>‚I îºÞ¡#Õ ò¶Ý×:èþµjT&¥þX‹’Èìï^ü”¾]Îê?uËæ|®êL?~çÖñxìßäû?{4DPÛ³Z%td„XâïÿþkA›×qò_ùúwž;4ügMuØGøýïUŠùREÛâàkWHxclpxç/ž&ÊIÏR] !ÔWÆÁŸ˜>¶ÿ9·’;|ä>²{îØ\¯–ð‚P‘[šŠ7ÿÁ ¸5«T>qóÇÏ>sÃð±Ãc“³{|È£\Ž ²Ïí;pöYgŒ  M¢ë´µ 蔵öà%=Î1Š?ÜŒ§ú²ißÒeN¾*ôC³+œ ¡zŸ Ìÿb£"z¡ã‚ƒÂ„˜ÁEâ*ýqµY³ZÃN06>z¤á¸¨häØƘïó«–õút¦!o<ñà§ïäßættäȰHvèÀ~#9²š«VUæJIY•L…H¦ú’#¤Ù¿ûÜ`õ„X€Áqoª3‹§Í”ò™'/cs6=9ad¹˜ùÚxòñÇ)c†/™ù Œt†.´ R”ñXCh¬ÍWYSÝ7Í\ˆ}ÍóQzü SysëiJóšÀ·^"]‡Ùá·]þöbzdמƒÝKW\ö†ßÀlFv>¿ÓuÑ^šñ@o ááóãâñá‘‘±dW÷úÕ+öíÙ -IoWÇøè( D/{ó›íFéÈèôÒÞÔ}{akØÊ#hõCl”i¨%°%„µ"ÌZKh %ÍÓ8˜Â“Í(nN87i¹Ò9ü£4Õšˆ²î†¼TÊiú¦ ãΔ‚zAJÁ9°,‘~è`—ö›W]}õ[Î"µ4áèPÝ]é|5´žúù³È,-öŽ«oüÅ¿61™Eãï½ö=ƒû÷ÿöM´®ÇÝq÷ß¼ç¼huÇ~úÄå¿síï\qñ?~îÁ{êy3£¿2dìмf»(2Rï\ª<ÎqƸ#Äð‘,“´ÚÀ)†FÏQCóƒ z"©7ÀB×Äψt&¹ô7¶M|:·dÝóQT«–_ÚýÜÎRÕ‘¢:48ÜÛ×TÕŸýùf[äÆ Q+½óÙŽ¤jaïþC„è% B ­:ã‚ÿï·.ˎ쎇ƒ+V®zü'ß*ª(D lÑ9ù‡áïünœçtµ§q= F.’ÖÙEý?'Íΰ@&é4<à„¡ pK(B•;2™†Îð2|×àZÑ­ä§rê”!òKÀI=º–æ–ßó¼_ê±Þ°QRYÆdX­Æ»W^yåÛŸÿÙÀçÁ#Îôh¼c™r«éb>¶ŽN7m\zÍ»¯}ü‘ §éÊþî:_}éC™ôø²k޽ðüƒõ™‹Ï[#•|ü±ÿ¼î=7·±ÿØØèh´R-׎7žSKº.„)¡°h,¥®VœQl„`x…ª±eŒxþQ%>W[:‚¨ÖÆÅú«6Ö[{!O@¦¬†º’ñªeO æŠe«žwƒ‰ËÞpavj§&†ï 'úÜzyÕ†s"Ô9|`?'¨_ô­‡‚_<òƒÁƒ»ÂœÀ½ô?•¢CµÅ«Óe)…K©R̹!õ£y'ÊÆY£¡‘oÀ45d9¢¤SªÕ±J¥f&ã_÷š»lŽ[¿C_4ÞÞ/uP ’Šõ-]"•š©Á¾öïËV¬‚?Ì¡zÎAEg°¤RÑ¥Ëû*å*ÌÛ½S£èsÿþÏÏ=&=¯²ÄÛúêPÜúVTBJJxŸcÞH Ég Q|òÈF=e2ðžU zË:´JÆz•P0ÿžŒ«»ŠD#…Ìl™ÒªqÚO¨åï^*T &i :”»yRY­%&äM ¼¡?D Qá4ƒ}0€Œ)ׯ %ÜZD’k…½]‰ð=hDàY jQ¯ò=¯+Õ&SPº5ÁJ›ÆÖÚ åx>øîw¿k”…ÂuÐÊs‘@/™]$9ŽKfÜn³Ã~©ºÝîU·5•øn†[6T:tn-Ɇ¿óŸ bJÃÕ@üÂ$¤„‡g8DCúEÃ‘Îæ¾üí'µÊ—Ù\3žéÆ-ÌkÚ¦†CS6lF;;¢à•gVCÍ€j3]ªý6õ”G  Va¾C!\‰ïÀC×$8~šPD#“1…Pƒä'>ZÛMùüóWóÞè`ÚŽQЇVG¹þ)x~!^?I›wÿ~Ž ¤ž³áü«s‚,„C#4ny_¨›Ñì ½á®P©ª ˆ9 Lå+ÊwØ'U_2<::–Ju"ZÆFTäËõÎ,NgK…Rÿò•õRÁ±°>„%N¤îXëÖ®yô±Ç YïQ.†bÔ‰Iˆ†zÑÓ±lÉPΙ¿ÇŠÐH0ÌÆÕ‡ëŽÀ¹ØË›^Ã(3NøýÎŒr¼(¯/úBQJµs‡WœÀ6¬6nܸø)¡F$Ã}µ’ÒØÚ{œkjí=1št„@£‡0´Ji6‰RìÐ2ÀG#1¬ÞmQÄ"‘Œ£9”H„â±õ°a868›Y#Hée”¹R6Žã‰ÙˆépÒ;=Õ_äƒbj”¦³zƒ­WŒkM2‹{ Zif@Š$®p›ýÕ…"bÀWy%ažÆ¢ó¢‹.‚Ÿ|ƒ,i™ŒN¶ÇVSN­®èëI\wíoÏ–9÷Y¨ ÷®K:½©D¹æXsœe¥™B 5áþ²”ø¯ö|s¢œÒ™9Èœg¦Ó_G$ibg¦Æ'¤ñp"\ræê¹F=Ȇùöu6bAóy&ñ?Ÿv äKƒÚ̯ýŒ~® Ž{„ø»e•j§ßÊŸeý}CsÜûyÍÕdÄÕ‹U§bñ`V’pýÏ?SOkíS)³3ËÕL®¤_Ï´d4µ>œX³bí¦_îô¾{îÞ|Ë'àÀÞèàXïüjÇz;¶mÛŽ;/ðÞ-žs<8ÐÃ#á\ôSŸºÉðˆ+’#œÛmß¶ §8ïb¸ÿ~ÄÞ~Û'á@oË·ïؾí¶Ûn»kûVø2EŠÂ?¸Ev¢«~ÞGï½mó­H¹më6„Üï=8·ÞùàßïvøÐƒ½[qrô½÷ÜuçwÜöÉÍðÚw·çåï~ýÚð°·µãUñtÏ];6ߺ¡Ÿúä­Ûw ~ÄÜqë­·àáHó_û9Ej6»ç"°õÑ„|ü–O&V]–XóöäÚwpéû{˜ŸŒæ^'™,ái]W1ªçR×Ì;I g õ†C-ŽÅTeó¥lŽz2H‰alí!+³D­\¶§Ö6³&§Òƒ¯Ù°®Z®Ø°Ä(Ó“åhgO„«t6/\WCù˜´*]¶|i¥Pòìô˰µ',ºti7#Ç@˜:§Ö;–[šL—lÞslp<æ [û$p”Éî¾°mͦ3u·Ot&ã1¼ Ìö)gù,T´œ4T)äÝAN«ŽX±¬ÿUí­VN‹gk¯Á8H›2RÆÙš&-cæ‘X§+\ÎÀ9˜"ŠéÔup†&”†=Çñ8šcþdO -Š òk¥°8£’RÕp9à} ã6'^&“)›´#fl l`¡úêe¸TˆpJ@xŒB!^Ö'(€LWD¬p\°?Y|ë2à͵É„:;¶ZÒß‹/¤ð àÅb€ÒS€‰ÀËøGE®HÝe”êCÚÝ=F(€·a‘XD•«ò$}ð !p$Ú…^ˆ¿Ýáè§Mš­á¢î<AûD:a®áötuüÑ®1,|VVËô2שĖ7kQ‹Ÿ ídVÂÃÕx_ó£tÉ-2Iú°=ßO¾ÕÙtHk^P«È^z…›zÛœdŒ‘p³¤–IؼŸ‰(¼ÆÉuA|Ðk×®½òÊ+qcüÉ\#ÃÃ8ŽÒ(„-†Œ4ÿOÿú´Å‚„0Žw7\q„\àò„wa W|ä'öÝÎ_Œ§ú2âÔÒœü†=ÛCÆJEY93;•É¿õU'ÕÕsÃû/bì‰'žB³œbW¤JÏYM5¥ÜGm+uÒî[O>µê!}¹¾ÿ™›„RªVÅ€ÙŸzY½o¾µ³šM6\u:ÞòJiµfµN'¿¦a€Ÿ™}ô‘cûiòá•í`çŠÕnFO{ÖYg¡¹R§X…ù§›~Õõ<žH> pG…vTË3]Àg¹\X˜z#@zþ}1Ç>|ØîáCiI·¾oÏžét®›1gSáh£Ñ‘qüK®#°×ÉÍLÁ<þÑ¡,—J®ðÅ„¯¥AãšËež=p`×èøäàáSé 8 ÿdÈ‹dÄ¢îÓÉ”I+I²¥ò̆³ŸÚ³çHßòAÊ{ºº6]°é¼sÏ5n¹çc¡Ô2¶ùl3[j"RÔ‡Ž ".Ef! GCXÅÊu!ÁÚ%Ëû=d( XOO¯rk„rð” yÏN gg³ÑDŸÍÐÚ2Åìèê#{Á©¡ŽŽ#‰®çlÆuH´·;á¹( 0"²¹ÙÉÑÑp0áÊìïNÂL§X€ª9EJ$‘Ú¸~ Òž&ÖhzÕ¾n}ÿR:9Ñ?ŽÕÀißW]u,f(]<7ÙÓã lŽ`þIÔhYõRb­TD_‰a݈Znc6“‰w¦úû{:RJHxQ†~ ô»<üàWµj~•뮂‡ü 4ËëÖ¤Åá… |‚û´hön‰ ME |·C\õàÎXÅ‘ð‚ÿc¥Â‹ªdgrw§P}0Àlmê€#£9xuCJY€s·V=sãF8›®zçøÃ×ïI¡]ÃEHÉ},¾1ûà…y+φãO/nÇ3±3/¸Ð2è˨­çL¼•¼pnSJ„p/Ø„™›{Á&Ê(¡4ÕÕéùP£ýÞ$¬O~5fKŠeK–šµ«Ys ¤qŒÕÉΔîÑhRI§Ñ ' à³m©uIH¯º)5N¾\·«â4²ë…ÉÕªÕ{vþþ>! õP€SBIW¨a‚ ᛕ_—r¦©¹þVÞ®ÑÌèêíâ•+( @Jz—F¹¶x£°AéÁ½}úˆ _Jr§ê40 ! $ª±C`ª“ ‰‰±7`ž'EÅy*6Ÿ†ù¦Á?<â“Â;"ßPœãÉO£.Ø\·Q sk֬Ų ¿‰6’]²'mã+\”Ä;OÞµÐh¤¹"Um§ý‚ÐôˆC͆w$’–v__BŠJh8žˆØÖT:¿rå2Àd*¥rß²• 8>·(#8êXvg<ΔàIpthHxÆ}KW0Ïé8 Ü_;ñ*„-X=ê]v0nggrì•o°új â‰JÐVçž{îàÐ ¾ÊóλrNsæüâUbä’·a(Õuã|L[¢ñ°ñ …0”G"1›ë%—+]Ä¢ á 8%Ä\&ÐÚGqü’YŠ*‹ÚZèÂàXÐÁWãgA5>¿Š‘4Ôf(èν½=Çcj&Œß·ú«” @—âX$=lR¶aý°ðØÑcf$ƒú—Qj ˜‹ÒÚãIyµµ‚›o&“X7B ÕÕ‰š4BŒ{¸ …šÊF\Ca"…ÂT‡¢ëõ*DpŽëà„2_)ßÙ@ÆhGÒß1IJ’©1¶ÎŽ FJ¥’)” áRȈe’.à¬}¨§Å/ÜÑÆèÚ¨ mžÛÐÖyh0Û „»O>ÿË §Þ™+FMˆu,>q)%8"„€ÖÞQáÊqBS”çjÉQMÔŒ M¢Ø®áXZƒMz™Èx îêêR¯ænȈ…óSœFmíË=¤“âq÷îÝØYR.¸,u¤‹}Rú ¶W}ýýÚŒÐüŸ™®²@T—¬¥„ûbFÜâóq×@@¥…—FšwzYY(<:ýYHô8$æ‰"Q¤§Æçcú™‡®Pà ckE±!q]Ç .8ƒ­} Û9E]3ýµ¤ÄoÇT*þ‡Ï™k8¢YºG/·cÿhæùŽK™óÞô¯m%´FZá%²Nb%Ò[”Í¥ARÔ’eì‚|´—ÑxઋՅÌWeDÄÕ$—¤ÅOD/,2Á Æ^xZ{ vÖð§ºK}éÿ‹ tsü§yó”&GÈF¡ˆ‚Ю1³´™ÃÔ^_‹³ToXÙɃÕÚ£·„Ö(ð¢ªb‡å›k4ù–sb3gxÆñ ¶F®¦›"f¬ïªNç]›i+$’g¯ Uê ßaœuݨ6$~"Zs”͉ã*tœ°ÊnäO„H…xs!j…1WOo\Ô*9; ¥Àb°‘/û“(7,ðM¥™³0J e Gã¡p ý€R ¹Åâ¢R/ßšÃ$;¥(f¹bMÍJqâž»‚?s¤ñ®‹¢žYw˜æÏ«8®µ¼“+ìµAN­¥öÐtcEOà™CeJÉož]·ÏÒM*uÕ›àC3 \ÿã…ÂLATigž®êà‡„¢hö0V2Ѩu\Y†=‚àÔc¹‡›å&¨•[sï%… 76¼P°´—.˜èzÂeȽz!s{%&0uBQ‹_‚zÉmC2o.´†Óx³ªëp‰Þ–бLQ+rÝ’ ˜TFÏ[Áw V£!êJwupt»#um‹#”͘PêèT÷OÅøTÎ¥L¡ü—3§Ö¾exàÞ_r¶dù ·ÑŠ‹É*¶='xDx` Sô¯áëýñ P§¨<›7î bT¬®P—Ÿ+TÅÊîÀpº R0f,Ý80V¿rSÿçîb¾R§Dsú·.ˆçK"¢è…ˆê޳±ŒÓ›°³%·/iÿëÏs¥ª$DË/À ù$à]Ý)mk)®ZÌ ñó:-¨ ŒYåY+KNçV˜A›1J's·fIXZd<ëbuíi*fk†uðgÉÍ”Ür]¢ã®ìÁìãµ}8%®ê¸9RyF|¿lMÆm¶vuÿ®ƒãNCòf¯~y':Ò>{¢\Ý™gk”Í UlFö W*t/,2Çt/™˜ÒF ÷ð`³ë±rUÏÀKyÝwz&ƒ–wDsµÏ…ŠPE”›”G{ƒÓ¨å—¯«Û{~÷¡ŒW`BÕÉ |^'Fé†È´F-4Ùª;MÏÊMü½&™µ?®füm(âO=¶eRú®=‘—‘\R‚v‚P9‹q__ø:ìùÌc…ô…Õ&¦=á|~–¶p‚?ìÄ]èôFÿî ‚^§WÙ îÁ/¨ïãÕz^]tÜmvà×éÕF„1}’ú"yú:½zèE†ÞšJ2ðSYù×éÕC¥R©i©šê&¥œm¡ŒG³¯-zíü?éY Ó£Ð.4Ϫp\!¤d†>¾oß>\¸C'8 ¯15>:›Í׫e8†¹E.§ÚÇ·ˆÿhzrz6“ÅŒ(\ åŠyóW)IS*V+–¦W-á‘ã8g´‚e7ð`’”Í(ÜVƒÿß2œ$"N’p#ÇÕo¯_ æ¿N(#Œ@UÊ5˜^pj«VªŽn!_¯jr%´)õí>·Õ¦=zßûÞwíµ×¾ímo{ë[ßzõÕWßtÓMôé†n@,npEßxzÞ¯cn®¿þºn¼ñ:Ð{¯»AÓ×_wÝõ7è·¿Þ{¼7×_ÿ¾‘þUIh÷ß}÷{;θ*vÖ»ç^KÀB%U‹Ë.Ysg0Öw1çyÒˆÓQT__ u|‹YñB( ¼šïîÐO4?4æU+¢Ä›)>?N7œ±vd"Ç S Dÿùs©ḋ¾·ú.6Wc«Él¦dgÖêôäòÃüK‹¿ç–¢ZS·9í"ÍÔm #ÒÜŸ‚H«Go2'È~ŸÚê÷¯íùÍ-™_Uê«6úÄ/fAÏ|å£1Cs“°~O˜×ÚÖt®¢®9³3Ö·I)aáW¸æ”¬ãe¥y›¶ÿ‰ÙáÂM–€¼(äiõòK¼8“ÏáùŸ„áI3Úo¯¨ãmc¢ýæ6®tB0šB Õ5´6½Î×,Ðÿ3/w[Ï¿ÔdÒ´·Z{ *S õìNŒÿ¿Öϸí-}]ÑÊ!u|xð{B»/ÖÖ/‰˜Ä­66TÕ‘”{6iŒQ¦ßpÆÌŽõ5›©ðCuÁ:‰0N©wHo-«ù®o9ŽÇ€®&WŠÉϨwϼ4¸áÌäaÌÄ2I#ø±Ì“—Ô”äeþ a̾½—4¹½8äm–ÿÕ)3/`b‰yð^ÇÜxüRÌ›zÙÍW§é•ã§Ö1eH`ê3A@˜7ä^ ~<‘…<2y=+0s㇚Òlrî7²—Ø”ª‰Êm°óÿ*Šþ¸Úí`ßIEND®B`‚transmission-2.92/macosx/TransmissionHelp/gfx/PaxHeaders.4960/TransWindow.png0000644000000000000000000000013212442116630024222 xustar0030 mtime=1418239384.394590404 30 atime=1418239384.394590404 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/gfx/TransWindow.png0000644000175000017500000005610012442116630025651 0ustar00mikedldmikedld00000000000000‰PNG  IHDRᵩ¬˜›\IDATxì™ÏêiQÇ¿ûœ_f”’™‘‘D†2‘ò H^À3˜Èäx/ ñ J&b&ÒÈLJ1S¬{whµîåþ9÷®O­ÖãO_»£ˆ‚ ü9,üÏ‚H(Â>Èz½Æù|Ö]- p†Ã!öû=þf!‰ X,‚“N§Ç)èŽOñÖ›Ðu]ŒF#5±Ýn1ŸÏµ„¸\. ðo!dÛ6´„™L±X ù|…B‰Äï“P'Ù`0Pý~ÓéTKÇ…c;» þ@ 拉Ìf³¨T*(—ˤ“ô—Hx:Ðl6U·ÛÅn·cB½8û A £Ñ(jµZ­ƒÁÏI¸\.Q­VÕjµâB)“l|—4ôyÉÈwSO&“èõz”J¥Þ—°Óé¨F£Ãáà%ŸÅï¼ûTHAÄ{Ö¯~‡Ãpõz~ZÂïɧr¹ŽÇ#É(Ÿ¹|÷·TÌIg,&#»Q(Âd2ÑÉHxÀ—×°T*Ý ¨<„³ ˆ`Æ=7²‡ ñŸÍ(¹hQÛ:7#ÅuXÚ©u‰yV7ºVÐJ#¤£ô Ö~Íls¥šçº®‘vÿ¦×=>¬×8uêTûÒ¥Kg¢¸Wñ©É hÚ‘ ñdpuöìÙ7gÂÕÕU.^¼Ht1Ž/Φ`` ODŒnÝäõâ7ôìÞÃÀØ8ˆ€€8°øõ¿¨?£¶í-ú÷Nà8ÑÂ8.3¿âáÓYz»¶36r0±XI²¿Eããißä›éÉ {–^<§Ùò‡ÞmÛ)wÐÆZ)×@kçyFâ8¸±U÷t”«òfÜ\ã Ô_×)–Ê yÓ/`ü ­Sù3SÆÏž5³ùøÎã#IÕj•þþþ> —È„*1U'€hÚ!®äĉF„×®]sfff’à3_„¹ˆ]¥Ô· žÇÜŸÿDáÚœ8ÄÌoÃ7­ý“G@;,ÞýþÀØ¡c,üû÷,¬¯00~ÍWnsýѧ|øþGLÏÜdeúÇÆŒÒê»|gÕf‹h³ÁœÂËçOøë_>cëà(“‡ó¬å0lùÂÖÞ-¬.½¤¥ ·§‹çÏžQ®vn±ÒhQðrÅ‹sóô á7ëÔº{h7Vx2?ÏÎÝ#,…÷è¨õPÎÃÒò+:*Ô*¥,À°–é(kÖË87»ÍA² " –ÿ Ó‰D&!® ¾Ž?.šÏh­m0™ ó1zZkO)…¯5ù{_rP¯SX\ Êé™»¨ÃG@ktýïU¨”êÔB9õd¥~d‚ïÉêCz†Ëø¥×ôì©òâëGÆJ”5øÓd®ä¸=K¥×™ÆÆ¸;ÈËGž8Æìõ+<¦‹Ý|ö÷ë|xô‡Üúâo8…o¿3ÀÔí{|üÓŸðù§dÝqóT:»ÙQ«ñjúwî?ⓟåÊ•ßqäèÏiÔ—¸só¼|½Jà¸ôv8Ì->£³³—O~ñ1¢ÚˆªŒË´ûX»ÿÓï›ÓìÕµÖižÃ¾WÜÄ>Àè/¡ŠaÃþm1jk­ ¾BÚ3áÕ«WI(·•¢|q ŠˆÉ„Ê÷éy‡æÓ*ù}ûi:9:Â’4h·A …Þ=4*-Êݽ4×^RضB_çX¢ÎÎÒvZ« Jµ*RhQ±³–MoB†”ÔA‘¼öM67› Ú¾Ïúzƒ€"ï½{€»ÿ¼ŠFx±¼ÌŽ‘}tëäK=¡o LݻǖÞ]lÛÞAPìäùâkõÞ ý]{0ÏÌÂ+F‡‡¸óŸÛôås¬¶×Ù²³Ÿ¥Çs¬µ«LLNrÿËÛ´Úžh«_RËæûÄXvÐEdñ³Ý×½iãÃ$ÙÈ„àXÀ'‰q'—œ>}zsŠHü@ûžÐ´½DFôDÄ5o ß§|øÍ?à™ hú€ò®AT»@eÇû<­çY^X¦­öSÞq´PÀ@Ï0…ºË³k”U?C}ÃÊ·”ÙJI{e§1QæÃÆ(—=†FG)–‹ŒìÝËŽ]Ôº»)Kx¢Ð®‹ì~›­}}8¾/:ˆ“c[g G\öîÛ^·•åçïõwSÍ{ŠÌ?¸Ï¾ý“t•=ÄËS=4mb;Y´•Ùi÷„ß«¯“6ßñ¡µv\l¿§#V€ësbs6Èà+yGDâ¿d||Üi4IÀ¹ñÌk"ð"Î9sæ×á Ðd¨ÃÜÈÍåŒ"-‚‚øCá¸9S~  øŸr^ž ;XËÇxfI™…2Jö@³`žL9å‚h\Ïø­Uüµjf‚ Øô„÷}ãwÑ 0óL¿ˆF ˆÖæ~‘ž,àH[žfÙÄû,å¾mMìñ‘˜“:>Êå2çλ~þüùS@´#ö#D` bmc uÈÔԔĘ#F­V‹f³‰!ûÉ$KÒ|Ä9­õI9›Ö¬Ž/€Ÿ›|€gò'Ëw0VÙ¢W:éwïÞ…N׈“Û=Û|s#ïÁ³gÏùŠÞ‹Ø4t»b¤ËyñÖŒ°ú~°²9“ëycÆq NŸ>-³ˆ²åC`ÚyvöìÙ˜žž6’•/õyßÅ¡W~™øñãÇU¢oss3øhR†=Àןfž‚âëgîUP¾ƒdwªÀŸŸŸG €lN ÅÛ·oQTŒ·´ñJެkkkîþýûcvv6²3xøð!Š•­iín þÈ‘#Â,Ïp"? ó€æœ¨˜Yá^¿~ ¬&úš6—6µš.¤þ8œúumz¤Ðh¤æ¼2¼ß»w/ügžêMù׆]»v…ï ûSYêüÂЀ[ŒM•ûóçÏÕ+pGÍ—ð9ì–V¶âûï&âà̤†Xhxôè|yMHl|“ÞWì&²!ÖŒoü:¾þÞt†˜.PGøÁ;w‚rêÔ©òüÒ¥K(íFCÆ* Oc㳪X__Ë—/†ÂðC‡)Èl”Â`<°‹‘ݽ{7.^¼X’¿ä¸~ýºQZÁ/c>0¨A¼zõ ¼Ô‹>|<¦zÒܤÐÞçH‡rÑŽÂܺu+666‚­ à–>h+}5Ú'OžÄ³gÏâÀñôéSÖöðú²Ãª¦²Í;¼•zkŠªÁ([Ç,..Æýû÷¡µ8Î+W®ÄÉ“'é+íê”<@o <øuûöíò¯|ÇwíÚ5£¢sϲ%c*Æ.? }r¢‹_—»øù`ÄÜtŸ¥m‘^úeü©gÖÿŠÁåbDÔΆFÁ7oÞì tŒÑUßj„ÀpÂLVÓˆ4xê••¼!ʤòËD½\£–±÷îÝ# ‘2¢”0ï„r1³ d¸[<؃€U¢åË—/Kÿååå8qâuï)‡ã©ó[ȹs爤xRè'Ú\ÎÍñ”Öè R9O š÷|¡}æÌÚ0~2tÁWèe 㡯ÌéèÑ£(ÏÙd#c§ü¾oH=õºá6<ƒé§Žs$ê3? ÿ+ê†ÅÕ«WuÖêD¥l(DÌ¥¥¥¢S7nÜ(ƈlú“[: ÆgÙr_ÆË‹ÑDÄâ‹.~_ÅÂO_â¯OŸ‰„Òì8³NV>b¨%p°³þ¿™HK‡‘tÌR©Éðä DÂ$¯l„0ƒ!MT Ád#äžv‰ÑÁtSNáçu^fXVl•t?ç!ÒÎ¥R$º•¼DîIeHqðäÀ‡>Ç£I½×@¤UgÄÑ&ÓeæÍ3#3õ¼&’>Æ®®®R—·ÙIäµbÓ9Ê Í_¢ÖÇ•<_.ë8 è&ª1wdŒÓU?ä/ÅL€BN§ƒ1ÂäB»™g:èìÜ…·cÔÅÿÛŸ»©ˆÏ=Nä˜l|âG¿=¶¦Þ¯n?ÚY5…àjIÑÐîù’ˆÔëê±´Ñ‚HFþîú‹~šBJë7’Š˜àa:¿2‹þâV±9óoÞ¼¡NÖ¬=J H1jÀ Zoéº8 ‡>:q×ß;Õw6~|Jôåm.\€ÖÌ×¼›Ì|˜NE†_ðÓ”,ó&RÞ¹ö7jë»ÏÚ†Ù È_ }‰€8e¢!ò…ÖóçÏDZcǘ3ý5€ ÅA N*J:NÊÎÑ0׆¥‘ð¿ÁAz·§&â·»ãÇé>Eýç§½ò)"{NG'*Q’¢`ÕÕŒ°R*gQÛ¬H­r‰˜çsss´±©€"Ó®ÇÒ»ë±iS‘ð”¬sò%¼eÞe•I9’º^#]a<©k-R=ñ‹[AÑ?ãæBÐ쪡èxjÒE禃“îÕ£‹)’‚!‘†‘bRXá0Œl*8-Ì(h£?uñë0TäTZ£vK´l>?‹"? 56é4sdþ8ꔼO 2·ìà›mÀÅ)g½sOêK–íÖV¿Ìÿ»wôΡ¤¾:¦ÿ×ÒÑ튴~3[7Âêàú»‰L F¨ç@ÉÙQÌÞ—\={NÚó»&1¥§Ýbš•ßãÑnÁHá08ŒPoÏx6+ônÂöžèÁ¯CØF;êD_×iiÊ+þq4ù}´âÉ…aôb÷Pü™Va’Md~¸þ…ì”fúx®6— Íߒ¦gÈ–W™ô!àÅ`ã ƒuÓñlÐÕ27w—-ðXÙÂvH/~gGë½1®ý)ÞPGÁ—@WÓý™;׉AŒBYöýߨå«H„PüÑ kµ¹hã%3k?égf'|çª+Q0•ò˜ÜL½/Ûs¾ €ÏYu ô –…¥-øá¥Mx(½Ì´cr7€l1ŒD.žÍ íü¦%£÷o’ÏôßÈ\Ú{<ã¸-ËÅi¢ùy_v5ÚGp­[ÊæõÛðÆÓÛþèxü8 ™ 9%‚´÷c6ï)]Œ®Šž2èy¯¶U…ç:ª+ûk„>¡yС6Ë\ù>Û-WåK€CH&Ó‰ĈàuñnÓ*PußêH«ëSŸûYŒþÒK9 ŠœÖ‰ìƒvø¨ÿçöÈ>HëÌR¿‹|*ðaþÙß, ÷N(N§—ÅÚˆ=3÷Ëj)wÓmœÛ|…S$¡î5@á3³ûÓ/¿‹œ–µ§ë¾¾—ºÏ1ž½¤å˜eöÓ9xË“ò+øÀ #(÷[Û@®ý ¹óÉñqÍ#e–ÎócßÀþð>J篺´`ã›)@§ÐØÑw“»vZs–q™u½/"jÜ$½žsã¤Ýªo¿¥qßÓ8"öÀÏÛ„Ô/EÜè›JO”{¹º~{”À;ßH¡ÞÛ åœBƒ:öåéÏ¿wBƒ¯?öÞ;8®,Kïü½÷Ò'>aÂ=YÅ"Ë‹åÛôtOiz4ÒJš mh5«Ñn„ÖÄjÿ˜‰MD·FÓ3êéµïêêò¾º<«Š¬¢7 A€ ¼G"½Ïg6çDÆ ÁÂËt]ùE\¼›÷ÞwÞˇ{ò¾{ï9ß!Ÿ-Ptd”Ét±L–Þ5tú/ át¹¨ª®BqxØÐTO>WÀát Z}}=´mÚFdfÝ Xé`6œbçÖ.L#ÏÌÄ(ñœÆ®[ Í31è¨u0N¢gR¨®JvîÜ"Ê Ï“U|h©¡T† ñh`)N‡Êäð j žö–FæÆ®)¸©õZ,Å ä³\uìèÚd+ê‡öÕ¿1/ôõ/Ãþ±3´ÎÎNÙï+–356B"¯ÐÚXÇäø5p¸,–S9¶o߉[É36z­øÙâŽý{Xœ›ggTX\˜Ã¨cgWã 45‰m¬(¸Z2¸/nØ‹½¯ËíÆ,¤BõT±sÛf 3Ì,FéÜ´ ¿[c|| EÍ¡9œLMNÓÜÑEC•“HB§¾¶‡¦a+9öÜr µXùë$ËÍù|žâ>›lB/..ÉŠÃ_ÍÖΆ‡FÉ ¨@>Ÿ“‘süÚUÂóat **|¤i*ªkP KUs(–ç²i,¯ûɉ1FÆÆÉeR$“iRé$¦ˆÜ4iÝ ŒŽÅ0£ $X(T @Q0s&Ç®225G"•'™J`µ ¤ìÙݰÖðÖ^»|½Ë(YÙ–H–™ctjE1qxüÔ×V Ö“Š…‰Å“X 8Ü>êêë$95•X$Dï•©b»Z‰‰T–L*)o%ã×™ E))¾ìý-Q¤¿É†Y`9&™ÉáphEå§`*¤39TMaxhpÎÏ¥§ÈËc‘(ª¢s±·—LÞ°¿“$ä°FB,ûÆMÓ’Mùâò»X™x<¶mÛ.¯‡ùtœ©y–ÖfÒÑáÊÂf˜TÖ©OdÈe³¸4MµÈ¤R²¯”ˆEÉLTÅæ@Éá Ð ‚jý.æMPª8«Š†Ûéa~nŽ‚ÓA…ÛÉÒÂ"Áê*Üä>SéI]ev{«hm21/^‡›¸âÇ2!¯›8•9ç,C¦Åé‡üÿh4Ð y"¡9"±<;7Xž÷Qç´ˆ,-`üL͆غs—øWz|•t6:Ÿœ-Ê  ¢ ETQÜ06bCSNMcŽÅÅEÙ~°ÄØ¢PÌÑÑ™›_ ª®Ž\Î ‘L¬ñÒÒÚ•OŠiTUû°²IÒ–ƒÖ†Zâ¡EÂTnl’>Œ­Œ’nz%\5BqÓ ‡Ã%…¬’š=;w h®bÊær ¨hª ùÔT×Sw[-†i’ÉzØÞЊeêìØµUÞÉ= Cw±sGÅÔ©ª­¡6X¦XòÏkš@'ªbɼÒ_ÝÈV_5ŠÓ%œ*y]GSµÒ&¿Nmk52:V6µPÓÖtCoBvYu\õjfCÊPÖ\ò·ÛØy{j‰È[!Û>ç•!埊 »-˜–lp#SM³çû›»¶P(è¸]À4¶lÛ†i)hš"~çÎ \³ÍZiëЄwÖ4ÚdªD¨ð{Pü ì­o”¶†ž%V32÷3t|¶mñ£hN°Lêkª¥Ÿ‰A‡a°uÇf4Õ’ûikÝ ùH"‹CSéèÚZÚ—4ÖøßÞ¼J(|•¥(bi3Ú61“‡¥ë¤K*`¡¦åõP@ ·Í¯DÉ$¯ ¶£haåtZ3o×A‰¢Çì½#Ã’ö6†nÈù:m¸îù+σUuö?Ü®Fο~ç¹¡Ž¶öyeE¼Ñ²µ•ZˆWÿ?WS¡¬V|µ¶Ûº±Ú˜]°ZþM¯„ò òÍo~“ß@”Q†¬mHœ–›xuT†ë›e”±ú·ÊM‚|"Ì“?ú!/¿þC#×aÄ*M‹Õ°J&:?É#?ù>Ïýò9úîò¹©çxí¥'yûè)–ç§ùÁ~̵©ý'xëý ¤b Ej‰ŸðþùúÏç'O>Ïâò2Ïþâç>Ý €‘Mðâ3óý}Ÿ³gOó“ý˜±ée®\8É~ñ4ѬþK÷Ãýü¸H]12±ÄøH?ÛÏ…Ó’‹¼ü$%°4=ÆÅÁIr©=¯ðök/ñƒ?Âôü"¿|á~ôÓŸrel†Å‰!~ôƒòÚá“èëe¨Ü$HDæ™^Xẩw8qþçå/ÿ⻼ê,?ÿþøÖŸÿ=çºOó_¾õ§=qŠÇ¾ÿ=~üóW8ñæ3<òäËXÀ Ï>Çžû¾Š/3Ë/_z‘¿û›oóÓ§_¦ç̾ýÿ”«Ó!Ì|‚cGSSÛX<gë¶­9ü6¿«£Ó„gŠíÂ4øUNž¦­Fãtÿ U ç{ÐÜ>îºs‰PŠMÛvÑtsô½ãœÏ‰·1—öðµÏíãÙÇŸdd6Åo}þ~^{ìçE¥‰/|í„®œ¥d†2ÊJø±&ðáh’oþÓ’ süü Ÿûâ}œ9v„„à¶ͼüäcLG³L rìdùüK !üüƒdÓ)²z–ªª¼ÂóÓlÛ½_vŽ—^|ŽDÎ$‰’µ|ü»?üw¼ðèãÌIJ²eb TTÖà@Å´(F§E€ÇƒQÐihmà EIf2BtîôQîþíߥºJ÷XН|ñ.dõÎç#Z$ع‹ ^•ËCÓ¨Þzú޼LÿÕyŒè§¯„ùÊ—îFW*i©rG¶_rm.Êòô{Ïñä“O1—ñÐ@‚§_?Ëí·më¢êª*ô¼QÌ»©­®Ár˜¬B‰u@!¯”±þàà&ÓSÁ7Š,YûoÙC4§Ö«qôÈ1î}ða C%àQøêïý+úú.°û΃T¸Pݦj'õ==çyøs_æ­'€Z¿/é‹L‹€ÏË–]·r¶o¿£@ϹnÆÙ¶ÿî¾¥‹W^}‹Ï}åw¹ÂÂÌ52l¢ÆUWÔm]5œ˜ã·¿ºS‡±sïmL]ÆWߊÃäÀ-œz§›´ž%šÕØ»»‘cÝã|íóxôÉGiß~•ZŒžî>÷{ÿ3…¼Éùþ+¤ŒK±_|ø ÇÎŒóõoþ[\½p™ÛýwÜ€7{'…¦8wÞûW{œ>:Àoýã¯Ñsò?{ä1üÚïRUˆòÈ÷ÿëFnÙ²2Ö”þbB_¤Ë»~ B›îÞNnÀx_éèúÖ·¾õ'ôG´C×u# Û¯,XÀåtrsÀºAoÛ³åC¡Œ25eSW'¿Y(ãÛßþöàÿñÿ)2@ºtÌ9 ¿ŠßX‘LÀ,Òp¾,—O C“ó¼Ý?É‘ÁYÞ½<ÃñþÂ1£ $EDâÉXÀ°Vsd ,Ó PâY ׯ_íî"v©i²eÅãu<ÜQ°QŠ|ûÒÕ%\Í]^AþôQžÊÜ.×éŸX$]¢,Ìd2 ÎFxîøÏ½(éé£}<ý~/£ÓXfógÏÏ-è¹Ó\›¤§»›TÞ[Ó“'Ž34rcGÞâL÷e[1‹òÅP8´´D¸˜®]½Ær($–Ñh¤X—a°·—Ù…¥âç8ÙLŠîó=¤r:‘ù).^ºJ,´À¡C‡¸6>Îñã'ÈLÆ/Ñ×ßOO÷ÉbݱY]šžà½#ïòî±ãÄâ ¢±£ãÌLÏ ËY8CH„°¾ØË±“g)#ý8~ú<—û{9~ì}¯ˆÅGe|òþ„ª"#Ëãek°«dhš` „‰Q2îÎó—&ÙÙÙ"¶žþ 7Ù\ŸCÅårâõùÑÓ. ¤æqšVûºÂcú1,È'Ü>} 0œtÓƒÛÈ0>¥áóT“ˆO“ÇOS˜™›$œ(l¬!“²ØlXTª°æ§ñ© 6ÑT_ÃÒRH|ÖfÇ®0¯ÔÐ^«²^"[(°0¿H:› •O3=1Âȵjj.®Œ$1tØ}ë^šë5bIƒ€Û*Ó¤r9¼³sQZjˆ…Cij›Ä༌²~âpª*† ƒ’W˜¢x¦…Ô™R¦àqh­eMåHF—)$tÂám›,$SdÓi‚-mLÍ÷0<æ`CÛ& ÕÉèè]¸4 ‡Ç'n*-­-ø5ÅpÀG!ç'à Èëëš©IäðzTBZŸÇA&’ÅÇtvn"²8Žåð‰e~ÇŽ½Ôåó$â a‰sºTUhrvQåu …©®«£¾º¯Û‰Ëç&™5pk Šâ !èc!žÇÈdT'-¶l 0NRYY…Ïí Œ2>W&iÝ [0JJh•”Î’ÍvÃÅD7L¡P PÌïÞ[‰ZB¡¡µUæg{n¿]^9uEaÏwPz啲l6Oδ¸ó¡{1õ<ÉLžÊ ?( -%›Ó­Û»XÉï`Y’a‹¦‘Ã]U˾Ûëäþ,¨ÙN3+d ¶·Ó çŠH £@}[;õŠ*>j]Àjžñ"Ȳ4oê¢ä{׫ÙPjÓÜi‰‘¸båÉ(ã×§æDS……N(K +éïÅ?QUU;¤ÀºPB,¤ƒ¦ó:–£`{Ø‹JVò¶×„êÔ…ç®=Í5}‡âXdx š©•kU,ò}ØøH2Ê2Lˤ-ІÇë¡hÁ"s>UU%ìDwF"$KyQ!%ÈŽÃáX_3(*J1}XtVmÄ*˜(Nõ·H³ ŠS[YÿÉ´•ù5Þ‡n2”!‹1’V£8òIúÌxQDçÇxûýcÄ —–IÄ"D¢q–ç'9u¶‡ÙùæfgˆÆ“,ÌÍM¤É¥ãB™-ŠÄ±ŒŠÔ;»½¦©Ç%¼2*Ôãp8¥^‘ 4œN‡½/èr;¥ÃáX)CòêVª¶âššƒR{¹®Óé\ù]Ä·X.×pºD¶°HÛ×Ö4Ô’ŒÃZPFyaF:Z!æÙŸ>«‡Žpùê5P%Z‹tTM:£"±D˜©ªÔ’-NñØ#?æ¥×Þ¡P m¥J9_:6VŽ·^}†ÃÇO ³ÚOòˆÐ^í;É»ÇzIÇyägr¼ç—zNðó§^ cª„&†8y¾‡CÊÃWž{šŸþì§œ?w†Gö³á¢ŒSüì‰çˆåLäÚ+â&вºœL]½ÄÏö3F§BLŽðÄÏ2É §–8qê4Š(–FhfŒKCByHßÀGÞøeñz¿`f1Äë/¿Pä˜y”á‰YB“Ã<òãŸðÖû§à#Û5–QVBU%žctr’ãGÞàøùúNåoþæ{?s–Ç‹<ßùËÒÝs†ï~ç?Ig}æ§ßçO¼Î©·Ÿåñg^ÆéÔxùÙçèÜû DÆxí—/óÃïý=ÿ }çßç/ÿì?qm&¹‡ßz‹ªÚ 'Ž¥¥¥U(.•KCㄦ¸42K­ËäøéKÔz Þ9ò/=ó /£:4¡<ܳ{;ó“ ´wm§¹ÂâýÃG9yö2 •·Þz§üüÍßý„HV'æ…çžâ©WßÂÛÐA{ƒ“ÇÏðÜS?a!š@³ üò¹'x·§ ‚“É¢X9Þ;rˆþÞnŽåMDàþ;·ñüO28âž»oãÕÇág¿È‰™‹'¸82+!Å>Ê(S&øGßü'(‰eQľ‡3Gß%š÷°³«ž—Ÿ|”‰P‚ñÁ‹=~Žlfž…Ùyîyà>ôL‚t!M°¡‰ªj?¡é :¶ìÁ™šá¥ž&œÈ²¼ÆtTò¿üÁðâ£O2ÍÛ1 9Õõ¸4'–N·SF2jj<{Œ…H†©«ÓDâY©ú.œæŽ/ÿ.ÄÆéŸÌð¥ÏÝA>¯SWUEba†êÖm4:-¯L¨i¦÷ð ôÍ¢¥¦¹p5Vä ½“¼é£©ÊÁËÏ¿ÈðÔ‘™úΟä©ÇAH÷RoÅyþͳÜzËf<>? ²y\îâyÍ dŒMø¼¹\›ªŒò…²*¹iYk—”‘_ùÆïpï]wYNPãÕ8ñÞ1î·í¢gà~-ωgXM°qÏ6îÜÝÅo¾Åƒ_úGŒ]dvr˜ÔmT9ó\›^fSg€÷ÎŽð/ÿíÿEµ¾Ìðø,—ûdûÁrTr÷Þ-œ~ë)b¹ñœƒ]ÛëxÿÜ_~øÏ<÷8-]ðáø‰iîûÆïS((œê¾H´Ø>×yèþœîžàËßø]6·¸x¯ç·Þ~/·ßy/ª¦âˆï#[çžûä>Æ~ÞÇÃ_ý2}gŽòÓŸþœ¿õ¨*Døùß}oS_ÝÞn‡ó¢Œ²ê†!¤G¦i¡(PSYÇå†ímoPÙÐÁÁ¦¤2¾ðùåœ}¢iZ‰ÝLÞ—wß……¾=»Èç 8œN9ÿÀÁ¥ãn¿å6Y ÁU¶GFÙÛo¿u—‚D v8QUؾk\Ã06qû}_‘ûݱ}†aÉÂȃ_0e^gâc_c»mE¿©ãŸÉ†ÿ¿õ{<ð%ôØÒù;ÜýâËüóöoض{;–wߘ˜&ESÝ´plþmö4ì¥ïÏÝsP¬€ C¼ºÙ|ëCl½ ñ»üWÿúß’7LY<ºmÏN‘#ñÓ±ØrÛÝ8]n9ײ€2ÊJ¨×f˜‰¢–”¨Ñ§±££Û« ‡ªR]á³GI‰¨ª¢$ªª`è+c„ƒi"ç‹RHÇÖ0 CDŠDÓ”ú\./ ÄJŠBTLt»óæsr="³¤¸*ªbÙ±0Ì%¢‰Z ŠÀäšâ!ÝÞ¨aëŽ:ô|^_AηØ‚R™%«vdãb²ƒªªÈÖMi 84EæŒØ‘‘6Šª•dË•MÉXÆgsN( ’Èäœ^*3$ÓébÊ2¼ååÓ¼tªßN/Ÿìcp|F^[ ™§ŽgnvŽÓ'Ž2>1CïÙc\¸<ŠCµèë>Kª`‘\žáôÙ>®]éáÔ©¼ûî9=—ìá¾ó ÍPÈĸp¡4™D”3'O‰ÏØÙSLj$óD§8sú4c£#yëMÆæBäSQ¦gìe&´ÌÀ…sBŸ¯g“ÅóN1·0O÷¹Ó _äü…>/_æêÈ$Ê §P“óç'2²Iú{$Bl$…êåø‰sXŠJ:ƒîX,&¡žãÑñD EQ$ŸLÆI¦R$Q–C!©K'ââá*~Ž„ÃÄ¢Q‘ápHU—‹òr…2>«#¡tÄé¥^¯¦ÆŠ¿ò`š ›&†eÊ(P0,®Ì,±¥½ÍáÂíR™šœ¦ªºšx&‹¯²’š¦ (~ƒ¼a &E%˜Q 8ý²‰,…|¾XÖG(‘#›H°ã¶.<Å  ›8œ²ï‡Ëã‘ý6—Selx’–MÛP’s,-.Œ§ˆè¢‘4×.õ°í@ŸK8Cc±–"qÔñaBÑ4“×F¨Û°•*W‚±¹ñk¸u´¶ñ{Üâm9 fg'HÅ£X^/ïª%²¼X”¦e04ÐÃÔ\„êºZ*|Õ¤S‹ÎÞ¹‡‹É&#èŽ *< ¡Pœ`s3j>EÚrQë×XŠ&ðxk¨ô),.EíÅ`ÃÖ[ØÒÑ"#sŸA%´Í{,…‚¼9–R¢:4‘cé³85 @SÅ™Ò[]Gx~†ÆŽ²)¨ 8™[œ'ÉR‘ÎPã¯bß­·bZº0šEci‰{_U]EÚLÑÖÒJ]u¹\†L&G,¼ÈòÂ4yËA6¶Hª Ê¼ª­­“Ëxü~1Øø<Â{êÎ9d!Ät9YZN£„C8UÍÁjÙÖp:–q{*¸mß],.,€³B¾C°©ÕáÂÒuR™4Z:KM½Ÿ]»nEϦñ×Ѩ¨ª§ÕiɃijÛH ®—S#Ÿ§(£ÓÔŠ ::·’O-Í*ÔÕUlÌáv)LMdðz<ª+©ké “HãpªÔ[I„ư@¡ŒC> –*µ+Ÿ.XöYvÙê'»’KQ`·½ d|ˆï¢›ˆF£¢„6¬Ò¶Å£,c }¡Ûã'Ÿ³)E EA‹u¹lCC‚±VUU åa6›]/”‡à÷ºñëqÌå˜Ü´(×cÇÒ ê:¤ÔThһݪ¾Îêòë°—Ùe7&Cò¿F`ªš ¢«R{ÖîU°àV·ý29ýW,‹_‹ŒRÞ™ŸŸc~qѶòª)QötŸ'¨-¦¦b»ºbùz <”Ð`¥‡ÿí›_Àú7¬9œBUñå5È襇øÁ\wÊu)µËW×­³Ð–)ÙUKQPVüúZXv›[ÆQâûœ ŠÓB•:>—´µÖduí¹6ø L¦×¢*moN.Í)ÛX¯—;v µ¡¢*ìÞÓ%£žeYì¹åÖbù$ÉT†ŽŽ~æz¡<´ÿ;Ð>Ôë…¤Íèz§Óª®VUA,iPUªjG1×q²ÿ %¹…|^¶Õ–©**H¸6Sdš(8d…Ö’í PU3=/ß›|.‡æ9ùnŠ‚1-ÓV"9–.O)ü 6ôBAÎÕ4Ë´•Rd꺉´A•ðr¦,p©2w¡äS(íMSî[QTÄ:ÐTUÊ,VÁB:ò,L Sd‚%¬8œò¼ì… ‡¦É³µe~HÕV`í¶7¡ Ë’>@]}}1Q» €ºº:I H¹µÞlGod´PTÈÒݽW¨¨ªcãÆ  hx½ndU5Ÿ#“/PÈ&ÐU?~C^ys '9G&hnnÅåÒdÅ‹BË᡺ÂÉ{‡ßcËžÛð»ÒÑ+|±¬QNaUNEBô Óµm #ÃCÜrÇ=ø(MfX˜¼‚îo¥«ÁCÏÀ(Û·o¢÷üvÜ~7­µÌ/,RUSK&•Âçó’ÉæqhH¨5—ÇGueEQ$å’Në.–p;lÙµ‡¥ãñ¸è9{’@°·™btr‰ÚÑ Üï]ÌM\ep|Žá¾nÔÊÒKó¤>öní$ž.à÷ûdi]SáêÀ%*jj™ž£më-Ôø8Ýn®õ÷1Os×Ì 26æÎw3;|‰¸©`åâ„c:wß¹ŸÐò2•U•*«Di×w­UǵÚÞ¤2V¿b®Q®ýæ=)@6¡.ØNji„Ógçñ¹U2™<©¬NmUP¥s.-ãu*h•P(U,ó +NB‹Ó„ 0-TÕÀ[dÿ­[±4ÅéQ™,–© ‘'Ïãpx¸ëþƒx4U\ƒÜN —Ó-LlWû/0N’J„Ù{Ï­D†ˆ'ÌLÎÇÈd Ä \¸Œ¥gˆ¦ êüIÃIC} –U kyy¨¨D“׆±*F ¾¦j¨f§žÄò5°k›‹‰Ñ6lhÁë¯fSg'ºÓ¡+E…klw‹ÈbˆLÁ ­½]öTo;ø ,2õx •¼¡°¡¡‰Èrœ©‰«4o褵­‰k³ËléÚÂòÌ^­ƒ† Ÿ†Æ æ£9áR­®¬b~)JU…Ž·QŸÏ‘L$ißP)+€::I†¡[ÿ3£„2¯òVÕsð¾,€«X +Y«7~P®ûú+­%¢®Ë_‚JgçF{žÖºaã*¯ “ [o¥­´ä²Q‰;°aMm›±JT…–RÇ]w‹M›»ä˜Íº¸ÿ¼7åþVîSY4¶vˆ,§Ë…?w¸‹•ó¹Û„¦Ñ>—m»o¬Ò<³A¾¿iÁÆ­ÛaÅœ3—Ï‹KÖíwÞI.›•ùfeñ¾‹iżXRëÆílDf°‰öMŠx 4wlBµŸ)b®:ÜzûÝ¥y¤…ÂzBY í¨¦)Ü8ÌU›ß–­wk¿å¯l£ÐÚÞa/` X+êVäí{4måµË°¶€¢ÙñwWDúŸ×[’h»R­ºSd]çûÙm4MrR¾ú\À–+ü8H9+xÜ%ÿLLY<ì8DR®”d %+eJZù]K¥¸Ý®ÒÙ¦´UË*¸ºßüJèt¨(È«¿Vh* RFŸtÿþtü Ë(£Œ2ÑÓâä(O>þ>ù4‡Þx‹é¹8«176ÄÐø³ãCÌE’×tŸàÚ|”¥‰!ú®Lð /Ï>÷"ýÃD£IVb¦(ÿ±_<Ê“Ï<ÇÑ÷Ž0>a5¦'®15¿ÈùÞn–æg™YŒ°‘…IÎ\¸ Àpß9FÆC€Uün¯ðÒëï2zu'ŸxJœ‰Ïzg_|X&‘‰óü³OsüÜƇ.322ÂäìñxŠèò< á$„™ÑË<ñÄÓL/'¹vé4O½øKró'py|td¦Xÿãóa.ž?ËÌRˆž¾LÌNOÊ™ g9æ<%01|…¹å‘¥y. òÒóOóò›ï‘ˆ†yöÉ'xé¥×H§s\5P’YàÛßþ Þ<Öé7Ÿç¯¿ÿc¢é>‹G¿÷çüüÕãL÷ð—ÿù;\¾Ê÷ÿö»ôLpö½WyêÙ·yý…§yÿ|/>þ#ž|úeN½÷ò'ßáè…«œ?sš”éFɇ¹víϼú:o½ò6‘d`Ó”|†êæ-XéEþóŸý%¯¼{Š·^z‚üà2:$§yëÕ×øÁ÷~Ì[GNpîô þö¯þ‚wŸãí~ΓϽÎÈØ4‡^yïýè1f"i Ç…‹ƒ\ËôôgæOþßoqix„Ë—ûyäûË/¾ÆÅSïðçßù6G{¨oé¤Ö™ãÝ#‡yûÌ [½×} G.ÂèØ(o½s˜ê†Þ8ôîÿñ?ü?E¹cœ>ÛÍåç9y¢—¾îSüýý.Ç_¾ |¡@&6Íá£Gé=}Œ§ž|šú·à‰óøSÏ+TÒê7ø›ÿò×¼wþÜ7/?ó iÝb ¬„.—¦Æ - ø¼<üà]L _âùCGEÄ*7²[ wÜuþ£/3вŽB!ÁØÐ”ļïØ{; ƒG˜ÊkT{â¼þö{²ù<8<ÉÞ[¶162.Ö/Âý¢91’aœž FŽ=Ïóg‡ð¹AuziillÄSÌ?ôà=Œ_<Å‹EE]ŽÄˆ%³lܶ•îÓgÙ¸¡‹çzˆÌŽpû}2pì]Bñ,ﻋøüÓ‹i¾ðÐ ½ œ6Éxˆ[î~€Ž@ž3#Ë|õ °Zb羃ܱ}ƒl­¸Ý^ȆZNóнHÇÃ,EóìÜ7Õ…#¯½JÝæ=Xócô\¼Âûö2:4@>›gqj„+¡_ºo¦î ¥¡šL./ÔŽšfQÈ´µ6cä3Ò¾¶®™ÐRˆÚ¦N.~_žïCU²¼úÚëì¸çAš«+¸pêm~þÈ£ø[w1}î=ã1:Z ¶l !XM<¤¦¾‘–M§#ø*t´w¢ê&ºÉ:A9*“À_¤VóãrmÀ«ú‰Ä‚tÖz™Ê: O’Nµ³kÿ¸ZÙð…ß!yê2M ÌÔV“ÏF9{æ,úN¾ù?üÜŠÛ‹ëóyÜŲ:Ÿ“ªšj"‰<=ݧiìØÍÝ>„>}‘©H„[ø]6fòtŸ?MmsM-­x¼.̦º¼ÔÕWÒÖÖDÚQÍìP/©–|þžÛhÛ½‹Ë >w[3ϼt¨¨L÷ÐRu55lÛ¹‡å‘‹œ½œâ·7§9STÖ÷¯|é^N¾ö3"áe¦çCÜuïCEÖ¶/réüY —W¨+Æ3Ôi©¢’ ñ@±½·&ÈÔøeB© ýÖ—¹v¥OÍFnßX‹¯®ŵÀ¹sÝ„g.&‰æìnsqøÜ~ÿ÷ï¦ûÍ_p%^Ã?¾oÏ¿ú*÷|᫜?}R‚—~ë?ÿWØ~ëN’þ ´W(ø+}ty“öλ¹ãÞ/‚;ì"Ss··ÃÓOÿÅäw¾òe^zñ&ÇëøÃÿõßÓwòí"qówÙu÷A.…µQ†bYöþ·Ür‹200 j)i+’p­HnÀx_éèúÖ·¾õ'ôG´C¼•ã)ÛÆ³¶²BÐ> ]êûÕ¦µ[™º¼®7~í—Ub>S?×S,”èÚlaY¶7þŠã ݧm°þõ†BO²ú~ÄMMbwü¦áÛßþöàÿñÿ)2@ºtÌ9)·ÀX‘LÀ,ÆÈ·.^¼h)Šò鎄W§æ9?BÊC‹Îj7;7¶®0Χ¦Páó®îv4ÅØZü à*€œ³>ŠÚ×¾Y7ª€kÝû‡pUÖ¬+‰]q¼ñûTPÖ®×´¼Ÿ_Ÿ–ç„Ò©²‹ã ÄÒY©4Ét†¾ÉO½ßËãG.ðøáb:ÒÓ‡{$þ;€YÈpîäûœééåÜ™SLÍ-Ð}â}Î\`d —¹å8ÉÈõ>ç†ÈÄ—9{î£#ƒ;y’wÞ>,ö¬‘Źâ}?¿÷>ÑD’d2Åìô ³3óBS‹%(Ï L ñÞѓ»376ÌÑgèçÄÉS\¾Ä_W/÷3¦pùdYÒÙ<nÃýýDãYL+GÚ0ñk.ò㣠yq+ñlÛ zž¡+ýT0ój‚€ŠÏåkÜ*¼ÍùcƒŒºT·#“"˲4»H:`v!ÊÂì$Cƒ×ðù+©¯ª`d4A6k°eç.YÀXXJPãw°O‰Æø _]`ë–z≈¼¶·ÔURFY ?QE´PÐ-EQBbEÅ] {fé9pû Vù˜RÜx5ƒ¤«’º€ƒPØâ¡ Æ÷ùpyì¿õL ›òpq|ßömTVx˜š S]¡àqúi Ö“L†ÉæAϦʼnӭ©x«‚âzTQUËÒÒ"•Õ•€E"•B‹D0Ó–Ëφ`%™ìÛ¿—œe’ÍGcâ‡xÉÒÈí ÍD–—qû+Ö×ãq9pù4–㉗a¡ÐÜTÉè\„`6#ÄBÑP‚íÛš„ ¸Âã2¡uƒ2ÖÑ“CÓÄ G^³VŒ„v2¥ ¡†Œ¬’!kfYœ_$™LÒÞÞ.#ÞÄÄ„(]>ŸÅ‹F£Â/séÒ%‰„´YJh˜&ˉ >K^ÕV?EFCòƒ”[@Ïä2yLÅü½T>¯Ù{?¾ Á'(CÚ”e|è¶Ÿ¢ „¡Üg’ÍgQUáð‘£¢(¢€™LFúnEE@@rýPbÉâ„PFâ(×û5¢Dù®Ôµv`ª&†¥Ë(z]ª@X]¾6Ø:!ù›@Æzø.’ÿ¤d(`¨:&¦˜óMÌLݽ¢(”æ¢xÝÝÝr4 CL‹<>ë‚òPæ}‹ÿûŸ}InxÍ'„"“>¿á‹ìÏߎ‚Ê' {Îhÿ3>¬Íäµ:_ÆMÓ4ØXµŸßÇÎ;™œœ,Záóù$_,'•J±qãFœ¥E¸uc;ª:œ7¤N[k· Ÿ‚~òr×~;Zg(£¾¾^ÒjØ”‡Ÿ/ŠØÂï9F"%ÚdR ɱÐ,g»û˜_\"´´(Ö7áЉt–|&ÉØè”ÔŒÆS õ÷ؾr±È2ÑHˆw"‘Õ™½Â¥«S$bBËQ2©¤XÔÄcQ’©´LÊìbÙø2—†G™½Ì¹îAùÍfóbUsäíC\º6žOsìý÷˜]Žadãœ>{†K—yë׸4:Åòü4s‹ËDcIÊ(ãæueòúqjyN¼{ˆÃEe|ç×9úþqº/ʪ3Óct÷ôq¼Xv¡§‡ákè…cW¯Ñ{¡‡óŲœ%±ñ)è:F.Á¹ó½t"]p ïhUM%ù‚ÀðàEº»Ïóò+¯pìä ^{ãuiõêã×®2µ°ŒiG¢DÃË,-…EAuÝ@Ïe%XH,–"+Ö-GY-ƒeÐÛÝš‹h8Ìr1…"ibóSœî ÌXÆMëʤª¼n/ ÕXŠ·šÇÔ|dRœÞ*j*=4Û%¬öÐ`?™¼Ž× ±¹ÃL¡k8$y^¢ >úÃãsR®)&ï¾þKÞyÿœÈ™º:È¥¡I;dš„,CçÂÙs(N¹.‡CR*4Ï•KÃroÙLÓBÊ‹ _RfIvÉèòs ‹}ãeÞ~ï4éd„Ÿ–ÞË£„gGxþùXˆ$p¨ ã£,U]³¯û«De%”9Sbi†³§ÏÑsò—ûø«¿û¯üòÜ=~’Á‹½\8w†ÿö×ËOžýÕwxéC\¤ÿÂ9F¦–¡7Á©è\ì9‹âÒˆ,Ìqyxw1?3r‰±ù³Ãg¸2Ä“?Œ¡Á”RŒ¿…‰A~ø·ßãØ±>.žz—ïþןp±û<ÿß~ÌôüC½'8üÎ þþ¯¾Ík‡Ïðâã?-ÞËSÅòÓ|ÿ¯¿ÅS¯¼‡©(¢ K³LÍǨ©ñqâĦ&¯ðÚ«/p±ÿ*O=öãÓa,4ÕbäêU.œx=ú,Sc#Eúƿ嗇Þêˆ2Ê 3ªª~`PЕP•Lr™‘«C¨¹†ÛÍ—¿ð0W{3믧¥>@,Áá âÐc¨5ص¥“Ëcc8¢K¨8'Þ¥c÷îÛÑL…Ï4573•Q1 1= 44SMpìÝÄbÓC~s‘ÉåšÝ޾Š[î¼SGºy½0O,-ÕN²^75àrœaav‘Æú ,Ï\%fxØUçâ½cÝüþ×ï“pkm; …&yïHœ­ûîbàìQ"Rã){9­kÜABÅ Ä0Œ•®wb—çñx¤»­Iu}+‰Å×InöïïàÌÉSìºã~´Äçºû9øÅÏáôÔ`åÔ&–š§05Eo8Âÿø/¿Îö–‡@U¹rî†FFY Ź:0À´ä´'C ØB|òM"Ž:~ÿúÌ ]àZDáá‡îÀ´`¤ï/¾rˆö¶;xø+Ÿ§ïê"­-ÍÔúÜijÿôþ€‰ÙQ*Ý•d©ÀmŽ1›ªaóÆ ¯¼ý.·ì}¯}ã!ù®WûϱR¹xa€ºú ÔÖÔll¦¥k3ÍÞ§.Žrðþ]9rœæÎN‚µµ¸±èزKgѸqÕ>MØÌ> Ê(+¡bkyi¿Ïk/ëf3B‹-:Ä:Ý4M›‚Ϩã_ÿûÿ€ZZ¨8pïç$¬eàóÿ™ÿYvdy±ZAUïGQ4@8kÀ4Ø|ë|«¨ßøWHÈh™WnÞøo@q )е纀BÁ`ó-÷ñ¿ï¸K Ên;‘9_çn)E*R¸Ç2Da-ÓBU‚¦±0|™M{fcG zAGdíÜ/²3ÙM<èöát(lÝ}§«XÜvo^d†‰&a¹ lݹÇÉ»þáÜ`X”QVÂQ0§Ó)#_1o+§S×I'…J@|µlE´¹CÅ×—Û-uŠÐEH½=j¢¨²€a–j® ɦ!¶È¹†iŠ¢;.‘£¦Q„c†(i˜RætºdáÆ4¥Ìþy¤e‰¢4mÝ)ç‹®|åÜn`¢ëHœBË40§£t@d«Z‰«SÓÒîAå…Yõ´“ÇãgÉ…¹Yú.t“L&¥!™Ñ¹Ø{¥…EΞ<ÎðÈ5Î8Áä|ËÈsêèÆf–d¥3™ˆ]šáÔéóX˜\é=Ë™ž ö³séÂYz/ £ª&ýÅüØÔ<yΞ:Íüì8'Ïžáè‘·Y\N’IDç¹³LNMsêýÃŒN-`²œ=ñ>§ÎœãÜ™Óôï­ð —˜™Ûó]Ó0D‘Ê(ãæTBUµ—Ü=/^¯O# Ó$›I±¸0/ËÂátÉëX2‘*Ö%¹6F.›brzŽB.ÃüÌ,‰dZ”ïü¹stŸïÆÄ-Á1+|ÔÕ·Påu‘ͦ™ŸŸ#ŠŠ—ÅÄtñ¼XL®9?>©S§˜šcaq–x*ÅB1ïôVàÒÜ>¾Š jkªp¸=E¹ª«|$æŠízΓ)XDç…)®Œ2nv%,Ñ8Y\\âÅ_àСC„#qššZÄ‘råFºaHDc¨N7>O;·oÇë÷Ò¬b1´DmS3^§—ÛƒËá$ØÒAG{ è:é‚Aû†FâñXQF’šÚ:N–b 645–¢Öjì¸e][·ÒÕÙFmm#N·ƒÊªJBó“,Är8-]è=jž¹ùy4_%›7vâñøÙܹ[o¹•t$ŒÃãGÁ¢ŒßØk”¯Ë- KFÁ|>GEE%wÝ}P¢!Åâ œ­¨ˆ DbI{ Þ´TöÞ!”ƒ´¶4È‚EK±ªI¬ š[:múö»@U5)Ïæ YÔÀ2Ø´k?6RMõMvéMÛw—¼ìMûº–Q)ñò÷¸˜ÔÔÅg°Þí§¡¡QænwÜ}Í?²yKKÑÐ Ö=ÊŠW »`F%äHùòò²ôãÊÊJ”õ·E(@$ŽÍb’¹ Û݆¢¤YáT_?ádUQK*c­¢2”Òµiír»­-c¶¥¬õ!e(ø=Nvµ5"@Ú~Õ…%5kP`|X«ÊÊ2V·½12——ÕjE—.õ^^–ÿs0ØÀŽ;e¡ntt§¦ …ñø|Üyû>”õ¤„öœPl%ÝòÕ4U§[±ÛT(Á"- ++mF••‡Õ4Q«ÊlHÖºq’WÖ’a{‰ø4'• Ö'ÊP@‚žæu“ù¹Y’É8›6vJß›  ãZe…Ÿh4ÆæÍéíëÇíuByhC˜¸3Ù,ÇŽž¢¦¦šH4‚Û塵µ±d¸¬È1ŸÏ’Êäeô¼‰!Jè4 ÄbѲ5Ëú„MkèrûÈd3hª&ÛFª¦J].›%›Ëâq:$\BUe¥3™ôú <\ âù…/Ü/Jg˜U#PÏX«G&EŽ+Ç6;ca—[ÊŠbkE3¥ÔÆbmvÙG“*Ææ« ENI†"eöõV¹~Ûu$CÊÖ¡Œ•mQJobÈëçÂüK¡½•VS[‹®ëB›R[S-f•ÍÍMB…¸(m¸\.®MN0;7¿Ú=ˆ¥pXÖíÑe׿$3yŸ >9 B™'(ª ×®¾æõËË2~=2.M¶Ì¼>?[¶ngjrRŒ0vîÚ%F$–e󻙜œ`)Êê ïºpêX Ö2][¶Ê/ʽ¸\nû—¥£µY^EWürIæP1t‰,»’ì©“•S¶U‹=X­ŽO¡`IX6ä:b9c·AŽ7úZº®Q†üÏ%àPc£¤ì>ÙÐÐ Én¿½(‡(ãÁvâŸc.Cµ*k«©«­!“Œ“Êp¹B¢¤¨<¤rº¼&LŽQQ]ƒ¡ÔÔÖHxµË—¯lhÅåÖðy½X%­Ng2˜¹$)ËI•×-¿€ÙLŸÏÍÕ¡AÚ¶¬ñ yqŸ%ˆÒ}ÈrmÝ)á‡a,ð¸T†.õa).6oncàòeÚ[X^ŒR×X%0–©áUu2š‹wßÃÜÄ(©1S×Ù}ûBãÌÏ'˜Ÿ[Àé°Heó² Vl$›Jðú1ã™^GdV|¤ô<µ-[Ë!Ë(ã3ŶfZ&þª:vï܉åvbtüÞj<—8è¶wÔãVBóc,,ÆÅ¾±¹™h*-£¥ßë&ëà©°„1“7z½¤ij$x§‹B&…å„Ðâ2n§S,r¼~?ŠáÁ̧X\ÌÈ+«§¢’J¿W²Œ2>Jˆe¡:}ìÞwÇêÑ;®§‚ŒP~¿‹úvpim];hW°Ý¡|[vѾʼnª*¶¼•+7‚bG ½¾³qYËX·Jh»© 7 Ë\½Â%ù•ûÁ¦Ä¢þû…V~V°•L‘ÄuêV•) k¡Œ2Ôõ°Oèt¨(€×íàSůœ ©Œ2¤ßd^e”QFY Ë(£¬„e”QFY Ë(£¬„e”QFY Ë(£¬„e”QFY Ë(£¬„e”QFY Ë(£.Û4Å®ó7e”±>è-FGG9~ü¸éüæ Œ2„²Eú÷M¯„n·[q2™ÌªðÖ («\†ÖD¯‰ÅÀ”Ã'2¼^¯ôïuñ:Z($• :‰ÜrË-By±FHh›õÊörç3§¼ò½ C/EôUåy™¦¹ŠæH\k¤\UUL£ÀÌôµÁFÜÓöÔ6å¿Oײ>^G ÃX©„¢pýýý  iš ç_ÿú×mź5¹(í‰'ä¸oß>¡ $˜Ìg¢#) ŠQàýÃï°yß=´×ú8yª ˜†.±îMÕ‰[SˆÅ“ƒuÄqÈgè¿:Çþ½º©áqB&W‘±²¦N˜ÃËzø±”Pú÷zRBQ¨ùùy&''éêêbÓ¦Mœàº»èÍE‘3B¨ ÛïhRL·ÝENvãÆ ¯×‡[à3•Љžéc(ÁEÄ8„*š<>>ÚÜD¯ ÕdÂOÃÍÁWƒ=dfÂ5+3a &€Ã„q˜qVk„C'''˜LÖÅ ÷¼ßí 3ë­Q™Í=ÓÌ‚tw‘ÐQFÎ$Bè‘Õa0> Ã<Å&g&\¿2Y¤Q&Ȇ°Ç̾‡Ðb;}` ÞÔfxJL !÷†{ça¤#cÇY@}nóëë« ’i kææîãwãÜä\ަV¾ fVDÆ€»3‰„:å Ó oooE à“kPŒ± š³Bî÷q•Ta_â,†°ÖªáRª®‚ KÌý„-!<*%„(<.TI-ÐK|‰3@]^^–——spr¨=–6^¿:«b˜Z9ˆìƒ› CFŒ€Œ@4Y|A€p¤Kõ2Ô+ÉðL˜¼<¡spà%„G¥„@1#öÀDq%¾!9î!”Á2ôììL<ÀeõåLó ùrqqQ>??-˜h Îö¼õC˜JY$ÍZ ÁÕwæŠ#ñDÅËQèùù¹ÎKÓ²Ûí<@Œ × qu@¦RÆë¥Høõï ¶Ûm¹¹¹ù²íݱi…PÅñc†pk{;œA‡‡Ñ±³,­ìÄnrÚ¯‘‡!y1ç×x3ÀŸ|p¼Œ¸ ]…·®+®â27à#ÂiÎî*Vþض­ Ãt;Bâ·$ªªòš¦Áq&¦Î‡ˆ{õìû>ʲD]×Îü z#BãwîÜw&ŽHˆ:þüMîpƒ;º ±L ŽêÏ Ó8ap‹ÅâÀðè(oŸGüæ|7AæcŸDHÁæ[ãˆ&ô£0¸‡S—NRÖ×ÉÔJ;ŽFo›&÷òõkxJ°¶´H¹Ú —˰±¾FßÀµÍ5pR>t)" ½?Î|>ÏÍo$;HåGÒ ÃÿUxúôi² ±@Âó¿Zc0Ÿ`ÿYþïwÿ…þÜT‚¯üý¯òßþôß±x¥Ê¿ø‡_áÏÿý¿á«ðoÿäùÞw¾ÃÒêc´ÒÜ1Äݹðº&K!p¤ æ)T‡ÝFiP&Öf_«0«O) Û3ÀÈ@ÒôÒÍëüçï}7Ub|¤ÎŸÿ—?cp÷¦-¾÷ÿ²Tb¨¯ˆÞùUaìó.H)húvH, @(ÀèDJƒŽˆ–cr5 ¾ô¾)ë³++zJh¿E¥Ö ØÓƒ@±¼¼rc»„­Ùñˆ‰…Ñ¡hz¾ X‰Ìym¶‰Žk-¡ˆ¡ÖS*™m—BÁ5Þ¥R)̇¿ ÄB`$Rµé $ª AGzW˜^£”…Iš´Ö&ö}!e”Vt3ØR!‘RD’3–”¨0¯À÷Íö¶D,±ÀWŠZÓǶÚ%P(™ºôgJß-iIªë<÷ ŒMLñÛ7Nó©¿õižýëÇ)ôÑSêeb|”@Hi“J&X^¸ÌË¿}‹G~„‹s¯±Pn>MÉGî™åOþбÑ1c¶ø½¡¯˜1DÞ†ˆÇj Õ–ß&±@w! Æ j! ¶ã°Qk0aY$’i¶àÚâ2åzƒù·ßâ§?]ep¨ÄîGøè}Ç8sú§ßœç®#Ç–¤\o1^L R.Ÿ›#+ayN¾p’™ýÇ,åP*`"&Z³Q©áX¡‡2 D[ç½Æ@c6ðMPpÄZ_¾Ž-\iqäî£8ŽÃƒ7¤‘çÕð[>ùÞ5ŠÅ,›Kœzóû¦Ü’T6×xûüE†ÇgpdÀî=»Qõ Þ¾ü,+~–ûﻇR.µ]¥UL,¥a¢˜àÁA³ 4Ý¥—0Òjª?ôïâ'g"kz ”q¬#´ä&4]¨Ïp‡Ï|zÔ¤ß=3 „&&×ç?ûѵAà›ü¶%bbiJù ŸåöaJßññƒ èªË9¶e’0Š#h…ï+vbbEf?à= ÒÁÞ±æÒÄø€!E¨Æè­'V§;«QÈU´Kžö/]f£®øõ¥JH} úmñ@ƒŽòv ´Æ°êøD†RÚBé­'Vô¢µ ¯¼ü ý#“ÌL¡Û¶ÙX]¦R4äÒJ¡Â§A+Ã=iæHgR®ÂÆFø¾)!q;Jê`4[©dÒ¤ŒM̲mS†ÂeIçy)ͽºê021*PHKšcažæ¾¥q‹ZµŽ›LÛ€çûlkhxc~ƒkå&}ã•òá –ÖšT&C½Þ`yñ /ese‰d¶@"‘ä­s—™)±²Ñ ¿?K½\f×þ£ÌìG AÚ–<õ×ÁÐÈ K‹ dŠ%ú²)œtޱÑ!ξy†Þ¾Þî92˯Ÿ|†‹gÏsqq‘C‡1ØWä©§Ÿ¥o Ÿ /ã’L6ÁÆú:½½}¬/]å¥S§Ø;¹‹@A@¥Ñ"$Z@ÚǶñÕë¤sý\<ó:ûïæèžO?õŒ1ئ×yã¥5Òù¦§§Ée;CX'^óý€™Ý» Á¡ÙÄcÓH$î#‚hd±Ú»Ïœ“´n¢<ôèghµ3ÔJgΜãÐ]GÐ^‰ñqš›Uödd|ÅBžÑñ›¤Ë˜|ÿÉ0&‰†ß¢ÔÓ ÊããÿJZìÙ¿ŸR©KT«ÎÚFéé)f¦¿¯­–´hµš”k 6´¶ítN“ `&I&“tB-Ï£P( ¥èœfºÃS¾#ï.6Õ·žÆº#?ƒÎòD˜™¾EW Dùn)„À@ëRJ‘NgDkmˆdÛ¶ñãXYY¡·· "Pè0håÔZ›Ùµ°È¤S(éT*…{(et­×j¡´ ‘p',1ÇfºCCÔd2e\cÒ&/-qÒh4MžíämÔkX¶c¶-ËŠî ÀóZÆMÚ2û]‰:?j\7º¶;ÓmÆ÷}óaƒ ¸¹^¢YÝóŸø„Ùo6›æÀüü¼ 199y“|¡wªËÅK°¬$×"‘J²¾¶ÆÈÄ.›Ë4|°´Zq).W*¸¶e[ô PY_e³R$¾VLONps˱IçŠôå“\¾r [XhÀM%iÝ$¿eS©×Ù5½Ëøé7[-|¥IºƒÃl¬\§\­‘Ï—è+pñÒeC"!¤!ÿèÈ8+K (!ðZ Üdšñ‰I’®ý¾|äØò.­VË, pèÐ!²Ù,Õj­u;±ÌñPª!¥4×¥ÓiŠÅ*›5 -‹á‘ó|ÇSx-/ ‘L’šÀWF2å²9ZµMœ„"“΀8®K>Ÿ3’4•HÐj4±l—t2Áf¥j$S"‘@ IVZ¸Žc$n&—£Õláûž9—Ëç‘¶còAÂM˜{WB—jDZ)‹f„QS ²¹ ÇÙB©µ3%VD¤ññqW*µ§Í¹¶ªÄPͦ<44‚n«f"e'ÛYµo›0<:ÁHÇÊ^Ó33Qš ðéAÊ6%¤C·JŽvqÑÎÑ‹Žt³™Ý¹Î²Éæ2ÇxŸKJM®Ö ™Lƒîç:÷NDç¹nkô´ëT¦ÃFEG­»äß ëNœî÷³•ÐZ¨ˆeªKJ#ynqs]•ØÍÍM³ckU’\.gâ­&VDªÅù‹¼~ú÷ž8A.›Bket Û²£ÁŽmFØšsFQW‚L:R‘<Åb‘­CŒr¹ŒR*jo9±l)xñ7'¹ëø¼üâ3¬W=üêKëUÓz[Y]@D©:©lByT6Öš<ÀCœ ™´Ò2ócmbضmôÙMU¨´f×Ôož>¥¥iU îf4ÐxŒŒÝR’Kgß$SÌ3Ð?H}c +™C1âNè®# 9Îþ–‡e[ÑôÚ iW„ï9~—I®*Eàûèpâ4)!FL¬N=J†Ëó¢5AWg>Â8ÜAŒ˜X1bÄÄŠ+FL¬1bbň‰#&VŒ1±bÄÄŠëƒqÙˆ±åß`ǹ&÷cã1c«¹{ï(R òk×Zÿnç£;:]©¹ÍtÑö­Òvì ØQÄŠüÚýpY“T*”)-D¸<°" DËÍ©íNÂhld"‘0ÏïØ6žïß(Ó±/¥ æyµÆ’² QJƒ |4Dzڇ¨™÷ˆ@˜} Ê3Ü7eY–eâB,ó0žç100@­V7kò¼øÜ“¬T%÷;L£©˜˜bc}ƒFµF3Ðr)zzpm‰fCh^zñyMIyc™t.K¥R£ÔW`µÒ䳿ÿ V–®™‘<–åâ¸K€†plA&W$—I±´¼Ä¯~y’Ï}þo3÷ú¯‘™a¦<þäó$$kårýc|öã2?…T*IhtàñÖÜ)ú'fسËÌ­¿ˆIŸ¶˜5mh9¼vê š•:Ï=SÃkVñ¥Ko.Í©3gùg_ÿ—Œô·õ‚—RHj›U²¥Aæç×X¯6hV×Y)oÐßÓÃúúO<þ ** k¹œ»pщI†úÒ¼>w‘ÉÁ ûîåþ{4[hQ)’‰Ëå b0Ák/?¤Rl6“\½tŽ?û¯ÿÙÙiN¿:ÇÁc÷P°=N¾øããc$-Þ Ä²,Ë(ïW®\1ÕA!Ÿã#’l&M¥ZÇoù7âM6Ëet"E!é²ÿÀ#µ¶ûJõï“.˜Ü5A6ãÐÛ×ÏòÊ*½=y®¯T(²K=;p\Âevý.Û2„œÜµ—¤+)—«\[XÆ&f&©UËØn’œØ©_ùGÿ!]Ê«‹H7OïÀŸÿÃÏa[>#»He’ô”JÌ:¶½“Z…ýýý†TRJ3B9“Í£µ&™Ê„ºÕˆ‰A£5Ñ=Û^Ñ—6}ôa‚Àgdd­#££æ¹Æ&žçó™ÏÝ$DiÍÄÔd—¡j*Ô‘ú”f[ #/˜œœ4rÒŒ×4ç?ФQ ‚`K‰U[DëÐ÷<~—àûÞ-<ÏÓ·‘ßý8ðÞᇠ†;O,!µZÍÔå;˰Ckm&>ÉårwžXZkSp>Ÿç½£ûò¾1¶Æ‚®µŽ‚âŽW…QáŽãDÕ¢¹™ŽÑ9턱mÛ¢ôí°Vo…=‘H˜s£¬¢«Úò ÓDåh0é´Ö‘(ËŽfxi¿Bt70nc˜y.”RæÛ€ç·¸õz)¥8¼¥v,Sï7ë<ýäFÙ·gÚ´VZ^ „Œ–0ñ|Ÿr…ÞÞ"'ý<Ù|/×`lrštÂ1Dq]— ¼µ5ütšâð0 ×ÅÌ7ø,Ì_æÊâ 3{öM¹ÇF¥JÚM mCî 06+WÈ \_¸†ßo-ôRÙX¥opŒ\Úa™{ÕZ¡‰†ªÑh¶Ò&JlCrE]cæ½ pæÍ9\3ÉJ:e‡?;h­L Ø–ýTW¯^ų¶Bb%Ó#]*ü¯ÿñ?±\A"™Ækø\¹z]»FX^\CcñG_ú;œ™;Íôž\»|¿úË¿bjß,?xÂäq“ ++èJ'Ÿ'áX¼òêëÆˆwñìªMŸ—^|ŽRÿ–¥Y«ÕÈ[M_’M§hÖkŒM£ü€ó.ɱE“r½…_«Ò7<Æêʆ™?ëúÚÌ”H4,mnÒS̳¹²Îþ»àÄÝ{MklÛ!ªI`áÊ%Þ:ÙL‹ôÜK/“>5ÏÁMø¸žG¥QelÏÝ<|ÿQC&'œ>éC1)ˆÖ02>Žç¬­/Sêëe°vEŒO024FÙLOwßs‚b>‡…Âvôô•КÈú¾çØ1´Ræ¯Òbff†¥…ö<ÀÕ«‹ìß7mÊj5›Ì¤R8BPk4Ñ­ëd²Y¦ví¢ß,®(WêFbå‹}TÊëäò=Ø@©¯„/$CƒCؾÇüâ½èz7W Ô¶Ö¯…|žBÖ%‘éåþ±a.\¸ÀxÏ0ùŒæé§ÅÞ½é)dX¼¾ Š=EóÞ“ÉäVËÁÌ@˜Å¶…h­ÌÃíÙ»;²76kß¾˜¹¬FÆÛ綺›º½Q¯£µ6ÛZC:•frj!Å ÂL™sݶa_¢¦]w*( »ëb´/(e2 çãBt¨/nG´ë¼Ë+kŒOÎ ­áðìlÔ«ñÈ£Ÿ2-?´Æ÷|°´´d®ªÁ-6v|u[i;::#2™ª©ËÍľ}䊃¡IgR¦GåÚ5ÖW¬,­°û cØZÍkËWxþùW™=r”‘‚ÍéÓsz†é)8lnVÐõ¥q‹|Æeñ­«¦j¸ðö›Œ O1á¤Òh¯ÆØÞ±‹>gÈ]­ÖÐA aI®\¹ÌÉçŸA‘f×̯½úSÓüöÔfg÷Ñj6¨V1+fÕnŠUOÐjYT­,e_qaa•ÀÊrùò«MŸÅ·æÚw”ËçÎ3š$ëYx¾_;GÇ2zÀ±Až1ý¥ C|”z³ÅÆÞ½¤ % éžÒÆ'\ÁàßâÞ~BÜÿ‘‡>æº. L³Y­‘Íf8zì8~ PêcD>ä¡{Ž›Hû­†”ҫѨð胱Y­óù?ú2BHÜ„kº·Z^À‘£G‘–- ©Œ—‰y& ® ƒ‰2ÅŒ‹Ìö2Ùw/‹T&‡wb!žþÔ#Æ-Ńh!pÜMéÖf )Ò;k½Âñá~„À P ä×XµRfßêÒi=- »}U„Y]Bkmt ‡.H$"ÇÁ­„ûK“ɤQà…€ ™L ÑF‹:Õµ&ðZF_ uÁzK9Nø«4›×DB ½ B ˆ^$tK£•&?™Æ×ôÙ)Ê{W¿uÝŘz«Eºœ7ñvÀ{™c])‘lt¤Ÿw †°[anˆšç1>ÜFâ Pï§ÜûN,†h»Ùl*)¥Ù;Ú€#Z8ëæ7ïÆ…wG¬î(ÂpêÔ©g{ì±bOOOB)e aÂvEŒÎïH)ƒµµµæÍoÞÆÛ"™ýú‰èÈ0¸Áà³?ûÙÏþH À ó±þ_;篳6 Eq›ª3 ##Heeç%ø³1òˆƒž€‘1°ÀÀÄÜ…µ-$èö&:ºBGµU'ã+ñ%ùìDòOçZÎuXQ€õP媻ê¦ú¡ú‰óÆ1b 1XE …ÉPPþ¤Låé¬@‹;„1ÞÀÊhÌÁAȹÀƒÕëõÜáp† TvC¤?{˜<ÇJŽep¬;AÆÎ%€!ÇŽõ2×B •·ë8—ÀŠ,Œ©Átƒp ÂŽÅ©ÐÊ5Bލ ,vª `©"ˆÊP¿,¥C¨dˆÁj·Û¯Ü*g¨ž®}Eq8VŠð¸«®œ]Ëb°ºÝ®T«U¯[°B`U G75¨â+ÅpQZ ‚¥ì” ×±Z­–ìv;=ô”þT€ ò%XD ƒ…Sbþzoì¸ X£ÑÈéE¡tgÇÐÜ -Ž~À"))³_šc0XãñXŠ-\—Ë ,U!¹ˆàJPÑÂ8CFç f¤`çí+ù|î†Ã!Þ”ƒH¢˜æT±•‚Ç<,AÙRÉL¿ßwoÁÒétê‹…(\<¿‚‹©’S}’sI6Q¨d2™”ÌüQuÃl6“Õj嵑è¶ltˆ z…X)„ 6i4¢æãƒüMÙŒ5X.—n½^Ë~¿÷×ëU¤x¡J!üw­VsNGŠ´§“uQFþ½ÐO;0J·Û­?NN]L¾ëÖ#|›ÝŸÏçô±´s¦f³Y”I‹Ó¨×ëNÝI7n|+ש6›Sýß Ò¢ã0Ù)bŠãñåûÄo]©Ø-AòàIEND®B`‚transmission-2.92/macosx/TransmissionHelp/gfx/PaxHeaders.4960/fileselection.png0000644000000000000000000000013212442116630024570 xustar0030 mtime=1418239384.395590421 30 atime=1418239384.395590421 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/gfx/fileselection.png0000644000175000017500000002740512442116630026225 0ustar00mikedldmikedld00000000000000‰PNG  IHDR–—÷]¢G.ÌIDATxìVßOY¦}s›4Ùdÿ—&íSÿˆ}Þdßû¸»/MÔ¤Š-@ÅA…a`A°ü  U…ú#mL+‚ͦ@¿½sÓ»ir‰ó²o»_ν߹߹sN>n° øüùóÈÑÑу@ @ Øž!È8žg¹ÿñ„áÃCÌO–¯_¿ZB¡Ðý§OŸê’$affv‡“ã㘞ž†C`·Û)ŒœÕj…Ífƒƒœ±ÏP‚CÀ‹É°NYéšñLCÁïÇ¢i~¸†×9].8Nú·ï¢ckÚ£Û톋hL¾õþY“; Çss¡à×<ÇÃünsél9žEÃ;†‡ /ž²|ùòåÞÇxòäÉöíí-®ºW¨‰s8´Ž¡òjÞwл¹Á§OŸÐh4°··‡J¥‚óósôz=ÜôúÈURXɹàßPÛ/¡ÓÇõõõ0Ð:wìÍtôλêô®É÷—Þ ºÛÀéûSÔß½ÃM€A¿>Ó3ÜÞNOšÈmfQª¼Ež£ 9.Hì]£{uEö=œuÚøxù'noLGï k ÆS=®ˆÎ˜'«9 Ìû7‡é¬Íæl2[ –v‡áÃC†— OY...üHÈÒù‡¨¥Sèüò3°äBïÙ¯(:íèœ_PSår9\^^‚<{Èf³h·ÛØßkì7»´ /^GGqrÜÆñññP´Z-Ž»ëÜÉÉ å‡ïi¤ ëÖÁÆÆÆ±žÒ!GU,ùüPbü«¤ð*’™<:Ä ûû´§Ñî7 ÚmHe·ˆ†Z‹`]Q°&E Pbðú– %5x="Â?¦¦´OÏõ‹XY‘°° ’;Óðûƒ(ŠX½qy+‘(”¸ YŽajrJb>ß2t]G0@½qHfyÂõÃÀõú¯€Ÿ%㸵¹Ž>4†‡ /ž²H’tßb±üôøñãj³ÕBEOãò÷g@@Ä_£ ¼¸€úÁ!ªÕ*E·ÛÅÙÙ^õzµZ ÞÍ)”»!ä>.·á@}¯AP§¯[½N#Åîî.Û³ŽçrwŸ{[)âÅäKd²p >,z<Ŭ×eq‚[Dƒ˜*“NBŠÆP©½ÅÁáÂÞdrYN'f11eC2Ãü²âìkLÍ80?7ßÒ2\¯Ý¤žˆæQ aŸöéYÊÏ-/CpØ0¿àÇ#Âm‰ç£Ïá!µ'I½ÂN.§³³NøHÝWÖ ˆ«1ùÁо؞‚ç¿t¶{uþìpél¹úfºf³ ÃC†—¨§dY¦ÆzôèQµ\.#O S‰ÇÐQb¨Ë [[†‰(J¥’ñ’Ð_z±X48w°±Äfm åUlnë”Ïçóì˱8lMc¾ð½–ËQ>Ïë¶·rH$Ö‰¶UÕ %SÐTr\…#Ñegç í‡ÕO'Tlmç¡ÈQ¬E$¤´r›$uÙŒŽ0á’ëô´Nb ’Áv¾ˆ´–„¢$)¿žÒ EÂýô¿G‚ÔH¨ âjªCD’E¡."©iÐ62FŸÜ  \ÿ\Ï&³5åÿ¦³ Ž$†aPM©!Õ.ò9qÛ̾R!Ëу‘Œ0Þ•ôH_ë=ÏÀÐçwH‹¥òbÇñ½8|°Ç¼ö½Öž÷½ln xj÷"okUc/ó¾Ö.”8BuëìáhžðÙºÔ¢AÖxÞP>ÿ¸Lƒ˜ÄœSg|ò¢¶Ö§t£èb,ÅIž¾òdMP_ÌÉ3k/ÏœßãY‘œ"ߦ¿òk^Òàßðú¡ü¿ÜüµÑ¿®oÎMxeÞÌð¼µÜ¡\¬ó<¿Ïóø#ÓxÏ?å¶öËš}óÃ8ïæ}óù¾aóéÓß3¹ï9ÆM­aŸÌólßοémöOèk]Oìóý?;gþ嵿ñÿ#óÃü435Uù}êÞÊ2e%7“X¦Æ$7&¼1Qƒ *‚»\$Fƒ‹¢, È‚ È" Ⱦ4 44ÐÐ@³wÓ4tÝ,`¼•úÌy {„yaL*)ï8Åß:§ßç9Ï{Îó~ÏyŸóð„;Â! ±Þ{ï=Ý‚D÷›øÕØ„pG8´I¬Müýˆ5;;‹Ûµ—ªÿælb“X3 &óM]ýºû‡¹f„dk Òø/ÚÌÌ Q 2Ž)§úíRP:JOdÑu¹\JÿE›"?·§®ÍϹ±ON*[óÌxÚŠLAÚŠþJ}Vô˜u¹%I)2ÑÇ­ú öåþÒÎéœÆív©Ò)%S’ÄT×VO¹‡´—ħszFôľÔWì®ê¿Ü{Æõ[’‡.··Â´Ó!IPÑa~a^3)ÝnéÛŠÍù¹9¹Ÿô_~+Ý•ûÌÏωq:ÄŽøÚõúKm³M\ÚL|Eç Jš©lé¢Éh¦QMÐÜÕÇÄ„}åÁ+gõ¶Vàwà§Î›DgÏ(£½ "Î0«úBÈ^“‰)õ`íÖQÌÃJîdpp€á1+3S6Â.ŸåĉBoÅbŸr0¨ÚŽˆlz SO¯r¶r´ÝÂ÷G}¹t#š¦ºN>HpX,ã£øR\ÓIcI*!3§˜ûÑ·ð9p”'µz rîsä5m=,Í»HOˆd¿Ï^B¯Ç“Í_tz#·®]âð±S´tôa¦ß<ˆurÂÆ˜Õ†C‘¢¹®œïOOgk=ÇŽŸ$#û1‹‹ üxú4©Y•,-/±°¸Äø@'ÏcwN‘Crb$þþ?L»^µ=ø5ÇüHÎ(¦®"—cþ‡9zô$&!×kN,…Ò±EMÄ—¶WÒÂ]E¬¨‚"òuÜÎÓžWÏ­Ü:2+šWvó‹´>y€÷Ÿwàõoöú!æn<‡æÈ?îÆD²cç|±ï Ñ·ÙöñÇœåØ>o>ÿě̴$¾øâSÊÛzéªÌÅÛû‹K.¾Ý¹ÐËÁìöÚÁ!õ€C‚NðŸn#Q9þoKÓòú„À›\ :DĽLüí¡¹w”›þ¤å4P”|‘ϼwS_[Æ·ßî¦07ƒÃçBèëhbë¶?ñ¨®ƒgO—pNŒrÖÿ8% ÌNŽâ㳟„ø$|¿;Å£ÄòÝ—÷~vý5Ù•mÌ9ÆØãý…"DÓnJSns&ø2=~”OwîçVl2iÑa¼ÿoàJx*fSEE%Š˜}øxïàÚíX~¸‚÷Ç;˜tsç‡Ãøø)"Äb6²mÛ'|¾õ3ª C$_ÁçxòÇÒëM,ÙVfUµòÄh¡¼[A•Oº,wŒQÐ>Bž~˜œÖ!²Z†HT„³Œ3§ˆÕ\’ïÁ“LLMªY~ŒÓAì=rŠ£ösö\ A¡WùÖ÷§ŽòÛ¿$4$Œ÷Þù~§Î‘{ÐÐHú»õÜ‹¿Ë—_î$ïq._zyqërÑw9âwˆŸlÅë[âãÈÊ-¦¦¬ˆÿý-ŽÞG`ÐöíÝOψ• =ßp%"›ü„ø|÷JJ ñÝ÷ ƒƒº…AßÀþ=; ¾“HQiï^%ðÇhž.L³×ëO ÁÐ\Ǿ=¸pî$gÎå³Ý ðÝÇ™ꫪøæÓÙêuˆâ̶üq ¥µÍÜ äÔ_ƒøüë=ÜOàÀ®?sìt(ý½FJJJé§23†øÇ¥¶¹߯w—‘á½»TÖ? o¯íDE†³ë€?gŽúOÐñƒ\ Woñõ&–Óé [+·u˜ÇmÃä+ü7™šxØhæ~ƒ™ y]ÊksÖåbtÀ„¾ÍÈââ<µõuôŽPF~Aƒ}FšZÛ¨­k`dXÙyNye#Í Õ¤ßH‡AÁЃÑÐDmkú†rbbcih31ÐÓAgGõ :zU=%5êê —xw’U¥']×σF³‚©Ÿ4õ;µ®{µ½$ךH¬é%QKþº-ƒ– S–kOïR×\îyæ%.‘kç²°¸(º²êä¥ÇQP¥£­¶†‚Âzþöl‘¨«×iîÄ66À•søbhÜ!«ÏëâüMb͹f‰Î©àhl!'KœxêI+¥| !©E²äãr¹1v´p+$˜¤´,ç¦É|üˆ'Ù•îŽJ s8p޾QeÙé„G¦³¸¼D®Š{îDDrõêm®)Âõ;Kw¿×ì&±^«ø@÷óÏ?K²N–µUåÏ–šY$Ëú¹Ö§ØÜ‹ü´¼¤Ñõ¼JM&“$7ו[œËŒ8V`[~ÊèÌ2îy%S:«õ$*7FFF<¶^È_@ÝO#‰JÏ5®´§Ã)×4r)òåƒ<Àå¥ežF÷ÙÓeJëÚ /#ªÂº‘å ÏËøâNÒË $—÷ÊïuuˇhÐyöÓº¾ò$“åœä %NÕè¬öÕðððz¾’Rkßã§—ë ^ª+Ü­cIe «±àvÑbqñ]óßðï‚ }p¤åf»÷.¾8@áqÊ*(ýYâÝÜntq½ÌEò¸‹k5.ú-.-i/¤RG‰4¶$øwXÝL )>+õ uXÍSò›é ¥³Ö–dõ娚Ì|Ùhúå¹ÄW_}%ºÒF£'l~Qu 7 ÍÜ.D‹!Âòz)¬Ð1ë°ÓØ¢çf~÷ºº7÷R×l`aA{/ †åETTÁÁÁ„‡‡sïÞ½ç9C·ÆWr,OŽ`y|õª!Üýâ/Hg§œª\Ä«zá’Þ˃+us,Ì:5úòçY’e%YÏVª~š4«“;ÅN¢kœ„—MÓ?æ”l¿æ#á¡!úúú´¶”îäØ ƒsôµŽ‘•ÉPÛnvíŽE.gßd5’Y¿^V]&ÄWÞ_ñöÛoSSS#HdÈ'?•M\ÍëáfA/7?G 9ò˨ª©£[ÝSˆ–Ý.2nXN5më~#«§Rðóó#99YHOHHCƒCh|õ÷ßjShL*¢ü%m™-IP6»sàŸnÁáÌyÜN»F_–äöövqŒFætL“å ²ÀAD®ƒë)â˜Çåäð]i/3P^«ëÚr8§°Üä=,äô™“TèïvÉu® \Ùʬ^ïЄÇ1þþþ¼óÎ;ò€dÅ™3ÓNE¡Ù\Ë5rM‘㪔 Ws» »ß ò ¥[\RÊÃÜB~|¨WònÑ=´!4³ªúÉùi=H_e¥BÉÄÓEû÷ï§¶®V&‚ÆW²²k}õʰñaŠ-[¶è¤Ãrdz5“ã\z8É?Ÿƒð ØÿrJl8§l} äôz½s™Ýn#&mа¨I‹§¸}oŠ;StuÛÿ§®]°¥ز3fåÂ… ܹAØÕ0&§ì+rÛ]i/d—Y-í429pùÝwßñæ›oòÆoðÑGÉkG¦õ‡ºGNi—îë¹’Ù¾YBÓjéè005a%åQ)竹ò°Mä\Êh¦¼¶IÙÔŽOÈÏöíÛ9þ<»wïÆ××WÂú¾’UYë«—À&åo‡pG8´.±d0òºX Ûø8}ýÃDÚù£ÿSÞ=±ÄŤqFÕÇÇ×êzHyPžÌZ¹…‡96¢ãƉŒ')]•±6ºŒ²óY£+í%Ö‘xMcË#7 ¤¤¤È.”¤¤$ Ð¥]x[[›Ìj\Æ'[e>üðC¶nÝ*ÂÇÇGvX}ùCzvq5R…\VxQ¶p)¥†¸Œ‘i!D¨®®–‡¬• LÝ FU7bZ)L=™’"hllÜÈ–èHzC#åº:i/§¼…ˆÒf=;òÚ]… ï9`î'ýQ1qeœO¨Ð (¡œ³1%œ‰.!ð®Vg”¼”üâreÓ¼a¿el2qd’™µzûêC¸#Òë­·ÞÒ© ëB º»ŒRßÒV Ô+d ø½lyÆõ›ÑÖÞN“Þ@óï€öö—ûJ^qR¾Ìï_½Jxø"ä½4Ý /Öâü ߊÿÓ¶&'¼úñýnŽüªtƒ'%K¯,ÅëB–\YžWAô=¯¦ÿçØ„<ëÿbï¼~KÓü¼7¾ò¥/ Øþ Ø7s¿€Ç€ Ø^0¼^¬ÝÙLèAçêîʪ\¥œs–(*ç,‘”D*P¢D*PA ERÌç<>x±ª ªž­µ5Óz€‡'±Î¯¾ð~ï÷¾YÃí?Ñ»AÖÈÉ ß†Ö¦Š˜´æSÊú†ô]Äòû“àш¦•·–T«ß†ô5ìv…jåèøDŽi5Éd’—9;öb³9ðƒDãIÞ–LòóœíýcÞD*eÁf&q°ãfms%gݵIFQp»œØâÿeYpK&Y¶Ù𜠤,Ùm8–—Øólc±:Ȩ°¿½ÁêÖ>oFaÑfaÓs¨,9ììúðŸ“Qâ—‚gT%M0Ƴ±Ê¼m‘t&ÃÊ’û’8;ÙgÖ`ä"–ä*Ž<Ò*ZXÙˆn² ùho“£ñB©"%ÆÖÄ„Ìeh¬àþ½ûܸûHV¾ wé7ØÙ\[¢¼¢ ÷Þ!c}z–V7X2Ï28jfw}‘¾1tÕtŽQ\X€Åf¥­¹–Å «6#Cã¤U0µpëÁSNŽö)-ª¦¢´Œ­Ýå<â4pÆÍon2f°ÒÑÔ@EM5ú‘i ÃÜË+Eaű̌ðÕ_²±¹IUþSúú&¨©ª¦¸²Š‡ö† Ž \‹ó,¯¹X\߯é0kÏÉeb´‹/nßeÅ}ÄÁ†ƒOnÝ ª D}J«q¯,ÿ¢HûÜDg3µuMÂ2;έ¯ï04áàm‡ Ïî3¹àczᔿý8Ÿ¿ùõMTU}?„•í_…ö‡ ð=ýx­„cÉlLJ²Ìöwrtdz¶@ßà$•E…T×5Ð30ŒÙjEßÕdzgO˜œ³PW’G£® ËÄPˆ9ã,Sƒ½"ºÜª:Œ“¸œv†{¨­*¡A߇ÃjczjJÄÖÙ?I}u%E5ŸzùòãÏ1-¬’—ûœ®ÞQ&G:yðð“óKôw·SZÜ̲ÃÁöîuÕ$Uh©Ëãö“"µÕWå“_ÞÆÔ`;ßÜ»GSÇ0ó³F¦Fû)-)`rjšßò=cf6W­¹£s’àY€Ž.‡ÁˆL%Si\Öîç•“››Ga^.Ó3>|Lqþ3æ­VZ+Ë((* eh‡ÕHW÷¦y+Ã#SôM3?¤§¤¨BšÎ›_}‰/–æmØÚ RÞۈÎìáßÿç¿¡spéj&r]:3âÊ;–Xz·v<„<ËØúëX›Ñ1×QÉùÁk®ui³¨ªúÊ6»$™V^9–LĉÆ *²–O‘ãJ¥¸8?#yõ{k#¤Ói¹ÿì<„Ü“ŒK¤PÕŒüàd*E2—•D¨*áH@jÛ´J&-MAö™™tZÖùeH'$Ò]ˬ¹wPt:¥• éTšDãbø.7zØpo¿"¬sÿ1Ûž}|G^VV7PT8Úóptàè`ƒÃ#íy§œÏH+**[î bÉ §Ú}Ñ€vý—±8Û.vNPU…m·öyï€í-7óoæš`0DÃÀº¹5zl›ÔØX\ÙâM(*dÔwØÇòxvdäçtm²¾µÇÚ¦‡ÝƒSN}âå(f‡,ñÈ3³M ‡LLQÛô$®/û›kŒ ÑÛÝθaAš,«y^L=$3*žM'ÛÞ3DÐ>M/-UÌÛ×ùV®oݳà9çZ ‡.õ½17ˆ J*•’h¹###²ÕìZ2o¤(Ê+5֪ÄaÁÉ®{½£€8üm¯;Å{rGÛÎæ°Zæé”%`ÓcãâlgY\Àí\ÀáÜâB;·¬]·½çÕže#¡@èÔËìä3ÓòÚ´¸Ê5¼v,iµÉfñsÒ%>XZ‘}í¸Ì%eIÄcD.c¤ÒiÎu’¨Œ”Òâê'Hg9‹FH$Sd2d_üªãrþ2%žH¾Òy†/ˆˆw””¿æýÖÛ#£—?®‘Q³ª¾Âò‡"¸NI¤RüQqhÿà—;€{+ÈØÌ¿üä®´W‘ÈĸL…a‰ÿuv?žLÑ6½HÃä2æ5fV¶·»9ð‹ÝhqaN:òˆØE€M—wË5ÞÃ ÚÆw1l†™ÛŠð³ÿö+æ5¿aD˜!ßõWÜ_ù9ÉLü–䜹{÷®äK †"tί3å:bpqNë6µÓk8¶¹ ìòûß~Èê¶—ÅÙqt=ì®;¨®)¦¶¶ŠÑ)Õ5ÌÌÎÒÔ>ÀXw+£s²ìl»‰§Rlml¢€°u¬¸H§“Ú±u6·6Ùß÷%Q”ŒG×WœÜz=8×·ØßÙdÙµ…¢*¬9]PduÕ‰Ålå,ç§ÌÖN€Çmvþë/nñËœZþüÿÝ`Ô¸{EͦÐî¹Ï_Îý9ÿgTlüš´’úÁ…%I‡–—–8 G©_’hõ†ujf\.³à>%ƒi¸‹»÷K騭æ£ï0ÜÙHC}%%¥T–ÓZ[Î@WS\XÄßjqAW´ ~ï&M õ˜mfjëÚ‰¥¢ç>FFFY0™hmî`b¬Ÿf}ÑX ‡uÃì,úN=Áh’óÓíÚ1ì¶9º»‰Åãè[ÚÑëÚhik¡®ª÷Ÿ2›G<õó¾®äßþìpoØKç„›×QQÙ/ò¶Å–ÁòÙ$5ýà KÛ—uv€ëv›;îèÍÚÖÌVs®=R‘ Í UWÔRðä·î>ebh˜eû<&£‘éÁ^òŸßáî³bF& ORš›Gï„€Xäœå ¯û‚¯÷„}Ï633FN±[Äâ?5=Ãq0ÄŠv­Á8‡cy…” G»[2ó¿ã^ebÖ,.)«öe̳&,s&zºzÙ= ðSf{çâq7½»1:VŽ©_:c`j‰«ˆe¢üå_òµZË—ØÿQ;ï2Ôï5:ÐMZh7Ó>a¦MÛzŽü€*K®U“À«£ •U«…p" Y”Œ|çF—ÒÔe•,¯~]v~ìŸì+WwDžöGló6'ãF;“s‹LjÛ@àìêk•}ÞçtîçM‡þ¹Ì *ß—k®íX²¶M[î-S7š‹Œ¸Ñh†QyÀ÷âškË»ß'ËÕ³¡sÄ{ÔétJuû2ñhˆ5—‹”ÂwæÌw,©SâÑ©T†·EM'YYZÄwæÛψ'2¤1ÂÑKþ JŠp4ÆÕ¨ó=°ß§GG¨ò¨G'~²\F/He2éÑK’ m‹Ÿ\(*3rþIXbÛ $(ˆ,âÜÝÝaee™¡áaÆÇÇ_©¹šÊr(oÔáóŸH–øÏ. óóôöH¬…Á¡Lö5|;tv ˜™™¦¦,—);e%Üøì*+[9>=er¨Ûª›Ãí5zúú8 1ŒO°³çý8eyMb›NÏËý´ÕTҦ €ÅÅUúÚ;Øõž°±¼€qÞ‰¢"Tßþœ¼úºÊPÖÜÃ+¨–,&l‹[Ústww±êZÃâpb™™Âµ{ÌÆ¢•Á1#‘‹3ô-5<ÊmÀëv23oû·ÃØä,iÉäÐ0ÓF|‡ûtvöË¿ÍÔä'¾s,ÆÖ4˜ç,4U—SP­cÁ2G“~˜•æ­.Fô5¸Bø=vJ›ºXsÌQZ^Ï­[7)+o@¯ï`ç$ò¦þ«EQ¤õyoýð—|uó!ƒý­ìø/ ìØ)©íÒg¢¨¢–þꯩk£[׎7˜äe2™L6Áƒm~W*‚÷EX²:Çf5s§ •úê»ltJ,Mlr>˲ÍÄ‹çÏ©«oåÖ½Û<©¨âæý;ä•Ñ×ÓÁ¯nS]ÓB{S …ùèôzú'íX§úè˜Àl˜£­­ƒ`ví3LŒöPX˜Kee3C}8çhj¬æÁÝ{L <Ëy@kï(ºŽýg˜fLôè[()¯ ¬¤‚îîaff:»)yö€úV=—É´Œ@§ûõÔ”VPSUÏØØ$Ûž‰¸¹îäÅýÛtöÓ\ËÃEÔ5´Ñ?6Ç@[‹Š©«¬¡¤¬„¦ÚZß{À‹ªvjŠ )kìduÙÆÍ/¾drÌ„Íläã¯oPQUFcCEùô SWð„FýºJrŸ•ÒÑ=BGKÏŸRSÛLWߥϊûöŠs…›«•¢Â\JµçMÐÓ;DM]55%e”T4r “Eµgß±ˆ¡««Kb/\Eè<$AC´"÷ˆø~daI κÆþâþŸ4Z)½ù€ g¹Ù0‹qzâ•u‰áóǾ¨ þ@€D"Bw·ŽÓ³sü{kôöMK¤AIkÏ–ûÄK!“NIüøË˜xF ж8úÅú®fÒdä„CABá(éø%>T*-U}4v Àáþ>±dU‹½¸:§“1NOê¾‰ƒã*©TRŒ¬ñx‚DB+©4Éø%`ÛĨĢWþÑ$ôûI¤’±³¾“SâÉ4j*Áé©_Ò·œ…B$“ ‚'{šHz¹þ™"¿[U3y&•Vú}Ä“âÅA2ãä㢍â"³ÏO<‘tuÉtšhøLòí¨ªú.Õq.£ 8O¥_–¼›žž ¤õ‰¥åy ùMósóf Ù"«taíïï1<4Ìÿ®YàÃÎ%~5´Áχø¼uš±Á>ùžkÞ?¢’èBúU&“‰ì;¿ª¶·»—]å.­ýÑ…%ak,ósŸ$s¡žú$¾Üs™àšDXÒ J<~£ÑxÕ\¡Ø&í væLs̛汘-"®wÄ#UéUE™ô¹®yoç ¥Û¢y6dS _),犫Å*eѱ(5Ø»ð õ_QD\/wàÓé”ÄiH§ÄIÙÆâÚ6–ðòÈ0 Ë ~2“ø˜©Dö³8¦‘J%¥zÎ\ÛʾK•]u%-L¶µù¶Å,Z‘ÏïÊò.UãE^úË>>gÇ{Ø–ÖqÚe¹f㙞™f w‘±YT`wÓɬyHÈOow³CâlÕVV°²æ¢µ¡žY›“kþíXÙ9Â׊œ{¹)Œ†¸·<øŽ$¼¤ïØË¶gOå=ðJ3éÝÝfwï`ð€íZïÑ)¡³s<;xdÒI~¿ds¯»8ñ‡¸æOKXÒVKN+‡§ÿŸ]:¨ Ô¿çq3‚~! ±@,ÄB, ± ÄB,ı ±@,ÄB, ± ÄB,ı ±@,ÄB,xı ±@,ÄB, ± ÄB,ı ±@,ÄB, ± ÄB,ı ±à«öË¥Em0ŒÂÿÿŸHE JIŠÃt:t1j.&1w%:ƒ,Í=§=-… ™ŽïÀÇ.Lä}xs‚¢(‚¿AG®+MSl6› Ûíö­àõo]ùg±H–eI’`·Û½)‡Ã§Ó Çãñ¶ЕëÄ¢‰«Õ †aÀu]8Ž˲þÀ¶mž¯†išPU•÷pù#·„à ±8@ Ç1?CQ躆i›EY¢ë:”¿Î×NUUX¯×ÃPÈ5d±øøã¶`¦Ó)öû=dY†ïû:ÜÝ)ÐL›0ÂR_@Ót¼¤Xä~ä9^žŸQV ú Ë"·—kÀbQ ÀL&P¨ñx –‘>JpýêÓ uùÓg|}|À»÷0šãþ᪺EŸiÛ–[T qÈb±_±Ó4M–æÙlI’0Päß±4 ”U Ç´àø MƒºTqÿå‘B"ŠôÞ›çyCßX¢c±_ñu’ †áëžçÜ¿ÑPBv!ÔuÃïzƒ¿{>Ÿ¹5ùˆC°X¹Ø­¸8TžQñü¯ðÚ?Û³c ŒÂãV"‚HÀÆÎ[V {¡œÈÖÍ=¬½Šž óšôÓ%á/¾B,l³8Ëw‰JÓê—íKäÃÊ9ï{çyŠ„Ñ }ÂÚ¶-ñ°,ËÎBô8‘0Ú¡!Z¢)󿿪ëº>¥ô¬ëzu¯ ‘âV¢%š²ëºªa3›ÜìA"w7»‰–hÊüZÆJ)iǦmÛžQ$r£¢%š2_OÁ|Z1Âx%B;4DKx )ùzv¤IEND®B`‚transmission-2.92/macosx/TransmissionHelp/gfx/PaxHeaders.4960/TransmissionIcon.png0000644000000000000000000000013212442116630025245 xustar0030 mtime=1418239384.394590404 30 atime=1418239384.394590404 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/gfx/TransmissionIcon.png0000644000175000017500000000377112442116630026702 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzôÀIDATx^­W PÍ}þÙ¢òͶÌ._†ÕŒUƒiËe¶(ô•-ÚО8)tswÜ%$…’TJS‘°j³å‹èzq«#÷K¹†q½Œ>…êÝç÷úޱæÔ8æ™sœÿùÿÏû>Ïóþ~ "Ò æst¼xæÌÔB(£„ˆÝ#Dá!jþ+Ä«B5Ö×èú\ xxxtrppøÇ”)S’çÍ›÷l…‡ý[¡ !¨ï%À1 *.NÙnµM+”ååý}ýúõ¯—-[FaaaO¤¤±c)Jbà äøúF´›À!>ÁIˆ^ÁBìÚ,D£züxJOO§#GŽPII ]¸pNãsŠ\È$™-@vhh@» ŒBB¡Â7Iˆ×¹¿-Þ¡¥&$Ðõë×éáÇôêÕ+jhh Äž=yñ4`µï@zisS“¢]P•¬¼ûJ!2³p)ƒõe])X4f Õ××Óû÷ïéñãÇTTTD‡%tˆ”BàÞAö( q÷nF› ¸¹¹émQ(4ùàp{²8`fçÎTQQA‡¢íÛ·|AÓíìjÆè;ÉÂb›­m–ãO?©»wïþ»nݺµÚÙ-444?ÚÔ”µLb]@ !Ë—ÓªU«hþüùäããCîîîOñþÞÏÏfÏžÍßY[Yíòôôlºº:ëÚÚZJY³†vƒÀv €}çÎ ÁXÈÛÛ›¦NJÎÎÎäââBž*9::’««+ùûûËë-[·nuh³ûöí+š5ky7xã’‹-ŽB\²b‹¾þÏ;•J%ÉjÇGcCZ³z5åçç³4¨œð I°îܹsÆŸˆ‹‹˜% ÛšÚ×k¨™ÙŸúõ T*G•dfþõµO´—JõÆÃc:M›6.\È‹G4eNŸ>M˜ŽtöìYÚ´iÍù­K*•*Ò~"°dÉo0`øÖ‚‚‚Dß¾}ùsçΕ’’’•˜˜Ø,óAööö4qâDZ·nÁ°¼Hpp0?~œªªª$ž>èÀœ9s¸¸oB›ôë×Ï蟮®y!ëCxÑØØXÙr6t¥´´4ž†K—.¥ 6ÐŽ;èèÑ£TYYɨ(/§ŒŒ ^ÜËËK½wþüyC  ÊµZM+W®$èÍn¯®®¦ææfzþü9%''³ÛÑI†uOHØ-=À-++ã.à~îHHÄ766êD Ã7·¢E‹ÁH>´wï^:-ø§}¡ =z4íß¿Ÿ233™ÈpõååeTZZ* 0¡™3g’¯¯¯ôBKLL̘/^ˆ»wï [[Û¯P 6,|Á‚§ÜÜ\®úÍ›7ôáÃjjj¢Þ½{“……EEEQjj*ªO`iŽ;¦]\ îH°W°‹Ö^ºté÷DÄ)øª]»v5GÛë%µ˜ ÷îÝ£Г'Oä>À-ÆÌ ÀÀ@ §5ø RÁžølq-þÅ0H· …|›€“““]ŒÇì éÚµktóæMºuëÝ¿_v…ã@H mܸ‘õ†dL°F¬N:E'Oždû}Œf3:fýMYYYÂÄÄÄ ]hÆìtDŒ¡ÑHh®¦'NpQö:!õæä ºœ -öìÙ#‰òõ¹»_4hP§¯().p­ÑäI“«¤v3f¨äb\U9ªc—CëââbÊÉÉ‘:óe5¦áì–}úôáö_½z•®\¹B—/_&,)–PPp177W“ªU˜ššsŒghÍzbQÞ‚Öˆ¯aq–ÀÒÒ’òôéSyf`ÿܾ}›ä“””$}òA‚tñ˰9räˆÏC9PhyâÿÏËË£mÛ¶ƒ.ÍàÍÈlÀZ±bÏŒ·o¥—/_²yñ[6#dåɉNýR*ZÀˆÕÕÌL@[½áÇÇx}œé­]œe@îy@ÕÔÔÈÏ<1ÇÙÛsþµ/)Cdd$á,ÉPHÂcCCà ˜ß>c è9 š½Eä,ô則Ž.^¼ÈÉxöìÏíëÑ£G”-;ÄF]»v­ìLÃß,-téÒÅÆÊʪ£NÇòNˆdLÉ]€Ž0#W/SÁ»e›±ëñ;RD‡†dtàÀÂÜäâì|ÆÀÀ`:†‘ñ;w")t"€sŸø£‰É$§‰`¡zÞõ`"v9LÆ3û‚<)q S1š‘ÿè~£G‹aÎÞèkèL€ƒõÀIç¼·7w«ª Index

     
    Index
    transmission-2.92/macosx/TransmissionHelp/html/PaxHeaders.4960/scripts.html0000644000000000000000000000013212442116630023772 xustar0030 mtime=1418239384.819597687 30 atime=1418239384.819597687 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/html/scripts.html0000644000175000017500000000206212442116630025417 0ustar00mikedldmikedld00000000000000 Script Help

    Running Scripts

    Transmission can be set to invoke a script when downloads complete. The environment variables supported are:

    • TR_APP_VERSION
    • TR_TIME_LOCALTIME
    • TR_TORRENT_DIR
    • TR_TORRENT_HASH
    • TR_TORRENT_ID
    • TR_TORRENT_NAME

    More information is available on the Transmission wiki. transmission-2.92/macosx/TransmissionHelp/html/PaxHeaders.4960/peers.html0000644000000000000000000000013212442116630023421 xustar0030 mtime=1418239384.817597653 30 atime=1418239384.817597653 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/html/peers.html0000644000175000017500000000655012442116630025054 0ustar00mikedldmikedld00000000000000 Peers

    What is 'peer exchange'?

    Peer Exchange (PEX) is a method of discovering new peers via other peers, rather than the tracker. It allows Transmission to attach to the swarm much quicker. PEX is automatically disabled for privately tracked torrents. The feature is compatible with both Vuze and µTorrent peers.

    What is the 'distributed hash table'?

    The Distributed Hash Table (DHT) allows peers to be obtained without connecting to the tracker. This allows transfers to continue even if trackers are unreachable. It is another way that Transmission can attach to the swarm quicker. DHT is automatically disabled for privately tracked torrents.

    What is encryption?

    Transmission encrypts the connections it makes with other peers when necessary, using the RC4 cipher. The implementation is compatible with other clients such as Vuze and µTorrent. It is always enabled, however you can set Transmission (Preferences -> Peers) to prefer encrypted peers or to ignore unencrypted peers completely.

    Note that the latter option may make Transmission unconnectable in some swarms. The encryption feature does not mean your session is secure or anonymous, it is merely a way to avoid the traffic shaping measures some ISPs have implemented.

    What are 'connections'?

    Global maximum connections (Preferences -> Peers) is the total number of peers that Transmission will connect to across all of your transfers. Connections per torrent can also be adjusted here, as well as in the Inspector.

    It is recommended that these values are left at their default setting, as allowing too many connections will severely hinder web browsing and other online activities, as well as possibly crashing your router. Increase this value at your own risk!

    Recommended settings:

    • Global maximum connections: 200
    • Maximum connections for new transfers: 60

    What is a blocklist?

    Transmission can block specific peers by utilizing a blocklist. An internet address for a blocklist file containing a list of IP addresses can be entered (Preferences -> Peers) and configured to auto-update weekly. Blocklists can also be manually added into ~/Library/Application Support/Transmission.

    The internet address may be to a text file or compressed file. Most standard compression formats are supported, including ZIP.

    transmission-2.92/macosx/TransmissionHelp/html/PaxHeaders.4960/pffirewall.html0000644000000000000000000000013212442116630024436 xustar0030 mtime=1418239384.821597722 30 atime=1418239384.821597722 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/html/pffirewall.html0000644000175000017500000000242112442116630026062 0ustar00mikedldmikedld00000000000000 Configuring the Mac OS X Firewall

    Configuring the Mac OS X Firewall


    Upon opening Transmission for the first time, a Mac OS X dialog box should appear asking if you will allow Transmission to receive incoming connections. Click Accept.

    If this doesn't happen, you can add Transmission to the firewall manually:

    1. Open System Prefs -> Security -> Firewall. Make sure "Set access for specific services and applications" is selected.
    2. Click the "+" button and select Transmission from your Applications folder.
    3. Make sure the pull down menu is set to "Allow incoming connections".
    transmission-2.92/macosx/TransmissionHelp/html/PaxHeaders.4960/Speed.html0000644000000000000000000000013012442116630023341 xustar0029 mtime=1418239384.81859767 29 atime=1418239384.81859767 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/html/Speed.html0000644000175000017500000000433012442116630024770 0ustar00mikedldmikedld00000000000000 Maximizing your download speed

    How do I maximize my download speed?

    1. Make sure Transmission's port is forwarded. Port forwarding makes it easier for others to connect to you, which therefore increases your speed.

      If your router supports NAT-PMP, UPnP, or you have Apple AirPort, Transmission can do this automatically; just tick the checkbox in Preferences -> Network.

    2. Make sure you cap your upload speed, so that it isn't flooded. A good rule of thumb is about 60-70% of your maximum upload bandwidth. This can be adjusted in Preferences -> Bandwidth, or in real time using the Action menu.

      eg. If your upload connection is 256 Kilobits/sec, then you should cap it at 21 KB/sec ((256 / 8) * 0.66 = 21).

    3. Queue your transfers. Transmission's queue preferences are located in Transfers -> Management.

      Remember, your download speed is proportional to how fast you upload. If there are many transfers running, then each transfer will only receive a small proportion of your upload bandwidth, reducing their respective download speeds. To avoid spreading your upload too thinly, a good rule of thumb is to have at least 128 KBit/sec of upload bandwidth for every torrent you wish to run simultaneously.

      eg. If your upload bandwidth is 256 KBit/sec, then you should only have two (256/128 = 2) downloading transfers in the queue.

    transmission-2.92/macosx/TransmissionHelp/html/PaxHeaders.4960/usingt.html0000644000000000000000000000013212442116630023614 xustar0030 mtime=1418239384.820597704 30 atime=1418239384.820597704 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/html/usingt.html0000644000175000017500000000326412442116630025246 0ustar00mikedldmikedld00000000000000 Using Transmission

    Managing your transfers

    • Torrent files contain information about the actual file you want to download, and connect you to the swarm of peers sharing it.
    • Transmission can watch a certain folder (eg your Safari download folder) for torrent files and then open them automatically via Preferences -> Transfers -> General.
    • By default, Transmission deletes the original torrent file upon opening. If you remove a transfer, in order to resume it you will need to reopen the original torrent file in Transmission. Simply choose 'Save Torrent File As…' from the File menu before deletion to avoid having to download the torrent file again.
    • Once your download is complete, you can set a default ratio to automatically seed to, and then pause. This can be adjusted in Preferences -> Transfers -> Management, or in real time using the Action menu.
    • Both seeding and downloading transfers can be queued, and Transmission can skip over stalled transfers, in order to maximise queuing efficiency. Queuing can be configured in Preferences -> Transfers -> Management.
    transmission-2.92/macosx/TransmissionHelp/html/PaxHeaders.4960/gettingstarted.html0000644000000000000000000000013212442116630025333 xustar0030 mtime=1418239384.819597687 30 atime=1418239384.819597687 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/html/gettingstarted.html0000644000175000017500000001766112442116630026773 0ustar00mikedldmikedld00000000000000 Getting Started
    Transmission Icon  

    Welcome to Transmission!

    Transmission is a BitTorrent client. It is used for peer to peer filesharing over the internet. BitTorrent is a fast way of transferring files, because everyone who downloads must also upload to others. This means speeds are only limited by the number of people connected to a given torrent - the more people the better!

    How do I use it?

    Download your file's associated 'torrent file' (extension .torrent). These are commonly found at 'tracker' websites.

    Once you have the torrent file, drag it into Transmission - downloading should start immediately.

    You can pause and resume transfers at any time, so long as the files remain in your download folder.

    It is good etiquette to share or 'seed' the file for a while (ie leave it uploading) once your download is complete.

    You can use Transmission's action menu, the individual torrent menu, as well as the Inspector to adjust download and seeding preferences on the fly.


    Can I create my own torrents?

    Yes, you can share a file or folder by dragging it into Transmission. Alternatively, click 'Create' in the toolbar, and choose your file.

    When the dialog box appears, enter your tracker address (or addresses), comments, and private status.

    You can change the torrent filename, as well as where it will be saved to, by clicking 'Change'.

    Once you are done, click 'Create'. Transmission will automatically optimize the torrent file for what you are sharing.


    Can I schedule my transfers?

    Yes, by using 'Speed Limit Mode'. Simply go to Preferences -> Bandwidth, and then set both the speed you would like Transmission to be limited to, as well as the period of time you would like the limits applied.

    When Speed Limit Mode is enabled, the turtle will be illuminated in blue.


    Can I queue my transfers?

    Yes, you can queue seeding and/or downloading transfers via Preferences -> Transfers -> Management.

    The queue system is very simple: You start and pause transfers as usual, but if you're over the queue limit starting a transfer will instead make it "Waiting to download..."

    You can force a transfer to start by holding down option and clicking the orange resume button, or by using the Transfers menu item "Resume Selected Without Wait".


    How can I organize my torrents?

    Transmission allows you to sort your torrents by various criteria. Choose "Sort Transfers By" in the View menu, as well as the Action menu.

    You can also filter your torrents by their activity state. Simply enable the Filter bar in the View menu.

    Transmission allows you to group torrents by color labels. Groups can be assigned upon adding a transfer to the list by establishing rules in Preferences -> Groups. Groups can be manually changed with Transfers -> Group and by dragging transfers to different groups in the main window (when "Use Groups" is enabled in the View menu).

    These groups can be used as sorting and filtering criteria. Add, remove, and modify groups in Preferences -> Groups. Groups can also be used for choosing the data location when adding transfers - this location is also set in the Groups preference window tab.


    Where can I find more detailed information on my torrents?

    Click the Inspector icon, or simply double-click any transfer in the main window.

    The inspector gives you:

    • Statistics on the torrent and files you are downloading
    • Information about the peers and trackers you are connected to
    • Options to fine-tune your bandwidth allocation

    Can I choose to download specific files?

    Yes, either upon opening a torrent, or once it has started. When you open a multi-file torrent, a detailed Open window will appear, allowing you to select specific files.

    For transfers which are already running, double click them to open the Inspector, and then click the 'Files' tab. Simply check the boxes next to the files you want to download (the default is all of them). You can even set a priority (high, normal, or low) to each file, if you want some to finish faster than others. To do so, use the selector that appears next to the checkboxes.

    If the window doesn't appear when opening a torrent, ensure that "Display options window" is checked in Preferences -> Transfers -> Adding.


    transmission-2.92/macosx/TransmissionHelp/html/PaxHeaders.4960/check.html0000644000000000000000000000013212442116630023360 xustar0030 mtime=1418239384.817597653 30 atime=1418239384.817597653 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/html/check.html0000644000175000017500000000201712442116630025005 0ustar00mikedldmikedld00000000000000 Troubleshooting Manual Recheck

    How do I manually recheck my files?

    If Transmission crashes, you may want to manually recheck your files to both verify that the download has not been corrupted, and to ensure that the download continues where it left off, and does not start over.

    To do this:

    1. Select the relevant torrent.
    2. Go to the Transfers menu -> Verify Local Data.
    transmission-2.92/macosx/TransmissionHelp/html/PaxHeaders.4960/FAQ.html0000644000000000000000000000013012442116630022710 xustar0029 mtime=1418239384.81859767 29 atime=1418239384.81859767 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/html/FAQ.html0000644000175000017500000001302612442116630024341 0ustar00mikedldmikedld00000000000000 Frequently Asked Questions

    Why is my download so slow?

    Read these tips for maximizing your download speed.

    Some Internet Service Providers (ISPs) throttle peer-to-peer traffic, and even block it completely on well known peer-to-peer ports. If your ISP is listed on this page, it is likely you will experience these issues.

    Transmission's encryption feature may overcome some ISP throttling. Checking the 'Ignore unencrypted peers' box (Preferences -> Peers) also may improve your speed further, at the expense of losing some potential peers in the swarm. Changing the port Transmission uses may help if the ISP targets particular ports.

    Ultimately, the speed you get depends on the quality of the peers you are downloading from. If they have dial up connections, you are only going to be able to download at dial up speeds. Furthermore, if there are few seeds and many peers, more people will be fighting for the same scarce pieces which will slow things down. Best results are achieved when the torrent has more seeds than peers.

    Why isn't my torrent downloading at all?

    Often this is because the tracker is down, and thus Transmission is unable to interact with other peers. If this is the case, enabling DHT (trackerless torrents) (Preferences -> Peers) might help for public torrents.

    If there are no seeders in the swarm, and all the other peers have sent you what they have, you (and everyone else) will not be able to complete the download, and your speed will drop to zero.

    Torrents take a while to get going and so may not download much (if at all) initially. Most torrents are downloading at some rate after 15 or so minutes.

    Transmission crashed, what should I do?

    Post the crash log on the support forums so that the issue can be fixed as quickly as possible. Crash logs are held in ~/Library/Logs/CrashReporter/.

    If your torrents' progress are incorrect when you reopen Transmission (e.g. they are starting from 0%) then you should manually recheck them. Click here for instructions.

    What is Growl?

    Growl is a notification system. Lots of applications can interface with it.
    http://growl.info/

    What do the colors mean in the pieces box?

    Blue: we have this piece - lighter shades of blue (progress only) indicate incomplete pieces
    Green: connected peers have this piece (available only) - the darker the green, the more there are
    White: no connected peers have this piece (available) or we do not have any of this piece (progress)

    What are seeds/peers/leechers?

    Peers are people you are connected to. If they have the whole file and are only uploading, they are referred to as a 'seeder'. If they only have part of the torrent, and are downloading and uploading, they are referred to as a 'leecher'.

    What is the ratio shown during seeding?

    This shows your upload/download ratio. 1.00 means you have uploaded as much as you have downloaded, 2.00 means you have uploaded twice the amount you have downloaded, etc.

    What are 'Magnet links'?

    Magnet links contain a torrent's hash, or unique identifier, as well as a tracker address, allowing a torrent to be added without downloading a torrent file.

    What do the stats in the Activity tab of the Inspector mean?

    Have is the sum of verified and unverified data. The Verified amount, in brackets, is how much checksum-verified data you have downloaded.
    Downloaded is all the data you have downloaded.
    Uploaded is all of the data you have uploaded.
    Failed DL is data that failed our checksum test and needs to be downloaded again.
    Ratio is the ratio of download data to uploaded data.

    What does the 'Tracker' tab mean in the Inspector?

    See this page.

    What are 'nightlies'?

    Nightlies are releases on the bleeding edge of development. They normally contain new features and bugfixes, but are not officially supported (although you are more than welcome to discuss them on the Transmission forums). You can try one out here. transmission-2.92/macosx/TransmissionHelp/html/PaxHeaders.4960/portforward.html0000644000000000000000000000013212442116630024654 xustar0030 mtime=1418239384.820597704 30 atime=1418239384.820597704 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/html/portforward.html0000644000175000017500000000353212442116630026304 0ustar00mikedldmikedld00000000000000 Port Forwarding FAQ

    How do I Port Forward?

    If your router supports NAT-PMP, UPnP, or you have Apple AirPort, Transmission can map its port automatically. Most routers manufactured since 2001 have this feature.

    1. Open Transmission.
    2. Go to Preferences -> Network, and check 'Automatically map port'.
    3. If you get a green dot and 'Port is Open' then you have successfully port forwarded!
    4. If you get a red dot and the message 'Port is closed', click here.

    If you don't have a compatible router, it is simple to forward Transmission's port manually. For instructions click here.

    If you don't use a router, and your modem is directly connected to your computer, you'll need to open Transmission's port in the Mac OS X firewall. For instructions click here.

    Note: It is highly recommended you enable the Mac OS X firewall if you are not using a router.

    Keep in mind that many DSL modems also function as routers, so port forwarding may still be necessary, even though your computer is directly connected to the modem.

    transmission-2.92/macosx/TransmissionHelp/html/PaxHeaders.4960/tracker.html0000644000000000000000000000013212442116630023736 xustar0030 mtime=1418239384.821597722 30 atime=1418239384.821597722 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/html/tracker.html0000644000175000017500000000337312442116630025371 0ustar00mikedldmikedld00000000000000 Tracker Information

    Can I add and remove trackers in my torrents?

    Yes. To add trackers to a currently running torrent, go to Inspector -> Tracker, and click the plus button (+). To remove them, click minus button (-). Multiple trackers can also be added to torrent files you create. Each newly-added tracker will be placed in a new tier.

    What is 'Tier 1', 'Tier 2', etc?

    Transmission supports multitracker torrents. All of a given torrent's trackers are divided into 'Tiers'. A tracker from each tier will be contacted simultaneously. Transmission randomly chooses a tracker from each tier until it finds one that works.

    What does 'announce' mean?

    When Transmission announces, it is updating its presence to the tracker and asking for more peers. This happens periodically, at the discretion of the tracker, however can be manually invoked via Transfers menu >> Update Tracker.

    What does 'scrape' mean?

    Scraping the tracker simply means asking for information about the swarm itself. For example, the number of peers, seeds etc.

    transmission-2.92/macosx/TransmissionHelp/html/PaxHeaders.4960/network.html0000644000000000000000000000013212442116630023774 xustar0030 mtime=1418239384.820597704 30 atime=1418239384.820597704 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/html/network.html0000644000175000017500000000323512442116630025424 0ustar00mikedldmikedld00000000000000 Network Help

    What is the 'Micro Transport Protocol'?

    The Micro Transport Protocol (µTP) is a protocol designed to reduce latency and network congestion. Transfers are automatically slowed down when they are interfering with other applications. This feature is compatible with all other µTP-compatible clients.

    Why do I see a red dot and 'Port is closed'?

    You haven't port forwarded correctly. Port forwarding opens a port in your firewall or router so that incoming connections from the outside world can be made with Transmission. If the port is forwarded, other people in the torrent can see you, thus increasing your potential number of connections, which more importantly, might increase the speed of your download.

    You need to port forward if you share your internet connection with a router, or if your broadband modem is a router itself. In most cases Transmission can do this automatically, see this page for instructions on port forwarding. transmission-2.92/macosx/TransmissionHelp/html/PaxHeaders.4960/pfrouter.html0000644000000000000000000000013012442116630024147 xustar0029 mtime=1418239384.81859767 29 atime=1418239384.81859767 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/html/pfrouter.html0000644000175000017500000001076712442116630025611 0ustar00mikedldmikedld00000000000000 Port Forwarding a Router

    Port Forwarding a Router

    If you are using a router, it is probably OK to disable the OS X firewall, as you are already being protected by the router. To disable the firewall, open System Prefs -> Security -> Firewall. Click Stop.

    To forward a port in your router manually:

    1. Find out what your IP address is. You can find your computer's IP address by going to System Prefs -> Network, double-clicking on your connection (for instance, Built-in Ethernet), and clicking the TCP/IP tab. It's probably something like 192.168.1.100, or 10.0.1.2.
    2. Open Transmission, go to preferences, and enter a number for the port. It is recommended you pick a random number between 49152 and 65535. Let's use 50001 for now. Then quit Transmission.
    3. Go into your router configuration screen. Normally this is done via your web browser using the address 192.168.0.1 etc.
      Note: Apple's AirPort uses an application called 'AirPort Utility' to configure it.
    4. Find the port forwarding (sometimes called port mapping) screen. While the page will be different for each router generally you will enter something similar to the following:
      • For 'Application' type 'Trans'.
      • For 'Start Port' and 'End Port' type in the port you chose in Step 2. eg 50001.
      • For Protocol, choose Both.
      • For IP address, type in your IP address you found in Step 1. eg 10.0.1.2.
      • Check Enable.
      • Click save settings.

    For more comprehensive instructions specific to your router, click here and choose your router from the list.

    If you find yourself having to change your router settings all the time, a static IP address might be beneficial.

    What is a static IP?

    A static IP is when your computer is assigned an IP address which does not change. This can be helpful if you have a laptop or have multiple computers on your network. While it makes things a bit simpler, you don't have to have a static IP for BitTorrent or Port Forwarding to work.

    A dynamic IP address assigned by your wireless router for example will most likely not change unless you reboot your computer, or leave and rejoin the network. Thus, having a static IP isn't really necessary, especially if your router supports UPnP.

    How do I get a static IP address?

    1. Go to System Prefs -> Network, double-click on your connection (for instance, Built-in Ethernet), and click the TCP/IP tab.
    2. Write down the IP, Subnet Mask and Router addresses.
    3. Go to your router 'status' page via your web browser (AirPort Admin Utility if you are using an AirPort BS), and write down the DNS Server addresses. Alternatively, you can enter your router's internal IP (e.g. 192.168.0.1). This is sometimes quicker, as it refers to the router instead of the server.
    4. Then, return to the TCP/IP page in System Prefs.
    5. Choose "Manually" from the Configure IPv4 drop down menu.
    6. Enter the IP address you wish to have, eg 192.168.0.100, or 10.0.1.100. It should be of a similar format to the IP address you found in step 2, with only the last number changing.
      Note: You cannot have a static IP address that's within the DHCP range. Thus it is recommended that you make the last digit of your address large enough to discount this possibility, like we have done in our examples.
    7. Fill in the other boxes using the addresses you wrote down in steps 2 and 3.
    8. Click 'Apply Now'.
    transmission-2.92/macosx/TransmissionHelp/html/PaxHeaders.4960/troubleshoot.html0000644000000000000000000000013212442116630025034 xustar0030 mtime=1418239384.820597704 30 atime=1418239384.820597704 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/html/troubleshoot.html0000644000175000017500000000711212442116630026462 0ustar00mikedldmikedld00000000000000 Troubleshooting a Closed port

    I cannot get Transmission's port to open!

    If your port is still not open, even after you have enabled automatic port forwarding, here are some tips you can use which may get it working.

    If you are still having problems, open the Message Log (in the Window menu) and post the debug output on the support forums.

    1. Pause your torrents
    2. Clear the log and set it to 'Debug'
    3. Toggle "Automatically map port" in Network Preferences
    4. Post the resultant output

    UPnP

    For UPnP compatible routers, make sure:

    • UPnP is enabled. Consult your router's documentation for instructions. If your router doesn't support UPnP, you will have to forward manually.
    • DMZ mode is disabled.
    • The port has not already been forwarded manually.

    AirPort

    If you have an Apple AirPort, make sure NAT-PMP is enabled.

    1. Open AirPort Utility (located in /Applications/Utilities)
    2. Select your base station, and then choose Manual Setup from the Base Station menu. Enter the base station password if necessary.
    3. Click Internet in the toolbar, and then check the "Enable NAT Port Mapping Protocol" checkbox.
    4. Click "Update".

    Double NAT

    Another possible reason your port remains closed could be because your router is not the only device on the network which needs to be configured.

    For example, your network might resemble the following: ADSL modem/router --> AirPort extreme --> MacBook.

    If you have multiple routers in your home network (such as in the example above), you have two options. The easiest way is to turn one of the routers into 'Bridge mode' which means you then only have to configure one device rather than all of them. So, in our above example, we would set the AirPort extreme to 'Bridge'. See your router's help documentation for instructions.

    The second way is to map Transmission's port on all of the devices on your network. Transmission can only automatically port map the router the computer is directly connected to. Any others in between this router and your modem will have to be forwarded manually. For detailed instructions, click here.

    Finally make sure the OS X firewall is either disabled, or you have allowed Transmission's port. The firewall can cause the port to remain closed, even if it has been successfully mapped by the router(s). transmission-2.92/macosx/TransmissionHelp/html/PaxHeaders.4960/remote.html0000644000000000000000000000013212442116630023576 xustar0030 mtime=1418239384.821597722 30 atime=1418239384.821597722 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/html/remote.html0000644000175000017500000000334112442116630025224 0ustar00mikedldmikedld00000000000000 Remote Help

    What is remote access?

    Transmission has a web interface which can be used to monitor and manage your transfers over the internet. Other applications, such as transmission-remote, can also control Transmission. If you want to use the web interface, or another remote control application, check 'Enable remote access'. Leave this option unchecked if you are only going to be managing your transfers on your local machine.

    For security purposes, you can password protect access to Transmission, as well as restrict access to a trusted list of external IP addresses. To add an address to the list, click the + button.

    You can view the web interface on your local computer by clicking the 'Launch web interface' button. To view it on a remote location:

    1. Open your web browser
    2. In the address bar, enter "http://localip:port/transmission/web/", where:
      • localip is the IP address of the computer Transmission is running on.
      • port is the port specified in Preferences -> Remote.
    transmission-2.92/macosx/TransmissionHelp/PaxHeaders.4960/styles0000644000000000000000000000013112442116626021723 xustar0030 mtime=1418239382.265553918 29 atime=1418239382.26155385 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/styles/0000755000175000017500000000000012442116626023426 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/TransmissionHelp/styles/PaxHeaders.4960/TransIndex.css0000644000000000000000000000013112442116626024571 xustar0030 mtime=1418239382.264553901 30 atime=1418239382.264553901 29 ctime=1457295922.57785174 transmission-2.92/macosx/TransmissionHelp/styles/TransIndex.css0000644000175000017500000000242312442116626026220 0ustar00mikedldmikedld00000000000000/* */ body { color: #000; background-color: #fff; margin: 0 } a { color: #00f; font-family: Lucida Grande, Arial, sans-serif; text-decoration: none } h1 { color: #000; font-size: 18pt; font-family: Lucida Grande, Arial, sans-serif; font-weight: 500; letter-spacing: -1pt; padding-top: 12px } h2 { color: #000; font-size: 11pt; font-family: "Lucida Grande", Arial, sans-serif; font-weight: 300; margin-top: 16px } h4 { color: #000; font-size: 8pt; font-family: "Lucida Grande", Arial, sans-serif; font-weight: 300; margin-top: 21px } p { font-size: 9pt; font-family: Lucida Grande, Arial, sans-serif; margin-top: -10px; margin-left: 0 } a:hover { text-decoration: underline } #contentleft { margin-top: 38px; width: 235px; float: left } #contentcenter { margin-top: 2px; padding: 0; width: 18px; float: left } #contentright { margin-top: 18px; padding-left: 30px; width: 210px; height: 300px; float: left; border-left: 1px solid #808080 } #frame { text-align: left; margin-top: 12px; margin-right: auto; margin-left: auto; width: 500px } .space17 { padding-top: 17px } .smlapp { height: 275px } .utility { margin-top: 6px; margin-bottom: 24px } .icon { margin-bottom: -2px } transmission-2.92/macosx/TransmissionHelp/styles/PaxHeaders.4960/TransBody.css0000644000000000000000000000013212442116626024420 xustar0030 mtime=1418239382.265553918 30 atime=1418239382.265553918 30 ctime=1457295922.578851757 transmission-2.92/macosx/TransmissionHelp/styles/TransBody.css0000644000175000017500000000637612442116626026061 0ustar00mikedldmikedld00000000000000 /* */ body { margin: 2px 12px 12px } h1 { font-size: 11pt; font-family: "Lucida Grande", Arial, sans-serif; margin-bottom: 0 } h2 { font-size: 9pt; font-family: "Lucida Grande", Arial, sans-serif; margin-top: 0; margin-bottom: -10px } h3 { font-size: 9pt; font-family: "Lucida Grande", Arial, sans-serif; font-weight: bold; margin-top: -4px; margin-bottom: -4px } p { font-size: 9pt; font-family: "Lucida Grande", Arial, sans-serif; line-height: 12pt; text-decoration: none } ol { font-size: 9pt; font-family: "Lucida Grande", Arial, sans-serif; line-height: 12pt; list-style-position: outside; margin-top: 12px; margin-bottom: 12px; margin-left: -18px; padding-left: 40px } ol li { margin-top: 6px; margin-bottom: 6px } ol p { margin-top: 6px; margin-bottom: 6px } ul { font-size: 9pt; font-family: "Lucida Grande", Arial, sans-serif; line-height: 12pt; list-style-type: round; list-style-position: outside; margin-top: 12px; margin-bottom: 12px; margin-left: -24px; padding-left: 40px } ul li { margin-top: 6px; margin-bottom: 6px } ul p { margin-top: 6px; margin-bottom: 6px } a { color: #00f; font-size: 9pt; font-family: "Lucida Grande", Arial, sans-serif; line-height: 12pt; text-decoration: none } a:hover { color: #00f; font-family: "Lucida Grande", Arial, sans-serif; text-decoration: underline } hr { text-decoration: none; border: solid 1px #bfbfbf } td { padding: 6px } #banner { background-color: #f2f2f2; background-repeat: no-repeat; padding: -2px 6px 0; position: fixed; top: 0; left: 0; width: 100%; height: 1.2em; float: left; border-bottom: 1px solid #bfbfbf } #caticon { margin-bottom: -3px; float: left } #pagetitle { margin-top: 12px; margin-bottom: -3px; width: 88%; border: solid 1px #fff } #mainbox { margin-top: 9px; padding-right: 6px } #taskbox { background-color: #e6edff; list-style-type: decimal; list-style-position: outside; margin: 12px 0; padding: 2px 12px; border: solid 1px #bfbfbf } #taskbox h2 { margin-top: 8px; margin-bottom: -4px } #machelp { position: absolute; top: 2px; left: 10px } #index { background-color: #f2f2f2; padding-top: 2px; padding-right: 25px; top: 2px; right: 12px; width: auto; float: right } #next { position: absolute; top: 49px; left: 88% } #asindent { margin-left: 22px; font-size: 9pt; font-family: Verdana, Courier, sans-serif; } .bread { color: #00f; font-size: 8pt; margin: -9px 0 -6px } .leftborder { color: #00f; font-size: 8pt; margin: -9px 0 -6px; padding-top: 24px; padding-bottom: 3px; padding-left: 8px; border-left: 1px solid #bfbfbf } .mult { margin-top: -8px } .blue { background-color: #e6edff; margin-top: -3px; margin-bottom: -3px; padding-top: -3px; padding-bottom: -3px } .rules { border-bottom: 1px dotted #ccc } .dots { border: dotted 1px #ccc } .seealso { margin-top: 4px; margin-bottom: 4px } code { color: black; font-size: 9pt; font-family: Verdana, Courier, sans-serif; } transmission-2.92/macosx/TransmissionHelp/styles/PaxHeaders.4960/task_style.css0000644000000000000000000000013112442116626024674 xustar0030 mtime=1418239382.264553901 30 atime=1418239382.264553901 29 ctime=1457295922.57785174 transmission-2.92/macosx/TransmissionHelp/styles/task_style.css0000644000175000017500000000460312442116626026325 0ustar00mikedldmikedld00000000000000/*Tiger Mac Help task_style.css v2.0f*/ /**/ body{margin:2px 12px 12px;font-family:"Lucida Grande","Helvetica Neue",sans-serif;} h1{font-size:11pt;margin-bottom:0} h2{font-size:9pt;margin-top:0;margin-bottom:-10px} h3{font-size:9pt;font-weight:bold;margin-top:-4px;margin-bottom:-4px} p{font-size:9pt;line-height:12pt;text-decoration:none} ol{font-size:9pt;line-height:12pt;list-style-position:outside;margin-top:12px;margin-bottom:12px;margin-left:-18px;padding-left:40px} ol li{margin-top:6px;margin-bottom:6px} ol p{margin-top:6px;margin-bottom:6px} ul{font-size:9pt;line-height:12pt;list-style-type:round;list-style-position:outside;margin-top:12px;margin-bottom:12px;margin-left:-24px;padding-left:40px} ul li{margin-top:6px;margin-bottom:6px} ul p{margin-top:6px;margin-bottom:6px} a{color:#00f;font-size:9pt;line-height:12pt;text-decoration:none} a:hover{color:#00f;text-decoration:underline} hr{text-decoration:none;border:solid 1px #bfbfbf} td{padding:6px} #banner{background-color:#f2f2f2;background-repeat:no-repeat;padding:-2px 6px 0;position:fixed;top:0;left:0;width:100%;height:1.2em;float:left;border-bottom:1px solid #bfbfbf} #caticon{margin-bottom:-3px;float:left} #pagetitle{margin-top:12px;margin-bottom:-3px;width:88%;border:solid 1px #fff} #mainbox{margin-top:36px;padding-right:6px} #taskbox{background-color:#e6edff;list-style-type:decimal;list-style-position:outside;margin:12px 0;padding:2px 12px;border:solid 1px #bfbfbf} #taskboxh2{margin-top:8px;margin-bottom:-4px} #machelp{position:absolute;top:2px;left:10px} #index{background-color:#f2f2f2;padding-top:2px;padding-right:25px;top:2px;right:12px;width:auto;float:right} #next{position:absolute;top:49px;left:88%} #asindent{margin-left:22px;font-size:9pt;font-family:Verdana,Courier,sans-serif;} .bread{color:#00f;font-size:8pt;margin:-9px 0 -6px} .leftborder{color:#00f;font-size:8pt;margin:-9px 0 -6px;padding-top:24px;padding-bottom:3px;padding-left:8px;border-left:1px solid #bfbfbf} .mult{margin-top:-8px} .blue{background-color:#e6edff;margin-top:-3px;margin-bottom:-3px;padding-top:-3px;padding-bottom:-3px} .rules{border-bottom:1px dotted #ccc} .dots{border:dotted 1px #ccc} .seealso{margin-top:4px;margin-bottom:4px} code{color:black;font-size:9pt;font-family:Verdana,Courier,sans-serif;} .ext_link{background:url(../gfx/ExternalLink.gif)left center no-repeat;padding:2px 0 0 16px;}transmission-2.92/macosx/TransmissionHelp/styles/PaxHeaders.4960/indexpage.css0000644000000000000000000000013112442116626024456 xustar0030 mtime=1418239382.264553901 30 atime=1418239382.264553901 29 ctime=1457295922.57785174 transmission-2.92/macosx/TransmissionHelp/styles/indexpage.css0000644000175000017500000000360312442116626026106 0ustar00mikedldmikedld00000000000000/* Tiger index.css v1.0e*/ /* */ body { margin: 2px 12px 12px } h1 { font-size: 11pt; font-family: Lucida Grande, Arial, sans-serif; margin-bottom: 0 } p { font-size: 9pt; font-family: "Lucida Grande", Arial, sans-serif; line-height: 12pt; text-decoration: none } a { color: #00f; font-size: 9pt; font-family: "Lucida Grande", Arial, sans-serif; line-height: 12pt; text-decoration: none } a:hover { color: #00f; text-decoration: underline } #letters { background-color: #fff; padding-top: 1px; padding-bottom: 0; padding-left: 12px; position: fixed; z-index: 1; top: 1.2em; right: 0; left: 0; width: 1000px; height: 1.2em; float: left; border-top: 1px solid #bfbfbf; border-bottom: 1px solid #bfbfbf } #terms { position: absolute; top: 3em; width: 470px } #banner { background-color: #f2f2f2; background-repeat: no-repeat; padding: -2px 6px 0; position: fixed; z-index: 1; top: 0; left: 0; width: 100%; height: 1.2em; float: left; border-bottom: 1px solid #bfbfbf } #machelp { position: absolute; top: 2px; left: 10px } #index { padding-right: 25px; position: absolute; top: 2px; left: 85% } #mainbox { margin-top: 36px; padding-right: 6px } .seealso { color: #5c5c5c; text-decoration: none } .select { color: #00f; font-size: 10pt; background-color: #ff9f00; margin-right: -1px; margin-left: -1px; padding: 2px 2px 3px } .letter { color: #00f; font-size: 10pt; margin-right: 1px; margin-left: 1px } .leftborder { color: #00f; font-size: 8pt; margin: -9px 0 -6px; padding-top: 2px; padding-bottom: 3px; padding-left: 8px; border-left: 1px solid #bfbfbf} tr { margin-top: 12px; margin-bottom: 12px } td { padding: 3px; border-bottom: 1px solid #eee} table { margin-bottom: 12px; border-style: dotted; border-color: #bfbfbf} .bread { color: #00f; font-size: 8pt; margin: -9px 0 -6px } transmission-2.92/macosx/TransmissionHelp/PaxHeaders.4960/index.html0000644000000000000000000000013112442116630022445 xustar0030 mtime=1418239384.823597756 30 atime=1418239384.823597756 29 ctime=1457295922.57785174 transmission-2.92/macosx/TransmissionHelp/index.html0000644000175000017500000000305712442116630024100 0ustar00mikedldmikedld00000000000000 Transmission Help transmission-2.92/macosx/PaxHeaders.4960/TorrentGroup.h0000644000000000000000000000013212442116666020003 xustar0030 mtime=1418239414.193101057 30 atime=1418239414.193101057 30 ctime=1457295923.575868712 transmission-2.92/macosx/TorrentGroup.h0000644000175000017500000000323512442116666021433 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: TorrentGroup.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface TorrentGroup : NSObject { NSInteger fGroup; NSMutableArray * fTorrents; } - (id) initWithGroup: (NSInteger) group; - (NSInteger) groupIndex; - (NSInteger) groupOrderValue; - (NSMutableArray *) torrents; - (CGFloat) ratio; - (CGFloat) uploadRate; - (CGFloat) downloadRate; @end transmission-2.92/macosx/PaxHeaders.4960/GroupsPrefsController.h0000644000000000000000000000013212666747213021662 xustar0030 mtime=1457245835.380999764 30 atime=1457245835.380999764 30 ctime=1457295923.194862233 transmission-2.92/macosx/GroupsPrefsController.h0000644000175000017500000000446612666747213023321 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: GroupsPrefsController.h 14699 2016-03-02 07:55:37Z mikedld $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface GroupsPrefsController : NSObject { IBOutlet NSTableView * fTableView; IBOutlet NSSegmentedControl * fAddRemoveControl; IBOutlet NSColorWell * fSelectedColorView; IBOutlet NSTextField * fSelectedColorNameField; IBOutlet NSButton * fCustomLocationEnableCheck; IBOutlet NSPopUpButton * fCustomLocationPopUp; IBOutlet NSButton * fAutoAssignRulesEnableCheck; IBOutlet NSButton * fAutoAssignRulesEditButton; IBOutlet NSWindow * fGroupRulesSheetWindow; IBOutlet NSPredicateEditor * fRuleEditor; IBOutlet NSLayoutConstraint * fRuleEditorHeightConstraint; } - (void) addRemoveGroup: (id) sender; - (IBAction) toggleUseCustomDownloadLocation: (id) sender; - (IBAction) customDownloadLocationSheetShow: (id) sender; - (IBAction) toggleUseAutoAssignRules: (id) sender; - (IBAction) orderFrontRulesSheet: (id) sender; - (IBAction) cancelRules: (id) sender; - (IBAction) saveRules: (id) sender; @end transmission-2.92/macosx/PaxHeaders.4960/GroupToolbarItem.m0000644000000000000000000000013212442116654020571 xustar0030 mtime=1418239404.005926482 30 atime=1418239404.005926482 30 ctime=1457295923.212862539 transmission-2.92/macosx/GroupToolbarItem.m0000644000175000017500000000625412442116654022225 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: GroupToolbarItem.m 13251 2012-03-13 02:52:11Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "GroupToolbarItem.h" @implementation GroupToolbarItem - (void) dealloc { [fIdentifiers release]; [super dealloc]; } - (void) setIdentifiers: (NSArray *) identifiers { [fIdentifiers release]; fIdentifiers = [identifiers retain]; } - (void) validate { NSSegmentedControl * control = (NSSegmentedControl *)[self view]; for (NSInteger i = 0; i < [control segmentCount]; i++) [control setEnabled: [[self target] validateToolbarItem: [[[NSToolbarItem alloc] initWithItemIdentifier: [fIdentifiers objectAtIndex: i]] autorelease]] forSegment: i]; } - (void) createMenu: (NSArray *) labels { NSMenuItem * menuItem = [[NSMenuItem alloc] initWithTitle: [self label] action: NULL keyEquivalent: @""]; NSMenu * menu = [[NSMenu alloc] initWithTitle: [self label]]; [menuItem setSubmenu: menu]; [menu setAutoenablesItems: NO]; const NSInteger count = [(NSSegmentedControl *)[self view] segmentCount]; for (NSInteger i = 0; i < count; i++) { NSMenuItem * addItem = [[NSMenuItem alloc] initWithTitle: [labels objectAtIndex: i] action: [self action] keyEquivalent: @""]; [addItem setTarget: [self target]]; [addItem setTag: i]; [menu addItem: addItem]; [addItem release]; } [menu release]; [self setMenuFormRepresentation: menuItem]; [menuItem release]; } - (NSMenuItem *) menuFormRepresentation { NSMenuItem * menuItem = [super menuFormRepresentation]; const NSInteger count = [(NSSegmentedControl *)[self view] segmentCount]; for (NSInteger i = 0; i < count; i++) [[[menuItem submenu] itemAtIndex: i] setEnabled: [[self target] validateToolbarItem: [[[NSToolbarItem alloc] initWithItemIdentifier: [fIdentifiers objectAtIndex: i]] autorelease]]]; return menuItem; } @end transmission-2.92/macosx/PaxHeaders.4960/Torrent.h0000644000000000000000000000013212612560135016757 xustar0030 mtime=1445650525.067277078 30 atime=1445650525.067277078 30 ctime=1457295923.580868797 transmission-2.92/macosx/Torrent.h0000644000175000017500000001755612612560135020422 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: Torrent.h 14587 2015-10-23 04:09:40Z mikedld $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import #import @class FileListNode; typedef enum { TorrentDeterminationAutomatic = 0, TorrentDeterminationUserSpecified } TorrentDeterminationType; #define kTorrentDidChangeGroupNotification @"TorrentDidChangeGroup" @interface Torrent : NSObject { tr_torrent * fHandle; const tr_info * fInfo; const tr_stat * fStat; NSUserDefaults * fDefaults; NSImage * fIcon; NSString * fHashString; tr_file_stat * fFileStat; NSArray * fFileList, * fFlatFileList; NSIndexSet * fPreviousFinishedIndexes; NSDate * fPreviousFinishedIndexesDate; BOOL fRemoveWhenFinishSeeding; NSInteger fGroupValue; TorrentDeterminationType fGroupValueDetermination; TorrentDeterminationType fDownloadFolderDetermination; BOOL fResumeOnWake; BOOL fTimeMachineExcludeInitialized; } - (id) initWithPath: (NSString *) path location: (NSString *) location deleteTorrentFile: (BOOL) torrentDelete lib: (tr_session *) lib; - (id) initWithTorrentStruct: (tr_torrent *) torrentStruct location: (NSString *) location lib: (tr_session *) lib; - (id) initWithMagnetAddress: (NSString *) address location: (NSString *) location lib: (tr_session *) lib; - (id) initWithHistory: (NSDictionary *) history lib: (tr_session *) lib forcePause: (BOOL) pause; - (NSDictionary *) history; - (void) closeRemoveTorrent: (BOOL) trashFiles; - (void) changeDownloadFolderBeforeUsing: (NSString *) folder determinationType: (TorrentDeterminationType) determinationType; - (NSString *) currentDirectory; - (void) getAvailability: (int8_t *) tab size: (NSInteger) size; - (void) getAmountFinished: (float *) tab size: (NSInteger) size; - (NSIndexSet *) previousFinishedPieces; - (void) setPreviousFinishedPieces: (NSIndexSet *) indexes; - (void) update; - (void) startTransferIgnoringQueue: (BOOL) ignoreQueue; - (void) startTransferNoQueue; - (void) startTransfer; - (void) stopTransfer; - (void) sleep; - (void) wakeUp; - (NSInteger) queuePosition; - (void) setQueuePosition: (NSUInteger) index; - (void) manualAnnounce; - (BOOL) canManualAnnounce; - (void) resetCache; - (BOOL) isMagnet; - (NSString *) magnetLink; - (CGFloat) ratio; - (tr_ratiolimit) ratioSetting; - (void) setRatioSetting: (tr_ratiolimit) setting; - (CGFloat) ratioLimit; - (void) setRatioLimit: (CGFloat) limit; - (CGFloat) progressStopRatio; - (tr_idlelimit) idleSetting; - (void) setIdleSetting: (tr_idlelimit) setting; - (NSUInteger) idleLimitMinutes; - (void) setIdleLimitMinutes: (NSUInteger) limit; - (BOOL) usesSpeedLimit: (BOOL) upload; - (void) setUseSpeedLimit: (BOOL) use upload: (BOOL) upload; - (NSInteger) speedLimit: (BOOL) upload; - (void) setSpeedLimit: (NSInteger) limit upload: (BOOL) upload; - (BOOL) usesGlobalSpeedLimit; - (void) setUseGlobalSpeedLimit: (BOOL) use; - (void) setMaxPeerConnect: (uint16_t) count; - (uint16_t) maxPeerConnect; @property (nonatomic) BOOL removeWhenFinishSeeding; - (BOOL) waitingToStart; - (tr_priority_t) priority; - (void) setPriority: (tr_priority_t) priority; + (BOOL) trashFile: (NSString *) path error: (NSError **) error; - (void) moveTorrentDataFileTo: (NSString *) folder; - (void) copyTorrentFileTo: (NSString *) path; - (BOOL) alertForRemainingDiskSpace; - (NSImage *) icon; - (NSString *) name; - (BOOL) isFolder; - (uint64_t) size; - (uint64_t) sizeLeft; - (NSMutableArray *) allTrackerStats; - (NSArray *) allTrackersFlat; //used by GroupRules - (BOOL) addTrackerToNewTier: (NSString *) tracker; - (void) removeTrackers: (NSSet *) trackers; - (NSString *) comment; - (NSString *) creator; - (NSDate *) dateCreated; - (NSInteger) pieceSize; - (NSInteger) pieceCount; - (NSString *) hashString; - (BOOL) privateTorrent; - (NSString *) torrentLocation; - (NSString *) dataLocation; - (NSString *) fileLocation: (FileListNode *) node; - (void) renameTorrent: (NSString *) newName completionHandler: (void (^)(BOOL didRename)) completionHandler; - (void) renameFileNode: (FileListNode *) node withName: (NSString *) newName completionHandler: (void (^)(BOOL didRename)) completionHandler; - (CGFloat) progress; - (CGFloat) progressDone; - (CGFloat) progressLeft; - (CGFloat) checkingProgress; - (CGFloat) availableDesired; - (BOOL) isActive; - (BOOL) isSeeding; - (BOOL) isChecking; - (BOOL) isCheckingWaiting; - (BOOL) allDownloaded; - (BOOL) isComplete; - (BOOL) isFinishedSeeding; - (BOOL) isError; - (BOOL) isAnyErrorOrWarning; - (NSString *) errorMessage; - (NSArray *) peers; - (NSUInteger) webSeedCount; - (NSArray *) webSeeds; - (NSString *) progressString; - (NSString *) statusString; - (NSString *) shortStatusString; - (NSString *) remainingTimeString; - (NSString *) stateString; - (NSInteger) totalPeersConnected; - (NSInteger) totalPeersTracker; - (NSInteger) totalPeersIncoming; - (NSInteger) totalPeersCache; - (NSInteger) totalPeersPex; - (NSInteger) totalPeersDHT; - (NSInteger) totalPeersLocal; - (NSInteger) totalPeersLTEP; - (NSInteger) peersSendingToUs; - (NSInteger) peersGettingFromUs; - (CGFloat) downloadRate; - (CGFloat) uploadRate; - (CGFloat) totalRate; - (uint64_t) haveVerified; - (uint64_t) haveTotal; - (uint64_t) totalSizeSelected; - (uint64_t) downloadedTotal; - (uint64_t) uploadedTotal; - (uint64_t) failedHash; - (NSInteger) groupValue; - (void) setGroupValue: (NSInteger) groupValue determinationType: (TorrentDeterminationType) determinationType;; - (NSInteger) groupOrderValue; - (void) checkGroupValueForRemoval: (NSNotification *) notification; - (NSArray *) fileList; - (NSArray *) flatFileList; - (NSInteger) fileCount; - (void) updateFileStat; //methods require fileStats to have been updated recently to be accurate - (CGFloat) fileProgress: (FileListNode *) node; - (BOOL) canChangeDownloadCheckForFile: (NSUInteger) index; - (BOOL) canChangeDownloadCheckForFiles: (NSIndexSet *) indexSet; - (NSInteger) checkForFiles: (NSIndexSet *) indexSet; - (void) setFileCheckState: (NSInteger) state forIndexes: (NSIndexSet *) indexSet; - (void) setFilePriority: (tr_priority_t) priority forIndexes: (NSIndexSet *) indexSet; - (BOOL) hasFilePriority: (tr_priority_t) priority forIndexes: (NSIndexSet *) indexSet; - (NSSet *) filePrioritiesForIndexes: (NSIndexSet *) indexSet; - (NSDate *) dateAdded; - (NSDate *) dateCompleted; - (NSDate *) dateActivity; - (NSDate *) dateActivityOrAdd; - (NSInteger) secondsDownloading; - (NSInteger) secondsSeeding; - (NSInteger) stalledMinutes; - (BOOL) isStalled; - (void) updateTimeMachineExclude; - (NSInteger) stateSortKey; - (NSString *) trackerSortKey; - (tr_torrent *) torrentStruct; @end transmission-2.92/macosx/PaxHeaders.4960/AddMagnetWindowController.h0000644000000000000000000000013212442116673022407 xustar0030 mtime=1418239419.187186638 30 atime=1418239419.187186638 30 ctime=1457295922.895857148 transmission-2.92/macosx/AddMagnetWindowController.h0000644000175000017500000000500412442116673024033 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: AddMagnetWindowController.h 13602 2012-10-30 00:22:10Z livings124 $ * * Copyright (c) 2010-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import "Torrent.h" @class Controller; @class Torrent; @interface AddMagnetWindowController : NSWindowController { IBOutlet NSImageView * fLocationImageView; IBOutlet NSTextField * fNameField, * fLocationField; IBOutlet NSButton * fStartCheck; IBOutlet NSPopUpButton * fGroupPopUp, * fPriorityPopUp; //remove these when switching to auto layout IBOutlet NSTextField * fMagnetLinkLabel; IBOutlet NSTextField * fDownloadToLabel, * fGroupLabel, * fPriorityLabel; IBOutlet NSButton * fChangeDestinationButton; IBOutlet NSBox * fDownloadToBox; IBOutlet NSButton * fAddButton, * fCancelButton; Controller * fController; Torrent * fTorrent; NSString * fDestination; NSInteger fGroupValue; TorrentDeterminationType fGroupDeterminationType; } - (id) initWithTorrent: (Torrent *) torrent destination: (NSString *) path controller: (Controller *) controller; - (Torrent *) torrent; - (void) setDestination: (id) sender; - (void) add: (id) sender; - (void) cancelAdd: (id) sender; - (void) changePriority: (id) sender; - (void) updateGroupMenu: (NSNotification *) notification; @end transmission-2.92/macosx/PaxHeaders.4960/InfoGeneralViewController.m0000644000000000000000000000013212442116654022423 xustar0030 mtime=1418239404.003926448 30 atime=1418239404.003926448 30 ctime=1457295923.282863729 transmission-2.92/macosx/InfoGeneralViewController.m0000644000175000017500000001373212442116654024056 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoGeneralViewController.m 14016 2013-02-11 01:39:44Z livings124 $ * * Copyright (c) 2010-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "InfoGeneralViewController.h" #import "NSStringAdditions.h" #import "Torrent.h" @interface InfoGeneralViewController (Private) - (void) setupInfo; @end @implementation InfoGeneralViewController - (id) init { if ((self = [super initWithNibName: @"InfoGeneralView" bundle: nil])) { [self setTitle: NSLocalizedString(@"General Info", "Inspector view -> title")]; } return self; } - (void) dealloc { [fTorrents release]; [super dealloc]; } - (void) awakeFromNib { #warning remove when 10.7-only with auto layout [fInfoSectionLabel sizeToFit]; [fWhereSectionLabel sizeToFit]; NSArray * labels = @[ fPiecesLabel, fHashLabel, fSecureLabel, fCreatorLabel, fDateCreatedLabel, fCommentLabel, fDataLocationLabel ]; CGFloat oldMaxWidth = 0.0, originX, newMaxWidth = 0.0; for (NSTextField * label in labels) { const NSRect oldFrame = [label frame]; if (oldFrame.size.width > oldMaxWidth) { oldMaxWidth = oldFrame.size.width; originX = oldFrame.origin.x; } [label sizeToFit]; const CGFloat newWidth = [label bounds].size.width; if (newWidth > newMaxWidth) newMaxWidth = newWidth; } for (NSTextField * label in labels) { NSRect frame = [label frame]; frame.origin.x = originX + (newMaxWidth - frame.size.width); [label setFrame: frame]; } NSArray * fields = @[ fPiecesField, fHashField, fSecureField, fCreatorField, fDateCreatedField, fCommentScrollView, fDataLocationField ]; const CGFloat widthIncrease = newMaxWidth - oldMaxWidth; for (NSView * field in fields) { NSRect frame = [field frame]; frame.origin.x += widthIncrease; frame.size.width -= widthIncrease; [field setFrame: frame]; } } - (void) setInfoForTorrents: (NSArray *) torrents { //don't check if it's the same in case the metadata changed [fTorrents release]; fTorrents = [torrents retain]; fSet = NO; } - (void) updateInfo { if (!fSet) [self setupInfo]; if ([fTorrents count] != 1) return; Torrent * torrent = [fTorrents objectAtIndex: 0]; NSString * location = [torrent dataLocation]; [fDataLocationField setStringValue: location ? [location stringByAbbreviatingWithTildeInPath] : @""]; [fDataLocationField setToolTip: location ? location : @""]; [fRevealDataButton setHidden: !location]; } - (void) revealDataFile: (id) sender { Torrent * torrent = [fTorrents objectAtIndex: 0]; NSString * location = [torrent dataLocation]; if (!location) return; NSURL * file = [NSURL fileURLWithPath: location]; [[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs: [NSArray arrayWithObject: file]]; } @end @implementation InfoGeneralViewController (Private) - (void) setupInfo { if ([fTorrents count] == 1) { Torrent * torrent = [fTorrents objectAtIndex: 0]; #warning candidate for localizedStringWithFormat (although then we'll get two commas) NSString * piecesString = ![torrent isMagnet] ? [NSString stringWithFormat: @"%ld, %@", [torrent pieceCount], [NSString stringForFileSize: [torrent pieceSize]]] : @""; [fPiecesField setStringValue: piecesString]; NSString * hashString = [torrent hashString]; [fHashField setStringValue: hashString]; [fHashField setToolTip: hashString]; [fSecureField setStringValue: [torrent privateTorrent] ? NSLocalizedString(@"Private Torrent, non-tracker peer discovery disabled", "Inspector -> private torrent") : NSLocalizedString(@"Public Torrent", "Inspector -> private torrent")]; NSString * commentString = [torrent comment]; [fCommentView setString: commentString]; NSString * creatorString = [torrent creator]; [fCreatorField setStringValue: creatorString]; [fDateCreatedField setObjectValue: [torrent dateCreated]]; } else { [fPiecesField setStringValue: @""]; [fHashField setStringValue: @""]; [fHashField setToolTip: nil]; [fSecureField setStringValue: @""]; [fCommentView setString: @""]; [fCreatorField setStringValue: @""]; [fDateCreatedField setStringValue: @""]; [fDataLocationField setStringValue: @""]; [fDataLocationField setToolTip: nil]; [fRevealDataButton setHidden: YES]; } fSet = YES; } @end transmission-2.92/macosx/PaxHeaders.4960/ExpandedPathToIconTransformer.h0000644000000000000000000000013012442116616023226 xustar0029 mtime=1418239374.02041262 29 atime=1418239374.02041262 30 ctime=1457295923.050859784 transmission-2.92/macosx/ExpandedPathToIconTransformer.h0000644000175000017500000000272312442116616024661 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: ExpandedPathToIconTransformer.h 13251 2012-03-13 02:52:11Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface ExpandedPathToIconTransformer : NSValueTransformer { } @endtransmission-2.92/macosx/PaxHeaders.4960/ToolbarSegmentedCell.m0000644000000000000000000000013212442116672021371 xustar0030 mtime=1418239418.293171318 30 atime=1418239418.293171318 30 ctime=1457295923.557868406 transmission-2.92/macosx/ToolbarSegmentedCell.m0000644000175000017500000000307312442116672023021 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: ToolbarSegmentedCell.m 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "ToolbarSegmentedCell.h" @implementation ToolbarSegmentedCell //when the toolbar is set to small size, don't make the group items small - (NSControlSize) controlSize { return NSRegularControlSize; } @end transmission-2.92/macosx/PaxHeaders.4960/GroupsController.h0000644000000000000000000000013212442116666020654 xustar0030 mtime=1418239414.201101194 30 atime=1418239414.201101194 30 ctime=1457295923.183862046 transmission-2.92/macosx/GroupsController.h0000644000175000017500000000541512442116666022306 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: GroupsController.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @class Torrent; @interface GroupsController : NSObject { NSMutableArray * fGroups; } + (GroupsController *) groups; - (NSInteger) numberOfGroups; - (NSInteger) rowValueForIndex: (NSInteger) index; - (NSInteger) indexForRow: (NSInteger) row; - (NSString *) nameForIndex: (NSInteger) index; - (void) setName: (NSString *) name forIndex: (NSInteger) index; - (NSImage *) imageForIndex: (NSInteger) index; - (NSColor *) colorForIndex: (NSInteger) index; - (void) setColor: (NSColor *) color forIndex: (NSInteger) index; - (BOOL) usesCustomDownloadLocationForIndex: (NSInteger) index; - (void) setUsesCustomDownloadLocation: (BOOL) useCustomLocation forIndex: (NSInteger) index; - (NSString *) customDownloadLocationForIndex: (NSInteger) index; - (void) setCustomDownloadLocation: (NSString *) location forIndex: (NSInteger) index; - (BOOL) usesAutoAssignRulesForIndex: (NSInteger) index; - (void) setUsesAutoAssignRules: (BOOL) useAutoAssignRules forIndex: (NSInteger) index; - (NSPredicate *) autoAssignRulesForIndex: (NSInteger) index; - (void) setAutoAssignRules: (NSPredicate *) predicate forIndex: (NSInteger) index; - (void) addNewGroup; - (void) removeGroupWithRowIndex: (NSInteger) row; - (void) moveGroupAtRow: (NSInteger) oldRow toRow: (NSInteger) newRow; - (NSMenu *) groupMenuWithTarget: (id) target action: (SEL) action isSmall: (BOOL) small; - (NSInteger) groupIndexForTorrent: (Torrent *) torrent; @end transmission-2.92/macosx/PaxHeaders.4960/BlocklistDownloader.m0000644000000000000000000000013212442116666021303 xustar0030 mtime=1418239414.199101159 30 atime=1418239414.199101159 30 ctime=1457295922.945857998 transmission-2.92/macosx/BlocklistDownloader.m0000644000175000017500000002166312442116666022740 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: BlocklistDownloader.m 13326 2012-05-29 01:03:21Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "BlocklistDownloader.h" #import "BlocklistDownloaderViewController.h" #import "BlocklistScheduler.h" #import "Controller.h" @interface BlocklistDownloader (Private) - (void) startDownload; - (void) decompressBlocklist; @end @implementation BlocklistDownloader BlocklistDownloader * fBLDownloader = nil; + (BlocklistDownloader *) downloader { if (!fBLDownloader) { fBLDownloader = [[BlocklistDownloader alloc] init]; [fBLDownloader startDownload]; } return fBLDownloader; } + (BOOL) isRunning { return fBLDownloader != nil; } - (void) setViewController: (BlocklistDownloaderViewController *) viewController { fViewController = viewController; if (fViewController) { switch (fState) { case BLOCKLIST_DL_START: [fViewController setStatusStarting]; break; case BLOCKLIST_DL_DOWNLOADING: [fViewController setStatusProgressForCurrentSize: fCurrentSize expectedSize: fExpectedSize]; break; case BLOCKLIST_DL_PROCESSING: [fViewController setStatusProcessing]; break; } } } - (void) dealloc { [fDownload release]; [fDestination release]; [super dealloc]; } - (void) cancelDownload { [fViewController setFinished]; [fDownload cancel]; [[BlocklistScheduler scheduler] updateSchedule]; fBLDownloader = nil; [self release]; } //using the actual filename is the best bet - (void) download: (NSURLDownload *) download decideDestinationWithSuggestedFilename: (NSString *) filename { [fDownload setDestination: [NSTemporaryDirectory() stringByAppendingPathComponent: filename] allowOverwrite: NO]; } - (void) download: (NSURLDownload *) download didCreateDestination: (NSString *) path { [fDestination release]; fDestination = [path retain]; } - (void) download: (NSURLDownload *) download didReceiveResponse: (NSURLResponse *) response { fState = BLOCKLIST_DL_DOWNLOADING; fCurrentSize = 0; fExpectedSize = [response expectedContentLength]; [fViewController setStatusProgressForCurrentSize: fCurrentSize expectedSize: fExpectedSize]; } - (void) download: (NSURLDownload *) download didReceiveDataOfLength: (NSUInteger) length { fCurrentSize += length; [fViewController setStatusProgressForCurrentSize: fCurrentSize expectedSize: fExpectedSize]; } - (void) download: (NSURLDownload *) download didFailWithError: (NSError *) error { [fViewController setFailed: [error localizedDescription]]; [[NSUserDefaults standardUserDefaults] setObject: [NSDate date] forKey: @"BlocklistNewLastUpdate"]; [[BlocklistScheduler scheduler] updateSchedule]; fBLDownloader = nil; [self release]; } - (void) downloadDidFinish: (NSURLDownload *) download { fState = BLOCKLIST_DL_PROCESSING; [fViewController setStatusProcessing]; NSAssert(fDestination != nil, @"the blocklist file destination has not been specified"); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [self decompressBlocklist]; dispatch_async(dispatch_get_main_queue(), ^{ const int count = tr_blocklistSetContent([(Controller *)[NSApp delegate] sessionHandle], [fDestination UTF8String]); //delete downloaded file [[NSFileManager defaultManager] removeItemAtPath: fDestination error: NULL]; if (count > 0) [fViewController setFinished]; else [fViewController setFailed: NSLocalizedString(@"The specified blocklist file did not contain any valid rules.", "blocklist fail message")]; //update last updated date for schedule NSDate * date = [NSDate date]; [[NSUserDefaults standardUserDefaults] setObject: date forKey: @"BlocklistNewLastUpdate"]; [[NSUserDefaults standardUserDefaults] setObject: date forKey: @"BlocklistNewLastUpdateSuccess"]; [[BlocklistScheduler scheduler] updateSchedule]; [[NSNotificationCenter defaultCenter] postNotificationName: @"BlocklistUpdated" object: nil]; fBLDownloader = nil; [self release]; }); }); } - (BOOL) download: (NSURLDownload *) download shouldDecodeSourceDataOfMIMEType: (NSString *) encodingType { return YES; } @end @implementation BlocklistDownloader (Private) - (void) startDownload { fState = BLOCKLIST_DL_START; [[BlocklistScheduler scheduler] cancelSchedule]; NSString * urlString = [[NSUserDefaults standardUserDefaults] stringForKey: @"BlocklistURL"]; if (!urlString) urlString = @""; else if (![urlString isEqualToString: @""] && [urlString rangeOfString: @"://"].location == NSNotFound) urlString = [@"http://" stringByAppendingString: urlString]; NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: urlString]]; fDownload = [[NSURLDownload alloc] initWithRequest: request delegate: self]; } //.gz, .tar.gz, .tgz, and .bgz will be decompressed by NSURLDownload for us. However, we have to do .zip files manually. - (void) decompressBlocklist { if ([[[fDestination pathExtension] lowercaseString] isEqualToString: @"zip"]) { BOOL success = NO; NSString * workingDirectory = [fDestination stringByDeletingLastPathComponent]; //First, perform the actual unzipping NSTask * unzip = [[NSTask alloc] init]; [unzip setLaunchPath: @"/usr/bin/unzip"]; [unzip setCurrentDirectoryPath: workingDirectory]; [unzip setArguments: [NSArray arrayWithObjects: @"-o", /* overwrite */ @"-q", /* quiet! */ fDestination, /* source zip file */ @"-d", workingDirectory, /*destination*/ nil]]; @try { [unzip launch]; [unzip waitUntilExit]; if ([unzip terminationStatus] == 0) success = YES; } @catch(id exc) { success = NO; } [unzip release]; if (success) { //Now find out what file we actually extracted; don't just assume it matches the zipfile's name NSTask *zipinfo; zipinfo = [[NSTask alloc] init]; [zipinfo setLaunchPath: @"/usr/bin/zipinfo"]; [zipinfo setArguments: [NSArray arrayWithObjects: @"-1", /* just the filename */ fDestination, /* source zip file */ nil]]; [zipinfo setStandardOutput: [NSPipe pipe]]; @try { NSFileHandle * zipinfoOutput = [[zipinfo standardOutput] fileHandleForReading]; [zipinfo launch]; [zipinfo waitUntilExit]; NSString * actualFilename = [[[NSString alloc] initWithData: [zipinfoOutput readDataToEndOfFile] encoding: NSUTF8StringEncoding] autorelease]; actualFilename = [actualFilename stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; NSString * newBlocklistPath = [workingDirectory stringByAppendingPathComponent: actualFilename]; //Finally, delete the ZIP file; we're done with it, and we'll return the unzipped blocklist [[NSFileManager defaultManager] removeItemAtPath: fDestination error: NULL]; [fDestination release]; fDestination = [newBlocklistPath retain]; } @catch(id exc) {} [zipinfo release]; } } } @end transmission-2.92/macosx/PaxHeaders.4960/FilterBarView.m0000644000000000000000000000013212505250243020031 xustar0030 mtime=1427460259.978235231 30 atime=1427460259.978235231 30 ctime=1457295923.157861603 transmission-2.92/macosx/FilterBarView.m0000644000175000017500000000730512505250243021463 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: FilterBarView.m 14340 2014-10-16 13:01:17Z livings124 $ * * Copyright (c) 2011-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "FilterBarView.h" #import "NSApplicationAdditions.h" @implementation FilterBarView - (id) initWithFrame: (NSRect) rect { if ((self = [super initWithFrame: rect])) { if (![NSApp isOnYosemiteOrBetter]) { NSColor * lightColor = [NSColor colorWithCalibratedRed: 235.0/255.0 green: 235.0/255.0 blue: 235.0/255.0 alpha: 1.0]; NSColor * darkColor = [NSColor colorWithCalibratedRed: 205.0/255.0 green: 205.0/255.0 blue: 205.0/255.0 alpha: 1.0]; fGradient = [[NSGradient alloc] initWithStartingColor: lightColor endingColor: darkColor]; } } return self; } - (void) dealloc { [fGradient release]; [super dealloc]; } - (BOOL) mouseDownCanMoveWindow { return NO; } - (BOOL) isOpaque { return YES; } - (void) drawRect: (NSRect) rect { if ([NSApp isOnYosemiteOrBetter]) { [[NSColor windowBackgroundColor] setFill]; NSRectFill(rect); const NSRect lineBorderRect = NSMakeRect(NSMinX(rect), 0.0, NSWidth(rect), 1.0); if (NSIntersectsRect(lineBorderRect, rect)) { [[NSColor lightGrayColor] setFill]; NSRectFill(lineBorderRect); } } else { NSInteger count = 0; NSRect gridRects[2]; NSColor * colorRects[2]; NSRect lineBorderRect = NSMakeRect(NSMinX(rect), NSHeight([self bounds]) - 1.0, NSWidth(rect), 1.0); if (NSIntersectsRect(lineBorderRect, rect)) { gridRects[count] = lineBorderRect; colorRects[count] = [NSColor whiteColor]; ++count; rect.size.height -= 1.0; } lineBorderRect.origin.y = 0.0; if (NSIntersectsRect(lineBorderRect, rect)) { gridRects[count] = lineBorderRect; colorRects[count] = [NSColor colorWithCalibratedWhite: 0.65 alpha: 1.0]; ++count; rect.origin.y += 1.0; rect.size.height -= 1.0; } if (!NSIsEmptyRect(rect)) { const NSRect gradientRect = NSMakeRect(NSMinX(rect), 1.0, NSWidth(rect), NSHeight([self bounds]) - 1.0 - 1.0); //proper gradient requires the full height of the bar [fGradient drawInRect: gradientRect angle: 270.0]; } NSRectFillListWithColors(gridRects, colorRects, count); } } @end transmission-2.92/macosx/PaxHeaders.4960/ProgressGradients.m0000644000000000000000000000013212442116666021003 xustar0030 mtime=1418239414.193101057 30 atime=1418239414.193101057 30 ctime=1457295923.488867232 transmission-2.92/macosx/ProgressGradients.m0000644000175000017500000000703312442116666022433 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: ProgressGradients.m 13253 2012-03-13 03:20:09Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "ProgressGradients.h" @implementation ProgressGradients (Private) + (NSGradient *) progressGradientForRed: (CGFloat) redComponent green: (CGFloat) greenComponent blue: (CGFloat) blueComponent { const CGFloat alpha = [[NSUserDefaults standardUserDefaults] boolForKey: @"SmallView"] ? 0.27 : 1.0; NSColor * baseColor = [NSColor colorWithCalibratedRed: redComponent green: greenComponent blue: blueComponent alpha: alpha]; NSColor * color2 = [NSColor colorWithCalibratedRed: redComponent * 0.95 green: greenComponent * 0.95 blue: blueComponent * 0.95 alpha: alpha]; NSColor * color3 = [NSColor colorWithCalibratedRed: redComponent * 0.85 green: greenComponent * 0.85 blue: blueComponent * 0.85 alpha: alpha]; return [[[NSGradient alloc] initWithColorsAndLocations: baseColor, 0.0, color2, 0.5, color3, 0.5, baseColor, 1.0, nil] autorelease]; } @end @implementation ProgressGradients + (NSGradient *) progressWhiteGradient { return [[self class] progressGradientForRed: 0.95 green: 0.95 blue: 0.95]; } + (NSGradient *) progressGrayGradient { return [[self class] progressGradientForRed: 0.7 green: 0.7 blue: 0.7]; } + (NSGradient *) progressLightGrayGradient { return [[self class] progressGradientForRed: 0.87 green: 0.87 blue: 0.87]; } + (NSGradient *) progressBlueGradient { return [[self class] progressGradientForRed: 0.35 green: 0.67 blue: 0.98]; } + (NSGradient *) progressDarkBlueGradient { return [[self class] progressGradientForRed: 0.616 green: 0.722 blue: 0.776]; } + (NSGradient *) progressGreenGradient { return [[self class] progressGradientForRed: 0.44 green: 0.89 blue: 0.40]; } + (NSGradient *) progressLightGreenGradient { return [[self class] progressGradientForRed: 0.62 green: 0.99 blue: 0.58]; } + (NSGradient *) progressDarkGreenGradient { return [[self class] progressGradientForRed: 0.627 green: 0.714 blue: 0.639]; } + (NSGradient *) progressRedGradient { return [[self class] progressGradientForRed: 0.902 green: 0.439 blue: 0.451]; } + (NSGradient *) progressYellowGradient { return [[self class] progressGradientForRed: 0.933 green: 0.890 blue: 0.243]; } @end transmission-2.92/macosx/PaxHeaders.4960/Controller.h0000644000000000000000000000013212644245522017452 xustar0030 mtime=1452362578.797699835 30 atime=1452362578.797699835 30 ctime=1457295923.007859053 transmission-2.92/macosx/Controller.h0000644000175000017500000002356512644245522021112 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: Controller.h 14662 2016-01-06 11:05:37Z mikedld $ * * Copyright (c) 2005-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import #import #import #import "VDKQueue.h" @class AddMagnetWindowController; @class AddWindowController; @class Badger; @class DragOverlayWindow; @class FilterBarController; @class InfoWindowController; @class MessageWindowController; @class PrefsController; @class StatusBarController; @class Torrent; @class TorrentTableView; @class URLSheetWindowController; typedef enum { ADD_MANUAL, ADD_AUTO, ADD_SHOW_OPTIONS, ADD_URL, ADD_CREATED } addType; @interface Controller : NSObject { tr_session * fLib; NSMutableArray * fTorrents, * fDisplayedTorrents; PrefsController * fPrefsController; InfoWindowController * fInfoController; MessageWindowController * fMessageController; NSUserDefaults * fDefaults; NSString * fConfigDirectory; IBOutlet NSWindow * fWindow; DragOverlayWindow * fOverlayWindow; IBOutlet TorrentTableView * fTableView; io_connect_t fRootPort; NSTimer * fTimer; VDKQueue * fFileWatcherQueue; IBOutlet NSMenuItem * fOpenIgnoreDownloadFolder; IBOutlet NSButton * fActionButton, * fSpeedLimitButton, * fClearCompletedButton; IBOutlet NSTextField * fTotalTorrentsField; StatusBarController * fStatusBar; FilterBarController * fFilterBar; IBOutlet NSMenuItem * fNextFilterItem; IBOutlet NSMenuItem * fNextInfoTabItem, * fPrevInfoTabItem; IBOutlet NSMenu * fSortMenu; IBOutlet NSMenu * fGroupsSetMenu, * fGroupsSetContextMenu; IBOutlet NSMenu * fShareMenu, * fShareContextMenu; IBOutlet NSMenuItem * fShareMenuItem, * fShareContextMenuItem; // remove when dropping 10.6 QLPreviewPanel * fPreviewPanel; BOOL fQuitting; BOOL fQuitRequested; BOOL fPauseOnLaunch; Badger * fBadger; NSMutableArray * fAutoImportedNames; NSTimer * fAutoImportTimer; NSMutableDictionary * fPendingTorrentDownloads; NSMutableSet * fAddingTransfers; NSMutableSet * fAddWindows; URLSheetWindowController * fUrlSheetController; BOOL fGlobalPopoverShown; BOOL fSoundPlaying; } - (void) openFiles: (NSArray *) filenames addType: (addType) type forcePath: (NSString *) path; - (void) askOpenConfirmed: (AddWindowController *) addController add: (BOOL) add; - (void) openCreatedFile: (NSNotification *) notification; - (void) openFilesWithDict: (NSDictionary *) dictionary; - (void) openShowSheet: (id) sender; - (void) openMagnet: (NSString *) address; - (void) askOpenMagnetConfirmed: (AddMagnetWindowController *) addController add: (BOOL) add; - (void) invalidOpenAlert: (NSString *) filename; - (void) invalidOpenMagnetAlert: (NSString *) address; - (void) duplicateOpenAlert: (NSString *) name; - (void) duplicateOpenMagnetAlert: (NSString *) address transferName: (NSString *) name; - (void) openURL: (NSString *) urlString; - (void) openURLShowSheet: (id) sender; - (void) quitSheetDidEnd: (NSWindow *) sheet returnCode: (NSInteger) returnCode contextInfo: (void *) contextInfo; - (tr_session *) sessionHandle; - (void) createFile: (id) sender; - (void) resumeSelectedTorrents: (id) sender; - (void) resumeAllTorrents: (id) sender; - (void) resumeTorrents: (NSArray *) torrents; - (void) resumeSelectedTorrentsNoWait: (id) sender; - (void) resumeWaitingTorrents: (id) sender; - (void) resumeTorrentsNoWait: (NSArray *) torrents; - (void) stopSelectedTorrents: (id) sender; - (void) stopAllTorrents: (id) sender; - (void) stopTorrents: (NSArray *) torrents; - (void) removeTorrents: (NSArray *) torrents deleteData: (BOOL) deleteData; - (void) removeSheetDidEnd: (NSWindow *) sheet returnCode: (NSInteger) returnCode contextInfo: (NSDictionary *) dict; - (void) confirmRemoveTorrents: (NSArray *) torrents deleteData: (BOOL) deleteData; - (void) removeNoDelete: (id) sender; - (void) removeDeleteData: (id) sender; - (void) clearCompleted: (id) sender; - (void) moveDataFilesSelected: (id) sender; - (void) moveDataFiles: (NSArray *) torrents; - (void) copyTorrentFiles: (id) sender; - (void) copyTorrentFileForTorrents: (NSMutableArray *) torrents; - (void) copyMagnetLinks: (id) sender; - (void) revealFile: (id) sender; - (IBAction) renameSelected: (id) sender; - (void) announceSelectedTorrents: (id) sender; - (void) verifySelectedTorrents: (id) sender; - (void) verifyTorrents: (NSArray *) torrents; - (NSArray *)selectedTorrents; @property (retain, readonly) PrefsController * prefsController; - (void) showPreferenceWindow: (id) sender; - (void) showAboutWindow: (id) sender; - (void) showInfo: (id) sender; - (void) resetInfo; - (void) setInfoTab: (id) sender; @property (retain, readonly) MessageWindowController * messageWindowController; - (void) showMessageWindow: (id) sender; - (void) showStatsWindow: (id) sender; - (void) updateUI; - (void) fullUpdateUI; - (void) setBottomCountText: (BOOL) filtering; - (Torrent *) torrentForHash: (NSString *) hash; - (void) torrentFinishedDownloading: (NSNotification *) notification; - (void) torrentRestartedDownloading: (NSNotification *) notification; - (void) torrentFinishedSeeding: (NSNotification *) notification; - (void) updateTorrentHistory; - (void) applyFilter; - (void) sortTorrents: (BOOL) includeQueueOrder; - (void) sortTorrentsCallUpdates: (BOOL) callUpdates includeQueueOrder: (BOOL) includeQueueOrder; - (void) rearrangeTorrentTableArray: (NSMutableArray *) rearrangeArray forParent: (id) parent withSortDescriptors: (NSArray *) descriptors beganTableUpdate: (BOOL *) beganTableUpdate; - (void) setSort: (id) sender; - (void) setSortByGroup: (id) sender; - (void) setSortReverse: (id) sender; - (void) switchFilter: (id) sender; - (IBAction) showGlobalPopover: (id) sender; - (void) setGroup: (id) sender; //used by delegate-generated menu items - (void) toggleSpeedLimit: (id) sender; - (void) speedLimitChanged: (id) sender; - (void) altSpeedToggledCallbackIsLimited: (NSDictionary *) dict; - (void) changeAutoImport; - (void) checkAutoImportDirectory; - (void) beginCreateFile: (NSNotification *) notification; - (void) sleepCallback: (natural_t) messageType argument: (void *) messageArgument; @property (retain, readonly) VDKQueue * fileWatcherQueue; - (void) torrentTableViewSelectionDidChange: (NSNotification *) notification; - (void) toggleSmallView: (id) sender; - (void) togglePiecesBar: (id) sender; - (void) toggleAvailabilityBar: (id) sender; - (void) toggleStatusBar: (id) sender; - (void) showStatusBar: (BOOL) show animate: (BOOL) animate; - (void) toggleFilterBar: (id) sender; - (void) showFilterBar: (BOOL) show animate: (BOOL) animate; - (void) focusFilterField; - (void) allToolbarClicked: (id) sender; - (void) selectedToolbarClicked: (id) sender; - (void) setWindowSizeToFit; - (NSRect) sizedWindowFrame; - (void) updateForAutoSize; - (void) setWindowMinMaxToCurrent; - (CGFloat) minWindowContentSizeAllowed; - (void) updateForExpandCollape; - (void) showMainWindow: (id) sender; - (void) toggleQuickLook: (id) sender; - (void) linkHomepage: (id) sender; - (void) linkForums: (id) sender; - (void) linkTrac: (id) sender; - (void) linkDonate: (id) sender; - (void) rpcCallback: (tr_rpc_callback_type) type forTorrentStruct: (struct tr_torrent *) torrentStruct; - (void) rpcAddTorrentStruct: (struct tr_torrent *) torrentStruct; - (void) rpcRemoveTorrent: (Torrent *) torrent deleteData: (BOOL) deleteData; - (void) rpcStartedStoppedTorrent: (Torrent *) torrent; - (void) rpcChangedTorrent: (Torrent *) torrent; - (void) rpcMovedTorrent: (Torrent *) torrent; - (void) rpcUpdateQueue; @end transmission-2.92/macosx/PaxHeaders.4960/BonjourController.m0000644000000000000000000000013212442116646021016 xustar0030 mtime=1418239398.189826813 30 atime=1418239398.189826813 30 ctime=1457295922.977858542 transmission-2.92/macosx/BonjourController.m0000644000175000017500000000566612442116646022460 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: BonjourController.m 13491 2012-09-10 02:01:07Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "BonjourController.h" #define BONJOUR_SERVICE_NAME_MAX_LENGTH 63 @implementation BonjourController BonjourController * fDefaultController = nil; + (BonjourController *) defaultController { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ fDefaultController = [[BonjourController alloc] init]; }); return fDefaultController; } + (BOOL) defaultControllerExists { return fDefaultController != nil; } - (void) dealloc { [fService release]; [super dealloc]; } - (void) startWithPort: (int) port { [self stop]; NSMutableString * serviceName = [NSMutableString stringWithFormat: @"Transmission (%@ - %@)", NSUserName(), [[NSHost currentHost] localizedName]]; if ([serviceName length] > BONJOUR_SERVICE_NAME_MAX_LENGTH) [serviceName deleteCharactersInRange: NSMakeRange(BONJOUR_SERVICE_NAME_MAX_LENGTH, [serviceName length] - BONJOUR_SERVICE_NAME_MAX_LENGTH)]; fService = [[NSNetService alloc] initWithDomain: @"" type: @"_http._tcp." name: serviceName port: port]; [fService setDelegate: self]; [fService publish]; } - (void) stop { [fService stop]; [fService release]; fService = nil; } - (void) netService: (NSNetService *) sender didNotPublish: (NSDictionary *) errorDict { NSLog(@"Failed to publish the web interface service on port %ld, with error: %@", [sender port], errorDict); } - (void) netService: (NSNetService *) sender didNotResolve: (NSDictionary *) errorDict { NSLog(@"Failed to resolve the web interface service on port %ld, with error: %@", [sender port], errorDict); } @end transmission-2.92/macosx/PaxHeaders.4960/InfoViewController.h0000644000000000000000000000013012442116646021117 xustar0029 mtime=1418239398.19082683 29 atime=1418239398.19082683 30 ctime=1457295923.322864409 transmission-2.92/macosx/InfoViewController.h0000644000175000017500000000303112442116646022543 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoViewController.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2010-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @protocol InfoViewController - (void) setInfoForTorrents: (NSArray *) torrents; - (void) updateInfo; @optional - (void) clearView; - (void) saveViewSize; @end transmission-2.92/macosx/PaxHeaders.4960/FilterBarView.h0000644000000000000000000000013112442116666020035 xustar0030 mtime=1418239414.207101297 30 atime=1418239414.207101297 29 ctime=1457295923.14886145 transmission-2.92/macosx/FilterBarView.h0000644000175000017500000000267212442116666021472 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: FilterBarView.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2011-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface FilterBarView : NSView { NSGradient * fGradient; } @end transmission-2.92/macosx/PaxHeaders.4960/FilterButton.m0000644000000000000000000000013212442116666017757 xustar0030 mtime=1418239414.203101228 30 atime=1418239414.203101228 30 ctime=1457295923.167861773 transmission-2.92/macosx/FilterButton.m0000644000175000017500000000367412442116666021416 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: FilterButton.m 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "FilterButton.h" #import "NSStringAdditions.h" @implementation FilterButton - (id) initWithCoder: (NSCoder *) coder { if ((self = [super initWithCoder: coder])) { fCount = NSNotFound; } return self; } - (void) setCount: (NSUInteger) count { if (count == fCount) return; fCount = count; [self setToolTip: fCount == 1 ? NSLocalizedString(@"1 transfer", "Filter Button -> tool tip") : [NSString stringWithFormat: NSLocalizedString(@"%@ transfers", "Filter Bar Button -> tool tip"), [NSString formattedUInteger: fCount]]]; } @end transmission-2.92/macosx/PaxHeaders.4960/NSImageAdditions.m0000644000000000000000000000013212442116666020460 xustar0030 mtime=1418239414.196101108 30 atime=1418239414.196101108 30 ctime=1457295923.375865311 transmission-2.92/macosx/NSImageAdditions.m0000644000175000017500000000344512442116666022113 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: NSImageAdditions.m 14226 2014-01-19 01:29:38Z jordan $ * * Copyright (c) 2011-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "NSImageAdditions.h" @implementation NSImage (NSImageAdditions) - (NSImage *) imageWithColor: (NSColor *) color { NSImage * coloredImage = [self copy]; [coloredImage lockFocus]; [color set]; const NSSize size = [coloredImage size]; NSRectFillUsingOperation(NSMakeRect(0.0, 0.0, size.width, size.height), NSCompositeSourceAtop); [coloredImage unlockFocus]; return [coloredImage autorelease]; } @end transmission-2.92/macosx/PaxHeaders.4960/PiecesView.m0000644000000000000000000000013212442116666017401 xustar0030 mtime=1418239414.199101159 30 atime=1418239414.199101159 30 ctime=1457295923.428866212 transmission-2.92/macosx/PiecesView.m0000644000175000017500000001561112442116666021032 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: PiecesView.m 14050 2013-03-12 02:56:35Z livings124 $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "PiecesView.h" #import "Torrent.h" #import "InfoWindowController.h" #import "transmission.h" #import "utils.h" #define MAX_ACROSS 18 #define BETWEEN 1.0 #define HIGH_PEERS 30 enum { PIECE_NONE, PIECE_SOME, PIECE_HIGH_PEERS, PIECE_FINISHED, PIECE_FLASHING }; @implementation PiecesView - (void) awakeFromNib { //store box colors fGreenAvailabilityColor = [[NSColor colorWithCalibratedRed: 0.0 green: 1.0 blue: 0.4 alpha: 1.0] retain]; fBluePieceColor = [[NSColor colorWithCalibratedRed: 0.0 green: 0.4 blue: 0.8 alpha: 1.0] retain]; //actually draw the box [self setTorrent: nil]; } - (void) dealloc { tr_free(fPieces); [fGreenAvailabilityColor release]; [fBluePieceColor release]; [super dealloc]; } - (void) setTorrent: (Torrent *) torrent { [self clearView]; fTorrent = (torrent && ![torrent isMagnet]) ? torrent : nil; if (fTorrent) { //determine relevant values fNumPieces = MIN([fTorrent pieceCount], MAX_ACROSS * MAX_ACROSS); fAcross = ceil(sqrt(fNumPieces)); const CGFloat width = [self bounds].size.width; fWidth = (width - (fAcross + 1) * BETWEEN) / fAcross; fExtraBorder = (width - ((fWidth + BETWEEN) * fAcross + BETWEEN)) / 2; } NSImage * back = [[NSImage alloc] initWithSize: [self bounds].size]; [back lockFocus]; NSGradient * gradient = [[NSGradient alloc] initWithStartingColor: [NSColor colorWithCalibratedWhite: 0.0 alpha: 0.4] endingColor: [NSColor colorWithCalibratedWhite: 0.2 alpha: 0.4]]; [gradient drawInRect: [self bounds] angle: 90.0]; [gradient release]; [back unlockFocus]; [self setImage: back]; [back release]; [self setNeedsDisplay]; } - (void) clearView { tr_free(fPieces); fPieces = NULL; } - (void) updateView { if (!fTorrent) return; //determine if first time const BOOL first = fPieces == NULL; if (first) fPieces = (int8_t *)tr_malloc(fNumPieces * sizeof(int8_t)); int8_t * pieces = NULL; float * piecesPercent = NULL; const BOOL showAvailablity = [[NSUserDefaults standardUserDefaults] boolForKey: @"PiecesViewShowAvailability"]; if (showAvailablity) { pieces = (int8_t *)tr_malloc(fNumPieces * sizeof(int8_t)); [fTorrent getAvailability: pieces size: fNumPieces]; } else { piecesPercent = (float *)tr_malloc(fNumPieces * sizeof(float)); [fTorrent getAmountFinished: piecesPercent size: fNumPieces]; } NSImage * image = [self image]; NSRect fillRects[fNumPieces]; NSColor * fillColors[fNumPieces]; NSInteger usedCount = 0; for (NSInteger index = 0; index < fNumPieces; index++) { NSColor * pieceColor = nil; if (showAvailablity ? pieces[index] == -1 : piecesPercent[index] == 1.0) { if (first || fPieces[index] != PIECE_FINISHED) { if (!first && fPieces[index] != PIECE_FLASHING) { pieceColor = [NSColor orangeColor]; fPieces[index] = PIECE_FLASHING; } else { pieceColor = fBluePieceColor; fPieces[index] = PIECE_FINISHED; } } } else if (showAvailablity ? pieces[index] == 0 : piecesPercent[index] == 0.0) { if (first || fPieces[index] != PIECE_NONE) { pieceColor = [NSColor whiteColor]; fPieces[index] = PIECE_NONE; } } else if (showAvailablity && pieces[index] >= HIGH_PEERS) { if (first || fPieces[index] != PIECE_HIGH_PEERS) { pieceColor = fGreenAvailabilityColor; fPieces[index] = PIECE_HIGH_PEERS; } } else { //always redraw "mixed" CGFloat percent = showAvailablity ? (CGFloat)pieces[index]/HIGH_PEERS : piecesPercent[index]; NSColor * fullColor = showAvailablity ? fGreenAvailabilityColor : fBluePieceColor; pieceColor = [[NSColor whiteColor] blendedColorWithFraction: percent ofColor: fullColor]; fPieces[index] = PIECE_SOME; } if (pieceColor) { const NSInteger across = index % fAcross, down = index / fAcross; fillRects[usedCount] = NSMakeRect(across * (fWidth + BETWEEN) + BETWEEN + fExtraBorder, [image size].width - (down + 1) * (fWidth + BETWEEN) - fExtraBorder, fWidth, fWidth); fillColors[usedCount] = pieceColor; usedCount++; } } if (usedCount > 0) { [image lockFocus]; NSRectFillListWithColors(fillRects, fillColors, usedCount); [image unlockFocus]; [self setNeedsDisplay]; } tr_free(pieces); tr_free(piecesPercent); } - (BOOL) acceptsFirstMouse: (NSEvent *) event { return YES; } - (void) mouseDown: (NSEvent *) event { if (fTorrent) { const BOOL availability = ![[NSUserDefaults standardUserDefaults] boolForKey: @"PiecesViewShowAvailability"]; [[NSUserDefaults standardUserDefaults] setBool: availability forKey: @"PiecesViewShowAvailability"]; [self sendAction:[self action] to:[self target]]; } [super mouseDown: event]; } @end transmission-2.92/macosx/PaxHeaders.4960/de.lproj0000644000000000000000000000013212666747213016626 xustar0030 mtime=1457245835.381999782 30 atime=1418239398.318829023 30 ctime=1457295922.697853781 transmission-2.92/macosx/de.lproj/0000755000175000017500000000000012666747213020330 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/de.lproj/PaxHeaders.4960/InfoPlist.strings0000644000000000000000000000013212664476420022222 xustar0030 mtime=1456635152.188499821 30 atime=1456635152.188499821 30 ctime=1457295922.696853764 transmission-2.92/macosx/de.lproj/InfoPlist.strings0000644000175000017500000000017012664476420023645 0ustar00mikedldmikedld00000000000000/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = "Copyright © 2005–2016 Transmission-Projekt";transmission-2.92/macosx/de.lproj/PaxHeaders.4960/Creator.xib0000644000000000000000000000013212640354045020773 xustar0030 mtime=1451350053.296165082 30 atime=1451350053.296165082 30 ctime=1457295922.697853781 transmission-2.92/macosx/de.lproj/Creator.xib0000644000175000017500000006026212640354045022426 0ustar00mikedldmikedld00000000000000 File File transmission-2.92/macosx/de.lproj/PaxHeaders.4960/PrefsWindow.xib0000644000000000000000000000013212640354045021643 xustar0030 mtime=1451350053.294165047 30 atime=1451350053.294165047 30 ctime=1457295922.697853781 transmission-2.92/macosx/de.lproj/PrefsWindow.xib0000644000175000017500000056604312640354045023306 0ustar00mikedldmikedld00000000000000 ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer Wenn die Begrenzte Übertragungsgeschwindigkeit aktiviert ist, werden diese Einstellungen anstelle der normalen Begrenzung des Datendurchsatzes verwendet. NSAllRomanInputSourcesLocaleIdentifier NSAllRomanInputSourcesLocaleIdentifier YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7MTgsIDE4fdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPERHETU0AKgAABGKAACBQOCQW DQeEQmDAuBv6BveFRGJROKEMVBRGOZ1vVlNd1vdVRSRRQDQMEwMEQMJg8LhgcKM2ENILhdsdsrl2AxkN 1rNJBwN1QeSwIHwMMgwHg8MgoEA4MA4GgkKhYLBgQBoOiIPBwMhYOhaWhUIBIGhEFggBAojghrgB0vSS r99icAHA0F8kwNcQQSCUTIEtFkwGMSCcQA8NBgMAgNhsOAQGg6igsFAcAPp+PwAA0FAyBAJ/gB7vd9gB 1zcABZ5L4APV1SloBG8lsuls7vJ3OtFQQIhAKnNOKFOokoEslgN7Pd7AB/Px+gAAgMBADKQx1ut0gBrM hlAAXD4fAByudxgANPnWAd6NYAPRxPgAOMQmUAFkyG5QN5sNAwwceESShKFgNgxjECZ6HqeoAAQAgCgA AgDpKAwCpKex1nYABrl+XjLn20IHBQCIABKBpmuYeLsnycp4AAcwLv6N5EkqZJfloWAjIGeSBhAOA8D0 XZCj6PoSAAf7ngKBCTgGgZ6nwfQAFuWRaAAEIOg3IpynMAAKgycIAAwCp1gAfh4R0fR0qCdoFieABGl0 bZ1E0RhBBwgZvoGCIrjEMBbkwRxIBuftBAAdp3ni5h9NKdBymwAB0HObIAHmfQJAACADIgJYbnzSRxm0 0R3ueCIHIgeB9hmABTmwA5/DyOg2CIgZfoGAYhiQJhXlET5PCaATpgAZhil6AAHgQAIAAKftIgOAsRHs fAFABUblhIElOGYXVIn8AcRBeEh3NMczPGcAlYivc45uaexHIIGAbBsTZWFQVgyA0DYMAAaBlGMAADn6 dETmXMYHxwfODAAGgTHeAABRUABhGHTh+n0egAB8G0FHia1Dm6DT+iwNA3E8c5umwMaCBAEIRkIVRWFc PYYhcFQAHCckxHQbZVs2AqTg4GIuAAd5yGKAAPAs7J3GzO59guKtHGiW4ABMCJqMucsMHGDoyAAM5Aks YplmCW4joIBoGgsNBT3kS4kiGH4AHIcxzgAZRelIAANhJOoMA4D4AAYf5pWIBB2gAbxowUBoYaAeRuYE DJ6pCfp3zEdYHigABBlWZR0FMT5LiCgwDCWUBSFKWYtiwKIAnKchyAAc5ybmEgUhS8RvRMFYQ4WfZ4Oy c5vcSCQIOYee5gIeJvTHm2HmnDxJHEB55mIW5WCYg4YkAQ5HGKPQ5jaBLNNCfB7U4b/zgADIBaqCAHUO AB9uef59QUfx7nmAB+wS5h6Sefw9EWCyF2NUfIaBRjWC6PqBQuSDglPsG4YoPAaAvAkN8bg4R2jTGwNY dwMwVlYD6GoHpDB/kQH8ZhMY8WKjuHUiwdI4x0j7G6N8cw8RxDiG8OcZY1h0DOFcNEdIcyBuFIMA1CgC wiD7fopwgQ4iBgOD4GgK4kgTgbAUA8Zw0hqOxG0OYdI4B1jyHAOIdQ9CPD8H+N8hwAEMECXAQJMRAknk KWOQI0JCiUkCLoQI0pAmAECfwQIzUdiRkIICAA8BAAADAAAAAQASAAABAQADAAAAAQASAAABAgADAAAA BAAABRwBAwADAAAAAQAFAAABBgADAAAAAQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAA AQAEAAABFgADAAAAAQASAAABFwAEAAAAAQAABFoBHAADAAAAAQABAAABPQADAAAAAQACAAABUgADAAAA AQABAAABUwADAAAABAAABSSHcwAHAAAMmAAABSwAAAAAAAgACAAIAAgAAQABAAEAAQAADJhhcHBsAhAA AG1udHJSR0IgWFlaIAfdAAMADgAWAAEAO2Fjc3BBUFBMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2 1gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA EWRlc2MAAAFQAAAAYmRzY20AAAG0AAABgGNwcnQAAAM0AAAAJHd0cHQAAANYAAAAFHJYWVoAAANsAAAA FGdYWVoAAAOAAAAAFGJYWVoAAAOUAAAAFHJUUkMAAAOoAAAIDGFhcmcAAAu0AAAAIHZjZ3QAAAvUAAAA MG5kaW4AAAwEAAAAPmNoYWQAAAxEAAAALG1tb2QAAAxwAAAAKGJUUkMAAAOoAAAIDGdUUkMAAAOoAAAI DGFhYmcAAAu0AAAAIGFhZ2cAAAu0AAAAIGRlc2MAAAAAAAAACERpc3BsYXkAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAABtbHVjAAAAAAAAAB4AAAAMc2tTSwAAAAgAAAF4Y2FFUwAAAAgAAAF4aGVJTAAAAAgAAAF4cHRC UgAAAAgAAAF4aXRJVAAAAAgAAAF4aHVIVQAAAAgAAAF4dWtVQQAAAAgAAAF4a29LUgAAAAgAAAF4bmJO TwAAAAgAAAF4Y3NDWgAAAAgAAAF4emhUVwAAAAgAAAF4ZGVERQAAAAgAAAF4cm9STwAAAAgAAAF4c3ZT RQAAAAgAAAF4emhDTgAAAAgAAAF4amFKUAAAAAgAAAF4YXIAAAAAAAgAAAF4ZWxHUgAAAAgAAAF4cHRQ VAAAAAgAAAF4bmxOTAAAAAgAAAF4ZnJGUgAAAAgAAAF4ZXNFUwAAAAgAAAF4dGhUSAAAAAgAAAF4dHJU UgAAAAgAAAF4ZmlGSQAAAAgAAAF4aHJIUgAAAAgAAAF4cGxQTAAAAAgAAAF4cnVSVQAAAAgAAAF4ZW5V UwAAAAgAAAF4ZGFESwAAAAgAAAF4AGkATQBhAGN0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSwgSW5jLiwg MjAxMwBYWVogAAAAAAAA8xYAAQAAAAEWylhZWiAAAAAAAABxwAAAOYoAAAFnWFlaIAAAAAAAAGEjAAC5 5gAAE/ZYWVogAAAAAAAAI/IAAAyQAAC90GN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIA NgA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCjAKgArQCyALcAvADBAMYA ywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwB gwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoC hAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD 0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcF dwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EH dAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJ zwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUM jgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YP sw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMT QxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0X QRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4ob shvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwg mCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl 9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r 0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIy KjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5 BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNA ZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVI S0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQ u1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZ uFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBj Q2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQht YG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4 EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSD V4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6P No+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kb r5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKo xKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2 ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHE zsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TT xtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvj Y+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnz p/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//cGFyYQAAAAAAAwAAAAJm ZgAA8qcAAA1ZAAAT0AAACg52Y2d0AAAAAAAAAAEAAQAAAAAAAAABAAAAAQAAAAAAAAABAAAAAQAAAAAA AAABAABuZGluAAAAAAAAADYAAKdAAABVgAAATMAAAJ7AAAAlgAAADMAAAFAAAABUQAACMzMAAjMzAAIz MwAAAAAAAAAAc2YzMgAAAAAAAQxyAAAF+P//8x0AAAe6AAD9cv//+53///2kAAAD2QAAwHFtbW9kAAAA AAAABhAAAKAHAAAAAMknHgAAAAAAAAAAAAAAAAAAAAAA0iUmJyhaJGNsYXNzbmFtZVgkY2xhc3Nlc18Q EE5TQml0bWFwSW1hZ2VSZXCjJykqWk5TSW1hZ2VSZXBYTlNPYmplY3TSJSYsLVdOU0FycmF5oiwq0iUm LzBeTlNNdXRhYmxlQXJyYXmjLywq0zIzCjQ1NldOU1doaXRlXE5TQ29sb3JTcGFjZUQwIDAAEAOADNIl Jjg5V05TQ29sb3KiOCrSJSY7PFdOU0ltYWdlojsqXxAPTlNLZXllZEFyY2hpdmVy0T9AVHJvb3SAAQAI ABEAGgAjAC0AMgA3AEYATABXAF4AZQByAHkAgQCDAIUAigCMAI4AlwCcAKcAqQCrAK0AsgC1ALcAuQC7 AL0AwgDZANsA3RKlEqoStRK+EtES1RLgEukS7hL2EvkS/hMNExETGBMgEy0TMhM0EzYTOxNDE0YTSxNT E1YTaBNrE3AAAAAAAAACAQAAAAAAAABBAAAAAAAAAAAAAAAAAAATcg transmission-2.92/macosx/de.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212642003321022512 xustar0030 mtime=1451755217.167473196 30 atime=1451755217.167473196 30 ctime=1457295922.697853781 transmission-2.92/macosx/de.lproj/Localizable.strings0000644000175000017500000011550112642003321024142 0ustar00mikedldmikedld00000000000000/* Inspector -> selected torrents stats -> bytes */ "%@ bytes" = "%@ Bytes"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "%@ files" = "%@ Dateien"; /* Prefs -> blocklist -> message */ "%@ IP address rules in list" = "%@ IP-Adressen in der Blockliste"; /* Inspector -> selected torrents */ "%@ magnetized transfers" = "%@ Übertragungen von magnet-Links"; /* Blocklist -> message Inspector -> Files tab -> file status string Torrent -> progress string */ "%@ of %@" = "%1$@ von %2$@"; /* Torrent -> progress string */ "%@ of torrent metadata retrieved" = "%@ der Torrent-Metadaten empfangen"; /* Torrent -> eta string */ "%@ remaining" = "%@ verbleibend"; /* Add torrent -> info Torrent -> progress string */ "%@ selected" = "%@ ausgewählt"; /* stats window -> times opened */ "%@ times" = "%@ mal"; /* Drag overlay -> torrents */ "%@ Torrent Files" = "%@ Torrent-Dateien"; /* Inspector -> selected torrents */ "%@ Torrents Selected" = "%@ Torrents ausgewählt"; /* Inspector -> selected torrents stats total */ "%@ total" = "insgesamt %@"; /* Filter Bar Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "%@ transfers" = "%@ Übertragungen"; /* Inspector -> Activity tab -> have */ "%@ verified" = "%@ überprüft"; /* Inspector -> Peers tab -> peers */ "%d cache" = "%d zwischengespeichert"; /* Inspector -> Peers tab -> peers */ "%d Connected" = "%d Verbindungen"; /* Inspector -> Peers tab -> peers */ "%d DHT" = "%d DHT"; /* Dock item - Downloading */ "%d Downloading" = "%d aktive Downloads"; /* Inspector -> Peers tab -> peers */ "%d incoming" = "%d eingehend"; /* Action menu -> upload/download limit Status Bar -> speed tooltip */ "%d KB/s" = "%d KB/s"; /* Inspector -> Peers tab -> peers */ "%d local discovery" = "%d lokal entdeckt"; /* Inspector -> Peers tab -> peers */ "%d LTEP" = "%d LTEP"; /* Info options -> global setting */ "%d minutes" = "%d Minuten"; /* Inspector -> Peers tab -> peers */ "%d PEX" = "%d PEX"; /* Create torrent -> info */ "%d pieces, %@ each" = "%1$d Teilstücke à %2$@"; /* Dock item - Seeding */ "%d Seeding" = "%d aktive Verteilungen"; /* Inspector -> Peers tab -> peers */ "%d tracker" = "%d Tracker"; /* Torrent -> status string */ "%d web seeds" = "%d Web-Verteilern"; /* time string */ "%u days" = "%u Tage"; /* time string */ "%u hr" = "%u Std"; /* time string */ "%u min" = "%u Min"; /* time string */ "%u sec" = "%u Sek"; /* time string */ "%u years" = "%u Jahre"; /* time string */ "1 day" = "1 Tag"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "1 file" = "1 Datei"; /* Inspector -> selected torrents */ "1 magnetized transfer" = "1 Übertragung von magnet-Link"; /* Info options -> global setting */ "1 minute" = "1 Minute"; /* Create torrent -> info */ "1 piece, %@" = "1 Teilstück, %@"; /* stats window -> times opened */ "1 time" = "1 Mal"; /* Filter Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "1 transfer" = "1 Übertragung"; /* time string */ "1 year" = "1 Jahr"; /* Open invalid alert -> title */ "\"%@\" is not a valid torrent file." = "„%@“ ist keine wohlgeformte Torrent-Datei."; /* Prefs -> blocklist -> message */ "A blocklist must first be downloaded" = "Es muß zunächst eine Blockliste geladen werden."; /* Create torrent -> file already exists warning -> warning */ "A file with the name \"%@\" already exists in the directory \"%@\". Choose a new name or directory to create the torrent file." = "Eine Datei mit dem Namen „%1$@“ existiert bereits im Ordner „%2$@“. Bitte wählen Sie einen anderen Namen oder Ordner, um die Torrent-Datei zu erstellen."; /* Move inside itself alert -> title */ "A folder cannot be moved to inside itself." = "Ordner kann nicht in sich selbst bewegt werden."; /* Create torrent -> zero size -> warning */ "A torrent file cannot be created for files with no size." = "Für leere Dateien kann keine Torrent-Datei erstellt werden."; /* Create torrent -> file already exists warning -> title */ "A torrent file with this name and directory cannot be created." = "Torrent-Datei kann nicht mit diesem Namen erstellt werden."; /* Create torrent -> blank address -> message */ "A transfer marked as private with no tracker addresses will be unable to connect to peers. The torrent file will only be useful if you plan to upload the file to a tracker website that will add the addresses for you." = "Eine als „privat“ markierte Übertragung ohne Tracker-Adressen wird keine Verbindung zu anderen Teilnehmern aufnehmen können. Diese Torrent-Datei wird nur funktionieren, wenn sie zu einer Tracker-Website geladen wird, die die Tracker-Adresse selbst hinzufügt."; /* Open duplicate alert -> title Open duplicate magnet alert -> title */ "A transfer of \"%@\" already exists." = "„%@“ wird bereits übertragen."; /* Filter Bar -> filter button */ "Active" = "Aktiv"; /* Inspector -> title */ "Activity" = "Aktivität"; /* Add torrent -> same name -> button */ "Add" = "Hinzufügen"; /* Inspector view -> tracker buttons */ "Add a tracker" = "Tracker hinzufügen"; /* Magnet link failed -> title */ "Adding magnetized transfer failed." = "Übertragung von magnet-Link konnte nicht hinzugefügt werden."; /* Filter Bar -> filter button */ "All" = "Alle"; /* Groups -> Button */ "All Groups" = "Alle Gruppen"; /* Create torrent -> failed -> warning */ "An unknown error has occurred." = "Ein unbekannter Fehler ist aufgetreten."; /* Tracker last announce */ "Announce error" = "Meldefehler"; /* Tracker next announce (with trailing space – followed by …)*/ "Announce in progress" = "Melde Status "; /* Tracker next announce */ "Announce is queued" = "Meldung in Warteliste"; /* Tracker next announce */ "Announce not scheduled" = "Kein Melden geplant"; /* Tracker last announce */ "Announce timed out" = "Zeitüberschreitung bei Meldung"; /* All toolbar item -> label */ "Apply All" = "Alle"; /* Selected toolbar item -> label */ "Apply Selected" = "Auswahl"; /* Confirm Quit panel -> title */ "Are you sure you want to quit?" = "Transmission beenden?"; /* Remove completed confirm panel -> title */ "Are you sure you want to remove %@ completed transfers from the transfer list?" = "Möchten Sie wirklich %@ vollständig verteilte Übertragungen aus der Liste entfernen?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list and trash the data files?" = "Möchten Sie wirklich %@ Übertragungen entfernen und die zugehörigen Daten in den Papierkorb legen?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list?" = "Möchten Sie wirklich %@ Übertragungen entfernen?"; /* Remove trackers alert -> title */ "Are you sure you want to remove %d trackers?" = "Möchten Sie wirklich %d Tracker entfernen?"; /* Removal confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list and trash the data file?" = "Möchten Sie wirklich die Übertragung „%@“ entfernen und die zugehörigen Daten in den Papierkorb legen?"; /* Removal confirm panel -> title Remove completed confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list?" = "Möchten Sie die Übertragung „%@“ wirklich entfernen?"; /* Remove trackers alert -> title */ "Are you sure you want to remove this tracker?" = "Möchten Sie diesen Tracker wirklich entfernen?"; /* Stats reset -> title */ "Are you sure you want to reset usage statistics?" = "Möchten Sie die Nutzungsstatistiken wirklich zurücksetzen?"; /* inspector -> peer table -> header tool tip */ "Available" = "Verfügbar"; /* Preferences -> toolbar item title */ "Bandwidth" = "Durchsatz"; /* Growl notification description */ "Bandwidth settings changed" = "Bandbreiteneinstellung verändert"; /* Groups -> Name */ "Blue" = "Blau"; /* Add torrent -> same name -> button Blocklist -> cancel button Confirm Quit panel -> button Create torrent -> blank address -> button Removal confirm panel -> button Remove trackers alert -> button Stats reset -> button */ "Cancel" = "Abbrechen"; /* Torrent Table -> tooltip */ "Change transfer settings" = "Übertragungseinstellungen verändern"; /* File Outline -> Menu */ "Check Selected" = "Ausgewählte Dateien empfangen"; /* Torrent -> status string */ "Checking existing data" = "Vorhandene Daten überprüfen"; /* Message window -> save button */ "Clear" = "Meldungen löschen"; /* inspector -> peer table -> header */ "Client" = "Programm"; /* View menu -> Quick Look */ "Close Quick Look" = "Übersicht schließen"; /* Prefs -> Notifications */ "Configure In Growl" = "In Growl konfigurieren"; /* Prefs -> Notifications */ "Configure In System Preferences" = "In Systemeinstellungen konfigurieren"; /* Blocklist -> message (with trailing space – followed by …)*/ "Connecting to site" = "Mit Server verbinden "; /* Torrent file copy alert -> title */ "Copy of \"%@\" Cannot Be Created" = "Kopie von „%@“ kann nicht erstellt werden"; /* Create torrent -> failed -> warning */ "Could not read \"%s\": %s." = "„%1$s“ kann nicht gelesen werden: %2$s."; /* Create torrent -> failed -> warning */ "Could not write \"%s\": %s." = "„%1$s“ kann nicht geschrieben werden: %2$s."; /* Create toolbar item -> label Create torrent -> blank address -> button */ "Create" = "Neu"; /* Drag overlay -> file */ "Create a Torrent File" = "Torrent-Datei erstellen"; /* Create toolbar item -> tooltip */ "Create torrent file" = "Neue Torrent-Datei erstellen"; /* Create toolbar item -> palette label Create torrent -> select file */ "Create Torrent File" = "Neue Torrent-Datei"; /* Create torrent -> failed -> title */ "Creation of \"%@\" failed." = "Erstellen von „%@“ ist fehlgeschlagen."; /* Inspector -> peer -> status */ "Currently downloading (interested and not choked)" = "Am Empfangen (interessiert und nicht blockiert)."; /* Inspector -> peer -> status */ "Currently uploading (interested and not choked)" = "Am Senden (interessiert und nicht blockiert)."; /* Message window -> table column */ "Date" = "Datum & Uhrzeit"; /* Message window -> level Message window -> level string */ "Debug" = "Debug"; /* Info options -> global setting */ "disabled" = "deaktiviert"; /* status bar -> status label Torrent -> status string */ "DL" = "↓"; /* Inspector -> Peers tab -> peers */ "DL from %d" = "Empfangen von %d"; /* Torrent disk space alert -> button */ "Do not check disk space again" = "Freien Festplattenplatz nicht erneut überprüfen"; /* Donation beg -> button */ "Don't bug me about this ever again." = "Diese Frage nicht erneut stellen"; /* files tab -> tooltip */ "Don't Download" = "Nicht empfangen"; /* Donation beg -> button */ "Donate" = "Spenden"; /* Donation beg -> message */ "Donate or not, there will be no difference to your torrenting experience." = "Das Programm funktioniert unabhängig von Ihrer Entscheidung zu spenden."; /* file table -> header tool tip files tab -> tooltip */ "Download" = "Empfangen"; /* Torrent disk space alert -> button */ "Download Anyway" = "Trotzdem empfangen"; /* Growl notification title */ "Download Complete" = "Empfangen abgeschlossen"; /* Blocklist -> message */ "Download of the blocklist failed." = "Blockliste konnte nicht geladen werden."; /* files tab -> tooltip */ "Download Some" = "Einige empfangen"; /* Torrent table -> group row -> tooltip */ "Download speed" = "Empfangsgeschwindigkeit"; /* Stats window -> label tracker peer stat */ "Downloaded" = "Empfangen"; /* Torrent -> status string */ "Downloading" = "Empfange"; /* Blocklist -> message */ "Downloading blocklist" = "Lade Blockliste"; /* Torrent -> status string */ "Downloading from %d of %d peers" = "Empfange von %1$d von %2$d Teilnehmern"; /* Torrent -> status string */ "Downloading from %d of 1 peer" = "Empfange von %d von 1 Teilnehmern"; /* inspector -> peer table -> header tool tip */ "Downloading From Peer" = "Empfange von Teilnehmer"; /* inspector -> web seed table -> header tool tip */ "Downloading From Web Seed" = "Empfange von Web-Verbindung"; /* Inspector -> Peers tab -> table row tooltip */ "encrypted" = "verschlüsselt"; /* inspector -> peer table -> header tool tip Inspector -> Peers tab -> table row tooltip */ "Encrypted Connection" = "Verschlüsselte Verbindung"; /* Blocklist -> message Message window -> level Message window -> level string Torrent -> status string */ "Error" = "Fehler"; /* Inspector -> title */ "Files" = "Dateien"; /* Filter toolbar item -> label */ "Filter" = "Filter"; /* Inspector -> Peers tab -> table row tooltip */ "From: cache" = "Herkunft: Zwischenspeicher"; /* Inspector -> Peers tab -> table row tooltip */ "From: distributed hash table" = "Herkunft: Verteilte Hashtabelle (DHT)"; /* Inspector -> Peers tab -> table row tooltip */ "From: incoming connection" = "Herkunft: eingehende Verbindung"; /* Inspector -> Peers tab -> table row tooltip */ "From: libtorrent extension protocol handshake" = "Herkunft: libtorrent Extension Protocol Handshake"; /* Inspector -> Peers tab -> table row tooltip */ "From: local peer discovery" = "Herkunft: im lokalen Netzwerk entdeckt"; /* Inspector -> Peers tab -> table row tooltip */ "From: peer exchange" = "Herkunft: Ausgetauschte Verbindungsinformationen"; /* Inspector -> Peers tab -> table row tooltip */ "From: tracker" = "Herkunft: Tracker"; /* File size - gigabytes */ "GB" = "GB"; /* Transfer speed (gigabytes per second) */ "GB/s" = "GB/s"; /* Preferences -> toolbar item title */ "General" = "Allgemein"; /* Inspector -> title */ "General Info" = "Allgemein"; /* Status Bar -> speed tooltip */ "Global download limit" = "Empfangsgeschwindigkeit begrenzt auf"; /* Status Bar -> speed tooltip */ "Global upload limit" = "Sendegeschwindigkeit begrenzt auf"; /* Tracker last announce */ "got %d peers" = "%d Teilnehmer erhalten"; /* Tracker last announce */ "got 1 peer" = "1 Teilnehmer erhalten"; /* Groups -> Name */ "Gray" = "Grau"; /* Groups -> Name */ "Green" = "Grün"; /* Groups -> Button */ "Group" = "Gruppe"; /* Preferences -> toolbar item title */ "Groups" = "Gruppen"; /* View menu -> Filter Bar */ "Hide Filter Bar" = "Filterleiste ausblenden"; /* View menu -> Inspector */ "Hide Inspector" = "Informationen ausblenden"; /* View menu -> Status Bar */ "Hide Status Bar" = "Statusleiste ausblenden"; /* File Outline -> Priority Menu */ "High" = "Hoch"; /* files tab -> tooltip */ "High Priority" = "Hohe Priorität"; /* Legal alert -> button */ "I Accept" = "Akzeptieren"; /* Add torrent -> same name -> message */ "If you are attempting to use already existing data, the root data directory should be inside the destination directory." = "Wenn Sie bereits existierende Daten nutzen möchten, muss sich der Wurzelorder innerhalb des Zielordners befinden."; /* Torrent -> eta string */ "inactive" = "nicht aktiv"; /* Message window -> level Message window -> level string */ "Info" = "Informationen"; /* Inspector toolbar item -> label */ "Inspector" = "Informationen"; /* URL sheet label */ "Internet address of torrent file:" = "Adresse der Torrent-Datei:"; /* inspector -> peer table -> header */ "IP Address" = "IP-Adresse"; /* Download not a torrent -> message */ "It appears that the file \"%@\" from %@ is not a torrent file." = "Die Datei „%1$@“ von %2$@ scheint keine Torrent-Datei zu sein."; /* File size - kilobytes */ "KB" = "KB"; /* Transfer speed (kilobytes per second) */ "KB/s" = "KB/s"; /* Tracker last announce */ "Last Announce" = "Letzte Meldung"; /* Tracker last scrape */ "Last Scrape" = "Letzte Aktualisierung"; /* Prefs -> blocklist -> message */ "Last updated" = "Letzte Aktualisierung"; /* tracker peer stat */ "Leechers" = "Empfänger"; /* About window -> license button */ "License" = "Lizenz"; /* Action menu -> upload/download limit torrent action menu -> upload/download limit */ "Limit (%d KB/s)" = "höchstens %d KB/s"; /* Save log alert panel -> title */ "Log Could Not Be Saved" = "Meldungen konnten nicht gesichert werden"; /* File Outline -> Priority Menu */ "Low" = "Niedrig"; /* files tab -> tooltip */ "Low Priority" = "Niedrige Priorität"; /* Open duplicate magnet alert -> title */ "Magnet link is a duplicate of an existing transfer." = "Übertragung von magnet-Link entspricht einer bereits vorhandenen Übertragung."; /* Inspector -> selected torrents Torrent -> progress string */ "Magnetized transfer" = "Übertragung von magnet-Link"; /* File size - megabytes */ "MB" = "MB"; /* Transfer speed (megabytes per second) */ "MB/s" = "MB/s"; /* Message window -> table column */ "Message" = "Meldung"; /* Message window -> title */ "Message Log" = "Meldungen"; /* files tab -> tooltip */ "Multiple Priorities" = "Verschiedene Prioritäten"; /* Inspector -> Peers tab -> table row tooltip No Ratio Prefs -> blocklist -> message Tracker last announce Tracker last scrape tracker peer stat */ "N/A" = "—"; /* Filter Bar -> filter menu */ "Name" = "Name"; /* Preferences -> toolbar item title */ "Network" = "Netzwerk"; /* Prefs -> blocklist -> message */ "Never" = "Nie"; /* inspector -> add tracker */ "New Tier" = "Neue Stufe"; /* Tracker next announce */ "Next announce in %@" = "Nächste Meldung in %@"; /* Group table row */ "No Group" = "Ohne Gruppe"; /* Inspector -> selected torrents */ "No Torrents Selected" = "Keine Übertragung ausgewählt"; /* Groups -> Button Groups -> Menu */ "None" = "Keine"; /* Donation beg -> button */ "Nope" = "Nein"; /* File Outline -> Priority Menu */ "Normal" = "Normal"; /* files tab -> tooltip */ "Normal Priority" = "Normale Priorität"; /* Torrent disk space alert -> title */ "Not enough remaining disk space to download \"%@\" completely." = "Es ist nicht genügend Festplattenplatz vorhanden, um „%@“ vollständig zu empfangen."; /* About window -> license close button Blocklist -> button Create torrent -> directory doesn't exist warning -> button Create torrent -> failed -> button Create torrent -> file already exists warning -> button Create torrent -> no files -> button Create torrent -> zero size -> button Download not a torrent -> button Magnet link failed -> button Move error alert -> button Move inside itself alert -> button Open duplicate alert -> button Open invalid alert -> button Save log alert panel -> button Torrent disk space alert -> button Torrent download failed -> button Torrent file copy alert -> button */ "OK" = "OK"; /* Remove completed confirm panel -> message */ "Once removed, continuing the transfer will require the torrent file or magnet link." = "Nach dem Entfernen wird erneut die Torrent-Datei oder der magnet-Link benötigt, um die Übertragung fortzusetzen."; /* Removal confirm panel -> message part 2 */ "Once removed, continuing the transfers will require the torrent files or magnet links." = "Nach dem Entfernen werden erneut die Torrent-Dateien oder die magnet-Links benötigt, um die Übertragungen fortzusetzen."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact it. This cannot be undone." = "Nach dem Entfernen wird Transmission nicht mehr versuchen diesen Tracker zu erreichen. Dieser Schritt kann nicht widerrufen werden."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact them. This cannot be undone." = "Nach dem Entfernen wird Transmission nicht mehr versuchen, diese Tracker zu erreichen. Dieser Schritt kann nicht wiederrufen werden."; /* File Outline -> Menu */ "Only Check Selected" = "Nur ausgewählte Dateien empfangen"; /* Open toolbar item -> label */ "Open" = "Öffnen"; /* Open address toolbar item -> label */ "Open Address" = "Adresse öffnen"; /* Open address toolbar item -> palette label */ "Open Torrent Address" = "Torrent-Adresse öffnen"; /* Open toolbar item -> tooltip */ "Open torrent files" = "Torrent-Dateien öffnen"; /* Open toolbar item -> palette label */ "Open Torrent Files" = "Torrent-Dateien öffnen"; /* Open address toolbar item -> tooltip */ "Open torrent web address" = "Torrent-Adresse öffnen"; /* Inspector -> title */ "Options" = "Einstellungen"; /* Groups -> Name */ "Orange" = "Orange"; /* Inspector -> Peers tab -> table row tooltip */ "Partial Seed" = "Partielles Verteilen"; /* All toolbar item -> palette label */ "Pause / Resume All" = "Alle Anhalten / Fortsetzen"; /* Selected toolbar item -> palette label */ "Pause / Resume Selected" = "Ausgewählte Anhalten / Fortsetzen"; /* All toolbar item -> label */ "Pause All" = "Alle Anhalten"; /* All toolbar item -> tooltip */ "Pause all transfers" = "Alle Übertragungen anhalten"; /* Selected toolbar item -> label */ "Pause Selected" = "Ausgewählte Anhalten"; /* Selected toolbar item -> tooltip */ "Pause selected transfers" = "Ausgewählte Übertragungen anhalten"; /* Torrent Table -> tooltip */ "Pause the transfer" = "Übertragung anhalten"; /* Torrent -> status string */ "Paused" = "Angehalten"; /* Inspector -> peer -> status */ "Peer is unchoking you, but you are not interested" = "Verbindungspartner hebt die Drosselung auf; aber Sie haben kein Interesse."; /* Inspector -> peer -> status */ "Peer wants you to upload, but you do not want to (interested and choked)" = "Verbindungspartner bittet um Senden; aber Sie haben kein Interesse (interessiert und blockiert)."; /* Inspector -> title Preferences -> toolbar item title */ "Peers" = "Teilnehmer"; /* Inspector -> Peers tab -> table row tooltip */ "Port" = "Port"; /* Preferences -> Network -> port status */ "Port check site is down" = "Site zum Überprüfen des Ports ist nicht erreichbar."; /* Preferences -> Network -> port status */ "Port is closed" = "Port ist geschlossen."; /* Preferences -> Network -> port status */ "Port is open" = "Port ist geöffnet."; /* File Outline -> Menu file table -> header tool tip */ "Priority" = "Priorität"; /* files tab -> tooltip */ "Priority Not Available" = "Priorität ist nicht gesetzt"; /* Inspector -> private torrent */ "Private Torrent, non-tracker peer discovery disabled" = "Privater Torrent, Entdecken von Teilnehmern ohne Tracker nicht aktiv"; /* Message window -> table column */ "Process" = "Vorgang"; /* Blocklist -> message (with trailing space – followed by …)*/ "Processing blocklist" = "Verarbeite Blockliste "; /* Stats window -> label */ "Program Started" = "Programm gestartet"; /* Inspector -> Peers tab -> table row tooltip */ "Progress: %@" = "Fortschritt: %@"; /* Inspector -> Peers tab -> table row tooltip */ "Protocol: %@" = "Protokoll: %@"; /* Inspector -> private torrent */ "Public Torrent" = "Öffentlicher Torrent"; /* Groups -> Name */ "Purple" = "Violett"; /* QuickLook toolbar item -> label QuickLook toolbar item -> palette label QuickLook toolbar item -> tooltip View menu -> Quick Look */ "Quick Look" = "Übersicht"; /* Confirm Quit panel -> button Legal alert -> button Transmission already running alert -> button */ "Quit" = "Beenden"; /* Dock Badger -> quit */ "Quitting" = "Beenden"; /* Stats window -> label status bar -> status label Torrent -> status string Torrent table -> group row -> tooltip */ "Ratio" = "Verhältnis"; /* Groups -> Name */ "Red" = "Rot"; /* Action menu -> status string toggle */ "Remaining Time" = "Verbleibende Zeit"; /* Torrent -> eta string */ "remaining time unknown" = "Verbleibende Zeit unbekannt"; /* Preferences -> toolbar item title */ "Remote" = "Entfernter Zugriff"; /* Removal confirm panel -> button Remove toolbar item -> label Remove trackers alert -> button */ "Remove" = "Entfernen"; /* Main window -> 3rd bottom left button (remove all) tooltip */ "Remove all transfers that have completed seeding." = "Vollständig verteilte Übertragungen entfernen."; /* Remove toolbar item -> palette label */ "Remove Selected" = "Ausgewählte entfernen"; /* Inspector view -> tracker buttons */ "Remove selected trackers" = "Ausgewählte Tracker entfernen"; /* Remove toolbar item -> tooltip */ "Remove selected transfers" = "Ausgewählte Übertragungen entfernen"; /* rename sheet button */ "Rename" = "Umbenennen"; /* File Outline -> Menu */ "Rename File" = "Datei umbenennen"; /* rename sheet label */ "Rename the file \"%@\":" = "Datei „%@“ umbenennen:"; /* Stats reset -> button Stats window -> reset button */ "Reset" = "Zurücksetzen"; /* All toolbar item -> label */ "Resume All" = "Alle fortsetzen"; /* All toolbar item -> tooltip */ "Resume all transfers" = "Alle Übertragungen fortsetzen"; /* Selected toolbar item -> label */ "Resume Selected" = "Ausgewählte fortsetzen"; /* Selected toolbar item -> tooltip */ "Resume selected transfers" = "Ausgewählte Übertragungen fortsetzen"; /* Torrent cell -> button info */ "Resume the transfer" = "Übertragung fortsetzen"; /* Torrent cell -> button info */ "Resume the transfer right away" = "Übertragung sofort fortsetzen"; /* Stats window -> label */ "Running Time" = "Laufzeit des Programms"; /* Message window -> save button (with trailing space – followed by …)*/ "Save" = "Sichern "; /* Tracker last scrape */ "Scrape error" = "Aktualisierungsfehler"; /* Tracker last scrape */ "Scrape timed out" = "Zeitüberschreitung bei Aktualisierung"; /* tracker peer stat */ "Seeders" = "Verteiler"; /* Torrent -> status string */ "Seeding" = "Verteile"; /* Torrent -> status string */ "Seeding complete" = "Verteilen beendet"; /* Growl notification title */ "Seeding Complete" = "Verteilen beendet"; /* Torrent -> status string */ "Seeding to %d of %d peers" = "Verteile an %1$d von %2$d Teilnehmern"; /* Torrent -> status string */ "Seeding to %d of 1 peer" = "Verteile an %d von 1 Teilnehmern"; /* Create torrent -> location sheet -> button Create torrent -> select file Move torrent -> prompt Open torrent -> prompt Preferences -> Open panel prompt */ "Select" = "Auswählen"; /* Create torrent -> select file */ "Select a file or folder for the torrent file." = "Datei oder Ordner, für den die Torrent-Datei erstellt werden soll, auswählen."; /* Add -> select destination folder */ "Select the download folder for \"%@\"" = "Zielordner zum Empfangen von „%@“ auswählen."; /* Create torrent -> location sheet -> message */ "Select the name and location for the torrent file." = "Name und Ort für die neue Torrent-Datei auswählen."; /* Move torrent -> select destination folder */ "Select the new folder for %d data files." = "Neuen Zielordner für %d Übertragungen auswählen."; /* Move torrent -> select destination folder */ "Select the new folder for \"%@\"." = "Neuen Zielordner für „%@“ auswählen."; /* Status Bar -> status menu */ "Session Ratio" = "Verhältnis in dieser Sitzung"; /* Status Bar -> status menu */ "Session Transfer" = "Übertragen in dieser Sitzung"; /* Share toolbar item -> label Share toolbar item -> palette label */ "Share" = "Bereitstellen"; /* Share toolbar item -> tooltip */ "Share torrent file" = "Torrent-Datei bereitstellen"; /* Main window -> 1st bottom left button (action) tooltip */ "Shortcuts for changing global settings." = "Schneller Zugriff auf globale Einstellungen."; /* notification button */ "Show" = "Zeigen"; /* View menu -> Filter Bar */ "Show Filter Bar" = "Filterleiste einblenden"; /* File Outline -> Menu */ "Show in Finder" = "Im Finder zeigen"; /* View menu -> Inspector */ "Show Inspector" = "Informationen einblenden"; /* View menu -> Status Bar */ "Show Status Bar" = "Statusleiste einblenden"; /* Torrent cell -> button info */ "Show the data file in Finder" = "Empfangene Daten im Finder zeigen"; /* Status Bar -> speed tooltip */ "Speed Limit" = "Begrenzte Übertragungsgeschwindigkeit"; /* Growl notification title */ "Speed Limit Auto Disabled" = "Die Begrenzte Übertragungsgeschwindigkeit wurde automatisch abgeschaltet."; /* Growl notification title */ "Speed Limit Auto Enabled" = "Die Begrenzte Übertragungsgeschwindigkeit wurde automatisch eingeschaltet."; /* Main window -> 2nd bottom left button (turtle) tooltip */ "Speed Limit overrides the total bandwidth limits with its own limits." = "Die Begrenzte Übertragungsgeschwindigkeit wird statt der allgemeinen Durchsatzbegrenzung genutzt."; /* Torrent -> status string */ "Stalled" = "Steckengeblieben"; /* Stats window -> title */ "Statistics" = "Statistik"; /* Action menu -> status string toggle */ "Status of Selected Files" = "Auswahlstatus anzeigen"; /* Action menu -> ratio stop torrent action menu -> ratio stop */ "Stop at Ratio (%.2f)" = "ab Verhältnis %.2f"; /* Torrent cell -> button info */ "Stop waiting to start" = "Warten auf den Beginn abbrechen"; /* Donation beg -> title */ "Support open-source indie software" = "Unterstützen Sie unabhängige Open-Source Programme"; /* File size - terabytes */ "TB" = "TB"; /* Transfer speed (terabytes per second) */ "TB/s" = "TB/s"; /* Create torrent -> directory doesn't exist warning -> title */ "The chosen torrent file location does not exist." = "Der für die Torrent-Datei gewählte Ort existiert nicht."; /* Add torrent -> same name -> title */ "The destination directory and root data directory have the same name." = "Der Zielordner und der Wurzelordner der Daten haben denselben Namen."; /* Create torrent -> directory doesn't exist warning -> warning */ "The directory \"%@\" does not currently exist. Create this directory or choose a different one to create the torrent file." = "Der Ordner „%@“ existiert nicht. Legen Sie den Ordner bitte an oder wählen Sie einen anderen, in dem die Torrent-Datei erstellt werden kann."; /* Open duplicate magnet alert -> message */ "The magnet link \"%@\" cannot be added because it is a duplicate of an already existing transfer." = "Der magnet-Link „%@“ konnte nicht hinzugefügt werden, da er einer bereits vorhandenen Übertragung entspricht."; /* Move error alert -> message Move inside itself alert -> message */ "The move operation of \"%@\" cannot be done." = "„%@“ kann nicht bewegt werden."; /* blocklist fail message */ "The specified blocklist file did not contain any valid rules." = "Die angegebene Blockliste enthält keine gültigen Regeln."; /* Torrent download failed -> message */ "The torrent could not be downloaded from %@: %@." = "Der Torrent konnte nicht von %1$@ empfangen werden: %2$@."; /* Torrent file copy alert -> message */ "The torrent file (%@) cannot be found." = "Die Torrent-Datei „%@“ kann nicht gefunden werden."; /* Open invalid alert -> message */ "The torrent file cannot be opened because it contains invalid data." = "Die Torrent-Datei kann nicht geöffnet werden, da sie ungültige Daten enthält."; /* Create torrent -> zero size -> title */ "The total file size is zero bytes." = "Die gesamte Dateigröße ist Null Bytes."; /* Open duplicate alert -> message */ "The transfer cannot be added because it is a duplicate of an already existing transfer." = "Die Übertragung kann nicht hinzugefügt werden, da sie einer bereits vorhandenen Übertragung entspricht."; /* Torrent disk space alert -> message */ "The transfer will be paused. Clear up space on %@ or deselect files in the torrent inspector to continue." = "Die Übertragung wird angehalten. Um sie fortzusetzen, schaffen Sie bitte freien Platz auf „%@“ oder deaktivieren Sie im Informationsfenster das Empfangen einiger der enthaltenen Dateien."; /* Create torrent -> blank address -> message */ "The transfer will not contact trackers for peers, and will have to rely solely on non-tracker peer discovery methods such as PEX and DHT to download and seed." = "Die Übertragung wird nicht mit Trackern in Verbindung treten, um Teilnehmer zu erhalten. Sie wird auf das Entdecken von Teilnehmern über trackerunabhängige Verfahren wie PEX und DHT angewiesen sein, um Laden und Verteilen zu ermöglichen."; /* Removal confirm panel -> message part 1 */ "There are %@ active transfers." = "Es gibt %@ aktive Übertragungen."; /* Removal confirm panel -> message part 1 */ "There are %@ transfers (%@ active)." = "Es gibt %1$@ Übertragungen, von denen %2$@ aktiv sind."; /* Confirm Quit panel -> message */ "There are %d active transfers that will be paused on quit. The transfers will automatically resume on the next launch." = "Es gibt %d aktive Übertragungen, die beim Beenden angehalten werden. Sie werden beim nächsten Start von Transmission automatisch fortgesetzt."; /* Create torrent -> blank address -> title */ "There are no tracker addresses." = "Keine Tracker-Adressen vorhanden."; /* Transmission already running alert -> message */ "There is already a copy of Transmission running. This copy cannot be opened until that instance is quit." = "Es ist bereits eine weitere Kopie von Transmission geöffnet. Diese Kopie kann erst gestartet werden, nachdem die andere beendet wurde."; /* Confirm Quit panel -> message */ "There is an active transfer that will be paused on quit. The transfer will automatically resume on the next launch." = "Es gibt eine aktive Übertragung, die beim Beenden angehalten wird. Sie wird beim nächsten Start von Transmission automatisch fortgesetzt."; /* Create torrent -> no files -> warning */ "There must be at least one file in a folder to create a torrent file." = "Die Auswahl muß mindestens eine Datei enthalten, um eine Torrent-Datei erstellen zu können."; /* Save log alert panel -> message */ "There was a problem creating the file \"%@\"." = "Beim Erstellen der Datei „%@“ trat ein Problem auf."; /* Move error alert -> title */ "There was an error moving the data file." = "Fehler beim Bewegen der Daten."; /* Magnet link failed -> message */ "There was an error when adding the magnet link \"%@\". The transfer will not occur." = "Beim Hinzufügen des magnet-Links „%@“ trat ein Fehler auf. Die Übertragung wird nicht stattfinden."; /* Create torrent -> no files -> title */ "This folder contains no files." = "Der Ordner enthält keine Dateien."; /* Removal confirm panel -> message */ "This transfer is active. Once removed, continuing the transfer will require the torrent file or magnet link." = "Diese Übertragung ist aktiv. Nach dem Entfernen wird erneut die Torrent-Datei oder der magnet-Link benötigt, um sie fortzusetzen."; /* Stats reset -> message */ "This will clear the global statistics displayed by Transmission. Individual transfer statistics will not be affected." = "Hierdurch werden die programmweiten Statistiken zurückgesetzt. Die Statistiken für die einzelnen Übertragungen bleiben erhalten."; /* Inspector -> tracker table */ "Tier %d" = "Stufe %d"; /* Filter toolbar item -> palette label */ "Toggle Filter" = "Filter ein-/ausblenden"; /* Inspector toolbar item -> palette label */ "Toggle Inspector" = "Informationen ein-/ausblenden"; /* Filter toolbar item -> tooltip */ "Toggle the filter bar" = "Filterleiste ein-/ausblenden"; /* Inspector toolbar item -> tooltip */ "Toggle the torrent inspector" = "Informationen ein-/ausblenden"; /* Download not a torrent -> title Torrent download error -> title */ "Torrent download failed" = "Empfangen des Torrents fehlgeschlagen"; /* Growl notification title */ "Torrent File Auto Added" = "Torrent-Datei automatisch hinzugefügt"; /* Inspector -> title */ "Torrent Inspector" = "Torrent Informationen"; /* Torrent -> progress string */ "torrent metadata needed" = "Benötige Torrent-Metadaten"; /* stats total */ "Total N/A" = "Gesamt n.v."; /* Status Bar -> status menu */ "Total Ratio" = "Verhältnis"; /* Status Bar -> status menu */ "Total Transfer" = "Übertragen"; /* Filter Bar -> filter menu */ "Tracker" = "Tracker"; /* Torrent -> status string */ "Tracker returned error" = "Fehlermeldung vom Tracker"; /* Torrent -> status string */ "Tracker returned warning" = "Warnung vom Tracker"; /* Tracker next announce */ "Tracker will be used as a backup" = "Tracker wird als Backup genutzt"; /* Inspector -> title */ "Trackers" = "Tracker"; /* Inspector -> Peers tab -> peers */ "Transfer Not Active" = "Übertragung nicht aktiv"; /* Preferences -> toolbar item title */ "Transfers" = "Übertragungen"; /* Inspector -> Peers tab -> peers */ "Transfers Not Active" = "Übertragungen nicht aktiv"; /* Legal alert -> message */ "Transmission is a file-sharing program. When you run a torrent, its data will be made available to others by means of upload. You and you alone are fully responsible for exercising proper judgement and abiding by your local laws." = "Transmission ist ein File-Sharing Programm. Es stellt die Daten aktiver Torrents zum Verteilen an andere Teilnehmer zur Verfügung. Die Verantwortung zur angemessenen Nutzung im Einklang mit den lokalen Gesetzen liegt bei Ihnen."; /* Donation beg -> message */ "Transmission is a full-featured torrent application. A lot of time and effort have gone into development, coding, and refinement. If you enjoy using it, please consider showing your love with a donation." = "Transmission ist ein leistungsstarkes Programm zum Nutzen von BitTorrent Netzwerken. Eine Menge Zeit und Arbeit sind in das Entwickeln, Programmieren und Gestalten des Programms geflossen. Falls das Programm für Sie nützlich ist, freuen wir uns über eine Spende."; /* Transmission already running alert -> title */ "Transmission is already running." = "Transmission ist bereits geöffnet."; /* status bar -> status label Torrent -> status string */ "UL" = "↑"; /* Inspector -> Peers tab -> peers */ "UL to %d" = "Senden an %d"; /* File Outline -> Menu */ "Uncheck Selected" = "Ausgewählte Dateien nicht empfangen"; /* Status Bar -> speed tooltip */ "unlimited" = "unbegrenzt"; /* Torrent -> error string unreadable */ "unreadable error" = "nicht lesbare Fehlermeldung"; /* Save log panel -> default file name */ "untitled" = "Transmission Meldungen"; /* Torrent table -> group row -> tooltip */ "Upload speed" = "Sendegeschwindigkeit"; /* Stats window -> label */ "Uploaded" = "Gesendet"; /* Torrent -> progress string */ "uploaded %@ (Ratio: %@)" = "%1$@ gesendet (Verhältnis: %2$@)"; /* inspector -> peer table -> header tool tip */ "Uploading To Peer" = "Sende an Teilnehmer"; /* Torrent -> status string (with trailing space – followed by …)*/ "Waiting to check existing data" = "Auf Überprüfen der Daten warten "; /* Torrent -> status string (with trailing space – followed by …)*/ "Waiting to download" = "Auf Empfangen warten "; /* Torrent -> status string */ "Waiting to seed" = "Warten auf Verteilen"; /* Drag overlay -> url */ "Web Address" = "Web-Adresse"; /* Torrent -> status string */ "web seed" = "Web-Verteiler"; /* inspector -> web seed table -> header */ "Web Seeds" = "Web-Verteiler"; /* Legal alert -> title */ "Welcome to Transmission" = "Willkommen bei Transmission"; /* Groups -> Name */ "Yellow" = "Gelb"; /* Inspector -> peer -> status */ "You unchoked the peer, but the peer is not interested" = "Blockade des Teilnehmers aufgehoben; aber der Verbindungspartner ist nicht interessiert."; /* Inspector -> peer -> status */ "You want to download, but peer does not want to send (interested and choked)" = "Selbst interessiert am Empfangen; aber der Verbindungspartner möchte nichts senden (interessiert und blockiert).";transmission-2.92/macosx/de.lproj/PaxHeaders.4960/InfoOptionsView.xib0000644000000000000000000000013212664476420022506 xustar0030 mtime=1456635152.186499787 30 atime=1456635152.186499787 30 ctime=1457295922.697853781 transmission-2.92/macosx/de.lproj/InfoOptionsView.xib0000644000175000017500000012121712664476420024137 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/de.lproj/PaxHeaders.4960/InfoActivityView.xib0000644000000000000000000000013212664476420022647 xustar0030 mtime=1456635152.187499804 30 atime=1456635152.187499804 30 ctime=1457295922.696853764 transmission-2.92/macosx/de.lproj/InfoActivityView.xib0000644000175000017500000012754012664476420024305 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/de.lproj/PaxHeaders.4960/InfoGeneralView.xib0000644000000000000000000000013212664476420022430 xustar0030 mtime=1456635152.187499804 30 atime=1456635152.187499804 30 ctime=1457295922.696853764 transmission-2.92/macosx/de.lproj/InfoGeneralView.xib0000644000175000017500000006272412664476420024070 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/de.lproj/PaxHeaders.4960/AddMagnetWindow.xib0000644000000000000000000000013112662757243022422 xustar0029 mtime=1456201379.25886194 30 atime=1456201379.257861923 30 ctime=1457295922.697853781 transmission-2.92/macosx/de.lproj/AddMagnetWindow.xib0000644000175000017500000006537712662757243024072 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/de.lproj/PaxHeaders.4960/MainMenu.xib0000644000000000000000000000013112644245522021107 xustar0029 mtime=1452362578.79969987 30 atime=1452362578.798699852 30 ctime=1457295922.697853781 transmission-2.92/macosx/de.lproj/MainMenu.xib0000644000175000017500000021663312644245522022550 0ustar00mikedldmikedld00000000000000 CA CA YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7NjIsIDYyfdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPEREyTU0AKgAAA6yANJsuF/gC DQeEQmFQuGQ2HQ+IRGJROKRWLReMRmIwKCRqPR+QSGRSOSSWHRyCyaVSuWS2XS+EyiYTOaTWbTcATKcT ueT2fRuBymf0OiUWaTqjUmlUuP0imU+oVGF06pVWrUmqVetVucVmuV+wSyvWGyWWm0GzWm1Rqx2u3W+Y tlwUK4XW7Tm5XS73u1QK53zAX284HCWS/XrC4mq4fFY2rYzHZGn5DJZWjNJsX/LZuh5jNZzQTvPYjQ6W X6PTamZ6jVa2xZnSa7ZU3YbPbSJo7Xb7uNbnP7zgRTfbHg8WF8PjcmH8jlc2FczndEAdDpc3qdXk9fsc Xtdvgd3vbvweHbePybLzefW+n1an2e3S+/4aD5RYlkQeAAD/uVvn/AAWpeGI+aVPqipEECPIAAhBgAHr B4AH3CSKgLCoAAXDAAHhDYADwP5DwIk0DIoRRBj2AEKgKABFEaSKQDsOg4QifR9AAOw+kKpglCGHb9P4 kb/HyABbF6YqtRGiZGEKPoAANJwADcOsmI+SBFEEAB+QmOg9kGphDkAPAAAtMaSHVMwADyQBESO3SSkc Q4/gACU5gAWE7TqW5fgAJwjh/HwDgBIIAFkXJggAKAkiCAAn0YAB30eAA5DyQKmDyOQ1AACNNJJR53gA Q5HEskh5nkeIAF4XBaUcdx1xQAgCIzJCJEgRNKAxW4AHRXQADgO841pW1cV0dFeV8AFgABW4MVzXdezi pYMgqCKXnOddPJGWZWlQAAHAaBQAAncMUQsjFZIiSRFy7OYJAAcN3AAPZBEUABCj8OwAAzfIAHPfl4Xl el7AAD+BgAd2DShKTzloVpTAAFoWhYAAG4mAABYtWM2pIShGxzJwDAAP5BENfdrXxaUoDWM4AEkSpM5J T1o2mQI/D0AEaRqNg5xOpdEUUBGfpIfGhTxPSRmIXxcgAEIQA7cFxVfWFy4ykZLEfEGPAAMg1jmhpEkF mo7j9kaGE4SpG5tGgADUOMFKWTJJXmDW5JIc26gAM43XukcHnoABtGqaD9AKAc/4w36RkwSJEgACnGzr O5+8iAAB8oAAk8uABb80AHIn7yfKih0IAHZ0gADQN47qZBEFcaCiSdIdkOw/NnDpEQw/9T1qV9gAA9ED xdoZOl1q2uq1zIhmKa+JEKSlkXBfmyD4QBCE3mNUNw5DsQwxjMNW2+s0oUhUFgYjsPQ/EgGQaBsH3wNM FAUhWGAkCWJosCEIYjCgD4QhEE77jEkBAAAPAQAAAwAAAAEAPgAAAQEAAwAAAAEAPgAAAQIAAwAAAAQA AARmAQMAAwAAAAEABQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEA BAAAARYAAwAAAAEAPgAAARcABAAAAAEAAAOjARwAAwAAAAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEA AQAAAVMAAwAAAAQAAARuh3MABwAADLwAAAR2AAAAAAAIAAgACAAIAAEAAQABAAEAAAy8YXBwbAIQAABt bnRyUkdCIFhZWiAH3gABAAgACQA1ABdhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYA AQAAAADTLWFwcGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFk ZXNjAAABUAAAAGJkc2NtAAABtAAAAaRjcHJ0AAADWAAAACN3dHB0AAADfAAAABRyWFlaAAADkAAAABRn WFlaAAADpAAAABRiWFlaAAADuAAAABRyVFJDAAADzAAACAxhYXJnAAAL2AAAACB2Y2d0AAAL+AAAADBu ZGluAAAMKAAAAD5jaGFkAAAMaAAAACxtbW9kAAAMlAAAAChiVFJDAAADzAAACAxnVFJDAAADzAAACAxh YWJnAAAL2AAAACBhYWdnAAAL2AAAACBkZXNjAAAAAAAAAAhEaXNwbGF5AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAbWx1YwAAAAAAAAAhAAAADGhySFIAAAAIAAABnGtvS1IAAAAIAAABnG5iTk8AAAAIAAABnGlkAAAA AAAIAAABnGh1SFUAAAAIAAABnGNzQ1oAAAAIAAABnGRhREsAAAAIAAABnHVrVUEAAAAIAAABnGFyAAAA AAAIAAABnGl0SVQAAAAIAAABnHJvUk8AAAAIAAABnG5sTkwAAAAIAAABnGhlSUwAAAAIAAABnGVzRVMA AAAIAAABnGZpRkkAAAAIAAABnHpoVFcAAAAIAAABnHZpVk4AAAAIAAABnHNrU0sAAAAIAAABnHpoQ04A AAAIAAABnHJ1UlUAAAAIAAABnGZyRlIAAAAIAAABnG1zAAAAAAAIAAABnGNhRVMAAAAIAAABnHRoVEgA AAAIAAABnGRlREUAAAAIAAABnGVuVVMAAAAIAAABnHB0QlIAAAAIAAABnHBsUEwAAAAIAAABnGVsR1IA AAAIAAABnHN2U0UAAAAIAAABnHRyVFIAAAAIAAABnGphSlAAAAAIAAABnHB0UFQAAAAIAAABnABpAE0A YQBjdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUgSW5jLiwgMjAxNAAAWFlaIAAAAAAAAPMWAAEAAAABFspY WVogAAAAAAAAccAAADmKAAABZ1hZWiAAAAAAAABhIwAAueYAABP2WFlaIAAAAAAAACPyAAAMkAAAvdBj dXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADYAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIA dwB8AIEAhgCLAJAAlQCaAJ8AowCoAK0AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0B EwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB 6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwAD CwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEE fgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcG SAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoI bgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK 8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN 3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMR MRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U 8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZ IBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkd wx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i 3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8o cSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwu gi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1 EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8 JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31D wEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL 4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJU j1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhd yV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1n k2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx 8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF8 4X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASI aYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCU ipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNih R6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2u oa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8 m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfL Nsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHa dtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDq W+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf6 5/t3/Af8mP0p/br+S/7c/23//3BhcmEAAAAAAAMAAAACZmYAAPKnAAANWQAAE9AAAAoOdmNndAAAAAAA AAABAAEAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAEAAAAAAAAAAQAAbmRpbgAAAAAAAAA2AACnQAAAVYAA AEzAAACewAAAJYAAAAzAAABQAAAAVEAAAjMzAAIzMwACMzMAAAAAAAAAAHNmMzIAAAAAAAEMcgAABfj/ //MdAAAHugAA/XL///ud///9pAAAA9kAAMBxbW1vZAAAAAAAAAYQAACgBwAAAADJJx4AAAAAAAAAAAAA AAAAAAAAANIlJicoWiRjbGFzc25hbWVYJGNsYXNzZXNfEBBOU0JpdG1hcEltYWdlUmVwoycpKlpOU0lt YWdlUmVwWE5TT2JqZWN00iUmLC1XTlNBcnJheaIsKtIlJi8wXk5TTXV0YWJsZUFycmF5oy8sKtMyMwo0 NTZXTlNXaGl0ZVxOU0NvbG9yU3BhY2VEMCAwABADgAzSJSY4OVdOU0NvbG9yojgq0iUmOzxXTlNJbWFn ZaI7Kl8QD05TS2V5ZWRBcmNoaXZlctE/QFRyb290gAEACAARABoAIwAtADIANwBGAEwAVwBeAGUAcgB5 AIEAgwCFAIoAjACOAJcAnACnAKkAqwCtALIAtQC3ALkAuwC9AMIA2QDbAN0SExIYEiMSLBI/EkMSThJX ElwSZBJnEmwSexJ/EoYSjhKbEqASohKkEqkSsRK0ErkSwRLEEtYS2RLeAAAAAAAAAgEAAAAAAAAAQQAA AAAAAAAAAAAAAAAAEuA transmission-2.92/macosx/de.lproj/PaxHeaders.4960/GroupRules.xib0000644000000000000000000000013212666747213021516 xustar0030 mtime=1457245835.380999764 30 atime=1457245835.380999764 30 ctime=1457295922.697853781 transmission-2.92/macosx/de.lproj/GroupRules.xib0000644000175000017500000004167312666747213023156 0ustar00mikedldmikedld00000000000000 name comment name comment fFlatFileList.name allTrackersFlat fFlatFileList.name allTrackersFlat transmission-2.92/macosx/de.lproj/PaxHeaders.4960/AddWindow.xib0000644000000000000000000000013212640354045021254 xustar0030 mtime=1451350053.291164995 30 atime=1451350053.291164995 30 ctime=1457295922.696853764 transmission-2.92/macosx/de.lproj/AddWindow.xib0000644000175000017500000007276112640354045022716 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/de.lproj/PaxHeaders.4960/GlobalOptionsPopover.xib0000644000000000000000000000013012640354045023521 xustar0029 mtime=1451350053.29316503 29 atime=1451350053.29316503 30 ctime=1457295922.697853781 transmission-2.92/macosx/de.lproj/GlobalOptionsPopover.xib0000644000175000017500000006371212640354045025161 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/GlobalOptionsPopoverViewController.h0000644000000000000000000000013212442116650024350 xustar0030 mtime=1418239400.336863606 30 atime=1418239400.336863606 30 ctime=1457295923.175861909 transmission-2.92/macosx/GlobalOptionsPopoverViewController.h0000644000175000017500000000424012442116650025775 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: GlobalOptionsPopoverViewController.h 14226 2014-01-19 01:29:38Z jordan $ * * Copyright (c) 2011-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import "transmission.h" @interface GlobalOptionsPopoverViewController : NSViewController { tr_session * fHandle; NSUserDefaults * fDefaults; IBOutlet NSTextField * fUploadLimitField, * fDownloadLimitField; IBOutlet NSTextField * fRatioStopField, * fIdleStopField; NSString * fInitialString; } - (id) initWithHandle: (tr_session *) handle; - (IBAction) updatedDisplayString: (id) sender; - (IBAction) setDownSpeedSetting: (id) sender; - (IBAction) setDownSpeedLimit: (id) sender; - (IBAction) setUpSpeedSetting: (id) sender; - (IBAction) setUpSpeedLimit: (id) sender; - (IBAction) setRatioStopSetting: (id) sender; - (IBAction) setRatioStopLimit: (id) sender; - (IBAction) setIdleStopSetting: (id) sender; - (IBAction) setIdleStopLimit: (id) sender; @end transmission-2.92/macosx/PaxHeaders.4960/BlocklistDownloaderViewController.m0000644000000000000000000000013212442116621024171 xustar0030 mtime=1418239377.036464307 30 atime=1418239377.036464307 30 ctime=1457295922.955858168 transmission-2.92/macosx/BlocklistDownloaderViewController.m0000644000175000017500000001320612442116621025620 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: BlocklistDownloaderViewController.m 13253 2012-03-13 03:20:09Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "BlocklistDownloaderViewController.h" #import "BlocklistDownloader.h" #import "PrefsController.h" #import "NSStringAdditions.h" @interface BlocklistDownloaderViewController (Private) - (id) initWithPrefsController: (PrefsController *) prefsController; - (void) startDownload; - (void) failureSheetClosed: (NSAlert *) alert returnCode: (NSInteger) code contextInfo: (void *) info; @end @implementation BlocklistDownloaderViewController BlocklistDownloaderViewController * fBLViewController = nil; + (void) downloadWithPrefsController: (PrefsController *) prefsController { if (!fBLViewController) { fBLViewController = [[BlocklistDownloaderViewController alloc] initWithPrefsController: prefsController]; [fBLViewController startDownload]; } } - (void) awakeFromNib { [fButton setTitle: NSLocalizedString(@"Cancel", "Blocklist -> cancel button")]; const CGFloat oldWidth = NSWidth([fButton frame]); [fButton sizeToFit]; NSRect buttonFrame = [fButton frame]; buttonFrame.size.width += 12.0; //sizeToFit sizes a bit too small buttonFrame.origin.x -= NSWidth(buttonFrame) - oldWidth; [fButton setFrame: buttonFrame]; [fProgressBar setUsesThreadedAnimation: YES]; [fProgressBar startAnimation: self]; } - (void) cancelDownload: (id) sender { [[BlocklistDownloader downloader] cancelDownload]; } - (void) setStatusStarting { [fTextField setStringValue: [NSLocalizedString(@"Connecting to site", "Blocklist -> message") stringByAppendingEllipsis]]; [fProgressBar setIndeterminate: YES]; } - (void) setStatusProgressForCurrentSize: (NSUInteger) currentSize expectedSize: (long long) expectedSize { NSString * string = NSLocalizedString(@"Downloading blocklist", "Blocklist -> message"); if (expectedSize != NSURLResponseUnknownLength) { [fProgressBar setIndeterminate: NO]; NSString * substring = [NSString stringForFilePartialSize: currentSize fullSize: expectedSize]; string = [string stringByAppendingFormat: @" (%@)", substring]; [fProgressBar setDoubleValue: (double)currentSize / expectedSize]; } else string = [string stringByAppendingFormat: @" (%@)", [NSString stringForFileSize: currentSize]]; [fTextField setStringValue: string]; } - (void) setStatusProcessing { //change to indeterminate while processing [fProgressBar setIndeterminate: YES]; [fProgressBar startAnimation: self]; [fTextField setStringValue: [NSLocalizedString(@"Processing blocklist", "Blocklist -> message") stringByAppendingEllipsis]]; [fButton setEnabled: NO]; } - (void) setFinished { [NSApp endSheet: fStatusWindow]; [fStatusWindow orderOut: self]; fBLViewController = nil; [self release]; } - (void) setFailed: (NSString *) error { [NSApp endSheet: fStatusWindow]; [fStatusWindow orderOut: self]; NSAlert * alert = [[[NSAlert alloc] init] autorelease]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Blocklist -> button")]; [alert setMessageText: NSLocalizedString(@"Download of the blocklist failed.", "Blocklist -> message")]; [alert setAlertStyle: NSWarningAlertStyle]; [alert setInformativeText: error]; [alert beginSheetModalForWindow: [fPrefsController window] modalDelegate: self didEndSelector: @selector(failureSheetClosed:returnCode:contextInfo:) contextInfo: nil]; } @end @implementation BlocklistDownloaderViewController (Private) - (id) initWithPrefsController: (PrefsController *) prefsController { if ((self = [super init])) { fPrefsController = prefsController; } return self; } - (void) startDownload { //load window and show as sheet [NSBundle loadNibNamed: @"BlocklistStatusWindow" owner: self]; BlocklistDownloader * downloader = [BlocklistDownloader downloader]; [downloader setViewController: self]; //do before showing the sheet to ensure it doesn't slide out with placeholder text [NSApp beginSheet: fStatusWindow modalForWindow: [fPrefsController window] modalDelegate: nil didEndSelector: nil contextInfo: nil]; } - (void) failureSheetClosed: (NSAlert *) alert returnCode: (NSInteger) code contextInfo: (void *) info { [[alert window] orderOut: self]; fBLViewController = nil; [self release]; } @end transmission-2.92/macosx/PaxHeaders.4960/NSStringAdditions.m0000644000000000000000000000013212505250243020672 xustar0030 mtime=1427460259.985235356 30 atime=1427460259.985235356 30 ctime=1457295923.395865651 transmission-2.92/macosx/NSStringAdditions.m0000644000175000017500000003024112505250243022317 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: NSStringAdditions.m 14341 2014-10-17 05:12:00Z livings124 $ * * Copyright (c) 2005-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "NSApplicationAdditions.h" #import "NSStringAdditions.h" #import "transmission.h" #import "utils.h" @interface NSString (Private) + (NSString *) stringForFileSizeLion: (uint64_t) size showUnitUnless: (NSString *) notAllowedUnit unitsUsed: (NSString **) unitUsed; + (NSString *) stringForSpeed: (CGFloat) speed kb: (NSString *) kb mb: (NSString *) mb gb: (NSString *) gb; @end @implementation NSString (NSStringAdditions) + (NSString *) ellipsis { return [NSString stringWithUTF8String: "\xE2\x80\xA6"]; } - (NSString *) stringByAppendingEllipsis { return [self stringByAppendingString: [NSString ellipsis]]; } #warning use localizedStringWithFormat: directly when 10.8-only + (NSString *) formattedUInteger: (NSUInteger) value { if ([NSApp isOnMountainLionOrBetter]) return [NSString localizedStringWithFormat: @"%lu", value]; else { static NSNumberFormatter * numberFormatter; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ numberFormatter = [[NSNumberFormatter alloc] init]; [numberFormatter setNumberStyle: NSNumberFormatterDecimalStyle]; [numberFormatter setMaximumFractionDigits: 0]; }); return [numberFormatter stringFromNumber: [NSNumber numberWithUnsignedInteger: value]]; } } #warning should we take long long instead? + (NSString *) stringForFileSize: (uint64_t) size { if ([NSApp isOnMountainLionOrBetter]) return [NSByteCountFormatterMtLion stringFromByteCount: size countStyle: NSByteCountFormatterCountStyleFile]; else return [self stringForFileSizeLion: size showUnitUnless: nil unitsUsed: nil]; } #warning should we take long long instead? + (NSString *) stringForFilePartialSize: (uint64_t) partialSize fullSize: (uint64_t) fullSize { NSString * partialString, * fullString; if ([NSApp isOnMountainLionOrBetter]) { NSByteCountFormatter * fileSizeFormatter = [[NSByteCountFormatterMtLion alloc] init]; fullString = [fileSizeFormatter stringFromByteCount: fullSize]; //figure out the magniture of the two, since we can't rely on comparing the units because of localization and pluralization issues (for example, "1 byte of 2 bytes") BOOL partialUnitsSame; if (partialSize == 0) partialUnitsSame = YES; //we want to just show "0" when we have no partial data, so always set to the same units else { const unsigned int magnitudePartial = log(partialSize)/log(1000); const unsigned int magnitudeFull = fullSize < 1000 ? 0 : log(fullSize)/log(1000); //we have to catch 0 with a special case, so might as well avoid the math for all of magnitude 0 partialUnitsSame = magnitudePartial == magnitudeFull; } [fileSizeFormatter setIncludesUnit: !partialUnitsSame]; partialString = [fileSizeFormatter stringFromByteCount: partialSize]; [fileSizeFormatter release]; } else { NSString * units; fullString = [self stringForFileSizeLion: fullSize showUnitUnless: nil unitsUsed: &units]; partialString = [self stringForFileSizeLion: partialSize showUnitUnless: units unitsUsed: nil]; } return [NSString stringWithFormat: NSLocalizedString(@"%@ of %@", "file size string"), partialString, fullString]; } + (NSString *) stringForSpeed: (CGFloat) speed { return [self stringForSpeed: speed kb: NSLocalizedString(@"KB/s", "Transfer speed (kilobytes per second)") mb: NSLocalizedString(@"MB/s", "Transfer speed (megabytes per second)") gb: NSLocalizedString(@"GB/s", "Transfer speed (gigabytes per second)")]; } + (NSString *) stringForSpeedAbbrev: (CGFloat) speed { return [self stringForSpeed: speed kb: @"K" mb: @"M" gb: @"G"]; } + (NSString *) stringForRatio: (CGFloat) ratio { //N/A is different than libtransmission's if ((int)ratio == TR_RATIO_NA) return NSLocalizedString(@"N/A", "No Ratio"); else if ((int)ratio == TR_RATIO_INF) return [NSString stringWithUTF8String: "\xE2\x88\x9E"]; else { if (ratio < 10.0) return [NSString localizedStringWithFormat: @"%.2f", tr_truncd(ratio, 2)]; else if (ratio < 100.0) return [NSString localizedStringWithFormat: @"%.1f", tr_truncd(ratio, 1)]; else return [NSString localizedStringWithFormat: @"%.0f", tr_truncd(ratio, 0)]; } } + (NSString *) percentString: (CGFloat) progress longDecimals: (BOOL) longDecimals { if (progress >= 1.0) return [NSString localizedStringWithFormat: @"%d%%", 100]; else if (longDecimals) return [NSString localizedStringWithFormat: @"%.2f%%", tr_truncd(progress * 100.0, 2)]; else return [NSString localizedStringWithFormat: @"%.1f%%", tr_truncd(progress * 100.0, 1)]; } + (NSString *) timeString: (uint64_t) seconds includesTimeRemainingPhrase: (BOOL) includesTimeRemainingPhrase showSeconds: (BOOL) showSeconds { return [NSString timeString: seconds includesTimeRemainingPhrase: includesTimeRemainingPhrase showSeconds: showSeconds maxFields: NSUIntegerMax]; } + (NSString *) timeString: (uint64_t) seconds includesTimeRemainingPhrase: (BOOL) includesTimeRemainingPhrase showSeconds: (BOOL) showSeconds maxFields: (NSUInteger) max { NSAssert(![NSApp isOnYosemiteOrBetter], @"you should be using NSDateComponentsFormatter on >= 10.10"); NSParameterAssert(max > 0); NSMutableArray * timeArray = [NSMutableArray arrayWithCapacity: MIN(max, 5)]; NSUInteger remaining = seconds; //causes problems for some users when it's a uint64_t if (seconds >= 31557600) //official amount of seconds in one year { const NSUInteger years = remaining / 31557600; if (years == 1) [timeArray addObject: NSLocalizedString(@"1 year", "time string")]; else [timeArray addObject: [NSString stringWithFormat: NSLocalizedString(@"%u years", "time string"), years]]; remaining %= 31557600; --max; } if (max > 0 && seconds >= (24 * 60 * 60)) { const NSUInteger days = remaining / (24 * 60 * 60); if (days == 1) [timeArray addObject: NSLocalizedString(@"1 day", "time string")]; else [timeArray addObject: [NSString stringWithFormat: NSLocalizedString(@"%u days", "time string"), days]]; remaining %= (24 * 60 * 60); --max; } if (max > 0 && seconds >= (60 * 60)) { [timeArray addObject: [NSString stringWithFormat: NSLocalizedString(@"%u hr", "time string"), remaining / (60 * 60)]]; remaining %= (60 * 60); --max; } if (max > 0 && (!showSeconds || seconds >= 60)) { [timeArray addObject: [NSString stringWithFormat: NSLocalizedString(@"%u min", "time string"), remaining / 60]]; remaining %= 60; --max; } if (max > 0 && showSeconds) [timeArray addObject: [NSString stringWithFormat: NSLocalizedString(@"%u sec", "time string"), remaining]]; NSString * timeString = [timeArray componentsJoinedByString: @" "]; if (includesTimeRemainingPhrase) { timeString = [NSString stringWithFormat: NSLocalizedString(@"%@ remaining", "time remaining string"), timeString]; } return timeString; } - (NSComparisonResult) compareNumeric: (NSString *) string { const NSStringCompareOptions comparisonOptions = NSNumericSearch | NSForcedOrderingSearch; return [self compare: string options: comparisonOptions range: NSMakeRange(0, [self length]) locale: [NSLocale currentLocale]]; } - (NSArray *) betterComponentsSeparatedByCharactersInSet: (NSCharacterSet *) separators { NSMutableArray * components = [NSMutableArray array]; NSCharacterSet * includededCharSet = [separators invertedSet]; NSUInteger index = 0; const NSUInteger fullLength = [self length]; do { const NSUInteger start = [self rangeOfCharacterFromSet: includededCharSet options: 0 range: NSMakeRange(index, fullLength - index)].location; if (start == NSNotFound) break; const NSRange endRange = [self rangeOfCharacterFromSet: separators options: 0 range: NSMakeRange(start, fullLength - start)]; if (endRange.location == NSNotFound) { [components addObject: [self substringFromIndex: start]]; break; } [components addObject: [self substringWithRange: NSMakeRange(start, endRange.location - start)]]; index = NSMaxRange(endRange); } while (YES); return components; } @end @implementation NSString (Private) + (NSString *) stringForFileSizeLion: (uint64_t) size showUnitUnless: (NSString *) notAllowedUnit unitsUsed: (NSString **) unitUsed { double convertedSize; NSString * unit; NSUInteger decimals; if (size < pow(1000, 2)) { convertedSize = size / 1000.0; unit = NSLocalizedString(@"KB", "File size - kilobytes"); decimals = convertedSize >= 10.0 ? 0 : 1; } else if (size < pow(1000, 3)) { convertedSize = size / powf(1000.0, 2); unit = NSLocalizedString(@"MB", "File size - megabytes"); decimals = 1; } else if (size < pow(1000, 4)) { convertedSize = size / powf(1000.0, 3); unit = NSLocalizedString(@"GB", "File size - gigabytes"); decimals = 2; } else { convertedSize = size / powf(1000.0, 4); unit = NSLocalizedString(@"TB", "File size - terabytes"); decimals = 2; } //match Finder's behavior NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init]; [numberFormatter setNumberStyle: NSNumberFormatterDecimalStyle]; [numberFormatter setMinimumFractionDigits: 0]; [numberFormatter setMaximumFractionDigits: decimals]; NSString * fileSizeString = [numberFormatter stringFromNumber: [NSNumber numberWithFloat: convertedSize]]; [numberFormatter release]; if (!notAllowedUnit || ![unit isEqualToString: notAllowedUnit]) fileSizeString = [fileSizeString stringByAppendingFormat: @" %@", unit]; if (unitUsed) *unitUsed = unit; return fileSizeString; } + (NSString *) stringForSpeed: (CGFloat) speed kb: (NSString *) kb mb: (NSString *) mb gb: (NSString *) gb { if (speed <= 999.95) //0.0 KB/s to 999.9 KB/s return [NSString localizedStringWithFormat: @"%.1f %@", speed, kb]; speed /= 1000.0; if (speed <= 99.995) //1.00 MB/s to 99.99 MB/s return [NSString localizedStringWithFormat: @"%.2f %@", speed, mb]; else if (speed <= 999.95) //100.0 MB/s to 999.9 MB/s return [NSString localizedStringWithFormat: @"%.1f %@", speed, mb]; else //insane speeds return [NSString localizedStringWithFormat: @"%.2f %@", (speed / 1000.0), gb]; } @end transmission-2.92/macosx/PaxHeaders.4960/InfoActivityViewController.h0000644000000000000000000000013212442116666022640 xustar0030 mtime=1418239414.208101314 30 atime=1418239414.208101314 30 ctime=1457295923.256863287 transmission-2.92/macosx/InfoActivityViewController.h0000644000175000017500000000537512442116666024277 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoActivityViewController.h 14051 2013-03-12 03:08:59Z livings124 $ * * Copyright (c) 2010-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import "InfoViewController.h" @class PiecesView; @class Torrent; @interface InfoActivityViewController : NSViewController { NSArray * fTorrents; BOOL fSet; IBOutlet NSTextField * fDateAddedField, * fDateCompletedField, * fDateActivityField, * fStateField, * fProgressField, * fHaveField, * fDownloadedTotalField, * fUploadedTotalField, * fFailedHashField, * fRatioField, * fDownloadTimeField, * fSeedTimeField; IBOutlet NSTextView * fErrorMessageView; IBOutlet PiecesView * fPiecesView; IBOutlet NSSegmentedControl * fPiecesControl; //remove when we switch to auto layout on 10.7 IBOutlet NSTextField * fTransferSectionLabel, * fDatesSectionLabel, * fTimeSectionLabel; IBOutlet NSTextField * fStateLabel, * fProgressLabel, * fHaveLabel, * fDownloadedLabel, * fUploadedLabel, * fFailedDLLabel, * fRatioLabel, * fErrorLabel, * fDateAddedLabel, * fDateCompletedLabel, * fDateActivityLabel, * fDownloadTimeLabel, * fSeedTimeLabel; IBOutlet NSScrollView * fErrorScrollView; } - (void) setInfoForTorrents: (NSArray *) torrents; - (void) updateInfo; - (IBAction) setPiecesView: (id) sender; - (IBAction) updatePiecesView: (id) sender; - (void) clearView; @end transmission-2.92/macosx/PaxHeaders.4960/TorrentTableView.h0000644000000000000000000000013212666747213020577 xustar0030 mtime=1457245835.373999644 30 atime=1457245835.373999644 30 ctime=1457295923.592869001 transmission-2.92/macosx/TorrentTableView.h0000644000175000017500000000627612666747213022237 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: TorrentTableView.h 14705 2016-03-03 17:57:08Z mikedld $ * * Copyright (c) 2005-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import @class Controller; @class Torrent; @class TorrentCell; #define GROUP_SEPARATOR_HEIGHT 18.0 @interface TorrentTableView : NSOutlineView { IBOutlet Controller * fController; TorrentCell * fTorrentCell; NSUserDefaults * fDefaults; NSMutableIndexSet * fCollapsedGroups; IBOutlet NSMenu * fContextRow, * fContextNoRow; NSInteger fMouseRow, fMouseControlRow, fMouseRevealRow, fMouseActionRow; NSArray * fSelectedValues; IBOutlet NSMenu * fActionMenu, * fUploadMenu, * fDownloadMenu, * fRatioMenu, * fPriorityMenu; IBOutlet NSMenuItem * fGlobalLimitItem; Torrent * fMenuTorrent; CGFloat fPiecesBarPercent; NSAnimation * fPiecesBarAnimation; BOOL fActionPopoverShown; } - (BOOL) isGroupCollapsed: (NSInteger) value; - (void) removeCollapsedGroup: (NSInteger) value; - (void) removeAllCollapsedGroups; - (void) saveCollapsedGroups; - (void) removeTrackingAreas; - (void) setRowHover: (NSInteger) row; - (void) setControlButtonHover: (NSInteger) row; - (void) setRevealButtonHover: (NSInteger) row; - (void) setActionButtonHover: (NSInteger) row; - (void) selectValues: (NSArray *) values; - (NSArray *) selectedValues; - (NSArray *) selectedTorrents; - (NSRect) iconRectForRow: (NSInteger) row; - (void) paste: (id) sender; - (void) toggleControlForTorrent: (Torrent *) torrent; - (void) displayTorrentActionPopoverForEvent: (NSEvent *) event; - (void) setQuickLimitMode: (id) sender; - (void) setQuickLimit: (id) sender; - (void) setGlobalLimit: (id) sender; - (void) setQuickRatioMode: (id) sender; - (void) setQuickRatio: (id) sender; - (void) setPriority: (id) sender; - (void) togglePiecesBar; - (CGFloat) piecesBarPercent; - (void) selectAndScrollToRow: (NSInteger) row; @end transmission-2.92/macosx/PaxHeaders.4960/Growl.framework0000644000000000000000000000013212442116621020160 xustar0030 mtime=1418239377.548473081 30 atime=1418239374.411419321 30 ctime=1457295922.516850703 transmission-2.92/macosx/Growl.framework/0000755000175000017500000000000012442116621021662 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Growl.framework/PaxHeaders.4960/Headers0000644000000000000000000000013112442116621021532 xustar0029 mtime=1418239377.29046866 30 atime=1418239377.045464461 30 ctime=1457295922.514850669 transmission-2.92/macosx/Growl.framework/Headers/0000755000175000017500000000000012442116621023235 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Growl.framework/Headers/PaxHeaders.4960/GrowlApplicationBridge.h0000644000000000000000000000013012442116621026352 xustar0029 mtime=1418239377.29046866 29 atime=1418239377.29046866 30 ctime=1457295922.514850669 transmission-2.92/macosx/Growl.framework/Headers/GrowlApplicationBridge.h0000644000175000017500000006400312442116621030004 0ustar00mikedldmikedld00000000000000// // GrowlApplicationBridge.h // Growl // // Created by Evan Schoenberg on Wed Jun 16 2004. // Copyright 2004-2006 The Growl Project. All rights reserved. // /*! * @header GrowlApplicationBridge.h * @abstract Defines the GrowlApplicationBridge class. * @discussion This header defines the GrowlApplicationBridge class as well as * the GROWL_PREFPANE_BUNDLE_IDENTIFIER constant. */ #ifndef __GrowlApplicationBridge_h__ #define __GrowlApplicationBridge_h__ #import #import #import //Forward declarations @protocol GrowlApplicationBridgeDelegate; //------------------------------------------------------------------------------ #pragma mark - /*! * @class GrowlApplicationBridge * @abstract A class used to interface with Growl. * @discussion This class provides a means to interface with Growl. * * Currently it provides a way to detect if Growl is installed and launch the * GrowlHelperApp if it's not already running. */ @interface GrowlApplicationBridge : NSObject { } /*! * @method isGrowlInstalled * @abstract Detects whether Growl is installed. * @discussion Determines if the Growl prefpane and its helper app are installed. * @result this method will forever return YES. */ + (BOOL) isGrowlInstalled __attribute__((deprecated)); /*! * @method isGrowlRunning * @abstract Detects whether GrowlHelperApp is currently running. * @discussion Cycles through the process list to find whether GrowlHelperApp is running and returns its findings. * @result Returns YES if GrowlHelperApp is running, NO otherwise. */ + (BOOL) isGrowlRunning; /*! * @method isMistEnabled * @abstract Gives the caller a fairly good indication of whether or not built-in notifications(Mist) will be used. * @discussion since this call makes use of isGrowlRunning it is entirely possible for this value to change between call and * executing a notification dispatch * @result Returns YES if Growl isn't reachable and the developer has not opted-out of * Mist and the user hasn't set the global mist enable key to false. */ + (BOOL)isMistEnabled; /*! * @method setShouldUseBuiltInNotifications * @abstract opt-out mechanism for the mist notification style in the event growl can't be reached. * @discussion if growl is unavailable due to not being installed or as a result of being turned off then * this option can enable/disable a built-in fire and forget display style * @param should Specifies whether or not the developer wants to opt-in (default) or opt out * of the built-in Mist style in the event Growl is unreachable. */ + (void)setShouldUseBuiltInNotifications:(BOOL)should; /*! * @method shouldUseBuiltInNotifications * @abstract returns the current opt-in state of the framework's use of the Mist display style. * @result Returns NO if the developer opt-ed out of Mist, the default value is YES. */ + (BOOL)shouldUseBuiltInNotifications; #pragma mark - /*! * @method setGrowlDelegate: * @abstract Set the object which will be responsible for providing and receiving Growl information. * @discussion This must be called before using GrowlApplicationBridge. * * The methods in the GrowlApplicationBridgeDelegate protocol are required * and return the basic information needed to register with Growl. * * The methods in the GrowlApplicationBridgeDelegate_InformalProtocol * informal protocol are individually optional. They provide a greater * degree of interaction between the application and growl such as informing * the application when one of its Growl notifications is clicked by the user. * * The methods in the GrowlApplicationBridgeDelegate_Installation_InformalProtocol * informal protocol are individually optional and are only applicable when * using the Growl-WithInstaller.framework which allows for automated Growl * installation. * * When this method is called, data will be collected from inDelegate, Growl * will be launched if it is not already running, and the application will be * registered with Growl. * * If using the Growl-WithInstaller framework, if Growl is already installed * but this copy of the framework has an updated version of Growl, the user * will be prompted to update automatically. * * @param inDelegate The delegate for the GrowlApplicationBridge. It must conform to the GrowlApplicationBridgeDelegate protocol. */ + (void) setGrowlDelegate:(NSObject *)inDelegate; /*! * @method growlDelegate * @abstract Return the object responsible for providing and receiving Growl information. * @discussion See setGrowlDelegate: for details. * @result The Growl delegate. */ + (NSObject *) growlDelegate; #pragma mark - /*! * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext: * @abstract Send a Growl notification. * @discussion This is the preferred means for sending a Growl notification. * The notification name and at least one of the title and description are * required (all three are preferred). All other parameters may be * nil (or 0 or NO as appropriate) to accept default values. * * If using the Growl-WithInstaller framework, if Growl is not installed the * user will be prompted to install Growl. If the user cancels, this method * will have no effect until the next application session, at which time when * it is called the user will be prompted again. The user is also given the * option to not be prompted again. If the user does choose to install Growl, * the requested notification will be displayed once Growl is installed and * running. * * @param title The title of the notification displayed to the user. * @param description The full description of the notification displayed to the user. * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane. * @param iconData NSData object to show with the notification as its icon. If nil, the application's icon will be used instead. * @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority. * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications. * @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of NSString, NSArray, NSNumber, NSDictionary, and NSData types). */ + (void) notifyWithTitle:(NSString *)title description:(NSString *)description notificationName:(NSString *)notifName iconData:(NSData *)iconData priority:(signed int)priority isSticky:(BOOL)isSticky clickContext:(id)clickContext; /*! * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:identifier: * @abstract Send a Growl notification. * @discussion This is the preferred means for sending a Growl notification. * The notification name and at least one of the title and description are * required (all three are preferred). All other parameters may be * nil (or 0 or NO as appropriate) to accept default values. * * If using the Growl-WithInstaller framework, if Growl is not installed the * user will be prompted to install Growl. If the user cancels, this method * will have no effect until the next application session, at which time when * it is called the user will be prompted again. The user is also given the * option to not be prompted again. If the user does choose to install Growl, * the requested notification will be displayed once Growl is installed and * running. * * @param title The title of the notification displayed to the user. * @param description The full description of the notification displayed to the user. * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane. * @param iconData NSData object to show with the notification as its icon. If nil, the application's icon will be used instead. * @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority. * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications. * @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of NSString, NSArray, NSNumber, NSDictionary, and NSData types). * @param identifier An identifier for this notification. Notifications with equal identifiers are coalesced. */ + (void) notifyWithTitle:(NSString *)title description:(NSString *)description notificationName:(NSString *)notifName iconData:(NSData *)iconData priority:(signed int)priority isSticky:(BOOL)isSticky clickContext:(id)clickContext identifier:(NSString *)identifier; /*! @method notifyWithDictionary: * @abstract Notifies using a userInfo dictionary suitable for passing to * NSDistributedNotificationCenter. * @param userInfo The dictionary to notify with. * @discussion Before Growl 0.6, your application would have posted * notifications using NSDistributedNotificationCenter by * creating a userInfo dictionary with the notification data. This had the * advantage of allowing you to add other data to the dictionary for programs * besides Growl that might be listening. * * This method allows you to use such dictionaries without being restricted * to using NSDistributedNotificationCenter. The keys for this dictionary * can be found in GrowlDefines.h. */ + (void) notifyWithDictionary:(NSDictionary *)userInfo; #pragma mark - /*! @method registerWithDictionary: * @abstract Register your application with Growl without setting a delegate. * @discussion When you call this method with a dictionary, * GrowlApplicationBridge registers your application using that dictionary. * If you pass nil, GrowlApplicationBridge will ask the delegate * (if there is one) for a dictionary, and if that doesn't work, it will look * in your application's bundle for an auto-discoverable plist. * (XXX refer to more information on that) * * If you pass a dictionary to this method, it must include the * GROWL_APP_NAME key, unless a delegate is set. * * This method is mainly an alternative to the delegate system introduced * with Growl 0.6. Without a delegate, you cannot receive callbacks such as * -growlIsReady (since they are sent to the delegate). You can, * however, set a delegate after registering without one. * * This method was introduced in Growl.framework 0.7. */ + (BOOL) registerWithDictionary:(NSDictionary *)regDict; /*! @method reregisterGrowlNotifications * @abstract Reregister the notifications for this application. * @discussion This method does not normally need to be called. If your * application changes what notifications it is registering with Growl, call * this method to have the Growl delegate's * -registrationDictionaryForGrowl method called again and the * Growl registration information updated. * * This method is now implemented using -registerWithDictionary:. */ + (void) reregisterGrowlNotifications; #pragma mark - /*! @method setWillRegisterWhenGrowlIsReady: * @abstract Tells GrowlApplicationBridge to register with Growl when Growl * launches (or not). * @discussion When Growl has started listening for notifications, it posts a * GROWL_IS_READY notification on the Distributed Notification * Center. GrowlApplicationBridge listens for this notification, using it to * perform various tasks (such as calling your delegate's * -growlIsReady method, if it has one). If this method is * called with YES, one of those tasks will be to reregister * with Growl (in the manner of -reregisterGrowlNotifications). * * This attribute is automatically set back to NO (the default) * after every GROWL_IS_READY notification. * @param flag YES if you want GrowlApplicationBridge to register with * Growl when next it is ready; NO if not. */ + (void) setWillRegisterWhenGrowlIsReady:(BOOL)flag; /*! @method willRegisterWhenGrowlIsReady * @abstract Reports whether GrowlApplicationBridge will register with Growl * when Growl next launches. * @result YES if GrowlApplicationBridge will register with Growl * when next it posts GROWL_IS_READY; NO if not. */ + (BOOL) willRegisterWhenGrowlIsReady; #pragma mark - /*! @method registrationDictionaryFromDelegate * @abstract Asks the delegate for a registration dictionary. * @discussion If no delegate is set, or if the delegate's * -registrationDictionaryForGrowl method returns * nil, this method returns nil. * * This method does not attempt to clean up the dictionary in any way - for * example, if it is missing the GROWL_APP_NAME key, the result * will be missing it too. Use +[GrowlApplicationBridge * registrationDictionaryByFillingInDictionary:] or * +[GrowlApplicationBridge * registrationDictionaryByFillingInDictionary:restrictToKeys:] to try * to fill in missing keys. * * This method was introduced in Growl.framework 0.7. * @result A registration dictionary. */ + (NSDictionary *) registrationDictionaryFromDelegate; /*! @method registrationDictionaryFromBundle: * @abstract Looks in a bundle for a registration dictionary. * @discussion This method looks in a bundle for an auto-discoverable * registration dictionary file using -[NSBundle * pathForResource:ofType:]. If it finds one, it loads the file using * +[NSDictionary dictionaryWithContentsOfFile:] and returns the * result. * * If you pass nil as the bundle, the main bundle is examined. * * This method does not attempt to clean up the dictionary in any way - for * example, if it is missing the GROWL_APP_NAME key, the result * will be missing it too. Use +[GrowlApplicationBridge * registrationDictionaryByFillingInDictionary:] or * +[GrowlApplicationBridge * registrationDictionaryByFillingInDictionary:restrictToKeys:] to try * to fill in missing keys. * * This method was introduced in Growl.framework 0.7. * @result A registration dictionary. */ + (NSDictionary *) registrationDictionaryFromBundle:(NSBundle *)bundle; /*! @method bestRegistrationDictionary * @abstract Obtains a registration dictionary, filled out to the best of * GrowlApplicationBridge's knowledge. * @discussion This method creates a registration dictionary as best * GrowlApplicationBridge knows how. * * First, GrowlApplicationBridge contacts the Growl delegate (if there is * one) and gets the registration dictionary from that. If no such dictionary * was obtained, GrowlApplicationBridge looks in your application's main * bundle for an auto-discoverable registration dictionary file. If that * doesn't exist either, this method returns nil. * * Second, GrowlApplicationBridge calls * +registrationDictionaryByFillingInDictionary: with whatever * dictionary was obtained. The result of that method is the result of this * method. * * GrowlApplicationBridge uses this method when you call * +setGrowlDelegate:, or when you call * +registerWithDictionary: with nil. * * This method was introduced in Growl.framework 0.7. * @result A registration dictionary. */ + (NSDictionary *) bestRegistrationDictionary; #pragma mark - /*! @method registrationDictionaryByFillingInDictionary: * @abstract Tries to fill in missing keys in a registration dictionary. * @discussion This method examines the passed-in dictionary for missing keys, * and tries to work out correct values for them. As of 0.7, it uses: * * Key Value * --- ----- * GROWL_APP_NAME CFBundleExecutableName * GROWL_APP_ICON_DATA The data of the icon of the application. * GROWL_APP_LOCATION The location of the application. * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL * * Keys are only filled in if missing; if a key is present in the dictionary, * its value will not be changed. * * This method was introduced in Growl.framework 0.7. * @param regDict The dictionary to fill in. * @result The dictionary with the keys filled in. This is an autoreleased * copy of regDict. */ + (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict; /*! @method registrationDictionaryByFillingInDictionary:restrictToKeys: * @abstract Tries to fill in missing keys in a registration dictionary. * @discussion This method examines the passed-in dictionary for missing keys, * and tries to work out correct values for them. As of 0.7, it uses: * * Key Value * --- ----- * GROWL_APP_NAME CFBundleExecutableName * GROWL_APP_ICON_DATA The data of the icon of the application. * GROWL_APP_LOCATION The location of the application. * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL * * Only those keys that are listed in keys will be filled in. * Other missing keys are ignored. Also, keys are only filled in if missing; * if a key is present in the dictionary, its value will not be changed. * * This method was introduced in Growl.framework 0.7. * @param regDict The dictionary to fill in. * @param keys The keys to fill in. If nil, any missing keys are filled in. * @result The dictionary with the keys filled in. This is an autoreleased * copy of regDict. */ + (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict restrictToKeys:(NSSet *)keys; /*! @brief Tries to fill in missing keys in a notification dictionary. * @param notifDict The dictionary to fill in. * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict. * @discussion This function examines the \a notifDict for missing keys, and * tries to get them from the last known registration dictionary. As of 1.1, * the keys that it will look for are: * * \li GROWL_APP_NAME * \li GROWL_APP_ICON_DATA * * @since Growl.framework 1.1 */ + (NSDictionary *) notificationDictionaryByFillingInDictionary:(NSDictionary *)regDict; + (NSDictionary *) frameworkInfoDictionary; @end //------------------------------------------------------------------------------ #pragma mark - /*! * @protocol GrowlApplicationBridgeDelegate * @abstract Required protocol for the Growl delegate. * @discussion The methods in this protocol are required and are called * automatically as needed by GrowlApplicationBridge. See * +[GrowlApplicationBridge setGrowlDelegate:]. * See also GrowlApplicationBridgeDelegate_InformalProtocol. */ @protocol GrowlApplicationBridgeDelegate // -registrationDictionaryForGrowl has moved to the informal protocol as of 0.7. @end //------------------------------------------------------------------------------ #pragma mark - /*! * @category NSObject(GrowlApplicationBridgeDelegate_InformalProtocol) * @abstract Methods which may be optionally implemented by the GrowlDelegate. * @discussion The methods in this informal protocol will only be called if implemented by the delegate. */ @interface NSObject (GrowlApplicationBridgeDelegate_InformalProtocol) /*! * @method registrationDictionaryForGrowl * @abstract Return the dictionary used to register this application with Growl. * @discussion The returned dictionary gives Growl the complete list of * notifications this application will ever send, and it also specifies which * notifications should be enabled by default. Each is specified by an array * of NSString objects. * * For most applications, these two arrays can be the same (if all sent * notifications should be displayed by default). * * The NSString objects of these arrays will correspond to the * notificationName: parameter passed in * +[GrowlApplicationBridge * notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:] calls. * * The dictionary should have the required key object pairs: * key: GROWL_NOTIFICATIONS_ALL object: NSArray of NSString objects * key: GROWL_NOTIFICATIONS_DEFAULT object: NSArray of NSString objects * * The dictionary may have the following key object pairs: * key: GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES object: NSDictionary of key: notification name object: human-readable notification name * * You do not need to implement this method if you have an auto-discoverable * plist file in your app bundle. (XXX refer to more information on that) * * @result The NSDictionary to use for registration. */ - (NSDictionary *) registrationDictionaryForGrowl; /*! * @method applicationNameForGrowl * @abstract Return the name of this application which will be used for Growl bookkeeping. * @discussion This name is used both internally and in the Growl preferences. * * This should remain stable between different versions and incarnations of * your application. * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and * "SurfWriter Lite" are not. * * You do not need to implement this method if you are providing the * application name elsewhere, meaning in an auto-discoverable plist file in * your app bundle (XXX refer to more information on that) or in the result * of -registrationDictionaryForGrowl. * * @result The name of the application using Growl. */ - (NSString *) applicationNameForGrowl; /*! * @method applicationIconForGrowl * @abstract Return the NSImage to treat as the application icon. * @discussion The delegate may optionally return an NSImage * object to use as the application icon. If this method is not implemented, * {{{-applicationIconDataForGrowl}}} is tried. If that method is not * implemented, the application's own icon is used. Neither method is * generally needed. * @result The NSImage to treat as the application icon. */ - (NSImage *) applicationIconForGrowl; /*! * @method applicationIconDataForGrowl * @abstract Return the NSData to treat as the application icon. * @discussion The delegate may optionally return an NSData * object to use as the application icon; if this is not implemented, the * application's own icon is used. This is not generally needed. * @result The NSData to treat as the application icon. * @deprecated In version 1.1, in favor of {{{-applicationIconForGrowl}}}. */ - (NSData *) applicationIconDataForGrowl; /*! * @method growlIsReady * @abstract Informs the delegate that Growl has launched. * @discussion Informs the delegate that Growl (specifically, the * GrowlHelperApp) was launched successfully. The application can take actions * with the knowledge that Growl is installed and functional. */ - (void) growlIsReady; /*! * @method growlNotificationWasClicked: * @abstract Informs the delegate that a Growl notification was clicked. * @discussion Informs the delegate that a Growl notification was clicked. It * is only sent for notifications sent with a non-nil * clickContext, so if you want to receive a message when a notification is * clicked, clickContext must not be nil when calling * +[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]. * @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:]. */ - (void) growlNotificationWasClicked:(id)clickContext; /*! * @method growlNotificationTimedOut: * @abstract Informs the delegate that a Growl notification timed out. * @discussion Informs the delegate that a Growl notification timed out. It * is only sent for notifications sent with a non-nil * clickContext, so if you want to receive a message when a notification is * clicked, clickContext must not be nil when calling * +[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]. * @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:]. */ - (void) growlNotificationTimedOut:(id)clickContext; /*! * @method hasNetworkClientEntitlement * @abstract Used only in sandboxed situations since we don't know whether the app has com.apple.security.network.client entitlement * @discussion GrowlDelegate calls to find out if we have the com.apple.security.network.client entitlement, * since we can't find this out without hitting the sandbox. We only call it if we detect that the application is sandboxed. */ - (BOOL) hasNetworkClientEntitlement; @end #pragma mark - #endif /* __GrowlApplicationBridge_h__ */ transmission-2.92/macosx/Growl.framework/Headers/PaxHeaders.4960/Growl.h0000644000000000000000000000013212442116621023053 xustar0030 mtime=1418239377.289468642 30 atime=1418239377.289468642 30 ctime=1457295922.514850669 transmission-2.92/macosx/Growl.framework/Headers/Growl.h0000644000175000017500000000014312442116621024476 0ustar00mikedldmikedld00000000000000#include #ifdef __OBJC__ # include #endif transmission-2.92/macosx/Growl.framework/Headers/PaxHeaders.4960/GrowlDefines.h0000644000000000000000000000013012442116621024347 xustar0029 mtime=1418239377.29046866 29 atime=1418239377.29046866 30 ctime=1457295922.514850669 transmission-2.92/macosx/Growl.framework/Headers/GrowlDefines.h0000644000175000017500000003667712442116621026021 0ustar00mikedldmikedld00000000000000// // GrowlDefines.h // #ifndef _GROWLDEFINES_H #define _GROWLDEFINES_H #ifdef __OBJC__ #define XSTR(x) (@x) #else #define XSTR CFSTR #endif /*! @header GrowlDefines.h * @abstract Defines all the notification keys. * @discussion Defines all the keys used for registration with Growl and for * Growl notifications. * * Most applications should use the functions or methods of Growl.framework * instead of posting notifications such as those described here. * @updated 2004-01-25 */ // UserInfo Keys for Registration #pragma mark UserInfo Keys for Registration /*! @group Registration userInfo keys */ /* @abstract Keys for the userInfo dictionary of a GROWL_APP_REGISTRATION distributed notification. * @discussion The values of these keys describe the application and the * notifications it may post. * * Your application must register with Growl before it can post Growl * notifications (and have them not be ignored). However, as of Growl 0.6, * posting GROWL_APP_REGISTRATION notifications directly is no longer the * preferred way to register your application. Your application should instead * use Growl.framework's delegate system. * See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for * more information. */ /*! @defined GROWL_APP_NAME * @abstract The name of your application. * @discussion The name of your application. This should remain stable between * different versions and incarnations of your application. * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and * "SurfWriter Lite" are not. */ #define GROWL_APP_NAME XSTR("ApplicationName") /*! @defined GROWL_APP_ID * @abstract The bundle identifier of your application. * @discussion The bundle identifier of your application. This key should * be unique for your application while there may be several applications * with the same GROWL_APP_NAME. * This key is optional. */ #define GROWL_APP_ID XSTR("ApplicationId") /*! @defined GROWL_APP_ICON_DATA * @abstract The image data for your application's icon. * @discussion Image data representing your application's icon. This may be * superimposed on a notification icon as a badge, used as the notification * icon when a notification-specific icon is not supplied, or ignored * altogether, depending on the display. Must be in a format supported by * NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. * * Optional. Not supported by all display plugins. */ #define GROWL_APP_ICON_DATA XSTR("ApplicationIcon") /*! @defined GROWL_NOTIFICATIONS_DEFAULT * @abstract The array of notifications to turn on by default. * @discussion These are the names of the notifications that should be enabled * by default when your application registers for the first time. If your * application reregisters, Growl will look here for any new notification * names found in GROWL_NOTIFICATIONS_ALL, but ignore any others. */ #define GROWL_NOTIFICATIONS_DEFAULT XSTR("DefaultNotifications") /*! @defined GROWL_NOTIFICATIONS_ALL * @abstract The array of all notifications your application can send. * @discussion These are the names of all of the notifications that your * application may post. See GROWL_NOTIFICATION_NAME for a discussion of good * notification names. */ #define GROWL_NOTIFICATIONS_ALL XSTR("AllNotifications") /*! @defined GROWL_NOTIFICATIONS_HUMAN_READABLE_DESCRIPTIONS * @abstract A dictionary of human-readable names for your notifications. * @discussion By default, the Growl UI will display notifications by the names given in GROWL_NOTIFICATIONS_ALL * which correspond to the GROWL_NOTIFICATION_NAME. This dictionary specifies the human-readable name to display. * The keys of the dictionary are GROWL_NOTIFICATION_NAME strings; the objects are the human-readable versions. * For any GROWL_NOTIFICATION_NAME not specific in this dictionary, the GROWL_NOTIFICATION_NAME will be displayed. * * This key is optional. */ #define GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES XSTR("HumanReadableNames") /*! @defined GROWL_NOTIFICATIONS_DESCRIPTIONS * @abstract A dictionary of descriptions of _when_ each notification occurs * @discussion This is an NSDictionary whose keys are GROWL_NOTIFICATION_NAME strings and whose objects are * descriptions of _when_ each notification occurs, such as "You received a new mail message" or * "A file finished downloading". * * This key is optional. */ #define GROWL_NOTIFICATIONS_DESCRIPTIONS XSTR("NotificationDescriptions") /*! @defined GROWL_TICKET_VERSION * @abstract The version of your registration ticket. * @discussion Include this key in a ticket plist file that you put in your * application bundle for auto-discovery. The current ticket version is 1. */ #define GROWL_TICKET_VERSION XSTR("TicketVersion") // UserInfo Keys for Notifications #pragma mark UserInfo Keys for Notifications /*! @group Notification userInfo keys */ /* @abstract Keys for the userInfo dictionary of a GROWL_NOTIFICATION distributed notification. * @discussion The values of these keys describe the content of a Growl * notification. * * Not all of these keys are supported by all displays. Only the name, title, * and description of a notification are universal. Most of the built-in * displays do support all of these keys, and most other visual displays * probably will also. But, as of 0.6, the Log, MailMe, and Speech displays * support only textual data. */ /*! @defined GROWL_NOTIFICATION_NAME * @abstract The name of the notification. * @discussion The name of the notification. Note that if you do not define * GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES when registering your ticket originally this name * will the one displayed within the Growl preference pane and should be human-readable. */ #define GROWL_NOTIFICATION_NAME XSTR("NotificationName") /*! @defined GROWL_NOTIFICATION_TITLE * @abstract The title to display in the notification. * @discussion The title of the notification. Should be very brief. * The title usually says what happened, e.g. "Download complete". */ #define GROWL_NOTIFICATION_TITLE XSTR("NotificationTitle") /*! @defined GROWL_NOTIFICATION_DESCRIPTION * @abstract The description to display in the notification. * @discussion The description should be longer and more verbose than the title. * The description usually tells the subject of the action, * e.g. "Growl-0.6.dmg downloaded in 5.02 minutes". */ #define GROWL_NOTIFICATION_DESCRIPTION XSTR("NotificationDescription") /*! @defined GROWL_NOTIFICATION_ICON * @discussion Image data for the notification icon. Image data must be in a format * supported by NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. * * Optional. Not supported by all display plugins. */ #define GROWL_NOTIFICATION_ICON_DATA XSTR("NotificationIcon") /*! @defined GROWL_NOTIFICATION_APP_ICON * @discussion Image data for the application icon, in case GROWL_APP_ICON does * not apply for some reason. Image data be in a format supported by NSImage, such * as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. * * Optional. Not supported by all display plugins. */ #define GROWL_NOTIFICATION_APP_ICON_DATA XSTR("NotificationAppIcon") /*! @defined GROWL_NOTIFICATION_PRIORITY * @discussion The priority of the notification as an integer number from * -2 to +2 (+2 being highest). * * Optional. Not supported by all display plugins. */ #define GROWL_NOTIFICATION_PRIORITY XSTR("NotificationPriority") /*! @defined GROWL_NOTIFICATION_STICKY * @discussion A Boolean number controlling whether the notification is sticky. * * Optional. Not supported by all display plugins. */ #define GROWL_NOTIFICATION_STICKY XSTR("NotificationSticky") /*! @defined GROWL_NOTIFICATION_CLICK_CONTEXT * @abstract Identifies which notification was clicked. * @discussion An identifier for the notification for clicking purposes. * * This will be passed back to the application when the notification is * clicked. It must be plist-encodable (a data, dictionary, array, number, or * string object), and it should be unique for each notification you post. * A good click context would be a UUID string returned by NSProcessInfo or * CFUUID. * * Optional. Not supported by all display plugins. */ #define GROWL_NOTIFICATION_CLICK_CONTEXT XSTR("NotificationClickContext") /*! @defined GROWL_NOTIFICATION_IDENTIFIER * @abstract An identifier for the notification for coalescing purposes. * Notifications with the same identifier fall into the same class; only * the last notification of a class is displayed on the screen. If a * notification of the same class is currently being displayed, it is * replaced by this notification. * * Optional. Not supported by all display plugins. */ #define GROWL_NOTIFICATION_IDENTIFIER XSTR("GrowlNotificationIdentifier") /*! @defined GROWL_APP_PID * @abstract The process identifier of the process which sends this * notification. If this field is set, the application will only receive * clicked and timed out notifications which originate from this process. * * Optional. */ #define GROWL_APP_PID XSTR("ApplicationPID") /*! @defined GROWL_NOTIFICATION_PROGRESS * @abstract If this key is set, it should contain a double value wrapped * in a NSNumber which describes some sort of progress (from 0.0 to 100.0). * If this is key is not set, no progress bar is shown. * * Optional. Not supported by all display plugins. */ #define GROWL_NOTIFICATION_PROGRESS XSTR("NotificationProgress") // Notifications #pragma mark Notifications /*! @group Notification names */ /* @abstract Names of distributed notifications used by Growl. * @discussion These are notifications used by applications (directly or * indirectly) to interact with Growl, and by Growl for interaction between * its components. * * Most of these should no longer be used in Growl 0.6 and later, in favor of * Growl.framework's GrowlApplicationBridge APIs. */ /*! @defined GROWL_APP_REGISTRATION * @abstract The distributed notification for registering your application. * @discussion This is the name of the distributed notification that can be * used to register applications with Growl. * * The userInfo dictionary for this notification can contain these keys: *
      *
    • GROWL_APP_NAME
    • *
    • GROWL_APP_ICON_DATA
    • *
    • GROWL_NOTIFICATIONS_ALL
    • *
    • GROWL_NOTIFICATIONS_DEFAULT
    • *
    * * No longer recommended as of Growl 0.6. An alternate method of registering * is to use Growl.framework's delegate system. * See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for * more information. */ #define GROWL_APP_REGISTRATION XSTR("GrowlApplicationRegistrationNotification") /*! @defined GROWL_APP_REGISTRATION_CONF * @abstract The distributed notification for confirming registration. * @discussion The name of the distributed notification sent to confirm the * registration. Used by the Growl preference pane. Your application probably * does not need to use this notification. */ #define GROWL_APP_REGISTRATION_CONF XSTR("GrowlApplicationRegistrationConfirmationNotification") /*! @defined GROWL_NOTIFICATION * @abstract The distributed notification for Growl notifications. * @discussion This is what it all comes down to. This is the name of the * distributed notification that your application posts to actually send a * Growl notification. * * The userInfo dictionary for this notification can contain these keys: *
      *
    • GROWL_NOTIFICATION_NAME (required)
    • *
    • GROWL_NOTIFICATION_TITLE (required)
    • *
    • GROWL_NOTIFICATION_DESCRIPTION (required)
    • *
    • GROWL_NOTIFICATION_ICON
    • *
    • GROWL_NOTIFICATION_APP_ICON
    • *
    • GROWL_NOTIFICATION_PRIORITY
    • *
    • GROWL_NOTIFICATION_STICKY
    • *
    • GROWL_NOTIFICATION_CLICK_CONTEXT
    • *
    • GROWL_APP_NAME (required)
    • *
    * * No longer recommended as of Growl 0.6. Three alternate methods of posting * notifications are +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:], * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext, and * Growl_PostNotification. */ #define GROWL_NOTIFICATION XSTR("GrowlNotification") /*! @defined GROWL_PING * @abstract A distributed notification to check whether Growl is running. * @discussion This is used by the Growl preference pane. If it receives a * GROWL_PONG, the preference pane takes this to mean that Growl is running. */ #define GROWL_PING XSTR("Honey, Mind Taking Out The Trash") /*! @defined GROWL_PONG * @abstract The distributed notification sent in reply to GROWL_PING. * @discussion GrowlHelperApp posts this in reply to GROWL_PING. */ #define GROWL_PONG XSTR("What Do You Want From Me, Woman") /*! @defined GROWL_IS_READY * @abstract The distributed notification sent when Growl starts up. * @discussion GrowlHelperApp posts this when it has begin listening on all of * its sources for new notifications. GrowlApplicationBridge (in * Growl.framework), upon receiving this notification, reregisters using the * registration dictionary supplied by its delegate. */ #define GROWL_IS_READY XSTR("Lend Me Some Sugar; I Am Your Neighbor!") /*! @defined GROWL_DISTRIBUTED_NOTIFICATION_CLICKED_SUFFIX * @abstract Part of the name of the distributed notification sent when a supported notification is clicked. * @discussion When a Growl notification with a click context is clicked on by * the user, Growl posts a distributed notification whose name is in the format: * [NSString stringWithFormat:@"%@-%d-%@", appName, pid, GROWL_DISTRIBUTED_NOTIFICATION_CLICKED_SUFFIX] * The GrowlApplicationBridge responds to this notification by calling a callback in its delegate. */ #define GROWL_DISTRIBUTED_NOTIFICATION_CLICKED_SUFFIX XSTR("GrowlClicked!") /*! @defined GROWL_DISTRIBUTED_NOTIFICATION_TIMED_OUT_SUFFIX * @abstract Part of the name of the distributed notification sent when a supported notification times out without being clicked. * @discussion When a Growl notification with a click context times out, Growl posts a distributed notification * whose name is in the format: * [NSString stringWithFormat:@"%@-%d-%@", appName, pid, GROWL_DISTRIBUTED_NOTIFICATION_TIMED_OUT_SUFFIX] * The GrowlApplicationBridge responds to this notification by calling a callback in its delegate. * NOTE: The user may have actually clicked the 'close' button; this triggers an *immediate* time-out of the notification. */ #define GROWL_DISTRIBUTED_NOTIFICATION_TIMED_OUT_SUFFIX XSTR("GrowlTimedOut!") /*! @group Other symbols */ /* Symbols which don't fit into any of the other categories. */ /*! @defined GROWL_KEY_CLICKED_CONTEXT * @abstract Used internally as the key for the clickedContext passed over DNC. * @discussion This key is used in GROWL_NOTIFICATION_CLICKED, and contains the * click context that was supplied in the original notification. */ #define GROWL_KEY_CLICKED_CONTEXT XSTR("ClickedContext") /*! @defined GROWL_REG_DICT_EXTENSION * @abstract The filename extension for registration dictionaries. * @discussion The GrowlApplicationBridge in Growl.framework registers with * Growl by creating a file with the extension of .(GROWL_REG_DICT_EXTENSION) * and opening it in the GrowlHelperApp. This happens whether or not Growl is * running; if it was stopped, it quits immediately without listening for * notifications. */ #define GROWL_REG_DICT_EXTENSION XSTR("growlRegDict") #define GROWL_POSITION_PREFERENCE_KEY @"GrowlSelectedPosition" #endif //ndef _GROWLDEFINES_H transmission-2.92/macosx/Growl.framework/PaxHeaders.4960/Resources0000644000000000000000000000013212442116621022132 xustar0030 mtime=1418239377.045464461 30 atime=1418239377.035464289 30 ctime=1457295922.514850669 transmission-2.92/macosx/Growl.framework/Resources/0000755000175000017500000000000012442116621023634 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Growl.framework/Resources/PaxHeaders.4960/Info.plist0000644000000000000000000000013212442116621024157 xustar0030 mtime=1418239377.045464461 30 atime=1418239377.045464461 30 ctime=1457295922.514850669 transmission-2.92/macosx/Growl.framework/Resources/Info.plist0000644000175000017500000000221312442116621025602 0ustar00mikedldmikedld00000000000000 BuildMachineOSBuild 11C74 CFBundleDevelopmentRegion English CFBundleExecutable Growl CFBundleIdentifier com.growl.growlframework CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType FMWK CFBundleShortVersionString 1.3.1 CFBundleSignature GRRR CFBundleVersion 1.3.1 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild 4D199 DTPlatformVersion GM DTSDKBuild 11C63 DTSDKName macosx10.7 DTXcode 0420 DTXcodeBuild 4D199 NSPrincipalClass GrowlApplicationBridge transmission-2.92/macosx/Growl.framework/PaxHeaders.4960/Versions0000644000000000000000000000013212442116621021770 xustar0030 mtime=1418239377.418470853 30 atime=1418239374.412419338 30 ctime=1457295922.516850703 transmission-2.92/macosx/Growl.framework/Versions/0000755000175000017500000000000012442116621023472 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Growl.framework/Versions/PaxHeaders.4960/Current0000644000000000000000000000013212442116621023412 xustar0030 mtime=1418239377.291468677 30 atime=1418239374.412419338 30 ctime=1457295922.516850703 transmission-2.92/macosx/Growl.framework/Versions/Current/0000755000175000017500000000000012442116621025114 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Growl.framework/Versions/Current/PaxHeaders.4960/_CodeSignature0000644000000000000000000000013212442116621026305 xustar0030 mtime=1418239377.292468694 30 atime=1418239377.291468677 30 ctime=1457295922.516850703 transmission-2.92/macosx/Growl.framework/Versions/Current/_CodeSignature/0000755000175000017500000000000012442116621030007 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Growl.framework/Versions/Current/_CodeSignature/PaxHeaders.4960/CodeResourc0000644000000000000000000000013212442116621030522 xustar0030 mtime=1418239377.292468694 30 atime=1418239377.292468694 30 ctime=1457295922.516850703 transmission-2.92/macosx/Growl.framework/Versions/Current/_CodeSignature/CodeResources0000644000175000017500000000126112442116621032477 0ustar00mikedldmikedld00000000000000 files Resources/Info.plist SwzGt9RQsuVafBBrfBalB75dCwU= rules ^Resources/ ^Resources/.*\.lproj/ optional weight 1000 ^Resources/.*\.lproj/locversion.plist$ omit weight 1100 ^version.plist$ transmission-2.92/macosx/Growl.framework/Versions/Current/PaxHeaders.4960/Headers0000644000000000000000000000013112442116621024764 xustar0029 mtime=1418239377.29046866 30 atime=1418239377.045464461 30 ctime=1457295922.514850669 transmission-2.92/macosx/Growl.framework/Versions/Current/Headers/0000755000175000017500000000000012442116621026467 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Growl.framework/Versions/Current/Headers/PaxHeaders.4960/GrowlApplicationBr0000644000000000000000000000013012442116621030525 xustar0029 mtime=1418239377.29046866 29 atime=1418239377.29046866 30 ctime=1457295922.514850669 transmission-2.92/macosx/Growl.framework/Versions/Current/Headers/GrowlApplicationBridge.h0000644000175000017500000000000012442116621051040 1transmission-2.92/macosx/Growl.framework/Headers/GrowlApplicationBridge.hustar00mikedldmikedld00000000000000transmission-2.92/macosx/Growl.framework/Versions/Current/Headers/PaxHeaders.4960/Growl.h0000644000000000000000000000013212442116621026305 xustar0030 mtime=1418239377.289468642 30 atime=1418239377.289468642 30 ctime=1457295922.514850669 transmission-2.92/macosx/Growl.framework/Versions/Current/Headers/Growl.h0000644000175000017500000000000012442116621042236 1transmission-2.92/macosx/Growl.framework/Headers/Growl.hustar00mikedldmikedld00000000000000transmission-2.92/macosx/Growl.framework/Versions/Current/Headers/PaxHeaders.4960/GrowlDefines.h0000644000000000000000000000013012442116621027601 xustar0029 mtime=1418239377.29046866 29 atime=1418239377.29046866 30 ctime=1457295922.514850669 transmission-2.92/macosx/Growl.framework/Versions/Current/Headers/GrowlDefines.h0000644000175000017500000000000012442116621045032 1transmission-2.92/macosx/Growl.framework/Headers/GrowlDefines.hustar00mikedldmikedld00000000000000transmission-2.92/macosx/Growl.framework/Versions/Current/PaxHeaders.4960/Resources0000644000000000000000000000013212442116621025364 xustar0030 mtime=1418239377.045464461 30 atime=1418239377.035464289 30 ctime=1457295922.514850669 transmission-2.92/macosx/Growl.framework/Versions/Current/Resources/0000755000175000017500000000000012442116621027066 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Growl.framework/Versions/Current/Resources/PaxHeaders.4960/Info.plist0000644000000000000000000000013212442116621027411 xustar0030 mtime=1418239377.045464461 30 atime=1418239377.045464461 30 ctime=1457295922.514850669 transmission-2.92/macosx/Growl.framework/Versions/Current/Resources/Info.plist0000644000175000017500000000000012442116621044446 1transmission-2.92/macosx/Growl.framework/Resources/Info.plistustar00mikedldmikedld00000000000000transmission-2.92/macosx/Growl.framework/Versions/Current/PaxHeaders.4960/Growl0000644000000000000000000000013212442116621024504 xustar0030 mtime=1418239377.044464444 30 atime=1418239377.042464409 30 ctime=1457295922.514850669 transmission-2.92/macosx/Growl.framework/Versions/Current/Growl0000755000175000017500000237260012442116621026146 0ustar00mikedldmikedld00000000000000Êþº¾_0 p…€ Ïúíþø…¸__TEXTÀ __text__TEXTÀNÔ€__stubs__TEXTÞòÀÒÞò€__stub_helper__TEXT°öÀp°ö€__objc_methname__TEXT ýÀq> ý__cstring__TEXT‘;À£(‘;__objc_classname__TEXT4dÀY4d__objc_methtype__TEXThÀ h__const__TEXT°sÀذs__gcc_except_tab__TEXTˆtÀœˆt__unwind_info__TEXT$yÀ$y__eh_frame__TEXT¸ÀH~¸ˆ__DATAÀÐÐ__nl_symbol_ptr__DATAÀ£__got__DATAÀè¥__la_symbol_ptr__DATAøÀøâ__objc_classlist__DATAÀ__objc_catlist__DATAÀ__objc_protolist__DATA0À00__objc_imageinfo__DATA`À`__objc_const__DATAhÀPbh__objc_selrefs__DATA¸jÀ0¸j__objc_msgrefs__DATAð{Àðð{__objc_protorefs__DATAà|Àà|__objc_classrefs__DATAè|À@è|__objc_superrefs__DATA(À°(__objc_data__DATAØÀP Ø__data__DATA(ŠÀP(Š__cfstring__DATAxÀ`#x__const__DATAà°ÀÐà°__objc_ivar__DATA°ÀÀȰÀ__common__DATAxÅÀ__bss__DATA€ÅÀšH__LINKEDITÐÀÐ0 X@executable_path/../Frameworks/Growl.framework/Versions/A/Growl"€0ÐØØÔh@äÀôè¨|rXÐ P||hl…òäR È?-”²µ¥ÞÎ$ €8ä/usr/lib/libobjc.A.dylib p)/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices Xr-/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit `A,/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation `âÖ/System/Library/Frameworks/Security.framework/Versions/A/Security p‹/System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration 8Ÿ/usr/lib/libSystem.B.dylib h5/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices h{–/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation&ààBPUH‰åH‹å¦H…Àu:H‹=A^H5B]ÿ<]H‹5ýKH‰Çÿ$ãH5µ¦H‰Çè±ÖH‹¦¦]ÃUH‰åAWAVATSH‰ÓI‰üH‹5ÌKH‹=õ]ÿçâI‰ÆH‹=}¦H9ßt,H5é\ÿã\H5ì\H‰ßÿã\H5T¦H‰ÇèHÖH‹=M¦H5¶\ÿ°\H‹5qKL‹=ŠâL‰çAÿ×H¥\H‰ÇH‰Þÿ™\H5¦H‰ÇèþÕH5“\H‹=¦ÿ†\H‹5/KH‹è¥L‰çAÿ×H‰ÇH‰ÞÿV\H5×¥H‰Çè»ÕHƒ=Ç¥„FH‹=Â¥H5;\ÿ5\H‹5æJH‹—¥H‹èáL‰çÿÓH5\H‰Çÿû[H5„¥H‰Çè`ÕLmH‹5¶JH‹ §JL‰÷L‰âE1ÉÿÓH‹5¥JH‹=¦\ÿÓH‹5JH‰ÇÿÓA‰ÇH5†[H‹=\ÿy[HZmL smH‹5tJH‹ ¥H‰ÇE‰ø0ÀÿÓH‰ÃH5‰[H‹ZJH‹=Ó¤ÿu[„Àt"H‹5"JH‹ ;JL‰÷L‰âI‰ØE1Éÿ áëH‹5(JL‰÷L‰âH‰ÙE1ÀÿîàH5ÿZH‰ßÿöZH‹=ï[H5ØZÿÒZH‹5ÛIH‹ l¤HålL¾lH‰Ç0Àÿ£àH‰ÃH5áZH‹²IH‹=+¤ÿÍZ„Àt"H‹5zIH‹ “IL‰÷L‰âI‰ØE1ÉÿaàëH‹5€IL‰÷L‰âH‰ÙE1ÀÿFàH5WZH‰ßÿNZH‹=G[H50Zÿ*ZH‹53IH‹ Ä£HýkL VlH‰ÇE‰ø0ÀÿøßH‰ÃH56ZH‹IH‹=€£ÿ"Z„Àt"H‹5ÏHH‹ øHL‰÷L‰âI‰ØE1Éÿ¶ßëH‹5ÕHL‰÷L‰âH‰ÙE1Àÿ›ßH5¬YH‰ßÿ£YH‹=œZH5…YÿYH‹5ˆHH‹ £H’kL«kH‰Ç0ÀÿPßH‰ÃH5ŽYH‹oHH‹=Ø¢ÿzY„Àt"H‹5'HH‹ PHL‰÷L‰âI‰ØE1ÉÿßëH‹5-HL‰÷L‰âH‰ÙE1ÀÿóÞH5YH‰ßÿûXH‹5HL‰ç[A\A^A_]ÿ%ËÞ0ÀH=RjH5kj[A\A^A_]é ÐUH‰åH‹C¢]ÃUH‰åHƒì I‰ÊH‹5ÏGH‹=¨Y¾EH‹M H‰L$‰D$‹E‰$HÇD$L‰Ñÿ_ÞHƒÄ ]ÃUH‰åAWAVAUATSPM‰ÏL‰ÃI‰ÌI‰ÕI‰þH‹=]YH56Xÿ0XH‹5iGH ŠjH‰ÇH‰ÚE1À0Àÿ ÞH‰ÃM…ítH‹5JGH ƒjH‰ßL‰êÿçÝM…ätH‹5+GH „jH‰ßL‰âÿÈÝM…ÿtH‹5 GH …jH‰ßL‰úÿ©ÝH‹U H…ÒtH‹5éFH ‚jH‰ßÿ‰Ý‹E…Àt2H‹5ÓFH‹=¤XHcÐL‹=jÝAÿ×H‹5°FH ijH‰ßH‰ÂAÿ׊E„Àt2H‹5¢FH‹=kX¾ÐL‹=1ÝAÿ×H‹5wFH PjH‰ßH‰ÂAÿ×H‹U(H…ÒtH‹5WFH PjH‰ßÿ÷ÜH‹5XFL‰÷H‰ÚÿäÜH‹õVH5îVH‰ßHƒÄ[A\A]A^A_]ÿàUH‰åAWAVAUATSHƒì(I‰ÖI‰ÿŠf <…§H‹5FL‰ÿ1ÒÿŒÜ„À„H‹5õEL‰ÿL‰òÿqÜI‰ÆE1äŠ& „À„©H‹5ÖEH‹=‡WÿIÜ„Àt H‹=~WëE1ä€=ôŸt|H‹=qWH5*Vÿ$VH‹5EH‰ÇL‰òÿ ÜH5:VH‰Çÿ1VH‰ÃE1äH…Ût:H‹5wEL‹%àÛH‰ßL‰úAÿÔH‹5hEL‰ÿAÿÔH5VH‰ÇH‰ÚÿVI‰ÜŠqŸ„ÀtL‰ãH…ÛI‰Ü…éŒH‹=ßVH5UÿŠUH‹5EL‹-tÛH‰ÇL‰òAÿÕH5œUH‰Çÿ“UH‰ÃH‹5áDH‰ßL‰úAÿÕH‹5ÙDL‰ÿAÿÕH5ŒUH‰ÇH‰Úÿ€UM…ä„xÿÿÿH‹5¸DL‰çH‰Úÿ ÛH‹5­DL‰çÿüÚéíH‹5`DL‰ÿ1ÒÿåÚ„ÀttH‹=¢žH…ÿu:H‹=ÎUH5ÏTÿÉTH‹5ŠCH‰Çÿ±ÚH5ržH‰Çè>ÎH‹=cžH5ìTL‰òÿãTŠUž„ÀuwH‹5*DL‰ÿ1ÒÿoÚëcH‹5DH‹=UÿYÚ„ÀtKH‹ÙH‰E°ÇE¸BÇE¼H:H‰EÀH"‰H‰EÈHuÐL‰÷èÂÍH‹=ëØHu°èÚÌHƒÄ([A\A]A^A_]ÃUH‰åH‹W H‹5¬CH‹=U]ÿ%ÞÙfDUH‰åHƒÇ H‹v º]éCÌf„UH‰åH‹ ¾]é-ÌUH‰åAWAVATSI‰ÖH‹5pBÿŠÙH‰Ã0ÉH…Û„ÂH‹5=CHÞfL‹=gÙH‰ßAÿ×I‰ÄH‹5CHÀeL‰÷Aÿ×I‰ÆHÐfH‹5CH‰ßAÿ×H‹5üBH‰ÇL‰òAÿ×I‰Ç0ÉH¸ÿÿÿÿÿÿÿI9Ç„QH‹=\TH5eSÿ_SH5hSL‰çH‰Âÿ\S„ÀtH‹5±BL‰çL‰úéH‹='TH5(Sÿ"SH5+SL‰çH‰ÂÿS0É„À„ãH5SL‰çÿS0ÉH…À„ÈH5SL‰ç1ÒÿSH‰ÃH‹=–SH5ÇRÿÁRH5ÊRH‰ßH‰Âÿ¾R„Àt+H‹5BH‹=dSH‹-ØL‰úÿÓH‹5 BL‰çH‰ÂÿÓëUH5¨RL‰ç1ÒÿRH‰ÃH‹=SH5\RÿVRH5_RH‰ßH‰ÂÿSR0É„ÀtH‹5¶AL‰çL‰òÿÂ×0É„Àt±¶Á[A\A^A_]ÃUH‰åAWAVSPI‰ÿDŠ5Ú_H‹5ƒAH‹=ôRH‹…×ÿÓH‹5DAH%eH‰ÇÿÓH…Àt9H‹5TAH‹=ÅRH‹V×ÿÓH‹5AHödH‰ÇÿÓH‹52AH‰ÇÿÓAˆÆH‹5›@L‰ÿ1Òÿ ׄÀtE0öA¾ÆHƒÄ[A^A_]ÃUH‰åˆ@_]ÃUH‰å¾3_]ÃUH‰åAWAVATSI‰ÖI‰üH‹5É@H‹=:RH‹ËÖÿÓH‹5Š@H‹dH‰ÇÿÓE0ÿH…ÀtKH5¿”H‰Çè£ÄH‹°”H‹5I:H ‚_L‰÷ÿéÐM…ítL‰ïH‹5Â:Hƒ_ÿÍЄÀt}H5jKHk_L‰÷ÿZKH…ÀuaH‹^”H…Òu>H‹5Š9L‰çL‰úÿŽÐH5¯JH‰Çÿ¦JH5/”H‰Çè ÄH‹ ”H…ÒtH‹5¬9H _L‰÷ÿLÐM…ít"H‹5(:H _L‰ïÿ0ЄÀL‰ï„ÞH5ÆJHç^L‰÷ÿ¶JH…À…¶H‹5.:H‹=‡KH‹ðÏÿÓH‹5W:H‰ÇÿÓH…À„ŠH‰ÇèÀ"H‰ÃH…ÛtcH‹=ZKH5ÃIÿ½IH‹5ö8H —^L‹= ÏH‰ÇH‰ÚE1À0ÀAÿ×H‰ÃH X^H‹5Ñ8L‰÷H‰ÚAÿ×H5‰IH‰ßÿ€IëH‹5×9H(^L‰÷ÿOÏM…ítL‰ïH‹5(9H©\ÿ3Ï„ÀtRH5ÐIH‘\L‰÷ÿÀIH…Àu6H5´IH•\L‰÷ÿ¤IH…ÀtH‹5@8H Y\L‰÷H‰ÂÿÝÎM…ítH‹5¹8HÚ]L‰ïÿÁ΄ÀtCH5^IH¿]L‰÷ÿNIH…Àu'èò¿H‰ÇèÞ¿H‹5Ý7H –]L‰÷H‰ÂÿzÎH5«HL‰÷ÿ¢HHƒÄ[A\A]A^A_]ÃUH‰åAWAVSPI‰þH‹5¯8H‰×ÿ>ÎI‰ÇH5ÜHH½\L‰ÿÿÌHH…ÀueH‹È‘H…ÒuBH‹5ô6H‹­‘L‰÷ÿüÍH5HH‰ÇÿHH5•‘H‰ÇèyÁH‹†‘H…ÒtH‹57H S\L‰ÿÿºÍH5[HH\\L‰ÿÿKHH…ÀueH‹O‘H…ÒuBH‹5{6H‹,‘L‰÷ÿ{ÍH5œGH‰Çÿ“GH5‘H‰ÇèøÀH‹ ‘H…ÒtH‹5™6H ò[L‰ÿÿ9ÍH5ÚGHZL‰ÿÿÊGH…À„‘H5ºGH;\L‰ÿÿªGH…ÀuuH‹=&HH5÷FÿñFH‰ÃH‹5ç5H‹=èGL‹5ÑÌAÿÖH‹5×5H‰ÇAÿÖH‹5:7H‰ß‰ÂAÿÖH‰ÃH Ø[H‹5ñ5L‰ÿH‰ÚAÿÖH5©FH‰ßÿ FH‹¹FH5²FL‰ÿHƒÄ[A^A_]ÿàUH‰åH=°[蟽H‰Ç]颽UH‰åSPH‰ÓH‹=âH…ÿt1H‹¾6H5wFÿqF„ÀtH‹5¦6H‹=·ÿÌH…ÀuH5­FHŽZH‰ßÿFH…ÀtHƒÄ[]ÃH‹5ê4H‹=ëFÿÕËH‹5^6H‰ÇH‹ÄËHƒÄ[]ÿàUH‰åAVSI‰ÖH‹=KH…ÿt\H‹76H5àEÿÚEH‹=+„Àt H‹56ë&H‹6H5¸Eÿ²E„ÀtH‹5ÿ5H‹=øŽÿRËH‰ÃH…ÛuH5ëEHìYL‰÷ÿÛEH‰ÃH…ÛtKH‹=ÄFH5…EÿEH5ˆEH‰ßH‰Âÿ|E„ÀtH‹5¡5H‰ßÿðÊH‰ÃH…ÛtH‰Ø[A^]ÃH‹5 5H‹=bFÿÌÊH‹5 5H‰Çÿ¼ÊH‰ÃH‹5b5H‹=SFÿ¥ÊH‹5V5H‰ÇH‰Úÿ’ÊH‹535H‰ÇH‹Ê[A^]ÿàUH‰åAWAVSPI‰×H‹=FH5hDÿbDH‹5#3H‰ÇÿJÊI‰ÆH‹àH‹5ù4L‰ÿÿ0ÊH5ÑDH’YH‰ÇÿÁDH‹523H‰ßH‰ÂÿÊH‹5Ç4L‰÷H‹õÉHƒÄ[A^A_]ÿàUH‰åAWAVSPI‰×H‹=…EH5ÖCÿÐCH‹5‘2H‰Çÿ¸ÉI‰ÆH‹NH‹5g4L‰ÿÿžÉH5?DHYH‰Çÿ/DH‹5°2H‰ßH‰ÂÿtÉH‹554L‰÷H‹cÉHƒÄ[A^A_]ÿàUH‰åAWAVAUATSHìÈI‰þfïÀ)EÀ)E°)E )EL‹-íŒH5ÖCHUHÿÿÿL‰ïA¸ÿ¼CH‰ÃH…ÛtdH‹E L‹ E1ÿH‹E L9 tL‰ï蛼H‹E˜J‹øH‹5:2L‰÷ÿÉÈIÿÇI9ßrÏL‰ïH5oCHUHÿÿÿA¸ÿXCH‰ÃH…Ûu£H‹=YŒH5¢BÿœBH5EŒ1ÿè¼HÄÈ[A\A]A^A_]ÃUH‰åAWAVATSI‰üH‹=ÿCH5PBÿJBH‹5 1H‹4ÈH‰ÇÿÓI‰ÆH‹5•1L‰çºÿÓH5\BH‹Ý2H‹=¦‹ÿHB„ÀtH‹5Å2H‹=Ž‹ÿèÇH‹5¹0H‹=’CH‹ÓÇÿÓH‹5¢2L=“SH‰ÇL‰ú1ÉE1ÀÿÓH‹5‡0H‹=°BÿÓH‹5Ç0H‰ÇL‰âL‰ùE1ÀÿÓ€=j‹tH‹5¹0L‰çÿxÇÆQ‹ëÆ(‹H‹5A2L‰çÿXÇH‹52L‰÷[A\A^A_]ÿ%@ÇUH‰åAVSA‰ÖH‰ûH‹52H‰ßÿ#ÇŠ þŠ€ùuE„öuE0ö„À„BDŠ5ãŠé6E0ö„À„+H‹5Ú1L‹5ãÆH‰ßAÿÖH‹5Î1H‹=BHXVAÿÖH5VAH‰Ç1ÒÿKAH‹51H‰ÇAÿÖH‹5Ÿ1H‰ÇAÿÖHBVH‹5“1H‰Ç¹AÿÖH¹ÿÿÿÿÿÿÿH9ÈtDÆ+ŠŠ'ŠAˆÆA€öDˆ58Š<…H‹÷‰H=VH‰Ö0Àè(¸DŠ5Šë`Æç‰Šã‰<uE€=׉uH5a=ÿ[=H‹5,H‰ÇÿCÃH5‡H‰ÇèжH‹õ†H‹5n.L‰ÿÿÃH5n=H‰ßH‰Âÿb=H‹5;,L‰÷H‹ùÂHƒÄ[A^A_]ÿàHƒÄ[A^A_]ÃUH‰åSPH‰ËH‹=r†H…ÿtH‹æ+H5=ÿ=„ÀuHƒÄ[]ÃH‹5Ç+H‹=@†H‰ÚHƒÄ[]ÿ%‘ÂUH‰åSPH‰ËH‹=!†H…ÿtH‹¥+H5¶<ÿ°<„ÀuHƒÄ[]ÃH‹5†+H‹=ï…H‰ÚHƒÄ[]ÿ%@ÂUH‰åAWAVATSHƒìI‰ÎI‰×H‹5ô*ÿÂH‰ÃH…ÛtfH‹=§=H5<ÿ <H‹5C+HÇ$H |OL UOL‹%ÞÁH‰ÇL‰úM‰ð0ÀAÿÔH5<H‰Çÿø;H‹5 -H‰ßH‰ÂAÿÔH‰ØHƒÄ[A\A^A_]ÃUH‰åAVSHƒìH‰ûH‹S€H‹<L5˜;L‰öÿ;H‹@€H‹<L‰öÿ{;H‹4€H‹<L‰öÿg;H}àH‰]àH‹€>H‰EèH‹5,èö´HƒÄ[A^]ÃUH‰åH‹ì¹]éÑ´UH‰åH‰ÐH‹ÓH‰ÁA¸E1É]éôUH‰åH‹¾¹]é›´UH‰åH‰ÐH‹¥H‰ÁA¸E1É]é´UH‰åH‹x¹]ée´UH‰åH‰ÐH‹_H‰ÁA¸E1É]éW´UH‰åAWAVAUATSHìèH‹5a+H‹="<ÿ\ÀH5Ý:H‰ÇH‰…ÿÿÿÿÍ:H‰Á1ÀH…É„:fïÀ)EÀ)E°)E )EH5Ô:HUHÿÿÿH‹½ÿÿÿA¸ÿ¶:H‰Á1ÀH…ÉH‰ÿÿÿ„ìH‹E H‹H‰…øþÿÿL‹5Ô¿1ÛE1ÿH‹E H‹øþÿÿH9t H‹½ÿÿÿèm³H‹E˜N‹,øH…Ût3H‹5ÿ*H‰ßAÿÖI‰ÄH‹5ï*L‰ïAÿÖH‹5ê*L‰çH‰ÂAÿÖHƒøuL‰ëIÿÇL;½ÿÿÿr•H‹½ÿÿÿH5:HUHÿÿÿA¸ÿ÷9H…ÀH‰…ÿÿÿ…]ÿÿÿ1ÀH…Ût+L‹5±:H‹5Š)L‹=¿H‰ßAÿ×H‹5v*L‰÷H‰ÂAÿ×HÄè[A\A]A^A_]ÃUH‰åH‹5X*HiN]ÿ%Ò¾UH‰åAWAVAUATSHì¸I‰þH‹œ‚H…À…éH‹5$*H‹=-:H&Oÿ¾H5q‚H‰Çè²H‹b‚H…À…¯H‹5ò)H‹c¾L‰÷ÿÓH‹5Ÿ(H‰ÇÿÓH‹5Û)H‰ÇÿÓI‰ÇH‹5Ì)L‰ÿÿÓH‹5À)H‰ÇÿÓI‰ÆH‹5¹)L‰ÿÿÓH‹5µ)H‰ÇÿÓH5Ñ8H²NH‰ÇÿÁ8„Àt6H‹5–)H‹=w9L‰úÿÞ½H5¿H‰Çèk±H‹°H…À…ýH‹5P)H‹±½L‰÷ÿÓH‹5E)H‰ÇÿÓH5a8HBNH‰ÇÿQ8„Àt6H‹5&)H‹=9L‰òÿn½H5OH‰Çèû°H‹@H…À…H‹5ø(H‹= 9ÿ;½H‰…@þÿÿ¿¾÷ÿºè¯fïÀ)EÀ)E°)E )EH5½7HUHÿÿÿH‰ÇH‰…HþÿÿA¸ÿœ7I‰ÇM…ÿ„H‹E L‹0L‹%ʼE1íH‹E L90t H‹½Hþÿÿèl°H‹E˜J‹<èH‹5[(HlMAÿÔH‹5J(H‰ÇHxMAÿÔH‰ÃH‹5;(H‹½@þÿÿH‰ÚAÿÔ„ÀtYH‹5 (H‹=ì7H‰ÚÿS¼H‰ÃH…Ût:H‹5T'H‰ßÿ;¼H…Àt%H‹5÷'H‰ÇHµL¹ÿ¼H…À„IÿÅM9ý‚>ÿÿÿH‹½HþÿÿH5¯6HUHÿÿÿA¸ÿ˜6I‰ÇM…ÿ… ÿÿÿfïÀ)…ÿÿÿ)…ðþÿÿ)…àþÿÿ)…ÐþÿÿH5e6H•ÐþÿÿHPþÿÿH‹½HþÿÿA¸ÿD6H‰Á1ÀH…ÉH‰0þÿÿ„µH‹…àþÿÿH‹H‰…(þÿÿL‹5_»1ÛH‹…àþÿÿH‹(þÿÿH9t H‹½Hþÿÿèø®H‹…ØþÿÿHKH‰8þÿÿH‹<ØH‹5Ù&HêKAÿÖI‰ÇH‹5Ý&H‹½@þÿÿL‰úAÿÖI‰Äë+H5Ü~H‰ß舮H‹Í~éH‹5¹&L‰çÿкH‹5¡&L‰çÿÀºH‰ÃH…Û„žH‹5E&H‰ßÿ¤ºH‰ÇH5b5H£KÿU5„Àt¹L‹-6H‹53&L‰ÿH‰ÚAÿÖH‹5&L‰ïH‰ÂAÿÖI‰ÅM…í„vÿÿÿH‹5_%L‰ïÿFºH…À„]ÿÿÿH‹5þ%H‰ÇH¼J¹ÿ!ºH…À…8ÿÿÿëfH‹…8þÿÿH;…0þÿÿH‰Ã‚¢þÿÿH‹½HþÿÿH5©4H•ÐþÿÿHPþÿÿA¸ÿ4H‰Á1ÀH…ÉH‰0þÿÿ…cþÿÿHĸ[A\A]A^A_]ÃH5‘}L‰ïé°þÿÿUH‰åH‹†}H…ÀuYH‹5%ÿ„¹H5m}H‰Çè­H‹^}H…Àu1H‹5â$H‹=ë4HäHÿN¹H57}H‰ÇèÛ¬H‹(}]ÃUH‰åAWAVAUATSHì¸E‰ÇH‰Ëúÿÿ?HcúH‰ÞºèøªE„ÿu H‰…8þÿÿé L‹=è3H5i3H‰ÃH‰ßÿ]3H‹5¶$L‹5ǸL‰ÿH‰ÂAÿÖH‰…8þÿÿH‹5`$H‹=q4AÿÖH‰…0þÿÿfïÀH5L3HUHÿÿÿ)EÀ)E°)E )EH‰ßI‰ßA¸ÿ3I‰ÅM…턌H‹E L‹01ÛH‹E L90tL‰ÿèû«H‹E˜L‹$ØH‹5"$H‹½0þÿÿL‰âÿ"¸„ÀtH‹½8þÿÿH5h2L‰âÿ_2HÿÃL9ër­L‰ÿH5­2HUHÿÿÿA¸ÿ–2I‰ÅM…íu‚é‚ÿÿƒøw.HïHH hIH‰(þÿÿH öHcHÈÿàH Ië'H=!I‰Ö0Àèz©HÇ…8þÿÿé©HÁHH‹5"#H=Iÿ]·H‰…(þÿÿH‹5ÿ"H‹=3L‹5A·AÿÖH‰… þÿÿÆ…ÿÿÿ¿H‰Þºè©H‰ÃL‹=2H5•1H‰ßÿŒ1H‹5å"L‰ÿH‰ÂAÿÖH‰…8þÿÿfïÀH5š1H•ÀþÿÿH@þÿÿ)…ðþÿÿ)…àþÿÿ)…Ðþÿÿ)…ÀþÿÿH‰ßH‰0þÿÿA¸ÿZ1H‰ÃH…Û„ÇH‹…ÐþÿÿL‹8L‹%…¶E1íH‹…ÐþÿÿL98t H‹½0þÿÿè$ªH‹…ÈþÿÿJ‹<èH‹5"H‹•(þÿÿAÿÔI‰ÆH‹5<"H‹½ þÿÿL‰òHÿÿÿAÿÔ„Àt!Š…ÿÿÿ„ÀtH‹½8þÿÿH5l0L‰òÿc0IÿÅI9ÝrH‹½0þÿÿH5­0H•ÀþÿÿH@þÿÿA¸ÿ“0H‰ÃH…Û…JÿÿÿH‹…8þÿÿHĸ[A\A]A^A_]Ãf^þÿÿCþÿÿ<þÿÿþÿÿUH‰åH‹5™!E1À]ÿ%µUH‰åAVSI‰þH‹5~!L‰÷º¹A¸ÿeµH‰ÃH5ã/H‰ßÿÚ/H…ÀtH5Þ/H‰ß1ÒÿÓ/H‰ÃéœH‹5,!L‰÷º¹ÿÿA¸ÿµI‰ÆH5‘/L‰÷ÿˆ/1ÛH…ÀtbH5Š/L‰÷1Òÿ/H‹5˜ H‰FL‹5Ò´H‰ÇAÿÖH‰ÃH‹5r H‹=ƒ0AÿÖH‹5¹ H‰ÇH‰Ú¹E1ÀE1ÉAÿÖ„Àu1ÛH‰Ø[A^]ÃUH‰åAVSI‰þH‹5~ L‰÷º¹ÿÿA¸ÿe´H‰ÃH5ã.H‰ßÿÚ.H…ÀtH5Þ.H‰ß1ÒÿÓ.H‰ÃëgH‹5? L‰÷ÿ&´1ÛH…ÀtPH‹5ÐHAEL‹5 ´H‰ÇAÿÖH‰ÃH‹5ªH‹=»/AÿÖH‹5ñH‰ÇH‰Ú¹E1ÀE1ÉAÿÖ„Àu1ÛH‰Ø[A^]ÃUH‰åAVSI‰þH‹5¶L‰÷º¹ÿÿA¸ÿ³H‰ÃH5.H‰ßÿ.H…ÀtH5.H‰ß1Òÿ .H‰ÃëgH‹5wL‰÷ÿ^³1ÛH…ÀtPH‹5H™DL‹5B³H‰ÇAÿÖH‰ÃH‹5âH‹=ó.AÿÖH‹5)H‰ÇH‰Ú¹E1ÀE1ÉAÿÖ„Àu1ÛH‰Ø[A^]ÃUH‰åH‹5 1Ò]ÿ%ë²UH‰åAWAVAUATSHìØH‰ÓH‹5}H‹=Ž.ÿÀ²I‰ÆH…ÛuH‹5ÑH‹=z.ÿ¤²H‰ÃH‹5ÂE1ÿL‹-²L‰÷H‰Ú1ÉAÿÕI‰ÄH‹=S.H5|,ÿv,H‰ÃH5ì,L‰çÿã,H‹5„H‰ßH‰ÂAÿÕH‰…ÿÿÿfïÀH5ñ,HUHÿÿÿ)EÀ)E°)E )EL‰çA¸ÿÇ,I‰Æ»M…ö„‡H‹E L‹8L-H,1ÛH‹E L98tL‰çè—¥H‹E˜H‹<ØH‹5ÿȱH‹½ÿÿÿL‰îH‰Âÿ ,HÿÃL9ór¿L‰çH5[,HUHÿÿÿA¸ÿD,I‰Æ»M…öuE1ÿëHÿÃHƒûÿt_H5‚+L‰ÿÿy+H‹=r,H5[+ÿU+H‹5^HCL‹58±H‰ÇH‰Ù0ÀAÿÖI‰ÇH‹5 H‹½ÿÿÿL‰úAÿÖ„Àu˜H5#+H‹½ÿÿÿÿ+H5/+L‰ÿÿ&+HÄØ[A\A]A^A_]ÃUH‰åAVSI‰ÖH‹5 ÿŰH‰ÃH‹5H¤BL‰÷ÿ«°H‹5\H‰ßH‰ÂH‹—°[A^]ÿàUH‰åAWAVSHƒìI‰þM…öuH=åB0Àè`¢1Àé&HÇEàH‹5¨L‰÷ÿO°H‰ÃH5+L‰÷ÿ+HuàH‰ßH‰Âè=¢f‰Ãf…Ût/H5ö*L‰÷ÿí*H¿ÓH=šBH‰ÆL‰ñ0Àèï¡1Ûé¥HÇEØH‹}àHMØ1Û1ö1ÒE1ÀE1Éè…¡A‰ÇH‹}àès¡AƒÿÕtdE…ÿtIc÷H=dBL‰ò0À蜡ëGHƒ}Øt2H‹=z+H5›)ÿ•)H‹5ÞH‹UØH‰Ç¹ÿt¯H‰ÃëH=8B0ÀèS¡1ÛH‹}ØH…ÿtè¹ H5‚)H‰ßÿy)HƒÄ[A^A_]ÃUH‰åAWAVSHƒìXI‰þL‰÷èž H‰ÃH5BH‰ßºèu I‰ÇH‰ßèd 1ÛM…ÿ…†Hu˜L‰÷èq 1Û„ÀttHÇE1ÛHu˜HU1ÿè| f…ÀtH¿ÐH=ÆAL‰ö0Àèž ë?H‹}èu H‹}H‹èW H‹ ö­H‹9H‰ÞH‰ÂèÜŸH‰ÃH‹}èN H‹}è H‰ØHƒÄX[A^A_]ÃUH‰åAWAVAUATSHì˜H‰ûH‹5Hh@L‹=1®H‰ßAÿ×I‰ÆH‹5éH*@H‰ßAÿ×E1äH…Àt H‰ÇèsýÿÿI‰ÄM…ä…ÒM…ö„ÉH‹5°H1@H‰ßÿØ­E1ÿH…ÀtH‹5)H‰ÇÿÀ­LcøL‰÷è)ŸI‰ÅL‰ïè.¡H‰ÃH‹5L‰÷H‰ÚL‰éÿ‘­H‰ß1ö1Ò0Àè[¡A‰ÅH‰ßè´ AƒýÿtLHµHÿÿÿD‰ïè± D‰ïè ·LÿÿÿH‹µ¬H‹8ÁéƒáL‰öL‰ú连I‰ÄH5g'L‰çÿ^'L‰àHĘ[A\A]A^A_]ÃUH‰åAWAVAUATSPH‰ûH…ÛuH=$@0ÀèßžE1ÿéÀE1ÿH‰ß1öèRžI‰ÄM…äA”ÅH‰ßèýÿÿI‰ÆM…öu E„í…H‹5öH‹=Ï'ÿ¡¬I‰ÇM…ätMH‹5H »>H‹„¬L‰ÿL‰âÿÓL‰çèÜH‹5åH‹=–'1ÒÿÓH «>H‹5ÄL‰ÿH‰ÂÿÓM…öt"H‹5°H I>L‰ÿL‰òÿ-¬L‰÷èL‰øHƒÄ[A\A]A^A_]ÃUH‰åAWAVAUATSHƒìhòE°I‰ÖI‰ÿH‹5pL‰ÿÿç«òU ò](è¸Lm„ÀuòAEòAMH‹5EL‰ÿÿ´«HÇE¸HÇEÀH‹5L‰ÿÿ”«òEÈòMÐòAUf.ÂwòA]f.ˆµf.Áv9òA](Óò^ÐòYÑòAUò\ÓòYòAXU(ÂèmžòAEë8f.Èv2f(Úò^ÙòYØòA]ò\ÚòYÛòAX](Ãè3žòAEH‹5€L‹%éªL‰ÿºAÿÔH‹5oH‹=¸&AÿÔH‹5fH‰ÇºAÿÔëmf.Ðv+ò\ÐòYo(Âè]òAXEòAEòA]òMÐf.Ùv ò\ÙòY>(Ãè,òAXEòAEHE HUÈH‹ H‹RH‰PH‰L‹íI‹EI‹MH‹U¸H‹}ÀH‹uÈH‹]ÐH‰\$8H‰t$0H‰|$(H‰T$ H‰L$H‰D$I‹EI‹MH‰L$H‰$L‰ÿL‰ÆL‰òòE°ÿê©HƒÄh[A\A]A^A_]ÃUH‰åAVSHƒìH‰ûH‹5vL‹5¿©H‰ßAÿÖH‹52H‰ÇAÿÖ(Ø(ÑH‹5WH‰ß(Ãò]à(ÊòUèAÿÖòEàòMèHƒÄ[A^]ÃUH‰åAWAVAUATSHì(ÐI‰þH‹5L‰÷(Âò•ðþÿÿÿA©I‰ÄM…ä…ÒfïÀ)EÀ)E°)E )EH‹5âL‰÷ÿ©H5Â#HUHÿÿÿH‰ÇH‰…ÿÿÿA¸ÿ¡#H‰ÃH…Û„ L‰µèþÿÿH‹E H‹H‰…øþÿÿA·E1äfïÀò…ÿÿÿE1íH‹E H‹øþÿÿH9t H‹½ÿÿÿèQœH‹E˜N‹4èH‹5L‰÷ÿ¨òðþÿÿò\Èòÿÿÿfïíf.ëvf.Íw9E„ÿu*f(Áò%"fTÄf(ÓfTÔf.Ðw f.évf.Ýv E0ÿM‰ôf(ÙòÿÿÿIÿÅI9Ý‚[ÿÿÿH‹½ÿÿÿH5¸"HUHÿÿÿA¸ÿ¡"H‰ÃH…Û…'ÿÿÿM…äL‹µèþÿÿunH‹šH5 "L‰÷ÿ"„Àt7H‹5H‹P¦H‹HH‰L$H‹HH‰L$H‹H‹@H‰D$H‰ $L‰÷1ÒëH‹5XH‹IL‰÷1Éÿf§I‰ÄL‰àHÄ[A\A]A^A_]ÃUH‰åAWAVAUATSHìØòÿÿÿò…ÿÿÿfïÀ)EÀ)E°)E )EH‹5×ÿ §I‰ÆH5·!HUHÿÿÿL‰÷A¸ÿ!H‰ÃE1ÿH…Û„€H‹E L‹ E1íH‹E L9 tL‰÷èušH‹E˜N‹<èH‹5,L‰ÿÿ£¦ò•ÿÿÿòÿÿÿèn˜„Àu4IÿÅI9Ýr¶L‰÷H50!HUHÿÿÿA¸ÿ!H‰ÃE1ÿH…Ûu‡L‰øHÄØ[A\A]A^A_]ÃUH‰åAVSHƒìI‰ÖH‰ûH‹5L‰÷ÿ ¦„Àu%H‰]àH‹Y#H‰EèH‹5öH}àL‰òèÀ™H‰ÃH‰ØHƒÄ[A^]ÃUH‰åH‹5ØÿÚ¥H‹5ÓH‹=¼!H‰ÂH‹Â¥]ÿàUH‰åH‹5¼ÿ®¥H‹5·H‰Çº1ÉH‹–¥]ÿàUH‰åH‹5ÿ‚¥H‹5‹H‰Çº1ÉH‹j¥]ÿàUH‰åAWAVAUATSHƒìH‰uÈH‰ûHÇEÐH‹À¤L‹8L5ÞH}Ðèû–0Éf…À……H}оÿÿÿÿè—H‰Á1ÀH…ÉtH‰Ïèd–H‰ÇH50ÿ*I‰ÄM…ät´L‰çL‰öH-8ÿI‰ÅL‰çL‰öL‰úÿmM…ítŠH…Ût…L‰ïH5yH‰Úÿp„À•Á„gÿÿÿH‹UÈH…Òt„ÉuÇEÐÇEÔH‹EÐH‰¶ÁHƒÄ[A\A]A^A_]ÃUH‰åH‰øH‹5SH‹= H‰ÂÿK¤H5ÌH‰ÇÿÃH…À•À¶À]ÃUH‰åH‹5H‹=ÞH§3ÿ¤H5’H‰Çÿ‰H…À•À¶À]ÃUH‰åSHƒìH‰}èH‹$!H‰EðH‹5™ H}è膗H‰ÃH…Ût6H‹=±H5²ÿ¬H‹5m H‰Çÿ”£H‹mbH‰ÇH‰Þè$—H‰ØHƒÄ[]ÃUH‰åSHƒìH‰ûH‹EbH‹<H5rÿlH‰]èH‹™ H‰EðH}èH‹5’èû–HƒÄ[]ÃUH‰åAVSI‰ÖH‰ûH‹bH‹<H…ÿuAH‹= H5 ÿH‹5Æ H‰Çÿí¢H‹ÎaH‰ÇH‰Þè}–H‹¼aH‹<H‹!H5L‰ò[A^]ÿàUH‰åAWAVAUATSHì¸H‰•HþÿÿI‰ÿHÇE HE H‰E¨ÇE°ÇE´8H‹5ŽH‹=gÿi¢H…Àt)H‹}H}€H‰Æè–òE˜òMò]€òUˆëWÀ)E)E€fïÀ(È(Ð(Øò]¸òUÀòMÈòEÐHÇ…XÿÿÿH…XÿÿÿH‰…`ÿÿÿòÖH ÿÿÿÇ…hÿÿÿÇ…lÿÿÿ(H‹E¨òHòXH(òXÈòpÿÿÿòH òXH0òXÈòxÿÿÿHÇ… ÿÿÿH‰(ÿÿÿÇ…0ÿÿÿÇ…4ÿÿÿ8H‹5žH‹½Hþÿÿÿi¡H…Àt8H‹H½ÿÿÿH‰Æè•ò…ÿÿÿòÿÿÿòÿÿÿò•ÿÿÿëWÀ)…ÿÿÿ)…ÿÿÿfïÀ(È(Ð(Øò8ÿÿÿò•@ÿÿÿòHÿÿÿò…PÿÿÿH‹…`ÿÿÿò@H‹(ÿÿÿH5\L¥ þÿÿL­ÀþÿÿH¸ÿÿÿÿÿÿÿLµàþÿÿò\A(òAH‹`ÿÿÿòA H‹(ÿÿÿò\A0òA HÇ…àþÿÿL‰µèþÿÿÇ…ðþÿÿÇ…ôþÿÿ H‰…øþÿÿHÇ…ÀþÿÿL‰­ÈþÿÿÇ…ÐþÿÿÇ…Ôþÿÿ HÇ…ØþÿÿHÇ… þÿÿL‰¥¨þÿÿÇ…°þÿÿÇ…´þÿÿ HÇ…¸þÿÿH‹Ø^I‹<H‹uÿÐH…À„ H‹»^I‹H‹žH‰…PþÿÿÇ…XþÿÿBÇ…\þÿÿHƒH‰…`þÿÿHÈNH‰…hþÿÿHµþÿÿL‰­pþÿÿH… ÿÿÿH‰…xþÿÿL‰µ€þÿÿH…XÿÿÿH‰…ˆþÿÿL‰ÿè“H•PþÿÿL‰¥˜þÿÿH‹5ƒ H‰ßÿBŸ0ÛH‹…¨þÿÿHƒxˆH‹^I‹<H‹¤H5ÿÐH…Àu$H‹ç]I‹<H‹TH5MH‹•HþÿÿÿÐënH‹Ã]I‹<H‹…èþÿÿH‹XH‹UH5NÿÐH‹ ]I‹<H9ÃrH‹H5þH‹•HþÿÿÿÐëH‹…èþÿÿH‹HH‹5É H‹•Hþÿÿÿ|žH‹5 H‹½HþÿÿÿhžH‹5© H‹(ÿÿÿH‹Q0H‰T$H‹Q(H‰T$H‹QH‹I H‰L$H‰$H‰Ç1Òÿ,ž³H‹5s H‹½HþÿÿÿžH½ þÿÿ¾èH½Àþÿÿ¾è|H½àþÿÿ¾èkH½ ÿÿÿ¾èZH½Xÿÿÿ¾èIH} ¾è;¶ÃHĸ[A\A]A^A_]ÃH‰ÃH½Xÿÿÿ¾èH} ¾èH‰ßèH‰ÃH½ þÿÿ¾èèH½Àþÿÿ¾è×H½àþÿÿ¾èÆH½ ÿÿÿ¾èµëUH‰åAWAVSHƒìhI‰ÎI‰×H‰ûH‹6 H‰÷H‰ÆÿH…ÀtH‹& H}ÀH‰Æè¶ë fïÀ)EÐ)EÀH‹C H‹HH‹QH…Ò~ HÿÊH‰QénH‹C(H‹@ò@òMÀf.Èv HÿÂH‰QéJf.Á‡0HƒÀH‹MÀH‹UÈH‹uÐH‹}ØH‰|$8H‰t$0H‰T$(H‰L$ H‹HH‰L$H‹HH‰L$H‹H‹@H‰D$H‰ $èà0É„Àt!H‹C(H‹@òEÈò\@0òX ò@ ±H‹C(H‹@òH òX î fïÀf.ÁvDòHòP(òXÚ ò\ÊòHH‹C(H‹K8H‹@H‹Q±òJ ò\H0òH H‹C(H‹@f.@vLH=/0Àè•AÆH‹C@H‹ tZH‹<H5ÿ H‹K0H‹IH‰AH‹CHH‹@HÇ@ÿÿÿÿë„ÉuAÆH‹C0H‹@L‰xHƒÄh[A^A_]Ãfffff.„UH‰åAVSI‰öH‰ûI‹v H{ ºè›I‹v(H{(ºè‰H{0I‹v0ºèwH{8I‹v8ºèeH{@I‹v@ºèSHƒÃHI‹vHH‰ßº[A^]é:UH‰åSPH‰ûH‹{ ¾è)H‹{(¾èH‹{0¾è H‹{8¾èÿŒH‹{@¾èñŒH‹{H¾HƒÄ[]éÝŒUH‰åAWAVATSHƒì0H‰ûH‹$YHƒ<„ôH‹5‚H‹=#L‹%šAÿÔI‰ÆH‹÷XL‹<H‹ĘH‰E°ÇE¸BHuÐHFIH ·ÇE¼H‰MÀH‰EÈH‰ßèxHuØL‰÷èlHU°H‹5ñL‰ÿAÿÔH54L‰÷ÿ+H…ÀtH‹XH‹<H‹5ôL‰òÿƒ™H‹dXH‹<H5ùÿóH…Àu)H‹GXH‹<H5lÿfH‹/X1ÿH‰ÞèߌHƒÄ0[A\A^A_]ÃUH‰åAWAVSPI‰ÎH‰óI‰ÿI‹ H‹5rH‰Úÿ ™„ÀuAÆHƒÄ[A^A_]ÃI‹(H5CH‰Úÿ:H‹5+H‰ßHƒÄ[A^A_]ÿ%ȘUH‰åAVSI‰öH‰ûI‹v H{ ºè+‹HƒÃ(I‹v(H‰ßº[A^]é‹„UH‰åSPH‰ûH‹{ ¾èùŠH‹{(¾HƒÄ[]éåŠUH‰åAWAVAUATSHƒì(I‰×I‰üHçHÈ$L‰ÿH‰ÞÿÔH‰EÀHÑ$L‰ÿH‰Þÿ½H‰EÈH:%L‰ÿH‰Þÿ¦H‹5ïH‰Çÿî—ˆE×HÔ$L‰ÿH‰Þÿ€I‰ÅHž$L‰ÿH‰ÞÿjI‰ÆM…öu8H5[H<+L‰ÿÿKI‰ÆM…öuH‹¼•H‹8H‹5úÿ„—ëbH‹=H5ÜÿÖH5ßL‰÷H‰ÂÿÓ„Àu:H‹=ðH5QÿKH‹5´H‰ÇL‰òÿ0—H5aH‰ÇÿXI‰ÆH‹=H5ÿH‹5‚L‰d$L‰,$D¾M×L‹=í–H‰ÇH‹UÀH‹MÈM‰ðAÿ×H‰ÃH‹52L‰çH‰ÚAÿׄÀuH‹5FL‰çH‰Úÿ²–H‹ÃH5¼H‰ßHƒÄ([A\A]A^A_]ÿàUH‰åAWAVATSI‰ÖH‰ûH5¡L‰÷ÿ˜H‹IUH‹<H‹5žL‹%W–L‰òAÿÔH‹5ÚH‰ßAÿÔH‹5ýL‰÷AÿÔI‰ÇH‹5ÅH‰ßAÿÔH5hH‹IÿH‰ÇÿX„Àt$H‹5L‹%þ•H‰ßAÿÔH‹5!ÿH‰ÇL‰úAÿÔH‹ùH5òL‰÷[A\A^A_]ÿàUH‰åAWAVATSI‰ÖH‰ûH5ÝL‰÷ÿÔH‹…TH‹<H‹5ÚL‹%“•L‰òAÿÔH‹5H‰ßAÿÔH‹59L‰÷AÿÔI‰ÇH‹5H‰ßAÿÔH5¤H‹uþH‰Çÿ”„Àt$H‹5ÙL‹%:•H‰ßAÿÔH‹5MþH‰ÇL‰úAÿÔH‹5H5.L‰÷[A\A^A_]ÿàUH‰åH‹ÞSH‹<H‹5+H”D]ÿ%å”UH‰åSPH‰óH‹uH5H‰ßÿ „ÀuHƒÄ[]ÃH‹5SH‰ß1ÒHƒÄ[]ÿ%¢”UH‰åH‹‡SH‹]ÃUH‰åH‰ÐH‰ùH‹pSH‰ÇH‰Î]éˆUH‰åAWAVAUATSHì¸H‰}ÈH‹­H‰EÐH‹5òH‹E(H}ÈH‰D$H‹E H‰D$H‹EH‹MH‰L$H‰$èä‡H‰ÃH…Û„¦L‹5H‹´H}¨H‰ÞèćH‹5©H‹EÀH‰D$H‹E¸H‰D$H‹E¨H‹M°H‰L$H‰$ò ¾L‹=¿“L‰÷(ÁAÿ×H × H‰ÇH‰ÎI‰ÎÿÈ H‹‘RH‰ÇH‰Þè0‡H½hÿÿÿH‹0H‰ÞèD‡H}ˆò lH‹E€H‰D$H‹…xÿÿÿH‰D$H‹…hÿÿÿH‹pÿÿÿH‰L$H‰$(Áè$…H‹5éH‹=2H‹E H‰D$H‹E˜H‰D$H‹EˆH‹MH‰L$H‰$ò ÷(ÁAÿ×H‰ÇL‰öÿ H‹æQH‰ÇH‰Þè}†H‹5”H‹=ÝAÿ×H‹5‹H‰Ç1ÒAÿ×H5ì H‰Çÿã H‹5tH‰ÇH‰…@ÿÿÿºAÿ×ò’H‹5[H‹=”Aÿ×M‰üH‰ÇL‰öÿ’ H‹kQH‰ÇH‰Þèú…H5Y H‹=â ÿL I‰ÅH‹ zH‹;QL‹<L‹1H‹5H‹=>AÿÔH‹ ”H‹ H‹RL‹ H‹5HûH‰L$H‹@ÿÿÿH‰ $HÇD$L‰ïL‰úL‰ñI‰À0ÀAÿÔM‰åH‹ÜPH‰ÇH‰Þèc…òÉH‹5šÿH‹=à AÿÕH‰ÇH5Æ ÿÀ H‹©PH‰ÇH‰Þè(…H‹= H5€ ÿz I‰ÆH‹€PL‹$H‹L‹8H‹53ÿH‹=l AÿÕH‹ ŠL‹ H‹5€úHÇ$L‰÷L‰âL‰ùI‰À0ÀAÿÕM‰ïH‹5PH‰ÇH‰Þ謄H‹=+ H5 ÿþ I‰ÆH½HÿÿÿH‹•þH‰Þè©„H‹5ÆþH‹…`ÿÿÿH‰D$H‹…XÿÿÿH‰D$H‹…HÿÿÿH‹PÿÿÿH‰L$H‰$L‰÷ºH‰ÙE1ÀAÿ×H‹·OH‰ÇH‰Þè&„H‹¥OH‹H‹5jþH‰ßAÿ×H‰ØHĸ[A\A]A^A_]ÃUH‰åAVSHƒìH‰ûH‹jOH‹H‹57þH‰ßÿ.H‹OOH‹<L54 L‰öÿ+ H‹H‹OJL‹òX 3ýò3ýò\ÁH‹8ùH}Ðò $ý¹!èÆ~ëfïÀ)Eà)EÐH…ÛtH‹øH}°H‰Þè ~òEèë )EÀ)E°fïÀH¸t@H‰EÀòM¨òXÈfïÀòXÁòXªüò ºüò_ÈòMÈH‹5šøH‹EÈH‰D$H‹EÀH‰D$H‹E°H‹M¸H‰L$H‰$H‰ßÿVŠHƒÄx[]ÃUH‰åAVSHìàH‰ûH‹5ÏöH‹=L‹5)ŠAÿÖH‹5OøH‰ÇAÿÖH‹5JøH‹=+H‹LI€<t ò öûëò üL‹5å‰fïÀAÿÖH‹5øH‰ÇAÿÖH‹ÂHH‹<H‹5øÿ¹‰H‹úH€<tWH‹5…÷H‹=¾L‹5—‰AÿÖH‹5Í÷H‰ÇAÿÖò·ûH‹xHH‹<H‹5½÷AÿÖH‹cHH‹<H‹5°÷AÿÖH‹ö‡H‹HH‰MèH‹HH‰MàH‹H‹@H‰EØH‰MÐH‹XHH‹<H…ÿ„ÌH‹5”õÿ‰òEàòMèH…ÛtGH‹¨öH}°H‰Þè¸|òE°òXûòEÐH‹ƒöH}H‰Þè“|òÿúòXE˜ë)WÀ)EÀ)E°H¸@H‰EÐ)E )EòÏúòEØH‹³GH‹<H‹5ØöH‹EèH‰D$H‹EàH‰D$H‹EÐH‹MØH‰L$H‰$ÿOˆH‹ð†H‹HH‰MˆH‹HH‰M€H‹H‹@H‰…xÿÿÿH‰pÿÿÿH‹TGH‹<H…ÿ„·H‹GH‹H‹5öL‹5ö‡AÿÖòE€òMˆH½PÿÿÿH‹‹õH‰ÞèŸ{ò úòXÿÿÿòXÈòxÿÿÿòMÐòXMàòXÈòpÿÿÿH‹ªFH‹H‹ÇFH‹<H‹5ìõH‹EˆH‰D$H‹E€H‰D$H‹…pÿÿÿH‹xÿÿÿH‰L$H‰$AÿÖH‹‘FH‹4H…ö„ãH‹]FL‹òMàòX <ùò<ùò\ÁH‹AõH½0ÿÿÿò *ù¹!èÌzòEÐòXEàòX.ùH/ùò…0ÿÿÿH‹ FHƒ< •Á¶Éò…xÿÿÿòXEˆòXÈò…8ÿÿÿH‹ÌEH‹H‹áEH‹<H‹5þôH‹…HÿÿÿH‰D$H‹…@ÿÿÿH‰D$H‹…0ÿÿÿH‹8ÿÿÿH‰L$H‰$ÿa†H‹5òòH‹=;H‹L†ÿÓH‹5³ôH‰ÇÿÓHÄà[A^]ÃUH‰åAVSH‰ûH‹iEÆH‹5ŽôL‹5†H‰ßºAÿÖH‹5•óH‰ßAÿÖH58H‹iôH‰Çÿ(„Àu[A^]ÃH‹5hóH‰ßÿÇ…H‹5@ôH‰ÇºH‹±…[A^]ÿàUH‰åAVSH‰ûH‹âDÆH‹5ôL‹5ˆ…H‰ßºAÿÖH‹5óH‰ßAÿÖH5±ÿH‹âóH‰Çÿ¡ÿ„Àu[A^]ÃH‹5áòH‰ßÿ@…H‹5¹óH‰Ç1ÒH‹-…[A^]ÿàUH‰åAWAVSPI‰þH‹5›óL‹= …H‰×Aÿ×H‰ÃH‹5”òL‰÷Aÿ×H‰Ç÷ÃtEH‹tóH5%ÿÿÿ„ÀtEH‹5dòL‰÷ÿÄH‹5LóH‰ÇH‹²„HƒÄ[A^A_]ÿàH‹?òH5àþÿÚþ„Àu HƒÄ[A^A_]ÃH‹5òL‰÷ÿs„H‹5 òH‰Ç1ÒH‹`„HƒÄ[A^A_]ÿàUH‰åH‹‰CH‹]ÃUH‰åH‰ÐH‹uCH‰ÁE1ÀE1É]éøwUH‰åH‹SCH‹]ÃUH‰åH‰ÐH‹?CH‰ÁE1ÀE1É]éÊwUH‰åH‹CH‹]ÃUH‰åH‹,CH‹]ÃUH‰åH‰ÐH‰ùH‹CH‰ÇH‰Î]é[wUH‰åAWAVAUATSHƒìhD‰M”L‰E˜I‰ÏH‰ÓI‰þH‹=ÀÿH5‘ýÿ‹ýH‹5$ñH‹ ‚H‹QH‰T$H‹QH‰T$H‹H‹IH‰L$H‰$L‹%LƒH‰ÇAÿÔH5wýH‰ÇÿnýI‰ÅH‹5ÄñL‰ïH‰ÚL‰óAÿÔH‹5¹ñL‰ïL‰úAÿÔH‹5±ñL‰ïH‹U˜AÿÔH‹5ˆìL‰ïH‰ÚAÿÔH‹5˜ñL‰ïAÿÔM…ítH‹ðH}°L‰îè–vë fïÀ)EÀ)E°H‹=íþH5¶üÿ°üH‹5YñH‹MÀH‹UÈH‰T$H‰L$H‹M°H‹U¸H‰T$H‰ $H‰Çº€¹A¸ÿe‚I‰ÆH} H‰] H‹³ÿH‰E¨H‹5ñL‰òèvI‰ÄM…ä„‘L=UüL‰ïL‰þÿIüH‹rAH‰ÇL‰æè±uH‹5ÐðH‹‚L‰÷ºÿÓH‹5ÀðL‰÷1ÒÿÓH‹5ºðL‰÷1ÒÿÓH‹,AI‹H‹5©ðL‰÷ÿÓH‹5¥ðL‰÷1ÒÿÓH‹5ŸðH‹=ÈýÿÓH‹5—ðL‰÷H‰ÂÿÓ¿ è1sH‹5†ðHcÐL‰÷ÿÓH‹5ðL‰÷ºÿÓH‹5vðL‰÷ºÿÓH‹5mðL‰÷ºÿÓH‹}L‰þÿfûH‹—@H‰ÇL‰æèÎtH‹@H‹}L‰æè»tH‹‚@AÆH‹~@‹M”Aˆ H‹p@A€<uNH‹5ðH‹ ðH‹=ýò,óL‰âE1ÀE1ÉÿÅ€H5æúH‰ÇÿÝúH‹.@H‰ÇL‰æèEtH5´úL‰÷ÿ«úL‰àHƒÄh[A\A]A^A_]ÃUH‰åAWAVSHƒìH‰ûH‹ê?H‹<H‹5ïL‹=X€Aÿ×H‹Î?H‹<L5[úL‰öÿRúH‹»?H‹<H‹5`ïAÿ×H‹v?H‹<L‰öÿ)úH‹j?H‹<L‰öÿúH}ØH‰]ØH‹NýH‰EàH‹5;ëè¤sHƒÄ[A^A_]ÃUH‰åAWAVSPH‰ûH‹5çìL‹=¸H‰ßAÿ×H‹5ëîH‰ÇfïÀAÿ×H‹5ÂìH‰ßAÿ×H‹5ÕîH‰Ç1ÒAÿ×L‹5ûH‹5ŸìH‰ßAÿ×H‹ ú}H‹~H‹5ä}L‹L‹H‹ H‹5œîHÇ$L‰÷H‰Â0ÀAÿ×H‹5ŠîH‹=‹úH‰ÂAÿ×I‰ÆH5#ùH‹=\ûÿùH‹5gîH‰ÇL‰òAÿ×H‹>H‰ÇH‰ÞèŽrH‹m>H‹<H‹5BîºAÿ×ò*ñH‹K>H‹<H‹5(îAÿ×H‹6>H‹<H‹5îAÿ×H‹ >ÆHƒÄ[A^A_]ÃUH‰åAWAVSPH‰ûH5ŽøH‰×ÿ…øH‹5ŽëL‹5_~H‰ßAÿÖH‹5ÒíH‰Ç1ÒAÿÖH‹³=ÆH‹È=DŠ<H‹5ÅëH‰ßAÿÖH‰ÇA€ÿtHH‹ŸíH5XøÿRø„ÀtaH‹5—ëH‰ßÿö}H‹5wíH‰ÇH‰ÚH‹â}HƒÄ[A^A_]ÿàH‹_íH5øÿ ø„ÀtH‹5OëH‰ßÿ®}H‹57íë¶HƒÄ[A^A_]ÃUH‰åH‹5'í]ÿ%ˆ}UH‰åAVSHƒìH‰ûL‹5 ùH‹5”êH‰ßÿc}H‹ ä{L‹ H‹ ê{L‹H‹ è{H‹ H‹5ŽìHÇ$L‰÷H‰Â0Àÿ(}H‹5yìH‹=zøH‰Âÿ}I‰ÆH5÷H‹=Hùÿ÷H‹5SìH‰ÇL‰òÿç|H‹h<H‰ÇH‰ÞèwpH‹V<H‹<H‹5+ìºÿ¸|òïH‹1<H‹<H‹5ìÿ˜|H‹<H‹<H‹5æH‰Úÿ}|H‹þ;H‹<H‹5ãëH‹d|HƒÄ[A^]ÿàUH‰åH‹ß;ˆH‹5åë]ÿ%>|UH‰åH‹5Óéº]ÿ%'|UH‰åSPH‰ûH‹¯;ˆH‹¥;€<tGH‹€;H‹<H‹5%ëÿï{H‹h;H‹<H5õõÿïõH‹P;1ÿH‰ÞHƒÄ[]éboH‹1;€<uHH‹5ÔêH‹ ÅêH‹=Þ÷òîíH‰ÚE1ÀE1Éÿ‡{H5¨õH‰ÇÿŸõH‹ð:H‰ÇëHƒÄ[]ÃUH‰åSPH‰ûH‹5ìèH‰ßÿK{H‹ìêH5…õH‰Çÿ|õ„ÀuHƒÄ[]ÃH‹5ºèH‰ßÿ{H‹5ºêH‰ÇH‰ÚH‹{HƒÄ[]ÿàUH‰åH‹j:¾]ÃUH‰åH‹A:H‹]ÃUH‰åH‹@:¾]ÃUH‰åH‹':H‹]ÃUH‰åH‰ÐH‰ùH‹:H‰ÇH‰Î]é>nUH‰åH‹):¾]ÃUH‰åAWAVATSHƒì`I‰þH‹=öH5sôÿmôH‰ÃH‹5ÛæL‹%TzL‰÷AÿÔH‹5÷éH‰ßAÿÔI‰ÇH‹5ïéL‰ÿAÿÔH‹5ÂæH‹= öAÿÔH‹5¹æH‰ÇºAÿÔH‹5ŸæH‹=èõAÿÔH‹5¶éH‰Ç1ÒAÿÔH‹xH‹HH‰MØH‹HH‰MÐH‹H‹@H‰EÈH‰MÀH‹5AæL‰÷AÿÔòEÐòMØH‹5réH‹=óõAÿÔH‰ÃH‹5féòMØH‰ßfïÀAÿÔòëò ßëH‹5HéH‰ßAÿÔH‹5CéH‰ßAÿÔH‹5þåH‹EÐH‹MØH‰L$8H‰D$0H‹UÀH‹}ÈH‰|$(H‰T$ H‰L$H‰D$H‰|$H‰$L‰÷ºòëAÿÔH‹5íèL‰ÿAÿÔH50óL‰ÿÿ'óHƒÄ`[A\A^A_]ÃUH‰åAVS‰ÓI‰þH‹5OåL‰÷ÿÆxò*Óf.Ðrf.ÑrL‰ð[A^]ÃH‹5—èL‰÷‰Ú[A^]ÿ%˜xUH‰åAWAVSH옉ÓI‰þH‹5üäL‰÷ÿsxf(Ðf.Ñvò^Êò*ÃòYÈòE˜òM ëò^Ñò*ÃòYÐòU˜òE H‹=ÔóH55òÿ/òH‹5ÐçL‹=xH‰ÇòE˜òM Aÿ×H5:òH‰Çÿ1òH‰ÃH‹5§çH‰ßAÿ×H‹5zäH‹=ÃóAÿ×H‹5qäH‰ÇºAÿ×H‹5gvH‹FH‰EàH‹VH‰UØH‹H‹vH‰uÐH‰MÈòE˜òEØòE òEàH‰EÀH‰U¸H‰u°H‰M¨H‹5õãL‰÷Aÿ×(ÐòdéòU¸òMÀH‹5ûãH‹E¨H‹M°H‹U¸H‹}ÀH‰|$8H‰T$0H‰L$(H‰D$ H‹EàH‰D$H‹EØH‰D$H‹EÈH‹MÐH‰L$H‰$L‰÷ºAÿ×H‹5âæH‰ßAÿ×H‰ØHĘ[A^A_]ÃUH‰åAWAVAUATSH쨉ÓH‰øH‹5CãH‰ÇH‰…pÿÿÿÿ³vf(Ðf.Ñvò^Êò*ÃòYÈòE€òMˆëò^Ñò*ÃòYÐòU€òEˆH‹=òH5uðÿoðH‹5æò*ÓL‹%UvH‰Ç(Â(ÊòUAÿÔH5uðH‰ÇÿlðH‹5ååH‰ÇH‰…xÿÿÿAÿÔH‹5±âH‹=úñAÿÔH‹5¨âH‰ÇºAÿÔòEòMˆò\ÁòZÀH‹ŒtóYLèL‹hL‰mÐL‹pL‰uÈH‹L‹xL‰}ÀH‰]¸òU€òUÈòMÐè·ióZÀòEÀòEò\EÈòZÀóYúçè“ióZÀòE¸L‰m°L‰u¨L‰} H‰]˜H‹5åáH‹pÿÿÿH‰ßAÿÔ(ÐòMçòU¨òM°H‹5äáH‹E˜H‹M H‹U¨H‹}°H‰|$8H‰T$0H‰L$(H‰D$ H‹EÐH‰D$H‹EÈH‰D$H‹E¸H‹MÀH‰L$H‰$H‰ßºAÿÔH‹5ËäH‹xÿÿÿH‰ßAÿÔH‰ØHĨ[A\A]A^A_]ÃUH‰åAVSHƒì`H‰ûH‹TsH‹HH‰MèH‹HH‰MàH‹H‹@H‰EØH‰MÐH‹5áL‹5tH‰ßAÿÖòEàòlæòMèH‹5áH‹EÐH‹MØH‹UàH‹}èH‰|$8H‰T$0H‰L$(H‰D$ H‹E(H‰D$H‹E H‰D$H‹EH‹MH‰L$H‰$H‰ßºAÿÖHƒÄ`[A^]ÃUH‰å1À]ÃUH‰åSPH‰ûH5UîH‰ßÿLîH5õíH‰ßÿìí1ÀHƒÄ[]ÃUH‰åAVSHƒìI‰ÖH‰}àH‹ñH‰EèH‹5wÜH}àèdgH‰ÃH…Ût^H5·íL‰÷ÿ®íH‹3H‰ÇH‰ÞègH5ÕíH‰ßÿÌíH‹5ÞH‰ÇÿTsH‹ õ2H‰ H‹ò21ÿH‰ÞèÚfH‰ØHƒÄ[A^]ÃUH‰åAVSHƒìH‰ûH‹·2H‹<L5$íL‰öÿíH‹¬2H‹<L‰öÿíH}àH‰]àH‹HðH‰EèH‹5-Þè–fHƒÄ[A^]ÃUH‰åAWAVSPI‰þH5»ìH‰×ÿ²ìH‰ÃH‹5èÝL‹=™rL‰÷Aÿ×H‹5ÜH‰ßH‰ÂAÿ×H5´ìH‰Çÿ«ìH‰ÃH‹5 ÜL‰÷H‰ÚAÿ×H‰ØHƒÄ[A^A_]ÃUH‰å]ÃUH‰åSPH‰ûH‹5ÔßH‰ßÿ3rH‹5$âH‰ÇH‰Úÿ rH‹5âH‰ßÿrH‹5âH‰ßH‹ÿqHƒÄ[]ÿàUH‰åAWAVAUATSPH‰øH‹5ÝH‰ÇH‰EÐÿÒqH‰ÃH…ÛtRL=ëëL‹5¼qL%ÍëH‰ßL‰þÿÑëI‰ÅH‹5§áH‰ßAÿÖH‹5ÊÜH‰ßAÿÖH‰ÃL‰ïL‰æÿ•ëH…ÛuÃH‹)1H‹]ÐH‹<H…ÿtH‹máH5žëÿ˜ë„ÀuHƒÄ[A\A]A^A_]ÃH‹5ÎÞH‰ßÿ-qH‹56áH‰ÇH‰ÚH‹qHƒÄ[A\A]A^A_]ÿàUH‰åSPH‰ûH‹5‘ÞH‰ßÿðpH‹5áH‰ÇH‰ÚÿÝpH‹5ÖàH‰ßH‹ÌpHƒÄ[]ÿàUH‰åSPH‰ûH‹5ìÛH‰ßÿ«pH‹5LÚH‰Çÿ›pH‹5,ÞH‰ßÿ‹pH‹5¤àH‰ÇH‰ÚH‹wpHƒÄ[]ÿàUH‰åSPH‰ûH‹5÷ÝH‰ßÿVpH‹5wàH‰ÇH‰ÚH‹BpHƒÄ[]ÿàUH‰åH‹Ï/H‹]ÃUH‰åH‹Æ/H‹]ÃUH‰åH‹½/H‹]ÃUH‰åH‰ÐH‹©/H‰ÁE1ÀE1É]é¼cUH‰åH‹—/H‹]ÃUH‰åH‰ÐH‰ùH‹€/H‰ÇH‰Î]é^cUH‰åH‹q/H‹]ÃUH‰åH‰ÐH‹]/H‰ÁE1ÀE1É]é`cUH‰å¸]ÃUH‰åAWAVAUATSHƒì(I‰þH‹5ðÚH‹=1ëH‹ZoÿÓH‹5™ÙH‰ÇÿÓH‰ÃH…Û„dH‹5ißH‹=ëH‰Úÿ)oH…À„DHÇEÐHuÐH‰ßè¥Éÿÿ„À„(H‹5EÚL‰÷ÿônH…Àu 1ÛE0äésH‹FnH‹H‰ßèe`I‰ÄH‰ßL‰æè]`I‰ÇL‰çè"`L‹-³nL‹%ÄéH‹5íÙL‰÷AÿÕH5@éH!ýH‰Çÿ0éH‰ÃèìaH)H‹5ŠÙL‰çH‰ÙA‰ÀM‰ù0ÀAÿÕHŠüH‹5›ÚH‰ÇAÿÕH‰ÃL‰ÿèª_H5éH‰ßÿ éH=rFL=SüH5ôèL‰ÿÿëèºÿH)ÂH‹5<ÞL‹%ýmH‰ßAÿÔH‹58ÚH‰ÇL‰úAÿÔH‰Ãèã_H‹5ÙH‰ÇH‰ÚÿÌmH‰ÃH5šèH‰ßÿ‘èH=rFL=ÚûH5{èL‰ÿÿrèºH)ÂH‹5ÃÝL‹%„mH‰ßAÿÔH‹5¿ÙH‰ÇL‰úAÿÔH‰ÃL‹=¼éH‹5¥ØL‹%VmL‰÷AÿÔH‹5‰ÝLEÈL‰ÿH‰Â¹ÈAÿÔH…Àt,H‹5sÝH‰ÇH‰Ú1Éÿm„ÀuZH=âH‰Þ0Àèú^ëGH‹UÈH=ëH‰Þ0Àèã^H‹52ØL‰÷ÿálH=êH‰Æ0ÀèÂ^H5áæH‹}Èÿ׿H‹5hØH‹=yèL‹=ªlAÿ×H‹5`ØH‰ÇH‰ÚAÿׄÀ„ ýÿÿH‹5¸ÜH‹=aèH‰ÚÿxlH‰ÃA´Ç$HMпtvea¾codoº nspA¸A¹ÿÿÿÿèO]I‰ÇM…ÿu&H5 æL‰÷ÿ—æH=XH‰Æ0Àè^é=E„䄘H‹5 ×L‹%lH‰ßAÿÔH‹5EÜH‰ÇºAÿÔH‰ÃH‹50ØH‰ßAÿÔI‰ÄH5¨æH‰ßÿŸæL‰ÿ¾----ºlrufL‰áI‰Àè½\‰Ã…Ût1H5 æL‰÷ÿæI‰Ä‰ßèW]HcÓH=ÕÿL‰æH‰Á0Àèj]Hu¸L‰ÿèn\‰Ã…Ût3H5ÇåL‰÷ÿ¾åI‰Ç‰ßè]HcÓH=²ÿL‰þH‰Á0Àè']ëWH}¸1öº‘HÇÁÿÿÿÿè\‰Ã…ÛtYH5wåL‰÷ÿnåI‰Ç‰ßèÄ\HcÓH=‚ÿL‰þH‰Á0Àè×\H}¸èÒ[H‹55ÛL‰÷ÿÌjHƒÄ([A\A]A^A_]ÃH}¸èª[H‹5ÛëÖUH‰åH‹h*H‹]ÃUH‰åH‰ÐH‹T*H‰ÁE1ÀA¹]éL^UH‰å¸]ÃUH‰åAVSHƒìH‰ûH‹52ÓH‹= æL‹5LjAÿÖH‹ *L‹ H‹5_ÓH‹ hhH‹ H‰ÇH‰ÚAÿÖL55äH‹æ)H‹<L‰öÿ!äH‹Ú)H‹<L‰öÿ äH}àH‰]àH‹VçH‰EèH‹53Õèœ]HƒÄ[A^]ÃUH‰åAVSH‰ûH‹5$ÚH‰×ÿ³iH‹ |)H; t[A^]ÃH‹5rÒH‹=KåL‹5ŒiAÿÖH‹ R)L‹ H‹5ŸÒH‹ ¨gH‹ H‰ÇH‰ÚAÿÖL5uãH‹.)H‹<L‰öÿaãH‹)1ÿH‰ÞèÚ\H‹)H‹<L‰öÿ<ãH‹í(1ÿH‰Þ[A^]é±\UH‰åAWAVSPI‰þH‹Ó(Iƒ<….H‹5YÙH‹=BåH‹ý1ÉÿÓhI‰ÇM…ÿ„H‹5˜ÑH‹=qäH‹²hÿÓH‹5©ÑH‹ ÙH‹ÓfL‹H‰ÇL‰òM‰ùÿÓH‹5ÙL‰ÿÿÓH‰ÃH‹¿âH‹øØH5±âH‰ßÿЄÀ„°H‹5åØH‹FãH‰ßÿEhH‹fâH5_âH‰ßÿÐH‹(H‰ÇL‰öèÂ[H‹AâH5:âL‰ÿÿÐH‹Ö'H‰ÇL‰öè[ë7H‰ÃƒúufH‰ßè—[H=ÒüH‰Æ0ÀèÊYH‹©'1ÿL‰öèi[èv[H‹“'I‹HƒÄ[A^A_]ÃH=uü0ÀèYH‹o'1ÿëH‰Ãè?[H‰ßèZUH‰åAVSI‰þH‹5 ØL‰÷ÿigH‰ÃH…Ût#H‹5¢ÒL‰÷ÿQgH‹5ê×H‰ßH‰Âÿ>g[A^]ÃH‰Ãƒúu:H‰ßè×ZH=üH‰Æ0Àè YH‹5q×L‰÷ÿg[A^]é³ZH‰Ãè«ZH‰ßè}YUH‰å¸]ÃUH‰åSPH‹?ãH‹5ÒÿÊfH‹5k×H‰ßºH‰ÁH‹±fHƒÄ[]ÿàUH‰å¸]ÃUH‰åSPH‹ùâH‹5ÒÑÿ„fH‹5%×H‰ßºH‰ÁH‹kfHƒÄ[]ÿàUH‰åH‹5 ÑÿRfH5óàH4óH‰ÇÿãàH…À•À¶À]ÃUH‰åAVSHƒìH‰ûH‹ó%H‹<L5 àL‰öÿàH‹à%H‹<H‹5Ö1ÒÿåeH‹Æ%H‹<L‰öÿéßH‹²%1ÿH‰ÞèbYH}àH‰]àH‹)ãH‰EèH‹5þÐègYHƒÄ[A^]ÃUH‰å1À]ÃUH‰å1À]ÃUH‰åSHƒìH‰ûH‹5-ÖH‰ßÿleH=uúH‰ÞH‰Â0ÀèJWH‰]èH}èH‹ÁâH‰EðH‹5žÕèÿXH5JßH‹%H‹<ÿ9ßH‹%1ÿH‰Þè²XHƒÄ[]ÃUH‰åSPH‰ûH‹5¹ÕH‰ßÿðdH‹Ù$H‹H‹5¦ÕH‰ßH‹ÔdHƒÄ[]ÿàUH‰åAVSHƒìH‰ûH‹='áH5¸Þÿ²ÞH‹5sÕH‹ tcL‹5•dH‰ÇH‰ÚAÿÖH‹m$H‰ÇH‰ÞèXH‹k$ÇÿÿÿÿH‹5=ÕH‰ßAÿÖH…Àu Hƒùë'H‹J$H‹<H‹5Õÿ9d„ÀuÛH‹.$H‹HÇEèH‹$H‹<H‹5øÔò€ÖLEè¹ Zÿùc„Àu7H‹uèH=:ù0ÀèÕUH‹5ÌÔH‹UèL‹5ÑcH‰ßAÿÖH‹5$ÔH‰ßAÿÖHƒÄ[A^]ÃUH‰åAWAVSPI‰ÖH‹™'H…Ò…—H‹ àH‹5‚ÔH‹=óßL‹=|cAÿ×H‹5rÔH‰ßH‰ÂAÿ×H‰ÃH‹5WÔH‹=ÈßAÿ×H‹5VÔH‰ßH‰ÂAÿ×H‹56ÔH‹=§ßAÿ×H‹55ÔH‰ßH‰ÂAÿ×H‹5-ÔH‰ßAÿ×H5'H‰Çè¤VH‹ù&H‹5ÔòâÔL‰÷¹HƒÄ[A^A_]ÿ%ÚbUH‰åAVSI‰ÎH‰ÓH‹5¾ÓH‹=/ßÿ¹bò¡ÔH‹5ÂÓH‰ßH‰ÂL‰ñH‹šb[A^]ÿàUH‰åAWAVAUATSPI‰ÖI‰üH‹5™ÓL‰çÿpbI‰ÇH‹n"Iƒ<t^H‹=ØÞH5YÜÿSÜH‹ L"I‹ H‹5aÓL‹-2bH‰Ç¹E1ÀAÿÕH‰ÃH‹5JÓL‰ÿH‰ÚAÿÕH5"ÜH‰ßÿÜH‹52ÓL‰ÿL‰òÿîaH‹5'ÓL‰çL‰ò1ÉH‹ØaHƒÄ[A\A]A^A_]ÿàUH‰åAWAVAUATSHƒìM‰ÅI‰ÌI‰ÖH‰ûH‹=¼ÜH5¥ÛÿŸÛH‹5ØÒH‰ÇL‰â¹ÿaH5°ÛH‰Çÿ§ÛI‰ÇIƒý„ÆM…í…ÞH‹5¢ÒH»öL‰ÿÿBaI‰ÄH5ÀÛL‰çÿ·ÛHƒøtEL5²öL‰÷0Àè SH‹5iÒL‹% aH‰ßL‰òL‰ùAÿÔH‹ß H‹<H‹5LÒAÿÔéiH5uÛL‰ç1ÒÿjÛH5“ÛHtöH‰ÇÿƒÛ„Àu L5€öëŒL‰uÈH5;ÛL‰çºÿ-ÛI‰ÅH‹5óÑH‹= ÝL‹5}`AÿÖH‹5ãÑL‰ïH‰ÂAÿÖH5+ÛH êH‹H‰ÇÿÛ„Àu L55öéÿÿÿH5ÑÚL‰çºÿÃÚI‰ÄHYêH‹H5ßÚL‰çÿÖÚ„ÀtnH‹ ÆH‹5PÐL‹5ñ_H‰ßAÿÖH‹ÌH‹H‹5QÑH‰ßAÿÖH‹5LÑH‰ßAÿÖ„À„ôH‹ŸH‹H‹5ìÐH‰ß1Éÿ¡_é!HÕéH‹H5SÚL‰çÿJÚ„Àt3H‹_H‹H‹5¬ÐH‰ß¹ÿ^_H‹OÇéÐHŒéH‹H5ÚL‰çÿùÙ„Àt,H‹5fÐH‰ßH‹Uȹÿ_H‹Çé†H‹5ÊH‹= ÚHüôL‹5å^L‰á0ÀAÿÖH‹5.ÐH‰ßH‰ÂL‰ùAÿÖH‹«H‹<H‹5ÐL‹5±^AÿÖH‹5¯ÎH‰ßAÿÖé!HÇEÐH‹5ÐH‹=ÛHMÐL‹-{^L‰âAÿÕI‰ÇH‹5ûÏH‹=ôÚAÿÕI9Çt{H‹5H‹<H…ÿuAH‹=EÙH5FØÿ@ØH‹5ÇH‰Çÿ(^H‹H‰ÇH‰Þè¸QH‹ïH‹<H5\ØL‰úÿSØH‹54ÏH‰ßL‰ò¹ÿã]ëfH‹Ò‹ƒøtƒøuH‹5^ÏëH‹5]ÏH‰ßÿ´]H‹H‹<H5º×ÿ´×H‹u1ÿH‰Þè-QH‹5ŒÍH‰ßÿ{]HƒÄ[A\A]A^A_]ÃUH‰åSHì˜H‰ûHÇEÈHEÈH‰EÐÇEØÇEÜ0H=ÀH‰}àH5ÕH‰uèHÇEðHM˜L…hÿÿÿL × LÃH‹Á[HÇE˜H‰M ÇE¨ÇE¬0H‰}°H‰u¸HÇEÀH‹5°H‹<3H‰•hÿÿÿÇ…pÿÿÿBÇ…tÿÿÿL‰•xÿÿÿL‰M€H‰EˆH‰MH‹5ÏÉL‰ÂÿŽ\H‹EÐH‹x(H…ÿ„¾H‹5&Îÿp\H‹5!ÎH‰Çÿ`\H=”uH=Hò0ÀèÃMH‹5ŠÍH‰ßÿÁ[ëH=Hò0Àè£MH‹5 ÌH‰ßÿ¡[H}˜¾èNH}Ⱦè NHĘ[]ÃUH‰åHƒÇ(H‹v(ºƒ]éãMf„UH‰åH‹(¾ƒ]éÍMUH‰åAWAVSPI‰ÎH‰óI‰ÿH‹=»×H5ŒÕÿ†ÕH5ÕH‰ßH‰ÂÿƒÕ„À„ H‹5¤ÌH‰ßÿóZH5´ÕHñH‰Çÿ¤Õ„ÀtI‹G H‹pHƒÆ(H‰ßèlNH‹5eÌH‰ßÿ´ZH5uÕHöðH‰ÇÿeÕ„ÀtI‹G(H‹pHƒÆ(H‰ßè-NI‹G H‹@Hƒx(tI‹G(H‹@Hƒx(tAÆHƒÄ[A^A_]ÃUH‰åAVSI‰öH‰ûI‹v H{ ºè»LHƒÃ(I‹v(H‰ßº[A^]é¢L„UH‰åSPH‰ûH‹{ ¾è‰LH‹{(¾HƒÄ[]éuLUH‰åAWAVSHìÈI‰þHÇE¸HE¸H‰EÀÇEÈÇEÌ0H==þÿÿH‰}ÐHRþÿÿH‰]ØHÇEàHuˆHXÿÿÿL „ LH‹>XL… ÿÿÿHÇEˆH‰uÇE˜ÇEœ0H‰} H‰]¨HÇE°HÇ…XÿÿÿH‰`ÿÿÿÇ…hÿÿÿÇ…lÿÿÿ0H‰½pÿÿÿH‰xÿÿÿHÇE€H‹=êI‹<>H‰• ÿÿÿÇ…(ÿÿÿBÇ…,ÿÿÿL‰•0ÿÿÿL‰8ÿÿÿH‰…@ÿÿÿH‰µHÿÿÿH‰PÿÿÿH‹5ùÅL‰Âÿ¸XH‹EÀH‹x(H‹5YÊÿ£XH‰ÃH‰âH‹H‹WÓH5PÓH‰ßÿÐA¿„ÀurHzâH‹H‹0ÓH5)ÓH‰ßÿÐA¿„ÀuKHCâH‹H‹ ÓH5ÓH‰ßÿЄÀu$H:âH‹H‹èÒH5áÒH‰ßÿÐE1ÿ„ÀtA¿H‹…`ÿÿÿH‹x(H‹5¥ÉÿïWH‹5°ÉH‘îH‰ÇÿØWH…ÀuQH‹EH‹x(H‹ÔH‹5mÉÿ·WH‹5ÈH‰Çºÿ¢WH‹5kÉH‰ßH‰Â1ÉE1ÀE1Éÿ‡WH‰ÃëH‹EH‹x(H‹5#ÉÿmWH‰ÃHH‹I‹<Aƒÿu>H‹—ÑH‹ ÉH5‰ÑÿЄÀt_HìH‹I‹<H‹5þÈL‰òH‰ÙÿWëEH‹L‰<H5bÌH‹ûÆL‰÷ÿNÌH‹ ïH‰ é†H‹¯L‹4H‹=ÌÍH5UËÿOËH‰ÇIƒþtH‹‡H‹H‹54Ãë H‹5+Ã1ÒÿQH‹|H‰ÇH‰Þè«DH‹rHÇH‹kÆH‹hHÇH‰ØHƒÄ[A\A]A^A_]ÃUH‰åAVSI‰ÖH‰ûH‹"H‹<H5‡ËÿËH‹ H+ H‹ ÏH+ L9ðr[A^]ÃH‹ êH‹< I)ÆH‹5„ÂL‰ò[A^]ÿ%gPUH‰åAWAVSPI‰ÎH‰ÓI‰ÿH‹I‹H…ÀtH‹ uI+H9ØHGÃM…ötmAÆëgH‹`I‹H…ÀtH‹ HI+H9ØHFØM…öt=H‹aI‹<H5ÆÊÿÀÊH‹ QI+H‹ I+H9ØrAÆëAÆH‰ØHƒÄ[A^A_]ÃUH‰åH‹úH‹H…ÀuH‹ÚH‹H…ÀuH‰ÐëH‹ ½H+H9ÐHGÂ]ÃUH‰åAWAVSPI‰ÎI‰×H‰ûH‹žH‹H…ÀtH‹ †H+ L9øLFøM…öt=H‹ŸH‹<H5ÊÿþÉH‹ H+ H‹ LH+ L9ørAÆëAÆL‰øHƒÄ[A^A_]ÃUH‰åAWAVAUATSHƒìXH‰M I‰×I‰üH‹¡MH‹H‰EÐH‹I‹<L5ÉL‰öÿ‡ÉH‰ÃL‰ÿL‰}¨L‰öÿtÉH‰ÆH‹ÊI‹H 0H9ÙsI‰÷é”H‹ ¶I‹ H…ÉH‰òt H)ÁH9ÎHBÎH‰ÊH‰uˆH‰e€HCHƒàðI‰åI)ÅL‰ìH‹•I‹<H‹5‚ºH‰UÀÿ(NH‰E¸A¾I)ÞM‰çLcÿH‰]ÈHÇÃÿÿÿÿLuÀH‹fH‹ /I‹ L9áLBáI‹<H‹5ù¿ÿÛMH‰EH‹@I‹MæL‰u°H‹MÈL)áH‰MÀL)àH‰E˜H‹ä M‹4H‹5ñ¹H‹}¨ÿ—MI‰ÇLu˜Luë_IÿÇëZL‰ÿH‹u¸H‹UÈèÿ@…Àuçë[M…ätåL‰ïL‰öL‰âèì@K|%L‰þH‹UÀèÛ@L‰ïH‹u¸H‹UÈèÅ@±…ÀtHÿEÀIÿÌIÿÆHÿÃ0ÉH;]°r±L‹}ˆë L‹}ÀëH‹5]¹H‹}¨ÿML}ÈI)DZHƒ} tH‹E ˆH‹e€H‹²KH‹H;EÐtèz?L‰øHeØ[A\A]A^A_]ÃUH‰åAWAVAUATSHƒìI‰×I‰üH‹ I‹<H‹5±¾H‹’LÿÓH‰EÈH‹Ý I‹<H‹² M‹,H‹5¿¸ÿÓH‰EÐH5:ÇH‹³ I‹<ÿ)ÇH‰ÃE1öI9ÝrMuI)ÞMýL‹=¥ ëIÿÆJ 3HÇÀÿÿÿÿL9éw$K‹<H‹° HÇH‹© òEÐòH‹  L‰4H‰ØHƒÄ[A^A_]ÃUH‰åSHƒìH‰ûH‹c H‹<H5èÄÿâÄH‰]èH‹GÈH‰EðH}èH‹5¶èq>HƒÄ[]ÃUH‰åAVSHƒìI‰ÖH‰}àH‹ÈH‰EèH‹5P³H}àè=>H‰ÃH…Ût"H‹5x»L‰÷ÿ_JH‹ H‰ÇH‰Þèï=H‰ØHƒÄ[A^]ÃUH‰åSHƒìH‰ûH‹Ö H‹<H5;Äÿ5ÄH‰]èH‹¢ÇH‰EðH}èH‹5[µèÄ=HƒÄ[]ÃUH‰åH‹5 ¼1Ò1ÉE1À]ÿ%ÞIUH‰åH‰ÐH‹5ð»1Ò1ÉI‰À]ÿ%ÂIUH‰åH‹5×»E1À]ÿ%­IUH‰åAWAVATSHƒìM‰ÆI‰ÏI‰ÔH‰}ÐH‹"ÇH‰EØH‹5O²H}Ðè<=H‰ÃH…Û„NH‹ L‰çH‰Þèú<M…ÿtL‰ÿè?<H‹ü L‰<H‹ù ÇÿÿÿÿH‹ó ÇÿÿÿÿH‹í ÇM…ötL‰÷èý;H‹Ú L‰4ëH=#›1öèÐ;H‹ ¿ H‰ H‹=ÜÃL5ÝÂL‰öÿÔÂH‹5õ´L‹=¾HH‰ÇºAÿ×H‹Œ H‰ÇH‰ÞèC<H‹‚ 1ÿH‰Þè2<H‹=‰ÃL‰öÿˆÂH‹5©´H‰ÇºAÿ×H‹W H‰ÇH‰Þèþ;H‹M 1ÿH‰Þèí;H‹=¼ÄL‰öÿCÂH‹5±H‰ÇAÿ×H‹' H‰ÇH‰Þè¾;H‰ØHƒÄ[A\A^A_]ÃUH‰åAVSHƒì@H‰ûèÏ:H‹ ÊL‹4 L9ðuH‹5 ºH‰ß1Òÿ×GëGH‹ŽFH‰EÈÇEÐBÇEÔHH‰EØHò÷H‰EàHuèH‰ßèB;HuÈL‰÷è²:H‹71ÿH‰Þè;H‹.H‹<H…ÿt èP:H‹HÇH‹*H‹<è1:L5ZÁH‹HÇH‹ H‹<L‰öÿ7ÁH‹H‹<L‰öÿ#ÁH‹H‹<L‰öÿÁH‹øH‹<L‰öÿûÀH‹ìH‹<L‰öÿçÀH}¸H‰]¸H‹XÄH‰EÀH‹5 ²èv:HƒÄ@[A^]ÃUH‰åH‹ H‹5À¸1Ò]ÿ%F€UH‰åHƒÇ H‹v º]éó8f„UH‰åH‹ ¾]éÝ8UH‰åAWAVSHƒìhH‰ûè9H‹ L‹< L9øuH‹ÙH‹é”HÇE¸Lu¸L‰uÀÇEÈÇEÌ0HƒH‰EÐH˜H‰EØH‹¥DH‰EˆHu°HNöH ŠÇEBÇE”H‰M˜H‰E L‰u¨H‰ßèU9HuˆL‰ÿèÅ8H‹EÀH‹X(L‰÷¾è8H‰ØHƒÄh[A^A_]ÃfDUH‰åHƒÇ(H‹v(ºƒ]éã7f„UH‰åH‹(¾ƒ]éÍ7UH‰åH‹G H‹O(H‹âH‹<H‹pHƒÆ(]éÈ8„UH‰åAVSI‰öH‰ûI‹v H{ ºè{7HƒÃ(I‹v(H‰ßº[A^]éb7„UH‰åSPH‰ûH‹{ ¾èI7H‹{(¾HƒÄ[]é57UH‰åAWAVSHƒì8‰ËI‰×I‰þH‹QCH‰E¸ÇEÀBÇEÄHdH‰EÈHõH‰EÐHuØL‰÷è8HuàL‰ÿèù7è"7H‹ I‹<H9øu H}¸ÿUÈëHu¸„ÛtèJ7ëèï6HƒÄ8[A^A_]ÃUH‰åH‹w H‹(H‹±]é7UH‰åAVSI‰öH‰ûI‹v H{ ºè[6HƒÃ(I‹v(H‰ßº[A^]éB6„UH‰åSPH‰ûH‹{ ¾è)6H‹{(¾HƒÄ[]é6UH‰åH‹5²µ1É]ÿ%yCUH‰åH‹5žµ¹]ÿ%bCUH‰åAWAVSHƒìXH‰ûè#6H‹ L‹< L9øu H‹îH‹ë~HÇEÈLuÈL‰uÐÇEØÇEÜ H‹ËAH‰E˜ÇE BÇE¤HuÀHÆóH CH‰M¨H‰E°L‰u¸H‰ßè{6Hu˜L‰ÿèë5H‹EÐH‹XL‰÷¾è:5H‰ØHƒÄX[A^A_]ÃUH‰åH‹G H‹O(H‹IH‹ H‹@H‰H]Ãff.„UH‰åAVSI‰öH‰ûI‹v H{ ºèÛ4HƒÃ(I‹v(H‰ßº[A^]éÂ4„UH‰åSPH‰ûH‹{ ¾è©4H‹{(¾HƒÄ[]é•4UH‰åAWAVSHƒì8‰ËI‰×I‰þH‹±@H‰E¸ÇEÀBÇEÄH\H‰EÈHÕòH‰EÐHuØL‰÷èe5L‰}àèŠ4H‹ …I‹<H9øu H}¸ÿUÈëHu¸„Ûtè²4ëèW4HƒÄ8[A^A_]ÃUH‰åSPH‰ûH‹C H‹ H‹<H…ÿtèB4H‹{(1ÀH…ÿt è>4H‹C(H‹K H‹óH‰HƒÄ[]ÄUH‰åHƒÇ H‹v º]é“3f„UH‰åH‹ ¾]é}3UH‰åH‹5"³1É]ÿ%á@UH‰åH‹5³¹]ÿ%Ê@UH‰åAWAVAUATSHìˆI‰ÎI‰×H‰ûè~3H‹ yL‹$ L9àu4M…ÿtH‹<H‹<L‰þè(4M…ö„H‹(H‹I‰é HÇE¨HE¨H‰E°ÇE¸ÇE¼0H ÇúÿÿH‰MÀH ÜúÿÿH‰MÈHÇEÐHµxÿÿÿH RñHËH‹=Ì>LmˆHÇEˆL‰mÇE˜ÇEœ HÇE H‰½PÿÿÿÇ…XÿÿÿBÇ…\ÿÿÿH‰•`ÿÿÿH‰hÿÿÿH‰…pÿÿÿH‰ßèV3HµPÿÿÿL‰m€L‰çè¿2M…ÿtH‹E°H‹x(L‰þè.3M…öt H‹EH‹@I‰H}ˆ¾èð1H}¨¾èâ1HĈ[A\A]A^A_]ÃUH‰åSPH‰ûH‹C H‹K(H‹àÿH‹<H‹pHƒÆ(èÇ2H‹K(H‹C0H‹ÈÿH‹ H‹@H‰HHƒÄ[]ÃDUH‰åAVSI‰öH‰ûI‹v H{ ºè[1I‹v(H{(ºèI1HƒÃ0I‹v0H‰ßº[A^]é01fDUH‰åSPH‰ûH‹{ ¾è1H‹{(¾è 1H‹{0¾HƒÄ[]é÷0UH‰åAWAVATSHƒì@D‰ÃI‰ÏI‰ÔI‰þH‹ =H‰E¨ÇE°BÇE´HjH‰E¸H‘ïH‰EÀHuÈL‰÷èÁ1HuÐL‰çèµ1L‰}ØèÚ0H‹ ÕþI‹<H9øu H}¨ÿU¸ëHu¨„Ûtè1ëè§0HƒÄ@[A\A^A_]ÃUH‰åSPH‰ûH‹s H‹{(H‹bþèO1H‹C H‹ ZþH‹<H…ÿtè|0H‹{01ÀH…ÿt èx0H‹C0H‹K H‹-þH‰HƒÄ[]ÃfUH‰åAVSI‰öH‰ûI‹v H{ ºèË/HƒÃ(I‹v(H‰ßº[A^]é²/„UH‰åSPH‰ûH‹{ ¾è™/H‹{(¾HƒÄ[]é…/UH‰åH‹52¯E1À]ÿ%è<UH‰åH‹5¯A¸]ÿ%Ð<UH‰åAWAVSHƒìXH‰ûè‘/H‹ ŒýL‹< L9øuH‹¼ý·Áëƒãƒóë}HÇEÈLuÈL‰uÐÇEØÇEÜ H‹0;H‰E˜ÇE BÇE¤HuÀHëíH BH‰M¨H‰E°L‰u¸H‰ßèà/Hu˜L‰ÿèP/H‹EЊXL‰÷¾è .¾ÃHƒÄX[A^A_]ÃUH‰åH‹G H‹O(H‹ý· ÁéƒáƒñH‹@ˆH]Ãf„UH‰åAVSI‰öH‰ûI‹v H{ ºè;.HƒÃ(I‹v(H‰ßº[A^]é".„UH‰åSPH‰ûH‹{ ¾è .H‹{(¾HƒÄ[]éõ-UH‰åSHƒì8H‰ûH‹:H‰EÈÇEÐBÇEÔHLH‰EØHþìH‰EàˆUðHuèH‰ßèË.èô-H‹ ïûH‹< H9øu H}ÈÿUØë HuÈèÌ-HƒÄ8[]ÃUH‰åH‹G H‹ þû·‰ÖƒÎâ÷ÿ€(fDÖf‰]ÃUH‰åHƒÇ H‹v º]é3-f„UH‰åH‹ ¾]é-UH‰åAWAVSHƒìXH‰ûèV-H‹ QûL‹< L9øuH‹û·ƒãƒóë}HÇEÈLuÈL‰uÐÇEØÇEÜ H‹ø8H‰E˜ÇE BÇE¤HuÀHìH BH‰M¨H‰E°L‰u¸H‰ßè¨-Hu˜L‰ÿè-H‹EЊXL‰÷¾èh,¾ÃHƒÄX[A^A_]ÃUH‰åH‹G H‹O(H‹×ú· ƒáƒñH‹@ˆH]Ã@UH‰åAVSI‰öH‰ûI‹v H{ ºè ,HƒÃ(I‹v(H‰ßº[A^]éò+„UH‰åSPH‰ûH‹{ ¾èÙ+H‹{(¾HƒÄ[]éÅ+UH‰åSHƒì8H‰ûH‹ê7H‰EÈÇEÐBÇEÔHLH‰EØH.ëH‰EàˆUðHuèH‰ßè›,èÄ+H‹ ¿ùH‹< H9øu H}ÈÿUØë HuÈèœ+HƒÄ8[]ÃUH‰åH‹G H‹ Îù·‰ÖƒÎâþÿ€(fDÖf‰]ÃUH‰åHƒÇ H‹v º]é+f„UH‰åH‹ ¾]éí*UH‰åAWAVSHƒìXH‰ûè&+H‹ !ùL‹< L9øuH‹Qù·Ñëƒãƒóë}HÇEÈLuÈL‰uÐÇEØÇEÜ H‹Æ6H‰E˜ÇE BÇE¤HuÀHAêH BH‰M¨H‰E°L‰u¸H‰ßèv+Hu˜L‰ÿèæ*H‹EЊXL‰÷¾è6*¾ÃHƒÄX[A^A_]ÃUH‰åH‹G H‹O(H‹¥ø· ÑéƒáƒñH‹@ˆH]ÃUH‰åAVSI‰öH‰ûI‹v H{ ºèÛ)HƒÃ(I‹v(H‰ßº[A^]éÂ)„UH‰åSPH‰ûH‹{ ¾è©)H‹{(¾HƒÄ[]é•)UH‰åSHƒì8H‰ûH‹º5H‰EÈÇEÐBÇEÔHLH‰EØH^éH‰EàˆUðHuèH‰ßèk*è”)H‹ ÷H‹< H9øu H}ÈÿUØë HuÈèl)HƒÄ8[]ÃUH‰åH‹G H‹ ž÷·‰ÖƒÎâýÿ€(fDÖf‰]ÃUH‰åHƒÇ H‹v º]éÓ(f„UH‰åH‹ ¾]é½(UH‰åAWAVSHƒìXH‰ûèö(H‹ ñöL‹< L9øuH‹!÷·Áëƒãƒóë}HÇEÈLuÈL‰uÐÇEØÇEÜ H‹•4H‰E˜ÇE BÇE¤HuÀHpèH BH‰M¨H‰E°L‰u¸H‰ßèE)Hu˜L‰ÿèµ(H‹EЊXL‰÷¾è(¾ÃHƒÄX[A^A_]ÃUH‰åH‹G H‹O(H‹tö· ÁéƒáƒñH‹@ˆH]Ãfffff.„UH‰åAVSI‰öH‰ûI‹v H{ ºè›'HƒÃ(I‹v(H‰ßº[A^]é‚'„UH‰åSPH‰ûH‹{ ¾èi'H‹{(¾HƒÄ[]éU'UH‰åSHƒì8H‰ûH‹z3H‰EÈÇEÐBÇEÔHLH‰EØH~çH‰EàˆUðHuèH‰ßè+(èT'H‹ OõH‹< H9øu H}ÈÿUØë HuÈè,'HƒÄ8[]ÃUH‰åH‹G H‹ ^õ·‰ÖƒÎâûÿ€(fDÖf‰]ÃUH‰åHƒÇ H‹v º]é“&f„UH‰åH‹ ¾]é}&UH‰åSHƒìhH‰ûHÇEÈHEÈH‰EÐÇEØÇEÜ0H LîÿÿH‰MàH aîÿÿH‰MèHÇEðHuÀH ºæH£H‹=T2H‰}˜ÇE BÇE¤H‰U¨H‰M°H‰E¸H‰ßè'è?&H‹ :ôH‹< H9øu%H‹E¨H}˜ÿÐë"H‰ÃH}ȾèÄ%H‰ßèÂ%Hu˜èO&H‹EÐH‹x(H‹T­H5M­ÿÐH‰ÃH}ȾèŠ%H‰ØHƒÄh[]ÃUH‰åSPH‰ûH‹C(H‹ ôóH‹<H5­ÿû¬H‹K H‹qHƒÆ(H‰ÇHƒÄ[]éa&UH‰åAVSI‰öH‰ûI‹v H{ ºè%HƒÃ(I‹v(H‰ßº[A^]é%„UH‰åSPH‰ûH‹{ ¾èé$H‹{(¾HƒÄ[]éÕ$UH‰åAVSHƒì0I‰ÖH‰ûH‹õ0H‰EÀÇEÈBÇEÌHWH‰EÐHYåH‰EØHuàH‰ßè©%HuèL‰÷è%èÆ$H‹ ÁòH‹< H9øu H}ÀÿUÐë HuÀèž$HƒÄ0[A^]ÃUH‰åSPH‰ûH‹C H‹ ÁòH‹<H;{(uHƒÄ[]ÃH5±«ÿ««H‹{(H5°«ÿª«H‹s H‹‡òH‰ÇHƒÄ[]é %UH‰åAVSI‰öH‰ûI‹v H{ ºèË#HƒÃ(I‹v(H‰ßº[A^]é²#„UH‰åSPH‰ûH‹{ ¾è™#H‹{(¾HƒÄ[]é…#UH‰åH‰È‰ÑH‹55£1ÒI‰Àÿâ0¾À]ÃUH‰åAWAVAUATSHìèL‰…ÿÿÿ‰üþÿÿI‰ÔH‰ûHÇE¸L}¸L‰}ÀÇEÈÇEÌ ÆEÐHÇEˆLuˆL‰uHu€HñãH ÍL‹-+/H ëÿÿH=åêÿÿÇE˜ÇEœ0H‰} H‰U¨HÇE°L‰­XÿÿÿÇ…`ÿÿÿBÇ…dÿÿÿH‰hÿÿÿH‰…pÿÿÿL‰µxÿÿÿH‰ßè¯#Hµ(ÿÿÿHAäH EL‰­ÿÿÿÇ…ÿÿÿBÇ…ÿÿÿH‰ÿÿÿH‰… ÿÿÿH‰ßèi#Hµ@ÿÿÿL‰½0ÿÿÿL‰µ8ÿÿÿL‰çèL#H½XÿÿÿHµHÿÿÿ‹…üþÿÿf‰…Pÿÿÿè,#èU"H‹ PðH‹< H9øu9H‹…ÿÿÿH½ÿÿÿÿÐë3H‰ÃH}ˆ¾èÔ!H}¸¾èÆ!H‰ßèÄ!HµÿÿÿèN"H‹EÀ€xuCH‹EH‹x(Hƒ½ÿÿÿt!H‹?©H58©ÿÐH‰ÇH‹µÿÿÿè—"ëH‹þ¨H5÷¨ÿÐH‹EÀ¾XH}ˆ¾èO!H}¸¾èA!‰ØHÄè[A\A]A^A_]ÃUH‰åAWAVATSHƒìI‰×I‰þ‰÷¾1Òèr"‰ÃƒûÿuAI‹~(H‹5À HÙÅÿc.H5„¨H‰Çÿ{¨I‹N H‹qHƒÆ(H‰Çèç!é‰ß¾º0ÀèW!ƒøÿuI‹~(H‹5g H Åé¦ÇEÜHM܉߾ÿÿºA¸èÓ!ƒøÿuI‹~(H‹5) H‚ÅëkH‹5šL‰ÿÿÀ-I‰ÄH5ލL‰ÿÿ…¨‰ßL‰æ‰ÂèS ƒøÿuI‹~(H‹5áŸHZÅë#‰ß¾èú ƒøÿuHI‹~(H‹5¼ŸHUÅÿ_-H5€§H‰Çÿw§I‹N H‹qHƒÆ(H‰Çèã ‰ßèø»ÿÿÿÿ‰ØHƒÄ[A\A^A_]ÄUH‰åAVSI‰öH‰ûI‹v H{ ºè{HƒÃ(I‹v(H‰ßº[A^]éb„UH‰åSPH‰ûH‹{ ¾èIH‹{(¾HƒÄ[]é5UH‰åAWAVAUATSHìèH‰ûH‹=?¨H5¦ÿЦH‹5K•H‰Çÿr,I‰ÅH‹{ H‹íHƒ<u^H‹C(H‹@Æ@H‹{ H‹5žžHOÄL‹58,AÿÖH5V¦H‰ÇÿM¦H‹K0H‹qHƒÆ(H‰Çè¹H‹5Ò–L‰ïAÿÖé2H‹°ìHƒ<u H‹C(H‹@Æ@H‹{ H‹52žHÄë’H‹âìfD‹<EˆüA€ä”ÀfAƒçt'„Àu#H‹C(H‹@Æ@H‹{ H‹5ñHâÃéNÿÿÿH‹5æÿ€+„Àu#H‹C(H‹@Æ@H‹{ H‹5½HÎÃéÿÿÿH‹C H‹ .ìH‹<H‹5«L‹5<+AÿÖH‹C H‹ ìH‹<H‹5‹AÿÖHUÐHMÈHÇEÐHÇEÈD·KHH‹{ L‹C8H‹5dAÿÖH‹UÐH…Òu*Hƒ}Èu#H‹C(H‹@Æ@H‹{ H‹5BHSÃéþÿÿE„ät*Hƒ}Èu#H‹C(H‹@Æ@H‹{ H‹5HDÃéPþÿÿH…Ò•ÀfE…ÿt'„Àu#H‹C(H‹@Æ@H‹{ H‹5àœH1ÃéþÿÿL‰­ðþÿÿH…Ò•ÀE„äA”ÅE0äfE…ÿu Hƒ}ÈA•ÄA ÅA€ýu?H‹C@H‰Ç¾ÿPH‹K H‹Óê‰H‹C H‹ Åêƒ<ÿuH‹C(H‹@Æ@é A€ü…¨A€ýu6fƒ{Hu/H‹5 –H‹}ÈL‹5Å)AÿÖI‰ÇH‹{ H‹54œAÿÖfÁÀfA‰GH‹C@H‹UÈH‰Ç¾ÿPH‹K H‹Rê‰H‹C H‹ Dêƒ<ÿu:H‹C(H‹@Æ@H‹C H‹ ê‹<ƒÿÿH‹ðþÿÿtèH‹5 ”H‰ßéiA€ý… H‹C H‹ ÿéH‹ H‹ÜéHc4H‹=ñ'1Òè H‹K H‹êH‰Hu¸H˜ÜH .L‹5¢'H‹{ H‹—éD‹,H‹ìéL‹<L‰uÇE˜BÇEœH‰M H‰E¨L‰}°èMHuD‰mÀL‰ÿè§Hµ`ÿÿÿH_ÜH {H‹S H‹=•éH‹<:L‰µ`ÿÿÿÇ…hÿÿÿ@Ç…lÿÿÿH‰pÿÿÿH‰…xÿÿÿL‰}€D‰mˆèGH‹C H‹ PéH‹<èA€ü…,H‹C H‹ êèH‹ H‹ÏèHc4H‹=Ü&1ÒèõH‹K H‹éH‰HµPÿÿÿHÐÛH ìL‹-Š&H‹{ H‹‡èD‹$H‹ÜèL‹<L‰­(ÿÿÿÇ…0ÿÿÿBÇ…4ÿÿÿH‰8ÿÿÿH‰…@ÿÿÿL‰½Hÿÿÿè#Hµ(ÿÿÿD‰¥XÿÿÿL‰ÿèwHµøþÿÿHÛH +H‹S H‹=mèH‹<:L‰­øþÿÿÇ…ÿÿÿ@Ç…ÿÿÿH‰ÿÿÿH‰…ÿÿÿL‰½ÿÿÿD‰¥ ÿÿÿèH‹C H‹ "èH‹<èßH‹C H‹ èfƒ H‹5¢‘H‹½ðþÿÿÿÍ&HÄè[A\A]A^A_]ÃUH‰åAWAVATSI‰üH‹=V¢H5§ ÿ¡ H‹5bH‰Çÿ‰&I‰ÆI‹|$ è‚I‰Ç»A‹T$0I‹|$(H‹5ë˜ÿ]&„Àt L9ûH[rÜH‹5‘L‰÷[A\A^A_]ÿ%8&UH‰åHƒÇ(H‹v(º]é£f„UH‰åH‹(¾]éUH‰åSPH‰ûH‹{ èÛ‹{(HƒÄ[]é©UH‰åAWAVATSI‰üH‹=€¡H5ÑŸÿËŸH‹5ŒŽH‰Çÿ³%I‰ÆI‹|$ è¬I‰Ç»A‹T$0I‹|$(H‹5˜ÿ‡%„Àt L9ûH[rÜH‹5;L‰÷[A\A^A_]ÿ%b%f.„UH‰åHƒÇ(H‹v(º]éÃf„UH‰åH‹(¾]é­UH‰åSPH‰ûH‹{ èû‹{(HƒÄ[]éÉffff.„UH‰åAVSI‰öH‰ûI‹v H{ ºè[I‹v(H{(ºèIH{0I‹v0ºè7H{8I‹v8ºè%HƒÃ@I‹v@H‰ßº[A^]é fUH‰åSPH‰ûH‹{ ¾èùH‹{(¾èëH‹{0¾èÝH‹{8¾èÏH‹{@¾HƒÄ[]é»UH‰åAWAVAUATSH숉ÐI‰ÿH‹ ÓäA9uMÇEÄHuÈHUĉÇè£A‰ÆE0íAƒþÿ„UH‹5p–‹MÄH‹=v HUÈÿÌ#I‰ÄÆ…_ÿÿÿëKÇE¤Hu¨HU¤‰ÇèVA‰ÆE0íAƒþÿ„H‹5#–‹M¤H‹=) HU¨ÿ#I‰ÄÆ…_ÿÿÿE0íD‰÷¾º0À莃øÿ„ÃÇE HM D‰÷¾ÿÿº"A¸èH‹ããI‹AµH…Û„‰H‹ÄãI‹<H‹É!H‰…`ÿÿÿÇ…hÿÿÿBÇ…lÿÿÿHkH‰…pÿÿÿH×H‰…xÿÿÿHu€èqHuˆL‰çèeHuL‰ÿèYHµ`ÿÿÿŠ…_ÿÿÿˆEœD‰u˜H‰ßèeAµA¶ÅHĈ[A\A]A^A_]ÃUH‰åAWAVAUATSHƒì8I‰üH‹=žH5bœÿ\œH‹5‹H‰ÇÿD"I‰ÆI‹|$ H5}œH‹Æ”ÿpœ„ÀuE1ÿëI‹L$0I‹|$ I‹T$(H‹5¡”ÿ"I‰ÇH‹=ižH5ú›ÿô›I‹T$0H‹ ˜âH‹ H‹5…âH‹2H‹5ê“H‰ÇM‰øÿ¾!H‰ÃA‹D$8A€|$<t H‹ gâëH‹ f≠H‹ÄâfÇH‹_âL‹,H‹< H‰E¨ÇE°BÇE´HuÈH×ÕH —H‰M¸H‰EÀH‰ßèðHu¨A‹D$8‰EÐL‰ïèH5u›I‹|$ H‹É“ÿc›„ÀtI‹|$ I‹T$0H‹5®“H‰Ùÿý M…ÿtL‰ÿèØH5›H‰ßÿøšH‹5¡‹L‰÷ÿÐ HƒÄ8[A\A]A^A_]ÃUH‰åAVSH‰ûH‹=`œH5±šÿ«šH‹5l‰H‰Çÿ“ I‰Æ‹S(H‹{ H‹5"“ÿ| H‹5=‹L‰÷H‹k [A^]ÿàffff.„UH‰åHƒÇ H‹v º]éÃf„UH‰åH‹ ¾]é­ffff.„UH‰åAVSI‰öH‰ûI‹v H{ ºè{I‹v(H{(ºèiHƒÃ0I‹v0H‰ßº[A^]éPfDUH‰åSPH‰ûH‹{ ¾è9H‹{(¾è+H‹{0¾HƒÄ[]éUH‰åAWAVAUATSHƒìI‰ÎI‰×H‰ûH‹àHƒ<u40ÀM…ö„ôH‹5­‘H>¸H‰ßÿEH‰ÇL‰öèâ0ÀéËH‹äßHƒ<u0ÀM…ö„²H‹5k‘H¸ë¼H‹5c‘H‰ßÿú„Àu0ÀM…ö„ƒH‹5<‘H ¸ëH‹ìßfD‹$fE‰åfAƒå”ÀfAƒät"„Àu0ÀM…ö„EH‹5þHï¶éLÿÿÿM…ÿ„öHÇEÐHÇEÈH‹5êHUÐHMÈH‰ßM‰øE1ÉÿcH‹}ÐH…ÿu%Hƒ}Èu0ÀM…ö„àH‹5¹HʶéçþÿÿfE…ít%Hƒ}Èu0ÀM…ö„µH‹5ŽH¿¶é¼þÿÿH…ÿ•ÀfE…ät"„Àu0ÀM…ö„‡H‹5`H±¶éŽþÿÿL5ý—L‰öÿô—H‹ýÞH‰ÇH‰Þè\H‹}ÈL‰öÿÕ—H‹æÞH‰ÇH‰Þè=H‹tÞH‹<H‹5ñL‹5‚AÿÖH‹hÞH‹<H‹5ÕAÿÖ°¶ÀHƒÄ[A\A]A^A_]ÃUH‰åH‹53Žò«ÿ=¾À]ÃUH‰åL‰ÀH‹5ÚE1ÀI‰Áÿ¾À]ÃUH‰åAWAVAUATSHì¸L‰(ÿÿÿò… ÿÿÿM‰ÅA‰ÏI‰ÔH‰ûHÇE¸HE¸H‰EÀÇEÈÇEÌ ÆEÐHÇEˆLuˆL‰uL…XÿÿÿL ²ÑH‡H‹=\H5=×ÿÿH ×ÿÿÇE˜ÇEœ0H‰M H‰u¨HÇE°H‰½0ÿÿÿÇ…8ÿÿÿBÇ…<ÿÿÿH‰•@ÿÿÿL‰HÿÿÿH‰…PÿÿÿH‰ßL‰ÆèÝHµ`ÿÿÿL‰ïèÎHµpÿÿÿL‰µhÿÿÿL‰çè¸fD‰}€ò… ÿÿÿò…xÿÿÿèÌH‹ ÇÜH‹< H9øu9H‹…@ÿÿÿH½0ÿÿÿÿÐë3H‰ÃH}ˆ¾èKH}¸¾è=H‰ßè;Hµ0ÿÿÿèÅH‹EÀ€xuCH‹EH‹x(Hƒ½(ÿÿÿt!H‹¶•H5¯•ÿÐH‰ÇH‹µ(ÿÿÿèëH‹u•H5n•ÿÐH‹EÀ¾XH}ˆ¾èÆ H}¸¾è¸ ‰ØHĸ[A\A]A^A_]ÃUH‰åAWAVAUATSHƒìHH‰ûH‹=±–H5•ÿü”H‹5½ƒL‹5æH‰ÇAÿÖI‰ÇH‹{(H‹S0H‹C8H‹HH‹5~HƒÁ(AÿÖH‹K H‹IˆAH‹C H‹@€xu.H‹C8H‹@H‹x(H5»”ÿµ”H‹5N…L‰ÿÿ}éØH‹C(H‹ Ûfƒ H‹C(H‹{@H‹ )ÛD‹4H‹5^‹L‹-GAÿÕH5u”H‰Çÿl”I‰Ä1ÿ1öè L‰}˜I‰ÇHuÀHîÎH ~H‹ÈH‰U ÇE¨BÇE¬H‰M°H‰E¸H‹{(è HuÈD‰uÐL‰çè} Hu f‹CPf‰EÔL‰ÿè‘ òCHH‹{(H‹5yŒAÿÕH‹5o„H‹}˜AÿÕHƒÄH[A\A]A^A_]ÃUH‰åAVSH‰ûH‹=0•H5“ÿ{“H‹5<‚H‰ÇÿcI‰ÆD·C4‹S0H‹{ H‹K(H‹5 ŒÿCH‹5„L‰÷H‹2[A^]ÿà@UH‰åAVSI‰öH‰ûI‹v H{ ºè‹ HƒÃ(I‹v(H‰ßº[A^]ér „UH‰åSPH‰ûH‹{ ¾èY H‹{(¾HƒÄ[]éE DUH‰åAVSI‰öH‰ûI‹v H{ ºè I‹v(H{(ºè H{0I‹v0ºè÷ H{8I‹v8ºèå HƒÃ@I‹v@H‰ßº[A^]éÌ fUH‰åSPH‰ûH‹{ ¾è¹ H‹{(¾è« H‹{0¾è H‹{8¾è H‹{@¾HƒÄ[]é{ UH‰åH‰ÈH‹5µŠòEŠ1ÉI‰ÀÿÒ¾À]ÃUH‰åH‰ÈH‹5Š1ÉI‰Àÿ´¾À]ÃUH‰åAWAVAUATSHì¨M‰Æò…0ÿÿÿI‰ÏH‰ûHÇE¸Le¸L‰eÀÇEÈÇEÌ ÆEÐHÇEˆLmˆL‰mL…XÿÿÿL ‚ÌH vH‹=üH5ÝÑÿÿH¶ÑÿÿÇE˜ÇEœ0H‰E H‰u¨HÇE°H‰½8ÿÿÿÇ…@ÿÿÿBÇ…DÿÿÿH‰HÿÿÿL‰PÿÿÿH‰×L‰Æè„ HµhÿÿÿL‰­`ÿÿÿH‰ßèn HµxÿÿÿL‰¥pÿÿÿL‰ÿèX ò…0ÿÿÿòE€èt H‹ o×H‹< H9øu9H‹…HÿÿÿH½8ÿÿÿÿÐë3H‰ÃH}ˆ¾èóH}¸¾èåH‰ßèãHµ8ÿÿÿèm H‹EÀ€xu:H‹EH‹x(M…ötH‹cH5\ÿÐH‰ÇL‰öè¿ ëH‹&H5ÿÐH‹EÀ¾XH}ˆ¾èwH}¸¾èi‰ØHĨ[A\A]A^A_]ÃUH‰åAWAVATSI‰ÿH‹=h‘H5¹ÿ³H‹5t~H‰Çÿ›I‰ÆI‹ H5eÿ_1ÛHƒøI‰ÜrhI‹ H‹5ÁÿkŠ@<t.1Û<I‰ÜuGI‹ H5(ÿ"1ÛHƒøI‰Üu+I‹_ E1äë"I‹ H5ÿý1ÛHƒøI‰ÜuM‹g 1ÛI‹0H‰ØL àu=H‹5y‡HJ®ÿôH5H‰Çÿ I‹O(H‹qHƒÆ(H‰ÇèxéÁH‹ÜÕ·¨tH…ÛtH‹5(‡H®ë­¨tM…ätH‹5‡H ®ë”I‹G(I‹W@H‹HH‹53‡HƒÁ(ÿqI‹O8H‹IˆAI‹G8H‹@€xtiI‹G(I‹0L‹@H‹5‡IƒÀ(H‰ÚL‰áÿ5„ÀtBI‹G0H‹ VÕfƒ òAGHI‹0H‹5؆ÿ H‹5Ë~L‰÷H‹ù[A\A^A_]ÿàI‹G(H‹@H‹x(H5ŽÿþH‹5—~L‰÷[A\A^A_]ÿ%¾fDUH‰åAVSI‰öH‰ûI‹v H{ ºèI‹v(H{(ºè H{0I‹v0ºè÷H{8I‹v8ºèåHƒÃ@I‹v@H‰ßº[A^]éÌfUH‰åSPH‰ûH‹{ ¾è¹H‹{(¾è«H‹{0¾èH‹{8¾èH‹{@¾HƒÄ[]é{UH‰åAWAVAUATSHìøD‰ÃI‰Ï‰•ìþÿÿI‰þH5‘Hò§L‰ÿÿ„ÀuH5vHW¬L‰ÿÿf„À„ÆEÈÆEÉfÁÃf‰]ÊÇEÌHÇEÐÆE¨ÆE©H‹ÈHUÈL‹=]f‰]ªÇE¬H‹H‹@H‰E¸H‰M°ÇEÀH‹5Å„H‹=ÎŽ¹Aÿ×I‰ÄHU¨H‹5¨„H‹=±Ž¹Aÿ×I‰ÇH‹×ÒM‹,H‹´H‰…ðþÿÿÇ…øþÿÿBÇ…üþÿÿH%H‰…ÿÿÿH\ÇH‰…ÿÿÿHµÿÿÿL‰÷èVHµÿÿÿ‹…ìþÿÿ‰…(ÿÿÿL‰çè;Hµ ÿÿÿL‰ÿè,Hµðþÿÿé×H‹5‰|H‹=‚Œ·ËH0«L‹-Y0ÀAÿÕI‰ÄfïÀ)E)E€)…pÿÿÿÇ…xÿÿÿÇ…|ÿÿÿH‹5„L‰ÿAÿÕH‰ÃH‹5óƒL‰çAÿÕH•pÿÿÿHhÿÿÿH‰ßH‰ÆèN…À…­E1ÿH‹hÿÿÿH…ÛM‰ýL‰ÿM‰ütjM…íu&ƒ{u ‹KH‹S H‹5KƒH‹=Tÿ®I‰Åë,M…ÿu'E1ÿƒ{u‹KH‹S H‹5ƒH‹=&ÿ€I‰ÇH‹[(H…Ûu H‹½hÿÿÿM‰ìè§L‰àL ø…SþÿÿH‹5:ƒL‰÷ºÿDH‰ÃëH‹5 ƒL‰÷‰Âÿ-H‰ÃE1äM‰çH‹õÐM‹,H…Û„þÿÿH‹ÉH‰…0ÿÿÿÇ…8ÿÿÿBÇ…<ÿÿÿH`H‰…@ÿÿÿHAÅH‰…HÿÿÿHµPÿÿÿL‰÷èkHµXÿÿÿ‹…ìþÿÿ‰…`ÿÿÿH‰ßèPHµ0ÿÿÿL‰ïèiHÄø[A\A]A^A_]ÃUH‰åAVSH‰ûH‹=&‹H5w‰ÿq‰H‹52xH‰ÇÿYI‰Æ‹S0H‹{ H‹K(H‹54‚ÿ>H‹5ÿyL‰÷H‹-[A^]ÿàffffff.„UH‰åAVSI‰öH‰ûI‹v H{ ºè{HƒÃ(I‹v(H‰ßº[A^]éb„UH‰åSPH‰ûH‹{ ¾èIH‹{(¾HƒÄ[]é5UH‰åAVSH‰ûH‹=LŠH5ˆÿ—ˆH‹5XwH‰ÇÿI‰ÆL‹C0‹S8H‹{ H‹K(H‹5^ÿ`H‹5!yL‰÷H‹O[A^]ÿàUH‰åAVSI‰öH‰ûI‹v H{ ºè«I‹v(H{(ºè™HƒÃ0I‹v0H‰ßº[A^]é€fDUH‰åSPH‰ûH‹{ ¾èiH‹{(¾è[H‹{0¾HƒÄ[]éGUH‰åAVSHƒìH‰ûH‹zÎ9…—H‹²Î·¨t2M…Àu-H‹5†€Ho§L‹5x H‰ßAÿÖH‹5“H‰ßH‰ÂAÿÖëV¨tH…ÉuH‹5P€HY§ëÈHÇEèH‹5€HEèH‰ßH‰ÊL‰ÁI‰Àÿ" „ÀuH‹5?H‹UèH‰ßÿ HƒÄ[A^]ÃUH‰åAVSI‰ÎH‰ûH‹½Í9t[A^]ÃH‹5äH‰ßÿÓ H‹5ô~H‰ßL‰òH‹¿ [A^]ÿàUH‰åAWAVAUATSHƒìHM‰ÆH‰ËI‰×I‰ýH‹­ÍAŠD$ÀèH…Û•Á„ÈuM…ÿu-¿¾1Òè[H‹ ,ÍA‰D H˜ÍH Íë.¿¾1Òè.H‹ ÷ÌA‰D HcÍH äÌL‰ûH‹ E‹d Aƒüÿu40ÀM…ö„QH‹5Q~Hj£L‰ïÿñ H‰ÇL‰öèŽÿ0Àé(H‰]H‹I‹\H…Û„H5+†L‰ïÿ"†H‹5Ã~H‰ÇH‰Úÿ§ f…Àt#ÇEÔHMÔD‰ç¾ÿÿºA¸èiÿH‹5ÈwH‰ßÿo I‰ÇH5=†H‰ßÿ4†D‰çL‰þ‰Âèþ…Àt0ÀM…ö„‰H‹5‰}H£é3ÿÿÿH‹öËE‹t1ÿ1öèôýH‰ÃH‹Î H‰E˜ÇE BÇE¤Hu¸HÁH EH‰M¨H‰E°D‰eÈH‹}è}þHuÀL‰ïèqþHu˜D‰uÌH‰ßè‰ý°¶ÀHƒÄH[A\A]A^A_]ÃUH‰åAWAVSHƒìhH‰ûD‹s0H‹{ H‹5Övÿ€ I‰ÇH‹{ H5J…ÿD…D‰÷L‰þ‰Âè)ýH‹{(…ÀuOH‹(ËL‹4H‹ H‰E¸ÇEÀBÇEÄH«H‰EÈHé¿H‰EÐHuØè¼ýHu¸‹C4‰EàëtH‹5Q|H*¤ÿô I‰ÇH‹{(H‹¾ÊL‹4H‹›H‰E€ÇEˆBHu H½¿H ÙÇEŒH‰MH‰E˜èRýHu¨‹C4‰E°L‰ÿè@ýHu€L‰÷è\üHƒÄh[A^A_]ÃUH‰åAVSH‰ûH‹= …H5qƒÿkƒH‹5,rH‰ÇÿS I‰Æ‹S(H‹{ H‹5Z|ÿ< H‹5ýsL‰÷H‹+ [A^]ÿàffff.„UH‰åHƒÇ H‹v º]éƒûf„UH‰åH‹ ¾]émûUH‰åAVSH‰ûH‹=„„H5Õ‚ÿÏ‚H‹5qH‰Çÿ·I‰Æ‹S0H‹{ H‹K(H‹5Â{ÿœH‹5]sL‰÷H‹‹[A^]ÿàffff.„UH‰åAVSI‰öH‰ûI‹v H{ ºèÛúHƒÃ(I‹v(H‰ßº[A^]éÂú„UH‰åSPH‰ûH‹{ ¾è©úH‹{(¾HƒÄ[]é•úDUH‰åAVSI‰öH‰ûI‹v H{ ºèkúHƒÃ(I‹v(H‰ßº[A^]éRú„UH‰åSPH‰ûH‹{ ¾è9úH‹{(¾HƒÄ[]é%úUH‰åAWAVATSHƒìPH‰ûH‹TÈ9…£H‹¤Èfƒ H‹5pzL‹=aH‰ßAÿ×H‹5|zH‰ßAÿ×I‰ÆH‹5tzH‰ßAÿ×fA‰ÇH‹ëÇHƒ<„šH‹ÑÇH‹<H‹NzH5WÿQ„ÀtwH‹¶ÇL‹$H‹£ÇH‹<H‹¨H‰E ÇE¨BÇE¬HH‰E°H½H‰E¸HuÀè_úHuÈH‰ßèSúHuÐL‰÷èGúHu fD‰}ØL‰çè^ùH‹GÇD‹4Aƒþÿu H‹>ÇD‹4D‰÷¾º0ÀèŽùƒøÿu-H‹5RyHÛL‹5DH‰ßAÿÖH‹5_xH‰ßH‰ÂAÿÖëTÇEœHMœD‰÷¾ÿÿº"A¸èóùH‹5¢xL‹=ûH‰ßD‰òAÿ×H‹5+yH‰ßAÿ×H‹5&yH‰ßAÿ×HƒÄP[A\A^A_]ÃUH‰åAVSH‰ûH‹=jH5»ÿµH‹5vnH‰ÇÿI‰ÆD·C8H‹K0H‹{ H‹S(H‹5ºxÿ|H‹5=pL‰÷H‹k[A^]ÿàffff.„UH‰åAVSI‰öH‰ûI‹v H{ ºè»÷I‹v(H{(ºè©÷HƒÃ0I‹v0H‰ßº[A^]é÷fDUH‰åSPH‰ûH‹{ ¾èy÷H‹{(¾èk÷H‹{0¾HƒÄ[]éW÷UH‰åAVSI‰ÎH‰ûH‹‹Å9t[A^]ÃH‹5²wH‰ßÿ¡H‹5ÂvH‰ßL‰òH‹[A^]ÿàUH‰åAWAVSHƒìXf(ÈH‰ûfïÀf.ÈòM‚ùH‹1ÅH‹ H‹=61ö1ÒèE÷H‹ †ÅH‰ HuàH·ºH ÌL‹=áH‹bÅL‹4L‰}ÀÇEÈBÇEÌH‰MÐH‰EØH‰ßèœ÷HuÀL‰÷èúöHu˜H•ºH H‹ÅH‹<L‰}˜ÇE @ÇE¤H‰M¨H‰E°H‰}¸è´öò,EiÀÊš;Hcð1ÿè½öH‹ ÔÄH‹< H‰ÆHÇÂÿÿÿÿ1ÉèöH‹¸ÄH‹<èUöHƒÄX[A^A_]ÃUH‰åAVSI‰þH‹=û~H5L}ÿF}H‹5lH‰Çÿ.H‰ÃI‹~ H‹5pvÿH‹5ÛmH‰ßH‹ [A^]ÿàff.„UH‰åHƒÇ H‹v º]écõf„UH‰åH‹ ¾]éMõUH‰åH‹ ]éŸõUH‰åSPH‰ûH‹ïÃH‹<H…ÿtè“õH‹ÚÃHÇH‹SÃÿH‹±ÃH‹<H…ÿtH5|ÿ{|H‹”Ã1ÿH‰ÞèôõH‹‹ÃH‹<H…ÿuHƒÄ[]ÃH5L|ÿF|H‹gÃ1ÿH‰ÞHƒÄ[]é¹õUH‰åSPH‰ûH‹5uH‰ßÿþH‹5OuH‰ßÿîH‹5tH‰ßH‰ÂH‹ÚHƒÄ[]ÿàUH‰åAWAVSHƒì8I‰ÖH‰ûH‹5ÀtH‰ßÿ¯H‹ÂHƒ<tH‹5útH‰ßÿ‘H‹‚ÂHƒ<tH‹5ätH‰ßÿsH‹LÂH‹<H‹5ÉsL‹=ZAÿ×H‹@ÂH‹<H‹5­sAÿ×H‹;ÂH‹<H‹5 t1ÒAÿ×H‹,ÂH‹<H‹5‰t1ÒAÿ×H‹]ÂH‹<H…ÿtèóH‹HÂHÇH‹ ÂH‹<H…ÿtèÕóH‹ôÁHÇH‹íÁH‹<H…ÿtè±óH‹ØÁHÇH‹ùÁH‹<H…ÿt$èóH‹5tH‰ßÿƒH‹ÔÁHÇH‹ÍÁH‹<H…ÿt$èYóH‹5ØsH‰ßÿOH‹¨ÁHÇH‹ùÀÇÿÿÿÿH‹óÀÇÿÿÿÿH‹MÁ·H‹ zÁHÇ H‹ 3ÁfÇ ¨„§H‹¦ÀHƒ<„•H‹ŒÀH‹<H‹YsH5zÿ z„ÀtrH‹qÀL‹<H‹^ÀH‹<H‹cþH‰E°ÇE¸BÇE¼HGH‰EÀHW¶H‰EÈHuÐèóHuØH‰ßèóHuàL‰÷èóHu°L‰ÿèòHƒÄ8[A^A_]ÃUH‰åAVSH‰ûH‹=âzH53yÿ-yH‹5îgH‰ÇÿÿI‰ÆH‹K0H‹{ H‹S(H‹5‡rÿùþH‹5ºiL‰÷H‹èþ[A^]ÿàf.„UH‰åAVSI‰öH‰ûI‹v H{ ºè;ñI‹v(H{(ºè)ñHƒÃ0I‹v0H‰ßº[A^]éñfDUH‰åSPH‰ûH‹{ ¾èùðH‹{(¾èëðH‹{0¾HƒÄ[]é×ðUH‰åSHƒì(H‰ûH‹üüH‰EÐÇEØBÇEÜHIH‰EàH µH‰EèHuðH‰ßè°ñèÙðH‹ Ô¾H‹< H9øu H}ÐÿUàë HuÐèñHƒÄ([]ÃUH‰åAVSH‰ûH‹=yyH5ÊwÿÄwH‹5…fH‰Çÿ¬ýI‰ÆH‹{ H‹ξötH‹5¹o1Òÿ‰ýH‹5JhL‰÷[A^]ÿ%uýffff.„UH‰åHƒÇ H‹v º]éÓïf„UH‰åH‹ ¾]é½ïUH‰åSHƒì(H‹ý½H‹H‹ÚûH‰EÐÇEØBÇEÜH+H‰EàH.´H‰EèHuðè‘ðHuÐH‰ßè­ïHƒÄ([]ÃUH‰åAVSH‰ûH‹=uxH5ÆvÿÀvH‹5eH‰Çÿ¨üI‰ÆH‹C H‹ ʽ·öÂtƒÊ$f‰H‹{ H‹5pÿyüH‹5:gL‰÷[A^]ÿ%eüffff.„UH‰åHƒÇ H‹v º]éÃîf„UH‰åH‹ ¾]é­îUH‰åSHƒì(H‹í¼H‹H‹ÊúH‰EÐÇEØBÇEÜH+H‰EàHN³H‰EèHuðèïHuÐH‰ßèîHƒÄ([]ÃUH‰åAVSH‰ûH‹=ewH5¶uÿ°uH‹5qdH‰Çÿ˜ûI‰ÆH‹C H‹ º¼·öÂtƒÊDf‰H‹{ H‹5ÿnÿiûH‹5*fL‰÷[A^]ÿ%Uûffff.„UH‰åHƒÇ H‹v º]é³íf„UH‰åH‹ ¾]éíUH‰åSHƒì(H‹Ý»H‹H‹ºùH‰EÐÇEØBÇEÜH+H‰EàHn²H‰EèHuðèqîHuÐH‰ßèíHƒÄ([]ÃUH‰åAVSH‰ûH‹=UvH5¦tÿ tH‹5acH‰ÇÿˆúI‰ÆH‹C H‹ ª»·öÂtƒÊdf‰H‹{ H‹5ïmÿYúH‹5eL‰÷[A^]ÿ%Eúffff.„UH‰åHƒÇ H‹v º]é£ìf„UH‰åH‹ ¾]éìUH‰åSPH‰ûH‹%»·¨ tPH‹ƺH‹<H5ctÿ]tH…ÀubH‹±ºHƒ<uTH‹ëºö@uH‹5ÖkH‰ß1ÒHƒÄ[]ÿ%ù¨@t+H‹‚ºH‹<H5tÿ tH…ÀuH‹mºHƒ<t¹HƒÄ[]ÃUH‰åH‹5TkH‹=ítH‹®÷H‹ÿEùHNH‹57kH‹=Èu¹I‰ÀH‹!ù]ÿàUH‰åH‹5 kH‹=¤tH‹e÷H‹ÿüøHH‹5îjH‹=u¹I‰ÀH‹Øø]ÿàUH‰åAVS‰ÓL‹5Ýs‰ßèìH‹5OlL‰÷H‰Â¹ÿ¦øH‹5—jH‹=0tH‹ ñöH‹ H‰Âÿ…øHcËHË’H‹5tjH‹=uI‰ÀH‹cø[A^]ÿàUH‰åAWAVSPI‰ÖH‹asèØê‹8è9ìH‹5ÖkH‰ßH‰Âÿ*øH‹‹öH‹ |öH‹ L‹ H‹5_gH‹= sHÇ$H‰ÂM‰ð0Àÿò÷I‰ÆH‹`öL‹8H‹vtèmêHcH‹5ÏiH‰ßL‰úM‰ðH‹¿÷HƒÄ[A^A_]ÿàUH‰åAWAVSPH‹ºrè1ê‹8è’ëH‹5/kH‰ßH‰Âÿƒ÷H‹ ÜõH‹ H‹5jiH‹=sH‰Âÿb÷I‰ÆH‹ÐõL‹8H‹æsèÝéHcH‹5?iH‰ßL‰úM‰ðH‹/÷HƒÄ[A^A_]ÿàUH‰åSP‰ÓH‹5 iH‹=¥rH‹võH‹Hl‘ÿööHcËH|‘H‹5åhH‹=vsI‰ÀH‹ÔöHƒÄ[]ÿàUH‰åH‹5ñ`H‹=Jrÿ´öH‹5UjHV‘H o‘Lˆ‘H‰ÇÿöH‹5€hH‹=rH‹ ÚôH‹ H‰ÂÿnöHwH‹5`hH‹=ñr¹I‰ÀH‹Jö]ÿàUH‰åH‹5l`H‹=Åqÿ/öH‹5ÐiH1‘H J‘L‘H‰Çÿ öH‹5ûgH‹=”qH‹ UôH‹ H‰ÂÿéõHòŒH‹5ÛgH‹=lr¹I‰ÀH‹Åõ]ÿàUH‰åH‹5ç_H‹=@qÿªõH‹5KiHìH ‘L~H‰Çÿ…õH‹5vgH‹=qH‹ ÐóH‹ H‰ÂÿdõHmŒH‹5VgH‹=çq¹I‰ÀH‹@õ]ÿàUH‰åH‹5b_H‹=»pÿ%õH‹5ÆhH§H ÀLùH‰ÇÿõH‹5ñfH‹=ŠpH‹ KóH‹ H‰ÂÿßôHè‹H‹5ÑfH‹=bq¹I‰ÀH‹»ô]ÿàUH‰åH‹5Ý^H‹=6pÿ ôH‹5AhHbH {LtH‰Çÿ{ôH‹5lfH‹=pH‹ ÆòH‹ H‰ÂÿZôHc‹H‹5LfH‹=Ýp¹I‰ÀH‹6ô]ÿàUH‰åH‹5 fH‹=¹oH‹zòH‹ÿôH‹H‹5fH‹=”p¹I‰ÀH‹íó]ÿàUH‰åSHƒìXH‰ûHÇEØHEØH‰EàÇEèÇEì ÆEðH‹ uòH‰M¨ÇE°BHuÐH g«H}ÇE´H‰U¸H‰MÀH‰EÈH‰ßè%çèNæH‹ I´H‹< H9øu%H‹E¸H}¨ÿÐë"H‰ÃH}ؾèÓåH‰ßèÑåHu¨è^æH‹Eà¾XH}ؾè¬å‰ØHƒÄX[]ÃUH‰åH‹G H‹O(H‹8´· ƒáƒñH‹@ˆH]Ãffff.„UH‰åAVSI‰öH‰ûI‹v H{ ºèKåHƒÃ(I‹v(H‰ßº[A^]é2å„UH‰åSPH‰ûH‹{ ¾èåH‹{(¾HƒÄ[]éåUH‰åSHƒìXH‰ûHÇEØHEØH‰EàÇEèÇEì ÆEðH‹ ñH‰M¨ÇE°BHuÐH *ªH}ÇE´H‰U¸H‰MÀH‰EÈH‰ßè¸åèáäH‹ ܲH‹< H9øu%H‹E¸H}¨ÿÐë"H‰ÃH}ؾèfäH‰ßèdäHu¨èñäH‹Eà¾XH}ؾè?䉨HƒÄX[]ÃUH‰åH‹G H‹O(H‹˲Š Ðé€áH‹@ˆH]ÃfUH‰åAVSI‰öH‰ûI‹v H{ ºèëãHƒÃ(I‹v(H‰ßº[A^]éÒã„UH‰åSPH‰ûH‹{ ¾è¹ãH‹{(¾HƒÄ[]é¥ãUH‰åAWAVSHƒìhI‰ÿèÞãH‹ Ù±M‹4L9ðuGH‹±±A‹ƒúÿtH‹5‘dL‰ÿÿØðH‰ÃéÏH‹‘±A‹1Ûƒúÿ„¹H‹5kdëÐHÇE¸H]¸H‰]ÀÇEÈÇEÌ0H«ÿÿH‰EÐH)«ÿÿH‰EØHÇEàHu¨H’¨H ‰H‹ïH‰UˆÇEBÇE”H‰M˜H‰E L‰ÿèâãHuˆH‰]°L‰÷èNãH5[jH‹EÀH‹x(H‹LjÿÐH‰ÃH}¸¾è‰âH‰ØHƒÄh[A^A_]ÃH‰ÃH}¸¾èjâH‰ßèhâUH‰åAVSH‰ûH‹=ykH5ÊiÿÄiH‹5…XH‰Çÿ¬ïI‰ÆH‹{ H‹^°‹ƒúÿt H‹5?cëH‹N°‹ƒúÿt1H‹5/cÿqïH5’iH‰Çÿ‰iH‹K(H‹qHƒÆ(H‰ÇèõâH‹5ZL‰÷[A^]ÿ%9ïUH‰åAVSI‰öH‰ûI‹v H{ ºè›áHƒÃ(I‹v(H‰ßº[A^]é‚á„UH‰åSPH‰ûH‹{ ¾èiáH‹{(¾HƒÄ[]éUáUH‰åAWAVSHƒìXH‰ûèŽáH‹ ‰¯L‹< L9øuGH‹a¯‹ƒúÿtH‹5RbH‰ßÿ‰îfA‰Çé¤H‹A¯‹E1ÿƒúÿ„ŽH‹5+bëÏHÇEÈLuÈL‰uÐÇEØÇEÜ fÇEàH‹öìH‰E˜ÇE BHu¸Hx¦H LÇE¤H‰M¨H‰E°H‰ßèªáHu˜L‰uÀL‰ÿèáH‹EÐfD‹xL‰÷¾èdàA·ÇHƒÄX[A^A_]ÃUH‰åSPH‰ûH‹{ H‹y®‹ƒúÿt H‹5jaëH‹i®‹ƒúÿtH‹5ZaÿŒíH‹K(H‹If‰AHƒÄ[]ÃUH‰åAVSI‰öH‰ûI‹v H{ ºèÛßHƒÃ(I‹v(H‰ßº[A^]éÂß„UH‰åSPH‰ûH‹{ ¾è©ßH‹{(¾HƒÄ[]é•ßUH‰åAWAVSHƒìhI‰ÿèÎßH‹ É­M‹4L9ðuGH‹¡­A‹ƒúÿtH‹5¡`L‰ÿÿÈìH‰ÃéÏH‹­A‹1Ûƒúÿ„¹H‹5{`ëÐHÇE¸H]¸H‰]ÀÇEÈÇEÌ0H§ÿÿH‰EÐH§ÿÿH‰EØHÇEàHu¨Hâ¤H ‰H‹ ëH‰UˆÇEBÇE”H‰M˜H‰E L‰ÿèÒßHuˆH‰]°L‰÷è>ßH5KfH‹EÀH‹x(H‹¬‹ƒúÿt1H‹5?_ÿaëH5‚eH‰ÇÿyeH‹K(H‹qHƒÆ(H‰ÇèåÞH‹5þUL‰÷[A^]ÿ%)ëUH‰åAVSI‰öH‰ûI‹v H{ ºè‹ÝHƒÃ(I‹v(H‰ßº[A^]érÝ„UH‰åSPH‰ûH‹{ ¾èYÝH‹{(¾HƒÄ[]éEÝUH‰åAWAVSHƒìXH‰ûè~ÝH‹ y«L‹< L9øuGH‹Q«‹ƒúÿtH‹5b^H‰ßÿyêfA‰Çé¤H‹1«‹E1ÿƒúÿ„ŽH‹5;^ëÏHÇEÈLuÈL‰uÐÇEØÇEÜ fÇEàH‹æèH‰E˜ÇE BHu¸HÈ¢H LÇE¤H‰M¨H‰E°H‰ßèšÝHu˜L‰uÀL‰ÿèÝH‹EÐfD‹xL‰÷¾èTÜA·ÇHƒÄX[A^A_]ÃUH‰åSPH‰ûH‹{ H‹iª‹ƒúÿt H‹5z]ëH‹Yª‹ƒúÿtH‹5j]ÿ|éH‹K(H‹If‰AHƒÄ[]ÃUH‰åAVSI‰öH‰ûI‹v H{ ºèËÛHƒÃ(I‹v(H‰ßº[A^]é²Û„UH‰åSPH‰ûH‹{ ¾è™ÛH‹{(¾HƒÄ[]é…ÛUH‰åH‹²©‹ƒúÿu1À]ÃH‹5\]ÿ%ØèUH‰åH‹•©‹ƒúÿu1À]ÃH‹5r\]ÿ%³èUH‰åH‹h©‹ƒúÿu1Àë H‹5U\ÿè·À]ÃUH‰åH‹G©‹ƒúÿu1Àë H‹54\ÿfè·À]ÃUH‰åH‹©‹ƒúÿu1À]ÃH‹5\]ÿ%<èUH‰åH‹ù¨‹ƒúÿu1À]ÃH‹5ö[]ÿ%èUH‰åH‹̨‹ƒúÿu1Àë H‹5Ù[ÿóç·À]ÃUH‰åH‹«¨‹ƒúÿu1Àë H‹5¸[ÿÊç·À]ÃUH‰åSHƒìH‰ûÇEäHuèHEä‰×H‰ÂèÛ…Ày1Àë$H5ùaH‰ßÿðaH‹5q[HUèH‰ÇÿtçHƒÄ[]ÃUH‰åSHƒì(H‰ûÇEÔHuØHEÔ‰×H‰Âè®Ú…Ày1Àë$H5¡aH‰ßÿ˜aH‹5![HUØH‰ÇÿçHƒÄ([]ÃUH‰åSHƒìH‰ûÇEäHuèHEä‰×H‰ÂèVÚ…Ày1Àë$H5IaH‰ßÿ@aH‹5ÑZHUèH‰ÇÿÄæ·ÀHƒÄ[]ÃUH‰åSHƒì(H‰ûÇEÔHuØHEÔ‰×H‰ÂèûÙ…Ày1Àë$H5î`H‰ßÿå`H‹5~ZHUØH‰Çÿiæ·ÀHƒÄ([]ÃUH‰åSHƒìH‰ûÇEäHuèHEä‰×H‰Âè¬Ù…Ày1Àë$H5“`H‰ßÿŠ`H‹5 ZHUèH‰ÇÿæHƒÄ[]ÃUH‰åSHƒì(H‰ûÇEÔHuØHEÔ‰×H‰ÂèTÙ…Ày1Àë$H5;`H‰ßÿ2`H‹5»YHUØH‰Çÿ¶åHƒÄ([]ÃUH‰åSHƒìH‰ûÇEäHuèHEä‰×H‰ÂèüØ…Ày1Àë$H5ã_H‰ßÿÚ_H‹5kYHUèH‰Çÿ^å·ÀHƒÄ[]ÃUH‰åSHƒì(H‰ûÇEÔHuØHEÔ‰×H‰Âè¡Ø…Ày1Àë$H5ˆ_H‰ßÿ_H‹5YHUØH‰Çÿå·ÀHƒÄ([]ÃUH‰åAVSHƒì`H‰ûHÇEÀLuÀL‰uÈÇEÐÇEÔ0HNŸÿÿH‰EØHcŸÿÿH‰EàHÇEèHu°HŒH ¥H‹VãH‰UÇE˜BÇEœH‰M H‰E¨H‰ßèØL‰u¸èA×H‹ <¥H‹< H9øu%H‹E H}ÿÐë"H‰ÃH}À¾èÆÖH‰ßèÄÖHuèQ×H‹EÈH‹x(H‹V^H5O^ÿÐH‰ÃH}À¾èŒÖH‰ØHƒÄ`[A^]ÃUH‰åSHƒì8H‰ûH‹C H‹ ¡¤ƒ<ÿtZÇEä‹<HuèHUäè*×…Àu?H‹=Y`H5º]ÿ´]H‹5µW‹MäHUèH‰Çÿ•ãH‹K(H‹qHƒÆ(H‰Çè)×H‹C H‹ >¤ƒ<ÿtZÇEÄ‹<HuÈHUÄè¿Ö…Àu?H‹=î_H5O]ÿI]H‹5JW‹MÄHUÈH‰Çÿ*ãH‹K(H‹qHƒÆ(H‰Çè¾ÖHƒÄ8[]ÀUH‰åAVSI‰öH‰ûI‹v H{ ºèkÕHƒÃ(I‹v(H‰ßº[A^]éRÕ„UH‰åSPH‰ûH‹{ ¾è9ÕH‹{(¾HƒÄ[]é%ÕUH‰åAVSHƒì`H‰ûHÇEÀLuÀL‰uÈÇEÐÇEÔ0HòœÿÿH‰EØHÿÿH‰EàHÇEèHu°H`›H ¥H‹úàH‰UÇE˜BÇEœH‰M H‰E¨H‰ßèÀÕL‰u¸èåÔH‹ à¢H‹< H9øu%H‹E H}ÿÐë"H‰ÃH}À¾èjÔH‰ßèhÔHuèõÔH‹EÈH‹x(H‹ú[H5ó[ÿÐH‰ÃH}À¾è0ÔH‰ØHƒÄ`[A^]ÃUH‰åSHƒì8H‰ûH‹C H‹ E¢ƒ<ÿtZÇEä‹<HuèHUäèÚÔ…Àu?H‹=ý]H5^[ÿX[H‹5YU‹MäHUèH‰Çÿ9áH‹K(H‹qHƒÆ(H‰ÇèÍÔH‹C H‹ ⡃<ÿtZÇEÄ‹<HuÈHUÄèoÔ…Àu?H‹=’]H5óZÿíZH‹5îT‹MÄHUÈH‰ÇÿÎàH‹K(H‹qHƒÆ(H‰ÇèbÔHƒÄ8[]Ãff.„UH‰åAVSI‰öH‰ûI‹v H{ ºè ÓHƒÃ(I‹v(H‰ßº[A^]éòÒ„UH‰åSPH‰ûH‹{ ¾èÙÒH‹{(¾HƒÄ[]éÅÒUH‰åAWAVSHƒìXH‰ûèþÒH‹ ù L‹< L9øuH‹Ñ ƒ<ÿ•ÃéHÇEÈLuÈL‰uÐÇEØÇEÜ ÆEàH‹œÞH‰E˜ÇE BHuÀH™H IÇE¤H‰M¨H‰E°L‰u¸H‰ßèLÓHu˜L‰ÿè¼ÒH‹EЊXL‰÷¾è Ò¾ÃHƒÄX[A^A_]ÃUH‰åH‹G H‹O(H‹@H‹ ƒ<ÿ•@]Ãffff.„UH‰åAVSI‰öH‰ûI‹v H{ ºè«ÑHƒÃ(I‹v(H‰ßº[A^]é’Ñ„UH‰åSPH‰ûH‹{ ¾èyÑH‹{(¾HƒÄ[]éeÑUH‰åAWAVSHƒìXH‰ûèžÑH‹ ™ŸL‹< L9øuH‹yŸƒ<ÿ•ÃéHÇEÈLuÈL‰uÐÇEØÇEÜ ÆEàH‹<ÝH‰E˜ÇE BHuÀHÞ—H IÇE¤H‰M¨H‰E°L‰u¸H‰ßèìÑHu˜L‰ÿè\ÑH‹EЊXL‰÷¾è¬Ð¾ÃHƒÄX[A^A_]ÃUH‰åH‹G H‹O(H‹@H‹Çžƒ<ÿ•@]Ãffff.„UH‰åAVSI‰öH‰ûI‹v H{ ºèKÐHƒÃ(I‹v(H‰ßº[A^]é2ЄUH‰åSPH‰ûH‹{ ¾èÐH‹{(¾HƒÄ[]éÐUH‰åAWAVAUATSHì8D‰ÄþÿÿH‰¨þÿÿH‰•°þÿÿH‹ÜH‹H‰EÐH‹5NHHyL‰Çÿ/ÝI‰ÄH5­WL‰çÿ¤WE1öH…Àt0H5¥WE1öL‰ç1Òÿ—WH‰ÃH5ÍWH‰ßÿÄWH…ÀtI‰ÞH5eWL‰çÿ\WHƒørR‹…Äþÿÿf…ÀuGH5TWL‰çºÿFWH‹5‡OH‰ÇÿžÜH‰Ç1öº è—ÐHHÿHùþÿw‰…ÄþÿÿM…ö…½fïÀ)E€ÆE€ÆE‹ÄþÿÿfÁÁf‰M‚ÇE„)…`ÿÿÿÇ…xÿÿÿHÇ…pÿÿÿH‹ƒÛHU€H‹ ÜÆ…`ÿÿÿÆ…aÿÿÿf‰bÿÿÿH‹H‹@H‰…pÿÿÿH‰hÿÿÿH‹5NH‹=ˆX¹ÿÓH‰…¸þÿÿH•`ÿÿÿH‹5\NH‹=eX¹ÿÓI‰ÆéH5wVHØpL‰÷ÿgV„ÀuH5\VH=uL‰÷ÿLV„À„·fïÀ)…PÿÿÿÆ…PÿÿÿÆ…Qÿÿÿ‹ÄþÿÿfÁÁf‰RÿÿÿÇ…Tÿÿÿ)…0ÿÿÿÇ…HÿÿÿHÇ…@ÿÿÿH‹…ÚH•PÿÿÿH‹ÛÆ…0ÿÿÿÆ…1ÿÿÿf‰2ÿÿÿH‹H‹@H‰…@ÿÿÿH‰8ÿÿÿH‹5vMH‹=W¹ÿÓH‰…¸þÿÿH•0ÿÿÿéòþÿÿH‹5žML‰÷ÿµÚI‰ÅH½(ÿÿÿèÎE1ö…À¸H‰…¸þÿÿ…è1ÿL‹½(ÿÿÿM…ÿI‰þH‰½¸þÿÿ„ÇE1ö‹…ÄþÿÿfÁÀ‰…ÄþÿÿL‰µ¸þÿÿHƒ½¸þÿÿ…ÜI‹_€{…ÎI‹L‰îè'Î…ÀuNH‹H‹KH‰ ÿÿÿH‰…ÿÿÿ‹…Äþÿÿf‰…ÿÿÿH‹5”LH‹=VH•ÿÿÿ¹ÿëÙH‰…¸þÿÿé Hs¿HUÀ¹è@ÍH…À„H}ÀL‰îè©Í…À…ìH‹H‹KH‰ÿÿÿH‰…ÿÿÿ‹…Äþÿÿf‰… ÿÿÿH‹5LH‹=VH•ÿÿÿéyÿÿÿM…ö…§M‹gA€|$tE1öé“I‹L‰îè<Í…Àu$‹…Äþÿÿf‰…êþÿÿH‹5¾KH‹=ÇUH•èþÿÿëQIƒÄ¿L‰æHU¹.è|ÌH…Àt@H}L‰îèéÌ…Àu0‹…Äþÿÿf‰…ÊþÿÿH‹5kKH‹=tUH•Èþÿÿ¹ÿÂØI‰ÆM‹?M…ÿ…ZþÿÿH‹½(ÿÿÿèïËH‹µ°þÿÿH…öt H‹½¸þÿÿè7ÌH‹µ¨þÿÿH…ötL‰÷è#ÌH‹D×H‹H;EÐuHÄ8[A\A]A^A_]ÃèúÊUH‰åAWAVAUATSHìèH‰ûH‹™H‹ LcòH‹=×L‰ö1ÒèËH‹ o™H‰ H‹=üÖH‹ݘH‹ L‰ö1Òè÷ÊHuÐH ”‘HL‹%žÖH‹=7™H‰;H‹$™L‹<L‰e°ÇE¸BÇE¼H‰UÀH‰MÈH‰ßèNËHu°L‰ÿè¬ÊHu¨Hg‘H sH‹á˜L‹<L‰eˆÇEBÇE”H‰M˜H‰E H‰ßèËHuˆL‰ÿèaÊL½hÿÿÿHµ0ÿÿÿHB‘H ¾HÇ…hÿÿÿL‰½pÿÿÿÇ…xÿÿÿÇ…|ÿÿÿ ÇE€H‹_˜L‹,H‹L˜H‹<L‰¥0ÿÿÿÇ…8ÿÿÿBÇ…<ÿÿÿH‰@ÿÿÿH‰…HÿÿÿH‰½PÿÿÿL‰½XÿÿÿD‰µ`ÿÿÿè¹ÉHµøþÿÿH×H “H‹ñ—H‹<L‰¥øþÿÿÇ…ÿÿÿBÇ…ÿÿÿH‰ÿÿÿH‰…ÿÿÿL‰­ÿÿÿL‰½ ÿÿÿD‰µ(ÿÿÿèVÉH‹«—HÇH‹d—f$ÿþH‹—H‹<è ÉH‹G—f €H‹:—f L‰ÿ¾èÈHÄè[A\A]A^A_]ÃUH‰åAWAVSPI‰ÿH‹=QH5ÒOÿÌOH‹5>H‰Çÿ´ÕI‰ÆI‹_ H‹þ–H‹<è£ÈH‹ þ–H‰ I‹ H‹ï–Hƒ<t H‹5‘IëH‹5IÿjÕH‹5+@L‰÷HƒÄ[A^A_]ÿ%PÕ„UH‰åHƒÇ H‹v º]é³Çf„UH‰åH‹ ¾]éÇUH‰åAVSH‰ûH‹=´PH5OÿÿNH‹5À=H‰ÇÿçÔI‰ÆH‹C H‹ –f €H‹{ H‹5ðHÿÂÔH‹5ƒ?L‰÷H‹±Ô[A^]ÿàUH‰åHƒÇ H‹v º]éÇf„UH‰åH‹ ¾]éýÆUH‰åSPH‰ûH‹{ èKÇH‹C(H‹H‹AÿȉA…ÀtHƒÄ[]Ë{0HƒÄ[]éþÆfUH‰åHƒÇ(H‹v(º]飯f„UH‰åH‹(¾]éÆUH‰åSPH‰ûH‹{ èÛÆH‹C(H‹H‹AÿȉA…ÀtHƒÄ[]Ë{0HƒÄ[]éŽÆfUH‰åHƒÇ(H‹v(º]é3Æf„UH‰åH‹(¾]éÆUH‰å1À]ÃUH‰åSPH‰ûH‹­”öDuH‹Ç”H‹<è„ÆH‹”f HƒÄ[]ÃUH‰åSPH‰ûH‹r”öDtH‹Œ”H‹<èÆH‹T”f$ÿþHƒÄ[]ÃUH‰åSPH‰ûH‹7”öDuH‹Y”H‹<èÆH‹”f HƒÄ[]ÃUH‰åSPH‰ûH‹ü“öDtH‹”H‹<è£ÅH‹Þ“f$ÿýHƒÄ[]ÃUH‰åH‰ÐH‹5ÃF1Ò1ÉE1ÀI‰Á]ÿ%‚ÒUH‰åL‰ÀH‹5¤FE1ÀI‰Á]ÿ%gÒUH‰åAWAVAUATSHƒìHM‰ÍM‰ÆI‰ÌH‰ÓòE I‰ÿH5MH‰ßÿ ML9à‚³H‹=ÊNH5#LÿLH‹5FFL‰l$HÇ$H‰ÇH‰ÚL‰áM‰ðòE E1ÉÿçÑH‰ÃHuÈHAŒH kH‹‹ÐH‹=œ’M‹4?H‰U¨ÇE°BÇE´H‰M¸H‰EÀL‰ÿèFÅHuÐH‰ßè:ÅHu¨L‰÷èVÄH5—KH‰ßÿŽKHƒÄH[A\A]A^A_]ÃUH‰åAVSH‰ûH‹=MH5WKÿQKH‹5:H‰Çÿ9ÑI‰ÆH‹C H‹ [’· ƒáfƒùu-H‹ ÷‘H‹<H‹S(H5`KÿZKH‹{ H‹57DÿñÐH‹5²;L‰÷[A^]ÿ%ÝÐDUH‰åAVSI‰öH‰ûI‹v H{ ºè;ÃHƒÃ(I‹v(H‰ßº[A^]é"ÄUH‰åSPH‰ûH‹{ ¾è ÃH‹{(¾HƒÄ[]éõÂUH‰åH‰ÈH‹5ŸD1ÉE1ÀI‰Á]ÿ%PÐUH‰åAWAVAUATSHƒìHM‰ÍM‰ÄH‰ËòE I‰×I‰þM…ÿ„ÌH5óJH‰ßÿêJL9à‚³H‹=ªLH5JÿýIH‹5&DL‰l$HÇ$H‰ÇH‰ÚL‰áE1ÀòE M‰ùÿÇÏH‰ÃHuÈHQŠH kH‹kÎH‹=|M‹<>H‰U¨ÇE°BÇE´H‰M¸H‰EÀL‰÷è&ÃHuÐH‰ßèÃHu¨L‰ÿè6ÂH5wIH‰ßÿnIHƒÄH[A\A]A^A_]ÃUH‰åAVSH‰ûH‹=æJH57Iÿ1IH‹5ò7H‰ÇÿÏI‰ÆH‹C H‹ ;· ƒáfƒùu-H‹ ×H‹<H‹S(H5@Iÿ:IH‹{ H‹5BÿÑÎH‹5’9L‰÷[A^]ÿ%½ÎDUH‰åAVSI‰öH‰ûI‹v H{ ºèÁHƒÃ(I‹v(H‰ßº[A^]éÁ„UH‰åSPH‰ûH‹{ ¾èéÀH‹{(¾HƒÄ[]éÕÀUH‰åHƒìH‹5†BH‰ $1ÉE1ÀE1Éÿ,ÎHƒÄ]ÃUH‰åHƒìH‹5_BL‰ $E1Éÿ ÎHƒÄ]ÃUH‰åHƒìH‰ÈH‹5:BL‰$1ÉE1ÀI‰ÁÿàÍHƒÄ]ÃUH‰åAWAVAUATSHƒìHM‰ÍM‰ÇI‰ÌòE H‰ÓI‰þH…Û„H5}HH‰ßÿtHH…À„êH5dHL‰çÿ[HL9ø‚ÑM…ítH5FHH‰ßÿ=HL9至H‹=ýIH5VGÿPGH‹5yAH‹MH‰L$H‰$H‰ÇL‰âL‰ùM‰èòE E1ÉÿÍH‰ÃHuÈHÔ‡H kH‹¾ËH‹=ÏM‹<>H‰U¨ÇE°BÇE´H‰M¸H‰EÀL‰÷èyÀHuÐH‰ßèmÀHu¨L‰ÿ艿H5ÊFH‰ßÿÁFHƒÄH[A\A]A^A_]ÃUH‰åAVSH‰ûH‹=9HH5ŠFÿ„FH‹5E5H‰ÇÿlÌI‰ÆH‹C H‹ Ž· ƒáfƒùu-H‹ *H‹<H‹S(H5“FÿFH‹{ H‹5j?ÿ$ÌH‹5å6L‰÷[A^]ÿ%Ì„UH‰åAVSI‰öH‰ûI‹v H{ ºèk¾HƒÃ(I‹v(H‰ßº[A^]éR¾„UH‰åSPH‰ûH‹{ ¾è9¾H‹{(¾HƒÄ[]é%¾UH‰åAVSH‰ûH‹tŒHƒ<…>H‹ªŒö„-H‹IŒH‹<H5æEÿàEH…À„ÎH‹(ŒH‹<H5ÕE1ÒÿÍEH5VEH‰ÇÿMEH‹ŒH‰ÇH‰Þèµ¾H‹ì‹H‹<H‹5Q?1ÒÿùÊH5ZEH‹Ó‹L‹4H‹=GÿBEH5KEL‰÷H‰Âÿ?E„À…H‹ ‹H‹H‹ õŠòH‹5?H‰ßÿ˜ÊH‹5©>H‰ßH‹‡Ê[A^]ÿàH‹ª‹·¨ t/¨@tQH‹W‹H‹<H5äDÿÞDH…ÀuH‹B‹Hƒ<t&[A^]ÃH‹g‹f H‹5‚>H‰ß[A^]ÿ%ÊH‹5><H‰ß1Ò[A^]ÿ%ÊUH‰åAWAVAUATSHƒìhI‰þH‹ÔŠIƒ<tH‹‹Aöt6H‹58>L‰÷ÿÇÉ„À…€ H‹ ‹Iƒ<„n H‹5>éY H‹‹M‹<H‹—ŠI‹<H5\DÿVDH‰ÃLûu!H‹oŠI‹<H5{L‹<H‹c{L‹$H‹ {H‹<H‹%¹H‰E ÇE¨BÇE¬HeH‰E°H™uH‰E¸HuÀèÜ­HuÈH‰ßèЭHuÐL‰÷èÄ­HuØL‰ç踭Hu L‰ÿèÔ¬H‹5]-H‰ßÿô¹HƒÄ@[A\A^A_]ÃUH‰åAVSH‰ûH‹=†5H5×3ÿÑ3H‹5’"H‰Çÿ¹¹I‰ÆH‹C8H‹ zL‹H‹K0H‹{ H‹S(H‹5Œ.ÿ޹H‹5O$L‰÷H‹}¹[A^]ÿàffffff.„UH‰åAVSI‰öH‰ûI‹v H{ ºèË«I‹v(H{(º蹫H{0I‹v0ºè§«HƒÃ8I‹v8H‰ßº[A^]鎫@UH‰åSPH‰ûH‹{ ¾èy«H‹{(¾èk«H‹{0¾è]«H‹{8¾HƒÄ[]éI«UH‰åSPH‰ûH‹!zH‹<H…ÿtè«H‹ zHÇH‹uyH‹<H5š2ÿ”2H‹]y1ÿH‰ÞHƒÄ[]é¬UH‰åAWAVSHƒìXf(ÈH‰ûfïÀf.ÈòM‚ùH‹yH‹ H‹=·1ö1Òè#«H‹ ŒyH‰ HuàH•sH ÌL‹=¿¶H‹hyL‹4L‰}ÀÇEÈBÇEÌH‰MÐH‰EØH‰ßèz«HuÀL‰÷èØªHu˜HssH H‹yH‹<L‰}˜ÇE @ÇE¤H‰M¨H‰E°H‰}¸è’ªò,EiÀÊš;Hcð1ÿ蛪H‹ ÚxH‹< H‰ÆHÇÂÿÿÿÿ1ÉèmªH‹¾xH‹<è3ªHƒÄX[A^A_]ÃUH‰åAVSI‰þH‹=Ù2H5*1ÿ$1H‹5åH‰Çÿ ·H‰ÃI‹~ H‹5þ+ÿø¶H‹5¹!H‰ßH‹ç¶[A^]ÿàf„UH‰åHƒÇ H‹v º]éC©f„UH‰åH‹ ¾]é-©UH‰åH‹ ]é©UH‰åAWAVSHƒì8H‰ûH‹°wfƒ H‹,wHƒ<„¢H‹wH‹<H‹_+H5˜0ÿ’0„ÀtH‹÷vL‹4H‹wL‹<H‹ÙvH‹<H‹Þ´H‰E°ÇE¸BÇE¼H]H‰EÀHrH‰EÈHuÐè•©HuØH‰ß艩HuàL‰ÿè}©Hu°L‰÷虨ëH‹5Ð*H‰ßfïÀÿ³µHƒÄ8[A^A_]ÃUH‰åAWAVSHƒì8H‰ûH‹=A1H5’/ÿŒ/H‹5ML‹=vµH‰ÇAÿ×I‰ÆH‹C0H‹ šuL‹H‹ ŸuòH‹ «uH‹ H‹{ H‹S(H‹5@*Aÿ×òE°HuØHýpH cH‹׳H‹{(H‹äuH‹H‰U¸ÇEÀBÇEÄH‰MÈH‰EÐ葨Hu¸òE°òEàH‰ß裧H‹5”L‰÷Aÿ×HƒÄ8[A^A_]ÃUH‰åAVSH‰ûH‹=Z0H5«.ÿ¥.H‹5fH‰Çÿ´I‰ÆòC(H‹{ H‹5Š)ÿt´H‹55L‰÷H‹c´[A^]ÿàDUH‰åHƒÇ H‹v º]éæf„UH‰åH‹ ¾]é­¦ffff.„UH‰åAVSI‰öH‰ûI‹v H{ ºè{¦I‹v(H{(ºèi¦HƒÃ0I‹v0H‰ßº[A^]éP¦fDUH‰åSPH‰ûH‹{ ¾è9¦H‹{(¾è+¦H‹{0¾HƒÄ[]é¦UH‰åSPH‰ûH‹gtH‹H…Àt6fïÉf.Áw3H‹5}(H‰ßÿ\³H‹5}%H‰ßH‰ÂH‹H³HƒÄ[]ÿàHƒÄ[]Ãò,ÈH‹vsòXòiÁÊš;Hcð1ÿè>¦H‹ }tH‹< H‰ÆHÇÂÿÿÿÿ1Éè¦H‹!tfƒ$÷H‹5ý&H‰ßHƒÄ[]ÿ%Ö²UH‰åAWAVSHƒì8I‰ÎòE°H‰ÓI‰ÿH…Û„¹H5ƒ-H‰ßÿz-H…À„ H‹=J/H5“,ÿ,H‹5ž'H‰ÇH‰ÚòE°L‰ñÿj²H‰ÃHuØH”nH gH‹±H‹=sM‹4?H‰U¸ÇEÀBÇEÄH‰MÈH‰EÐL‰ÿèÉ¥HuàH‰ßè½¥Hu¸L‰÷èÙ¤H5,H‰ßÿ,HƒÄ8[A^A_]ÃUH‰åAVSH‰ûH‹=-H5Þ+ÿØ+H‹5™H‰ÇÿÀ±I‰ÆH‹C H‹ âr· ƒáfƒùu-H‹ ŽrH‹<H‹S(H5ç+ÿá+H‹{ H‹5Æ$ÿx±H‹59L‰÷[A^]ÿ%d±fff.„UH‰åAVSI‰öH‰ûI‹v H{ º軣HƒÃ(I‹v(H‰ßº[A^]颣„UH‰åSPH‰ûH‹{ ¾艣H‹{(¾HƒÄ[]éu£UH‰åAVSH‰ûH‹ÔqHƒ<…>H‹úqö„-H‹©qH‹<H56+ÿ0+H…À„ÎH‹ˆqH‹<H5%+1Òÿ+H5¦*H‰Çÿ*H‹fqH‰ÇH‰Þè¤H‹LqH‹<H‹5¡$1ÒÿI°H5ª*H‹3qL‹4H‹=à,ÿ’*H5›*L‰÷H‰Âÿ*„À…H‹qH‹H‹ •pòH‹5%H‰ßÿè¯H‹5 $H‰ßH‹ׯ[A^]ÿàH‹úp·¨@t/¨ tQH‹—pH‹<H54*ÿ.*H…ÀuH‹‚pHƒ<t&[A^]ÃH‹·pf H‹5Ò#H‰ß[A^]ÿ%m¯H‹5Ž!H‰ß1Ò[A^]ÿ%W¯UH‰åAWAVAUATSHƒìhI‰üH‹4pI‹H…ÀtH‹ \pA· öÁt4H‹5ƒ#L‰çÿ¯„ÀuiH‹7pAö€t[H‹5)$L‰çÿð®ëIöÁ€uH‹5J#L‰çÿÙ®„Àu0H‹5N"ëÓöÅt1öÅt H‹53#ëÀH‹5#L‰çÿ©®„Àt¥HƒÄh[A\A]A^A_]ÃöÅ „ñH‹ þoIƒ< A½„²HÇEÐH‹¶oI‹<1ÛHMÐ1ö1ÒèÉ =µÙÿÿI‰Ý„ƒ…ÀuQH‹²oM‹,IÇH‹oI‹H‹ ¬nH‹H‹ ™nH‹<H5Þ(ÿØ(H9Ãu-E0öE1ÿéiH‹5¡"L‰ç‰ÂÿÞ­I‰ÇE1í0ÛAˆÞéUH‹¿nI‹HÇE€H‹ H‹EÈHÃH‹•xÿÿÿH‰ÑH)ÁH…pÿÿÿH9•ÀH‰ÎHþ€A¾€LBöH‰µxÿÿÿëŽH‹5j!L‰ç‰Âÿ§¬H‰E€0ÀéqÿÿÿH‹ UmE‹4 Aƒþÿu H‹ LmE‹4 H‹ mH‹<H‹5¾ÿh¬H‰ÃH‹VmI‹H‹ ãlHH‹ ÐlH‹<H5'ÿ'H‹ (mI‹ H‹µlH+D‰÷H‰ÞH‰Âè' I‰ÅM…íxE1ÿE0öë|è’ž1Ûƒ8#I‰Ýt2H‹5=H6HL‰çÿÝ«éúýÿÿE0öE„íL‹}€L‰ûL‹­pÿÿÿt;H‹ëlfA$ÿH‹5 L‰çÿ¤«A¶„ÀuH‹5L‰çÿ«A¶I‰ßM…í…D0ÛE1íA¶Æ÷ÐM…ÿ”Á¶É…Át2H‹lfA$ÿH‹5¹L‰çÿH«„ÀuH‹5½L‰çÿ4«€û…ºH‹ÜkIƒ<„¨H‹ÂkI‹<H‹G H5H%ÿB%„À„H‹£kM‹4H‹ØkI‹H‹…kI‹<H‹Š©H‰EˆÇEBÇE”HöH‰E˜HgH‰E Hu¨èAžHu°L‰çè5žHuÀL‰m¸H‰ßè%žHuˆL‰÷èAM…ÿ„ÃûÿÿH‹5±HªFH‹SªL‰çÿÓH‹5oL‰çH‰ÂÿÓé•ûÿÿL‰}€H‹'kI‹H‹ ´jL,H‹kI‹H‹ žjL‹<H‹ ‹jH‹<H5Ð$ÿÊ$³I9Çt L‹}€éiþÿÿH‹5L‰çÿÒ©Hƒ}€…_ÿÿÿH‹5éÂúÿÿUH‰åAVSH‰ûH‹=Z%H5«#ÿ¥#H‹5fH‰Çÿ©I‰ÆH‹C8H‹ jL‹H‹K0H‹{ H‹S(H‹5¨ÿb©H‹5#L‰÷H‹Q©[A^]ÿàUH‰åAVSI‰öH‰ûI‹v H{ ºè«›I‹v(H{(ºè™›HƒÃ8I‹v8H‰ßº[A^]逛fDUH‰åSPH‰ûH‹{ ¾èi›H‹{(¾è[›H‹{8¾HƒÄ[]éG›UH‰åAWAVSHƒì8H‰ûH‹`iHƒ<„ H‹FiH‹<H‹ÓH5Ì"ÿÆ"„Àt}H‹+iL‹4H‹`iL‹<H‹ iH‹<H‹§H‰E°ÇE¸BÇE¼HWH‰EÀHÆdH‰EÈHuÐèÉ›HuØH‰ßè½›HuàL‰ÿè±›Hu°L‰÷èÍšH‹5^H‰ßÿí§HƒÄ8[A^A_]ÃUH‰åAVSH‰ûH‹=#H5Ò!ÿÌ!H‹5H‰Çÿ´§I‰ÆH‹C0H‹ FhH‹ H‹{ H‹S(H‹5Ûÿ§H‹5NL‰÷H‹|§[A^]ÿàfffff.„UH‰åAVSI‰öH‰ûI‹v H{ ºèË™I‹v(H{(ºè¹™HƒÃ0I‹v0H‰ßº[A^]é ™fDUH‰åSPH‰ûH‹{ ¾艙H‹{(¾è{™H‹{0¾HƒÄ[]ég™UH‰åSPH‰ûH‹OhH‹<H…ÿtè»™H‹:hHÇH‹£gH‹<H5¸ ÿ² H‹‹g1ÿH‰ÞHƒÄ[]é%šUH‰åAWAVSHƒìXf(ÈH‰ûfïÀf.ÈòM‚ùH‹-gH‹ H‹=2¥1ö1ÒèA™H‹ ºgH‰ HuàHóbH ÌL‹=ݤH‹–gL‹4L‰}ÀÇEÈBÇEÌH‰MÐH‰EØH‰ß蘙HuÀL‰÷èö˜Hu˜HÑbH H‹KgH‹<L‰}˜ÇE @ÇE¤H‰M¨H‰E°H‰}¸è°˜ò,EiÀÊš;Hcð1ÿ蹘H‹ gH‹< H‰ÆHÇÂÿÿÿÿ1É苘H‹ìfH‹<èQ˜HƒÄX[A^A_]ÃUH‰åAVSI‰þH‹=÷ H5HÿBH‹5H‰Çÿ*¥H‰ÃI‹~ H‹5lÿ¥H‹5×H‰ßH‹¥[A^]ÿà€UH‰åHƒÇ H‹v º]éc—f„UH‰åH‹ ¾]éM—UH‰åH‹ ]韗UH‰åAWAVSHƒì8H‰ûH‹Ðefƒ H‹LeHƒ<„¢H‹2eH‹<H‹ÏH5¸ÿ²„ÀtH‹eL‹4H‹LeL‹<H‹ùdH‹<H‹þ¢H‰E°ÇE¸BÇE¼H]H‰EÀHbaH‰EÈHuÐèµ—HuØH‰ßè©—HuàL‰ÿè—Hu°L‰÷è¹–ëH‹5@H‰ßfïÀÿÓ£HƒÄ8[A^A_]ÃUH‰åAWAVSHƒì8H‰ûH‹=aH5²ÿ¬H‹5m L‹=–£H‰ÇAÿ×I‰ÆH‹C0H‹ dL‹H‹ dòH‹ dH‹ H‹{ H‹S(H‹5°Aÿ×òE°HuØH]`H cH‹÷¡H‹{(H‹dH‹H‰U¸ÇEÀBÇEÄH‰MÈH‰EÐè±–Hu¸òE°òEàH‰ßèÕH‹5´ L‰÷Aÿ×HƒÄ8[A^A_]ÃUH‰åAVSH‰ûH‹=zH5ËÿÅH‹5† H‰Çÿ­¢I‰ÆòC(H‹{ H‹5úÿ”¢H‹5U L‰÷H‹ƒ¢[A^]ÿàDUH‰åHƒÇ H‹v º]éã”f„UH‰åH‹ ¾]éÍ”ffff.„UH‰åAVSI‰öH‰ûI‹v H{ ºè›”I‹v(H{(º艔HƒÃ0I‹v0H‰ßº[A^]ép”fDUH‰åSPH‰ûH‹{ ¾èY”H‹{(¾èK”H‹{0¾HƒÄ[]é7”UH‰åSPH‰ûH‹—bH‹H…Àt6fïÉf.Áw3H‹5íH‰ßÿ|¡H‹5H‰ßH‰ÂH‹h¡HƒÄ[]ÿàHƒÄ[]Ãò,ÈH‹æaòXòiÁÊš;Hcð1ÿè^”H‹ ­bH‹< H‰ÆHÇÂÿÿÿÿ1Éè0”H‹Abfƒ$ïH‹5-H‰ßHƒÄ[]ÿ%ö UH‰åAWAVSHƒì8H‰ÓI‰þH…ÛuH‹5 H‹=hÿÊ H‰ÃH‹=pH5Áÿ»H‹5H‰ÇH‰Úÿ  H‰ÃHuØH ^H gH‹DŸH‹=UaM‹<>H‰U¸ÇEÀBÇEÄH‰MÈH‰EÐL‰÷èÿ“HuàH‰ßèó“Hu¸L‰ÿè“H5PH‰ßÿGHƒÄ8[A^A_]ÃUH‰åAWAVSPH‰ûH‹=ÀH5ÿ H‹5ÌH‰ÇÿóŸI‰ÆH‹C H‹ a· áfƒùuoH‹ ®`H‹<H‹S(L=L‰þÿH‹C H‹S(H‹ —`H‹<L‰þÿòL‹=“ŸH‹C H‹ ¸`f H‹{ H‹5·Aÿ×H‹{ H‹5±Aÿ×H‹5' L‰÷HƒÄ[A^A_]ÿ%LŸ@UH‰åAVSI‰öH‰ûI‹v H{ ºè«‘HƒÃ(I‹v(H‰ßº[A^]é’‘„UH‰åSPH‰ûH‹{ ¾èy‘H‹{(¾HƒÄ[]ée‘UH‰åAWAVAUATSHƒìI‰ÌH‰UÀI‰ýH‹#`Iƒ|u@H‹´_I‹|H5xÿrH…Àu"H‹5L‰ïÿ…žIÇ$¸µÙÿÿéÆH‹t_I‹|M‹<$H54ÿ.H‰Ã1ÒH…ÛtcH‹M_I‹|H‹5QL‹52žAÿÖL9ûIGßH‹}ÀH‰ÆH‰Úè©‘H‹_I‹|H‹5ž1ÒH‰ÙE1ÀE1ÉAÿÖI9ß„<I)ßH‰ÚL‰eÈH‹F_I‹DH…ÀuH‹EÈH‰E0äéCH‹ †^E‹d Aƒüÿu H‹ l^E‹d L9øvwH‰UÐH‹Ÿ^I‹|H5cÿ]H‹ æ^I‹\ H9Øs(H‹u^I‹|H‹5ÑH‰ÚÿXH‹¹^I‹\H‹M^I‹|H‹5Qÿ3H‰ÆA¶ëH‹EÀH4H‰UÐE0öL‰ûD‰çH‰ÚèòH‰ÃH…Ûy>è•H‹ b^ƒ8#IÇD A•ÄE„ötXH‹æ]I‹|H‹5B1ÒÿÊœë;H‹)^H…ÛuOIÇDA´E„ötH‹¬]I‹|H‹51ÒÿœA´H‹EÐH‹MÈH‰E„ä”À¶À„@²ÙÿÿéÀI‹TH‰ÑH)ÙH9ÚºHGÑI‰TE„öuH‹MÈH‹EÐHØH‰E0ä1ÀI9ßu²é‚H‹0]I‹|H‹5lL‹5œAÿÖI9ßI‰ÜMBçH‹}ÀH}ÐH‰ÆL‰âè…H‹ö\I‹|H‹5RH‰ÚAÿÖH‹Ý\I‹|H‹5a1ÒL‰áE1ÀE1ÉAÿÖL‰ãégÿÿÿI‰$1ÀHƒÄ[A\A]A^A_]ÃUH‰åAWAVSPI‰ÎH‰ûH‹·\ö€uH‹5úH‰ßÿq›IǹµÙÿÿë~H‹\‹<M‹>ƒÿÿu H‹\‹<H‰ÖL‰úèPH…ÀyèÆƒ8#•ÂH‹U\f$ÿëH…ÀuH‹A\f$ÿ0ÒIÇë I‰0Ò1ÉL9øt„Ò”À¶ÀŒ@²Ùÿÿ‰ÈHƒÄ[A^A_]ÃUH‰åH‰ÐH‰ñH‹5?H‰ÊH‰Á]ÿ%ºšUH‰åH‰ÐH‰ñH‹5)H‰ÊH‰Á]ÿ%œšUH‰åAWAVAUATSHƒì(I‰ÿH‹Q™H‹H‰EÐH‹£[A·%f=…qH‹@[I‹H‹ õZL‹4H‹ú™H‹H5àL‰÷ÿ×H‹5 H‰Çÿš¶øH‹5e[Lþè5Œ…Àt.H‹5 Hk6H‹ô™L‰ÿÿÓH‹5 L‰ÿH‰ÂÿÓéíH‹$[I‹<H5ñþÿÿHÿÿÿè!Œ…ÀtH‹5² H;6ë®H‹òZI‹<L‰þèâ‹…ÀtH‹5‹ H46ë‡H‹C™H‹H5L‰÷ÿH‰ÃH‹=vH5¿ÿ¹H5ÂH‰ßH‰Âÿ¶„ÀtHH‹5 H‰ßÿ*™H‰ÃH‰ßè!H‹ hZI‹<H‰ÞH‰Âès‹…ÀtH‹5þ HÇ5é÷þÿÿH‹ƒ˜H‹H5‰L‰÷ÿ€H…Àt:H‹5ÄH‰ÇÿØH‹ ZI‹<¶ðè䊅ÀtH‹5¥ HŽ5éžþÿÿH‹:˜H‹H50L‰÷ÿ'H…Àt:H‹5kH‰Çÿj˜H‹ ³YI‹<¶ðè—Š…ÀtH‹5L HU5éEþÿÿH‹ ˜H‹H5×L‰÷ÿÎH…Àt:H‹5H‰Çÿ˜H‹ ZYI‹<¶ðèVŠ…ÀtH‹5ó H5éìýÿÿH‹€—H‹H5~L‰÷ÿuH…Àt:H‹5¹H‰Çÿ¸—H‹ YI‹<¶ðè߉…ÀtH‹5š Hã4é“ýÿÿH‹7—H‹H5%L‰÷ÿH…Àt*H‹ ¸XI‹<H‰Æè¢‰…ÀtH‹5Q Hº4éJýÿÿH‹þ–H‹H5ÜL‰÷ÿÓH‰ÃH…Û„*H‹ø–H‹H5ÖH‰ßÿÍ„Àt,H‹JXI‹<¾1ÒèZ‰H‹3XI‹<¾éÖH‹¶–H‹H5ŒH‰ßÿƒ„ÀtCH‹XI‹<¾1Òè‰H‹éWI‹<¾ºèöˆH‹ÏWI‹<¾ëuH‹]–H‹H5+H‰ßÿ"„Àt)H‹ŸWI‹<¾1Ò诈H‹ˆWI‹<¾ë.H‹þ•H‹H5äH‰ßÿÛ„ÀtH‹XWI‹<¾ºèeˆH5–H-L‰÷ÿ†I‰ÄM…ä„ÍL‰}¸L‰uÀH5KL‰çÿBI‰ÅJ­HƒàðH‰eÈH‰ãH)ÃH‰ÜM…ít8E1öL='L‰çL‰þL‰òÿH‹5 H‰Çÿp•¿ÀB‰³IÿÆM9õuÒH‹ªVL‹}¸I‹<H‰ÞL‰ê襇…ÀH‹]Èt3H‹58HÁ2L‹5*•L‰ÿAÿÖH‹5EL‰ÿH‰ÂAÿÖH‰ÜéH‰ÜL‹uÀH5¦HG,L‰÷ÿ–H‰ÃH…ÛtYH‹/VM‹4H‹5$H‰ßÿË”M‰üI‰ÇH5–H‰ßÿL‰÷L‰þM‰çH‰Âèö†…ÀtH‹5™HB2é’úÿÿH‹=þH5‡ÿH‹5BýH‰Çÿi”H‹jUH‰ÇL‰þèù‡H5(H‹IUI‹<ÿH…ÀtH‹”NH‰Þ螀I‹>H‹ŠNH‰Þ茀H‰Ø[A^]ÃUH‰åAVSHƒìH‰ûH‹UNH‹<L5ÚL‰öÿÑH‹BNH‹<L‰öÿ½H‹6NH‹<L‰öÿ©H}àH‰]àH‹" H‰EèH‹5Ï÷è8€HƒÄ[A^]ÃUH‰åAWAVATSH‰ûL‹5lH‹5õL‹%FŒH‰ßAÿÔI‰ÇH‹5æH‰ßAÿÔHù)H‹5:÷L‰÷L‰ùI‰À0ÀAÿÔI‰ÆH‹5ÂH‰ßAÿÔH ­H‹H‹5»ýH‰ÇAÿÔH…Àt0H‹5™L‹=Ú‹H‰ßAÿ×H‹5H¶)L‰÷H‰Á0ÀAÿ×I‰ÆH‹5yHº)L‰÷[A\A^A_]ÿ%™‹UH‰åH‹5^ÿˆ‹H‹5ÑûH‰ÇºH‹r‹]ÿàUH‰åH‹ìL¹]éUH‰åH‰ÐH‹ÓLH‰ÁA¸E1É]é UH‰åH‹¾L¹]éã~UH‰åH‰ÐH‹¥LH‰ÁA¸E1É]éÕ~UH‰åH‹L¹]é­~UH‰åH‰ÐH‹wLH‰ÁA¸E1É]éŸ~UH‰åH5ÊÿÄH‹5…óH‰Çÿ¬ŠH‹ ÝH5ÖH‰Ç]ÿáUH‰åHƒìH‰}ðH‹-H‰EøH‹5JóH}ðè7~H…ÀtH‹ LHÇHƒÄ]ÃUH‰åH‹5$ÿFŠH‹5WõH‹=PHƒøuH[(0Àÿ#ŠëHj(L»ÞL‰Á0ÀÿŠ]ÃUH‰åH‹5Ëÿÿõ‰H‹5>úH‰ÇºH‹߉]ÿàUH‰åH‹qKH‹]ÃUH‰åH‹`KH‰]ÃUH‰åH5·ÿ±H‹5ròH‰Çÿ™‰H‹ ÊH5ÃH‰Ç]ÿáUH‰åAWAVATSHƒì I‰ÎA‰×H‹5IÿH‹b‰ÿÓI‰ÄH‹5>ÿL‰çL‰òÿÓHÇEØHÇEÐAƒÿ‡hD‰øH –HcHÈÿàH=Š'0Àè{éBHÇEÈH‹5góL‹=øˆL‰÷Aÿ×H5#H‰ÇÿH‰ÃHˆH‹5IóH‰ßAÿ×H”H‹55óH‰ßAÿ×HØH‹H‹5–þL‰çAÿ×HUØHMÐLEÈH‹5…þH‹=FM‰ñAÿ×H‹5yþH‹UÈL‰çAÿ×éžHƒH‹H‹5IþL‹=RˆL‰çAÿ×H‹5­òL‰÷Aÿ×H5pH‰ÇÿgH‰ÃHÕH‹5–òH‰ßAÿ×HáH‹5‚òH‰ßAÿ×HUØHMÐH‹5ýýH‹=¶M‰ðAÿ×ëHH‹H‹5ÅýL‰çÿ̇H‹5ÕýH‹UØH‹º‡L‰çÿÓH‹5ÆýH‹UÐL‰çÿÓL‰àHƒÄ [A\A^A_]Ãsþÿÿ†þÿÿ*ÿÿÿ®ÿÿÿUH‰åSPH‰ûH‹5”ýH‰×ÿk‡H‹5 øH‰ßºH‰ÁH‹R‡HƒÄ[]ÿàUH‰åAWAVAUATSHƒìI‰ÔI‰þL‹=ÄH‹5UñH‹=®ÿ‡H‹59ýH‹ ’†H‹H‰Çÿþ†I‰ÅH‹5$ñH‹=}ÿç†H‹5ðñH‰Çÿ׆H‰ÃH]%H‹5ŽðL‰çÿ½†H FL ¿H‹5øõH1H‰T$H‰$HÇD$L‰ÿL‰êI‰Ø0Àÿ~†H‹5÷L‰÷ºH‰ÁH‹e†HƒÄ[A\A]A^A_]ÿàUH‰åAWAVSHƒìH‰}ØH‹íH‰EàH‹5ïH}ØèïyH‰ÃH…ÛtlH‹=L5L‰öÿH‹5ÓîL‹=ü…H‰ÇAÿ×H‹—GH‰ÇH‰Þè†yH‹=ÝL‰öÿÜÿH‹5îH‰ÇAÿ×H‹pGH‰ÇH‰ÞèWyH‰ØHƒÄ[A^A_]ÃUH‰åAVSHƒìH‰ûH‹:GH‹<L5ŸÿL‰öÿ–ÿH‹'GH‹<L‰öÿ‚ÿH‹GH‹<L‰öÿnÿH‹GH‹<L‰öÿZÿH}àH‰]àH‹ãH‰EèH‹5€ðèéxHƒÄ[A^]ÃUH‰åAVSI‰ÖH‰ûH‹5¾úH‰ßÿý„H5ÞÿH‰ÇL‰òÿÒÿ„Àu:H‹§FH‹<H5 ÿÿÿH5ïþL‰÷ÿæþH‹FH‰ÇH‰ÞèNxH‹5]úH‰ßÿœ„H‹5ÅúH‰ÇÿŒ„H‹5=úH‰ßÿ|„H‹5­úH‰ÇH‹k„[A^]ÿàUH‰åH‹"FH‹]ÃUH‰åH‹ñEH‹<H‹–þH5þ]ÿàUH‰åH‹ÑEH‹<H‹5^ú]ÿ%„UH‰åH‹¼EH‹<H‹YþH5Rþ]ÿàUH‰åH‹œEH‹<H‹5!ú]ÿ%ÚƒUH‰åAWAVSPI‰þH‹~EI‹H…ÀuEH‹ƒH‹H‰ßè=uI‰ÇH‰ßL‰þè5uH‹NEH‰ÇL‰öè-wL‰ÿèëtH‹4EI‹HƒÄ[A^A_]ÃUH‰åAVSH‰ÓI‰þH‹EI‹<H9ßu[A^]ÃH5\ýÿVýH5_ýH‰ßÿVýH‹ßDH‰ÇL‰ö[A^]éºvUH‰åAWAVAUATSHì¸I‰üH‹5RðH‹=óýL‹5ì‚AÿÖH‰… þÿÿH‹«ÿH‹5|øL‰çAÿÖH‹5ùH‰ßH‰ÂAÿÖI‰ÇH‹5løL‰çAÿÖH…ÀH‰…8þÿÿtOH‹5SøL‹5”‚H‹8þÿÿH‰ßAÿÖH‹5°óL‰ÿH‰ÂAÿÖH‹5 øH‰ßH‰8þÿÿAÿÖH‹5¬øL‰ÿH‰ÂAÿÖH5¤üH‹½ þÿÿL‰úÿ”üH‹5øH‹½8þÿÿÿ(‚…À„^H‹5yøH‹=Šþÿ ‚H‰…HþÿÿfïÀ)EÀ)E°)E )EH‹’CM‹,L‰¥@þÿÿH5üHUHÿÿÿL‰ïA¸ÿvüH‰ÃH…ÛtyH‹E L‹ L‹=¨E1öH‹E L9 tL‰ïèNuH‹E˜J‹<ðH‹5í÷Aÿ×H‹5ƒòH‹½HþÿÿH‰ÂAÿ×IÿÆI9ÞrÁL‰ïH5üHUHÿÿÿA¸ÿýûH‰ÃH…Ûu•H‹5¦÷L‹5/H‹½8þÿÿH‹•HþÿÿAÿÖH‹5ŸòH‹=èýH‰Â1ÉAÿÖL=YûH‹ þÿÿH‰ßL‰þH‰ÂÿCûH‹5tòH‹=mýAÿÖH‰ßL‰þH‰Âÿ#ûL‹¥@þÿÿëH‹cBI‹H‹5ðöH‹½ þÿÿÿ£€H‹LBI‹<H5ûÿûH…À„êH‹5 òH‹=ýH‹m€ÿÓH5¼úH‹½ þÿÿH‰Âÿ¬úH‹5¥íH‹=FûÿÓH‰…0þÿÿH‹5ŽöH‹½8þÿÿÿÓ…À„SfïÀ)…ÿÿÿ)…ðþÿÿ)…àþÿÿ)…ÐþÿÿH‹®AI‹H5«úH•ÐþÿÿHPþÿÿH‰ÇH‰…@þÿÿA¸ÿ‡úH…ÀH‰…Hþÿÿ„ H‹…àþÿÿH‹H‰…(þÿÿH‹§E1öH‹…àþÿÿH‹(þÿÿH9t H‹½@þÿÿè?sH‹…ØþÿÿN‹<ðL‹%SüH‹5ÌõL‰ÿÿÓH‹5ÐõH‹½8þÿÿH‰ÂÿÓI‰ÅH‹5ÂõL‰ÿÿÓH‹5¾õL‰çL‰êH‰ÁÿÓH‹½0þÿÿH5}ùH‰ÂÿtùIÿÆL;µHþÿÿ‚hÿÿÿH‹½@þÿÿH5¶ùH•ÐþÿÿHPþÿÿA¸ÿœùH…ÀH‰…Hþÿÿ…-ÿÿÿëH‹{@I‹H‹5õH‹½0þÿÿÿ³~H‹5ìôH‹½ þÿÿH‹•0þÿÿÿ˜~H‹5õH‹=rûÿ„~H5ÕøH‹ þÿÿH‰ßH‰ÂÿÂøH‰ØHĸ[A\A]A^A_]ÃUH‰åAWAVAUATSHìØH‰•ÿÿÿfïÀ)EÀ)E°)E )EH‹5¯ôÿ~I‰ÇH5ÇøHUHÿÿÿL‰ÿA¸ÿ­øH‰ÃH…Û„ƒH‹E L‹(L‹%Û}E1öH‹E L9(tL‰ÿèqH‹E˜J‹<ðH‹5 ôAÿÔH‹5FôH‹½ÿÿÿH‰Âòð1ÉAÿÔIÿÆI9Þr·L‰ÿH5=øHUHÿÿÿA¸ÿ&øH‰ÃH…Ûu‹HÄØ[A\A]A^A_]ÃUH‰åH‹ñ>H‹H‹5ÞóH‹=÷ùÿ1}ƒø”À¶À]ÃUH‰åAWAVAUATSHìèI‰ÿH‹5°óH‹=ñùL‹5ú|AÿÖH‰ÃH5U÷L‰ÿÿL÷H‰ÇèÚnH…H‹5~óH‰ßH‰ÿÿÿH‰ÁM‰ø0ÀAÿÖfïÀ)EÀ)E°)E )EH‹5.óL‰ÿAÿÖH5I÷HUHÿÿÿH‰ÇH‰…øþÿÿA¸ÿ(÷H…ÀH‰…ÿÿÿ„SH‹E H‹H‰…ðþÿÿL‹=K|E1öH‹E H‹ðþÿÿH9t H‹½øþÿÿèæoH‹E˜N‹$ðH‹=ýøH5~öÿxöL‰çH5~öH‰Âÿuö„ÀtBH‹5jòL‰çAÿ×I‰ÅL‰çH5·öÿ±öH‹5‚òH‹½ÿÿÿH”L‰éI‰À0ÀAÿ×ëeH‹=ÈöH5±õÿ«õH‰ÃH‹5òL‰çAÿ×H‹5ÔìH‰ßH‰Â¹Aÿ×H‰ÇH5¬õÿ¦õH…ÀtH‹5òH‹½ÿÿÿH‰ÂÿR{IÿÆL;µÿÿÿ‚úþÿÿH‹½øþÿÿH5ìõHUHÿÿÿA¸ÿÕõH…ÀH‰…ÿÿÿ…ÂþÿÿH‹5¾ñHïH‹ÿÿÿH‰ßÿïzH‰ØHÄè[A\A]A^A_]ÃUH‰åH‹Ÿ<¹]é„nUH‰åH‰ÐH‹†<H‰ÁA¸E1É]évnUH‰åH‹Y<¹]éNnUH‰åH‰ÐH‹@<H‰ÁA¸E1É]é@nUH‰åH‹ <¹]énUH‰åH‰ÐH‹ò;H‰ÁA¸E1É]é nUH‰åAVSI‰ÎH‰ÓH5,ôÿ&ôH‹5×ðH‰ÇH‰ÚL‰ñÿzH‹ 9ôH52ôH‰Ç[A^]ÿáUH‰åAVSI‰ÖH‹5°âÿÚyH‰ÃH…ÛtH‹5“ðH‰ßL‰òÿ¿yH‰Ø[A^]ÃUH‰åH‹5|ð]ÿ%¥yUH‰åH‹5ðÿ”yH‹5eðH‰ÇH‹ƒy]ÿàUH‰åH‹M;¹]é*mUH‰åH‰ÐH‹4;H‰ÁA¸E1É]émUH‰åAVSI‰ÎH‰ÓH5>óÿ8óH‹5éïH‰ÇH‰ÚL‰ñÿyH‹ KóH5DóH‰Ç[A^]ÿáUH‰åAWAVATSI‰ÎI‰×H5óòÿíòH‹5®áL‹%×xH‰ÇAÿÔH5óH‰ÇÿùòH‰ÃH‹5—ïH‰ßL‰úAÿÔH‹5ïH‰ßL‰òAÿÔH‰Ø[A\A^A_]ÃUH‰åH‹‡<H…Àu:H‹= õH5|òÿvòH‹57áH‰Çÿ^xH5W<H‰ÇèëkH‹H<]ÃUH‰åAWAVAUATSPI‰ÎI‰ÔH‰ûH‹5 éH‹=‘ôL‹=xAÿ×H‹5ïL‰çH‰ÂAÿׄÀ…¶H‹5ÈàH‰ßÿïwI‰Ç1ÀM…ÿ„‰H‹=òòH5ÛñÿÕñH‹5éH‹¿wH‰ÇL‰â¹ÿÓH5ãñH‰ÇÿÚñI‰ÄHèH‹5™âL‰ç¹ÿÓH‰ÃH¸ÿÿÿÿÿÿÿH9Ã…®M…ö„‘H‹5ÉèH‹=âóL‹-SwAÿÕH‹5¹èL‰çH‰ÂAÿÕL‹%ÑóH‹ÊòH»H‹5<âH‹=5òH‰Á0ÀAÿÕH‹ vuH‹ H‹5üèH‰ßH‰ÂAÿÕHdH‹5íèL‰ç1ÉI‰ÀAÿÕH‰ÇL‰öèjH5èðL‰ÿÿßð1ÀëkH‹5ôæL‹5µvL‰çH‰ÚAÿÖH‹5…íL‰ÿH‰ÂAÿÖH5mñL‰çÿdñHÇÁüÿÿÿH)ÙHƒÃHÁH‹5líL‰çH‰ÚAÿÖH‹5LíL‰ÿH‰ÂAÿÖL‰øHƒÄ[A\A]A^A_]ÃH5ZðH‰ßÿQðH‹5ÂçH‹=»òÿ%vH‹ FðH5?ðH‰ÇHƒÄ[A\A]A^A_]ÿáUH‰åAVSHƒìH‰ûH‹Ï7H‹<L5üïL‰öÿóïH‹¼7H‹<L‰öÿßïH}àH‰]àH‹póH‰EèH‹5áèniHƒÄ[A^]ÃUH‰åH‹t7H‹]ÃUH‰åAVSI‰ÖH‰ûH‹Z7H‹<H5§ïÿ¡ïH5ŠïL‰÷ÿïH‹27H‰ÇH‰Þ[A^]éåhUH‰åH‹ 7H‹]ÃUH‰åAVSI‰ÖH‰ûH‹7H‹<H5KïÿEïH5.ïL‰÷ÿ%ïH‹Þ6H‰ÇH‰Þ[A^]é‰hUH‰åSPH‰ûH5?ïH‰ßÿ6ïH‹5WæH‰Çÿ¾tH9Øu HÂë3H‹‘6L‹H‹~6H‹ H‹5«ßH‹=¤ïH50Àÿ}tHƒÄ[]ÃUH‰åH‹5;êÿetH‹5®äH‰ÇºH‹Ot]ÿàUH‰åAVSHƒìH‰ûL‹5OïH5˜îH‰ßÿîH‰ÇèfH‹ ø5L‹ H‹ õ5H‹ HÒH‹5ßH‰ $L‰÷H‰ÁI‰Ø0ÀÿæsHƒÄ[A^]ÃUH‰åAVSI‰ÎH‰ÓH5ÑíÿËíH‹5¼êH‰ÇH‰ÚL‰ñÿ­sH‹ ÞíH5×íH‰Ç[A^]ÿáUH‰åAWAVATSI‰ÎI‰×H‹5NÜÿxsH‰ÃH…Ût'H‹5qêL‹%bsH‰ßL‰úAÿÔH‹5bêH‰ßL‰òAÿÔH‰Ø[A\A^A_]ÃUH‰åAVSHƒìH‰ûH‹5H‹<L55íL‰öÿ,íH‹5H‹<L‰öÿíH}àH‰]àH‹±ðH‰EèH‹5>Þè§fHƒÄ[A^]ÃUH‰åH‹½4H‹<H‹šíH5“í]ÿàUH‰åAWAVSPI‰þH‹5LéH‹=ïL‹=–rAÿ×H‰ÃH‹4I‹ H‹5.éHgH‰ß0ÀAÿ×H5@íH‹Q4I‹<ÿ/íH`H‹5ùèH‰ßH‰Á0ÀAÿ×HGH‹5èèH‰ßAÿ×H‰ØHƒÄ[A^A_]ÃUH‰åAWAVSPH‹5³èH‹=ôîL‹=ýqAÿ×H‰ÃH‹5¨èL5ùH‰ßL‰òAÿ×H‹5‘èH‰ßL‰òAÿ×H‰ØHƒÄ[A^A_]ÃUH‰åAWAVSPI‰þH‹5èH‹=îL‹= qAÿ×H‰ÃH‹5«èL‰÷Aÿ×H‹5ÖáH‰ÇºAÿ×H‹5|âH‰ßH‰ÂAÿ×H‹T3I‹H‹5aâH‰ßAÿ×H‹5lèL‰÷Aÿ×H‹5áH‰ÇºAÿ×H‹55âH‰ßH‰ÂAÿ×H‰ØHƒÄ[A^A_]ÃUH‰åAWAVSPI‰þH‹5ªçH‹=ëíL‹=ôpAÿ×H‰ÃH‹5ÿçL‰÷Aÿ×H‹5’çH‰ßH‰ÂAÿ×H‹º2I‹<H‹5—çAÿ×H‹5mçH‰ßH‰ÂAÿ×H‹5ÅçL‰÷Aÿ×H‹5PçH‰ßH‰ÂAÿ×H‰ØHƒÄ[A^A_]ÃUH‰åAWAVAUATSHìˆI‰Ö¿èäcH‰ÃH‹5¦ÜL‰÷ÿMpI‰ÇH5ëL‰÷ÿëL‰ÿ‰ÆH‰ÚèAa¶C‰EĶC‰Eȶ‰E̶C‰EжC‰EÔD¶{D¶k¶K¶S¶C D¶c D¶K D¶C D¶S D¶[D¶sH‹5èÚH‹=áêD‰t$`D‰\$XD‰T$PD‰D$HD‰L$@D‰d$8‰D$0‰T$(‰L$ D‰l$D‰|$H¾‹EÔ‰D$‹EЉ$‹MÌD‹EÈD‹MÄ0ÀÿnoI‰ÆH‰ßèŸbL‰ðHĈ[A\A]A^A_]ÃUH‰åH‹31¹]éøbUH‰åH‰ÐH‹1H‰ÁA¸E1É]éêbUH‰åH‹1¹]éÂbUH‰åH‰ÐH‹ì0H‰ÁA¸E1É]é´bUH‰åHƒ=Ü2t]ÃH‹=ñéH5ÊèÿÄèH‹5…×H‰Çÿ¬nH5­2H‰Ç]é8bUH‰åSPH‹—2H521ÿèbH‹’èH5‹èH‰ßHƒÄ[]ÿàUH‰åAVSH‹=RëH5[èÿUèH‹5nåH‹ lH‹L‹55nH‰ÇAÿÖH5`èH‰ÇÿWèH‰ÃH‹5EåH‰ßºAÿÖH‹5;åH‹=üêAÿÖH‹52åH‰ßH‰ÂAÿÖH‰Ø[A^]ÃUH‰åAWAVSHƒìH‰}ØH‹‘ëH‰EàH‹5ŽÖH}Øè{aH‰ÃH…Û„›H‹5êäL‹=›mH‰ßAÿ×L5¶çH‰ÇL‰öÿªçH‹{/H‰ÇH‰ÞèaH‹5±äH‰ßAÿ×H‰ÇL‰öÿçH‹X/H‰ÇH‰Þèç`H‹N/HÇH‹G/f‹ høf‰ H‹=/ÆH‹:/ÆH‰ØHƒÄ[A^A_]ÃUH‰åAVSHƒìH‰ûH‹/H‹<L5øæL‰öÿïæH‹/H‹<L‰öÿÛæH‹ü.H‹<L‰öÿÇæH‹¨.H‹<L‰öÿ³æH‹œ.H‹<L‰öÿŸæH}àH‰]àH‹@êH‰EèH‹5Å×è.`HƒÄ[A^]ÃUH‰åAVSI‰ÖH‰ûH‹{.H‹<L9÷u[A^]ÃH5NæÿHæH5QæL‰÷ÿHæH‹I.H‰ÇH‰Þè°_H‹.H‹<H‹,.H‹H‹51ã[A^]ÿ%çkUH‰åH‹5,ã1É]ÿ%ÓkUH‰åH‹5 ãE1À]ÿ%¾kUH‰åAWAVAUATSHƒìxL‰…pÿÿÿH‰hÿÿÿI‰ÕI‰üH‹5òâH‹=“èL‹=„kAÿ×I‰ÆH‹=‡èH5xåÿråH‹53ÔH‰ÇAÿ×H5ŽåH‰Çÿ…åH‰E¨H‹B-I‹<H‹5ŸâºL‰ñAÿ×H‰EˆHÇEÐH‹5‰âL‰çAÿ׈ÃH‹5‚âL‰çAÿ×H5Õå„ÛfE3ö‰…xÿÿÿL‰ïÿ¼åI‰ÆH‹5ºÝL‰ïL‰mAÿ×M…ö•Á„Ûˆ]°H‰EÈuˆM¸ëX¶8@„ÿxˆM¸H‹`i‹D¸<ÁèƒàëˆM¸¾@è)]…À•À¶À…ÀtH¸ÿÿÿÿÿÿÿH‰E˜E1äE0öL‰e é‹H‹EÈH‰Çè\^H‰ÃE1äL‹5iL‹}ˆëIÿÄI9Üs1H‹EÈB¶< @„ÿx A‹D¾<Áèƒàë¾@è´\…À•À¶À…ÀuÇH‹EÈJ H‰MÈH‰M HÇEÀBŠ €ùT„Þ 1Û€ù-H‹} u"Là1ÉHTH‰UÈHY€|-H‰ÙtéHØH‰ÇL‰e˜HuÈHUÀèoI‰ÅE1äE0öH‹UÀHƒú‡¹H Hc‘HÈÿàH‹EÈ€8Wt E0öE1äé•€x-DŠu¸uN¶@H‹ höD=tH‰Eˆ‹xÿÿÿD·éH‹}ȶfïÒD9è…ôHÿÇH‰}ȃÉHuÈfƒù.…ŽèÿH‰ÁHÁé I¼0EL áfHnÁò\0щÀH»0CH ØfHnÈòXÈfïÒòMÐH‹}ȶD9è……HÿÇH‰}ÈHuÈèH‰ÁHÁé L áfHnÁò\ØÐ‰ÀH ØfHnÐòXÐëNè¶òEÐH}ÐèËQf(Ðf.±Ðvò¯ÐòYÐëH‹}ȶD9èuHÿÇH‰}ÈHuÈèp(ÐòU€}°u9H‹Eȶ8@„ÿxH‹”\‹D¸<Áèƒàë¾@è`P…À•À¶À…ÀtHÿEÈH‹Mȶƒø+„ȃø-„¿E1äƒøZuH‹5&ÕH‹=‡ÚH0ÿz]I‰Ä0ÀE„ö„íH‹5ÕL‹-^]H‹]¨H‰ßH‹U¸AÿÕH‹5ÕH‰ßH‹U€AÿÕH‹5øÔH‰ßH‹UˆAÿÕH‹5ïÔòH,UÐH‰ßAÿÕòH,UH‹5ÞÔH‰ßAÿÕ‹…|ÿÿÿƒø„‚…À…H‹5ÂÔH‹}¨L‰úéýHQH‰UȶqE1äH‹€[öD²=„FÿÿÿHQH‰UÈHƒÆÐ¶yH‹^[öD»=tHQH‰UÈH4¶¶yHtwÐ@ŠyH‰ñH÷Ù<-HEÎ@¶÷D9îtH‰Öë HrH‰uÈ@Šz@¶ÿ1ÒH‹ [öD»=t3HVH‰UÈHƒÇжVH‹5íZöD–=uH‰úë H4¿HTrÐ<-uH÷ÚHiÉHkÂ]ÃUH‰åI‰ðH…ÿu fïÀ1ÿéÓ¶fïÀH‹ XöD=thHÿÇHÇÆÐÿÿÿH‹ Xë HÿÇH’HtжÐHò¶öD=uäH‰ÑHÁé H¾0EH ÎfHnÎò\ ‘ˉÒH¹0CH ÑfHnÁòXÁ <.uP¶GH‹  WöD=uHÿÇë9HÿÇò iËH‹ ‚W(ѶÀƒÀÐò*ØòYÚòXöGHÿÇòYÑöD=uÜM…ÀtI‰8]ÃUH‰åH‹5nÐ1É]ÿ%…XUH‰åH‹5bÐE1À]ÿ%pXUH‰åAWAVSPH‰ËI‰ÿHÇEàH‹5©ÏHMàL‰ÿÿDXI‰ÆH…Ût H‹}àH‰ÞèØKH‹)I‹<H‹5^ÏH‹UàH‹XÿÓH‹ I‹<H‹5ïÏL‰òÿÓHƒÄ[A^A_]ÃUH‰åAVSI‰ÖH‹5ÖÏH‰ÊÿÕWH‰ÃM…öt H‰ßL‰öèjKH…Û•À¶À[A^]ÃUH‰åAWAVATSHƒì0H‰Óf‰MÞfƒù:„‘H‹5õÁL‹%†WH‰ßAÿÔH5±ÑH‰Çÿ¨ÑI‰ÆH‹5fÏH‹=wÒHUÞ¹AÿÔI‰ÇH5!ÒHÇEÈH‰ßÿÒHAóH‰EÐH‹5.ÏH‹EÈH‹MÐH‰L$H‰$L‰÷L‰ùA¸AÿÔL‰óH‰ØHƒÄ0[A\A^A_]ÃUH‰åAVSI‰ÖH‰ûH‹5ÎH‰ßÿÖVH…ÀuH‹5ÎH‹=ÃÓÿ½VH‹5ÆÎH‰ßL‰òH‰Á[A^]ÿ%£VUH‰åAWAVSHƒìI‰ÎI‰×H‰ûH‹5žÎH‰ßÿ}VHƒøt2HƒøtLH…ÀuWH‹5…ÎH .ýH‰ßL‰úM‰ðHƒÄ[A^A_]ÿ%EVH‹5fÎH‰ßL‰úL‰ñHƒÄ[A^A_]ÿ%%VH‹5>ÎH ýë·L‹5&ÓH‹5ÎL‹=VH‰ßAÿ×H‹5#ÎÇD$Ç$H‹ 5TH‹H ãüL‰÷I‰ÀE1É0ÀAÿ×1ÀHƒÄ[A^A_]ÃUH‰åAWAVAUATSPM‰ÆI‰ÌI‰×H‰ûH‹·€<tGH‹5ÍL‹-ƒUH‰ßAÿÕ·ÈH‹5«ÍH¼üH‰ßAÿÕHüH‹5ËL‰çH‰Á0ÀAÿÕI‰ÄH‹KH‹<H‹5xÌL‰òÿ/UH‹hL;$tbH‹SH‹<L-(ÏL‰îÿÏH‹81ÿH‰Þè˜HH‹/H‹<L‰îÿúÎH5ÏL‰çÿúÎH‹ H‰ÇH‰ÞèbHH‹ñH‹<H…ÿ…—H‹=ÅÑH5¦Îÿ ÎH‹5a½L‹-ŠTH‰ÇAÿÕH‹µH‰ÇH‰ÞèHH‹£H‹<H‹5 ÌºAÿÕH‹‰H‹<H‹5ŽÌL‰âAÿÕH‹qH‹<H‹6H‹H‹5sÌAÿÕH‹QH‹<H‹5fÌL‰úÿTI‰ÇH‹€<„¾H‹5JÌL‰÷ÿáSH‰ÆHF;HƒøvwH‹5•ÉH6ûL‰ÿÿ½Sé‚H¹‰ˆˆˆˆˆˆˆH‰ðH÷éI‰ÐIðL‰ÀHÁè?IÁøIÀL‰ÀH÷éH‰ÑHº|ójâYÑHH‰ðH÷êH‰ÐLÁH‰ÂHÁê?HÁø H‹5#ÉHÐHéúH‰ÏHÁï?HÁùHùHkÉHðHÁøHðH‰ÖHÁþ?HÁî>HÖHƒæüH)òH4’HÆH‰ðI÷éH‰ÐHÁè?HÑúHÂHkÂH)ÆH|1ÿH‰øI÷é¸H)ðH9Á#Hƒþ|°Hƒþt 0ÀHƒþuDˆÀD¶ðIƒÎ4ëeH‰ÐHÁè?HÑúHÂHkÂH)ǸH)øH)ËH9Ã} MeA¾ë5HD1H)øH¹%I’$I’$IH÷éI‰ÖL‰ðHÁè?IÑþIÆHƒþŸÀ¶ÀI)ÆM‰ìH‹¼H‹MЀ<u H[÷éH‹=ŸÌH5€ÉÿzÉH‹5;¸H‹dOH‰ÇÿÓI‰ÅH‹5ÍÆL‹}ÐL‰ÿÿÓHõöf…ÀfDzÚ·ÈH‹5hÇL‰ÿÿÓH‹5lÇL‰ïH‰ÂÿÓH‹5mÇL‰ïH‹UÀÿÓH‰ÃH5ÉL‰ïÿÉH‹5 ºH‹=ÊH‰$L‹MÈIÿÁHÉöL‰áM‰ð0ÀÿËNHƒÄ([A\A]A^A_]ÃUH‰åH‹áH‹]ÃUH‰åH‹È¾]ÃUH‰åH‹·ˆ]ÃUH‰åH‹H‹]ÃUH‰åH‹~H‰]ÃUH‰åH‹}¾]ÃUH‰åH‹lˆ]ÃUH‰åH‹T·]ÃUH‰åH‹Cf‰]ÃUH‰åSHƒìH‰ûH‹ZH‹<H5ÈÿÈH‰]èH‹ÆËH‰EðH}èH‹5?¹è¨AHƒÄ[]ÃUH‰åAWAVAUATSPI‰ÔI‰þH‹5h¿L‹-¹ML‰çAÿÕH‰ÃH‹5Y¿L‰çAÿÕI‰ÇH©õH‹5Z¿H‰ßAÿÕH…ÀuH‹5ÆL‰÷L‰úÿtM¸H‹ °Iƒ<u&H‹5ê¾H‹=ãÉÿMMH‰Á¸L9át¸HƒÄ[A\A]A^A_]ÃUH‰å1À]ÃUH‰åH‹aH‹]ÃUH‰åH‰ÐH‹MH‰ÁE1ÀE1É]éÈ@UH‰åAWAVAUATSHìH‰ðþÿÿH‰ÓH‰½ØþÿÿH‹5RÅH‹=ëÉL‹5¼LAÿÖH‰…àþÿÿfïÀ)EÀ)E°)E )EH‹5_¶HÀôH‰ßH‰èþÿÿAÿÖH‰ÃH51ÇHUHÿÿÿH‰ßA¸ÿÇI‰ÆM…ö„‰H‹E L‹(L%ÆE1ÿH‹E L9(tH‰ßèë?H‹E˜J‹ øH‹5²ÄH‹=«ÈHdôÿLH‹½ðþÿÿL‰æH‰ÂÿSÆIÿÇM9÷r±H‰ßH5¡ÆHUHÿÿÿA¸ÿŠÆI‰ÆM…öu…H‹5‹µH,ôH‹½èþÿÿÿ¯KH…À„JH‹=ÏÈH5 ÅÿšÅH‹5[´L‹-„KH‰ÇAÿÕH5¯ÅH‰Çÿ¦ÅH‰ÃH‹5ÄÂH‹=eÈAÿÕH‹5»ÃH‰ßH‰ÂAÿÕI‰ÇH°óL‹5QÆH‹5ú´H‹èþÿÿH‰ßAÿÕI‰ÄHËóH‹5Ü´H‰ßH‰èþÿÿAÿÕH…Àu HËòë?H‹ ÆH‹5³´H”óL‹-ÝJH‹½èþÿÿAÿÕH‹5äµH•óH‰ßH‰Á0ÀAÿÕH‹5˵L‰<$H8óH‹¡JL‰÷L‰áL‹…àþÿÿI‰Á0ÀÿÓH‹5ÃH‹=ÇHÈòH‰ÁÿÓH5ÄÄH‹½ðþÿÿH‰Âÿ´ÄH‹5åÂH‹=ÞÆH7óH‹àþÿÿÿ:JH5‹ÄH‹½ðþÿÿH‰Âÿ{ÄH5ÄÄH%óH‹½èþÿÿÿ°ÄH…À…JŠ „À…AH½ÿÿÿHµÿÿÿH•øþÿÿè H‹5è´L‹øþÿÿL‹…ÿÿÿH‹ÿÿÿH‹=ÌÄHÝòL‹5¦I0ÀAÿÖH5ÂÃH‰Çÿ¹ÃH5² H‰Çè=H5ãÃH‹ÅH‹½ØþÿÿÿÏÃH‹5øÁH‰ßH‰ÂAÿÖH‰ÃH‹5]´H‰ßAÿÖH5ÄHÉØH‰ÇÿøÃH‹59º„Àt H=nòëH=…òÿIH5 H‰Çèœ<H‹5™ÁH‰ßÿðHH‹ yHH‹H5‡ÃH‰Çÿ~ÃH5÷ÂH‰ÇÿîÂH5ß H‰ÇèS<ÆÀ H‹59ÁH‹=2ÅHËìL‹5”HH‹àþÿÿAÿÖL=ÛÂH‹ðþÿÿH‰ßL‰þH‰ÂÿÅÂH‹5öÀH‹ w H‹=èÄH¡ìAÿÖH‰ßL‰þH‰Âÿ—ÂH¨ìH‹5ÁÀH‹ J H‹=³ÄAÿÖH‰ßL‰þH‰ÂÿiÂHšìH “ñH‹5ŒÀH‹=…ÄAÿÖH‰ßL‰þH‰Âÿ;ÂHŒìH‹5eÀH‹ ö H‹=WÄAÿÖH‰ßL‰þH‰Âÿ ÂHÄ[A\A]A^A_]ÃUH‰åSPH‰ÓH‹5+µÿGH‹5.ÀH‰ÇH‰ÚH‹yGHƒÄ[]ÿàUH‰åSPH‰ÓH‹5ù´ÿ[GH‹5ÀH‰ÇH‰ÚH‹GGHƒÄ[]ÿàUH‰åAVSI‰ÎH‰ÓH‹5ôÿ%GH‹5Ö¿H‰ÇH‰ÚL‰ñH‹G[A^]ÿàUH‰åAWAVSPM‰ÆI‰ÏH‰ûH‹5†´H‰ßÿåFH‹5ž¿H‰ÇH‰ÚL‰ùM‰ðH‹ËFHƒÄ[A^A_]ÿàUH‰åH‹ H‹]ÃUH‰åH‰ÐH‰ùH‹íH‰ÇH‰Î]é3:UH‰åAWAVAUATSHìØM‰ÄH‰þÿÿH‰•þÿÿH‰½(þÿÿH‹5¶³H‹=WÁH‹PFÿÓH‰…HþÿÿH‹5˜³H‹=9ÁÿÓH‰…þÿÿH5ÑÀH²ÔL‰çÿÁÀH‰ÃH…Ût5H‹5š¾H‹=“ÂHŒçH‰ÙÿóEH5DÀH‹½HþÿÿH‰Âÿ4ÀH‰0þÿÿH5vÀHwÔL‰çÿfÀH…À„½H5VÀHWÔL‰çÿFÀI‰ÅH‹5\¾H‹=mÂL‹5†EL‰êAÿÖI‰ÇH‹ÂH‹5‡°H‹=€ÀHïL‰ù0ÀAÿÖHçH‹5Û½H‰ßH‰ÁAÿÖL‰ãL%¿H‹½HþÿÿL‰æH‰Âÿ}¿H‹5ž»H‹=÷ÁL‰êL‰ùAÿÖH‹½þÿÿL‰æI‰ÜH‰ÂÿP¿H5™¿HúÓL‰çÿ‰¿H…ÀtOH‹eÁH5v¿H×ÓL‰çÿf¿H‹5G½H éH‰ßH‰Áÿ¤DH5õ¾H‹½HþÿÿH‰Âÿå¾H.¿HÒL‰çH‰Þÿ¿I‰ÇHÙÑL‰çL‰¥ þÿÿH‰Þÿþ¾H‰ÃH‹5½H‹=ÀH‰ÚÿH…Àu Æ…÷þÿÿéHiÉH‹H‹5g°L‰çÿ–>H…Àu Æ…öþÿÿëuH‹5I°L‰çHçèÿq>H…ÀuYH‹5°L‰ÿAÿÕH‰ÃH‹5°H‰ßHÛèAÿÕÇ… ÿÿÿH…Àu&H‹5ú¯H‰ßHØèÿ">H…À•À¶À‰… ÿÿÿIÿÆL;µÿÿÿ‚ÌþÿÿH‹½øþÿÿH5­¸HUHÿÿÿA¸ÿ–¸H…ÀH‰…ÿÿÿ…”þÿÿ1À€½õþÿÿt%€½÷þÿÿt€½öþÿÿt¸ƒ½ ÿÿÿu¸HÄø[A\A]A^A_]ÃUH‰åAWAVAUATSHƒìHM‰ÎL‰E¨H‰M˜H‰U H‰}¸H‹5¹ªH‹=Z¸H‹S=ÿÓI‰ÅH‹5ŸªH‹=@¸ÿÓH‰EÀH5Û·H¼ËL‰÷ÿË·H…ÀtQHgÇL‹8H‹¹H5®·HËL‰÷ÿž·H‹5µH‰ßL‰úH‰Áÿà<H51·L‰ïH‰Âÿ%·H5n·H/ÉL‰÷ÿ^·H…ÀtQHÇL‹8H‹0¹H5A·HÉL‰÷ÿ1·H‹5µH‰ßL‰úH‰Áÿs<H5ĶL‰ïH‰Âÿ¸¶H5·HâÈL‰÷ÿñ¶H…ÀtQHÍÆL‹8H‹øH5Ô¶HµÈL‰÷ÿĶH‹5¥´H‰ßL‰úH‰Áÿ<H5W¶L‰ïH‰ÂÿK¶H5”¶H5ÉL‰÷ÿ„¶H…ÀtKH‹`¸H5q¶HÉL‰÷ÿa¶H‹5B´H{æH‰ßH‰ÁÿŸ;H5ðµL‰ïH‰ÂÿäµH5-¶H.ÈL‰÷ÿ¶H…ÀtQHÆL‹8H‹ï·H5¶HÈL‰÷ÿðµH‹5ѳH‰ßL‰úH‰Áÿ2;H5ƒµL‰ïH‰ÂÿwµH5ÀµHAÈL‰÷ÿ°µH…ÀtkH5¤µH%ÈL‰÷ÿ”µH‹5ݤH‹Þ:H‰ÇÿÓHåH »å„ÀHEÊH^ÅH‹H‹5D³H‹==·ÿÓH5ü´L‰ïH‰Âÿð´H59µHšÇL‰÷ÿ)µH…À„ŒHÅH‹H‰EÈL‹%ó¶H‹tµH5ý´H^ÇL‰÷ÿí´H‹5ž¦M‰ïL‹-4:H‰ÇAÿÕH7äH‹58¥H‰ß‰Á0ÀAÿÕH‹5Ÿ²L‰çH‹UÈH‰ÁAÿÕM‰ýH5P´L‰ïH‰ÂÿD´L‰mÈH5‰´HªÆL‰÷ÿy´H…À„ýH5i´HŠÆL‰÷L‰u°ÿU´H‰ÃH‹=CµH5´ÿþ³H5´H‰ßH‰Âÿû³„ÀtH‹5 ¤H‰ßÿo9H‰ÃH‹5-²H‹=>¶L‹5W9H‰ÚAÿÖI‰ÇHÇÃL‹ L‹-͵H‹5N¤H‹=G´HØâL‰ù0ÀAÿÖH‹5©±L‰ïL‰âH‰ÁAÿÖL%^³H‹}ÈL‰æH‰ÂÿN³H‹5o¯H‹=ȵH‰ÚL‰ùAÿÖH‹}ÀL‰æH‰Âÿ'³L‹u°H5l³H­ÅL‰÷ÿ\³H…À„dHL³H­ãL‰÷H‰Þÿ9³I‰ÇHwÅL‰÷H‰Þÿ#³I‰ÄM…ÿu2H‹=„³H5ͲÿDzH5вL‰çH‰ÂÿIJ„ÀtL=qãHêÎM…ÿLDúH‹5ô©L‰ÿÿ#8H…ÀufHÇEÐH‹5÷°H‹=`´LMÐL‰â¹dE1Àÿó7H‹uÐH…ö…H‹÷²H‹5(¤L‹%Ñ7H‰ÇAÿÔH‹5d«H‰ßH‰ÂAÿÔI‰ÄM…ätlH\ÂH‹H‹52°H‹=+´L‹-”7L‰áAÿÕL%ß±H‹]ÈH‰ßL‰æH‰Âÿ̱H%ÂH‹H‹5ó¯H‹=ì³L‰ùAÿÕH‰ßL‰æH‰ÂÿŸ±H5è±H©âL‰÷ÿرH…ÀL‹mÈtQHàÁL‹8H‹¦³H5·±HxâL‰÷ÿ§±H‹5ˆ¯H‰ßL‰úH‰Áÿé6H5:±L‰ïH‰Âÿ.±H5w±HXâL‰÷ÿg±H…ÀtKH‹C³H5T±H5âL‰÷ÿD±H‹5%¯HþàH‰ßH‰Áÿ‚6H5Ó°L‰ïH‰ÂÿǰH5±HqßL‰÷ÿ±H…ÀtQHDÁL‹8H‹Ò²H5ã°HDßL‰÷ÿÓ°H‹5´®H‰ßL‰úH‰Áÿ6H5f°L‰ïH‰ÂÿZ°H5£°H¤áL‰÷ÿ“°H…ÀtQHßÀL‹8H‹e²H5v°HwáL‰÷ÿf°H‹5G®H‰ßL‰úH‰Áÿ¨5H5ù¯L‰ïH‰Âÿí¯H56°HWáL‰÷ÿ&°H…ÀtQHzÀL‹8H‹ø±H5 °H*áL‰÷ÿù¯H‹5Ú­H‰ßL‰úH‰Áÿ;5H5Œ¯L‰ïH‰Âÿ€¯H5ɯH áL‰÷ÿ¹¯H…ÀtQHÀL‹8H‹‹±H5œ¯HÝàL‰÷ÿŒ¯H‹5m­H‰ßL‰úH‰ÁÿÎ4H5¯L‰ïH‰Âÿ¯H5\¯H½àL‰÷ÿL¯H…ÀtQH°¿L‹8H‹±H5/¯HàL‰÷ÿ¯H‹5­H‰ßL‰úH‰Áÿa4H5²®L‰ïH‰Âÿ¦®H5ï®HpÃL‰÷ÿß®H…ÀtQH[¿L‹8H‹±°H5®HCÃL‰÷ÿ²®H‹5“¬H‰ßL‰úH‰Áÿô3H5E®L‰ïH‰Âÿ9®H5‚®HƒÜL‰÷ÿr®I‰ÄM…äuVH‹#3H‹H‰ßèB%I‰ÇH‰ßL‰þè:%H‰ÃH‹5¨¤H‰ßÿ3H5À­H‰Çÿ·­I‰ÄH‰ßèÜ$L‰ÿèÔ$Hí½H‹H‹5ë«H‹=ä¯H‹M3L‰áÿÓH5™­L‰ïH‰Âÿ­H‹5¬H‹}¸L‰òL‰éÿÓH‹u¨H…ötL‰çè¹&H‹u H…ötL‰ïè¨&H‹u˜H…öt H‹}Àè–&HƒÄH[A\A]A^A_]ÃH=(Þ0ÀèÃ$é…ûÿÿUH‰åAWAVSHƒìI‰ÖI‰÷H‰ûHuä¿vsysèd$f…À…­‹Eä=?DH…Ût‰ÁÁéƒá‰ÂÁê ƒâkÒ ÊHcÊH‰ M…ÿt ‰ÁÁéƒáI‰M…ö„ ƒàI‰é•Huà¿1sysèÿ#f…ÀuLHuÜ¿2sysèì#f…Àu9HuØ¿3sysèÙ#f…Àu&H…ÛtHcEàH‰M…ÿtHcEÜI‰M…öt?HcEØI‰ë6H¿ðH=Þ0ÀèÒ#H…ÛtHÇ M…ÿtIÇM…ötIÇHƒÄ[A^A_]ÃUH‰åAVSHƒìH‰}àH‹s¯H‰EèH‹5`šH}àèM%H‰ÃH…Ût%H‹5hªL‹5q1H‰ß1ÒAÿÖH‹5ZªH‰ß1ÒAÿÖH‰ØHƒÄ[A^]ÃUH‰åSHƒìH‰ûH‹sôH‹<H5H«ÿB«H‰]èH‹÷®H‰EðH}èH‹5hœèÑ$HƒÄ[]ÃUH‰åAWAVAUATSPI‰ÖI‰ÿH‹5‘¢L‹-â0L‰÷AÿÕH‰ÃH‹5‚¢L‰÷AÿÕI‰ÄHòÆH‹5ƒ¢H‰ßAÿÕH…Àu$H‹5 H‹¢0L‰çÿÓHcÐH‹5‹©L‰ÿÿÓë/H‹5M¢HÎÆH‰ßÿu0H…ÀuH‹5Y©L‰ÿL‰âÿ]0H‹–óIƒ<t¸H‹ {óIƒ<u&H‹5Å¡H‹=¾¬ÿ(0H‰Á¸L9ñt¸HƒÄ[A\A]A^A_]ÃUH‰å1À]ÃUH‰åH‹,óH‹]ÃUH‰åH‰ÐH‹óH‰ÁE1ÀE1É]é£#UH‰åH‹óH‹]ÃUH‰åH‹õòH‰]ÃUH‰åAWAVAUATSHƒìI‰üH‹59¦H‹=z¬H‹ƒ/ÿÓI‰ÆH‹5Ç›L‰çÿÓH‰EÈH5?ªL‰çÿ6ªH…ÀtwE1íH]ÕL‹=K/ÆEׯEÖÆEÕH‹EÈF¶(H‰ß1öºH 0Àè¾!H‹5·¢H‹=(ªH‰ÚAÿ×H‹5»¥L‰÷H‰ÂAÿ×L‰çH5È©ÿ©IÿÅI9År—L‰ðHƒÄ[A\A]A^A_]ÃUH‰åAWAVAUATSPI‰ÿH‹5¥H‹=)«ÿ«.I‰ÆH5y©L‰ÿÿp©H…Àto1ÛL‹%Š.L-[©H‹5t¥L‰ÿH‰Ú¹AÿÔH‹5G¡H‰ÇAÿÔH‰Ç1öºèZ"ˆE×H‹5£L‰÷HU×¹AÿÔL‰ÿL‰îÿ©HƒÃH9Ãr¡L‰ðHƒÄ[A\A]A^A_]ÃUH‰åAWAVAUATSHìHA‰÷H‰ûH5ɨH‰ßÿÀ¨I‰ÆH‹5.šH‰ßÿÕ-H‰ÃAÿÏ1ÀAƒÿ‡H Jc¹HÈÿ࿾è\ I‰ÇM…ÿtH‰ßD‰öL‰úè¢H‹5w¢H‹= ªL‰ú¹é©¿¾è I‰ÇM…ÿtH‰ßD‰öL‰úèhH‹57¢H‹=à©L‰ú¹éi¿ ¾èÜI‰ÇM…ÿ„L‰½˜þÿÿH½pÿÿÿè+H¸I9Ær2L¥pÿÿÿA½ÿÿÿÿI¿ÿÿÿÿL‰çH‰ÞºÿÿÿÿèûLëMþM9îwåM…ötH½pÿÿÿH‰ÞD‰òèÙHµpÿÿÿL‹½˜þÿÿL‰ÿè·H‹5€¡H‹=)©L‰ú¹ 鲿@¾è%I‰ÇM…ÿ„L‰½˜þÿÿH½ þÿÿè†H¸I9Ær2L¥ þÿÿA½ÿÿÿÿI¿ÿÿÿÿL‰çH‰ÞºÿÿÿÿèVLëMþM9îwåM…ötH½ þÿÿH‰ÞD‰òè4Hµ þÿÿL‹½˜þÿÿL‰ÿèH‹5É H‹=r¨L‰ú¹@A¸ÿ¾+HÄH[A\A]A^A_]Ãùýÿÿ9þÿÿyþÿÿ0ÿÿÿUH‰åAWAVAUATSHìèH‰•ÿÿÿH2µH 3µH4µL‹ L‹H‹H µH‹H"µH‹H‹5H¤H‹=¡¦H‰$HÇD$E0ä0Àÿ)+I‰ÇfïÀ)EÀ)E°)E )EH5Ã¥HUHÿÿÿL‰ÿA¸ÿ©¥H‰ÃH…ÛtsH‹E L‹(E1öH‹E L9(tL‰ÿèˆH‹E˜J‹<ðH‹5‡œH‹•ÿÿÿÿ²*A´H…Àt4IÿÆI9ÞrÃL‰ÿH5P¥HUHÿÿÿA¸ÿ9¥H‰ÃE0äH…Ûu”A¶ÄHÄè[A\A]A^A_]ÃUH‰åAWAVAUATSHìØH‰•ÿÿÿHî³H‹H‹54£H‹=¥E0ä1É0Àÿ *I‰ÇfïÀ)EÀ)E°)E )EH5º¤HUHÿÿÿL‰ÿA¸ÿ ¤H‰ÃH…ÛtsH‹E L‹(E1öH‹E L9(tL‰ÿèH‹E˜J‹<ðH‹5~›H‹•ÿÿÿÿ©)A´H…Àt4IÿÆI9ÞrÃL‰ÿH5G¤HUHÿÿÿA¸ÿ0¤H‰ÃE0äH…Ûu”A¶ÄHÄØ[A\A]A^A_]ÃUH‰åSPH‰ÓH‹5O¢H‹=À¥H‰Úÿ7)ˆÁ1À„ÉtqH³H‹H5æ£H‰ßÿÝ£ˆÁ¸„ÉuLHã²H‹H5Á£H‰ßÿ¸£ˆÁ¸„Éu'HƲH‹H5œ£H‰ßÿ“£ˆÁ1À„Ét¸HƒÄ[]ÃUH‰åSPH‰ÓH‹5·¡H‹= ¥H‰Úÿ—(ˆÁ1À„É„–H<²H‹H5B£H‰ßÿ9£ˆÁ¸„ÉuqH²H‹H5£H‰ßÿ£ˆÁ¸„ÉuLH²H‹H5ø¢H‰ßÿÁ¸„Éu'Hå±H‹H5Ó¢H‰ßÿÊ¢ˆÁ1À„Ét¸HƒÄ[]ÃUH‰åAWAVAUATSHƒìE‰Æ‰ËI‰ÔH‰}ÈH‹ª¥H‰EÐH‹5H}Èè|I‰ÇM…ÿt6H‹5¿ L‹- 'L‰ÿL‰âAÿÕH‹5° L‰ÿ‰ÚAÿÕH‹5© L‰ÿD‰òAÿÕL‰øHƒÄ[A\A]A^A_]ÃUH‰åAVSHcÚH‰ß¾èI‰ÆH‹='H‹8H‰ÞL‰òè³H‹5 œH‹=É£L‰òH‰ÙA¸[A^]ÿ%'UH‰åSPH‰ûH‹53 H‹=|£ºÿñ&H‹5" H‰ßH‰ÂH‹Ý&HƒÄ[]ÿàUH‰åAVSH‰ûL‹5<£H‹5ýŸH‰ßÿ´&H‹5ý–H‰ÇºÿŸ&H‹5˜—L‰÷H‰ÂÿŒ&I‰ÆH‹5ÊŸH‰ßÿy&H‹5z—L‰÷H‰Âÿf&H‹5¯ŸH‰ßÿV&L‰÷‰Æè:øÿÿI‰ÆH‹5šŸH‰ßL‰òÿ6&H‹5ŸH‰ßÿ&&L‰÷‰Æè øÿÿH‹5uŸH‰ßH‰Âÿ &H‹5jŸH‰ßÿù%H‹5bŸH‰ßH‰ÂH‹å%[A^]ÿàUH‰åH‹5$ŸÿÎ%ÿȃøw2H x¯H1Hc‚HÐÿàH i¯ëH h¯ëH g¯ëH >¯H‹]ÃúÿÿÿØÿÿÿáÿÿÿêÿÿÿUH‰åH‹5Å›ÿg%ƒøu H3¯ë#ƒøtƒøuH(¯ëH'¯ëHæ®H‹]ÃUH‰åAVSI‰ÖH‰ûH‹5u›H‰ßÿ%…ÀtE1öë H‹5|žH‰ßÿû$H5ÌŸH‰ÇÿßL‰ð[A^]ÃUH‰åAVSI‰ÖH‰ûH‹5'›H‰ßÿÆ$…ÀtE1öë H‹5.žH‰ßÿ­$H5~ŸH‰ÇÿuŸL‰ð[A^]ÃUH‰åSPH‹5àšÿ‚$1Û1ÿ¾è,H…Àt"H‹5X™H‹=¡H‰Â1ÉA¸ÿP$H‰ÃH‰ØHƒÄ[]ÃUH‰åAWAVATSH‰ûH‹5~H‰ßÿ%$…Àu HÊ­H‹ëgH‹5–L‹%$H‰ßAÿÔI‰ÆH‹5oH‰ßAÿÔH‰Çè=ôÿÿI‰ÇH‹5'H‰ßAÿÔH‰Çè%ôÿÿHÐH‹5ÛŽH‹=ÔžL‰ñM‰øI‰Á0ÀAÿÔ[A\A^A_]ÃUH‰åAWAVSPH‰ûH‹5!L‹5Š#H‰ßAÿÖI‰ÇH‹5úœH‰ßAÿÖH‰ÇèÀóÿÿH‰ÃH5JžH ­H‹L‹5ižL‰ÿÿ0ž„Àt L Ëë#H‹5LŽH‹=EžH¶ÏH‰Ù0Àÿ#I‰ÀH‹5)Ž0ÀHxÏL‰÷L‰ùHƒÄ[A^A_]ÿ%ò"UH‰åH‹/æ‹]ÃUH‰åH‹æ‰]ÃUH‰åH‹æ‹]ÃUH‰åH‹æ‰]ÃUH‰åH‹ÿå¹]é\UH‰åH‰ÐH‹æåH‰ÁA¸E1É]éNUH‰åH‹Ñå¹]é&UH‰åH‰ÐH‹¸åH‰ÁA¸E1É]éUH‰åH‹£å¹]éðUH‰åH‰ÐH‹ŠåH‰ÁA¸E1É]éâUH‰åH‹uå¹]éºUH‰åH‰ÐH‹\åH‰ÁA¸E1É]é¬UH‰åH‹Gå¹]é„UH‰åH‰ÐH‹.åH‰ÁA¸E1É]évUH‰åSPH‹£œH‹5´‹H‹= ÿw!H‹5€ŒH‰Çÿg!H‰ÁH ÎH‹5nŒ0ÀH‰ßL‹J!HƒÄ[]AÿàUH‰åAWAVAUATSPI‰þE0íHƒ=-!„ËŠIå<u DŠ-?åéµH‹52‹H‹=‹œL‹%ô AÿÔH‹52‹H‰ÇAÿÔI‰ÇH‹ò›H‹5kšL‰÷AÿÔH–ÍE0íH‹5Ô‹H‰ßH‰Á0ÀAÿÔH‹5bŒL‰ÿH‰ÂAÿÔHŠÍH‹5ÛŒH‰ÇAÿÔH‰ÃƳäH‹5,ŒH‹==œAÿÔH‹5+ŒH‰ÇH‰ÚAÿÔ„Àt ƈäAµA¶ÅHƒÄ[A\A]A^A_]ÃUH‰åHFÍ]ÃUH‰åAVSH‰ûH‹5ÙH‰ßÿ „Àt-H‹5·™L‹5 H‰ßAÿÖH‹5«™H‰ßH‰ÂAÿÖ„Àt[A^]ÃH‹5BH‰ß[A^]ÿ%ÕUH‰åHƒìH‰}ðH‹ªH‰EøH‹5¿H}ðètHƒÄ]ÃUH‰åAWAVSHƒìhI‰ÿ0ÛHƒ=–„HÇE¸Lu¸L‰uÀÇEÈÇEÌ0HûH‰EÐHH‰EØL‰}àH‹5á˜H‹=zšÿ<H‹5’H‰Çÿ,H‹5ýH‰Çè[H‹ –âI‰H‹‹âI‹H…Ûu!0ÛLu¸ëvH‰ÃH}¸¾èqH‰ßèoH‹šH‰EˆÇEBÇE”HŒH‰E˜HŽÜH‰E Hu¨L‰ÿèNHuˆL‰u°H‰ßèæH‹âI‹<³èÈL‰÷¾èÿ¶ÃHƒÄh[A^A_]ÃUH‰åHƒÇ(H‹v(ºƒ]éÓf„UH‰åH‹(¾ƒ]é½UH‰åAWAVSPH‰óI‰þH‰ßèµH;N…áH;„®H;üu~H‹ûH‹0L‹=™H‰ßè[H‹5z‘H‹ÓL‰ÿH‰ÂÿÓH=ôÊH‰Æ0Àè¬I‹F H‹ /áH‹<èPI‹F H‹ áHÇI‹F(H‹@H‹x(H‹5àÿÓë'H=ÅÊ0Àè`I‹F(H‹@H‹x(H‹5»ÿUIƒÆ(I‹H‹@H‹x(H‹5GHƒÄ[A^A_]ÿ%/I‹F(H‹@H‹x(H‹5Ô–H‰ÚHƒÄ[A^A_]ÿ% UH‰åAVSI‰öH‰ûI‹v H{ ºèkHƒÃ(I‹v(H‰ßº[A^]éR„UH‰åSPH‰ûH‹{ ¾è9H‹{(¾HƒÄ[]é%UH‰åAWAVAUATSPH‰ÓI‰üH‰ßèH;²„·H;•…ªH‹5 –H‹=‘™H‰ÚÿPI‰ÆH5î–H¯ÉL‰÷ÿÞ–I‰ÇH5ô–HµÉL‰ÿÿä–„ÀtH‹5ÑL‰çHƒÄ[A\A]A^A_]ÿ%úH5»–HœÉL‰ÿÿ«–„À„æH|–HÉL‰÷H‰Þÿi–H‹5²…H‰Çÿ±AˆÇH—ÉL‰÷H‰ÞÿC–I‰ÆHIÛH‹I‹<E„ÿtTH…ÿ„°H‹MH5¶•ÿ°•„À„”HÛH‹I‹<H‹5#L‰âL‰ñHƒÄ[A\A]A^A_]ÿ%1H…ÿ„\H‹H5b•ÿ\•„À„@H½ÚH‹I‹<H‹5׌ëªH5¶•H÷ÈL‰ÿÿ¦•„Àt H‹5ÓŠé½þÿÿH5•HðÈL‰ÿÿ•„Àt H‹5´Šé–þÿÿH5H•HéÈL‰÷ÿ8•H…Àt7H5,•HÍÈL‰÷ÿ•H‹5e„H‰Çÿd„Àt H‹5±ŠéCþÿÿL-õ”Hv°L‰÷L‰îÿâ”H‹5ë‹H‰Çÿ*H‰ÃHp°L‰÷L‰îÿ¼”H=}ÈH‰ÞH‰Â0Àèò H5Á”H‚ÈL‰ÿÿ±”„Àt Hû”„þþÿÿH‹51Šé»ýÿÿHƒÄ[A\A]A^A_]ÃH‹5ŠL‰çÿ­H‹5®‰L‰çH‹œHƒÄ[A\A]A^A_]ÿàUH‰åAWAVATSI‰×I‰þH‹ôÜIƒ<u0Àé…1ÿ1ö1ÒèÉ I‰ÄH‹51ŒH‹JL‰ÿÿÓH5/{L‰çH‰Âè³ H‹5t„L‰÷ÿÓH‹5è’H‰ÇÿÓH‰ÃH5{L‰çH‰ÚèŒ H‰ßè¨ H‹wÜI‹<L‰æè5 L‰çè °¶À[A\A^A_]ÃUH‰å¸]ÃUH‰åHOÇ]ÃUH‰å¸]ÃUH‰åHWÇ]ÃUH‰åAWAVSHƒìhI‰ÖI‰ÿL‰÷è H;žu}H‹•“L‰÷èÙ H‹5.’H‰ßH‰ÂÿRH‰ÃH‹H‰E¸HuØHAÖH éÇEÀBÇEÄH‰MÈH‰EÐL‰ÿè¼ HuàH‰ßè° Hu¸L‰÷èd é H;u}H‹ç’L‰÷è H‹5ÀƒH‰ßH‰ÂÿÌH‰ÃH‹‚H‰EˆHu¨HëÕH ?ÇEBÇE”H‰M˜H‰E H‰ßè6 Hu°L‰ÿè* HuˆL‰÷è éH;²uL‰÷è H‹5ùŠH‹=j’ëLH;au$L‰÷èw H‹5˜€H‹=a’¶Ðÿ(éÉH;\u$L‰÷è¶ H‹5c€H‹=4’H‰ÂÿûéœH;?uL‰÷è§ H‹5¾€ëÑH;uL‰÷è] H‹5dŽH‹=í‘ÿ·ë[1ÛH;ÌuSL‰÷èþ I‰ÇL‰÷èù H‰ÃH‹=-“H5ŽÿˆH‹5‰ŠH‰ÇL‰úH‰ÙÿjH5›H‰Çÿ’H‰ÃH‰ØHƒÄh[A^A_]ÃUH‰åAWAVATSI‰×H‰ðH‰ûH‹5ƉH‹=?‘L‹% H‰Â¹AÿÔI‰ÆH‹{ H‹5ÇL‰úAÿÔH…ÀtH‹{(H‹5AH‰ÂL‰ñÿå°[A\A^A_]ÃfUH‰åAVSI‰öH‰ûI‹v H{ ºè;HƒÃ(I‹v(H‰ßº[A^]é"„UH‰åSPH‰ûH‹{ ¾è H‹{(¾HƒÄ[]éõUH‰åSPH‹_ H‹(H‹5ÿRH5£H‰ßH‰Âÿ—°HƒÄ[]Ãfffff.„UH‰åAVSI‰öH‰ûI‹v H{ ºè‹HƒÃ(I‹v(H‰ßº[A^]ér„UH‰åSPH‰ûH‹{ ¾èYH‹{(¾HƒÄ[]éEUH‰åAWAVSHƒìxI‰ÿHÇEÈH]ÈH‰]ÐÇEØÇEÜ HÇEàH‹èŽH‹=H5ÚŽÿÐH‹ áŽH5ÚŽL‰ÿH‰ÂÿÑ„Àtx1ÿ1ö1Òè¹H‹MÐH‰AH‹üH‰E ÇE¨BÇE¬HH‰E°H€ÒH‰E¸HU H‰]ÀH‹5ÝL‰ÿÿüéÎH‰ÃH}ȾènH‰ßèlH‹?ŽH‹=èŽH51ŽÿÐH‹ 8ŽH51ŽL‰ÿH‰ÂÿÑ„ÀtH‹5††L‰ÿÿH‰ÇèEé_H‹ñH‹="H5ãÿÐH‹ êH5ãL‰ÿH‰ÂÿÑ„Àt6H‹5¨L‰ÿÿOI‰ÆH‹ŽH5ŽL‰ÿÿÐL‰÷H‰Æè„éøH‹ŠH‹=»ŽH5|ÿÐH‹ ƒH5|L‰ÿH‰ÂÿÑ„ÀtIH‹5™}L‰ÿÿèH‰ÃH‹5.H‰ßÿÕI‰ÆH‹£H5œH‰ßÿÐL‰÷H‰Æè é~H‹H‹=ŽH5ÿÐH‹ H5L‰ÿH‰ÂÿÑ„Àtc1ÿ1öè•H‹MÐH‰AH‹&H‰…xÿÿÿÇE€BÇE„HõH‰EˆH×ÐH‰EH•xÿÿÿH‰]˜H‹5aL‰ÿÿ éòH‹|ŒH‹==H5nŒÿÐH‹ uŒH5nŒL‰ÿH‰ÂÿÑ„À„½H‹WL98u¿èéšH‹4L98u 1ÿèêé‚H‹5Œ‹L‰ÿÿ£H‰ÃH5ÚsH‰ß臅ÀuH‹5n‹L‰ÿÿ}H‰Çè1ëBH5¯sH‰ßèZ…ÀuH‹5I‹L‰ÿÿPH‰ÇèæëH‹57‹L‰ÿÿ6è½H‹MÐH‰AH‹EÐH‹XH}Ⱦè›H‰ØHƒÄx[A^A_]ÃUH‰åAWAVSPI‰öI‰ÿH‹5¶ŠH‰×ÿåH‰ÃH…Ûu HƒÄ[A^A_]ÃI‹G H‹@L‹xH‹5ŸƒL‰÷ÿ¶L‰ÿH‰ÆH‰Úè.H‰ßHƒÄ[A^A_]é@fffff.„UH‰åHƒÇ H‹v º]éóf„UH‰åH‹ ¾]éÝUH‰åAVSI‰þH‹ ŠH‰÷H‰Æÿ8H‰ÃH…Ûu[A^]ÃI‹F H‹@H‹xHÇÆÿÿÿÿH‰Úè<H‰ß[A^]é®fff.„UH‰åHƒÇ H‹v º]écf„UH‰åH‹ ¾]éMUH‰åAWAVSP1ÿèÊI‰ÆM…öu L=Õ¤ëEH‹5¬€H‹•L‰÷ÿÓH5Á‰H‰Çÿ¸‰I‰ÇL‰÷èÝH>¾H‹5‡zL‰ÿÿÓ„ÀuL‰øHƒÄ[A^A_]ÃL5!ŠL‰ÿL‰öÿŠH‰ÃH=¾L‰öÿŠH)ÃH‹5XL‰ÿH‰ÚHƒÄ[A^A_]ÿ% ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ% ÿ%"ÿ%$ÿ%&ÿ%(ÿ%*ÿ%,ÿ%.ÿ%0ÿ%2ÿ%4ÿ%6ÿ%8ÿ%:ÿ%<ÿ%>ÿ%@ÿ%Bÿ%Dÿ%Fÿ%Hÿ%Jÿ%Lÿ%Nÿ%Pÿ%Rÿ%Tÿ%Vÿ%Xÿ%Zÿ%\ÿ%^ÿ%`ÿ%bÿ%dÿ%fÿ%hÿ%jÿ%lÿ%nÿ%pÿ%rÿ%tÿ%vÿ%xÿ%zÿ%|ÿ%~ÿ%€ÿ%‚ÿ%„ÿ%†ÿ%ˆÿ%Šÿ%Œÿ%Žÿ%ÿ%’ÿ%”ÿ%–ÿ%˜ÿ%šÿ%œÿ%žÿ% ÿ%¢ÿ%¤ÿ%¦ÿ%¨ÿ%ªÿ%¬ÿ%®ÿ%°ÿ%²ÿ%´ÿ%¶ÿ%¸ÿ%ºÿ%¼ÿ%¾ÿ%Àÿ%Âÿ%Äÿ%Æÿ%Èÿ%Êÿ%Ìÿ%Îÿ%Ðÿ%Òÿ%Ôÿ%Öÿ%Øÿ%Úÿ%Üÿ%Þÿ%àÿ%âÿ%äÿ%æÿ%èÿ%êÿ%ìÿ%îÿ%ðÿ%òÿ%ôÿ%öÿ%øÿ%úÿ%üÿ%þÿ%ÿ%ÿ%ÿ%ÿ%ÿ% ÿ% ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ% ÿ%"ÿ%$ÿ%&ÿ%(ÿ%*ÿ%,ÿ%.ÿ%0ÿ%2ÿ%4ÿ%6ÿ%8ÿ%:ÿ%<ÿ%>ÿ%@ÿ%Bÿ%Dÿ%Fÿ%Hÿ%Jÿ%Lÿ%Nÿ%Pÿ%Rÿ%Tÿ%Vÿ%XhéVhéLh,éBhBé8h^é.h{é$hŠéhšéh²éhÉéühâéòhúéèhéÞh*éÔhRéÊhpéÀh’é¶h°é¬hÅé¢hßé˜hñéŽh é„hBézhbéphzéfh é\h¶éRhËéHhæé>hé4hé*h5é hMéh`é hpéh†éøhªéîhÁéähÏéÚhßéÐhôéÆh é¼h é²h.é¨hZéžhté”h‘éŠhºé€hÌévhôélhébh#éXh9éNhIéDheé:h†é0h§é&hÁéhÚéhüéhéþh8éôhNéêhkéàhéÖh¡éÌh¼éÂhÙé¸h÷é®hé¤héšh1éhGé†h`é|hoérh|éhh‹é^h˜éTh¦éJh¶é@hÍé6hðé,hé"h0éhIéhaéhyéúh˜éðh·éæhØéÜh éÒh- éÈhO é¾hh é´h~ éªh” é h¢ é–h° éŒh½ é‚hÒ éxhæ énhü édh éZh% éPh8 éFhL é<h[ é2ho é(h éh éhŸ é h® éh½ éöhÊ éìhå éâhþ éØh éÎh6 éÄhM éºhn é°h‡ é¦h¢ éœh½ é’hÖ éˆhã é~hð éthý éjh é`h éVh. éLh? éBhN é8h] é.hl é$hz éh’ éh« éhÇ éühã éòhû éèh éÞh4 éÔhR éÊhv éÀhŸ é¶h· é¬hÖ é¢hò é˜héŽh-é„hNézhpéph’éfh³é\hÍéRhêéHhÿé>hé4h4é*hHé hbéh„é hžéLñASÿ%áallocinitdefaultCenterreleaseretainbestRegistrationDictionaryautorelease_applicationNameForGrowlSearchingRegistrationDictionary:_applicationIconDataForGrowlSearchingRegistrationDictionary:_growlIsReady:addObserver:selector:name:object:processInfoprocessIdentifierinitWithFormat:growlNotificationWasClicked:respondsToSelector:removeObserver:name:object:growlNotificationTimedOut:reregisterGrowlNotificationsnotifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:identifier:initWithObjectsAndKeys:setObject:forKey:numberWithInteger:numberWithBool:notifyWithDictionary:_growlIsReachableUpdateCache:notificationDictionaryByFillingInDictionary:canCreateConnectioninitWithDictionary:setDelegate:attemptsaddObject:setNextAttempt:beginregisterWithDictionary:isMistEnabled_fireMiniDispatch:valueForKey:indexOfObject:classisKindOfClass:containsIndex:countobjectAtIndex:numberWithUnsignedInteger:containsObject:standardUserDefaultsboolValueisNotificationDefaultEnabled:growlDelegatedisplayNotification:registrationDictionaryByFillingInDictionary:setApplicationName:registrationDictionaryForGrowlmainBundlepathForResource:ofType:dictionaryWithContentsOfFile:bundlePathregistrationDictionaryFromDelegateregistrationDictionaryFromBundle:registrationDictionaryByFillingInDictionary:restrictToKeys:mutableCopyobjectForKey:bundleURLremoveObjectForKey:initWithInt:applicationNameForGrowlprocessNameapplicationIconForGrowlapplicationIconDataForGrowlPNGRepresentationsharedWorkspaceiconForFile:userInfodraincountByEnumeratingWithState:objects:count:growlIsReadypostNotificationName:object:userInfo:_emptyQueueisGrowlRunning_checkSandboxrunningApplicationsWithBundleIdentifier:absoluteStringrangeOfString:options:bundleIdentifierstringWithFormat:hasSuffix:hasNetworkClientEntitlementattemptTypenextAttemptremoveObject:dictionarysetGrowlDelegate:notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:setShouldUseBuiltInNotifications:shouldUseBuiltInNotificationsisGrowlInstalledsetWillRegisterWhenGrowlIsReady:willRegisterWhenGrowlIsReadyframeworkInfoDictionaryattemptDidSucceed:attemptDidFail:finishedWithAttempt:queueAndReregister:notificationClicked:context:notificationTimedOut:context:setRegistrationDictionaryForGrowl:deallocinitWithAllNotifications:defaultNotifications:setApplicationNameForGrowl:setApplicationIconDataForGrowl:registrationDictionarylaunchDatecompare:bundleWithURL:bundleForProcessWithBundleIdentifier:bundleWithIdentifier:runningHelperAppBundlestringByDeletingLastPathComponentpathExtensionlowercaseStringisEqualToString:bundleWithPath:defaultManagerstringByAppendingPathComponent:fileExistsAtPath:compare:options:enumeratorAtPath:nextObjectskipDescendentsarrayWithCapacity:isWritableFileAtPath:fileExistsAtPath:isDirectory:searchPathForDirectory:inDomains:mustBeWritable:createDirectoryAtPath:withIntermediateDirectories:attributes:error:growlSupportDirectorynextScreenshotNameInDirectory:screenshotsDirectorycontentsOfDirectoryAtPath:error:initWithCapacity:stringByDeletingPathExtensionticketsDirectorystringByAppendingPathExtension:growlPrefPaneBundlehelperAppBundlesearchPathForDirectory:inDomains:nextScreenshotNamedefaultSavePathForTicketWithApplicationName:byteslengthinitFileURLWithPath:isDirectory:intValuegetFileSystemRepresentation:maxLength:setValue:forKey:numberWithInt:sizeadjustSizeToDrawAtSize:setScalesWhenResized:currentContextsetImageInterpolation:drawInRect:fromRect:operation:fraction:bestRepresentationForSize:setSize:representationOfSize:representationsbestRepresentationForRect:context:hints:bestRepresentationForDevice:performSelector:withObject:isBycopyreplacementObjectForPortCoder:TIFFRepresentationimageRepWithData:GrowlBitmapImageReprepresentationUsingType:properties:drawScaledInRect:operation:fraction:JPEGRepresentationmainScreenvisibleFramewindowframeenumerateObjectsUsingBlock:insertObject:atIndex:setFrame:display:fadeInarrayinsertWindow:removeObjectsInArray:applicationIconImageinitWithData:initWithNotificationTitle:text:image:sticky:userInfo:delegate:queueWindow:dequeueWindowsdelegatemistViewDismissed:animationShouldStart:animationDidStop:animationDidEnd:animation:valueForProgress:animation:didReachProgressMark:isEqual:hashsuperclassselfzoneperformSelector:performSelector:withObject:withObject:isProxyisMemberOfClass:conformsToProtocol:retainCountdescriptionmistNotificationDismissed:mistNotificationClicked:closeAllNotifications:windowsqueuedWindowsinitWithFrame:boundsbezierPathWithRoundedRect:xRadius:yRadius:defaultParagraphStylemutableCopyWithZone:setLineBreakMode:boldSystemFontOfSize:whiteColorsystemFontOfSize:initWithRect:options:owner:userInfo:addTrackingArea:removeTrackingArea:imageSizedToDimensionSquaring:flippedImagesetFrame:sizeWithAttributes:boundingRectWithSize:options:attributes:saveGraphicsStatecolorWithDeviceWhite:alpha:setfillsetLineWidth:strokedrawInRect:drawInRect:withAttributes:restoreGraphicsStatesetNeedsDisplay:mistViewSelected:modifierFlagscloseAllNotificationssetNotificationImage:isOpaqueisFlippedsizeToFitdrawRect:mouseEntered:mouseExited:mouseDown:notificationTextsetNotificationText:notificationTitlesetNotificationTitle:notificationImagenotificationTitleAttrsnotificationTitleFontnotificationTextAttrsnotificationTextFontclipPathstrokePathtrackingAreaselectedinitWithContentRect:styleMask:backing:defer:initWithWindow:setBecomesKeyOnlyIfNeeded:setHidesOnDeactivate:setCanHide:setContentView:setOpaque:clearColorsetBackgroundColor:setLevel:setCollectionBehavior:setAcceptsMouseMovedEvents:setOneShot:lifetimeExpired:scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:invalidatestopAnimationsetAlphaValue:orderFront:dictionaryWithObjectsAndKeys:arrayWithObject:initWithViewAnimations:setAnimationBlockingMode:setDuration:startAnimationorderOut:fadeOutstickyvisiblemistViewfadeAnimationlifetimeclosedinitWithSize:lockFocussetShouldAntialias:transformtranslateXBy:yBy:scaleXBy:yBy:concatunlockFocusimageSizedToDimensionScalingUp:imageSizedToDimension:stopAttemptsfinishedstoppedAttempts:makeNextAttemptOfClass:queueAndReregistersucceededfailederrorsetError:fileURLWithPath:substringToIndex:dataFromPropertyList:format:errorDescription:writeToFile:atomically:dataUsingEncoding:applicationNameobjectconnectionWithRegisteredName:host:connectionDidDie:rootProxyregisterApplicationWithDictionary:postNotificationWithDictionary:growlVersionsetProtocolForProxy:growlProxygrowlConnectionoutgoingPacketOfType:forDict:packetexpectsCallbacksynchronouslySetDelegate:setResponseParseErrorString:setBogusResponse:initWithDelegate:delegateQueue:hostisLocalHostconnectToHost:onPort:withTimeout:error:CRLFDatadataWithData:appendData:copyreadDataToData:withTimeout:tag:initWithPassword:hashAlgorithm:encryptionAlgorithm:setKey:writeToSocket:readOneLineFromSocket:tag:initWithData:encoding:componentsSeparatedByString:couldNotParseResponseWithReason:responseString:disconnectwhitespaceAndNewlineCharacterSetstringByTrimmingCharactersInSet:readRestOfPacket:headerItemFromData:error:separatorHeaderItemparseErrorparseFeedbackheaderNameheaderValueintegerValuecaseInsensitiveCompare:propertyListWithData:options:format:error:coderesponseParseErrorStringdictionaryWithObject:forKey:errorWithDomain:code:userInfo:socket:didConnectToHost:port:socket:didReadData:withTag:socketDidDisconnect:withError:bogusResponsesetHost:passwordsetPassword:callbackHeaderItemssetCallbackHeaderItems:connectionsetConnection:socketcallbackTypeattemptSucceededresponseReadTypeinitWithLength:increaseLengthBy:mutableBytesinitWithData:startOffset:maxLength:timeout:readLength:terminator:tag:ensureCapacityForAdditionalDataOfLength:optimalReadLengthWithDefault:shouldPreBuffer:readLengthForNonTermWithHint:readLengthForTermWithHint:shouldPreBuffer:readLengthForTermWithPreBuffer:found:searchForTermAfterPreBuffering:bufferstartOffsetbytesDonemaxLengthtimeoutreadLengthtermbufferOwneroriginalBufferLengthtaginitWithData:timeout:tag:initWithTLSSettings:tlsSettingsinitWithDelegate:delegateQueue:socketQueue:closeWithError:setDelegate:synchronously:setDelegateQueue:synchronously:setDelegate:delegateQueue:synchronously:acceptOnInterface:port:error:errnoErrorWithReason:badConfigError:isDisconnectedremoveAllObjectsgetInterfaceAddress4:address6:fromDescription:port:badParamError:localPort4doAccept:dataWithBytes:length:newSocketQueueForConnectionFromAddress:onSocket:setupReadAndWriteSourcesForNewlyConnectedSocket:socket:didAcceptNewSocket:connectToHost:onPort:viaInterface:withTimeout:error:preConnectWithInterface:error:lookup:host:port:startConnectTimeout:connectToAddress:viaInterface:withTimeout:error:connectWithAddress4:address6:error:UTF8StringgaiError:lookup:didFail:lookup:didSucceedWithAddress4:address6:otherError:endConnectTimeoutportFromAddress:didConnect:didNotConnect:error:connectedHostconnectedPortmaybeDequeueReadmaybeDequeueWritedoConnectTimeoutconnectTimeoutErrorendCurrentReadendCurrentWritesetLength:resumeReadSourceresumeWriteSourcemaybeClosestringWithCString:encoding:stringWithUTF8String:localizedStringForKey:value:table:connectedHostFromSocket4:connectedHostFromSocket6:connectedPortFromSocket4:connectedPortFromSocket6:localHostFromSocket4:localHostFromSocket6:localPortFromSocket4:localPortFromSocket6:hostFromAddress4:hostFromAddress6:portFromAddress4:portFromAddress6:initWithBytes:length:doReadDatadoReadEOFdoWriteDatareadDataWithTimeout:buffer:bufferOffset:maxLength:tag:readDataToLength:withTimeout:buffer:bufferOffset:tag:readDataToData:withTimeout:buffer:bufferOffset:maxLength:tag:removeObjectAtIndex:maybeStartTLSsetupReadTimerWithTimeout:usingCFStreamsuspendReadSourcecontinueSSLHandshakereplaceBytesInRange:withBytes:length:readMaxedOutErrorsslError:appendBytes:length:completeCurrentReadsocket:didReadPartialDataOfLength:tag:connectionClosedErrorsocketDidCloseReadStream:dataWithBytesNoCopy:length:freeWhenDone:doReadTimeoutsocket:shouldTimeoutReadWithTag:elapsed:bytesDone:doReadTimeoutWithExtension:readTimeoutErrorsetupWriteTimerWithTimeout:suspendWriteSourcecompleteCurrentWritesocket:didWritePartialDataOfLength:tag:socket:didWriteDataWithTag:doWriteTimeoutsocket:shouldTimeoutWriteWithTag:elapsed:bytesDone:doWriteTimeoutWithExtension:writeTimeoutErrorsslReadWithBuffer:length:sslWriteWithBuffer:length:shortValuesocketDidSecure:getHost:port:fromAddress:hostFromAddress:CRDataLFDataZeroDatainitWithSocketQueue:delegateQueuesetDelegateQueue:synchronouslySetDelegateQueue:getDelegate:delegateQueue:setDelegate:delegateQueue:synchronouslySetDelegate:delegateQueue:autoDisconnectOnClosedReadStreamsetAutoDisconnectOnClosedReadStream:isIPv4EnabledsetIPv4Enabled:isIPv6EnabledsetIPv6Enabled:isIPv4PreferredOverIPv6setPreferIPv4OverIPv6:userDatasetUserData:acceptOnPort:error:connectToHost:onPort:error:connectToAddress:error:connectToAddress:withTimeout:error:disconnectAfterReadingdisconnectAfterWritingdisconnectAfterReadingAndWritingerrnoErrorisConnectedlocalHostlocalPortconnectedHost4connectedHost6connectedPort4connectedPort6localHost4localHost6localPort6connectedAddresslocalAddressisIPv4isIPv6readDataWithTimeout:tag:readDataWithTimeout:buffer:bufferOffset:tag:readDataToLength:withTimeout:tag:readDataToData:withTimeout:buffer:bufferOffset:tag:readDataToData:withTimeout:maxLength:tag:writeData:withTimeout:tag:startTLS:performBlock:socketFDsocket4FDsocket6FDsslContextflagsconfigconnectIndexconnectInterface4connectInterface6socketQueueaccept4Sourceaccept6SourceconnectTimerreadSourcewriteSourcereadTimerwriteTimerreadQueuewriteQueuecurrentReadcurrentWritesocketFDBytesAvailablepartialReadBuffersslReadBuffersslWriteCachedLengthinitWithAction:actionencryptionkeystringByAppendingFormat:stringByAppendingString:GNTPRepresentationAsStringinitialHeaderItemWithAction:GNTPRepresentationsetAction:setEncryption:mActionmEncryptionmKeyconnectionTypeendHeaderItemsetConnectionType:_connectionTypeoutgoingPacketsetGrowlDictionary:getHeaders:binaryChunks:notificationID:forNotificationDict:setPacketID:getHeaders:andBinaryChunks:forRegistrationDict:addHeaderItems:addBinaryChunks:dictionaryRepresentationobjectForInfoDictionaryKey:generateSaltgenerateKeyaddObjectsFromArray:encryptionAlgorithmdataencrypt:identifierchunkForData:withIdentifier:outgoingItemscallbackResultSendBehaviorForHeaders:stringappendFormat:appendString:outgoingPacketForNotification:outgoingPacketForRegistrationWithNotifications:addHeaderItem:addBinaryChunk:packetIDneedsPersistentConnectionForCallbackgrowlDictionaryheaderItemssetHeaderItems:binaryChunksinitForData:error:setHeaders:headers_headerssetHeaderName:setHeaderValue:isEqualToData:substringWithRange:headerItemWithName:value:initWithData:identifier:setData:setIdentifier:stringThatPrecedesTheDatastringThatFollowsTheDataidentifierForBinaryData:_data_identifierinitWithCalendarIdentifier:setFirstWeekday:defaultTimeZonesetTimeZone:makeCalendarWithDesiredConfigurationdateComponentsFromString:timeZone:dateComponentsFromString:timeZone:range:datecomponents:fromDate:parsesStrictlytimeSeparatoryearmonthdaytimeZoneWithAbbreviation:numberWithDouble:timeZoneForSecondsFromGMT:setYear:setDay:setHour:setMinute:setSecond:setMonth:dateFromString:timeZone:dateFromString:timeZone:range:dateFromComponents:dateFromString:stringWithCharacters:length:replaceOccurrencesOfString:withString:options:range:stringFromDate:timeZone:formatstringFromDate:formatString:timeZone:weekDateStringForDate:timeZone:raise:format:replaceColonsInString:withTimeSeparator:setFormatterBehavior:setDateFormat:setCalendar:stringForObjectValue:secondsFromGMTstringFromDate:components:fromDate:toDate:options:weekdayinitializepurgeGlobalCachessetDefaultTimeZone:dateComponentsFromString:getObjectValue:forString:errorDescription:setParsesStrictly:setFormat:includeTimesetIncludeTime:setTimeSeparator:lastUsedFormatStringunparsingFormatterparsingCalendarunparsingCalendarsetResponseAction:receivedHeaderItem:callbackResultSendBehaviorresponseActionlocalHostNamebundleForClass:infoDictionarypacketDidFinishReading:packetDidDisconnect:packet:failedReadingWithError:packet:willChangePacketIDFrom:to:addSentAndReceivedHeadersFromDict:toArray:mDelegatecustomHeadersbinaryDataByIdentifierpendingBinaryIdentifierscurrentBinaryIdentifiercurrentBinaryLengthspecificPacketoriginPacketwasInitiatedLocallynetworkReadCompletesetWithArray:unsignedIntegerValuecurrentStepregistrationDictnotificationscurrentNotificationapplicationIconIDmApplicationIconURLnumberOfNotificationsdataWithPropertyList:format:options:error:notificationDicticonIDiconURLcallbackTargetMethodsetErrorDescription:setErrorCode:errorDescriptionerrorCodearrayWithObjects:isSupportedEncryptionAlgorithm:isSupportedHashAlgorithm:setHashAlgorithm:setEncryptionAlgorithm:generateSalt:setSalt:salthashAlgorithmsetEncryptionKey:setKeyHash:generateIVsetIV:keyHashIVhashAlgorithmStringencryptionAlgorithmStringencryptionAlgorithmFromString:hashingAlgorithmFromString:decrypt:encryptionKey_hashAlgorithm_encryptionAlgorithm_password_salt_encryptionKey_keyHash_ivXPCBundleIDestablishConnectionpurposesendMessageWithPurpose:handleReply:xpcObjectToNSObject:newXPCObjectxpcConnectionnotificationUuiddictionaryWithCapacity:enumerateKeysAndObjectsUsingBlock:objCTypeunsignedLongValuelongValuedoubleValue%@GrowlApplicationBridge: Cannot register because the application name was not supplied and could not be determinedLend Me Some Sugar; I Am Your Neighbor!%@-%d-%@GrowlClicked!%@-%@GrowlTimedOut!NotificationNameNotificationTitleNotificationDescriptionNotificationIconNotificationClickContextNotificationPriorityNotificationStickyGrowlNotificationIdentifierv8@?0DefaultNotificationsAllNotificationscom.growl.growlframework.mist.enabledcom.growl.growlframework.mist.defaultonlyAttempting to register while an attempt is already runningGrowl Registration TicketgrowlRegDictGrowlApplicationBridge: The bundle at %@ contains a registration dictionary, but it is not a valid property list. Please tell this application's developer.GrowlApplicationBridge: The Growl delegate did not supply a registration dictionary, and the app bundle at %@ does not have one. Please tell this application's developer.ApplicationNameApplicationIconAppLocationfile-dataApplicationIdApplicationPIDcom.growl.growlframeworkClickedContextcom.Growl.GrowlHelperAppGrowl.prefpane/Contents/Resources%@ could not reach Growl, You are running Growl version 1.2.2 or older, and %@ is sandboxed%@ could not reach Growl, %@ is sandboxed and does not have the ability to talk to Growl, contact the developer to resolve thisContainers/%@/DataFailed all attempts at %@notifyingregisteringapplicationNameForGrowlT@"NSString",&,VapplicationNameForGrowlapplicationIconDataForGrowlT@"NSData",&,VapplicationIconDataForGrowlregistrationDictionaryForGrowlT@"NSDictionary",&,VregistrationDictionarycom.growl.prefpanelprefpanePreferencePanesGrowl.prefPaneprefPaneScreenshotsTicketsPluginsERROR: GrowlPathUtil was asked for directory 0x%x, but it doesn't know what directory that is. Please tell the Growl developers.Application Support/GrowlScreenshot %llugrowlTicket_CFURLAliasData_CFURLString_CFURLStringTypeWARNING: createFileURLWithAliasData called with NULL aliasDatain createFileURLWithAliasData: Could not allocate an alias handle from %lu bytes of alias data (data follows) because PtrToHand returned %li %@in createFileURLWithAliasData: Could not resolve alias (alias data follows) because FSResolveAlias returned %li - will try path %@in createFileURLWithAliasData: FSCopyAliasInfo returned a NULL pathfilein createAliasDataForURL: FSNewAlias for %@ returned %liin createDockDescriptionWithURL: Cannot copy Dock description for a NULL URLBundlePathNo screen real estate left, putting in queuev32@?0@8Q16^c24NotificationAppIcondelegateT@,N,VdelegatenotificationTitleT@"NSString",&,N,VnotificationTitlenotificationTextT@"NSString",&,N,VnotificationTextnotificationImageT@"NSImage",&,N,VnotificationImagestickyTc,R,N,VstickyvisibleTc,R,N,VvisibleselectedTc,R,N,VselecteduserInfoT@,R,N,VuserInfodictionaryT@"NSDictionary",R,N,VdictionaryattemptTypeTQ,R,N,VattemptTypenextAttemptT@"GrowlCommunicationAttempt",&,N,VnextAttemptT@"",N,VdelegateerrorT@"NSError",&,N,Verror%@-%u-%@GrowlApplicationBridge: Error writing registration dictionary at %@GrowlApplicationBridge: Error writing registration dictionary at %@: %@GrowlApplicationBridge: Registration dictionary follows %@%@: Could not create open-document event to register this application with Growl%@: Could not set direct object of open-document event to register this application with Growl because AEStreamWriteKeyDesc returned %li/%s%@: Could not finish open-document event to register this application with Growl because AEStreamClose returned %li/%s%@: Could not send open-document event to register this application with Growl because AESend returned %li/%sapplicationNameT@"NSString",C,N,VapplicationNameGrowlApplicationBridgePathwayReceived a fake GrowlApplicationBridgePathway object. Some other application is interfering with Growl, or something went horribly wrong. Please file a bug report.GrowlApplicationBridge: exception while sending notification: %@%@ failed because %@localhostFailed to connect: %@ Not enough, or too many components in initial headerGNTP/1.0Response from Growl or other notification system was patent nonsenseWe shouldn't have encryption on a response from localhostUnrecognized response type: %@Error-CodeError-DescriptionFailed to notify due to missing registration, queue and reregisterNo error code, assuming failedPListGot disconnected: %@hostT@"NSString",&,N,VhostpasswordT@"NSString",&,N,VpasswordconnectionT^{_xpc_connection_s=},N,VconnectioncallbackHeaderItemsT@"NSArray",&,N,VcallbackHeaderItemsresponseParseErrorStringT@"NSString",&,N,VresponseParseErrorStringbogusResponseT@"NSString",&,N,VbogusResponseGCDAsyncSocketExceptionGCDAsyncSocketErrorDomainGCDAsyncSocketSSLCipherSuitesGCDAsyncSocketSSLDiffieHellmanParametersError in socket() functionError enabling non-blocking IO on socket (fcntl)Error enabling address reuse (setsockopt)Error in bind() functionError in listen() functioni20@?0i8@12Attempting to accept without a delegate. Set a delegate first.Attempting to accept without a delegate queue. Set a delegate queue first.Both IPv4 and IPv6 have been disabled. Must enable at least one protocol first.Attempting to accept while connected or accepting connections. Disconnect first.Unknown interface. Specify valid interface by name (e.g. "en1") or IP address.IPv4 has been disabled and specified interface doesn't support IPv6.IPv6 has been disabled and specified interface doesn't support IPv4.Attempting to connect without a delegate. Set a delegate first.Attempting to connect without a delegate queue. Set a delegate queue first.Attempting to connect while connected or accepting connections. Disconnect first.A valid IPv4 or IPv6 address was not givenIPv4 has been disabled and an IPv4 address was passed.IPv6 has been disabled and an IPv6 address was passed.loopback%huIPv4 has been disabled and DNS lookup found no IPv6 address.IPv6 has been disabled and DNS lookup found no IPv4 address.Error in connect() functionkCFStreamErrorDomainNetDBError code definition can be found in Apple's SecureTransport.hkCFStreamErrorDomainSSLGCDAsyncSocketConnectTimeoutErrorAttempt to connect to host timed outGCDAsyncSocketGCDAsyncSocketReadMaxedOutErrorRead operation reached set maximum lengthGCDAsyncSocketReadTimeoutErrorRead operation timed outGCDAsyncSocketWriteTimeoutErrorWrite operation timed outGCDAsyncSocketClosedErrorSocket closed by remote peer:Error in read() functionError in write() functionError in SSLNewContextError in SSLSetIOFuncsError in SSLSetConnectionError in SSLSetPeerDomainNameError in SSLSetAllowsAnyRootError in SSLSetAllowsExpiredRootsError in SSLSetEnableCertVerifyError in SSLSetAllowsExpiredCertsError in SSLSetCertificateError in SSLSetEnabledCiphersError in SSLSetDiffieHellmanParams GNTP/1.0 %@ %@ %@actionT@"NSString",&,VmActionencryptionT@"NSString",&,VmEncryptionkeyT@"NSString",&,VmKeyGNTP/1.0 END %s%sconnectionTypeTq,V_connectionTypeThis shouldn't happen; outgoingPacketOfType called with GrowlGNTPOutgoingPacket_OtherTypename<%@: %x: "Binary chunk %@, length %d ">T@"GNTPKey",&,VmKeygrowlDictionaryT@"NSDictionary",&,VgrowlDictionaryheaderItemsT@"NSMutableArray",&,VheaderItemsNONEMD5SHA1SHA256SHA512AESDES3DESCLICKEDCLOSEDTIMEDOUTCLICKCLOSETIMEOUTREGISTERNOTIFYSUBSCRIBE-OK-ERROR-CALLBACKApplication-NameApplication-IconNotifications-CountNotification-NameNotification-Display-NameNotification-EnabledNotification-IconNotification-IDNotification-TitleNotification-TextNotification-StickyNotification-PriorityNotification-Callback-ContextNotification-Callback-Context-TypeNotification-Callback-TargetSubscriber-IDSubscriber-NameSubscriber-PortSubscription-TTLNotification-Callback-ResultNotification-Callback-TimestampOrigin-Machine-NameOrigin-Software-NameOrigin-Software-VersionOrigin-Platform-NameOrigin-Platform-VersionX-X-Application-BundleIDX-Application-PIDData-headersT@"NSData",&,V_headers: GrowlNetworkMalformed header "%@"; "name: value" not found%@: %@ <%@ %p: name=%@, value=%@>Identifier: %@ Length: %lu %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02xdataT@"NSData",&,V_dataidentifierT@"NSString",&,V_identifier(%@) parsing month; segment is %lu and ch is %s(%@) found %lu digits and one hyphen, so this is either -YY or -YY-MM; segment (year) is %lu(%@) month is %luUTCyyyy-MM-ddyyyy-DDDself.format was %d, not calendar (%d), week (%d), or ordinal (%d)'T'%@HH:mm:ssZ%+.2d%.2dHH:mm:ssZ%lu-W%02lu-%02lu%@defaultTimeZoneT@"NSTimeZone",&,N,VdefaultTimeZoneparsesStrictlyTc,VparsesStrictlyformatTQ,VformatincludeTimeTc,VincludeTimetimeSeparatorTS,VtimeSeparatorResponse-ActionresponseActionT@"NSString",&,N,VresponseActionGNTP Notification Received HeadersReceivedGNTP Notification Sent-ByFrom %@ by %@ with Growl%@; %@Growl Internal Notification ID id %@Sent-ByGNTP Origin-Machine-Name%lu.%lu.%luGrowlGrowl.frameworkMac OS XT@"",VmDelegatex-growl-resource://%@Bogus default notifications array from application %@: %@ contains indexes that are outside the range of all-notifications array %@HumanReadableNames%iYesnoNotification-Callback-Target-MethodGETPOSTNotification-Coalescing-IDNoNotificationCallbackClickContextTypeStringError creating PList XML: %@NotificationCallbackURLTargetNotificationCallbackURLTargetMethodGNTP Origin-Software-NameGNTP Origin-Software-VersionGNTP Origin-Platform-NameGNTP Origin-Platform-VersinUnable to obtain system version: %lderrorDescriptionT@"NSString",&,N,VerrorDescriptionerrorCodeTq,N,VerrorCode%02x%@:%@.%@%@%@:%@hashAlgorithmTi,V_hashAlgorithmencryptionAlgorithmTi,V_encryptionAlgorithmencryptionKeyT@"NSData",&,V_encryptionKeykeyHashT@"NSData",&,V_keyHashT@"NSString",&,V_passwordsaltT@"NSData",&,V_saltIVT@"NSData",&,V_iv%@.GNTPClientServiceContents/XPCServices/%@xpcerehwonConnection Invalid error for XPC service (%@)Unexpected error for XPC servicev16@?0^v8GrowlActionTypereregisterfeedbackClickedContextstoppedAttemptsfinishedAttemptSuccessFailed with code %ld, "%@"notificationGrowlDictTypeGrowlDictregistrationB24@?0r*8^v16B24@?0Q8^v16v32@?0@8@16^c24Qq.local1GrowlApplicationBridgeGrowlDelegateGrowlApplicationBridgeDelegateGrowlPathUtilitiesGrowlImageAdditions62GrowlMiniDispatchNSAnimationDelegateNSObjectGrowlMistViewˆGrowlMistWindowControllerGrowlAdditionsGrowlCommunicationAttemptGrowlApplicationBridgeRegistrationAttemptGrowlNotificationProtocolGrowlApplicationBridgeNotificationAttemptGrowlGNTPRegistrationAttemptGrowlGNTPNotificationAttempt3GrowlGNTPCommunicationAttemptGrowlGCDAsyncReadPacketQ0GrowlGCDAsyncWritePacket0GrowlGCDAsyncSpecialPacket12AP535 @24GrowlGCDAsyncSocket2„GrowlGNTPInitialHeaderItemGNTPOutgoingItemGrowlGNTPEndHeaderItemGrowlGNTPOutgoingPacketGrowlGNTPEncryptedHeadersGrowlGNTPHeaderItemGrowlGNTPBinaryChunkGrowlISO8601DateFormatter GrowlOkGNTPPacket GrowlGNTPPacketGrowlGNTPPacketDelegate GrowlRegisterGNTPPacket GrowlNotificationGNTPPacket GrowlErrorGNTPPacket GNTPKeyGrowlXPCCommunicationAttemptGrowlXPCNotificationAttemptGrowlXPCRegistrationAttemptNSObject_XPCHelpersGrowlNetworkUtilities@16@0:8v24@0:8@16v64@0:8@16@24@32@40i48c52@56v72@0:8@16@24@32@40i48c52@56@64c24@0:8@16c16@0:8v20@0:8c16v16@0:8@24@0:8@16@32@0:8@16@24c20@0:8c16v32@0:8@16@24@"NSDictionary"@"NSString"@"NSData"@32@0:8i16Q20c28@28@0:8i16Q20v64@0:8{CGRect={CGPoint=dd}{CGSize=dd}}16Q48d56{CGSize=dd}32@0:8{CGSize=dd}16@32@0:8{CGSize=dd}16f28@0:8@16f24v28@0:8@16f24Q16@0:8#16@0:8^{_NSZone=}16@0:8@24@0:8:16@32@0:8:16@24@40@0:8:16@24@32c24@0:8#16c24@0:8:16Vv16@0:8@"NSMutableArray"@@48@0:8{CGRect={CGPoint=dd}{CGSize=dd}}16v48@0:8{CGRect={CGPoint=dd}{CGSize=dd}}16@"NSImage"@"NSFont"@"NSBezierPath"@"NSTrackingArea"c@60@0:8@16@24@32c40@44@52@"GrowlMistView"@"NSViewAnimation"@"NSTimer"@20@0:8i16@24@0:8#16Q@"GrowlCommunicationAttempt"@""@"NSError"c24@0:8O@16Vv24@0:8O@16O@16@0:8@"NSConnection"@"NSProxy"v32@0:8@16q24v36@0:8@16@24S32v40@0:8@16@24q32^{_xpc_connection_s=}16@0:8v24@0:8^{_xpc_connection_s=}16@"GrowlGNTPOutgoingPacket"@"GrowlGCDAsyncSocket"i^{_xpc_connection_s=}@72@0:8@16Q24Q32d40Q48@56q64v24@0:8Q16Q32@0:8Q16^c24Q24@0:8Q16Q32@0:8@16^c24q24@0:8q16@"NSMutableData"dq@40@0:8@16d24q32@24@0:8^{sockaddr_in=CCS{in_addr=I}[8c]}16@24@0:8^{sockaddr_in6=CCSI{in6_addr=(?=[16C][8S][4I])}I}16S24@0:8^{sockaddr_in=CCS{in_addr=I}[8c]}16S24@0:8^{sockaddr_in6=CCSI{in6_addr=(?=[16C][8S][4I])}I}16S24@0:8@16c40@0:8^@16^S24@32@24@0:8^{dispatch_queue_s=}16@32@0:8@16^{dispatch_queue_s=}24@40@0:8@16^{dispatch_queue_s=}24^{dispatch_queue_s=}32v28@0:8@16c24^{dispatch_queue_s=}16@0:8v28@0:8^{dispatch_queue_s=}16c24v24@0:8^{dispatch_queue_s=}16v32@0:8^@16^^{dispatch_queue_s}24v36@0:8@16^{dispatch_queue_s=}24c32v32@0:8@16^{dispatch_queue_s=}24c28@0:8S16^@20c36@0:8@16S24^@28c20@0:8i16c32@0:8@16^@24c44@0:8@16S24d28^@36c52@0:8@16S24@28d36^@44c40@0:8@16d24^@32c48@0:8@16@24d32^@40v32@0:8i16@20S28v36@0:8i16@20@28v28@0:8i16@20c40@0:8@16@24^@32v20@0:8i16v24@0:8d16S16@0:8S20@0:8i16v44@0:8^@16^@24@32S40v32@0:8d16q24v48@0:8d16@24Q32q40v56@0:8d16@24Q32Q40q48v40@0:8Q16d24q32v56@0:8Q16d24@32Q40q48v40@0:8@16d24q32v56@0:8@16d24@32Q40q48v48@0:8@16d24Q32q40v64@0:8@16d24@32Q40Q48q56i32@0:8^v16^Q24i32@0:8r^v16^Q24v24@0:8@?16i16@0:8^{SSLContext=}16@0:8S^{dispatch_queue_s=}^{dispatch_source_s=}@"GrowlGCDAsyncReadPacket"@"GrowlGCDAsyncWritePacket"^{SSLContext=}q16@0:8v24@0:8q16@28@0:8i16@20@"GNTPKey"@32@0:8@16^@24@32@0:8@16o^@24@40@0:8@16o^@24o^{_NSRange=QQ}32c40@0:8^@16@24^@32@28@0:8@16S24@40@0:8@16@24@32v20@0:8S16@"NSDateFormatter"@"NSCalendar"@"NSTimeZone"i24@0:8@16v40@0:8@16@24@32@""@"NSMutableDictionary"@"NSMutableSet"@"GrowlGNTPPacket"v40@0:8^@16^@24@32@"NSURL"v48@0:8^@16^@24^@32@40@32@0:8@16i24i28v24@0:8^v16^v16@0:8@24@0:8^v16à?à¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$À$@ @ð?,@(@t@ÐcAK@è?@@@@333333Ó?ð¿?.@0E°<N@š™™™™™¹?ÿ›ÐNCC(ÌEΠn5E£ëÿ›}u‰‰TÝö $&|7,cq@‹ÿ›IA))JEZ!„{ôŠÿ›¶€€4ÕO)$Fja)Ë&ÿ›œ,åLsÿ›Ã€A  ¨¦3Ù ¨åÿ›][uu €~XÖ €ß÷ €8ÿ›][:: ECX› E¤¼ EÅ8ÿ›][(( 31S„ 3¡ 3ª8ÿ›)'††ŽŒCÿ›)'††ŽŒCÿ›)'  *5ÿ›)'  *5ÿ›Ã€A¢¢ª¨3Û ªçÿ›Ã€A¢¢ª¨3Û ªçÿ›¶€€4f%®‹ ®$ÿ›¶€€4D}ÆÁ,íŸÆŒ, DH!aÑX aQQÑXQ!Q°ôlorØäßòô/_ˆtÙ˜Üteš\u|¤¨uû§äuóÍv ÑLvÏä¬v9ê wþ lwk˜wËÄwÛðwïxKdx@â¬x+íèx väLªÿ] ³ ª N g ” ­ ùn‡›ýíœÝô›˜â‰»v !¸!1"Ô"m$†$·)"*´-É-Y0m0|2Ç2û4}9â9=m=ñ=ï>p?*@Ÿ@-F H HI(JJÐJûJÇLONsN¶NäNS!T}WW Y1^_Ÿ_×b¾eÐeþf1g[hÍhvjÀjul—nSo[oo‘pq qaqOrsÕs­xéxIzÕ{ i|t|¯|º|õ|0}À}Ð}Œ~£~€Ä€ì…à‡ˆ‰@‰k‰ïŒ@ŽŽÉŽËàŠ’ñ’£“à“e”k—Зj˜´˜™a™«™L›±œà@ž€ž«žDŸ`Ÿ ŸËŸöŸ´ à  ¡K¡Ü¡0¢Ž¢¤`¤°¤é¤Ž¥ð¥0¦[¦ˆ¦N§€§À§c¨è†©°©ð©“ªóª¸«à« ¬ì#­é­ ®`®¯c¯`° °à° ±“±ð±0²[²{²³´@¶€¶«¶¼ ½S½s½¾3¾`¾Ð¾%¿—ÂÃ@ÃÃÉÃÆ?Æ<ÈÇÉpÊ ÊËe˩ˋ͠ÏÐeÐÑÓ€Ô«Ô`Õ™ÕŸÖ³Ø×Ù@ÚsÚ ÛPÛÛ»ÛÝPÞ‰ÞÑÞüß`à¡à†áäÐä~åðå#æ‚æç3ç’çèCè¢è éSéñéƒêûê5ìŒìnï=ðpð°ðÛðªñÐñò;ò~ó`ô‹ô‹õàõ öKöŽ÷pø›ø›ùðù0ú[ú“û_þ `ÿP» ¼°ðâP{Bp°Ûs C°ã SË·ññÀëà ~¾»Q($ð$)%@'k'q)P*ó*,€,Á,./@//‚0j1@2k249`:™:v;@<Õ<>`>¡>}@à@ ApAbBDPD{DºG€H¼HŽOQ»QÓQ¯R­S j´5Lá#àôõ/$ Ò  Ÿ  a %SŸAÂ/vç3uÚë6G’-ã<¡Áø+ Ý !˜!y"’#»#=5 7Š7Å7†8Ö8Á9„<–<½@TAžAMBƒBÖG:HqHºHèH­\È]+^u^r_Í_"f‹ghfh¤hšiHjäj6kÔk‡lám8n8oEo¤oÑoqDqqr±rÜríu¤váv0y¡yáyQz‘z¼zt~ñ~$´zRx $¸œýÿÿÿÿÿLA†C ,DÜœýÿÿÿÿÿ^A†C GƒŒŽ$t ¡ýÿÿÿÿÿ A†C $œï ýÿÿÿÿÿHA†C ,Ä¡ýÿÿÿÿÿ–A†C JƒŒŽ,ôu¢ýÿÿÿÿÿÈA†C MƒŒŽ$$ ¥ýÿÿÿÿÿA†C $L¥ýÿÿÿÿÿA†C $t¥ýÿÿÿÿÿA†C ,œë¤ýÿÿÿÿÿ÷A†C GƒŒŽ$̲¦ýÿÿÿÿÿ¤A†C FƒŽ$ô.§ýÿÿÿÿÿ A†C $§ýÿÿÿÿÿ A†C ,D÷¦ýÿÿÿÿÿ-A†C GƒŒŽ$tô§ýÿÿÿÿÿ A†C $œ×§ýÿÿÿÿÿA†C ,Ľ§ýÿÿÿÿÿLA†C JƒŒŽ$ôÙ©ýÿÿÿÿÿA†C $Ì©ýÿÿÿÿÿ A†C $D°©ýÿÿÿÿÿ A†C $l•©ýÿÿÿÿÿAA†C $”®©ýÿÿÿÿÿ”A†C CƒŽ$¼ªýÿÿÿÿÿ…A†C CƒŽ$äwªýÿÿÿÿÿA†C , cªýÿÿÿÿÿbA†C JƒŒŽ$<•­ýÿÿÿÿÿðA†C FƒŽ$d]¯ýÿÿÿÿÿA†C $ŒN¯ýÿÿÿÿÿ–A†C Bƒ$´¼¯ýÿÿÿÿÿAA†C CƒŽ$ÜÕ°ýÿÿÿÿÿ’A†C FƒŽ$?±ýÿÿÿÿÿ’A†C FƒŽ,,©±ýÿÿÿÿÿóA†C PƒŒŽ,\l²ýÿÿÿÿÿ$A†C GƒŒŽ$Œ`³ýÿÿÿÿÿƒA†C CƒŽ$´»´ýÿÿÿÿÿýA†C FƒŽ$ܵýÿÿÿÿÿJA†C Bƒ$²µýÿÿÿÿÿ§A†C FƒŽ$,1¶ýÿÿÿÿÿ2A†C Bƒ$T;¶ýÿÿÿÿÿ»A†C FƒŽ$|ζýÿÿÿÿÿQA†C Bƒ$¤÷¶ýÿÿÿÿÿQA†C BƒzRx ,·ýÿÿÿÿÿ A†C KƒŒŽ$Lx·ýÿÿÿÿÿyA†C GƒŽ$tÉ·ýÿÿÿÿÿA†C $œ··ýÿÿÿÿÿ A†C $į·ýÿÿÿÿÿA†C $ì·ýÿÿÿÿÿ A†C $•·ýÿÿÿÿÿA†C $<ƒ·ýÿÿÿÿÿ A†C zRx ,d·ýÿÿÿÿÿ™A†C PƒŒŽ$L͸ýÿÿÿÿÿA†C ,t¾¸ýÿÿÿÿÿ1A†C PƒŒŽ$¤¿½ýÿÿÿÿÿkA†C ,̾ýÿÿÿÿÿ€A†C PƒŒŽ$üdÁýÿÿÿÿÿA†C $$QÁýÿÿÿÿÿA†C CƒŽ$L)ÂýÿÿÿÿÿÈA†C CƒŽ$tÉÂýÿÿÿÿÿÈA†C CƒŽ$œiÃýÿÿÿÿÿA†C ,ÄUÃýÿÿÿÿÿA†C PƒŒŽ$ô4ÅýÿÿÿÿÿKA†C CƒŽzRx $?Åýÿÿÿÿÿ[A†C IƒŽ$DrÆýÿÿÿÿÿÙA†C IƒŽ,l#ÇýÿÿÿÿÿLA†C PƒŒŽ,œ?ÈýÿÿÿÿÿþA†C JƒŒŽzRx ,õÈýÿÿÿÿÿ8A†C MƒŒŽ$LýÊýÿÿÿÿÿeA†C GƒŽ,t:Ëýÿÿÿÿÿ(A†C PƒŒŽ,¤2Íýÿÿÿÿÿ A†C PƒŒŽ$ÔÎýÿÿÿÿÿVA†C GƒŽ$ü=Îýÿÿÿÿÿ,A†C $$AÎýÿÿÿÿÿ,A†C $LEÎýÿÿÿÿÿ,A†C zRx ,1ÎýÿÿÿÿÿþA†C MƒŒŽ$LÿÎýÿÿÿÿÿ9A†C $tÏýÿÿÿÿÿ:A†C zRx $ÏýÿÿÿÿÿpA†C Eƒ$D`ÏýÿÿÿÿÿJA†C Eƒ$l‚ÏýÿÿÿÿÿuA†C CƒŽzPLRx›Eq 4$¯ÏýÿÿÿÿÿŽ÷äÿÿÿÿÿÿA†C PƒŒŽ$ìÕýÿÿÿÿÿåA†C IƒŽ$ÐÖýÿÿÿÿÿ€A†C CƒŽ$<(×ýÿÿÿÿÿcA†C Bƒ,dc×ýÿÿÿÿÿ%A†C KƒŒŽ$”XØýÿÿÿÿÿhA†C FƒŽ$¼˜Øýÿÿÿÿÿ8A†C CƒŽ$ä°Øýÿÿÿÿÿ+A†C Bƒ, ³ØýÿÿÿÿÿÌA†C MƒŒŽ,<OÚýÿÿÿÿÿÄA†C GƒŒŽ,lãÚýÿÿÿÿÿÄA†C GƒŒŽ$œwÛýÿÿÿÿÿ$A†C $ÄsÛýÿÿÿÿÿCA†C Bƒ$ìŽÛýÿÿÿÿÿA†C $wÛýÿÿÿÿÿA†C zRx ,TÛýÿÿÿÿÿA†C PƒŒŽ$LAßýÿÿÿÿÿ A†C GƒŽ$t9àýÿÿÿÿÿ}A†C FƒŽ$œŽàýÿÿÿÿÿßA†C LƒŽ$ÄEãýÿÿÿÿÿA†C $ì%ãýÿÿÿÿÿ A†C $ãýÿÿÿÿÿyA†C Eƒ$<YäýÿÿÿÿÿA†C JƒŽ$dNèýÿÿÿÿÿ‡A†C CƒŽ$Œ­èýÿÿÿÿÿ„A†C CƒŽ$´ éýÿÿÿÿÿÓA†C FƒŽ$Ü´éýÿÿÿÿÿA†C $éýÿÿÿÿÿA†C $,’éýÿÿÿÿÿA†C $T{éýÿÿÿÿÿA†C $|péýÿÿÿÿÿA†C $¤YéýÿÿÿÿÿA†C $ÌBéýÿÿÿÿÿA†C zRx ,éýÿÿÿÿÿ8A†C MƒŒŽ$L'ìýÿÿÿÿÿ®A†C IƒŽ$t­ìýÿÿÿÿÿIA†C FƒŽ$œÎíýÿÿÿÿÿðA†C FƒŽ$Ä–îýÿÿÿÿÿA†C $ì€îýÿÿÿÿÿ.A†C GƒŽ$†ïýÿÿÿÿÿA†C $<zïýÿÿÿÿÿA†C $diïýÿÿÿÿÿÃA†C Bƒ$ŒðýÿÿÿÿÿgA†C Bƒ$´CðýÿÿÿÿÿA†C $Ü,ðýÿÿÿÿÿA†C $ðýÿÿÿÿÿA†C $,þïýÿÿÿÿÿA†C $TçïýÿÿÿÿÿA†C $|ÜïýÿÿÿÿÿA†C zRx ,­ïýÿÿÿÿÿ©A†C KƒŒŽ$L&ñýÿÿÿÿÿJA†C CƒŽ$tHñýÿÿÿÿÿµA†C LƒŽ,œÕòýÿÿÿÿÿ"A†C PƒŒŽ$ÌÇôýÿÿÿÿÿ¼A†C GƒŽzRx $CõýÿÿÿÿÿA†C $D#õýÿÿÿÿÿ2A†C Bƒ$l-õýÿÿÿÿÿŸA†C GƒŽ$”¤õýÿÿÿÿÿeA†C GƒŽ$¼áõýÿÿÿÿÿuA†C FƒŽ$ä.öýÿÿÿÿÿA†C $  öýÿÿÿÿÿUA†C Bƒ,49öýÿÿÿÿÿîA†C JƒŒŽ$d÷öýÿÿÿÿÿEA†C Bƒ$Œ÷ýÿÿÿÿÿUA†C Bƒ$´A÷ýÿÿÿÿÿ5A†C Bƒ$ÜN÷ýÿÿÿÿÿA†C $7÷ýÿÿÿÿÿA†C $, ÷ýÿÿÿÿÿA†C $T ÷ýÿÿÿÿÿA†C $|þöýÿÿÿÿÿA†C $¤çöýÿÿÿÿÿA†C $ÌÜöýÿÿÿÿÿA†C $ôÅöýÿÿÿÿÿA†C zRx $¢öýÿÿÿÿÿ A†C ,D…öýÿÿÿÿÿØA†C MƒŒŽ$t-ûýÿÿÿÿÿA†C $œûýÿÿÿÿÿ A†C zRx $öúýÿÿÿÿÿ A†C $DÙúýÿÿÿÿÿ¢A†C GƒŽ$lSûýÿÿÿÿÿ¾A†C CƒŽzPLRx›µc ,$ÉûýÿÿÿÿÿŒ»×ÿÿÿÿÿÿA†C FƒŽ,T%ýýÿÿÿÿÿ” ØÿÿÿÿÿÿA†C CƒŽzRx $qýýÿÿÿÿÿ A†C $DTýýÿÿÿÿÿ;A†C BƒzRx $Oýýÿÿÿÿÿ A†C $D2ýýÿÿÿÿÿ;A†C Bƒ$lEýýÿÿÿÿÿ3A†C zRx $@ýýÿÿÿÿÿA†C GƒŽ$D¨ýýÿÿÿÿÿA†C $lˆýýÿÿÿÿÿA†C $”hýýÿÿÿÿÿA†C Eƒ$¼¿ýýÿÿÿÿÿ=A†C Bƒ$äÔýýÿÿÿÿÿA†C GƒŽ$ ÃþýÿÿÿÿÿÛA†C FƒŽ$4vÿýÿÿÿÿÿFA†C CƒŽ,\”ÿýÿÿÿÿÿÌA†C JƒŒŽ,Œ0þÿÿÿÿÿ\A†C MƒŒŽzPLRx›…` ,$<þÿÿÿÿÿñWÕÿÿÿÿÿÿA†C Hƒ$ þÿÿÿÿÿA†C $4øþÿÿÿÿÿA†C $\ãþÿÿÿÿÿíA†C FƒŽ$„¨þÿÿÿÿÿ8A†C CƒŽ$¬Àþÿÿÿÿÿ+A†C Bƒ,Ãþÿÿÿÿÿ„›ÔÿÿÿÿÿÿA†C LƒŽ$ þÿÿÿÿÿDA†C FƒŽ$,@ þÿÿÿÿÿJA†C CƒŽ$Th þÿÿÿÿÿ9A†C Bƒ$|y þÿÿÿÿÿA†C FƒŽ$¤S þÿÿÿÿÿA†C $Ì< þÿÿÿÿÿA†C $ô1 þÿÿÿÿÿA†C $ þÿÿÿÿÿA†C $D þÿÿÿÿÿA†C $lø þÿÿÿÿÿA†C $”í þÿÿÿÿÿA†C $¼Ö þÿÿÿÿÿA†C $äË þÿÿÿÿÿA†C $ ´ þÿÿÿÿÿA†C $4© þÿÿÿÿÿA†C $\’ þÿÿÿÿÿA†C zRx ,p þÿÿÿÿÿªA†C MƒŒŽ$Lê þÿÿÿÿÿgA†C CƒŽ$t) þÿÿÿÿÿ²A†C FƒŽ$œ³ þÿÿÿÿÿ=A†C $ÄÈ þÿÿÿÿÿ…A†C FƒŽ,ì%þÿÿÿÿÿ1A†C MƒŒŽ,&þÿÿÿÿÿÕA†C MƒŒŽ$LËþÿÿÿÿÿeA†C GƒŽ$tþÿÿÿÿÿšA†C IƒŽ$œzþÿÿÿÿÿJA†C Eƒ$ÄœþÿÿÿÿÿcA†C GƒŽ$ì×þÿÿÿÿÿJA†C Eƒ$ùþÿÿÿÿÿA†C $<êþÿÿÿÿÿA†C $dÞþÿÿÿÿÿA†C ,ŒËþÿÿÿÿÿ¡A†C KƒŒŽ$¼<þÿÿÿÿÿeA†C GƒŽ$äyþÿÿÿÿÿA†C $ pþÿÿÿÿÿA†C $4hþÿÿÿÿÿA†C $\Sþÿÿÿÿÿ×A†C IƒŽ$„þÿÿÿÿÿA†C $¬þÿÿÿÿÿA†C $Ôëþÿÿÿÿÿ%A†C $üðþÿÿÿÿÿ8A†C CƒŽ$$þÿÿÿÿÿ+A†C Bƒ$L þÿÿÿÿÿ™A†C IƒŽ$t|þÿÿÿÿÿA†C $œpþÿÿÿÿÿ8A†C CƒŽ$Ĉþÿÿÿÿÿ+A†C Bƒ$ì‹þÿÿÿÿÿA†C $wþÿÿÿÿÿA†C $<fþÿÿÿÿÿ¾A†C IƒŽ$düþÿÿÿÿÿ!A†C $Œþÿÿÿÿÿ8A†C CƒŽ$´þÿÿÿÿÿ+A†C Bƒ$Üþÿÿÿÿÿ‘A†C IƒŽ$„þÿÿÿÿÿLA†C Bƒ$,°þÿÿÿÿÿA†C $T¨þÿÿÿÿÿA†C $|“þÿÿÿÿÿA†C $¤þÿÿÿÿÿA†C ,Ìnþÿÿÿÿÿ‚A†C PƒŒŽ$üÀþÿÿÿÿÿKA†C Bƒ$$èþÿÿÿÿÿJA†C CƒŽ$Lþÿÿÿÿÿ9A†C Bƒ,t!þÿÿÿÿÿ¥A†C KƒŒŽ$¤–þÿÿÿÿÿ`A†C Bƒ$ÌÐþÿÿÿÿÿ8A†C CƒŽ$ôèþÿÿÿÿÿ+A†C Bƒ$ëþÿÿÿÿÿA†C $DØþÿÿÿÿÿA†C $lÈþÿÿÿÿÿÆA†C IƒŽ$”fþÿÿÿÿÿ)A†C $¼pþÿÿÿÿÿ8A†C CƒŽ$äˆþÿÿÿÿÿ+A†C Bƒ$ ‹þÿÿÿÿÿxA†C Eƒ$4 Ûþÿÿÿÿÿ,A†C $\ àþÿÿÿÿÿA†C $„ ØþÿÿÿÿÿA†C $¬ ÃþÿÿÿÿÿÃA†C IƒŽ$Ô ^þÿÿÿÿÿ&A†C $ü `þÿÿÿÿÿ8A†C CƒŽ$$ xþÿÿÿÿÿ+A†C Bƒ$L {þÿÿÿÿÿxA†C Eƒ$t Ëþÿÿÿÿÿ,A†C $œ ÐþÿÿÿÿÿA†C $Ä ÈþÿÿÿÿÿA†C $ì ³þÿÿÿÿÿÅA†C IƒŽ$ Pþÿÿÿÿÿ(A†C $< Pþÿÿÿÿÿ8A†C CƒŽ$d hþÿÿÿÿÿ+A†C Bƒ$Œ kþÿÿÿÿÿxA†C Eƒ$´ »þÿÿÿÿÿ,A†C $Ü ÀþÿÿÿÿÿA†C $ ¸þÿÿÿÿÿA†C $, £þÿÿÿÿÿÆA†C IƒŽ$T Aþÿÿÿÿÿ)A†C $| Pþÿÿÿÿÿ8A†C CƒŽ$¤ hþÿÿÿÿÿ+A†C Bƒ$Ì kþÿÿÿÿÿxA†C Eƒ$ô »þÿÿÿÿÿ,A†C $ ÀþÿÿÿÿÿA†C $D ¸þÿÿÿÿÿA†C zPLRx›UO ,$ƒþÿÿÿÿÿýƒÄÿÿÿÿÿÿA†C Eƒ$¼ Pþÿÿÿÿÿ?A†C Bƒ$ä hþÿÿÿÿÿ8A†C CƒŽ$ €þÿÿÿÿÿ+A†C Bƒ$4ƒþÿÿÿÿÿˆA†C GƒŽ$\ãþÿÿÿÿÿ\A†C Bƒ$„þÿÿÿÿÿ8A†C CƒŽ$¬0þÿÿÿÿÿ+A†C Bƒ$Ô3þÿÿÿÿÿ A†C 4”+þÿÿÿÿÿ8[ÃÿÿÿÿÿÿA†C PƒŒŽ,4+ þÿÿÿÿÿ…A†C KƒŒŽ$dˆ!þÿÿÿÿÿ8A†C CƒŽ$Œ !þÿÿÿÿÿ+A†C Bƒ,´£!þÿÿÿÿÿòA†C PƒŒŽ,äe'þÿÿÿÿÿƒA†C GƒŒŽ$¸'þÿÿÿÿÿA†C $<°'þÿÿÿÿÿA†C $d›'þÿÿÿÿÿ A†C Bƒ,Œ“'þÿÿÿÿÿƒA†C GƒŒŽ$¼ð'þÿÿÿÿÿA†C $äè'þÿÿÿÿÿA†C $ Ó'þÿÿÿÿÿ A†C Bƒ$4Ø'þÿÿÿÿÿnA†C CƒŽ$\ (þÿÿÿÿÿUA†C Bƒ,„M(þÿÿÿÿÿ·A†C PƒŒŽ,´Ô)þÿÿÿÿÿ»A†C MƒŒŽ$ä_+þÿÿÿÿÿ\A†C CƒŽ$  +þÿÿÿÿÿA†C $4˜+þÿÿÿÿÿA†C $\+þÿÿÿÿÿJA†C CƒŽ$„¸+þÿÿÿÿÿ9A†C Bƒ,¬É+þÿÿÿÿÿ9A†C MƒŒŽ$ÜÒ-þÿÿÿÿÿA†C $È-þÿÿÿÿÿA†C 4Ä¿-þÿÿÿÿÿý‹¿ÿÿÿÿÿÿA†C PƒŒŽ,d„/þÿÿÿÿÿ‹A†C MƒŒŽ$”ß0þÿÿÿÿÿeA†C CƒŽ$¼ 1þÿÿÿÿÿ8A†C CƒŽ$ä81þÿÿÿÿÿ+A†C Bƒ$ @1þÿÿÿÿÿnA†C CƒŽ$4ˆ1þÿÿÿÿÿUA†C Bƒ$\µ1þÿÿÿÿÿ&A†C $„³1þÿÿÿÿÿA†C 4D©1þÿÿÿÿÿâk¾ÿÿÿÿÿÿA†C PƒŒŽ,äS3þÿÿÿÿÿA†C GƒŒŽ$85þÿÿÿÿÿnA†C CƒŽ$<€5þÿÿÿÿÿUA†C Bƒ,d­5þÿÿÿÿÿlA†C PƒŒŽ$”é8þÿÿÿÿÿ`A†C CƒŽ$¼09þÿÿÿÿÿ8A†C CƒŽ$äH9þÿÿÿÿÿ+A†C Bƒ$ K9þÿÿÿÿÿdA†C CƒŽ$4ˆ9þÿÿÿÿÿJA†C CƒŽ$\°9þÿÿÿÿÿ9A†C Bƒ$„Á9þÿÿÿÿÿ¾A†C GƒŽ$¬W:þÿÿÿÿÿHA†C CƒŽ,Ôw:þÿÿÿÿÿA†C MƒŒŽ$[<þÿÿÿÿÿ$A†C IƒŽ$,W=þÿÿÿÿÿ\A†C CƒŽ$T˜=þÿÿÿÿÿA†C $|=þÿÿÿÿÿA†C $¤{=þÿÿÿÿÿ`A†C CƒŽ$ÌÀ=þÿÿÿÿÿ8A†C CƒŽ$ôØ=þÿÿÿÿÿ+A†C Bƒ$à=þÿÿÿÿÿ8A†C CƒŽ$Dø=þÿÿÿÿÿ+A†C Bƒ,lû=þÿÿÿÿÿÒA†C KƒŒŽ$œ?þÿÿÿÿÿfA†C CƒŽ$Äè?þÿÿÿÿÿJA†C CƒŽ$ì@þÿÿÿÿÿ9A†C Bƒ$!@þÿÿÿÿÿHA†C CƒŽ$<A@þÿÿÿÿÿ+A†C IƒŽ$dDAþÿÿÿÿÿYA†C CƒŽ$Œ€AþÿÿÿÿÿA†C $´xAþÿÿÿÿÿA†C $ÜcAþÿÿÿÿÿA†C $IAþÿÿÿÿÿ A†C Bƒ$,ÁAþÿÿÿÿÿEA†C Bƒ$TÞAþÿÿÿÿÿA†C IƒŽ$|EDþÿÿÿÿÿaA†C CƒŽ$¤ˆDþÿÿÿÿÿJA†C CƒŽ$̰Dþÿÿÿÿÿ9A†C Bƒ$ôÁDþÿÿÿÿÿuA†C Eƒ$EþÿÿÿÿÿeA†C CƒŽ$DXEþÿÿÿÿÿA†C $lPEþÿÿÿÿÿA†C $”;Eþÿÿÿÿÿ_A†C Eƒ$¼rEþÿÿÿÿÿqA†C CƒŽ$äÈEþÿÿÿÿÿA†C $ ÀEþÿÿÿÿÿA†C $4«Eþÿÿÿÿÿ_A†C Eƒ$\âEþÿÿÿÿÿqA†C CƒŽ$„8FþÿÿÿÿÿA†C $¬0FþÿÿÿÿÿA†C $ÔFþÿÿÿÿÿ_A†C Eƒ$üRFþÿÿÿÿÿqA†C CƒŽ$$¨FþÿÿÿÿÿA†C $L FþÿÿÿÿÿA†C $t‹FþÿÿÿÿÿžA†C Bƒ$œGþÿÿÿÿÿIA†C $Ä"GþÿÿÿÿÿIA†C $ìCGþÿÿÿÿÿxA†C CƒŽ$“GþÿÿÿÿÿªA†C FƒŽ$<HþÿÿÿÿÿA†C FƒŽ$d}HþÿÿÿÿÿWA†C Bƒ$Œ¬Hþÿÿÿÿÿ…A†C $´ Iþÿÿÿÿÿ…A†C $ÜfIþÿÿÿÿÿ…A†C $ÃIþÿÿÿÿÿ…A†C $, Jþÿÿÿÿÿ…A†C $T}JþÿÿÿÿÿIA†C ,žJþÿÿÿÿÿÏû³ÿÿÿÿÿÿA†C Eƒ$¬=Kþÿÿÿÿÿ&A†C $ÔHKþÿÿÿÿÿ8A†C CƒŽ$ü`Kþÿÿÿÿÿ+A†C Bƒ,¼cKþÿÿÿÿÿϳÿÿÿÿÿÿA†C Eƒ$T Lþÿÿÿÿÿ$A†C $| Lþÿÿÿÿÿ8A†C CƒŽ$¤ Lþÿÿÿÿÿ+A†C Bƒ,dLþÿÿÿÿÿC³ÿÿÿÿÿÿA†C IƒŽ$ü .Mþÿÿÿÿÿ¡A†C CƒŽ$$!¨Mþÿÿÿÿÿ8A†C CƒŽ$L!ÀMþÿÿÿÿÿ+A†C Bƒ$t!ÃMþÿÿÿÿÿA†C IƒŽ$œ!›NþÿÿÿÿÿTA†C Bƒ$Ä!ÈNþÿÿÿÿÿ8A†C CƒŽ$ì!àNþÿÿÿÿÿ+A†C Bƒ,¬ãNþÿÿÿÿÿCç±ÿÿÿÿÿÿA†C IƒŽ$D"öOþÿÿÿÿÿ¡A†C CƒŽ$l"pPþÿÿÿÿÿ8A†C CƒŽ$”"ˆPþÿÿÿÿÿ+A†C Bƒ$¼"‹PþÿÿÿÿÿA†C IƒŽ$ä"cQþÿÿÿÿÿTA†C Bƒ$ #Qþÿÿÿÿÿ8A†C CƒŽ$4#¨Qþÿÿÿÿÿ+A†C Bƒ$\#«Qþÿÿÿÿÿ%A†C $„#¨Qþÿÿÿÿÿ%A†C $¬#¥Qþÿÿÿÿÿ)A†C $Ô#¦Qþÿÿÿÿÿ)A†C $ü#§Qþÿÿÿÿÿ%A†C $$$¤Qþÿÿÿÿÿ%A†C $L$¡Qþÿÿÿÿÿ)A†C $t$¢Qþÿÿÿÿÿ)A†C $œ$£QþÿÿÿÿÿXA†C Eƒ$Ä$ÓQþÿÿÿÿÿXA†C Eƒ$ì$Rþÿÿÿÿÿ[A†C Eƒ$%6Rþÿÿÿÿÿ[A†C Eƒ$<%iRþÿÿÿÿÿXA†C Eƒ$d%™RþÿÿÿÿÿXA†C Eƒ$Œ%ÉRþÿÿÿÿÿ[A†C Eƒ$´%üRþÿÿÿÿÿ[A†C Eƒ,t/SþÿÿÿÿÿK®ÿÿÿÿÿÿA†C GƒŽ$ &TþÿÿÿÿÿéA†C Eƒ$4&ÈTþÿÿÿÿÿ8A†C CƒŽ$\&àTþÿÿÿÿÿ+A†C Bƒ,ãTþÿÿÿÿÿë­ÿÿÿÿÿÿA†C GƒŽ$´&´UþÿÿÿÿÿéA†C Eƒ$Ü&€Vþÿÿÿÿÿ8A†C CƒŽ$'˜Vþÿÿÿÿÿ+A†C Bƒ$,'›VþÿÿÿÿÿÇA†C IƒŽ$T':Wþÿÿÿÿÿ!A†C $|'@Wþÿÿÿÿÿ8A†C CƒŽ$¤'XWþÿÿÿÿÿ+A†C Bƒ$Ì'[WþÿÿÿÿÿÇA†C IƒŽ$ô'úWþÿÿÿÿÿ!A†C $(Xþÿÿÿÿÿ8A†C CƒŽ$D(Xþÿÿÿÿÿ+A†C Bƒ,l(Xþÿÿÿÿÿ)A†C PƒŒŽ,œ(]þÿÿÿÿÿoA†C PƒŒŽ$Ì(S_þÿÿÿÿÿ•A†C FƒŽ$ô(È_þÿÿÿÿÿA†C $)À_þÿÿÿÿÿA†C $D)«_þÿÿÿÿÿjA†C CƒŽ$l)ð_þÿÿÿÿÿA†C $”)è_þÿÿÿÿÿA†C $¼)Ó_þÿÿÿÿÿ;A†C Bƒ$ä)è_þÿÿÿÿÿA†C $ *à_þÿÿÿÿÿA†C $4*Ë_þÿÿÿÿÿ;A†C Bƒ$\*à_þÿÿÿÿÿA†C $„*Ø_þÿÿÿÿÿA†C $¬*Ã_þÿÿÿÿÿA†C $Ô*£_þÿÿÿÿÿ;A†C Bƒ$ü*¶_þÿÿÿÿÿ;A†C Bƒ$$+É_þÿÿÿÿÿ;A†C Bƒ$L+Ü_þÿÿÿÿÿ;A†C Bƒ$t+ï_þÿÿÿÿÿA†C $œ+æ_þÿÿÿÿÿA†C ,Ä+Ù_þÿÿÿÿÿA†C MƒŒŽ$ô+©`þÿÿÿÿÿŠA†C CƒŽ$,aþÿÿÿÿÿ8A†C CƒŽ$D,(aþÿÿÿÿÿ+A†C Bƒ$l,+aþÿÿÿÿÿA†C ,”, aþÿÿÿÿÿ A†C MƒŒŽ$Ä,ùaþÿÿÿÿÿŠA†C CƒŽ$ì,`bþÿÿÿÿÿ8A†C CƒŽ$-xbþÿÿÿÿÿ+A†C Bƒ$<-{bþÿÿÿÿÿ'A†C $d-zbþÿÿÿÿÿ"A†C $Œ-tbþÿÿÿÿÿ*A†C ,´-vbþÿÿÿÿÿ@A†C MƒŒŽ$ä-†cþÿÿÿÿÿŠA†C CƒŽ$ .ðcþÿÿÿÿÿ8A†C CƒŽ$4.dþÿÿÿÿÿ+A†C Bƒ$\. dþÿÿÿÿÿ–A†C CƒŽ,„.yeþÿÿÿÿÿ× A†C MƒŒŽ$´. pþÿÿÿÿÿpA†C CƒŽ$Ü.ppþÿÿÿÿÿJA†C CƒŽ$/˜pþÿÿÿÿÿ9A†C Bƒ$,/©pþÿÿÿÿÿzA†C GƒŽ$T/ûqþÿÿÿÿÿ]A†C CƒŽ$|/0rþÿÿÿÿÿ8A†C CƒŽ$¤/Hrþÿÿÿÿÿ+A†C Bƒ,Ì/KrþÿÿÿÿÿA†C KƒŒŽ$ü/!tþÿÿÿÿÿpA†C CƒŽ$$0xtþÿÿÿÿÿ\A†C CƒŽ$L0°tþÿÿÿÿÿGA†C Bƒ$t0Ïtþÿÿÿÿÿ\A†C Bƒ$œ0uþÿÿÿÿÿ+A†C IƒŽ$Ä0vþÿÿÿÿÿYA†C CƒŽ$ì0@vþÿÿÿÿÿA†C $18vþÿÿÿÿÿA†C $<1#vþÿÿÿÿÿA†C $d1 vþÿÿÿÿÿïA†C IƒŽ$Œ1ÐvþÿÿÿÿÿíA†C IƒŽ$´1•wþÿÿÿÿÿ^A†C CƒŽ$Ü1ÐwþÿÿÿÿÿA†C $2ÈwþÿÿÿÿÿA†C $,2ÀwþÿÿÿÿÿJA†C CƒŽ$T2èwþÿÿÿÿÿ9A†C Bƒ$|2ùwþÿÿÿÿÿ¹A†C Bƒ$¤2ŠxþÿÿÿÿÿèA†C IƒŽ$Ì2JyþÿÿÿÿÿŠA†C CƒŽ$ô2¸yþÿÿÿÿÿ8A†C CƒŽ$3Ðyþÿÿÿÿÿ+A†C Bƒ$D3Óyþÿÿÿÿÿ–A†C CƒŽ,l3A{þÿÿÿÿÿœA†C MƒŒŽ$œ3­€þÿÿÿÿÿpA†C CƒŽ$Ä3ø€þÿÿÿÿÿJA†C CƒŽ$ì3 þÿÿÿÿÿ9A†C Bƒ$41þÿÿÿÿÿÝA†C IƒŽ$<4æþÿÿÿÿÿlA†C CƒŽ$d48‚þÿÿÿÿÿJA†C CƒŽ$Œ4`‚þÿÿÿÿÿ9A†C Bƒ$´4q‚þÿÿÿÿÿ\A†C Bƒ$Ü4¥‚þÿÿÿÿÿ+A†C IƒŽ$5¨ƒþÿÿÿÿÿYA†C CƒŽ$,5àƒþÿÿÿÿÿA†C $T5؃þÿÿÿÿÿA†C $|5ÃþÿÿÿÿÿA†C $¤5©ƒþÿÿÿÿÿïA†C IƒŽ$Ì5p„þÿÿÿÿÿíA†C IƒŽ$ô55…þÿÿÿÿÿ^A†C CƒŽ$6p…þÿÿÿÿÿA†C $D6h…þÿÿÿÿÿA†C $l6`…þÿÿÿÿÿJA†C CƒŽ$”6ˆ…þÿÿÿÿÿ9A†C Bƒ$¼6™…þÿÿÿÿÿ¹A†C Bƒ$ä6*†þÿÿÿÿÿÒA†C IƒŽ$ 7Ô†þÿÿÿÿÿØA†C FƒŽ$47ˆ‡þÿÿÿÿÿ8A†C CƒŽ$\7 ‡þÿÿÿÿÿ+A†C Bƒ,„7£‡þÿÿÿÿÿ?A†C MƒŒŽ$´7²ŠþÿÿÿÿÿÆA†C FƒŽ$Ü7P‹þÿÿÿÿÿA†C $8F‹þÿÿÿÿÿA†C ,,8<‹þÿÿÿÿÿÒA†C MƒŒŽ$\8Þ‘þÿÿÿÿÿ_A†C GƒŽ$„8“þÿÿÿÿÿ]A†C CƒŽ$¬8P“þÿÿÿÿÿ8A†C CƒŽ$Ô8h“þÿÿÿÿÿ+A†C Bƒ$ü8k“þÿÿÿÿÿA†C $$9[“þÿÿÿÿÿCA†C Bƒ$L9v“þÿÿÿÿÿ4A†C Bƒ$t9‚“þÿÿÿÿÿ4A†C Bƒ$œ9Ž“þÿÿÿÿÿ1A†C Bƒ$Ä9—“þÿÿÿÿÿnA†C $ì9Ý“þÿÿÿÿÿnA†C $:#”þÿÿÿÿÿA†C $<: ”þÿÿÿÿÿA†C $d:õ“þÿÿÿÿÿ2A†C Bƒ$Œ:ÿ“þÿÿÿÿÿ5A†C ,´: ”þÿÿÿÿÿA†C JƒŒŽ$ä:ó”þÿÿÿÿÿ%A†C $ ;ð”þÿÿÿÿÿ%A†C $4;í”þÿÿÿÿÿ%A†C $\;ê”þÿÿÿÿÿ%A†C zRx $ДþÿÿÿÿÿBA†C Bƒ$Dê”þÿÿÿÿÿtA†C CƒŽ$l6•þÿÿÿÿÿyA†C GƒŽ,”‡•þÿÿÿÿÿÐA†C GƒŒŽ$Ä'–þÿÿÿÿÿ*A†C $ì)–þÿÿÿÿÿA†C $–þÿÿÿÿÿ A†C $<–þÿÿÿÿÿA†C $dý•þÿÿÿÿÿ A†C $Œõ•þÿÿÿÿÿA†C $´ã•þÿÿÿÿÿ A†C $ÜÛ•þÿÿÿÿÿ5A†C $è•þÿÿÿÿÿAA†C $,–þÿÿÿÿÿQA†C $T*–þÿÿÿÿÿ*A†C $|,–þÿÿÿÿÿA†C $¤–þÿÿÿÿÿA†C $Ìþ•þÿÿÿÿÿ5A†C ,ô –þÿÿÿÿÿðA†C KƒŒŽ$$Ü—þÿÿÿÿÿ:A†C Bƒ,Lî—þÿÿÿÿÿõA†C MƒŒŽ$|³˜þÿÿÿÿÿ®A†C IƒŽ$¤9™þÿÿÿÿÿA†C GƒŽ$Ìž™þÿÿÿÿÿµA†C CƒŽ$ô+šþÿÿÿÿÿA†C $šþÿÿÿÿÿ A†C $D šþÿÿÿÿÿA†C $lšþÿÿÿÿÿ A†C $”ù™þÿÿÿÿÿA†C $¼î™þÿÿÿÿÿmA†C FƒŽ$ä3šþÿÿÿÿÿUA†C CƒŽ, `šþÿÿÿÿÿÃA†C PƒŒŽ,<óžþÿÿÿÿÿA†C PƒŒŽ$lÄŸþÿÿÿÿÿ.A†C ,”ÊŸþÿÿÿÿÿLA†C PƒŒŽ$Äæ¡þÿÿÿÿÿA†C $ìÔ¡þÿÿÿÿÿ A†C $Ì¡þÿÿÿÿÿA†C $<º¡þÿÿÿÿÿ A†C $d²¡þÿÿÿÿÿA†C $Œ ¡þÿÿÿÿÿ A†C zRx $€¡þÿÿÿÿÿGA†C CƒŽ$DŸ¡þÿÿÿÿÿ:A†C CƒŽ$l±¡þÿÿÿÿÿA†C $”›¡þÿÿÿÿÿ%A†C $¼˜¡þÿÿÿÿÿA†C $䆡þÿÿÿÿÿ A†C zRx $f¡þÿÿÿÿÿGA†C CƒŽ,D…¡þÿÿÿÿÿqA†C GƒŒŽ$tÆ¡þÿÿÿÿÿLA†C ,œê¡þÿÿÿÿÿBA†C JƒŒŽ$Ìü£þÿÿÿÿÿeA†C GƒŽ$ô9¤þÿÿÿÿÿA†C $"¤þÿÿÿÿÿKA†C CƒŽ$DE¤þÿÿÿÿÿA†C $l.¤þÿÿÿÿÿKA†C CƒŽ$”Q¤þÿÿÿÿÿqA†C Bƒ$¼š¤þÿÿÿÿÿ*A†C $䜤þÿÿÿÿÿoA†C GƒŽzRx $ˤþÿÿÿÿÿGA†C CƒŽ,Dê¤þÿÿÿÿÿYA†C GƒŒŽ$t¥þÿÿÿÿÿeA†C GƒŽ$œP¥þÿÿÿÿÿ A†C $ÄH¥þÿÿÿÿÿœA†C FƒŽ$ì¼¥þÿÿÿÿÿZA†C FƒŽ$î¥þÿÿÿÿÿ¬A†C FƒŽ$<r¦þÿÿÿÿÿ•A†C FƒŽ,dߦþÿÿÿÿÿ3A†C PƒŒŽ$”â§þÿÿÿÿÿA†C $¼Чþÿÿÿÿÿ A†C $äȧþÿÿÿÿÿA†C $ ¶§þÿÿÿÿÿ A†C zRx $˜§þÿÿÿÿÿDA†C $D´§þÿÿÿÿÿ4A†C Bƒ$lÀ§þÿÿÿÿÿ‡A†C CƒŽ$”¨þÿÿÿÿÿáA†C IƒŽ$¼Ø¨þÿÿÿÿÿ¡A†C GƒŽ$äQ©þÿÿÿÿÿxA†C CƒŽ$ ¡©þÿÿÿÿÿA†C $4©þÿÿÿÿÿA†C ,\z©þÿÿÿÿÿ<A†C MƒŒŽ$Œ̺þÿÿÿÿÿjA†C $´»þÿÿÿÿÿEA†C $Ü+»þÿÿÿÿÿôA†C $÷»þÿÿÿÿÿA†C $,ã»þÿÿÿÿÿA†C $TлþÿÿÿÿÿA†C FƒŽ$|)¼þÿÿÿÿÿ;A†C CƒŽ,¤<¼þÿÿÿÿÿÁA†C KƒŒŽ$ÔͼþÿÿÿÿÿPA†C CƒŽ$üõ¼þÿÿÿÿÿëA†C IƒŽ,$¸½þÿÿÿÿÿÃA†C JƒŒŽ$TKÀþÿÿÿÿÿA†C ,|5Àþÿÿÿÿÿ'A†C MƒŒŽ$¬,ÄþÿÿÿÿÿA†C $ÔÄþÿÿÿÿÿA†C $üþÃþÿÿÿÿÿA†C $$æÃþÿÿÿÿÿA†C $LÏÃþÿÿÿÿÿA†C $t¸ÃþÿÿÿÿÿA†C $œ¡ÃþÿÿÿÿÿA†C $ĉÃþÿÿÿÿÿA†C $ìrÃþÿÿÿÿÿA†C zRx $CÃþÿÿÿÿÿJA†C Eƒ,DeÃþÿÿÿÿÿ¯A†C JƒŒŽ$täÃþÿÿÿÿÿA†C $œÄÃþÿÿÿÿÿA†C $Ä­ÃþÿÿÿÿÿA†C ,ì¢ÃþÿÿÿÿÿSA†C PƒŒŽ$ÅÈþÿÿÿÿÿ2A†C Bƒ$DÏÈþÿÿÿÿÿ2A†C Bƒ$lÙÈþÿÿÿÿÿ7A†C CƒŽ$”èÈþÿÿÿÿÿIA†C FƒŽ$¼ ÉþÿÿÿÿÿA†C $äòÈþÿÿÿÿÿA†C zRx ,ÏÈþÿÿÿÿÿ»A†C PƒŒŽzRx ,BÏþÿÿÿÿÿJA†C PƒŒŽ,L\ÑþÿÿÿÿÿÀ A†C MƒŒŽzRx $ÔÛþÿÿÿÿÿA†C IƒŽzRx $¯ÜþÿÿÿÿÿcA†C GƒŽ$DêÜþÿÿÿÿÿJA†C Eƒ,l ÝþÿÿÿÿÿýA†C JƒŒŽ$œÙÝþÿÿÿÿÿA†C $ĹÝþÿÿÿÿÿA†C $ì¢ÝþÿÿÿÿÿA†C $—ÝþÿÿÿÿÿA†C $<€ÝþÿÿÿÿÿA†C zRx ,TÝþÿÿÿÿÿÜA†C MƒŒŽ,LÞþÿÿÿÿÿ¾A†C JƒŒŽ,|ŽÞþÿÿÿÿÿfA†C PƒŒŽ,¬Ôàþÿÿÿÿÿ<A†C PƒŒŽ,Üàáþÿÿÿÿÿ A†C PƒŒŽ$ ¹âþÿÿÿÿÿ A†C Bƒ$41ãþÿÿÿÿÿÉA†C Bƒ,\ÒãþÿÿÿÿÿˆA†C MƒŒŽ$Œ*äþÿÿÿÿÿSA†C CƒŽ$´Uäþÿÿÿÿÿ>A†C Bƒ$ÜkäþÿÿÿÿÿöA†C CƒŽ$9åþÿÿÿÿÿVA†C $,xåþÿÿÿÿÿGA†C $T—åþÿÿÿÿÿNA†C CƒŽ$|½åþÿÿÿÿÿNA†C CƒŽ$¤ãåþÿÿÿÿÿRA†C Bƒ,Ì æþÿÿÿÿÿžA†C GƒŒŽ$ü{æþÿÿÿÿÿ³A†C FƒŽ$$çþÿÿÿÿÿA†C $LîæþÿÿÿÿÿA†C $tÖæþÿÿÿÿÿA†C $œ¾æþÿÿÿÿÿA†C $ĦæþÿÿÿÿÿA†C $ì”æþÿÿÿÿÿ A†C $ŒæþÿÿÿÿÿA†C $<zæþÿÿÿÿÿ A†C $dræþÿÿÿÿÿA†C $Œ`æþÿÿÿÿÿ A†C $´XæþÿÿÿÿÿA†C $ÜFæþÿÿÿÿÿ A†C $>æþÿÿÿÿÿA†C $,,æþÿÿÿÿÿ A†C zRx $æþÿÿÿÿÿWA†C Bƒ,DGæþÿÿÿÿÿA†C JƒŒŽ$tçþÿÿÿÿÿ A†C $œüæþÿÿÿÿÿ_A†C CƒŽ$Ä3çþÿÿÿÿÿ-A†C zPLRx› ,$çþÿÿÿÿÿ?s}ÿÿÿÿÿÿA†C IƒŽ$<(èþÿÿÿÿÿA†C $d èþÿÿÿÿÿA†C $Œ èþÿÿÿÿÿ,A†C FƒŽ$´éþÿÿÿÿÿ8A†C CƒŽ$Ü(éþÿÿÿÿÿ+A†C Bƒ,+éþÿÿÿÿÿA†C JƒŒŽ,4 ìþÿÿÿÿÿ·A†C GƒŒŽzRx ${ìþÿÿÿÿÿ A†C $D^ìþÿÿÿÿÿ A†C zRx $+ìþÿÿÿÿÿ A†C $Dìþÿÿÿÿÿ A†C zRx $èëþÿÿÿÿÿOA†C IƒŽ,DîþÿÿÿÿÿoA†C GƒŒŽ$tPîþÿÿÿÿÿ8A†C CƒŽ$œhîþÿÿÿÿÿ+A†C Bƒ$Äkîþÿÿÿÿÿ7A†C Bƒ$ìˆîþÿÿÿÿÿ8A†C CƒŽ$ îþÿÿÿÿÿ+A†C BƒzPLRx› ,$ƒîþÿÿÿÿÿ¸/zÿÿÿÿÿÿA†C IƒŽ$Œ òþÿÿÿÿÿoA†C FƒŽ$´`òþÿÿÿÿÿA†C $ÜXòþÿÿÿÿÿA†C $CòþÿÿÿÿÿQA†C CƒŽ$,xòþÿÿÿÿÿA†C $TpòþÿÿÿÿÿA†C zRx $Còþÿÿÿÿÿ»A†C FƒŽ°öÀºöÀÄöÀÎöÀØöÀâöÀìöÀööÀ÷À ÷À÷À÷À(÷À2÷À<÷ÀF÷ÀP÷ÀZ÷Àd÷Àn÷Àx÷À‚÷ÀŒ÷À–÷À ÷Àª÷À´÷À¾÷ÀÈ÷ÀÒ÷ÀÜ÷Àæ÷Àð÷Àú÷ÀøÀøÀøÀ"øÀ,øÀ6øÀ@øÀJøÀTøÀ^øÀhøÀrøÀ|øÀ†øÀøÀšøÀ¤øÀ®øÀ¸øÀÂøÀÌøÀÖøÀàøÀêøÀôøÀþøÀùÀùÀùÀ&ùÀ0ùÀ:ùÀDùÀNùÀXùÀbùÀlùÀvùÀ€ùÀŠùÀ”ùÀžùÀ¨ùÀ²ùÀ¼ùÀÆùÀÐùÀÚùÀäùÀîùÀøùÀúÀ úÀúÀ úÀ*úÀ4úÀ>úÀHúÀRúÀ\úÀfúÀpúÀzúÀ„úÀŽúÀ˜úÀ¢úÀ¬úÀ¶úÀÀúÀÊúÀÔúÀÞúÀèúÀòúÀüúÀûÀûÀûÀ$ûÀ.ûÀ8ûÀBûÀLûÀVûÀ`ûÀjûÀtûÀ~ûÀˆûÀ’ûÀœûÀ¦ûÀ°ûÀºûÀÄûÀÎûÀØûÀâûÀìûÀöûÀüÀ üÀüÀüÀ(üÀ2üÀ<üÀFüÀPüÀZüÀdüÀnüÀxüÀ‚üÀŒüÀ–üÀ üÀªüÀ´üÀ¾üÀÈüÀÒüÀÜüÀæüÀðüÀúüÀýÀØÀ(€Àx€ÀÈ€ÀÀhÀ¸À0‚ÀX‚ÀЂÀ ƒÀHƒÀ˜ƒÀèƒÀ8„Àˆ„ÀØ„À(…Àx…Àð…À†Àh†À¸†À‡À€‡ÀЇÀ ˆÀHˆÀ˜ˆÀèˆÀ`‰À°‰ÀŠÀ À  ÀØiÀ0ŠÀxŠÀÀŠÀ‹ÀP‹À0À& ÀhÀÀ©À•hÀÜÀ-ÀhÀ:#À»À hÀG#ÀÉþÀ½hÀ#ÀwÿÀ•hÀ%%ÀÀÝhÀC(ÀOÀèhÀ:*ÀÀðhÀÞ*À3ÀèhÀê*À]À•hÀ÷*ÀQÀèhÀ$,ÀÂÀèhÀ/,À7ÀÝhÀ=,À¬þÀûhÀ‰.ÀbÀðhÀ¤.ÀƒÀèhÀ°.ÀüÀhÀ½.ÀÀiÀþ.ÀHýÀhÀ’/ÀPÀiÀ0ÀAÀiÀ+0À«ÿÀiÀ3À ÀhÀ}5ÀoýÀiÀ–5À¨ýÀiÀ,6ÀDþÀ•hÀm7À‘þÀ•hÀÿ7À¶ÀûhÀ‘8ÀåýÀ•hÀ„9ÀÿÀiÀ¨:ÀÑÀûhÀ+<À¸À•hÀ(=ÀËÀ•hÀr=ÀÛÀ•hÀ>ÀðÀ•hÀK>ÀÀ'iÀ?À!À'iÀW?À((7dÀhÀNdÀ7dÀ0ŠÀ((PdÀ ÀjÀiÀ¨?ÀbÀûhÀH@ÀÂÀhÀÁ@À™À•hÀ×@ÀþÀhÀ÷@ÀµÀ•hÀ AÀ‘ÀhÀ-AÀ?À•hÀCAÀ °ÀÀÕÀ5iÀ¸ÀÀÂÀEiÀÀÀÀþÀQiÀý@ÀAÀ=AÀYAÀƒAÀ¢AÀ }dÀPdÀð À À¸ À À ÀiÀdAÀKÀhÀýBÀÊ ÀhÀCÀÞ ÀhÀGHÀ‰À[iÀ²HÀî ÀliÀDLÀþÀhÀYLÀ3 ÀhÀYMÀ™ ÀhÀ!NÀ ÀhÀéNÀ ÀiÀýNÀ# ÀiÀ QÀ((dÀ ÀNdÀdÀ€ ÀziÀÕUÀÓ ÀªiÀ XÀO ÀÉiÀrXÀs ÀÉiÀšZÀ ÀiÀ§[ÀH ÀhÀý[ÀÀhÀ)\À¥ ÀhÀU\À’dÀXÀaÀÝhÀjÀúiÀoÀjÀŒÀjÀzÀhÀÀ jÀ„ÀjÀß À'jÀ•À5jÀ¼ÀèhÀ’ÀFjÀÄÀFjÀÕÀÝhÀaþÀQjÀAýÀhÀ9ýÀ\jÀcýÀhÀéÀúiÀõÀhÀxŠÀì ÀÝhÀÀ•hÀÀ•hÀ%ÀÞiÀAÀìiÀÀŠÀ((¬dÀ¸À &ýÀhÀ^ÀbÀûhÀp^À´ À•hÀº^À. ÀÝhÀ/_ÀÁ ÀûhÀ“gÀ;À•hÀ‹iÀÀ•hÀWkÀÀ•hÀlÀ5À•hÀßlÀÐ ÀhÀFmÀÀ•hÀWmÀ ÈÀÀLÀejÀÐÀÀTÀejÀØÀÀÐ ÀwjÀEÀ™EÀ }dÀ¬dÀÀ¸À(ÀÀ((ÛdÀbÀyjÀtmÀbÀûhÀ‘qÀŸÀ•hÀ±rÀ‰À£jÀ.sÀµÀèhÀ vÀ¾ÀèhÀvÀÈÀûhÀ vÀÒÀ£jÀ™wÀÜÀ•hÀ¶{ÀêÀ•hÀ=|À÷À•hÀÁ|ÀÀhÀ”}ÀÀ•hÀ¥}À(ÀhÀÂ}À:À•hÀÓ}ÀPÀhÀð}ÀÐ ÀhÀ~ÀÀ•hÀ~À ÁÀPÀÍjÀøÀÀbÀ5iÀðÀÀyÀØjÀ ÁÀ(ÀEiÀÁÀÀ5iÀÁÀ¥ÀØjÀ(ÁÀÀEiÀàÀÀºÀâjÀèÀÀÃÀâjÀÁÀÎÀòjÀ0ÁÀÛÀkÀ8ÁÀÐ ÀwjÀ¨EÀºEÀÞEÀïEÀFÀ$FÀEÀ™EÀ˜øédÀÛdÀ8ÀðÀxÀaÀÝhÀjÀúiÀoÀjÀŒÀjÀzÀhÀÀ jÀ„ÀjÀß À'jÀ•À5jÀ¼ÀèhÀ’ÀFjÀÄÀFjÀÕÀÝhÀaþÀQjÀAýÀhÀ9ýÀ\jÀcýÀhÀéÀúiÀõÀhÀxŠÀì ÀÝhÀÀ•hÀÀ•hÀ%ÀÞiÀAÀìiÀÀŠÀ((îdÀpÀu ÀkÀ/~ÀbÀûhÀgÀ! ÀûhÀ‚ÀÀ•hÀ^ƒÀÀ•hÀN„ÀîÀûhÀ`„ÀÙ ÀðhÀŽ…ÀáÀ•hÀª…ÀiÀðhÀÁ…À‰ÀûhÀ„†ÀöÀèhÀë†ÀIÀhÀü†ÀýÀèhÀ ‡ÀÐ ÀhÀ‡ÀÀ•hÀ/‡ÀÛÀèhÀL‡À @ÁÀÀ kÀpÁÀÀ1kÀhÁÀÀDkÀxÁÀ%ÀkÀ`ÁÀöÀkÀXÁÀýÀkÀ€ÁÀÛÀkÀPÁÀÐ ÀwjÀHÁÀIÀwjÀGFÀNFÀ]FÀeFÀuFÀ~FÀFÀ˜FÀEÀ™EÀP€eÀîdÀÐÀpÀXÀ€À|ÀhÀ]‡ÀµÀOkÀ‰À•ÀOkÀP‰À]ÀOkÀ‹ÀÀ£jÀ'À eÀ ÀxÀúiÀãÀ((eÀÐ À&ýÀhÀëÀìÿÀiÀŽÀbÀûhÀ¼ŽÀóÀZkÀ!À1ÀûhÀ–À ÀûhÀœÀÌÀûhÀñÀÀûhÀßÀ(ÀûhÀ$‘ÀÙÀûhÀy‘ÀžÀhÀ®‘ÀxÀúiÀ¿‘À„ÀhÀБÀ!À•hÀá‘ÀÐ ÀhÀþ‘ÀÀ•hÀ’À/ÀhÀ,’À5À•hÀ=’À ˆÁÀžÀ5iÀÁÀxÀekÀ˜ÁÀ„ÀgkÀ ÁÀÐ À„kÀ¨ÁÀ/À«kÀ©FÀ´FÀÕFÀáFÀõFÀGÀEÀ0GÀdGÀjGÀ05eÀeÀ8!Àð"À˜#ÀxÀúiÀZ’À((8eÀ8$À1ÀûhÀe’À»ÀhÀ=—À}À•hÀN—À °ÁÀ»ÀEiÀJÀ#JÀ08beÀ8eÀ $Àð$À%ÀÀ¶kÀ4ÀÂkÀTÀÏkÀxÀúiÀn—À((eÀÈ%ÀbÀûhÀy—ÀõÀ•hÀ˜ÀvÀhÀÙ˜À1ÀûhÀešÀ ¸ÁÀÀØkÀÀÁÀvÀèkÀ0@©eÀeÀ0&À˜&ÀxÀúiÀùšÀ((¬eÀ('À¯ÀhÀ›À€€ÉeÀ¬eÀ'ÀxÀúiÀ?›À((ÎeÀø'À¯ÀhÀJ›À¶ÀèhÀ…›À€€ÉeÀÎeÀ`(À((îeÀbÀûhÀÀ›À¯ÀhÀPœÀ¶ÀèhÀXœÀ(ÀûhÀ`œÀJÀ'iÀßœÀ1ÀûhÀÀÇÀ•hÀ3žÀûÀlÀŸÀáÀlÀTŸÀÿÀ-lÀ  ÀÀûhÀ|¤ÀÀûhÀû§ÀÀ'iÀY­ÀŒÀhÀ[®ÀàÀ•hÀl®À:ÀhÀ‰®ÀýÀ•hÀš®À/ÀhÀ·®ÀHÀ•hÀÈ®ÀQÀhÀå®ÀZÀ•hÀö®ÀgÀhÀ¯À{À•hÀ$¯À“À>lÀA¯ÀžÀZlÀR¯À ÂÀ¯ÀylÀÐÁÀ­À”lÀØÁÀŒÀEiÀÂÀ:ÀEiÀÂÀ´ÀEiÀÈÁÀgÀejÀøÁÀÁÀkÀàÁÀÒÀ«lÀèÁÀ/ÀEiÀðÁÀQÀEiÀÂÀ“À­lÀõLÀúLÀMÀMÀ5MÀ@MÀeMÀyMÀžMÀ·MÀâMÀðMÀ0€ÉeÀîeÀ()Àˆ+Àð,À(( fÀÀÃlÀp¯ÀXÀàlÀ±ÀÀëlÀ±À¯ÀúlÀ3²ÀÍÀëlÀp²ÀøÀmÀõ²ÀÀmÀ&µÀbÀûhÀûµÀ PÂÀ>ÀmÀXÂÀEÀekÀ ÂÀQÀekÀ(ÂÀ[ÀekÀ0ÂÀeÀ0mÀ8ÂÀmÀekÀ@ÂÀxÀQiÀ`ÂÀ}ÀkÀhÂÀ‰ÀekÀHÂÀžÀ2mÀX$fÀ fÀè-À°.À(((fÀ¢À4mÀ`¶ÀbÀûhÀú¶À pÂÀ>ÀQiÀxÂÀQÀekÀˆÂÀžÀ2mÀ€ÂÀeÀ0mÀ(AfÀ(fÀˆ0ÀÀ0À((DfÀ¼ÀiÀD·ÀbÀûhÀ§·À ÂÀÑÀ5iÀ_fÀDfÀØ1À2À #ÀEmÀ?qÀ#ÀpmÀ­qÀ.#À«mÀrÀ@#ÀÖmÀ,rÀd'ÀiÀ=rÀ!ÀnÀorÀJ'ÀnÀ¤rÀhÀhÀ»sÀu'ÀhÀàsÀ|'ÀhÀtÀƒ'ÀhÀ*tÀ((†fÀ€2À„&ýÀhÀñ·ÀŒ'À/nÀ ¸ÀÀMnÀ&¸ÀÝÀnnÀ;¸ÀbÀûhÀܹÀÐ ÀhÀ“»ÀÀ¥nÀ;½ÀÀ•hÀ[¾ÀÆÀ•hÀo¾À¡'À³nÀ†¾À4ÀÎnÀÛ¿À¯'ÀïnÀóÀÀÁ'ÀïnÀÁÀà'À oÀÁÀTÀ/oÀyÃÀû'ÀSoÀëÄÀ(ÀSoÀÅÀ>(ÀèhÀÅÀ_(ÀðhÀ{ÆÀ„(ÀèhÀSÇÀ’(ÀðhÀ«ÈÀ¢(ÀèhÀƒÉÀ°(ÀðhÀÛÊÀÀ(ÀèhÀ³ËÀØ(ÀðhÀÍÀï(ÀhÀóÍÀø(À•hÀ›ÏÀ)ÀtoÀëÐÀ}ÀƒoÀ ÑÀ/À•oÀµÝÀ À oÀYâÀ)ÀƒoÀ’äÀ@À¯oÀ°äÀÌÀÄoÀÏäÀ5)À oÀõéÀM)ÀÜoÀêÀG ÀîoÀ9êÀ ÀpÀõîÀÁ ÀpÀ)ôÀ± À%pÀçôÀx À3pÀ/õÀ!ÀEpÀKúÀ$!À%pÀýÀ2 ÀPpÀaýÀõ ÀûhÀ1ÿÀx!ÀûhÀÑÿÀ À•hÀÀzÀûhÀ™Àq)ÀûhÀ³Àˆ)ÀûhÀÃÀŸ)ÀûhÀÓÀê!ÀûhÀãÀ±ÀiÀÀÀiÀÊÀ§ ÀOkÀ À›ÀiÀ‹ ÀÀ)ÀhÀ5 Àß$ÀOkÀÅ À‰!ÀhÀ ÀÍ$ÀhÀ¡ Àî%ÀhÀ& Àç&ÀhÀ« À8%ÀhÀ0 Àé ÀiÀµ ÀÁÀèhÀþ ÀË)ÀèhÀkÀ9!ÀhÀËÀG!À[pÀÀ×)ÀhÀÛÀá)À[pÀ+Àë)ÀhÀëÀú)ÀhÀÀ *À[pÀ5À*À[pÀ^À'*ÀhÀ‡À2*ÀhÀ¬À$À[pÀÑÀ=*À[pÀúÀJ"ÀOkÀ#Àd"ÀOkÀ{À~"ÀcpÀÓÀ˜"ÀcpÀ.À²"ÀOkÀ‰ÀÈ"ÀOkÀáÀÞ"ÀcpÀ9Àô"ÀcpÀ”ÀH*ÀhÀïÀY*ÀhÀKÀf*ÀèhÀ«!Àm*ÀèhÀ #ÀáÀnpÀk$À€ÀEpÀ”)Àr$ÀèhÀS.À€$ÀûhÀ[.ÀÇ!ÀûhÀ–.À&ÀûhÀÑ.ÀØ!ÀûhÀ /Àt*À„pÀG/À*À’pÀf/À‰#À¦pÀ/Àº*À½pÀ{1ÀÀ#ÀÎpÀ˜1ÀÀåpÀ›3ÀÜ*ÀöpÀÂ3À+À qÀä3Àö#À!qÀ4ÀU!ÀûhÀK6Àh#ÀûhÀá7Às#ÀûhÀ¹CÀý$ÀûhÀûEÀ!ÀûhÀ'IÀW$ÀPpÀƒIÀ‘%ÀûhÀQKÀÒ%ÀPpÀYNÀ:+ÀåpÀOÀf!ÀûhÀûPÀ}#ÀûhÀ‘RÀ.&ÀûhÀ)YÀ¬!ÀûhÀ [Àÿ%ÀPpÀe[À‡&ÀûhÀ1]ÀÊ&ÀPpÀ9`ÀU+À•hÀò`Àù&À;qÀ cÀ'ÀKqÀJfÀI$ÀûhÀLgÀ’$ÀûhÀnÀ_+À\qÀKpÀm+ÀhqÀcpÀv+ÀhqÀ¦pÀ€+ÀhqÀÚpÀŠ+ÀpqÀqÀ ÃÀ•+À…qÀÃÀ›+À…qÀ˜ÂÀÐ ÀwjÀ ÂÀ¡'À‡qÀ¨ÂÀv+À«lÀ°ÂÀ€+À«lÀ¸ÂÀ¢+À«lÀ ÃÀ¯+ÀQiÀ(ÃÀÁ+ÀQiÀÀÂÀÓ+À‡qÀÃÀß+ÀœqÀÃÀí+ÀœqÀ0ÃÀû+ÀœqÀ@ÃÀ,ÀœqÀHÃÀ,ÀœqÀXÃÀ,ÀœqÀhÃÀ),ÀœqÀÈÂÀ4,ÀejÀØÂÀ>,ÀejÀÐÂÀI,À²qÀàÂÀU,ÀÍqÀPÃÀb,ÀekÀèÂÀy,ÀmÀ8ÃÀŠ+ÀéqÀðÂÀ‹,ÀmÀ`ÃÀ™,ÀekÀøÂÀï(ÀwjÀКfÀ†fÀØ3À@@À!-ÀiÀPtÀ>-ÀhÀ-ÀhÀP‹À((¢fÀðCÀHDÀ ®,ÀiÀ’tÀbÀûhÀuÀ-ÀhÀuÀ>-ÀhÀOvÀ¾,ÀhÀyvÀQ-À•hÀvÀÅ,ÀhÀ¯vÀ\-À•hÀÅvÀÐ,ÀhÀåvÀäÀ•hÀûvÀ pÃÀk-ÀEiÀxÃÀs-ÀEiÀ€ÃÀ-ÀEiÀ«VÀ²VÀÊVÀÕVÀñVÀõVÀ }dÀ¢fÀ¨DÀHDÀ EÀFÀ“-ÀhÀwÀP‹À((ÎfÀˆFÀ¨FÀ&ýÀhÀPwÀ-ÀhÀ‘wÀ>-ÀhÀâwÀ„-ÀøqÀ xÀ¡-ÀrÀxÀ ˆÃÀ´-À2mÀ WÀ/WÀåfÀÎfÀGÀ¨FÀˆGÀ°GÀÄ-ÀhÀ.xÀ‘À rÀcxÀ…/ÀiÀdzÀ¤/ÀiÀžzÀ((èfÀHÀ&ýÀhÀ“{ÀbÀûhÀA|ÀäÀ•hÀÎ|ÀÐ,ÀhÀƒ}ÀÔ/À•hÀ”}À`.À•hÀ´}Àã/À•hÀÑ}Àp.À•hÀñ}Àó/ÀhÀ~À#.À•hÀ{~À./ÀhÀÐ~ÀìÀ•hÀ“ƒÀü/ÀèhÀ”„ÀõÀhÀ„À¾,ÀhÀ‡ÀQ-À•hÀ$‡À!0ÀhÀD‡ÀÓ-À•hÀZ‡À10ÀhÀz‡À=0À•hÀ‡À ¨ÃÀ!0À5iÀÃÀ10ÀejÀ˜ÃÀM0ÀejÀ¸ÃÀk-ÀEiÀ°ÃÀ-ÀrÀ ÃÀó/ÀEiÀ«VÀ²VÀñVÀÌWÀàWÀðWÀXÀ XÀ8gÀèfÀÀHÀ¨JÀpKÀÙÀ$rÀ°‡À>-ÀhÀ-ÀhÀP‹À((gÀLÀXLÀZ0À$rÀ÷‡À>-ÀhÀ1ˆÀ-ÀhÀCˆÀy0ÀhÀhˆÀm0À•hÀ~ˆÀ ÀÃÀ0ÀQiÀ([À0[À_fÀgÀ¸LÀXLÀ8MÀ`MÀÙÀ$rÀžˆÀÌ0ÀiÀåˆÀóÀhÀV‰À>-ÀhÀ-ÀhÀP‹À((gÀÀMÀHNÀ Z0À$rÀ¢‰ÀbÀûhÀä‹À ÀhÀIŒÀŠ0À•hÀZŒÀ+ÀhÀ¥ŒÀ™0À•hÀ¶ŒÀ-ÀhÀÀ>-ÀhÀrÀõÀhÀœÀ ÈÃÀ ÀEiÀÐÃÀ+ÀEiÀ0gÀgÀ¨NÀHNÀˆOÀ/ÀiÀ ŽÀJ1ÀiÀg‘À>-ÀhÀ-ÀhÀP‹À((2gÀPÀˆPÀ æ0ÀiÀRŽÀbÀûhÀ«ŽÀV ÀúiÀÀ1ÀhÀ0À11ÀhÀÌÀ>-ÀhÀ&À-ÀhÀÒÀø.ÀhÀš’Àÿ0À•hÀ°’À/ÀhÀÐ’À1À•hÀæ’À ØÃÀc1ÀQiÀàÃÀi1ÀEiÀ \À\À#\À.\À0gÀ2gÀèPÀˆPÀøQÀ@RÀÕ4ÀûhÀ“Àà4ÀûhÀL“À((GgÀ°RÀ¿1ÀhÀ€“À&ýÀhÀ”ÀbÀûhÀè”Àò4À•hÀ‰•À5ÀiÀ–Àä1À3rÀ–À2ÀCrÀ*–ÀC3ÀiÀO©À÷2À3rÀc©À3ÀCrÀx©À 5ÀdrÀù©À4ÀwrÀ4ªÀ™4ÀiÀõªÀ¥3ÀiÀE«ÀÅ3À…rÀ0¬Àt4ÀiÀó®Àë3ÀiÀ¯À¢1ÀhÀ,³ÀJ2ÀèhÀ=³ÀK5ÀðhÀN³À¾3ÀúiÀ^³À^5ÀàlÀo³Ài5ÀèhÀ€³Àu5ÀðhÀ‘³ÀY2À[pÀ¡³À…5À–rÀ²³À (ÄÀ—5ÀEiÀ ÄÀ¬5À¡rÀèÃÀ¿5À´rÀðÃÀÏ5À´rÀÄÀ¢1ÀÂrÀøÃÀ¾3ÀekÀÄÀY2À…qÀÄÀi5ÀkÀÄÀJ2ÀkÀ{]À‹]À¯]À¾]ÀÑ]ÀØ]Àã]Àï]Àÿ]À ^À<agÀGgÀ0SÀ¨UÀÐVÀ((dgÀbÀûhÀóÀô5ÀÐrÀ ´À6ÀhqÀ¼´À#6ÀhÀÄ´Àá5À•hÀÕ´À 0ÄÀ#6ÀEiÀ/^À>^À˜vgÀdgÀ¸WÀ8XÀ`XÀÍ6À'iÀò´À_6À•hÀŒ6À'iÀw6À•hÀ«6ÀÛrÀ0À((zgÀÀXÀHYÀ_6À•hÀEºÀw6À•hÀwºÀŒ6À'iÀ©ºÀ«6ÀÛrÀàºÀÐ ÀhÀ)»ÀÀ•hÀ:»À @ÄÀ­À”lÀHÄÀ/ÀEiÀ8ÄÀø6ÀìrÀPÄÀk-ÀEiÀXÄÀ-ÀrÀ`ÄÀ7ÀejÀhÄÀ7À sÀpÄÀ'7À sÀxÄÀó/ÀEiÀ€ÄÀ@7ÀEiÀˆÄÀX7ÀekÀÄÀl7À0sÀ˜ÄÀ{7ÀylÀ ÄÀˆ7ÀkÀ¨ÄÀœ7ÀkÀ°ÄÀ/À«kÀ¸ÄÀä.ÀEiÀÀÄÀ9!ÀEiÀEÀ6_À¢gÀzgÀ¨YÀHYÀ@ZÀˆ\À0.ÀCsÀW»À((¦gÀè\À ÈÄÀÓ7À«lÀÐÄÀß7À sÀØÄÀð7ÀejÀàÄÀþ7À sÀèÄÀ8ÀEiÀðÄÀ$8ÀVsÀøÄÀ88À«lÀľgÀ¦gÀP]ÀÀLÀ[ÀgÀ…À–À®ÀÈÀÕÀäÀÀÀÀîÀ5À,À:ÀDÀXÀbÀtÀ‚À‰À•ÀðÀÌÀÙÀâÀ¸ÀËÀÛÀ?ÀPÀbÀÀ¨ÀÀ(ÀËÀÒÀõÀÀÀaÀvÀ4À‘ÀÆÀ/ÀàÀýÀÀ/À4À@À5ÀhÀqÀÀ‹ÀÀ¯À°ÀäÀìÀûÀÀ-ÀJÀzÀ…À¦ÀÇÀ¶ÀÙÀóÀÀÀ À+À7À ÀDÀ\ÀÀ!À‡ÀŒÀ¥ÀÂÀãÀóÀÀÝÀ ÀÀ4ÀTÀ}À›À±ÀÁÀÐÀáÀÀ$À/À9ÀOÀ€À±ÀÌÀ À À2 ÀG Àx Àœ À§ À± ÀÁ Àé Àõ À!À!À$!À9!ÀG!ÀáÀU!Àf!Àx!À‰!À!À¬!À¼!ÀÇ!ÀØ!ÀÀê!Àõ!À"À'"ÀJ"Àd"À~"À˜"À²"ÀÈ"ÀÞ"Àô"À #À#À.#À@#ÀR#Àh#Às#À}#À‰#ÀÀÀ#Àö#À4$ÀI$ÀW$Àr$À€$À’$ÀøÀ¯ÀXÀ§$ÀÍ$ÀÀÍÀß$ÀÀé$Àý$À%À8%ÀN%Àh%ÀÿÀ‘%ÀŸ%ÀÒ%Àî%À¢Àÿ%À&À.&ÀC&Àk&À‡&À–&ÀÊ&Àç&À¼Àù&À'À.'À9'ÀJ'À®,À¾,ÀÅ,ÀÐ,ÀÔ,Àí,À-À„-ÀÄ-ÀÓ-ÀQ-Àç-À#.À0.À`.Àp.À.Àš.À¶.ÀÃ.ÀÏ.À!-À\-Àä.Àø.À>-Àý.À/À/À“-À./À:+ÀÀªÈ(?ÀÈ8?ÀÈH?À ÈT?À È^?À Èl?ÀÈ{?ÀÈ”?ÀÈ£?Àȼ?À!ÈÞ?À[È:@ÀȺ@ÀÈÍ@ÀÈç@À Èñ@À ÈÍAÀÈáAÀÈêAÀÈúAÀÈ BÀÈBÀ ÈBÀÈ&BÀÈ.BÀ€È¯BÀÈÉBÀÈÙBÀ ÈåBÀÈõBÀ ÈCÀÈCÀ>ÈRCÀÈâCÀ‚ÈeDÀCÈ©DÀÈ®DÀ8ÈçDÀLÈ4EÀ È?EÀ,È|EÀÈGÀÈŠGÀCÈÎGÀGÈHÀ:ÈQHÀPÈ¢HÀ‹È.IÀvÈ¥IÀmÈEJÀÈcJÀ£ÈKÀ@ÈHKÀÈ]KÀ ÈgKÀÈ}KÀÈKÀ4È´KÀȽKÀDÈLÀ9ÈÈ~OÀJÈÉOÀOÈPÀPÈjPÀNȹPÀDÈþPÀDÈCQÀ?ȃQÀKÈÏQÀQÈ!RÀ*ÈLRÀ6ȃRÀ6ȺRÀÈÃRÀÈÇRÀ<ÈSÀ<ÈASÀÈ]SÀÈwSÀ?È·SÀÈÏSÀ!ÈñSÀ$ÈTÀÈ%TÀÈETÀ)ÈoTÀÈŽTÀȧTÀÈÇTÀÈáTÀÈûTÀÈUÀÈUÀÈ3UÀÈMUÀÈdUÀÈ{UÀÈ•UÀȳUÀÈÐUÀ!ÈòUÀÈVÀ!È4VÀÈOVÀÈmVÀ"ȘVÀȧVÀÈVÀÈ WÀÈWÀÈCWÀYÈWÀÈ¢WÀ È­WÀÈÉWÀÈBXÀÈGXÀÈKXÀÈPXÀÈWXÀÈ^XÀÈbXÀÈfXÀÈkXÀÈsXÀÈzXÀȃXÀȉXÀÈXÀÈ—XÀÈ XÀȧXÀ ȱXÀȵXÀȼXÀ ÈÆXÀÈ×XÀÈèXÀÈüXÀÈYÀÈ(YÀÈ=YÀÈOYÀÈ_YÀÈrYÀÈ„YÀȘYÀÈ®YÀÈÌYÀ"ÈïYÀÈ ZÀ ÈZÀÈ*ZÀÈ:ZÀÈKZÀÈhZÀȈZÀÈœZÀȱZÀÈÉZÀÈÞZÀÈöZÀÈùZÀÈ[ÀÈ"[ÀÈG[ÀÈJ[À ÈW[À.Ȇ[ÀÈ[ÀȪ[ÀÈ»[À ÈÉ[À@ÈJ\À/Èz\À\È×\ÀÈé\ÀÈí\À Èø\ÀÈ]ÀAÈC]ÀÈI]ÀÈR]ÀÈT]À È^]À È—VÀÈh]ÀÈ^ÀÈ_^À"È‚^ÀÈ‹^ÀÈ¥^ÀÈÄ^ÀÈã^ÀÈê^ÀÈò^ÀÈ _À È_ÀÈ_ÀÈ-_ÀÈ__ÀÈu_ÀƒÈù_ÀÈ `ÀÈ`ÀÈ`ÀÈ`À#È:`ÀÈ>`ÀÈC`ÀÈ^`ÀÈa`À$Ȇ`ÀÈ`ÀȪ`ÀÈÈ`À#Èì`ÀÈaÀÈ#aÀÈ=aÀÈYaÀ$ÈÑaÀÈÚaÀÈßaÀÈÃbÀÈØbÀÈðbÀÈôbÀÈübÀ-È*cÀ ÈUcÀÈecÀ ÈpcÀÈycÀÈcÀȉcÀÈ™cÀÈ©cÀȱcÀÈÌcÀ ÈñcÀ È-dÀ((À0(À=À4dÀP°fÀ0gÀlEÀ¦dÀ0 iÀ`iÀlEÀ©dÀ lEÀNdÀPmÀp±À0§ÀЧÀlEÀ©dÀ8ЬÀ ­ÀlEÀëeÀؘÀø˜À™À8™À(`»À€»À=À4dÀ0мÀ½À=À©dÀ0ð½À0¾À=À©dÀ0p¿À°¿À=À©dÀ0ÀÀÀàÀÀ=ÀafÀ8ðÂÀ@ÃÀ=ÀëeÀ8€ÄÀÀÄÀ=ÀefÀ0ÆÀPÆÀ=À©dÀ) ÇÀ@ÇÀ=ÀafÀ0@ÈÀ€ÈÀ=À©dÀ)PÉÀpÉÀ=ÀafÀ0pÊÀ°ÊÀ=À©dÀ)€ËÀ ËÀ=ÀafÀ0°ÌÀðÌÀ=À©dÀ)ÀÍÀàÍÀ=ÀafÀ00ÏÀpÏÀ=À©dÀ0€ÐÀÀÐÀ=À©dÀ0ÐÔÀÕÀ3OÀ©dÀ4°ÛÀÐÛÀ=ÀifÀ,=ÀmfÀ4ÜÀ°ÜÀ=ÀifÀ,=ÀmfÀJðÜÀ`ÝÀ=ÀpfÀ,áÀ°áÀ=ÀafÀ=ÐáÀ âÀ=ÀtfÀ6ÀèÀéÀ=ÀefÀR0éÀ éÀ=ÀxfÀP0îÀ îÀ=ÀpfÀ4ÐòÀóÀ=ÀefÀ< óÀðóÀ=ÀtfÀ,ÐøÀðøÀ=ÀafÀ4pùÀ°ùÀ=ÀefÀ8àùÀ úÀ=ÀefÀ:üÀàüÀ=ÀtfÀ(ðþÀÿÀ=À4dÀ(=À|fÀ8À`À=ÀëeÀ(€À À=À4dÀ(À°À=À4dÀ( ÀÀÀ=À4dÀ(°ÀÐÀ=À4dÀ0À@À=À©dÀ0`À À=À©dÀ0°ÀðÀ=À©dÀ0pÀ°À=À©dÀ0ÀÀÀ=À©dÀ0€ÀÀÀ=À©dÀ0àÀ À=À©dÀ0@!À€!À=À©dÀ0 "Àà"À=À©dÀ0$À@$À=À©dÀ( ,ÀÀ,À=À4dÀ(@-À`-À=À4dÀ4°-ÀÐ-À=ÀifÀ4 .À@.À=ÀifÀ01ÀP1À=À©dÀ003Àp3À=À©dÀ0à5À 6À=À©dÀ@0CÀ€CÀ=ÀfÀ0EÀÐEÀ=À©dÀ@€HÀàHÀ=ÀƒfÀ(KÀ0KÀ=À4dÀ(=À|fÀ0MÀ°MÀ=ÀafÀ8ÐMÀ NÀ=ÀëeÀ0PÀÐPÀ=À©dÀ@ XÀðXÀ=ÀfÀ8€ZÀÐZÀ=ÀëeÀ(ð\À]À=À4dÀ(=À|fÀ0p_À_À=ÀafÀ8°_À`À=ÀëeÀ0 bÀàbÀ=À©dÀ0àoÀ pÀ=À©dÀ0àäÀ åÀKcÀ©dÀ0ìÀPìÀþcÀ©dÀ0ÀìÀíÀ dÀ©dÀ(`ñÀ€ñÀdÀ4dÀ(ðñÀòÀlEÀ4dÀÐØ¨ À¸à˜°ÈèðPxpji`Xhk (008X8@dhp`Hx0P (08P@H  $(@€ˆ˜¨¸È HP08X°`h pÀx0(  08:;( (08@HPX`hpqx€ˆ˜ ¨°¸À˜ ¨˜ (008!ø`ÍB`rCRFRFp pp `ASASASBVBUAp`$CRFRF`Ap RARARARARARARARARARARARARARARARARARARBpRARARARARBp pp `!ASASASBRBUApp0`6ASASASASASASASASASASASASBXBSAppRARARARARARARARARARARARARARARARARARARBpRARARARARBp pp `0ASASASASASASASASASBZBUAp`Ap SCRE`6ASASASASASBZBSAppSCREYASBRBSAppRARARBSCRE\ASASCSApSCRESBSESCREVBSGp0`KASASASASASASASASASASASB\BSAppp0`ASASASASASASASASASASCSAp(p0VASASASASCSAp(p0VASCSAp`!CRE`ŒASASASASASASASASASASASASASASASASASASASASASASASASASASASCSApSARARBp SD`ASASASBVBUApSAp SD`ASBRBUAp\CRE`ögGNNRž³    ,W€ _-À ­@+‘· Ïq@+E@+¸} ] gBÀŠBÜÀ¶B:#ÀÞBG#ÀNC#ÀÉC%%ÀùCí'À=D(ÀSD0(ÀlDC(À¤D:*ÀÌDÞ*ÀEê*À@E÷*ÀmE$,À˜E/,ÀÁE=,ÀóE‰.À*F¤.ÀeF°.ÀœF½.ÀÙFþ.ÀG’/ÀJG0À‘G+0ÀçG3À.H}5À`H–5À³H,6À Im7ÀAIÿ7ÀvI‘8ÀœI„9ÀÅI¨:ÀýI+<À%J(=ÀRJr=À|J>À«JK>ÀÙJ?ÀKW?ÀHK¨?ÀˆKH@À¡KÁ@ÀÊK×@À÷K÷@À$L AÀUL-AÀ…LCAÀ¹LdAÀõLýBÀ"MCÀLMGHÀrM²HÀ¹MDLÀñMYLÀNYMÀHN!NÀoNéNÀ˜NýNÀÍN QÀOÕUÀUO XÀOrXÀÈOšZÀþO§[À=Pý[ÀqP)\À£PU\ÀÖP^ÀðPp^À Qº^À/Q/_ÀRQ½dÀ‰Q°fÀŸQ0gÀ¸Q“gÀÜQ¸hÀR iÀ,R`iÀGR‹iÀqRWkÀ¡RlÀÏRßlÀûRmÀ;SFmÀYSWmÀ{StmÀ›S‘qÀ´S±rÀÛS.sÀöS vÀTvÀ+T vÀFT™wÀaT¶{À€T=|ÀžTÁ|ÀºT”}ÀÜT¥}ÀUÂ}À%UÓ}ÀLUð}ÀoU~À‰U~À§U/~ÀVgÀ(V‚ÀLV^ƒÀzVN„À©V`„ÀÎVŽ…ÀþVª…À,WÁ…À[W„†ÀŽWë†À²Wü†ÀØW ‡ÀýW‡À#X/‡ÀMXL‡ÀsX]‡À›X‰ÀÍXP‰ÀY‹ÀBY'ÀiYãÀ’YëÀ´YŽÀåY¼ŽÀ Z!À?Z–ÀbZœÀ’ZñÀ¼ZßÀãZ$‘À[y‘À-[®‘ÀU[¿‘À~[БÀ§[á‘ÀÔ[þ‘Àú[’À$\,’ÀG\=’Àn\Z’À§\e’ÀÚ\=—À]N—ÀX]n—À‘]y—ÀÆ]˜À^Ù˜À=^ešÀp^ùšÀœ^›ÀÃ^?›Àï^J›À_…›ÀF_À›Ào_PœÀ—_XœÀÈ_`œÀð_ßœÀA`Àh`3žÀ›`ŸÀ×`TŸÀa  ÀSa|¤Àap¦À›a¦Àºa£¦Àúa§ÀbЧÀ)bû§ÀXb«À›bЬÀ´b ­ÀÐbY­Àc[®ÀJcl®Àˆc‰®À·cš®Àêc·®ÀdÈ®À:då®Àddö®À’d¯ÀÇd$¯ÀeA¯À,eR¯À\ep¯À½e±Àf±ÀJf3²Àƒfp²ÀÉfõ²À g&µÀEgûµÀhg`¶Àžgú¶ÀÂgD·Àõg§·Àhñ·À7h ¸Àch&¸Àšh;¸ÀÝhܹÀühA»À/i`»ÀEi€»À^i“»À~ip¼Àši¼À¹i£¼ÀíiмÀj½À j;½ÀRjÔ½À˜jð½À°j0¾ÀËj[¾Àïjo¾À k†¾ÀEkD¿À~kp¿À–k°¿À±kÛ¿ÀèklÀÀ3lÀÀÀKlàÀÀflóÀÀlÁÀÅlÁÀ÷l ÂÀ=mðÂÀUm@ÃÀpmyÃÀ°mÄÀn€ÄÀnÀÄÀ9nëÄÀknÅÀªnÅÀânÞÅÀ.oÆÀGoPÆÀco{ÆÀŸoóÆÀïo ÇÀp@ÇÀ$pSÇÀIpÈÀ‚p@ÈÀ›p€ÈÀ·p«ÈÀÞp#ÉÀqPÉÀ2qpÉÀNqƒÉÀsqHÊÀ¬qpÊÀÅq°ÊÀáqÛÊÀrSËÀCr€ËÀ\r ËÀxr³ËÀ§ryÌÀêr°ÌÀsðÌÀsÍÀMs“ÍÀsÀÍÀ¨sàÍÀÄsóÍÀäsðÎÀt0ÏÀ1tpÏÀMt›ÏÀqt#ÐÀ©t€ÐÀÂtÀÐÀÞtëÐÀ u ÑÀ>uCÓÀ‡uÐÔÀ uÕÀ¼u;ÕÀv-ÛÀv°ÛÀ3vÐÛÀOvãÛÀavÜÀsvÜÀŒv°ÜÀ¨vÃÜÀºvðÜÀÓv`ÝÀïvµÝÀwlßÀEw'áÀWwáÀpw°áÀŒwÐáÀ¥w âÀÁwYâÀ÷w’äÀ*x°äÀixÏäÀµxÌæÀyWèÀ'yÀèÀ@yéÀ\y0éÀuy éÀ‘yõéÀÀyêÀûy9êÀCzìÀŸz0îÀ¸z îÀÔzõîÀýzaòÀ:{ÐòÀS{óÀo{;óÀ¯{ óÀÈ{ðóÀä{)ôÀ#|çôÀJ|/õÀ…|C÷ÀÔ|gøÀæ|ÐøÀÿ|ðøÀ}ùÀ-}pùÀF}°ùÀb}àùÀ{} úÀ—}KúÀº}üÀñ}üÀ ~àüÀ&~ýÀR~aýÀ~~ŒþÀ¾~ðþÀ×~ÿÀó~#ÿÀ61ÿÀ_ÑÿÀ‡À®¥ÀéÀ€`À€™À@€Àv€€À€ À«€³ÀÙ€ÀÀ4°ÀPÃÀ~"ÀÀ ÀÙÀÀõÓÀ-‚2Ày‚°À’‚ÐÀ®‚ãÀЂÀ÷‚ÊÀƒ À>ƒ‹ Àkƒ5 ÀƒÅ À®ƒ ÀÙƒ¡ À„& À*„« ÀS„0 À€„µ À£„þ ÀÉ„ÍÀ…À…@À8…kÀ[…:À’…`À«… ÀÇ…ËÀì…À%†°À>†ðÀZ†À†À¸†pÀц°Àí†ÛÀ‡ÀC‡ÀÀ\‡Àx‡+À™‡+À·€Àç‡ÀÀˆëÀ)ˆÀOˆ5Àuˆ^À›ˆ‡À½ˆ¬À߈ÑÀ‰úÀ#‰#ÀT‰{À…‰ÓÀ¶‰.À牉ÀŠáÀAŠ9ÀnŠ”À›ŠïÀÊðÀÿŠàÀ‹ À4‹KÀX‹L À‹@!À©‹€!ÀÅ‹«!Àã‹r"ÀŒ "À.Œà"ÀJŒ #ÀhŒÒ#ÀšŒ$À³Œ@$ÀÏŒk$À”)Àb,À¾ ,À×À,ÀóÓ,ÀRŽ@-ÀkŽ`-À‡Žs-À掰-ÀÿŽÐ-Àã-Àz .À“@.À¯S.ÀÔ[.Àý–.À%Ñ.ÀO /ÀxG/À¨f/Àì/À:‘0Àœ‘1Àµ‘P1ÀÑ‘{1À ’˜1ÀW’¡2À¸’03ÀÑ’p3Àí’›3À$“Â3Ào“ä3À°“4À”N5Àn”à5À‡” 6À£”K6ÀË”á7À픸BÀ#•0CÀ<•€CÀX•¹CÀy•3EÀ®•EÀÇ•ÐEÀã•ûEÀ–HÀM–€HÀf–àHÀ‚–'IÀ¨–ƒIÀÚ–®JÀ —KÀ9—0KÀU—CKÀž—QKÀ×@LÀü—-MÀ˜MÀ'˜°MÀC˜ÐMÀ\˜ NÀx˜YNÀ«˜OÀݘúOÀ#™PÀ<™ÐPÀX™ûPÀ™‘RÀ¤™-XÀÛ™ XÀô™ðXÀš)YÀ<šZÀ|š€ZÀ•šÐZÀ±š [ÀØše[À ›\ÀR›ð\Àk›]À‡›#]ÀÑ›1]À÷› ^À1œ _ÀCœp_À\œ_Àxœ°_À‘œ`À­œ9`Àáœò`ÀÄaÀ7 bÀPàbÀl cÀJfÀÏLgÀônÀ ž}oÀ`žàoÀyž pÀ•žKpÀºžcpÀÚž¦pÀûžÚpÀŸqÀ>Ÿ?qÀgŸ­qÀŸrÀ¹Ÿ,rÀâŸ=rÀ  orÀ2 ¤rÀc »sÀƒ àsÀ¡ tÀ¿ *tÀß PtÀ¡’tÀH¡uÀn¡uÀ§¡OvÀØ¡yvÀý¡vÀ&¢¯vÀO¢ÅvÀ|¢åvÀž¢ûvÀÄ¢wÀì¢PwÀ £‘wÀ@£âwÀm£ xÀ–£xÀã.xÀí£cxÀ&¤dzÀ`¤žzÀ«¤“{ÀˤA|Àî¤Î|À¥ƒ}À0¥”}ÀZ¥´}À…¥Ñ}À°¥ñ}ÀÜ¥~À¦{~À(¦Ð~ÀQ¦“ƒÀ{¦”„À»¦„À⦇À§$‡À*§D‡ÀU§Z‡À„§z‡À«§‡ÀÖ§°‡À ¨÷‡À=¨1ˆÀm¨CˆÀ¥¨hˆÀʨ~ˆÀ󨞈À$©åˆÀU©V‰À€©¢‰Àª©ä‹ÀÉ©IŒÀë©ZŒÀª¥ŒÀ4ª¶ŒÀ[ªÀªrÀ·ªœÀÚª ŽÀ«RŽÀ@««ŽÀ`«À«0À±«ÌÀâ«&À ¬ÒÀ@¬g‘Àq¬š’Àެ°’À¯¬Ð’ÀÒ¬æ’Àù¬“À!­L“ÀP­€“À’­”À´­è”ÀÙ­‰•À ®–ÀA®–À®*–ÀÇ®¬§ÀÕ®¨Àë®[¨Àø®O©À%¯c©À[¯x©À—¯ù©À߯4ªÀ%°õªÀR°E«Àˆ°0¬À˰ó®Àþ°¯À;±,³Àh±=³À”±N³Àı^³Àè±o³À²€³À9²‘³Àf²¡³À‘²²³ÀÀ²óÀݲ ´À³¼´À6³Ä´ÀZ³Õ´À‚³ò´ÀÀ³EºÀë³wºÀ´©ºÀE´àºÀz´)»À–´:»À¶´W»ÀµÂÀFµ\ÄÀ¡µ7ÐÀ¾µšÐÀÞµäÐÀ ¶áÑÀ=¶éÑÀf¶úÑÀ“¶ÒÀµ¶(ÒÀÛ¶LÖÀ·ˆ×À+·‘ØÀU·1ÙÀ|·úÙÀ»·‚ÚÀÔ·ÕÚÀì·ÛÀ¸ ÜÀ"¸pÜÀG¸·ÜÀ[¸ÝÀo¸SÝÀ…¸¥ÝÀ”¸CÞÀª¸öÞÀøßÀà¸ßÀÿ¸&ßÀ"¹6ßÀ;¹LßÀX¹lßÀk¹‚ßÀ‚¹¢ßÀ–¹¸ßÀ®¹ØßÀ¾¹îßÀÒ¹àÀà¹$àÀò¹PàÀº§àÀRº§áÀzº´áÀ ºâÀɺ@âÀýº€ãÀ» ãÀ8»³ãÀ€»àäÀ–» åÀ¯»KåÀÜ»\èÀ¼éÀ?¼éÀf¼+éÀ‘¼6éÀ¸¼PéÀëÀ8½ìÀN½PìÀg½{ìÀ³½ÀìÀ˽íÀæ½+íÀ¾ãðÀV¾`ñÀn¾€ñÀ‰¾“ñÀ;ðñÀå¾òÀ¿#òÀ'¿ ˆtÀ9¿ ÜtÀK¿ \uÀ]¿ ¨uÀp¿ äuÀƒ¿ vÀ–¿ LvÀ©¿ ¬vÀ½¿ wÀÑ¿ lwÀå¿ ˜wÀù¿ ÄwÀ À ðwÀ!À xÀ5À dxÀIÀ ¬xÀ[À èxÀmÀ(ŠÀŒÀà°À¤À±À¼À@±ÀÖÀp±ÀðÀ±ÀÁ°±À Áà±À;Á0²ÀSÁ`²ÀmÁ²À‡ÁÀ²À¡Áð²À»Á ³ÀÕÁP³ÀðÁ€³À °³À&Âà³ÀA´À\Â@´ÀwÂp´À’ ´À­ÂдÀȵÀãÂ0µÀþÂ`µÀõÀ4ÃÀµÀOÃàµÀjöÀ…Ã0¶À Ã`¶À»Ã¶ÀÖÃÀ¶ÀñÃð¶À Ä ·À'ÄP·ÀBÄ€·À]İ·ÀxÄà·À“ĸÀ®Ä@¸ÀÉÄp¸ÀäÄ ¸ÀÿÄÀ¸ÀÅð¸À5Å ¹ÀPÅP¹ÀkÅ€¹À†Å°¹À¡Åà¹À¼ÅºÀ×Å@ºÀòÅpºÀ Æ ºÀ(ÆкÀCÆ»À^Æ0»ÀyÆ`»À”Æ»À¯ÆÀ»ÀÊÆð»ÀåÆ ¼ÀÇP¼ÀÇ€¼À6ǰ¼ÀQÇà¼ÀlǽÀ‡Ç@½À¢Çp½À½Ç ½ÀØÇÀ½ÀóÇð½ÀÈ ¾À)ÈP¾ÀDÈ€¾À_Ȱ¾ÀzÈà¾À•È¿À°È0¿ÀËÈ`¿ÀæÈ¿ÀÉÀ¿ÀÉð¿À1É ÀÀKÉPÀÀeÉ€ÀÀÉÈÁÀ¾ÉÐÁÀðÉØÁÀ4ÊàÁÀpÊèÁÀ ÊðÁÀÔÊøÁÀËÂÀIËÂÀËÂÀ±ËÂÀéËhÅÀ!ÌpÅÀ\Ì€ÅÀg̈ÅÀqÌÅÀ̘ÅÀ˜Ì ÅÀ¥Ì¨ÅÀ¼Ì©ÅÀÇ̪ÅÀÖÌ«ÅÀã̰ÅÀý̸ÅÀÍÀÅÀ#ÍÈÅÀ=ÍÉÅÀÍÊÅÀÂÍËÅÀôÍÐÅÀÎØÅÀÎàÅÀOÎèÅÀŽÎðÅÀ¡ÎøÅÀ÷ÎÆÀ?ÏÆÀŠÏÆÀØÏÆÀÐÆÀÖÓÀ²À,²ÀE ²Àd(²ÀŽЋÀÀ‹À«ÀÏ Àï@ŒÀ8ŒÀ/ÀNð‹ÀfØ‹À€ø‹À˜à‹À±è‹ÀÌŒÀæ0ŒÀÈ‹À(ŒÀ-ÀG ‹ÀU˜‹Àd˜ŒÀŠ ŒÀ´ÐŒÀÙ¨ŒÀþØŒÀ&HŒÀHXŒÀj`ŒÀˆpŒÀ¡hŒÀ¼ŒÀÞPŒÀùŒÀˆŒÀ5€ŒÀPxŒÀl ŒÀ…àŒÀ¡øŒÀ¾ÀÞèŒÀûðŒÀŒÀ9ÈŒÀ[¨‹Àj°‹À{¸‹ÀŒŒÀ«°ŒÀ¸ŒÀÛÀŒÀôÏÀ \À1¸]ÀK]Àt<ÒÀÓÀŒ(À²˜ˆÀÈØÀíX‚À%0‚À]¸À…(€À¡HˆÀĘƒÀꈄÀ 8„À5èƒÀ\h†ÀHƒÀ«ð…ÀÓ(…Àø†À Ø„ÀC  ƒÀn x…À” €‡À² ЂÀÝ ¸†À È€À% ÀA hÀi ŠÀ  ˆÀ· ‡À× x€Àø ЇÀ èˆÀI `‰Às °‰À 8ÅÀÇ @ÅÀë 0ÅÀ `ÅÀ( HÅÀF PÅÀe XÅÀ€ ¸ÁÀÇ ÀÁÀ °ÁÀP ÁÀƒ  ÁÀ³ ˆÁÀå ¨ÁÀ˜ÁÀEÀÀÀ|¸ÀÀ¯°ÀÀá(ÅÀ  ÅÀ@PÂÀl`ÂÀ ÂÀÌ(ÂÀûhÂÀ58ÂÀeXÂÀ–HÂÀ¿@ÂÀé0ÂÀÃÀEÃÀtÃÀœ¸ÂÀÊ ÃÀý(ÃÀ00ÃÀ^ÐÂÀ‹àÂÀ¹˜ÂÀã ÂÀÃÀ9èÂÀlÈÂÀ—@ÃÀÃXÃÀî¨ÂÀ°ÂÀDPÃÀ|ÀÂÀ©8ÃÀÕðÂÀ`ÃÀ:øÂÀdØÂÀHÃÀ½hÃÀéÂÀpÂÀJxÂÀzˆÂÀ¤€ÂÀÒØÃÀúàÃÀ(ÀÃÀXˆÃÀŒÈÃÀ¸ÐÃÀåpÃÀxÃÀI€ÃÀv˜ÃÀ¨¨ÃÀÝÃÀ¸ÃÀ;°ÃÀe ÃÀ“hÄÀÇÀÄÀò€ÄÀ'ˆÄÀX`ÄÀƒ¸ÄÀ´°ÄÀ×HÄÀùPÄÀ8ÄÀEXÄÀg¨ÄÀ˜˜ÄÀÂxÄÀèpÄÀ@ÄÀBÄÀn ÄÀŸÄÀÖøÃÀÄÀ7(ÄÀsÄÀ©èÃÀàÄÀðÃÀN ÄÀˆØÀÀ°ÐÀÀÝÈÀÀàÀÀ(8ÁÀLÁÀy(ÁÀ¥ÁÀÖÁÀ  ÁÀ3 øÀÀe ðÀÀ– 0ÁÀº èÀÀà ÁÀ!xÁÀ6!PÁÀf!pÁÀ›!hÁÀË!@ÁÀû!€ÁÀ+"`ÁÀY"HÁÀ‰"XÁÀ¸"ÅÀö"ÅÀ&#ÅÀW#ÅÀ‘#0ÄÀ¿#èÄÀö#àÄÀ/$ÈÄÀ`$ðÄÀ™$ØÄÀÌ$øÄÀ%ÐÄÀ=%ÀˆÀW%€À€%€‚À¼%‚Àø%àÀ$&P€ÀD&pˆÀk&ÀƒÀ•&°„À»&`„Àè&„À'†À:'pƒÀj'È…À–'P…À¿'@†Àå'…À(ø‚ÀA( …Àk(0‡À(¨‚À¼(à†Àè(ð€À )@À,)ÀX)؉À€)ø‡À®)X‡ÀÒ) €À÷)¨‡À!*‰ÀP*8‰À~*ˆ‰À¬*gÀ½*.gÀÏ*xÅÀå*²RÀý*×TÀ+WQÀ++‹SÀG+V+e+t+‰+Ÿ+§+°+Á+Ñ+ã+ô+,, 7, N, i, €, Ž, ¡, ¬, ½, ï, - - 8- G- U- i--”-£-´-À-É-Ø-õ-. ...0.P.^.s.“. ¨.¹.Æ. è./%/L/S/g/†/«/¾/Ô/î/ 0)0C0O0o0 …0¥0À0ß0ö0 1,1B1]1 r1 ‡1 ¦1Ä1 ß1 2#2 =2Y2n2ˆ2¨2¾2×2 ô2 3 23 M3k3Ž3¥3 ¼3Ò3ñ3 474Z4q4ˆ4 ¡4 ·4Ô4 è4 5585Y5s5 Ž5¬5 Ç5à56'626S6f6t6ƒ6Œ6¡6»6Õ6è6ú67-7C7R7h7†77@¤7º7Ñ7å7ý78$8 F8O8[8r88“8¦8¸8Ô8ñ89!959@X9@w9@“9@¤9@´9@Ä9@Ú9@ì9@ý9@:@ :@2:::@:H:N:U:^:n:Š:¥:¼:Î:ß:ð:; ;:;^;;œ;®;½;Ì;Ó;Ú;à;î;û; <<%<1<><F<S<`<r<}< ’< £< ³< Ë< Ý< ò< =4=T=n=„=—=­=Ô= ÿ= "> E> h>@{>ƒ>‹>“>›>¡>µ>Ç>ß>ñ>??-?;?O?c?w?‰??•?›?§?¯?·?Á?É?Ñ?Ù?à?@ñ?@@@@@-@@>@@R@@i@@€@@@@¿@@Ð@@è@@ý@@A@*A@DA@_A@zA@”A@§A@½A@ËA@ÝA@òA@ÿA@B@-B@@B@VB‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¹½¾ÃÆÇÈ     !"6789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWZnopqrstuvwxy{}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§@¶·¸º»¼¿ÀÁÂÄÅÉÊËÌÍþ #$%&'*+,-./012345XY[\]^_`abcdefghijklmz‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¹½¾ÃÆÇÈ     !"6789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWZnopqrstuvwxy{}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦_ComputeHash_GCDAsyncSocketErrorDomain_GCDAsyncSocketException_GCDAsyncSocketSSLCipherSuites_GCDAsyncSocketSSLDiffieHellmanParameters_GrowlGNTP3DES_GrowlGNTPAES_GrowlGNTPApplicationBundleIDHeader_GrowlGNTPApplicationDataPrefix_GrowlGNTPApplicationIconHeader_GrowlGNTPApplicationNameHeader_GrowlGNTPApplicationPIDHeader_GrowlGNTPCallbackClick_GrowlGNTPCallbackClicked_GrowlGNTPCallbackClose_GrowlGNTPCallbackClosed_GrowlGNTPCallbackTimedout_GrowlGNTPCallbackTimeout_GrowlGNTPCallbackTypeHeader_GrowlGNTPDES_GrowlGNTPErrorResponseType_GrowlGNTPExtensionPrefix_GrowlGNTPMD5_GrowlGNTPNone_GrowlGNTPNotificationCallbackContext_GrowlGNTPNotificationCallbackContextType_GrowlGNTPNotificationCallbackResult_GrowlGNTPNotificationCallbackTarget_GrowlGNTPNotificationCallbackTimestamp_GrowlGNTPNotificationCountHeader_GrowlGNTPNotificationDisplayName_GrowlGNTPNotificationEnabled_GrowlGNTPNotificationID_GrowlGNTPNotificationIcon_GrowlGNTPNotificationMessageType_GrowlGNTPNotificationName_GrowlGNTPNotificationPriority_GrowlGNTPNotificationSticky_GrowlGNTPNotificationText_GrowlGNTPNotificationTitle_GrowlGNTPOKResponseType_GrowlGNTPOriginMachineName_GrowlGNTPOriginPlatformName_GrowlGNTPOriginPlatformVersion_GrowlGNTPOriginSoftwareName_GrowlGNTPOriginSoftwareVersion_GrowlGNTPRegisterMessageType_GrowlGNTPResponseSubscriptionTTL_GrowlGNTPSHA1_GrowlGNTPSHA256_GrowlGNTPSHA512_GrowlGNTPSubscribeMessageType_GrowlGNTPSubscriberID_GrowlGNTPSubscriberName_GrowlGNTPSubscriberPort_GrowlGetSystemVersion_Growl_GetPSNForProcessWithBundlePath_Growl_HelperAppIsRunning_Growl_ProcessExistsWithBundleIdentifier_HexEncode_HexUnencode_ISO8601DefaultTimeSeparatorCharacter_OBJC_CLASS_$_GNTPKey_OBJC_CLASS_$_GrowlApplicationBridge_OBJC_CLASS_$_GrowlApplicationBridgeNotificationAttempt_OBJC_CLASS_$_GrowlApplicationBridgeRegistrationAttempt_OBJC_CLASS_$_GrowlCommunicationAttempt_OBJC_CLASS_$_GrowlDelegate_OBJC_CLASS_$_GrowlErrorGNTPPacket_OBJC_CLASS_$_GrowlGCDAsyncReadPacket_OBJC_CLASS_$_GrowlGCDAsyncSocket_OBJC_CLASS_$_GrowlGCDAsyncSpecialPacket_OBJC_CLASS_$_GrowlGCDAsyncWritePacket_OBJC_CLASS_$_GrowlGNTPBinaryChunk_OBJC_CLASS_$_GrowlGNTPCommunicationAttempt_OBJC_CLASS_$_GrowlGNTPEncryptedHeaders_OBJC_CLASS_$_GrowlGNTPEndHeaderItem_OBJC_CLASS_$_GrowlGNTPHeaderItem_OBJC_CLASS_$_GrowlGNTPInitialHeaderItem_OBJC_CLASS_$_GrowlGNTPNotificationAttempt_OBJC_CLASS_$_GrowlGNTPOutgoingPacket_OBJC_CLASS_$_GrowlGNTPPacket_OBJC_CLASS_$_GrowlGNTPRegistrationAttempt_OBJC_CLASS_$_GrowlISO8601DateFormatter_OBJC_CLASS_$_GrowlMiniDispatch_OBJC_CLASS_$_GrowlMistView_OBJC_CLASS_$_GrowlMistWindowController_OBJC_CLASS_$_GrowlNetworkUtilities_OBJC_CLASS_$_GrowlNotificationGNTPPacket_OBJC_CLASS_$_GrowlOkGNTPPacket_OBJC_CLASS_$_GrowlPathUtilities_OBJC_CLASS_$_GrowlRegisterGNTPPacket_OBJC_CLASS_$_GrowlXPCCommunicationAttempt_OBJC_CLASS_$_GrowlXPCNotificationAttempt_OBJC_CLASS_$_GrowlXPCRegistrationAttempt_OBJC_IVAR_$_GNTPKey._encryptionAlgorithm_OBJC_IVAR_$_GNTPKey._encryptionKey_OBJC_IVAR_$_GNTPKey._hashAlgorithm_OBJC_IVAR_$_GNTPKey._iv_OBJC_IVAR_$_GNTPKey._keyHash_OBJC_IVAR_$_GNTPKey._password_OBJC_IVAR_$_GNTPKey._salt_OBJC_IVAR_$_GrowlApplicationBridgeNotificationAttempt.growlConnection_OBJC_IVAR_$_GrowlApplicationBridgeNotificationAttempt.growlProxy_OBJC_IVAR_$_GrowlApplicationBridgeRegistrationAttempt.applicationName_OBJC_IVAR_$_GrowlCommunicationAttempt.attemptType_OBJC_IVAR_$_GrowlCommunicationAttempt.delegate_OBJC_IVAR_$_GrowlCommunicationAttempt.dictionary_OBJC_IVAR_$_GrowlCommunicationAttempt.error_OBJC_IVAR_$_GrowlCommunicationAttempt.nextAttempt_OBJC_IVAR_$_GrowlDelegate.applicationIconDataForGrowl_OBJC_IVAR_$_GrowlDelegate.applicationNameForGrowl_OBJC_IVAR_$_GrowlDelegate.registrationDictionary_OBJC_IVAR_$_GrowlErrorGNTPPacket.errorCode_OBJC_IVAR_$_GrowlErrorGNTPPacket.errorDescription_OBJC_IVAR_$_GrowlGCDAsyncReadPacket.buffer_OBJC_IVAR_$_GrowlGCDAsyncReadPacket.bufferOwner_OBJC_IVAR_$_GrowlGCDAsyncReadPacket.bytesDone_OBJC_IVAR_$_GrowlGCDAsyncReadPacket.maxLength_OBJC_IVAR_$_GrowlGCDAsyncReadPacket.originalBufferLength_OBJC_IVAR_$_GrowlGCDAsyncReadPacket.readLength_OBJC_IVAR_$_GrowlGCDAsyncReadPacket.startOffset_OBJC_IVAR_$_GrowlGCDAsyncReadPacket.tag_OBJC_IVAR_$_GrowlGCDAsyncReadPacket.term_OBJC_IVAR_$_GrowlGCDAsyncReadPacket.timeout_OBJC_IVAR_$_GrowlGCDAsyncSocket.accept4Source_OBJC_IVAR_$_GrowlGCDAsyncSocket.accept6Source_OBJC_IVAR_$_GrowlGCDAsyncSocket.config_OBJC_IVAR_$_GrowlGCDAsyncSocket.connectIndex_OBJC_IVAR_$_GrowlGCDAsyncSocket.connectInterface4_OBJC_IVAR_$_GrowlGCDAsyncSocket.connectInterface6_OBJC_IVAR_$_GrowlGCDAsyncSocket.connectTimer_OBJC_IVAR_$_GrowlGCDAsyncSocket.currentRead_OBJC_IVAR_$_GrowlGCDAsyncSocket.currentWrite_OBJC_IVAR_$_GrowlGCDAsyncSocket.delegate_OBJC_IVAR_$_GrowlGCDAsyncSocket.delegateQueue_OBJC_IVAR_$_GrowlGCDAsyncSocket.flags_OBJC_IVAR_$_GrowlGCDAsyncSocket.partialReadBuffer_OBJC_IVAR_$_GrowlGCDAsyncSocket.readQueue_OBJC_IVAR_$_GrowlGCDAsyncSocket.readSource_OBJC_IVAR_$_GrowlGCDAsyncSocket.readTimer_OBJC_IVAR_$_GrowlGCDAsyncSocket.socket4FD_OBJC_IVAR_$_GrowlGCDAsyncSocket.socket6FD_OBJC_IVAR_$_GrowlGCDAsyncSocket.socketFDBytesAvailable_OBJC_IVAR_$_GrowlGCDAsyncSocket.socketQueue_OBJC_IVAR_$_GrowlGCDAsyncSocket.sslContext_OBJC_IVAR_$_GrowlGCDAsyncSocket.sslReadBuffer_OBJC_IVAR_$_GrowlGCDAsyncSocket.sslWriteCachedLength_OBJC_IVAR_$_GrowlGCDAsyncSocket.userData_OBJC_IVAR_$_GrowlGCDAsyncSocket.writeQueue_OBJC_IVAR_$_GrowlGCDAsyncSocket.writeSource_OBJC_IVAR_$_GrowlGCDAsyncSocket.writeTimer_OBJC_IVAR_$_GrowlGCDAsyncSpecialPacket.tlsSettings_OBJC_IVAR_$_GrowlGCDAsyncWritePacket.buffer_OBJC_IVAR_$_GrowlGCDAsyncWritePacket.bytesDone_OBJC_IVAR_$_GrowlGCDAsyncWritePacket.tag_OBJC_IVAR_$_GrowlGCDAsyncWritePacket.timeout_OBJC_IVAR_$_GrowlGNTPBinaryChunk._data_OBJC_IVAR_$_GrowlGNTPBinaryChunk._identifier_OBJC_IVAR_$_GrowlGNTPEncryptedHeaders._headers_OBJC_IVAR_$_GrowlGNTPEndHeaderItem._connectionType_OBJC_IVAR_$_GrowlGNTPHeaderItem.headerName_OBJC_IVAR_$_GrowlGNTPHeaderItem.headerValue_OBJC_IVAR_$_GrowlGNTPInitialHeaderItem.mAction_OBJC_IVAR_$_GrowlGNTPInitialHeaderItem.mEncryption_OBJC_IVAR_$_GrowlGNTPInitialHeaderItem.mKey_OBJC_IVAR_$_GrowlGNTPOutgoingPacket.binaryChunks_OBJC_IVAR_$_GrowlGNTPOutgoingPacket.growlDictionary_OBJC_IVAR_$_GrowlGNTPOutgoingPacket.headerItems_OBJC_IVAR_$_GrowlGNTPOutgoingPacket.mAction_OBJC_IVAR_$_GrowlGNTPOutgoingPacket.mKey_OBJC_IVAR_$_GrowlGNTPOutgoingPacket.packetID_OBJC_IVAR_$_GrowlGNTPPacket.binaryDataByIdentifier_OBJC_IVAR_$_GrowlGNTPPacket.connectedHost_OBJC_IVAR_$_GrowlGNTPPacket.currentBinaryIdentifier_OBJC_IVAR_$_GrowlGNTPPacket.currentBinaryLength_OBJC_IVAR_$_GrowlGNTPPacket.customHeaders_OBJC_IVAR_$_GrowlGNTPPacket.encryptionAlgorithm_OBJC_IVAR_$_GrowlGNTPPacket.error_OBJC_IVAR_$_GrowlGNTPPacket.host_OBJC_IVAR_$_GrowlGNTPPacket.mAction_OBJC_IVAR_$_GrowlGNTPPacket.mDelegate_OBJC_IVAR_$_GrowlGNTPPacket.mKey_OBJC_IVAR_$_GrowlGNTPPacket.networkReadComplete_OBJC_IVAR_$_GrowlGNTPPacket.originPacket_OBJC_IVAR_$_GrowlGNTPPacket.packetID_OBJC_IVAR_$_GrowlGNTPPacket.pendingBinaryIdentifiers_OBJC_IVAR_$_GrowlGNTPPacket.socket_OBJC_IVAR_$_GrowlGNTPPacket.specificPacket_OBJC_IVAR_$_GrowlGNTPPacket.wasInitiatedLocally_OBJC_IVAR_$_GrowlISO8601DateFormatter.defaultTimeZone_OBJC_IVAR_$_GrowlISO8601DateFormatter.format_OBJC_IVAR_$_GrowlISO8601DateFormatter.includeTime_OBJC_IVAR_$_GrowlISO8601DateFormatter.lastUsedFormatString_OBJC_IVAR_$_GrowlISO8601DateFormatter.parsesStrictly_OBJC_IVAR_$_GrowlISO8601DateFormatter.parsingCalendar_OBJC_IVAR_$_GrowlISO8601DateFormatter.timeSeparator_OBJC_IVAR_$_GrowlISO8601DateFormatter.unparsingCalendar_OBJC_IVAR_$_GrowlISO8601DateFormatter.unparsingFormatter_OBJC_IVAR_$_GrowlMiniDispatch.delegate_OBJC_IVAR_$_GrowlMiniDispatch.queuedWindows_OBJC_IVAR_$_GrowlMiniDispatch.windows_OBJC_IVAR_$_GrowlMistView.clipPath_OBJC_IVAR_$_GrowlMistView.delegate_OBJC_IVAR_$_GrowlMistView.notificationImage_OBJC_IVAR_$_GrowlMistView.notificationText_OBJC_IVAR_$_GrowlMistView.notificationTextAttrs_OBJC_IVAR_$_GrowlMistView.notificationTextFont_OBJC_IVAR_$_GrowlMistView.notificationTitle_OBJC_IVAR_$_GrowlMistView.notificationTitleAttrs_OBJC_IVAR_$_GrowlMistView.notificationTitleFont_OBJC_IVAR_$_GrowlMistView.selected_OBJC_IVAR_$_GrowlMistView.strokePath_OBJC_IVAR_$_GrowlMistView.trackingArea_OBJC_IVAR_$_GrowlMistWindowController.closed_OBJC_IVAR_$_GrowlMistWindowController.delegate_OBJC_IVAR_$_GrowlMistWindowController.fadeAnimation_OBJC_IVAR_$_GrowlMistWindowController.lifetime_OBJC_IVAR_$_GrowlMistWindowController.mistView_OBJC_IVAR_$_GrowlMistWindowController.selected_OBJC_IVAR_$_GrowlMistWindowController.sticky_OBJC_IVAR_$_GrowlMistWindowController.userInfo_OBJC_IVAR_$_GrowlMistWindowController.visible_OBJC_IVAR_$_GrowlNotificationGNTPPacket.callbackTargetMethod_OBJC_IVAR_$_GrowlNotificationGNTPPacket.iconID_OBJC_IVAR_$_GrowlNotificationGNTPPacket.iconURL_OBJC_IVAR_$_GrowlNotificationGNTPPacket.notificationDict_OBJC_IVAR_$_GrowlOkGNTPPacket.responseAction_OBJC_IVAR_$_GrowlRegisterGNTPPacket.applicationIconID_OBJC_IVAR_$_GrowlRegisterGNTPPacket.currentNotification_OBJC_IVAR_$_GrowlRegisterGNTPPacket.currentStep_OBJC_IVAR_$_GrowlRegisterGNTPPacket.mApplicationIconURL_OBJC_IVAR_$_GrowlRegisterGNTPPacket.notifications_OBJC_IVAR_$_GrowlRegisterGNTPPacket.numberOfNotifications_OBJC_IVAR_$_GrowlRegisterGNTPPacket.registrationDict_OBJC_METACLASS_$_GNTPKey_OBJC_METACLASS_$_GrowlApplicationBridge_OBJC_METACLASS_$_GrowlApplicationBridgeNotificationAttempt_OBJC_METACLASS_$_GrowlApplicationBridgeRegistrationAttempt_OBJC_METACLASS_$_GrowlCommunicationAttempt_OBJC_METACLASS_$_GrowlDelegate_OBJC_METACLASS_$_GrowlErrorGNTPPacket_OBJC_METACLASS_$_GrowlGCDAsyncReadPacket_OBJC_METACLASS_$_GrowlGCDAsyncSocket_OBJC_METACLASS_$_GrowlGCDAsyncSpecialPacket_OBJC_METACLASS_$_GrowlGCDAsyncWritePacket_OBJC_METACLASS_$_GrowlGNTPBinaryChunk_OBJC_METACLASS_$_GrowlGNTPCommunicationAttempt_OBJC_METACLASS_$_GrowlGNTPEncryptedHeaders_OBJC_METACLASS_$_GrowlGNTPEndHeaderItem_OBJC_METACLASS_$_GrowlGNTPHeaderItem_OBJC_METACLASS_$_GrowlGNTPInitialHeaderItem_OBJC_METACLASS_$_GrowlGNTPNotificationAttempt_OBJC_METACLASS_$_GrowlGNTPOutgoingPacket_OBJC_METACLASS_$_GrowlGNTPPacket_OBJC_METACLASS_$_GrowlGNTPRegistrationAttempt_OBJC_METACLASS_$_GrowlISO8601DateFormatter_OBJC_METACLASS_$_GrowlMiniDispatch_OBJC_METACLASS_$_GrowlMistView_OBJC_METACLASS_$_GrowlMistWindowController_OBJC_METACLASS_$_GrowlNetworkUtilities_OBJC_METACLASS_$_GrowlNotificationGNTPPacket_OBJC_METACLASS_$_GrowlOkGNTPPacket_OBJC_METACLASS_$_GrowlPathUtilities_OBJC_METACLASS_$_GrowlRegisterGNTPPacket_OBJC_METACLASS_$_GrowlXPCCommunicationAttempt_OBJC_METACLASS_$_GrowlXPCNotificationAttempt_OBJC_METACLASS_$_GrowlXPCRegistrationAttempt_SSLReadFunction_SSLWriteFunction_TCPServerErrorDomain_createAliasDataWithURL_dockDescriptionWithURL_fileURLWithAliasData_fileURLWithDockDescription_AEDisposeDesc_AESendMessage_AEStreamClose_AEStreamCreateEvent_AEStreamWriteKeyDesc_CC_MD5_CC_SHA1_CC_SHA256_Final_CC_SHA256_Init_CC_SHA256_Update_CC_SHA512_Final_CC_SHA512_Init_CC_SHA512_Update_CFBundleGetBundleWithIdentifier_CFBundleGetIdentifier_CFBundleGetInfoDictionary_CFBundleGetMainBundle_CFDataCreate_CFMakeCollectable_CFRelease_CFStringCompare_CFStringGetMaximumSizeOfFileSystemRepresentation_CFURLCopyFileSystemPath_CFURLCopyScheme_CFURLCreateWithFileSystemPath_CFURLGetFSRef_CFUUIDCreate_CFUUIDCreateString_CGRectIntersectsRect_CGWindowLevelForKey_DisposeHandle_FSCopyAliasInfo_FSNewAlias_Gestalt_GetHandleSize_GetMacOSStatusCommentString_GetNextProcess_HLock_HUnlock_NSApp_NSCocoaErrorDomain_NSConnectionDidDieNotification_NSEqualSizes_NSFontAttributeName_NSForegroundColorAttributeName_NSGregorianCalendar_NSHomeDirectory_NSInsetRect_NSInternalInconsistencyException_NSLocalizedDescriptionKey_NSLocalizedFailureReasonErrorKey_NSLocalizedRecoverySuggestionErrorKey_NSLog_NSPOSIXErrorDomain_NSParagraphStyleAttributeName_NSSearchPathForDirectoriesInDomains_NSStringFromClass_NSTemporaryDirectory_NSViewAnimationEffectKey_NSViewAnimationFadeInEffect_NSViewAnimationFadeOutEffect_NSViewAnimationTargetKey_NSZeroRect_OBJC_CLASS_$_NSAffineTransform_OBJC_CLASS_$_NSArray_OBJC_CLASS_$_NSAutoreleasePool_OBJC_CLASS_$_NSBezierPath_OBJC_CLASS_$_NSBitmapImageRep_OBJC_CLASS_$_NSBundle_OBJC_CLASS_$_NSCalendar_OBJC_CLASS_$_NSCharacterSet_OBJC_CLASS_$_NSColor_OBJC_CLASS_$_NSConnection_OBJC_CLASS_$_NSData_OBJC_CLASS_$_NSDate_OBJC_CLASS_$_NSDateComponents_OBJC_CLASS_$_NSDateFormatter_OBJC_CLASS_$_NSDictionary_OBJC_CLASS_$_NSDistributedNotificationCenter_OBJC_CLASS_$_NSError_OBJC_CLASS_$_NSException_OBJC_CLASS_$_NSFileManager_OBJC_CLASS_$_NSFont_OBJC_CLASS_$_NSFormatter_OBJC_CLASS_$_NSGraphicsContext_OBJC_CLASS_$_NSImage_OBJC_CLASS_$_NSIndexSet_OBJC_CLASS_$_NSMutableArray_OBJC_CLASS_$_NSMutableData_OBJC_CLASS_$_NSMutableDictionary_OBJC_CLASS_$_NSMutableSet_OBJC_CLASS_$_NSMutableString_OBJC_CLASS_$_NSNotificationCenter_OBJC_CLASS_$_NSNumber_OBJC_CLASS_$_NSObject_OBJC_CLASS_$_NSPanel_OBJC_CLASS_$_NSParagraphStyle_OBJC_CLASS_$_NSProcessInfo_OBJC_CLASS_$_NSPropertyListSerialization_OBJC_CLASS_$_NSRunningApplication_OBJC_CLASS_$_NSScreen_OBJC_CLASS_$_NSString_OBJC_CLASS_$_NSTimeZone_OBJC_CLASS_$_NSTimer_OBJC_CLASS_$_NSTrackingArea_OBJC_CLASS_$_NSURL_OBJC_CLASS_$_NSUserDefaults_OBJC_CLASS_$_NSView_OBJC_CLASS_$_NSViewAnimation_OBJC_CLASS_$_NSWindowController_OBJC_CLASS_$_NSWorkspace_OBJC_EHTYPE_$_NSException_OBJC_METACLASS_$_NSFormatter_OBJC_METACLASS_$_NSObject_OBJC_METACLASS_$_NSView_OBJC_METACLASS_$_NSWindowController_ProcessInformationCopyDictionary_PtrToHand_SCDynamicStoreCopyLocalHostName_SSLDisposeContext_SSLHandshake_SSLNewContext_SSLRead_SSLSetAllowsAnyRoot_SSLSetAllowsExpiredCerts_SSLSetAllowsExpiredRoots_SSLSetCertificate_SSLSetConnection_SSLSetDiffieHellmanParams_SSLSetEnableCertVerify_SSLSetEnabledCiphers_SSLSetIOFuncs_SSLSetPeerDomainName_SSLSetProtocolVersionEnabled_SSLWrite_SecRandomCopyBytes__Block_object_assign__Block_object_dispose__DefaultRuneLocale__NSConcreteGlobalBlock__NSConcreteStackBlock__Unwind_Resume___CFConstantStringClassReference___error___maskrune___objc_personality_v0___sprintf_chk___stack_chk_fail___stack_chk_guard__dispatch_main_q__dispatch_source_type_read__dispatch_source_type_timer__dispatch_source_type_write__objc_empty_cache__objc_empty_vtable__xpc_error_connection_interrupted__xpc_error_connection_invalid__xpc_error_key_description__xpc_type_array__xpc_type_bool__xpc_type_data__xpc_type_dictionary__xpc_type_double__xpc_type_error__xpc_type_int64__xpc_type_string__xpc_type_uint64_accept_bind_calloc_ceil_close_connect_dispatch_async_dispatch_get_current_queue_dispatch_get_global_queue_dispatch_queue_create_dispatch_release_dispatch_resume_dispatch_retain_dispatch_source_cancel_dispatch_source_create_dispatch_source_get_data_dispatch_source_set_cancel_handler_dispatch_source_set_event_handler_dispatch_source_set_timer_dispatch_suspend_dispatch_sync_dispatch_time_fcntl_floor_free_freeaddrinfo_freeifaddrs_fstat$INODE64_gai_strerror_getaddrinfo_getifaddrs_getpeername_getpid_getsockname_in6addr_any_in6addr_loopback_inet_ntop_kCFAllocatorDefault_kCFBooleanFalse_kCFBooleanTrue_kCFBundleIdentifierKey_kCFBundleNameKey_kCFBundleVersionKey_kCFStreamSSLAllowsAnyRoot_kCFStreamSSLAllowsExpiredCertificates_kCFStreamSSLAllowsExpiredRoots_kCFStreamSSLCertificates_kCFStreamSSLIsServer_kCFStreamSSLLevel_kCFStreamSSLPeerName_kCFStreamSSLValidatesCertificateChain_kCFStreamSocketSecurityLevelNegotiatedSSL_kCFStreamSocketSecurityLevelSSLv2_kCFStreamSocketSecurityLevelSSLv3_kCFStreamSocketSecurityLevelTLSv1_kSecRandomDefault_listen_malloc_memcmp_memcpy_modf_objc_assign_global_objc_assign_ivar_objc_assign_strongCast_objc_begin_catch_objc_end_catch_objc_enumerationMutation_objc_getProperty_objc_msgSend_objc_msgSendSuper2_objc_msgSend_fixup_objc_msgSend_stret_objc_setProperty_open_poll_read_setsockopt_socket_strcmp_strerror_strlen_strtol_truncf_write_xpc_array_apply_xpc_array_create_xpc_array_get_count_xpc_array_set_value_xpc_bool_create_xpc_bool_get_value_xpc_connection_create_xpc_connection_resume_xpc_connection_send_message_xpc_connection_set_event_handler_xpc_data_create_xpc_data_get_bytes_ptr_xpc_data_get_length_xpc_dictionary_apply_xpc_dictionary_create_xpc_dictionary_get_count_xpc_dictionary_get_string_xpc_dictionary_set_string_xpc_dictionary_set_value_xpc_double_create_xpc_double_get_value_xpc_get_type_xpc_int64_create_xpc_int64_get_value_xpc_release_xpc_string_create_xpc_string_get_string_ptr_xpc_uint64_create_xpc_uint64_get_valuedyld_stub_binder+[GrowlApplicationBridge attempts]+[GrowlApplicationBridge setGrowlDelegate:]+[GrowlApplicationBridge growlDelegate]+[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:]+[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:identifier:]+[GrowlApplicationBridge notifyWithDictionary:]___47+[GrowlApplicationBridge notifyWithDictionary:]_block_invoke_0___copy_helper_block____destroy_helper_block_+[GrowlApplicationBridge isNotificationDefaultEnabled:]+[GrowlApplicationBridge isMistEnabled]+[GrowlApplicationBridge setShouldUseBuiltInNotifications:]+[GrowlApplicationBridge shouldUseBuiltInNotifications]+[GrowlApplicationBridge _fireMiniDispatch:]+[GrowlApplicationBridge isGrowlInstalled]+[GrowlApplicationBridge isGrowlRunning]+[GrowlApplicationBridge registerWithDictionary:]+[GrowlApplicationBridge reregisterGrowlNotifications]+[GrowlApplicationBridge setWillRegisterWhenGrowlIsReady:]+[GrowlApplicationBridge willRegisterWhenGrowlIsReady]+[GrowlApplicationBridge registrationDictionaryFromDelegate]+[GrowlApplicationBridge registrationDictionaryFromBundle:]+[GrowlApplicationBridge bestRegistrationDictionary]+[GrowlApplicationBridge registrationDictionaryByFillingInDictionary:]+[GrowlApplicationBridge registrationDictionaryByFillingInDictionary:restrictToKeys:]+[GrowlApplicationBridge notificationDictionaryByFillingInDictionary:]+[GrowlApplicationBridge frameworkInfoDictionary]+[GrowlApplicationBridge _applicationNameForGrowlSearchingRegistrationDictionary:]+[GrowlApplicationBridge _applicationIconDataForGrowlSearchingRegistrationDictionary:]+[GrowlApplicationBridge growlNotificationWasClicked:]+[GrowlApplicationBridge growlNotificationTimedOut:]+[GrowlApplicationBridge _emptyQueue]+[GrowlApplicationBridge _growlIsReady:]+[GrowlApplicationBridge _growlIsReachableUpdateCache:]+[GrowlApplicationBridge _checkSandbox]+[GrowlApplicationBridge attemptDidSucceed:]+[GrowlApplicationBridge attemptDidFail:]+[GrowlApplicationBridge finishedWithAttempt:]+[GrowlApplicationBridge queueAndReregister:]+[GrowlApplicationBridge notificationClicked:context:]+[GrowlApplicationBridge notificationTimedOut:context:]-[GrowlDelegate initWithAllNotifications:defaultNotifications:]-[GrowlDelegate dealloc]-[GrowlDelegate applicationNameForGrowl]-[GrowlDelegate setApplicationNameForGrowl:]-[GrowlDelegate applicationIconDataForGrowl]-[GrowlDelegate setApplicationIconDataForGrowl:]-[GrowlDelegate registrationDictionaryForGrowl]-[GrowlDelegate setRegistrationDictionaryForGrowl:]+[GrowlPathUtilities bundleForProcessWithBundleIdentifier:]+[GrowlPathUtilities runningHelperAppBundle]+[GrowlPathUtilities growlPrefPaneBundle]+[GrowlPathUtilities helperAppBundle]+[GrowlPathUtilities searchPathForDirectory:inDomains:mustBeWritable:]+[GrowlPathUtilities searchPathForDirectory:inDomains:]+[GrowlPathUtilities growlSupportDirectory]+[GrowlPathUtilities screenshotsDirectory]+[GrowlPathUtilities ticketsDirectory]+[GrowlPathUtilities nextScreenshotName]+[GrowlPathUtilities nextScreenshotNameInDirectory:]+[GrowlPathUtilities defaultSavePathForTicketWithApplicationName:]-[NSImage(GrowlImageAdditions) drawScaledInRect:operation:fraction:]-[NSImage(GrowlImageAdditions) adjustSizeToDrawAtSize:]-[NSImage(GrowlImageAdditions) bestRepresentationForSize:]-[NSImage(GrowlImageAdditions) representationOfSize:]-[NSImage(GrowlImageAdditions) replacementObjectForPortCoder:]-[NSImage(GrowlImageAdditions) GrowlBitmapImageRep]-[NSImage(GrowlImageAdditions) PNGRepresentation]-[NSImage(GrowlImageAdditions) JPEGRepresentation]-[GrowlMiniDispatch init]-[GrowlMiniDispatch dealloc]-[GrowlMiniDispatch queueWindow:]-[GrowlMiniDispatch insertWindow:]___34-[GrowlMiniDispatch insertWindow:]_block_invoke_0___copy_helper_block____destroy_helper_block_-[GrowlMiniDispatch dequeueWindows]___35-[GrowlMiniDispatch dequeueWindows]_block_invoke_0___copy_helper_block_29___destroy_helper_block_30-[GrowlMiniDispatch displayNotification:]-[GrowlMiniDispatch mistNotificationDismissed:]-[GrowlMiniDispatch mistNotificationClicked:]-[GrowlMiniDispatch closeAllNotifications:]___43-[GrowlMiniDispatch closeAllNotifications:]_block_invoke_0-[GrowlMiniDispatch delegate]-[GrowlMiniDispatch setDelegate:]-[GrowlMistView initWithFrame:]-[GrowlMistView dealloc]-[GrowlMistView setNotificationImage:]-[GrowlMistView setFrame:]-[GrowlMistView isOpaque]-[GrowlMistView isFlipped]-[GrowlMistView sizeToFit]-[GrowlMistView drawRect:]-[GrowlMistView mouseEntered:]-[GrowlMistView mouseExited:]-[GrowlMistView mouseDown:]-[GrowlMistView notificationText]-[GrowlMistView setNotificationText:]-[GrowlMistView notificationTitle]-[GrowlMistView setNotificationTitle:]-[GrowlMistView notificationImage]-[GrowlMistView delegate]-[GrowlMistView setDelegate:]-[GrowlMistWindowController initWithNotificationTitle:text:image:sticky:userInfo:delegate:]-[GrowlMistWindowController dealloc]-[GrowlMistWindowController fadeIn]-[GrowlMistWindowController animationDidEnd:]-[GrowlMistWindowController animationDidStop:]-[GrowlMistWindowController fadeOut]-[GrowlMistWindowController mistViewDismissed:]-[GrowlMistWindowController lifetimeExpired:]-[GrowlMistWindowController mistViewSelected:]-[GrowlMistWindowController closeAllNotifications]-[GrowlMistWindowController sticky]-[GrowlMistWindowController userInfo]-[GrowlMistWindowController visible]-[GrowlMistWindowController delegate]-[GrowlMistWindowController setDelegate:]-[GrowlMistWindowController selected]-[NSImage(GrowlAdditions) flippedImage]-[NSImage(GrowlAdditions) imageSizedToDimension:]-[NSImage(GrowlAdditions) imageSizedToDimensionScalingUp:]-[NSImage(GrowlAdditions) imageSizedToDimensionSquaring:]-[NSImage(GrowlAdditions) drawInRect:]+[GrowlCommunicationAttempt attemptType]-[GrowlCommunicationAttempt init]-[GrowlCommunicationAttempt initWithDictionary:]-[GrowlCommunicationAttempt dealloc]-[GrowlCommunicationAttempt makeNextAttemptOfClass:]-[GrowlCommunicationAttempt begin]-[GrowlCommunicationAttempt queueAndReregister]-[GrowlCommunicationAttempt stopAttempts]-[GrowlCommunicationAttempt succeeded]-[GrowlCommunicationAttempt failed]-[GrowlCommunicationAttempt finished]-[GrowlCommunicationAttempt dictionary]-[GrowlCommunicationAttempt attemptType]-[GrowlCommunicationAttempt nextAttempt]-[GrowlCommunicationAttempt setNextAttempt:]-[GrowlCommunicationAttempt delegate]-[GrowlCommunicationAttempt setDelegate:]-[GrowlCommunicationAttempt error]-[GrowlCommunicationAttempt setError:]+[GrowlApplicationBridgeRegistrationAttempt attemptType]-[GrowlApplicationBridgeRegistrationAttempt begin]-[GrowlApplicationBridgeRegistrationAttempt applicationName]-[GrowlApplicationBridgeRegistrationAttempt setApplicationName:]+[GrowlApplicationBridgeNotificationAttempt attemptType]-[GrowlApplicationBridgeNotificationAttempt dealloc]-[GrowlApplicationBridgeNotificationAttempt connectionDidDie:]-[GrowlApplicationBridgeNotificationAttempt growlProxy]-[GrowlApplicationBridgeNotificationAttempt begin]+[GrowlGNTPRegistrationAttempt attemptType]-[GrowlGNTPRegistrationAttempt packet]+[GrowlGNTPNotificationAttempt attemptType]-[GrowlGNTPNotificationAttempt packet]-[GrowlGNTPNotificationAttempt expectsCallback]-[GrowlGNTPCommunicationAttempt dealloc]-[GrowlGNTPCommunicationAttempt packet]-[GrowlGNTPCommunicationAttempt expectsCallback]-[GrowlGNTPCommunicationAttempt failed]-[GrowlGNTPCommunicationAttempt couldNotParseResponseWithReason:responseString:]-[GrowlGNTPCommunicationAttempt begin]-[GrowlGNTPCommunicationAttempt readRestOfPacket:]-[GrowlGNTPCommunicationAttempt readOneLineFromSocket:tag:]-[GrowlGNTPCommunicationAttempt socket:didConnectToHost:port:]-[GrowlGNTPCommunicationAttempt socket:didReadData:withTag:]-[GrowlGNTPCommunicationAttempt parseError]___Block_byref_object_copy____Block_byref_object_dispose____43-[GrowlGNTPCommunicationAttempt parseError]_block_invoke_0___copy_helper_block____destroy_helper_block_-[GrowlGNTPCommunicationAttempt parseFeedback]___46-[GrowlGNTPCommunicationAttempt parseFeedback]_block_invoke_0___copy_helper_block_126___destroy_helper_block_127-[GrowlGNTPCommunicationAttempt socketDidDisconnect:withError:]-[GrowlGNTPCommunicationAttempt responseParseErrorString]-[GrowlGNTPCommunicationAttempt setResponseParseErrorString:]-[GrowlGNTPCommunicationAttempt bogusResponse]-[GrowlGNTPCommunicationAttempt setBogusResponse:]-[GrowlGNTPCommunicationAttempt host]-[GrowlGNTPCommunicationAttempt setHost:]-[GrowlGNTPCommunicationAttempt password]-[GrowlGNTPCommunicationAttempt setPassword:]-[GrowlGNTPCommunicationAttempt callbackHeaderItems]-[GrowlGNTPCommunicationAttempt setCallbackHeaderItems:]-[GrowlGNTPCommunicationAttempt connection]-[GrowlGNTPCommunicationAttempt setConnection:]-[GrowlGCDAsyncReadPacket initWithData:startOffset:maxLength:timeout:readLength:terminator:tag:]-[GrowlGCDAsyncReadPacket ensureCapacityForAdditionalDataOfLength:]-[GrowlGCDAsyncReadPacket optimalReadLengthWithDefault:shouldPreBuffer:]-[GrowlGCDAsyncReadPacket readLengthForNonTermWithHint:]-[GrowlGCDAsyncReadPacket readLengthForTermWithHint:shouldPreBuffer:]-[GrowlGCDAsyncReadPacket readLengthForTermWithPreBuffer:found:]-[GrowlGCDAsyncReadPacket searchForTermAfterPreBuffering:]-[GrowlGCDAsyncReadPacket dealloc]-[GrowlGCDAsyncWritePacket initWithData:timeout:tag:]-[GrowlGCDAsyncWritePacket dealloc]-[GrowlGCDAsyncSpecialPacket initWithTLSSettings:]-[GrowlGCDAsyncSpecialPacket dealloc]-[GrowlGCDAsyncSocket init]-[GrowlGCDAsyncSocket initWithSocketQueue:]-[GrowlGCDAsyncSocket initWithDelegate:delegateQueue:]-[GrowlGCDAsyncSocket initWithDelegate:delegateQueue:socketQueue:]-[GrowlGCDAsyncSocket dealloc]___30-[GrowlGCDAsyncSocket dealloc]_block_invoke_0___copy_helper_block____destroy_helper_block_-[GrowlGCDAsyncSocket delegate]___Block_byref_object_copy____Block_byref_object_dispose____31-[GrowlGCDAsyncSocket delegate]_block_invoke_0___copy_helper_block_76___destroy_helper_block_77-[GrowlGCDAsyncSocket setDelegate:synchronously:]___49-[GrowlGCDAsyncSocket setDelegate:synchronously:]_block_invoke_0___copy_helper_block_80___destroy_helper_block_81-[GrowlGCDAsyncSocket setDelegate:]-[GrowlGCDAsyncSocket synchronouslySetDelegate:]-[GrowlGCDAsyncSocket delegateQueue]___36-[GrowlGCDAsyncSocket delegateQueue]_block_invoke_0___copy_helper_block_86___destroy_helper_block_87-[GrowlGCDAsyncSocket setDelegateQueue:synchronously:]___54-[GrowlGCDAsyncSocket setDelegateQueue:synchronously:]_block_invoke_0___copy_helper_block_90___destroy_helper_block_91-[GrowlGCDAsyncSocket setDelegateQueue:]-[GrowlGCDAsyncSocket synchronouslySetDelegateQueue:]-[GrowlGCDAsyncSocket getDelegate:delegateQueue:]___49-[GrowlGCDAsyncSocket getDelegate:delegateQueue:]_block_invoke_0___copy_helper_block_96___destroy_helper_block_97-[GrowlGCDAsyncSocket setDelegate:delegateQueue:synchronously:]___63-[GrowlGCDAsyncSocket setDelegate:delegateQueue:synchronously:]_block_invoke_0___copy_helper_block_100___destroy_helper_block_101-[GrowlGCDAsyncSocket setDelegate:delegateQueue:]-[GrowlGCDAsyncSocket synchronouslySetDelegate:delegateQueue:]-[GrowlGCDAsyncSocket autoDisconnectOnClosedReadStream]___55-[GrowlGCDAsyncSocket autoDisconnectOnClosedReadStream]_block_invoke_0___copy_helper_block_106___destroy_helper_block_107-[GrowlGCDAsyncSocket setAutoDisconnectOnClosedReadStream:]___59-[GrowlGCDAsyncSocket setAutoDisconnectOnClosedReadStream:]_block_invoke_0___copy_helper_block_110___destroy_helper_block_111-[GrowlGCDAsyncSocket isIPv4Enabled]___36-[GrowlGCDAsyncSocket isIPv4Enabled]_block_invoke_0___copy_helper_block_114___destroy_helper_block_115-[GrowlGCDAsyncSocket setIPv4Enabled:]___38-[GrowlGCDAsyncSocket setIPv4Enabled:]_block_invoke_0___copy_helper_block_118___destroy_helper_block_119-[GrowlGCDAsyncSocket isIPv6Enabled]___36-[GrowlGCDAsyncSocket isIPv6Enabled]_block_invoke_0___copy_helper_block_122___destroy_helper_block_123-[GrowlGCDAsyncSocket setIPv6Enabled:]___38-[GrowlGCDAsyncSocket setIPv6Enabled:]_block_invoke_0___copy_helper_block_126___destroy_helper_block_127-[GrowlGCDAsyncSocket isIPv4PreferredOverIPv6]___46-[GrowlGCDAsyncSocket isIPv4PreferredOverIPv6]_block_invoke_0___copy_helper_block_130___destroy_helper_block_131-[GrowlGCDAsyncSocket setPreferIPv4OverIPv6:]___45-[GrowlGCDAsyncSocket setPreferIPv4OverIPv6:]_block_invoke_0___copy_helper_block_134___destroy_helper_block_135-[GrowlGCDAsyncSocket userData]___31-[GrowlGCDAsyncSocket userData]_block_invoke_0___copy_helper_block_138___destroy_helper_block_139-[GrowlGCDAsyncSocket setUserData:]___35-[GrowlGCDAsyncSocket setUserData:]_block_invoke_0___copy_helper_block_143___destroy_helper_block_144-[GrowlGCDAsyncSocket acceptOnPort:error:]-[GrowlGCDAsyncSocket acceptOnInterface:port:error:]___52-[GrowlGCDAsyncSocket acceptOnInterface:port:error:]_block_invoke_0___copy_helper_block_161___destroy_helper_block_162___52-[GrowlGCDAsyncSocket acceptOnInterface:port:error:]_block_invoke_0166___block_global_0___copy_helper_block_198___destroy_helper_block_199___block_global_1___block_global_2___copy_helper_block_204___destroy_helper_block_205___block_global_3___copy_helper_block_210___destroy_helper_block_211-[GrowlGCDAsyncSocket doAccept:]___32-[GrowlGCDAsyncSocket doAccept:]_block_invoke_0___block_global_4___copy_helper_block_223___destroy_helper_block_224___copy_helper_block_229___destroy_helper_block_230-[GrowlGCDAsyncSocket preConnectWithInterface:error:]-[GrowlGCDAsyncSocket connectToHost:onPort:error:]-[GrowlGCDAsyncSocket connectToHost:onPort:withTimeout:error:]-[GrowlGCDAsyncSocket connectToHost:onPort:viaInterface:withTimeout:error:]___75-[GrowlGCDAsyncSocket connectToHost:onPort:viaInterface:withTimeout:error:]_block_invoke_0___block_global_5___copy_helper_block_247___destroy_helper_block_248___copy_helper_block_253___destroy_helper_block_254-[GrowlGCDAsyncSocket connectToAddress:error:]-[GrowlGCDAsyncSocket connectToAddress:withTimeout:error:]-[GrowlGCDAsyncSocket connectToAddress:viaInterface:withTimeout:error:]___71-[GrowlGCDAsyncSocket connectToAddress:viaInterface:withTimeout:error:]_block_invoke_0___copy_helper_block_267___destroy_helper_block_268-[GrowlGCDAsyncSocket lookup:host:port:]___40-[GrowlGCDAsyncSocket lookup:host:port:]_block_invoke_0___copy_helper_block_287___destroy_helper_block_288___40-[GrowlGCDAsyncSocket lookup:host:port:]_block_invoke_0291___copy_helper_block_294___destroy_helper_block_295-[GrowlGCDAsyncSocket lookup:didSucceedWithAddress4:address6:]-[GrowlGCDAsyncSocket lookup:didFail:]-[GrowlGCDAsyncSocket connectWithAddress4:address6:error:]___58-[GrowlGCDAsyncSocket connectWithAddress4:address6:error:]_block_invoke_0___block_global_6___copy_helper_block_311___destroy_helper_block_312___block_global_7___copy_helper_block_319___destroy_helper_block_320___copy_helper_block_323___destroy_helper_block_324-[GrowlGCDAsyncSocket didConnect:]___34-[GrowlGCDAsyncSocket didConnect:]_block_invoke_0___copy_helper_block_333___destroy_helper_block_334-[GrowlGCDAsyncSocket didNotConnect:error:]-[GrowlGCDAsyncSocket startConnectTimeout:]___43-[GrowlGCDAsyncSocket startConnectTimeout:]_block_invoke_0___copy_helper_block_343___destroy_helper_block_344___43-[GrowlGCDAsyncSocket startConnectTimeout:]_block_invoke_0347-[GrowlGCDAsyncSocket endConnectTimeout]-[GrowlGCDAsyncSocket doConnectTimeout]-[GrowlGCDAsyncSocket closeWithError:]___38-[GrowlGCDAsyncSocket closeWithError:]_block_invoke_0___copy_helper_block_364___destroy_helper_block_365-[GrowlGCDAsyncSocket disconnect]___33-[GrowlGCDAsyncSocket disconnect]_block_invoke_0___copy_helper_block_368___destroy_helper_block_369-[GrowlGCDAsyncSocket disconnectAfterReading]___45-[GrowlGCDAsyncSocket disconnectAfterReading]_block_invoke_0___copy_helper_block_374___destroy_helper_block_375-[GrowlGCDAsyncSocket disconnectAfterWriting]___45-[GrowlGCDAsyncSocket disconnectAfterWriting]_block_invoke_0___copy_helper_block_378___destroy_helper_block_379-[GrowlGCDAsyncSocket disconnectAfterReadingAndWriting]___55-[GrowlGCDAsyncSocket disconnectAfterReadingAndWriting]_block_invoke_0___copy_helper_block_382___destroy_helper_block_383-[GrowlGCDAsyncSocket maybeClose]-[GrowlGCDAsyncSocket badConfigError:]-[GrowlGCDAsyncSocket badParamError:]-[GrowlGCDAsyncSocket gaiError:]-[GrowlGCDAsyncSocket errnoErrorWithReason:]-[GrowlGCDAsyncSocket errnoError]-[GrowlGCDAsyncSocket sslError:]-[GrowlGCDAsyncSocket connectTimeoutError]-[GrowlGCDAsyncSocket readMaxedOutError]-[GrowlGCDAsyncSocket readTimeoutError]-[GrowlGCDAsyncSocket writeTimeoutError]-[GrowlGCDAsyncSocket connectionClosedError]-[GrowlGCDAsyncSocket otherError:]-[GrowlGCDAsyncSocket isDisconnected]___37-[GrowlGCDAsyncSocket isDisconnected]_block_invoke_0___copy_helper_block_432___destroy_helper_block_433-[GrowlGCDAsyncSocket isConnected]___34-[GrowlGCDAsyncSocket isConnected]_block_invoke_0___copy_helper_block_436___destroy_helper_block_437-[GrowlGCDAsyncSocket connectedHost]___36-[GrowlGCDAsyncSocket connectedHost]_block_invoke_0___copy_helper_block_444___destroy_helper_block_445-[GrowlGCDAsyncSocket connectedPort]___36-[GrowlGCDAsyncSocket connectedPort]_block_invoke_0___copy_helper_block_452___destroy_helper_block_453-[GrowlGCDAsyncSocket localHost]___32-[GrowlGCDAsyncSocket localHost]_block_invoke_0___copy_helper_block_460___destroy_helper_block_461-[GrowlGCDAsyncSocket localPort]___32-[GrowlGCDAsyncSocket localPort]_block_invoke_0___copy_helper_block_468___destroy_helper_block_469-[GrowlGCDAsyncSocket connectedHost4]-[GrowlGCDAsyncSocket connectedHost6]-[GrowlGCDAsyncSocket connectedPort4]-[GrowlGCDAsyncSocket connectedPort6]-[GrowlGCDAsyncSocket localHost4]-[GrowlGCDAsyncSocket localHost6]-[GrowlGCDAsyncSocket localPort4]-[GrowlGCDAsyncSocket localPort6]-[GrowlGCDAsyncSocket connectedHostFromSocket4:]-[GrowlGCDAsyncSocket connectedHostFromSocket6:]-[GrowlGCDAsyncSocket connectedPortFromSocket4:]-[GrowlGCDAsyncSocket connectedPortFromSocket6:]-[GrowlGCDAsyncSocket localHostFromSocket4:]-[GrowlGCDAsyncSocket localHostFromSocket6:]-[GrowlGCDAsyncSocket localPortFromSocket4:]-[GrowlGCDAsyncSocket localPortFromSocket6:]-[GrowlGCDAsyncSocket connectedAddress]___39-[GrowlGCDAsyncSocket connectedAddress]_block_invoke_0___copy_helper_block_482___destroy_helper_block_483-[GrowlGCDAsyncSocket localAddress]___35-[GrowlGCDAsyncSocket localAddress]_block_invoke_0___copy_helper_block_486___destroy_helper_block_487-[GrowlGCDAsyncSocket isIPv4]___29-[GrowlGCDAsyncSocket isIPv4]_block_invoke_0___copy_helper_block_490___destroy_helper_block_491-[GrowlGCDAsyncSocket isIPv6]___29-[GrowlGCDAsyncSocket isIPv6]_block_invoke_0___copy_helper_block_494___destroy_helper_block_495-[GrowlGCDAsyncSocket getInterfaceAddress4:address6:fromDescription:port:]-[GrowlGCDAsyncSocket setupReadAndWriteSourcesForNewlyConnectedSocket:]___71-[GrowlGCDAsyncSocket setupReadAndWriteSourcesForNewlyConnectedSocket:]_block_invoke_0___copy_helper_block_507___destroy_helper_block_508___71-[GrowlGCDAsyncSocket setupReadAndWriteSourcesForNewlyConnectedSocket:]_block_invoke_0511___copy_helper_block_514___destroy_helper_block_515___71-[GrowlGCDAsyncSocket setupReadAndWriteSourcesForNewlyConnectedSocket:]_block_invoke_0518___copy_helper_block_519___destroy_helper_block_520___71-[GrowlGCDAsyncSocket setupReadAndWriteSourcesForNewlyConnectedSocket:]_block_invoke_0523___copy_helper_block_524___destroy_helper_block_525-[GrowlGCDAsyncSocket usingCFStream]-[GrowlGCDAsyncSocket suspendReadSource]-[GrowlGCDAsyncSocket resumeReadSource]-[GrowlGCDAsyncSocket suspendWriteSource]-[GrowlGCDAsyncSocket resumeWriteSource]-[GrowlGCDAsyncSocket readDataWithTimeout:tag:]-[GrowlGCDAsyncSocket readDataWithTimeout:buffer:bufferOffset:tag:]-[GrowlGCDAsyncSocket readDataWithTimeout:buffer:bufferOffset:maxLength:tag:]___77-[GrowlGCDAsyncSocket readDataWithTimeout:buffer:bufferOffset:maxLength:tag:]_block_invoke_0___copy_helper_block_533___destroy_helper_block_534-[GrowlGCDAsyncSocket readDataToLength:withTimeout:tag:]-[GrowlGCDAsyncSocket readDataToLength:withTimeout:buffer:bufferOffset:tag:]___76-[GrowlGCDAsyncSocket readDataToLength:withTimeout:buffer:bufferOffset:tag:]_block_invoke_0___copy_helper_block_539___destroy_helper_block_540-[GrowlGCDAsyncSocket readDataToData:withTimeout:tag:]-[GrowlGCDAsyncSocket readDataToData:withTimeout:buffer:bufferOffset:tag:]-[GrowlGCDAsyncSocket readDataToData:withTimeout:maxLength:tag:]-[GrowlGCDAsyncSocket readDataToData:withTimeout:buffer:bufferOffset:maxLength:tag:]___84-[GrowlGCDAsyncSocket readDataToData:withTimeout:buffer:bufferOffset:maxLength:tag:]_block_invoke_0___copy_helper_block_545___destroy_helper_block_546-[GrowlGCDAsyncSocket maybeDequeueRead]-[GrowlGCDAsyncSocket doReadData]___33-[GrowlGCDAsyncSocket doReadData]_block_invoke_0___copy_helper_block_583___destroy_helper_block_584-[GrowlGCDAsyncSocket doReadEOF]___32-[GrowlGCDAsyncSocket doReadEOF]_block_invoke_0___copy_helper_block_591___destroy_helper_block_592-[GrowlGCDAsyncSocket completeCurrentRead]___42-[GrowlGCDAsyncSocket completeCurrentRead]_block_invoke_0___copy_helper_block_599___destroy_helper_block_600-[GrowlGCDAsyncSocket endCurrentRead]-[GrowlGCDAsyncSocket setupReadTimerWithTimeout:]___49-[GrowlGCDAsyncSocket setupReadTimerWithTimeout:]_block_invoke_0___copy_helper_block_605___destroy_helper_block_606___49-[GrowlGCDAsyncSocket setupReadTimerWithTimeout:]_block_invoke_0609-[GrowlGCDAsyncSocket doReadTimeout]___36-[GrowlGCDAsyncSocket doReadTimeout]_block_invoke_0___block_global_8___copy_helper_block_616___destroy_helper_block_617___copy_helper_block_620___destroy_helper_block_621-[GrowlGCDAsyncSocket doReadTimeoutWithExtension:]-[GrowlGCDAsyncSocket writeData:withTimeout:tag:]___49-[GrowlGCDAsyncSocket writeData:withTimeout:tag:]_block_invoke_0___copy_helper_block_628___destroy_helper_block_629-[GrowlGCDAsyncSocket maybeDequeueWrite]-[GrowlGCDAsyncSocket doWriteData]___34-[GrowlGCDAsyncSocket doWriteData]_block_invoke_0___copy_helper_block_642___destroy_helper_block_643-[GrowlGCDAsyncSocket completeCurrentWrite]___43-[GrowlGCDAsyncSocket completeCurrentWrite]_block_invoke_0___copy_helper_block_648___destroy_helper_block_649-[GrowlGCDAsyncSocket endCurrentWrite]-[GrowlGCDAsyncSocket setupWriteTimerWithTimeout:]___50-[GrowlGCDAsyncSocket setupWriteTimerWithTimeout:]_block_invoke_0___copy_helper_block_654___destroy_helper_block_655___50-[GrowlGCDAsyncSocket setupWriteTimerWithTimeout:]_block_invoke_0658-[GrowlGCDAsyncSocket doWriteTimeout]___37-[GrowlGCDAsyncSocket doWriteTimeout]_block_invoke_0___block_global_9___copy_helper_block_665___destroy_helper_block_666___copy_helper_block_669___destroy_helper_block_670-[GrowlGCDAsyncSocket doWriteTimeoutWithExtension:]-[GrowlGCDAsyncSocket startTLS:]___32-[GrowlGCDAsyncSocket startTLS:]_block_invoke_0___copy_helper_block_678___destroy_helper_block_679-[GrowlGCDAsyncSocket sslReadWithBuffer:length:]-[GrowlGCDAsyncSocket sslWriteWithBuffer:length:]-[GrowlGCDAsyncSocket maybeStartTLS]-[GrowlGCDAsyncSocket continueSSLHandshake]___43-[GrowlGCDAsyncSocket continueSSLHandshake]_block_invoke_0___copy_helper_block_717___destroy_helper_block_718-[GrowlGCDAsyncSocket performBlock:]-[GrowlGCDAsyncSocket socketFD]-[GrowlGCDAsyncSocket socket4FD]-[GrowlGCDAsyncSocket socket6FD]-[GrowlGCDAsyncSocket sslContext]+[GrowlGCDAsyncSocket hostFromAddress4:]+[GrowlGCDAsyncSocket hostFromAddress6:]+[GrowlGCDAsyncSocket portFromAddress4:]+[GrowlGCDAsyncSocket portFromAddress6:]+[GrowlGCDAsyncSocket hostFromAddress:]+[GrowlGCDAsyncSocket portFromAddress:]+[GrowlGCDAsyncSocket getHost:port:fromAddress:]+[GrowlGCDAsyncSocket CRLFData]+[GrowlGCDAsyncSocket CRData]+[GrowlGCDAsyncSocket LFData]+[GrowlGCDAsyncSocket ZeroData]+[GrowlGNTPInitialHeaderItem initialHeaderItemWithAction:]-[GrowlGNTPInitialHeaderItem initWithAction:]-[GrowlGNTPInitialHeaderItem dealloc]-[GrowlGNTPInitialHeaderItem GNTPRepresentationAsString]-[GrowlGNTPInitialHeaderItem GNTPRepresentation]-[GrowlGNTPInitialHeaderItem action]-[GrowlGNTPInitialHeaderItem setAction:]-[GrowlGNTPInitialHeaderItem encryption]-[GrowlGNTPInitialHeaderItem setEncryption:]-[GrowlGNTPInitialHeaderItem key]-[GrowlGNTPInitialHeaderItem setKey:]+[GrowlGNTPEndHeaderItem endHeaderItem]-[GrowlGNTPEndHeaderItem init]-[GrowlGNTPEndHeaderItem GNTPRepresentationAsString]-[GrowlGNTPEndHeaderItem GNTPRepresentation]-[GrowlGNTPEndHeaderItem connectionType]-[GrowlGNTPEndHeaderItem setConnectionType:]+[GrowlGNTPOutgoingPacket outgoingPacket]+[GrowlGNTPOutgoingPacket outgoingPacketOfType:forDict:]+[GrowlGNTPOutgoingPacket outgoingPacketForNotification:]+[GrowlGNTPOutgoingPacket outgoingPacketForRegistrationWithNotifications:]-[GrowlGNTPOutgoingPacket init]-[GrowlGNTPOutgoingPacket dealloc]-[GrowlGNTPOutgoingPacket setKey:]-[GrowlGNTPOutgoingPacket key]-[GrowlGNTPOutgoingPacket addHeaderItem:]-[GrowlGNTPOutgoingPacket addHeaderItems:]-[GrowlGNTPOutgoingPacket addBinaryChunk:]-[GrowlGNTPOutgoingPacket addBinaryChunks:]-[GrowlGNTPOutgoingPacket packetID]-[GrowlGNTPOutgoingPacket setPacketID:]-[GrowlGNTPOutgoingPacket outgoingItems]-[GrowlGNTPOutgoingPacket writeToSocket:]-[GrowlGNTPOutgoingPacket needsPersistentConnectionForCallback]-[GrowlGNTPOutgoingPacket description]-[GrowlGNTPOutgoingPacket action]-[GrowlGNTPOutgoingPacket setAction:]-[GrowlGNTPOutgoingPacket growlDictionary]-[GrowlGNTPOutgoingPacket setGrowlDictionary:]-[GrowlGNTPOutgoingPacket headerItems]-[GrowlGNTPOutgoingPacket setHeaderItems:]+[GrowlGNTPEncryptedHeaders headerItemFromData:error:]-[GrowlGNTPEncryptedHeaders initForData:error:]-[GrowlGNTPEncryptedHeaders GNTPRepresentation]-[GrowlGNTPEncryptedHeaders GNTPRepresentationAsString]-[GrowlGNTPEncryptedHeaders headers]-[GrowlGNTPEncryptedHeaders setHeaders:]+[GrowlGNTPHeaderItem headerItemFromData:error:]+[GrowlGNTPHeaderItem headerItemWithName:value:]+[GrowlGNTPHeaderItem separatorHeaderItem]-[GrowlGNTPHeaderItem initForData:error:]-[GrowlGNTPHeaderItem dealloc]-[GrowlGNTPHeaderItem headerName]-[GrowlGNTPHeaderItem setHeaderName:]-[GrowlGNTPHeaderItem headerValue]-[GrowlGNTPHeaderItem setHeaderValue:]-[GrowlGNTPHeaderItem GNTPRepresentationAsString]-[GrowlGNTPHeaderItem GNTPRepresentation]-[GrowlGNTPHeaderItem description]+[GrowlGNTPBinaryChunk chunkForData:withIdentifier:]-[GrowlGNTPBinaryChunk initWithData:identifier:]-[GrowlGNTPBinaryChunk dealloc]-[GrowlGNTPBinaryChunk length]-[GrowlGNTPBinaryChunk stringThatPrecedesTheData]-[GrowlGNTPBinaryChunk stringThatFollowsTheData]-[GrowlGNTPBinaryChunk GNTPRepresentation]-[GrowlGNTPBinaryChunk GNTPRepresentationAsString]+[GrowlGNTPBinaryChunk identifierForBinaryData:]-[GrowlGNTPBinaryChunk data]-[GrowlGNTPBinaryChunk setData:]-[GrowlGNTPBinaryChunk identifier]-[GrowlGNTPBinaryChunk setIdentifier:]+[GrowlISO8601DateFormatter initialize]+[GrowlISO8601DateFormatter purgeGlobalCaches]-[GrowlISO8601DateFormatter makeCalendarWithDesiredConfiguration]-[GrowlISO8601DateFormatter init]-[GrowlISO8601DateFormatter dealloc]-[GrowlISO8601DateFormatter setDefaultTimeZone:]-[GrowlISO8601DateFormatter dateComponentsFromString:]-[GrowlISO8601DateFormatter dateComponentsFromString:timeZone:]-[GrowlISO8601DateFormatter dateComponentsFromString:timeZone:range:]_read_segment_read_segment_2digits_read_double-[GrowlISO8601DateFormatter dateFromString:]-[GrowlISO8601DateFormatter dateFromString:timeZone:]-[GrowlISO8601DateFormatter dateFromString:timeZone:range:]-[GrowlISO8601DateFormatter getObjectValue:forString:errorDescription:]-[GrowlISO8601DateFormatter replaceColonsInString:withTimeSeparator:]-[GrowlISO8601DateFormatter stringFromDate:]-[GrowlISO8601DateFormatter stringFromDate:timeZone:]-[GrowlISO8601DateFormatter stringFromDate:formatString:timeZone:]-[GrowlISO8601DateFormatter stringForObjectValue:]-[GrowlISO8601DateFormatter weekDateStringForDate:timeZone:]-[GrowlISO8601DateFormatter defaultTimeZone]-[GrowlISO8601DateFormatter parsesStrictly]-[GrowlISO8601DateFormatter setParsesStrictly:]-[GrowlISO8601DateFormatter format]-[GrowlISO8601DateFormatter setFormat:]-[GrowlISO8601DateFormatter includeTime]-[GrowlISO8601DateFormatter setIncludeTime:]-[GrowlISO8601DateFormatter timeSeparator]-[GrowlISO8601DateFormatter setTimeSeparator:]-[GrowlOkGNTPPacket dealloc]-[GrowlOkGNTPPacket receivedHeaderItem:]-[GrowlOkGNTPPacket callbackResultSendBehavior]-[GrowlOkGNTPPacket responseAction]-[GrowlOkGNTPPacket setResponseAction:]+[GrowlGNTPPacket addSentAndReceivedHeadersFromDict:toArray:]-[GrowlGNTPPacket packetDidFinishReading:]-[GrowlGNTPPacket packetDidDisconnect:]-[GrowlGNTPPacket packet:failedReadingWithError:]-[GrowlGNTPPacket packet:willChangePacketIDFrom:to:]-[GrowlGNTPPacket delegate]-[GrowlGNTPPacket setDelegate:]+[GrowlRegisterGNTPPacket getHeaders:andBinaryChunks:forRegistrationDict:]+[GrowlNotificationGNTPPacket callbackResultSendBehaviorForHeaders:]+[GrowlNotificationGNTPPacket getHeaders:binaryChunks:notificationID:forNotificationDict:]-[GrowlErrorGNTPPacket init]-[GrowlErrorGNTPPacket dealloc]-[GrowlErrorGNTPPacket receivedHeaderItem:]-[GrowlErrorGNTPPacket callbackResultSendBehavior]-[GrowlErrorGNTPPacket errorDescription]-[GrowlErrorGNTPPacket setErrorDescription:]-[GrowlErrorGNTPPacket errorCode]-[GrowlErrorGNTPPacket setErrorCode:]+[GNTPKey isSupportedHashAlgorithm:]+[GNTPKey isSupportedEncryptionAlgorithm:]+[GNTPKey encryptionAlgorithmFromString:]+[GNTPKey hashingAlgorithmFromString:]-[GNTPKey initWithPassword:hashAlgorithm:encryptionAlgorithm:]+[GNTPKey generateSalt:]-[GNTPKey generateSalt]-[GNTPKey generateKey]-[GNTPKey hashAlgorithmString]-[GNTPKey encryptionAlgorithmString]-[GNTPKey encrypt:]-[GNTPKey decrypt:]-[GNTPKey generateIV]-[GNTPKey key]-[GNTPKey encryption]-[GNTPKey hashAlgorithm]-[GNTPKey setHashAlgorithm:]-[GNTPKey encryptionAlgorithm]-[GNTPKey setEncryptionAlgorithm:]-[GNTPKey encryptionKey]-[GNTPKey setEncryptionKey:]-[GNTPKey keyHash]-[GNTPKey setKeyHash:]-[GNTPKey password]-[GNTPKey setPassword:]-[GNTPKey salt]-[GNTPKey setSalt:]-[GNTPKey IV]-[GNTPKey setIV:]+[GrowlXPCCommunicationAttempt XPCBundleID]+[GrowlXPCCommunicationAttempt canCreateConnection]-[GrowlXPCCommunicationAttempt purpose]-[GrowlXPCCommunicationAttempt begin]-[GrowlXPCCommunicationAttempt finished]-[GrowlXPCCommunicationAttempt establishConnection]___Block_byref_object_copy____Block_byref_object_dispose____51-[GrowlXPCCommunicationAttempt establishConnection]_block_invoke_0___copy_helper_block____destroy_helper_block_-[GrowlXPCCommunicationAttempt handleReply:]-[GrowlXPCCommunicationAttempt sendMessageWithPurpose:]+[GrowlXPCNotificationAttempt attemptType]-[GrowlXPCNotificationAttempt purpose]+[GrowlXPCRegistrationAttempt attemptType]-[GrowlXPCRegistrationAttempt purpose]+[NSObject(NSObject_XPCHelpers) xpcObjectToNSObject:]___53+[NSObject(NSObject_XPCHelpers) xpcObjectToNSObject:]_block_invoke_0___copy_helper_block____destroy_helper_block____53+[NSObject(NSObject_XPCHelpers) xpcObjectToNSObject:]_block_invoke_011___copy_helper_block_13___destroy_helper_block_14-[NSObject(NSObject_XPCHelpers) newXPCObject]___45-[NSObject(NSObject_XPCHelpers) newXPCObject]_block_invoke_0___copy_helper_block_41___destroy_helper_block_42___45-[NSObject(NSObject_XPCHelpers) newXPCObject]_block_invoke_055___copy_helper_block_56___destroy_helper_block_57+[GrowlNetworkUtilities localHostName]GCC_except_table3GCC_except_table3GCC_except_table4GCC_except_table10GCC_except_table16GCC_except_table84GCC_except_table93GCC_except_table118GCC_except_table127GCC_except_table195GCC_except_table199GCC_except_table203GCC_except_table211GCC_except_table235GCC_except_table239GCC_except_table5GCC_except_table7_shouldUseBuiltInNotifications___block_descriptor_tmp___block_descriptor_tmp___block_descriptor_tmp32___block_descriptor_tmp80___block_literal_global___block_descriptor_tmp___block_descriptor_tmp129___block_descriptor_tmp___block_descriptor_tmp79___block_descriptor_tmp83___block_descriptor_tmp89___block_descriptor_tmp93___block_descriptor_tmp99___block_descriptor_tmp103___block_descriptor_tmp109___block_descriptor_tmp113___block_descriptor_tmp117___block_descriptor_tmp121___block_descriptor_tmp125___block_descriptor_tmp129___block_descriptor_tmp133___block_descriptor_tmp137___block_descriptor_tmp141___block_descriptor_tmp146___block_descriptor_tmp165___block_descriptor_tmp201___block_descriptor_tmp203___block_descriptor_tmp207___block_descriptor_tmp209___block_descriptor_tmp213___block_descriptor_tmp226___block_descriptor_tmp232___block_descriptor_tmp250___block_descriptor_tmp256___block_descriptor_tmp270___block_descriptor_tmp290___block_descriptor_tmp297___block_descriptor_tmp314___block_descriptor_tmp322___block_descriptor_tmp326___block_descriptor_tmp336___block_descriptor_tmp346___block_descriptor_tmp349___block_descriptor_tmp367___block_descriptor_tmp371___block_descriptor_tmp377___block_descriptor_tmp381___block_descriptor_tmp385___block_descriptor_tmp435___block_descriptor_tmp439___block_descriptor_tmp447___block_descriptor_tmp455___block_descriptor_tmp463___block_descriptor_tmp471___block_descriptor_tmp485___block_descriptor_tmp489___block_descriptor_tmp493___block_descriptor_tmp497___block_descriptor_tmp510___block_descriptor_tmp517___block_descriptor_tmp522___block_descriptor_tmp527___block_descriptor_tmp536___block_descriptor_tmp542___block_descriptor_tmp548___block_descriptor_tmp586___block_descriptor_tmp594___block_descriptor_tmp602___block_descriptor_tmp608___block_descriptor_tmp611___block_descriptor_tmp619___block_descriptor_tmp623___block_descriptor_tmp631___block_descriptor_tmp645___block_descriptor_tmp651___block_descriptor_tmp657___block_descriptor_tmp660___block_descriptor_tmp668___block_descriptor_tmp672___block_descriptor_tmp681___block_descriptor_tmp720___block_descriptor_tmp___block_descriptor_tmp___block_descriptor_tmp17___block_descriptor_tmp45___block_descriptor_tmp60_OBJC_IVAR_$_GrowlGNTPCommunicationAttempt.callbackHeaderItems_OBJC_IVAR_$_GrowlGNTPCommunicationAttempt.socket_OBJC_IVAR_$_GrowlGNTPCommunicationAttempt.responseParseErrorString_OBJC_IVAR_$_GrowlGNTPCommunicationAttempt.responseReadType_OBJC_IVAR_$_GrowlGNTPCommunicationAttempt.host_OBJC_IVAR_$_GrowlGNTPCommunicationAttempt.password_OBJC_IVAR_$_GrowlGNTPCommunicationAttempt.attemptSucceeded_OBJC_IVAR_$_GrowlGNTPCommunicationAttempt.bogusResponse_OBJC_IVAR_$_GrowlGNTPCommunicationAttempt.connection_OBJC_IVAR_$_GrowlGNTPCommunicationAttempt.packet_OBJC_IVAR_$_GrowlGNTPCommunicationAttempt.callbackType_OBJC_IVAR_$_GrowlXPCCommunicationAttempt.xpcConnection_OBJC_IVAR_$_GrowlXPCCommunicationAttempt.notificationUuid__attempts_delegate_cachedRegistrationDictionary_appName_appIconData_registeredWithGrowl.b_hasGNTP.b_networkClient_sandboxed.b_queuedGrowlNotifications_attemptingToRegister.b_miniDispatch_registerWhenGrowlIsReady+[GrowlApplicationBridge _growlIsReachableUpdateCache:]._cached.b+[GrowlApplicationBridge _growlIsReachableUpdateCache:]._reachable+[GrowlApplicationBridge _checkSandbox].checked.b_prefPaneBundle_helperAppBundle-[GrowlGNTPCommunicationAttempt readRestOfPacket:].triple+[GrowlGNTPHeaderItem separatorHeaderItem].separatorHeaderItem_timeZonesByOffset+[GrowlGNTPPacket addSentAndReceivedHeadersFromDict:toArray:].determinedMachineInfo.b+[GrowlGNTPPacket addSentAndReceivedHeadersFromDict:toArray:].growlName+[GrowlGNTPPacket addSentAndReceivedHeadersFromDict:toArray:].growlVersion+[GrowlGNTPPacket addSentAndReceivedHeadersFromDict:toArray:].platformVersion+[GrowlXPCCommunicationAttempt canCreateConnection].searched.b+[GrowlXPCCommunicationAttempt canCreateConnection].found.búÞ À´$M½úÞ )…0UBà com.growl.growlframeworkš_aû*½ÊÔÛ^É'Û[¤ÚÈù‘I?i´ã¿~¦ô&{ËšñyxK Æ·ÔP²åZ|k|¥¾] 0O¼}ñ&Š.­²";µ¡+7%uª=IqV ÆF¢»a,ëéñ×üÆ›eòݧIPsTÊë¸zm´.`ù2“Ð:¶ja½Jê_°qŒdƒÍÑâ¡_„„ì–N¶•Ö„’ñ/¥%à ,Îëò²Õðï‹~¯"ÃW)ƒô\‚j;54Í]‘z®ÎRC óݧ–¡áÃÛÌ_Á@!ÒàÒ·uÇ1Á‰'2’I|CzíŠ[FŽ”è$í.´îpåìCã$­x¸"n aí«?ÁÝÉ7EiN~bÃÁ.½ð|!mÒvOèè·?áÿB锑žl]Øë Åí‰xÄ¥‰A(^wÙú uøÆÁŒãgÖ ÏhÌÈŠ›eÐ6¹Q5ªtˆiFã2ºÎ¿º2$kïãËÑHy»‹îÒSŠP±'û¨Ê½…÷5|®ÓtqâÐ X,‹¡ò‹}h83³ŠRôwo/Ó:h°zsrQ¬ATÁȲ¾=¾Ý›ŽŠq‹è$)zJɬºøÌ?ª[XlBÌð‘uB•{F9{Ñ@b-Šv²´ªeÞ÷~Á¿#¨£;g…¥†Ö dÃ+¢ÞHz®ªa+[]üœ2ÊÝÊPGï2£öwd WYë‡p'9‡9†÷%×OϨƒ•×^R„7{ÿ‚0‹/ ¥w¿’É=d/}©—Ÿ;6b‚ t_¡ûO? o_Äö&”fÌì(zø8¶~·MUô#t.Œ°í´°¢ª—ù¹Wž¨´¤Qo´ˆ À»@… *U'e¿­Œqc=²%òÊË™u:íÜVñš‰ÉPu’@§%ò¶æþÜlFþ‚ÐxãÓEc€¸ãvûÿHŠDÀ±¯EªÆPO¿í.‘®|oÕ…MyÕÅÕU)}ØHeÜkÜ¡8¤•Ô£6%_£aÆ[ìxC4€K™ÃœmV(a›|¼lŠáA\««QÛ4ÔGyòÃñØ£Ydd¥ëgxQ~ó×ndbÁp//%—Ô lͶLŠæû$ ?F[£$µÕÅä‘åF× :„uwæ,C‰ÊÉÇL2L¬Óô&DÊ…n[‚b­ˆY“a¶}ÖO]‚——)x{ðãù聯G¶É••ÿà-À¿RB?Nes‘pÓ±˜cäÉ{|g‡"»¾F @EïƒÝÇÂh Øæ¼ÚÞìG6„c”½1'¼àá9>®\¹zeÙÙt4©ó‰ù$ÅE~›48[ún$›/t…j=t42Æ©‚”¯/1dKµªÛ§p@ *j~ ÍFùÒì¥L-W8óºxÉ ­t<Zz/õò*Y®T/p0Ù¾óÖ,bF[Ž©\]‡Îý ×)ë‘Í ñ¶Ã ž'‘+nd ³=ÿ?§"´F¥²‚åò`µ^¶²¼×dB PæŒQFYáÚâVgšÒG:Èúp©Üï®Öᙹ˜Ñ.Ý$L@^Q¸»ðBk±ÆKø3ÍVä²ì.=ImŽ×W„VWݘ@ùrDø:UÙ€ Âøw!ȬÐ|I”´ûÖ5ÄÀ]‹úì>dì%ˆ—ĶÞdÑÂýÍŠkР‚åí’Åïñ{ Ä\IÄ€â„IJlÅ•#=ziÔ™·;ûA;æMô±£!¦gBE–,ÝÒ¥uƒHr<®Ð@iMlª ÷8¥ž‰¯Ãüîò >Ò)·¡ :F#`Œð5ãÙq7ç©Ù´üÿëQl…6ì‘;À0—…]öhñŒÄ·éh° èÉGnmÏòË™UÌ™ñÊMÞÿ:•PêXléðt½ÜN>O8ßu=NˆûN­ü §Ù#?˜@[’/ðÞ„¡Wɯ{ÿjúI¬ªÛ*2í–chR=ŒŠì¿k•à¬}—gÎ…•7jí ¶®gÍQdŸÆ\ѼWng5€v6¤‡n8Ø+N{%ØZ¿NƒÁÒ“Õqµ`œ3NUùX †¸ ÁåwEPHº+-ä”…áèÄÆh¥°£üg~pºYKwB‘9¹õÍáLïÀ;HŒ¦å!]ýjj»§5`Òæ­óF)ÉèËéyÀjag²ðýåh¼b_nÏ™Ýïcþ’e«£®0«0Uÿ†0Uÿ0ÿ0Uˆ' ©¶`‹ìëºöGYÅRT£·0U#0€+ÐiG”v þôk.@¦÷GM^06U/0-0+ ) '†%http://www.apple.com/appleca/root.crl0 *†H†÷cd0  *†H†÷ ‚Ú2–ÅT”Ó;‚7f}.hÕÃÆ¸Ë&ŒHÏ$jFŽcÔðÐÝØÄÁ7ò39&-Î.U@ã ¯úÂç !¸Õ€Ï¬(/Î-³N¯†ÆéPÝL)G#ül»˜kH‰á[ÞFÛ5…5ï>ÐâXK8ôíuZ\pV9åá ä‰%½Õ´Ž^ÐY—éKâ߯Dt :GÌ‘:ë#Zþ¥-—÷{»Ö‡FB…ëR=&²c¨´±ÊôÌâ³ÈG࿚YƒúÚ˜S*‚õ|e.•Ù3]õíeÌ17ÅZèkáçˆJuž›(ËJ@ˆeCuÝË:%#ÅžWø.ÎÒ©’^s./%u0‚»0‚£ 0  *†H†÷ 0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0 060425214036Z 350209214036Z0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0‚"0  *†H†÷ ‚0‚ ‚ä‘© ‘ÛGPëí^y„-ë6¢WLU싉ÞùKlõ«"0è>øP ÓA¨˜ùÑÊfœ$kУ»ä*Õžz ¤G‹[Ô73ËÄMÎiÑÉrõ]Õ_›ò%ºUM] ñd5#KY³”÷öœžÏPºÁXPg´ ÷ˬ, op¶?0Œ·CÏ=ó+I(Èþε¹Ù^ÖË=µ:­ô’ ±!.tÕ< Ûb«£q’GSUÁ¯/A³øûãpÍæ£LE~LkP–A‰Ätb ƒA‡3б0XìZ2Œh³Þesÿg^e¼IØvŸ3e¡w”É-£‚z0‚v0Uÿ0Uÿ0ÿ0U+ÐiG”v þôk.@¦÷GM^0U#0€+ÐiG”v þôk.@¦÷GM^0‚U ‚0‚0‚ *†H†÷cd0ò0*+https://www.apple.com/appleca/0Ã+0¶³Reliance on this certificate by any party assumes acceptance of the then applicable standard terms and conditions of use, certificate policy and certification practice statements.0  *†H†÷ ‚\6™L-x·íŒ›Üów›òvÒw0OÁ…ƒ…™=G7ò©›@Ž,Ô±ؾôs›îÒdËyO4Ø¢>ùxÿkÈì}9ƒ‹S Ó8ı¿šO kÿ+üY§ |@VtÓ·‹#;G£Õo$âëÑ·pßEá'Êñmxí絨Ü~"5Ê%ÕÙÖkÔ¢$#÷¡¬s`Æ[ /’²øDHð`8žõ=&g Š3j÷ ‚ÏÞë£/ùSj[dÀc3w÷:,VëÚ!ÚºsOµÙ6Á‡UÙ§™¹2BûØÕqž~¡R·½“B$*ǶMœ^cÈK€PªŠÕÚäüÐ 7°uu!0‚0‚… !Á±?P¦‡0  *†H†÷ 0–1 0 UUS10U Apple Inc.1,0*U #Apple Worldwide Developer Relations1D0BU ;Apple Worldwide Developer Relations Certification Authority0 110824172631Z 120823172631Z010 ’&‰“ò,d T8S9X4YB6F1D0BU ;3rd Party Mac Developer Application: The Growl Project, LLC10U The Growl Project, LLC1 0 UUS0‚"0  *†H†÷ ‚0‚ ‚»ìÖ[¨ˆfWйQ—Á§ ù›#o&*ƒqñžEhCnÀ§]ßuIáiVú9b`¥ªI&)å”Aì§½#ÔŽ×MÆ™% gœ}LfkaÛõ³ÁW‚w\,Ô>:o4‡õLŠ#ô·üeä¸upñƒ¯¥RL$4¡ôð+LÛ‹dyÞ‹ŒÐEE| $ØÉk´/â“ÌɵõBž´Æ´Ëý·Õ)­l(¥÷Çj† ïÛí€ÅrØ_ÇýålÈ£³ Í ‰¸¦PQéñi õÛ@áš mYŠ¿«eO;)0ÐV§Êvk¾¾Ý/”vZÚê•+`ÿ7…nÉH›ßäpìVKêÈc¡£‚ñ0‚í0UdmõÚÁI`ŽzTfŽÊÀ¼ï–0 Uÿ00U#0€ˆ' ©¶`‹ìëºöGYÅRT£·0‚U ‚0‚0ÿ *†H†÷cd0ñ0Ã+0¶ ³Reliance on this certificate by any party assumes acceptance of the then applicable standard terms and conditions of use, certificate policy and certification practice statements.0)+http://www.apple.com/appleca/0MUF0D0B @ >†'9N.œUó¶ƒÎ® ––ғ愵 ÝoQt”lj?C"»J±Èd¶UF!­ÿ+~wl˳e©¶:ä¢z×eF´qÄqQºjαoÂo¹4•œz¾8UÒ;á’pN„gfYç=3y3ìxž8ö £ÒÚêŒvlðRrýÅ·pÀBè1‚*0‚&0£0–1 0 UUS10U Apple Inc.1,0*U #Apple Worldwide Developer Relations1D0BU ;Apple Worldwide Developer Relations Certification Authority!Á±?P¦‡0 + ]0 *†H†÷  1  *†H†÷ 0 *†H†÷  1 111125232416Z0# *†H†÷  1^šßІc l$¸â»ûUæGƒ÷0  *†H†÷ ‚4Ø;’²<³¾Ðm²Â^èâM§:κ#6Ì¿@C„J…;5Éø‘îùŽE~Fˆ ™å¿-R˜H<ßpMU¹VñD+ç§p‹ñ¹6?´…üki yXLtÅ”|ßÖù0¡(¼Lô«`€TmSÇÚ/€I<(áÎã Ô·ï-3dÐcí>½èê*u»ì/QDׂ^°§÷¡]Ù¾ A˜îèÉÁ™÷Šƾ 2«wÀ¯Žwå»ÍÊð6\ί??ºäQ­HÓ Žl-k>¡jøtºOÂWì‡ejBgŸÞ:q3Ÿ­ÃSeáà§Ž'¸.\/ßÀIÃBôÎúíþ8 …__TEXTÀÐÐ__text__TEXT°À™ý°€__symbol_stub__TEXTJÀðJ€__stub_helper__TEXT<Àœ<€__cstring__TEXTØÀkvØ__const__TEXTPÀ`P__unwind_info__TEXT°ÀH°__eh_frame__TEXTø•Àü9ø•__DATAÐÀ0Ð0__nl_symbol_ptr__DATAÐÀ€Ð¨__la_symbol_ptr__DATA€ÑÀ €Ñ__data__DATA ÔÀò Ô__cfstring__DATAÕÀ°Õ__const__DATAÐæÀX Ðæ__common__DATA(ñÀ__bss__DATA,ñÀNx__OBJCÀPP__cls_refs__OBJCÀ __message_refs__OBJC ÀÔ __cls_meth__OBJCô À ô __meta_class__OBJCÀ0__class__OBJCDÀ0D__symbols__OBJCtÀøt__module_info__OBJClÀ l__protocol__OBJCŒÀÜŒ__cat_cls_meth__OBJCh ÀÄh __instance_vars__OBJC,!À”,!__inst_meth__OBJCÀ(ÀÀ(__property__OBJCÄ;À(Ä;__class_ext__OBJCì=ÀÌì=__cat_inst_meth__OBJC¸>Àà¸>__category__OBJC˜AÀT˜A__image_info__OBJCìAÀìA8__LINKEDITPÀ@P€5 X@executable_path/../Frameworks/Growl.framework/Versions/A/Growl"€0PttT”]ÄÌmœ X{Ø8¼ ® P^^fÄxµ°äÊÌé5„3ª¢£&'À¿Fp$ €4ä/usr/lib/libobjc.A.dylib p)/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices Xr-/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit `A,/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation \âÖ/System/Library/Frameworks/Security.framework/Versions/A/Security p‹/System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration 4Ÿ/usr/lib/libSystem.B.dylib d5/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices h{–/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation&hwðPj0U‰åVƒìè^‹†pß…ÀuB‹†Ddï‰L$‰$èM‹Žhï‰L$‰$è;Žp߉L$‰$èíÿ‹†p߃Ä^]ÃU‰åSWVƒì,è^‹†ç틎 ï‰L$‰$èöÿ‰Eð‹}‹†ß9øt6‹Žï‰L$‰$èÔÿ‹†ï‰D$‰<$èÂÿŽß‰L$‰$ètÿ‹}‹†ß‹Žï‰L$‰$è•ÿ‹†ï‰D$‰<$èƒÿ‹Žï‰L$‰$èqÿŽß‰L$‰$è#ÿ‹†ß‹Žï‰L$‰$èGÿ‹†ï‹Žß‰L$‰D$‰<$è+ÿ‹Žï‰L$‰$èÿŽß‰L$‰$èËþ¾ßu †Ã‰D$†÷‰$èýüƒÄ,^_[]ˆß‹Žï‰L$‰$èÃþ‹†#߉L$‰D$‰<$è§þ‹Žï‰L$‰$è•þŽß‰L$‰$èGþ‹†+'ï–ÉT$‰L$ ‰|$‰D$‹Eð‰$ÇD$èNþ‹†ë틎/ï‰L$‰$è6þ‹Ž3ï‰L$‰$è$þ‰Ã‹†ï틎ï‰L$‰$è þ‹Ž7ï‹–ß¾7É|$‰\$‰]ì‰T$ –'ÉT$‰L$‰$èÓý‰Ã‹†ß‹Ž?ï‹–;ï‰T$‰L$‰$è¯ý„Àt/‹†+;ï‰\$‰L$ ‹M‰L$‰D$‹Eð‰$ÇD$ë#‹†Cï‰\$ ‹M‰L$‰D$‹Eð‰$ÇD$èTý‹†ï‰D$‰$èBý‹†ï틎ï‰L$‰$è*ý‹Ž7߉|$‰T$ –GÉT$‰L$‰$èý‰Ã‹†ß‹Ž?ï‹–;ï‰T$‰L$‰$èÜü„Àt/‹†+;ï‰\$‰L$ ‹M‰L$‰D$‹Eð‰$ÇD$ë#‹†Cï‰\$ ‹M‰L$‰D$‹Eð‰$ÇD$èü‹†ï‰D$‰$èoü‹†ï틎ï‰L$‰$èWü‹Ž7ï‹–ßžWÉ\$‹}ì‰|$‰T$ –'ÉT$‰L$‰$è ü‰Ç‹†ß‹Ž?ï‹–Gï‰T$‰L$‰$èüû„Àt/‹†+Gï‰|$‰L$ ‹M‰L$‰D$‹Eð‰$ÇD$ë#‹†Cï‰|$ ‹M‰L$‰D$‹Eð‰$ÇD$è¡û‹†ï‰D$‰<$èû‹†ï틎ï‰L$‰$èwû‹Ž7߉\$‰T$ –GÉT$‰L$‰$èMû‰Ç‹†ß‹Ž?ï‹–Gï‰T$‰L$‰$è)û„Àt/‹†+Gï‰|$‰L$ ‹M‰L$‰D$‹Eð‰$ÇD$ë#‹†Cï‰|$ ‹M‰L$‰D$‹Eð‰$ÇD$èÎú‹†ï‰D$‰<$è¼ú‹†Kï‰D$‹E‰$è§úé¿ûÿÿU‰åèX‹€žÙ]ÃU‰åƒì(èY‹j苉Æé‹U(‰T$ ¾U$‰T$‹U ‰T$‹U‰T$‹U‰T$‹U‰T$ ‹U‰T$‰L$‰$ÇD$$è3úƒÄ(]ÃU‰åWVƒì è_‹‡ è‹é‰L$‰$èú‹eé—y½‰T$ ‹U‰T$‰L$‰$ÇD$èÝù‰Æ‹E…Àt ‹ié—‰½‰T$ ‰D$‰L$‰4$è´ù‹E…Àt ‹ié—™½‰T$ ‰D$‰L$‰4$èù‹E…Àt ‹ié—©½‰T$ ‰D$‰L$‰4$èfù‹E(…Àt ‹ié—¹½‰T$ ‰D$‰L$‰4$è?ù‹E …Àt<‹ è‹—mé‰D$‰T$‰ $èù‹ié—ɽ‰T$ ‰D$‰L$‰4$èüøŠE$„Àt?‹ è‹—qé¾À‰D$‰T$‰ $èÖø‹ié—Ù½‰T$ ‰D$‰L$‰4$è¶ø‹E,…Àt ‹ié—齉T$ ‰D$‰L$‰4$èø‹E‹ué‰t$‰L$‰$èvø‹‡!é‰D$‰4$èdøƒÄ ^_]ÃU‰åSWVƒì<è[‹u‹}Šƒc×<…苃§ç‰D$‰<$ÇD$è ø„À„Æ‹ƒ«ç‰t$‰D$‰<$èø‰Æ1ÉŠƒdׄÀ„Ä‹ƒ?æ‹‹¯ç‰L$‰$èØ÷„Àt‹ƒCæë1É€»eׄ‘‹ƒGæ‹‹Cç‰L$‰$è¥÷‹‹³ç‰t$‰L$‰$è÷‹‹[ç‰L$‰$è}÷‰Ç1É…ÿtI‰uÔ‹ƒ·ç‹u‰t$‰D$‰<$èY÷‹ƒ»ç‰D$‰4$èG÷‹‹¿ç‰|$‰L$‰$è1÷‰ù‹uÔ‰MÔŠƒfׄÀt‹uÔ…ö…«éÔ‹ƒKæ‹‹Cç‰L$‰$è÷ö‹‹³ç‰t$‰L$‰$èáö‹‹[ç‰L$‰$èÏö‰Æ‹ƒ·ç‹}‰|$‰D$‰4$è´ö‹ƒ»ç‰D$‰<$è¢ö‹‹¿ç‰t$‰L$‰$èŒö‹}Ô…ÿ„eÿÿÿ‹ƒÃç‰t$‰D$‰<$èkö‰þ‹ƒÇç‰D$‰4$èWö鋃§ç‰D$‰<$ÇD$è8ö„À„Œ‹ƒg×…ÀuB‹ƒ#æ‹‹Cç‰L$‰$èö‹‹Gç‰L$‰$èüõ‹g׉L$‰$è®õ‹ƒg׋‹¿ç‰t$‰L$‰$èÎõŠƒkׄÀ……‹ƒËç‰D$‰<$ÇD$è¦õëi‹ƒ3æ‹‹Ïç‰L$‰$èŒõ„ÀtM‹ƒ?·‰EØÇEÜBÇEàƒ‰Eäƒó̉EèEì‰D$‰4$è õE؉D$‹ƒ;·‰$è3ôƒÄ<^_[]ÃU‰åƒìèZ‹E‹H‹‚ ã‹’¬ä‰L$‰T$‰$èõƒÄ]Ã@U‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$è€óƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$è`óƒÄ]ÃU‰åSWVƒìè^‹†¥ã‰D$‹E‰$è‡ô‰Ã0É…Û„‹}‹†%äŽu¸‰L$‰D$‰$è\ô‰E싆%äŽõ·‰L$‰D$‰<$è=ô‰Ç‹†%䎅¸‰L$‰D$‰$èô‹Ž)ä‰|$‰}ð‹}ì‰L$‰$èô‰Ã0Éûÿÿÿ„‹†â‹Ž-ä‰L$‰$èÛó‹Ž1ä‰D$‰L$‰<$èÅó„Àt‹†5ä‰\$é8‹†¡â‹Ž-ä‰L$‰$èšó‹Ž1ä‰D$‰L$‰<$è„ó0É„À„‹†9ä‰D$‰<$èhó0É…À„ø‰]苆=ä‰D$‰<$‰ûÇD$è?ó‰Ç‹†‰â‹Ž-ä‰L$‰$è%ó‹Ž1ä‰D$‰L$‰<$èó„Àt2‹†‰â‹ŽAä‹Uè‰T$‰L$‰$èìò‹ŽEä‰D$‰L$‰$ëf‹†=ä‰D$‰ß‰<$ÇD$è½ò‰Ã‹†}⋎-ä‰L$‰$è£ò‹Ž1ä‰D$‰L$‰$èò0É„Àt!‹†Eä‹Mð‰L$‰D$‰<$ènò0É„Àt±¶ÁƒÄ^_[]ÃU‰åSWVƒì è^ŠžA´‹†Uà‹Žùá‰L$‰$è.ò‹ŽÕá¾E¶‰|$‰L$‰$èò…ÀtB‹†Uà‹Žùá‰L$‰$èöñ‹ŽÕá‰|$‰L$‰$èàñ‹Žýá‰L$‰$èÎñˆÃ‹E‹Ž¥á‰L$‰$ÇD$è¯ñ„Àt0Û¾ÃƒÄ ^_[]ÃU‰åèXŠMˆˆŠ³]ÃU‰åèX¾€v³]ÃU‰åSWVƒì è^‹†rß‹Žá‰L$‰$èQñ‹Žòà¾rµ‰|$‰L$‰$è5ñ0Û…ÀtE‹†rß‹Žá‰L$‰$èñ‹Žòà‰|$‰L$‰$èñ‹Žá‰L$‰$èïð„À”Ë}‹E‹Žá‰|$‰L$‰$èÎð„Àu €û…–‹†ŠÐ…Àuv‹†vß‹Ž^à‰L$‰$èŸð‹Žbà‰L$‰$èðŽŠÐ‰L$‰$è?ð‹†Nß‹Ž"á‰L$‰$ècð‹ŽŠÐ‹–Òà‰D$‰T$‰ $èGð‹†ŠÐ‹Ž&á‰|$‰L$‰$è+ðƒÄ ^_[]ÃU‰å¸]ÃU‰åƒìèp9¾ÀƒÄ]ÃU‰åSWVƒìè[ŠƒÏ<uƒ´‰$èùí‹u‹ƒP߉D$‰4$ÇD$èÂï„ÀuƃÏ0Àé:‹E…Àt‹‹¸ß‰D$‰L$ë ‹ƒß‰D$‰4$è‡ï‰EðƃÏ‹ƒÏ‹‹øÞ‰L$‰$èeüÞ‰D$‹Eð‰$èPï‹Ï‰L$‰$èï1ÉŠƒ Ï„À„¾‹ƒèÝ‹‹X߉L$‰$èï„Àt‹ƒÞë1É€»Ï„‹‹ƒ Þ‹‹ìÞ‰L$‰$èãî‹‹\ß‹Uð‰T$‰L$‰$èÊ߉L$‰$è¸î‰Ç1É…ÿt@‹ƒ`߉t$‰D$‰<$èšî‹ƒd߉D$‰4$èˆî‹‹h߉|$‰L$‰$èrî‰ù‰M슃Ï„Àt‹}ìéÑ‹ƒÞ‹‹ìÞ‰L$‰$èCî‹‹\ß‹uð‰t$‰L$‰$è*߉L$‰$èî‰Ç‹ƒß‰t$‰D$‹u‰4$èýí‹‹¼ß‰D$‰L$‰<$èç틃`߉t$‰D$‰<$èÑ틃d߉D$‰4$è¿í‹‹h߉|$‰L$‰$è©í‹uì…öt‹ƒl߉|$‰D$‰4$èŒí‰÷‹ƒp߉D$‰<$èxí°¶ÀƒÄ^_[]ÃU‰åƒìèXÆ€tÌ‹€Ü܉D$‹E‰$ÇD$è;íƒÄ]ÃU‰åèXŠMˆˆRÌ]ÃU‰åèX¾€>Ì]ÃU‰åVƒìè^‹†Ì…Àt:‹Ž4Ü‹–Ì܉T$‰L$‰$èÝì„Àt‹†Ì‹ŽÌ܉L$‰$èÁìë1ÀƒÄ^]ÃU‰åSWVƒìè[‹u…öu‹ƒÅÚ‹‹u܉L$‰$è‰ì‰Æ‹ƒy܋ᰉL$ ‹Ñ°‰L$‰D$‰4$èaì1ÿ…ÀtF‹‹ÉÚ‹“}܉D$‰T$‰ $è?ì‰Ç…ÿu$‹ƒÜ‰D$‰4$è'ì‰D$ƒñ°‰$è/ê‰øƒÄ^_[]ÃU‰åWVƒìè^‹†ÚÛ‰D$‹}‰<$èèë…Àu\‹†ÞÛ‰D$‰<$ÇD$èÊë…Àu>‹†Ú‹ŽÊÛ‰L$‰$è®ë‹ŽÖÛ‰L$‰$èœë‰D$†V°‰$è¤é1À‹Ž¾Û‰D$‰L$‰<$èrëƒÄ^_]ÃU‰åƒìèX‹€DÛ‹M‰L$‰D$‹E‰$ÇD$ è;ëƒÄ]ÃU‰åSWVƒìè[1Àƒ}„Æ‹u‹ƒÛ‰D$‹E‰$èë‰Eð…öt&‹ƒÐÚ‹¯‰L$‰D$‰4$èàê„À‰ð„–‹ƒÛ»¯‰|$‰D$‹Eð‰$è·ê…Àum‹ƒ4Ê…ÀuF‹ƒ8Ú‹M‰L$‰D$‹E‰$èê‹‹,Ú‰L$‰$è{ê‹4ʉL$‰$è-ꋃ4Ê‹‹pÚ‰|$ ‰D$‰L$‹Eð‰$èFê…öt&‰ð‹‹ÐÚ“ ¯‰T$‰L$‰$è$ê„À„”‹ƒÛ» ¯‰|$‰D$‹Eð‰$èýé…Àuq‹ƒ8Ê…ÀuJ‹ƒ<Ú‹M‰L$‰D$‹E‰$èÓé‹‹,Ú‰L$‰$èÁé‹8ʉL$‰$ès鋃8Ê…Àt‹‹pÚ‰|$ ‰D$‰L$‹Eð‰$èˆé…öt&‹ƒÐÚ‹°¯‰L$‰D$‰4$èhé„À‰ð„‹ƒÛ‹°¯‰L$‰D$‹Eð‰$è?é…À…Ó‹ƒDÙ‹‹ôÚ‰L$‰$èé‹‹Û‰L$‰$è é…À„¡‰$è(‰Ç…ÿtt‹ƒHÙ‹‹Ú‰L$‰$èßè‹‹lÚ“À¯‰T$ ‰|$‰L$‰$ÇD$è·è‰Ç‹ƒpÚ‹°¯‰L$ ‰|$‰D$‹Eð‰$è’苃(Ú‰D$‰<$닃ۋ°¯‰L$‰D$‹Eð‰$èdè…öt"‰ð‹‹ÐÚ“¯‰T$‰L$‰$èBè„Àtc‹ƒÛ»¯‰|$‰D$‹Eð‰$èè…Àu@‹ƒÛ‹¯‰L$‰D$‹Eð‰$èüç…Àt‹‹pÚ‰|$ ‰D$‰L$‹Eð‰$èÛç…öt ‹ƒÐڋЯ‰L$‰D$‰4$è»ç„ÀtM‹ƒÛ»Ð¯‰|$‰D$‹Eð‰$è˜ç…Àu*è å‰$èùä‹‹pÚ‰|$ ‰D$‰L$‹Eð‰$èj狃4Ú‰D$‹Eð‰$èUçƒÄ^_[]ÃU‰åSWVƒìè[‹ƒ'׉D$‹E‰$è)ç‰Æ‹ƒ+×»§«‰|$‰D$‰4$è ç…Àuq‹ƒKÆ…ÀuM‹ƒOÖ‹‹GƉL$‰D$‹E‰$èÞæ‹‹CÖ‰L$‰$èÌæ‹KƉL$‰$è~拃KÆ…Àt‹‹‡Ö‰|$ ‰D$‰L$‰4$è–æ‹ƒ+×»·«‰|$‰D$‰4$èzæ…Àuq‹ƒOÆ…ÀuM‹ƒSÖ‹‹GƉL$‰D$‹E‰$èMæ‹‹CÖ‰L$‰$è;æ‹OƉL$‰$èí勃OÆ…Àt‹‹‡Ö‰|$ ‰D$‰L$‰4$èæ‹ƒ+׋ת‰L$‰D$‰4$èéå…À„²‹ƒ+׋÷«‰L$‰D$‰4$èÅå…À…Ž‹ƒ+Õ‹‹3Ö‰L$‰$è¥å‰Ç‹ƒÕ‹‹_Ö‰L$‰$è‹å‹‹cÖ‰L$‰$èyå‹‹7׉D$‰L$‰<$ècå‰Ç‹ƒ‡Ö‹÷«‰L$ ‰|$‰D$‰4$èA勃?Ö‰D$‰<$è/勃KÖ‰D$‰4$èåƒÄ^_[]ÃU‰åƒìèX€Ò©‰$ègâ‰$èkâƒÄ]ÃU‰åVƒìè^‹†æÃ…Àt<‹ŽÔ‹–ÞÔ‰T$‰L$‰$è»ä„Àt‹†æÃ‹ŽÞÔ‰L$‰$èŸä…ÀuM‹E‹ŽÎÔ–J©‰T$‰L$‰$è|ä…Àu*‹†¾Ò‹ŽÔ‰L$‰$è`䋎âÔ‰L$‰$èNäƒÄ^]ÃU‰åWVƒìè_‹‡?Ã…Àts‹kÓ‹—?Ô‰T$‰L$‰$èä‹?ÄÀt‹‡?Ô‰D$‰ $ë3‹‡kÓ‹—CÔ‰T$‰D$‰ $èßã„Àt‹‡?ËCÔ‰L$‰$èÃã‰Æ…öu%‹E‹'Ô—³¨‰T$‰L$‰$èžã‰Æ…ötJ‹‡_Ò‹ËÓ‰L$‰$è€ã‹ÏÓ‰D$‰L$‰4$èjã„Àt‹‡GÔ‰D$‰4$èTã‰Æ…öun‹‡WÒ‹Ô‰L$‰$è6ã‹Ô‰L$‰$è$ã‰Æ‹‡cÒ‹KÔ‰L$‰$è ã‹OÔ‰t$‰L$‰$èôâ‹GÔ‰L$‰$èââë‰ðƒÄ^_]ÃU‰åSWVƒì è_‹‡õЋ½Ñ‰L$‰$è°â‹ÁщL$‰$èžâ‰Æ‹ŸÍÁ‹‡áÒ‰D$‹E‰$è⋵җ¡§‰T$‰L$‰$èeâ‹õщD$‰L$‰$èO⋇åÒ‰D$‰4$è=âƒÄ ^_[]ÃU‰åSWVƒì è_‹‡SЋщL$‰$èâ‹Ñ‰L$‰$èüá‰Æ‹Ÿ+Á‹‡?Ò‰D$‹E‰$èßá‹Ò—ÿ¦‰T$‰L$‰$èÃá‹_щD$‰L$‰$è­á‹‡CÒ‰D$‰4$è›áƒÄ ^_[]ÃU‰åSWVìŒèYfïÀ)EØ)EÈ‹‘šÀ‹¢Ñ‰M„Mˆ‰L$ MȉL$‰D$‰$‰U€ÇD$èAá‰Æ…ött‹EЋ81Û‹EÐ98t ‹E€‰$èøà‹EÌ‹ ˜‹E„‹€ÖЉL$‰D$‹E‰$èáC9órÇ‹E„‹€¢ÑMˆ‰L$ MȉL$‰D$‹E€‰$ÇD$èÍà‰Æ…öu‘‹u„‹†šÀ‹Ž‚ЉL$‰$è¬à†šÀ‰D$Ç$èZàÄŒ^_[]ÃU‰åSWVƒìè_‹‡©Î‹qωL$‰$èdà‹uωL$‰$èRà‰Eð‹‡ÕωD$‹]‰$ÇD$è2à‹‡¿‹­Ï‹—¡Ð‰T$‰L$‰$èà„Àt‹‡¿‹¡Ð‰L$‰$èôß‹‡­Î‹yωL$‰$èÜß‹¥Ð·…£‰t$‰L$‰$ÇD$ÇD$ è°ß‹‡U΋yωL$‰$è˜ß‹±Ï‰t$ ‰\$‰L$‰$ÇD$èv߀¿¡¿t‹‡¹Ï‰D$‰$è[ßƇ¡¿ëƇ‘¿‹‡©Ð‰D$‰$è9ß‹‡™Ð‰D$‹Eð‰$è$߃Ä^_[]ÃU‰åWVƒìè^‹†?ωD$‹}‰<$èùÞŠŽ4¾€ùuŠM„Éu0É„À„cŠŽ5¾éX0É„À„N‹†CωD$‰<$è¶Þ‹†CÍ‹ŽGÏ–÷£‰T$‰L$‰$è”Þ‹Ž¯Î‰L$‰$ÇD$èzÞ‹ŽÿΉL$‰$èhÞ‹ŽKωL$‰$èVÞ‹ŽOÏ–¤‰T$‰L$‰$ÇD$ è2Þ=ÿÿÿtDƆ$¾І&¾ˆÁ€ñˆŽ5¾<…Š‹†¾‰D$‰D$†¤‰$è ÜŠŽ5¾ëfƆ$¾І&¾<uL€¾%¾uC‹†ÿÌ‹ŽoΉL$‰$èµÝ„Àu'‹†¾‰D$‰D$†'¤‰$è¯ÛƆ5¾0Éë Æ†5¾±Ɔ4¾¾ÁƒÄ^_]ÃU‰åSWVƒìè_Ї‰¼„À…þƇ‰¼¿JœuƇy¼Ƈx¼éØè6ۉƋŸBË‹‡~Ë‹.͉L$‰$èÝ‹¦Í‰L$‰$èöÜ‹ªÍ‰D$ ‡Š¢‰D$‰L$‰$èÖÜ‹®Í‰D$‰L$‰4$èÀÜ„ÀtYƇy¼‹‡f¼…À„nÿÿÿ‹’Ì‹—²Í‰T$‰L$‰$è‹Ü„À„Jÿÿÿ‹‡f¼‹²Í‰L$‰$èk܈‡x¼ëƇy¼Ƈx¼ƒÄ^_[]ÃU‰åVƒìè^‹†•̉D$‹E‰$è+܃øu#‹EƆU»Ɔ]»‹Žm̉L$‰$è܃Ä^]ÃU‰åWVƒìè^‹†H̉D$‹}‰<$èÚÛ…ÀuT‹†D̉D$‰<$èÄÛ–8¡ŽH¡ƒøDʉL$†(¡‰$èºÙ‹†D̉D$‰<$èŽÛƒøuƆ »‹E‹Ž\ˉL$‰$èmÛ‹ŽL̉|$‰L$‰$èWÛƒÄ^_]ÃU‰åVƒìè^‹†°Ê‰D$‹E‰$è.Û‹Ž Ë‹U‰T$‰L$‰$èÛƒÄ^]ÃU‰åSWVƒì è^‹†UˉD$‹}‰<$èëÚƒø…‰‹žº…ÛuB‹†ÕÈ‹ŽõɉL$‰$èÀÚ‹ŽùɉL$‰$è®ÚŽº‰L$‰$è`Ú‹žº‹†aˉD$‰<$è„Ú‹ŽqʉD$‰L$‰$ènÚ‹†=ʉD$‹E‰$èYÚƒÄ ^_[]ÃU‰åVƒìè^‹†I¹…Àt?‹ŽuÉ‹–qɉT$‰L$‰$èÚ„Àt‹M‹†I¹‹–qɉL$‰T$‰$èûÙƒÄ^]ÃU‰åVƒìè^‹†í¸…Àt?‹ŽÉ‹–!ɉT$‰L$‰$èÂÙ„Àt‹M‹†í¸‹–!ɉL$‰T$‰$èŸÙƒÄ^]ÃU‰åSWVƒìè_‹‡ƒÈ‰D$‹E‰$èuىƅöt|‹]‹‡«Ç‹È‰L$‰$èTÙ‹ÏÈ—c‰T$‰\$—s‰T$ ‹U‰T$‰L$‰$ÇD$èÙ‹—ȉL$‰$è Ù‹ïɉD$‰L$‰4$èó؉ðƒÄ^_[]ÃU‰åWVƒìè^‹}‹G‹ŽÜljL$‰$èÃØ‹G‹ŽÜljL$‰$è®Ø‹G ‹ŽÜljL$‰$è™Ø‰}ð‹†(܉Eô‹†DɉD$Eð‰$è~؃Ä^_]ÃU‰åƒì‹E ‰D$‹E‰$ÇD$ ÇD$èC؃Ä]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$è%؃Ä]ÃU‰åƒì‹E ‰D$‹E‰$ÇD$ ÇD$ èÚ׃Ä]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$ è¼×ƒÄ]ÃU‰åƒì‹E ‰D$‹E‰$ÇD$ ÇD$èq׃Ä]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$èS׃Ä]ÃU‰åSWVìœè^‰µ|ÿÿÿ‹†WÅ‹Ž[Ç‹U‰T$‰L$‰$èýÖ‰Á‹†¿Æ‰D$‰ $‰xÿÿÿèãÖ1Û…À„ifïÀ)EØ)EÈ‹…|ÿÿÿ‹€CÇMˆ‰L$ MȉL$‰D$‹…xÿÿÿ‰$ÇD$1Ûè—Ö…À‰…tÿÿÿ„‹EЋ‰…pÿÿÿ1ÿ1ö‰û‹EЋpÿÿÿ9t‹…xÿÿÿ‰$è3Ö‹EÌ‹°‰E„…ÛtP‹½|ÿÿÿ‹‡Ç‰D$‰$è8Ö‰]€‰Ã‹‡Ç‰D$‹E„‰$èÖ‹“ljD$‰L$‰$‹]€èÖƒøu‹]„F;µtÿÿÿ‚xÿÿÿ‰ß‹…|ÿÿÿ‹€CÇMˆ‰L$ MȉL$‰D$‹…xÿÿÿ‰$ÇD$èºÕ…À‰…tÿÿÿ…0ÿÿÿ1Û…ÿt6‹|ÿÿÿ‹³?Å‹ƒÇ‰D$‰<$èˆÕ‹‹—ljD$‰L$‰4$èrՉÉØÄœ^_[]ÃU‰åƒìèY‹Ðʼn@š‰L$‰D$‹E‰$è8ÕƒÄ]ÃU‰åSWVìüèX‹¸J´…ÿ…£‰Æ‹†>Ã‹ŽžÅ–Šš‰T$‰L$‰$èïÔŽJ´‰L$‰$è¡Ô‹¾J´…ÿ…_‹E‹Ž¢Å‰L$‰$èºÔ‹ŽúĉL$‰$è¨Ô‹Ž¦Å‰L$‰$è–ԉNj†¦Å‰D$‰<$è‚Ô‹Ž¦Å‰L$‰$èpԉˆªÅ‰D$‰<$è\Ô‹Ž®Å‰L$‰$èJÔ‹Ž²Å–šš‰T$‰L$‰$è.Ô„Àt<‹†>Ã‹Ž¶Å‰|$‰L$‰$èÔŽJ´‰L$‰$èÀÓ‹¾J´…ÿ…~‹†ªÅ‰D$‰$èÜӋޮʼnL$‰$èÊӋ޲Ŗšš‰T$‰L$‰$è®Ó„Àt<‹†>Ã‹Ž¶Å‰\$‰L$‰$èŽÓŽJ´‰L$‰$è@Ó‹¾J´…ÿ…þ‹†ZÃ‹ŽºÅ‰L$‰$èVÓ‰…ÿÿÿÇD$ÇD$÷ÿÇ$èTщÂfïÀ)EØ)EÈ‹†BÅMˆ‰L$ MȉL$‰D$‰$‰•ÿÿÿÇD$èøÒ…À‰…$ÿÿÿ„5‹EЋ‰… ÿÿÿ1Û‹EЋ ÿÿÿ9t‹…ÿÿÿ‰$è˜Ò‹EÌ‹˜‹Ž¾Å–ªš‰T$‰L$‰$è Ò‹Ž¾Å–ºš‰T$‰L$‰$è„҉Nj†Âʼn|$‰D$‹…ÿÿÿ‰$èfÒ„Àtd‹†>Ã‹Ž¶Å‰|$‰L$‰$èF҉DžÿtB‹†fʼnD$‰<$è.Ò…Àt,‹ŽÆÅ–Šš‰T$‰L$‰$ÇD$ èÒ…À„)C;$ÿÿÿ‚ÿÿÿ‹†BÅMˆ‰L$ MȉL$‰D$‹…ÿÿÿ‰$ÇD$èÃÑ…À‰…$ÿÿÿ…ÖþÿÿfïÀ)…xÿÿÿ)…hÿÿÿ‹†BÅ(ÿÿÿ‰L$ hÿÿÿ‰L$‰D$‹…ÿÿÿ‰$ÇD$1ÿèmÑ…À‰…ÿÿÿ„ï‹…pÿÿÿ‹‰… ÿÿÿ1ÿ‹…pÿÿÿ‹ ÿÿÿ9t‹…ÿÿÿ‰$èÑ‹…lÿÿÿO‰ÿÿÿ‹¸‹Ž¾Å–ªš‰T$‰L$‰$èщÁ‹†ÊʼnL$‰$ÿÿÿ‰D$‹…ÿÿÿ‰$èßЉlj½ ÿÿÿë5†J´‰D$‰<$è‡Ð‹¾J´éH‹†ÒʼnD$‹½ ÿÿÿ‰<$è Ð‹†ÎʼnD$‰<$èŽÐ‰Ã…Û„¼‹†ªÅ‰D$‰$èrÐ‹Ž²Å–Êš‰T$‰L$‰$èVЄÀt²‹¾>ˆ¾Å‰\$‰D$‹…$ÿÿÿ‰$è0Ð‹Ž¶Å‰D$‰L$‰<$èЉÅۄXÿÿÿ‹†fʼnD$‰$èþÏ…À„>ÿÿÿ‹ŽÆÅ–Šš‰T$‰L$‰$ÇD$ èÒÏ…À…ÿÿÿëe‹…ÿÿÿ;…ÿÿÿ‰Ç‚eþÿÿ‹†BÅ(ÿÿÿ‰L$ hÿÿÿ‰L$‰D$‹…ÿÿÿ‰$ÇD$è€Ï1ÿ…À‰…ÿÿÿ…þÿÿ‰øÄü^_[]ÆJ´‰D$‰$é‰þÿÿU‰åWVƒìè^‹†p®…Àue‹E‹ŽÄ¿‰L$‰$è$Ͼp®‰|$‰$èÖ΋†p®…Àu4‹†`½‹ŽÀ¿–,”‰T$‰L$‰$èæÎ‰|$‰$èžÎ‹†p®ƒÄ^_]ÃU‰åSWVì è^‹}‹E=ÿÿzŠ]‰|$‰$ÇD$è³Ì‰Á„Ûu ‰ÿÿÿé‰÷‹·¼‹‡X¾‰D$‰Ë‰$èf΋p¿‰D$‰L$‰4$èPΉ…ÿÿÿ‹‡ô¼‹T¿‰L$‰$è2Ή…ÿÿÿfïÀ)EØ)EÈ‹‡Ü¾Mˆ‰L$ MȉL$‰D$‰$‰ÿÿÿÇD$èòÍ…À‰… ÿÿÿ„ã‹EЋ‰…ÿÿÿ1Û‹EЋÿÿÿ9t‹…ÿÿÿ‰$è’Í‹EÌ‹4˜‹‡t¿‰t$‰D$‹…ÿÿÿ‰$èšÍ„Àt‹‡,¾‰t$‰D$‹…ÿÿÿ‰$èzÍC; ÿÿÿrš‹‡Ü¾Mˆ‰L$ MȉL$‰D$‹…ÿÿÿ‰$ÇD$èCÍ…À‰… ÿÿÿ…\ÿÿÿé/ˆÿÿƒùw%†t”–´”‰•ÿÿÿ‹ŒŽÌñÿᆔ”ë'‰D$†¤”‰$èËÇ…ÿÿÿéÞ†„”‹ŽX¿‰D$‰L$†´”‰$è½Ì‰…ÿÿÿ‰ó‹ƒô¼‹‹T¿‰L$‰$è̉…ÿÿÿÆE‡‰|$ÇD$Ç$è›Ê‰Ç‹³¼‹ƒX¾‰D$‰<$èaÌ‹‹p¿‰D$‰L$‰4$èK̉…ÿÿÿfïÀ)…hÿÿÿ)…Xÿÿÿ‹ƒÜ¾‰Þÿÿÿ‰L$ Xÿÿÿ‰L$‰D$‰<$‰½ÿÿÿÇD$èýË…À‰… ÿÿÿ„î‹…`ÿÿÿ‹‰…ÿÿÿ1Û‹…`ÿÿÿ‹ÿÿÿ9t‹…ÿÿÿ‰$è—Ë‹…\ÿÿÿ‹˜‹ŽX¿‹•ÿÿÿ‰T$‰L$‰$èœË‰Ç‹†x¿M‡‰L$ ‰|$‰D$‹…ÿÿÿ‰$èwË„Àt#ŠE‡„Àt‹†,¾‰|$‰D$‹…ÿÿÿ‰$èPËC; ÿÿÿ‚dÿÿÿ‹†Ü¾ÿÿÿ‰L$ Xÿÿÿ‰L$‰D$‹…ÿÿÿ‰$ÇD$èË…À‰… ÿÿÿ… ÿÿÿ‹…ÿÿÿÄ ^_[]ÃãÝ´U‰åƒìèX‹€•»‹M‰L$ ‹M‰L$‰D$‹E‰$ÇD$è©ÊƒÄ]ÃU‰åSWVƒìè[‹ƒV»‰D$‹}‰<$ÇD$ÇD$ ÇD$èhʉƋƒ2º‰D$‰4$èTÊ…Àt!‹ƒ6º‰D$‰4$ÇD$è6ʉÆéÌ‹ƒV»‰D$‰<$ÇD$ÇD$ ÿÿÇD$èʉNjƒ2º‰D$‰<$èñÉ1ö…À„„‹ƒ6º‰D$‰<$ÇD$èÍÉ‹‹2»“މT$‰L$‰$è±É‰Æ‹ƒÎ¸‹‹.»‰L$‰$è—É‹‹Z»‰t$‰L$‰$ÇD$ÇD$ÇD$ èiÉ„Àu1ö‰ðƒÄ^_[]ÃU‰åSWVƒìè_‹‡ º‰D$‹]‰$ÇD$ÇD$ ÿÿÇD$èɉƋ‡ç¸‰D$‰4$è É…Àt!‹‡ë¸‰D$‰4$ÇD$èëȉÆé‚‹‡º‰D$‰$èÒÈ1ö…Àtj‹ç¹—‰T$‰L$‰$è°È‰Æ‹‡ƒ·‹ã¹‰L$‰$è–È‹º‰t$‰L$‰$ÇD$ÇD$ÇD$ èhÈ„Àu1ö‰ðƒÄ^_[]ÃU‰åSWVƒìè_‹‡ ¹‰D$‹]‰$ÇD$ÇD$ ÿÿÇD$èȉƋ‡æ·‰D$‰4$èÈ…Àt!‹‡ê·‰D$‰4$ÇD$èêljÆé‚‹‡¹‰D$‰$èÑÇ1ö…Àtj‹æ¸—މT$‰L$‰$è¯Ç‰Æ‹‡‚¶‹â¸‰L$‰$è•Ç‹¹‰t$‰L$‰$ÇD$ÇD$ÇD$ ègÇ„Àu1ö‰ðƒÄ^_[]ÃU‰åƒìèX‹€¸‰D$‹E‰$ÇD$è.ǃÄ]ÃU‰åSWVìŒè_‹‡Pµ‹°·‰L$‰$èÿƉƋE…Àu‹‡Tµ‹è·‰L$‰$èÞÆ‰û‹‹ì·‰D$‰L$‰4$ÇD$ è¾Æ‰Ç‹ƒXµ‹‹ ¶‰L$‰$è¤Æ‰Æ‹ƒ´¶‰D$‰<$èÆ‹‹ð·‰D$‰L$‰4$èzƉE„fïÀ)EØ)EÈ‹ƒ8·Mˆ‰L$ MȉL$‰D$‰<$‰}€ÇD$è@Ɖƅöu 1ɾé—‹EЋ‰…|ÿÿÿ1ÿ‹EЋ|ÿÿÿ9t ‹E€‰$èßÅ‹EÌ‹¸‹‹ô·‰L$‰$èñÅ‹‹ˆ¶‰D$‰L$‹E„‰$èØÅG9÷r²‹ƒ8·Mˆ‰L$ MȉL$‰D$‹E€‰$ÇD$è¨Å‰Æ…ö…{ÿÿÿ¾1ɉÏëy‹ƒ¶‰D$‰ $èÅ‹ƒø´‹‹ ¶‰L$‰$èiÅ‹‹@¶‰|$‰t$ “ ‰T$‰L$‰$èEʼnÁ‹ƒÀ¶‰L$‰M€‰D$‹E„‰$è'Å„ÀtƒÆƒ×‹M€‰ð!øƒøÿ…zÿÿÿ‰M€‹ƒ¶‰D$‹E„‰$èõÄ‹ƒ$¶‰D$‹E€‰$èàÄÄŒ^_[]ÃU‰åWVƒìè_‹‡¨µ‰D$‹E‰$è²Ä‰Æ‹‡¬µàЉL$‰D$‹E‰$è‘Ä‹dµ‰D$‰L$‰4$è{ăÄ^_]ÃU‰åSWVƒì,è[‹}…ÿuƒ¾Š‰$èjÂ1ÀéVÇEð‹ƒNµ‰D$‰<$è0ĉƋƒRµ‰D$‰<$èĉD$Eð‰D$‰4$èAÂf‰Æf…öt6‹ƒRµ‰D$‰<$èïÉ|$ ¿Î‰L$‰D$ƒÎЉ$èìÁ1öéÆÇEì‹EðMì‰L$ ‰$ÇD$ÇD$ÇD$ÇD$èjÁ‰Ç‹Eð‰$èWÁ1öƒÿÕtj…ÿt‹E‰D$‰|$ƒÞŠëIƒ}ìt=‹ƒª²‹‹Z³‰L$‰$èIË‹Vµ‹Uì‰T$‰L$‰$ÇD$ è(ÉÆëƒîЉ$è0Á1ö‹Eì…Àt‰$è•À‹ƒr³‰D$‰4$èóƒÄ,^_[]ÃU‰åSWVƒìlè[‹E‰$èyÀ‰Æƒu‰‰D$‰4$ÇD$èKÀ‰Ç‰4$è;À1ö…ÿ…§} ‰|$‹E‰$èCÀ1ö„À„‹ÇEœEœ‰D$‰|$Ç$èEÀf…Àt ¿À‰D$‹E‰D$ƒ…‰‰$è`À1öëH‹Eœ‰$è3À‹Eœ‹0‰$èÀ‰D$‰t$‹ƒÁ‹‰$è–¿‰Æ‹Eœ‰$èÀ‹Eœ‰$èÌ¿‰ðƒÄl^_[]ÃU‰åSWVìŒè_‹‡g±ˆ‰L$‰D$‹u‰4$è¿Á‰Ã‹‡g±ˆ‰L$‰D$‰4$è¡Á1É…Àt ‰$èýÿÿ‰Á…É……Û„‰M€‹‡g±'ˆ‰L$‰D$‰4$èbÁ1É…Àt‹Ó²‰L$‰$èJÁ‰Á‰M„‰$èÙ¾‰½xÿÿÿ‰ß‰Ã‰$è×À‰Æ‹xÿÿÿ‹×²‰\$ ‰t$‰D$‰<$‰½|ÿÿÿ‰ÏèÁ‰4$ÇD$ÇD$èÁ‰Ã‰4$èCÀƒûÿ‹M€t\Eˆ‰D$‰$è>À‰$謿·EŒÁèƒà‰D$ ‹E„‰D$‹…|ÿÿÿ‰D$‹‡Ã€‹‰$è?¾‰Æ‹‡ë°‰D$‰4$è}À‰ñ‰ÈÄŒ^_[]ÃU‰åSWVƒìè^‹}…ÿu†‡‰$èd¾1ÿéê‰<$ÇD$èÕ½‰Ã‰<$…Û”Eïè8ýÿÿ…À‰Eðu 1ÿ€}ï…·‹†H®‹ŽÀ°‰L$‰$èø¿‰Ç…Ûth‹†\±Ž˜†‰L$ ‰\$‰D$‰<$èÒ¿‰$èZ½‹†L®‹Ž`±‰L$‰$ÇD$調‹Ž\±–¨†‰T$ ‰D$‰L$‰<$芿ƒ}ðt+‹†\±Žˆ†‰L$ ‹uð‰t$‰D$‰<$èa¿‰4$è鼉øƒÄ^_[]ÃU‰åSWVƒìLè_‹‡E°‰D$‹u‰4$è+¿óEóMóL$ óD$‰T$‰$è½]„Àu(óCóK ‹‡I°óL$ óD$‰D$‰4$èÚ¾ÇEàÇE䋇E°‰D$‰4$躾‰Uì‰EèfnÂfnÐóK.Ñwó[ .ƹ.Ðv5ó[ (Ëó^ÊóYÈóK ó\ËóYi=óXKó $è½½Ù[ë1.Âv,(Ùó^ØóYÚó[ó\ÙóYŸi=óXó$艽Ù‹‡M°‰D$‰4$ÇD$辋‡‰­‹Q°‰L$‰$è÷½‹U°‰L$‰$ÇD$èݽël.Êv0ó\ÊóYe=ó $覼Ù]ÜóóXEÜóó[ óEì.Øv(ó\ØóYŸe=ó$èq¼Ù]ØóCóXEØóCòEèòC‹‡Y°òEàòMèòL$ òD$òòKòL$òD$óE$óD$,‹M ‰L$(‰D$‰4$è ½ƒÄL^_[]ÃU‰åSWVƒìè[‹ƒ&®óEóD$ óEóD$‰D$‹E‰$èÞ¼‹‹®‰L$‰$è̼‰Ç‰Ö‹ƒ*®‰t$ ‰|$‰D$‹E‰$諼‰ø‰òƒÄ^_[]ÃU‰åSWVì¬è^‹†²­óEóD$ óEóD$‰D$‹}‰<$èb¼…À…fïÀ)EØ)EÈ‹†¶­‰D$‰<$è<¼‰Â‹†®¬‰u„Mˆ‰L$ MȉL$‰D$‰$‰•xÿÿÿÇD$è ¼…À‰…|ÿÿÿ„‹EЋ‰…pÿÿÿfïÀóE€³Ç…tÿÿÿ1ÿ‹EЋpÿÿÿ9t‹…xÿÿÿ‰$è”»‹EÌ‹4¸‹E„‹€’­‰D$‰4$裻fnÈóEó\Áóe€óZÌfïöf.ñv óZÐf.Öw;„Ûu,(ЋE„ó¨Â:TÕ(ÜTÝ.ÚwóZÐf.òvf.Îv 0Û‰µtÿÿÿ(àóe€G;½|ÿÿÿ‚Sÿÿÿ‹E„‹€®¬Mˆ‰L$ MȉL$‰D$‹…xÿÿÿ‰$ÇD$èûº…À‰…|ÿÿÿ…ÿÿÿ‹…tÿÿÿ…À‹}…ƒ‹U„‹‚¾«‹Šº­‰Ö‰L$‰D$‰<$軺„Àt:‹†º­‹Žn{òòIòL$òD$‰D$‰<$ÇD$ÇD$닆­‹Ž¾­‰L$‰D$‰<$ÇD$ èYºĬ^_[]ÃU‰åSWVìŒè^fïÀ)EØ)EÈ‹†e«‰D$‹E‰$躉‹†]ª‰u€Mˆ‰L$ MȉL$‰D$‰$‰U„ÇD$1Ûè鹉Džÿ„¥‹EЋ‰…|ÿÿÿ1ö‹EЋ|ÿÿÿ9t ‹E„‰$蹋EÌ‹°‹E€‹€A«‰D$‰$蟹óEóD$ óEóD$‰T$‰$è…·„Àu?F9þr¢‹E€‹€]ªMˆ‰L$ MȉL$‰D$‹E„‰$ÇD$èF¹‰Ç1Û…ÿ…fÿÿÿ‰ØÄŒ^_[]ÃU‰åWVƒì è^‹†Xª‰D$‹}‰<$è ¹ˆÁ‹E„Éu%‰Eð‹†l§‰Eô‹†\ª‰|$‰D$Eð‰$èâ¸ƒÄ ^_]ÃU‰åVƒìè^‹† ª‰D$‹E‰$賸‹Ž§‹– ª‰D$‰T$‰ $è—¸ƒÄ^]ÃU‰åVƒìè^‹†Í©‰D$‹E‰$èo¸‹ŽÑ©‰L$‰$ÇD$ ÇD$èM¸ƒÄ^]ÃU‰åVƒìè^‹†ƒ©‰D$‹E‰$è%¸‹Ž‡©‰L$‰$ÇD$ ÇD$踃Ä^]ÃU‰åSWVƒìè[ÇEìÇE苃Ëv‹‰EäEè‰$èÀµ0Éf…À…¨Eè‰$ÇD$ÿÿÿÿèÞµ‰Á1À…Ét‰ $è&µ‹‹û¦‰L$‰$芷‰Ç…ÿt¯‹ƒÛ§‹·~‰L$‰D$‰<$èh·‰Æ‹ƒÛ§‹Mä‰L$‰D$‰<$èM·…ö„pÿÿÿƒ}„fÿÿÿ‹ƒ¨‹M‰L$‰D$‰4$è"·„À•Á„Bÿÿÿ‹E …Àt„ÉuÇEèÇEìòEèò¶ÁƒÄ^_[]ÃU‰åVƒìè^‹†¥‹Ž§‹U‰T$‰L$‰$è¾¶‹Žz¦‰L$‰$謶…À•À¶ÀƒÄ^]ÃU‰åVƒìè^‹†Æ¤‹ŽÊ¦–z{‰T$‰L$‰$èo¶‹Ž.¦‰L$‰$è]¶…À•À¶ÀƒÄ^]ÃU‰åWVƒì è_‹E‰Eð‹‡ë¹‰Eô‹‡7¥‰D$Eð‰$è ¶‰Æ…öt>‹‡¤‹3¥‰L$‰$èüµ‹7¥‰L$‰$è굉t$‰$ÇD$è µ‰ðƒÄ ^_]ÃU‰åWVƒìè^‹}‹G‹ŽÀ¤‰L$‰$è§µ‰}ð‹†l¹‰Eô‹†(¦‰D$Eð‰$茵ƒÄ^_]ÃU‰åSWVƒì è^‹}‹G…ÀuB_‹†E£‹Že¤‰L$‰$èKµ‹Ži¤‰L$‰$)ûè7µ‰\$‰|$‰$èñ´‹G‹U‹Žá¤‰T$‰L$‰$è µƒÄ ^_[]ÃU‰åSWVì,è_ÇEÐEЉEÔÇEØÇEÜ ‹‡F£‹B¦‰L$‰$è¾´‹u…Àt2‹F¦‰L$‰D$E¸‰$è°´ƒìóEÄóMÀó]¸óU¼ëWÀ)E¸fïÀ(È(Ð(Øó]àóUäóMèóEìÇE E ‰E¤ÇE¨ÇE¬‹EÔóHóXHó‡63óXÈóM°óHóXHóXÈóM´ÇE€E€‰E„ÇEˆÇEŒ ‹‡J¦‰D$‰4$èä³…ÀtA‹N¦‰L$‰D$…hÿÿÿ‰$èÖ³ƒìó…tÿÿÿópÿÿÿóhÿÿÿó•lÿÿÿëWÀ)…hÿÿÿfïÀ(È(Ð(Øó]óU”óM˜óEœ‹E¤ó@‹E„ó\@ó@‹E¤ó@‹E„ó\@ó@Ç…Pÿÿÿ…Pÿÿÿ‰…TÿÿÿÇ…XÿÿÿÇ…\ÿÿÿÇ…`ÿÿÿÿÿÿÇ…8ÿÿÿ…8ÿÿÿ‰…<ÿÿÿÇ…@ÿÿÿÇ…DÿÿÿÇ…HÿÿÿÇ… ÿÿÿ… ÿÿÿ‰…$ÿÿÿÇ…(ÿÿÿÇ…,ÿÿÿÇ…0ÿÿÿ‹E‹@‹Ž¤‰L$‰$è–²…À„¢‹M‹Y‹‡âs‰…ðþÿÿÇ…ôþÿÿBÇ…øþÿÿ‡ˆ‰…üþÿÿ‡¶‰‰…ÿÿÿ…8ÿÿÿ‰…ÿÿÿE€‰…ÿÿÿ…Pÿÿÿ‰… ÿÿÿE ‰…ÿÿÿ…ÿÿÿ‰D$‰ $èä±… ÿÿÿ‰…ÿÿÿ‹‡R¦ðþÿÿ‰L$‰D$‰$èì±0Û‹…$ÿÿÿƒxˆç‹E‹@‹Ž¤‰L$‰$è±…Àu‹E‹@‹b¤‹u‰t$‰L$‰$ëQ‹…Tÿÿÿ‹X‹u‹F‹Ž¤‰L$‰$豋N9Ãr‹‡b¤ë‹…Tÿÿÿ‹P‹‡V¦‰T$ ‹u‰t$‰D$‰ $èL±‹‡J¦‰D$‰4$è:±‹Z¦‹U„òBòJòL$òD$‰L$‰$ÇD$豋‡^¦‰D$‰4$èõ°³… ÿÿÿ‰$ÇD$诅8ÿÿÿ‰$ÇD$èw¯…Pÿÿÿ‰$ÇD$èa¯E€‰$ÇD$èN¯E ‰$ÇD$è;¯EЉ$ÇD$è(¯¶ÃÄ,^_[]ÃU‰åSWVƒì<è_‹‡´¡‰D$‹E ‰$èF°‹]‹u…Àt‹¸¡‰L$‰D$E؉$è5°ƒìëfïÀ)EØ‹F‹H‹Q…Ò~ J‰Qé2‹F‹@ó@óMØ.Èv B‰Qé.Á‡üƒÀòEØòMàòL$òD$òòHòL$ò$èm­0É„Àt‹F‹@óEÜó\@óX‡ .ó@±‹F‹@óHóX .fïÀ.Áv>óHóPóX—¤.ó\ÊóH‹F‹N ‹@‹IóIó\HóH‹F‹@±.@vA‡4w‰$è.­Æ‹F$‹@‹øŸ‰L$‰$èù®‹N‹I‰A‹F(‹@Ç@ÿÿÿÿë„ÉuÆ‹F‹@‹M‰HƒÄ<^_[]Ãf.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è>­‹G‰D$F‰$ÇD$è$­‹G‰D$F‰$ÇD$è ­‹G ‰D$F ‰$ÇD$èð¬‹G$‰D$F$‰$ÇD$èÖ¬‹G(‰D$ƒÆ(‰4$ÇD$輬ƒÄ^_]Ãffffff.„U‰åVƒì‹u‹F‰$ÇD$謋F‰$ÇD$è|¬‹F‰$ÇD$èi¬‹F ‰$ÇD$èV¬‹F$‰$ÇD$èC¬‹F(‰$ÇD$è0¬ƒÄ^]ÃU‰åSWVƒì<è_‹Eƒx„‰ÃC‰EЋ‡@›‹Üž‰L$‰$è>­‰Æ‹C‰EÔ‹‡\l‰EØÇEÜBÇEà‡‰Eä‡P‚‰EèEì‰D$‰$‹]ÐèˬEð‰D$‰4$輬‹‡ÌžM؉L$‰D$‹EÔ‰$èЬ‹‡‰D$‰4$辬…Àt‹‹äž‰t$‰L$‰$袬‹‹‰L$‰$莬…Àu.‹u‹F‹lœ‰L$‰$)óèp¬‰\$‰t$Ç$è&¬ƒÄ<^_[]ÃU‰åSWVƒì è^‹]‹C‹Žº‹} ‰|$‰L$‰$è&¬„Àt-‹C‹Ž¶›‰|$‰L$‰$è ¬‹†²‰D$‰<$è÷«ë‹EÆƒÄ ^_[]Ãff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è^ª‹G‰D$ƒÆ‰4$ÇD$èDªƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$誋F‰$ÇD$è ªƒÄ^]ÃU‰åSWVƒì<è[‹ƒ4›‹°n‰L$‰D$‹u‰4$è(«‰E䋃4›‹Àn‰L$‰D$‰4$è «‰E苃4›‹o‰L$‰D$‰4$èꪋ‹øš‰L$‰$èØªˆE4›‹àn‰L$‰D$‰4$蹪‰Eð‹ƒ4›‹Ðn‰L$‰D$‰4$蚪‰Ç…ÿu2‹ƒ4›‹0r‰L$‰D$‰4$èxª‰Ç…ÿu‹ƒ j‹‹‹Äœëf‹ƒl™‹‹Øš‰L$‰$èJª‹‹Üš‰D$‰L$‰<$è4ª„ÀuB‹ƒl™‹‹<š‰L$‰$誋‹Èœ‰|$‰L$‰$誋‹Tš‰L$‰$èð©‰Ç‹ƒ ™‹‹<š‰L$‰$èÖ©‹‹Ìœ‹u‰t$‹Uð‰T$¾Uï‰T$‰|$‹Uè‰T$ ‹Uä‰T$‰L$‰$蜩‰Ç‹ƒ¼œ‰|$‰D$‰4$è„©„Àu‹ƒÐœ‰|$‰D$‰4$èj©‹ƒHš‰D$‰<$èX©ƒÄ<^_[]ÃU‰åSWVƒì è_‹‡F˜‰D$‹u‰4$è,©‹]‹C‹ž™‰t$‰L$‰$è©‹‡Îš‰D$‰$èþ¨‹‡Z™‰D$‰4$è쨉Ƌ‡Òš‰D$‰$èØ¨‹r˜‹—z˜‰T$‰L$‰$輨„Àt(‹‡Òš‰D$‰$覨‹z˜‰t$‰L$‰$訋‡B˜‰D$‹E‰$è{¨ƒÄ ^_[]ÃU‰åSWVƒì è_‹‡i—‰D$‹u‰4$èO¨‹]‹C‹Á˜‰t$‰L$‰$è3¨‹‡ñ™‰D$‰$è!¨‹‡}˜‰D$‰4$訉Ƌ‡õ™‰D$‰$èû§‹•—‹—‘—‰T$‰L$‰$èß§„Àt(‹‡õ™‰D$‰$èɧ‹‘—‰t$‰L$‰$è³§‹‡e—‰D$‹E‰$èž§ƒÄ ^_[]ÃU‰åƒìèZ‹E‹@‹Šë˜’—|‰T$‰L$‰$èh§ƒÄ]ÃU‰åWVƒìè^‹††–‹Žê˜‰L$‰D$‹} ‰<$è6§„Àt‹†ê˜‰D$‰<$ÇD$觃Ä^_]ÃU‰å‹E‹@ ]ÃU‰åƒì‹E‰D$‹E‰$ÇD$ è°¦ƒÄ]ÃU‰åSWVìŒè[‹E‰E苃¬ª‰E싃h˜òEòMòL$òD$‰D$Eè‰$蛦‰Æ…ö„õ‹»,•‹ƒl˜‰D$‰t$E؉$è~¦ƒì‹ƒp˜òEØòMàòL$òD$‰D$‰<$ÇD$AÇD$Aè1¦‹‹Ô•‰L$‰$覉t$‰$ÇD$lèÕ¥‹ƒl˜‰D$‰t$E¸‰$覃ìòE¸òMÀòL$ òD$Eȉ$ÇD$€?ÇD$€?èÒ£ƒì‹ƒ,•‹‹p˜òEÈòMÐòL$òD$‰L$‰$ÇD$AÇD$Aè}¥‹‹Ô•‰L$‰$èk¥‰t$‰$ÇD$pè!¥‹ƒ0•‹‹t˜‰L$‰$è?¥‹‹x˜‰L$‰$ÇD$è%¥‹‹Ü•‰L$‰$襉Á‹ƒ|˜‰D$‰ $‰M˜ÇD$èô¤‹ƒ4•‹‹€˜‰L$‰$ÇD$`AèÔ¤‹‹Ô•‰L$‰$褉t$‰$ÇD$Xèx¤‹ƒð”‹‹Ä•‰L$‰$è–¤‰Eœ‹FX‰E ‹‹¤e‹‰M‰E¤‹ƒ8•‹‹„˜‰L$‰$èg¤‹‹ e‹‰M”‹‹œe‹9‹‹–‰|$‹}˜‰|$‰T$‰D$‹E¤‰D$ ‹E ‰D$‰L$‹Eœ‰$ÇD$ 褉t$‰$ÇD$TèÌ£‹ƒ4•‹‹ˆ˜‰L$‰$ÇD$@Aè⣋‹Ô•‰L$‰$èУ‰t$‰$ÇD$d膣‹ƒð”‹‹Ä•‰L$‰$褣‰E ‹Fd‰E¤‹E‹8‹ƒ8•‹‹„˜‰L$‰$è~£‹M”‹‹‹–‰T$‰D$‰|$ ‹E¤‰D$‰L$‹E ‰$ÇD$èI£‰t$‰$ÇD$`èÿ¢‹ƒ<•‹‹Ä•‰L$‰$裉Njƒl˜‰D$‰t$E¨‰$裃싃Œ˜òE¨òM°òL$òD$‰t$‰D$‰<$ÇD$ ÇD$èâ‰t$‰$ÇD$tèy¢‹Nt‹ƒ˜‰L$‰D$‰4$è–¢‰ðÄŒ^_[]ÃU‰åWVƒì è^‹}‹Ot‹†@”‰L$‰D$‰<$è_¢‹Gt‹Ž|‘‰L$‰$èJ¢‹GP‹Ž|‘‰L$‰$è5¢‹GT‹Ž|‘‰L$‰$è ¢‹GX‹Ž|‘‰L$‰$è ¢‹G\‹Ž|‘‰L$‰$èö¡‹G`‹Ž|‘‰L$‰$èá¡‹Gd‹Ž|‘‰L$‰$èÌ¡‹Gh‹Ž|‘‰L$‰$è·¡‹Gp‹Ž|‘‰L$‰$袡‹Gl‹Ž|‘‰L$‰$衉}ð‹†X¦‰Eô‹†ä’‰D$Eð‰$èr¡ƒÄ ^_]ÃU‰åSWVƒì è_‹]‹sP‹‡“‰D$‹E‰$ÇD$*è3¡‹#“‰L$‰$è!¡‹[‰L$‰$衉\$‰$ÇD$PèÅ ‹‡W‰D$‰4$èé ƒÄ ^_[]ÃU‰åSWVƒì|è[‹}‰}苃¯¤‰E싃£’òEòMòL$òD$‰D$Eè‰$èž ‹Gl‹‹Ó‰L$‰$wl耠‹ƒ/‰E¤…ÿt‹ƒo’‰D$‰|$E؉$èl ƒìëfïÀ)EØ‹ƒs’òEØòMàòL$òD$‰D$‹E¤‰$ÇD$AÇD$Aè ‹‹×‰L$‰$)þèþŸ‰t$‰|$‰$踟‹Gp‹‹Ó‰L$‰$wpèÖŸ…ÿt‹ƒo’‰D$‰|$E¸‰$èËŸƒìëfïÀ)E¸òE¸òMÀòL$ òD$Eȉ$ÇD$€?ÇD$€?èƒì‹ƒ/‹‹s’òEÈòMÐòL$òD$‰L$‰$ÇD$AÇD$Aè:Ÿ‹‹×‰L$‰$)þè&Ÿ‰t$‰|$‰$èàž‹Ot‹ƒ—’‰L$‰D$‰<$èýž‹Gt‹‹Ó‰L$‰$èèž‹ƒ?‹‹Ç‰L$‰$wtèÍž‰E¤…ÿt‹ƒo’‰D$‰|$E¨‰$连ƒìëfïÀ)E¨‹ƒ’òE¨òM°òL$òD$‰|$‰D$‹E¤‰$ÇD$ ÇD$)þè_ž‰t$‰|$‰$èž‹Ot‹ƒ“’‰L$‰D$‰<$è6žƒÄ|^_[]ÃU‰å1À]ÃU‰å¸]ÃU‰åSWVƒìLè_‹Ÿï\‹u‹FP…ÀuóK닉L$‰$èåfnÈ‹F\…ÀuóC ë'óMÄ‹VT‹ã‰T$‰L$‰$èµfnÂóMÄóEÄ‹Fh…ÀtO‹V`‹ç‰T$óX[ó‡_ó\ÁóD$ ‰L$‰D$E؉$ÇD$!ÇD$€–Kèhƒìë fïÀ)EØ…öt#‹‡k‰D$‰t$Eȉ$è>ƒìóEäë)EÈfïÀóMÄóXÈfïÀóXÁóX‡[ócó_ÈÇEРCóMÔ‹‡ßòEÈòMÐòL$òD$‰D$‰4$èÁœƒÄL^_[]ÃU‰åWVìè^‹†ñЋ޹‰L$‰$èœ‹Ž…Ž‰L$‰$è~œ‹}‹Ž‰Ž‹†‹€xt‰L$‰$ÇD$ €?ë‰L$‰$ÇD$ @?ÇD$è<œ‹ŽŽ‰L$‰$è*œ‹Gl‹Ž‘މL$‰$蜀xt\‹†‹‹Ž]މL$‰$è÷›‹ŽŽ‰L$‰$è囋Gp‹Ž•މL$‰$ÇD$@@èÈ›‹Gp‹Ž™Ž‰L$‰$è³›‹†‰[òò@òEðòEòMèòMˆ‹GP…À„¿‹Ž­‰L$‰$ès›‰Uô‰Eð…ÿtY‹†EމD$‰|$E؉$èb›ƒìóEØóX†óE苆EމD$‰|$Eȉ$è4›ƒìó†óXEÌëWÀ)EØÇEèÀ@)EÈó†óEì‹GP‹ŽŽòEèòMðòL$òD$‰L$‰$èÆšòEòEÀòEˆòE¸‹G\…À„–‹WT‹Ž}މT$‰L$‰$莚‰UĉEÀ‹†EމD$‰|$E¨‰$蚃ìó†óM¬óXÈóM¼óMèóXMðóXÈóM¸‹OT‹G\‹–¡ŽòE¸òMÀòL$òD$‰L$‰T$‰$èš‹Gh…À„½‹W`‹ŽŽóEð‰T$óX†õóŽùó\ÈóL$ ‰L$‰D$E˜‰$ÇD$!ÇD$€–KèÉ™ƒìóEèóXEðóX†óE˜óE¼óXEă\•À¶ÀóX„†óEœ‹O`‹Gh‹–¡ŽòE˜òM òL$òD$‰L$‰T$‰$èI™‹†ñЋ޹‰L$‰$è1™‹Ž¥Ž‰L$‰$è™Ä^_]ÃU‰åWVƒìè^‹}ÆGx‹†‹‰D$‰<$ÇD$èæ˜‹†˜Š‰D$‰<$èÔ˜‹Ž8ˆ‹– ‹‰T$‰L$‰$踘„Àt,‹†˜Š‰D$‰<$袘‹Ž ‹‰L$‰$ÇD$舘ƒÄ^_]ÃU‰åWVƒìè^‹}ÆGx‹†tЉD$‰<$ÇD$èR˜‹†Š‰D$‰<$è@˜‹Ž¤‡‹–xЉT$‰L$‰$è$˜„Àt,‹†Š‰D$‰<$蘋ŽxЉL$‰$ÇD$èô—ƒÄ^_]ÃU‰åSWVƒì è_‹‡ç‰‰D$‹E‰$èÉ—‰Æ‹‡o‰‰D$‹]‰$è²—÷ÆtL‹‡‹—뉉T$‰L$‰$莗„Àt$‹‡o‰‰D$‰$èx—‹ë‰‰L$‰$èf—ƒÄ ^_[]ˇ‹—s‰‰T$‰L$‰$èB—„ÀtØ‹‡o‰‰D$‰$è,—‹s‰‰L$‰$ÇD$ëªU‰å‹E‹@h]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$hèë–ƒÄ]ÃU‰å‹E‹@\]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$\褖ƒÄ]ÃU‰å‹E‹@P]ÃU‰å‹E‹@|]ÃU‰åƒì‹E‰D$‹E‰$ÇD$|è–ƒÄ]ÃU‰åSWVƒìLè_‹‡®„‹2…‰L$‰$è%–‹Ö‡‹—UòòJòL$òD$‰L$‰$èø•‹J…‰L$‰$èæ•‰Ã‹‡Nˆ‹M‰L$‰D$‰$èË•‹‡Rˆ‹M‰L$‰D$‰$貕‹‡Vˆ‹M‰L$‰D$‰$處‹‡¦…‹M‰L$‰D$‰$耕‹‡Zˆ‰D$‰$èn•…Ût‹‡š‡‰D$‰\$E؉$èc•ƒìëfïÀ)EØ‹‡²„‹2…‰L$‰$è,•‹^ˆòEØòMàòL$òD$‰L$‰$ÇD$ ÇD$ÇD$€è씉Á‹E‰EЋ‡Jš‰EÔ‹‡bˆ‰L$‰M̉D$EЉ$èÅ”…À‰Æ„‹‡B…‰D$‰$裔‰t$‰$ÇD$(èY”‹‡fˆ‰D$‹]̉$ÇD$èr”‹‡jˆ‰D$‰$ÇD$èX”‹‡nˆ‰D$‰$ÇD$è>”‹N(‹‡rˆ‰L$‰D$‰$è%”‹‡vˆ‰D$‰$ÇD$è ”‹‡¦„‹zˆ‰L$‰$èó“‹~ˆ‰D$‰L$‰$èÝ“Ç$ è‘‹‚ˆ‰D$‰L$‰$軓‹‡†ˆ‰D$‰$ÇD$è¡“‹‡Šˆ‰D$‰$ÇD$臓‹‡Žˆ‰D$‰$‰]ÌÇD$èj“‹‡B…‰D$‹E ‰$èU“‰t$‰$ÇD$<è “‰t$‹E$‰$ÇD$8èô’ÆF6ŠEˆF5„Àul‹‡¶„‹–ˆ‹—’ˆ‰T$‰t$‰L$‰$ÇD$ @ÇD$ÇD$ÇD$èÖ’‹B…‰L$‰$èÄ’‰t$‰$ÇD$0èz’‹‡>…‰D$‹Ẻ$è›’‰ðƒÄL^_[]ÃU‰åWVƒìè^‹}‹G0‹Žà„‰L$‰$èk’‹G0‹Ž„‰L$‰$èV’‹G,‹Žä„‰L$‰$èA’‹G(‹Ž„‰L$‰$è,’‹G<‹Ž„‰L$‰$è’‰}ð‹†–‰Eô‹†ì‚‰D$Eð‰$èü‘ƒÄ^_]ÃU‰åSWVƒì,è[‹ƒ9ƒ‰D$‹E‰$‰ÆèÉ‘‹‹E„‰L$‰$ÇD$译‹ƒ9ƒ‰D$‰4$è‘‹‹I„‰L$‰$ÇD$胑‹ƒ€‰Eð‹ƒ9ƒ‰D$‰4$èh‘‹‹P‹ ‹“¥P‹:‹“©P‹2‹“M„‰t$‰|$‰L$ ‰D$‰T$‹Eð‰$ÇD$è#‘‹‹å‹“Q„‰D$‰T$‰ $葉Ƌƒ]€‹‹Õ€‰L$‰$èí‹‹U„‰t$‰L$‰$è׋u‰t$‰$ÇD$,芋F,‹‹Y„‰L$‰$ÇD$裋F,‹‹]„‰L$‰$ÇD$ 33Ó?ÇD$3333è~‹F,‹‹a„‰L$‰$èiÆF6ƒÄ,^_[]ÃU‰åSWVƒì è^‹†O‰D$‹E‰$è9‹†§‰D$‹}‰<$è$‹ŽÓ‚‰L$‰$ÇD$è ÆG6Š_4‹†ß‰D$‰<$èñ€ûtP‹Ž‹–ׂ‰T$‰L$‰$èЄÀt(‹†ß‰D$‰<$躋Ž×‚‰|$‰L$‰$è¤ƒÄ ^_[]ËŽ‹–Û‚‰T$‰L$‰$耄ÀtØ‹†ß‰D$‰<$èj‹ŽÛ‚ë®U‰åƒìèX‹€ç‹M‰L$‰D$‹E‰$è:ƒÄ]ÃU‰åSWVƒì,è_‹‡G}‰Eð‹‡€‰D$‹E‰$è‹ãM‹ ‹—çM‹‹—ïM‹2‹—“‰t$‰\$‰L$ ‰D$‰T$‹Eð‰$ÇD$èÃŽ‹+}‹——‰D$‰T$‰ $è§Ž‰Æ‹‡£}‹~‰L$‰$莋›‰t$‰L$‰$èwŽ‹u‰t$‰$ÇD$,è*Ž‹F,‹Ÿ‰L$‰$ÇD$èCŽ‹F,‹£‰L$‰$ÇD$ 33Ó?ÇD$3333莋F,‹~‰t$‰L$‰$莋F,‹§‰L$‰$èðƒÄ,^_[]ÃU‰åƒìèYŠU‹EˆP4‹‰q€‰L$‰$èÁƒÄ]ÃU‰åƒìèX‹€E‰D$‹E‰$ÇD$蓃Ä]ÃU‰åWVƒì è_ŠE‹uˆF7„ÀtI‹F0‹Ý‰L$‰$è^‹F0‹|‰L$‰$èI‰t$ÇD$0Ç$èûŒƒÄ ^_]À~5uó‹‡ù{‹Ù‹—Õ‰T$‰t$‰L$‰$ÇD$ @ÇD$ÇD$ÇD$èÞŒ‹…|‰L$‰$èÌŒ‰t$‰$ÇD$0ë…U‰åWVƒìè^‹†>~‰D$‹}‰<$蘌‹ŽÞ{‹–F‰T$‰L$‰$è|Œ„Àt(‹†>~‰D$‰<$èfŒ‹ŽF‰|$‰L$‰$èPŒƒÄ^_]ÃU‰å‹E¾@5]ÃU‰å‹E‹@<]ÃU‰å‹E¾@6]ÃU‰å‹E‹@8]ÃU‰åƒì‹E‰D$‹E‰$ÇD$8èÅ‹ƒÄ]ÃU‰å‹E¾@7]ÃU‰åSWVƒìLè[‹ƒz‹‹Ðz‰L$‰$èˉƋƒà|‰D$‹E‰$‰Ç誋‹‹x~‰T$ ‰D$‰L$‰4$苉Ƌƒ|~‰D$‰4$è|‹‹ƒ$z‹‹ì|‰L$‰$èd‹‹‹ð|‰L$‰$ÇD$èJ‹‹ƒ$z‹‹ì|‰L$‰$è2‹‹‹€~‰L$‰$ÇD$è‹‹ƒ¼JòòHòMèòEà‹ƒà|‰D$‰<$è튉Uì‰E苃\z‹‹„~‰L$‰$èÏŠ‰Ç‹ƒˆ~óEìóD$ ‰D$‰<$ÇD$訊‹ƒŒ~‰D$‰<$ÇD$ €¿ÇD$€?膊‹ƒ~‰D$‰<$ètŠ‹ƒô|òEàòMèòL$ òD$òL$òD$‰D$‹E‰$ÇD$,€?ÇD$(è-Š‹ƒ”~‰D$‰4$芋ƒèz‰D$‰4$è ŠƒÄL^_[]ÃU‰åSWVƒìè_‹‡÷z‰D$‹u‰4$‹]ó*ÃóEðèщóMðfnÀ.Èr fnÂ.Ès‹‡¯|‰\$‰D$‰4$褉ë‰ðƒÄ^_[]ÃU‰åSWVƒì\è_‹‡Žz‰D$‹]‰$èt‰fnÂfnÈ‹E.Èv$ó^ÁóZÈò*ÀòYÁòZÀóEÈó*ÀóEÌë"ó^ÈóZÉò*ÀòYÁòZÀóEÌó*ÀóEÈ‹‡®w‹~x‰L$‰$艋&|óEÈóD$ óEÌóD$‰L$‰$èÞˆ‹–x‰L$‰$è̈‰Æ‹‡*|‰D$‰4$踈‹‡Òw‹šz‰L$‰$è ˆ‹žz‰L$‰$ÇD$膈‹‡jHòòHòMèòEàóUÌóUèóUÈóUìòMØòEЋ‡Žz‰D$‰$è=ˆ‰U܉EØ‹‡¢zòEÐòMØòL$ òD$òEàòMèòL$òD$‰D$‰$ÇD$,€?ÇD$(è釋‡B|‰D$‰4$èׇ‰ðƒÄ\^_[]ÃU‰åSWVƒì|è_‹‡Ãx‰D$‹]‰$詇fnÂfnÈ‹u.Èv$ó^ÁóZÈò*ÆòYÁòZÀóEÄó*ÆóEÈë"ó^ÈóZÉò*ÆòYÁòZÀóEÈó*ÆóEÄ‹‡ãu‹³v‰L$‰$è;‡‹[zó*ÆóD$ óD$óẺL$‰$臋Ëv‰L$‰$臉Ƌ‡_z‰D$‰4$è‡v‹Ïx‰L$‰$èÖ†‹Óx‰L$‰$ÇD$輆‹‡ŸFòò@òEèòE¸òMàòM°óEÈóEèóMÄóMìóEÌó\ÁóY‡ãó$辆Ù]äóEÌó\EèóY‡ãó$蟆Ù]àòE¸òEØòE°òEЋ‡Ãx‰D$‰$è"†‰U܉EØ‹‡×xòEÐòMØòL$ òD$òEàòMèòL$òD$‰D$‰$ÇD$,€?ÇD$(èÎ…‹‡wz‰D$‰4$è¼…‰ðƒÄ|^_[]ÃU‰åWVƒì@è_‹‡…DòòHòMðòE苇©v‰D$‹u‰4$èv…‰Uô‰Eð‹‡½vòEèòMðòL$ òD$òEòMòL$òD$‰D$‰4$ÇD$,€?ÇD$(è"…ƒÄ@^_]ÃU‰å1À]ÃU‰åWVƒìè^‹†—t‰D$‹}‰<$èñ„‹†t‰D$‰<$èß„1ÀƒÄ^_]ÃU‰åWVƒì è_‹E‰Eð‹‡‰‰Eô‹‡Ás‰D$Eð‰$誄‰Æ…öth‹E‹Ís‰L$‰$艄‰t$‰$ÇD$è?„‹‡Yt‰D$‰4$èc„‹u‰L$‰$èQ„‰F‰t$ÇD$ Ç$脉ðƒÄ ^_]ÃU‰åWVƒìè^‹}‹G‹Ž s‰L$‰$è„‹G ‹Ž s‰L$‰$èòƒ‰}ð‹†\ˆ‰Eô‹†ˆt‰D$Eð‰$è׃ƒÄ^_]ÃU‰åSWVƒì è_‹‡°r‰D$‹E‰$覃‰Æ‹‡t‰D$‹]‰$胋 s‰D$‰L$‰4$èyƒ‹Èr‰L$‰$ègƒ‰Æ‹‡0s‰t$‰D$‰$èOƒ‰ðƒÄ ^_[]ÃU‰å]ÃU‰åWVƒìè^‹†Ãt‰D$‹}‰<$胋Žóu‰|$‰L$‰$胋†÷u‰D$‰<$èõ‚‹†ûu‰D$‰<$èゃÄ^_]ÃU‰åSWVƒì è[‹ƒ&s‰D$‹E‰$踂‰ÆëL‹ƒÒq‰D$‰4$袂‰Ç‹ƒ–u‰D$‰4$莂‹ƒ&s‰D$‰4$è|‚‰Æ‹ƒÎq‰D$‰<$èh‚…öu°‹u‹F…ÀtH‹‹þq‹“šu‰T$‰L$‰$è>‚„Àt(‹ƒ^t‰D$‰4$è(‚‹‹šu‰t$‰L$‰$è‚ƒÄ ^_[]ÃU‰åWVƒìè^‹†s‰D$‹}‰<$è狎Ít‰|$‰L$‰$èÑ‹†Át‰D$‰<$迃Ä^_]ÃU‰åWVƒìè^‹†r‰D$‹}‰<$è•‹Ž#q‰L$‰$胋†;s‰D$‰<$èq‹Žt‰|$‰L$‰$è[ƒÄ^_]ÃU‰åWVƒìè^‹†×r‰D$‹}‰<$è1‹Žt‰|$‰L$‰$èƒÄ^_]ÃU‰å‹E‹@]ÃU‰å‹E‹@]ÃU‰å‹E‹@ ]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$ èÔ€ƒÄ]ÃU‰å‹E‹@]ÃU‰åƒì‹E‰D$‹E‰$ÇD$èV€ƒÄ]ÃU‰å‹E‹@]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$è]€ƒÄ]ÃU‰å¸]ÃU‰åSWVƒìLè[‹ƒdn‹‹¨p‰L$‰$耋‹p‰L$‰$èý‰Æ…ö„‹ƒln‹‹s‰t$‰L$‰$è×…À„ùÇEìÇEèEè‰D$‰4$èµÇÿÿ„À„Ô‹ƒˆp‰D$‹E‰$è•…Àu 1ÿÆEÔéÊ‹ƒ ?‹0‰4$è0}‰Ç‰|$‰4$è(}‰Æ‰<$èî|‹ƒn‰EÔ‹ƒˆp‰D$‹E‰$è@‹‹p“D‰T$‰L$‰$è$‰Çè±~‹‹pp‰t$‰D$‰|$ ƒ G‰D$‰L$‹EÔ‰$èò~‹‹ q“`D‰T$‰L$‰$èÖ~‰Ç‰4$è\|‹ƒq‰D$‰<$èº~=rM‹ƒq‰D$³`D‰4$è›~¹ÿ)Á‹ƒs‰L$‰D$‰<$è~~‹‹ q‰t$‰L$‰$èh~‰Çè|‹‹Äp‰|$‰L$‰$èK~‰Æ‹ƒq‰D$‰4$è7~=rM‹ƒq‰D$»`D‰<$è~¹)Á‹ƒs‰L$‰D$‰4$èû}‹‹ q‰|$‰L$‰$èå}‰Æ‹»¬n‹ƒˆp‰D$‹E‰$èÈ}‹‹ sUä‰T$‰D$‰L$‰<$ÇD$ Èè£}…Àt6‹‹s‰t$‰L$‰$ÇD$ è}„Àui‰t$ƒ0G‰$è…{ëU‹Eä‰D$‰t$ƒ@G‰$èj{‹ƒˆp‰D$‹E‰$è;}‰D$ƒPG‰$èC{‹Eä‹‹(o‰L$‰$è}‹ƒ`n‹‹Àp‰L$‰$èü|‹‹Èp‰t$‰L$‰$èæ|„À„Mýÿÿ‹ƒln‹‹s‰t$‰L$‰$èÂ|‰ÇÆEÔEè‰D$ ÇD$ÇD$ÿÿÿÿÇD$ÇD$ nspÇD$codoÇ$tveaè±y…À‰EÐu,‹ƒ¸o‰D$‹E‰$èe|‰D$ƒ`G‰$èmzéx€}Ô„¶‹ƒdp‰D$‰<$è2|‹‹s‰L$‰$ÇD$è|‰Ç‹ƒq‰D$‰<$è|‰Æ‹ƒq‰D$‰<$èð{‰D$‰t$ ‹EЉ$ÇD$lrufÇD$----èy‰Ç…ÿt9‹ƒ¸o‰D$‹E‰$è²{‰Æ‰<$è˜y‰D$ ‰|$‰t$ƒpG‰$è¨y}؉|$‹EЉ$è¦x‰Æ…öt6‹ƒ¸o‰D$‹E‰$èa{‰Ç‰4$èGy‰D$ ‰t$‰|$ƒ€Géåþÿÿ‰<$ÇD$ ÿÿÿÿÇD$‘ÇD$èDx‰Æ…öta‹ƒ¸o‰D$‹E‰$è{‰Ç‰4$èëx‰D$ ‰t$‰|$ƒG‰$èûxE؉$èôw‹ƒs‰D$‹E‰$èÁzƒÄL^_[]É<$èÏw‹ƒsëÙU‰å‹E‹@]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$èzƒÄ]ÃU‰å¸]ÃU‰åWVƒì è^‹†{h‹ŽGi‰L$‰$è2z‹}‹W‹Ži‰T$‹–9‹‰T$ ‰|$‰L$‰$èz‹G‹ŽKi‰L$‰$èñy‹G‹ŽKi‰L$‰$èÜy‰}ð‹†ç~‰Eô‹†³j‰D$Eð‰$èÁyƒÄ ^_]ÃU‰åSWVƒìè_‹‡žl‰D$‹E‰$‹uèy;F…œ^‹‡Ög‹¢h‰L$‰$èiy‹V‹Úh‰T$‹—^8‹‰T$ ‰t$‰L$‰$è@y‹F‹¦h‰L$‰$è+y‰t$ÇD$Ç$èÝx‹F‹¦h‰L$‰$)óèüx‰\$‰t$Ç$è²xƒÄ^_[]ÃU‰åSWVƒì|è_‹E‰Eð‹M ‰Mìƒx…ˇZg‹Îk—J@‰T$‰L$‰$ÇD$ è‘x‰Eè…À„Ž‹‡g‹Îg‰L$‰$ènx‹îg‹Uð‹·Òk‹]è‰\$‹ŸŠ7‹‰\$‰t$ ‰T$‰L$‰$è8x]‰$èx‰$èóv…À…Ø‹Eè‹Ök‰L$‰$èx‰Æ‹‡h‹Úk‰L$‰D$‰4$èêw„Àtn‹‡Þk–†‰L$‰D$‰4$èÊw‹‡Ög‰D$‰4$è¸w‹Mð‰L$‰$ÇD$èkw‹Eè‹Ög‰L$‰$èŒw‹Mð‰L$‰$ÇD$ë$‡Z@‰$è„u‹Eð‰D$ÇD$Ç$èw‰$è;wëM‰$èw‰Æ‹‡^g‰t$‰$è w…Àt;‰t$‡j@‰$è-u‹Eð‰D$ÇD$Ç$èÂv‹Eð‹@ƒÄ|^_[]É$è¾v‰$èÂvU‰åSWVƒì|è_‹E‰Eð‹M ‰Mì‹Üi‰L$‰$è­v‰Eè…À„–]‰$è…v‰$è]u…Àu8‹uè‹Eð‹,g‰L$‰$èsv‹ài‰D$‰L$‰4$è]v‰$èIvëG‰$è'v‰Æ‹‡Xe‰t$‰$èv…Àt/‰t$‡d>‰$è;t‹Eð‹Ài‰L$‰$è vƒÄ|^_[]É$èØu‰$èÜuU‰å¸]ÃU‰åWVƒìè_‹·md‹‡=f‰D$‹E‰$èÁu‹õh‰D$ ‰L$‰4$ÇD$è£uƒÄ^_]ÃU‰å¸]ÃU‰åWVƒìè_‹·d‹‡åe‰D$‹E‰$èiu‹h‰D$ ‰L$‰4$ÇD$èKuƒÄ^_]ÃU‰åVƒìè^‹†˜e‰D$‹E‰$è"u‹Ž$e–Ð8‰T$‰L$‰$èu…À•À¶ÀƒÄ^]ÃU‰åWVƒì è^‹}‹G,‹Žßc‰L$‰$èÆt‹G‹Žûg‰L$‰$ÇD$è©t‹G‹Žßc‰L$‰$è”t‰|$ÇD$Ç$èFt‰}ð‹† z‰Eô‹†Ge‰D$Eð‰$èatƒÄ ^_]ÃU‰å1À]ÃU‰å1À]ÃU‰åWVƒì è_‹‡Yg‰D$‹u‰4$è#t‰D$‰t$‡á;‰$è'r‰uð‹‡ey‰Eô‹‡-g‰D$Eð‰$èòs‹F‹9c‰L$‰$è×s‰t$ÇD$Ç$è‰sƒÄ ^_]ÃU‰åWVƒìè^‹†Ïf‹M‰L$‰D$‹}‰<$èŽs‹O ‹†Óf‰L$‰D$‰<$èusƒÄ^_]ÃU‰åSWVƒì,è^‹†ôa‹ŽTb‰L$‰$èGs‹ŽŒf‹–L2‰T$ ‹}‰|$‰L$‰$è$s‰|$‰$ÇD$èÚrÇG4ÿÿÿÿ‹†f‰<$‰D$_èôr…Àu†;ë‹G8‹Ž”f‰L$‰$èÓr„Àuß‹G8ÇEð‹ ‹–˜f]ð‰\$‰D$‰T$‰ $ÇD$.@ÇD$ÇD$ ZèŽr„Àu@‹Eð‰D$†(;‰$èp‹†œf‹Mð‰L$‰D$‰<$è\r‹†Tf‰D$‰<$èJrƒÄ,^_[]ÃU‰åWVƒì è_‹‡eQ…À…¼‹·Í`‹‡É`‹ue‰L$‰$èr‹ye‰D$‰L$‰4$èòq‰Æ‹‡É`‹ue‰L$‰$èØq‹}e‰D$‰L$‰4$èÂq‹‡É`‹ue‰L$‰$èªq‹}e‰D$‰L$‰4$è”q‹‡e‰D$‰4$è‚qeQ‰L$‰$è4q‹‡eQ‹M‹—…e‰D$‰T$‰ $ÇD$$@ÇD$ ÇD$è9qƒÄ ^_]ÃU‰åVƒì$è^‹†º_‹Žfd‰L$‰$è q‹Žvd‹U‰T$‰D$‰L$‹E‰$ÇD$$@ÇD$ èÝpƒÄ$^]ÃU‰åSWVƒìè[‹ƒd‰D$‹}‰<$è³p‰Æƒ<tn‹ƒe_‹‹½_‰L$‰$è“p‹M‹Q<‹‹!d‰T$‰L$‰$ÇD$ÇD$ ègp‰Ç‹ƒ%d‰|$‰D$‰4$èOp‹ƒÉ_‰D$‰<$è=p‹ƒ)d‹}‰|$‰D$‰4$è$p‹ƒ-d‰|$‰D$‹E‰$ÇD$ èpƒÄ^_[]ÃU‰åSWVƒìè^‹†Í]‹Žá^‰L$‰$èÔo‹ŽUc‹}‰|$‰L$‰$ÇD$ è³o‹Žù^‰L$‰$è¡o‰Ã‹Eƒø„…À…8‹†YcŽÅ7‰L$‰D$‰$èoo‰Ç‹†‰_‰D$‰<$è[oƒøt@¾Õ7‰<$èbm‹†]c‰\$ ‰|$‰D$‹}‰<$è+o‹G‹Žac‰L$‰$龋†_‰D$‰<$ÇD$èün‹Ž}`–å7‰T$‰L$‰$èàn„Àu¾õ7넉]싆_‰D$‰<$ÇD$è·n‰Ã‹†^‹Žec‰L$‰$èn‹Žic‰D$‰L$‰$è‡n‹Ž‰.‹‹Ž}`‰T$‰L$‰$èin„Àu ¾8‰<$èql‹†]c‹Mì‰L$ éÿÿÿ‹†_‰D$‰<$ÇD$è+n‰Ç‹†9/‹‹†}`‰L$‰D$‰<$è n„À‹]tjÆC0‹†Ýb‰D$‰$èîm‹K‹†mc‰L$‰D$‰$èÕm‹†qc‰D$‰$èÃm„À„‹K‹†Qc‰L$‰D$‰$ÇD$ éB‹†.‹‹†}`‰L$‰D$‰<$è|m„Àt-‹K‹†Qc‰L$‰D$‰$ÇD$ èWmÇC4éø‹†‘.‹‹†}`‰L$‰D$‰<$è-m„Àt-‹†Qc‹M‰L$‰D$‰$ÇD$ èmÇC4é©‹†Í]‹Ž5`‰|$ –8‰T$‰L$‰$èÖl‹Ž]c‹Uì‰T$ ‰D$‰L$‰$è¹l‹C‹Žac‰L$‰$è¤l‹†µb‰D$‰$é:ÇEð‹†‘^‹ŽucUð‰T$ ‰|$‰L$‰$èhl‰Ç‹†‘^‹Žyc‰L$‰$èNl9lj}섇‹]‹C,…ÀuF‰ß_,‹†Á]‹Žá^‰L$‰$èl‹Žå^‰L$‰$)ûèl‰\$‰û‰\$‰$èÀk‹C,‹Ž]_‹Uì‰T$‰L$‰$èÚk‹†Qc‹M‰L$‰D$‰$ÇD$ ëd‹}‹G4ƒøt ƒøu‹†}c닆c‰D$‰<$è’k‹G,‹Ží^‰L$‰$è}k‰|$ÇD$,Ç$è/k‹†µb‰D$‰<$èSkƒÄ^_[]ÃU‰åSWVƒìlè[ÇEØU؉UÜÇEàÇE䃑‰Eè‹Á‰MìÇEðÇE¸}¸‰}¼ÇEÀÇEĉEȉMÌÇEЋu‹F,‹‹-*‰M˜ÇEœBÇE ‹â‰M¤‹a@‰M¨‰U¬‰}°‹‹\U˜‰T$‰L$‰$è’j‹EÜ‹@…À„…‹‹Ù^‰L$‰$èrj‹‹Ý^‰L$‰$è`j=”u‹ƒ^ëfoþÿÿƒøwh‹ƒ5Y‹‹ÍZ‰L$‰$è/j‹‹ÑZ‰D$‰L$‰4$èj„Àt6ƒ•3‰$è!h‹ƒá^냥3‰$è h‹ƒ1^‰D$‰4$èßi‰<$ÇD$èhE؉$ÇD$èlhƒÄl^_[]ÄU‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$ƒè0hƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$ƒèhƒÄ]ÃU‰åSWVƒì è[‹ƒñW‹‹ÝX‰L$‰$è4i‹‹áX‰D$‰L$‹} ‰<$èi„À„¯‹u‹ƒå\‰D$‰<$èþh‹‹ÝY“…1‰T$‰L$‰$èâh„Àt‹F‹@ƒÀ‰D$‰<$è™h‹ƒå\‰D$‰<$è·h‹‹ÝY“•1‰T$‰L$‰$è›h„Àt‹F‹@ƒÀ‰D$‰<$èRh‹F‹@ƒxt‹F‹@ƒxt‹EÆƒÄ ^_[]ÃU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èÞf‹G‰D$ƒÆ‰4$ÇD$èÄfƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$èŸf‹F‰$ÇD$èŒfƒÄ^]ÃU‰åSWVìœè[ÇEØ}؉}ÜÇEàÇEäƒþÿÿ‰Eè‹Iþÿÿ‰MìÇEðÇE¸u¸‰u¼ÇEÀÇEĉEȉMÌÇEÐÇE˜U˜‰UœÇE ÇE¤‰E¨‰M¬ÇE°‹E‹@,‹‹µ&‰xÿÿÿÇ…|ÿÿÿBÇE€‹‰M„‹ =‰Mˆ‰}Œ‰u‰U”‹‹%Y•xÿÿÿ‰T$‰L$‰$èæf‹EÜ‹@‹‹a[‰L$‰$èÎf‰Æ‹ƒu&‹‹ƒUX‰L$‰D$‰4$è®f¿„Àur‹ƒy&‹‹ƒUX‰L$‰D$‰4$è‡f¿„ÀuK‹ƒm&‹‹ƒUX‰L$‰D$‰4$è`f„Àu$‹ƒq&‹‹ƒUX‰L$‰D$‰4$è>f1ÿ„Àt¿‹Eœ‹@‹‹a[‰L$‰$èf‹‹m[“=0‰T$‰L$‰$èÿe…Àuc‹E¼‹@‹³IV‹‹a[‰L$‰$èÝe‹‹±Z‰L$‰$ÇD$èÃe‹‹q[‰D$‰L$‰4$ÇD$ÇD$ÇD$ ë‹E¼‹@‹‹a[‰L$‰$è€e‰Æ‹E‹@ƒÿu.‹‹õV‹“u[‰T$‰L$‰$èWe„ÀtN‹U‹B‹‹u[ë,‹‹õV‹“y[‰T$‰L$‰$è)e„Àt ‹U‹B‹‹y[‰t$ ‰T$‰L$‰$èeE˜‰$ÇD$è¢cE¸‰$ÇD$ècE؉$ÇD$è|cÄœ^_[]ÃU‰åSWVƒì è[‹ƒWS‹‹CT‰L$‰$èšd‹‹GT‰D$‰L$‹} ‰<$èd„À„‹u‹ƒKX‰D$‰<$èdd‹‹$‹‹‹CU‰T$‰L$‰$èFd„Àt‹F‹@ƒÀ‰D$‰<$èýc‹ƒKX‰D$‰<$èd‹‹K#‹‹‹CU‰T$‰L$‰$èýc„Àt‹F‹@ƒÀ‰D$‰<$è´c‹ƒKX‰D$‰<$èÒc‹‹G#‹‹‹CU‰T$‰L$‰$è´c„Àt‹F‹@ƒÀ‰D$‰<$èkc‹F‹@ƒxt‹F‹@ƒxt‹F‹@ƒxt‹EÆƒÄ ^_[]Ãffff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èÞa‹G‰D$F‰$ÇD$èÄa‹G‰D$ƒÆ‰4$ÇD$èªaƒÄ^_]Ãffff.„U‰åVƒì‹u‹F‰$ÇD$èa‹F‰$ÇD$èla‹F‰$ÇD$èYaƒÄ^]ÃU‰åSWVƒìè_‹u…öt)‹‡MV‰D$‰4$è{bƒøt‰t$‡+‰$è~`‹]€{0…·…öt‹‡ÑU‰t$‰D$‰$è=b醋·µP‹‡QV‰D$‰$è b‹UV‹—Ù!‹‰T$ ‰D$‰L$‰4$èþa‹=Q‹—YV‰D$‹‡Ý!‹‰D$‰T$‰ $ÇD$ èÎa‰Æ‹‡ÑU‰t$‰D$‰$è¶a…öt‹‡‰U‰D$‰$è a‹‡]U‰D$‰$èŽaƒÄ^_[]ÃU‰å‹E‹@ ]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$ è\aƒÄ]ÃU‰å‹E‹@$]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$$èaƒÄ]ÃU‰å‹E‹@8]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$8èÎ`ƒÄ]ÃU‰å‹E‹@<]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$<è‡`ƒÄ]ÃU‰å‹E‹@,]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$,è@`ƒÄ]ÃU‰å‹E‹@@]ÃU‰å‹E‹M‰A@]ÃU‰åSWVƒìè_‹E‰E苇Je‰E싇æN‰D$Eè‰$èÏ_‰Æ…ö„‹E(‹M$òE‹U‹]ÇF ‰VòF‰N‹:S‰L$‰$èŠ_‰t$‰$ÇD$ è@_‹E,‰F,…ÛtG‹‡òN‰D$‰$èZ_‰t$‰$ÇD$è_‹E‰FÆF$‹‡ÚP‰D$‰$è*_‰F(ëv‹^‹‡†N‹âN‰L$‰$è _ƒût‹V‹¶S‰T$‰L$‰$ë‹¶S‰L$‰$ÇD$èÕ^‰t$‰$ÇD$è‹^ÇFÆF$ÇF(‰ðƒÄ^_[]ÃU‰åWVƒìè^‹}‹G‹Ž„O‰L$‰$è^+G+G ‹M9Ès)Á‹G‹–dR‰L$‰T$‰$èW^ƒÄ^_]ÃU‰åSWVƒì èY‹]‹C‹u‹}…Àt+C 9øGÇ…ötAÆë<‹C…Àt+C 9øFø…öt'‹C‹‰.O‰L$‰$èø]+C+C 9ørÆëƉøƒÄ ^_[]ÃU‰å‹U‹B‹M…Àu ‹B…Àu‰Èë+B 9ÈGÁ]ÃU‰åSWVƒì èX‹}‹O‹u…Ét+O 9ñFñ‹]…Ût'‹O‹€•N‰D$‰ $èw]+G+G 9ðrÆëƉðƒÄ ^_[]ÃU‰åSWVƒì<è^‹Ž‹‰MĉEð‹}‹G ‹Ž9Nƒì‰L$‰$è#]ƒÄ‰Ã‹†9N‰uЉþƒì‰D$‹E‰$è]ƒÄ‰Ç‹F 89Ùs‰ú餋N…ɉút )Á9ÏBωʉ}̉eÈC‰]èƒàð‰á)Á‰Mԉ̋F ‹]Ћ‹5Nƒì‰L$‰$‰Uìè£\ƒÄ‰EÜ‹F‹N ‰Mä‹‹Qƒì‰L$‰$è\ƒÄ‹~‹N ‹“5Nƒì‰T$‹U‰$‹]èsÿ‹Uä9òBòº)ÚUìò‰U؉Ú)ò‰Uä)÷Ïlj}à¿ÿÿÿÿè,\ƒÄ‰Eì‹]ÔéÿEì釋Eè‰D$‹E܉D$‹Eì‰$è¯[ƒÄ…ÀuØëwƒì…öt׉t$‹Eà‰D$‰$è’[ƒÄƒì‹Eä‰D$‹Eì‰D$3‰$ès[ƒÄƒì‹Eè‰D$‹E܉D$‰$èQ[ƒÄ±…ÀtÿEäNÿEàG0É;}Ør“‹UÌë/‹Uäë*‹EЋ€5Nƒì‰D$‹E‰$‹uìuèè\[ƒÄ)Ɖò±‹E…Àtˆ‹eÈ‹EÄ‹;EðtèZ‰Ðeô^_[]ÃU‰åSWVƒìè_‹]‹C‹ðN‰L$‰$è[‰Eì‹s ‹C ‹L‰L$‰$èìZ‰Eð‹C ‹ L‰L$‰$èÔZ‰Ã1ÿ9Þr~)ß‹EÆëG ;¸ÿÿÿÿ9ñw(‹E‹@‰\$‹Mð‰L$øEì‰$èGZ…ÀuÑ)Þ)þ‰ðƒÄ^_[]ÃU‰åWVƒìè^‹}‹G‹ŽvI‰L$‰$è]Z‹G ‹ŽvI‰L$‰$èHZ‰}ð‹†Ò_‰Eô‹†ÞJ‰D$Eð‰$è-ZƒÄ^_]ÃU‰åSWVƒìè_‹E‰E苇ž_‰E싇 I‰D$Eè‰$èóY‰Æ…öt@‹]‹E‹I‰L$‰$èÏY‰t$‰$ÇD$è…YÇFòEòF‰^ ‰ðƒÄ^_[]ÃU‰åWVƒìè^‹}‹G‹ŽH‰L$‰$èwY‰}ð‹†_‰Eô‹†øI‰D$Eð‰$è\YƒÄ^_]ÃU‰åWVƒì è_‹E‰Eð‹‡þ^‰Eô‹‡:H‰D$Eð‰$è#Y‰Æ…öt)‹E‹ŽL‰L$‰$èY‰t$‰$ÇD$è¸X‰ðƒÄ ^_]ÃU‰åWVƒìè^‹}‹G‹ŽØG‰L$‰$è¿X‰}ð‹†”^‰Eô‹†@I‰D$Eð‰$è¤XƒÄ^_]ÃU‰åƒìèX‹€`L‰D$‹E‰$ÇD$ÇD$ ÇD$è^XƒÄ]ÃU‰åƒìèX‹€"L‹M‰L$‰D$‹E‰$ÇD$ ÇD$è!XƒÄ]ÃU‰åƒìèX‹€åK‹M‰L$ ‹M‰L$‰D$‹E‰$ÇD$èåWƒÄ]ÃU‰åSWVƒì,è_‹E‰E苇¾]‰E싇ÊF‰D$Eè‰$è³W‰Æ…ö„q‹]‹E‰t$‰$ÇD$èSW…Ût‰]à‹Eà‰$è“V‰^ ‹]ÇFÿÿÿÿÇFÿÿÿÿÇF…Ût‰]Ø‹E؉$èfV‰^$ë‡s¥‰$ÇD$è9V‰F$‹‡¦E‹ÆF‰L$‰$èW‹ªH‰L$‰$ÇD$èúV‰t$‰$ÇD$Dè°V‰t$ÇD$LÇ$è˜V‹‡¦E‹ÆF‰L$‰$è¶V‹ªH‰L$‰$ÇD$èœV‰t$‰$ÇD$HèRV‰t$ÇD$PÇ$è:V‹‡jF‹ÆF‰L$‰$èXV‹ÊF‰L$‰$èFV‰t$‰$ÇD$XèüU‰ðƒÄ,^_[]ÃU‰åSWVƒìLè^èU‹}‹_$9Øu‹†òI‰D$‰<$ÇD$èðUëG‹† ‰EØÇEÜBÇEà†Q‰E䆎+‰EèEì‰D$‰<$è†UE؉D$‰$èóT‰|$ÇD$Ç$èYU‹G …Àt‰EЋEЉ$èŠTÇG ‹G$‰EÈ‹Eȉ$èrTÇG$‹GD‹ŽE‰L$‰$èFU‹GH‹ŽE‰L$‰$è1U‹GX‹ŽE‰L$‰$èU‹G`‹ŽE‰L$‰$èU‹Gh‹ŽE‰L$‰$èòT‰}À‹†\‰EÄ‹†‚F‰D$EÀ‰$è×TƒÄL^_[]ÃU‰åƒìèY‹E‹@‹‰–H‰L$‰$ÇD$èTƒÄ]Ãfff.„U‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$èSƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$èðRƒÄ]ÃU‰åSWVƒìLè[è%S‹M‹q$9ðu‹qéÇEØ}؉}ÜÇEàÇE䃱‰Eèƒá‰E싃‰E¸ÇE¼BÇEÀƒ‰EăÁ)‰Eȉ}ÌEЉD$‰ $è}SE¸‰D$‰4$èêR‹EÜ‹p‰<$ÇD$è8R‰ðƒÄL^_[]ÃfU‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$ƒèRƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$ƒèàQƒÄ]ÃU‰åƒì‹E‹H‹@‹@‹IƒÁ‰L$‰$è×RƒÄ]ÃfDU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è~Q‹G‰D$ƒÆ‰4$ÇD$èdQƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$è?Q‹F‰$ÇD$è,QƒÄ^]ÃU‰åVƒì$èX‹ˆZ‰MàÇEäBÇE舒‰Mì€(‰EðEô‰D$‹u‰4$èþQEø‰D$‹E‰$èìQèQ‹N$9Èu Eà‰$ÿUìë'ŠE„ÀtEà‰D$‰ $è;QëEà‰D$‰ $èÖPƒÄ$^]ÃU‰åƒì‹E‹H‹@‰L$‰$ÇD$èQƒÄ]Ã@U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è.P‹G‰D$ƒÆ‰4$ÇD$èPƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$èïO‹F‰$ÇD$èÜOƒÄ^]ÃU‰åƒìèX‹€÷D‹M‰L$‰D$‹E‰$ÇD$ èöPƒÄ]ÃU‰åƒìèX‹€ÂD‹M‰L$‰D$‹E‰$ÇD$ èÁPƒÄ]ÃU‰åSWVƒì<è[è¦O‹M‹q$9ðu‹q ë{ÇEà}à‰}äÇEèÇE싃ž‰EÀÇEÄBÇEȃš‰Ẽ‚&‰EЉ}ÔE؉D$‰ $èPEÀ‰D$‰4$è€O‹Eä‹p‰<$ÇD$èÎN‰ðƒÄ<^_[]ÃU‰å‹M‹A‹I‹@‹I ‰H]ÃU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è~N‹G‰D$ƒÆ‰4$ÇD$èdNƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$è?N‹F‰$ÇD$è,NƒÄ^]ÃU‰åVƒì$èX‹ˆZ‰MàÇEäBÇE舆‰Mì€^%‰EðEô‰D$‹u‰4$èþN‹E‰Eøè!N‹N$9Èu Eà‰$ÿUìë'ŠE„ÀtEà‰D$‰ $èGNëEà‰D$‰ $èâMƒÄ$^]ÃU‰åVƒì‹u‹F‹@ …Àt‰Eø‹Eø‰$èÒM‹N1À…Ét‰Mð‹Eð‰$èÇM‹F‹N‰A ƒÄ^]ÃU‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$è MƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$èMƒÄ]ÃU‰åƒìèX‹€ B‹M‰L$‰D$‹E‰$ÇD$ èNƒÄ]ÃU‰åƒìèX‹€ëA‹M‰L$‰D$‹E‰$ÇD$ èæMƒÄ]ÃU‰åSWVƒì\è[èËL‹}‹w$‹M9ðu(…Ét‹G‰L$‰$è}M‹M…É„ù‹G ‰éïÇEØU؉UÜÇEàÇEäƒWúÿÿ‰E胇úÿÿ‰EìÇEðÇEÀMÀ‰MÄÇEÈÇEÌÇEЋƒÃ ‰E ÇE¤BÇE¨ƒ2‰E¬ƒç#‰Ó‰E°‰]´E¸‰D$‰<$‰ÏèÓL‰}¼E ‰D$‰4$è=L‹M…Ét‹EÜ‹@‰L$‰$è¨L‹M…Ét‹EÄ‹@‰‰<$ÇD$èiK‰$ÇD$èYKƒÄ\^_[]ÃU‰åVƒì‹u‹N‹F‹@‹IƒÁ‰L$‰$èLL‹F‹N‹I‹@ ‰AƒÄ^]Ãff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èÞJ‹G‰D$F‰$ÇD$èÄJ‹G‰D$ƒÆ‰4$ÇD$èªJƒÄ^_]Ãffff.„U‰åVƒì‹u‹F‰$ÇD$èJ‹F‰$ÇD$èlJ‹F‰$ÇD$èYJƒÄ^]ÃU‰åVƒì4èX‹ˆ‡ ‰MØÇEÜBÇEàˆ˜‰Mä€Ë!‰EèEì‰D$‹u‰4$è+KEð‰D$‹E‰$èK‹E‰EôèG‹G‰D$ƒÆ‰4$ÇD$è$GƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$èÿF‹F‰$ÇD$èìFƒÄ^]ÃU‰åVƒì$èX‹ˆ‰MàÇEäBÇEèˆn‰M쀞‰EðŠEˆEøEô‰D$‹u‰4$è¸GèáF‹N$9Èu Eà‰$ÿUìëEà‰D$‰ $èºFƒÄ$^]ÃU‰åV‹U‹B·H‰ÎƒÎá÷ÿ€zfDÎf‰H^]ÄU‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$èFƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$èðEƒÄ]ÃU‰åSWVƒì<è[è%F‹M‹y$9øu ·Yƒãƒóë{ÇEàuà‰uäÇEèÇE싃‰EÀÇEÄBÇEȃ¢‰ẼÁ‰EЉuÔE؉D$‰ $è‹FEÀ‰D$‰<$èøE‹EäŠX‰4$ÇD$èFE¾ÃƒÄ<^_[]ÃU‰å‹M‹A‹I‹@·IƒáƒñˆH]ÃU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èîD‹G‰D$ƒÆ‰4$ÇD$èÔDƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$è¯D‹F‰$ÇD$èœDƒÄ^]ÃU‰åVƒì$èX‹ˆÊ‰MàÇEäBÇEèˆn‰M쀎‰EðŠEˆEøEô‰D$‹u‰4$èhEè‘D‹N$9Èu Eà‰$ÿUìëEà‰D$‰ $èjDƒÄ$^]ÃU‰åV‹U‹B·H‰ÎƒÎáþÿ€zfDÎf‰H^]ÄU‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$èÀCƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$è CƒÄ]ÃU‰åSWVƒì<è[èÕC‹M‹y$9øu·YÑëƒãƒóë{ÇEàuà‰uäÇEèÇE싃͉EÀÇEÄBÇEȃ¤‰Ẽ±‰EЉuÔE؉D$‰ $è9DEÀ‰D$‰<$è¦C‹EäŠX‰4$ÇD$èôB¾ÃƒÄ<^_[]ÃU‰å‹M‹A‹I‹@·IÑéƒáƒñˆH]Ãffff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èŽB‹G‰D$ƒÆ‰4$ÇD$ètBƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$èOB‹F‰$ÇD$èƒÄ]ÃU‰åSWVƒìLè^ÇEØ}؉}ÜÇEàÇE䆡ìÿÿ‰Eè†Ñìÿÿ‰EìÇEð‹† ÿ‰E¸ÇE¼BÇEÀ†Í‰EĆq‰Eȉ}ÌEЉD$‹]‰$èz?è£>‹K$9Èu E¸‰$ÿUÄëE¸‰D$‰ $èÐ>‹EÜ‹@‹Ž)/‰L$‰$èl?‰Æ‰<$ÇD$è >‰ðƒÄL^_[]ÃU‰åVƒìèY‹u‹F‹@h‹‰H.‰L$‰$è(?‹N‹IƒÁ‰L$‰$èã>ƒÄ^]ÃU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èŽ=‹G‰D$ƒÆ‰4$ÇD$èt=ƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$èO=‹F‰$ÇD$è<=ƒÄ^]ÃU‰åVƒì$èX‹ˆjý‰MàÇEäBÇEèˆz‰Mì€î‰EðEô‰D$‹u‰4$è>Eø‰D$‹E‰$èü=è%=‹N$9Èu Eà‰$ÿUìëEà‰D$‰ $èþ<ƒÄ$^]ÃU‰åWVƒìè_‹u‹F‹@h;Ft>‹ó,‰L$‰$èÒ=‹F‹÷,‰L$‰$è½=‹N‰L$‰$ÇD$hèp=ƒÄ^_]ÃU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è<‹G‰D$ƒÆ‰4$ÇD$è<ƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$èß;‹F‰$ÇD$èÌ;ƒÄ^]ÃU‰åƒìèX‹€ó0‹M‰L$·M‰L$ ‰D$‹E‰$ÇD$èÞ<¾ÀƒÄ]ÃU‰åSWVìŒè^ÇEàEà‰EäÇEèÇEìÆEðÇEÀ}À‰}ÄÇEÈÇĔIéÿÿ‰EІyéÿÿ‰EÔÇEØ‹žµû‰] ÇE¤BÇE¨†º‰E¬†Y‰E°‰}´E¸‰D$‹E‰$‰Çè<‰pÿÿÿÇ…tÿÿÿBÇ…xÿÿÿ†ÿ‰…|ÿÿÿ†Ù‰E€E„‰D$‰<$èÃ;Eà‰EˆEÀ‰EŒ‰ÃE‰D$‹E‰$è£;f‹Ef‰E˜E”‰D$E ‰$è‰;è²:‹O$‹}9Èu…pÿÿÿ‰$ÿ•|ÿÿÿë…pÿÿÿ‰D$‰ $èÓ:‹Eä€xu<‹EÄ‹@…ÿt ‹ŽÑ+‰L$‰$èb;‰|$‰$è&;닎Å+‰L$‰$èB;‹Eä¾p‰$ÇD$èÛ9Eà‰$ÇD$èÈ9‰ðÄŒ^_[]ÃU‰åSWVƒìè[‹E ‰$ÇD$ÇD$è;‰Æ‹}ƒþÿuK‹G‹‹é.“Õ‰T$‰L$‰$è¸:‹‹*‰L$‰$è¦:‹O‹IƒÁ‰L$‰$èa:é1‰4$ÇD$ÇD$èÌ9ƒøÿu‹G‹‹é.“åéÁÇEðEð‰D$ ‰4$ÇD$ÇD$ÇD$ÿÿè]:ƒøÿu‹G‹‹é.“õë}‹}‹ƒå+‰D$‰<$è:‰E싃é+‰D$‰<$èí9‰D$‹Eì‰D$‰4$è´8ƒøÿu‹}‹G‹‹é.“ë'‰4$ÇD$èW9ƒøÿ‹}uS‹G‹‹é.“‰T$‰L$‰$èŠ9‹‹*‰L$‰$èx9‹O‹IƒÁ‰L$‰$è39‰4$èG8¾ÿÿÿÿ‰ðƒÄ^_[]ÃU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èÎ7‹G‰D$ƒÆ‰4$ÇD$è´7ƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$è7‹F‰$ÇD$è|7ƒÄ^]ÃU‰åSWVìÌè[‹ƒá&‹‹©'‰L$‰$èœ8‹‹­'‰L$‰$èŠ8‰…Tÿÿÿ‹u‹FƒxuU‹F‹@Æ@‹F‹‹¥,“݉T$‰L$‰$èO8‹‹¹'‰L$‰$è=8‹N‹IƒÁ‰L$‰$èø7颃x u‹F‹@Æ@‹F‹‹¥,“íë£f‹HˆÊ€âˆ•Pÿÿÿ”Âf‰Ïfƒçt"„Òu‹F‹@Æ@‹F‹‹¥,“ýéfÿÿÿ‹‹©,‰L$‰$è³7„Àu‹F‹@Æ@‹F‹‹¥,“ é2ÿÿÿf‰½Lÿÿÿ‹F‹@D‹‹­,‰L$‰$èr7‹F‹@H‹‹­,‰L$‰$èZ7ÇEðÇEì‹F‹V ·~(‹‹±,‰|$‰T$Uì‰T$ Uð‰T$‰L$‰$è7‹Eð…Àu$ƒ}ìu‹F‹@Æ@‹F‹‹µ,“éþÿÿŠ•Pÿÿÿ„Òf‹½Lÿÿÿt$ƒ}ìu‹F‹@Æ@‹F‹‹µ,“-é[þÿÿ…À•Áf…ÿt"„Éu‹F‹@Æ@‹F‹‹µ,“=é/þÿÿ…À•Á„Ò”ÂÆ…Pÿÿÿf…ÿu ƒ}ì•…Pÿÿÿ Ê€úˆ•Lÿÿÿu3‹N$‰D$‰ $ÇD$ÿQ ‹N‰A‹Fƒxÿu‹F‹@Æ@鬀½PÿÿÿŠ…Lÿÿÿ…’<u;fƒ~(u4‹Eì‹‹)‰L$‰$èú5‰Ç‹F‹‹¹,‰L$‰$èã5fÁÀf‰G‹F$‹Mì‰L$‰$ÇD$ÿP ‹N‰A‹FƒxÿŠ…Lÿÿÿu&‹F‹@Æ@‹F‹@ƒøÿ„‰$èy4é<…æ‹N‹A‹I$‰L$ ‰D$‹ƒå÷‰$ÇD$è4‹N‰A(‹F‹x‹p(‹‹¥÷‰MȉLÿÿÿÇEÌBÇEЋW‰MÔ‹i‰M؉uÜMà‰L$‰$èÙ4‰}äEȉD$‰4$è14‹U‹B‹@(‹Lÿÿÿ‰M¨ÇE¬@ÇE°‹J‰M´‹‰M¸‰u¼‰Ö‰}ÀM¨‰L$‰$èâ3‹F‹@(‰E ‹E ‰$è°3€½Pÿÿÿ…‹N‹A‹I$‰L$ ‰D$‹ƒå÷‰$ÇD$èŽ3‹N‰A,‹F‹x‹p,‹‹¥÷‰M€‰PÿÿÿÇE„BÇEˆ‹v‰MŒ‹™‰M‰u”M˜‰L$‰$èæ3‰}œE€‰D$‰4$è>3‹U‹B‹@,‹Pÿÿÿ‰`ÿÿÿÇ…dÿÿÿ@Ç…hÿÿÿ‹j‰lÿÿÿ‹±‰pÿÿÿ‰µtÿÿÿ‰Ö‰½xÿÿÿ`ÿÿÿ‰L$‰$è×2‹F‹@,‰…Xÿÿÿ‹…Xÿÿÿ‰$èŸ2‹FfƒH‹ƒÑ(‰D$‹…Tÿÿÿ‰$èi3ÄÌ^_[]ÃU‰åSWVƒìè^‹†|!‹ŽD"‰L$‰$è73‹ŽH"‰uð‰L$‰$è"3‰Eì‹]‹C‰$è?2‰Ç¾‹C‹S‹Mð‹‰X'‰T$‰L$‰$èë2„Àt9þvrÖ‹Eð‹€l#‰D$‹Eì‰$èÈ2ƒÄ^_[]Ã@U‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$è@1ƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$è 1ƒÄ]ÃU‰åVƒì‹u‹F‰Eø‹Eø‰$è`1‹F‰$è11ƒÄ^]ÃU‰åSWVƒìè^‹†] ‹Ž%!‰L$‰$è2‹Ž)!‰uð‰L$‰$è2‰Eì‹]‹C‰$è 1‰Ç¾‹C‹S‹Mð‹‰9&‰T$‰L$‰$èÌ1„Àt9þvrÖ‹Eð‹€M"‰D$‹Eì‰$è©1ƒÄ^_[]ÃDU‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$è 0ƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$è0ƒÄ]ÃU‰åVƒì‹u‹F‰Eø‹Eø‰$è@0‹F‰$è0ƒÄ^]ÃU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èž/‹G‰D$F‰$ÇD$è„/‹G‰D$F‰$ÇD$èj/‹G ‰D$F ‰$ÇD$èP/‹G$‰D$ƒÆ$‰4$ÇD$è6/ƒÄ^_]Ãf„U‰åVƒì‹u‹F‰$ÇD$è/‹F‰$ÇD$èü.‹F‰$ÇD$èé.‹F ‰$ÇD$èÖ.‹F$‰$ÇD$èÃ.ƒÄ^]ÃU‰åSWVìŒè[‹E‹M9AuVÇEÜM܉L$}à‰|$‰$è§.‰Æ0Ƀþÿ„\‹ƒ¨‹‹$‹U܉T$ ‰|$‰L$‰$è£/‰EŒÆE‹ëTÇE¼M¼‰L$}À‰|$‰$èQ.‰Æ0Ƀþÿ„‹ƒ¨‹‹$‹U¼‰T$ ‰|$‰L$‰$èM/‰EŒÆE‹‰4$ÇD$ÇD$è†.0Ƀøÿ„¹ÇE¸E¸‰D$ ‰4$ÇD$ÇD$"ÇD$ÿÿè%/‹E‹@ ±…À‰E„t|‹}‹G‹‹ìî‰MÇE”BÇE˜‹ ‰Mœ‹P‰M M¤‰L$‰$èx.E¨‰D$‹EŒ‰$èf.E¬‰D$‰<$èW.ŠE‹ˆE´‰u°E‰D$‹E„‰$èd-±¶ÁÄŒ^_[]ÃU‰åSWVƒìLè^‹†z‹ŽB‰L$‰$è5.‹ŽF‰L$‰$è#.‰EÄ‹}‹G‹Ž~‹–^"‰T$‰L$‰$èþ-„Àu ÇEÌë&‹G‹O‹_‹–^"‰\$ ‰L$‰T$‰$èÎ-‰EÌ‹†â‹ŽB‰L$‰$è³-‰EÈ‹W‹J‹Z ‹–""‰ø‹}̉|$‰Ç‰\$ ‰L$‰T$‹Eȉ$è-‰Ã‹G €$t‰Cë‰CfÇC‹C$‰EÈ‹†>í‰EØÇEÜBÇEà†Ç‰E䆂‰EèEì‰D$‰$èø,‹G ‰EðE؉D$‹Eȉ$è,‹G‹Ž~‹–f"‰T$‰L$‰$èñ,„Àt ‹G‹W‹Žf"‰\$ ‰T$‰L$‰$èÍ,ƒ}Ìt‹ẺEЋEЉ$èÆ+‹†N‰D$‰$è¤,‹†j‰D$‹Eĉ$è,ƒÄL^_[]ÃU‰åWVƒìè_‹‡¦‹n‰L$‰$èa,‹r‰L$‰$èO,‰Æ‹M‹A‹Q‹Ž ‰T$‰L$‰$è.,‹‡–‰D$‰4$è,ƒÄ^_]Ãf„U‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$è*ƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$èp*ƒÄ]Ãffffff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è.*‹G‰D$F‰$ÇD$è*‹G‰D$ƒÆ‰4$ÇD$èú)ƒÄ^_]Ãffff.„U‰åVƒì‹u‹F‰$ÇD$èÏ)‹F‰$ÇD$è¼)‹F‰$ÇD$è©)ƒÄ^]ÃU‰åSWVƒì,è[‹u‹}ƒu90À…ö„÷‹ƒÕ‹}ô‰L$‰D$‰<$è²*‰t$‰$èv*0Àéȃ u0À…ö„¸‹ƒÕ‹ôë¿‹ƒÙ‰D$‰<$èo*„Àu0À…ö„Š‹ƒÕ‹ôë‘f‹wf‰ðfƒàf‰Eê”Àfƒæt"„Àu0À‹u…ö„S‹ƒÕ‹-ôéWÿÿÿ‹E…À„ ÇEðÇEì‹‹á‰D$Eì‰D$ Eð‰D$‰L$‰<$ÇD$èÔ)‹Eð…Àu$ƒ}ìu0À‹u…ö„㋃å‹Môéçþÿÿfƒ}êt$ƒ}ìu0À‹u…ö„¸‹ƒå‹]ôé¼þÿÿ…À•Áf…öt"„Éu0À‹u…ö„Œ‹ƒå‹môéþÿÿ‹‹é‰L$‰$è@)‰|$‰$ÇD$èö(‹Eì‹‹é‰L$‰$è)‰|$‰$ÇD$ èÍ(‹GD‹‹Ý‰L$‰$èî(‹GH‹‹Ý‰L$‰$èÙ(°¶ÀƒÄ,^_[]ÃU‰åƒì(èX‹€ù‹M‰L$·M‰L$ ‹M‰L$‰D$‹E‰$ÇD$ð¿ÇD$è…(¾ÀƒÄ(]ÃU‰åƒì(èX‹€Ž‹M ‰L$òEòD$·M‰L$ ‹M‰L$‰D$‹E‰$ÇD$è3(¾ÀƒÄ(]ÃU‰åSWVƒì|è^ÇEàMà‰MäÇEèÇEìÆEðÇEÀ]À‰]ÄÇEÈÇĔ¡Ôÿÿ‰EІÑÔÿÿ‰EÔÇEØ‹† ç‰EˆÇEŒBÇE†m‰E”†±‰E˜‰M¨E¬‰D$‹}‰<$è['E°‰D$‹E‰$èI'‰]´E¸‰D$‹E‰$è4'f‹Ef‰E¼òEòE èK&‹O$‹}$9Èu Eˆ‰$ÿU”ëEˆ‰D$‰ $èu&‹Eä€xu<‹EÄ‹@…ÿt ‹Ž)‰L$‰$è'‰|$‰$èÈ&닎‰L$‰$èä&‹Eä¾p‰$ÇD$è}%Eà‰$ÇD$èj%‰ðƒÄ|^_[]ÃU‰åSWVƒìLè^‹†Î‹Ž–‰L$‰$è‰&‹Žš‰L$‰$èw&‰EÌ‹}‹G$‹O(‹W,‹Z‹–ă\$ ‰L$‰T$‰$èH&‹O ‹IˆA‹G ‹@€xu‹G,‹@‹@‹Ž¦éÏ‹G$fƒH‹O$‹G0‹I‰MÄ‹Žî‰L$‰$èù%‹Ž®‰L$‰$èç%‰ÃÇD$Ç$èÕ$‰EÈ‹†’å‰EÐÇEÔBÇE؆{‰E܆ÿ‰Eà‹G$Mä‰L$‰$èc%‹EĉEèEì‰D$‰$èN%f‹G4f‰EðEЉD$‹Eȉ$è\$‹G$òG‹ŽÊòD$‰L$‰$èD%‹†¾‰D$‹Ẻ$è/%ƒÄL^_[]ÃU‰åSWVƒìè_‹‡E‹ ‰L$‰$è%‹‰L$‰$èî$‰Eð‹U‹B‹J‹Z·r ‹—=‰t$‰\$ ‰L$‰T$‰$è½$‹‡5‰D$‹Eð‰$è¨$ƒÄ^_[]Ã@U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è#‹G‰D$ƒÆ‰4$ÇD$è#ƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$èß"‹F‰$ÇD$èÌ"ƒÄ^]Ãf.„U‰åWVƒì‹} ‹G ‰D$‹uF ‰$ÇD$èŽ"‹G$‰D$F$‰$ÇD$èt"‹G(‰D$F(‰$ÇD$èZ"‹G,‰D$F,‰$ÇD$è@"‹G0‰D$ƒÆ0‰4$ÇD$è&"ƒÄ^_]Ãf„U‰åVƒì‹u‹F ‰$ÇD$èÿ!‹F$‰$ÇD$èì!‹F(‰$ÇD$èÙ!‹F,‰$ÇD$èÆ!‹F0‰$ÇD$è³!ƒÄ^]ÃU‰åƒì(èX‹€‹M‰L$‹M‰L$‰D$‹E‰$ÇD$ð¿ÇD$ÇD$ è¶"¾ÀƒÄ(]ÃU‰åƒì(èX‹€Ï‹M‰L$òEòD$‹M‰L$‰D$‹E‰$ÇD$ èl"¾ÀƒÄ(]ÃU‰åSWVƒì|è^ÇEà]à‰]äÇEèÇEìÆEðÇEÀ}À‰}ÄÇEÈÇĔÚÎÿÿ‰EІ Ïÿÿ‰EÔÇEØ‹†Fá‰EˆÇEŒBÇE†e‰E”† û‰E˜E¨‰D$‹E‰$è—!‰}¬E°‰D$‹}‰<$è‚!‰]´E¸‰D$‹E‰$èm!òEòE èŒ ‹O$‹} 9Èu Eˆ‰$ÿU”ëEˆ‰D$‰ $è¶ ‹Eä€xu<‹EÄ‹@…ÿt ‹Žb‰L$‰$èE!‰|$‰$è !닎V‰L$‰$è%!‹Eä¾pEÀ‰$ÇD$軉$ÇD$諉ðƒÄ|^_[]ÃU‰åSWVƒì,è_‹‡‹×‰L$‰$èÊ ‹Û‰L$‰$è¸ ‰Ã‹E‹@ ‹Ï‰L$‰$èž 1öƒø‰òr{‹E‹@ ‹Ë‰L$‰$è} Š@<t31ö<‰òuT‹E‹@ ‹Ï‰L$‰$èV 1öƒø‰òu3‹E‹p 1Òë)‹E‹@ ‹Ï‰L$‰$è+ 1öƒø‰òu‹E‹P 1ö‹E‹@(‰ñ ÑuX‹ã—«ê‰T$‰L$‰$èò‹ç‰L$‰$èà‹M‹I$‹IƒÁ‰L$‰$蘋‡ÿ‰D$‰$é§·HöÁt…öt‹ã—»êë™öÁt…Òt‹ã—Ëê낉]ð‰Uè‹]‹K$‹S0‰Uì‹I‹—ƒÁ‰L$ ‹Mì‰L$‰T$‰$èO‹K,‹IˆA‹C,‹@€xu8‹C$‹@‹@‹ç‰L$‰$苇ÿ‰D$‹Eð‰$è ƒÄ,^_[]ËK$‹C(‹Q‹ƒÂ‰T$‹Uè‰T$ ‰t$‰L$‰$èÕ„Àu‹E‹@$ë’‹M‹A(fƒH‹A(òA‹ òD$ézÿÿÿf„U‰åWVƒì‹} ‹G ‰D$‹uF ‰$ÇD$è‹G$‰D$F$‰$ÇD$è‹G(‰D$F(‰$ÇD$èê‹G,‰D$F,‰$ÇD$èЋG0‰D$ƒÆ0‰4$ÇD$趃Ä^_]Ãf„U‰åVƒì‹u‹F ‰$ÇD$è‹F$‰$ÇD$è|‹F(‰$ÇD$èi‹F,‰$ÇD$èV‹F0‰$ÇD$èCƒÄ^]ÃU‰åSWVìÌè[‹ƒ ‹4å‰L$‰D$‹}‰<$·uèX‹M‰<ÿÿÿ„Àu$‹ƒ ‹tç‰L$‰D$‰<$è/„À„NÆEàÆEáfÁÆf‰uâÇEäÇEìÇEèÆEÀÆEÁf‰uÂÇEÄ‹ƒœÜòòHòMÐòEÈÇEØ‹ƒ( ‹‹ˆUà‰T$‰L$‰$ÇD$ 訉…@ÿÿÿ‹ƒ( ‹‹ˆ‰DÿÿÿUÀ‰T$‰L$‰$ÇD$ èu‰Æ‹E‹x$‹Dÿÿÿ‹l܉…HÿÿÿÇ…LÿÿÿBÇ…PÿÿÿÖ‰…Tÿÿÿpö‰…Xÿÿÿ…\ÿÿÿ‰D$‹…<ÿÿÿ‰$èç‹E‰…`ÿÿÿ…dÿÿÿ‰D$‹…@ÿÿÿ‰$èÆ…hÿÿÿ‰D$‰4$è´…Hÿÿÿé‰Dÿÿÿ‹ƒ\ ‹‹Ä ·Ö‰T$ “„ç‰T$‰L$‰$誉ÆfïÀ)E¨)E˜ÇE ÇE¤‹ƒ°‰D$‰<$è|‰Ç‹ƒ°‰D$‰4$èhM”‰L$ M˜‰L$‰D$‰<$èÐ…À…Ø1ö‹}”…ÿ‰ó‰ð‰µ@ÿÿÿ„„…Ûu6ƒu0‹W‹O‹Dÿÿÿ‹ƒ( ‹›ˆ‰T$ ‰L$‰\$‰$èù‰Ãë:…öu61öƒu.‹W‹O‹µDÿÿÿ‹†( ‹¶ˆ‰T$ ‰L$‰t$‰$轉Ƌ…ÿu…‹E”‰@ÿÿÿ‰$è ‹…@ÿÿÿ ð…"þÿÿ‹…Dÿÿÿ‹€´‰D$‹E‰$ÇD$èr‰Ãë-‹Dÿÿÿ‹‰´‰D$‰L$‹E‰$èO‰Ã1öÇ…@ÿÿÿ‹E‹x$…Û„Æýÿÿ‹Dÿÿÿ‹l܉…pÿÿÿÇ…tÿÿÿBÇ…xÿÿÿȉ…|ÿÿÿPö‰E€E„‰D$‹E‰$è¶‹E‰EˆEŒ‰D$‰$è¡…pÿÿÿ‰D$‰<$è·ÄÌ^_[]ÃU‰åSWVƒìè_‹‡Ò‹š‰L$‰$苞‰L$‰$è{‰Æ‹U‹B‹J‹Z‹—â ‰\$ ‰L$‰T$‰$èS‹‡Â ‰D$‰4$èAƒÄ^_[]Ãffff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$讋G‰D$ƒÆ‰4$ÇD$蔃Ä^_]ÀU‰åVƒì‹u‹F‰$ÇD$èo‹F‰$ÇD$è\ƒÄ^]ÃU‰åSWVƒìè_‹‡Ä‹Œ‰L$‰$苉L$‰$èm‰Eð‹U‹B‹J‹Z‹r ‹—Ø ‰t$‰\$ ‰L$‰T$‰$è=‹‡´‰D$‹Eð‰$è(ƒÄ^_[]Ã@U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èž‹G‰D$F‰$ÇD$è„‹G ‰D$ƒÆ ‰4$ÇD$èjƒÄ^_]Ãffff.„U‰åVƒì‹u‹F‰$ÇD$è?‹F‰$ÇD$è,‹F ‰$ÇD$èƒÄ^]ÃU‰åSWVƒìè_‹u‹F;E…›‹E·VöÂt0…Àu,‹‡™ má‰L$‰D$‰4$è‹- ‰D$‰L$ëW‹MöÂt…Éu‹‡™ }áëÆÇEð‹—… ]ð‰\$‰D$ ‰L$‰T$‰4$èÇ„Àu‹‡- ‹Mð‰L$‰D$‰4$誃Ä^_[]ÃU‰åSWVƒì è_‹u‹F;Eu+‹]‹‡Ü ‰D$‰4$ès‹‡l ‰\$‰D$‰4$è]ƒÄ ^_[]ÃU‰åSWVƒìLè[‹E…À‰EÄ•À‹}ŠO€áÀé„Áuƒ}u(ÇD$ÇD$Ç$è?‰Æ‰ú‰rB ë,ÇD$ÇD$Ç$è‰Æ‰ú‰rB‹M‰Măþÿu<0À‹u…ö„y‹ƒ3 ‹ß‰L$‰D$‰$裉t$‰$èg0ÀéJ‹8…ÿ„º‹ƒ×‰D$‰$èt‹‹“ ‰|$‰L$‰$è^f…Àt.ÇEðEð‰D$ ‰4$ÇD$ÇD$ÇD$ÿÿè[‹ƒ/‰D$‰<$è‰EÀ‹ƒ3‰D$‰<$è‰D$‹EÀ‰D$‰4$èË…À‹Ut0À‹u…ö„—‹ƒ3 ‹Oßéÿÿÿ‹B‰EÀÇD$Ç$‰×è´‰E¼‹ƒ7Õ‰EÈÇEÌBÇEЃ ‰EÔƒ›ï‰E؉uÜEà‰D$‹Eĉ$è?Eä‰D$‰<$è0‹EÀ‰EèEȉD$‹E¼‰$è@°¶ÀƒÄL^_[]ÃU‰åSWVƒìLè[‹}‹G‰E´‹G‹‹‰L$‰$è‰Æ‹G‹‹‰L$‰$è÷‰D$‰t$‹E´‰$èÖ‹O…ÀuP‹q$‹ƒÓ‰EØÇEÜBÇEàƒ.‰EäƒAí‰EèEì‰D$‰ $èr‹G ‰EðE؉D$‰4$鋃“eÞ‰T$‰D$‰ $èq‰Æ‹G‹H$‰M´‹‹Ó‰M¸ÇE¼BÇEÀ‹ò‰MÄ‹aí‰MÈM̉L$‰$èþ‹G ‰EÐEÔ‰D$‰4$èéE¸‰D$‹E´‰$èÿƒÄL^_[]ÃU‰åWVƒìè_‹‡‹æ‰L$‰$èÙ‹ê‰L$‰$èljƋM‹A‹Q‹B‰T$‰L$‰$見‡‰D$‰4$蔃Ä^_]ÃU‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$èƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$èðƒÄ]ÃU‰åSWVƒìè_‹‡Y‹!‰L$‰$è‹%‰L$‰$è‰Æ‹U‹B‹J‹Z‹—‰\$ ‰L$‰T$‰$èÚ‹‡I‰D$‰4$èȃÄ^_[]Ã@U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è>‹G‰D$ƒÆ‰4$ÇD$è$ƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$èÿ‹F‰$ÇD$èìƒÄ^]Ãf.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$讋G‰D$ƒÆ‰4$ÇD$蔃Ä^_]ÀU‰åVƒì‹u‹F‰$ÇD$èo‹F‰$ÇD$è\ƒÄ^]ÃU‰åSWVƒìLè^‹]‹C;E… €K‹†à‰D$‰$èr‹†ð‰D$‰$è`‰EÄ‹†ô‰D$‰$èKf‰Eʃ{ „™‹C‹ŽÈÿ‹–ø‰T$‰L$‰$è„Àtv‹C‹{ ‹ŽˆÏ‰MÐÇEÔBÇEØŽ¸‰MÜŽ ê‰MàMä‰L$‰$è¬Eè‰D$‰$èEì‰D$‹Eĉ$è‹f‹EÊf‰EðEЉD$‰<$蜋{ƒÿÿu‹{‰<$ÇD$ÇD$èÙƒøÿu,‹†ÜŽ€Ù‰L$‰D$‰$è`‹Žp‰D$‰L$ë`ÇEÌẺD$ ‰<$ÇD$ÇD$"ÇD$ÿÿèR‹†¬‰|$‰D$‰$è ‹†ü‰D$‰$èú‹†‰D$‰$èèƒÄL^_[]ÃU‰åSWVƒìè_‹‡þü‹Æý‰L$‰$蹋Êý‰L$‰$觉Eð‹U‹B‹J‹Z·r ‹—2‰t$‰\$ ‰L$‰T$‰$èv‹‡îþ‰D$‹Eð‰$èaƒÄ^_[]Ãffff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èÎ ‹G‰D$F‰$ÇD$è´ ‹G‰D$ƒÆ‰4$ÇD$èš ƒÄ^_]Ãffff.„U‰åVƒì‹u‹F‰$ÇD$èo ‹F‰$ÇD$è\ ‹F‰$ÇD$èI ƒÄ^]ÃU‰åSWVƒì è_‹u‹F;Eu+‹]‹‡Í‰D$‰4$èd ‹‡]‰\$‰D$‰4$èN ƒÄ ^_[]ÃU‰åSWVƒì\è[òMfïÀf.È‚(‹M‹A$‰Ï‰D$ ‹ƒd̉$ÇD$ÇD$è" ‰Æ‰ù‰q0‹ƒ(̉E؉E´ÇEÜBÇEàƒD‰EäƒÌæ‰EèEì‰D$‰ $‰Ïè† E؉D$‰4$èá ‹G0‹M´‰MÀÇEÄ@ÇEÈ‹ ‰MÌ‹äæ‰MЉEÔMÀ‰L$‰$è  ò,EiÀÊš;‰D$Áø‰D$ ÇD$Ç$è” ‰þ‹N0‰T$‰D$‰ $ÇD$ÇD$ÇD$ÿÿÿÿÇD$ ÿÿÿÿèM ‹F0‰E¸‹E¸‰$è ƒÄ\^_[]ÃU‰åWVƒìè_‹‡ú‹Ûú‰L$‰$èÎ ‹ßú‰L$‰$è¼ ‰Æ‹E‹@‹S‰L$‰$è¢ ‹‡ü‰D$‰4$è ƒÄ^_]Ãffff.„U‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$è ƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$èà ƒÄ]ÃU‰åƒì‹E‹@‰Eø‹Eø‰$è! ƒÄ]ÃU‰åSWVƒì è_‹u‹F0…Àt‰$è ÇF0ÿF‹F…Àt+^‹þù‰L$‰$)óèà ‰\$‰t$Ç$èy ‹F …Àt+^ ‹þù‰L$‰$)óè‘ ‰\$‰t$Ç$èG ƒÄ ^_[]ÃU‰åWVƒìè_‹‡°þ‰D$‹u‰4$èR ‹‡Øþ‰D$‰4$è@ ‹@þ‰D$‰L$‰4$è* ƒÄ^_]ÃU‰åSWVƒì<è_‹‡]þ‰D$‹u‰4$èÿ ƒ~Lt‹‡‰þ‰D$‰4$èç ƒ~Pt‹‡þ‰D$‰4$èÏ ‹FD‹ þ‰L$‰$èº ‹FH‹ þ‰L$‰$è¥ ‹FX‹‘þ‰L$‰$ÇD$èˆ ‹F`‹‘þ‰L$‰$ÇD$èk ‹F\…Àt‰$è ÇF\‹F(…Àt‰$èhÇF(‹F,…Àt‰$èRÇF,‹F4…Àt!‰$è<‹‡•þ‰D$‰4$è ÇF4‹F8…Àt!‰$苇™þ‰D$‰4$èàÇF8ÇFÿÿÿÿÇFÿÿÿÿ·FÇFTfÇF¨„›ƒ~ „‘‹F‹Eù‹—þ‰T$‰L$‰$艄Àtn‹F‹^ ‹É‰MÐÇEÔBÇE؉MÜÙã‰MàMä‰L$‰$èEè‰D$‰4$èEì‰D$‹E‰$èöEЉD$‰$èƒÄ<^_[]ÃU‰åSWVƒìè_‹‡-ö‹õö‰L$‰$èè‹ùö‰L$‰$è։ƋU‹B‹J‹Z‹—‰ü‰\$ ‰L$‰T$‰$讋‡ø‰D$‰4$蜃Ä^_[]ÄU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è‹G‰D$F‰$ÇD$èô‹G‰D$ƒÆ‰4$ÇD$èÚƒÄ^_]Ãffff.„U‰åVƒì‹u‹F‰$ÇD$诋F‰$ÇD$蜋F‰$ÇD$艃Ä^]ÃU‰åVƒì$èX‹ˆ·Å‰MàÇEäBÇEèˆh‰M쀫à‰EðEô‰D$‹u‰4$è[è„‹N$9Èu Eà‰$ÿUìëEà‰D$‰ $豃Ä$^]ÃU‰åWVƒìè_‹‡~ô‹Fõ‰L$‰$è9‹Jõ‰L$‰$è'‰Æ‹E‹@ö@t‹*ú‰L$‰$ÇD$èÿ‹‡nö‰D$‰4$èíƒÄ^_]Ãf.„U‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$è`ƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$è@ƒÄ]ÃU‰åVƒì$èY‹E‹p$‹‘oĉUàÇEäBÇEè‘T‰U쉃߉MðMô‰L$‰$èEà‰D$‰4$è)ƒÄ$^]ÃU‰åWVƒìè_‹‡Jó‹ô‰L$‰$è‹ô‰L$‰$è󉯋E‹H·QöÂtƒÊ$f‰Q‹@‹ªù‰L$‰$èÆ‹‡:õ‰D$‰4$è´ƒÄ^_]ÃU‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$è0ƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$èƒÄ]ÃU‰åVƒì$èY‹E‹p$‹‘?ÉUàÇEäBÇEè‘T‰Uì‰sÞ‰MðMô‰L$‰$èàEà‰D$‰4$èùƒÄ$^]ÃU‰åWVƒìè_‹‡ò‹âò‰L$‰$èÕ‹æò‰L$‰$èÉƋE‹H·QöÂtƒÊDf‰Q‹@‹zø‰L$‰$è–‹‡ ô‰D$‰4$脃Ä^_]ÃU‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$èƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$èàƒÄ]ÃU‰åVƒì$èY‹E‹p$‹‘‰UàÇEäBÇEè‘T‰Uì‰c݉MðMô‰L$‰$è°Eà‰D$‰4$èɃÄ$^]ÃU‰åWVƒìè_‹‡êð‹²ñ‰L$‰$襋¶ñ‰L$‰$蓉ƋE‹H·QöÂtƒÊdf‰Q‹@‹J÷‰L$‰$èf‹‡Úò‰D$‰4$èTƒÄ^_]ÃU‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$èЃÄ]ÃDU‰åƒì‹E‹@‰$ÇD$è°ƒÄ]ÃU‰åWVƒìè_‹u·F¨ t'‹FD‹Šñ‰L$‰$èÍ…ÀuKƒ~LuEöF@uë#¨@t9‹FH‹Šñ‰L$‰$袅Àu ƒ~Pu‹‡Æõ‰D$‰4$ÇD$è~ƒÄ^_]ÃU‰åVƒìè^‹†‹ï‹Ž+õ‹–¯À‹‰T$ ‹U‰T$‰L$‰$è?‹Žð‹–/õ‰D$†Ê‰D$‰T$‰ $ÇD$ èƒÄ^]ÃU‰åVƒìè^‹†ï‹Ž¿ô‹–CÀ‹‰T$ ‹U‰T$‰L$‰$èÓ‹Ž§ï‹–Ãô‰D$†§É‰D$‰T$‰ $ÇD$ 襃Ä^]ÃU‰åSWVƒìè^‹žqî‹}‰<$èûÿ‹Ž!õ‰D$‰L$‰$ÇD$ èa‹Ž±î‹–Qô‹žÕ¿‹‰\$ ‰D$‰T$‰ $è9‹Ž9ï‹–Uô‰D$‰|$ †ÙʉD$‰T$‰ $èƒÄ^_[]ÃU‰åSWVƒìè_‹·Ùíè£þ‹‰$è%‹ô‰D$‰L$‰4$èÍÿ‹î‹—eò‹·9¿‹6‰t$‹u‰t$‹·=¿‹6‰t$ ‰D$‰T$‰ $ÇD$èŠÿ‰Æ‹Ÿ¡îè3þ‹‹‡½ó‰t$‰L$ ‹1¿‹ ‰L$‰D$‰$èUÿƒÄ^_[]ÃU‰åSWVƒìè_‹·íèéý‹‰$èkÿ‹Óó‰D$‰L$‰4$èÿ‹_í‹—ÿò‹·ƒ¾‹6‰t$ ‰D$‰T$‰ $èëþ‰Æ‹Ÿçíè”ý‹‹‡ó‰t$‰L$ ‹w¾‹ ‰L$‰D$‰$è¶þƒÄ^_[]ÃU‰åVƒìè^‹†Â싎bò‹–Þ½‹‰T$ –úȉT$‰L$‰$èsþ‹ŽJí‹–fò‰D$‹E‰D$ † ɉD$‰T$‰ $èFþƒÄ^]ÃU‰åWVƒì è^‹†O싎ÿí‰L$‰$èþ‹ŽËò–ËȉT$–»È‰T$ –«È‰T$‰L$‰$èêý‹ŽSì‹–óñ‹¾w½‹?‰|$ ‰D$‰T$‰ $èÂý‹ŽÛì‹–÷ñ‰D$†ÛƉD$‰T$‰ $ÇD$ è”ýƒÄ ^_]ÃU‰åWVƒì è^‹†œë‹ŽLí‰L$‰$ègý‹Žò–ȉT$–8ȉT$ –(ȉT$‰L$‰$è7ý‹Ž ë‹–@ñ‹¾Ä¼‹?‰|$ ‰D$‰T$‰ $èý‹Ž(ì‹–Dñ‰D$†(ƉD$‰T$‰ $ÇD$ èáüƒÄ ^_]ÃU‰åWVƒì è^‹†éꋎ™ì‰L$‰$è´ü‹Žeñ–eljT$–¥Ç‰T$ –•ljT$‰L$‰$è„ü‹Žíê‹–ð‹¾¼‹?‰|$ ‰D$‰T$‰ $è\ü‹Žuë‹–‘ð‰D$†uʼnD$‰T$‰ $ÇD$ è.üƒÄ ^_]ÃU‰åWVƒì è^‹†6ꋎæë‰L$‰$èü‹Ž²ð–²Æ‰T$–ljT$ –ljT$‰L$‰$èÑû‹Ž:ê‹–Ú^»‹?‰|$ ‰D$‰T$‰ $è©û‹ŽÂê‹–Þï‰D$†ÂĉD$‰T$‰ $ÇD$ è{ûƒÄ ^_]ÃU‰åWVƒì è^‹†ƒé‹Ž3ë‰L$‰$èNû‹Žÿï–ÿʼnT$–ƉT$ –oƉT$‰L$‰$èû‹Ž‡é‹–'«º‹?‰|$ ‰D$‰T$‰ $èöú‹Žê‹–+ï‰D$†Ä‰D$‰T$‰ $ÇD$ èÈúƒÄ ^_]ÃU‰åVƒìè^‹†Õ苎uî‹–ù¹‹‰T$ ‹U‰T$‰L$‰$è‰ú‹Ž]é‹–yî‰D$†]ÉD$‰T$‰ $ÇD$ è[úƒÄ^]ÃU‰åWVƒì@èXÇEà}à‰}äÇEèÇEìÆEð‹ˆ8¹‰MÀÇEÄBÇEȈ¤‰MÌ€¬Ô‰EЉ}ÔE؉D$‹u‰4$èºùèãø‹N$9Èu EÀ‰$ÿUÌëEÀ‰D$‰ $èù‹Eä¾p‰<$ÇD$è]ø‰ðƒÄ@^_]ÃU‰å‹M‹A‹I‹@·IƒáƒñˆH]Ãf.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èþ÷‹G‰D$ƒÆ‰4$ÇD$èä÷ƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$è¿÷‹F‰$ÇD$è¬÷ƒÄ^]ÃU‰åWVƒì@èXÇEà}à‰}äÇEèÇEìÆEð‹ˆÙ·‰MÀÇEÄBÇEȈ¤‰MÌ€mÓ‰EЉ}ÔE؉D$‹u‰4$è[øè„÷‹N$9Èu EÀ‰$ÿUÌëEÀ‰D$‰ $è±÷‹Eä¾p‰<$ÇD$èþö‰ðƒÄ@^_]ÃU‰å‹M‹A‹I‹@ŠIÐé€áˆH]Ãffff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èžö‹G‰D$ƒÆ‰4$ÇD$è„öƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$è_ö‹F‰$ÇD$èLöƒÄ^]ÃU‰åSWVƒìLè_è€ö‹M‹q$9ðu;‹Aƒøÿt‹—$ì‰D$‰T$‰ $èZ÷‰Æé¾‹A1öƒøÿ„°‹—(ìëÓÇEØ]؉]ÜÇEàÇEä‡ ¤ÿÿ‰Eè‡<¤ÿÿ‰EìÇEð‹‡x¶‰E¸ÇE¼BÇEÀ‡ý‰Eć,Ò‰EÈẺD$‰ $è¡ö‰]ÐE¸‰D$‰4$è ö‹EÜ‹@‹”æ‰L$‰$è§ö‰Æ‰$ÇD$èEõ‰ðƒÄL^_[]ÃU‰åSWVƒì è_‹‡©ä‹qå‰L$‰$èdö‹uå‰L$‰$èRö‰Æ‹]‹C‹Hƒùÿt‹—ëë‹Hƒùÿt=‹—ë‰L$‰T$‰$èö‹å‰L$‰$è ö‹K‹IƒÁ‰L$‰$èÅõ‹‡™æ‰D$‰4$èãõƒÄ ^_[]Ãffffff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èNô‹G‰D$ƒÆ‰4$ÇD$è4ôƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$èô‹F‰$ÇD$èüóƒÄ^]ÃU‰åSWVƒìLè_è0ô‹M‹q$9ðu<‹Aƒøÿt‹—Üé‰D$‰T$‰ $è õf‰Æé˜‹A1öƒøÿ„Š‹—àéëÒÇEà]à‰]äÇEèÇEìfÇEð‹‡(´‰EÀÇEÄBÇEȇىĖüωEÐEÔ‰D$‰ $ècô‰]ØEÀ‰D$‰4$èÍó‹Eäf‹p‰$ÇD$èó·ÆƒÄL^_[]ÃU‰åVƒìèY‹u‹F‹Pƒúÿt‹‰÷èë‹Pƒúÿt ‹‰ûè‰T$‰L$‰$èô‹N‹If‰AƒÄ^]ÃfU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èŽò‹G‰D$ƒÆ‰4$ÇD$ètòƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$èOò‹F‰$ÇD$è<òƒÄ^]ÃU‰åSWVƒìLè_èpò‹M‹q$9ðu;‹Aƒøÿt‹—$è‰D$‰T$‰ $èJó‰Æé¾‹A1öƒøÿ„°‹—(èëÓÇEØ]؉]ÜÇEàÇEä‡üŸÿÿ‰Eè‡, ÿÿ‰EìÇEð‹‡h²‰E¸ÇE¼BÇEÀ‡ý‰Eć\ΉEÈẺD$‰ $è‘ò‰]ÐE¸‰D$‰4$èûñ‹EÜ‹@‹„â‰L$‰$è—ò‰Æ‰$ÇD$è5ñ‰ðƒÄL^_[]ÃU‰åSWVƒì è_‹‡™à‹aá‰L$‰$èTò‹eá‰L$‰$èBò‰Æ‹]‹C‹Hƒùÿt‹—çë‹Hƒùÿt=‹—ç‰L$‰T$‰$è ò‹qá‰L$‰$èúñ‹K‹IƒÁ‰L$‰$èµñ‹‡‰â‰D$‰4$èÓñƒÄ ^_[]Ãffffff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è>ð‹G‰D$ƒÆ‰4$ÇD$è$ðƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$èÿï‹F‰$ÇD$èìïƒÄ^]ÃU‰åSWVƒìLè_è ð‹M‹q$9ðu<‹Aƒøÿt‹—Üå‰D$‰T$‰ $èúðf‰Æé˜‹A1öƒøÿ„Š‹—àåëÒÇEà]à‰]äÇEèÇEìfÇEð‹‡°‰EÀÇEÄBÇEȇىĖ,̉EÐEÔ‰D$‰ $èSð‰]ØEÀ‰D$‰4$è½ï‹Eäf‹p‰$ÇD$è ï·ÆƒÄL^_[]ÃU‰åVƒìèY‹u‹F‹Pƒúÿt‹‰÷äë‹Pƒúÿt ‹‰ûä‰T$‰L$‰$èð‹N‹If‰AƒÄ^]ÃfU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è~î‹G‰D$ƒÆ‰4$ÇD$èdîƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$è?î‹F‰$ÇD$è,îƒÄ^]ÃU‰åƒìèZ‹E‹Hƒùÿt‹’ä‰L$‰T$‰$èIïë1ÀƒÄ]ÃU‰åƒìèZ‹E‹Hƒùÿt‹’Õã‰L$‰T$‰$èïë1ÀƒÄ]ÃU‰åƒìèZ‹E‹Hƒùÿu1Àë‹’£ã‰L$‰T$‰$èÙî·ÀƒÄ]ÃU‰åƒìèZ‹E‹Hƒùÿu1Àë‹’nã‰L$‰T$‰$è î·ÀƒÄ]ÃU‰åƒìèZ‹E‹Hƒùÿt‹’9ã‰L$‰T$‰$èkîë1ÀƒÄ]ÃU‰åƒìèZ‹E‹Hƒùÿt‹’ã‰L$‰T$‰$è5îë1ÀƒÄ]ÃU‰åƒìèZ‹E‹Hƒùÿu1Àë‹’Õâ‰L$‰T$‰$èûí·ÀƒÄ]ÃU‰åƒìèZ‹E‹Hƒùÿu1Àë‹’ â‰L$‰T$‰$èÂí·ÀƒÄ]ÃU‰åWVƒì è^ÇEäEä‰D$}è‰|$‹E‰$èí…Ày1Àë+‹E‹Ž=݉L$‰$èo틎iâ‰|$‰L$‰$èYíƒÄ ^_]ÃU‰åWVƒì0è^ÇEÔEÔ‰D$}؉|$‹E‰$è²ì…Ày1Àë+‹E‹ŽÕ܉L$‰$è틎â‰|$‰L$‰$èñìƒÄ0^_]ÃU‰åWVƒì è^ÇEäEä‰D$}è‰|$‹E‰$èJì…Ày1Àë+‹E‹Žm܉L$‰$èŸì‹Ž¡á‰|$‰L$‰$è‰ì·ÀƒÄ ^_]ÃU‰åWVƒì0è^ÇEÔEÔ‰D$}؉|$‹E‰$èßë…Ày1Àë+‹E‹ŽÜ‰L$‰$è4싎:á‰|$‰L$‰$èì·ÀƒÄ0^_]ÃU‰åWVƒì è^ÇEäEä‰D$}è‰|$‹E‰$è€ë…Ày1Àë+‹E‹Ž—Û‰L$‰$èÉ닎Ãà‰|$‰L$‰$è³ëƒÄ ^_]ÃU‰åWVƒì0è^ÇEÔEÔ‰D$}؉|$‹E‰$èë…Ày1Àë+‹E‹Ž/Û‰L$‰$èa닎_à‰|$‰L$‰$èKëƒÄ0^_]ÃU‰åWVƒì è^ÇEäEä‰D$}è‰|$‹E‰$è°ê…Ày1Àë+‹E‹ŽÇÚ‰L$‰$èùꋎû߉|$‰L$‰$èãê·ÀƒÄ ^_]ÃU‰åWVƒì0è^ÇEÔEÔ‰D$}؉|$‹E‰$èEê…Ày1Àë+‹E‹Ž\Ú‰L$‰$èŽê‹Ž”߉|$‰L$‰$èxê·ÀƒÄ0^_]ÃU‰åSWVƒìLè^ÇEØ}؉}ÜÇEàÇEä†ä–ÿÿ‰E膗ÿÿ‰EìÇEð‹†P©‰E¸ÇE¼BÇEÀ†Í‰EÄʼnEÈẺD$‹]‰$èÀé‰}Ðèæè‹K$9Èu E¸‰$ÿUÄëE¸‰D$‰ $èé‹EÜ‹@‹ŽlÙ‰L$‰$è¯é‰Æ‰<$ÇD$èMè‰ðƒÄL^_[]ÃU‰åSWVƒìLè_‹u‹FƒxÿtnÇEÜ‹@M܉L$]à‰\$‰$èæè…ÀuJ‹‡1Ø‹y؉L$‰$è<é‹QÞ‹U܉T$ ‰\$‰L$‰$èé‹N‹IƒÁ‰L$‰$èÚè‹FƒxÿtnÇE¼‹@M¼‰L$]À‰\$‰$èoè…ÀuJ‹‡1Ø‹y؉L$‰$èÅè‹QÞ‹U¼‰T$ ‰\$‰L$‰$è¨è‹N‹IƒÁ‰L$‰$ècèƒÄL^_[]Ãffffff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èþæ‹G‰D$ƒÆ‰4$ÇD$èäæƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$è¿æ‹F‰$ÇD$è¬æƒÄ^]ÃU‰åSWVƒìLè^ÇEØ}؉}ÜÇEàÇEä†l”ÿÿ‰E膜”ÿÿ‰EìÇEð‹†Ø¦‰E¸ÇE¼BÇEÀ†Í‰EĆ,ÉEÈẺD$‹]‰$èHç‰}Ðènæ‹K$9Èu E¸‰$ÿUÄëE¸‰D$‰ $è›æ‹EÜ‹@‹ŽôÖ‰L$‰$è7ç‰Æ‰<$ÇD$èÕå‰ðƒÄL^_[]ÃU‰åSWVƒìLè_‹u‹FƒxÿtnÇEÜ‹@M܉L$]à‰\$‰$èzæ…ÀuJ‹‡¹Õ‹Ö‰L$‰$èÄæ‹ÙÛ‹U܉T$ ‰\$‰L$‰$è§æ‹N‹IƒÁ‰L$‰$èbæ‹FƒxÿtnÇE¼‹@M¼‰L$]À‰\$‰$èæ…ÀuJ‹‡¹Õ‹Ö‰L$‰$èMæ‹ÙÛ‹U¼‰T$ ‰\$‰L$‰$è0æ‹N‹IƒÁ‰L$‰$èëåƒÄL^_[]ÀU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èŽä‹G‰D$ƒÆ‰4$ÇD$ètäƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$èOä‹F‰$ÇD$è<äƒÄ^]ÃU‰åSWVƒì<è[èpä‹M‹y$9øu ƒyÿ•ÃëÇEàuà‰uäÇEèÇEìÆEð‹ƒh¤‰EÀÇEÄBÇEȃ£‰ẼÜÀ‰EЉuÔE؉D$‰ $èÕäEÀ‰D$‰<$èBä‹EäŠX‰4$ÇD$èã¾ÃƒÄ<^_[]ÃU‰å‹M‹A‹I‹@ƒyÿ•@]ÃU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è>ã‹G‰D$ƒÆ‰4$ÇD$è$ãƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$èÿâ‹F‰$ÇD$èìâƒÄ^]ÃU‰åSWVƒì<è[è ã‹M‹y$9øu ƒyÿ•ÃëÇEàuà‰uäÇEèÇEìÆEð‹ƒ£‰EÀÇEÄBÇEȃ£‰Ẽ¬¿‰EЉuÔE؉D$‰ $è…ãEÀ‰D$‰<$èòâ‹EäŠX‰4$ÇD$è@â¾ÃƒÄ<^_[]ÃU‰å‹M‹A‹I‹@ƒyÿ•@]ÃU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èîá‹G‰D$ƒÆ‰4$ÇD$èÔáƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$è¯á‹F‰$ÇD$èœáƒÄ^]ÃU‰åSWVì<è_‹ ¢‹‰Ìþÿÿ‰Eð‹‡AÖý­‰L$‰D$‹E‰$è¤â‰Á‹‡qÒ‰D$‰ $‰ÜþÿÿèŠâ1Û…Àt<‹‡uÒ‰D$‹…Üþÿÿ‰$ÇD$èdâ‰Æ‹‡ÁÓ‰D$‰4$1ÛèNâ…Àt‰ó·E‰…Øþÿÿ‹‡qÒ‰D$‹…Üþÿÿ‰$è&âƒørf‹…Øþÿÿf…Àu[‹‡uÒ‰D$‹…Üþÿÿ‰$ÇD$èöዠ׉L$‰$èäá‰$ÇD$ ÇD$èâHÿùþÿw‰…Øþÿÿ…Û…ÐWÀ)E˜ÆE˜ÆE™‹…ØþÿÿfÁÀf‰EšÇEœ)…xÿÿÿÇEÇEŒÇEˆÆ…xÿÿÿÆ…yÿÿÿf‰…zÿÿÿ‹‡ù¡òòHòMˆòE€‹‡Ñ‹áÖU˜‰T$‰L$‰$ÇD$ èቅÐþÿÿ‹‡Ñ‹áÖ•xÿÿÿ‰T$‰L$‰$ÇD$ èîà‰…Üþÿÿéš‹‡eÓª‰L$‰D$‰$èÇà„Àu$‹‡eÓͬ‰L$‰D$‰$è§à„À„ÓWÀ)…hÿÿÿÆ…hÿÿÿÆ…iÿÿÿ‹…ØþÿÿfÁÀf‰…jÿÿÿÇ…lÿÿÿ)…HÿÿÿÇ…`ÿÿÿÇ…\ÿÿÿÇ…XÿÿÿÆ…HÿÿÿÆ…Iÿÿÿf‰…Jÿÿÿ‹‡õ¡òòHòXÿÿÿò…Pÿÿÿ‹‡Ñ‹áÖ•hÿÿÿ‰T$‰L$‰$ÇD$ èé߉…Ðþÿÿ‹‡Ñ‹áÖ•HÿÿÿéÆþÿÿ‹‡ ׉D$‰$èºß‰…Ôþÿÿ…Dÿÿÿ‰$è.ß1É…À‰ÜþÿÿÇ…Ðþÿÿ…C1À‹µDÿÿÿ…ö‰…Üþÿÿ‰…Ðþÿÿ„1À‰…ÐþÿÿÇ…Üþÿÿƒ½Ðþÿÿ… ‹^ €{…‹F‹Ôþÿÿ‰L$‰$èkß…Àu_òòKò8ÿÿÿò…0ÿÿÿ‹…ØþÿÿfÁÀf‰…2ÿÿÿ‹‡Ñ‹áÖ•0ÿÿÿ‰T$‰L$‰$ÇD$ è×Þ‰…ÐþÿÿékEà‰D$C‰D$ÇD$ Ç$èJÞ…À„A‹…Ôþÿÿ‰D$Eà‰$èÉÞ…À…$òòKò(ÿÿÿò… ÿÿÿ‹…ØþÿÿfÁÀf‰…"ÿÿÿ‹‡Ñ‹áÖ• ÿÿÿéUÿÿÿƒ½Üþÿÿ…Ö‹^ €{tÇ…Üþÿÿ龋F‹Ôþÿÿ‰L$‰$èFÞ…Àu%‹…ØþÿÿfÁÀf‰…ÿÿÿ‹‡Ñ‹áÖ•ÿÿÿëbE²‰D$ƒÃ‰\$ÇD$ .Ç$è_Ý…ÀtZ‹…Ôþÿÿ‰D$E²‰$èâÝ…ÀuA‹…ØþÿÿfÁÀf‰…âþÿÿ‹‡Ñ‹áÖ•àþÿÿ‰T$‰L$‰$ÇD$ èg݉…Üþÿÿ‹6…ö…ùýÿÿ‹…Dÿÿÿ‰$è¹Ü‹E…Àt‰D$‹…Ðþÿÿ‰$èÝ‹E…Àt‰D$‹…Üþÿÿ‰$èçÜ‹…Ìþÿÿ‹;Eðu Ä<^_[]ÃèÂÛU‰åSWVì¬è_‹u‹F$‰D$ ‹E‰D$‰Ã‹‡œ‰$ÇD$èçÛ‰F4‹F$‰D$ ‰\$‹‡œ‰$ÇD$èÃÛ‰F8‹F4‰…\ÿÿÿ‹‡Ù›‰E؉ÃÇEÜBÇEà‡‰E䇸‰EèEì‰D$‰4$è%ÜE؉D$‹…\ÿÿÿ‰$èzÛ‹F8‰…\ÿÿÿ‰]ÀÇEÄBÇEȇþ‰Ė­¸‰EÐEÔ‰D$‰4$èÕÛEÀ‰D$‹…\ÿÿÿ‰$è*ÛÇE¨E¨‰E¬‰ÂÇE°ÇE´ÇE¸‹F4‹N8‰\ÿÿÿ‰]ˆ‰XÿÿÿÇEŒBÇEΉM”͸‰M˜‰Eœ‰U ‹]‰]¤Mˆ‰L$‰$è°Ú‹F8‹Xÿÿÿ‰hÿÿÿÇ…lÿÿÿBÇ…pÿÿÿ^‰tÿÿÿí¸‰xÿÿÿ‹\ÿÿÿ‰|ÿÿÿ}¨‰}€‰]„hÿÿÿ‰L$‰$èNÚÇFT€fþ‹F4‰…`ÿÿÿ‹…`ÿÿÿ‰$èÚfN€‰<$ÇD$è’ÙĬ^_[]ÃU‰åSWVƒì è_‹‡õÈ‹½É‰L$‰$è°Ú‹ÁɉL$‰$èžÚ‰Eð‹]‹s‹F4‰$è¸Ù‰FT‹CƒxTt‹™Ïë‹Ï‰L$‰$èdÚ‹‡åʉD$‹Eð‰$èOÚƒÄ ^_[]Ãff.„U‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$èÀ؃Ä]ÃDU‰åƒì‹E‹@‰$ÇD$è ØƒÄ]ÃU‰åWVƒìè_‹‡ È‹ÒȉL$‰$èÅÙ‹ÖȉL$‰$è³Ù‰Æ‹E‹HfI€‹@‹¶Î‰L$‰$èÙ‹‡úɉD$‰4$è~ÙƒÄ^_]Ãff.„U‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$èð׃Ä]ÃDU‰åƒì‹E‹@‰$ÇD$èÐ׃Ä]ÃU‰åVƒì‹u‹F‰Eø‹Eø‰$èØ‹F‹H‹AH‰A…Àu ‹F‰$èÐ׃Ä^]ÃfU‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$è`׃Ä]ÃDU‰åƒì‹E‹@‰$ÇD$è@׃Ä]ÃU‰åVƒì‹u‹F‰Eø‹Eø‰$è€×‹F‹H‹AH‰A…Àu ‹F‰$è@׃Ä^]ÃfU‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$èÐÖƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$è°ÖƒÄ]ÃU‰å1À]ÃU‰åVƒì‹uöFu‹F4‰Eø‹Eø‰$è×€NƒÄ^]ÃU‰åVƒì‹uöFt‹F4‰Eø‹Eø‰$è¾Ö€fþƒÄ^]ÃU‰åVƒì‹uöFu‹F8‰Eø‹Eø‰$èÃÖ€NƒÄ^]ÃU‰åVƒì‹uöFt‹F8‰Eø‹Eø‰$èhÖ€fýƒÄ^]ÃU‰åƒì(èX‹€Ì‹M‰L$òEòD$‰D$‹E‰$ÇD$ÇD$ÇD$èýÖƒÄ(]ÃU‰åƒì(èX‹€ÉË‹M ‰L$‹M‰L$‹M‰L$òEòD$‰D$‹E‰$ÇD$è¯ÖƒÄ(]ÃU‰åSWVƒìLè_‹‡ˆÇ‰D$‹u‰4$è†Ö‹]9؂ˋ‡LŋʼnL$‰$ècÖ‹|Ë‹U$‰T$$òEòD$‹U ‰T$‰\$ ‰t$‰L$‰$ÇD$ ÇD$è ։ƋM‹Y$‹‡Œ•‰EØÇEÜBÇEà‡ô‰Eä‡À²‰EèEì‰D$‰ $è°ÕEð‰D$‰4$è¡ÕE؉D$‰$èºÔ‹‡œÅ‰D$‰4$è°ÕƒÄL^_[]ÃU‰åSWVƒì è_‹‡ÆÃ‹ŽÄ‰L$‰$èÕ‹’ĉL$‰$èoՉƋ]‹C·Hƒáfƒùu1‹@D‹S‹ ʼnT$‰L$‰$è>Õ‹C‹þɉL$‰$è)Õ‹‡¶Å‰D$‰4$èÕƒÄ ^_[]ÃU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èŽÓ‹G‰D$ƒÆ‰4$ÇD$ètÓƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$èOÓ‹F‰$ÇD$è<ÓƒÄ^]ÃU‰åƒì(èX‹€_É‹M‰L$òEòD$ ‹M‰L$‰D$‹E‰$ÇD$ÇD$è<ÔƒÄ(]ÃU‰åSWVƒìLè_ƒ}„ë‹u ‹]‹‡Å‰D$‰$èÔ9ð‚Ë‹‡Ù‹ÉL$‰$èæÓ‹ É‹U$‰T$$‹U‰T$òEòD$‰t$ ‰\$‰L$‰$ÇD$ ÇD$è£Ó‰Æ‹M‹Y$‹‡“‰EØÇEÜBÇEà‡þ‰Eä‡m°‰EèEì‰D$‰ $è3ÓEð‰D$‰4$è$ÓE؉D$‰$è=Ò‹‡)ÉD$‰4$è3ÓƒÄL^_[]ÃU‰åSWVƒì è_‹‡IÁ‹Â‰L$‰$èӋ‰L$‰$èò҉Ƌ]‹C·Hƒáfƒùu1‹@D‹S‹Â‰T$‰L$‰$èÁÒ‹C‹Ç‰L$‰$è¬Ò‹‡9ÉD$‰4$èšÒƒÄ ^_[]ÃfDU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èÑ‹G‰D$ƒÆ‰4$ÇD$èôЃÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$èÏЋF‰$ÇD$è¼ÐƒÄ^]ÃU‰åƒì(èX‹€ãÆ‹M‰L$ òEòD$ ‹M‰L$‰D$‹E‰$ÇD$ÇD$ÇD$è´ÑƒÄ(]ÃU‰åƒì(èX‹€ŒÆ‹M$‰L$ ‹M ‰L$‹M‰L$òEòD$ ‹M‰L$‰D$‹E‰$ÇD$è_уÄ(]ÃU‰åƒì(èX‹€7Æ‹M ‰L$ ‹M‰L$òEòD$ ‹M‰L$‰D$‹E‰$ÇD$ÇD$è уÄ(]ÃU‰åSWVƒìLè_‹]…Û„#‹‡âÁ‰D$‰$èØÐ…À„ ‹M‹‡âÁ‰D$‰ $è»Ð;E ‚ë‹u$…öt‹‡âÁ‰D$‰$è™Ð9ð‡Ê‹‡¦¿‹ê¿‰L$‰$èyЋÖÅ‹U(‰T$$‰\$ òEòD$‰t$‹U ‰T$ ‹U‰T$‰L$‰$ÇD$è7ЉƋM‹Y$‹‡æ‰EØÇEÜBÇEà‡7‰Eä‡Z­‰EèEì‰D$‰ $èÇÏEð‰D$‰4$è¸ÏE؉D$‰$èÑ΋‡ö¿‰D$‰4$èÇσÄL^_[]ÃU‰åSWVƒì è_‹‡Ý½‹¥¾‰L$‰$è˜Ï‹©¾‰L$‰$è†Ï‰Æ‹]‹C·Hƒáfƒùu1‹@D‹S‹!¿‰T$‰L$‰$èUÏ‹C‹Ä‰L$‰$è@Ï‹‡Í¿‰D$‰4$è.ÏƒÄ ^_[]Ãf.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èžÍ‹G‰D$ƒÆ‰4$ÇD$è„̓Ä^_]ÀU‰åVƒì‹u‹F‰$ÇD$è_Í‹F‰$ÇD$èL̓Ä^]ÃU‰åSWVƒìè_‹uƒ~L…ÓöF„É‹FD‹$¾‰L$‰$è[Î…À„Ü^L‹FD‹(¾‰L$‰$ÇD$è3΋Œ½‰L$‰$)óèΉ\$‰t$‰$èÙÍ‹FD‹tÉL$‰$ÇD$èòÍ‹^L‹‡<½‹¾‰L$‰$è×Í‹¾‰D$‰L$‰$èÁÍ„Àt€N‹‡xÉD$‰4$è§ÍƒÄ^_[]ËFLò@‹‡|ÃòD$‰D$‰4$èÍ‹‡XÃëÄ·F¨ tȨ@t‹FH‹$¾‰L$‰$èVÍ…Àu«ƒ~Pu¥‹‡`‰D$‰4$ÇD$ë‰U‰åSWVƒì\èX‰EÄ‹uƒ~LtöFt<‹EÄ‹€Â‰D$‰4$èÿÌ„À…" ƒ~T„ ‹EÄ‹€#‰D$‰4$éþ‰ñ‹qT‹A`‰Ï‹MÄ‹‰¾‰L$‰$è¹Ìð‰Æu ‹GX‹MÄ‹‰¾‰L$‰$è›Ì…À„·GöÄt>öÄt‹EÄ‹€'Âé–‹EÄ‹€Â‰D$‰<$èbÌ„À……‹EÄ‹€#Âék‰u¸ÆEó‹GX‹MÄ‹‰¾‰L$‰$è-̉Â1Û…Ò‰]ÀÇE´„Z‹GLƒx t‰UÀ‹WX‹MÄ‹‰+Â]ó‰\$ ‰T$ë‹MÄ‹‰/‰T$‰UÀ‰L$‰$èÖˉ‹GL‹uÄ‹Ž3‰ó‰Ö‰t$‰L$‰$è´Ë‹GL‹@‹‹÷À‰L$‰$èœË‰E¼‹OL‹GX‹Y Y‹MÄ‹‰¾‰L$‰$èxˉt$‰D$]¼‰$èË‹GX‹MÄ‹‰7‰t$ ‰L$‰$ÇD$ÇD$ÇD$è1Ë‹GLp ‹]À)ó‰u´‹GL‹H…Ét9H ”EóÇEÀëLÇEÀƒx t?ÇEÀ€}óu2‹HÇEÀ…Ét$ÇEÀ9H r‹EÄ‹€;‰D$‰<$èÀʉEÀ0ÒŠEó„À‹u¸tˆU¸éªƒ}Àuò0Ò…öu ˆU¸ŠEó铯Eò‹EÄ‹€Â‰D$‰<$èyÊ‹OL„Àt!‹EÄ‹€?ÂUò‰T$ ‰D$‰ $ÇD$€ë,ƒy t‹EÄ‹€CÂUò‰T$ ë ‹EÄ‹€/‰t$‰D$‰ $è ʉƀ}òt<9Þv‹GX‹MÄ‹‰£Á‰t$‰L$‰$èøÉ‹GX‹MÄ‹‰÷À‰L$‰$èàɉÃëF‰û‹CL‹}Ä‹3‰t$‰L$‰$è¾É‹CL‹@‹÷À‰}ĉL$‰$è£É‹KL‰ß‹Y YÃÇEìöG „Š‹G\Mì‰L$ ‰t$‰\$‰$èÁÇ0Ò…ÀuˆU¸é+ÇEì±=µÙÿÿt‹MÄ‹‰G‰D$‰L$‰<$è4ɉEÀ0ɈM¸0Ò€}ò„î‹GX‹MÄ‹‰£Á‰L$‰$ÇD$èÉéÇ‹Gƒøÿu‹G‰t$‰\$‰$è É…ÀyBèDZƒ8#t'‹UÄ‹‚ÁŠ_˜‰UĉL$‰D$‰<$è®È‰EÀ0ɈM¸ÇGTénÿÿÿ…Àu=ÇGT€}òu²ÆE¸ëO‹GX‹MÄ‹‰£Á‰L$‰$ÇD$èaÈÆE¸²ë'‰Eì‹WT‰Ñ)Á9¸GÁ‰GT0Ò…À…ÓþÿÿÆE¸0Ò‰]°‹Eì…À„Šýÿÿ‹OLƒytNA ‹E´Eì‰E´‹GL‹H ;H”Eó”À„Àu&‹OLƒy…ƒy u ƒ}´•Eó•À„À„èˆU¼é˜ˆU¼ŠUòƒy „®„Ò„ñ‹OX‹]Ä‹“£Á‰D$‰T$‰ $è™Ç‹GL‹WX‹‹+Âuó‰t$ ‰T$‰L$‰$èvljƋGL‹‹3‰t$‰L$‰$è[Ç‹GX‹‹÷À‰L$‰$èFljE°‹GL‹@‹‹÷À‰L$‰$è+Ç‹WL‹J J‰t$‹U°‰T$Á‰ $èÅÆ‹GX‹‹7‰]ĉt$ ‰L$‰$ÇD$ÇD$ÇD$èÙÆ‹GLp €}ó„†é‹UÄ‹’K‰D$‰T$‰ $è«Æ…Àu‹GL‹MìH ‹uìë@‹uì…À~B)Ɖû‹SL‹KX‹R ò‹}Ä‹¿O‰D$ ‹E°ЉD$‰|$‰ $èaÆ‹CL‰ßp u´ÆEóë‹GLp ‹uìÆEóu´‹GL‹H…ÉuŠU¼é”ûÿÿ9H ró‹EÄ‹€;‰D$‰<$èƉEÀëÙ„Ò„ˉû‹KX‹}Ä‹—£Á‰D$‰T$‰ $èéÅ‹CL‹3‹Uì‰T$‰L$‰$èÍÅ‹CX‹÷À‰L$‰$è¸Å‰Æ‹CL‹@‹÷À‰L$‰$èžÅ‹SL‹J J‹Uì‰T$‰t$Á‰ $è8Å‹CX‹7‰}Ä‹Uì‰T$ ‰L$‰$ÇD$ÇD$ÇD$èIÅ‹CL‰ß‹MìH ëA ÆEó‹EÄ‹€S‰D$‰<$è ÅŠU¼„Ò…åƒ}À…ÛˆÓ‹EÄ‹€‹Á‰D$‰<$èôĈÚ齃}´„³ƒ „©ˆU¼‹G‹uÄ‹ŽW¼‹–W‰uĉT$‰L$‰$è±Ä„Àtz‹_L‹G‹w ‹UÄ‹ŠŒ‰MÈÇEÌBÇEЊZ ‰MÔŠ«©‰UĉMØM܉L$‰$è6ÄEà‰D$‰<$è'Ä‹E´‰EäEè‰D$‰$èÄEȉD$‰4$è+ÊU¼ƒ}Àt‹EÄ‹€ÿÀ‹MÀ‰L$ë7„Òt ‹EÄ‹€ûÁë(€}¸t.‹EÄ‹€Â‰D$‰<$èîÄÀu‹EÄ‹€§Á‰D$‰<$èÕÃÄ\^_[]ÃU‰åSWVƒìè_‹‡ë±‹³²‰L$‰$è¦Ã‹·²‰L$‰$è”ÉEð‹u‹F‹N‹V‹v ‹v,‹Ÿï¸‰t$‰T$ ‰L$‰\$‰$èaˇ۳‰D$‹Eð‰$èLÃÄ^_[]ÄU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è¾Á‹G‰D$F‰$ÇD$è¤Á‹G ‰D$ƒÆ ‰4$ÇD$èŠÁƒÄ^_]Ãffff.„U‰åVƒì‹u‹F‰$ÇD$è_Á‹F‰$ÇD$èLÁ‹F ‰$ÇD$è9ÁƒÄ^]ÃU‰åSWVƒì<è_‹uöF…ðöF„‹Fƒøÿu‹F‰EèfÇEìfÇEîEè‰$ÇD$ÇD$èLÂöEî„Ń~ t‹F‹¥±‹—­·‰T$‰L$‰$èùÁ„Àt\‹F‹^ ‹e‰MÈÇEÌBÇEÐL‰MÔŸ‰MØM܉L$‰$è‡ÁEà‰D$‰4$èxÁEȉD$‰$è‘À‹‡m·‰D$‰4$è‡Á„ÀuR‹‡q·‰D$ë>‹‡•·‰D$‰4$ÇD$²Ùÿÿè]Á…Àu‹‡©·‰D$‰4$èGÁ‹M¶‰D$‰L$‰4$è1ÁƒÄ<^_[]ÃU‰åWVƒìè_‹‡H¯‹°‰L$‰$èÁ‹°‰L$‰$èñÀ‰Æ‹M‹A‹Q‹T¶‰T$‰L$‰$èÐÀ‹‡8±‰D$‰4$è¾ÀƒÄ^_]Ãff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è.¿‹G‰D$ƒÆ‰4$ÇD$迃Ä^_]ÀU‰åVƒì‹u‹F‰$ÇD$èヒF‰$ÇD$èܾƒÄ^]ÃU‰åSWVƒìLè[‹}‹OL‹A€y$t$‹Q ‹‹”´‰T$‰L$‰$èï¿‹GL‹pé‹‹‹±‰L$‰$èÒ¿‹OL‹Q(9Ðv'‹A‹q q9ÖBò‹‹”´‰t$‰L$‰$褿‹OL‹A‹‹è³‰L$‰$茿‹OLA‹q ‹‹Ä®‹“Tµ‰t$ ‰D$‰T$‰ $ÇD$è[¿‰Æƒ „°‹G‹‹H¯‹“Xµ‰T$‰L$‰$è0¿„À„‰‹GL‰EÌ‹G‹O ‰MÈ‹‹‰MÐÇEÔBÇEØ‹“‰M܋ܜ‰MàMä‰L$‰$è±¾Eè‰D$‰<$袾Eì‰D$‰4$蓾Eð‰D$‹Ẻ$è¾EЉD$‹Eȉ$è—½‹ƒŒ´‰D$‰<$较ÄL^_[]ÃU‰åSWVƒìè_‹‡£¬‹k­‰L$‰$è^¾‹o­‰L$‰$èL¾‰Eð‹u‹F‹N‹V‹v ‹v,‹Ÿ·³‰t$‰T$ ‰L$‰\$‰$辋‡“®‰D$‹Eð‰$较Ä^_[]ÃU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è~¼‹G‰D$F‰$ÇD$èd¼‹G‰D$F‰$ÇD$èJ¼‹G ‰D$ƒÆ ‰4$ÇD$è0¼ƒÄ^_]ÃU‰åVƒì‹u‹F‰$ÇD$輋F‰$ÇD$èü»‹F‰$ÇD$è黋F ‰$ÇD$èÖ»ƒÄ^]ÃU‰åWVƒìè_‹u‹F<…Àt‰$è"¼ÇF<‹FL‹¬‰L$‰$è伉t$ÇD$LÇ$è–¼ƒÄ^_]ÃU‰åSWVƒì\è[òMfïÀf.È‚(‹M‹A$‰Ï‰D$ ‹ƒã{‰$ÇD$ÇD$è¡»‰Æ‰ù‰q<‹ƒ§{‰E؉E´ÇEÜBÇEàƒD‰E䃛™‰EèEì‰D$‰ $‰Ïè¼E؉D$‰4$è`»‹G<‹M´‰MÀÇEÄ@ÇEÈ‹ ‰MÌ‹³™‰MЉEÔMÀ‰L$‰$è»ò,EiÀÊš;‰D$Áø‰D$ ÇD$Ç$軉þ‹N<‰T$‰D$‰ $ÇD$ÇD$ÇD$ÿÿÿÿÇD$ ÿÿÿÿè̺‹F<‰E¸‹E¸‰$葺ƒÄ\^_[]ÃU‰åWVƒìè_‹‡’©‹Zª‰L$‰$èM»‹^ª‰L$‰$è;»‰Æ‹E‹@‹ª°‰L$‰$è!»‹‡‚«‰D$‰4$軃Ä^_]Ãfff.„U‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$耹ƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$è`¹ƒÄ]ÃU‰åƒì‹E‹@‰Eø‹Eø‰$衹ƒÄ]ÃU‰åSWVƒì<è[‹u€Nƒ~ „™‹F‹‹®©‹“Ư‰T$‰L$‰$èMº„Àtv‹~L‹F‹N ‰MÌ‹‹ny‰MÐÇEÔBÇE؋ՉMÜ‹²—‰MàMä‰L$‰$èÕ¹Eè‰D$‰4$èÆ¹Eì‰D$‰<$è·¹EЉD$‹Ẻ$è͸ë"‹ƒÊ¯‰D$‰4$ÇD$ ÇD$è±¹ƒÄ<^_[]ÃU‰åSWVƒì\è_‹‡Ç§‹¨‰L$‰$肹‹“¨‰L$‰$èp¹‰EÀ‹]‹C‰EÄ‹K‹C‹P,ò@‹@ ‹·ã®‰D$òD$‰T$ ‰L$‰t$‹Eĉ$è8¹Û}Ä‹C‹X$‹‹x‰MÐÇEÔBÇEØâ‰Mܯ–‰MàMð‰L$‰$軸ÛmÄÝ]èEЉD$‰$è狇·©‰D$‹EÀ‰$èÁ¸ƒÄ\^_[]ÃU‰åWVƒìè_‹‡Ø¦‹ §‰L$‰$蓸‹¤§‰L$‰$踉ƋM‹A òA‹ø­òD$‰L$‰$è\¸‹‡È¨‰D$‰4$èJ¸ƒÄ^_]ÀU‰åƒì‹E ‹@ ‰D$‹EƒÀ ‰$ÇD$èÀ¶ƒÄ]ÃDU‰åƒì‹E‹@ ‰$ÇD$è ¶ƒÄ]Ãffffff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è^¶‹G‰D$F‰$ÇD$èD¶‹G‰D$ƒÆ‰4$ÇD$è*¶ƒÄ^_]Ãffff.„U‰åVƒì‹u‹F‰$ÇD$èÿµ‹F‰$ÇD$è쵋F‰$ÇD$èÙµƒÄ^]ÃU‰åWVƒì è_‹u‹FL…À„­òEfïÉf.Ávvò,ÈòX@ò@iÁÊš;‰D$Áø‰D$ ÇD$Ç$è¶‹N<‰T$‰D$‰ $ÇD$ÇD$ÇD$ÿÿÿÿÇD$ ÿÿÿÿèÒµ€f÷‹‡æ«‰D$ë ‹‡f¬‰D$‰4$èp¶‹îª‰D$‰L$‰4$èZ¶ƒÄ ^_]ÃU‰åSWVƒì<è_‹u…ö„Ê‹‡1§‰D$‰4$è'¶…À„°‹]‹‡ý¤‹9¥‰L$‰$è¶‹™«‰\$òEòD$ ‰t$‰L$‰$èßµ‰Æ‹M‹Y$‹‡5u‰EØÇEÜBÇEà‡Þ‰E䇙“‰EèEì‰D$‰ $èoµEð‰D$‰4$è`µE؉D$‰$èy´‹‡E¥‰D$‰4$èoµƒÄ<^_[]ÃU‰åSWVƒì è_‹‡…£‹M¤‰L$‰$è@µ‹Q¤‰L$‰$è.µ‰Æ‹]‹C·Hƒáfƒùu1‹@H‹S‹É¤‰T$‰L$‰$èý´‹C‹Á©‰L$‰$èè´‹‡u¥‰D$‰4$èÖ´ƒÄ ^_[]ÃfU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èN³‹G‰D$ƒÆ‰4$ÇD$è4³ƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$賋F‰$ÇD$èü²ƒÄ^]ÃU‰åSWVƒìè_‹uƒ~P…ÓöF„É‹FH‹Ô£‰L$‰$è ´…À„Ü^P‹FH‹Ø£‰L$‰$ÇD$è㳋<£‰L$‰$)óèϳ‰\$‰t$‰$艳‹FH‹$©‰L$‰$ÇD$袳‹^P‹‡ì¢‹È£‰L$‰$至‹Ì£‰D$‰L$‰$èq³„Àt€N‹‡(©‰D$‰4$èW³ƒÄ^_[]ËFPò@‹‡©òD$‰D$‰4$è/³‹‡©ëÄ·F¨@tȨ t‹FD‹Ô£‰L$‰$è³…Àu«ƒ~Lu¥‹‡¨‰D$‰4$ÇD$ë‰U‰åSWVƒì\èX‰EÀ‹E‹@P…Àt ‹M·IöÁt=‹EÀ‹€Ï§‰D$‹E‰$襲„Àu~‹Eö@€tu‹EÀ‹€3¨‰D$‹E‰$é\öÁ€u'‹EÀ‹€Ï§‰D$‹E‰$èc²„Àu<‹EÀ‹€[§ëÅöÅt4öÅt ‹EÀ‹€×§ë°‹EÀ‹€Ï§‰D$‹E‰$è'²„Àt‹ƒÄ\^_[]ÃöÅ ‹M„®ƒydu‹MI\‰MÄÇE´é²ÇEð‹E‹@\Mð‰L$ ‰$ÇD$ÇD$1ÿèd°=µÙÿÿ‰þ„…Àu>‹M‹Ad‰E´ÇAd‹IP‹A‹q‹MÀ‹‰Ã£‰L$‰$臱9Æu50ÿ1ÿ‹u´éü‹MÀ‹‰÷§‰D$‰L$‹E‰$è[±‰Ç1À0Ûˆßéß‹MA\‰EÄ‹AP‹@‹]À‹‹¿£‰L$‰$è*±‹M‹IP‹q‹}´þ‹I‹“ã‰T$‰ $Æè±‰Á)ù‹E‹@P+H0ÛÇE¼°ëT‹E‰xd³0À¨„ÇEì‹EÄ‹Mì‰L$ ‰|$‰t$‰$èT¯=µÙÿÿtÄ…Àu'‹EìÆ‹U¸‰Ñ)ÁE´9•Àù€¿€Bù‰M¸ë£‹MÀ‹‰÷§‰D$‰L$‹E‰$èh°‰E¼0À뀋Iƒùÿu‹M‹I‹@‹]À‰MÄ‹‹¿£‰L$‰$è8°‰Ç‹u‹FPx‹@‹‹Ã£‰]À‰L$‰$è°‹NP+A‰D$‰|$‹Eĉ$èV°‰Æ…öx1ÿ0ÿëuè¡®1ÿƒ8#‰þt+‹UÀ‹‚æŠ~‰UÀ‰L$‰D$é]þÿÿ0ÿ„Û‹}¼‹u´t<‹M€a‹EÀ‹€Ï§‰D$‰ $蛯·„Àu‹EÀ‹€[§‰D$‹E‰$è}¯·…ö…Y0Û1À‰E´¶Ç÷Ð…ÿ”Á¶É…Át8‹M€a‹EÀ‹€Ï§‰D$‰ $è?¯„Àu‹EÀ‹€[§‰D$‹E‰$è#¯‰}¼€û…¶‹Eƒx „©‹E‹@‹uÀ‹Ž¢‹–;¨‰uÀ‰T$‰L$‰$è⮄Àt}‹]‹{P‹C‹s ‹UÀ‹ŠÇq‰MÈÇEÌBÇEЊ#‰MÔŠK‰UÀ‰MØM܉L$‰$èd®Eà‰D$‰$èU®‹E´‰EäEè‰D$‰<$è@®EȉD$‰4$èY­ƒ}¼„4üÿÿ‹uÀ‹†Ã¦Ž~‰L$‰D$‹}‰<$è5®‹Ž¯¦‰D$‰L$‰<$è®é÷ûÿÿ‹M‹APp‰u´‹IP‹A‹q‹MÀ‹‰Ã£‰L$‰$èð­³9Æt‹E´ésþÿÿ‹EÀ‹€7¨‰D$‹E‰$èÊ­…ÿ…kÿÿÿ‹EÀ‹€?§é%ûÿÿU‰åSWVƒìè_‹‡Ò›‹šœ‰L$‰$è­‹žœ‰L$‰$è{­‰Eð‹u‹F‹N‹V‹v ‹v ‹Ÿ £‰t$‰T$ ‰L$‰\$‰$èH­‹‡Â‰D$‹Eð‰$è3­ƒÄ^_[]Ãffffff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èž«‹G‰D$F‰$ÇD$è„«‹G ‰D$ƒÆ ‰4$ÇD$èj«ƒÄ^_]Ãffff.„U‰åVƒì‹u‹F‰$ÇD$è?«‹F‰$ÇD$è,«‹F ‰$ÇD$諃Ä^]ÃU‰åSWVƒì<è_‹uƒ~ „—‹F‹…›‹—½¡‰T$‰L$‰$è(¬„Àtt‹^P‹F‹N ‰MÌ‹Ek‰MÐÇEÔBÇEØ¿‰MÜ鉉MàMä‰L$‰$è°«Eè‰D$‰4$è¡«Eì‰D$‰$è’«EЉD$‹Ẻ$訪‹‡Í ‰D$‰4$èž«ƒÄ<^_[]ÃU‰åSWVƒìè_‹‡´™‹|š‰L$‰$èo«‹€š‰L$‰$è]«‰Æ‹U‹B‹J‹R‹Z ‹—ð ‰\$ ‰L$‰T$‰$è2«‹‡¤›‰D$‰4$è «ƒÄ^_[]Ãfff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$莩‹G‰D$F‰$ÇD$èt©‹G‰D$ƒÆ‰4$ÇD$èZ©ƒÄ^_]Ãffff.„U‰åVƒì‹u‹F‰$ÇD$è/©‹F‰$ÇD$è©‹F‰$ÇD$è ©ƒÄ^]ÃU‰åWVƒìè_‹u‹F@…Àt‰$èU©ÇF@‹FP‹F™‰L$‰$誉t$ÇD$PÇ$èÉ©ƒÄ^_]ÃU‰åSWVƒì\è[òMfïÀf.È‚(‹M‹A$‰Ï‰D$ ‹ƒi‰$ÇD$ÇD$èÔ¨‰Æ‰ù‰q@‹ƒÚh‰E؉E´ÇEÜBÇEàƒD‰E䃞‡‰EèEì‰D$‰ $‰Ïè8©E؉D$‰4$蓨‹G@‹M´‰MÀÇEÄ@ÇEÈ‹‰MÌ‹¶‡‰MЉEÔMÀ‰L$‰$èR¨ò,EiÀÊš;‰D$Áø‰D$ ÇD$Ç$èF¨‰þ‹N@‰T$‰D$‰ $ÇD$ÇD$ÇD$ÿÿÿÿÇD$ ÿÿÿÿèÿ§‹F@‰E¸‹E¸‰$èħƒÄ\^_[]ÃU‰åWVƒìè_‹‡Å–‹—‰L$‰$耨‹‘—‰L$‰$èn¨‰Æ‹E‹@‹ž‰L$‰$èT¨‹‡µ˜‰D$‰4$èB¨ƒÄ^_]Ãffffff.„U‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$è°¦ƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$覃Ä]ÃU‰åƒì‹E‹@‰Eø‹Eø‰$èѦƒÄ]ÃU‰åSWVƒì<è[‹u€Nƒ~ „™‹F‹‹Þ–‹“‰T$‰L$‰$è}§„Àtv‹~P‹F‹N ‰MÌ‹‹žf‰MÐÇEÔBÇE؋ՉMÜ‹²…‰MàMä‰L$‰$è§Eè‰D$‰4$èö¦Eì‰D$‰<$èç¦EЉD$‹Ẻ$èý¥ë"‹ƒ"‰D$‰4$ÇD$ ÇD$èᦃÄ<^_[]ÃU‰åSWVƒì\è_‹‡÷”‹¿•‰L$‰$貦‹Ã•‰L$‰$è ¦‰EÀ‹]‹C‰EÄ‹K‹SòB‹B‹r ‹—;œ‰D$òD$‰t$ ‰L$‰T$‹Eĉ$èh¦Û}Ä‹C‹X$‹»e‰MÐÇEÔBÇEØâ‰Mܯ„‰MàMð‰L$‰$èë¥ÛmÄÝ]èEЉD$‰$èþ¤‹‡ç–‰D$‹EÀ‰$èñ¥ƒÄ\^_[]ÃU‰åWVƒìè_‹‡”‹Ð”‰L$‰$èÃ¥‹Ô”‰L$‰$è±¥‰Æ‹M‹A òA‹P›òD$‰L$‰$茥‹‡ø•‰D$‰4$èz¥ƒÄ^_]ÀU‰åƒì‹E ‹@ ‰D$‹EƒÀ ‰$ÇD$èð£ƒÄ]ÃDU‰åƒì‹E‹@ ‰$ÇD$èУƒÄ]Ãffffff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$莣‹G‰D$F‰$ÇD$èt£‹G‰D$ƒÆ‰4$ÇD$èZ£ƒÄ^_]Ãffff.„U‰åVƒì‹u‹F‰$ÇD$è/£‹F‰$ÇD$裋F‰$ÇD$è £ƒÄ^]ÃU‰åWVƒì è_‹u‹FP…À„­òEfïÉf.Ávvò,ÈòX@ò@iÁÊš;‰D$Áø‰D$ ÇD$Ç$èG£‹N@‰T$‰D$‰ $ÇD$ÇD$ÇD$ÿÿÿÿÇD$ ÿÿÿÿ裀f™‰D$ë ‹‡¾™‰D$‰4$è £‹˜‰D$‰L$‰4$芣ƒÄ ^_]ÃU‰åSWVƒì,è_‹u…öu‹‡•‘‹Õ“‰L$‰$èU£‰Æ‹]‹‡)’‹i’‰L$‰$è8£‹ñ˜‰t$‰L$‰$è"£‰Æ‰Ù‹Y$‹‡eb‰EØÇEÜBÇEà‡Ê‰E䇙‰EèEì‰D$‰ $è³¢Eð‰D$‰4$褢E؉D$‰$轡‹‡u’‰D$‰4$è³¢ƒÄ,^_[]ÃU‰åSWVƒì è_‹‡É‹‘‘‰L$‰$è„¢‹•‘‰L$‰$èr¢‰Æ‹]‹C·Háfƒùun‹@D‹S‹ ’‰T$‰L$‰$è>¢‹C‹K‹@H‹— ’‰L$‰T$‰$袋CfH‹C‹—‰L$‰$袋C‹—‰L$‰$èì¡‹‡¹’‰D$‰4$èÚ¡ƒÄ ^_[]ÃfDU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èN ‹G‰D$ƒÆ‰4$ÇD$è4 ƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$è ‹F‰$ÇD$èüŸƒÄ^]ÃU‰åSWVƒì,èX‰Eð‹u‹]ƒ{TuA‹C`‹Mð‹‰$’‰L$‰$è¡…Àu%‹Eð‹€¸•‰D$‰$è÷ Ç¸µÙÿÿé‹>‹C`‹Mð‹‰$’‰L$‰$èÍ ‰Æ1É…öts‹C`‹]ð‹‹•‰L$‰$9þG÷訠‰t$‰D$‹E‰$èM ‹E‹@`‹‹H–‰t$ ‰L$‰$ÇD$ÇD$ÇD$èa 9÷„ )÷‰ñ‹]‹CT…Àu ‹E‰0ÿ騋Sƒúÿu‹S9øvh‰Uä‰}è‰Mì‹C`‹Mð‹‰$’‰L$‰$è ‹{T9øs‹C`‹Mð‹‰´•‰|$‰L$‰$è쟋{T‹C`‰Þ‹Mð‹‰•‰L$‰$èÏŸ³‹Uäë‰Þ‹E‰Mì0Û‰ù‰Ï‰Mè‰|$‰D$‰$èΟ‰Ç…ÿy;èOžƒ8#ÇFT•DŽۋ}tX‹F`‹Mð‹‰´•‰L$‰$ÇD$èeŸë6…ÿu<ÇFT·„Û‹}t"‹F`‹Mð‹‰´•‰L$‰$ÇD$è/Ÿ·‹Eì‰鼋NT‰È)ø1Ò9ùF‰FT„Û„‹F`‹Mð‹‰ ’‰L$‰$‹Eè9ø‰ûB؉Eèè垉\$‰D$‹EEì‰$臞‹F`‹uð‹Ž´•‰|$‰L$‰$賞‹E‹@`‹ŽH–‰\$ ‰L$‰$ÇD$ÇD$ÇD$螉ߋEìø‹M‰0ÿ9}è¸t„ÿ”À¶À„@²ÙÿÿƒÄ,^_[]ËE‰01ÀëïU‰åSWVƒì èX‹u‹}öG€u‹€½’‰D$‰<$èžÇ¹µÙÿÿë\‹‹Gƒøÿu‹G‹M‰\$‰L$‰$èGž…Ày èšœƒ8#•Âë0Ò…Àu €gÇë ‰0Ò1É9Øt„Ò”À¶ÀŒ@²Ùÿÿ‰ÈƒÄ ^_[]ÃU‰åƒìèX‹€“‹M‰L$ ‹M ‰L$‰D$‹E‰$èxƒÄ]ÃU‰åƒìèX‹€ì’‹M‰L$ ‹M ‰L$‰D$‹E‰$èDƒÄ]ÃU‰åSWVƒìè^‹Že\‹‰M؉Eð‹}·G%f=…]‹GL‹X‹†ƒì‹Ž=\‹ ‰L$‰D$‰$è圃Ä‹ŽáŒƒì‰L$‰$èÍœƒÄƒìO\‰L$‰Mä¶À‰$蛃ąÀt8‹†u‘ƒìމh‰L$‰D$‰<$茜ƒÄ‹Ž ‘ƒì‰D$‰L$鹋E䋃ì޾ÿÿÿ‰L$ŽŠÿÿÿ‰L$‰$èÛšƒÄ…Àt‹†u‘ƒìŽ™h뛋G\ƒì‰|$‰$虚ƒÄ…Àt‹†u‘ƒìŽ©h‰L$‰D$‹}ékÿÿÿ‹†ƒì‹Ž5\‹ ‰L$‰D$‰$‰]àèÛ›ƒÄ‰ó‰Æ‹ƒ‹‹‹ÁŒƒì‰L$‰$è¹›ƒÄ‹‹ÅŒƒì‰D$‰L$‰4$蛃Ä„À‹}ä„‚‹ƒe‘ƒì‰D$‰4$èz›ƒÄ‰Æƒì‰4$è²›ƒÄ‹ƒì‰D$‰t$‰ $è䙃Ä…Àt>‹ƒu‘ƒì‹¹h‰L$‰D$‹u‰4$è)›ƒÄ‹‹ ‘ƒì‰D$‰L$‰4$éV‰Þ‹†ƒì‹ŽM\‹ ‰L$‰D$‹]à‰$è皃Ä…ÀtG‹ŽáŒƒì‰L$‰$èËšƒÄ‹ƒì¶À‰D$‰ $虃ąÀt‹†u‘ƒìŽÉhéŠþÿÿ‹†ƒì‹ŽE\‹ ‰L$‰D$‰$èxšƒÄ…ÀtG‹ŽáŒƒì‰L$‰$è\šƒÄ‹ƒì¶À‰D$‰ $è­˜ƒÄ…Àt‹†u‘ƒìŽÙhéþÿÿ‹†ƒì‹Ž1\‹ ‰L$‰D$‰$è šƒÄ…ÀtG‹ŽáŒƒì‰L$‰$è홃Ä‹ƒì¶À‰D$‰ $èV˜ƒÄ…Àt‹†u‘ƒìŽéhé¬ýÿÿ‹†ƒì‹ŽI\‹ ‰L$‰D$‰$èš™ƒÄ…ÀtG‹ŽáŒƒì‰L$‰$è~™ƒÄ‹ƒì¶À‰D$‰ $èÉ—ƒÄ…Àt‹†u‘ƒìŽùhé=ýÿÿ‹†ƒì‹ŽA\‹ ‰L$‰D$‰$è+™ƒÄ…Àt,‹ƒì‰D$‰ $藃ąÀt‹†u‘ƒìŽ iééüÿÿ‹†ƒì‹Ž9\‰Ú‰ó‹ ‰L$‰D$‰$èÓ˜ƒÄ‰Æ…ö„”‹ƒÁƒì‹‹)\‹ ‰L$‰D$‰4$襘ƒÄ„Àt=‹ƒì‰$ÇD$ÇD$藃ċƒì‰$ÇD$ÇD$é'‹ƒÁƒì‹‹%\‹ ‰L$‰D$‰4$è@˜ƒÄ„Àt]‹ƒì‰$ÇD$ÇD$è´–ƒÄ‹ƒì‰$ÇD$ÇD$è”–ƒÄ‹ƒì‰$ÇD$ÇD$颋ƒÁƒì‹‹e[‹ ‰L$‰D$‰4$è»—ƒÄ„Àt:‹ƒì‰$ÇD$ÇD$è/–ƒÄ‹ƒì‰$ÇD$ÇD$ë@‹ƒÁƒì‹‹-\‹ ‰L$‰D$‰4$èY—ƒÄ„Àt ‹ƒì‰$ÇD$ÇD$èÍ•ƒÄ‰ß‹‡ƒìée‰L$‰D$‹uà‰4$藃ąÀ‰Eì„닇͌ƒì‰D$‹Eì‰$è薃ĉÁ‰e܃àð‰ã)É܅ɉMètE1ö‹‡ÑŒƒì‰t$‰D$‹Eì‰$è«–ƒÄ‹¹’ƒì‰L$‰$è“–ƒÄ¿À‰³F9uèu½‹E䋃ì‹Mè‰L$‰\$‰$èÄ…À‹uÜtE‹‡u‘ƒìi‰L$‰D$‹]‰$è=–ƒÄ‹ ‘ƒì‰D$‰L$‰$è!–‰ôék‰ô‹uà‹‡ƒìùe‰û‰L$‰D$‰4$èô•ƒÄ‰Æ…ö‹Eäth‹‰E싃Žƒì‰D$‰4$èΕƒÄ‰Ç‹ƒŽƒì‰D$‰4$è´•ƒÄƒì‰D$‰|$‹Eì‰$蔃ąÀt‹ƒu‘ƒì‹)iéDúÿÿ‰Þ‹†É‹‹Ž%Œƒì‰L$‰$èc•ƒÄ‹Ž)Œƒì‰L$‰$èK•ƒÄƒì‹}‰|$‰$ÇD$`èø”ƒÄ‹GX‹ŽŽƒì‰L$‰$蕃ąÀtE‹OX‹G`‹–yƒì‰L$‰T$‰$è픃Ä‹GX‹Ž­‘ƒì‰L$‰$ÇD$èÊ”ƒÄ‹†1’ƒì‰D$‰<$è²”ƒÄ‹EØ‹;Eðueô^_[]Ãè`“U‰åSWVƒì,è_‹u‹F\‰$èÅ’=µÙÿÿ„ …À…Ù·F%ÿÇ f‰Fƒ~ t‹F‹ºƒ‹—ЉT$‰L$‰$è1”„Àt\‹F‹^ ‹zS‰MØÇEÜBÇEà/‰MäÎr‰MèMì‰L$‰$è¿“Eð‰D$‰4$è°“E؉D$‰$èÉ’‹‡þˆ‰D$‰4$è¿“‹‡‰‰D$‰4$è­“‹‡îˆ‰D$‰4$蛓‹‡òˆ‰D$ë$‹ª‰‰D$‰L$‰4$èy“‹bˆ‰D$‰L$‰4$èc“ƒÄ,^_[]ÃU‰åWVƒìè_‹‡z‹B‚‰L$‰$è5“‹F‚‰L$‰$è#“‰Æ‹M‹A‹Q‹Úˆ‰T$‰L$‰$è“‹‡jƒ‰D$‰4$èð’ƒÄ^_]Ãffff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$è^‘‹G‰D$ƒÆ‰4$ÇD$èD‘ƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$è‘‹F‰$ÇD$è ‘ƒÄ^]ÃU‰åƒì‹E‹@$‹M‰L$‰$臑ƒÄ]ÃU‰åƒìè)‘‰Á¸ÿÿÿÿ‹U;J$u ‹Bƒøÿu‹BƒÄ]ÃU‰åƒìèÿ‰Á¸ÿÿÿÿ‹U;J$u‹BƒÄ]ÃU‰åƒìè݉Á¸ÿÿÿÿ‹U;J$u‹BƒÄ]ÃU‰åƒì軋M;A$t1Àë‹A\ƒÄ]ÃU‰åSWVƒì,è_‹·ÏP‹‰Eð]à‰\$‹EƒÀ‰D$ÇD$ Ç$è ‘…ÀuÆEà‹‡{‹+†‰\$‰L$‰$ÇD$ è>‘‹;MðuƒÄ,^_[]ÃèòU‰åSWVƒìLè_‹·PP‹‰Eð]‰\$‹EƒÀ‰D$ÇD$ .Ç$è‹…ÀuÆE‹‡ü~‹¬…‰\$‰L$‰$ÇD$ è¿‹;MðuƒÄL^_[]ÃèsU‰å‹Ef‹@fÁÀ·À]ÃU‰å‹Ef‹@fÁÀ·À]ÃU‰åƒìèX‹€ †‹M‰L$Mü‰L$‰D$‹E‰$ÇD$ èN„À¸EEüƒÄ]ÃU‰åƒìèX‹€Ã…‹M‰L$Mþ‰L$ ‰D$‹E‰$ÇD$è„Àf¸fEEþ·ÀƒÄ]ÃU‰åSWVƒì è[‹ƒÒ€‰D$‹}‰<$èÐ0Ƀø‚싃΀‰D$‰<$賉ƊF<tc0É<…Ç‹ƒÒ€‰D$‰<$èŽ0Ƀø‚ª‹}…ÿt%‹ƒ¢„‰t$‰D$‹E‰$èc‰|$‰$è'±ƒ}tv‹ƒª„ëS‹ƒÒ€‰D$‰<$è50ɃørU‹}…ÿt%‹ƒ¦„‰t$‰D$‹E‰$è‰|$‰$èÒŽ±ƒ}t!‹ƒ®„‰t$‰D$‹E‰$èᎋMf‰±¶ÁƒÄ ^_[]ÃU‰åƒìèZ‹‚o}‹ŠÏ‚’%ä‰T$‰L$‰$ÇD$ 蘎ƒÄ]ÃU‰åƒìèZ‹‚4}‹Š”‚’íã‰T$‰L$‰$ÇD$ è]ŽƒÄ]ÃU‰åƒìèZ‹‚ù|‹ŠY‚’´ã‰T$‰L$‰$ÇD$ è"ŽƒÄ]ÃU‰åƒìèZ‹‚¾|‹Š‚’ꦉT$‰L$‰$ÇD$ èçƒÄ]ÃU‰åVƒìè^‹†È|‰D$‹E‰$辋Žhƒ‹U‰T$‰L$‰$襋Žà|‰L$‰$蓃Ä^]ÃU‰åWVƒìè_‹‡x|‰D$‹E‰$èj‰Æ…öt[‹E‹„|‰L$‰$èO‰t$‰$ÇD$è‹¿L‹‰t$‰$ÇD$è錋‰t$‰$ÇD$ èÓŒ‰ðƒÄ^_]ÃU‰åWVƒìè^‹}‹G‹Žó{‰L$‰$èÚŒ‹G‹Žó{‰L$‰$èÅŒ‹G ‹Žó{‰L$‰$è°Œ‰}ð‹†“‰Eô‹†[}‰D$Eð‰$蕌ƒÄ^_]ÃU‰åSWVƒìè_‹‡Zz‰Eð‹‡‚‰D$‹]‰$è[Œ‰Æ‹‡‚‰D$‰$èGŒ‹Â|‰D$‰t$ ‡‚X‰D$‰L$‹Eð‰$è Œ‰Æ‹‡‚‰D$‰$è Œ‹K‹‹"€‰T$‰L$‰$èî‹…Àt4‹‡‚‰D$‰$èØ‹‹‚‰D$ ‡’X‰D$‰L$‰4$踋‰Æ‹‡"‚¢X‰L$‰D$‰4$èš‹ƒÄ^_[]ÃU‰åVƒìè^‹†2‰D$‹E‰$èp‹‹Žr~‰L$‰$ÇD$èV‹ƒÄ^]ÃU‰åƒì‹E ‰D$‹E‰$ÇD$ ÇD$è"‹ƒÄ]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$苃Ä]ÃU‰åƒì‹E ‰D$‹E‰$ÇD$ ÇD$蹊ƒÄ]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$蛊ƒÄ]ÃU‰åƒì‹E ‰D$‹E‰$ÇD$ ÇD$ èPŠƒÄ]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$ è2ŠƒÄ]ÃU‰åVƒìè^‹†ýx‰D$‹E‰$è󉋎y‰L$‰$èቋŽy‰L$‰$èωƒÄ^]ÃU‰åƒìèX‹M‰Mø‹ˆ ‰Mü‹€¶x‰D$Eø‰$蟉…ÀtÇ@ƒÄ]ÃU‰åVƒìè^‹†-‰D$‹E‰$èg‰‹–Åy‹Ž]wƒøu†µUë†ßÞ‰D$‰D$ †ÅU‰D$‰T$‰ $è*‰ƒÄ^]ÃU‰åVƒìè^‹†Ä~‰D$‹E‰$艋Ž|‰L$‰$ÇD$è舃Ä^]ÃU‰å‹E‹@]ÃU‰å‹E‹M‰A]ÃU‰åVƒìè^‹†±w‰D$‹E‰$览‹Žµw‰L$‰$蕈‹ŽÉw‰L$‰$胈ƒÄ^]ÃU‰åSWVƒì,è[‹ƒ#~‰D$‹E‰$èYˆ‰Æ‹ƒ'~‹}‰|$‰D$‰4$è>ˆÇEðÇEì‹Eƒø‡§‹„ƒ/ØÿàƒÇT‰$è%†é‰ÇE苃Wx‰D$‰<$è퇋‹{w‰L$‰$èÛ‡‰Ç‹ƒcx‹çL‰L$‰D$‰<$轇‹ƒcx‹÷K‰L$‰D$‰<$衇‹ƒŸF‹‹ƒ+~‰L$‰D$‰4$胇‹ƒ+w‹‹/~‹U‰T$Uè‰T$Uì‰T$ Uð‰T$‰L$‰$èO‡‹ƒ3~‹Mèé´‹ƒ›F‹‹ƒ+~‰L$‰D$‰4$è#‡‹ƒWx‰D$‰<$臋‹{w‰L$‰$èÿ†‰Ç‹ƒcx‹çL‰L$‰D$‰<$èᆋƒcx‹÷K‰L$‰D$‰<$èņ‹ƒ/w‹‹7~‹U‰T$Uì‰T$ Uð‰T$‰L$‰$닃—F‹‹ƒ+~‰L$‰D$‰4$è}†‹ƒ;~‹Mð‰L$‰D$‰4$èd†‹ƒ?~‹Mì‰L$‰D$‰4$èK†‰ðƒÄ,^_[]ÃVi.ÔU‰åVƒìè^‹†ø{‰D$‹E‰$膋Žl‰D$‹E‰$èøuƒÄ]ÃU‰åVƒìè^‹†ãk‰D$‹E‰$èÑu‹Žl‰L$‰$è¿uƒÄ^]ÃU‰åƒì‹E ‰D$‹E‰$ÇD$ ÇD$è‹uƒÄ]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$èmuƒÄ]ÃU‰åVƒìè^‹†8d‰D$‹E‰$è.u‹Žlk‹U‰T$ ‹U‰T$‰L$‰$èu‹ŽPd‰L$‰$èütƒÄ^]ÃU‰åWVƒìè_‹‡Ýc‰D$‹E‰$èÓt‹ác‰L$‰$èÁt‹õc‰L$‰$è¯t‰Æ‹‡!k‹M‰L$‰D$‰4$è”t‹‡%k‹M‰L$‰D$‰4$è{t‰ðƒÄ^_]ÃU‰åVƒìè^‹†šS…ÀuB‹† c‹ŽZc‰L$‰$èCt‹Ž^c‰L$‰$è1tŽšS‰L$‰$èãs‹†šSƒÄ^]ÃU‰åSWVƒìè^‹†™b‹ŽEg‰L$‰$èìs‹ŽEj‰D$‰L$‹}‰<$èÓs‹M„ÀtA‹†c‰D$‰ $èºs‹†©b‹Ž‘g‰L$‰$è¢s‹Ž c‰L$‰$ès鋆ýb‰D$‰ $èys‰Á1À…ɉMð„㋆åa‹Žùb‰L$‰$èRs‹Žmg‰|$‰L$‰$ÇD$ è4s‹Žc‰L$‰$è"s‰Ç‹†EdŽÍC‰L$‰D$‰<$ÇD$ èür‰Ãûÿÿÿ…߃}„¹‹†¥b‹Ž}g‰L$‰$èÌr‹Žg‰D$‰L$‰<$è¶r‹¾­b‹ž%b‹Žåa‹–Md‰D$ †íC‰D$‰T$‰ $è„r‹ŽÅg‹–E3‹‰T$ ‰D$‰L$‰$èbr‹ŽÉg‰D$†ÝC‰D$‰L$‰<$ÇD$ è:r‹M‰L$‰$èûq‹†c‰D$‹Eð‰$èr1À鈋†åf‰\$‰D$‰<$èùq‹Ž=j‰D$‰L$‹Eð‰$èàq‹†ñd‰D$‰<$‰}ì¿üÿÿÿ)ßèÄqø‹ŽIj‰D$ ƒÃ‰\$‰L$‹Eì‰$è¢q‹ŽAj‰D$‰L$‹uð‰4$è‰q‰ðƒÄ^_[]ÃU‰åWVƒìè^‹}‹G‹Žr`‰L$‰$èYq‹G‹Žr`‰L$‰$èDq‰}ð‹†Nx‰Eô‹†Úa‰D$Eð‰$è)qƒÄ^_]ÃU‰å‹E‹@]ÃU‰åWVƒìè_‹u‹F‹`‰L$‰$èëp‹‡`‰D$‹E‰$èÖp‰t$‰$ÇD$èŒpƒÄ^_]ÃU‰å‹E‹@]ÃU‰åWVƒìè_‹u‹F‹¯_‰L$‰$èŠp‹‡§_‰D$‹E‰$èup‰t$‰$ÇD$è+pƒÄ^_]ÃU‰åWVƒì è^‹†Ý_‰D$‹}‰<$è7p‹ŽÙc‰L$‰$è%p9øu†u<ë0‹W‹‹†-^‹Ž•`‰|$‰T$ –E@‰T$‰L$‰$èéoƒÄ ^_]ÃU‰åVƒìè^‹†‚e‰D$‹E‰$èÀo‹ŽÂb‰L$‰$ÇD$è¦oƒÄ^]ÃU‰åSWVƒì,è_‹‡r]‰Eð‹‡"_‰D$‹]‰$èso‰$è‘m‹S‹s‹Ú_‰t$‰T$‰\$‰D$ ‡š?‰D$‰L$‹Eð‰$è6oƒÄ,^_[]ÃU‰åVƒìè^‹†^‰D$‹E‰$è o‹Žje‹U‰T$ ‹U‰T$‰L$‰$èìn‹Ž.^‰L$‰$èÚnƒÄ^]ÃU‰åSWVƒì è_‹‡¾]‰D$‹E‰$è°n‰Æ…öt2‹]‹M‹‡e‰L$‰D$‰4$èŽn‹‡e‰\$‰D$‰4$èxn‰ðƒÄ ^_[]ÃU‰åWVƒìè^‹}‹G‹Ža]‰L$‰$èHn‹G‹Ža]‰L$‰$è3n‰}ð‹†mu‰Eô‹†É^‰D$Eð‰$ènƒÄ^_]ÃU‰åƒìèY‹E‹@‹‰ì^‰L$‰$èçmƒÄ]ÃU‰åSWVƒìè_‹‡¨\‹ðc‰L$‰$è»m‰Æ‹]‹K‹‡ôc‰L$ ì=‰L$‰D$‰4$è“m‹C‹À^‰L$‰$è~m‹ôc‰D$ ‡ü=‰D$‰L$‰4$è^m‹‡øcü9‰L$‰D$‰4$èBm‰ðƒÄ^_[]ÃU‰åSWVƒì è_‹‡þ[‹Fc‰L$‰$èm‰Æ‹‡NcŸR9‰\$‰D$‰4$èól‹‡Nc‰\$‰D$‰4$èÝl‰ðƒÄ ^_[]ÃU‰åSWVƒì è_‹‡][‹½b‰L$‰$è¬l‰Æ‹‡c‰D$‹]‰$è•l‹±_‰L$‰$ÇD$è{l‹ `‰D$‰L$‰4$èel‹K‹‡ `‰L$‰D$‰4$èLl‹‡c‰D$‰$è:l‹±_‰L$‰$ÇD$è l‹ `‰D$‰L$‰4$è l‰ðƒÄ ^_[]ÃU‰åSWVƒì è_‹‡ÆZ‹b‰L$‰$èÙk‰Æ‹‡Fb‰D$‹]‰$èÂk‹b‰D$‰L$‰4$è¬k‹C‹&b‰L$‰$è—k‹b‰D$‰L$‰4$èk‹‡Jb‰D$‰$èok‹b‰D$‰L$‰4$èYk‰ðƒÄ ^_[]ÃU‰åSWVìŒè[Ç$èÝj‰Æ‹ƒ&\‰D$‹}‰<$èk‰Eð‹ƒ*\‰D$‰<$èk‰t$‰D$‹Eð‰$è.h¶‰E¸¶F‰E¼¶F‰EÀ¶F‰EĶF‰EȶF‰E̶F‰EжF‰EضF‰Eä¶F ‰Eè¶F ‰Eì¶F ‰Eð¶F ‰Eܶ~ ¶F¶N‹“Y‰UÔ‹“†[‰Uà‰L$H‰D$D‰|$@‹E܉D$<‹Eð‰D$8‹Eì‰D$4‹Eè‰D$0‹Eä‰D$,‹E؉D$(‹EЉD$$‹ẺD$ ‹EȉD$‹EĉD$‹EÀ‰D$‹E¼‰D$‹E¸‰D$ ƒv;‰D$‹Eà‰D$‹EÔ‰$è÷i‰Ç‰4$èQi‰øÄŒ^_[]ÃU‰åƒì‹E ‰D$‹E‰$ÇD$ ÇD$è²iƒÄ]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$è”iƒÄ]ÃU‰åƒì‹E ‰D$‹E‰$ÇD$ ÇD$èIiƒÄ]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$è+iƒÄ]ÃU‰åVƒìè^¾8Hu<‹†èV‹ŽôW‰L$‰$èÛh‹ŽøW‰L$‰$èÉhŽ8H‰L$‰$è{hƒÄ^]ÃU‰åWVƒìè_‹·ÜG‡ÜG‰D$Ç$èKh‹‡¤W‰D$‰4$èuhƒÄ^_]ÃU‰åWVƒìè_‹‡9W‹UW‰L$‰$èHh‹½^‹—&‹‰T$‰L$‰$è*h‹mW‰L$‰$èh‰Æ‹‡Á^‰D$‰4$ÇD$èüg‹‡=W‹Å^‰L$‰$èäg‹É^‰D$‰L$‰4$èÎg‰ðƒÄ^_]ÃU‰åWVƒì è_‹E‰Eð‹‡ôn‰Eô‹‡°V‰D$Eð‰$è™g‰Æ…ö„Š‹‡$^‰D$‰4$èwg‹¼V‰L$‰$èeg‰t$‰$ÇD$ èg‹‡$^‰D$‰4$è?g‹¼V‰L$‰$è-g‰t$‰$ÇD$èãfÇFf‹‡œ*f‰FÆFÆF‰ðƒÄ ^_]ÃU‰åWVƒìè^‹}‹G‹ŽéU‰L$‰$èÐf‹G‹ŽéU‰L$‰$è»f‹G‹ŽéU‰L$‰$è¦f‹G ‹ŽéU‰L$‰$è‘f‹G‹ŽéU‰L$‰$è|f‰}ð‹†%n‰Eô‹†QW‰D$Eð‰$èafƒÄ^_]ÃU‰åSWVƒì è^‹}‹G;EtX_‹ŽFU‰L$‰$è%f‹†JU‰D$‹E‰$)ûèf‰\$‰|$‰$èÈe‹G‹W‹Ž®\‰T$‰L$‰$èâeƒÄ ^_[]ÃU‰åƒìèX‹€?\‹M‰L$‰D$‹E‰$ÇD$ èªeƒÄ]ÃU‰åƒìèX‹€\‹M‰L$ ‹M‰L$‰D$‹E‰$ÇD$èneƒÄ]ÃU‰åSWVƒì|è_‹‡;T‹Ó[‰L$‰$èBe‰Ã‹‡?T‹OT‰L$‰$è(e‹ST‰L$‰$èe‹gT‰L$‰$èe‰E¨‹u‹F ‹×[‰\$ ‰L$‰$ÇD$èÝd‰E´ÇEìÇE苇Û[‰D$‰4$èºdˆÇ‹‡ß[‰D$‰4$è¦d„ÿfE‡?(‰E”‹‡GV‰D$‹u‰4$è„d‹Y‰}ȉL$‰4$…À•Ãèjd„ÿˆ}°‰EätP¶„Àx‹MÈ‹‰s#‹D4Áèƒàë‰$ÇD$@èðb…À•À¶À…ÀtÇE¬ÿÿÿ1ÿÆEЉ}¤éS ‹Eä‰$èPd‰Æ1ÿ‹EÈ‹€s#‰EÌëG9÷s6‹Eä¶8„Àx‹MÌ‹D4Áèƒàë‰$ÇD$@èƒb…À•À¶À…ÀuÅ‹Eä 8‰Mä‰M¤ÇEàŠ 8€ùT„ ˆ]¸1ö€ù-‹M¤uø1ÉT‰Uäq€|-‰ñtíð‰Á‰}¬Eà‰$Uäè— ‰Ã1ÿÆEЋEàƒø‡ ‹UÈ‹Œ‚KÑÿá‹Eä€8Wt ÆEÐ1ÿén €x-Š]¸uL¶@‹MÌöD5t>ƒþt ƒþuÔ€}°u΋EÈ‹€ã[‰D$‹E´‰$èïb‰EÔ‹MäƒÁ‰Mä¿éƒþu›‹EÈ‹€ã[‰D$‹E´‰$è¼b‰EÔ‹EäH‰Mä¶@‹UÌöD‚5…¿0ä€}°uˆÜ€}°”À¶Ð1ɉ×éF…ö…@ÿÿÿ¾…ëQ‰Ø÷æ‰×ÁïkÏd‰ø÷æÁêkÂd)ljÞ)ιY·Ñ‰Ø÷á‰Ð‰òÁè ‰EÔ1ÉŠe¸é…ö…úþÿÿ‹EÈ‹€ã[‰D$‹E´‰$¹…ëQ‰Ø÷á‰×ÁïkÇd‰EЉø÷áÁêkÂd)ǹY·Ñ‰Ø÷á‰ÖÁî èía¹…ëQ÷áÁêkÂdð‰EÔ+]Ðéáƒþ„ªƒþ„D…ö…€þÿÿ‹UäŠ<-t‰Ñë J‰MäŠB¶Ð‹uÌöD–5u‰\$‹UäB‰T$‰t$‹Uè‰T$ —&‰T$‰L$‰$èúIƒÄ<^_[]ÃU‰å‹E‹@]ÃU‰å‹E¾@]ÃU‰åŠE‹MˆA]ÃU‰å‹E‹@]ÃU‰å‹E‹M‰A]ÃU‰å‹E¾@]ÃU‰åŠE‹MˆA]ÃU‰å‹E·@]ÃU‰åf‹E‹Mf‰A]ÃU‰åWVƒìè^‹}‹GH‹Žq8‰L$‰$èXI‰}ð‹†ÝP‰Eô‹†Ù9‰D$Eð‰$è=IƒÄ^_]ÃU‰åSWVƒì è[‹ƒº<‰D$‹u‰4$è I‰Ç‹ƒ¾<‰D$‰4$èøH‰Æ‹ƒÊ<‹J‰L$‰D$‰<$èÚH‹}…Àu‹ƒ*@‰t$‰D$‰<$è½H¸ƒHu)‹ƒÆ7‹‹®<‰L$‰$èšH‰Á¸;Mt¸ƒÄ ^_[]ÃU‰å1À]ÃU‰å‹E‹@H]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$HèPHƒÄ]ÃU‰åSWVì¬è^‹†7‹Ž.?‰L$‰$è H‰…pÿÿÿfïÀ)EØ)EÈ‹†ª7ŽZ‰L$‰D$‹E‰$èØG‰Â‹†B8Mˆ‰L$ MȉL$‰D$‰$‰•xÿÿÿÇD$è¨G‰Ã‹E‰…lÿÿÿ…Û„ª‹EЋ‰…tÿÿÿ1ÿ‹EЋtÿÿÿ9t‹…xÿÿÿ‰$èCG‹EÌ‹¸‹†Æ6‹Ž2?‰T$ –j‰T$‰L$‰$èAG‹Ž’7‰D$‰L$‹E‰$è(GG9ßr›‹†B8Mˆ‰L$ MȉL$‰D$‹…xÿÿÿ‰$ÇD$èõF‰Ã…Û…aÿÿÿ‰ñ‹ª7±z‰Ï‰t$‰D$‹E‰$èÈF…À„‰û‹ƒ7‹‹7‰L$‰$è¦F‹‹7‰L$‰$è”F‹‹.7‰L$‰$è‚F‰Ç‹ƒ7‹‹š>‰L$‰$èhF‹‹?‰D$‰L$‰<$èRF‰…xÿÿÿ‹ƒ6‰…tÿÿÿ‹ƒª7‰t$‰D$‹u‰4$è'F‰…hÿÿÿ‹ƒª7»š‰|$‰D$‰4$èF…Àuƒ*ë?‹³6‹ƒª7‰|$‰D$‹E‰$èÚE‹‹j8‰D$ ƒª‰D$‰L$‰4$èºE‰Þ‹Žj8‹•xÿÿÿ‰T$‰D$‹…pÿÿÿ‰D$‹…hÿÿÿ‰D$ †Š‰D$‰L$‹…tÿÿÿ‰$ètE‹ŽÆ6‹–2?‰D$ †j‰D$‰T$‰ $èNE‹Ž’7‰÷‰D$‰L$‹E‰$è3E‹‡Æ6‹2?‹•pÿÿÿ‰T$ —º‰T$‰L$‰$èE‹’7‰D$‰L$‹…lÿÿÿ‰$èëD‹‡8ʉþ‰L$‰D$‹E‰$èÊD…À…ÔІ^'„À…t…|ÿÿÿ‰D$E€‰D$E„‰$襉ó‹ƒ6‹‹j8‹U„‹u€‹½|ÿÿÿ‰|$‰t$‰T$ “Ú‰T$‰L$‰$è\D‹‹&7‰L$‰$èJD‹j'‰L$‰$èüC‹³>6‹ƒ²7‰D$‹E‰$èD‹‹6?‰D$‰L$‰4$èD‰Ç‹ƒf8‰D$‰<$èóC‹‹²8“ ‰T$‰L$‰$è×C‹‹n;„Àt ‰L$ƒêë ‰L$ƒú‰$è¯C‹b'‰Þ‰L$‰$è_C‹†:?‰D$‰<$è‰C‹Ž8‹–6‹‰T$‰L$‰$èkC‹Ž&7‰L$‰$èYCŽf'‰L$‰$è CƆ^'‰÷‹‡Æ6‹2?‹•pÿÿÿ‰T$ —Z‰T$‰L$‰$èC‹’7‰D$‰L$‹µlÿÿÿ‰4$èöB‹‡Æ6‹2?‹—b'‰T$ —j‰T$‰L$‰$èÊB‹’7‰D$‰L$‰4$è´B‹‡Æ6‹2?‹—f'‰T$ —z‰T$‰L$‰$èˆB‹’7‰D$‰L$‰4$èrB‹‡Æ6‹2?— ‰T$ —ЉT$‰L$‰$èFB‹’7‰D$‰L$‰4$è0B‹‡Æ6‹2?‹—j'‰T$ —š‰T$‰L$‰$èB‹’7‰D$‰L$‰4$èîAĬ^_[]ÃU‰åVƒìè^‹†g3‰D$‹E‰$èÁA‹Žó8‹U‰T$‰L$‰$è¨AƒÄ^]ÃU‰åVƒìè^‹†&3‰D$‹E‰$è€A‹Ž¶8‹U‰T$‰L$‰$ègAƒÄ^]ÃU‰åVƒìè^‹†å2‰D$‹E‰$è?A‹Žy8‹U‰T$ ‹U‰T$‰L$‰$èAƒÄ^]ÃU‰åWVƒì è_‹‡œ2‰D$‹u‰4$èö@‹48‹U‰T$‹U‰T$ ‰t$‰L$‰$èÒ@ƒÄ ^_]ÃU‰å‹E‹@ ]ÃU‰åƒì‹E‰D$‹E‰$ÇD$ èj@ƒÄ]ÃU‰åSWVì è_‹‡^.‹ú1‰L$‰$èq@‰…$ÿÿÿ‹‡^.‹ú1‰L$‰$èS@‰…ÿÿÿ‹‡v0ò‰L$‰D$‹]‰$è.@‰Æ…ötB‹‡./‹š7‰t$ —r‰T$‰L$‰$è@‹ú/‰D$‰L$‹…$ÿÿÿ‰$èæ?‰µ ÿÿÿ‰ù‹v0¹‰Î‰|$‰D$‰$èÀ?…À„鋆v0‰|$‰D$‰$è¢?‰Â‹†V/‹Ž¶7‰T$‰• ÿÿÿ‰L$‰$è~?‰Ã‹¾./‹†j.‹ŽÒ0‰\$ –‚‰T$‰L$‰$èP?‹Žš7‰D$ †‚‰D$‰L$‰<$è0?‹Žú/‰D$‰L$‹…$ÿÿÿ‰$è?‹†V/‹Ž’6‰\$ ‹]‹• ÿÿÿ‰T$‰L$‰$èë>‹Žú/‰D$‰L$‹…ÿÿÿ‰$èÏ>‹†v0Ž2‰÷‰L$‰Î‰D$‰$è¯>…Àtd‹‡./‰… ÿÿÿ‹‡v0‰t$‰D$‰$è‰>‹š7‰D$ ‡"‰D$‰L$‹… ÿÿÿ‰$èc>‹ú/‰D$‰L$‹…$ÿÿÿ‰$èG>‹‡v0r‰L$‰D$‰$è+>‰… ÿÿÿ‹‡v0b‰L$‰D$‰$è >‰Æ‹‡Ê.‹º7‰t$‰L$‰$èë=‰…ÿÿÿfïÀ)EØ)EÈ‹‡ª0Mˆ‰L$ MȉL$‰D$‰4$‰µÿÿÿÇD$è«=…À‰…ÿÿÿ„‹EЋ‰…ÿÿÿ1Û‹EЋÿÿÿ9t‹…ÿÿÿ‰$èK=‹EÌ‹4˜‹‡v.‹0‰L$‰$èW=‹0‰D$‰L$‰4$èA=„Àtl‹‡¾7‰D$‰4$è+=‰Æ‹‡&0‰D$‹… ÿÿÿ‰$è=9ƃꋇ*0‰t$‰D$‹… ÿÿÿ‰$èí<‹ú/‰D$‰L$‹…ÿÿÿ‰$èÑ<C;ÿÿÿ‚4ÿÿÿ‹‡ª0Mˆ‰L$ MȉL$‰D$‹…ÿÿÿ‰$ÇD$è–<…À‰…ÿÿÿ…öþÿÿ‹‡v0¢‰L$‰D$‹u‰4$èi<‰…ÿÿÿ‹‡./‰…ÿÿÿ‹·j.‹‡&0‰D$‹ ÿÿÿ‰$è9<‹Ò0‰D$ ‡²‰D$‰L$‰4$è<‹š7‰D$ ‡’‰D$‰L$‹…ÿÿÿ‰$èó;‹ú/‰D$‰L$‹µ$ÿÿÿ‰4$è×;‹‡Â7‰t$ ‹M‰L$‰D$‹E‰$è·;fïÀ)…xÿÿÿ)…hÿÿÿ‹‡ª0(ÿÿÿ‰L$ hÿÿÿ‰L$‰D$‰$ÇD$èw;…À‰…ÿÿÿ„ ‹…pÿÿÿ‹‰… ÿÿÿ1ö‹…pÿÿÿ‹ ÿÿÿ9t‹… ÿÿÿ‰$è;‹…lÿÿÿ‹°‰µÿÿÿ‹‡./‹4‰L$‰$è;‹ú/‰D$‰L$‹µ$ÿÿÿ‰4$èø:‹‡./‹š7‰\$ —¢‰T$‰L$‰$èÒ:‹ú/‰D$‰L$‰4$è¼:‹‡v0‰\$‰D$‹…ÿÿÿ‰$è :‹·./…Àt6‹‡v0‰\$‰D$‹…ÿÿÿ‰$èz:‹š7‰D$ ‡²‰D$‰L$닇š7‰\$ ²‰L$‰D$‰4$è@:‹ú/‰þ‰D$‰L$‹…$ÿÿÿ‰$è":‹¾./‹†20‰\$‰D$‹…ÿÿÿ‰$è:„ÀŽÒ†ÂEÈ‹†š7‰L$ ŽÂ‰L$‰D$‰<$èÏ9‹Žú/‰÷‰D$‰L$‹…$ÿÿÿ‰$è±9‹µÿÿÿF;µÿÿÿ‚Eþÿÿ‹‡ª0(ÿÿÿ‰L$ hÿÿÿ‰L$‰D$‹… ÿÿÿ‰$ÇD$èj9…À‰…ÿÿÿ…þÿÿ‹E…Àt‰D$‹…$ÿÿÿ‰$è9‹E…Àt‰D$‹…ÿÿÿ‰$èú8Ä ^_[]Ë… ÿÿÿ‰D$ ‹…ÿÿÿ‰D$‹… ÿÿÿ‰D$‡’‰$è 7éfüÿÿU‰åSWVì¬è^fïÀ)EØ)EÈ‹†ý(Mˆ‰L$ MȉL$‰D$‹E‰$ÇD$1ÿè£8…À‰…|ÿÿÿ„‹EЋ‰…hÿÿÿ0É‹†u÷‰…lÿÿÿ‹†q÷‰…pÿÿÿ‹†åö‰ó‰…tÿÿÿˆ{ÿÿÿˆzÿÿÿÆ…yÿÿÿÇE„1ö‹EЋhÿÿÿ9t ‹E‰$è8‹EÌ‹ °‹ƒu,‰D$‰ $‰M€è8‰Ç‹…lÿÿÿ‹‹ƒ…,‰L$‰D$‰<$èó7…Àu Æ…yÿÿÿéá‹…pÿÿÿ‹‹ƒ…,‰L$‰D$‰<$èÅ7…Àu Æ…{ÿÿÿ鳋…tÿÿÿ‹‹ƒ…,‰L$‰D$‰<$è—7…Àu Æ…zÿÿÿé…‹ƒ…,‹5 ‰L$‰D$‰<$èk7…Àue‹ƒy,‰D$‹E€‰$èR7‰Ç‹ƒ…,‹E ‰L$‰D$‰<$è47ÇE„…Àu'‹ƒ…,‹U ‰L$‰D$‰<$è 7…À•À¶À‰E„F;µ|ÿÿÿ‚¯þÿÿ‹ƒý(Mˆ‰L$ MȉL$‰D$‹E‰$ÇD$èÊ6…À‰…|ÿÿÿ…tþÿÿ1ÿ€½yÿÿÿt"€½{ÿÿÿt€½zÿÿÿt ¿ƒ}„u¿‰øÄ¬^_[]ÃU‰åSWVƒì,è[‹ƒH$‹‹ä'‰L$‰$è[6‰E싃H$‹‹ä'‰L$‰$è@6‰E苃`&‹Üú‰L$‰D$‹E‰$è6…Àt`‹ƒ„ô‹0‹»%‹ƒ`&‹Üú‰L$‰D$‹E‰$èí5‹‹„-‰D$ ‰t$‰L$‰<$èÓ5‹‹ä%‰D$‰L$‹Eì‰$èº5‹ƒ`&»Ìù‰|$‰D$‹E‰$è›5…Àt`‹ƒpô‹0‹ƒ%‰E䋃`&‰|$‰D$‹E‰$èm5‹‹„-‰D$ ‰t$‰L$‹Eä‰$èP5‹‹ä%‰D$‰L$‹Eì‰$è75‹ƒ`&»Üù‰|$‰D$‹E‰$è5…Àt`‹ƒ`ô‹0‹ƒ%‰E䋃`&‰|$‰D$‹E‰$èê4‹‹„-‰D$ ‰t$‰L$‹Eä‰$èÍ4‹‹ä%‰D$‰L$‹Eì‰$è´4‹ƒ`&»<ú‰|$‰D$‹E‰$è•4…ÀtX‹³%‹ƒ`&‰|$‰D$‹E‰$èr4‹‹„-‰D$ ƒü‰D$‰L$‰4$èR4‹‹ä%‰D$‰L$‹Eì‰$è94‹ƒ`&»ìù‰|$‰D$‹E‰$è4…Àt`‹ƒdô‹0‹ƒ%‰E䋃`&‰|$‰D$‹E‰$èì3‹‹„-‰D$ ‰t$‰L$‹Eä‰$èÏ3‹‹ä%‰D$‰L$‹Eì‰$è¶3‹ƒ`&³,ú‰t$‰D$‹E‰$è—3…Àt}‹ƒ`&‰t$‰D$‹E‰$èz3‹‹$&‰L$‰$èh3“¬‹ „ÀEÊ‹ƒhô‹‹ƒ%‹³„-‰L$ ‰T$‰t$‰$è/3‹‹ä%‰D$‰L$‹Eì‰$è3‹ƒ`&»ú‰|$‰D$‹E‰$è÷2…À„ž‹ƒlô‹‰E䋃%‰Eà‹³T$‹ƒ`&‰|$‰D$‹E‰$è¼2‹‹h'‰L$‰$èª2‹‹¼&‰D$ ƒœ‰D$‰L$‰4$èŠ2‹‹„-‰D$ ‹Eä‰D$‰L$‹Eà‰$èj2‹‹ä%‰D$‰L$‹Eì‰$èQ2‹ƒ`&³üù‰t$‰D$‹E‰$è22…À„+‹ƒ`&‰t$‰D$‹E‰$è2‰Ç‹ƒ˜$‹‹&‰L$‰$è÷1‹‹&‰D$‰L$‰<$èá1„Àt‹ƒ€&‰D$‰<$èË1‰Ç‹ƒ@%‹‹ -‰|$‰L$‰$è­1‰Æ‹ƒtô‹‰E䋃%‰Eà‹ƒT$‹‹¼&‰t$ “l‰T$‰L$‰$èq1‹‹„-‰D$ ‹Eä‰D$‰L$‹Eà‰$èQ1‹‹ä%‰D$‰L$‹Eì‰$è81‹ƒ@%‹‹|,‰t$ ‰|$‰L$‰$è1‹‹ä%‰D$‰L$‹Eè‰$èÿ0‹ƒ`&‹ ú‰L$‰D$‹E‰$èà0…À„˜‹ƒ`&‹ ‰L$‰D$‹u‰4$è¹0‰Ç‹ƒ`&‹ ú‰L$‰D$‰4$è›0‰Æ…ÿu8‹ƒT$‹‹&‰L$‰$è}0‹‹&‰D$‰L$‰4$èg0„Àt», ‹‹*ƒìþ‰D$‰L$…ÿDø‰<$è<0…ÀuuÇEð‹ƒø$‹‹°-Uð‰T$‰t$‰L$‰$ÇD$ÇD$ dèþ/‹Mð…Ʌ鋳T$‹‹\'‰L$‰$èÛ/‹‹+‰D$‰L$‰4$èÅ/‰Æ…öt‹ƒ õ‹‹ƒ%‹“„-‰t$ ‰L$‰T$‰$è—/‹‹ä%‰D$‰L$‹uì‰4$è~/‹ƒõ‹‹ƒ%‹“„-‰|$ ‰L$‰T$‰$èV/‹‹ä%‰D$‰L$‰4$è@/‹ƒ`&»L ‰|$‰D$‹E‰$è!/…Àt`‹ƒ|ô‹0‹ƒ%‰E䋃`&‰|$‰D$‹E‰$èó.‹‹„-‰D$ ‰t$‰L$‹Eä‰$èÖ.‹‹ä%‰D$‰L$‹Eì‰$è½.‹ƒ`&»\ ‰|$‰D$‹E‰$èž.…ÀtX‹³%‹ƒ`&‰|$‰D$‹E‰$è{.‹‹„-‰D$ ƒÌ‰D$‰L$‰4$è[.‹‹ä%‰D$‰L$‹Eì‰$èB.‹ƒ`&»‰|$‰D$‹E‰$è#.…Àt`‹ƒ\ô‹0‹ƒ%‰E䋃`&‰|$‰D$‹E‰$èõ-‹‹„-‰D$ ‰t$‰L$‹Eä‰$èØ-‹‹ä%‰D$‰L$‹Eì‰$è¿-‹ƒ`&»l ‰|$‰D$‹E‰$è -…Àt`‹ƒPô‹0‹ƒ%‰E䋃`&‰|$‰D$‹E‰$èr-‹‹„-‰D$ ‰t$‰L$‹Eä‰$èU-‹‹ä%‰D$‰L$‹Eì‰$è<-‹ƒ`&»| ‰|$‰D$‹E‰$è-…Àt`‹ƒõ‹0‹ƒ%‰E䋃`&‰|$‰D$‹E‰$èï,‹‹„-‰D$ ‰t$‰L$‹Eä‰$èÒ,‹‹ä%‰D$‰L$‹Eì‰$è¹,‹ƒ`&»Œ ‰|$‰D$‹E‰$èš,…Àt`‹ƒXô‹0‹ƒ%‰E䋃`&‰|$‰D$‹E‰$èl,‹‹„-‰D$ ‰t$‰L$‹Eä‰$èO,‹‹ä%‰D$‰L$‹Eì‰$è6,‹ƒ`&»œ ‰|$‰D$‹E‰$è,…Àt`‹ƒTô‹0‹ƒ%‰E䋃`&‰|$‰D$‹E‰$èé+‹‹„-‰D$ ‰t$‰L$‹Eä‰$èÌ+‹‹ä%‰D$‰L$‹Eì‰$è³+‹ƒ`&»,û‰|$‰D$‹E‰$è”+…Àt`‹ƒ€ô‹0‹ƒ%‰E䋃`&‰|$‰D$‹E‰$èf+‹‹„-‰D$ ‰t$‰L$‹Eä‰$èI+‹‹ä%‰D$‰L$‹Eì‰$è0+‹ƒ`&‹ì‰L$‰D$‹E‰$è+‰Æ…öuZ‹ƒXõ‹0‰4$èµ(‰D$‰Eä‰4$è¬(‰Ç‹ƒÀ)‰D$‰<$èØ*‹‹€%‰L$‰$èÆ*‰Æ‰<$èL(‹Eä‰$èA(‹ƒxô‹‹ƒ%‹“„-‰t$ ‰L$‰T$‰$è‰*‹‹ä%‰D$‰L$‹}ì‰<$èp*‹ƒ¬-‰|$ ‰û‹M‰L$‰D$‹E‰$èN*‹E…Àt ‰D$‰4$è *‹E…Àt ‰D$‰$èø)‹E…Àt‰D$‹Eè‰$èâ)ƒÄ,^_[]ÉL$ƒ< ‰$è(é³úÿÿU‰åSWVƒìèX‰EàEð‰D$Ç$vsysè²'‹u‹} ‹]f…À…ª‹Eð=?;…Ût‰ÁÁéƒá‰ÂÁê ƒâkÒ ʉ…ÿt ‰ÁÁéƒá‰…ö„¥ƒà‰é›Eì‰D$Ç$1sysèH'f…ÀuMEè‰D$Ç$2sysè0'f…Àu5Eä‰D$Ç$3sysè'f…Àu…Ût‹E쉅ÿt‹E艅öt=‹Eä‰ë6¿À‰D$‹Eà€ý‰$è'…ÛtÇ …ÿtÇ…ötǃÄ^_[]ÃU‰åWVƒì è_‹E‰Eð‹‡ó0‰Eô‹‡¿‰D$Eð‰$è¨(‰Æ…öt4‹‡ ‰D$‰4$ÇD$è‚(‹‡ ‰D$‰4$ÇD$èh(‰ðƒÄ ^_]ÃU‰åWVƒìè^‹}‹GH‹ŽR‰L$‰$è9(‰}ð‹†~0‰Eô‹†º‰D$Eð‰$è(ƒÄ^_]ÃU‰åSWVƒìè[‹ƒ›‰D$‹u‰4$èí'‰Ç‹ƒŸ‰D$‰4$èÙ'‰Eð‹ƒ«‹;ð‰L$‰D$‰<$èº'‹u…Àu%‹ƒ÷‰D$‹Eð‰$èž'‹‹G‰D$‰L$ë1‹ƒ«‹Kð‰L$‰D$‰<$èr'…Àu‹ƒC‹Mð‰L$‰D$‰4$èU'ƒ~Lt ¸ƒ~Hu)‹ƒ§‹‹‰L$‰$è,'‰Á¸;Mt¸ƒÄ^_[]ÃU‰å1À]ÃU‰å‹E‹@H]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$Hèâ&ƒÄ]ÃU‰å‹E‹@L]ÃU‰å‹E‹M‰AL]ÃU‰åSWVƒì,è[‹ƒr‹‹º‰L$‰$è…&‰E싃†‰D$‹u‰4$èm&‰E苃ЉD$‰4$èX&…À„‘1ö}ñÆEóÆEòÆEñ‹Eè¶0‰D$ƒ§Ÿ‰D$ ‰<$ÇD$ÇD$èÔ$‹ƒ~‹‹2‰|$‰L$‰$èö%‹‹Â‰D$‰L$‹Eì‰$èÝ%‹ƒŠ‰D$‹E‰$FèÇ%9Æ‚tÿÿÿ‹EìƒÄ,^_[]ÃU‰åSWVƒìè_‹‡>‹ž‰L$‰$è%‰E싇’‰D$‹u‰4$èu%…À„Ž1Û‹‡ê‰\$‰D$‰4$ÇD$ èM%‹Ú‰L$‰$è;%‰$ÇD$ÇD$èq%ˆEó‹‡ÎMó‰L$‰D$‹Eì‰$ÇD$ èü$‹‡’‰D$‰4$ƒÃèç$9Âtÿÿÿ‹EìƒÄ^_[]ÃU‰åSWVì\è_‹‡¯‰D$‹]‰$è­$‰…´þÿÿ‹‡«‰D$‰$‹] Kè‘$‰Æ1Àƒû‡Ì‹„ŸøÿàÇD$Ç$èE#‰Ã…Ût‰\$‹…´þÿÿ‰D$‰4$è…!‹‡o‹ÿ‰\$‰L$‰$ÇD$ÇD$ é`ÇD$Ç$èé"‰Ã…Ût‰\$‹…´þÿÿ‰D$‰4$è/!‹‡o‹ÿ‰\$‰L$‰$ÇD$ÇD$ 鉵°þÿÿÇD$Ç$ è‡"‰Ã…Ût7uˆ‰4$èä ‹…´þÿÿ…Àt‰D$‹…°þÿÿ‰D$‰4$èÊ ‰t$‰$è² ‹‡o‹ÿ‰\$‰L$‰$ÇD$ÇD$ 鉵°þÿÿÇD$Ç$@è"‰Ã…Ût:µ¸þÿÿ‰4$èp ‹…´þÿÿ…Àt‰D$‹…°þÿÿ‰D$‰4$èV ‰t$‰$è> ‹‡o‹ÿ‰\$‰L$‰$ÇD$ÇD$ @è¸"Ä\^_[]ÃJ¦…U‰åSWVìœè^‹†'ዉE„‹† ዉE€‹†á‹‹†á‹‹†ÿà‹‹Ž‹¾Ó‰D$‰\$‰T$‹E€‰D$ ‹E„‰D$‰|$‰ $ÇD$è""‰ÂfïÀ)EØ)EÈ‹†«‰u€Mˆ‰L$ MȉL$‰D$‰$‰U„ÇD$èæ!‰Ç0É…ÿt|‹EЋ1ö‹EÐ9t ‹E„‰$è›!‹EÌ‹°‹M€‹‰3‹U‰T$‰L$‰$è£!±…Àt;F9þrÁ‹E€‹€«Mˆ‰L$ MȉL$‰D$‹E„‰$ÇD$èj!‰Ç0É…ÿu‰¶ÁÄœ^_[]ÃU‰åSWVìŒè^‹†ßß‹‹†G‹–‹‰L$‰T$‰$ÇD$ è!‰ÂfïÀ)EØ)EÈ‹†c‰u€Mˆ‰L$ MȉL$‰D$‰$‰U„ÇD$èÚ ‰Ç0É…ÿt|‹EЋ1ö‹EÐ9t ‹E„‰$è ‹EÌ‹°‹M€‹‰ë‹U‰T$‰L$‰$è— ±…Àt;F9þrÁ‹E€‹€cMˆ‰L$ MȉL$‰D$‹E„‰$ÇD$è^ ‰Ç0É…ÿu‰¶ÁÄŒ^_[]ÃU‰åWVƒìè_‹‡×‹‡‹u‰t$‰L$‰$è ˆÁ1À„Ét}‹‡ÃÞ‹‹‡Ë‰L$‰D$‰4$èõˆÁ¸„ÉuT‹‡¿Þ‹‹‡Ë‰L$‰D$‰4$è̈Á¸„Éu+‹‡ÇÞ‹‹‡Ë‰L$‰D$‰4$裈Á1À„Ét¸ƒÄ^_]ÃU‰åWVƒìè_‹‡‹Ò‹u‰t$‰L$‰$èbˆÁ1À„É„¦‹‡Þ‹‹‡‰L$‰D$‰4$è8ˆÁ¸„Éu}‹‡þÝ‹‹‡‰L$‰D$‰4$èˆÁ¸„ÉuT‹‡úÝ‹‹‡‰L$‰D$‰4$èæˆÁ¸„Éu+‹‡öÝ‹‹‡‰L$‰D$‰4$轈Á1À„Ét¸ƒÄ^_]ÃU‰åSWVƒìè_‹E‰E苇÷&‰E싇“ ‰D$Eè‰$è|‰Æ…ötK‹]‹M‹‡ï‰L$‰D$‰4$èT‹‡ó‰\$‰D$‰4$è>‹‡÷‹M‰L$‰D$‰4$è%‰ðƒÄ^_[]ÃU‰åSWVƒìè[‹}‰<$ÇD$èىƉt$‰|$‹ƒ}Ü‹‰$胋ƒ¹ ‹‹I‰|$ ‰t$‰L$‰$ÇD$è·ƒÄ^_[]ÃU‰åVƒìè^‹†? ‹Ž‰L$‰$ÇD$è‚‹Ž‰D$‰L$‹E‰$èiƒÄ^]ÃU‰åSWVƒì è_‹·í ‹‡½‰D$‹]‰$è9‹A‰L$‰$ÇD$è‹™‰D$‰L$‰4$è ‰Æ‹‡Á‰D$‰$èõ‹‰D$‰L$‰4$èß‹‡Å‰D$‰$è͉D$‰4$èí÷ÿÿ‰Æ‹‡É‰t$‰D$‰$è©‹‡Å‰D$‰$è—‰D$‰4$è·÷ÿÿ‹Í‰D$‰L$‰$èu‹‡Ñ‰D$‰$èc‹Õ‰D$‰L$‰$èMƒÄ ^_[]ÃU‰åVƒìè^‹†©‰D$‹E‰$è#Hƒøw)‹Ž¹Ú‹„†Uðÿà‹ŽµÚ닎±Ú닎­Ú닎ÕÚ‹ƒÄ^]ÃfK-5=U‰åVƒìè^‹†¼‰D$‹E‰$貃øu‹†PÚë ƒøt ƒøu‹†LÚ닆TÚ닆dÚ‹ƒÄ^]ÃU‰åSWVƒì è_‹‡c‰D$‹]‰$èY…Àt1öë'‹u‹‡ó‰D$‰$è<‹[ ‰L$‰$è*‰ðƒÄ ^_[]ÃU‰åSWVƒì è_‹‡‰D$‹]‰$èü…Àt1öë'‹u‹‡–‰D$‰$èß‹þ ‰L$‰$è͉ðƒÄ ^_[]ÃU‰åVƒìè^‹†«‰D$‹E‰$è¡ÇD$Ç$èm…Àu1Àë,‹Žc ‹–ó‰D$‰T$‰ $ÇD$ÇD$ èYƒÄ^]ÃU‰åSWVƒìè[‹ƒµ‰D$‹u‰4$è/…Àu ‹ƒáØ‹ë|‹ƒÑ‰D$‰4$è‰Eð‹ƒÉ‰D$‰4$èú‰$èFóÿÿ‰Ç‹ƒ±‰D$‰4$èÞ‰$è*óÿÿ‹‹%‹“ ‰D$‰|$‹Eð‰D$ ƒí‰D$‰T$‰ $襃Ä^_[]ÃU‰åSWVƒìè[‹ƒ‰D$‹}‰<$èy‰Æ‹ƒ‰D$‰<$èe‰$è±òÿÿ‰Ç‹ƒ+Ø‹‹‹o‰Mð‹‹k‰D$‰L$‰4$è4„Àtƒ—êë&‹ƒo‹‹× ‰|$ “÷ì‰T$‰L$‰$è‹‹× ‰D$‰t$ ƒçì‰D$‰L$‹Eð‰$èÛƒÄ^_[]ÃU‰å‹E‹@]ÃU‰å‹E‹M‰A]ÃU‰å‹E‹@]ÃU‰å‹E‹M‰A]ÃU‰åƒì‹E ‰D$‹E‰$ÇD$ ÇD$èsƒÄ]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$èUƒÄ]ÃU‰åƒì‹E ‰D$‹E‰$ÇD$ ÇD$è ƒÄ]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$èìƒÄ]ÃU‰åƒì‹E ‰D$‹E‰$ÇD$ ÇD$ 衃Ä]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$ 胃Ä]ÃU‰åƒì‹E ‰D$‹E‰$ÇD$ ÇD$è8ƒÄ]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$èƒÄ]ÃU‰åƒì‹E ‰D$‹E‰$ÇD$ ÇD$èσÄ]ÃU‰åƒì‹E‰D$ ‹E ‰D$‹E‰$ÇD$ÇD$ÇD$豃Ä]ÃU‰åWVƒìè_‹·_‹‡›‹K‰L$‰$è`‹Ã‰L$‰$èN‹Ç‰D$ ‡÷é‰D$‰L$‰4$è.ƒÄ^_]ÃU‰åSWVƒìè_0ɿՄôЇeõ<u Šfõéß‹‡5‹å‰L$‰$èÙ‹ñ‰L$‰$èljƋŸù‹‡­ ‰D$‹E‰$誋a‰D$ ‡¡é‰D$‰L$‰$芋µ‰D$‰L$‰4$èt‹ý—±é‰T$‰L$‰$èX‰ÆÆ‡eõ‹‡Q‹±‰L$‰$è7‹¹‰t$‰L$‰$è!0É„Àt Ƈfõ±¶ÁƒÄ^_[]ÃU‰åèX€§è]ÃU‰åWVƒìè_‹‡ ‰D$‹u‰4$èÓ„Àu‹‡Ý‰D$‰4$è½ë,‹‡… ‰D$‰4$è©‹‰ ‰D$‰L$‰4$è“„ÀtÀƒÄ^_]ÃU‰åƒìèX‹M‰Mø‹ˆ ‰Mü‹€E‰D$Eø‰$è^ƒÄ]ÃU‰åSWVƒìLè[0À»-Ó„ï‹MÇEØ}؉}ÜÇEàÇE䃉EèƒI‰Eì‰Mð‹ƒ5‹‹Ù ‰L$‰$èç‹‹y‰L$‰$èÕ‹‹1Ó‰L$‰$èG‰Æ‹E‰p‰Á…öu0Û}ØëY‹ƒ5Ó‰E¸ÇE¼BÇEÀƒj‰Eă©ò‰EÈẺD$‰Ë‰$èD‰}ÐE¸‰D$‰4$èø‹C‰$è᳉<$ÇD$èõˆØ¶ÀƒÄL^_[]Ãfff.„U‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$ƒè°ƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$ƒèƒÄ]ÃU‰åSWVƒì è^‹] ‰$蟋};†)Ñ…Ä;ž9ÑuƒÇé’;ž5Ñu^‹†1Ñ‹‰Ù‹ž­‰D$‰ $è>‹Ža‰D$‰L$‰$èh‰D$†…æ‰$èp‹G‹@‰$è8‹GÇ@놕æ‰$èH‹G‹@‹@‹ŽÁ‰L$‰$ƒÇè‹‹@‹@‹Ž•‰L$‰$èöƒÄ ^_[]ËG‹@‹@‹Žq ‰\$ë×ffff.„U‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èN‹G‰D$ƒÆ‰4$ÇD$è4ƒÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$è‹F‰$ÇD$èüƒÄ^]ÃU‰åSWVƒìè_‹u‰4$è ‹];‡”Ïu!‹‡,‰D$‰$苇‰D$‰$ët;‡˜Ïu׋‡„ÿ‹à‰t$‰L$‰$è܉Ƌ‡$å‰L$‰D$‰4$辉Ë‡È å‰L$‰D$‰$è „Àt‹‡Ü‰D$‹E‰$臃Ä^_[]ˇÈ0å‰L$‰D$‰$èc„À„Û‹‡$@å‰L$‰D$‰4$è?‹è‰L$‰$è-ˆÃ‹‡$På‰L$‰D$‰4$è‰Æ‹E‹@„ÛtI…À„tÿÿÿ‹h‹—è‰T$‰L$‰$èß„À„Pÿÿÿ‹U‹B‹è‰t$ ‰T$‰L$é+ÿÿÿ…À„+ÿÿÿ‹h‹—ì‰T$‰L$‰$è–„À„ÿÿÿ‹U‹B‹ì뵋‡È`å‰L$‰D$‰$èd„Àt ‹‡üé¿þÿÿ‹‡Èpå‰L$‰D$‰$è9„Àt ‹‡é”þÿÿ‰]ð‹‡$Ÿ€å‰\$‰D$‰4$è …Àt7‹‡$‰\$‰D$‰4$èñ‹è‰L$‰$èß„Àt ‹‡(é:þÿÿ‹‡$pÙ‰L$‰D$‰4$贋؉L$‰$袉ˇ$€Ù‰L$‰D$‰4$脉D$‰\$‡å‰$èˆ ‹‡È å‰L$‰D$‹Eð‰$èO„Àt û”„ßþÿÿ‹‡,éžýÿÿU‰åSWVƒì è[‹}ƒu0Àé©ÇD$ÇD$Ç$證ƋƒZ‰D$‹E‰$èâ ‰D$ƒ‹‰D$‰4$è’‹ƒ†þ‰D$‰<$èº ‹‹Ò‰L$‰$è¨ ‰Ç‰|$ƒ6‹‰D$‰4$è\‰<$èx‹E‹@‰t$‰$è‰4$è^°¶ÀƒÄ ^_[]ÃU‰å¸]ÃU‰åèX€·á]ÃU‰å¸]ÃU‰åèX€¬á]ÃU‰åSWVƒìLè[‹}‰<$èà ;ƒnË…„‹³öú‰<$è¢ ‹‹¾‰D$‰L$‰4$èÒ ‰Æ‹ƒþˉEØÇEÜBÇEàƒE‰E䃒ë‰EèEì‰D$‹E‰$èe Eð‰D$‰4$èV E؉D$‰<$è% éŸ;ƒfË…„‹³âú‰<$èÄ ‹‹Âý‰D$‰L$‰4$èB ‰Æ‹ƒþˉE¸ÇE¼BÇEÀƒX‰Eă²ë‰EÈẺD$‰4$èØ EЉD$‹E‰$èÆ E¸‰D$‰<$èG é;ƒRËu$‰<$èÎ ‹‹îú‹“¢‰D$‰T$‰ $éÜ;ƒbËu‰<$è$ ‹‹úú‹“^ü¶ÀëÏ;ƒVËu‰<$èo ‹‹úú‹“Züë±;ƒNËu‰<$èo ‹‹úú‹“²üë“;ƒZËu‰<$è! ‹ƒúú‹‹¦Ý\$ëV1ö;ƒ^ËuZ‰<$èÇ ‰Æ‰<$èà ‰Ç‹ƒºû‹‹ü‰L$‰$è ‹‹Ú‰|$ ‰t$‰L$‰$èç ‹‹ü‰L$‰$èÕ ‰Æ‰ðƒÄL^_[]ÃU‰åSWVƒìè_‹‡›ø‹Kÿ‹U ‰T$‰L$‰$ÇD$ è“ ‰Æ‹]‹C‹c‹U‰T$‰L$‰$èr …Àt‹K‹—ú‰t$ ‰D$‰T$‰ $èQ ¸ƒÄ^_[]ÄU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$辋G‰D$ƒÆ‰4$ÇD$褃Ä^_]ÀU‰åVƒì‹u‹F‰$ÇD$è‹F‰$ÇD$èlƒÄ^]ÃU‰åWVƒìè_‹E‹p‹@‹Q‹U‰T$‰L$‰$è† ‹ù‰D$‰L$‰4$èp ¸ƒÄ^_]ÄU‰åWVƒì‹} ‹G‰D$‹uF‰$ÇD$èÞ‹G‰D$ƒÆ‰4$ÇD$èăÄ^_]ÀU‰åVƒì‹u‹F‰$ÇD$蟋F‰$ÇD$范Ä^]ÃU‰åSWVƒì\è[ÇEàEà‰EäÇEèÇEìÇEð‹ƒèö‹‹Xø‰L$‰$è‹‹\ø‰D$‰L$‹}‰<$èt„Àt_ÇD$ÇD$Ç$è ‹Mä‰A‹ƒ¸Ç‰EÈÇEÌBÇEЃ­‰EÔƒŒç‰EØEà‰EÜ‹ƒ|MÈ鳋ƒ¨ö‹‹Xø‰L$‰$èù‹‹\ø‰D$‰L$‰<$èã„Àt‹ƒüü‰D$‰<$è͉$è»é|‹ƒt÷‹‹Xø‰L$‰$訋‹\ø‰D$‰L$‰<$è’„Àt7‹ƒ°ù‰D$‰<$è|‰Æ‹ƒ´ù‰D$‰<$èh‰D$‰4$èøé‹ƒìö‹‹Xø‰L$‰$è?‹‹\ø‰D$‰L$‰<$è)„ÀtC‹ƒÔø‰D$‰<$è‰Æ‹ƒ°ù‰D$‰4$èÿ‰Ç‹ƒ´ù‰D$‰4$èë‰D$‰<$닃Ìö‹‹Xø‰L$‰$èÊ‹‹\ø‰D$‰L$‰<$è´„ÀtgÇD$Ç$è‹Mä‰A‹ƒ¸Ç‰E°ÇE´BÇE¸ƒm‰E¼ƒ¬ç‰EÀEà‰EÄ‹ƒ(úM°‰L$‰D$‰<$èNé ‹ƒ´ö‹‹Xø‰L$‰$è1‹‹\ø‰D$‰L$‰<$è„À„Õ‹ƒÇ98uÇ$èué´‹ƒÇ98u Ç$ë㋃€‰D$‰<$èӉƃT:‰D$‰4$èû…Àu$‹ƒ„‰D$‰<$詉$ÇD$è›ëSƒÌK‰D$‰4$èÁ…Àu#‹ƒˆ‰D$‰<$èo‰$Áø‰D$èD닃Œ‰D$‰<$èXÝ$è‹Mä‰A‹Eä‹pEà‰$ÇD$èÕ‰ðƒÄ\^_[]ÃU‰åSWVƒì è_‹‡¹ü‰D$‹E‰$è÷‰Æ…öt9‹E ‹M‹I‹I‹Y‹Aù‰L$‰$èЉt$‰D$‰$茉4$è¨ƒÄ ^_[]Ã@U‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$è0ƒÄ]ÃDU‰åƒì‹E‹@‰$ÇD$èƒÄ]ÃU‰åVƒìèX‹€ûû‰D$‹E ‰$è9‰Æ…öt(‹E‹@‹@‹@‰t$‰$ÇD$ÿÿÿÿè…‰4$èûƒÄ^]Ãf„U‰åƒì‹E ‹@‰D$‹EƒÀ‰$ÇD$考Ä]ÃDU‰åƒì‹E‹@‰$ÇD$è`ƒÄ]ÃU‰åSWVƒì è[Ç$èΉDžÿu ³Uˉðé’‹ƒéö‰D$‰<$èk‹‹©ò‰L$‰$èY‰Æ‰<$èß‹ƒéó‹%؉L$‰D$‰4$è3„Àt«‹ƒ‰ô‰D$‰4$è‰Ç‹ƒ‰ô‰D$ƒ%؉$è)Ç‹ƒ}ö‰|$‰D$‰4$èëƒÄ ^_[]Ãÿ%€ÑÀÿ%„ÑÀÿ%ˆÑÀÿ%ŒÑÀÿ%ÑÀÿ%”ÑÀÿ%˜ÑÀÿ%œÑÀÿ% ÑÀÿ%¤ÑÀÿ%¨ÑÀÿ%¬ÑÀÿ%°ÑÀÿ%´ÑÀÿ%¸ÑÀÿ%¼ÑÀÿ%ÀÑÀÿ%ÄÑÀÿ%ÈÑÀÿ%ÌÑÀÿ%ÐÑÀÿ%ÔÑÀÿ%ØÑÀÿ%ÜÑÀÿ%àÑÀÿ%äÑÀÿ%èÑÀÿ%ìÑÀÿ%ðÑÀÿ%ôÑÀÿ%øÑÀÿ%üÑÀÿ%ÒÀÿ%ÒÀÿ%ÒÀÿ% ÒÀÿ%ÒÀÿ%ÒÀÿ%ÒÀÿ%ÒÀÿ% ÒÀÿ%$ÒÀÿ%(ÒÀÿ%,ÒÀÿ%0ÒÀÿ%4ÒÀÿ%8ÒÀÿ%<ÒÀÿ%@ÒÀÿ%DÒÀÿ%HÒÀÿ%LÒÀÿ%PÒÀÿ%TÒÀÿ%XÒÀÿ%\ÒÀÿ%`ÒÀÿ%dÒÀÿ%hÒÀÿ%lÒÀÿ%pÒÀÿ%tÒÀÿ%xÒÀÿ%|ÒÀÿ%€ÒÀÿ%„ÒÀÿ%ˆÒÀÿ%ŒÒÀÿ%ÒÀÿ%”ÒÀÿ%˜ÒÀÿ%œÒÀÿ% ÒÀÿ%¤ÒÀÿ%¨ÒÀÿ%¬ÒÀÿ%°ÒÀÿ%´ÒÀÿ%¸ÒÀÿ%¼ÒÀÿ%ÀÒÀÿ%ÄÒÀÿ%ÈÒÀÿ%ÌÒÀÿ%ÐÒÀÿ%ÔÒÀÿ%ØÒÀÿ%ÜÒÀÿ%àÒÀÿ%äÒÀÿ%èÒÀÿ%ìÒÀÿ%ðÒÀÿ%ôÒÀÿ%øÒÀÿ%üÒÀÿ%ÓÀÿ%ÓÀÿ%ÓÀÿ% ÓÀÿ%ÓÀÿ%ÓÀÿ%ÓÀÿ%ÓÀÿ% ÓÀÿ%$ÓÀÿ%(ÓÀÿ%,ÓÀÿ%0ÓÀÿ%4ÓÀÿ%8ÓÀÿ%<ÓÀÿ%@ÓÀÿ%DÓÀÿ%HÓÀÿ%LÓÀÿ%PÓÀÿ%TÓÀÿ%XÓÀÿ%\ÓÀÿ%`ÓÀÿ%dÓÀÿ%hÓÀÿ%lÓÀÿ%pÓÀÿ%tÓÀÿ%xÓÀÿ%|ÓÀÿ%€ÓÀÿ%„ÓÀÿ%ˆÓÀÿ%ŒÓÀÿ%ÓÀÿ%”ÓÀÿ%˜ÓÀÿ%œÓÀÿ% ÓÀÿ%¤ÓÀÿ%¨ÓÀÿ%¬ÓÀÿ%°ÓÀÿ%´ÓÀÿ%¸ÓÀÿ%¼ÓÀÿ%ÀÓÀÿ%ÄÓÀÿ%ÈÓÀÿ%ÌÓÀÿ%ÐÓÀÿ%ÔÓÀÿ%ØÓÀÿ%ÜÓÀÿ%àÓÀÿ%äÓÀÿ%èÓÀÿ%ìÓÀÿ%ðÓÀÿ%ôÓÀÿ%øÓÀÿ%üÓÀÿ%ÔÀÿ%ÔÀÿ%ÔÀÿ% ÔÀÿ%ÔÀÿ%ÔÀÿ%ÔÀÿ%ÔÀhé†hé|h,érhBéhh^é^h{éThŠéJhšé@h²é6hÉé,hâé"húéhéh*éhRéúhpéðh’éæh°éÜhÅéÒhßéÈhñé¾h é´hBéªhbé hzé–h éŒh¶é‚hËéxhæénhédhéZh5éPhMéFh`é<hpé2h†é(hªéhÁéhÏé hßéhôéöh éìh éâh.éØhZéÎhtéÄh‘éºhºé°hÌé¦hôéœhé’h#éˆh9é~hIétheéjh†é`h§éVhÁéLhÚéBhüé8hé.h8é$hNéhkéhéh¡éüh¼éòhÙéèh÷éÞhéÔhéÊh0éÀhIé¶hYé¬hqé¢h‡é˜h–éŽh¤é„h»ézhÔéphëéfhé\h0éRhNéHhgé>hé4h—é*h¶é hÕéhöé h! éhK éøhm éîh† éähœ éÚh² éÐhÉ éÆhØ é¼hå é²hú é¨h éžh$ é”h9 éŠhM é€h` évh} élhŒ ébh© éXh» éNhÓ éDhâ é:hñ é0h é&h éh( éhA éh` éþh éôh  éêh½ éàhÚ éÖhû éÌh éÂh4 é¸hI é®hc é¤h~ éšh™ éh² é†hÈ é|hÞ érhô éhh é^h éTh% éJh? é@hN é6h] é,hl é"hƒ éh› éh´ éhÐ éúhì éðhéæhéÜh=éÒh[éÈhé¾h¨é´hÀéªhßé hûé–héŒh6é‚hWéxhyénh›édh¼éZhÖéPhóéFhé<h!é2h=é(hQéhkéhé h§éhÐÀÿ%ÐÀNSMutableArrayallocinitNSDistributedNotificationCenterdefaultCenterreleaseretainbestRegistrationDictionaryautorelease_applicationNameForGrowlSearchingRegistrationDictionary:%@GrowlApplicationBridge: Cannot register because the application name was not supplied and could not be determined_applicationIconDataForGrowlSearchingRegistrationDictionary:_growlIsReady:Lend Me Some Sugar; I Am Your Neighbor!addObserver:selector:name:object:NSProcessInfoprocessInfoprocessIdentifierNSString%@-%d-%@GrowlClicked!initWithFormat:growlNotificationWasClicked:respondsToSelector:removeObserver:name:object:%@-%@GrowlTimedOut!growlNotificationTimedOut:reregisterGrowlNotificationsGrowlApplicationBridgenotifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:identifier:NSMutableDictionaryNotificationNameinitWithObjectsAndKeys:NotificationTitlesetObject:forKey:NotificationDescriptionNotificationIconNotificationClickContextNSNumbernumberWithInteger:NotificationPrioritynumberWithBool:NotificationStickyGrowlNotificationIdentifiernotifyWithDictionary:_growlIsReachableUpdateCache:notificationDictionaryByFillingInDictionary:GrowlXPCCommunicationAttemptcanCreateConnectionGrowlXPCNotificationAttemptinitWithDictionary:GrowlGNTPNotificationAttemptsetDelegate:attemptsaddObject:GrowlApplicationBridgeNotificationAttemptsetNextAttempt:beginregisterWithDictionary:isMistEnabled_fireMiniDispatch:v4@?0ADefaultNotificationsvalueForKey:AllNotificationsindexOfObject:NSIndexSetclassisKindOfClass:containsIndex:NSArraycountobjectAtIndex:numberWithUnsignedInteger:containsObject:NSUserDefaultsstandardUserDefaultscom.growl.growlframework.mist.enabledboolValuecom.growl.growlframework.mist.defaultonlyisNotificationDefaultEnabled:GrowlMiniDispatchgrowlDelegatedisplayNotification:Attempting to register while an attempt is already runningregistrationDictionaryByFillingInDictionary:GrowlXPCRegistrationAttemptGrowlGNTPRegistrationAttemptGrowlApplicationBridgeRegistrationAttemptsetApplicationName:registrationDictionaryForGrowlNSBundlemainBundleGrowl Registration TicketgrowlRegDictpathForResource:ofType:NSDictionarydictionaryWithContentsOfFile:GrowlApplicationBridge: The bundle at %@ contains a registration dictionary, but it is not a valid property list. Please tell this application's developer.bundlePathregistrationDictionaryFromDelegateregistrationDictionaryFromBundle:GrowlApplicationBridge: The Growl delegate did not supply a registration dictionary, and the app bundle at %@ does not have one. Please tell this application's developer.registrationDictionaryByFillingInDictionary:restrictToKeys:mutableCopyApplicationNameobjectForKey:ApplicationIconAppLocationbundleURLfile-dataremoveObjectForKey:ApplicationIdApplicationPIDinitWithInt:com.growl.growlframeworkapplicationNameForGrowlprocessNameapplicationIconForGrowlapplicationIconDataForGrowlNSImagePNGRepresentationNSWorkspacesharedWorkspaceiconForFile:NSAutoreleasePooluserInfoClickedContextdraincountByEnumeratingWithState:objects:count:growlIsReadyNSNotificationCenterpostNotificationName:object:userInfo:_emptyQueueisGrowlRunning_checkSandboxNSRunningApplicationcom.Growl.GrowlHelperApprunningApplicationsWithBundleIdentifier:absoluteStringGrowl.prefpane/Contents/ResourcesrangeOfString:options:%@ could not reach Growl, You are running Growl version 1.2.2 or older, and %@ is sandboxed%@ could not reach Growl, %@ is sandboxed and does not have the ability to talk to Growl, contact the developer to resolve thisContainers/%@/DatabundleIdentifierstringWithFormat:hasSuffix:hasNetworkClientEntitlementattemptTypenextAttemptFailed all attempts at %@notifyingregisteringremoveObject:dictionary@8@0:4setGrowlDelegate:v12@0:4@8notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:v36@0:4@8@12@16@20i24c28@32v40@0:4@8@12@16@20i24c28@32@36c12@0:4@8c8@0:4setShouldUseBuiltInNotifications:v12@0:4c8shouldUseBuiltInNotificationsisGrowlInstalledv8@0:4setWillRegisterWhenGrowlIsReady:willRegisterWhenGrowlIsReady@12@0:4@8@16@0:4@8@12frameworkInfoDictionaryc12@0:4c8attemptDidSucceed:attemptDidFail:finishedWithAttempt:queueAndReregister:notificationClicked:context:v16@0:4@8@12notificationTimedOut:context:NSObjectsetRegistrationDictionaryForGrowl:deallocGrowlApplicationBridgeDelegateinitWithAllNotifications:defaultNotifications:setApplicationNameForGrowl:setApplicationIconDataForGrowl:GrowlDelegateregistrationDictionary@"NSDictionary"@"NSString"@"NSData"T@"NSString",&,VapplicationNameForGrowlT@"NSData",&,VapplicationIconDataForGrowlT@"NSDictionary",&,VregistrationDictionarylaunchDatecompare:bundleWithURL:bundleForProcessWithBundleIdentifier:com.growl.prefpanelbundleWithIdentifier:runningHelperAppBundlestringByDeletingLastPathComponentpathExtensionlowercaseStringprefpaneisEqualToString:bundleWithPath:NSFileManagerdefaultManagerPreferencePanesstringByAppendingPathComponent:Growl.prefPanefileExistsAtPath:compare:options:enumeratorAtPath:nextObjectprefPaneskipDescendentsarrayWithCapacity:isWritableFileAtPath:ScreenshotsTicketsPluginsERROR: GrowlPathUtil was asked for directory 0x%x, but it doesn't know what directory that is. Please tell the Growl developers.Application Support/GrowlfileExistsAtPath:isDirectory:searchPathForDirectory:inDomains:mustBeWritable:createDirectoryAtPath:withIntermediateDirectories:attributes:error:growlSupportDirectorynextScreenshotNameInDirectory:GrowlPathUtilitiesscreenshotsDirectorycontentsOfDirectoryAtPath:error:NSMutableSetinitWithCapacity:stringByDeletingPathExtensionScreenshot %lluticketsDirectorygrowlTicketstringByAppendingPathExtension:growlPrefPaneBundlehelperAppBundle@20@0:4i8L12c16searchPathForDirectory:inDomains:@16@0:4i8L12nextScreenshotNamedefaultSavePathForTicketWithApplicationName:_CFURLAliasData_CFURLString_CFURLStringTypeWARNING: createFileURLWithAliasData called with NULL aliasDatabyteslengthin createFileURLWithAliasData: Could not allocate an alias handle from %lu bytes of alias data (data follows) because PtrToHand returned %li %@in createFileURLWithAliasData: Could not resolve alias (alias data follows) because FSResolveAlias returned %li - will try path %@NSURLinitFileURLWithPath:isDirectory:in createFileURLWithAliasData: FSCopyAliasInfo returned a NULL pathfilein createAliasDataForURL: FSNewAlias for %@ returned %liintValuegetFileSystemRepresentation:maxLength:in createDockDescriptionWithURL: Cannot copy Dock description for a NULL URLsetValue:forKey:numberWithInt:sizeadjustSizeToDrawAtSize:setScalesWhenResized:NSGraphicsContextcurrentContextsetImageInterpolation:drawInRect:fromRect:operation:fraction:bestRepresentationForSize:setSize:representationOfSize:representationsbestRepresentationForRect:context:hints:bestRepresentationForDevice:performSelector:withObject:isBycopyreplacementObjectForPortCoder:TIFFRepresentationNSBitmapImageRepimageRepWithData:GrowlBitmapImageReprepresentationUsingType:properties:drawScaledInRect:operation:fraction:v32@0:4{CGRect={CGPoint=ff}{CGSize=ff}}8L24f28{CGSize=ff}16@0:4{CGSize=ff}8@16@0:4{CGSize=ff}8JPEGRepresentationGrowlImageAdditionsBundlePathNSScreenmainScreenvisibleFramewindowframeNo screen real estate left, putting in queuev16@?0@4L8^c12FenumerateObjectsUsingBlock:insertObject:atIndex:setFrame:display:fadeInarrayinsertWindow:BremoveObjectsInArray:NotificationAppIconapplicationIconImageinitWithData:GrowlMistWindowControllerinitWithNotificationTitle:text:image:sticky:userInfo:delegate:queueWindow:dequeueWindowsdelegatemistViewDismissed:animationShouldStart:animationDidStop:animationDidEnd:animation:valueForProgress:f16@0:4@8f12animation:didReachProgressMark:v16@0:4@8f12NSAnimationDelegateisEqual:hashL8@0:4superclass#8@0:4selfzone^{_NSZone=}8@0:4performSelector:@12@0:4:8@16@0:4:8@12performSelector:withObject:withObject:@20@0:4:8@12@16isProxyc12@0:4#8isMemberOfClass:conformsToProtocol:c12@0:4:8Vv8@0:4retainCountdescriptionmistNotificationDismissed:mistNotificationClicked:closeAllNotifications:windows@"NSMutableArray"queuedWindows@T@,N,VdelegateinitWithFrame:NSBezierPathboundsbezierPathWithRoundedRect:xRadius:yRadius:NSParagraphStyledefaultParagraphStylemutableCopyWithZone:setLineBreakMode:NSFontboldSystemFontOfSize:NSColorwhiteColorsystemFontOfSize:NSTrackingAreainitWithRect:options:owner:userInfo:addTrackingArea:removeTrackingArea:imageSizedToDimensionSquaring:flippedImagesetFrame:sizeWithAttributes:boundingRectWithSize:options:attributes:saveGraphicsStatecolorWithDeviceWhite:alpha:setfillsetLineWidth:strokedrawInRect:drawInRect:withAttributes:restoreGraphicsStatesetNeedsDisplay:mistViewSelected:modifierFlagscloseAllNotifications@24@0:4{CGRect={CGPoint=ff}{CGSize=ff}}8setNotificationImage:v24@0:4{CGRect={CGPoint=ff}{CGSize=ff}}8isOpaqueisFlippedsizeToFitdrawRect:mouseEntered:mouseExited:mouseDown:notificationTextsetNotificationText:notificationTitlesetNotificationTitle:notificationImageNSViewGrowlMistView@"NSImage"notificationTitleAttrsnotificationTitleFont@"NSFont"notificationTextAttrsnotificationTextFontclipPath@"NSBezierPath"strokePathtrackingArea@"NSTrackingArea"selectedcˆ*T@"NSString",&,N,VnotificationTitleT@"NSString",&,N,VnotificationTextT@"NSImage",&,N,VnotificationImageNSPanelinitWithContentRect:styleMask:backing:defer:initWithWindow:setBecomesKeyOnlyIfNeeded:setHidesOnDeactivate:setCanHide:setContentView:setOpaque:clearColorsetBackgroundColor:setLevel:setCollectionBehavior:setAcceptsMouseMovedEvents:setOneShot:NSTimerlifetimeExpired:scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:invalidatestopAnimationsetAlphaValue:orderFront:dictionaryWithObjectsAndKeys:arrayWithObject:NSViewAnimationinitWithViewAnimations:setAnimationBlockingMode:setDuration:startAnimationorderOut:fadeOut@32@0:4@8@12@16c20@24@28stickyvisibleNSWindowControllermistView@"GrowlMistView"fadeAnimation@"NSViewAnimation"lifetime@"NSTimer"closedTc,R,N,VstickyTc,R,N,VvisibleTc,R,N,VselectedT@,R,N,VuserInfoinitWithSize:lockFocussetShouldAntialias:NSAffineTransformtransformtranslateXBy:yBy:scaleXBy:yBy:concatunlockFocusimageSizedToDimensionScalingUp:imageSizedToDimension:@12@0:4i8GrowlAdditionsstopAttemptsfinishedstoppedAttempts:makeNextAttemptOfClass:@12@0:4#8queueAndReregistersucceededfailederrorsetError:GrowlCommunicationAttemptL@"GrowlCommunicationAttempt"@""@"NSError"T@"NSDictionary",R,N,VdictionaryTL,R,N,VattemptTypeT@"GrowlCommunicationAttempt",&,N,VnextAttemptT@"",N,VdelegateT@"NSError",&,N,VerrorfileURLWithPath:%@-%u-%@substringToIndex:NSPropertyListSerializationdataFromPropertyList:format:errorDescription:writeToFile:atomically:GrowlApplicationBridge: Error writing registration dictionary at %@GrowlApplicationBridge: Error writing registration dictionary at %@: %@GrowlApplicationBridge: Registration dictionary follows %@%@: Could not create open-document event to register this application with GrowldataUsingEncoding:%@: Could not set direct object of open-document event to register this application with Growl because AEStreamWriteKeyDesc returned %li/%s%@: Could not finish open-document event to register this application with Growl because AEStreamClose returned %li/%s%@: Could not send open-document event to register this application with Growl because AESend returned %li/%sapplicationNameT@"NSString",C,N,VapplicationNameobjectNSConnectionGrowlApplicationBridgePathwayconnectionWithRegisteredName:host:connectionDidDie:rootProxyregisterApplicationWithDictionary:c12@0:4O@8postNotificationWithDictionary:Vv12@0:4O@8growlVersionO@8@0:4GrowlNotificationProtocolsetProtocolForProxy:Received a fake GrowlApplicationBridgePathway object. Some other application is interfering with Growl, or something went horribly wrong. Please file a bug report.NSExceptionGrowlApplicationBridge: exception while sending notification: %@growlProxygrowlConnection@"NSConnection"@"NSProxy"GrowlGNTPOutgoingPacketoutgoingPacketOfType:forDict:packetGrowlGNTPCommunicationAttempt"expectsCallbacksynchronouslySetDelegate:%@ failed because %@setResponseParseErrorString:setBogusResponse:GrowlGCDAsyncSocketinitWithDelegate:delegateQueue:hostisLocalHostlocalhostconnectToHost:onPort:withTimeout:error:Failed to connect: %@NSMutableDataCRLFDatadataWithData:appendData:copyreadDataToData:withTimeout:tag:GNTPKeyinitWithPassword:hashAlgorithm:encryptionAlgorithm:setKey:writeToSocket:readOneLineFromSocket:tag:initWithData:encoding: componentsSeparatedByString:Not enough, or too many components in initial headercouldNotParseResponseWithReason:responseString:disconnectGNTP/1.0Response from Growl or other notification system was patent nonsenseNSCharacterSetwhitespaceAndNewlineCharacterSetstringByTrimmingCharactersInSet:We shouldn't have encryption on a response from localhostreadRestOfPacket:Unrecognized response type: %@GrowlGNTPHeaderItemheaderItemFromData:error:separatorHeaderItemparseErrorparseFeedbackheaderNameError-CodeError-DescriptionheaderValueintegerValueFailed to notify due to missing registration, queue and reregisterNo error code, assuming failedCPListcaseInsensitiveCompare:propertyListWithData:options:format:error:codeGot disconnected: %@responseParseErrorStringdictionaryWithObject:forKey:NSErrorerrorWithDomain:code:userInfo:v16@0:4@8l12socket:didConnectToHost:port:v20@0:4@8@12S16socket:didReadData:withTag:v20@0:4@8@12l16socketDidDisconnect:withError:bogusResponsesetHost:passwordsetPassword:callbackHeaderItemssetCallbackHeaderItems:connection^{_xpc_connection_s=}8@0:4setConnection:v12@0:4^{_xpc_connection_s=}8@"GrowlGNTPOutgoingPacket"socket@"GrowlGCDAsyncSocket"callbackTypeattemptSucceededresponseReadTypei^{_xpc_connection_s=}T@"NSString",&,N,VhostT@"NSString",&,N,VpasswordT^{_xpc_connection_s=},N,VconnectionT@"NSArray",&,N,VcallbackHeaderItemsT@"NSString",&,N,VresponseParseErrorStringT@"NSString",&,N,VbogusResponseGCDAsyncSocketExceptionGCDAsyncSocketErrorDomainGCDAsyncSocketSSLCipherSuitesGCDAsyncSocketSSLDiffieHellmanParametersinitWithLength:increaseLengthBy:mutableBytesinitWithData:startOffset:maxLength:timeout:readLength:terminator:tag:@40@0:4@8L12L16d20L28@32l36ensureCapacityForAdditionalDataOfLength:v12@0:4L8optimalReadLengthWithDefault:shouldPreBuffer:L16@0:4L8^c12readLengthForNonTermWithHint:L12@0:4L8readLengthForTermWithHint:shouldPreBuffer:readLengthForTermWithPreBuffer:found:L16@0:4@8^c12searchForTermAfterPreBuffering:l12@0:4l8GrowlGCDAsyncReadPacketbuffer@"NSMutableData"startOffsetbytesDonemaxLengthtimeoutdreadLengthtermbufferOwneroriginalBufferLengthtagla0initWithData:timeout:tag:@24@0:4@8d12l20GrowlGCDAsyncWritePacket@initWithTLSSettings:GrowlGCDAsyncSpecialPackettlsSettingsinitWithDelegate:delegateQueue:socketQueue:closeWithError:setDelegate:synchronously:AsetDelegateQueue:synchronously:BsetDelegate:delegateQueue:synchronously:acceptOnInterface:port:error:Error in socket() functionerrnoErrorWithReason:Error enabling non-blocking IO on socket (fcntl)Error enabling address reuse (setsockopt)Error in bind() functionError in listen() functioni12@?0i4@8Attempting to accept without a delegate. Set a delegate first.badConfigError:Attempting to accept without a delegate queue. Set a delegate queue first.Both IPv4 and IPv6 have been disabled. Must enable at least one protocol first.isDisconnectedAttempting to accept while connected or accepting connections. Disconnect first.removeAllObjectsgetInterfaceAddress4:address6:fromDescription:port:Unknown interface. Specify valid interface by name (e.g. "en1") or IP address.badParamError:IPv4 has been disabled and specified interface doesn't support IPv6.IPv6 has been disabled and specified interface doesn't support IPv4.localPort4doAccept:Q`ENSDatadataWithBytes:length:newSocketQueueForConnectionFromAddress:onSocket:setupReadAndWriteSourcesForNewlyConnectedSocket:socket:didAcceptNewSocket:C Attempting to connect without a delegate. Set a delegate first.Attempting to connect without a delegate queue. Set a delegate queue first.Attempting to connect while connected or accepting connections. Disconnect first.connectToHost:onPort:viaInterface:withTimeout:error:preConnectWithInterface:error:lookup:host:port:AstartConnectTimeout:uconnectToAddress:viaInterface:withTimeout:error:A valid IPv4 or IPv6 address was not givenIPv4 has been disabled and an IPv4 address was passed.IPv6 has been disabled and an IPv6 address was passed.connectWithAddress4:address6:error:uloopback%huUTF8StringgaiError:lookup:didFail:Alookup:didSucceedWithAddress4:address6:AIPv4 has been disabled and DNS lookup found no IPv6 address.otherError:IPv6 has been disabled and DNS lookup found no IPv4 address.endConnectTimeoutportFromAddress:didConnect:Error in connect() functiondidNotConnect:error:RconnectedHostconnectedPortCmaybeDequeueReadmaybeDequeueWritedoConnectTimeoutPconnectTimeoutErrorendCurrentReadendCurrentWritesetLength:resumeReadSourceresumeWriteSourcemaybeClosestringWithCString:encoding:kCFStreamErrorDomainNetDBstringWithUTF8String:Error code definition can be found in Apple's SecureTransport.hkCFStreamErrorDomainSSLGCDAsyncSocketConnectTimeoutErrorAttempt to connect to host timed outGCDAsyncSocketlocalizedStringForKey:value:table:GCDAsyncSocketReadMaxedOutErrorRead operation reached set maximum lengthGCDAsyncSocketReadTimeoutErrorRead operation timed outGCDAsyncSocketWriteTimeoutErrorWrite operation timed outGCDAsyncSocketClosedErrorSocket closed by remote peerconnectedHostFromSocket4:connectedHostFromSocket6:connectedPortFromSocket4:connectedPortFromSocket6:localHostFromSocket4:localHostFromSocket6:localPortFromSocket4:localPortFromSocket6:hostFromAddress4:hostFromAddress6:portFromAddress4:portFromAddress6:initWithBytes:length::doReadDatadoReadEOFdoWriteDatareadDataWithTimeout:buffer:bufferOffset:maxLength:tag:readDataToLength:withTimeout:buffer:bufferOffset:tag:readDataToData:withTimeout:buffer:bufferOffset:maxLength:tag:removeObjectAtIndex:maybeStartTLSsetupReadTimerWithTimeout:usingCFStreamsuspendReadSourcecontinueSSLHandshakereplaceBytesInRange:withBytes:length:readMaxedOutErrorsslError:Error in read() functionappendBytes:length:completeCurrentReadsocket:didReadPartialDataOfLength:tag:BconnectionClosedErrorsocketDidCloseReadStream:dataWithBytesNoCopy:length:freeWhenDone:DdoReadTimeoutsocket:shouldTimeoutReadWithTag:elapsed:bytesDone:doReadTimeoutWithExtension:qreadTimeoutErrorsetupWriteTimerWithTimeout:suspendWriteSourceError in write() functioncompleteCurrentWritesocket:didWritePartialDataOfLength:tag:socket:didWriteDataWithTag:doWriteTimeoutsocket:shouldTimeoutWriteWithTag:elapsed:bytesDone:doWriteTimeoutWithExtension:writeTimeoutErrorsslReadWithBuffer:length:sslWriteWithBuffer:length:Error in SSLNewContextError in SSLSetIOFuncsError in SSLSetConnectionError in SSLSetPeerDomainNameError in SSLSetAllowsAnyRootError in SSLSetAllowsExpiredRootsError in SSLSetEnableCertVerifyError in SSLSetAllowsExpiredCertsError in SSLSetCertificateshortValueError in SSLSetEnabledCiphersError in SSLSetDiffieHellmanParamssocketDidSecure:getHost:port:fromAddress: initWithSocketQueue:@12@0:4^{dispatch_queue_s=}8@16@0:4@8^{dispatch_queue_s=}12@20@0:4@8^{dispatch_queue_s=}12^{dispatch_queue_s=}16v16@0:4@8c12delegateQueue^{dispatch_queue_s=}8@0:4v16@0:4^{dispatch_queue_s=}8c12setDelegateQueue:v12@0:4^{dispatch_queue_s=}8synchronouslySetDelegateQueue:getDelegate:delegateQueue:v16@0:4^@8^^{dispatch_queue_s}12v20@0:4@8^{dispatch_queue_s=}12c16setDelegate:delegateQueue:v16@0:4@8^{dispatch_queue_s=}12synchronouslySetDelegate:delegateQueue:autoDisconnectOnClosedReadStreamsetAutoDisconnectOnClosedReadStream:isIPv4EnabledsetIPv4Enabled:isIPv6EnabledsetIPv6Enabled:isIPv4PreferredOverIPv6setPreferIPv4OverIPv6:userDatasetUserData:acceptOnPort:error:c16@0:4S8^@12c20@0:4@8S12^@16c12@0:4i8c16@0:4@8^@12connectToHost:onPort:error:c28@0:4@8S12d16^@24c32@0:4@8S12@16d20^@28connectToAddress:error:connectToAddress:withTimeout:error:c24@0:4@8d12^@20c28@0:4@8@12d16^@24v20@0:4i8@12S16v20@0:4i8@12@16v16@0:4i8@12c20@0:4@8@12^@16v12@0:4i8v16@0:4d8disconnectAfterReadingdisconnectAfterWritingdisconnectAfterReadingAndWritingerrnoError@12@0:4l8isConnectedS8@0:4localHostlocalPortconnectedHost4connectedHost6connectedPort4connectedPort6localHost4localHost6localPort6S12@0:4i8connectedAddresslocalAddressisIPv4isIPv6v24@0:4^@8^@12@16S20readDataWithTimeout:tag:v20@0:4d8l16readDataWithTimeout:buffer:bufferOffset:tag:v28@0:4d8@16L20l24v32@0:4d8@16L20L24l28readDataToLength:withTimeout:tag:v24@0:4L8d12l20v32@0:4L8d12@20L24l28v24@0:4@8d12l20readDataToData:withTimeout:buffer:bufferOffset:tag:v32@0:4@8d12@20L24l28readDataToData:withTimeout:maxLength:tag:v28@0:4@8d12L20l24v36@0:4@8d12@20L24L28l32writeData:withTimeout:tag:startTLS:l16@0:4^v8^I12l16@0:4r^v8^I12performBlock:v12@0:4@?8socketFDi8@0:4socket4FDsocket6FDsslContext^{SSLContext=}8@0:4@12@0:4^{sockaddr_in=CCS{in_addr=I}[8c]}8@12@0:4^{sockaddr_in6=CCSI{in6_addr=(?=[16C][8S][4I])}I}8S12@0:4^{sockaddr_in=CCS{in_addr=I}[8c]}8S12@0:4^{sockaddr_in6=CCSI{in6_addr=(?=[16C][8S][4I])}I}8hostFromAddress:S12@0:4@8c20@0:4^@8^S12@16CRDataLFDataZeroDataflagsSconfig^{dispatch_queue_s=}connectIndexconnectInterface4connectInterface6socketQueueaccept4Source^{dispatch_source_s=}accept6SourceconnectTimerreadSourcewriteSourcereadTimerwriteTimerreadQueuewriteQueuecurrentRead@"GrowlGCDAsyncReadPacket"currentWrite@"GrowlGCDAsyncWritePacket"socketFDBytesAvailablepartialReadBuffer^{SSLContext=}sslReadBuffersslWriteCachedLengthB„initWithAction:GNTP/1.0 %@ %@actionencryptionkey %@stringByAppendingFormat:stringByAppendingString:GNTPRepresentationAsStringGNTPRepresentationGNTPOutgoingIteminitialHeaderItemWithAction:setAction:setEncryption:GrowlGNTPInitialHeaderItemmActionmEncryptionmKeyT@"NSString",&,VmActionT@"NSString",&,VmEncryptionT@"NSString",&,VmKeyconnectionTypeGNTP/1.0 END %s%sendHeaderIteml8@0:4setConnectionType:v12@0:4l8GrowlGNTPEndHeaderItem_connectionTypeTl,V_connectionTypeoutgoingPacketsetGrowlDictionary:This shouldn't happen; outgoingPacketOfType called with GrowlGNTPOutgoingPacket_OtherTypeGrowlNotificationGNTPPacketgetHeaders:binaryChunks:notificationID:forNotificationDict:setPacketID:GrowlRegisterGNTPPacketgetHeaders:andBinaryChunks:forRegistrationDict:addHeaderItems:addBinaryChunks:dictionaryRepresentationobjectForInfoDictionaryKey:namegenerateSaltgenerateKeyaddObjectsFromArray:encryptionAlgorithmdataencrypt:GrowlGNTPEncryptedHeadersGrowlGNTPBinaryChunkidentifierchunkForData:withIdentifier:outgoingItemscallbackResultSendBehaviorForHeaders:NSMutableStringstring<%@: %x: "appendFormat:Binary chunk %@, length %d appendString:">addHeaderItem:addBinaryChunk:packetIDneedsPersistentConnectionForCallback@16@0:4i8@12outgoingPacketForNotification:outgoingPacketForRegistrationWithNotifications:growlDictionaryheaderItemssetHeaderItems:binaryChunks@"GNTPKey"T@"GNTPKey",&,VmKeyT@"NSDictionary",&,VgrowlDictionaryT@"NSMutableArray",&,VheaderItemsNONEMD5SHA1SHA256SHA512AESDES3DESCLICKEDCLOSEDTIMEDOUTCLICKCLOSETIMEOUTREGISTERNOTIFYSUBSCRIBE-OK-ERROR-CALLBACKApplication-NameApplication-IconNotifications-CountNotification-NameNotification-Display-NameNotification-EnabledNotification-IconNotification-IDNotification-TitleNotification-TextNotification-StickyNotification-PriorityNotification-Callback-ContextNotification-Callback-Context-TypeNotification-Callback-TargetSubscriber-IDSubscriber-NameSubscriber-PortSubscription-TTLNotification-Callback-ResultNotification-Callback-TimestampOrigin-Machine-NameOrigin-Software-NameOrigin-Software-VersionOrigin-Platform-NameOrigin-Platform-VersionX-X-Application-BundleIDX-Application-PIDData-initForData:error:setHeaders:headers@16@0:4@8^@12_headersT@"NSData",&,V_headerssetHeaderName:setHeaderValue:isEqualToData:: GrowlNetworkMalformed header "%@"; "name: value" not foundsubstringWithRange:%@: %@ <%@ %p: name=%@, value=%@>headerItemWithName:value:initWithData:identifier:setData:setIdentifier:Identifier: %@ Length: %lu stringThatPrecedesTheDatastringThatFollowsTheData%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02xidentifierForBinaryData:_data_identifierT@"NSData",&,V_dataT@"NSString",&,V_identifierNSCalendarinitWithCalendarIdentifier:setFirstWeekday:NSTimeZonedefaultTimeZonesetTimeZone:makeCalendarWithDesiredConfigurationdateComponentsFromString:timeZone:dateComponentsFromString:timeZone:range:NSDatedateNSDateComponentscomponents:fromDate:parsesStrictlytimeSeparatoryearmonthday(%@) parsing month; segment is %lu and ch is %s(%@) found %lu digits and one hyphen, so this is either -YY or -YY-MM; segment (year) is %lu(%@) month is %luUTCtimeZoneWithAbbreviation:numberWithDouble:timeZoneForSecondsFromGMT:setYear:setDay:setHour:setMinute:setSecond:setMonth:dateFromString:timeZone:dateFromString:timeZone:range:dateFromComponents:dateFromString:stringWithCharacters:length:replaceOccurrencesOfString:withString:options:range:stringFromDate:timeZone:formatyyyy-MM-ddstringFromDate:formatString:timeZone:weekDateStringForDate:timeZone:yyyy-DDDself.format was %d, not calendar (%d), week (%d), or ordinal (%d)raise:format:'T'%@HH:mm:ssreplaceColonsInString:withTimeSeparator:NSDateFormattersetFormatterBehavior:setDateFormat:setCalendar:stringForObjectValue:secondsFromGMTZ%+.2d%.2dstringFromDate:components:fromDate:toDate:options:weekdayHH:mm:ssZ%lu-W%02lu-%02lu%@setDefaultTimeZone:dateComponentsFromString:@16@0:4@8o^@12@20@0:4@8o^@12o^{_NSRange=II}16getObjectValue:forString:errorDescription:c20@0:4^@8@12^@16@16@0:4@8S12@20@0:4@8@12@16initializepurgeGlobalCachessetParsesStrictly:setFormat:includeTimesetIncludeTime:setTimeSeparator:v12@0:4S8NSFormatterGrowlISO8601DateFormatterlastUsedFormatStringunparsingFormatter@"NSDateFormatter"parsingCalendar@"NSCalendar"unparsingCalendar@"NSTimeZone" T@"NSTimeZone",&,N,VdefaultTimeZoneTc,VparsesStrictlyTL,VformatTc,VincludeTimeTS,VtimeSeparatorResponse-ActionsetResponseAction:receivedHeaderItem:i12@0:4@8callbackResultSendBehaviorresponseActionGrowlGNTPPacketGrowlOkGNTPPacket T@"NSString",&,N,VresponseActionGrowlNetworkUtilitieslocalHostNameGNTP Notification Received HeadersReceivedGNTP Notification Sent-ByFrom %@ by %@ with Growl%@; %@Growl Internal Notification ID id %@Sent-ByGNTP Origin-Machine-Name%lu.%lu.%lubundleForClass:GrowlGrowl.frameworkinfoDictionaryMac OS XpacketDidFinishReading:packetDidDisconnect:packet:failedReadingWithError:packet:willChangePacketIDFrom:to:v20@0:4@8@12@16GrowlGNTPPacketDelegateaddSentAndReceivedHeadersFromDict:toArray:mDelegate@""customHeadersbinaryDataByIdentifier@"NSMutableDictionary"pendingBinaryIdentifiers@"NSMutableSet"currentBinaryIdentifiercurrentBinaryLengthspecificPacket@"GrowlGNTPPacket"originPacketwasInitiatedLocallynetworkReadComplete T@"",VmDelegatex-growl-resource://%@setWithArray:unsignedIntegerValueBogus default notifications array from application %@: %@ contains indexes that are outside the range of all-notifications array %@HumanReadableNames%iYesnov20@0:4^@8^@12@16currentStepregistrationDictnotificationscurrentNotificationapplicationIconIDmApplicationIconURL@"NSURL"numberOfNotifications Notification-Callback-Target-MethodGETPOSTNotification-Coalescing-IDNoNotificationCallbackClickContextTypeStringdataWithPropertyList:format:options:error:Error creating PList XML: %@NotificationCallbackURLTargetNotificationCallbackURLTargetMethodGNTP Origin-Software-NameGNTP Origin-Software-VersionGNTP Origin-Platform-NameGNTP Origin-Platform-Versinv24@0:4^@8^@12^@16@20notificationDicticonIDiconURLcallbackTargetMethod Unable to obtain system version: %ldsetErrorDescription:setErrorCode:errorDescriptionerrorCodeGrowlErrorGNTPPacket T@"NSString",&,N,VerrorDescriptionTl,N,VerrorCode%02xarrayWithObjects:isSupportedEncryptionAlgorithm:isSupportedHashAlgorithm:setHashAlgorithm:setEncryptionAlgorithm:generateSalt:setSalt:salthashAlgorithmsetEncryptionKey:setKeyHash:generateIVsetIV:keyHashIVhashAlgorithmString%@:%@.%@encryptionAlgorithmString%@%@:%@@20@0:4@8i12i16decrypt:encryptionAlgorithmFromString:hashingAlgorithmFromString:encryptionKey_hashAlgorithm_encryptionAlgorithm_password_salt_encryptionKey_keyHash_iv%Ti,V_hashAlgorithmTi,V_encryptionAlgorithmT@"NSData",&,V_encryptionKeyT@"NSData",&,V_keyHashT@"NSString",&,V_passwordT@"NSData",&,V_saltT@"NSData",&,V_iv%@.GNTPClientServiceContents/XPCServices/%@XPCBundleIDxpcerehwonestablishConnectionpurposesendMessageWithPurpose:Connection Invalid error for XPC service (%@)Unexpected error for XPC servicehandleReply:v8@?0^v4xpcObjectToNSObject:GrowlActionTypereregisterfeedbackClickedContextstoppedAttemptsfinishedAttemptSuccessFailed with code %ld, "%@"notificationGrowlDictTypenewXPCObjectGrowlDictv12@0:4^v8xpcConnectionnotificationUuidregistrationdictionaryWithCapacity:B12@?0r*4^v8B12@?0L4^v8v16@?0@4@8^c12enumerateKeysAndObjectsUsingBlock:objCTypeunsignedLongValuelongValuedoubleValue^v8@0:4@12@0:4^v8NSObject_XPCHelpers.local?¿ÿÿÿÿÿÿÿÿÿÿÿÿ Á A@A CXBÀ@À@0C°<N@š™™™™™¹?00%e°HHJH =_ÚNI Ñ ÞYvlÅqFgŽ4¥`! #/$$,%m%+&ã&0JýJÀQ€RS TðT&UæXYkY›Y‹(Œ6Œ:ŽJ¥Ж!— ˜p˜¦˜ Ùöž€ ס,¢ ¢Å¢ù¥\¦ߦå§œ¨³«A¬­€­Ð­¤®Ю ¯V¯À¯h°€°Ð°à±›²Û³ ´´àµ0¶f¶Þ¶‘·À·¸ð¸A¹ñ¹º`º@»‘»C¼p¼À¼ ½ñ½¤¾о ¿ÀQÀ,ÁpÁÀÁ|Â0ÃfæÃ0ǀǶÇÀÍÎ=ÎàÎ1Ï`ÏÐoÐõÓpÔÐÔ@Õ‰Õ°×QØàÛ0ÜpÜÝÝÞàá€âïâPç çÖç`èÐèé}íðíAîÀîïPï ïÖï0ò òéòˆôõpõöYöðø`ùú úñúQûÐû!üüýQý±ý0þþÿÝÿÎ<»'ØP†7`°æ°  6  p À ö ÀF-€ÐÂP†pÀö§ÀF÷`–@&‘&'a' 'ñ'0(ˆ(4)Ò)p+À+ö+E,ð-@.v.x/`1°1æ1@=°=ù=S? @V@€BC\C·C E€EðEÃG@H HIYI)J°KL6L`SÐSTpUàU)V„VÖWPXÀX“Z[p[à[)\ù\°^_6_Õb=c!mðm&nÓnÑoˆp®qœrðéUêuë†ëôë)ìPí¡í°îï6ïó`ó@ööÆöp÷¦÷Ðû!ü€üÑüzR| ˆ˜{ýÿ_A„B D†8Û{ýÿ{A„B F†‡ƒX6ýÿA„B t+ýÿcA„B rýÿÑA„B E†‡°#ƒýÿ*A„B F†‡ƒÐ-†ýÿ3A„B ìH†ýÿ+A„B \†ýÿ!A„B $a†ýÿPA„B F†‡ƒD‘ˆýÿ½A„B F†‡ƒd.‰ýÿA„B €&‰ýÿA„B œ‰ýÿUA„B F†‡ƒ¼QŠýÿ A„B Ø?ŠýÿA„B ô6Šýÿ›A„B F†‡ƒ±Œýÿ5A„B 0ÊŒýÿA„B LÂŒýÿA„B h¸ŒýÿYA„B D†„õŒýÿ¬A„B F†‡ƒ¤ýÿ A„B E†‡ÄŽýÿ5A„B àŽýÿéA„B F†‡ƒã‘ýÿ8A„B F†‡ƒ û“ýÿ'A„B <”ýÿ¦A„B D†X”ýÿqA„B E†‡xá•ýÿ¢A„B F†‡ƒ˜c–ýÿ¢A„B F†‡ƒ¸å–ýÿA„B I†‡ƒØÍ—ýÿoA„B F†‡ƒø™ýÿ¬A„B E†‡¨šýÿ#A„B F†‡ƒ8«›ýÿPA„B D†Tß›ýÿ­A„B E†‡tlœýÿAA„B D†‘œýÿ¾A„B F†‡ƒ°/ýÿ\A„B D†Ìoýÿ\A„B D†zR| ˆäÀýÿA„B E†‡<CÁýÿNA„B E†‡\qÁýÿ|A„B F†‡ƒ|ÍÁýÿ™A„B I†‡ƒœFÆýÿ¤A„B F†‡ƒ¼ÔÇýÿ±A„B E†‡ÜtÈýÿ‚A„B D†øÚÈýÿ&A„B F†‡ƒàÉýÿmA„B F†‡ƒ88ÊýÿIA„B E†‡XhÊýÿ6A„B D†t‚ÊýÿA„B F†‡ƒ”hÌýÿÝA„B F†‡ƒ´%ÍýÿÝA„B F†‡ƒÔâÍýÿ3A„B ðùÍýÿRA„B E†‡+Îýÿ A„B ,Îýÿ%A„B zR| ˆþÿ˜A„B E†‡<xþÿA„B XcþÿA„B tNþÿŽA„B E†‡”¼þÿJA„B E†‡´æþÿ,A„B F†‡ƒÔòþÿA„B E†‡ôâþÿ[A„B D†!þÿÜA„B F†‡ƒ0Ýþÿ°A„B F†‡ƒPmþÿ—A„B F†‡ƒpì þÿ+A„B Œ þÿ!A„B ¨ þÿÿA„B F†‡ƒÈä þÿIA„B E†‡è þÿ6A„B D†. þÿA„B I†‡ƒ$#þÿXA„B F†‡ƒDhþÿcA„B E†‡d¸þÿIA„B D†€åþÿA„B F†‡ƒ âþÿ A„B ¼Ñþÿ<A„B Øñþÿ A„B ôàþÿ<A„B þÿ A„B ,ïþÿ<A„B Hþÿ A„B dþþÿ<A„B €þÿ A„B œ þÿ<A„B ¸-þÿ A„B ÔþÿA„B zR| ˆþÿWA„B F†‡ƒ<;þÿUA„B E†‡\pþÿtA„B F†‡ƒ|Äþÿ%A„B ˜Íþÿ\A„B F†‡ƒ¸ þÿ-A„B F†‡ƒØþÿ«A„B F†‡ƒø¡þÿcA„B E†‡äþÿƒA„B F†‡ƒ8GþÿNA„B E†‡XuþÿjA„B E†‡x¿þÿNA„B E†‡˜íþÿ>A„B ´þÿ=A„B Ð0þÿ<A„B ìPþÿ¸A„B F†‡ƒ èþÿ_A„B F†‡ƒ,'þÿ1A„B HHþÿ+A„B d\þÿ!A„B €aþÿ½A„B F†‡ƒ þÿ+A„B ¼þÿ!A„B Øþÿ)A„B ô,þÿIA„B E†‡\þÿ6A„B D†0vþÿžA„B D†Løþÿ(A„B hþÿIA„B E†‡ˆ8þÿ6A„B D†¤Rþÿ5A„B Àkþÿ5A„B Ü„þÿ¨A„B F†‡ƒü þÿA„B þÿIA„B E†‡88þÿ6A„B D†TRþÿ’A„B D†pÈþÿHA„B D†Œôþÿ+A„B ¨þÿ!A„B Ä þÿ5A„B à&þÿ5A„B ü?þÿ@A„B F†‡ƒ_þÿ:A„B D†8ˆþÿcA„B E†‡XØþÿIA„B D†t þÿ¤A„B D† þÿbA„B D†¬Ô þÿIA„B E†‡Ì!þÿ6A„B D†è!þÿ<A„B >!þÿ<A„B  ^!þÿ³A„B F†‡ƒ@ñ!þÿ!A„B \"þÿIA„B E†‡|4"þÿ6A„B D†˜N"þÿzA„B D†´¬"þÿ(A„B A†ÐÀ"þÿ+A„B ìÔ"þÿ!A„B Ù"þÿ°A„B F†‡ƒ(i#þÿA„B Dl#þÿIA„B E†‡dœ#þÿ6A„B D†€¶#þÿzA„B D†œ$þÿ(A„B A†¸($þÿ+A„B Ô<$þÿ!A„B ðA$þÿ²A„B F†‡ƒÓ$þÿ A„B ,ä$þÿIA„B E†‡L%þÿ6A„B D†h.%þÿzA„B D†„Œ%þÿ(A„B A†  %þÿ+A„B ¼´%þÿ!A„B ع%þÿ³A„B F†‡ƒøL&þÿ!A„B  \&þÿIA„B E†‡4 Œ&þÿ6A„B D†P ¦&þÿzA„B D†l 'þÿ(A„B A†ˆ 'þÿ+A„B ¤ ,'þÿ!A„B À 1'þÿÛA„B F†‡ƒà ì'þÿCA„B D†ü (þÿIA„B E†‡ D(þÿ6A„B D†8 ^(þÿ†A„B D†T È(þÿaA„B E†‡t )þÿIA„B E†‡” <)þÿ6A„B D†° V)þÿ@A„B Ì z)þÿËA„B I†‡ƒì %+þÿ¿A„B F†‡ƒ Ä,þÿIA„B E†‡, ô,þÿ6A„B D†H -þÿhA„B I†‡ƒh V2þÿžA„B F†‡ƒˆ Ø2þÿ+A„B ¤ ì2þÿ!A„B À ñ2þÿ,A„B D†Ü 3þÿžA„B F†‡ƒü „3þÿ+A„B  ˜3þÿ!A„B 4 3þÿ,A„B D†P °3þÿ—A„B E†‡p 04þÿoA„B D†Œ ƒ4þÿ±A„B I†‡ƒ¬ 6þÿÕA„B F†‡ƒÌ É7þÿrA„B E†‡ì $8þÿ+A„B  88þÿ!A„B $ L8þÿcA„B E†‡D œ8þÿIA„B D†` É8þÿ'A„B F†‡ƒ€ Ð:þÿOA„B œ ;þÿRA„B ¸ 9;þÿ{A„B F†‡ƒØ ”<þÿ‰A„B F†‡ƒø ý=þÿ‡A„B F†‡ƒh>þÿIA„B E†‡8˜>þÿ6A„B D†T¼>þÿ—A„B E†‡tJþÿMA„B F†‡ƒ\kJþÿA„B F†‡ƒ|eLþÿ<A„B F†‡ƒœMþÿrA„B E†‡¼ÔMþÿ+A„B ØèMþÿ!A„B ôíMþÿ{A„B F†‡ƒLNþÿIA„B E†‡4|Nþÿ6A„B D†P NþÿIA„B E†‡pÐNþÿ6A„B D†ŒêNþÿÆA„B F†‡ƒ¬Pþÿ‡A„B F†‡ƒÌQþÿcA„B E†‡ìTQþÿIA„B D†QþÿMA„B F†‡ƒ(®QþÿRA„B F†‡ƒHàRþÿkA„B E†‡h8Sþÿ+A„B „LSþÿ!A„B  QSþÿA„B ¼TSþÿ—A„B F†‡ƒÜËSþÿRA„B E†‡üýSþÿA„B F†‡ƒñUþÿ{A„B F†‡ƒ<TVþÿcA„B E†‡\¤VþÿIA„B D†xÑVþÿtA„B D†”)WþÿyA„B E†‡´ŒWþÿ+A„B РWþÿ!A„B ì¥Wþÿ`A„B D†éWþÿ~A„B E†‡(HXþÿ+A„B D\Xþÿ!A„B `aXþÿ`A„B D†|¥Xþÿ~A„B E†‡œYþÿ+A„B ¸Yþÿ!A„B ÔYþÿ`A„B D†ðaYþÿ~A„B E†‡ÀYþÿ+A„B ,ÔYþÿ!A„B HÙYþÿ„A„B E†‡h=ZþÿlA„B D†„ZþÿlA„B D† ÝZþÿ˜A„B F†‡ƒÀU[þÿºA„B F†‡ƒàï[þÿŸA„B F†‡ƒn\þÿnA„B D†À\þÿ³A„B E†‡<S]þÿ³A„B E†‡\æ]þÿ³A„B E†‡|y^þÿ³A„B E†‡œ _þÿ³A„B E†‡¼Ÿ_þÿlA„B D†Øï_þÿ±A„B E†‡ø€`þÿA„B Œ`þÿIA„B E†‡4¼`þÿ6A„B D†PÖ`þÿ±A„B E†‡pgaþÿA„B ŒtaþÿIA„B E†‡¬¤aþÿ6A„B D†È¾aþÿ A„B F†‡ƒè©bþÿ°A„B F†‡ƒHcþÿIA„B E†‡(xcþÿ6A„B D†D’cþÿçA„B F†‡ƒdYdþÿQA„B D†€dþÿIA„B E†‡ Àdþÿ6A„B D†¼Údþÿ A„B F†‡ƒÜÅeþÿ°A„B F†‡ƒüdfþÿIA„B E†‡”fþÿ6A„B D†8®fþÿçA„B F†‡ƒXugþÿQA„B D†t¬gþÿIA„B E†‡”Ügþÿ6A„B D†°ögþÿ6A„B Ìhþÿ6A„B è*hþÿ9A„B Ghþÿ9A„B  dhþÿ6A„B <~hþÿ6A„B X˜hþÿ9A„B tµhþÿ9A„B ÒhþÿhA„B E†‡°iþÿhA„B E†‡ÐbiþÿkA„B E†‡ð­iþÿkA„B E†‡øiþÿhA„B E†‡0@jþÿhA„B E†‡PˆjþÿkA„B E†‡pÓjþÿkA„B E†‡kþÿÛA„B F†‡ƒ°ÙkþÿA„B F†‡ƒÐÐlþÿIA„B E†‡ðmþÿ6A„B D† mþÿÛA„B F†‡ƒ,ÕmþÿA„B F†‡ƒLÄnþÿIA„B E†‡lônþÿ6A„B D†ˆoþÿ±A„B F†‡ƒ¨ŸoþÿA„B ÄœoþÿIA„B E†‡äÌoþÿ6A„B D†æoþÿ±A„B F†‡ƒ wpþÿA„B <tpþÿIA„B E†‡\¤pþÿ6A„B D†x¾pþÿìA„B I†‡ƒ˜Švþÿ#A„B I†‡ƒ¸xþÿA„B F†‡ƒØyþÿ+A„B ôyþÿ!A„B !yþÿtA„B E†‡0€yþÿ+A„B L”yþÿ!A„B h™yþÿ=A„B D†„¼yþÿ+A„B  Ðyþÿ!A„B ¼Õyþÿ=A„B D†Øøyþÿ+A„B ô zþÿ!A„B zþÿA„B ,üyþÿ+A„B D†H zþÿ+A„B D†dzþÿ+A„B D†€)zþÿ+A„B D†œ8zþÿPA„B ¸lzþÿNA„B ÔžzþÿA„B F†‡ƒô€{þÿ™A„B F†‡ƒ ü{þÿIA„B E†‡4 ,|þÿ6A„B D†P F|þÿOA„B l y|þÿ A„B F†‡ƒŒ e}þÿ™A„B F†‡ƒ¬ ä}þÿIA„B E†‡Ì ~þÿ6A„B D†è .~þÿWA„B !i~þÿUA„B  !¢~þÿVA„B ÿÿ+A„B P$>ÿÿ!A„B l)>ÿÿVA„B D†ˆl>ÿÿ+A„B ¤€>ÿÿ!A„B ðÔÀüÔÀøÔÀìÔÀ¸ÔÀ¼ÔÀÀÔÀÄÔÀ¤ÔÀ°ÔÀ´ÔÀÐÔÀÕÀ˜ÔÀˆÔÀ€ÔÀ„ÔÀXÔÀTÔÀPÔÀLÔÀ`ÔÀ\ÔÀdÔÀôÔÀÌÔÀÈÔÀHÔÀÔÀ”ÔÀlÔÀxÔÀhÔÀtÔÀŒÔÀäÔÀ<ÀFÀPÀZÀdÀnÀxÀ‚ÀŒÀ–À ÀªÀ´À¾ÀÈÀÒÀÜÀæÀðÀúÀÀÀÀ"À,À6À@ÀJÀTÀ^ÀhÀrÀ|À†ÀÀšÀ¤À®À¸ÀÂÀÌÀÖÀàÀêÀôÀþÀÀÀÀ&À0À:ÀDÀNÀXÀbÀlÀvÀ€ÀŠÀ”ÀžÀ¨À²À¼ÀÆÀÐÀÚÀäÀîÀøÀÀ ÀÀ À*À4À>ÀHÀRÀ\ÀfÀpÀzÀ„ÀŽÀ˜À¢À¬À¶ÀÀÀÊÀÔÀÞÀèÀòÀüÀÀÀÀ$À.À8ÀBÀLÀVÀ`ÀjÀtÀ~ÀˆÀ’ÀœÀ¦À°ÀºÀÄÀÎÀØÀâÀìÀöÀÀ ÀÀÀ(À2À<ÀFÀPÀZÀdÀnÀxÀ‚ÀŒÀ–À ÀªÀ´À¾ÀÈÀÒÀÜÀæÀðÀúÀÀÀÀ"À,À6À@ÀJÀTÀ^ÀhÀrÀ|À†ÀÀšÀ¤À®À¸ÀÂÀ ?Àè?ÀÔÞÀäÞÀôÞÀßÀßÀ$ßÀ4ßÀDßÀTßÀdßÀtßÀ„ßÀ”ßÀ¤ßÀ´ßÀÄßÀÔßÀäßÀôßÀàÀàÀ$àÀ4àÀDàÀTàÀdàÀtàÀ„àÀ”àÀ¤àÀ´àÀÄàÀÔàÀäàÀôàÀáÀáÀ$áÀ4áÀDáÀTáÀdáÀtáÀ„áÀ”áÀ¤áÀ´áÀÄáÀÔáÀäáÀ:ÈÀÈ’ÀqÈPÀ'ÈÏÀÈØÀ ÈCÀÈIÀÈÀÈEÀÈiÀÈÀÈ’ÀÈÇÀÈìÀÈÿÀÈÀÈ¿ÀÈz À%Ȫ À)È'!À:È9"ÀÈS"À È£"À›È#ÀªÈ‚$ÀÈ $ÀȰ$À ÈÆ$À Èä$À Èò$ÀÈ%ÀÈÝ%ÀÈ£&ÀÈô&À!È-'À[ȉ'ÀÈ (ÀÈ~(ÀȘ(À È¢(À ÈÍ,ÀÈN-ÀÈ•-ÀÈÅ-ÀÈ.ÀÈV.À Èb.ÀÈj.ÀÈr.À€Èó.ÀÈ[0ÀÈ|0À ÈK1ÀÈ[1À Èh1ÀÈy1À>ÈÅ1ÀÈU2À‚Èÿ2ÀCÈC3ÀÈH3À8ȱ3ÀLÈ 6À ÈÙ6À,È7ÀÈÌDÀÈIEÀCÈEÀGÈÕEÀ:ÈFÀPÈtFÀ‹ÈGÀvÈwGÀmÈ.HÀÈ)IÀ£ÈÙIÀ@ÈøJÀÈKÀ ȳKÀȤLÀÈÃLÀ4È3MÀÈOÀÈŒOÀÈwRÀÈRÀÈ©RÀÈÇRÀ(È€VÀȱVÀ0ÈâVÀ)È WÀÈ%WÀÈKWÀ>ÈšWÀJÈåWÀOÈDXÀPÈÚXÀNÈ8YÀDÈ}YÀDÈ€ZÀ?ÈÀZÀKÈ [ÀQÈ\À*È>\À6Èu\À6ÈÓ\ÀÈÜ\ÀÈ5]À<È~]À<Èê]ÀÈþ^ÀÈ._À?Èn_ÀȆ_À!Ȩ_À$ÈÍ_ÀÈÿ_ÀÈ`À)ÈI`ÀÈh`ÀÈ`ÀÈ¡`ÀÈ»`ÀÈÕ`ÀÈbÀÈ“cÀÈûdÀÈfÀÈ,fÀÈCfÀÈ]fÀÈ{fÀȘfÀ!ȺfÀÈÚfÀ!ÈüfÀÈ"gÀÈ@gÀ"È…qÀȪqÀÈŽgÀÈârÀÈórÀÈ‹sÀYÈètÀÈßuÀ ÈøuÀÈ"vÀÈnwÀÈswÀÈwwÀÈ|wÀȃwÀÈŠwÀÈŽwÀÈ’wÀÈ—wÀÈŸwÀȦwÀȯwÀȵwÀÈ»wÀÈÃwÀÈÌwÀÈÓwÀ ÈÝwÀÈáwÀÈèwÀ ÈòwÀÈxÀÈxÀÈ(xÀÈ:xÀÈTxÀÈixÀÈ{xÀÈ‹xÀÈžxÀȰxÀÈÄxÀÈÚxÀÈøxÀ"ÈyÀÈ8yÀ ÈFyÀÈVyÀÈfyÀÈwyÀÈ”yÀÈ´yÀÈÈyÀÈÝyÀÈõyÀÈ zÀÈ"zÀÈ%zÀÈÀN?ÀS@ÀAÀ‚BÀçDÀ!HÀÍIÀnJÀ-ÀW-Àh-À†-À¥-ÀÔ-Àæ-À÷-À .À.À-.À@.À /À+/À\/À /À¶/Àè/Àý/À+0À=0Àk0Àˆ0À¸1À¾1ÀÞ2À3ÀŠ3Àþ3À4À4À#4À;4Àc4Àr4À‰4À±4ÀÌ4ÀÕ4Àë4Àû4À$5ÀA5À]5Àf5À…5À©5À»5ÀÏ5À´6À¿6ÀÌ6ÀÓ6À7À47ÀJ7À\7Àc7Ài7Àz7À¤7À¹7Àá7À 8À-8À<8ÀE8À:À:À¤:Àà:Àö:À ;À$;ÀB;ÀM;Àn;À“;À¤;À¸;À×;Àä;Àî;À<À+<À=<ÀY<À]<Àb<Àp<Àw<Àƒ<Àž<À³<ÀÄ<ÀÖ<Àä<Àç=ÀÀ=À#=Àu=ÀV?Àƒ?À“?À®?ÀÄ?ÀÐ?Àà?Àë?Àö?À @À@À+@ÀG@À[@Àl@À­@À¸@ÀÆ@ÀÕ@Àá@Àÿ@À AÀ8AÀRAÀ_AÀnAÀý9À:À€8ÀxAÀ1:ÀVBÀdBÀnBÀ”BÀžBÀ°BÀ¾BÀÅBÀÑBÀ*À!CÀ.CÀ7CÀe*Àx*Àˆ*À»DÀÕDÀEÀ1EÀaFÀ}CÀ‡CÀHÀLHÀoHÀHÀ‹HÀIÀJÀ¹HÀ†JÀÞJÀŽCÀ KÀ*KÀPKÀpKÀuKÀ‹KÀ”CÀ×KÀàKÀîKÀúKÀÿKÀ¤JÀ'LÀ[LÀcLÀrLÀLÀ¦LÀøLÀ(MÀMÀ±MÀ NÀÎJÀQNÀkNÀNÀŠNÀ˜NÀÀNÀÌNÀjCÀDOÀ\OÀ±*ÀÛ*À‡OÀ¡OÀºOÀßOÀðRÀSÀSÀºUÀæUÀöUÀVÀ9VÀbVÀ›VÀŠWÀ5XÀ•XÀ¦XÀ)YÀÂYÀÍYÀéYÀÿYÀ0ZÀaZÀ^[À“[À²[ÀÉ[Àâ[À¬\Àà\Àë\Àõ\À ]Àr]À»]ÀÍ]ÀÞ]À^À^À-^À PÀ?^ÀP^Àb^Àv^ÀŠ^À™^À©^À´^ÀÅ^ÀePÀ×^Àâ^À_ÀÜ_Àò`À aÀ&aÀ@aÀZaÀpaÀ†aÀœaÀ²aÀÄaÀÖaÀèaÀúaÀbÀbÀ'bÀ3bÀSÀjbÀ bÀÞbÀóbÀcÀcÀ*cÀ‰ÀªŠÀ¿ŠÀ:‹ÀL‹Àl‹À¤PÀ†‹À˜‹À°‹À¾‹À›PÀÇ‹ÀÌ‹ÀÚ‹Àì‹Àø‹ÀŒÀ ŒÀŒÀŒÀ2ŒÀ×ÀïÀŽÀ ŽÀrŽÀˆŽÀ/ÀÀÁÀäÀíÀÿÀ À&ÀÇ(À°ÀÎ(Àà(ÀÀ!ÀÇ(ÀŠÀê(À@)À›À§À\)ÀþÀÀà(ÀÏÀÔ À{)ÀÀsÀ…)ÀÑÀŒ)À®)ÀŽ À¸)À…)À¢ ÀÀà(À´ ÀÖ)À…)À "Àq&À…)À"À[À{)À&"ÀsÀç)ÀÁ$Àî)À®)Àö$À*À…)À %ÀJ#ÀÇ(À%Àm#À,*Àu%À/ÀÇ(À!&Àb!À,*ÀÁ&À:$À6*Àö&ÀOÀ,*Àß*ÀC*ÀÇ(À-ÀVÀ,*À>-ÀÀ,*Àä-ÀöÀà(ÀU/ÀXÀà(À÷/Àe&Àç)À™0ÀAÀà(À¡1À1À[*À3À€&Àç)À¼4Àe*Àà(Àß5Àx*Àà(À/6Àˆ*Àà(ÀÜ6À*Àà(À7À±*ÀÎ*ÀÛ7ÀÛ*ÀÎ*À78À §,À,*Àø:À÷,ÀÇ(ÀÉ<À¨0ÀÇ(Àù<À¼0ÀÇ(ÀÛBÀ+/ÀÌ0À_CÀÜ0Àþ0ÀLGÀ /ÀÇ(ÀˆGÀè/ÀÇ(ÀÓHÀk0ÀÇ(ÀÔIÀ 1ÀÇ(ÀÕJÀ¶/À,*ÀKÀ1À,*ÀWMÀf(À 9ÀÀf(À 9Àì‘Àf(À 9ÀÊ—Àf(À 9À8œÀf(À 9ÀœÀ ²aÀÕnÀƒ€ÀÄaÀÿnÀÀÖaÀ9oÀÀèaÀcoÀ”ÀoÀ,*À§ÀÍ]À®oÀîÀtgÀ¸oÀ8‚À×KÀÇ(À^ƒÀÊoÀÇ(À™ƒÀÑoÀÇ(ÀÔƒÀØoÀÇ(À„ÀrÀ,*ÀL„ÀørÀÇ(ÀˆÀhsÀÇ(Àc‰À†JÀrvÀ¯‰ÀvÀ,*Àü‹ÀžvÀ,*ÀEŒÀQNÀ{zÀn›ÀQNÀ{zÀÜœÀN{À6*À6ÀkNÀÇ(ÀºÀwuÀ6*Àþ¢À.|À,*ÀݦÀ‚Àç)À ©À‚Àç)À{©Àê…ÀÎ*ÀùÉÀbtÀ+ˆÀ‘ÑÀ¢uÀ¿ƒÀ>ÙÀtÀ5ŠÀªÛÀl‹À{)ÀïÀL‹À{)ÀØðÀnŒÀ¿ƒÀäñÀŒÀ¿ƒÀòÀ°‹ÀCÀôÀ×ÀÇ(À ûÀ™À…)ÀüÀf(À 9ÀËÀf(À 9ÀæÀP„ÀÇ(ÀÀù*Àù*ÀÀ0ô Àù*Àù*Àº+À0h Àù*Àù*ÀÕ/À0Ä Àù*Àù*Àò À0ˆ Àù*À>À>À0ù*À¨AÀÇ7À0¨ Àù*Àù*ÀžCÀ0\ Àù*ÀžCÀÈ!À0p Àù*ÀžCÀÀ0„ Àù*À«JÀ«!À0˜ Àù*À«JÀÝÀ0¬ Àù*ÀžCÀ«JÀ0ù*Àù*À¡TÀ0ù*Àù*À`UÀ0ù*Àù*À‘UÀ0ù*Àù*ÀÀ>À€|!À´)Àß>À>ÀÀ¨AÀÇ7À@"À”*À¨ ÀBÀ>À4Àù*ÀžCÀ€"À\+À DÀ>ÀdÀžCÀÈ!ÀÀ"À<,ÀõGÀ(>À”ÀžCÀÀ Ð"Àh,ÀkJÀÄÀ«JÀ«!ÀD ,ÀÉJÀôÀ«JÀÝÀD´,ÀÉJÀ$ÀžCÀ«JÀDì"ÀÔ,ÀÉJÀ4>ÀTÀù*À¡TÀ0t#À.À2UÀ„Àù*À`UÀð#Àp.ÀyUÀ´Àù*À‘UÀ$$À.À¸UÀäÀù*ÀÀDÀù*À*sÀ¤%Àh5ÀÈ ÀQsÀL>ÀtÀù*ÀnJÀ´%À¬5ÀwÀX>À¤Àù*À=uÀ&À¤6ÀØ À¸UÀd>ÀÔÀù*À=NÀ &Àè6Àè Àh{ÀÀù*ÀWuÀ ,&À\7Àø Àh{Àp>À4À‚‚ÀŽ‚À H&Àè7À!ƒÀ|>ÀdÀóƒÀ„ÀL¸&À(9À„Àˆ>À”Àù*ÀóƒÀHÈ&Àl9À!À$‡À”>ÀÄÀóƒÀJtÀd¤'ÀÁˆÀôÀóƒÀåsÀXü'À€ŠÀ$ÀóƒÀèŠÀP0(À¼9ÀýŠÀ >ÀTÀù*ÀLÀ L(À$:ÀÀ¬>À„ÀžCÀ|À ¤(ÀL;ÀpÀ´À|À­À œ;ÀpÀäÀ|À!À °;ÀpÀÀù*À:„À+ÀDÀtÀ¤À˜AÀÔÀÀ4À´AÀdÀ”ÀÄÀôÀ$ÀTÀ„À´ÀäÀÀDÀtÀ¤ÀÔÀÀ4ÀdÀ”ÀÄÀôÀ$ÀTÀ„À´ÀäÀÀÐAÀDÀ+ÀtÀ+À„À+À”À+À+À¤À+À+À´À+ÀÄÀ+ÀÔÀ+ÀäÀ+ÀôÀ+ÀÀ+ÀÀ+À$À+À4À+ÀDÀ+ÀTÀ+ÀpÀ+À+ÀˆÀ+À˜À+À¨À+À¸À+ÀÈÀ+ÀÜÀ+ÀìÀ+À+ÀüÀ+À À+ÀÀ+À,À+À<À+ÀLÀ+À\À0+Àù*ÀL?À(ÔÀç8Àx Àù*À@À8ÔÀç8À˜ ÀúHÀô@ÀrÀAÀrÀ$AÀrÀ8AÀrÀLAÀÒ…À`AÀŒÀ À´ÀÈÀÜÀ À À À, À@ ÀT ÀˆŽÀÀÀÈ+Àß+À'%Àï+Àc%Àû+À H:ÀP:Àb:ÀP:À<8Àp:À ý=À$>ÀP/>Àß+ÀTF>À\>ÀXÕ=Àï+À\f>Àß+À`|>À\>Àd¯=Àï+Àh‘>Àš>Àlª>Àš>Àpµ>ÀÂ>ÀtÔ>ÀÝ>Àx<8Àp:À| »AÀÄAÀ(ÕAÀãAÀ,öAÀÿAÀ0 BÀÝ>À4™AÀÝ>À5 AÀÝ>À6Ô>ÀÝ>À7<8Àp:À8Ô%Àp:À<¼(Àß+Àf(À¸CÀr(ÀºCÀ <8À×CÀŽCÀþCÀåGÀï+À%JÀ5JÀJÀEJÀ ¤JÀ0QÀKQÀRQÀ¡OÀï+À „PÀï+À$iQÀï+À(±PÀP:À,vQÀÝ>À0‡QÀ˜QÀ4pKÀï+À8›PÀï+À<ÝPÀšQÀ@ ¹TÀÀTÀÑTÀ¸CÀÝTÀ¸CÀ çTÀ¸CÀñTÀùTÀûTÀ¸CÀUÀû+À UÀÝ>À$UÀ¸CÀ(,UÀ0UÀ,¹TÀû+ÀÝTÀ¸CÀ,UÀ0UÀ ñTÀùTÀ¬UÀß+ÀáoÀçoÀéoÀçoÀ<8Àp:À*hÀðoÀ ¢nÀ˜QÀ¬nÀ˜QÀpÀ˜QÀpÀû+À$pÀû+À 6pÀðoÀ$BpÀPpÀ(fpÀPpÀ,tpÀPpÀ0pÀPpÀ4ŒpÀPpÀ8˜pÀPpÀ<¢pÀPpÀ@­pÀP:ÀD·pÀP:ÀHÂpÀÎpÀLépÀöpÀPqÀ¸CÀT)qÀÀTÀX¶nÀ;qÀ\JqÀÀTÀ`XqÀ¸CÀd3jÀp:ÀhqrÀï+ÀyrÀï+À…rÀï+À AsÀ0UÀÎvÀß+ÀÞvÀP:ÀúvÀP:À qrÀï+À…rÀwÀDvÀï+À‰zÀû+À˜NÀï+ÀÀNÀï+ÀG|Àû+ÀM|Àï+À ¨‚Àï+À½‚ÀЂÀã‚Àó‚À ƒÀó‚ÀÌ|ÀƒÀ£À¸CÀ›}ÀçoÀJ‚ÀÝ>ÀŒ}ÀÝ>ÀäƒÀï+ÀHKQÀRQÀpKÀï+À†À†À qrÀï+À…rÀwÀ<†ÀP:ÀJ†Àa†Àx†À‘†À DvÀï+À$¡†Àï+À(¹†À¸CÀ,͆À܆À0ï†À0QÀ4ü†ÀÝ>À8‡ÀÝ>À9ŽCÀþCÀ<uÀï+À@^Àï+ÀD=ˆÀ˜QÀHIˆÀa†ÀLZˆÀP:ÀPhˆÀa†ÀT|ˆÀï+ÀXŽˆÀ¢ˆÀ\«ˆÀ˜QÀ`KŠÀa†ÀH\ŠÀï+ÀLcŠÀ¢ˆÀPkŠÀ˜QÀTÍŠÀï+ÀHÞŠÀ0UÀL·ŒÀ˜QÀÆŒÀ˜QÀÛŒÀï+À åŒÀû+ÀëŒÀû+ÀúŒÀû+ÀÀû+ÀQÀšQÀ_Àï+ÀO+À6*À“8À(+Àç)ÀC9À'%ÀÇ(À»9À~+Àà(Àè9Àc%ÀÇ(À$:Àš+Àà(ÀQ:À"ÀÇ(À:À+Àà(Àº:À íÀÇ(Àà[À(+Àç)À_\À 8Àà(À­\Ài7À{)À)]À-8Àç)À²dÀ!Àà(ÀÖfÀý9Àà(ÀÜhÀ:Àà(À¹iÀ1:Àà(À–jÀ<8ÀÇ(ÀkÀúÀà(À&kÀ:Àú<ÀKkÀ(+Àç)À£oÀ#=Àà(ÀÇpÀä;À9=ÀKqÀb=À…)ÀþsÀk=À…)ÀtÀu=Àç)ÀtÀ=À9=ÀsuÀ‰=Àà(ÀyÀ—=Àà(À«yÀ¤=Àà(À?zÀ¯=ÀÇ(À{ÀÀ=Àà(À"{ÀÕ=ÀÇ(À^{Àç=Àà(Ài{Àý=ÀÇ(À¥{À<8ÀÇ(À°{ÀúÀà(À»{Àá7À€AÀà{À(+Àç)À›À\7Àç)À=€À€8Àà(ÀÏÀn8Àà(ÀÊ‚ÀxAÀç)À÷‚ÀE8À®)ÀD„À[@Àà(Àp„ÀÄ<À®)Àž„Àä<Àç)Àq…À™AÀ…)Àã…ÀÔ%ÀÇ(Àï…À AÀ…)Àú…À<8ÀÇ(À†ÀúÀà(À†ÀÔ>À…)À6†ÀíÀÇ(ÀÀÉÀ,*ÀVÀ(+Àç)ÀÿÀHCÀ`CÀbŽÀUÀç)ÀçŽÀjCÀç)ÀìŽÀ!CÀç)ÀPÀ}CÀç)À"À‡CÀç)ÀtÀ.CÀç)ÀØÀ¼(ÀÇ(À‘Àf(À 9À#‘Àr(ÀÇ(À.‘ÀEÀà(À9‘À<8ÀÇ(Àu‘ÀúÀà(À€‘ÀŽCÀÇ(À¥‘À”CÀà(À°‘ÀUÀç)Àö‘ÀåGÀÇ(Àƒ—Àò!Àà(ÀŽ—À(+Àç)ÀÔ—ÀoHÀà(Àx˜ÀJÀÇ(ÀL™ÀUÀç)ÀR›À¤JÀÇ(ÀBœÀ¤JÀÇ(ÀšœÀÎJÀ…)ÀèœÀ(+Àç)À@À¤JÀÇ(ÀØÀÎJÀ…)ÀßÀ‡CÀç)ÀæÀøLÀÎ*ÀtžÀUÀç)À¾žÀ NÀà(ÀêŸÀrLÀþOÀú À PÀ)PÀU¡À9PÀUPÀ1¢ÀNÀç)Àá¦ÀŠNÀç)ÀVªÀePÀÎ*À‰¯À¡OÀÇ(À¦°À KÀà(À±°À„PÀÇ(Àí°À*KÀà(Àø°ÀpKÀÇ(À4±À’PÀà(À?±À›PÀÇ(À{±À¤PÀà(À†±À±PÀÇ(À±ÀÅPÀà(ÀͱÀÝPÀèPÀ ²ÀQÀQÀ²ÀSÀeSÀ0²ÀSÀªSÀ‡³À´SÀâSÀܳÀðSÀTÀP´ÀTÀâSÀu´ÀCTÀiTÀÑ´ÀwTÀ—TÀþ¶À(+Àç)À©·À6UÀPUÀ ¸À(+Àç)À¸À|UÀ,*ÀݸÀ(+Àç)ÀG¹À„íÀÇ(À•¹À•gÀªgÀÓ¹ÀPKÀÇgÀºÀºUÀçgÀLºÀ(+Àç)À¼À<8ÀÇ(Àñ½ÀöUÀhÀ¶¿ÀúÀà(ÀÁÀÞJÀà(À;ÁÀ*hÀ8hÀpÁÀVÀRhÀ¶ÂÀrhÀ„hÀáÃÀ¡hÀ„hÀÄÀÀhÀÛhÀKÄÀ9VÀühÀ‰ÆÀiÀ:iÀÈÀZiÀ:iÀRÈÀ‚iÀ…)ÀŽÈÀ£iÀ®)ÀöÉÀÈiÀ…)ÀñÊÀÖiÀ®)ÀFÌÀæiÀ…)ÀAÍÀôiÀ®)À¦ÎÀjÀ…)À¡ÏÀjÀ®)ÀÑÀ3jÀÇ(ÀÒÀÀ¯=À?Àý=À+?À<8Àr:À™AÀBÀ AÀ$BÀÔ>À4BÀÔ%ÀEBÀ<8Àr:À¼(À DÀf(À-DÀr(ÀADÀ<8ÀpDÀŽCÀ¤DÀåGÀøGÀpKÀ°QÀ›PÀÇQÀÝPÀâQÀ±PÀRÀ¡OÀ,RÀ„PÀWRÀ”qÀŠrÀ›qÀ¢rÀ¦qÀ¾rÀÓrÀTsÀ”qÀŠrÀ¦qÀwÀÎvÀ(wÀÞvÀLwÀszÀ’zÀ/uÀY|ÀluÀm|ÀÌ|À$ƒÀŒ}ÀHƒÀ£À[ƒÀJ‚ÀfƒÀ›}ÀvƒÀäƒÀ„À<8À(‡ÀÍŠÀ‹ÀÞŠÀ%‹ÀÌ‹À ÀuÀÀ©ŒÀ6À ŒÀSÀ›PÀjÀÇ‹À„ÀŒÀ˜À Ä;À ä;À ô;À <À L<À |<À Œ<À Ä<À ä<À ô<À =À ,=À D=À t=À „=À ”=À ¬=Àó5À6ÀÝRÀ#4ÀG6ÀUÀ±4Àe6ÀUÀÕ4Àe6ÀÞWÀf5À,*ÀÿXÀ»5ÀÇ(ÀWYÀ‡%ÀÇ(À›YÀy6ÀÇ(ÀåYÀX8À{)Àn8Àà(À€8Àà(À‘8À­8Àº8ÀÚ8Àû8À{)À9À 9À9À9ÀêÀ9À"9ÀÇ(À'9À,9À=9ÀN9ÀA5ÀX9Àe9ÀŒ9Àœ9À…)ÀðÀ¤9À®9À¤9À¿9À{)ÀÀÓ9À(ÀÇ(À ÀÝ9ÀJÀÇ(Àå9À 9Àñ9ÀÇ(ÀX8À{)Àn8Àà(À€8Àà(À‘8À­8Àº8ÀÚ8Àû8À{)À9À 9À9À9ÀêÀ9À"9ÀÇ(À'9À,9À=9ÀN9ÀA5ÀX9Àe9ÀŒ9Àœ9À…)ÀðÀ¤9À®9À¤9À¿9À{)ÀÀÓ9À(ÀÇ(À ÀÝ9ÀJÀÇ(Àå9À 9Àñ9ÀÇ(À×;ÀÇ(ÀB†ÀñBÀCÀ+ˆÀÑBÀCÀ”ˆÀ¸;ÀCÀ_ŠÀw<À9=ÀzŒÀ‹HÀ®HÀ¹HÀÙHÀåHÀòHÀûqÀÇ(ÀàqÀÇ(ÀûqÀÇ(ÀàqÀÇ(ÀûqÀÇ(ÀàqÀÇ(ÀûqÀÇ(ÀàqÀÇ(ÀT…Àà(À…ÀÎ*Àl…Àà(À …ÀÂ…À/ÀÀV ÀŒ6À%À¸>ÀCÀ%À°@À(Àù*À„AÀ!À!^ES0@`0”`ªCp p`2C€š pTDTDTBRCRCTDTBTBTDTDTDTDTDTDTDTDTDTDTDTDTDTDTDTDTDTDTBRDTBRDTDTDTDTDTDTDTDTDTDTDTDTDTBRDTDTDTDTDTDTDTDTDTDTDTDTDTDTDTDTDTDTDTDTDTDTDTDTDTDTBRDTDTDTDTDTDTBRDTDTDTDTDTDTDTDTDT"`ýB`rB`$BSBSBSBSBSB`!BSBSB\BSBYBVBVBSBSBVB`BVBSBSBVDpSFpSDpSFpSISFpSDpSDpSDpSDpSDpSISISISISDpSDppSDppSDpSDppSDppSDppSDpSISDppSDpSDpSISDpSDpSDpSDpSDpSGpSCRAVGpSCRAVCRBUCRAVCRBUCRBUCRBpSDppSDppSCRBUCRBpSCRBpSCRBpSCRBpSCRAVCRAVCRBUCRAVCRARASCRAVCRBUCRBUCRAVCp pSCp pSCRBUCRBUCRBpSDppSDppSGp€ TCSC€ RC€ pRBRBRBp RBp RBRBRBRBRBRBRBRBRBRBRBRBp RBRBRBRBRBRBRBp RBRBRBRBRBRBRApppSCppSCppppppppppp€ SARARARBRARARBRARARARARARARARARARARARBRARARARARARARARARBRARARARARBRBRARBRARARARARARARARARARARBRARARARARARARARARARBRARARARBRBRARARARARARARARARARARARARARARARARARARARARARARARARARARBRARARBRBRARARARARARBRBRARBRARBRARARARARARARARARBRBRARARARARARARARARARARARARARARARARARBRARARARARARARBRARARARBRARBRARARARARARARBRARC`B`!B`6B`0B`6BYB\BSBVB`KB`BVBVB`ŒB`B`B`Ñ0â „í<Ë.Ôa‰û‚Ÿ·yÑ¡XDJJ“LRN|™ ®À‚¦xP6†ÝÝ3R %ؤ„³ 䤔”Ø < < %»¢’û-Í,.Ór % éiË›—>©c…dÒRd@ < % < < ¤Ô†æ N NX˜ŽJ¬[ܰ Ÿ0!ÿP6•åpI < < < < < ×Ut%\­«cƒNjN>=<¸ß=0!¿0!/P6ž,P655¨P6’H0!55ÀEpI¤cP6<<³/P6z00!°P6z00!²-P6z00!³,P6z00!ÛDP6†dP6@Ë¿P6è ¢0!,£0!/ o±Õ{00pI§ORû‰‹P@ oOJóÕ oÙˆP6ŠpIÁMš¼s0!P@P6Æ”pIMÒx0!—R”ƒpItƒ0!`0!`0!`0!„ll˜ºŸn³³³³³l±(P6±)P6‹¿P6çSP6‹¿P6çSP666996699hhkkhhkkÛ—P6ÛP6±P6±P6ì £›0!0!?0!?0!++++PN‚œP6OŒŸP6WUVÅ£P6áè‘pIÚ}P6¡‰€\[Òw0!ãð}00pIÐì›P6á± ˜pIÍŠpI[Òz0!ãð}00pIÐØßP6ÿ 44§½P6 *""GJ¦;;;=SxöB-<-<-[C©Ï¢z5<eE¾5<•LÇcÞÁ-ª    N¯ <Ð AAHN %­ìŸuNþ < øà¸ÈŒ¹æŽlLžqW]]p¶Ê  -<-<-<-<-De n5§0!P6’Ó  ÓP6ZP6»o0!_0!?$°Àb$ÀŽ$ŠÀ¶$›À&%þÀ¡%ÏÀÑ%ùÀ&0À+&`ÀD&À|&ÑÀ¤&Ž Àà&¢ À'´ ÀE' "Àp'"À™'&"ÀË'Á$À(ö$À=( %Àt(%À±(u%Àí(!&À")Á&Ài)ö&À¿)ß*À*-À8*>-À‹*ä-Àâ*U/À+÷/ÀN+™0Àt+¡1À+3ÀÕ+¼4Àý+ß5À*,/6ÀT,Ü6Àƒ,7À±,Û7Àè,78À -“8À`-C9Ày-»9À¢-è9ÀÏ-$:Àü-Q:À-.:À].º:À‘.ø:ÀÍ.É<Àú.ù<À$/ÛBÀJ/_CÀ‘/LGÀÉ/ˆGÀõ/ÓHÀ 0ÔIÀG0ÕJÀp0KÀ¥0WMÀè0ÝRÀ-1UÀe1UÀ 1ÞWÀÖ1ÿXÀ2WYÀI2›YÀ{2åYÀ®2à[ÀÈ2_\Àå2­\À3)]À*3ÂaÀa3pcÀw30dÀ3²dÀ´3ØeÀì3PfÀ4 fÀ4ÖfÀI4ÜhÀy4¹iÀ§4–jÀÓ4ÉjÀ5kÀ15&kÀS5KkÀs5£oÀŒ5ÇpÀ³5KqÀÎ5þsÀè5tÀ6tÀ6suÀ96yÀX6«yÀv6?zÀ’6{À´6"{ÀÚ6^{Àý6i{À$7¥{ÀG7°{Àa7»{À7à{ÀÛ7›À8=€À$8ÏÀR8Ê‚À8÷‚À¦8D„ÀÖ8p„À9ž„À39q…Àf9ã…ÀŠ9ï…À°9ú…ÀÕ9†Àû9†À%:6†ÀK:B†Às:+ˆÀ¥:”ˆÀà:_ŠÀ;zŒÀA;Àj;ÀŒ;VÀ½;ÿÀâ;bŽÀ<çŽÀ:<ìŽÀj<PÀ”<"À»<tÀß<ØÀ=‘À-=#‘ÀV=.‘À=9‘À¬=u‘ÀÒ=€‘Àü=¥‘À>°‘ÀF>ì‘À>ö‘À²>ƒ—Àï>Ž—À0?Ê—Ài?Ô—Àž?x˜ÀÝ?L™À@R›ÀH@8œÀt@BœÀ›@œÀÇ@šœÀî@èœÀA@ÀGAØÀoAßÀ AæÀÈAtžÀB¾žÀ@BêŸÀsBú À¯BU¡ÀîB1¢À+Cá¦ÀWC€¨ÀsC°¨À’CѨÀÒCЩÀèC ªÀDVªÀ0Dk­ÀsDЮÀŒD@¯À¨D‰¯ÀèD¦°À"E±°À`Eí°ÀEø°ÀÂE4±ÀèE?±ÀF{±ÀNáÃÀgNÄÀNKÄÀÏN‹ÅÀOÐÅÀ.O@ÆÀJO‰ÆÀŠO-ÇÀÞOÇÀ÷OàÇÀPÈÀEPRÈÀ„PŽÈÀ¼PAÉÀQpÉÀ!QÀÉÀ=QöÉÀyQpÊÀÉQ ÊÀâQÐÊÀþQñÊÀ#R¡ËÀ\RÀËÀuRÌÀ‘RFÌÀ¸RÀÌÀóRðÌÀ S ÍÀ(SAÍÀMSóÍÀ†S ÎÀŸSpÎÀ»S¦ÎÀâS ÏÀTPÏÀ6T€ÏÀRT¡ÏÀTTÐÀÄT€ÐÀÝTÐÐÀùTÑÀ'U€ÑÀiU°ÑÀ‚UàÑÀžUÒÀ¾UÜÒÀòU ÓÀ VpÓÀ'V¦ÓÀKV,ÔÀƒVÔÀœVàÔÀ¸VÕÀãVVÕÀW!×ÀaWàØÀzW0ÙÀ–WfÙÀâWÎÞÀôWpßÀ X ßÀ)XÁßÀ;XíßÀMXàÀfXÀàÀ‚XáàÀ”XáÀ­X°áÀÉXâÀêXÐãÀY¥åÀ1Y æÀJYPæÀfY€æÀYðæÀ›Y9çÀÑY`éÀZ¯éÀCZêÀZ|ëÀïZíÀ[íÀ[àíÀ6[ îÀO[ÀîÀk[/ïÀš[~ïÀÕ[ÈïÀ\;ñÀy\óÀ’\0ôÀ®\ŸôÀ×\xøÀ]ùÀ-]PùÀI]†ùÀ‰]úÀ¢]€úÀ¾]ÉúÀý]ŠûÀ$^×ûÀ_^ñýÀ®^-ÿÀÀ^ ÿÀÙ^ÐÿÀõ^ñÿÀ_pÀ _ÀÀ<_ÀU_PÀq_†À”_LÀË_àÀä_PÀ`™À,`æÀX`8À˜`°À±`àÀÍ`Àa À9a·Àaa Àˆa ÀÃa  ÀÜa ÀøaY ÀbÍ ÀPbP Àib€ À…b¡ À³b Àõb€ Àc° À*cÑ ÀXc1Àšc°À³càÀÏcÀdaÀSdàÀldÀˆd1ÀªdµÀÑd!À÷dÀe%ÀEeßÀge~ÀˆeìÀ³eŸÀÜeRÀfÀ-f¸ÀZfkÀ}f×À£fˆÀÝf°ÀöfÀg6À5gçÀlgÀ…g`À¡g–ÀÆg¡Àÿg`Àh°À4hæÀYhÍÀ’h À«hpÀÇh¦Àèh±Àip À6iÀ ÀRiö ÀsiÝ!À¨i0"ÀÁi€"ÀÝi¶"Àjì"À)j"#ÀOj[#Àuj”#À—jÊ#À¹j$ÀÛj9$Àýjr$À.kÚ$À_kB%Àk­%ÀÁk&Àîk€&Àlè&ÀHlS'Àul¾'Àl™(ÀÙl°)Àòl*Àm6*À2m+Àjm ,Àƒmp,ÀŸm¦,À½mW-Àïmp-ÀnÀ-À$nö-ÀBn§.ÀtnÀ.Àn/À©nF/Àôn25ÀÙÀ —ªÛÀ{—XéÀ˜—ÍéÀ¸—êÀä—ëÀ˜ ëÀ@˜+ëÀm˜gëÀ˜rëÀµ˜ïÀÚ˜ØðÀ™äñÀ/™òÀV™ƒóÀ•™ôÀ®™}ôÀÆ™ÉôÀÝ™çõÀü™XöÀ!š¯öÀ5š ÷ÀIši÷À_šÙ÷ÀnšøÀ„šYùÀšdùÀºšrùÀÙš}ùÀüš‹ùÀ›¸ùÀ2›ôùÀE›!úÀ\›]úÀp›ŠúÀˆ›ÆúÀ˜›óúÀ¬›/ûÀº›\ûÀÌ› ûÀø›üÀ,œ%ýÀTœ6ýÀzœ¤ýÀ£œÙýÀלÿÀóœ0ÿÀQÿÀZ`Àp°À‰æÀ¶øÀîËÀžÕÀ@žæÀkžðÀ’žÀÈžcÀŸðÀ(Ÿ@ÀAŸvÀŸÐÀ¥Ÿ ÀÀŸV ÀîŸ À0 € ÀH ° Àc Ñ À§ 0À¿ `ÀÚ À¡ ÔÀ ¡ ÐæÀ8¡ ðæÀP¡ çÀj¡ (çÀ„¡ 8çÀœ¡ PçÀ´¡ pçÀÏ¡  çÀç¡ ÀçÀ¢ àçÀ¢ èÀ5¢ èÀO¢ @èÀj¢ `èÀ…¢ €èÀ ¢  èÀ»¢ ÀèÀÖ¢ àèÀñ¢ éÀ £ éÀ'£ @éÀB£ `éÀ]£ €éÀx£  éÀ“£ ÀéÀ®£ àéÀÉ£ øéÀä£ êÀÿ£ (êÀ¤ @êÀ5¤ `êÀP¤ €êÀk¤  êÀ†¤ ÀêÀ¡¤ àêÀ¼¤ ëÀפ ëÀò¤ @ëÀ ¥ `ëÀ(¥ €ëÀC¥  ëÀ^¥ ÀëÀy¥ ØëÀ”¥ ðëÀ¯¥ ìÀÊ¥ 0ìÀå¥ PìÀ¦ pìÀ¦ ìÀ6¦ °ìÀQ¦ ÐìÀl¦ ðìÀ‡¦ íÀ¢¦ 0íÀ½¦ PíÀئ píÀó¦ íÀ§ °íÀ)§ ÐíÀD§ ðíÀ_§ îÀz§ 0îÀ•§ PîÀ°§ pîÀ˧ îÀæ§ °îÀ¨ ÐîÀ¨ ðîÀ7¨ ïÀR¨ (ïÀm¨ @ïÀˆ¨ `ïÀ£¨ €ïÀ¾¨  ïÀÙ¨ ÀïÀô¨ àïÀ© øïÀ*© ðÀE© 0ðÀ`© PðÀ{© pðÀ–© ðÀ®© °ðÀÆ© ÐðÀà© ððÀú© ñÀª,ñÀª0ñÀ)ª4ñÀGª8ñÀPª<ñÀ]ª@ñÀtªAñÀªBñÀŽªCñÀ›ªDñÀµªHñÀͪLñÀÛªPñÀõªQñÀ7«RñÀz«SñÀ¬«TñÀ¼«XñÀÍ«\ñÀ¬`ñÀF¬dñÀY¬hñÀ¯¬lñÀ÷¬pñÀB­tñÀ­xñÀÏ­yñÀ„ÀDÀEÄÀ€”À»dÀætÀTÀ+„ÀTÀyäÀ¥´ÀÏ4ÀõTÀ$ÔÀOtÀwÀœDÀÈ$Àö¤ÀÄÀ@ôÀndÀ™ÔÀ¼ÀÛ4ÀDÀ-$ÀZ”À}¤À¡ôÀÊ´ÀøäÀ%ÀRXíÀ_ ”çÀz çÀ“ ˜çÀ² œçÀÜ dÔÀë \ÔÀù ÕÀ ÕÀ= œÔÀ] ˜ÔÀ} ÕÀœ tÔÀ´ hÔÀÎ xÔÀæ lÔÀÿ pÔÀ |ÔÀ4 ”ÔÀQ `ÔÀ_ ÔÀ{ ÕÀ• LÔÀ£ HÔÀ² ÈÔÀØ ÌÔÀ äÔÀ' ÐÔÀL èÔÀt  ÔÀ– ¨ÔÀ¸ ¬ÔÀÖ ´ÔÀï °ÔÀ  „ÔÀ,  ¤ÔÀG  ÄÔÀf  ÀÔÀƒ  ¼ÔÀž  ¸ÔÀº  ŒÔÀÓ  ìÔÀï  øÔÀ  üÔÀ,  ðÔÀI  ôÔÀi  €ÔÀ‡  àÔÀ©  PÔÀ¸  TÔÀÉ  XÔÀÚ  ˆÔÀù  ÔÔÀ  ØÔÀ)  ÜÔÀB 9èÀY /ZÀ Ž[À™ B[À €ëÀÍ xìÀÚ  ÕÀ …tÀ ¹tÀ#  (ñÀ9 AOÀQ ¾QÀi ¸MÀ ?@ABCDEFGHMNOPVcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„‡›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×@€€€€€€€€€€€€€€I$!Œ€€€™Š‰ba`^\[Z_]YXWš€€€€€€€€€€€€€€€€€10/.* ‹2ˆÀRK˜—–•”“’‘ކ…UTSQ)'&%€€ôõö÷øùúûüýþÿ     "#(+,-3456789:;<=>?@ABCDEFGHMNOPVcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„‡›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ.objc_class_name_GNTPKey.objc_class_name_GrowlApplicationBridge.objc_class_name_GrowlApplicationBridgeNotificationAttempt.objc_class_name_GrowlApplicationBridgeRegistrationAttempt.objc_class_name_GrowlCommunicationAttempt.objc_class_name_GrowlDelegate.objc_class_name_GrowlErrorGNTPPacket.objc_class_name_GrowlGCDAsyncReadPacket.objc_class_name_GrowlGCDAsyncSocket.objc_class_name_GrowlGCDAsyncSpecialPacket.objc_class_name_GrowlGCDAsyncWritePacket.objc_class_name_GrowlGNTPBinaryChunk.objc_class_name_GrowlGNTPCommunicationAttempt.objc_class_name_GrowlGNTPEncryptedHeaders.objc_class_name_GrowlGNTPEndHeaderItem.objc_class_name_GrowlGNTPHeaderItem.objc_class_name_GrowlGNTPInitialHeaderItem.objc_class_name_GrowlGNTPNotificationAttempt.objc_class_name_GrowlGNTPOutgoingPacket.objc_class_name_GrowlGNTPPacket.objc_class_name_GrowlGNTPRegistrationAttempt.objc_class_name_GrowlISO8601DateFormatter.objc_class_name_GrowlMiniDispatch.objc_class_name_GrowlMistView.objc_class_name_GrowlMistWindowController.objc_class_name_GrowlNetworkUtilities.objc_class_name_GrowlNotificationGNTPPacket.objc_class_name_GrowlOkGNTPPacket.objc_class_name_GrowlPathUtilities.objc_class_name_GrowlRegisterGNTPPacket.objc_class_name_GrowlXPCCommunicationAttempt.objc_class_name_GrowlXPCNotificationAttempt.objc_class_name_GrowlXPCRegistrationAttempt_ComputeHash_GCDAsyncSocketErrorDomain_GCDAsyncSocketException_GCDAsyncSocketSSLCipherSuites_GCDAsyncSocketSSLDiffieHellmanParameters_GrowlGNTP3DES_GrowlGNTPAES_GrowlGNTPApplicationBundleIDHeader_GrowlGNTPApplicationDataPrefix_GrowlGNTPApplicationIconHeader_GrowlGNTPApplicationNameHeader_GrowlGNTPApplicationPIDHeader_GrowlGNTPCallbackClick_GrowlGNTPCallbackClicked_GrowlGNTPCallbackClose_GrowlGNTPCallbackClosed_GrowlGNTPCallbackTimedout_GrowlGNTPCallbackTimeout_GrowlGNTPCallbackTypeHeader_GrowlGNTPDES_GrowlGNTPErrorResponseType_GrowlGNTPExtensionPrefix_GrowlGNTPMD5_GrowlGNTPNone_GrowlGNTPNotificationCallbackContext_GrowlGNTPNotificationCallbackContextType_GrowlGNTPNotificationCallbackResult_GrowlGNTPNotificationCallbackTarget_GrowlGNTPNotificationCallbackTimestamp_GrowlGNTPNotificationCountHeader_GrowlGNTPNotificationDisplayName_GrowlGNTPNotificationEnabled_GrowlGNTPNotificationID_GrowlGNTPNotificationIcon_GrowlGNTPNotificationMessageType_GrowlGNTPNotificationName_GrowlGNTPNotificationPriority_GrowlGNTPNotificationSticky_GrowlGNTPNotificationText_GrowlGNTPNotificationTitle_GrowlGNTPOKResponseType_GrowlGNTPOriginMachineName_GrowlGNTPOriginPlatformName_GrowlGNTPOriginPlatformVersion_GrowlGNTPOriginSoftwareName_GrowlGNTPOriginSoftwareVersion_GrowlGNTPRegisterMessageType_GrowlGNTPResponseSubscriptionTTL_GrowlGNTPSHA1_GrowlGNTPSHA256_GrowlGNTPSHA512_GrowlGNTPSubscribeMessageType_GrowlGNTPSubscriberID_GrowlGNTPSubscriberName_GrowlGNTPSubscriberPort_GrowlGetSystemVersion_Growl_GetPSNForProcessWithBundlePath_Growl_HelperAppIsRunning_Growl_ProcessExistsWithBundleIdentifier_HexEncode_HexUnencode_ISO8601DefaultTimeSeparatorCharacter_SSLReadFunction_SSLWriteFunction_TCPServerErrorDomain_createAliasDataWithURL_dockDescriptionWithURL_fileURLWithAliasData_fileURLWithDockDescription.objc_class_name_NSAffineTransform.objc_class_name_NSArray.objc_class_name_NSAutoreleasePool.objc_class_name_NSBezierPath.objc_class_name_NSBitmapImageRep.objc_class_name_NSBundle.objc_class_name_NSCalendar.objc_class_name_NSCharacterSet.objc_class_name_NSColor.objc_class_name_NSConnection.objc_class_name_NSData.objc_class_name_NSDate.objc_class_name_NSDateComponents.objc_class_name_NSDateFormatter.objc_class_name_NSDictionary.objc_class_name_NSDistributedNotificationCenter.objc_class_name_NSError.objc_class_name_NSException.objc_class_name_NSFileManager.objc_class_name_NSFont.objc_class_name_NSFormatter.objc_class_name_NSGraphicsContext.objc_class_name_NSImage.objc_class_name_NSIndexSet.objc_class_name_NSMutableArray.objc_class_name_NSMutableData.objc_class_name_NSMutableDictionary.objc_class_name_NSMutableSet.objc_class_name_NSMutableString.objc_class_name_NSNotificationCenter.objc_class_name_NSNumber.objc_class_name_NSObject.objc_class_name_NSPanel.objc_class_name_NSParagraphStyle.objc_class_name_NSProcessInfo.objc_class_name_NSPropertyListSerialization.objc_class_name_NSRunningApplication.objc_class_name_NSScreen.objc_class_name_NSString.objc_class_name_NSTimeZone.objc_class_name_NSTimer.objc_class_name_NSTrackingArea.objc_class_name_NSURL.objc_class_name_NSUserDefaults.objc_class_name_NSView.objc_class_name_NSViewAnimation.objc_class_name_NSWindowController.objc_class_name_NSWorkspace_AEDisposeDesc_AESendMessage_AEStreamClose_AEStreamCreateEvent_AEStreamWriteKeyDesc_CC_MD5_CC_SHA1_CC_SHA256_Final_CC_SHA256_Init_CC_SHA256_Update_CC_SHA512_Final_CC_SHA512_Init_CC_SHA512_Update_CFBundleGetBundleWithIdentifier_CFBundleGetIdentifier_CFBundleGetInfoDictionary_CFBundleGetMainBundle_CFDataCreate_CFMakeCollectable_CFRelease_CFStringCompare_CFStringGetMaximumSizeOfFileSystemRepresentation_CFURLCopyFileSystemPath_CFURLCopyScheme_CFURLCreateWithFileSystemPath_CFURLGetFSRef_CFUUIDCreate_CFUUIDCreateString_CGRectIntersectsRect_CGWindowLevelForKey_DisposeHandle_FSCopyAliasInfo_FSNewAlias_Gestalt_GetHandleSize_GetMacOSStatusCommentString_GetNextProcess_HLock_HUnlock_NSApp_NSCocoaErrorDomain_NSConnectionDidDieNotification_NSEqualSizes_NSFontAttributeName_NSForegroundColorAttributeName_NSGregorianCalendar_NSHomeDirectory_NSInsetRect_NSInternalInconsistencyException_NSLocalizedDescriptionKey_NSLocalizedFailureReasonErrorKey_NSLocalizedRecoverySuggestionErrorKey_NSLog_NSPOSIXErrorDomain_NSParagraphStyleAttributeName_NSSearchPathForDirectoriesInDomains_NSStringFromClass_NSTemporaryDirectory_NSViewAnimationEffectKey_NSViewAnimationFadeInEffect_NSViewAnimationFadeOutEffect_NSViewAnimationTargetKey_NSZeroRect_ProcessInformationCopyDictionary_PtrToHand_SCDynamicStoreCopyLocalHostName_SSLDisposeContext_SSLHandshake_SSLNewContext_SSLRead_SSLSetAllowsAnyRoot_SSLSetAllowsExpiredCerts_SSLSetAllowsExpiredRoots_SSLSetCertificate_SSLSetConnection_SSLSetDiffieHellmanParams_SSLSetEnableCertVerify_SSLSetEnabledCiphers_SSLSetIOFuncs_SSLSetPeerDomainName_SSLSetProtocolVersionEnabled_SSLWrite_SecRandomCopyBytes__Block_object_assign__Block_object_dispose__DefaultRuneLocale__NSConcreteGlobalBlock__NSConcreteStackBlock___CFConstantStringClassReference___error___maskrune___sprintf_chk___stack_chk_fail___stack_chk_guard__dispatch_main_q__dispatch_source_type_read__dispatch_source_type_timer__dispatch_source_type_write__setjmp__xpc_error_connection_interrupted__xpc_error_connection_invalid__xpc_error_key_description__xpc_type_array__xpc_type_bool__xpc_type_data__xpc_type_dictionary__xpc_type_double__xpc_type_error__xpc_type_int64__xpc_type_string__xpc_type_uint64_accept$UNIX2003_bind$UNIX2003_calloc_ceilf_close$UNIX2003_connect$UNIX2003_dispatch_async_dispatch_get_current_queue_dispatch_get_global_queue_dispatch_queue_create_dispatch_release_dispatch_resume_dispatch_retain_dispatch_source_cancel_dispatch_source_create_dispatch_source_get_data_dispatch_source_set_cancel_handler_dispatch_source_set_event_handler_dispatch_source_set_timer_dispatch_suspend_dispatch_sync_dispatch_time_fcntl$UNIX2003_floorf_free_freeaddrinfo_freeifaddrs_fstat$INODE64_gai_strerror_getaddrinfo_getifaddrs_getpeername$UNIX2003_getpid_getsockname$UNIX2003_in6addr_any_in6addr_loopback_inet_ntop_kCFAllocatorDefault_kCFBooleanFalse_kCFBooleanTrue_kCFBundleIdentifierKey_kCFBundleNameKey_kCFBundleVersionKey_kCFStreamSSLAllowsAnyRoot_kCFStreamSSLAllowsExpiredCertificates_kCFStreamSSLAllowsExpiredRoots_kCFStreamSSLCertificates_kCFStreamSSLIsServer_kCFStreamSSLLevel_kCFStreamSSLPeerName_kCFStreamSSLValidatesCertificateChain_kCFStreamSocketSecurityLevelNegotiatedSSL_kCFStreamSocketSecurityLevelSSLv2_kCFStreamSocketSecurityLevelSSLv3_kCFStreamSocketSecurityLevelTLSv1_kSecRandomDefault_listen$UNIX2003_malloc_memcmp_memcpy_modf_objc_assign_global_objc_assign_ivar_objc_assign_strongCast_objc_enumerationMutation_objc_exception_extract_objc_exception_match_objc_exception_throw_objc_exception_try_enter_objc_exception_try_exit_objc_getProperty_objc_msgSend_objc_msgSendSuper_objc_msgSend_fpret_objc_msgSend_stret_objc_setProperty_open$UNIX2003_poll$UNIX2003_read$UNIX2003_setsockopt_socket_strcmp_strerror$UNIX2003_strlen_strtol_truncf_write$UNIX2003_xpc_array_apply_xpc_array_create_xpc_array_get_count_xpc_array_set_value_xpc_bool_create_xpc_bool_get_value_xpc_connection_create_xpc_connection_resume_xpc_connection_send_message_xpc_connection_set_event_handler_xpc_data_create_xpc_data_get_bytes_ptr_xpc_data_get_length_xpc_dictionary_apply_xpc_dictionary_create_xpc_dictionary_get_count_xpc_dictionary_get_string_xpc_dictionary_set_string_xpc_dictionary_set_value_xpc_double_create_xpc_double_get_value_xpc_get_type_xpc_int64_create_xpc_int64_get_value_xpc_release_xpc_string_create_xpc_string_get_string_ptr_xpc_uint64_create_xpc_uint64_get_valuedyld_stub_binder+[GrowlApplicationBridge attempts]+[GrowlApplicationBridge setGrowlDelegate:]+[GrowlApplicationBridge growlDelegate]+[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:]+[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:identifier:]+[GrowlApplicationBridge notifyWithDictionary:]___47+[GrowlApplicationBridge notifyWithDictionary:]_block_invoke_0___copy_helper_block____destroy_helper_block_+[GrowlApplicationBridge isNotificationDefaultEnabled:]+[GrowlApplicationBridge isMistEnabled]+[GrowlApplicationBridge setShouldUseBuiltInNotifications:]+[GrowlApplicationBridge shouldUseBuiltInNotifications]+[GrowlApplicationBridge _fireMiniDispatch:]+[GrowlApplicationBridge isGrowlInstalled]+[GrowlApplicationBridge isGrowlRunning]+[GrowlApplicationBridge registerWithDictionary:]+[GrowlApplicationBridge reregisterGrowlNotifications]+[GrowlApplicationBridge setWillRegisterWhenGrowlIsReady:]+[GrowlApplicationBridge willRegisterWhenGrowlIsReady]+[GrowlApplicationBridge registrationDictionaryFromDelegate]+[GrowlApplicationBridge registrationDictionaryFromBundle:]+[GrowlApplicationBridge bestRegistrationDictionary]+[GrowlApplicationBridge registrationDictionaryByFillingInDictionary:]+[GrowlApplicationBridge registrationDictionaryByFillingInDictionary:restrictToKeys:]+[GrowlApplicationBridge notificationDictionaryByFillingInDictionary:]+[GrowlApplicationBridge frameworkInfoDictionary]+[GrowlApplicationBridge _applicationNameForGrowlSearchingRegistrationDictionary:]+[GrowlApplicationBridge _applicationIconDataForGrowlSearchingRegistrationDictionary:]+[GrowlApplicationBridge growlNotificationWasClicked:]+[GrowlApplicationBridge growlNotificationTimedOut:]+[GrowlApplicationBridge _emptyQueue]+[GrowlApplicationBridge _growlIsReady:]+[GrowlApplicationBridge _growlIsReachableUpdateCache:]+[GrowlApplicationBridge _checkSandbox]+[GrowlApplicationBridge attemptDidSucceed:]+[GrowlApplicationBridge attemptDidFail:]+[GrowlApplicationBridge finishedWithAttempt:]+[GrowlApplicationBridge queueAndReregister:]+[GrowlApplicationBridge notificationClicked:context:]+[GrowlApplicationBridge notificationTimedOut:context:]-[GrowlDelegate initWithAllNotifications:defaultNotifications:]-[GrowlDelegate dealloc]-[GrowlDelegate applicationNameForGrowl]-[GrowlDelegate setApplicationNameForGrowl:]-[GrowlDelegate applicationIconDataForGrowl]-[GrowlDelegate setApplicationIconDataForGrowl:]-[GrowlDelegate registrationDictionaryForGrowl]-[GrowlDelegate setRegistrationDictionaryForGrowl:]+[GrowlPathUtilities bundleForProcessWithBundleIdentifier:]+[GrowlPathUtilities runningHelperAppBundle]+[GrowlPathUtilities growlPrefPaneBundle]+[GrowlPathUtilities helperAppBundle]+[GrowlPathUtilities searchPathForDirectory:inDomains:mustBeWritable:]+[GrowlPathUtilities searchPathForDirectory:inDomains:]+[GrowlPathUtilities growlSupportDirectory]+[GrowlPathUtilities screenshotsDirectory]+[GrowlPathUtilities ticketsDirectory]+[GrowlPathUtilities nextScreenshotName]+[GrowlPathUtilities nextScreenshotNameInDirectory:]+[GrowlPathUtilities defaultSavePathForTicketWithApplicationName:]-[NSImage(GrowlImageAdditions) drawScaledInRect:operation:fraction:]-[NSImage(GrowlImageAdditions) adjustSizeToDrawAtSize:]-[NSImage(GrowlImageAdditions) bestRepresentationForSize:]-[NSImage(GrowlImageAdditions) representationOfSize:]-[NSImage(GrowlImageAdditions) replacementObjectForPortCoder:]-[NSImage(GrowlImageAdditions) GrowlBitmapImageRep]-[NSImage(GrowlImageAdditions) PNGRepresentation]-[NSImage(GrowlImageAdditions) JPEGRepresentation]-[GrowlMiniDispatch init]-[GrowlMiniDispatch dealloc]-[GrowlMiniDispatch queueWindow:]-[GrowlMiniDispatch insertWindow:]___34-[GrowlMiniDispatch insertWindow:]_block_invoke_0___copy_helper_block____destroy_helper_block_-[GrowlMiniDispatch dequeueWindows]___35-[GrowlMiniDispatch dequeueWindows]_block_invoke_0___copy_helper_block_35___destroy_helper_block_36-[GrowlMiniDispatch displayNotification:]-[GrowlMiniDispatch mistNotificationDismissed:]-[GrowlMiniDispatch mistNotificationClicked:]-[GrowlMiniDispatch closeAllNotifications:]___43-[GrowlMiniDispatch closeAllNotifications:]_block_invoke_0-[GrowlMiniDispatch delegate]-[GrowlMiniDispatch setDelegate:]-[GrowlMistView initWithFrame:]-[GrowlMistView dealloc]-[GrowlMistView setNotificationImage:]-[GrowlMistView setFrame:]-[GrowlMistView isOpaque]-[GrowlMistView isFlipped]-[GrowlMistView sizeToFit]-[GrowlMistView drawRect:]-[GrowlMistView mouseEntered:]-[GrowlMistView mouseExited:]-[GrowlMistView mouseDown:]-[GrowlMistView notificationText]-[GrowlMistView setNotificationText:]-[GrowlMistView notificationTitle]-[GrowlMistView setNotificationTitle:]-[GrowlMistView notificationImage]-[GrowlMistView delegate]-[GrowlMistView setDelegate:]-[GrowlMistWindowController initWithNotificationTitle:text:image:sticky:userInfo:delegate:]-[GrowlMistWindowController dealloc]-[GrowlMistWindowController fadeIn]-[GrowlMistWindowController animationDidEnd:]-[GrowlMistWindowController animationDidStop:]-[GrowlMistWindowController fadeOut]-[GrowlMistWindowController mistViewDismissed:]-[GrowlMistWindowController lifetimeExpired:]-[GrowlMistWindowController mistViewSelected:]-[GrowlMistWindowController closeAllNotifications]-[GrowlMistWindowController sticky]-[GrowlMistWindowController userInfo]-[GrowlMistWindowController visible]-[GrowlMistWindowController delegate]-[GrowlMistWindowController setDelegate:]-[GrowlMistWindowController selected]-[NSImage(GrowlAdditions) flippedImage]-[NSImage(GrowlAdditions) imageSizedToDimension:]-[NSImage(GrowlAdditions) imageSizedToDimensionScalingUp:]-[NSImage(GrowlAdditions) imageSizedToDimensionSquaring:]-[NSImage(GrowlAdditions) drawInRect:]+[GrowlCommunicationAttempt attemptType]-[GrowlCommunicationAttempt init]-[GrowlCommunicationAttempt initWithDictionary:]-[GrowlCommunicationAttempt dealloc]-[GrowlCommunicationAttempt makeNextAttemptOfClass:]-[GrowlCommunicationAttempt begin]-[GrowlCommunicationAttempt queueAndReregister]-[GrowlCommunicationAttempt stopAttempts]-[GrowlCommunicationAttempt succeeded]-[GrowlCommunicationAttempt failed]-[GrowlCommunicationAttempt finished]-[GrowlCommunicationAttempt dictionary]-[GrowlCommunicationAttempt attemptType]-[GrowlCommunicationAttempt nextAttempt]-[GrowlCommunicationAttempt setNextAttempt:]-[GrowlCommunicationAttempt delegate]-[GrowlCommunicationAttempt setDelegate:]-[GrowlCommunicationAttempt error]-[GrowlCommunicationAttempt setError:]+[GrowlApplicationBridgeRegistrationAttempt attemptType]-[GrowlApplicationBridgeRegistrationAttempt begin]-[GrowlApplicationBridgeRegistrationAttempt applicationName]-[GrowlApplicationBridgeRegistrationAttempt setApplicationName:]+[GrowlApplicationBridgeNotificationAttempt attemptType]-[GrowlApplicationBridgeNotificationAttempt dealloc]-[GrowlApplicationBridgeNotificationAttempt connectionDidDie:]-[GrowlApplicationBridgeNotificationAttempt growlProxy]-[GrowlApplicationBridgeNotificationAttempt begin]+[GrowlGNTPRegistrationAttempt attemptType]-[GrowlGNTPRegistrationAttempt packet]+[GrowlGNTPNotificationAttempt attemptType]-[GrowlGNTPNotificationAttempt packet]-[GrowlGNTPNotificationAttempt expectsCallback]-[GrowlGNTPCommunicationAttempt dealloc]-[GrowlGNTPCommunicationAttempt packet]-[GrowlGNTPCommunicationAttempt expectsCallback]-[GrowlGNTPCommunicationAttempt failed]-[GrowlGNTPCommunicationAttempt couldNotParseResponseWithReason:responseString:]-[GrowlGNTPCommunicationAttempt begin]-[GrowlGNTPCommunicationAttempt readRestOfPacket:]-[GrowlGNTPCommunicationAttempt readOneLineFromSocket:tag:]-[GrowlGNTPCommunicationAttempt socket:didConnectToHost:port:]-[GrowlGNTPCommunicationAttempt socket:didReadData:withTag:]-[GrowlGNTPCommunicationAttempt parseError]___Block_byref_object_copy____Block_byref_object_dispose____43-[GrowlGNTPCommunicationAttempt parseError]_block_invoke_0___copy_helper_block____destroy_helper_block_-[GrowlGNTPCommunicationAttempt parseFeedback]___46-[GrowlGNTPCommunicationAttempt parseFeedback]_block_invoke_0___copy_helper_block_143___destroy_helper_block_144-[GrowlGNTPCommunicationAttempt socketDidDisconnect:withError:]-[GrowlGNTPCommunicationAttempt responseParseErrorString]-[GrowlGNTPCommunicationAttempt setResponseParseErrorString:]-[GrowlGNTPCommunicationAttempt bogusResponse]-[GrowlGNTPCommunicationAttempt setBogusResponse:]-[GrowlGNTPCommunicationAttempt host]-[GrowlGNTPCommunicationAttempt setHost:]-[GrowlGNTPCommunicationAttempt password]-[GrowlGNTPCommunicationAttempt setPassword:]-[GrowlGNTPCommunicationAttempt callbackHeaderItems]-[GrowlGNTPCommunicationAttempt setCallbackHeaderItems:]-[GrowlGNTPCommunicationAttempt connection]-[GrowlGNTPCommunicationAttempt setConnection:]-[GrowlGCDAsyncReadPacket initWithData:startOffset:maxLength:timeout:readLength:terminator:tag:]-[GrowlGCDAsyncReadPacket ensureCapacityForAdditionalDataOfLength:]-[GrowlGCDAsyncReadPacket optimalReadLengthWithDefault:shouldPreBuffer:]-[GrowlGCDAsyncReadPacket readLengthForNonTermWithHint:]-[GrowlGCDAsyncReadPacket readLengthForTermWithHint:shouldPreBuffer:]-[GrowlGCDAsyncReadPacket readLengthForTermWithPreBuffer:found:]-[GrowlGCDAsyncReadPacket searchForTermAfterPreBuffering:]-[GrowlGCDAsyncReadPacket dealloc]-[GrowlGCDAsyncWritePacket initWithData:timeout:tag:]-[GrowlGCDAsyncWritePacket dealloc]-[GrowlGCDAsyncSpecialPacket initWithTLSSettings:]-[GrowlGCDAsyncSpecialPacket dealloc]-[GrowlGCDAsyncSocket init]-[GrowlGCDAsyncSocket initWithSocketQueue:]-[GrowlGCDAsyncSocket initWithDelegate:delegateQueue:]-[GrowlGCDAsyncSocket initWithDelegate:delegateQueue:socketQueue:]-[GrowlGCDAsyncSocket dealloc]___30-[GrowlGCDAsyncSocket dealloc]_block_invoke_0___copy_helper_block____destroy_helper_block_-[GrowlGCDAsyncSocket delegate]___Block_byref_object_copy____Block_byref_object_dispose____31-[GrowlGCDAsyncSocket delegate]_block_invoke_0___copy_helper_block_80___destroy_helper_block_81-[GrowlGCDAsyncSocket setDelegate:synchronously:]___49-[GrowlGCDAsyncSocket setDelegate:synchronously:]_block_invoke_0___copy_helper_block_84___destroy_helper_block_85-[GrowlGCDAsyncSocket setDelegate:]-[GrowlGCDAsyncSocket synchronouslySetDelegate:]-[GrowlGCDAsyncSocket delegateQueue]___36-[GrowlGCDAsyncSocket delegateQueue]_block_invoke_0___copy_helper_block_90___destroy_helper_block_91-[GrowlGCDAsyncSocket setDelegateQueue:synchronously:]___54-[GrowlGCDAsyncSocket setDelegateQueue:synchronously:]_block_invoke_0___copy_helper_block_94___destroy_helper_block_95-[GrowlGCDAsyncSocket setDelegateQueue:]-[GrowlGCDAsyncSocket synchronouslySetDelegateQueue:]-[GrowlGCDAsyncSocket getDelegate:delegateQueue:]___49-[GrowlGCDAsyncSocket getDelegate:delegateQueue:]_block_invoke_0___copy_helper_block_100___destroy_helper_block_101-[GrowlGCDAsyncSocket setDelegate:delegateQueue:synchronously:]___63-[GrowlGCDAsyncSocket setDelegate:delegateQueue:synchronously:]_block_invoke_0___copy_helper_block_104___destroy_helper_block_105-[GrowlGCDAsyncSocket setDelegate:delegateQueue:]-[GrowlGCDAsyncSocket synchronouslySetDelegate:delegateQueue:]-[GrowlGCDAsyncSocket autoDisconnectOnClosedReadStream]___55-[GrowlGCDAsyncSocket autoDisconnectOnClosedReadStream]_block_invoke_0___copy_helper_block_110___destroy_helper_block_111-[GrowlGCDAsyncSocket setAutoDisconnectOnClosedReadStream:]___59-[GrowlGCDAsyncSocket setAutoDisconnectOnClosedReadStream:]_block_invoke_0___copy_helper_block_114___destroy_helper_block_115-[GrowlGCDAsyncSocket isIPv4Enabled]___36-[GrowlGCDAsyncSocket isIPv4Enabled]_block_invoke_0___copy_helper_block_118___destroy_helper_block_119-[GrowlGCDAsyncSocket setIPv4Enabled:]___38-[GrowlGCDAsyncSocket setIPv4Enabled:]_block_invoke_0___copy_helper_block_122___destroy_helper_block_123-[GrowlGCDAsyncSocket isIPv6Enabled]___36-[GrowlGCDAsyncSocket isIPv6Enabled]_block_invoke_0___copy_helper_block_126___destroy_helper_block_127-[GrowlGCDAsyncSocket setIPv6Enabled:]___38-[GrowlGCDAsyncSocket setIPv6Enabled:]_block_invoke_0___copy_helper_block_130___destroy_helper_block_131-[GrowlGCDAsyncSocket isIPv4PreferredOverIPv6]___46-[GrowlGCDAsyncSocket isIPv4PreferredOverIPv6]_block_invoke_0___copy_helper_block_134___destroy_helper_block_135-[GrowlGCDAsyncSocket setPreferIPv4OverIPv6:]___45-[GrowlGCDAsyncSocket setPreferIPv4OverIPv6:]_block_invoke_0___copy_helper_block_138___destroy_helper_block_139-[GrowlGCDAsyncSocket userData]___31-[GrowlGCDAsyncSocket userData]_block_invoke_0___copy_helper_block_142___destroy_helper_block_143-[GrowlGCDAsyncSocket setUserData:]___35-[GrowlGCDAsyncSocket setUserData:]_block_invoke_0___copy_helper_block_148___destroy_helper_block_149-[GrowlGCDAsyncSocket acceptOnPort:error:]-[GrowlGCDAsyncSocket acceptOnInterface:port:error:]___52-[GrowlGCDAsyncSocket acceptOnInterface:port:error:]_block_invoke_0___copy_helper_block_166___destroy_helper_block_167___52-[GrowlGCDAsyncSocket acceptOnInterface:port:error:]_block_invoke_0171___block_global_0___copy_helper_block_204___destroy_helper_block_205___block_global_1___block_global_2___copy_helper_block_210___destroy_helper_block_211___block_global_3___copy_helper_block_216___destroy_helper_block_217-[GrowlGCDAsyncSocket doAccept:]___32-[GrowlGCDAsyncSocket doAccept:]_block_invoke_0___block_global_4___copy_helper_block_232___destroy_helper_block_233___copy_helper_block_238___destroy_helper_block_239-[GrowlGCDAsyncSocket preConnectWithInterface:error:]-[GrowlGCDAsyncSocket connectToHost:onPort:error:]-[GrowlGCDAsyncSocket connectToHost:onPort:withTimeout:error:]-[GrowlGCDAsyncSocket connectToHost:onPort:viaInterface:withTimeout:error:]___75-[GrowlGCDAsyncSocket connectToHost:onPort:viaInterface:withTimeout:error:]_block_invoke_0___block_global_5___copy_helper_block_256___destroy_helper_block_257___copy_helper_block_262___destroy_helper_block_263-[GrowlGCDAsyncSocket connectToAddress:error:]-[GrowlGCDAsyncSocket connectToAddress:withTimeout:error:]-[GrowlGCDAsyncSocket connectToAddress:viaInterface:withTimeout:error:]___71-[GrowlGCDAsyncSocket connectToAddress:viaInterface:withTimeout:error:]_block_invoke_0___copy_helper_block_276___destroy_helper_block_277-[GrowlGCDAsyncSocket lookup:host:port:]___40-[GrowlGCDAsyncSocket lookup:host:port:]_block_invoke_0___copy_helper_block_298___destroy_helper_block_299___40-[GrowlGCDAsyncSocket lookup:host:port:]_block_invoke_0302___copy_helper_block_305___destroy_helper_block_306-[GrowlGCDAsyncSocket lookup:didSucceedWithAddress4:address6:]-[GrowlGCDAsyncSocket lookup:didFail:]-[GrowlGCDAsyncSocket connectWithAddress4:address6:error:]___58-[GrowlGCDAsyncSocket connectWithAddress4:address6:error:]_block_invoke_0___block_global_6___copy_helper_block_323___destroy_helper_block_324___block_global_7___copy_helper_block_331___destroy_helper_block_332___copy_helper_block_335___destroy_helper_block_336-[GrowlGCDAsyncSocket didConnect:]___34-[GrowlGCDAsyncSocket didConnect:]_block_invoke_0___copy_helper_block_345___destroy_helper_block_346-[GrowlGCDAsyncSocket didNotConnect:error:]-[GrowlGCDAsyncSocket startConnectTimeout:]___43-[GrowlGCDAsyncSocket startConnectTimeout:]_block_invoke_0___copy_helper_block_355___destroy_helper_block_356___43-[GrowlGCDAsyncSocket startConnectTimeout:]_block_invoke_0359-[GrowlGCDAsyncSocket endConnectTimeout]-[GrowlGCDAsyncSocket doConnectTimeout]-[GrowlGCDAsyncSocket closeWithError:]___38-[GrowlGCDAsyncSocket closeWithError:]_block_invoke_0___copy_helper_block_376___destroy_helper_block_377-[GrowlGCDAsyncSocket disconnect]___33-[GrowlGCDAsyncSocket disconnect]_block_invoke_0___copy_helper_block_380___destroy_helper_block_381-[GrowlGCDAsyncSocket disconnectAfterReading]___45-[GrowlGCDAsyncSocket disconnectAfterReading]_block_invoke_0___copy_helper_block_386___destroy_helper_block_387-[GrowlGCDAsyncSocket disconnectAfterWriting]___45-[GrowlGCDAsyncSocket disconnectAfterWriting]_block_invoke_0___copy_helper_block_390___destroy_helper_block_391-[GrowlGCDAsyncSocket disconnectAfterReadingAndWriting]___55-[GrowlGCDAsyncSocket disconnectAfterReadingAndWriting]_block_invoke_0___copy_helper_block_394___destroy_helper_block_395-[GrowlGCDAsyncSocket maybeClose]-[GrowlGCDAsyncSocket badConfigError:]-[GrowlGCDAsyncSocket badParamError:]-[GrowlGCDAsyncSocket gaiError:]-[GrowlGCDAsyncSocket errnoErrorWithReason:]-[GrowlGCDAsyncSocket errnoError]-[GrowlGCDAsyncSocket sslError:]-[GrowlGCDAsyncSocket connectTimeoutError]-[GrowlGCDAsyncSocket readMaxedOutError]-[GrowlGCDAsyncSocket readTimeoutError]-[GrowlGCDAsyncSocket writeTimeoutError]-[GrowlGCDAsyncSocket connectionClosedError]-[GrowlGCDAsyncSocket otherError:]-[GrowlGCDAsyncSocket isDisconnected]___37-[GrowlGCDAsyncSocket isDisconnected]_block_invoke_0___copy_helper_block_448___destroy_helper_block_449-[GrowlGCDAsyncSocket isConnected]___34-[GrowlGCDAsyncSocket isConnected]_block_invoke_0___copy_helper_block_452___destroy_helper_block_453-[GrowlGCDAsyncSocket connectedHost]___36-[GrowlGCDAsyncSocket connectedHost]_block_invoke_0___copy_helper_block_460___destroy_helper_block_461-[GrowlGCDAsyncSocket connectedPort]___36-[GrowlGCDAsyncSocket connectedPort]_block_invoke_0___copy_helper_block_468___destroy_helper_block_469-[GrowlGCDAsyncSocket localHost]___32-[GrowlGCDAsyncSocket localHost]_block_invoke_0___copy_helper_block_476___destroy_helper_block_477-[GrowlGCDAsyncSocket localPort]___32-[GrowlGCDAsyncSocket localPort]_block_invoke_0___copy_helper_block_484___destroy_helper_block_485-[GrowlGCDAsyncSocket connectedHost4]-[GrowlGCDAsyncSocket connectedHost6]-[GrowlGCDAsyncSocket connectedPort4]-[GrowlGCDAsyncSocket connectedPort6]-[GrowlGCDAsyncSocket localHost4]-[GrowlGCDAsyncSocket localHost6]-[GrowlGCDAsyncSocket localPort4]-[GrowlGCDAsyncSocket localPort6]-[GrowlGCDAsyncSocket connectedHostFromSocket4:]-[GrowlGCDAsyncSocket connectedHostFromSocket6:]-[GrowlGCDAsyncSocket connectedPortFromSocket4:]-[GrowlGCDAsyncSocket connectedPortFromSocket6:]-[GrowlGCDAsyncSocket localHostFromSocket4:]-[GrowlGCDAsyncSocket localHostFromSocket6:]-[GrowlGCDAsyncSocket localPortFromSocket4:]-[GrowlGCDAsyncSocket localPortFromSocket6:]-[GrowlGCDAsyncSocket connectedAddress]___39-[GrowlGCDAsyncSocket connectedAddress]_block_invoke_0___copy_helper_block_498___destroy_helper_block_499-[GrowlGCDAsyncSocket localAddress]___35-[GrowlGCDAsyncSocket localAddress]_block_invoke_0___copy_helper_block_502___destroy_helper_block_503-[GrowlGCDAsyncSocket isIPv4]___29-[GrowlGCDAsyncSocket isIPv4]_block_invoke_0___copy_helper_block_506___destroy_helper_block_507-[GrowlGCDAsyncSocket isIPv6]___29-[GrowlGCDAsyncSocket isIPv6]_block_invoke_0___copy_helper_block_510___destroy_helper_block_511-[GrowlGCDAsyncSocket getInterfaceAddress4:address6:fromDescription:port:]-[GrowlGCDAsyncSocket setupReadAndWriteSourcesForNewlyConnectedSocket:]___71-[GrowlGCDAsyncSocket setupReadAndWriteSourcesForNewlyConnectedSocket:]_block_invoke_0___copy_helper_block_524___destroy_helper_block_525___71-[GrowlGCDAsyncSocket setupReadAndWriteSourcesForNewlyConnectedSocket:]_block_invoke_0528___copy_helper_block_531___destroy_helper_block_532___71-[GrowlGCDAsyncSocket setupReadAndWriteSourcesForNewlyConnectedSocket:]_block_invoke_0535___copy_helper_block_536___destroy_helper_block_537___71-[GrowlGCDAsyncSocket setupReadAndWriteSourcesForNewlyConnectedSocket:]_block_invoke_0540___copy_helper_block_541___destroy_helper_block_542-[GrowlGCDAsyncSocket usingCFStream]-[GrowlGCDAsyncSocket suspendReadSource]-[GrowlGCDAsyncSocket resumeReadSource]-[GrowlGCDAsyncSocket suspendWriteSource]-[GrowlGCDAsyncSocket resumeWriteSource]-[GrowlGCDAsyncSocket readDataWithTimeout:tag:]-[GrowlGCDAsyncSocket readDataWithTimeout:buffer:bufferOffset:tag:]-[GrowlGCDAsyncSocket readDataWithTimeout:buffer:bufferOffset:maxLength:tag:]___77-[GrowlGCDAsyncSocket readDataWithTimeout:buffer:bufferOffset:maxLength:tag:]_block_invoke_0___copy_helper_block_551___destroy_helper_block_552-[GrowlGCDAsyncSocket readDataToLength:withTimeout:tag:]-[GrowlGCDAsyncSocket readDataToLength:withTimeout:buffer:bufferOffset:tag:]___76-[GrowlGCDAsyncSocket readDataToLength:withTimeout:buffer:bufferOffset:tag:]_block_invoke_0___copy_helper_block_557___destroy_helper_block_558-[GrowlGCDAsyncSocket readDataToData:withTimeout:tag:]-[GrowlGCDAsyncSocket readDataToData:withTimeout:buffer:bufferOffset:tag:]-[GrowlGCDAsyncSocket readDataToData:withTimeout:maxLength:tag:]-[GrowlGCDAsyncSocket readDataToData:withTimeout:buffer:bufferOffset:maxLength:tag:]___84-[GrowlGCDAsyncSocket readDataToData:withTimeout:buffer:bufferOffset:maxLength:tag:]_block_invoke_0___copy_helper_block_563___destroy_helper_block_564-[GrowlGCDAsyncSocket maybeDequeueRead]-[GrowlGCDAsyncSocket doReadData]___33-[GrowlGCDAsyncSocket doReadData]_block_invoke_0___copy_helper_block_602___destroy_helper_block_603-[GrowlGCDAsyncSocket doReadEOF]___32-[GrowlGCDAsyncSocket doReadEOF]_block_invoke_0___copy_helper_block_610___destroy_helper_block_611-[GrowlGCDAsyncSocket completeCurrentRead]___42-[GrowlGCDAsyncSocket completeCurrentRead]_block_invoke_0___copy_helper_block_618___destroy_helper_block_619-[GrowlGCDAsyncSocket endCurrentRead]-[GrowlGCDAsyncSocket setupReadTimerWithTimeout:]___49-[GrowlGCDAsyncSocket setupReadTimerWithTimeout:]_block_invoke_0___copy_helper_block_624___destroy_helper_block_625___49-[GrowlGCDAsyncSocket setupReadTimerWithTimeout:]_block_invoke_0628-[GrowlGCDAsyncSocket doReadTimeout]___36-[GrowlGCDAsyncSocket doReadTimeout]_block_invoke_0___block_global_8___copy_helper_block_635___destroy_helper_block_636___copy_helper_block_639___destroy_helper_block_640-[GrowlGCDAsyncSocket doReadTimeoutWithExtension:]-[GrowlGCDAsyncSocket writeData:withTimeout:tag:]___49-[GrowlGCDAsyncSocket writeData:withTimeout:tag:]_block_invoke_0___copy_helper_block_647___destroy_helper_block_648-[GrowlGCDAsyncSocket maybeDequeueWrite]-[GrowlGCDAsyncSocket doWriteData]___34-[GrowlGCDAsyncSocket doWriteData]_block_invoke_0___copy_helper_block_661___destroy_helper_block_662-[GrowlGCDAsyncSocket completeCurrentWrite]___43-[GrowlGCDAsyncSocket completeCurrentWrite]_block_invoke_0___copy_helper_block_667___destroy_helper_block_668-[GrowlGCDAsyncSocket endCurrentWrite]-[GrowlGCDAsyncSocket setupWriteTimerWithTimeout:]___50-[GrowlGCDAsyncSocket setupWriteTimerWithTimeout:]_block_invoke_0___copy_helper_block_673___destroy_helper_block_674___50-[GrowlGCDAsyncSocket setupWriteTimerWithTimeout:]_block_invoke_0677-[GrowlGCDAsyncSocket doWriteTimeout]___37-[GrowlGCDAsyncSocket doWriteTimeout]_block_invoke_0___block_global_9___copy_helper_block_684___destroy_helper_block_685___copy_helper_block_688___destroy_helper_block_689-[GrowlGCDAsyncSocket doWriteTimeoutWithExtension:]-[GrowlGCDAsyncSocket startTLS:]___32-[GrowlGCDAsyncSocket startTLS:]_block_invoke_0___copy_helper_block_697___destroy_helper_block_698-[GrowlGCDAsyncSocket sslReadWithBuffer:length:]-[GrowlGCDAsyncSocket sslWriteWithBuffer:length:]-[GrowlGCDAsyncSocket maybeStartTLS]-[GrowlGCDAsyncSocket continueSSLHandshake]___43-[GrowlGCDAsyncSocket continueSSLHandshake]_block_invoke_0___copy_helper_block_737___destroy_helper_block_738-[GrowlGCDAsyncSocket performBlock:]-[GrowlGCDAsyncSocket socketFD]-[GrowlGCDAsyncSocket socket4FD]-[GrowlGCDAsyncSocket socket6FD]-[GrowlGCDAsyncSocket sslContext]+[GrowlGCDAsyncSocket hostFromAddress4:]+[GrowlGCDAsyncSocket hostFromAddress6:]+[GrowlGCDAsyncSocket portFromAddress4:]+[GrowlGCDAsyncSocket portFromAddress6:]+[GrowlGCDAsyncSocket hostFromAddress:]+[GrowlGCDAsyncSocket portFromAddress:]+[GrowlGCDAsyncSocket getHost:port:fromAddress:]+[GrowlGCDAsyncSocket CRLFData]+[GrowlGCDAsyncSocket CRData]+[GrowlGCDAsyncSocket LFData]+[GrowlGCDAsyncSocket ZeroData]+[GrowlGNTPInitialHeaderItem initialHeaderItemWithAction:]-[GrowlGNTPInitialHeaderItem initWithAction:]-[GrowlGNTPInitialHeaderItem dealloc]-[GrowlGNTPInitialHeaderItem GNTPRepresentationAsString]-[GrowlGNTPInitialHeaderItem GNTPRepresentation]-[GrowlGNTPInitialHeaderItem action]-[GrowlGNTPInitialHeaderItem setAction:]-[GrowlGNTPInitialHeaderItem encryption]-[GrowlGNTPInitialHeaderItem setEncryption:]-[GrowlGNTPInitialHeaderItem key]-[GrowlGNTPInitialHeaderItem setKey:]+[GrowlGNTPEndHeaderItem endHeaderItem]-[GrowlGNTPEndHeaderItem init]-[GrowlGNTPEndHeaderItem GNTPRepresentationAsString]-[GrowlGNTPEndHeaderItem GNTPRepresentation]-[GrowlGNTPEndHeaderItem connectionType]-[GrowlGNTPEndHeaderItem setConnectionType:]+[GrowlGNTPOutgoingPacket outgoingPacket]+[GrowlGNTPOutgoingPacket outgoingPacketOfType:forDict:]+[GrowlGNTPOutgoingPacket outgoingPacketForNotification:]+[GrowlGNTPOutgoingPacket outgoingPacketForRegistrationWithNotifications:]-[GrowlGNTPOutgoingPacket init]-[GrowlGNTPOutgoingPacket dealloc]-[GrowlGNTPOutgoingPacket setKey:]-[GrowlGNTPOutgoingPacket key]-[GrowlGNTPOutgoingPacket addHeaderItem:]-[GrowlGNTPOutgoingPacket addHeaderItems:]-[GrowlGNTPOutgoingPacket addBinaryChunk:]-[GrowlGNTPOutgoingPacket addBinaryChunks:]-[GrowlGNTPOutgoingPacket packetID]-[GrowlGNTPOutgoingPacket setPacketID:]-[GrowlGNTPOutgoingPacket outgoingItems]-[GrowlGNTPOutgoingPacket writeToSocket:]-[GrowlGNTPOutgoingPacket needsPersistentConnectionForCallback]-[GrowlGNTPOutgoingPacket description]-[GrowlGNTPOutgoingPacket action]-[GrowlGNTPOutgoingPacket setAction:]-[GrowlGNTPOutgoingPacket growlDictionary]-[GrowlGNTPOutgoingPacket setGrowlDictionary:]-[GrowlGNTPOutgoingPacket headerItems]-[GrowlGNTPOutgoingPacket setHeaderItems:]+[GrowlGNTPEncryptedHeaders headerItemFromData:error:]-[GrowlGNTPEncryptedHeaders initForData:error:]-[GrowlGNTPEncryptedHeaders GNTPRepresentation]-[GrowlGNTPEncryptedHeaders GNTPRepresentationAsString]-[GrowlGNTPEncryptedHeaders headers]-[GrowlGNTPEncryptedHeaders setHeaders:]+[GrowlGNTPHeaderItem headerItemFromData:error:]+[GrowlGNTPHeaderItem headerItemWithName:value:]+[GrowlGNTPHeaderItem separatorHeaderItem]-[GrowlGNTPHeaderItem initForData:error:]-[GrowlGNTPHeaderItem dealloc]-[GrowlGNTPHeaderItem headerName]-[GrowlGNTPHeaderItem setHeaderName:]-[GrowlGNTPHeaderItem headerValue]-[GrowlGNTPHeaderItem setHeaderValue:]-[GrowlGNTPHeaderItem GNTPRepresentationAsString]-[GrowlGNTPHeaderItem GNTPRepresentation]-[GrowlGNTPHeaderItem description]+[GrowlGNTPBinaryChunk chunkForData:withIdentifier:]-[GrowlGNTPBinaryChunk initWithData:identifier:]-[GrowlGNTPBinaryChunk dealloc]-[GrowlGNTPBinaryChunk length]-[GrowlGNTPBinaryChunk stringThatPrecedesTheData]-[GrowlGNTPBinaryChunk stringThatFollowsTheData]-[GrowlGNTPBinaryChunk GNTPRepresentation]-[GrowlGNTPBinaryChunk GNTPRepresentationAsString]+[GrowlGNTPBinaryChunk identifierForBinaryData:]-[GrowlGNTPBinaryChunk data]-[GrowlGNTPBinaryChunk setData:]-[GrowlGNTPBinaryChunk identifier]-[GrowlGNTPBinaryChunk setIdentifier:]+[GrowlISO8601DateFormatter initialize]+[GrowlISO8601DateFormatter purgeGlobalCaches]-[GrowlISO8601DateFormatter makeCalendarWithDesiredConfiguration]-[GrowlISO8601DateFormatter init]-[GrowlISO8601DateFormatter dealloc]-[GrowlISO8601DateFormatter setDefaultTimeZone:]-[GrowlISO8601DateFormatter dateComponentsFromString:]-[GrowlISO8601DateFormatter dateComponentsFromString:timeZone:]-[GrowlISO8601DateFormatter dateComponentsFromString:timeZone:range:]_read_segment_read_segment_2digits_read_double-[GrowlISO8601DateFormatter dateFromString:]-[GrowlISO8601DateFormatter dateFromString:timeZone:]-[GrowlISO8601DateFormatter dateFromString:timeZone:range:]-[GrowlISO8601DateFormatter getObjectValue:forString:errorDescription:]-[GrowlISO8601DateFormatter replaceColonsInString:withTimeSeparator:]-[GrowlISO8601DateFormatter stringFromDate:]-[GrowlISO8601DateFormatter stringFromDate:timeZone:]-[GrowlISO8601DateFormatter stringFromDate:formatString:timeZone:]-[GrowlISO8601DateFormatter stringForObjectValue:]-[GrowlISO8601DateFormatter weekDateStringForDate:timeZone:]-[GrowlISO8601DateFormatter defaultTimeZone]-[GrowlISO8601DateFormatter parsesStrictly]-[GrowlISO8601DateFormatter setParsesStrictly:]-[GrowlISO8601DateFormatter format]-[GrowlISO8601DateFormatter setFormat:]-[GrowlISO8601DateFormatter includeTime]-[GrowlISO8601DateFormatter setIncludeTime:]-[GrowlISO8601DateFormatter timeSeparator]-[GrowlISO8601DateFormatter setTimeSeparator:]-[GrowlOkGNTPPacket dealloc]-[GrowlOkGNTPPacket receivedHeaderItem:]-[GrowlOkGNTPPacket callbackResultSendBehavior]-[GrowlOkGNTPPacket responseAction]-[GrowlOkGNTPPacket setResponseAction:]+[GrowlGNTPPacket addSentAndReceivedHeadersFromDict:toArray:]-[GrowlGNTPPacket packetDidFinishReading:]-[GrowlGNTPPacket packetDidDisconnect:]-[GrowlGNTPPacket packet:failedReadingWithError:]-[GrowlGNTPPacket packet:willChangePacketIDFrom:to:]-[GrowlGNTPPacket delegate]-[GrowlGNTPPacket setDelegate:]+[GrowlRegisterGNTPPacket getHeaders:andBinaryChunks:forRegistrationDict:]+[GrowlNotificationGNTPPacket callbackResultSendBehaviorForHeaders:]+[GrowlNotificationGNTPPacket getHeaders:binaryChunks:notificationID:forNotificationDict:]-[GrowlErrorGNTPPacket init]-[GrowlErrorGNTPPacket dealloc]-[GrowlErrorGNTPPacket receivedHeaderItem:]-[GrowlErrorGNTPPacket callbackResultSendBehavior]-[GrowlErrorGNTPPacket errorDescription]-[GrowlErrorGNTPPacket setErrorDescription:]-[GrowlErrorGNTPPacket errorCode]-[GrowlErrorGNTPPacket setErrorCode:]+[GNTPKey isSupportedHashAlgorithm:]+[GNTPKey isSupportedEncryptionAlgorithm:]+[GNTPKey encryptionAlgorithmFromString:]+[GNTPKey hashingAlgorithmFromString:]-[GNTPKey initWithPassword:hashAlgorithm:encryptionAlgorithm:]+[GNTPKey generateSalt:]-[GNTPKey generateSalt]-[GNTPKey generateKey]-[GNTPKey hashAlgorithmString]-[GNTPKey encryptionAlgorithmString]-[GNTPKey encrypt:]-[GNTPKey decrypt:]-[GNTPKey generateIV]-[GNTPKey key]-[GNTPKey encryption]-[GNTPKey hashAlgorithm]-[GNTPKey setHashAlgorithm:]-[GNTPKey encryptionAlgorithm]-[GNTPKey setEncryptionAlgorithm:]-[GNTPKey encryptionKey]-[GNTPKey setEncryptionKey:]-[GNTPKey keyHash]-[GNTPKey setKeyHash:]-[GNTPKey password]-[GNTPKey setPassword:]-[GNTPKey salt]-[GNTPKey setSalt:]-[GNTPKey IV]-[GNTPKey setIV:]+[GrowlXPCCommunicationAttempt XPCBundleID]+[GrowlXPCCommunicationAttempt canCreateConnection]-[GrowlXPCCommunicationAttempt purpose]-[GrowlXPCCommunicationAttempt begin]-[GrowlXPCCommunicationAttempt finished]-[GrowlXPCCommunicationAttempt establishConnection]___Block_byref_object_copy____Block_byref_object_dispose____51-[GrowlXPCCommunicationAttempt establishConnection]_block_invoke_0___copy_helper_block____destroy_helper_block_-[GrowlXPCCommunicationAttempt handleReply:]-[GrowlXPCCommunicationAttempt sendMessageWithPurpose:]+[GrowlXPCNotificationAttempt attemptType]-[GrowlXPCNotificationAttempt purpose]+[GrowlXPCRegistrationAttempt attemptType]-[GrowlXPCRegistrationAttempt purpose]+[NSObject(NSObject_XPCHelpers) xpcObjectToNSObject:]___53+[NSObject(NSObject_XPCHelpers) xpcObjectToNSObject:]_block_invoke_0___copy_helper_block____destroy_helper_block____53+[NSObject(NSObject_XPCHelpers) xpcObjectToNSObject:]_block_invoke_014___copy_helper_block_17___destroy_helper_block_18-[NSObject(NSObject_XPCHelpers) newXPCObject]___45-[NSObject(NSObject_XPCHelpers) newXPCObject]_block_invoke_0___copy_helper_block_52___destroy_helper_block_53___45-[NSObject(NSObject_XPCHelpers) newXPCObject]_block_invoke_069___copy_helper_block_70___destroy_helper_block_71+[GrowlNetworkUtilities localHostName]_shouldUseBuiltInNotifications___block_descriptor_tmp___block_descriptor_tmp___block_descriptor_tmp38___block_descriptor_tmp94___block_literal_global___block_descriptor_tmp___block_descriptor_tmp146___block_descriptor_tmp___block_descriptor_tmp83___block_descriptor_tmp87___block_descriptor_tmp93___block_descriptor_tmp97___block_descriptor_tmp103___block_descriptor_tmp107___block_descriptor_tmp113___block_descriptor_tmp117___block_descriptor_tmp121___block_descriptor_tmp125___block_descriptor_tmp129___block_descriptor_tmp133___block_descriptor_tmp137___block_descriptor_tmp141___block_descriptor_tmp145___block_descriptor_tmp151___block_descriptor_tmp170___block_descriptor_tmp207___block_descriptor_tmp209___block_descriptor_tmp213___block_descriptor_tmp215___block_descriptor_tmp219___block_descriptor_tmp235___block_descriptor_tmp241___block_descriptor_tmp259___block_descriptor_tmp265___block_descriptor_tmp279___block_descriptor_tmp301___block_descriptor_tmp308___block_descriptor_tmp326___block_descriptor_tmp334___block_descriptor_tmp338___block_descriptor_tmp348___block_descriptor_tmp358___block_descriptor_tmp361___block_descriptor_tmp379___block_descriptor_tmp383___block_descriptor_tmp389___block_descriptor_tmp393___block_descriptor_tmp397___block_descriptor_tmp451___block_descriptor_tmp455___block_descriptor_tmp463___block_descriptor_tmp471___block_descriptor_tmp479___block_descriptor_tmp487___block_descriptor_tmp501___block_descriptor_tmp505___block_descriptor_tmp509___block_descriptor_tmp513___block_descriptor_tmp527___block_descriptor_tmp534___block_descriptor_tmp539___block_descriptor_tmp544___block_descriptor_tmp554___block_descriptor_tmp560___block_descriptor_tmp566___block_descriptor_tmp605___block_descriptor_tmp613___block_descriptor_tmp621___block_descriptor_tmp627___block_descriptor_tmp630___block_descriptor_tmp638___block_descriptor_tmp642___block_descriptor_tmp650___block_descriptor_tmp664___block_descriptor_tmp670___block_descriptor_tmp676___block_descriptor_tmp679___block_descriptor_tmp687___block_descriptor_tmp691___block_descriptor_tmp700___block_descriptor_tmp740___block_descriptor_tmp___block_descriptor_tmp___block_descriptor_tmp21___block_descriptor_tmp56___block_descriptor_tmp74__attempts_delegate_cachedRegistrationDictionary_appName_appIconData_registeredWithGrowl.b_hasGNTP.b_networkClient_sandboxed.b_queuedGrowlNotifications_attemptingToRegister.b_miniDispatch_registerWhenGrowlIsReady+[GrowlApplicationBridge _growlIsReachableUpdateCache:]._cached.b+[GrowlApplicationBridge _growlIsReachableUpdateCache:]._reachable+[GrowlApplicationBridge _checkSandbox].checked.b_prefPaneBundle_helperAppBundle-[GrowlGNTPCommunicationAttempt readRestOfPacket:].triple+[GrowlGNTPHeaderItem separatorHeaderItem].separatorHeaderItem_timeZonesByOffset+[GrowlGNTPPacket addSentAndReceivedHeadersFromDict:toArray:].determinedMachineInfo.b+[GrowlGNTPPacket addSentAndReceivedHeadersFromDict:toArray:].growlName+[GrowlGNTPPacket addSentAndReceivedHeadersFromDict:toArray:].growlVersion+[GrowlGNTPPacket addSentAndReceivedHeadersFromDict:toArray:].platformVersion+[GrowlXPCCommunicationAttempt canCreateConnection].searched.b+[GrowlXPCCommunicationAttempt canCreateConnection].found.búÞ Àœ$5¥úÞ …0GjP com.growl.growlframeworkš_aû*½ÊÔÛ^É'Û[¤ÚÈù‘I?i´ã¿~¦ô&{ËšñyxK Æ·ÔP²åZ|k|¥¾] ©ü™ì±Š3-ÅáשI¢p:nž€‰Pñ`¼As½^¦¡ü+£8¾ºøûqsKÄÐ_/nÛíÓ—ÍšbR3Çúê'šz#švâuõoöÏ>]U†ˆáp¦ÚæH0Ø·ÇâIìtég¼ —­†“XèPSÇ:X™Ìl«…}–pA¤–ô;’ê?íì¢ÆEøvˆÍuú܉¤.ž!!é‚%“Źø–óNZ´_Æ«É&5ÍúÝ䉵 ‘ЗðÇõvÈ€öRŠ•Ý¢û°®H¼ ÔLLsk!§GáâÉê Æ*íêŒPÌÚ¡lV½Ëcä}+AØÞµ%*iß,…5 ®Ì¹?R×HÚw«PŠ^í lýx¼IåÁ‘£q)_y‘Ÿƒ/æKeË‹c/~ål£&fJ70 OtÙÚ ø¡6›³4t¨ûùiß7Ÿ+áó2•^œñÀ(qÜ܆Íb8:kCýØ—œÞ˜%’Ž kâµû•.k¡¯_ËhQñ…©ø3)P»΋b®ü0Ô.’4<aCžB?½úmaa¬D99á!©¹¦‡Á“x €3ì‚^«©YWC‰g[ˆ¢$ñ­†Žä"qd¬KÊ!t€*IJOþ=d}|L™ÕÐiƒÏvëÓa Z³Ù§³ÝrŠ6r †EJ\V>3Ê}&ã“0©¥¨_y”óqÇéƵzZ˄Ʃ4ѰVro;[5BiŵþÄ‚N„)4>ö+_¤¾Ï°V×S4·×e+:¥NæŽÃ¦5»[ºûE Üã†ÐÔGó†]é蜅nÞ:xG:Ù«¾YÇÙb¼ÆŽ&`Ÿ¼hÚ4,°Sarønéö™iŒ£;¬gŸöXž^2&@öìÍW÷Ø7§Q«E`ÁYX»Êb¤ÂTF³¸fD/|™“X0÷:+uIŒ‡ß·TNtøû°öSx$Rz»Iïþî&µ!Îyш¹Ø¨ É&›·—ñéÈaĨŒMÀsÅŸPD®wuvca6› [¯‡Ì•zMªõ£™âvˆUŸúnI×µš×ÞãݾÀy)V†“¢ø*†¬ÄþHø<2™,ó£#¡“8uMv@pˆs³šdÔ¡bn3%*n-l^„SÌÆ c‡®‡Cª-ÖZüÄ>CQî錡òC 'M€¯¢él=ª«6Vî[Û¯Ül4#~;JWêD?T•Ò8¬yÈÝPTóyùV£æ¹5²–ƒð ê ™¦9‘`¢°¡MjŒÀît¤é?-ØÆzˆh7pÏQ±ŒKbŒ3­<¡lÇû÷ Æ'´·ÄÚß×¼‘­Fx8²Î‰ØÆÚÉÚÀ˜¦.wÉ¿ 3Š'ûH—Å ÃÚë}âb¥=˜EàG‡Ï¾Ò3ö }ì)NNlÄAö%¼ç !(UÚ4¬î(´dÊý© OOø‘’ +†ïŠr^ö¿AÅ×ãž6R{çwÀU¥¢•!î^‡eO:I¥}±Ñž¶’Ü¿"¬G¨Ó ¿ô>G%D^±3‡æšJ÷µ™c0³…AØùŒ-}r*|à=€ ŽVT)Dö€iâ’áÕ ¹”æ_çu·´ìr]\ûÔ ª; |ûÂz†;òã^õs&÷A PÐÜÔ(R¸Ñ2éâùŽ:xuKxˆ6«ÊUº1¥•¥äŠ}àPæ­Ý».(ê䯂šQVQn]°DÙ›Êhñ"Îl}Bìy!:oAûÍ ¬ ´…b'ã@˜üøê‰€õ³¿?AÈŽÄjÁªí5 ¼[¢qNîaÏïÑ8ʼ¨NJâ‘gz•v*(Ñfa¶lÖàw\=YÙ:Ç ø‘ sĘ$úÞ púÞ \com.apple.ApplicationServicescom.apple.AppKitcom.apple.Foundationcom.apple.securitycom.apple.SystemConfiguration libSystem.Bcom.apple.CoreServicescom.apple.CoreFoundationúÞ ÷0€ *†H†÷  €0€1 0 +0€ *†H†÷  ‚‡0‚#0‚  0  *†H†÷ 0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0 080214185635Z 160214185635Z0–1 0 UUS10U Apple Inc.1,0*U #Apple Worldwide Developer Relations1D0BU ;Apple Worldwide Developer Relations Certification Authority0‚"0  *†H†÷ ‚0‚ ‚Ê8T¦ËVªÈ$9HéŒîì_¸&‘¼4SzÎ|c€awd^¥#¶9þP-VXp-~ÄnÁJ…>/ðÞ„¡Wɯ{ÿjúI¬ªÛ*2í–chR=ŒŠì¿k•à¬}—gÎ…•7jí ¶®gÍQdŸÆ\ѼWng5€v6¤‡n8Ø+N{%ØZ¿NƒÁÒ“Õqµ`œ3NUùX †¸ ÁåwEPHº+-ä”…áèÄÆh¥°£üg~pºYKwB‘9¹õÍáLïÀ;HŒ¦å!]ýjj»§5`Òæ­óF)ÉèËéyÀjag²ðýåh¼b_nÏ™Ýïcþ’e«£®0«0Uÿ†0Uÿ0ÿ0Uˆ' ©¶`‹ìëºöGYÅRT£·0U#0€+ÐiG”v þôk.@¦÷GM^06U/0-0+ ) '†%http://www.apple.com/appleca/root.crl0 *†H†÷cd0  *†H†÷ ‚Ú2–ÅT”Ó;‚7f}.hÕÃÆ¸Ë&ŒHÏ$jFŽcÔðÐÝØÄÁ7ò39&-Î.U@ã ¯úÂç !¸Õ€Ï¬(/Î-³N¯†ÆéPÝL)G#ül»˜kH‰á[ÞFÛ5…5ï>ÐâXK8ôíuZ\pV9åá ä‰%½Õ´Ž^ÐY—éKâ߯Dt :GÌ‘:ë#Zþ¥-—÷{»Ö‡FB…ëR=&²c¨´±ÊôÌâ³ÈG࿚YƒúÚ˜S*‚õ|e.•Ù3]õíeÌ17ÅZèkáçˆJuž›(ËJ@ˆeCuÝË:%#ÅžWø.ÎÒ©’^s./%u0‚»0‚£ 0  *†H†÷ 0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0 060425214036Z 350209214036Z0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0‚"0  *†H†÷ ‚0‚ ‚ä‘© ‘ÛGPëí^y„-ë6¢WLU싉ÞùKlõ«"0è>øP ÓA¨˜ùÑÊfœ$kУ»ä*Õžz ¤G‹[Ô73ËÄMÎiÑÉrõ]Õ_›ò%ºUM] ñd5#KY³”÷öœžÏPºÁXPg´ ÷ˬ, op¶?0Œ·CÏ=ó+I(Èþε¹Ù^ÖË=µ:­ô’ ±!.tÕ< Ûb«£q’GSUÁ¯/A³øûãpÍæ£LE~LkP–A‰Ätb ƒA‡3б0XìZ2Œh³Þesÿg^e¼IØvŸ3e¡w”É-£‚z0‚v0Uÿ0Uÿ0ÿ0U+ÐiG”v þôk.@¦÷GM^0U#0€+ÐiG”v þôk.@¦÷GM^0‚U ‚0‚0‚ *†H†÷cd0ò0*+https://www.apple.com/appleca/0Ã+0¶³Reliance on this certificate by any party assumes acceptance of the then applicable standard terms and conditions of use, certificate policy and certification practice statements.0  *†H†÷ ‚\6™L-x·íŒ›Üów›òvÒw0OÁ…ƒ…™=G7ò©›@Ž,Ô±ؾôs›îÒdËyO4Ø¢>ùxÿkÈì}9ƒ‹S Ó8ı¿šO kÿ+üY§ |@VtÓ·‹#;G£Õo$âëÑ·pßEá'Êñmxí絨Ü~"5Ê%ÕÙÖkÔ¢$#÷¡¬s`Æ[ /’²øDHð`8žõ=&g Š3j÷ ‚ÏÞë£/ùSj[dÀc3w÷:,VëÚ!ÚºsOµÙ6Á‡UÙ§™¹2BûØÕqž~¡R·½“B$*ǶMœ^cÈK€PªŠÕÚäüÐ 7°uu!0‚0‚… !Á±?P¦‡0  *†H†÷ 0–1 0 UUS10U Apple Inc.1,0*U #Apple Worldwide Developer Relations1D0BU ;Apple Worldwide Developer Relations Certification Authority0 110824172631Z 120823172631Z010 ’&‰“ò,d T8S9X4YB6F1D0BU ;3rd Party Mac Developer Application: The Growl Project, LLC10U The Growl Project, LLC1 0 UUS0‚"0  *†H†÷ ‚0‚ ‚»ìÖ[¨ˆfWйQ—Á§ ù›#o&*ƒqñžEhCnÀ§]ßuIáiVú9b`¥ªI&)å”Aì§½#ÔŽ×MÆ™% gœ}LfkaÛõ³ÁW‚w\,Ô>:o4‡õLŠ#ô·üeä¸upñƒ¯¥RL$4¡ôð+LÛ‹dyÞ‹ŒÐEE| $ØÉk´/â“ÌɵõBž´Æ´Ëý·Õ)­l(¥÷Çj† ïÛí€ÅrØ_ÇýålÈ£³ Í ‰¸¦PQéñi õÛ@áš mYŠ¿«eO;)0ÐV§Êvk¾¾Ý/”vZÚê•+`ÿ7…nÉH›ßäpìVKêÈc¡£‚ñ0‚í0UdmõÚÁI`ŽzTfŽÊÀ¼ï–0 Uÿ00U#0€ˆ' ©¶`‹ìëºöGYÅRT£·0‚U ‚0‚0ÿ *†H†÷cd0ñ0Ã+0¶ ³Reliance on this certificate by any party assumes acceptance of the then applicable standard terms and conditions of use, certificate policy and certification practice statements.0)+http://www.apple.com/appleca/0MUF0D0B @ >†'9N.œUó¶ƒÎ® ––ғ愵 ÝoQt”lj?C"»J±Èd¶UF!­ÿ+~wl˳e©¶:ä¢z×eF´qÄqQºjαoÂo¹4•œz¾8UÒ;á’pN„gfYç=3y3ìxž8ö £ÒÚêŒvlðRrýÅ·pÀBè1‚*0‚&0£0–1 0 UUS10U Apple Inc.1,0*U #Apple Worldwide Developer Relations1D0BU ;Apple Worldwide Developer Relations Certification Authority!Á±?P¦‡0 + ]0 *†H†÷  1  *†H†÷ 0 *†H†÷  1 111125232416Z0# *†H†÷  1¤j$O‘k£§õï0Ÿ™‰iWµ0  *†H†÷ ‚Á(Áaw7ó-ý ™P èIl ÷:ÿ J¦þ¬L«béèplÌtz­@ŽlTÝ8Vµžã> WÇJ¯(\‰ù â—´Hú—Ä`RÖ;‰ïAoý”0& Jfâ7õì=7)?·¯ Еl0ä OFö+¬Vn,¼È}Kn÷éÏSZ>SÊk‰_ž‚k} @interface InfoTabButtonBack : NSView { NSGradient * fGradient; } @end transmission-2.92/macosx/PaxHeaders.4960/StatsWindow.xib0000644000000000000000000000013212640354045020145 xustar0030 mtime=1451350053.457167878 30 atime=1451350053.457167878 30 ctime=1457295922.465849836 transmission-2.92/macosx/StatsWindow.xib0000644000175000017500000003511212640354045021574 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/MessageWindowController.h0000644000000000000000000000013212442116621022140 xustar0030 mtime=1418239377.039464358 30 atime=1418239377.039464358 30 ctime=1457295923.344864783 transmission-2.92/macosx/MessageWindowController.h0000644000175000017500000000367712442116621023602 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: MessageWindowController.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface MessageWindowController : NSWindowController { IBOutlet NSTableView * fMessageTable; IBOutlet NSPopUpButton * fLevelButton; IBOutlet NSButton * fSaveButton, * fClearButton; IBOutlet NSSearchField * fFilterField; NSMutableArray * fMessages, * fDisplayedMessages; NSDictionary * fAttributes; NSTimer * fTimer; NSLock * fLock; } - (void) updateLog: (NSTimer *) timer; - (void) changeLevel: (id) sender; - (void) changeFilter: (id) sender; - (void) clearLog: (id) sender; - (void) writeToFile: (id) sender; @end transmission-2.92/macosx/PaxHeaders.4960/ButtonToolbarItem.m0000644000000000000000000000013212442116666020753 xustar0030 mtime=1418239414.212101382 30 atime=1418239414.212101382 30 ctime=1457295922.988858729 transmission-2.92/macosx/ButtonToolbarItem.m0000644000175000017500000000347012442116666022404 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: ButtonToolbarItem.m 13251 2012-03-13 02:52:11Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "ButtonToolbarItem.h" @implementation ButtonToolbarItem - (void) validate { [self setEnabled: [[self target] validateToolbarItem: self]]; } - (NSMenuItem *) menuFormRepresentation { NSMenuItem * menuItem = [[NSMenuItem alloc] initWithTitle: [self label] action: [self action] keyEquivalent: @""]; [menuItem setTarget: [self target]]; [menuItem setEnabled: [[self target] validateToolbarItem: self]]; return [menuItem autorelease]; } @end transmission-2.92/macosx/PaxHeaders.4960/TorrentCell.m0000644000000000000000000000013212644245522017571 xustar0030 mtime=1452362578.768699327 30 atime=1452362578.768699327 30 ctime=1457295923.565868542 transmission-2.92/macosx/TorrentCell.m0000644000175000017500000010406012644245522021217 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: TorrentCell.m 14665 2016-01-07 17:21:12Z mikedld $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "TorrentCell.h" #import "GroupsController.h" #import "NSImageAdditions.h" #import "NSStringAdditions.h" #import "ProgressGradients.h" #import "Torrent.h" #import "TorrentTableView.h" #define BAR_HEIGHT 12.0 #define IMAGE_SIZE_REG 32.0 #define IMAGE_SIZE_MIN 16.0 #define ERROR_IMAGE_SIZE 20.0 #define NORMAL_BUTTON_WIDTH 14.0 #define ACTION_BUTTON_WIDTH 16.0 #define PRIORITY_ICON_WIDTH 12.0 #define PRIORITY_ICON_HEIGHT 12.0 //ends up being larger than font height #define HEIGHT_TITLE 16.0 #define HEIGHT_STATUS 12.0 #define PADDING_HORIZONTAL 5.0 #define PADDING_BETWEEN_BUTTONS 3.0 #define PADDING_BETWEEN_IMAGE_AND_TITLE (PADDING_HORIZONTAL + 1.0) #define PADDING_BETWEEN_IMAGE_AND_BAR PADDING_HORIZONTAL #define PADDING_BETWEEN_TITLE_AND_PRIORITY 6.0 #define PADDING_ABOVE_TITLE 4.0 #define PADDING_BETWEEN_TITLE_AND_MIN_STATUS 3.0 #define PADDING_BETWEEN_TITLE_AND_PROGRESS 1.0 #define PADDING_BETWEEN_PROGRESS_AND_BAR 2.0 #define PADDING_BETWEEN_BAR_AND_STATUS 2.0 #define PADDING_BETWEEN_BAR_AND_EDGE_MIN 3.0 #define PADDING_EXPANSION_FRAME 2.0 #define PIECES_TOTAL_PERCENT 0.6 #define MAX_PIECES (18*18) @interface TorrentCell (Private) - (void) drawBar: (NSRect) barRect; - (void) drawRegularBar: (NSRect) barRect; - (void) drawPiecesBar: (NSRect) barRect; - (NSRect) rectForMinimalStatusWithString: (NSAttributedString *) string inBounds: (NSRect) bounds; - (NSRect) rectForTitleWithString: (NSAttributedString *) string withRightBound: (CGFloat) rightBound inBounds: (NSRect) bounds; - (NSRect) rectForProgressWithStringInBounds: (NSRect) bounds; - (NSRect) rectForStatusWithStringInBounds: (NSRect) bounds; - (NSRect) barRectRegForBounds: (NSRect) bounds; - (NSRect) barRectMinForBounds: (NSRect) bounds; - (NSRect) controlButtonRectForBounds: (NSRect) bounds; - (NSRect) revealButtonRectForBounds: (NSRect) bounds; - (NSRect) actionButtonRectForBounds: (NSRect) bounds; - (NSAttributedString *) attributedTitle; - (NSAttributedString *) attributedStatusString: (NSString *) string; - (NSString *) buttonString; - (NSString *) statusString; - (NSString *) minimalStatusString; @end @implementation TorrentCell //only called once and the main table is always needed, so don't worry about releasing - (id) init { if ((self = [super init])) { fDefaults = [NSUserDefaults standardUserDefaults]; NSMutableParagraphStyle * paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; [paragraphStyle setLineBreakMode: NSLineBreakByTruncatingMiddle]; fTitleAttributes = [[NSMutableDictionary alloc] initWithCapacity: 3]; [fTitleAttributes setObject: [NSFont messageFontOfSize: 12.0] forKey: NSFontAttributeName]; [fTitleAttributes setObject: paragraphStyle forKey: NSParagraphStyleAttributeName]; fStatusAttributes = [[NSMutableDictionary alloc] initWithCapacity: 3]; [fStatusAttributes setObject: [NSFont messageFontOfSize: 9.0] forKey: NSFontAttributeName]; [fStatusAttributes setObject: paragraphStyle forKey: NSParagraphStyleAttributeName]; [paragraphStyle release]; fBluePieceColor = [[NSColor colorWithCalibratedRed: 0.0 green: 0.4 blue: 0.8 alpha: 1.0] retain]; fBarBorderColor = [[NSColor colorWithCalibratedWhite: 0.0 alpha: 0.2] retain]; fBarMinimalBorderColor = [[NSColor colorWithCalibratedWhite: 0.0 alpha: 0.015] retain]; } return self; } - (id) copyWithZone: (NSZone *) zone { id value = [super copyWithZone: zone]; [value setRepresentedObject: [self representedObject]]; return value; } - (NSRect) iconRectForBounds: (NSRect) bounds { const CGFloat imageSize = [fDefaults boolForKey: @"SmallView"] ? IMAGE_SIZE_MIN : IMAGE_SIZE_REG; return NSMakeRect(NSMinX(bounds) + PADDING_HORIZONTAL, ceil(NSMidY(bounds) - imageSize * 0.5), imageSize, imageSize); } - (NSUInteger) hitTestForEvent: (NSEvent *) event inRect: (NSRect) cellFrame ofView: (NSView *) controlView { NSPoint point = [controlView convertPoint: [event locationInWindow] fromView: nil]; if (NSMouseInRect(point, [self controlButtonRectForBounds: cellFrame], [controlView isFlipped]) || NSMouseInRect(point, [self revealButtonRectForBounds: cellFrame], [controlView isFlipped])) return NSCellHitContentArea | NSCellHitTrackableArea; return NSCellHitContentArea; } + (BOOL) prefersTrackingUntilMouseUp { return YES; } - (BOOL) trackMouse: (NSEvent *) event inRect: (NSRect) cellFrame ofView: (NSView *) controlView untilMouseUp: (BOOL) flag { fTracking = YES; [self setControlView: controlView]; NSPoint point = [controlView convertPoint: [event locationInWindow] fromView: nil]; const NSRect controlRect = [self controlButtonRectForBounds: cellFrame]; const BOOL checkControl = NSMouseInRect(point, controlRect, [controlView isFlipped]); const NSRect revealRect = [self revealButtonRectForBounds: cellFrame]; const BOOL checkReveal = NSMouseInRect(point, revealRect, [controlView isFlipped]); [(TorrentTableView *)controlView removeTrackingAreas]; while ([event type] != NSLeftMouseUp) { point = [controlView convertPoint: [event locationInWindow] fromView: nil]; if (checkControl) { const BOOL inControlButton = NSMouseInRect(point, controlRect, [controlView isFlipped]); if (fMouseDownControlButton != inControlButton) { fMouseDownControlButton = inControlButton; [controlView setNeedsDisplayInRect: cellFrame]; } } else if (checkReveal) { const BOOL inRevealButton = NSMouseInRect(point, revealRect, [controlView isFlipped]); if (fMouseDownRevealButton != inRevealButton) { fMouseDownRevealButton = inRevealButton; [controlView setNeedsDisplayInRect: cellFrame]; } } else; //send events to where necessary if ([event type] == NSMouseEntered || [event type] == NSMouseExited) [NSApp sendEvent: event]; event = [[controlView window] nextEventMatchingMask: (NSLeftMouseUpMask | NSLeftMouseDraggedMask | NSMouseEnteredMask | NSMouseExitedMask)]; } fTracking = NO; if (fMouseDownControlButton) { fMouseDownControlButton = NO; [(TorrentTableView *)controlView toggleControlForTorrent: [self representedObject]]; } else if (fMouseDownRevealButton) { fMouseDownRevealButton = NO; [controlView setNeedsDisplayInRect: cellFrame]; NSString * location = [[self representedObject] dataLocation]; if (location) { NSURL * file = [NSURL fileURLWithPath: location]; [[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs: [NSArray arrayWithObject: file]]; } } else; [controlView updateTrackingAreas]; return YES; } - (void) addTrackingAreasForView: (NSView *) controlView inRect: (NSRect) cellFrame withUserInfo: (NSDictionary *) userInfo mouseLocation: (NSPoint) mouseLocation { const NSTrackingAreaOptions options = NSTrackingEnabledDuringMouseDrag | NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways; //whole row if ([fDefaults boolForKey: @"SmallView"]) { NSTrackingAreaOptions rowOptions = options; if (NSMouseInRect(mouseLocation, cellFrame, [controlView isFlipped])) { rowOptions |= NSTrackingAssumeInside; [(TorrentTableView *)controlView setRowHover: [[userInfo objectForKey: @"Row"] integerValue]]; } NSMutableDictionary * rowInfo = [userInfo mutableCopy]; [rowInfo setObject: @"Row" forKey: @"Type"]; NSTrackingArea * area = [[NSTrackingArea alloc] initWithRect: cellFrame options: rowOptions owner: controlView userInfo: rowInfo]; [controlView addTrackingArea: area]; [rowInfo release]; [area release]; } //control button NSRect controlButtonRect = [self controlButtonRectForBounds: cellFrame]; NSTrackingAreaOptions controlOptions = options; if (NSMouseInRect(mouseLocation, controlButtonRect, [controlView isFlipped])) { controlOptions |= NSTrackingAssumeInside; [(TorrentTableView *)controlView setControlButtonHover: [[userInfo objectForKey: @"Row"] integerValue]]; } NSMutableDictionary * controlInfo = [userInfo mutableCopy]; [controlInfo setObject: @"Control" forKey: @"Type"]; NSTrackingArea * area = [[NSTrackingArea alloc] initWithRect: controlButtonRect options: controlOptions owner: controlView userInfo: controlInfo]; [controlView addTrackingArea: area]; [controlInfo release]; [area release]; //reveal button NSRect revealButtonRect = [self revealButtonRectForBounds: cellFrame]; NSTrackingAreaOptions revealOptions = options; if (NSMouseInRect(mouseLocation, revealButtonRect, [controlView isFlipped])) { revealOptions |= NSTrackingAssumeInside; [(TorrentTableView *)controlView setRevealButtonHover: [[userInfo objectForKey: @"Row"] integerValue]]; } NSMutableDictionary * revealInfo = [userInfo mutableCopy]; [revealInfo setObject: @"Reveal" forKey: @"Type"]; area = [[NSTrackingArea alloc] initWithRect: revealButtonRect options: revealOptions owner: controlView userInfo: revealInfo]; [controlView addTrackingArea: area]; [revealInfo release]; [area release]; //action button NSRect actionButtonRect = [self iconRectForBounds: cellFrame]; //use the whole icon NSTrackingAreaOptions actionOptions = options; if (NSMouseInRect(mouseLocation, actionButtonRect, [controlView isFlipped])) { actionOptions |= NSTrackingAssumeInside; [(TorrentTableView *)controlView setActionButtonHover: [[userInfo objectForKey: @"Row"] integerValue]]; } NSMutableDictionary * actionInfo = [userInfo mutableCopy]; [actionInfo setObject: @"Action" forKey: @"Type"]; area = [[NSTrackingArea alloc] initWithRect: actionButtonRect options: actionOptions owner: controlView userInfo: actionInfo]; [controlView addTrackingArea: area]; [actionInfo release]; [area release]; } - (void) setHover: (BOOL) hover { fHover = hover; } - (void) setControlHover: (BOOL) hover { fHoverControl = hover; } - (void) setRevealHover: (BOOL) hover { fHoverReveal = hover; } - (void) setActionHover: (BOOL) hover { fHoverAction = hover; } - (void) setActionPushed: (BOOL) pushed { fMouseDownActionButton = pushed; } - (void) drawInteriorWithFrame: (NSRect) cellFrame inView: (NSView *) controlView { Torrent * torrent = [self representedObject]; NSAssert(torrent != nil, @"can't have a TorrentCell without a Torrent"); const BOOL minimal = [fDefaults boolForKey: @"SmallView"]; //bar [self drawBar: minimal ? [self barRectMinForBounds: cellFrame] : [self barRectRegForBounds: cellFrame]]; //group coloring const NSRect iconRect = [self iconRectForBounds: cellFrame]; const NSInteger groupValue = [torrent groupValue]; if (groupValue != -1) { NSRect groupRect = NSInsetRect(iconRect, -1.0, -2.0); if (!minimal) { groupRect.size.height -= 1.0; groupRect.origin.y -= 1.0; } const CGFloat radius = minimal ? 3.0 : 6.0; NSColor * groupColor = [[GroupsController groups] colorForIndex: groupValue], * darkGroupColor = [groupColor blendedColorWithFraction: 0.2 ofColor: [NSColor whiteColor]]; //border NSBezierPath * bp = [NSBezierPath bezierPathWithRoundedRect: groupRect xRadius: radius yRadius: radius]; [darkGroupColor set]; [bp setLineWidth: 2.0]; [bp stroke]; //inside bp = [NSBezierPath bezierPathWithRoundedRect: groupRect xRadius: radius yRadius: radius]; NSGradient * gradient = [[NSGradient alloc] initWithStartingColor: [groupColor blendedColorWithFraction: 0.7 ofColor: [NSColor whiteColor]] endingColor: darkGroupColor]; [gradient drawInBezierPath: bp angle: 90.0]; [gradient release]; } const BOOL error = [torrent isAnyErrorOrWarning]; //icon if (!minimal || !(!fTracking && fHoverAction)) //don't show in minimal mode when hovered over { NSImage * icon = (minimal && error) ? [NSImage imageNamed: NSImageNameCaution] : [torrent icon]; [icon drawInRect: iconRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0 respectFlipped: YES hints: nil]; } //error badge if (error && !minimal) { NSImage * errorImage = [NSImage imageNamed: NSImageNameCaution]; const NSRect errorRect = NSMakeRect(NSMaxX(iconRect) - ERROR_IMAGE_SIZE, NSMaxY(iconRect) - ERROR_IMAGE_SIZE, ERROR_IMAGE_SIZE, ERROR_IMAGE_SIZE); [errorImage drawInRect: errorRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0 respectFlipped: YES hints: nil]; } //text color NSColor * titleColor, * statusColor; if ([self backgroundStyle] == NSBackgroundStyleDark) titleColor = statusColor = [NSColor whiteColor]; else { titleColor = [NSColor controlTextColor]; statusColor = [NSColor darkGrayColor]; } [fTitleAttributes setObject: titleColor forKey: NSForegroundColorAttributeName]; [fStatusAttributes setObject: statusColor forKey: NSForegroundColorAttributeName]; //minimal status CGFloat minimalTitleRightBound; if (minimal) { NSAttributedString * minimalString = [self attributedStatusString: [self minimalStatusString]]; NSRect minimalStatusRect = [self rectForMinimalStatusWithString: minimalString inBounds: cellFrame]; if (!fHover) [minimalString drawInRect: minimalStatusRect]; minimalTitleRightBound = NSMinX(minimalStatusRect); } //progress if (!minimal) { NSAttributedString * progressString = [self attributedStatusString: [torrent progressString]]; NSRect progressRect = [self rectForProgressWithStringInBounds: cellFrame]; [progressString drawInRect: progressRect]; } if (!minimal || fHover) { //control button NSString * controlImageSuffix; if (fMouseDownControlButton) controlImageSuffix = @"On"; else if (!fTracking && fHoverControl) controlImageSuffix = @"Hover"; else controlImageSuffix = @"Off"; NSImage * controlImage; if ([torrent isActive]) controlImage = [NSImage imageNamed: [@"Pause" stringByAppendingString: controlImageSuffix]]; else { if ([[NSApp currentEvent] modifierFlags] & NSAlternateKeyMask) controlImage = [NSImage imageNamed: [@"ResumeNoWait" stringByAppendingString: controlImageSuffix]]; else if ([torrent waitingToStart]) controlImage = [NSImage imageNamed: [@"Pause" stringByAppendingString: controlImageSuffix]]; else controlImage = [NSImage imageNamed: [@"Resume" stringByAppendingString: controlImageSuffix]]; } const NSRect controlRect = [self controlButtonRectForBounds: cellFrame]; [controlImage drawInRect: controlRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0 respectFlipped: YES hints: nil]; minimalTitleRightBound = MIN(minimalTitleRightBound, NSMinX(controlRect)); //reveal button NSString * revealImageString; if (fMouseDownRevealButton) revealImageString = @"RevealOn"; else if (!fTracking && fHoverReveal) revealImageString = @"RevealHover"; else revealImageString = @"RevealOff"; NSImage * revealImage = [NSImage imageNamed: revealImageString]; [revealImage drawInRect: [self revealButtonRectForBounds: cellFrame] fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0 respectFlipped: YES hints: nil]; //action button #warning image should use new gear NSString * actionImageString; if (fMouseDownActionButton) #warning we can get rid of this on 10.7 actionImageString = @"ActionOn"; else if (!fTracking && fHoverAction) actionImageString = @"ActionHover"; else actionImageString = nil; if (actionImageString) { NSImage * actionImage = [NSImage imageNamed: actionImageString]; [actionImage drawInRect: [self actionButtonRectForBounds: cellFrame] fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0 respectFlipped: YES hints: nil]; } } //title NSAttributedString * titleString = [self attributedTitle]; NSRect titleRect = [self rectForTitleWithString: titleString withRightBound: minimalTitleRightBound inBounds: cellFrame]; [titleString drawInRect: titleRect]; //priority icon if ([torrent priority] != TR_PRI_NORMAL) { const NSRect priorityRect = NSMakeRect(NSMaxX(titleRect) + PADDING_BETWEEN_TITLE_AND_PRIORITY, NSMidY(titleRect) - PRIORITY_ICON_HEIGHT * 0.5, PRIORITY_ICON_WIDTH, PRIORITY_ICON_HEIGHT); NSColor * priorityColor = [self backgroundStyle] == NSBackgroundStyleDark ? [NSColor whiteColor] : [NSColor darkGrayColor]; NSImage * priorityImage = [[NSImage imageNamed: ([torrent priority] == TR_PRI_HIGH ? @"PriorityHighTemplate" : @"PriorityLowTemplate")] imageWithColor: priorityColor]; [priorityImage drawInRect: priorityRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0 respectFlipped: YES hints: nil]; } //status if (!minimal) { NSAttributedString * statusString = [self attributedStatusString: [self statusString]]; [statusString drawInRect: [self rectForStatusWithStringInBounds: cellFrame]]; } } - (NSRect) expansionFrameWithFrame: (NSRect) cellFrame inView: (NSView *) view { BOOL minimal = [fDefaults boolForKey: @"SmallView"]; //this code needs to match the code in drawInteriorWithFrame:withView: CGFloat minimalTitleRightBound; if (minimal) { NSAttributedString * minimalString = [self attributedStatusString: [self minimalStatusString]]; NSRect minimalStatusRect = [self rectForMinimalStatusWithString: minimalString inBounds: cellFrame]; minimalTitleRightBound = NSMinX(minimalStatusRect); } if (!minimal || fHover) { const NSRect controlRect = [self controlButtonRectForBounds: cellFrame]; minimalTitleRightBound = MIN(minimalTitleRightBound, NSMinX(controlRect)); } NSAttributedString * titleString = [self attributedTitle]; NSRect realRect = [self rectForTitleWithString: titleString withRightBound: minimalTitleRightBound inBounds: cellFrame]; NSAssert([titleString size].width >= NSWidth(realRect), @"Full rect width should not be less than the used title rect width!"); if ([titleString size].width > NSWidth(realRect) && NSMouseInRect([view convertPoint: [[view window] mouseLocationOutsideOfEventStream] fromView: nil], realRect, [view isFlipped])) { realRect.size.width = [titleString size].width; return NSInsetRect(realRect, -PADDING_EXPANSION_FRAME, -PADDING_EXPANSION_FRAME); } return NSZeroRect; } - (void) drawWithExpansionFrame: (NSRect) cellFrame inView: (NSView *)view { cellFrame.origin.x += PADDING_EXPANSION_FRAME; cellFrame.origin.y += PADDING_EXPANSION_FRAME; [fTitleAttributes setObject: [NSColor controlTextColor] forKey: NSForegroundColorAttributeName]; NSAttributedString * titleString = [self attributedTitle]; [titleString drawInRect: cellFrame]; } @end @implementation TorrentCell (Private) - (void) drawBar: (NSRect) barRect { const BOOL minimal = [fDefaults boolForKey: @"SmallView"]; const CGFloat piecesBarPercent = [(TorrentTableView *)[self controlView] piecesBarPercent]; if (piecesBarPercent > 0.0) { NSRect piecesBarRect, regularBarRect; NSDivideRect(barRect, &piecesBarRect, ®ularBarRect, floor(NSHeight(barRect) * PIECES_TOTAL_PERCENT * piecesBarPercent), NSMaxYEdge); [self drawRegularBar: regularBarRect]; [self drawPiecesBar: piecesBarRect]; } else { [[self representedObject] setPreviousFinishedPieces: nil]; [self drawRegularBar: barRect]; } NSColor * borderColor = minimal ? fBarMinimalBorderColor : fBarBorderColor; [borderColor set]; [NSBezierPath strokeRect: NSInsetRect(barRect, 0.5, 0.5)]; } - (void) drawRegularBar: (NSRect) barRect { Torrent * torrent = [self representedObject]; NSRect haveRect, missingRect; NSDivideRect(barRect, &haveRect, &missingRect, round([torrent progress] * NSWidth(barRect)), NSMinXEdge); if (!NSIsEmptyRect(haveRect)) { if ([torrent isActive]) { if ([torrent isChecking]) [[ProgressGradients progressYellowGradient] drawInRect: haveRect angle: 90]; else if ([torrent isSeeding]) { NSRect ratioHaveRect, ratioRemainingRect; NSDivideRect(haveRect, &ratioHaveRect, &ratioRemainingRect, round([torrent progressStopRatio] * NSWidth(haveRect)), NSMinXEdge); [[ProgressGradients progressGreenGradient] drawInRect: ratioHaveRect angle: 90]; [[ProgressGradients progressLightGreenGradient] drawInRect: ratioRemainingRect angle: 90]; } else [[ProgressGradients progressBlueGradient] drawInRect: haveRect angle: 90]; } else { if ([torrent waitingToStart]) { if ([torrent allDownloaded]) [[ProgressGradients progressDarkGreenGradient] drawInRect: haveRect angle: 90]; else [[ProgressGradients progressDarkBlueGradient] drawInRect: haveRect angle: 90]; } else [[ProgressGradients progressGrayGradient] drawInRect: haveRect angle: 90]; } } if (![torrent allDownloaded]) { const CGFloat widthRemaining = round(NSWidth(barRect) * [torrent progressLeft]); NSRect wantedRect; NSDivideRect(missingRect, &wantedRect, &missingRect, widthRemaining, NSMinXEdge); //not-available section if ([torrent isActive] && ![torrent isChecking] && [torrent availableDesired] < 1.0 && [fDefaults boolForKey: @"DisplayProgressBarAvailable"]) { NSRect unavailableRect; NSDivideRect(wantedRect, &wantedRect, &unavailableRect, round(NSWidth(wantedRect) * [torrent availableDesired]), NSMinXEdge); [[ProgressGradients progressRedGradient] drawInRect: unavailableRect angle: 90]; } //remaining section [[ProgressGradients progressWhiteGradient] drawInRect: wantedRect angle: 90]; } //unwanted section if (!NSIsEmptyRect(missingRect)) { if (![torrent isMagnet]) [[ProgressGradients progressLightGrayGradient] drawInRect: missingRect angle: 90]; else [[ProgressGradients progressRedGradient] drawInRect: missingRect angle: 90]; } } - (void) drawPiecesBar: (NSRect) barRect { Torrent * torrent = [self representedObject]; //fill an all-white bar for magnet links if ([torrent isMagnet]) { [[NSColor colorWithCalibratedWhite: 1.0 alpha: [fDefaults boolForKey: @"SmallView"] ? 0.25 : 1.0] set]; NSRectFillUsingOperation(barRect, NSCompositeSourceOver); return; } NSInteger pieceCount = MIN([torrent pieceCount], MAX_PIECES); float * piecesPercent = malloc(pieceCount * sizeof(float)); [torrent getAmountFinished: piecesPercent size: pieceCount]; NSBitmapImageRep * bitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes: nil pixelsWide: pieceCount pixelsHigh: 1 bitsPerSample: 8 samplesPerPixel: 4 hasAlpha: YES isPlanar: NO colorSpaceName: NSCalibratedRGBColorSpace bytesPerRow: 0 bitsPerPixel: 0]; NSIndexSet * previousFinishedIndexes = [torrent previousFinishedPieces]; NSMutableIndexSet * finishedIndexes = [NSMutableIndexSet indexSet]; for (NSInteger i = 0; i < pieceCount; i++) { NSColor * pieceColor; if (piecesPercent[i] == 1.0f) { if (previousFinishedIndexes && ![previousFinishedIndexes containsIndex: i]) pieceColor = [NSColor orangeColor]; else pieceColor = fBluePieceColor; [finishedIndexes addIndex: i]; } else pieceColor = [[NSColor whiteColor] blendedColorWithFraction: piecesPercent[i] ofColor: fBluePieceColor]; //it's faster to just set color instead of checking previous color [bitmap setColor: pieceColor atX: i y: 0]; } free(piecesPercent); [torrent setPreviousFinishedPieces: [finishedIndexes count] > 0 ? finishedIndexes : nil]; //don't bother saving if none are complete //actually draw image [bitmap drawInRect: barRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: ([fDefaults boolForKey: @"SmallView"] ? 0.25 : 1.0) respectFlipped: YES hints: nil]; [bitmap release]; } - (NSRect) rectForMinimalStatusWithString: (NSAttributedString *) string inBounds: (NSRect) bounds { NSRect result; result.size = [string size]; result.origin.x = NSMaxX(bounds) - (PADDING_HORIZONTAL + NSWidth(result)); result.origin.y = ceil(NSMidY(bounds) - NSHeight(result) * 0.5); return result; } - (NSRect) rectForTitleWithString: (NSAttributedString *) string withRightBound: (CGFloat) rightBound inBounds: (NSRect) bounds { const BOOL minimal = [fDefaults boolForKey: @"SmallView"]; NSRect result; result.origin.x = NSMinX(bounds) + PADDING_HORIZONTAL + (minimal ? IMAGE_SIZE_MIN : IMAGE_SIZE_REG) + PADDING_BETWEEN_IMAGE_AND_TITLE; result.size.height = HEIGHT_TITLE; if (minimal) { result.origin.y = ceil(NSMidY(bounds) - NSHeight(result) * 0.5); result.size.width = rightBound - NSMinX(result) - PADDING_BETWEEN_TITLE_AND_MIN_STATUS; } else { result.origin.y = NSMinY(bounds) + PADDING_ABOVE_TITLE; result.size.width = NSMaxX(bounds) - NSMinX(result) - PADDING_HORIZONTAL; } if ([(Torrent *)[self representedObject] priority] != TR_PRI_NORMAL) result.size.width -= PRIORITY_ICON_WIDTH + PADDING_BETWEEN_TITLE_AND_PRIORITY; result.size.width = MIN(NSWidth(result), [string size].width); return result; } - (NSRect) rectForProgressWithStringInBounds: (NSRect) bounds { NSRect result; result.origin.y = NSMinY(bounds) + PADDING_ABOVE_TITLE + HEIGHT_TITLE + PADDING_BETWEEN_TITLE_AND_PROGRESS; result.origin.x = NSMinX(bounds) + PADDING_HORIZONTAL + IMAGE_SIZE_REG + PADDING_BETWEEN_IMAGE_AND_TITLE; result.size.height = HEIGHT_STATUS; result.size.width = NSMaxX(bounds) - NSMinX(result) - PADDING_HORIZONTAL; return result; } - (NSRect) rectForStatusWithStringInBounds: (NSRect) bounds { NSRect result; result.origin.y = NSMinY(bounds) + PADDING_ABOVE_TITLE + HEIGHT_TITLE + PADDING_BETWEEN_TITLE_AND_PROGRESS + HEIGHT_STATUS + PADDING_BETWEEN_PROGRESS_AND_BAR + BAR_HEIGHT + PADDING_BETWEEN_BAR_AND_STATUS; result.origin.x = NSMinX(bounds) + PADDING_HORIZONTAL + IMAGE_SIZE_REG + PADDING_BETWEEN_IMAGE_AND_TITLE; result.size.height = HEIGHT_STATUS; result.size.width = NSMaxX(bounds) - NSMinX(result) - PADDING_HORIZONTAL; return result; } - (NSRect) barRectRegForBounds: (NSRect) bounds { NSRect result; result.size.height = BAR_HEIGHT; result.origin.x = NSMinX(bounds) + PADDING_HORIZONTAL + IMAGE_SIZE_REG + PADDING_BETWEEN_IMAGE_AND_BAR; result.origin.y = NSMinY(bounds) + PADDING_ABOVE_TITLE + HEIGHT_TITLE + PADDING_BETWEEN_TITLE_AND_PROGRESS + HEIGHT_STATUS + PADDING_BETWEEN_PROGRESS_AND_BAR; result.size.width = floor(NSMaxX(bounds) - NSMinX(result) - PADDING_HORIZONTAL - 2.0 * (PADDING_BETWEEN_BUTTONS + NORMAL_BUTTON_WIDTH)); return result; } - (NSRect) barRectMinForBounds: (NSRect) bounds { NSRect result; result.origin.x = NSMinX(bounds) + PADDING_HORIZONTAL + IMAGE_SIZE_MIN + PADDING_BETWEEN_IMAGE_AND_BAR; result.origin.y = NSMinY(bounds) + PADDING_BETWEEN_BAR_AND_EDGE_MIN; result.size.height = NSHeight(bounds) - 2.0 * PADDING_BETWEEN_BAR_AND_EDGE_MIN; result.size.width = NSMaxX(bounds) - NSMinX(result) - PADDING_BETWEEN_BAR_AND_EDGE_MIN; return result; } - (NSRect) controlButtonRectForBounds: (NSRect) bounds { NSRect result; result.size.height = NORMAL_BUTTON_WIDTH; result.size.width = NORMAL_BUTTON_WIDTH; result.origin.x = NSMaxX(bounds) - (PADDING_HORIZONTAL + NORMAL_BUTTON_WIDTH + PADDING_BETWEEN_BUTTONS + NORMAL_BUTTON_WIDTH); if (![fDefaults boolForKey: @"SmallView"]) result.origin.y = NSMinY(bounds) + PADDING_ABOVE_TITLE + HEIGHT_TITLE - (NORMAL_BUTTON_WIDTH - BAR_HEIGHT) * 0.5 + PADDING_BETWEEN_TITLE_AND_PROGRESS + HEIGHT_STATUS + PADDING_BETWEEN_PROGRESS_AND_BAR; else result.origin.y = ceil(NSMidY(bounds) - NSHeight(result) * 0.5); return result; } - (NSRect) revealButtonRectForBounds: (NSRect) bounds { NSRect result; result.size.height = NORMAL_BUTTON_WIDTH; result.size.width = NORMAL_BUTTON_WIDTH; result.origin.x = NSMaxX(bounds) - (PADDING_HORIZONTAL + NORMAL_BUTTON_WIDTH); if (![fDefaults boolForKey: @"SmallView"]) result.origin.y = NSMinY(bounds) + PADDING_ABOVE_TITLE + HEIGHT_TITLE - (NORMAL_BUTTON_WIDTH - BAR_HEIGHT) * 0.5 + PADDING_BETWEEN_TITLE_AND_PROGRESS + HEIGHT_STATUS + PADDING_BETWEEN_PROGRESS_AND_BAR; else result.origin.y = ceil(NSMidY(bounds) - NSHeight(result) * 0.5); return result; } - (NSRect) actionButtonRectForBounds: (NSRect) bounds { const NSRect iconRect = [self iconRectForBounds: bounds]; //in minimal view the rect will be the icon rect, but avoid the extra defaults lookup with some cheap math return NSMakeRect(NSMidX(iconRect) - ACTION_BUTTON_WIDTH * 0.5, NSMidY(iconRect) - ACTION_BUTTON_WIDTH * 0.5, ACTION_BUTTON_WIDTH, ACTION_BUTTON_WIDTH); } - (NSAttributedString *) attributedTitle { NSString * title = [(Torrent *)[self representedObject] name]; return [[[NSAttributedString alloc] initWithString: title attributes: fTitleAttributes] autorelease]; } - (NSAttributedString *) attributedStatusString: (NSString *) string { return [[[NSAttributedString alloc] initWithString: string attributes: fStatusAttributes] autorelease]; } - (NSString *) buttonString { if (fMouseDownRevealButton || (!fTracking && fHoverReveal)) return NSLocalizedString(@"Show the data file in Finder", "Torrent cell -> button info"); else if (fMouseDownControlButton || (!fTracking && fHoverControl)) { Torrent * torrent = [self representedObject]; if ([torrent isActive]) return NSLocalizedString(@"Pause the transfer", "Torrent Table -> tooltip"); else { if ([[NSApp currentEvent] modifierFlags] & NSAlternateKeyMask) return NSLocalizedString(@"Resume the transfer right away", "Torrent cell -> button info"); else if ([torrent waitingToStart]) return NSLocalizedString(@"Stop waiting to start", "Torrent cell -> button info"); else return NSLocalizedString(@"Resume the transfer", "Torrent cell -> button info"); } } else if (!fTracking && fHoverAction) return NSLocalizedString(@"Change transfer settings", "Torrent Table -> tooltip"); else return nil; } - (NSString *) statusString { NSString * buttonString; if ((buttonString = [self buttonString])) return buttonString; else return [[self representedObject] statusString]; } - (NSString *) minimalStatusString { Torrent * torrent = [self representedObject]; return [fDefaults boolForKey: @"DisplaySmallStatusRegular"] ? [torrent shortStatusString] : [torrent remainingTimeString]; } @end transmission-2.92/macosx/PaxHeaders.4960/pt_PT.lproj0000644000000000000000000000013212666747213017264 xustar0030 mtime=1457245835.319998715 30 atime=1418239412.564073141 30 ctime=1457295922.834856111 transmission-2.92/macosx/pt_PT.lproj/0000755000175000017500000000000012666747213020766 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/pt_PT.lproj/PaxHeaders.4960/InfoPlist.strings0000644000000000000000000000013112664476420022657 xustar0030 mtime=1456635152.279501384 30 atime=1456635152.279501384 29 ctime=1457295922.83185606 transmission-2.92/macosx/pt_PT.lproj/InfoPlist.strings0000644000175000017500000000017312664476420024306 0ustar00mikedldmikedld00000000000000/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = "Copyright © 2005-2016 The Transmission Project"; transmission-2.92/macosx/pt_PT.lproj/PaxHeaders.4960/Creator.xib0000644000000000000000000000013112640354045021430 xustar0030 mtime=1451350053.458167896 30 atime=1451350053.458167896 29 ctime=1457295922.83185606 transmission-2.92/macosx/pt_PT.lproj/Creator.xib0000644000175000017500000006046112640354045023065 0ustar00mikedldmikedld00000000000000 Ficheiro Ficheiro transmission-2.92/macosx/pt_PT.lproj/PaxHeaders.4960/PrefsWindow.xib0000644000000000000000000000013112640354045022300 xustar0030 mtime=1451350053.461167948 30 atime=1451350053.461167948 29 ctime=1457295922.83185606 transmission-2.92/macosx/pt_PT.lproj/PrefsWindow.xib0000644000175000017500000056513312640354045023743 0ustar00mikedldmikedld00000000000000 ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer NSAllRomanInputSourcesLocaleIdentifier NSAllRomanInputSourcesLocaleIdentifier YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7MTgsIDE4fdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPERHETU0AKgAABGKAACBQOCQW DQeEQmDAuBv6BveFRGJROKEMVBRGOZ1vVlNd1vdVRSRRQDQMEwMEQMJg8LhgcKM2ENILhdsdsrl2AxkN 1rNJBwN1QeSwIHwMMgwHg8MgoEA4MA4GgkKhYLBgQBoOiIPBwMhYOhaWhUIBIGhEFggBAojghrgB0vSS r99icAHA0F8kwNcQQSCUTIEtFkwGMSCcQA8NBgMAgNhsOAQGg6igsFAcAPp+PwAA0FAyBAJ/gB7vd9gB 1zcABZ5L4APV1SloBG8lsuls7vJ3OtFQQIhAKnNOKFOokoEslgN7Pd7AB/Px+gAAgMBADKQx1ut0gBrM hlAAXD4fAByudxgANPnWAd6NYAPRxPgAOMQmUAFkyG5QN5sNAwwceESShKFgNgxjECZ6HqeoAAQAgCgA AgDpKAwCpKex1nYABrl+XjLn20IHBQCIABKBpmuYeLsnycp4AAcwLv6N5EkqZJfloWAjIGeSBhAOA8D0 XZCj6PoSAAf7ngKBCTgGgZ6nwfQAFuWRaAAEIOg3IpynMAAKgycIAAwCp1gAfh4R0fR0qCdoFieABGl0 bZ1E0RhBBwgZvoGCIrjEMBbkwRxIBuftBAAdp3ni5h9NKdBymwAB0HObIAHmfQJAACADIgJYbnzSRxm0 0R3ueCIHIgeB9hmABTmwA5/DyOg2CIgZfoGAYhiQJhXlET5PCaATpgAZhil6AAHgQAIAAKftIgOAsRHs fAFABUblhIElOGYXVIn8AcRBeEh3NMczPGcAlYivc45uaexHIIGAbBsTZWFQVgyA0DYMAAaBlGMAADn6 dETmXMYHxwfODAAGgTHeAABRUABhGHTh+n0egAB8G0FHia1Dm6DT+iwNA3E8c5umwMaCBAEIRkIVRWFc PYYhcFQAHCckxHQbZVs2AqTg4GIuAAd5yGKAAPAs7J3GzO59guKtHGiW4ABMCJqMucsMHGDoyAAM5Aks YplmCW4joIBoGgsNBT3kS4kiGH4AHIcxzgAZRelIAANhJOoMA4D4AAYf5pWIBB2gAbxowUBoYaAeRuYE DJ6pCfp3zEdYHigABBlWZR0FMT5LiCgwDCWUBSFKWYtiwKIAnKchyAAc5ybmEgUhS8RvRMFYQ4WfZ4Oy c5vcSCQIOYee5gIeJvTHm2HmnDxJHEB55mIW5WCYg4YkAQ5HGKPQ5jaBLNNCfB7U4b/zgADIBaqCAHUO AB9uef59QUfx7nmAB+wS5h6Sefw9EWCyF2NUfIaBRjWC6PqBQuSDglPsG4YoPAaAvAkN8bg4R2jTGwNY dwMwVlYD6GoHpDB/kQH8ZhMY8WKjuHUiwdI4x0j7G6N8cw8RxDiG8OcZY1h0DOFcNEdIcyBuFIMA1CgC wiD7fopwgQ4iBgOD4GgK4kgTgbAUA8Zw0hqOxG0OYdI4B1jyHAOIdQ9CPD8H+N8hwAEMECXAQJMRAknk KWOQI0JCiUkCLoQI0pAmAECfwQIzUdiRkIICAA8BAAADAAAAAQASAAABAQADAAAAAQASAAABAgADAAAA BAAABRwBAwADAAAAAQAFAAABBgADAAAAAQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAA AQAEAAABFgADAAAAAQASAAABFwAEAAAAAQAABFoBHAADAAAAAQABAAABPQADAAAAAQACAAABUgADAAAA AQABAAABUwADAAAABAAABSSHcwAHAAAMmAAABSwAAAAAAAgACAAIAAgAAQABAAEAAQAADJhhcHBsAhAA AG1udHJSR0IgWFlaIAfdAAMADgAWAAEAO2Fjc3BBUFBMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2 1gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA EWRlc2MAAAFQAAAAYmRzY20AAAG0AAABgGNwcnQAAAM0AAAAJHd0cHQAAANYAAAAFHJYWVoAAANsAAAA FGdYWVoAAAOAAAAAFGJYWVoAAAOUAAAAFHJUUkMAAAOoAAAIDGFhcmcAAAu0AAAAIHZjZ3QAAAvUAAAA MG5kaW4AAAwEAAAAPmNoYWQAAAxEAAAALG1tb2QAAAxwAAAAKGJUUkMAAAOoAAAIDGdUUkMAAAOoAAAI DGFhYmcAAAu0AAAAIGFhZ2cAAAu0AAAAIGRlc2MAAAAAAAAACERpc3BsYXkAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAABtbHVjAAAAAAAAAB4AAAAMc2tTSwAAAAgAAAF4Y2FFUwAAAAgAAAF4aGVJTAAAAAgAAAF4cHRC UgAAAAgAAAF4aXRJVAAAAAgAAAF4aHVIVQAAAAgAAAF4dWtVQQAAAAgAAAF4a29LUgAAAAgAAAF4bmJO TwAAAAgAAAF4Y3NDWgAAAAgAAAF4emhUVwAAAAgAAAF4ZGVERQAAAAgAAAF4cm9STwAAAAgAAAF4c3ZT RQAAAAgAAAF4emhDTgAAAAgAAAF4amFKUAAAAAgAAAF4YXIAAAAAAAgAAAF4ZWxHUgAAAAgAAAF4cHRQ VAAAAAgAAAF4bmxOTAAAAAgAAAF4ZnJGUgAAAAgAAAF4ZXNFUwAAAAgAAAF4dGhUSAAAAAgAAAF4dHJU UgAAAAgAAAF4ZmlGSQAAAAgAAAF4aHJIUgAAAAgAAAF4cGxQTAAAAAgAAAF4cnVSVQAAAAgAAAF4ZW5V UwAAAAgAAAF4ZGFESwAAAAgAAAF4AGkATQBhAGN0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSwgSW5jLiwg MjAxMwBYWVogAAAAAAAA8xYAAQAAAAEWylhZWiAAAAAAAABxwAAAOYoAAAFnWFlaIAAAAAAAAGEjAAC5 5gAAE/ZYWVogAAAAAAAAI/IAAAyQAAC90GN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIA NgA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCjAKgArQCyALcAvADBAMYA ywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwB gwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoC hAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD 0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcF dwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EH dAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJ zwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUM jgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YP sw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMT QxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0X QRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4ob shvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwg mCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl 9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r 0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIy KjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5 BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNA ZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVI S0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQ u1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZ uFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBj Q2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQht YG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4 EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSD V4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6P No+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kb r5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKo xKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2 ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHE zsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TT xtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvj Y+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnz p/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//cGFyYQAAAAAAAwAAAAJm ZgAA8qcAAA1ZAAAT0AAACg52Y2d0AAAAAAAAAAEAAQAAAAAAAAABAAAAAQAAAAAAAAABAAAAAQAAAAAA AAABAABuZGluAAAAAAAAADYAAKdAAABVgAAATMAAAJ7AAAAlgAAADMAAAFAAAABUQAACMzMAAjMzAAIz MwAAAAAAAAAAc2YzMgAAAAAAAQxyAAAF+P//8x0AAAe6AAD9cv//+53///2kAAAD2QAAwHFtbW9kAAAA AAAABhAAAKAHAAAAAMknHgAAAAAAAAAAAAAAAAAAAAAA0iUmJyhaJGNsYXNzbmFtZVgkY2xhc3Nlc18Q EE5TQml0bWFwSW1hZ2VSZXCjJykqWk5TSW1hZ2VSZXBYTlNPYmplY3TSJSYsLVdOU0FycmF5oiwq0iUm LzBeTlNNdXRhYmxlQXJyYXmjLywq0zIzCjQ1NldOU1doaXRlXE5TQ29sb3JTcGFjZUQwIDAAEAOADNIl Jjg5V05TQ29sb3KiOCrSJSY7PFdOU0ltYWdlojsqXxAPTlNLZXllZEFyY2hpdmVy0T9AVHJvb3SAAQAI ABEAGgAjAC0AMgA3AEYATABXAF4AZQByAHkAgQCDAIUAigCMAI4AlwCcAKcAqQCrAK0AsgC1ALcAuQC7 AL0AwgDZANsA3RKlEqoStRK+EtES1RLgEukS7hL2EvkS/hMNExETGBMgEy0TMhM0EzYTOxNDE0YTSxNT E1YTaBNrE3AAAAAAAAACAQAAAAAAAABBAAAAAAAAAAAAAAAAAAATcg transmission-2.92/macosx/pt_PT.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212442116666023167 xustar0030 mtime=1418239414.218101485 30 atime=1418239414.218101485 30 ctime=1457295922.834856111 transmission-2.92/macosx/pt_PT.lproj/Localizable.strings0000644000175000017500000011545612442116666024630 0ustar00mikedldmikedld00000000000000/* Inspector -> selected torrents stats -> bytes */ "%@ bytes" = "%@ bytes"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "%@ files" = "%@ ficheiros"; /* Prefs -> blocklist -> message */ "%@ IP address rules in list" = "%@ regras de endereços IP na lista"; /* Inspector -> selected torrents */ "%@ magnetized transfers" = "%@ transferências magnetizadas"; /* file size string Inspector -> Files tab -> file status string Status bar transfer count */ "%@ of %@" = "%1$@ de %2$@"; /* Torrent -> progress string */ "%@ of torrent metadata retrieved" = "%@ dos metadados do torrent recebidos"; /* Torrent -> eta string */ "%@ remaining" = "%@ restantes"; /* Add torrent -> info Inspector -> Activity tab -> progress Torrent -> progress string */ "%@ selected" = "%@ seleccionados"; /* stats window -> times opened */ "%@ times" = "%@ vezes"; /* Drag overlay -> torrents */ "%@ Torrent Files" = "%@ ficheiros torrent"; /* Inspector -> selected torrents */ "%@ Torrents Selected" = "%@ torrents seleccionados"; /* Inspector -> selected torrents stats total */ "%@ total" = "%@ total"; /* Filter Bar Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "%@ transfers" = "%@ transferências"; /* Inspector -> Activity tab -> have */ "%@ verified" = "%@ verificados"; /* Inspector -> Peers tab -> peers */ "%d cache" = "%d cache"; /* Inspector -> Peers tab -> peers */ "%d Connected" = "%d ligados"; /* Inspector -> Peers tab -> peers */ "%d DHT" = "%d DHT"; /* Dock item - Downloading */ "%d Downloading" = "%d a receber"; /* Inspector -> Peers tab -> peers */ "%d incoming" = "%d a receber"; /* Action menu -> upload/download limit Status Bar -> speed tooltip */ "%d KB/s" = "%d KB/s"; /* Inspector -> Peers tab -> peers */ "%d local discovery" = "%d pesquisa local"; /* Inspector -> Peers tab -> peers */ "%d LTEP" = "%d LTEP"; /* Info options -> global setting */ "%d minutes" = "%d minutos"; /* Inspector -> Peers tab -> peers */ "%d PEX" = "%d PEX"; /* Create torrent -> info */ "%d pieces, %@ each" = "%1$d pedaços, %2$@ cada"; /* Dock item - Seeding */ "%d Seeding" = "%d a enviar"; /* Inspector -> Peers tab -> peers */ "%d tracker" = "%d tracker"; /* Torrent -> status string */ "%d web seeds" = "%d seeds da web"; /* time string */ "%u days" = "%u dias"; /* time string */ "%u hr" = "%u hr"; /* time string */ "%u min" = "%u min"; /* time string */ "%u sec" = "%u seg"; /* time string */ "%u years" = "%u anos"; /* time string */ "1 day" = "1 dia"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "1 file" = "1 ficheiro"; /* Inspector -> selected torrents */ "1 magnetized transfer" = "1 transferência magnetizada"; /* Info options -> global setting */ "1 minute" = "1 minuto"; /* Create torrent -> info */ "1 piece, %@" = "1 pedaço, %@"; /* stats window -> times opened */ "1 time" = "1 vez"; /* Filter Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "1 transfer" = "1 transferência"; /* time string */ "1 year" = "1 ano"; /* Open invalid alert -> title */ "\"%@\" is not a valid torrent file." = "\"%@\" não é um ficheiro torrent válido."; /* Prefs -> blocklist -> message */ "A blocklist must first be downloaded" = "Tem de primeiro transferir uma lista"; /* Create torrent -> file already exists warning -> warning */ "A file with the name \"%@\" already exists in the directory \"%@\". Choose a new name or directory to create the torrent file." = "Já existe um ficheiro com o nome \"%1$@\" no directório \"%2$@\". Escolha um novo nome ou directório para criar o ficheiro torrent."; /* Move inside itself alert -> title */ "A folder cannot be moved to inside itself." = "Não é possível mover uma pasta para dentro de si mesma."; /* Create torrent -> zero size -> warning */ "A torrent file cannot be created for files with no size." = "Não é possível criar um ficheiro torrent para ficheiros sem tamanho."; /* Create torrent -> file already exists warning -> title */ "A torrent file with this name and directory cannot be created." = "Não é possível criar um ficheiro torrent com este nome e directório."; /* Create torrent -> blank address -> message */ "A transfer marked as private with no tracker addresses will be unable to connect to peers. The torrent file will only be useful if you plan to upload the file to a tracker website that will add the addresses for you." = "Uma transferência marcada como privada sem endereços de trackers será incapaz de ligar a peers. O ficheiro torrent apenas será útil se tenciona enviá-lo para o site de um tracker que adicione os endereços por si."; /* Open duplicate alert -> title Open duplicate magnet alert -> title */ "A transfer of \"%@\" already exists." = "Já existe uma transferência de \"%@\"."; /* Filter Bar -> filter button */ "Active" = "Activas"; /* Inspector -> tab Inspector view -> title */ "Activity" = "Actividade"; /* Add torrent -> same name -> button */ "Add" = "Adicionar"; /* Inspector view -> tracker buttons */ "Add a tracker" = "Adicionar um tracker"; /* Magnet link failed -> title */ "Adding magnetized transfer failed." = "Falha ao adicionar transferência por ligação magnet"; /* Filter Bar -> filter button inspector -> check all */ "All" = "Todas"; /* Filter Bar -> group filter menu Groups -> Button */ "All Groups" = "Todos os grupos"; /* Create torrent -> failed -> warning */ "An unknown error has occurred." = "Ocorreu um erro desconhecido."; /* Tracker last announce */ "Announce error" = "Erro no anúncio"; /* Tracker next announce */ "Announce in progress" = "Anúncio em progresso"; /* Tracker next announce */ "Announce is queued" = "Anúncio em lista de espera"; /* Tracker next announce */ "Announce not scheduled" = "Anúncio não programado"; /* Tracker last announce */ "Announce timed out" = "O intervalo de espera do anúncio expirou"; /* All toolbar item -> label */ "Apply All" = "Aplicar a todos"; /* Selected toolbar item -> label */ "Apply Selected" = "Aplicar seleccionados"; /* Confirm Quit panel -> title */ "Are you sure you want to quit?" = "Tem a certeza de que deseja sair?"; /* Remove completed confirm panel -> title */ "Are you sure you want to remove %@ completed transfers from the transfer list?" = "Tem a certeza de que deseja remover %@ transferências concluídas da lista de transferências?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list and trash the data files?" = "Tem a certeza de que deseja remover %@ transferências da lista de transferências e eliminar os respectivos ficheiros de dados?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list?" = "Tem a certeza de que deseja remover %@ transferências da lista de transferências?"; /* Remove trackers alert -> title */ "Are you sure you want to remove %d trackers?" = "Tem a certeza de que deseja remover %d trackers?"; /* Removal confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list and trash the data file?" = "Tem a certeza de que deseja remover \"%@\" da lista de transferências e eliminar o respectivo ficheiro de dados?"; /* Removal confirm panel -> title Remove completed confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list?" = "Tem a certeza de que deseja remover \"%@\" da lista de transferências?"; /* Remove trackers alert -> title */ "Are you sure you want to remove this tracker?" = "Tem a certeza de que deseja remover este tracker?"; /* Stats reset -> title */ "Are you sure you want to reset usage statistics?" = "Tem a certeza de que deseja repor as estatísticas de utilização?"; /* inspector -> peer table -> header tool tip */ "Available" = "Disponível"; /* Preferences -> toolbar item title */ "Bandwidth" = "Largura de banda"; /* Growl notification description */ "Bandwidth settings changed" = "Definições de largura de banda alteradas"; /* Groups -> Name */ "Blue" = "Azul"; /* Add torrent -> same name -> button Blocklist -> cancel button Confirm Quit panel -> button Create torrent -> blank address -> button Removal confirm panel -> button Remove completed confirm panel -> button Remove trackers alert -> button rename sheet button Stats reset -> button URL sheet button */ "Cancel" = "Cancelar"; /* Torrent Table -> tooltip */ "Change transfer settings" = "Alterar definições da transferência"; /* File Outline -> Menu */ "Check Selected" = "Marcar seleccionados"; /* Torrent -> status string */ "Checking existing data" = "A verificar dados existentes"; /* Message window -> save button */ "Clear" = "Limpar"; /* inspector -> peer table -> header */ "Client" = "Cliente"; /* View menu -> Quick Look */ "Close Quick Look" = "Fechar Vista Rápida"; /* Prefs -> Notifications */ "Configure In Growl" = "Configurar no Growl"; /* Prefs -> Notifications */ "Configure In System Preferences" = "Configurar nas Preferências do Sistema"; /* Blocklist -> message */ "Connecting to site" = "A ligar ao site"; /* Torrent file copy alert -> title */ "Copy of \"%@\" Cannot Be Created" = "Não foi possível criar cópia de \"%@\""; /* Create torrent -> failed -> warning */ "Could not read \"%s\": %s." = "Não foi possível ler \"%1$s\": %2$s."; /* Create torrent -> failed -> warning */ "Could not write \"%s\": %s." = "Não foi possível escrever \"%1$s\": %2$s."; /* Create toolbar item -> label Create torrent -> blank address -> button */ "Create" = "Criar"; /* Drag overlay -> file */ "Create a Torrent File" = "Criar um ficheiro torrent"; /* Create toolbar item -> tooltip */ "Create torrent file" = "Criar ficheiro torrent"; /* Create toolbar item -> palette label Create torrent -> select file */ "Create Torrent File" = "Criar ficheiro torrent"; /* Create torrent -> failed -> title */ "Creation of \"%@\" failed." = "Falha ao criar \"%@\"."; /* Inspector -> peer -> status */ "Currently downloading (interested and not choked)" = "Actualmente a receber (interessado e não congestionado)"; /* Inspector -> peer -> status */ "Currently uploading (interested and not choked)" = "Actualmente a enviar (interessado e não congestionado)"; /* Message window -> table column */ "Date" = "Data"; /* Message window -> level Message window -> level string */ "Debug" = "Depuração"; /* Info options -> global setting */ "disabled" = "desactivo"; /* inspector -> peer table -> header inspector -> web seed table -> header status bar -> status label Torrent -> status string */ "DL" = "REC"; /* Inspector -> Peers tab -> peers */ "DL from %d" = "REC de %d"; /* Torrent disk space alert -> button */ "Do not check disk space again" = "Não voltar a verificar espaço livre no disco"; /* Donation beg -> button */ "Don't bug me about this ever again." = "Não voltar a perguntar sobre isto."; /* files tab -> tooltip */ "Don't Download" = "Não descarregar"; /* Donation beg -> button */ "Donate" = "Doar"; /* Donation beg -> message */ "Donate or not, there will be no difference to your torrenting experience." = "Quer faça um donativo ou não, não haverá qualquer diferença na sua experiência de utilização de torrents."; /* file table -> header tool tip files tab -> tooltip */ "Download" = "Descarregar"; /* Torrent disk space alert -> button */ "Download Anyway" = "Descarregar na mesma"; /* notification title */ "Download Complete" = "Descarga concluída"; /* Blocklist -> message */ "Download of the blocklist failed." = "A descarga da lista de bloqueio falhou."; /* files tab -> tooltip */ "Download Some" = "Descarregar alguns"; /* Torrent table -> group row -> tooltip */ "Download speed" = "Velocidade de recepção"; /* Stats window -> label tracker peer stat */ "Downloaded" = "Recebido"; /* Filter Bar -> filter button Torrent -> status string */ "Downloading" = "A receber"; /* Blocklist -> message */ "Downloading blocklist" = "A descarregar lista de bloqueio"; /* Torrent -> status string */ "Downloading from %d of %d peers" = "A receber de %1$d de %2$d peers"; /* Torrent -> status string */ "Downloading from %d of 1 peer" = "A receber de %d de 1 peer"; /* inspector -> peer table -> header tool tip */ "Downloading From Peer" = "A receber do peer"; /* inspector -> web seed table -> header tool tip */ "Downloading From Web Seed" = "A receber de seed da web"; /* Inspector -> Peers tab -> table row tooltip */ "encrypted" = "cifrada"; /* inspector -> peer table -> header tool tip */ "Encrypted Connection" = "Ligação cifrada"; /* Message window -> level Message window -> level string Torrent -> status string */ "Error" = "Erro"; /* Inspector -> tab Inspector view -> title */ "Files" = "Ficheiros"; /* Filter toolbar item -> label inspector -> file filter Message window -> filter field */ "Filter" = "Filtro"; /* Inspector -> Peers tab -> table row tooltip */ "From: cache" = "De: cache"; /* Inspector -> Peers tab -> table row tooltip */ "From: distributed hash table" = "De: DHT (distributed hash table)"; /* Inspector -> Peers tab -> table row tooltip */ "From: incoming connection" = "De: ligação recebida"; /* Inspector -> Peers tab -> table row tooltip */ "From: libtorrent extension protocol handshake" = "De: handshake do protocolo de extensão do libtorrent"; /* Inspector -> Peers tab -> table row tooltip */ "From: local peer discovery" = "De: pesquisa de peers locais"; /* Inspector -> Peers tab -> table row tooltip */ "From: peer exchange" = "De: troca de peers"; /* Inspector -> Peers tab -> table row tooltip */ "From: tracker" = "De: tracker"; /* File size - gigabytes file/memory size - gigabytes */ "GB" = "GB"; /* Transfer speed (gigabytes per second) */ "GB/s" = "GB/s"; /* Preferences -> toolbar item title */ "General" = "Geral"; /* Inspector -> tab Inspector view -> title */ "General Info" = "Informação Geral"; /* Status Bar -> speed tooltip */ "Global download limit" = "Limite global de recepção"; /* Status Bar -> speed tooltip */ "Global upload limit" = "Limite global de envio"; /* Tracker last announce */ "got %d peers" = "obtidos %d peers"; /* Tracker last announce */ "got 1 peer" = "obtido 1 peer"; /* Groups -> Name */ "Gray" = "Cinzento"; /* Groups -> Name */ "Green" = "Verde"; /* Groups -> Button */ "Group" = "Grupo"; /* Preferences -> toolbar item title */ "Groups" = "Grupos"; /* View menu -> Filter Bar */ "Hide Filter Bar" = "Ocultar barra de filtros"; /* View menu -> Inspector */ "Hide Inspector" = "Ocultar Inspector"; /* View menu -> Status Bar */ "Hide Status Bar" = "Ocultar barra de estado"; /* File Outline -> Priority Menu */ "High" = "Alta"; /* files tab -> tooltip */ "High Priority" = "Prioridade alta"; /* Legal alert -> button */ "I Accept" = "Aceito"; /* Add torrent -> same name -> message */ "If you are attempting to use already existing data, the root data directory should be inside the destination directory." = "Se está a tentar usar dados já existentes, o directório raiz dos dados deve estar dentro do directório de destino."; /* Torrent -> eta string */ "inactive" = "inactivo"; /* Message window -> level Message window -> level string */ "Info" = "Informação"; /* Inspector toolbar item -> label */ "Inspector" = "Inspector"; /* URL sheet label */ "Internet address of torrent file:" = "Endereço na Internet do ficheiro torrent:"; /* inspector -> peer table -> header */ "IP Address" = "Endereço IP"; /* Download not a torrent -> message */ "It appears that the file \"%@\" from %@ is not a torrent file." = "O ficheiro \"%1$@\" de %2$@ não parece ser um ficheiro torrent."; /* File size - kilobytes file/memory size - kilobytes */ "KB" = "KB"; /* Transfer speed (kilobytes per second) */ "KB/s" = "KB/s"; /* Tracker last announce */ "Last Announce" = "Último anúncio"; /* Tracker last scrape */ "Last Scrape" = "Última passagem"; /* Prefs -> blocklist -> message */ "Last updated" = "Última actualização"; /* tracker peer stat */ "Leechers" = "Leechers"; /* About window -> license button */ "License" = "Licença"; /* Action menu -> upload/download limit torrent action menu -> upload/download limit */ "Limit (%d KB/s)" = "Limite (%d KB/s)"; /* Save log alert panel -> title */ "Log Could Not Be Saved" = "Não foi possível guardar o registo"; /* File Outline -> Priority Menu */ "Low" = "Baixa"; /* files tab -> tooltip */ "Low Priority" = "Prioridade baixa"; /* Open duplicate magnet alert -> title */ "Magnet link is a duplicate of an existing transfer." = "A ligação magnet é um duplicado de uma transferência já existente."; /* Inspector -> selected torrents Torrent -> progress string */ "Magnetized transfer" = "Transferência magnetizada"; /* File size - megabytes file/memory size - megabytes */ "MB" = "MB"; /* Transfer speed (megabytes per second) */ "MB/s" = "MB/s"; /* Message window -> table column */ "Message" = "Mensagem"; /* Message window -> title */ "Message Log" = "Registo de mensagens"; /* files tab -> tooltip */ "Multiple Priorities" = "Múltiplas prioridades"; /* Inspector -> Peers tab -> table row tooltip No Ratio Prefs -> blocklist -> message Tracker last announce Tracker last scrape tracker peer stat */ "N/A" = "N/D"; /* Filter Bar -> filter menu */ "Name" = "Nome"; /* Preferences -> toolbar item title */ "Network" = "Rede"; /* Prefs -> blocklist -> message */ "Never" = "Nunca"; /* Inspector -> tracker table */ "New Tier" = "Novo nível"; /* Tracker next announce */ "Next announce in %@" = "Próximo anúncio em %@"; /* Group table row */ "No Group" = "Sem grupo"; /* Inspector -> selected torrents */ "No Torrents Selected" = "Nenhum torrent seleccionado"; /* Groups -> Button Groups -> Menu inspector -> check all */ "None" = "Nenhum"; /* Donation beg -> button */ "Nope" = "Não"; /* File Outline -> Priority Menu */ "Normal" = "Normal"; /* files tab -> tooltip */ "Normal Priority" = "Prioridade normal"; /* Torrent disk space alert -> title */ "Not enough remaining disk space to download \"%@\" completely." = "Não existe espaço em disco suficiente para descarregar \"%@\" completamente."; /* About window -> license close button Blocklist -> button Create torrent -> directory doesn't exist warning -> button Create torrent -> failed -> button Create torrent -> file already exists warning -> button Create torrent -> no files -> button Create torrent -> zero size -> button Download not a torrent -> button Magnet link failed -> button Move error alert -> button Move inside itself alert -> button Open duplicate alert -> button Open duplicate magnet alert -> button Open invalid alert -> button Save log alert panel -> button Torrent disk space alert -> button Torrent download failed -> button Torrent file copy alert -> button Transmission already running alert -> button */ "OK" = "OK"; /* Remove completed confirm panel -> message */ "Once removed, continuing the transfer will require the torrent file or magnet link." = "Uma vez removida, para continuar a tranferência será necessário o ficheiro torrent ou a ligação magnet."; /* Removal confirm panel -> message part 2 Remove completed confirm panel -> message */ "Once removed, continuing the transfers will require the torrent files or magnet links." = "Uma vez removidas, para continuar as tranferências serão necessários os ficheiros torrent ou as ligações magnet."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact it. This cannot be undone." = "Uma vez removido o tracker, o Transmission deixará de tentar contactá-lo. Isto não pode ser desfeito."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact them. This cannot be undone." = "Uma vez removidos os trackers, o Transmission deixará de tentar contactá-los. Isto não pode ser desfeito."; /* File Outline -> Menu */ "Only Check Selected" = "Marcar apenas os seleccionados"; /* Open toolbar item -> label URL sheet button */ "Open" = "Abrir"; /* Open address toolbar item -> label */ "Open Address" = "Abrir endereço"; /* Open address toolbar item -> palette label */ "Open Torrent Address" = "Abrir endereço torrent"; /* Open toolbar item -> tooltip */ "Open torrent files" = "Abrir ficheiros torrent"; /* Open toolbar item -> palette label */ "Open Torrent Files" = "Abrir ficheiros torrent"; /* Open address toolbar item -> tooltip */ "Open torrent web address" = "Abrir endereço web do torrent"; /* Inspector -> tab Inspector view -> title */ "Options" = "Opções"; /* Groups -> Name */ "Orange" = "Laranja"; /* Inspector -> Peers tab -> table row tooltip */ "Partial Seed" = "Seed parcial"; /* All toolbar item -> palette label */ "Pause / Resume All" = "Pausar / Retomar todos"; /* Selected toolbar item -> palette label */ "Pause / Resume Selected" = "Pausar / Retomar seleccionados"; /* All toolbar item -> label Dock item */ "Pause All" = "Pausar todos"; /* All toolbar item -> tooltip */ "Pause all transfers" = "Pausar todas as transferências"; /* Selected toolbar item -> label */ "Pause Selected" = "Pausar seleccionados"; /* Selected toolbar item -> tooltip */ "Pause selected transfers" = "Pausar transferências seleccionadas"; /* Torrent Table -> tooltip */ "Pause the transfer" = "Pausar a transferência"; /* Filter Bar -> filter button Torrent -> status string */ "Paused" = "Em pausa"; /* Inspector -> peer -> status */ "Peer is unchoking you, but you are not interested" = "O peer está a descongestioná-lo, mas você não está interessado"; /* Inspector -> peer -> status */ "Peer wants you to upload, but you do not want to (interested and choked)" = "O peer quer que envie, mas você não quer (interessado e congestionado)"; /* Inspector -> tab Inspector view -> title Preferences -> toolbar item title */ "Peers" = "Peers"; /* Inspector -> Peers tab -> table row tooltip */ "Port" = "Porta"; /* Preferences -> Network -> port status */ "Port check site is down" = "Website de verificação inacessível"; /* Preferences -> Network -> port status */ "Port is closed" = "A porta está fechada"; /* Preferences -> Network -> port status */ "Port is open" = "A porta está aberta"; /* File Outline -> Menu file table -> header tool tip */ "Priority" = "Prioridade"; /* files tab -> tooltip */ "Priority Not Available" = "Prioridade não disponível"; /* Inspector -> private torrent */ "Private Torrent, non-tracker peer discovery disabled" = "Torrent privado, pesquisa de peers extra-tracker desactivada"; /* Message window -> table column */ "Process" = "Processar"; /* Blocklist -> message */ "Processing blocklist" = " A processar lista de bloqueio"; /* Stats window -> label */ "Program Started" = "Programa iniciado"; /* Inspector -> Peers tab -> table row tooltip */ "Progress: %@" = "Progresso: %@"; /* Inspector -> Peers tab -> table row tooltip */ "Protocol: %@" = "Protocolo: %@"; /* Inspector -> private torrent */ "Public Torrent" = "Torrent público"; /* Groups -> Name */ "Purple" = "Roxo"; /* QuickLook toolbar item -> label QuickLook toolbar item -> palette label QuickLook toolbar item -> tooltip View menu -> Quick Look */ "Quick Look" = "Vista Rápida"; /* Confirm Quit panel -> button Legal alert -> button */ "Quit" = "Sair"; /* Dock Badger -> quit */ "Quitting" = "A sair"; /* Stats window -> label status bar -> status label Torrent -> status string Torrent table -> group row -> tooltip */ "Ratio" = "Rácio"; /* Groups -> Name */ "Red" = "Vermelho"; /* Action menu -> status string toggle */ "Remaining Time" = "Tempo restante"; /* Torrent -> eta string */ "remaining time unknown" = "tempo restante desconhecido"; /* Preferences -> toolbar item title */ "Remote" = "Remoto"; /* Removal confirm panel -> button Remove completed confirm panel -> button Remove toolbar item -> label Remove trackers alert -> button */ "Remove" = "Remover"; /* Main window -> 3rd bottom left button (remove all) tooltip */ "Remove all transfers that have completed seeding." = "Remover todas as transferências que terminaram o envio."; /* Remove toolbar item -> palette label */ "Remove Selected" = "Remover seleccionados"; /* Inspector view -> tracker buttons */ "Remove selected trackers" = "Remover trackers seleccionados"; /* Remove toolbar item -> tooltip */ "Remove selected transfers" = "Remover transferências seleccionadas"; /* rename sheet button */ "Rename" = "Renomear"; /* File Outline -> Menu */ "Rename File" = "Renomear ficheiro"; /* rename sheet label */ "Rename the file \"%@\":" = "Renomear o ficheiro \"%@\":"; /* Stats reset -> button Stats window -> reset button */ "Reset" = "Repor"; /* All toolbar item -> label Dock item */ "Resume All" = "Retomar todos"; /* All toolbar item -> tooltip */ "Resume all transfers" = "Retomar todas as transferências"; /* Selected toolbar item -> label */ "Resume Selected" = "Retomar seleccionados"; /* Selected toolbar item -> tooltip */ "Resume selected transfers" = "Retomar as transferências seleccionadas"; /* Torrent cell -> button info */ "Resume the transfer" = "Retomar a transferência"; /* Torrent cell -> button info */ "Resume the transfer right away" = "Retomar a transferência imediatamente"; /* Stats window -> label */ "Running Time" = "Duração"; /* Message window -> save button */ "Save" = "Guardar"; /* Tracker last scrape */ "Scrape error" = "Erro na passagem"; /* Tracker last scrape */ "Scrape timed out" = "O intervalo de espera na passagem expirou"; /* tracker peer stat */ "Seeders" = "Seeders"; /* Filter Bar -> filter button Torrent -> status string */ "Seeding" = "A enviar"; /* Torrent -> status string */ "Seeding complete" = "Envio concluído"; /* notification title */ "Seeding Complete" = "Envio concluído"; /* Torrent -> status string */ "Seeding to %d of %d peers" = "A enviar para %1$d de %2$d peers"; /* Torrent -> status string */ "Seeding to %d of 1 peer" = "A enviar para %d de 1 peer"; /* Create torrent -> location sheet -> button Create torrent -> select file Move torrent -> prompt Open torrent -> prompt Preferences -> Open panel prompt */ "Select" = "Seleccionar"; /* Create torrent -> select file */ "Select a file or folder for the torrent file." = "Seleccione um ficheiro ou pasta para o ficheiro torrent."; /* Add -> select destination folder */ "Select the download folder for \"%@\"" = "Seleccione a pasta de recepção para \"%@\""; /* Create torrent -> location sheet -> message */ "Select the name and location for the torrent file." = "Seleccione o nome e a localização para o ficheiro torrent."; /* Move torrent -> select destination folder */ "Select the new folder for %d data files." = "Seleccione a nova pasta para %d ficheiros de dados."; /* Move torrent -> select destination folder */ "Select the new folder for \"%@\"." = "Seleccione a nova pasta para \"%@\"."; /* Status Bar -> status menu */ "Session Ratio" = "Rácio da sessão"; /* Status Bar -> status menu */ "Session Transfer" = "Transferência da sessão"; /* Share toolbar item -> label Share toolbar item -> palette label */ "Share" = "Partilhar"; /* Share toolbar item -> tooltip */ "Share torrent file" = "Partilhar ficheiro torrent"; /* Main window -> 1st bottom left button (action) tooltip */ "Shortcuts for changing global settings." = "Atalhos para alterar definições globais."; /* notification button */ "Show" = "Mostrar"; /* View menu -> Filter Bar */ "Show Filter Bar" = "Mostrar barra de filtros"; /* File Outline -> Menu */ "Show in Finder" = "Mostrar no Finder"; /* View menu -> Inspector */ "Show Inspector" = "Mostrar Inspector"; /* View menu -> Status Bar */ "Show Status Bar" = "Mostrar barra de estado"; /* Torrent cell -> button info */ "Show the data file in Finder" = "Mostrar o ficheiro de dados no Finder"; /* Dock item Status Bar -> speed tooltip */ "Speed Limit" = "Limitador de Velocidade"; /* Growl notification title */ "Speed Limit Auto Disabled" = "Limitador de Velocidade auto-desactivado"; /* Growl notification title */ "Speed Limit Auto Enabled" = "Limitador de Velocidade auto-activado"; /* Main window -> 2nd bottom left button (turtle) tooltip */ "Speed Limit overrides the total bandwidth limits with its own limits." = "O Limitador de Velocidade sobrepõe-se aos limites globais de largura de banda com os seus próprios limites."; /* Torrent -> status string */ "Stalled" = "Estagnado"; /* Stats window -> title */ "Statistics" = "Estatísticas"; /* Action menu -> status string toggle */ "Status of Selected Files" = "Estado dos ficheiros seleccionados"; /* Action menu -> ratio stop torrent action menu -> ratio stop */ "Stop at Ratio (%.2f)" = "Parar no rácio (%.2f)"; /* Torrent cell -> button info */ "Stop waiting to start" = "Parar de aguardar para iniciar"; /* Donation beg -> title */ "Support open-source indie software" = "Apoie software independente de código aberto"; /* File size - terabytes file/memory size - terabytes */ "TB" = "TB"; /* Transfer speed (terabytes per second) */ "TB/s" = "TB/s"; /* Create torrent -> directory doesn't exist warning -> title */ "The chosen torrent file location does not exist." = "A localização escolhida para o ficheiro torrent não existe."; /* Add torrent -> same name -> title */ "The destination directory and root data directory have the same name." = "O directório de destino e o directório de raiz têm o mesmo nome."; /* Create torrent -> directory doesn't exist warning -> warning */ "The directory \"%@\" does not currently exist. Create this directory or choose a different one to create the torrent file." = "O directório \"%@\" actualmente não existe. Crie este directório ou escolha um diferente onde criar o ficheiro torrent."; /* Open duplicate magnet alert -> message */ "The magnet link \"%@\" cannot be added because it is a duplicate of an already existing transfer." = "A ligação magnet \"%@\" não foi adicionada porque é um duplicado de uma transferência já existente."; /* Move error alert -> message Move inside itself alert -> message */ "The move operation of \"%@\" cannot be done." = "A operação para mover \"%@\" não é possível."; /* blocklist fail message */ "The specified blocklist file did not contain any valid rules." = "O ficheiro de lista de bloqueio especificado não contém qualquer regra válida."; /* Torrent download failed -> message */ "The torrent could not be downloaded from %@: %@." = "Não foi possível descarregar o ficheiro torrent a partir de %1$@: %2$@."; /* Torrent file copy alert -> message */ "The torrent file (%@) cannot be found." = "O ficheiro torrent (%@) não foi encontrado."; /* Open invalid alert -> message */ "The torrent file cannot be opened because it contains invalid data." = "O ficheiro torrent não pode ser aberto porque contém dados inválidos."; /* Create torrent -> zero size -> title */ "The total file size is zero bytes." = "O tamanho total dos ficheiros é zero bytes."; /* Open duplicate alert -> message */ "The transfer cannot be added because it is a duplicate of an already existing transfer." = "A transferência não pode ser adicionada porque é um duplicado de uma transferência já existente."; /* Torrent disk space alert -> message */ "The transfer will be paused. Clear up space on %@ or deselect files in the torrent inspector to continue." = "A transferência será colocada em pausa. Liberte espaço em %@ ou desseleccione ficheiros no Inspector de torrent para continuar."; /* Create torrent -> blank address -> message */ "The transfer will not contact trackers for peers, and will have to rely solely on non-tracker peer discovery methods such as PEX and DHT to download and seed." = "A transferência não irá contactar os trackers para obter peers e terá de se restringir apenas a métodos de descoberta sem tracker como PEX e DHT para receber e enviar."; /* Removal confirm panel -> message part 1 */ "There are %@ active transfers." = "Existem %@ transferências activas."; /* Removal confirm panel -> message part 1 */ "There are %@ transfers (%@ active)." = "Existem %1$@ transferências (%2$@ activas)."; /* Confirm Quit panel -> message */ "There are %d active transfers that will be paused on quit. The transfers will automatically resume on the next launch." = "Existem %d transferências activas que serão colocadas em pausa ao sair. As transferências serão retomadas automaticamente quando voltar a iniciar o Transmission"; /* Create torrent -> blank address -> title */ "There are no tracker addresses." = "Não existem endereços de trackers."; /* Transmission already running alert -> message */ "There is already a copy of Transmission running. This copy cannot be opened until that instance is quit." = "Já existe uma cópia do Transmission iniciada. Esta cópia não pode ser iniciada até que essa instância seja terminada."; /* Confirm Quit panel -> message */ "There is an active transfer that will be paused on quit. The transfer will automatically resume on the next launch." = "Existe uma transferência activa que será colocada em pausa ao sair. A transferência será retomada automaticamente quando voltar a iniciar o Transmission."; /* Create torrent -> no files -> warning */ "There must be at least one file in a folder to create a torrent file." = "É necessário existir pelo menos um ficheiro na pasta para criar um ficheiro torrent."; /* Save log alert panel -> message */ "There was a problem creating the file \"%@\"." = "Ocorreu um erro ao criar o ficheiro \"%@\"."; /* Move error alert -> title */ "There was an error moving the data file." = "Ocorreu um erro ao mover o ficheiro de dados."; /* Magnet link failed -> message */ "There was an error when adding the magnet link \"%@\". The transfer will not occur." = "Ocorreu um erro ao adicionar a ligação magnet \"%@\". A transferência não irá ocorrer."; /* Create torrent -> no files -> title */ "This folder contains no files." = "Esta pasta não contém ficheiros."; /* Removal confirm panel -> message */ "This transfer is active. Once removed, continuing the transfer will require the torrent file or magnet link." = "Esta transferência está activa. Uma vez removida, será necessário o ficheiro torrent ou a ligação magnet para continuar a transferência."; /* Stats reset -> message */ "This will clear the global statistics displayed by Transmission. Individual transfer statistics will not be affected." = "Isto irá limpar as estatísticas globais mostradas pelo Transmission. As estatísticas individuais das tranferências não serão afectadas."; /* Inspector -> tracker table */ "Tier %d" = "Nível %d"; /* Filter toolbar item -> palette label */ "Toggle Filter" = "Mostrar/ocultar o filtro"; /* Inspector toolbar item -> palette label */ "Toggle Inspector" = "Mostrar/ocultar o inspector"; /* Filter toolbar item -> tooltip */ "Toggle the filter bar" = "Mostrar/ocultar a barra de filtros"; /* Inspector toolbar item -> tooltip */ "Toggle the torrent inspector" = "Mostrar/ocultar o inspector de torrents"; /* Download not a torrent -> title Torrent download error -> title */ "Torrent download failed" = "A recepção do torrent falhou"; /* notification title */ "Torrent File Auto Added" = "Ficheiro torrent auto-adicionado"; /* Inspector -> title */ "Torrent Inspector" = "Inspector de torrents"; /* Torrent -> progress string */ "torrent metadata needed" = "metadados do torrent necessários"; /* stats total */ "Total N/A" = "Total N/D"; /* Status Bar -> status menu */ "Total Ratio" = "Rácio total"; /* Status Bar -> status menu */ "Total Transfer" = "Total de transferências"; /* Filter Bar -> filter menu */ "Tracker" = "Tracker"; /* Torrent -> status string */ "Tracker returned error" = "O tracker responder com erro"; /* Torrent -> status string */ "Tracker returned warning" = "O tracker respondeu com aviso"; /* Tracker next announce */ "Tracker will be used as a backup" = "O tracker será usado para redundância"; /* Inspector -> tab Inspector view -> title */ "Trackers" = "Trackers"; /* Inspector -> Peers tab -> peers */ "Transfer Not Active" = "Transferência não activa"; /* Preferences -> toolbar item title */ "Transfers" = "Transferências"; /* Inspector -> Peers tab -> peers */ "Transfers Not Active" = "Transferências não activas"; /* Legal alert -> message */ "Transmission is a file-sharing program. When you run a torrent, its data will be made available to others by means of upload. You and you alone are fully responsible for exercising proper judgement and abiding by your local laws." = "O Transmission é uma aplicação de partilha de ficheiros. Quando inicia um torrent, esses dados serão disponibilizados para outros através do envio de informação. Você, e apenas você, é totalmente responsável por exercer bom senso e cumprir as suas leis locais."; /* Donation beg -> message */ "Transmission is a full-featured torrent application. A lot of time and effort have gone into development, coding, and refinement. If you enjoy using it, please consider showing your love with a donation." = "O Transmission é uma aplicação para torrents completa em funcionalidades. Foi dedicado muito tempo e esforço ao seu desenvolvimento e aperfeiçoamento. Se gosta de o usar, por favor considere mostrar o seu apreço com um donativo."; /* Transmission already running alert -> title */ "Transmission is already running." = "O Transmission já está iniciado."; /* inspector -> peer table -> header status bar -> status label Torrent -> status string */ "UL" = "ENV"; /* Inspector -> Peers tab -> peers */ "UL to %d" = "ENV para %d"; /* File Outline -> Menu */ "Uncheck Selected" = "Desmarcar seleccionados"; /* Status Bar -> speed tooltip */ "unlimited" = "ilimitado"; /* Torrent -> error string unreadable */ "unreadable error" = "Erro de leitura"; /* Save log panel -> default file name */ "untitled" = "sem título"; /* Torrent table -> group row -> tooltip */ "Upload speed" = "Velocidade de envio"; /* Stats window -> label */ "Uploaded" = "Enviado"; /* Torrent -> progress string */ "uploaded %@ (Ratio: %@)" = "enviou %1$@ (Rácio: %2$@)"; /* inspector -> peer table -> header tool tip */ "Uploading To Peer" = "A enviar para o peer"; /* Torrent -> status string */ "Waiting to check existing data" = "A aguardar para verificar dados existentes"; /* Torrent -> status string */ "Waiting to download" = "A aguardar para receber"; /* Torrent -> status string */ "Waiting to seed" = "A aguardar para enviar"; /* Drag overlay -> url */ "Web Address" = "Endereço web"; /* Torrent -> status string */ "web seed" = "seed da web"; /* inspector -> web seed table -> header */ "Web Seeds" = "Seeds da web"; /* Legal alert -> title */ "Welcome to Transmission" = "Bem-vindo ao Transmission"; /* Groups -> Name */ "Yellow" = "Amarelo"; /* Inspector -> peer -> status */ "You unchoked the peer, but the peer is not interested" = "Descongestionou o peer, mas o peer não está interessado"; /* Inspector -> peer -> status */ "You want to download, but peer does not want to send (interested and choked)" = "Pretende receber, mas o peer não quer enviar (interessado e congestionado)"; transmission-2.92/macosx/pt_PT.lproj/PaxHeaders.4960/InfoOptionsView.xib0000644000000000000000000000013112664476420023143 xustar0030 mtime=1456635152.278501367 30 atime=1456635152.278501367 29 ctime=1457295922.83185606 transmission-2.92/macosx/pt_PT.lproj/InfoOptionsView.xib0000644000175000017500000012133712664476420024600 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/pt_PT.lproj/PaxHeaders.4960/InfoActivityView.xib0000644000000000000000000000013112664476420023304 xustar0030 mtime=1456635152.279501384 30 atime=1456635152.278501367 29 ctime=1457295922.83185606 transmission-2.92/macosx/pt_PT.lproj/InfoActivityView.xib0000644000175000017500000012747512664476420024752 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/pt_PT.lproj/PaxHeaders.4960/InfoGeneralView.xib0000644000000000000000000000013112664476420023065 xustar0030 mtime=1456635152.279501384 30 atime=1456635152.279501384 29 ctime=1457295922.83185606 transmission-2.92/macosx/pt_PT.lproj/InfoGeneralView.xib0000644000175000017500000006272312664476420024525 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/pt_PT.lproj/PaxHeaders.4960/AddMagnetWindow.xib0000644000000000000000000000013112662757243023060 xustar0030 mtime=1456201379.255861889 30 atime=1456201379.255861889 29 ctime=1457295922.83185606 transmission-2.92/macosx/pt_PT.lproj/AddMagnetWindow.xib0000644000175000017500000006541612662757243024522 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/pt_PT.lproj/PaxHeaders.4960/MainMenu.xib0000644000000000000000000000013112644245522021545 xustar0030 mtime=1452362578.840700588 30 atime=1452362578.840700588 29 ctime=1457295922.83185606 transmission-2.92/macosx/pt_PT.lproj/MainMenu.xib0000644000175000017500000021703012644245522023176 0ustar00mikedldmikedld00000000000000 CA CA YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7NjIsIDYyfdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPEREyTU0AKgAAA6yANJsuF/gC DQeEQmFQuGQ2HQ+IRGJROKRWLReMRmIwKCRqPR+QSGRSOSSWHRyCyaVSuWS2XS+EyiYTOaTWbTcATKcT ueT2fRuBymf0OiUWaTqjUmlUuP0imU+oVGF06pVWrUmqVetVucVmuV+wSyvWGyWWm0GzWm1Rqx2u3W+Y tlwUK4XW7Tm5XS73u1QK53zAX284HCWS/XrC4mq4fFY2rYzHZGn5DJZWjNJsX/LZuh5jNZzQTvPYjQ6W X6PTamZ6jVa2xZnSa7ZU3YbPbSJo7Xb7uNbnP7zgRTfbHg8WF8PjcmH8jlc2FczndEAdDpc3qdXk9fsc Xtdvgd3vbvweHbePybLzefW+n1an2e3S+/4aD5RYlkQeAAD/uVvn/AAWpeGI+aVPqipEECPIAAhBgAHr B4AH3CSKgLCoAAXDAAHhDYADwP5DwIk0DIoRRBj2AEKgKABFEaSKQDsOg4QifR9AAOw+kKpglCGHb9P4 kb/HyABbF6YqtRGiZGEKPoAANJwADcOsmI+SBFEEAB+QmOg9kGphDkAPAAAtMaSHVMwADyQBESO3SSkc Q4/gACU5gAWE7TqW5fgAJwjh/HwDgBIIAFkXJggAKAkiCAAn0YAB30eAA5DyQKmDyOQ1AACNNJJR53gA Q5HEskh5nkeIAF4XBaUcdx1xQAgCIzJCJEgRNKAxW4AHRXQADgO841pW1cV0dFeV8AFgABW4MVzXdezi pYMgqCKXnOddPJGWZWlQAAHAaBQAAncMUQsjFZIiSRFy7OYJAAcN3AAPZBEUABCj8OwAAzfIAHPfl4Xl el7AAD+BgAd2DShKTzloVpTAAFoWhYAAG4mAABYtWM2pIShGxzJwDAAP5BENfdrXxaUoDWM4AEkSpM5J T1o2mQI/D0AEaRqNg5xOpdEUUBGfpIfGhTxPSRmIXxcgAEIQA7cFxVfWFy4ykZLEfEGPAAMg1jmhpEkF mo7j9kaGE4SpG5tGgADUOMFKWTJJXmDW5JIc26gAM43XukcHnoABtGqaD9AKAc/4w36RkwSJEgACnGzr O5+8iAAB8oAAk8uABb80AHIn7yfKih0IAHZ0gADQN47qZBEFcaCiSdIdkOw/NnDpEQw/9T1qV9gAA9ED xdoZOl1q2uq1zIhmKa+JEKSlkXBfmyD4QBCE3mNUNw5DsQwxjMNW2+s0oUhUFgYjsPQ/EgGQaBsH3wNM FAUhWGAkCWJosCEIYjCgD4QhEE77jEkBAAAPAQAAAwAAAAEAPgAAAQEAAwAAAAEAPgAAAQIAAwAAAAQA AARmAQMAAwAAAAEABQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEA BAAAARYAAwAAAAEAPgAAARcABAAAAAEAAAOjARwAAwAAAAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEA AQAAAVMAAwAAAAQAAARuh3MABwAADLwAAAR2AAAAAAAIAAgACAAIAAEAAQABAAEAAAy8YXBwbAIQAABt bnRyUkdCIFhZWiAH3gABAAgACQA1ABdhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYA AQAAAADTLWFwcGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFk ZXNjAAABUAAAAGJkc2NtAAABtAAAAaRjcHJ0AAADWAAAACN3dHB0AAADfAAAABRyWFlaAAADkAAAABRn WFlaAAADpAAAABRiWFlaAAADuAAAABRyVFJDAAADzAAACAxhYXJnAAAL2AAAACB2Y2d0AAAL+AAAADBu ZGluAAAMKAAAAD5jaGFkAAAMaAAAACxtbW9kAAAMlAAAAChiVFJDAAADzAAACAxnVFJDAAADzAAACAxh YWJnAAAL2AAAACBhYWdnAAAL2AAAACBkZXNjAAAAAAAAAAhEaXNwbGF5AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAbWx1YwAAAAAAAAAhAAAADGhySFIAAAAIAAABnGtvS1IAAAAIAAABnG5iTk8AAAAIAAABnGlkAAAA AAAIAAABnGh1SFUAAAAIAAABnGNzQ1oAAAAIAAABnGRhREsAAAAIAAABnHVrVUEAAAAIAAABnGFyAAAA AAAIAAABnGl0SVQAAAAIAAABnHJvUk8AAAAIAAABnG5sTkwAAAAIAAABnGhlSUwAAAAIAAABnGVzRVMA AAAIAAABnGZpRkkAAAAIAAABnHpoVFcAAAAIAAABnHZpVk4AAAAIAAABnHNrU0sAAAAIAAABnHpoQ04A AAAIAAABnHJ1UlUAAAAIAAABnGZyRlIAAAAIAAABnG1zAAAAAAAIAAABnGNhRVMAAAAIAAABnHRoVEgA AAAIAAABnGRlREUAAAAIAAABnGVuVVMAAAAIAAABnHB0QlIAAAAIAAABnHBsUEwAAAAIAAABnGVsR1IA AAAIAAABnHN2U0UAAAAIAAABnHRyVFIAAAAIAAABnGphSlAAAAAIAAABnHB0UFQAAAAIAAABnABpAE0A YQBjdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUgSW5jLiwgMjAxNAAAWFlaIAAAAAAAAPMWAAEAAAABFspY WVogAAAAAAAAccAAADmKAAABZ1hZWiAAAAAAAABhIwAAueYAABP2WFlaIAAAAAAAACPyAAAMkAAAvdBj dXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADYAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIA dwB8AIEAhgCLAJAAlQCaAJ8AowCoAK0AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0B EwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB 6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwAD CwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEE fgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcG SAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoI bgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK 8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN 3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMR MRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U 8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZ IBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkd wx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i 3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8o cSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwu gi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1 EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8 JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31D wEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL 4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJU j1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhd yV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1n k2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx 8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF8 4X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASI aYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCU ipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNih R6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2u oa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8 m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfL Nsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHa dtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDq W+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf6 5/t3/Af8mP0p/br+S/7c/23//3BhcmEAAAAAAAMAAAACZmYAAPKnAAANWQAAE9AAAAoOdmNndAAAAAAA AAABAAEAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAEAAAAAAAAAAQAAbmRpbgAAAAAAAAA2AACnQAAAVYAA AEzAAACewAAAJYAAAAzAAABQAAAAVEAAAjMzAAIzMwACMzMAAAAAAAAAAHNmMzIAAAAAAAEMcgAABfj/ //MdAAAHugAA/XL///ud///9pAAAA9kAAMBxbW1vZAAAAAAAAAYQAACgBwAAAADJJx4AAAAAAAAAAAAA AAAAAAAAANIlJicoWiRjbGFzc25hbWVYJGNsYXNzZXNfEBBOU0JpdG1hcEltYWdlUmVwoycpKlpOU0lt YWdlUmVwWE5TT2JqZWN00iUmLC1XTlNBcnJheaIsKtIlJi8wXk5TTXV0YWJsZUFycmF5oy8sKtMyMwo0 NTZXTlNXaGl0ZVxOU0NvbG9yU3BhY2VEMCAwABADgAzSJSY4OVdOU0NvbG9yojgq0iUmOzxXTlNJbWFn ZaI7Kl8QD05TS2V5ZWRBcmNoaXZlctE/QFRyb290gAEACAARABoAIwAtADIANwBGAEwAVwBeAGUAcgB5 AIEAgwCFAIoAjACOAJcAnACnAKkAqwCtALIAtQC3ALkAuwC9AMIA2QDbAN0SExIYEiMSLBI/EkMSThJX ElwSZBJnEmwSexJ/EoYSjhKbEqASohKkEqkSsRK0ErkSwRLEEtYS2RLeAAAAAAAAAgEAAAAAAAAAQQAA AAAAAAAAAAAAAAAAEuA transmission-2.92/macosx/pt_PT.lproj/PaxHeaders.4960/GroupRules.xib0000644000000000000000000000013112666747213022153 xustar0030 mtime=1457245835.319998715 30 atime=1457245835.319998715 29 ctime=1457295922.83185606 transmission-2.92/macosx/pt_PT.lproj/GroupRules.xib0000644000175000017500000004162412666747213023610 0ustar00mikedldmikedld00000000000000 name comment name comment fFlatFileList.name allTrackersFlat fFlatFileList.name allTrackersFlat transmission-2.92/macosx/pt_PT.lproj/PaxHeaders.4960/AddWindow.xib0000644000000000000000000000013112640354045021711 xustar0030 mtime=1451350053.459167913 30 atime=1451350053.459167913 29 ctime=1457295922.83185606 transmission-2.92/macosx/pt_PT.lproj/AddWindow.xib0000644000175000017500000007312612640354045023350 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/pt_PT.lproj/PaxHeaders.4960/GlobalOptionsPopover.xib0000644000000000000000000000012712640354045024165 xustar0029 mtime=1451350053.46016793 29 atime=1451350053.46016793 29 ctime=1457295922.83185606 transmission-2.92/macosx/pt_PT.lproj/GlobalOptionsPopover.xib0000644000175000017500000006375412640354045025625 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/ShareTorrentFileHelper.h0000644000000000000000000000013112442116673021706 xustar0030 mtime=1418239419.187186638 30 atime=1418239419.187186638 29 ctime=1457295923.50286747 transmission-2.92/macosx/ShareTorrentFileHelper.h0000644000175000017500000000055112442116673023335 0ustar00mikedldmikedld00000000000000// // ShareTorrentFileHelper.h // Transmission // // Created by Mitchell Livingston on 1/10/14. // Copyright (c) 2014 The Transmission Project. All rights reserved. // #import @interface ShareTorrentFileHelper : NSObject + (ShareTorrentFileHelper *) sharedHelper; - (NSArray *) shareTorrentURLs; - (NSArray *) menuItems; @end transmission-2.92/macosx/PaxHeaders.4960/PrefsController.m0000644000000000000000000000013212644245522020457 xustar0030 mtime=1452362578.759699169 30 atime=1452362578.758699151 30 ctime=1457295923.464866824 transmission-2.92/macosx/PrefsController.m0000644000175000017500000015516312644245522022117 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: PrefsController.m 14667 2016-01-08 10:05:19Z mikedld $ * * Copyright (c) 2005-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "PrefsController.h" #import "BlocklistDownloaderViewController.h" #import "BlocklistScheduler.h" #import "Controller.h" #import "PortChecker.h" #import "BonjourController.h" #import "NSApplicationAdditions.h" #import "NSStringAdditions.h" #import "VDKQueue.h" #import "transmission.h" #import "utils.h" #import #import #define DOWNLOAD_FOLDER 0 #define DOWNLOAD_TORRENT 2 #define RPC_IP_ADD_TAG 0 #define RPC_IP_REMOVE_TAG 1 #define TOOLBAR_GENERAL @"TOOLBAR_GENERAL" #define TOOLBAR_TRANSFERS @"TOOLBAR_TRANSFERS" #define TOOLBAR_GROUPS @"TOOLBAR_GROUPS" #define TOOLBAR_BANDWIDTH @"TOOLBAR_BANDWIDTH" #define TOOLBAR_PEERS @"TOOLBAR_PEERS" #define TOOLBAR_NETWORK @"TOOLBAR_NETWORK" #define TOOLBAR_REMOTE @"TOOLBAR_REMOTE" #define RPC_KEYCHAIN_SERVICE "Transmission:Remote" #define RPC_KEYCHAIN_NAME "Remote" #define WEBUI_URL @"http://localhost:%ld/" @interface PrefsController (Private) - (void) setPrefView: (id) sender; - (void) updateGrowlButton; - (void) setKeychainPassword: (const char *) password forService: (const char *) service username: (const char *) username; @end @implementation PrefsController - (id) initWithHandle: (tr_session *) handle { if ((self = [super initWithWindowNibName: @"PrefsWindow"])) { fHandle = handle; fDefaults = [NSUserDefaults standardUserDefaults]; //check for old version download location (before 1.1) NSString * choice; if ((choice = [fDefaults stringForKey: @"DownloadChoice"])) { [fDefaults setBool: [choice isEqualToString: @"Constant"] forKey: @"DownloadLocationConstant"]; [fDefaults setBool: YES forKey: @"DownloadAsk"]; [fDefaults removeObjectForKey: @"DownloadChoice"]; } //check for old version blocklist (before 2.12) NSDate * blocklistDate; if ((blocklistDate = [fDefaults objectForKey: @"BlocklistLastUpdate"])) { [fDefaults setObject: blocklistDate forKey: @"BlocklistNewLastUpdateSuccess"]; [fDefaults setObject: blocklistDate forKey: @"BlocklistNewLastUpdate"]; [fDefaults removeObjectForKey: @"BlocklistLastUpdate"]; NSURL * blocklistDir = [[[[NSFileManager defaultManager] URLsForDirectory: NSApplicationDirectory inDomains: NSUserDomainMask] objectAtIndex: 0] URLByAppendingPathComponent: @"Transmission/blocklists/"]; [[NSFileManager defaultManager] moveItemAtURL: [blocklistDir URLByAppendingPathComponent: @"level1.bin"] toURL: [blocklistDir URLByAppendingPathComponent: [NSString stringWithUTF8String: DEFAULT_BLOCKLIST_FILENAME]] error: nil]; } //save a new random port if ([fDefaults boolForKey: @"RandomPort"]) [fDefaults setInteger: tr_sessionGetPeerPort(fHandle) forKey: @"BindPort"]; //set auto import NSString * autoPath; if ([fDefaults boolForKey: @"AutoImport"] && (autoPath = [fDefaults stringForKey: @"AutoImportDirectory"])) [[(Controller *)[NSApp delegate] fileWatcherQueue] addPath: [autoPath stringByExpandingTildeInPath] notifyingAbout: VDKQueueNotifyAboutWrite]; //set special-handling of magnet link add window checkbox [self updateShowAddMagnetWindowField]; //set blocklist scheduler [[BlocklistScheduler scheduler] updateSchedule]; //set encryption [self setEncryptionMode: nil]; //update rpc whitelist [self updateRPCPassword]; fRPCWhitelistArray = [[fDefaults arrayForKey: @"RPCWhitelist"] mutableCopy]; if (!fRPCWhitelistArray) fRPCWhitelistArray = [[NSMutableArray arrayWithObject: @"127.0.0.1"] retain]; [self updateRPCWhitelist]; //reset old Sparkle settings from previous versions [fDefaults removeObjectForKey: @"SUScheduledCheckInterval"]; if ([fDefaults objectForKey: @"CheckForUpdates"]) { [[SUUpdater sharedUpdater] setAutomaticallyChecksForUpdates: [fDefaults boolForKey: @"CheckForUpdates"]]; [fDefaults removeObjectForKey: @"CheckForUpdates"]; } //set built-in Growl [GrowlApplicationBridge setShouldUseBuiltInNotifications: ![NSApp isOnMountainLionOrBetter] && [fDefaults boolForKey: @"DisplayNotifications"]]; [self setAutoUpdateToBeta: nil]; } return self; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; [fPortStatusTimer invalidate]; [fPortStatusTimer release]; if (fPortChecker) { [fPortChecker cancelProbe]; [fPortChecker release]; } [fRPCWhitelistArray release]; [fRPCPassword release]; [super dealloc]; } - (void) awakeFromNib { fHasLoaded = YES; [[self window] setRestorationClass: [self class]]; NSToolbar * toolbar = [[NSToolbar alloc] initWithIdentifier: @"Preferences Toolbar"]; [toolbar setDelegate: self]; [toolbar setAllowsUserCustomization: NO]; [toolbar setDisplayMode: NSToolbarDisplayModeIconAndLabel]; [toolbar setSizeMode: NSToolbarSizeModeRegular]; [toolbar setSelectedItemIdentifier: TOOLBAR_GENERAL]; [[self window] setToolbar: toolbar]; [toolbar release]; [self setPrefView: nil]; //make sure proper notification settings are shown [self updateGrowlButton]; //set download folder [fFolderPopUp selectItemAtIndex: [fDefaults boolForKey: @"DownloadLocationConstant"] ? DOWNLOAD_FOLDER : DOWNLOAD_TORRENT]; //set stop ratio [fRatioStopField setFloatValue: [fDefaults floatForKey: @"RatioLimit"]]; //set idle seeding minutes [fIdleStopField setIntegerValue: [fDefaults integerForKey: @"IdleLimitMinutes"]]; //set limits [self updateLimitFields]; //set speed limit [fSpeedLimitUploadField setIntValue: [fDefaults integerForKey: @"SpeedLimitUploadLimit"]]; [fSpeedLimitDownloadField setIntValue: [fDefaults integerForKey: @"SpeedLimitDownloadLimit"]]; //set port [fPortField setIntValue: [fDefaults integerForKey: @"BindPort"]]; fNatStatus = -1; [self updatePortStatus]; fPortStatusTimer = [[NSTimer scheduledTimerWithTimeInterval: 5.0 target: self selector: @selector(updatePortStatus) userInfo: nil repeats: YES] retain]; //set peer connections [fPeersGlobalField setIntValue: [fDefaults integerForKey: @"PeersTotal"]]; [fPeersTorrentField setIntValue: [fDefaults integerForKey: @"PeersTorrent"]]; //set queue values [fQueueDownloadField setIntValue: [fDefaults integerForKey: @"QueueDownloadNumber"]]; [fQueueSeedField setIntValue: [fDefaults integerForKey: @"QueueSeedNumber"]]; [fStalledField setIntValue: [fDefaults integerForKey: @"StalledMinutes"]]; //set blocklist NSString * blocklistURL = [fDefaults stringForKey: @"BlocklistURL"]; if (blocklistURL) [fBlocklistURLField setStringValue: blocklistURL]; [self updateBlocklistButton]; [self updateBlocklistFields]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateLimitFields) name: @"UpdateSpeedLimitValuesOutsidePrefs" object: nil]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateRatioStopField) name: @"UpdateRatioStopValueOutsidePrefs" object: nil]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateLimitStopField) name: @"UpdateIdleStopValueOutsidePrefs" object: nil]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateBlocklistFields) name: @"BlocklistUpdated" object: nil]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateBlocklistURLField) name: NSControlTextDidChangeNotification object: fBlocklistURLField]; //set rpc port [fRPCPortField setIntValue: [fDefaults integerForKey: @"RPCPort"]]; //set rpc password if (fRPCPassword) [fRPCPasswordField setStringValue: fRPCPassword]; } - (NSToolbarItem *) toolbar: (NSToolbar *) toolbar itemForItemIdentifier: (NSString *) ident willBeInsertedIntoToolbar: (BOOL) flag { NSToolbarItem * item = [[NSToolbarItem alloc] initWithItemIdentifier: ident]; if ([ident isEqualToString: TOOLBAR_GENERAL]) { [item setLabel: NSLocalizedString(@"General", "Preferences -> toolbar item title")]; [item setImage: [NSImage imageNamed: NSImageNamePreferencesGeneral]]; [item setTarget: self]; [item setAction: @selector(setPrefView:)]; [item setAutovalidates: NO]; } else if ([ident isEqualToString: TOOLBAR_TRANSFERS]) { [item setLabel: NSLocalizedString(@"Transfers", "Preferences -> toolbar item title")]; [item setImage: [NSImage imageNamed: @"Transfers"]]; [item setTarget: self]; [item setAction: @selector(setPrefView:)]; [item setAutovalidates: NO]; } else if ([ident isEqualToString: TOOLBAR_GROUPS]) { [item setLabel: NSLocalizedString(@"Groups", "Preferences -> toolbar item title")]; [item setImage: [NSImage imageNamed: @"Groups"]]; [item setTarget: self]; [item setAction: @selector(setPrefView:)]; [item setAutovalidates: NO]; } else if ([ident isEqualToString: TOOLBAR_BANDWIDTH]) { [item setLabel: NSLocalizedString(@"Bandwidth", "Preferences -> toolbar item title")]; [item setImage: [NSImage imageNamed: @"Bandwidth"]]; [item setTarget: self]; [item setAction: @selector(setPrefView:)]; [item setAutovalidates: NO]; } else if ([ident isEqualToString: TOOLBAR_PEERS]) { [item setLabel: NSLocalizedString(@"Peers", "Preferences -> toolbar item title")]; [item setImage: [NSImage imageNamed: NSImageNameUserGroup]]; [item setTarget: self]; [item setAction: @selector(setPrefView:)]; [item setAutovalidates: NO]; } else if ([ident isEqualToString: TOOLBAR_NETWORK]) { [item setLabel: NSLocalizedString(@"Network", "Preferences -> toolbar item title")]; [item setImage: [NSImage imageNamed: NSImageNameNetwork]]; [item setTarget: self]; [item setAction: @selector(setPrefView:)]; [item setAutovalidates: NO]; } else if ([ident isEqualToString: TOOLBAR_REMOTE]) { [item setLabel: NSLocalizedString(@"Remote", "Preferences -> toolbar item title")]; [item setImage: [NSImage imageNamed: @"Remote"]]; [item setTarget: self]; [item setAction: @selector(setPrefView:)]; [item setAutovalidates: NO]; } else { [item release]; return nil; } return [item autorelease]; } - (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) toolbar { return [NSArray arrayWithObjects: TOOLBAR_GENERAL, TOOLBAR_TRANSFERS, TOOLBAR_GROUPS, TOOLBAR_BANDWIDTH, TOOLBAR_PEERS, TOOLBAR_NETWORK, TOOLBAR_REMOTE, nil]; } - (NSArray *) toolbarSelectableItemIdentifiers: (NSToolbar *) toolbar { return [self toolbarAllowedItemIdentifiers: toolbar]; } - (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar { return [self toolbarAllowedItemIdentifiers: toolbar]; } - (void) windowDidBecomeMain: (NSNotification *) notification { //this is a good place to see if Growl was quit/launched [self updateGrowlButton]; } + (void) restoreWindowWithIdentifier: (NSString *) identifier state: (NSCoder *) state completionHandler: (void (^)(NSWindow *, NSError *)) completionHandler { NSWindow * window = [[(Controller *)[NSApp delegate] prefsController] window]; completionHandler(window, nil); } //for a beta release, always use the beta appcast #if defined(TR_BETA_RELEASE) #define SPARKLE_TAG YES #else #define SPARKLE_TAG [fDefaults boolForKey: @"AutoUpdateBeta"] #endif - (void) setAutoUpdateToBeta: (id) sender { [[SUUpdater sharedUpdater] setAllowedTags: SPARKLE_TAG ? [NSSet setWithObject: @"beta"] : nil]; } - (void) setPort: (id) sender { const tr_port port = [sender intValue]; [fDefaults setInteger: port forKey: @"BindPort"]; tr_sessionSetPeerPort(fHandle, port); fPeerPort = -1; [self updatePortStatus]; } - (void) randomPort: (id) sender { const tr_port port = tr_sessionSetPeerPortRandom(fHandle); [fDefaults setInteger: port forKey: @"BindPort"]; [fPortField setIntValue: port]; fPeerPort = -1; [self updatePortStatus]; } - (void) setRandomPortOnStart: (id) sender { tr_sessionSetPeerPortRandomOnStart(fHandle, [(NSButton *)sender state] == NSOnState); } - (void) setNat: (id) sender { tr_sessionSetPortForwardingEnabled(fHandle, [fDefaults boolForKey: @"NatTraversal"]); fNatStatus = -1; [self updatePortStatus]; } - (void) updatePortStatus { const tr_port_forwarding fwd = tr_sessionGetPortForwarding(fHandle); const int port = tr_sessionGetPeerPort(fHandle); BOOL natStatusChanged = (fNatStatus != fwd); BOOL peerPortChanged = (fPeerPort != port); if (natStatusChanged || peerPortChanged) { fNatStatus = fwd; fPeerPort = port; [fPortStatusField setStringValue: @""]; [fPortStatusImage setImage: nil]; [fPortStatusProgress startAnimation: self]; if (fPortChecker) { [fPortChecker cancelProbe]; [fPortChecker release]; } BOOL delay = natStatusChanged || tr_sessionIsPortForwardingEnabled(fHandle); fPortChecker = [[PortChecker alloc] initForPort: fPeerPort delay: delay withDelegate: self]; } } - (void) portCheckerDidFinishProbing: (PortChecker *) portChecker { [fPortStatusProgress stopAnimation: self]; switch ([fPortChecker status]) { case PORT_STATUS_OPEN: [fPortStatusField setStringValue: NSLocalizedString(@"Port is open", "Preferences -> Network -> port status")]; [fPortStatusImage setImage: [NSImage imageNamed: NSImageNameStatusAvailable]]; break; case PORT_STATUS_CLOSED: [fPortStatusField setStringValue: NSLocalizedString(@"Port is closed", "Preferences -> Network -> port status")]; [fPortStatusImage setImage: [NSImage imageNamed: NSImageNameStatusUnavailable]]; break; case PORT_STATUS_ERROR: [fPortStatusField setStringValue: NSLocalizedString(@"Port check site is down", "Preferences -> Network -> port status")]; [fPortStatusImage setImage: [NSImage imageNamed: NSImageNameStatusPartiallyAvailable]]; break; default: NSAssert1(NO, @"Port checker returned invalid status: %d", [fPortChecker status]); break; } [fPortChecker release]; fPortChecker = nil; } - (NSArray *) sounds { NSMutableArray * sounds = [NSMutableArray array]; NSArray * directories = NSSearchPathForDirectoriesInDomains(NSAllLibrariesDirectory, NSUserDomainMask | NSLocalDomainMask | NSSystemDomainMask, YES); for (NSString * directory in directories) { directory = [directory stringByAppendingPathComponent: @"Sounds"]; BOOL isDirectory; if ([[NSFileManager defaultManager] fileExistsAtPath: directory isDirectory: &isDirectory] && isDirectory) { NSArray * directoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath: directory error: NULL]; for (NSString * sound in directoryContents) { sound = [sound stringByDeletingPathExtension]; if ([NSSound soundNamed: sound]) [sounds addObject: sound]; } } } return sounds; } - (void) setSound: (id) sender { //play sound when selecting NSSound * sound; if ((sound = [NSSound soundNamed: [sender titleOfSelectedItem]])) [sound play]; } - (void) setUTP: (id) sender { tr_sessionSetUTPEnabled(fHandle, [fDefaults boolForKey: @"UTPGlobal"]); } - (void) setPeersGlobal: (id) sender { const int count = [sender intValue]; [fDefaults setInteger: count forKey: @"PeersTotal"]; tr_sessionSetPeerLimit(fHandle, count); } - (void) setPeersTorrent: (id) sender { const int count = [sender intValue]; [fDefaults setInteger: count forKey: @"PeersTorrent"]; tr_sessionSetPeerLimitPerTorrent(fHandle, count); } - (void) setPEX: (id) sender { tr_sessionSetPexEnabled(fHandle, [fDefaults boolForKey: @"PEXGlobal"]); } - (void) setDHT: (id) sender { tr_sessionSetDHTEnabled(fHandle, [fDefaults boolForKey: @"DHTGlobal"]); } - (void) setLPD: (id) sender { tr_sessionSetLPDEnabled(fHandle, [fDefaults boolForKey: @"LocalPeerDiscoveryGlobal"]); } - (void) setEncryptionMode: (id) sender { const tr_encryption_mode mode = [fDefaults boolForKey: @"EncryptionPrefer"] ? ([fDefaults boolForKey: @"EncryptionRequire"] ? TR_ENCRYPTION_REQUIRED : TR_ENCRYPTION_PREFERRED) : TR_CLEAR_PREFERRED; tr_sessionSetEncryption(fHandle, mode); } - (void) setBlocklistEnabled: (id) sender { tr_blocklistSetEnabled(fHandle, [fDefaults boolForKey: @"BlocklistNew"]); [[BlocklistScheduler scheduler] updateSchedule]; [self updateBlocklistButton]; } - (void) updateBlocklist: (id) sender { [BlocklistDownloaderViewController downloadWithPrefsController: self]; } - (void) setBlocklistAutoUpdate: (id) sender { [[BlocklistScheduler scheduler] updateSchedule]; } - (void) updateBlocklistFields { const BOOL exists = tr_blocklistExists(fHandle); if (exists) { NSString * countString = [NSString formattedUInteger: tr_blocklistGetRuleCount(fHandle)]; [fBlocklistMessageField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%@ IP address rules in list", "Prefs -> blocklist -> message"), countString]]; } else [fBlocklistMessageField setStringValue: NSLocalizedString(@"A blocklist must first be downloaded", "Prefs -> blocklist -> message")]; NSString * updatedDateString; if (exists) { NSDate * updatedDate = [fDefaults objectForKey: @"BlocklistNewLastUpdateSuccess"]; if (updatedDate) updatedDateString = [NSDateFormatter localizedStringFromDate: updatedDate dateStyle: NSDateFormatterFullStyle timeStyle: NSDateFormatterShortStyle]; else updatedDateString = NSLocalizedString(@"N/A", "Prefs -> blocklist -> message"); } else updatedDateString = NSLocalizedString(@"Never", "Prefs -> blocklist -> message"); [fBlocklistDateField setStringValue: [NSString stringWithFormat: @"%@: %@", NSLocalizedString(@"Last updated", "Prefs -> blocklist -> message"), updatedDateString]]; } - (void) updateBlocklistURLField { NSString * blocklistString = [fBlocklistURLField stringValue]; [fDefaults setObject: blocklistString forKey: @"BlocklistURL"]; tr_blocklistSetURL(fHandle, [blocklistString UTF8String]); [self updateBlocklistButton]; } - (void) updateBlocklistButton { NSString * blocklistString = [fDefaults objectForKey: @"BlocklistURL"]; const BOOL enable = (blocklistString && ![blocklistString isEqualToString: @""]) && [fDefaults boolForKey: @"BlocklistNew"]; [fBlocklistButton setEnabled: enable]; } - (void) setAutoStartDownloads: (id) sender { tr_sessionSetPaused(fHandle, ![fDefaults boolForKey: @"AutoStartDownload"]); } - (void) applySpeedSettings: (id) sender { tr_sessionLimitSpeed(fHandle, TR_UP, [fDefaults boolForKey: @"CheckUpload"]); tr_sessionSetSpeedLimit_KBps(fHandle, TR_UP, [fDefaults integerForKey: @"UploadLimit"]); tr_sessionLimitSpeed(fHandle, TR_DOWN, [fDefaults boolForKey: @"CheckDownload"]); tr_sessionSetSpeedLimit_KBps(fHandle, TR_DOWN, [fDefaults integerForKey: @"DownloadLimit"]); [[NSNotificationCenter defaultCenter] postNotificationName: @"SpeedLimitUpdate" object: nil]; } - (void) applyAltSpeedSettings { tr_sessionSetAltSpeed_KBps(fHandle, TR_UP, [fDefaults integerForKey: @"SpeedLimitUploadLimit"]); tr_sessionSetAltSpeed_KBps(fHandle, TR_DOWN, [fDefaults integerForKey: @"SpeedLimitDownloadLimit"]); [[NSNotificationCenter defaultCenter] postNotificationName: @"SpeedLimitUpdate" object: nil]; } - (void) applyRatioSetting: (id) sender { tr_sessionSetRatioLimited(fHandle, [fDefaults boolForKey: @"RatioCheck"]); tr_sessionSetRatioLimit(fHandle, [fDefaults floatForKey: @"RatioLimit"]); //reload main table for seeding progress [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil]; //reload global settings in inspector [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateGlobalOptions" object: nil]; } - (void) setRatioStop: (id) sender { [fDefaults setFloat: [sender floatValue] forKey: @"RatioLimit"]; [self applyRatioSetting: nil]; } - (void) updateRatioStopField { if (fHasLoaded) [fRatioStopField setFloatValue: [fDefaults floatForKey: @"RatioLimit"]]; } - (void) updateRatioStopFieldOld { [self updateRatioStopField]; [self applyRatioSetting: nil]; } - (void) applyIdleStopSetting: (id) sender { tr_sessionSetIdleLimited(fHandle, [fDefaults boolForKey: @"IdleLimitCheck"]); tr_sessionSetIdleLimit(fHandle, [fDefaults integerForKey: @"IdleLimitMinutes"]); //reload main table for remaining seeding time [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil]; //reload global settings in inspector [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateGlobalOptions" object: nil]; } - (void) setIdleStop: (id) sender { [fDefaults setInteger: [sender integerValue] forKey: @"IdleLimitMinutes"]; [self applyIdleStopSetting: nil]; } - (void) updateLimitStopField { if (fHasLoaded) [fIdleStopField setIntegerValue: [fDefaults integerForKey: @"IdleLimitMinutes"]]; } - (void) updateLimitFields { if (!fHasLoaded) return; [fUploadField setIntValue: [fDefaults integerForKey: @"UploadLimit"]]; [fDownloadField setIntValue: [fDefaults integerForKey: @"DownloadLimit"]]; } - (void) setGlobalLimit: (id) sender { [fDefaults setInteger: [sender intValue] forKey: sender == fUploadField ? @"UploadLimit" : @"DownloadLimit"]; [self applySpeedSettings: self]; } - (void) setSpeedLimit: (id) sender { [fDefaults setInteger: [sender intValue] forKey: sender == fSpeedLimitUploadField ? @"SpeedLimitUploadLimit" : @"SpeedLimitDownloadLimit"]; [self applyAltSpeedSettings]; } - (void) setAutoSpeedLimit: (id) sender { tr_sessionUseAltSpeedTime(fHandle, [fDefaults boolForKey: @"SpeedLimitAuto"]); } - (void) setAutoSpeedLimitTime: (id) sender { tr_sessionSetAltSpeedBegin(fHandle, [PrefsController dateToTimeSum: [fDefaults objectForKey: @"SpeedLimitAutoOnDate"]]); tr_sessionSetAltSpeedEnd(fHandle, [PrefsController dateToTimeSum: [fDefaults objectForKey: @"SpeedLimitAutoOffDate"]]); } - (void) setAutoSpeedLimitDay: (id) sender { tr_sessionSetAltSpeedDay(fHandle, [[sender selectedItem] tag]); } + (NSInteger) dateToTimeSum: (NSDate *) date { NSCalendar * calendar = [NSCalendar currentCalendar]; NSDateComponents * components = [calendar components: NSHourCalendarUnit | NSMinuteCalendarUnit fromDate: date]; return [components hour] * 60 + [components minute]; } + (NSDate *) timeSumToDate: (NSInteger) sum { NSDateComponents * comps = [[[NSDateComponents alloc] init] autorelease]; [comps setHour: sum / 60]; [comps setMinute: sum % 60]; return [[NSCalendar currentCalendar] dateFromComponents: comps]; } - (BOOL) control: (NSControl *) control textShouldBeginEditing: (NSText *) fieldEditor { [fInitialString release]; fInitialString = [[control stringValue] retain]; return YES; } - (BOOL) control: (NSControl *) control didFailToFormatString: (NSString *) string errorDescription: (NSString *) error { NSBeep(); if (fInitialString) { [control setStringValue: fInitialString]; [fInitialString release]; fInitialString = nil; } return NO; } - (void) setBadge: (id) sender { [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: self]; } - (IBAction) setBuiltInGrowlEnabled: (id) sender { const BOOL enable = [(NSButton *)sender state] == NSOnState; [fDefaults setBool: enable forKey: @"DisplayNotifications"]; [GrowlApplicationBridge setShouldUseBuiltInNotifications: enable]; } - (IBAction) openGrowlApp: (id) sender { [GrowlApplicationBridge openGrowlPreferences: YES]; } - (void) openNotificationSystemPrefs: (id) sender { [[NSWorkspace sharedWorkspace] openURL: [NSURL fileURLWithPath:@"/System/Library/PreferencePanes/Notifications.prefPane"]]; } - (void) resetWarnings: (id) sender { [fDefaults removeObjectForKey: @"WarningDuplicate"]; [fDefaults removeObjectForKey: @"WarningRemainingSpace"]; [fDefaults removeObjectForKey: @"WarningFolderDataSameName"]; [fDefaults removeObjectForKey: @"WarningResetStats"]; [fDefaults removeObjectForKey: @"WarningCreatorBlankAddress"]; [fDefaults removeObjectForKey: @"WarningCreatorPrivateBlankAddress"]; [fDefaults removeObjectForKey: @"WarningRemoveTrackers"]; [fDefaults removeObjectForKey: @"WarningInvalidOpen"]; [fDefaults removeObjectForKey: @"WarningRemoveCompleted"]; [fDefaults removeObjectForKey: @"WarningDonate"]; //[fDefaults removeObjectForKey: @"WarningLegal"]; } - (void) setDefaultForMagnets: (id) sender { NSString * bundleID = [[NSBundle mainBundle] bundleIdentifier]; const OSStatus result = LSSetDefaultHandlerForURLScheme((CFStringRef)@"magnet", (CFStringRef)bundleID); if (result != noErr) NSLog(@"Failed setting default magnet link handler"); } - (void) setQueue: (id) sender { //let's just do both - easier that way tr_sessionSetQueueEnabled(fHandle, TR_DOWN, [fDefaults boolForKey: @"Queue"]); tr_sessionSetQueueEnabled(fHandle, TR_UP, [fDefaults boolForKey: @"QueueSeed"]); //handle if any transfers switch from queued to paused [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateQueue" object: self]; } - (void) setQueueNumber: (id) sender { const NSInteger number = [sender intValue]; const BOOL seed = sender == fQueueSeedField; [fDefaults setInteger: number forKey: seed ? @"QueueSeedNumber" : @"QueueDownloadNumber"]; tr_sessionSetQueueSize(fHandle, seed ? TR_UP : TR_DOWN, number); } - (void) setStalled: (id) sender { tr_sessionSetQueueStalledEnabled(fHandle, [fDefaults boolForKey: @"CheckStalled"]); //reload main table for stalled status [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil]; } - (void) setStalledMinutes: (id) sender { const NSInteger min = [sender intValue]; [fDefaults setInteger: min forKey: @"StalledMinutes"]; tr_sessionSetQueueStalledMinutes(fHandle, min); //reload main table for stalled status [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: self]; } - (void) setDownloadLocation: (id) sender { [fDefaults setBool: [fFolderPopUp indexOfSelectedItem] == DOWNLOAD_FOLDER forKey: @"DownloadLocationConstant"]; [self updateShowAddMagnetWindowField]; } - (void) folderSheetShow: (id) sender { NSOpenPanel * panel = [NSOpenPanel openPanel]; [panel setPrompt: NSLocalizedString(@"Select", "Preferences -> Open panel prompt")]; [panel setAllowsMultipleSelection: NO]; [panel setCanChooseFiles: NO]; [panel setCanChooseDirectories: YES]; [panel setCanCreateDirectories: YES]; [panel beginSheetModalForWindow: [self window] completionHandler: ^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { [fFolderPopUp selectItemAtIndex: DOWNLOAD_FOLDER]; NSString * folder = [[[panel URLs] objectAtIndex: 0] path]; [fDefaults setObject: folder forKey: @"DownloadFolder"]; [fDefaults setBool: YES forKey: @"DownloadLocationConstant"]; [self updateShowAddMagnetWindowField]; tr_sessionSetDownloadDir(fHandle, [folder UTF8String]); } else { //reset if cancelled [fFolderPopUp selectItemAtIndex: [fDefaults boolForKey: @"DownloadLocationConstant"] ? DOWNLOAD_FOLDER : DOWNLOAD_TORRENT]; } }]; } - (void) incompleteFolderSheetShow: (id) sender { NSOpenPanel * panel = [NSOpenPanel openPanel]; [panel setPrompt: NSLocalizedString(@"Select", "Preferences -> Open panel prompt")]; [panel setAllowsMultipleSelection: NO]; [panel setCanChooseFiles: NO]; [panel setCanChooseDirectories: YES]; [panel setCanCreateDirectories: YES]; [panel beginSheetModalForWindow: [self window] completionHandler: ^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { NSString * folder = [[[panel URLs] objectAtIndex: 0] path]; [fDefaults setObject: folder forKey: @"IncompleteDownloadFolder"]; tr_sessionSetIncompleteDir(fHandle, [folder UTF8String]); } [fIncompleteFolderPopUp selectItemAtIndex: 0]; }]; } - (void) doneScriptSheetShow:(id)sender { NSOpenPanel * panel = [NSOpenPanel openPanel]; [panel setPrompt: NSLocalizedString(@"Select", "Preferences -> Open panel prompt")]; [panel setAllowsMultipleSelection: NO]; [panel setCanChooseFiles: YES]; [panel setCanChooseDirectories: NO]; [panel setCanCreateDirectories: NO]; [panel beginSheetModalForWindow: [self window] completionHandler: ^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { NSString * filePath = [[[panel URLs] objectAtIndex: 0] path]; [fDefaults setObject: filePath forKey: @"DoneScriptPath"]; tr_sessionSetTorrentDoneScript(fHandle, [filePath UTF8String]); [fDefaults setBool: YES forKey: @"DoneScriptEnabled"]; tr_sessionSetTorrentDoneScriptEnabled(fHandle, YES); } [fDoneScriptPopUp selectItemAtIndex: 0]; }]; } - (void) setUseIncompleteFolder: (id) sender { tr_sessionSetIncompleteDirEnabled(fHandle, [fDefaults boolForKey: @"UseIncompleteDownloadFolder"]); } - (void) setRenamePartialFiles: (id) sender { tr_sessionSetIncompleteFileNamingEnabled(fHandle, [fDefaults boolForKey: @"RenamePartialFiles"]); } - (void) setShowAddMagnetWindow: (id) sender { [fDefaults setBool: ([fShowMagnetAddWindowCheck state] == NSOnState) forKey: @"MagnetOpenAsk"]; } - (void) updateShowAddMagnetWindowField { if (![fDefaults boolForKey: @"DownloadLocationConstant"]) { //always show the add window for magnet links when the download location is the same as the torrent file [fShowMagnetAddWindowCheck setState: NSOnState]; [fShowMagnetAddWindowCheck setEnabled: NO]; } else { [fShowMagnetAddWindowCheck setState: [fDefaults boolForKey: @"MagnetOpenAsk"]]; [fShowMagnetAddWindowCheck setEnabled: YES]; } } - (void) setDoneScriptEnabled: (id) sender { if ([fDefaults boolForKey: @"DoneScriptEnabled"] && ![[NSFileManager defaultManager] fileExistsAtPath: [fDefaults stringForKey:@"DoneScriptPath"]]) { // enabled is set but script file doesn't exist, so prompt for one and disable until they pick one [fDefaults setBool: NO forKey: @"DoneScriptEnabled"]; [self doneScriptSheetShow: sender]; } tr_sessionSetTorrentDoneScriptEnabled(fHandle, [fDefaults boolForKey: @"DoneScriptEnabled"]); } - (void) setAutoImport: (id) sender { NSString * path; if ((path = [fDefaults stringForKey: @"AutoImportDirectory"])) { VDKQueue * watcherQueue = [(Controller *)[NSApp delegate] fileWatcherQueue]; if ([fDefaults boolForKey: @"AutoImport"]) { path = [path stringByExpandingTildeInPath]; [watcherQueue addPath: path notifyingAbout: VDKQueueNotifyAboutWrite]; } else [watcherQueue removeAllPaths]; [[NSNotificationCenter defaultCenter] postNotificationName: @"AutoImportSettingChange" object: self]; } else [self importFolderSheetShow: nil]; } - (void) importFolderSheetShow: (id) sender { NSOpenPanel * panel = [NSOpenPanel openPanel]; [panel setPrompt: NSLocalizedString(@"Select", "Preferences -> Open panel prompt")]; [panel setAllowsMultipleSelection: NO]; [panel setCanChooseFiles: NO]; [panel setCanChooseDirectories: YES]; [panel setCanCreateDirectories: YES]; [panel beginSheetModalForWindow: [self window] completionHandler: ^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { VDKQueue * watcherQueue = [(Controller *)[NSApp delegate] fileWatcherQueue]; [watcherQueue removeAllPaths]; NSString * path = [[[panel URLs] objectAtIndex: 0] path]; [fDefaults setObject: path forKey: @"AutoImportDirectory"]; [watcherQueue addPath: [path stringByExpandingTildeInPath] notifyingAbout: VDKQueueNotifyAboutWrite]; [[NSNotificationCenter defaultCenter] postNotificationName: @"AutoImportSettingChange" object: self]; } else { NSString * path = [fDefaults stringForKey: @"AutoImportDirectory"]; if (!path) [fDefaults setBool: NO forKey: @"AutoImport"]; } [fImportFolderPopUp selectItemAtIndex: 0]; }]; } - (void) setAutoSize: (id) sender { [[NSNotificationCenter defaultCenter] postNotificationName: @"AutoSizeSettingChange" object: self]; } - (void) setRPCEnabled: (id) sender { BOOL enable = [fDefaults boolForKey: @"RPC"]; tr_sessionSetRPCEnabled(fHandle, enable); [self setRPCWebUIDiscovery: nil]; } - (void) linkWebUI: (id) sender { NSString * urlString = [NSString stringWithFormat: WEBUI_URL, [fDefaults integerForKey: @"RPCPort"]]; [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: urlString]]; } - (void) setRPCAuthorize: (id) sender { tr_sessionSetRPCPasswordEnabled(fHandle, [fDefaults boolForKey: @"RPCAuthorize"]); } - (void) setRPCUsername: (id) sender { tr_sessionSetRPCUsername(fHandle, [[fDefaults stringForKey: @"RPCUsername"] UTF8String]); } - (void) setRPCPassword: (id) sender { [fRPCPassword release]; fRPCPassword = [[sender stringValue] copy]; const char * password = [[sender stringValue] UTF8String]; [self setKeychainPassword: password forService: RPC_KEYCHAIN_SERVICE username: RPC_KEYCHAIN_NAME]; tr_sessionSetRPCPassword(fHandle, password); } - (void) updateRPCPassword { UInt32 passwordLength; const char * password = nil; SecKeychainFindGenericPassword(NULL, strlen(RPC_KEYCHAIN_SERVICE), RPC_KEYCHAIN_SERVICE, strlen(RPC_KEYCHAIN_NAME), RPC_KEYCHAIN_NAME, &passwordLength, (void **)&password, NULL); [fRPCPassword release]; if (password != NULL) { char fullPassword[passwordLength+1]; strncpy(fullPassword, password, passwordLength); fullPassword[passwordLength] = '\0'; SecKeychainItemFreeContent(NULL, (void *)password); tr_sessionSetRPCPassword(fHandle, fullPassword); fRPCPassword = [[NSString alloc] initWithUTF8String: fullPassword]; [fRPCPasswordField setStringValue: fRPCPassword]; } else fRPCPassword = nil; } - (void) setRPCPort: (id) sender { int port = [sender intValue]; [fDefaults setInteger: port forKey: @"RPCPort"]; tr_sessionSetRPCPort(fHandle, port); [self setRPCWebUIDiscovery: nil]; } - (void) setRPCUseWhitelist: (id) sender { tr_sessionSetRPCWhitelistEnabled(fHandle, [fDefaults boolForKey: @"RPCUseWhitelist"]); } - (void) setRPCWebUIDiscovery: (id) sender { if ([fDefaults boolForKey:@"RPC"] && [fDefaults boolForKey: @"RPCWebDiscovery"]) [[BonjourController defaultController] startWithPort: [fDefaults integerForKey: @"RPCPort"]]; else { if ([BonjourController defaultControllerExists]) [[BonjourController defaultController] stop]; } } - (void) updateRPCWhitelist { NSString * string = [fRPCWhitelistArray componentsJoinedByString: @","]; tr_sessionSetRPCWhitelist(fHandle, [string UTF8String]); } - (void) addRemoveRPCIP: (id) sender { //don't allow add/remove when currently adding - it leads to weird results if ([fRPCWhitelistTable editedRow] != -1) return; if ([[sender cell] tagForSegment: [sender selectedSegment]] == RPC_IP_REMOVE_TAG) { [fRPCWhitelistArray removeObjectsAtIndexes: [fRPCWhitelistTable selectedRowIndexes]]; [fRPCWhitelistTable deselectAll: self]; [fRPCWhitelistTable reloadData]; [fDefaults setObject: fRPCWhitelistArray forKey: @"RPCWhitelist"]; [self updateRPCWhitelist]; } else { [fRPCWhitelistArray addObject: @""]; [fRPCWhitelistTable reloadData]; const int row = [fRPCWhitelistArray count] - 1; [fRPCWhitelistTable selectRowIndexes: [NSIndexSet indexSetWithIndex: row] byExtendingSelection: NO]; [fRPCWhitelistTable editColumn: 0 row: row withEvent: nil select: YES]; } } - (NSInteger) numberOfRowsInTableView: (NSTableView *) tableView { return [fRPCWhitelistArray count]; } - (id) tableView: (NSTableView *) tableView objectValueForTableColumn: (NSTableColumn *) tableColumn row: (NSInteger) row { return [fRPCWhitelistArray objectAtIndex: row]; } - (void) tableView: (NSTableView *) tableView setObjectValue: (id) object forTableColumn: (NSTableColumn *) tableColumn row: (NSInteger) row { NSArray * components = [object componentsSeparatedByString: @"."]; NSMutableArray * newComponents = [NSMutableArray arrayWithCapacity: 4]; //create better-formatted ip string BOOL valid = false; if ([components count] == 4) { valid = true; for (NSString * component in components) { if ([component isEqualToString: @"*"]) [newComponents addObject: component]; else { int num = [component intValue]; if (num >= 0 && num < 256) [newComponents addObject: [[NSNumber numberWithInt: num] stringValue]]; else { valid = false; break; } } } } NSString * newIP; if (valid) { newIP = [newComponents componentsJoinedByString: @"."]; //don't allow the same ip address if ([fRPCWhitelistArray containsObject: newIP] && ![[fRPCWhitelistArray objectAtIndex: row] isEqualToString: newIP]) valid = false; } if (valid) { [fRPCWhitelistArray replaceObjectAtIndex: row withObject: newIP]; [fRPCWhitelistArray sortUsingSelector: @selector(compareNumeric:)]; } else { NSBeep(); if ([[fRPCWhitelistArray objectAtIndex: row] isEqualToString: @""]) [fRPCWhitelistArray removeObjectAtIndex: row]; } [fRPCWhitelistTable deselectAll: self]; [fRPCWhitelistTable reloadData]; [fDefaults setObject: fRPCWhitelistArray forKey: @"RPCWhitelist"]; [self updateRPCWhitelist]; } - (void) tableViewSelectionDidChange: (NSNotification *) notification { [fRPCAddRemoveControl setEnabled: [fRPCWhitelistTable numberOfSelectedRows] > 0 forSegment: RPC_IP_REMOVE_TAG]; } - (void) helpForScript: (id) sender { [[NSHelpManager sharedHelpManager] openHelpAnchor: @"script" inBook: [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleHelpBookName"]]; } - (void) helpForPeers: (id) sender { [[NSHelpManager sharedHelpManager] openHelpAnchor: @"peers" inBook: [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleHelpBookName"]]; } - (void) helpForNetwork: (id) sender { [[NSHelpManager sharedHelpManager] openHelpAnchor: @"network" inBook: [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleHelpBookName"]]; } - (void) helpForRemote: (id) sender { [[NSHelpManager sharedHelpManager] openHelpAnchor: @"remote" inBook: [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleHelpBookName"]]; } - (void) rpcUpdatePrefs { //encryption const tr_encryption_mode encryptionMode = tr_sessionGetEncryption(fHandle); [fDefaults setBool: encryptionMode != TR_CLEAR_PREFERRED forKey: @"EncryptionPrefer"]; [fDefaults setBool: encryptionMode == TR_ENCRYPTION_REQUIRED forKey: @"EncryptionRequire"]; //download directory NSString * downloadLocation = [[NSString stringWithUTF8String: tr_sessionGetDownloadDir(fHandle)] stringByStandardizingPath]; [fDefaults setObject: downloadLocation forKey: @"DownloadFolder"]; NSString * incompleteLocation = [[NSString stringWithUTF8String: tr_sessionGetIncompleteDir(fHandle)] stringByStandardizingPath]; [fDefaults setObject: incompleteLocation forKey: @"IncompleteDownloadFolder"]; const BOOL useIncomplete = tr_sessionIsIncompleteDirEnabled(fHandle); [fDefaults setBool: useIncomplete forKey: @"UseIncompleteDownloadFolder"]; const BOOL usePartialFileRanaming = tr_sessionIsIncompleteFileNamingEnabled(fHandle); [fDefaults setBool: usePartialFileRanaming forKey: @"RenamePartialFiles"]; //utp const BOOL utp = tr_sessionIsUTPEnabled(fHandle); [fDefaults setBool: utp forKey: @"UTPGlobal"]; //peers const uint16_t peersTotal = tr_sessionGetPeerLimit(fHandle); [fDefaults setInteger: peersTotal forKey: @"PeersTotal"]; const uint16_t peersTorrent = tr_sessionGetPeerLimitPerTorrent(fHandle); [fDefaults setInteger: peersTorrent forKey: @"PeersTorrent"]; //pex const BOOL pex = tr_sessionIsPexEnabled(fHandle); [fDefaults setBool: pex forKey: @"PEXGlobal"]; //dht const BOOL dht = tr_sessionIsDHTEnabled(fHandle); [fDefaults setBool: dht forKey: @"DHTGlobal"]; //lpd const BOOL lpd = tr_sessionIsLPDEnabled(fHandle); [fDefaults setBool: lpd forKey: @"LocalPeerDiscoveryGlobal"]; //auto start const BOOL autoStart = !tr_sessionGetPaused(fHandle); [fDefaults setBool: autoStart forKey: @"AutoStartDownload"]; //port const tr_port port = tr_sessionGetPeerPort(fHandle); [fDefaults setInteger: port forKey: @"BindPort"]; const BOOL nat = tr_sessionIsPortForwardingEnabled(fHandle); [fDefaults setBool: nat forKey: @"NatTraversal"]; fPeerPort = -1; fNatStatus = -1; [self updatePortStatus]; const BOOL randomPort = tr_sessionGetPeerPortRandomOnStart(fHandle); [fDefaults setBool: randomPort forKey: @"RandomPort"]; //speed limit - down const BOOL downLimitEnabled = tr_sessionIsSpeedLimited(fHandle, TR_DOWN); [fDefaults setBool: downLimitEnabled forKey: @"CheckDownload"]; const int downLimit = tr_sessionGetSpeedLimit_KBps(fHandle, TR_DOWN); [fDefaults setInteger: downLimit forKey: @"DownloadLimit"]; //speed limit - up const BOOL upLimitEnabled = tr_sessionIsSpeedLimited(fHandle, TR_UP); [fDefaults setBool: upLimitEnabled forKey: @"CheckUpload"]; const int upLimit = tr_sessionGetSpeedLimit_KBps(fHandle, TR_UP); [fDefaults setInteger: upLimit forKey: @"UploadLimit"]; //alt speed limit enabled const BOOL useAltSpeed = tr_sessionUsesAltSpeed(fHandle); [fDefaults setBool: useAltSpeed forKey: @"SpeedLimit"]; //alt speed limit - down const int downLimitAlt = tr_sessionGetAltSpeed_KBps(fHandle, TR_DOWN); [fDefaults setInteger: downLimitAlt forKey: @"SpeedLimitDownloadLimit"]; //alt speed limit - up const int upLimitAlt = tr_sessionGetAltSpeed_KBps(fHandle, TR_UP); [fDefaults setInteger: upLimitAlt forKey: @"SpeedLimitUploadLimit"]; //alt speed limit schedule const BOOL useAltSpeedSched = tr_sessionUsesAltSpeedTime(fHandle); [fDefaults setBool: useAltSpeedSched forKey: @"SpeedLimitAuto"]; NSDate * limitStartDate = [PrefsController timeSumToDate: tr_sessionGetAltSpeedBegin(fHandle)]; [fDefaults setObject: limitStartDate forKey: @"SpeedLimitAutoOnDate"]; NSDate * limitEndDate = [PrefsController timeSumToDate: tr_sessionGetAltSpeedEnd(fHandle)]; [fDefaults setObject: limitEndDate forKey: @"SpeedLimitAutoOffDate"]; const int limitDay = tr_sessionGetAltSpeedDay(fHandle); [fDefaults setInteger: limitDay forKey: @"SpeedLimitAutoDay"]; //blocklist const BOOL blocklist = tr_blocklistIsEnabled(fHandle); [fDefaults setBool: blocklist forKey: @"BlocklistNew"]; NSString * blocklistURL = [NSString stringWithUTF8String: tr_blocklistGetURL(fHandle)]; [fDefaults setObject: blocklistURL forKey: @"BlocklistURL"]; //seed ratio const BOOL ratioLimited = tr_sessionIsRatioLimited(fHandle); [fDefaults setBool: ratioLimited forKey: @"RatioCheck"]; const float ratioLimit = tr_sessionGetRatioLimit(fHandle); [fDefaults setFloat: ratioLimit forKey: @"RatioLimit"]; //idle seed limit const BOOL idleLimited = tr_sessionIsIdleLimited(fHandle); [fDefaults setBool: idleLimited forKey: @"IdleLimitCheck"]; const NSUInteger idleLimitMin = tr_sessionGetIdleLimit(fHandle); [fDefaults setInteger: idleLimitMin forKey: @"IdleLimitMinutes"]; //queue const BOOL downloadQueue = tr_sessionGetQueueEnabled(fHandle, TR_DOWN); [fDefaults setBool: downloadQueue forKey: @"Queue"]; const int downloadQueueNum = tr_sessionGetQueueSize(fHandle, TR_DOWN); [fDefaults setInteger: downloadQueueNum forKey: @"QueueDownloadNumber"]; const BOOL seedQueue = tr_sessionGetQueueEnabled(fHandle, TR_UP); [fDefaults setBool: seedQueue forKey: @"QueueSeed"]; const int seedQueueNum = tr_sessionGetQueueSize(fHandle, TR_UP); [fDefaults setInteger: seedQueueNum forKey: @"QueueSeedNumber"]; const BOOL checkStalled = tr_sessionGetQueueStalledEnabled(fHandle); [fDefaults setBool: checkStalled forKey: @"CheckStalled"]; const int stalledMinutes = tr_sessionGetQueueStalledMinutes(fHandle); [fDefaults setInteger: stalledMinutes forKey: @"StalledMinutes"]; //done script const BOOL doneScriptEnabled = tr_sessionIsTorrentDoneScriptEnabled(fHandle); [fDefaults setBool: doneScriptEnabled forKey: @"DoneScriptEnabled"]; NSString * doneScriptPath = [NSString stringWithUTF8String: tr_sessionGetTorrentDoneScript(fHandle)]; [fDefaults setObject: doneScriptPath forKey: @"DoneScriptPath"]; //update gui if loaded if (fHasLoaded) { //encryption handled by bindings //download directory handled by bindings //utp handled by bindings [fPeersGlobalField setIntValue: peersTotal]; [fPeersTorrentField setIntValue: peersTorrent]; //pex handled by bindings //dht handled by bindings //lpd handled by bindings [fPortField setIntValue: port]; //port forwarding (nat) handled by bindings //random port handled by bindings //limit check handled by bindings [fDownloadField setIntValue: downLimit]; //limit check handled by bindings [fUploadField setIntValue: upLimit]; [fSpeedLimitDownloadField setIntValue: downLimitAlt]; [fSpeedLimitUploadField setIntValue: upLimitAlt]; //speed limit schedule handled by bindings //speed limit schedule times and day handled by bindings [fBlocklistURLField setStringValue: blocklistURL]; [self updateBlocklistButton]; [self updateBlocklistFields]; //ratio limit enabled handled by bindings [fRatioStopField setFloatValue: ratioLimit]; //idle limit enabled handled by bindings [fIdleStopField setIntegerValue: idleLimitMin]; //queues enabled handled by bindings [fQueueDownloadField setIntValue: downloadQueueNum]; [fQueueSeedField setIntValue: seedQueueNum]; //check stalled handled by bindings [fStalledField setIntValue: stalledMinutes]; } [[NSNotificationCenter defaultCenter] postNotificationName: @"SpeedLimitUpdate" object: nil]; //reload global settings in inspector [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateGlobalOptions" object: nil]; } @end @implementation PrefsController (Private) - (void) setPrefView: (id) sender { NSString * identifier; if (sender) { identifier = [sender itemIdentifier]; [[NSUserDefaults standardUserDefaults] setObject: identifier forKey: @"SelectedPrefView"]; } else identifier = [[NSUserDefaults standardUserDefaults] stringForKey: @"SelectedPrefView"]; NSView * view; if ([identifier isEqualToString: TOOLBAR_TRANSFERS]) view = fTransfersView; else if ([identifier isEqualToString: TOOLBAR_GROUPS]) view = fGroupsView; else if ([identifier isEqualToString: TOOLBAR_BANDWIDTH]) view = fBandwidthView; else if ([identifier isEqualToString: TOOLBAR_PEERS]) view = fPeersView; else if ([identifier isEqualToString: TOOLBAR_NETWORK]) view = fNetworkView; else if ([identifier isEqualToString: TOOLBAR_REMOTE]) view = fRemoteView; else { identifier = TOOLBAR_GENERAL; //general view is the default selected view = fGeneralView; } [[[self window] toolbar] setSelectedItemIdentifier: identifier]; NSWindow * window = [self window]; if ([window contentView] == view) return; NSRect windowRect = [window frame]; const CGFloat difference = NSHeight([view frame]) - NSHeight([[window contentView] frame]); windowRect.origin.y -= difference; windowRect.size.height += difference; [view setHidden: YES]; [window setContentView: view]; [window setFrame: windowRect display: YES animate: YES]; [view setHidden: NO]; //set title label if (sender) [window setTitle: [sender label]]; else { NSToolbar * toolbar = [window toolbar]; NSString * itemIdentifier = [toolbar selectedItemIdentifier]; for (NSToolbarItem * item in [toolbar items]) if ([[item itemIdentifier] isEqualToString: itemIdentifier]) { [window setTitle: [item label]]; break; } } } - (void) updateGrowlButton { if ([GrowlApplicationBridge isGrowlRunning]) { [fBuiltInGrowlButton setHidden: YES]; [fGrowlAppButton setHidden: NO]; #warning remove NO [fGrowlAppButton setEnabled: NO && [GrowlApplicationBridge isGrowlURLSchemeAvailable]]; [fGrowlAppButton setTitle: NSLocalizedString(@"Configure In Growl", "Prefs -> Notifications")]; [fGrowlAppButton sizeToFit]; [fGrowlAppButton setTarget: self]; [fGrowlAppButton setAction: @selector(openGrowlApp:)]; } else if ([NSApp isOnMountainLionOrBetter]) { [fBuiltInGrowlButton setHidden: YES]; [fGrowlAppButton setHidden: NO]; [fGrowlAppButton setEnabled: YES]; [fGrowlAppButton setTitle: NSLocalizedString(@"Configure In System Preferences", "Prefs -> Notifications")]; [fGrowlAppButton sizeToFit]; [fGrowlAppButton setTarget: self]; [fGrowlAppButton setAction: @selector(openNotificationSystemPrefs:)]; } else { [fBuiltInGrowlButton setHidden: NO]; [fGrowlAppButton setHidden: YES]; [fBuiltInGrowlButton setState: [fDefaults boolForKey: @"DisplayNotifications"]]; } } - (void) setKeychainPassword: (const char *) password forService: (const char *) service username: (const char *) username { SecKeychainItemRef item = NULL; NSUInteger passwordLength = strlen(password); OSStatus result = SecKeychainFindGenericPassword(NULL, strlen(service), service, strlen(username), username, NULL, NULL, &item); if (result == noErr && item) { if (passwordLength > 0) //found, so update { result = SecKeychainItemModifyAttributesAndData(item, NULL, passwordLength, (const void *)password); if (result != noErr) NSLog(@"Problem updating Keychain item: %s", GetMacOSStatusErrorString(result)); } else //remove the item { result = SecKeychainItemDelete(item); if (result != noErr) NSLog(@"Problem removing Keychain item: %s", GetMacOSStatusErrorString(result)); } } else if (result == errSecItemNotFound) //not found, so add { if (passwordLength > 0) { result = SecKeychainAddGenericPassword(NULL, strlen(service), service, strlen(username), username, passwordLength, (const void *)password, NULL); if (result != noErr) NSLog(@"Problem adding Keychain item: %s", GetMacOSStatusErrorString(result)); } } else NSLog(@"Problem accessing Keychain: %s", GetMacOSStatusErrorString(result)); } @end transmission-2.92/macosx/PaxHeaders.4960/URLSheetWindowController.h0000644000000000000000000000013212442116621022207 xustar0030 mtime=1418239377.041464392 30 atime=1418239377.041464392 30 ctime=1457295923.638869783 transmission-2.92/macosx/URLSheetWindowController.h0000644000175000017500000000343712442116621023643 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: URLSheetWindowController.h 13254 2012-03-13 03:39:56Z livings124 $ * * Copyright (c) 2011-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @class Controller; @interface URLSheetWindowController : NSWindowController { IBOutlet NSTextField * fLabelField; IBOutlet NSTextField * fTextField; IBOutlet NSButton * fOpenButton, * fCancelButton; Controller * fController; } - (id) initWithController: (Controller *) controller; - (void) openURLEndSheet: (id) sender; - (void) openURLCancelEndSheet: (id) sender; - (NSString *) urlString; @end transmission-2.92/macosx/PaxHeaders.4960/FilterBarController.m0000644000000000000000000000013212442116641021245 xustar0030 mtime=1418239393.769751066 30 atime=1418239393.768751049 30 ctime=1457295923.143861365 transmission-2.92/macosx/FilterBarController.m0000644000175000017500000003644112442116641022702 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: FilterBarController.m 13414 2012-07-25 12:49:11Z livings124 $ * * Copyright (c) 2011-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "FilterBarController.h" #import "FilterButton.h" #import "GroupsController.h" #import "NSStringAdditions.h" #define FILTER_TYPE_TAG_NAME 401 #define FILTER_TYPE_TAG_TRACKER 402 #define SEARCH_MIN_WIDTH 48.0 #define SEARCH_MAX_WIDTH 95.0 @interface FilterBarController (Private) - (void) resizeBar; - (void) updateGroupsButton; - (void) updateGroups: (NSNotification *) notification; @end @implementation FilterBarController - (id) init { return (self = [super initWithNibName: @"FilterBar" bundle: nil]); } - (void) awakeFromNib { //localizations [fNoFilterButton setTitle: NSLocalizedString(@"All", "Filter Bar -> filter button")]; [fActiveFilterButton setTitle: NSLocalizedString(@"Active", "Filter Bar -> filter button")]; [fDownloadFilterButton setTitle: NSLocalizedString(@"Downloading", "Filter Bar -> filter button")]; [fSeedFilterButton setTitle: NSLocalizedString(@"Seeding", "Filter Bar -> filter button")]; [fPauseFilterButton setTitle: NSLocalizedString(@"Paused", "Filter Bar -> filter button")]; [[fNoFilterButton cell] setBackgroundStyle: NSBackgroundStyleRaised]; [[fActiveFilterButton cell] setBackgroundStyle: NSBackgroundStyleRaised]; [[fDownloadFilterButton cell] setBackgroundStyle: NSBackgroundStyleRaised]; [[fSeedFilterButton cell] setBackgroundStyle: NSBackgroundStyleRaised]; [[fPauseFilterButton cell] setBackgroundStyle: NSBackgroundStyleRaised]; [[[[fSearchField cell] searchMenuTemplate] itemWithTag: FILTER_TYPE_TAG_NAME] setTitle: NSLocalizedString(@"Name", "Filter Bar -> filter menu")]; [[[[fSearchField cell] searchMenuTemplate] itemWithTag: FILTER_TYPE_TAG_TRACKER] setTitle: NSLocalizedString(@"Tracker", "Filter Bar -> filter menu")]; [[[fGroupsButton menu] itemWithTag: GROUP_FILTER_ALL_TAG] setTitle: NSLocalizedString(@"All Groups", "Filter Bar -> group filter menu")]; [self resizeBar]; //set current filter NSString * filterType = [[NSUserDefaults standardUserDefaults] stringForKey: @"Filter"]; NSButton * currentFilterButton; if ([filterType isEqualToString: FILTER_ACTIVE]) currentFilterButton = fActiveFilterButton; else if ([filterType isEqualToString: FILTER_PAUSE]) currentFilterButton = fPauseFilterButton; else if ([filterType isEqualToString: FILTER_SEED]) currentFilterButton = fSeedFilterButton; else if ([filterType isEqualToString: FILTER_DOWNLOAD]) currentFilterButton = fDownloadFilterButton; else { //safety if (![filterType isEqualToString: FILTER_NONE]) [[NSUserDefaults standardUserDefaults] setObject: FILTER_NONE forKey: @"Filter"]; currentFilterButton = fNoFilterButton; } [currentFilterButton setState: NSOnState]; //set filter search type NSString * filterSearchType = [[NSUserDefaults standardUserDefaults] stringForKey: @"FilterSearchType"]; NSMenu * filterSearchMenu = [[fSearchField cell] searchMenuTemplate]; NSString * filterSearchTypeTitle; if ([filterSearchType isEqualToString: FILTER_TYPE_TRACKER]) filterSearchTypeTitle = [[filterSearchMenu itemWithTag: FILTER_TYPE_TAG_TRACKER] title]; else { //safety if (![filterType isEqualToString: FILTER_TYPE_NAME]) [[NSUserDefaults standardUserDefaults] setObject: FILTER_TYPE_NAME forKey: @"FilterSearchType"]; filterSearchTypeTitle = [[filterSearchMenu itemWithTag: FILTER_TYPE_TAG_NAME] title]; } [[fSearchField cell] setPlaceholderString: filterSearchTypeTitle]; NSString * searchString; if ((searchString = [[NSUserDefaults standardUserDefaults] stringForKey: @"FilterSearchString"])) [fSearchField setStringValue: searchString]; [self updateGroupsButton]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(resizeBar) name: NSWindowDidResizeNotification object: [[self view] window]]; //update when groups change [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateGroups:) name: @"UpdateGroups" object: nil]; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; [super dealloc]; } - (void) setFilter: (id) sender { NSString * oldFilterType = [[NSUserDefaults standardUserDefaults] stringForKey: @"Filter"]; NSButton * prevFilterButton; if ([oldFilterType isEqualToString: FILTER_PAUSE]) prevFilterButton = fPauseFilterButton; else if ([oldFilterType isEqualToString: FILTER_ACTIVE]) prevFilterButton = fActiveFilterButton; else if ([oldFilterType isEqualToString: FILTER_SEED]) prevFilterButton = fSeedFilterButton; else if ([oldFilterType isEqualToString: FILTER_DOWNLOAD]) prevFilterButton = fDownloadFilterButton; else prevFilterButton = fNoFilterButton; if (sender != prevFilterButton) { [prevFilterButton setState: NSOffState]; [sender setState: NSOnState]; NSString * filterType; if (sender == fActiveFilterButton) filterType = FILTER_ACTIVE; else if (sender == fDownloadFilterButton) filterType = FILTER_DOWNLOAD; else if (sender == fPauseFilterButton) filterType = FILTER_PAUSE; else if (sender == fSeedFilterButton) filterType = FILTER_SEED; else filterType = FILTER_NONE; [[NSUserDefaults standardUserDefaults] setObject: filterType forKey: @"Filter"]; } else [sender setState: NSOnState]; [[NSNotificationCenter defaultCenter] postNotificationName: @"ApplyFilter" object: nil]; } - (void) switchFilter: (BOOL) right { NSString * filterType = [[NSUserDefaults standardUserDefaults] stringForKey: @"Filter"]; NSButton * button; if ([filterType isEqualToString: FILTER_NONE]) button = right ? fActiveFilterButton : fPauseFilterButton; else if ([filterType isEqualToString: FILTER_ACTIVE]) button = right ? fDownloadFilterButton : fNoFilterButton; else if ([filterType isEqualToString: FILTER_DOWNLOAD]) button = right ? fSeedFilterButton : fActiveFilterButton; else if ([filterType isEqualToString: FILTER_SEED]) button = right ? fPauseFilterButton : fDownloadFilterButton; else if ([filterType isEqualToString: FILTER_PAUSE]) button = right ? fNoFilterButton : fSeedFilterButton; else button = fNoFilterButton; [self setFilter: button]; } - (void) setSearchText: (id) sender { [[NSUserDefaults standardUserDefaults] setObject: [fSearchField stringValue] forKey: @"FilterSearchString"]; [[NSNotificationCenter defaultCenter] postNotificationName: @"ApplyFilter" object: nil]; } - (void) focusSearchField { [[[self view] window] makeFirstResponder: fSearchField]; } - (void) setSearchType: (id) sender { NSString * oldFilterType = [[NSUserDefaults standardUserDefaults] stringForKey: @"FilterSearchType"]; NSInteger prevTag, currentTag = [sender tag]; if ([oldFilterType isEqualToString: FILTER_TYPE_TRACKER]) prevTag = FILTER_TYPE_TAG_TRACKER; else prevTag = FILTER_TYPE_TAG_NAME; if (currentTag != prevTag) { NSString * filterType; if (currentTag == FILTER_TYPE_TAG_TRACKER) filterType = FILTER_TYPE_TRACKER; else filterType = FILTER_TYPE_NAME; [[NSUserDefaults standardUserDefaults] setObject: filterType forKey: @"FilterSearchType"]; [[fSearchField cell] setPlaceholderString: [sender title]]; } [[NSNotificationCenter defaultCenter] postNotificationName: @"ApplyFilter" object: nil]; } - (void) setGroupFilter: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [sender tag] forKey: @"FilterGroup"]; [self updateGroupsButton]; [[NSNotificationCenter defaultCenter] postNotificationName: @"ApplyFilter" object: nil]; } - (void) reset: (BOOL) updateUI { [[NSUserDefaults standardUserDefaults] setInteger: GROUP_FILTER_ALL_TAG forKey: @"FilterGroup"]; if (updateUI) { [self updateGroupsButton]; [self setFilter: fNoFilterButton]; [fSearchField setStringValue: @""]; [self setSearchText: fSearchField]; } else { [[NSUserDefaults standardUserDefaults] setObject: FILTER_NONE forKey: @"Filter"]; [[NSUserDefaults standardUserDefaults] removeObjectForKey: @"FilterSearchString"]; } } - (NSArray *) searchStrings { return [[fSearchField stringValue] betterComponentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; } - (void) setCountAll: (NSUInteger) all active: (NSUInteger) active downloading: (NSUInteger) downloading seeding: (NSUInteger) seeding paused: (NSUInteger) paused { [fNoFilterButton setCount: all]; [fActiveFilterButton setCount: active]; [fDownloadFilterButton setCount: downloading]; [fSeedFilterButton setCount: seeding]; [fPauseFilterButton setCount: paused]; } - (void) menuNeedsUpdate: (NSMenu *) menu { if (menu == [fGroupsButton menu]) { for (NSInteger i = [menu numberOfItems]-1; i >= 3; i--) [menu removeItemAtIndex: i]; NSMenu * groupMenu = [[GroupsController groups] groupMenuWithTarget: self action: @selector(setGroupFilter:) isSmall: YES]; const NSInteger groupMenuCount = [groupMenu numberOfItems]; for (NSInteger i = 0; i < groupMenuCount; i++) { NSMenuItem * item = [[groupMenu itemAtIndex: 0] retain]; [groupMenu removeItemAtIndex: 0]; [menu addItem: item]; [item release]; } } } - (BOOL) validateMenuItem: (NSMenuItem *) menuItem { const SEL action = [menuItem action]; //check proper filter search item if (action == @selector(setSearchType:)) { NSString * filterType = [[NSUserDefaults standardUserDefaults] stringForKey: @"FilterSearchType"]; BOOL state; if ([menuItem tag] == FILTER_TYPE_TAG_TRACKER) state = [filterType isEqualToString: FILTER_TYPE_TRACKER]; else state = [filterType isEqualToString: FILTER_TYPE_NAME]; [menuItem setState: state ? NSOnState : NSOffState]; return YES; } if (action == @selector(setGroupFilter:)) { [menuItem setState: [menuItem tag] == [[NSUserDefaults standardUserDefaults] integerForKey: @"FilterGroup"] ? NSOnState : NSOffState]; return YES; } return YES; } @end @implementation FilterBarController (Private) - (void) resizeBar { //replace all buttons [fNoFilterButton sizeToFit]; [fActiveFilterButton sizeToFit]; [fDownloadFilterButton sizeToFit]; [fSeedFilterButton sizeToFit]; [fPauseFilterButton sizeToFit]; NSRect allRect = [fNoFilterButton frame]; NSRect activeRect = [fActiveFilterButton frame]; NSRect downloadRect = [fDownloadFilterButton frame]; NSRect seedRect = [fSeedFilterButton frame]; NSRect pauseRect = [fPauseFilterButton frame]; //size search filter to not overlap buttons NSRect searchFrame = [fSearchField frame]; searchFrame.origin.x = NSMaxX(pauseRect) + 5.0; searchFrame.size.width = NSWidth([[self view] frame]) - searchFrame.origin.x - 5.0; //make sure it is not too long if (NSWidth(searchFrame) > SEARCH_MAX_WIDTH) { searchFrame.origin.x += NSWidth(searchFrame) - SEARCH_MAX_WIDTH; searchFrame.size.width = SEARCH_MAX_WIDTH; } else if (NSWidth(searchFrame) < SEARCH_MIN_WIDTH) { searchFrame.origin.x += NSWidth(searchFrame) - SEARCH_MIN_WIDTH; searchFrame.size.width = SEARCH_MIN_WIDTH; //calculate width the buttons can take up const CGFloat allowedWidth = (searchFrame.origin.x - 5.0) - allRect.origin.x; const CGFloat currentWidth = NSWidth(allRect) + NSWidth(activeRect) + NSWidth(downloadRect) + NSWidth(seedRect) + NSWidth(pauseRect) + 4.0; //add 4 for space between buttons const CGFloat ratio = allowedWidth / currentWidth; //decrease button widths proportionally allRect.size.width = NSWidth(allRect) * ratio; activeRect.size.width = NSWidth(activeRect) * ratio; downloadRect.size.width = NSWidth(downloadRect) * ratio; seedRect.size.width = NSWidth(seedRect) * ratio; pauseRect.size.width = NSWidth(pauseRect) * ratio; } else; activeRect.origin.x = NSMaxX(allRect) + 1.0; downloadRect.origin.x = NSMaxX(activeRect) + 1.0; seedRect.origin.x = NSMaxX(downloadRect) + 1.0; pauseRect.origin.x = NSMaxX(seedRect) + 1.0; [fNoFilterButton setFrame: allRect]; [fActiveFilterButton setFrame: activeRect]; [fDownloadFilterButton setFrame: downloadRect]; [fSeedFilterButton setFrame: seedRect]; [fPauseFilterButton setFrame: pauseRect]; [fSearchField setFrame: searchFrame]; } - (void) updateGroupsButton { const NSInteger groupIndex = [[NSUserDefaults standardUserDefaults] integerForKey: @"FilterGroup"]; NSImage * icon; NSString * toolTip; if (groupIndex == GROUP_FILTER_ALL_TAG) { icon = [NSImage imageNamed: @"PinTemplate"]; toolTip = NSLocalizedString(@"All Groups", "Groups -> Button"); } else { icon = [[GroupsController groups] imageForIndex: groupIndex]; NSString * groupName = groupIndex != -1 ? [[GroupsController groups] nameForIndex: groupIndex] : NSLocalizedString(@"None", "Groups -> Button"); toolTip = [NSLocalizedString(@"Group", "Groups -> Button") stringByAppendingFormat: @": %@", groupName]; } [[[fGroupsButton menu] itemAtIndex: 0] setImage: icon]; [fGroupsButton setToolTip: toolTip]; } - (void) updateGroups: (NSNotification *) notification { [self updateGroupsButton]; } @end transmission-2.92/macosx/PaxHeaders.4960/InfoFileViewController.h0000644000000000000000000000013212442116672021720 xustar0030 mtime=1418239418.290171266 30 atime=1418239418.290171266 30 ctime=1457295923.264863423 transmission-2.92/macosx/InfoFileViewController.h0000644000175000017500000000412712442116672023351 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoFileViewController.h 13296 2012-05-14 00:00:19Z livings124 $ * * Copyright (c) 2010-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import #import "InfoViewController.h" @class FileOutlineController; @interface InfoFileViewController : NSViewController { NSArray * fTorrents; BOOL fSet; IBOutlet FileOutlineController * fFileController; IBOutlet NSSearchField * fFileFilterField; IBOutlet NSButton * fCheckAllButton, *fUncheckAllButton; } - (void) setInfoForTorrents: (NSArray *) torrents; - (void) updateInfo; - (void) saveViewSize; - (IBAction) setFileFilterText: (id) sender; - (IBAction) checkAll: (id) sender; - (IBAction) uncheckAll: (id) sender; - (NSArray *) quickLookURLs; - (BOOL) canQuickLook; - (NSRect) quickLookSourceFrameForPreviewItem: (id ) item; @end transmission-2.92/macosx/PaxHeaders.4960/PrefsWindow.m0000644000000000000000000000013212442116666017605 xustar0030 mtime=1418239414.194101074 30 atime=1418239414.194101074 30 ctime=1457295923.476867028 transmission-2.92/macosx/PrefsWindow.m0000644000175000017500000000323612442116666021236 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: PrefsWindow.m 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "PrefsWindow.h" @implementation PrefsWindow - (void) keyDown: (NSEvent *) event { if ([event keyCode] == 53) //esc key [self close]; else [super keyDown: event]; } - (void) close { [self makeFirstResponder: nil]; //essentially saves pref changes on window close [super close]; } @end transmission-2.92/macosx/PaxHeaders.4960/Badger.m0000644000000000000000000000013212442116654016517 xustar0030 mtime=1418239404.001926414 30 atime=1418239404.001926414 30 ctime=1457295922.924857641 transmission-2.92/macosx/Badger.m0000644000175000017500000000646612442116654020160 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: Badger.m 13571 2012-10-15 02:12:44Z livings124 $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "Badger.h" #import "BadgeView.h" #import "NSStringAdditions.h" #import "Torrent.h" @implementation Badger - (id) initWithLib: (tr_session *) lib { if ((self = [super init])) { fLib = lib; BadgeView * view = [[BadgeView alloc] initWithLib: lib]; [[NSApp dockTile] setContentView: view]; [view release]; fHashes = [[NSMutableSet alloc] init]; } return self; } - (void) dealloc { [fHashes release]; [super dealloc]; } - (void) updateBadgeWithDownload: (CGFloat) downloadRate upload: (CGFloat) uploadRate { const CGFloat displayDlRate = [[NSUserDefaults standardUserDefaults] boolForKey: @"BadgeDownloadRate"] ? downloadRate : 0.0; const CGFloat displayUlRate = [[NSUserDefaults standardUserDefaults] boolForKey: @"BadgeUploadRate"] ? uploadRate : 0.0; //only update if the badged values change if ([(BadgeView *)[[NSApp dockTile] contentView] setRatesWithDownload: displayDlRate upload: displayUlRate]) [[NSApp dockTile] display]; } - (void) addCompletedTorrent: (Torrent *) torrent { NSParameterAssert(torrent != nil); [fHashes addObject: [torrent hashString]]; [[NSApp dockTile] setBadgeLabel: [NSString formattedUInteger: [fHashes count]]]; } - (void) removeTorrent: (Torrent *) torrent { if ([fHashes member: [torrent hashString]]) { [fHashes removeObject: [torrent hashString]]; if ([fHashes count] > 0) [[NSApp dockTile] setBadgeLabel: [NSString formattedUInteger: [fHashes count]]]; else [[NSApp dockTile] setBadgeLabel: @""]; } } - (void) clearCompleted { if ([fHashes count] > 0) { [fHashes removeAllObjects]; [[NSApp dockTile] setBadgeLabel: @""]; } } - (void) setQuitting { [self clearCompleted]; [(BadgeView *)[[NSApp dockTile] contentView] setQuitting]; [[NSApp dockTile] display]; } @end transmission-2.92/macosx/PaxHeaders.4960/FileRenameSheetController.h0000644000000000000000000000013212442116654022372 xustar0030 mtime=1418239404.005926482 30 atime=1418239404.005926482 30 ctime=1457295923.072860158 transmission-2.92/macosx/FileRenameSheetController.h0000644000175000017500000000225212442116654024020 0ustar00mikedldmikedld00000000000000// // FileRenameSheetController.h // Transmission // // Created by Mitchell Livingston on 1/20/13. // Copyright (c) 2013 The Transmission Project. All rights reserved. // #import @class FileListNode; @class Torrent; @interface FileRenameSheetController : NSWindowController { Torrent * _torrent; FileListNode * _node; void (^_completionHandler)(BOOL); NSString * _originalName; IBOutlet NSTextField * _labelField; IBOutlet NSTextField * _inputField; IBOutlet NSButton * _renameButton; IBOutlet NSButton * _cancelButton; } + (void) presentSheetForTorrent: (Torrent *) torrent modalForWindow: (NSWindow *) window completionHandler: (void (^)(BOOL didRename)) completionHandler; + (void) presentSheetForFileListNode: (FileListNode *) node modalForWindow: (NSWindow *) window completionHandler: (void (^)(BOOL didRename)) completionHandler; @property (assign) IBOutlet NSTextField * labelField; @property (assign) IBOutlet NSTextField * inputField; @property (assign) IBOutlet NSButton * renameButton; @property (assign) IBOutlet NSButton * cancelButton; - (IBAction) rename: (id) sender; - (IBAction) cancelRename: (id) sender; @end transmission-2.92/macosx/PaxHeaders.4960/PeerProgressIndicatorCell.h0000644000000000000000000000013212442116621022375 xustar0030 mtime=1418239377.038464341 30 atime=1418239377.038464341 30 ctime=1457295923.400865736 transmission-2.92/macosx/PeerProgressIndicatorCell.h0000644000175000017500000000302412442116621024021 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: PeerProgressIndicatorCell.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface PeerProgressIndicatorCell : NSLevelIndicatorCell { NSDictionary * fAttributes; BOOL fSeed; } - (void) setSeed: (BOOL) seed; @end transmission-2.92/macosx/PaxHeaders.4960/GroupToolbarItem.h0000644000000000000000000000013212442116654020564 xustar0030 mtime=1418239404.004926465 30 atime=1418239404.004926465 30 ctime=1457295923.206862437 transmission-2.92/macosx/GroupToolbarItem.h0000644000175000017500000000304412442116654022212 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: GroupToolbarItem.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface GroupToolbarItem : NSToolbarItem { NSArray * fIdentifiers; } - (void) setIdentifiers: (NSArray *) identifiers; - (void) createMenu: (NSArray *) labels; @end transmission-2.92/macosx/PaxHeaders.4960/ru.lproj0000644000000000000000000000013212666747213016664 xustar0030 mtime=1457245835.322998766 30 atime=1418239414.341103593 30 ctime=1457295922.855856468 transmission-2.92/macosx/ru.lproj/0000755000175000017500000000000012666747213020366 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/ru.lproj/PaxHeaders.4960/InfoPlist.strings0000644000000000000000000000013212664476420022260 xustar0030 mtime=1456635152.266501161 30 atime=1456635152.265501144 30 ctime=1457295922.853856434 transmission-2.92/macosx/ru.lproj/InfoPlist.strings0000644000175000017500000000022712664476420023706 0ustar00mikedldmikedld00000000000000/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = "© 2005-2016 The Transmission Project, вÑе права защищены";transmission-2.92/macosx/ru.lproj/PaxHeaders.4960/Creator.xib0000644000000000000000000000013012640354045021027 xustar0029 mtime=1451350053.57816998 29 atime=1451350053.57816998 30 ctime=1457295922.855856468 transmission-2.92/macosx/ru.lproj/Creator.xib0000644000175000017500000006051012640354045022460 0ustar00mikedldmikedld00000000000000 File File transmission-2.92/macosx/ru.lproj/PaxHeaders.4960/PrefsWindow.xib0000644000000000000000000000013212640354045021701 xustar0030 mtime=1451350053.576169945 30 atime=1451350053.576169945 30 ctime=1457295922.854856451 transmission-2.92/macosx/ru.lproj/PrefsWindow.xib0000644000175000017500000057040412640354045023340 0ustar00mikedldmikedld00000000000000 ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer Раздачи будут добавлены в первую удовлетворÑющую вÑем правилам группу NSAllRomanInputSourcesLocaleIdentifier NSAllRomanInputSourcesLocaleIdentifier YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7MTgsIDE4fdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPERrQTU0AKgAAAUqAOuBP8AQW DQeEQmFQuGQ2HQWBOuCQ+KRWLRSIxOLxU9R0AA6QRuHxmRRVSycABCVAB7y0APmYRsDzMASSSw9TzkAA WeAAvT+bwibUGGKmjTuelKlUSDUOmQlVVEABKqABk1cAHutAA/12PyF5WEAIGyABC2eawOnwtWW0ABa4 AB1XMAFS7AC2qy33G5uq63e82mJWuFK7DAAI4kAOTGAAu48AKPJXsLXK6Y8u5HJ07CQVYZ+kAUAFXSAB 7acAArVABN60AGXYabUaoFYKNZ2CrHdAADb0AEngQycqcAFnjQzOZ1Z8sABPnABo9EAP7qAABdcACntA Br93p9XrgLbbiDqTzYjFbjk4TaeSDsj4NkR/MTe77QY+flDG/+Hn7vuF0AhiQkCEgHMDh8/77BbBgYCj B4sCVCQoPmEYTwUkSAgAAA8BAAADAAAAAQASAAABAQADAAAAAQASAAABAgADAAAABAAAAgQBAwADAAAA AQAFAAABBgADAAAAAQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAEAAABFgADAAAA AQASAAABFwAEAAAAAQAAAUEBHAADAAAAAQABAAABPQADAAAAAQACAAABUgADAAAAAQABAAABUwADAAAA BAAAAgyHcwAHAAAYvAAAAhQAAAAAAAgACAAIAAgAAQABAAEAAQAAGLxhcHBsAhAAAG1udHJSR0IgWFla IAfeAAIAGQAVAC8ACGFjc3BBUFBMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBw bAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWRlc2MAAAFQAAAA YmRzY20AAAG0AAABwGNwcnQAAAN0AAAAI3d0cHQAAAOYAAAAFHJYWVoAAAOsAAAAFGdYWVoAAAPAAAAA FGJYWVoAAAPUAAAAFHJUUkMAAAPoAAAIDGFhcmcAAAv0AAAAIHZjZ3QAAAwUAAAGEm5kaW4AABIoAAAG PmNoYWQAABhoAAAALG1tb2QAABiUAAAAKGJUUkMAAAPoAAAIDGdUUkMAAAPoAAAIDGFhYmcAAAv0AAAA IGFhZ2cAAAv0AAAAIGRlc2MAAAAAAAAACERpc3BsYXkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAA AAAAACEAAAAMaHJIUgAAACQAAAGca29LUgAAACQAAAGcbmJOTwAAACQAAAGcaWQAAAAAACQAAAGcaHVI VQAAACQAAAGcY3NDWgAAACQAAAGcZGFESwAAACQAAAGcdWtVQQAAACQAAAGcYXIAAAAAACQAAAGcaXRJ VAAAACQAAAGccm9STwAAACQAAAGcbmxOTAAAACQAAAGcaGVJTAAAACQAAAGcZXNFUwAAACQAAAGcZmlG SQAAACQAAAGcemhUVwAAACQAAAGcdmlWTgAAACQAAAGcc2tTSwAAACQAAAGcemhDTgAAACQAAAGccnVS VQAAACQAAAGcZnJGUgAAACQAAAGcbXMAAAAAACQAAAGcY2FFUwAAACQAAAGcdGhUSAAAACQAAAGcZGVE RQAAACQAAAGcZW5VUwAAACQAAAGccHRCUgAAACQAAAGccGxQTAAAACQAAAGcZWxHUgAAACQAAAGcc3ZT RQAAACQAAAGcdHJUUgAAACQAAAGcamFKUAAAACQAAAGccHRQVAAAACQAAAGcAEwARQBEACAAQwBpAG4A ZQBtAGEAIABEAGkAcwBwAGwAYQB5dGV4dAAAAABDb3B5cmlnaHQgQXBwbGUgSW5jLiwgMjAxNAAAWFla IAAAAAAAAPNSAAEAAAABFs9YWVogAAAAAAAAcXQAADo5AAACnVhZWiAAAAAAAABhKwAAuiwAABSsWFla IAAAAAAAACQ2AAALmwAAu+NjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADYAOwBAAEUA SgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8AowCoAK0AsgC3ALwAwQDGAMsA0ADVANsA 4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoB oQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqIC rAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kE BgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYF tQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wH vwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEK Jwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM 8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQ JhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QT xRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X 0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCoc Uhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwh SCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocm tyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4s oizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQz DTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5 +To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlB akGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1J Y0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR 5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa 9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBk lGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4Sbmtu xG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5 iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE 44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q 1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPed ZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyq j6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4 WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbG w8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V 0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5Pzl hOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD1 3vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//3BhcmEAAAAAAAMAAAACZmYAAPKnAAAN WQAAE9AAAAoOdmNndAAAAAAAAAAAAAMBAAACAAAAVgEuAesCnQNeBCkFBwXxBukH1wjfCeEK9wwFDSYO Sw90EKAR1xMLFD4VehavF+cZKhphG5cczx4FHzUgZSGOIrIj0iTuJgInDigPKQsqAir5K+0s4S3TLsMv tTCkMZAyfTNqNFY1QDYqNxM3/DjlOcw6tDucPIM9aj5SPz5ALEEfQhZDEEQJRQRF/Ub3R/BI6EngSthL zkzFTbxOs0+tUKpRqVKqU61Ur1WxVrNXs1i0WbRas1uyXLFdr16vX7JguGHBYsxj2WTmZfRm/2gLaRZq ImsrbDVtP25Jb1VwZXF3co1zpnS/ddh28XgJeSB6N3tOfGN9eH6Kf5eAoIGhgp+DmISPhYaGe4dxiGaJ WopOi0GMNY0ojhyPEpALkQmSC5MQlBiVIZYrlzSYPZlFmk2bVZxbnWOea590oIChkKKho7WkyqXfpvSo CKkcqi+rQqxVrWeueK+IsJaxorKrs7O0urW/tsW3ybjNudG61bvYvNu9377kv+vA9cIDwxXEKMU8xlDH Y8h3yYrKnMuvzMHN0c7gz+3Q9dH60vzT+9T41fXW8dft2OjZ49re29jc0t3N3sjfxeDG4cri0uPd5Onl 9ecB6AzpGOoj6y7sOe1D7knvS/BE8TLyF/Ly88f0mfVr9jz3Dvff+K/5gPpR+yH78fzB/ZH+YP8w//8A AABWAS4B6wKdA14ELgUgBfMG6QfqCOIJ8QsKDCUNRQ5oD48QwhHzEy0UXxWZFtQYDRlNGoUbwBz2Hisf XyCMIbQi1iP0JQ8mHCcmKCEpGCoLKvgr4izOLbouoy+MMHYxYDJJMzA0FzT9NeQ2yjevOJQ5ejpeO0I8 Jj0IPes+0T+4QKNBkUKCQ3dEbEViRlZHS0g+STFKI0sVTAdM+E3qTtxP0VDIUcJSvlO7VLhVtVawV6tY plmhWppblFyNXYdegl9/YH9hgmKKY5NknGWnZrBnuGjAachqz2vVbNxt5G7sb/hxBnIXcyx0QnVYdm53 g3iXeax6v3vSfOR99X8CgAqBDoIMgwaD/oT0hemG3YfRiMWJuIqri56MkI2CjnePbZBnkWeSapNylHqV g5aLl5OYm5mimqmbsJy1nbyewp/LoNah5KL1pAalGKYqpzyoTqlfqnCrgKyQraCur6+9sMqx1bLfs+i0 8LX4tv+4BrkNuhS7GrwgvSa+LL8zwD3BSsJZw2zEf8WTxqfHusjNyeDK8swEzRbOJs810ELRTNJT01fU WtVc1l7XX9hg2WDaYdth3GHdYd5h32PgaOFw4nzjiuSa5avmu+fM6N3p7er87AztGu4m7y7wL/En8hfy //Ph9MH1oPZ+91z4OvkY+fb60/uw/I39av5G/yP//wAAAFYBLgHrAp0DXgQpBQcF8QbpB9cI3wnhCvcM BQ0mDksPdBCgEc4TChQ8FXMWrxfvGSoaYxubHNQeDR88IGshlyK+I+Ik/iYRJyEoKikpKicrISwaLRAu CS8AL/Mw5zHYMsgztjSmNZU2gzdxOF05Szo3OyM8Djz4PeM+0D/AQLNBqEKgQ5tElUWORodHgEh4SXBK Z0teTFRNSU4+TzZQL1EpUiZTJFQiVSFWH1ccWBlZFloSWwxcB10BXf1e+V/3YPhh+2MCZAhlD2YWZxxo IWkmaiprL2wybTVuOW8/cEdxUXJfc3B0gHWRdqF3sXjAec963XvrfPh+An8KgAyBCYIBgvSD5ITUhcKG r4ediIqJdYphi02MOI0jjg+O/Y/tkOKR3JLYk9eU2JXZltiX2JjXmdaa1JvTnNGdz57Nn86g0aHWot2j 5qTwpfqnBKgNqRWqHqsmrC6tNK46rz+wQ7FEskWzRLRCtUC2Pbc6uDe5M7ovuyu8Jr0ivh6/G8AbwR7C JMMtxDfFQsZNx1fIYslsynbLf8yIzZHOmM+e0KHRotKg05zUl9WR1ovXhNh92Xfab9to3GDdWd5T31Dg UeFX4mLjceSC5ZXmqOe76M3p4Ory7ATtFO4k7zLwPfFE8kbzRvRD9T/2O/c2+DH5K/om+yD8Gf0T/g3/ Bv//AABuZGluAAAAAAAABjYAAKTQAABVhwAATJEAAJ47AAAmCgAADA4AAFANAABUOQACQo8AAjMzAAIw owADAQAAAgAAAAEABAAJABAAGAAhACsANwBDAFEAXwBvAH8AkACiALUAyQDdAPMBCgEhAToBVAFvAYoB pwHGAeUCBgIoAkwCcQKYAsEC7AMZA0gDegOvA+gEJARjBKQE6AUuBXcFwgYPBmAGswcIB2AHuwgYCHgI 2gk/CacKEQp+Cu0LXwvRDEQMtw0qDZ4OFQ6NDwgPhRAFEIcRDBGTEh0SqRM3E8cUVxTnFXkWCxagFzcX 0BhsGQoZqxpOGvQbnBxHHPMdoB5NHvofpyBVIQUhtiJqIyEj2iSVJVImEybVJ5ooYCknKe0qsyt5LD8t Bi3PLpsvaDA4MQsx3zK2M5A0bDVMNjI3HjgTOQ46EDsXPCE9Lz4/P1NAakGEQqFDwUTjRgdHKkhLSWlK hUugTLtN2E73UBlRPVJlU49Uu1XrVxxYT1mCWrRb5V0WXkZfd2CrYeBjGWRTZZFm0WgTaVhqoGvsbTtu jm/ncUVyp3QNdXd25HhUecd7PXy2fjJ/sIExgrKEM4Wxhy2Ipooei5iNE46RkBGRlJMalKKWLZe7mU2a 45x/niOf0KGFo0GlA6bJqJKqX6wwrgOv2rG0s5G1cbdRuTC7C7zivrXAhsJYxCzGAsfbybbLlc12z1rR QtMw1SjXMtlV25jd++B24vzlh+gX6qztRu/k8of1L/fc+o79RP//AAAAAQAEAAkAEAAXACEAKwA2AEMA UABeAG0AfQCOAKAAswDGANsA8AEHAR4BNwFQAWsBhgGjAcEB4AIBAiMCRgJrApICuwLmAxMDQgN1A6oD 5AQhBGEEpQTsBTQFfwXNBh0GbwbEBxwHdgfTCDIIlAj5CWAJygo3CqYLGQuNDAMMegzxDWkN4Q5bDtcP Vg/XEFsQ4hFrEfcShRMWE6kUPhTTFWkV/xaXFzEXzRhsGQ4ZshpYGwIbrhxcHQ0dvx5yHyUf2CCKIT0h 8iKoI2EkHSTbJZsmXickJ+sotSmAKkwrFyvjLK4teS5GLxQv5TC4MY4yZTNANBw0+zXdNsM3rzihOZo6 mzuiPK49vT7QP+ZA/0IbQzpEXEWBRqlH0Uj5Sh5LP0xfTX1OnU++UOJSCVMyVF5VjVa+V/NZKVpiW5tc 014KX0FgeGGxYutkKGVnZqln7Wk0an5rym0ZbmtvwHEZcnZz13U8dqR4D3l9eu58YX3Yf1GAzYJMg82F UIbSiFKJ0YtOjMqOSI/HkUmSzpRVld6Xa5j6moycIZ27n1mg/qKrpF6mF6fUqZWrWq0hruywubKKtF62 NLgNuee7v72Uv2XBNMMAxM3GnMhtykDMF83wz8zRq9OO1XbXZ9ln23rdp9/r4kHkoucK6XXr5e5a8NLz T/XQ+Fb63/1t//8AAAABAAQACQAQABgAIQArADcAQwBRAF8AbwB/AJAAogC1AMkA3gDzAQoBIgE6AVQB bgGKAacBxQHlAgUCJwJLAnAClwK/AuoDFgNFA3cDqwPiBB0EWgSaBNwFIQVnBbAF/AZKBpsG7wdFB50H +AhVCLUJFwl8CeMKTQq6CygLmAwIDHoM7A1fDdQOTA7GD0IPwRBCEMYRTBHVEmES7xN+FA4UoBUyFcYW XBb0F48YLBjMGW4aExq7G2UcEhzAHXAeIB7QH4EgMiDmIZsiUyMOI8skiyVNJhEm2SeiKG0pOSoFKtEr nSxpLTcuBy7ZL64whTFeMjozGTP6NN41xza1N6s4qDmuOrs7zDzhPfo/FkA1QVhCfkOnRNNGA0czSGNJ kEq6S+JNCU4xT1pQh1G3UulUHlVXVpJX0FkQWlNbllzYXhpfW2CcYd5jI2RqZbRnAWhQaaJq92xPbatv CnBtcdVzQnSydid3oHkcept8HH2ifyqAtYJDg9SFaIb8iJCKIYuwjT2OyZBWkeaTeJUMlqSYPpnbm3ud Hp7EoG+iH6PWpZWnWqklqvWsyK6fsHmyV7Q3thu4Arnsu9e9wb+nwYbDX8UxxwHI0MqgzHLOR9Af0fnT 1tW215rZgdtu3WLfX+Fn43nlk+ez6djsAO4r8FryjPTC9vv5N/t2/bn//wAAc2YzMgAAAAAAAQxCAAAF 3v//8yYAAAeSAAD9kf//+6L///2jAAAD3AAAwGxtbW9kAAAAAAAABhAAAJImAvcOK8kCL0gAAAAAAAAA AAAAAAAAAAAA0iUmJyhaJGNsYXNzbmFtZVgkY2xhc3Nlc18QEE5TQml0bWFwSW1hZ2VSZXCjJykqWk5T SW1hZ2VSZXBYTlNPYmplY3TSJSYsLVdOU0FycmF5oiwq0iUmLzBeTlNNdXRhYmxlQXJyYXmjLywq0zIz CjQ1NldOU1doaXRlXE5TQ29sb3JTcGFjZUQwIDAAEAOADNIlJjg5V05TQ29sb3KiOCrSJSY7PFdOU0lt YWdlojsqXxAPTlNLZXllZEFyY2hpdmVy0T9AVHJvb3SAAQAIABEAGgAjAC0AMgA3AEYATABXAF4AZQBy AHkAgQCDAIUAigCMAI4AlwCcAKcAqQCrAK0AsgC1ALcAuQC7AL0AwgDZANsA3RuxG7YbwRvKG90b4Rvs G/Ub+hwCHAUcChwZHB0cJBwsHDkcPhxAHEIcRxxPHFIcVxxfHGIcdBx3HHwAAAAAAAACAQAAAAAAAABB AAAAAAAAAAAAAAAAAAAcfg transmission-2.92/macosx/ru.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212640354045022562 xustar0030 mtime=1451350053.577169962 30 atime=1451350053.577169962 30 ctime=1457295922.855856468 transmission-2.92/macosx/ru.lproj/Localizable.strings0000644000175000017500000012770412640354045024222 0ustar00mikedldmikedld00000000000000/* Inspector -> selected torrents stats -> bytes */ "%@ bytes" = "%@ байтов"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "%@ files" = "%@ файлов"; /* Prefs -> blocklist -> message */ "%@ IP address rules in list" = "%@ IP-адреÑов в ÑпиÑке"; /* Inspector -> selected torrents */ "%@ magnetized transfers" = "%@ maget-разд."; /* Blocklist -> message Inspector -> Files tab -> file status string Torrent -> progress string */ "%@ of %@" = "%1$@ из %2$@"; /* Torrent -> progress string */ "%@ of torrent metadata retrieved" = "%@ метаданных торрента получено"; /* Torrent -> eta string */ "%@ remaining" = "оÑталоÑÑŒ %@"; /* Add torrent -> info Torrent -> progress string */ "%@ selected" = "%@ выбрано"; /* stats window -> times opened */ "%@ times" = "%@ раз"; /* Drag overlay -> torrents */ "%@ Torrent Files" = "%@ торрент-файлов"; /* Inspector -> selected torrents */ "%@ Torrents Selected" = "%@ разд."; /* Inspector -> selected torrents stats total */ "%@ total" = "%@ вÑего"; /* Filter Bar Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "%@ transfers" = "%@ разд."; /* Inspector -> Activity tab -> have */ "%@ verified" = "%@ проверено"; /* Inspector -> Peers tab -> peers */ "%d cache" = "%d в кеше"; /* Inspector -> Peers tab -> peers */ "%d Connected" = "%d подключено"; /* Inspector -> Peers tab -> peers */ "%d DHT" = "%d DHT"; /* Dock item - Downloading */ "%d Downloading" = "%d ÑкачиваетÑÑ"; /* Inspector -> Peers tab -> peers */ "%d incoming" = "%d входÑщих"; /* Action menu -> upload/download limit Status Bar -> speed tooltip */ "%d KB/s" = "%d КБ/s"; /* Inspector -> Peers tab -> peers */ "%d local discovery" = "%d меÑтных польз."; /* Inspector -> Peers tab -> peers */ "%d LTEP" = "%d LTEP"; /* Info options -> global setting */ "%d minutes" = "%d мин"; /* Inspector -> Peers tab -> peers */ "%d PEX" = "%d PEX"; /* Create torrent -> info */ "%d pieces, %@ each" = "%1$d чаÑтей, %2$@ каждаÑ"; /* Dock item - Seeding */ "%d Seeding" = "%d раздаетÑÑ"; /* Inspector -> Peers tab -> peers */ "%d tracker" = "%d от трекера"; /* Torrent -> status string */ "%d web seeds" = "%d Ñайтов раздачи"; /* time string */ "%u days" = "%u дн"; /* time string */ "%u hr" = "%u ч"; /* time string */ "%u min" = "%u мин"; /* time string */ "%u sec" = "%u Ñ"; /* time string */ "%u years" = "%u года"; /* time string */ "1 day" = "1 день"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "1 file" = "1 файл"; /* Inspector -> selected torrents */ "1 magnetized transfer" = "1 magnet-раздача"; /* Info options -> global setting */ "1 minute" = "1 мин"; /* Create torrent -> info */ "1 piece, %@" = "1 чаÑть, %@"; /* stats window -> times opened */ "1 time" = "1 раз"; /* Filter Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "1 transfer" = "1 раздача"; /* time string */ "1 year" = "1 год"; /* Open invalid alert -> title */ "\"%@\" is not a valid torrent file." = "«%@» не ÑвлÑетÑÑ Ñ‚Ð¾Ñ€Ñ€ÐµÐ½Ñ‚-файлом."; /* Prefs -> blocklist -> message */ "A blocklist must first be downloaded" = "Ðеобходимо Ñкачать черный ÑпиÑок"; /* Create torrent -> file already exists warning -> warning */ "A file with the name \"%@\" already exists in the directory \"%@\". Choose a new name or directory to create the torrent file." = "Файл Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «%1$@» уже еÑть в папке «%2$@». Выберите новое Ð¸Ð¼Ñ Ð¸Ð»Ð¸ меÑтоположение чтобы Ñоздать торрент-файл."; /* Move inside itself alert -> title */ "A folder cannot be moved to inside itself." = "Папка не может быть перемещена внутрь ÑебÑ."; /* Create torrent -> zero size -> warning */ "A torrent file cannot be created for files with no size." = "Торрент-файл не может быть Ñоздан Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² нулевого размера."; /* Create torrent -> file already exists warning -> title */ "A torrent file with this name and directory cannot be created." = "Торрент-файл Ñ Ñтим именем не может быть Ñоздан в Ñтой папке."; /* Create torrent -> blank address -> message */ "A transfer marked as private with no tracker addresses will be unable to connect to peers. The torrent file will only be useful if you plan to upload the file to a tracker website that will add the addresses for you." = "Другие пользователи не Ñмогут подключитьÑÑ Ðº раздаче без адреÑа трекера, помеченной как чаÑтнаÑ. Торрент-файл будет работать только еÑли Ñайт трекера Ñам добавит в него адреÑа."; /* Open duplicate alert -> title Open duplicate magnet alert -> title */ "A transfer of \"%@\" already exists." = "Раздача «%@» уже ÑущеÑтвует."; /* Filter Bar -> filter button */ "Active" = "Ðктивные"; /* Inspector -> tab Inspector view -> title */ "Activity" = "ÐктивноÑть"; /* Add torrent -> same name -> button */ "Add" = "Добавить"; /* Inspector view -> tracker buttons */ "Add a tracker" = "Добавить трекер"; /* Magnet link failed -> title */ "Adding magnetized transfer failed." = "Ошибка при добавление magnet-раздачи"; /* Filter Bar -> filter button */ "All" = "Ð’Ñе"; /* Groups -> Button */ "All Groups" = "Ð’Ñе группы"; /* Create torrent -> failed -> warning */ "An unknown error has occurred." = "Произошла неизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°."; /* Tracker last announce */ "Announce error" = "Ошибка анонÑа"; /* Tracker next announce */ "Announce in progress" = "ÐÐ½Ð¾Ð½Ñ Ð² прогреÑÑе"; /* Tracker next announce */ "Announce is queued" = "ÐÐ½Ð¾Ð½Ñ Ð¿Ñ€Ð¸Ð¾Ñтановлен"; /* Tracker next announce */ "Announce not scheduled" = "ÐÐ½Ð¾Ð½Ñ Ð½Ðµ запланирован"; /* Tracker last announce */ "Announce timed out" = "Превышено Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð°Ð½Ð¾Ð½Ñа"; /* All toolbar item -> label */ "Apply All" = "Применить вÑе"; /* Selected toolbar item -> label */ "Apply Selected" = "Применить выбранные"; /* Confirm Quit panel -> title */ "Are you sure you want to quit?" = "Ð’Ñ‹ дейÑтвительно хотите завершить программу?"; /* Remove completed confirm panel -> title */ "Are you sure you want to remove %@ completed transfers from the transfer list?" = "Ð’Ñ‹ дейÑтвительно хотите удалить %@ завершенных раздач из ÑпиÑка?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list and trash the data files?" = "Ð’Ñ‹ дейÑтвительно хотите удалить %@ раздач из ÑпиÑка и перемеÑтить их данные в Корзину?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list?" = "Ð’Ñ‹ дейÑтвительно хотите удалить %@ раздач из ÑпиÑка?"; /* Remove trackers alert -> title */ "Are you sure you want to remove %d trackers?" = "Выделено трекеров: %d. Ð’Ñ‹ дейÑтвительно хотите удалить трекеры? "; /* Removal confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list and trash the data file?" = "Ð’Ñ‹ дейÑтвительно хотите удалить «%@» из ÑпиÑка раздач и перемеÑтить данные в Корзину?"; /* Removal confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list?" = "Ð’Ñ‹ дейÑтвительно хотите удалить «%@» из ÑпиÑка раздач?"; /* Remove trackers alert -> title */ "Are you sure you want to remove this tracker?" = "Ð’Ñ‹ дейÑтвительно хотите удалить Ñтот трекер?"; /* Stats reset -> title */ "Are you sure you want to reset usage statistics?" = "Ð’Ñ‹ дейÑтвительно хотите очиÑтить ÑтатиÑтику?"; /* inspector -> peer table -> header tool tip */ "Available" = "ДоÑтупен"; /* Preferences -> toolbar item title */ "Bandwidth" = "Ширина канала"; /* Growl notification description */ "Bandwidth settings changed" = "ÐаÑтройки ширины канала изменены"; /* Groups -> Name */ "Blue" = "СинÑÑ"; /* Add torrent -> same name -> button Blocklist -> cancel button Confirm Quit panel -> button Create torrent -> blank address -> button Removal confirm panel -> button Remove trackers alert -> button Stats reset -> button */ "Cancel" = "Отменить"; /* Torrent Table -> tooltip */ "Change transfer settings" = "Изменить наÑтройки передачи"; /* File Outline -> Menu */ "Check Selected" = "Отметить выбранные"; /* Torrent -> status string */ "Checking existing data" = "Проверка ÑущеÑтвующих данных"; /* Message window -> save button */ "Clear" = "ОчиÑтить"; /* inspector -> peer table -> header */ "Client" = "Клиент"; /* View menu -> Quick Look */ "Close Quick Look" = "Закрыть Quick Look"; /* Prefs -> Notifications */ "Configure In Growl" = "Параметры в Growl"; /* Prefs -> Notifications */ "Configure In System Preferences" = "Параметры в СиÑтемных наÑтройках"; /* Blocklist -> message */ "Connecting to site" = "ПодключаюÑÑŒ к Ñайту"; /* Torrent file copy alert -> title */ "Copy of \"%@\" Cannot Be Created" = "ÐšÐ¾Ð¿Ð¸Ñ Â«%@» не может быть Ñоздана"; /* Create torrent -> failed -> warning */ "Could not read \"%s\": %s." = "Ðе могу прочитать «%1$s»: %2$s."; /* Create torrent -> failed -> warning */ "Could not write \"%s\": %s." = "Ðе могу запиÑать «%1$s»: %2$s."; /* Create toolbar item -> label Create torrent -> blank address -> button */ "Create" = "Создать"; /* Drag overlay -> file */ "Create a Torrent File" = "Создать торрент-файл"; /* Create toolbar item -> tooltip */ "Create torrent file" = "Создать торрент-файл"; /* Create toolbar item -> palette label Create torrent -> select file */ "Create Torrent File" = "Создать торрент-файл"; /* Create torrent -> failed -> title */ "Creation of \"%@\" failed." = "При Ñоздании «%@» произошла ошибка."; /* Inspector -> peer -> status */ "Currently downloading (interested and not choked)" = "Скачиваю (заинтереÑован и открыт)"; /* Inspector -> peer -> status */ "Currently uploading (interested and not choked)" = "Раздаю (заинтереÑован и открыт)"; /* Message window -> table column */ "Date" = "Дата"; /* Message window -> level Message window -> level string */ "Debug" = "Отладка"; /* Info options -> global setting */ "disabled" = "отÑутÑтвуют"; /* inspector -> peer table -> header inspector -> web seed table -> header status bar -> status label Torrent -> status string */ "DL" = "С"; /* Inspector -> Peers tab -> peers */ "DL from %d" = "Ñкачиваю от %d"; /* Torrent disk space alert -> button */ "Do not check disk space again" = "Ðе проверÑть еще раз"; /* Donation beg -> button */ "Don't bug me about this ever again." = "Больше не Ñпрашивать"; /* files tab -> tooltip */ "Don't Download" = "Ðе Ñкачивать"; /* Donation beg -> button */ "Donate" = "Сделать пожертвование"; /* Donation beg -> message */ "Donate or not, there will be no difference to your torrenting experience." = "Transmission продолжит работать вне завиÑимоÑти от того, Ñделаете вы пожертвование или нет."; /* file table -> header tool tip files tab -> tooltip */ "Download" = "Скачать"; /* Torrent disk space alert -> button */ "Download Anyway" = "Скачать в любом Ñлучае"; /* Growl notification title */ "Download Complete" = "Скачивание завершено"; /* Blocklist -> message */ "Download of the blocklist failed." = "Ðе могу Ñкачать черный ÑпиÑок."; /* files tab -> tooltip */ "Download Some" = "Файлы торрента"; /* Torrent table -> group row -> tooltip */ "Download speed" = "СкороÑть ÑкачиваниÑ"; /* Stats window -> label tracker peer stat */ "Downloaded" = "Скачали"; /* Torrent -> status string */ "Downloading" = "Скачиваю"; /* Blocklist -> message */ "Downloading blocklist" = "Скачиваю черный ÑпиÑок"; /* Torrent -> status string */ "Downloading from %d of %d peers" = "Скачиваю от %1$d из %2$d пользователей"; /* Torrent -> status string */ "Downloading from %d of 1 peer" = "Скачиваю от %d из 1 пользователÑ"; /* inspector -> peer table -> header tool tip */ "Downloading From Peer" = "Скачиваю от пользователÑ"; /* inspector -> web seed table -> header tool tip */ "Downloading From Web Seed" = "Скачиваю Ñ Ñайта"; /* Inspector -> Peers tab -> table row tooltip */ "encrypted" = "зашифрованный"; /* inspector -> peer table -> header tool tip Inspector -> Peers tab -> table row tooltip */ "Encrypted Connection" = "Зашифрованное Ñоединение"; /* Message window -> level Message window -> level string Torrent -> status string */ "Error" = "Ошибка"; /* Inspector -> tab Inspector view -> title */ "Files" = "Файлы"; /* Filter toolbar item -> label inspector -> file filter Message window -> filter field */ "Filter" = "Фильтр"; /* Inspector -> Peers tab -> table row tooltip */ "From: cache" = "ИÑточник: кеш"; /* Inspector -> Peers tab -> table row tooltip */ "From: distributed hash table" = "ИÑточник: раÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð°Ñ Ñ…ÐµÑˆ-таблица"; /* Inspector -> Peers tab -> table row tooltip */ "From: incoming connection" = "ИÑточник: входÑщее подключение"; /* Inspector -> Peers tab -> table row tooltip */ "From: libtorrent extension protocol handshake" = "ИÑточник: раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð° рукопожатий libtorrent"; /* Inspector -> Peers tab -> table row tooltip */ "From: local peer discovery" = "ИÑточник: меÑтное обнаружение пользователей"; /* Inspector -> Peers tab -> table row tooltip */ "From: peer exchange" = "ИÑточник: обмен пользователÑми"; /* Inspector -> Peers tab -> table row tooltip */ "From: tracker" = "ИÑточник: трекер"; /* File size - gigabytes */ "GB" = "ГБ"; /* Transfer speed (gigabytes per second) */ "GB/s" = "ГБ/Ñ"; /* Preferences -> toolbar item title */ "General" = "ОÑновные"; /* Inspector -> tab Inspector view -> title */ "General Info" = "ИнформациÑ"; /* Status Bar -> speed tooltip */ "Global download limit" = "Общее ограничене ÑкороÑти ÑкачиваниÑ"; /* Status Bar -> speed tooltip */ "Global upload limit" = "Общее огранчение ÑкороÑти раздачи"; /* Tracker last announce */ "got %d peers" = "%d пользов."; /* Tracker last announce */ "got 1 peer" = "1 пользователь"; /* Groups -> Name */ "Gray" = "СераÑ"; /* Groups -> Name */ "Green" = "ЗеленаÑ"; /* Groups -> Button */ "Group" = "Группы"; /* Preferences -> toolbar item title */ "Groups" = "Группы"; /* View menu -> Filter Bar */ "Hide Filter Bar" = "Скрыть фильтр"; /* View menu -> Inspector */ "Hide Inspector" = "Скрыть инÑпектор"; /* View menu -> Status Bar */ "Hide Status Bar" = "Скрыть панель ÑтатуÑа"; /* File Outline -> Priority Menu */ "High" = "Ð’Ñ‹Ñкой"; /* files tab -> tooltip */ "High Priority" = "Ð’Ñ‹Ñокий приоритет"; /* Legal alert -> button */ "I Accept" = "Подтверждаю"; /* Add torrent -> same name -> message */ "If you are attempting to use already existing data, the root data directory should be inside the destination directory." = "ЕÑли вы хотите иÑпользовать ÑущеÑтвующие данные, ÐºÐ¾Ñ€Ð½ÐµÐ²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° должна быть внутри выбранной."; /* Torrent -> eta string */ "inactive" = "неактивен"; /* Message window -> level Message window -> level string */ "Info" = "ИнформациÑ"; /* Inspector toolbar item -> label */ "Inspector" = "ИнÑпектор"; /* URL sheet label */ "Internet address of torrent file:" = "ÐÐ´Ñ€ÐµÑ Ñ‚Ð¾Ñ€Ñ€ÐµÐ½Ñ‚-файла:"; /* inspector -> peer table -> header */ "IP Address" = "IP-адреÑ"; /* Download not a torrent -> message */ "It appears that the file \"%@\" from %@ is not a torrent file." = "Файл «%1$@» из %2$@ не ÑвлÑетÑÑ Ñ‚Ð¾Ñ€Ñ€ÐµÐ½Ñ‚-файлом."; /* File size - kilobytes */ "KB" = "КБ"; /* Transfer speed (kilobytes per second) */ "KB/s" = "КБ/Ñ"; /* Tracker last announce */ "Last Announce" = "ПоÑледний анонÑ"; /* Tracker last scrape */ "Last Scrape" = "ПоÑледний запроÑ"; /* Prefs -> blocklist -> message */ "Last updated" = "ПоÑледнее обновление"; /* tracker peer stat */ "Leechers" = "Скачивающих"; /* About window -> license button */ "License" = "ЛицензиÑ"; /* Action menu -> upload/download limit torrent action menu -> upload/download limit */ "Limit (%d KB/s)" = "С ограничением (%d КБ/Ñ)"; /* Save log alert panel -> title */ "Log Could Not Be Saved" = "Журнал не может быть Ñохранен"; /* File Outline -> Priority Menu */ "Low" = "Ðизкий"; /* files tab -> tooltip */ "Low Priority" = "Ðизкий приоритет"; /* Open duplicate magnet alert -> title */ "Magnet link is a duplicate of an existing transfer." = "Magnet-ÑÑылка ÑвлÑетÑÑ ÐºÐ¾Ð¿Ð¸ÐµÐ¹ ÑущеÑтвующей раздачи."; /* Inspector -> selected torrents Torrent -> progress string */ "Magnetized transfer" = "Magnet-раздача"; /* File size - megabytes */ "MB" = "МБ"; /* Transfer speed (megabytes per second) */ "MB/s" = "МБ/Ñ"; /* Message window -> table column */ "Message" = "Сообщение"; /* Message window -> title */ "Message Log" = "Журнал Ñообщений"; /* files tab -> tooltip */ "Multiple Priorities" = "Разные приоритеты"; /* Inspector -> Peers tab -> table row tooltip No Ratio Prefs -> blocklist -> message Tracker last announce Tracker last scrape tracker peer stat */ "N/A" = "Ðет данных"; /* Filter Bar -> filter menu */ "Name" = "ИмÑ"; /* Preferences -> toolbar item title */ "Network" = "Сеть"; /* Prefs -> blocklist -> message */ "Never" = "Ðикогда"; /* Inspector -> tracker table */ "New Tier" = "Ðовый уровень"; /* Tracker next announce */ "Next announce in %@" = "Следующий Ð°Ð½Ð¾Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· %@"; /* Group table row */ "No Group" = "✕"; /* Inspector -> selected torrents */ "No Torrents Selected" = "Ðи один торрент не выбран"; /* Groups -> Button Groups -> Menu */ "None" = "✕"; /* Donation beg -> button */ "Nope" = "Ðет"; /* File Outline -> Priority Menu */ "Normal" = "Ðормальный"; /* files tab -> tooltip */ "Normal Priority" = "Ðормальный приоритет"; /* Torrent disk space alert -> title */ "Not enough remaining disk space to download \"%@\" completely." = "ÐедоÑтаточно меÑта на диÑке Ð´Ð»Ñ ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Â«%@»."; /* About window -> license close button Blocklist -> button Create torrent -> directory doesn't exist warning -> button Create torrent -> failed -> button Create torrent -> file already exists warning -> button Create torrent -> no files -> button Create torrent -> zero size -> button Download not a torrent -> button Magnet link failed -> button Move error alert -> button Move inside itself alert -> button Open duplicate alert -> button Open duplicate magnet alert -> button Open invalid alert -> button Save log alert panel -> button Torrent disk space alert -> button Torrent download failed -> button Torrent file copy alert -> button */ "OK" = "OK"; /* Remove completed confirm panel -> message */ "Once removed, continuing the transfer will require the torrent file or magnet link." = "Ð”Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ð¾Ð¹ раздачи потребуетÑÑ Ñ‚Ð¾Ñ€Ñ€ÐµÐ½Ñ‚-файл или magnet-ÑÑылка."; /* Removal confirm panel -> message part 2 */ "Once removed, continuing the transfers will require the torrent files or magnet links." = "ПоÑле ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ðµ раздач потребует Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ Ñ‚Ð¾Ñ€Ñ€ÐµÐ½Ñ‚-файла или magnet-ÑÑылок."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact it. This cannot be undone." = "Transmission не будет пытатьÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº трекеру поÑле того, как он будет удален. Это дейÑтвие невозможно отменить."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact them. This cannot be undone." = "Transmission не будет пытатьÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº трекерам поÑле того, как они будет удален. Это дейÑтвие невозможно отменить."; /* File Outline -> Menu */ "Only Check Selected" = "Отметить только выбранные"; /* Open toolbar item -> label */ "Open" = "Открыть"; /* Open address toolbar item -> label */ "Open Address" = "Открыть адреÑ"; /* Open address toolbar item -> palette label */ "Open Torrent Address" = "Открыть торрент по адреÑу"; /* Open toolbar item -> tooltip */ "Open torrent files" = "Открыть торрент-файл"; /* Open toolbar item -> palette label */ "Open Torrent Files" = "Открыть торрент-файл"; /* Open address toolbar item -> tooltip */ "Open torrent web address" = "Открыть торрент по URL"; /* Inspector -> tab Inspector view -> title */ "Options" = "Опции"; /* Groups -> Name */ "Orange" = "ОранжеваÑ"; /* Inspector -> Peers tab -> table row tooltip */ "Partial Seed" = "ЧаÑÑ‚Ð¸Ñ‡Ð½Ð°Ñ Ñ€Ð°Ð·Ð´Ð°Ñ‡Ð°"; /* All toolbar item -> palette label */ "Pause / Resume All" = "ПриоÑтановить/возобновить вÑе"; /* Selected toolbar item -> palette label */ "Pause / Resume Selected" = "ПриоÑтановить/возобновить выбранные"; /* All toolbar item -> label */ "Pause All" = "ПриоÑтановить вÑе"; /* All toolbar item -> tooltip */ "Pause all transfers" = "ПриоÑтановить вÑе раздачи"; /* Selected toolbar item -> label */ "Pause Selected" = "ПриоÑтановить выбранное"; /* Selected toolbar item -> tooltip */ "Pause selected transfers" = "ПриоÑтановить выбранные раздачи"; /* Torrent Table -> tooltip */ "Pause the transfer" = "ПриоÑтановить раздачу"; /* Torrent -> status string */ "Paused" = "ПриоÑтановлены"; /* Inspector -> peer -> status */ "Peer is unchoking you, but you are not interested" = "ИмеющиеÑÑ Ñƒ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ‡Ð°Ñти торрента Ð²Ð°Ñ Ð½Ðµ интереÑуют"; /* Inspector -> peer -> status */ "Peer wants you to upload, but you do not want to (interested and choked)" = "Пользователь заинтереÑован в имеющихÑÑ Ñƒ Ð²Ð°Ñ Ñ‡Ð°ÑÑ‚ÑÑ… торрента, но вы его блокируете"; /* Inspector -> tab Inspector view -> title Preferences -> toolbar item title */ "Peers" = "Пользователи"; /* Inspector -> Peers tab -> table row tooltip */ "Port" = "Порт"; /* Preferences -> Network -> port status */ "Port check site is down" = "Сайт проверки порта недоÑтупен"; /* Preferences -> Network -> port status */ "Port is closed" = "Порт закрыт"; /* Preferences -> Network -> port status */ "Port is open" = "Порт открыт"; /* File Outline -> Menu file table -> header tool tip */ "Priority" = "Приоритет"; /* files tab -> tooltip */ "Priority Not Available" = "Приоритет недоÑтупен"; /* Inspector -> private torrent */ "Private Torrent, non-tracker peer discovery disabled" = "ЧаÑтный торрент, обнаружение пользователей вне трекера отключено"; /* Message window -> table column */ "Process" = "ПроцеÑÑ"; /* Blocklist -> message */ "Processing blocklist" = "Обрабатываю черный ÑпиÑок"; /* Stats window -> label */ "Program Started" = "Запущено"; /* Inspector -> Peers tab -> table row tooltip */ "Progress: %@" = "ПрогреÑÑ: %@"; /* Inspector -> Peers tab -> table row tooltip */ "Protocol: %@" = "Протокол: %@"; /* Inspector -> private torrent */ "Public Torrent" = "Публичный торрент"; /* Groups -> Name */ "Purple" = "ПурпурнаÑ"; /* QuickLook toolbar item -> label QuickLook toolbar item -> palette label QuickLook toolbar item -> tooltip View menu -> Quick Look */ "Quick Look" = "БыÑтрый проÑмотр"; /* Confirm Quit panel -> button Legal alert -> button Transmission already running alert -> button */ "Quit" = "Завершить"; /* Dock Badger -> quit */ "Quitting" = "Заверш."; /* Stats window -> label status bar -> status label Torrent -> status string Torrent table -> group row -> tooltip */ "Ratio" = "Рейтинг"; /* Groups -> Name */ "Red" = "КраÑнаÑ"; /* Action menu -> status string toggle */ "Remaining Time" = "ОÑтавшееÑÑ Ð²Ñ€ÐµÐ¼Ñ"; /* Torrent -> eta string */ "remaining time unknown" = "оÑтавшееÑÑ Ð²Ñ€ÐµÐ¼Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтно"; /* Preferences -> toolbar item title */ "Remote" = "Удаленное управление"; /* Removal confirm panel -> button Remove toolbar item -> label Remove trackers alert -> button */ "Remove" = "Удалить"; /* Main window -> 3rd bottom left button (remove all) tooltip */ "Remove all transfers that have completed seeding." = "Удалить вÑе завершенные раздачи"; /* Remove toolbar item -> palette label */ "Remove Selected" = "Удалить выбранные"; /* Inspector view -> tracker buttons */ "Remove selected trackers" = "Удалить выбранные трекеры"; /* Remove toolbar item -> tooltip */ "Remove selected transfers" = "Удалить выбранные раздачи"; /* rename sheet button */ "Rename" = "Переименовать"; /* File Outline -> Menu */ "Rename File" = "Переименовать файл"; /* rename sheet label */ "Rename the file \"%@\":" = "Переименовать файл «%@»"; /* Stats reset -> button Stats window -> reset button */ "Reset" = "ОчиÑтить"; /* All toolbar item -> label */ "Resume All" = "Возобновить вÑе"; /* All toolbar item -> tooltip */ "Resume all transfers" = "Возобновить вÑе раздачи"; /* Selected toolbar item -> label */ "Resume Selected" = "Возобновить выбранные"; /* Selected toolbar item -> tooltip */ "Resume selected transfers" = "Возобновить выбранные раздачи"; /* Torrent cell -> button info */ "Resume the transfer" = "Возобновить раздачу"; /* Torrent cell -> button info */ "Resume the transfer right away" = "Возобновить раздачу прÑмо ÑейчаÑ"; /* Stats window -> label */ "Running Time" = "Ð’Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹"; /* Message window -> save button */ "Save" = "Сохранить"; /* Tracker last scrape */ "Scrape error" = "Ошибка запроÑа"; /* Tracker last scrape */ "Scrape timed out" = "Тайм-аут запроÑа"; /* tracker peer stat */ "Seeders" = "Раздающих"; /* Torrent -> status string */ "Seeding" = "Раздаю"; /* Torrent -> status string */ "Seeding complete" = "Раздача завершена"; /* Growl notification title */ "Seeding Complete" = "Раздача завершена"; /* Torrent -> status string */ "Seeding to %d of %d peers" = "Раздаю к %1$d из %2$d пользователей"; /* Torrent -> status string */ "Seeding to %d of 1 peer" = "Раздаю к %d из 1 пользователÑ"; /* Create torrent -> location sheet -> button Create torrent -> select file Move torrent -> prompt Open torrent -> prompt Preferences -> Open panel prompt */ "Select" = "Выбрать"; /* Create torrent -> select file */ "Select a file or folder for the torrent file." = "Выберите папку или файл Ð´Ð»Ñ Ñ‚Ð¾Ñ€Ñ€ÐµÐ½Ñ‚Ð°."; /* Add -> select destination folder */ "Select the download folder for \"%@\"" = "Выберите папку Ð´Ð»Ñ ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Â«%@»"; /* Create torrent -> location sheet -> message */ "Select the name and location for the torrent file." = "Выберите Ð¸Ð¼Ñ Ð¸ меÑтоположение Ð´Ð»Ñ Ñ‚Ð¾Ñ€Ñ€ÐµÐ½Ñ‚-файла."; /* Move torrent -> select destination folder */ "Select the new folder for %d data files." = "Выберите новую папку Ð´Ð»Ñ %d файлов данных."; /* Move torrent -> select destination folder */ "Select the new folder for \"%@\"." = "Выберите новую папку Ð´Ð»Ñ Â«%@»."; /* Status Bar -> status menu */ "Session Ratio" = "Рейтинг за ÑеÑÑию"; /* Status Bar -> status menu */ "Session Transfer" = "Роздано за ÑеÑÑию"; /* Share toolbar item -> label Share toolbar item -> palette label */ "Share" = "Отправить"; /* Share toolbar item -> tooltip */ "Share torrent file" = "Отправить торрент-файл"; /* Main window -> 1st bottom left button (action) tooltip */ "Shortcuts for changing global settings." = "Общие наÑтройки раздач"; /* notification button */ "Show" = "Показать"; /* View menu -> Filter Bar */ "Show Filter Bar" = "Показать фильтр"; /* File Outline -> Menu */ "Show in Finder" = "Показать в Finder"; /* View menu -> Inspector */ "Show Inspector" = "Показать инÑпектор"; /* View menu -> Status Bar */ "Show Status Bar" = "Показать панель ÑтатуÑа"; /* Torrent cell -> button info */ "Show the data file in Finder" = "Показать данные в Finder"; /* Status Bar -> speed tooltip */ "Speed Limit" = "Ограничение ÑкороÑти"; /* Growl notification title */ "Speed Limit Auto Disabled" = "Ограничение ÑкороÑти отключено"; /* Growl notification title */ "Speed Limit Auto Enabled" = "Ограничение ÑкороÑти включено"; /* Main window -> 2nd bottom left button (turtle) tooltip */ "Speed Limit overrides the total bandwidth limits with its own limits." = "Будет иÑпользовано ограничение ÑкороÑти вмеÑто наÑтроек ширины канала"; /* Torrent -> status string */ "Stalled" = "Ðеактивна"; /* Stats window -> title */ "Statistics" = "СтатиÑтика"; /* Action menu -> status string toggle */ "Status of Selected Files" = "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… файлов"; /* Action menu -> ratio stop torrent action menu -> ratio stop */ "Stop at Ratio (%.2f)" = "ОÑтановить при рейтинге (%.2f)"; /* Torrent cell -> button info */ "Stop waiting to start" = "Ðе ожидать начала"; /* Donation beg -> title */ "Support open-source indie software" = "Поддержите незавиÑимую программу Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ иÑходным кодом"; /* File size - terabytes */ "TB" = "ТБ"; /* Transfer speed (terabytes per second) */ "TB/s" = "ТБ/Ñ"; /* Create torrent -> directory doesn't exist warning -> title */ "The chosen torrent file location does not exist." = "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð´Ð»Ñ Ñ‚Ð¾Ñ€Ñ€ÐµÐ½Ñ‚-файла папка отÑутÑтвует."; /* Add torrent -> same name -> title */ "The destination directory and root data directory have the same name." = "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð¸ ÐºÐ¾Ñ€Ð½ÐµÐ²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ¸ имеют одно и то же имÑ."; /* Create torrent -> directory doesn't exist warning -> warning */ "The directory \"%@\" does not currently exist. Create this directory or choose a different one to create the torrent file." = "Папка «%@» не ÑущеÑтвует. Создайте папку или выберете другую чтобы Ñоздать торрент-файл."; /* Open duplicate magnet alert -> message */ "The magnet link \"%@\" cannot be added because it is a duplicate of an already existing transfer." = "Magnet-ÑÑылка «%@» не может быть добавлена, так как ÑвлÑетÑÑ ÐºÐ¾Ð¿Ð¸ÐµÐ¹ уже ÑущеÑтвующей раздачи."; /* Move error alert -> message Move inside itself alert -> message */ "The move operation of \"%@\" cannot be done." = "Ðе могу перемеÑтить «%@»."; /* blocklist fail message */ "The specified blocklist file did not contain any valid rules." = "Ðе могу найти правила в черном ÑпиÑке."; /* Torrent download failed -> message */ "The torrent could not be downloaded from %@: %@." = "Торрент не может быть Ñкачан из %1$@: %2$@."; /* Torrent file copy alert -> message */ "The torrent file (%@) cannot be found." = "Торрент-файл (%@) не найден."; /* Open invalid alert -> message */ "The torrent file cannot be opened because it contains invalid data." = "Торрент-файл не может быть открыт, так как Ñодержит неверные данные."; /* Create torrent -> zero size -> title */ "The total file size is zero bytes." = "Общий размер файла 0 Б."; /* Open duplicate alert -> message */ "The transfer cannot be added because it is a duplicate of an already existing transfer." = "Раздача не может быть добавлена, так как ÑвлÑетÑÑ ÐºÐ¾Ð¿Ð¸ÐµÐ¹ уже ÑущеÑтвующей."; /* Torrent disk space alert -> message */ "The transfer will be paused. Clear up space on %@ or deselect files in the torrent inspector to continue." = "Передача будет приоÑтановлена. ОÑвободите меÑто на диÑке %@ или отмените Ñкачивание неÑкольких файлов в ИнÑпекторе."; /* Create torrent -> blank address -> message */ "The transfer will not contact trackers for peers, and will have to rely solely on non-tracker peer discovery methods such as PEX and DHT to download and seed." = "Раздача не будет обмениватьÑÑ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ о пользователÑÑ… Ñ Ñ‚Ñ€ÐµÐºÐµÑ€Ð¾Ð¼, Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÑŽ ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸ раздачи через DHT и PEX."; /* Removal confirm panel -> message part 1 */ "There are %@ active transfers." = "%@ активных раздач."; /* Removal confirm panel -> message part 1 */ "There are %@ transfers (%@ active)." = "%1$@ раздач (%2$@ из них активны)."; /* Confirm Quit panel -> message */ "There are %d active transfers that will be paused on quit. The transfers will automatically resume on the next launch." = "%d активных раздач будут приоÑтановлены. При Ñледующем запуÑке они будут автоматичеÑки возобновлены."; /* Create torrent -> blank address -> title */ "There are no tracker addresses." = "Ðет адреÑа трекеров."; /* Transmission already running alert -> message */ "There is already a copy of Transmission running. This copy cannot be opened until that instance is quit." = "Transmission уже запущена. ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð½Ðµ может быть запущена, пока не будет завершена ÑущеÑтвующаÑ."; /* Confirm Quit panel -> message */ "There is an active transfer that will be paused on quit. The transfer will automatically resume on the next launch." = "ÐÐºÑ‚Ð¸Ð²Ð½Ð°Ñ Ñ€Ð°Ð·Ð´Ð°Ñ‡Ð° будет приоÑтановлена. При Ñледующем запуÑке она будет автоматичеÑки возобновлена."; /* Create torrent -> no files -> warning */ "There must be at least one file in a folder to create a torrent file." = "Ð”Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ñ€Ñ€ÐµÐ½Ñ‚-файла в папке должен быть Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один файл."; /* Save log alert panel -> message */ "There was a problem creating the file \"%@\"." = "Ошибка во Ð²Ñ€ÐµÐ¼Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Â«%@»."; /* Move error alert -> title */ "There was an error moving the data file." = "При перемещении данных произошла ошибка."; /* Magnet link failed -> message */ "There was an error when adding the magnet link \"%@\". The transfer will not occur." = "Возникла ошибка при добавлении magnet-ÑÑылки «%@». Раздача не будет начата."; /* Create torrent -> no files -> title */ "This folder contains no files." = "Эта папка не Ñодержит файлов."; /* Removal confirm panel -> message */ "This transfer is active. Once removed, continuing the transfer will require the torrent file or magnet link." = "Раздача активна. Ð”Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ð¾Ð¹ раздачи потребуетÑÑ Ð¾Ñ€Ð¸Ð³Ð¸Ð½Ð°Ð»ÑŒÐ½Ñ‹Ð¹ торрент-файл или magnet-ÑÑылка."; /* Stats reset -> message */ "This will clear the global statistics displayed by Transmission. Individual transfer statistics will not be affected." = "ÐžÐ±Ñ‰Ð°Ñ ÑтатиÑтика Transmission будет Ñброшена. СтатиÑтика индивидуальных раздач ÑохранитÑÑ."; /* Inspector -> tracker table */ "Tier %d" = "%d уровень"; /* Filter toolbar item -> palette label */ "Toggle Filter" = "Показать/Ñкрыть фильтр"; /* Inspector toolbar item -> palette label */ "Toggle Inspector" = "Показать/Ñкрыть ИÑпектор"; /* Filter toolbar item -> tooltip */ "Toggle the filter bar" = "Показать/Ñкрыть панель фильтра"; /* Inspector toolbar item -> tooltip */ "Toggle the torrent inspector" = "Показать/Ñкрыть ИнÑпектор торрента"; /* Download not a torrent -> title Torrent download error -> title */ "Torrent download failed" = "Ошибка при Ñкачивании торрента"; /* Growl notification title */ "Torrent File Auto Added" = "Торрент-файл добавлен"; /* Inspector -> title */ "Torrent Inspector" = "ИнÑпектор торрента"; /* Torrent -> progress string */ "torrent metadata needed" = "получение метаданных торрента"; /* stats total */ "Total N/A" = "Ðет данных"; /* Status Bar -> status menu */ "Total Ratio" = "Рейтинг за вÑе времÑ"; /* Status Bar -> status menu */ "Total Transfer" = "Роздано за вÑе времÑ"; /* Filter Bar -> filter menu */ "Tracker" = "Трекер"; /* Torrent -> status string */ "Tracker returned error" = "Трекер Ñообщил об ошибке"; /* Torrent -> status string */ "Tracker returned warning" = "Трекер Ð²Ñ‹Ð½ÐµÑ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ðµ"; /* Tracker next announce */ "Tracker will be used as a backup" = "Резервный трекер"; /* Inspector -> tab Inspector view -> title */ "Trackers" = "Трекеры "; /* Inspector -> Peers tab -> peers */ "Transfer Not Active" = "Раздача неактивна"; /* Preferences -> toolbar item title */ "Transfers" = "Раздачи"; /* Inspector -> Peers tab -> peers */ "Transfers Not Active" = "Раздачи неактивны"; /* Legal alert -> message */ "Transmission is a file-sharing program. When you run a torrent, its data will be made available to others by means of upload. You and you alone are fully responsible for exercising proper judgement and abiding by your local laws." = "Transmission — программа Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° файлами. Когда ты запуÑкаешь раздачу, ее данные ÑтановÑÑ‚ÑÑ Ð´Ð¾Ñтупны Ð´Ð»Ñ ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸. ЕÑтеÑтвенно, ответÑтвенноÑть по выбору данных Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° лежит на тебе."; /* Donation beg -> message */ "Transmission is a full-featured torrent application. A lot of time and effort have gone into development, coding, and refinement. If you enjoy using it, please consider showing your love with a donation." = "Transmission — полнофункциональный торрент-клиент. Много времени и Ñил ушло на разработку, напиÑание кода и оптимизацию. ЕÑли вам нравитÑÑ Ñта программа, можете показать Ñвою любовь, Ñделав пожертвование."; /* Transmission already running alert -> title */ "Transmission is already running." = "Transmission уже запущен."; /* inspector -> peer table -> header status bar -> status label Torrent -> status string */ "UL" = "Р"; /* Inspector -> Peers tab -> peers */ "UL to %d" = "раздаю к %d"; /* File Outline -> Menu */ "Uncheck Selected" = "СнÑть выбор"; /* Status Bar -> speed tooltip */ "unlimited" = "Ðеограниченно"; /* Torrent -> error string unreadable */ "unreadable error" = "Ð½ÐµÐ¾Ð¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"; /* Save log panel -> default file name */ "untitled" = "Ðовый"; /* Torrent table -> group row -> tooltip */ "Upload speed" = "СкороÑть раздачи"; /* Stats window -> label */ "Uploaded" = "Роздано"; /* Torrent -> progress string */ "uploaded %@ (Ratio: %@)" = "роздано %1$@ (рейтинг: %2$@)"; /* inspector -> peer table -> header tool tip */ "Uploading To Peer" = "Раздаю к пользователю"; /* Torrent -> status string */ "Waiting to check existing data" = "Ожидаю проверки ÑущеÑтвующих данных"; /* Torrent -> status string */ "Waiting to download" = "Ожидаю ÑкачиваниÑ"; /* Torrent -> status string */ "Waiting to seed" = "Ожидаю раздачи"; /* Drag overlay -> url */ "Web Address" = "URL"; /* Torrent -> status string */ "web seed" = "Ñайт раздачи"; /* inspector -> web seed table -> header */ "Web Seeds" = "Cайты раздачи"; /* Legal alert -> title */ "Welcome to Transmission" = "Добро пожаловать в Transmission"; /* Groups -> Name */ "Yellow" = "ЖелтаÑ"; /* Inspector -> peer -> status */ "You unchoked the peer, but the peer is not interested" = "Пользователь не заинтереÑован в имеющихÑÑ Ñƒ Ð²Ð°Ñ Ñ‡Ð°ÑÑ‚ÑÑ… торрента"; /* Inspector -> peer -> status */ "You want to download, but peer does not want to send (interested and choked)" = "Ð’Ñ‹ заинтереÑованы в имеющихÑÑ Ñƒ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ‡Ð°ÑÑ‚ÑÑ… торрента, но он Ð²Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€ÑƒÐµÑ‚";transmission-2.92/macosx/ru.lproj/PaxHeaders.4960/InfoOptionsView.xib0000644000000000000000000000013212664476420022544 xustar0030 mtime=1456635152.266501161 30 atime=1456635152.266501161 30 ctime=1457295922.855856468 transmission-2.92/macosx/ru.lproj/InfoOptionsView.xib0000644000175000017500000012223012664476420024171 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/ru.lproj/PaxHeaders.4960/InfoActivityView.xib0000644000000000000000000000013212664476420022705 xustar0030 mtime=1456635152.266501161 30 atime=1456635152.266501161 30 ctime=1457295922.855856468 transmission-2.92/macosx/ru.lproj/InfoActivityView.xib0000644000175000017500000013020512664476420024333 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/ru.lproj/PaxHeaders.4960/InfoGeneralView.xib0000644000000000000000000000013212664476420022466 xustar0030 mtime=1456635152.267501178 30 atime=1456635152.267501178 30 ctime=1457295922.855856468 transmission-2.92/macosx/ru.lproj/InfoGeneralView.xib0000644000175000017500000006317212664476420024124 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/ru.lproj/PaxHeaders.4960/AddMagnetWindow.xib0000644000000000000000000000013212662757243022461 xustar0030 mtime=1456201379.276862246 30 atime=1456201379.276862246 30 ctime=1457295922.855856468 transmission-2.92/macosx/ru.lproj/AddMagnetWindow.xib0000644000175000017500000006555112662757243024122 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/ru.lproj/PaxHeaders.4960/MainMenu.xib0000644000000000000000000000013212644245522021146 xustar0030 mtime=1452362578.822700273 30 atime=1452362578.822700273 30 ctime=1457295922.855856468 transmission-2.92/macosx/ru.lproj/MainMenu.xib0000644000175000017500000023466612644245522022614 0ustar00mikedldmikedld00000000000000 CA CA YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7NjIsIDYyfdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPESDITU0AKgAAB0KAOuBP8AQW DQeEQmFQuGQ2HQ+IRGJROKRWKMeMAAhRsAPuPRR/yGGAWSABfycADmVQiBOuCRaYTGZTOaTWbQpjTkAE aeR2PzcASQCgBdUUADqkSyB0CmU2nU+oQhi1MAEqrAB+VmmASuABbV8ADuxUqXVGzWe0WmFsS2AAmW8A P25UwB3UALS8AAeXuyS+1X/AYGaMLCAAoYcAP7FUwBY0ALDIAAfZO+4LLZfMQ1g5sAFPPACQ36bAHSAB W6cAD/VZXM63XYJgbEAFTaaCRUDSAEAKzeAAgb/Wa/hcOobFgbPa2feKzfcCDy3RcTpdOZM7rAB09kAP juAB698APnxYnFwfGgIAAf1AAF+0AAj4AAL/MADL7cHqfn9fuHdD+P/AD/v9AMCP4bEDgAekFJqGkGpj AcCwi6ZmQoAAXwumK2GIAAGw6AEGhoikIQlEjXmXE4ABjFTtu6iacmMqqrowY4ABrGyIRHEsdMvE5lgA GcgPC8cXJ0J8jRYfAARnGsboXHMdygv8eyYGshHyiipmK5AqAAfUvSRJSMxtKrnqXKMzr+ZU1JSlbxSu icNAAb05oQrgCAAFE8gAG0+PxNE/qgZFBMkykvH0ik3O88CDqEABq0eAAcUlP1AUqoElo2ISfH2kDboV RqTl/Ngc0pS1TJnF6dp6j1OKBRqil0o6kzKstT1smksxiJSsK0oE7K8sCxB3Utb2KiM4reJi4rmoC6gG u68r2HliWNaqGMIYTDMQxR/MYxzIFhQgfWpa1yoOzZgs6z7QqY3LTNQ1Qf3Jc1zONLbbOiml3OW5ogXn elrXs2kuOU3rf39Wl84BgDrGc7DtO5JLvnrKzyW68zHPUA72Pc+AEPk+j7Blf+F5KzMn5NlLXZRlVjQO bEEwWmkQQfM2W3NChmQtDCYTjDoGw/ByJ5Zm9bSnFQYzBIkYKtXclzHHGbaLaspyAGeK6WAEjCfMGnya hWianS0p6hRKJ1zgcuy/iMwxpqGE7Fa01GVUesIlOM5m9OquzyFE9z7uG42NQRkXFtVDonROJoRRtHmr SNJ8DwVb0wjlWU7hSC1AlCVVJyXJ1PVKeCNTamVeoykB1knQR1XOm14fitq6r5bLCsfP9ZStkLguR+ro uy8FovS+dx3M/2xbQoYtbz0XBw3i+N6Oa1r6Xq+nzPrey/upe17vt+pcxk/EAAb/Ky52fRRWKPaBYAAp 99jbDW3CcgHC0Gb/AAF5/b0vWIr/wAC7gExUIkBUfpBL/AIXYAH6KNIm5dST9n5E1DvBUACzgACGg0Zd 8QyXyPmKeLGEQABzwlAAFKFDIALgAPO8s7I6QACuhkAADMNWtJHKeL2HQABrQ9AABqIEFy7ETd6AAc0R wAQTJoKGJhCAvxPMu/SCJTH8DNAANGLAAAwRbAALWLwAB2xhi1FyJgoQAASjQAAJcawACgjczsF8B2rl AEXHUAAY48AAHFHuFhjoWwYiKtx5YHpCRJe4U5fi7AqyLiioOKZQBKyRAAFiSgAHkDwkxD+IIR5OAAFz J+I0SAIyjAAD2UwABTypAAGyVhTBPSvTwnocEs4Pg3Wg8KFsglkgAg6AAEEv5DPgJgIGYgAAGTHAAr8F cy3ljXmc7AAA8ppAAmIIFQMjnIkzjCO0AEIhYgACvOEAAq5yAAAtOcAACp1L9JMShxb6B2AAkWFUAAqZ 7Q3a4BOfRNY3CgAADCgEV4smTXHDUDKy3fQtHRQuSxhULxxiUQ6foAAHUVPefEBNGSED2o46WTA8Ixhg mu4WR5MxyUnl4+NPgNgARVmNMiioDm/0slmOAADOV8KydU/R8stgOU/JqKKoQAAXVFAANypAAKMgJABK MCIAF0GpNWO+qgAB71XAACSrUwXsESnUAohgr6xAAXcYd5RC6OD2KhL2npNaPgArEK+cE4hcV1qbKSF8 sW/NWAAOOvxRCjTzAAKqwgAAo2HAABCxRNRS2NAACyyAABu2TsTYtn8PIfAqs1NGaY8bPAABHaGrhZxb 2lrIaUJFqYOPjravo0tjRS1SXlHscQAB523mSV2vw46XgMAAE24EYIxSCqiFu41OSaWwsfZGyY3Za0Uo tIAuc0h5NtAACW7FoyzWEFUQgK135G0kmyTa5oAF7RPC/TdCteYMEtAABi+AAAg3zABcpg9oLRFAuVZo FUJITAnwBN2EcGCsuxCdgcAA28FQ0htREmVX6N0dMtFK8ZNVf1Rh6Naw1iH3gUABZ4eIAAH4jmCY8yN/ LZTQKBPYVJGiOULHRVarFTohLPiLVQd9SqNXwAxdpemFH7FPANkOzGGodC9cPXep+OAAZDAMACAoRAAA pypkkp4n8sMxHpk3IkLSJyCUNj58NrIQFmV+o2t7i32WVAg6XApaMIFncINm0IIwTPetcbpdy7F2LFD5 n8Qwb9BB5zxoUhFRQXAxEJosSDnVx6G0gC3SQMLDhRCw00KGdQT6QeMQEAAPAQAAAwAAAAEAPgAAAQEA AwAAAAEAPgAAAQIAAwAAAAQAAAf8AQMAAwAAAAEABQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIA AwAAAAEAAQAAARUAAwAAAAEABAAAARYAAwAAAAEAPgAAARcABAAAAAEAAAc6ARwAAwAAAAEAAQAAAT0A AwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAQAAAgEh3MABwAAGLwAAAgMAAAAAAAIAAgACAAIAAEA AQABAAEAABi8YXBwbAIQAABtbnRyUkdCIFhZWiAH3gACABkAFQAvAAhhY3NwQVBQTAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAABFkZXNjAAABUAAAAGJkc2NtAAABtAAAAcBjcHJ0AAADdAAAACN3dHB0AAAD mAAAABRyWFlaAAADrAAAABRnWFlaAAADwAAAABRiWFlaAAAD1AAAABRyVFJDAAAD6AAACAxhYXJnAAAL 9AAAACB2Y2d0AAAMFAAABhJuZGluAAASKAAABj5jaGFkAAAYaAAAACxtbW9kAAAYlAAAAChiVFJDAAAD 6AAACAxnVFJDAAAD6AAACAxhYWJnAAAL9AAAACBhYWdnAAAL9AAAACBkZXNjAAAAAAAAAAhEaXNwbGF5 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAAAAAhAAAADGhySFIAAAAkAAABnGtvS1IAAAAkAAAB nG5iTk8AAAAkAAABnGlkAAAAAAAkAAABnGh1SFUAAAAkAAABnGNzQ1oAAAAkAAABnGRhREsAAAAkAAAB nHVrVUEAAAAkAAABnGFyAAAAAAAkAAABnGl0SVQAAAAkAAABnHJvUk8AAAAkAAABnG5sTkwAAAAkAAAB nGhlSUwAAAAkAAABnGVzRVMAAAAkAAABnGZpRkkAAAAkAAABnHpoVFcAAAAkAAABnHZpVk4AAAAkAAAB nHNrU0sAAAAkAAABnHpoQ04AAAAkAAABnHJ1UlUAAAAkAAABnGZyRlIAAAAkAAABnG1zAAAAAAAkAAAB nGNhRVMAAAAkAAABnHRoVEgAAAAkAAABnGRlREUAAAAkAAABnGVuVVMAAAAkAAABnHB0QlIAAAAkAAAB nHBsUEwAAAAkAAABnGVsR1IAAAAkAAABnHN2U0UAAAAkAAABnHRyVFIAAAAkAAABnGphSlAAAAAkAAAB nHB0UFQAAAAkAAABnABMAEUARAAgAEMAaQBuAGUAbQBhACAARABpAHMAcABsAGEAeXRleHQAAAAAQ29w eXJpZ2h0IEFwcGxlIEluYy4sIDIwMTQAAFhZWiAAAAAAAADzUgABAAAAARbPWFlaIAAAAAAAAHF0AAA6 OQAAAp1YWVogAAAAAAAAYSsAALosAAAUrFhZWiAAAAAAAAAkNgAAC5sAALvjY3VydgAAAAAAAAQAAAAA BQAKAA8AFAAZAB4AIwAoAC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUA mgCfAKMAqACtALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgB PgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0C JgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08D WgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME 4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8G wAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI +wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4AL mAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8O mw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegS BxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V 4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e 6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/Ak HyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p 0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv /jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2 rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE9 4D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVF mkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN 3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxW qVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7Ng BWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp 8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0 cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/ hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqL MIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqX dZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+ak VqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/ 9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbO ts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3Zbe HN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7Zzu KO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+ 3P9t//9wYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKDnZjZ3QAAAAAAAAAAAADAQAAAgAAAFYB LgHrAp0DXgQpBQcF8QbpB9cI3wnhCvcMBQ0mDksPdBCgEdcTCxQ+FXoWrxfnGSoaYRuXHM8eBR81IGUh jiKyI9Ik7iYCJw4oDykLKgIq+SvtLOEt0y7DL7UwpDGQMn0zajRWNUA2KjcTN/w45TnMOrQ7nDyDPWo+ Uj8+QCxBH0IWQxBECUUERf1G90fwSOhJ4ErYS85MxU28TrNPrVCqUalSqlOtVK9VsVazV7NYtFm0WrNb slyxXa9er1+yYLhhwWLMY9lk5mX0Zv9oC2kWaiJrK2w1bT9uSW9VcGVxd3KNc6Z0v3XYdvF4CXkgejd7 TnxjfXh+in+XgKCBoYKfg5iEj4WGhnuHcYhmiVqKTotBjDWNKI4cjxKQC5EJkguTEJQYlSGWK5c0mD2Z RZpNm1WcW51jnmufdKCAoZCioaO1pMql36b0qAipHKovq0KsVa1nrniviLCWsaKyq7OztLq1v7bFt8m4 zbnRutW72Lzbvd++5L/rwPXCA8MVxCjFPMZQx2PId8mKypzLr8zBzdHO4M/t0PXR+tL80/vU+NX11vHX 7djo2ePa3tvY3NLdzd7I38XgxuHK4tLj3eTp5fXnAegM6RjqI+su7DntQ+5J70vwRPEy8hfy8vPH9Jn1 a/Y89w733/iv+YD6Ufsh+/H8wf2R/mD/MP//AAAAVgEuAesCnQNeBC4FIAXzBukH6gjiCfELCgwlDUUO aA+PEMIR8xMtFF8VmRbUGA0ZTRqFG8Ac9h4rH18gjCG0ItYj9CUPJhwnJighKRgqCyr4K+Iszi26LqMv jDB2MWAySTMwNBc0/TXkNso3rziUOXo6XjtCPCY9CD3rPtE/uECjQZFCgkN3RGxFYkZWR0tIPkkxSiNL FUwHTPhN6k7cT9FQyFHCUr5Tu1S4VbVWsFerWKZZoVqaW5RcjV2HXoJff2B/YYJiimOTZJxlp2awZ7ho wGnIas9r1WzcbeRu7G/4cQZyF3MsdEJ1WHZud4N4l3mser970nzkffV/AoAKgQ6CDIMGg/6E9IXpht2H 0YjFibiKq4uejJCNgo53j22QZ5FnkmqTcpR6lYOWi5eTmJuZopqpm7CctZ28nsKfy6DWoeSi9aQGpRim Kqc8qE6pX6pwq4CskK2grq+vvbDKsdWy37PotPC1+Lb/uAa5DboUuxq8IL0mviy/M8A9wUrCWcNsxH/F k8anx7rIzcngyvLMBM0WzibPNdBC0UzSU9NX1FrVXNZe11/YYNlg2mHbYdxh3WHeYd9j4GjhcOJ844rk muWr5rvnzOjd6e3q/OwM7RruJu8u8C/xJ/IX8v/z4fTB9aD2fvdc+Dr5GPn2+tP7sPyN/Wr+Rv8j//8A AABWAS4B6wKdA14EKQUHBfEG6QfXCN8J4Qr3DAUNJg5LD3QQoBHOEwoUPBVzFq8X7xkqGmMbmxzUHg0f PCBrIZciviPiJP4mESchKCopKSonKyEsGi0QLgkvAC/zMOcx2DLIM7Y0pjWVNoM3cThdOUs6NzsjPA48 +D3jPtA/wECzQahCoEObRJVFjkaHR4BIeElwSmdLXkxUTUlOPk82UC9RKVImUyRUIlUhVh9XHFgZWRZa ElsMXAddAV39Xvlf92D4YftjAmQIZQ9mFmccaCFpJmoqay9sMm01bjlvP3BHcVFyX3NwdIB1kXahd7F4 wHnPet1763z4fgJ/CoAMgQmCAYL0g+SE1IXChq+HnYiKiXWKYYtNjDiNI44Pjv2P7ZDikdyS2JPXlNiV 2ZbYl9iY15nWmtSb05zRnc+ezZ/OoNGh1qLdo+ak8KX6pwSoDakVqh6rJqwurTSuOq8/sEOxRLJFs0S0 QrVAtj23Org3uTO6L7srvCa9Ir4evxvAG8EewiTDLcQ3xULGTcdXyGLJbMp2y3/MiM2RzpjPntCh0aLS oNOc1JfVkdaL14TYfdl32m/baNxg3VneU99Q4FHhV+Ji43HkguWV5qjnu+jN6eDq8uwE7RTuJO8y8D3x RPJG80b0Q/U/9jv3Nvgx+Sv6Jvsg/Bn9E/4N/wb//wAAbmRpbgAAAAAAAAY2AACk0AAAVYcAAEyRAACe OwAAJgoAAAwOAABQDQAAVDkAAkKPAAIzMwACMKMAAwEAAAIAAAABAAQACQAQABgAIQArADcAQwBRAF8A bwB/AJAAogC1AMkA3QDzAQoBIQE6AVQBbwGKAacBxgHlAgYCKAJMAnECmALBAuwDGQNIA3oDrwPoBCQE YwSkBOgFLgV3BcIGDwZgBrMHCAdgB7sIGAh4CNoJPwmnChEKfgrtC18L0QxEDLcNKg2eDhUOjQ8ID4UQ BRCHEQwRkxIdEqkTNxPHFFcU5xV5FgsWoBc3F9AYbBkKGasaThr0G5wcRxzzHaAeTR76H6cgVSEFIbYi aiMhI9oklSVSJhMm1SeaKGApJyntKrMreSw/LQYtzy6bL2gwODELMd8ytjOQNGw1TDYyNx44EzkOOhA7 FzwhPS8+Pz9TQGpBhEKhQ8FE40YHRypIS0lpSoVLoEy7TdhO91AZUT1SZVOPVLtV61ccWE9Zglq0W+Vd Fl5GX3dgq2HgYxlkU2WRZtFoE2lYaqBr7G07bo5v53FFcqd0DXV3duR4VHnHez18tn4yf7CBMYKyhDOF sYctiKaKHouYjROOkZARkZSTGpSili2Xu5lNmuOcf54jn9ChhaNBpQOmyaiSql+sMK4Dr9qxtLORtXG3 Ubkwuwu84r61wIbCWMQsxgLH28m2y5XNds9a0ULTMNUo1zLZVduY3fvgduL85YfoF+qs7Ubv5PKH9S/3 3PqO/UT//wAAAAEABAAJABAAFwAhACsANgBDAFAAXgBtAH0AjgCgALMAxgDbAPABBwEeATcBUAFrAYYB owHBAeACAQIjAkYCawKSArsC5gMTA0IDdQOqA+QEIQRhBKUE7AU0BX8FzQYdBm8GxAccB3YH0wgyCJQI +QlgCcoKNwqmCxkLjQwDDHoM8Q1pDeEOWw7XD1YP1xBbEOIRaxH3EoUTFhOpFD4U0xVpFf8WlxcxF80Y bBkOGbIaWBsCG64cXB0NHb8ech8lH9ggiiE9IfIiqCNhJB0k2yWbJl4nJCfrKLUpgCpMKxcr4yyuLXku Ri8UL+UwuDGOMmUzQDQcNPs13TbDN684oTmaOps7ojyuPb0+0D/mQP9CG0M6RFxFgUapR9FI+UoeSz9M X019Tp1PvlDiUglTMlReVY1WvlfzWSlaYlubXNNeCl9BYHhhsWLrZChlZ2apZ+1pNGp+a8ptGW5rb8Bx GXJ2c9d1PHakeA95fXrufGF92H9RgM2CTIPNhVCG0ohSidGLTozKjkiPx5FJks6UVZXel2uY+pqMnCGd u59ZoP6iq6Rephen1KmVq1qtIa7ssLmyirRetjS4Dbnnu7+9lL9lwTTDAMTNxpzIbcpAzBfN8M/M0avT jtV212fZZ9t63aff6+JB5KLnCul16+XuWvDS80/10PhW+t/9bf//AAAAAQAEAAkAEAAYACEAKwA3AEMA UQBfAG8AfwCQAKIAtQDJAN4A8wEKASIBOgFUAW4BigGnAcUB5QIFAicCSwJwApcCvwLqAxYDRQN3A6sD 4gQdBFoEmgTcBSEFZwWwBfwGSgabBu8HRQedB/gIVQi1CRcJfAnjCk0KugsoC5gMCAx6DOwNXw3UDkwO xg9CD8EQQhDGEUwR1RJhEu8TfhQOFKAVMhXGFlwW9BePGCwYzBluGhMauxtlHBIcwB1wHiAe0B+BIDIg 5iGbIlMjDiPLJIslTSYRJtknoihtKTkqBSrRK50saS03Lgcu2S+uMIUxXjI6Mxkz+jTeNcc2tTerOKg5 rjq7O8w84T36PxZANUFYQn5Dp0TTRgNHM0hjSZBKukviTQlOMU9aUIdRt1LpVB5VV1aSV9BZEFpTW5Zc 2F4aX1tgnGHeYyNkamW0ZwFoUGmiavdsT22rbwpwbXHVc0J0snYnd6B5HHqbfBx9on8qgLWCQ4PUhWiG /IiQiiGLsI09jsmQVpHmk3iVDJakmD6Z25t7nR6exKBvoh+j1qWVp1qpJar1rMiun7B5sle0N7YbuAK5 7LvXvcG/p8GGw1/FMccByNDKoMxyzkfQH9H509bVttea2YHbbt1i31/hZ+N55ZPns+nY7ADuK/Ba8oz0 wvb7+Tf7dv25//8AAHNmMzIAAAAAAAEMQgAABd7///MmAAAHkgAA/ZH///ui///9owAAA9wAAMBsbW1v ZAAAAAAAAAYQAACSJgL3DivJAi9IAAAAAAAAAAAAAAAAAAAAANIlJicoWiRjbGFzc25hbWVYJGNsYXNz ZXNfEBBOU0JpdG1hcEltYWdlUmVwoycpKlpOU0ltYWdlUmVwWE5TT2JqZWN00iUmLC1XTlNBcnJheaIs KtIlJi8wXk5TTXV0YWJsZUFycmF5oy8sKtMyMwo0NTZXTlNXaGl0ZVxOU0NvbG9yU3BhY2VEMCAwABAD gAzSJSY4OVdOU0NvbG9yojgq0iUmOzxXTlNJbWFnZaI7Kl8QD05TS2V5ZWRBcmNoaXZlctE/QFRyb290 gAEACAARABoAIwAtADIANwBGAEwAVwBeAGUAcgB5AIEAgwCFAIoAjACOAJcAnACnAKkAqwCtALIAtQC3 ALkAuwC9AMIA2QDbAN0hqSGuIbkhwiHVIdkh5CHtIfIh+iH9IgIiESIVIhwiJCIxIjYiOCI6Ij8iRyJK Ik8iVyJaImwibyJ0AAAAAAAAAgEAAAAAAAAAQQAAAAAAAAAAAAAAAAAAInY transmission-2.92/macosx/ru.lproj/PaxHeaders.4960/GroupRules.xib0000644000000000000000000000013212666747213021554 xustar0030 mtime=1457245835.322998766 30 atime=1457245835.322998766 30 ctime=1457295922.855856468 transmission-2.92/macosx/ru.lproj/GroupRules.xib0000644000175000017500000004210412666747213023202 0ustar00mikedldmikedld00000000000000 name comment name comment fFlatFileList.name allTrackersFlat fFlatFileList.name allTrackersFlat transmission-2.92/macosx/ru.lproj/PaxHeaders.4960/AddWindow.xib0000644000000000000000000000013212640354045021312 xustar0030 mtime=1451350053.579169997 30 atime=1451350053.579169997 30 ctime=1457295922.855856468 transmission-2.92/macosx/ru.lproj/AddWindow.xib0000644000175000017500000007326612640354045022755 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/ru.lproj/PaxHeaders.4960/GlobalOptionsPopover.xib0000644000000000000000000000013212640354045023561 xustar0030 mtime=1451350053.575169928 30 atime=1451350053.575169928 30 ctime=1457295922.853856434 transmission-2.92/macosx/ru.lproj/GlobalOptionsPopover.xib0000644000175000017500000006413712640354045025221 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/da.lproj0000644000000000000000000000013212666747213016622 xustar0030 mtime=1457245835.374999661 30 atime=1418239396.116791287 30 ctime=1457295922.676853424 transmission-2.92/macosx/da.lproj/0000755000175000017500000000000012666747213020324 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/da.lproj/PaxHeaders.4960/InfoPlist.strings0000644000000000000000000000013212664476420022216 xustar0030 mtime=1456635152.154499237 30 atime=1456635152.154499237 30 ctime=1457295922.675853407 transmission-2.92/macosx/da.lproj/InfoPlist.strings0000644000175000017500000000017312664476420023644 0ustar00mikedldmikedld00000000000000/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = "Copyright © 2005-2016 The Transmission Project"; transmission-2.92/macosx/da.lproj/PaxHeaders.4960/Creator.xib0000644000000000000000000000013212640354045020767 xustar0030 mtime=1451350053.199163397 30 atime=1451350053.199163397 30 ctime=1457295922.676853424 transmission-2.92/macosx/da.lproj/Creator.xib0000644000175000017500000006011712640354045022421 0ustar00mikedldmikedld00000000000000 File File transmission-2.92/macosx/da.lproj/PaxHeaders.4960/PrefsWindow.xib0000644000000000000000000000013112640354045021636 xustar0029 mtime=1451350053.19816338 30 atime=1451350053.197163362 30 ctime=1457295922.676853424 transmission-2.92/macosx/da.lproj/PrefsWindow.xib0000644000175000017500000057045012640354045023277 0ustar00mikedldmikedld00000000000000 ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer NSAllRomanInputSourcesLocaleIdentifier NSAllRomanInputSourcesLocaleIdentifier YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7MTgsIDE4fdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPESRuTU0AKgAAFEgAAAAABgYG BioqKio7Ozs7fX19fZKSkpLOzs7O3Nzc3Pv7+/v///////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////8GBgYGDg4ODjo6OjpMTExMjIyMjJ+fn5/T09PT4ODg4Pv7+/v///////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////8rKysrOzs7O5+fn5+4uLi46Ojo 6PLy8vL6+vr6+/v7+/////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////87Ozs7TU1NTba2trbOzs7O+fn5+f////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////98fHx8jIyMjOjo6Oj4+Pj4//////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////+RkZGRnp6e nvLy8vL///////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////Ozs7O1NTU1Pn5+fn///////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////d3d3d4eHh4fv7+/v///////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////7+/v7+/v7+/////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////8AEQEAAAMAAAABACQAAAEBAAMAAAABACQAAAECAAMAAAAEAAAVKgEDAAMA AAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAESAAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMA AAABACQAAAEXAAQAAAABAAAUQAEaAAUAAAABAAAVGgEbAAUAAAABAAAVIgEcAAMAAAABAAEAAAEoAAMA AAABAAIAAAFSAAMAAAABAAEAAAFTAAMAAAAEAAAVModzAAcAAA80AAAVOgAAAAAAAACQAAAAAQAAAJAA AAABAAgACAAIAAgAAQABAAEAAQAADzRhcHBsAhAAAG1udHJSR0IgWFlaIAffAAwABQANABIACGFjc3BB UFBMAAAAAEFQUEwAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWRlc2MAAAFQAAAAYmRzY20AAAG0AAAEGmNwcnQA AAXQAAAAI3d0cHQAAAX0AAAAFHJYWVoAAAYIAAAAFGdYWVoAAAYcAAAAFGJYWVoAAAYwAAAAFHJUUkMA AAZEAAAIDGFhcmcAAA5QAAAAIHZjZ3QAAA5wAAAAMG5kaW4AAA6gAAAAPmNoYWQAAA7gAAAALG1tb2QA AA8MAAAAKGJUUkMAAAZEAAAIDGdUUkMAAAZEAAAIDGFhYmcAAA5QAAAAIGFhZ2cAAA5QAAAAIGRlc2MA AAAAAAAACERpc3BsYXkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAACIAAAAMaHJIUgAAABQA AAGoa29LUgAAAAwAAAG8bmJOTwAAABIAAAHIaWQAAAAAABIAAAHaaHVIVQAAABQAAAHsY3NDWgAAABYA AAIAZGFESwAAABwAAAIWdWtVQQAAABwAAAIyYXIAAAAAABQAAAJOaXRJVAAAABQAAAJicm9STwAAABIA AAJ2bmxOTAAAABYAAAKIaGVJTAAAABYAAAKeZXNFUwAAABIAAAJ2ZmlGSQAAABAAAAK0emhUVwAAAAwA AALEdmlWTgAAAA4AAALQc2tTSwAAABYAAALeemhDTgAAAAwAAALEcnVSVQAAACQAAAL0ZnJGUgAAABYA AAMYbXMAAAAAABIAAAMuY2FFUwAAABgAAANAdGhUSAAAAAwAAANYZXNYTAAAABIAAAJ2ZGVERQAAABAA AANkZW5VUwAAABIAAAN0cHRCUgAAABgAAAOGcGxQTAAAABIAAAOeZWxHUgAAACIAAAOwc3ZTRQAAABAA AAPSdHJUUgAAABQAAAPiamFKUAAAAA4AAAP2cHRQVAAAABYAAAQEAEwAQwBEACAAdQAgAGIAbwBqAGnO 7LfsACAATABDAEQARgBhAHIAZwBlAC0ATABDAEQATABDAEQAIABXAGEAcgBuAGEAUwB6AO0AbgBlAHMA IABMAEMARABCAGEAcgBlAHYAbgD9ACAATABDAEQATABDAEQALQBmAGEAcgB2AGUAcwBrAOYAcgBtBBoE PgQ7BEwEPgRABD4EMgQ4BDkAIABMAEMARCAPAEwAQwBEACAGRQZEBkgGRgYpAEwAQwBEACAAYwBvAGwA bwByAGkATABDAEQAIABjAG8AbABvAHIASwBsAGUAdQByAGUAbgAtAEwAQwBEIA8ATABDAEQAIAXmBdEF 4gXVBeAF2QBWAOQAcgBpAC0ATABDAERfaYJyACAATABDAEQATABDAEQAIABNAOAAdQBGAGEAcgBlAGIA bgDpACAATABDAEQEJgQyBDUEQgQ9BD4EOQAgBBYEGgAtBDQEOARBBD8EOwQ1BDkATABDAEQAIABjAG8A dQBsAGUAdQByAFcAYQByAG4AYQAgAEwAQwBEAEwAQwBEACAAZQBuACAAYwBvAGwAbwByAEwAQwBEACAO Kg41AEYAYQByAGIALQBMAEMARABDAG8AbABvAHIAIABMAEMARABMAEMARAAgAEMAbwBsAG8AcgBpAGQA bwBLAG8AbABvAHIAIABMAEMARAOIA7MDxwPBA8kDvAO3ACADvwO4A8wDvQO3ACAATABDAEQARgDkAHIA ZwAtAEwAQwBEAFIAZQBuAGsAbABpACAATABDAEQwqzDpMPwAIABMAEMARABMAEMARAAgAGEAIABDAG8A cgBlAHMAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMTUAAFhZWiAAAAAAAADzFgABAAAA ARbKWFlaIAAAAAAAAHHAAAA5igAAAWdYWVogAAAAAAAAYSMAALnmAAAT9lhZWiAAAAAAAAAj8gAADJAA AL3QY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgA bQByAHcAfACBAIYAiwCQAJUAmgCfAKMAqACtALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEB BwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB 2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC 9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUE YwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYG JwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDII RghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4K xQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4N qQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ 9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsU rRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y 1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcd cB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9wo DSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEu Fi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0 njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7 qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdD OkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxL U0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT 9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZd J114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm 6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBx OnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8 IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuH n4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02T tpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qg aaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUSt uK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67 p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZ bNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6Lzp RunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5 x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//9wYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKDnZjZ3QA AAAAAAAAAQABAAAAAAAAAAEAAAABAAAAAAAAAAEAAAABAAAAAAAAAAEAAG5kaW4AAAAAAAAANgAAp0AA AFWAAABMwAAAnsAAACWAAAAMwAAAUAAAAFRAAAIzMwACMzMAAjMzAAAAAAAAAABzZjMyAAAAAAABDHIA AAX4///zHQAAB7oAAP1y///7nf///aQAAAPZAADAcW1tb2QAAAAAAAAGEAAAoA4AAAAAyc58GAAAAAAA AAAAAAAAAAAAAADSJSYnKFokY2xhc3NuYW1lWCRjbGFzc2VzXxAQTlNCaXRtYXBJbWFnZVJlcKMnKSpa TlNJbWFnZVJlcFhOU09iamVjdNIlJiwtV05TQXJyYXmiLCrSJSYvMF5OU011dGFibGVBcnJheaMvLCrT MjMKNDU2V05TV2hpdGVcTlNDb2xvclNwYWNlRDAgMAAQA4AM0iUmODlXTlNDb2xvcqI4KtIlJjs8V05T SW1hZ2WiOypfEA9OU0tleWVkQXJjaGl2ZXLRP0BUcm9vdIABAAgAEQAaACMALQAyADcARgBMAFcAXgBl AHIAeQCBAIMAhQCKAIwAjgCXAJwApwCpAKsArQCyALUAtwC5ALsAvQDCANkA2wDdJU8lVCVfJWgleyV/ JYolkyWYJaAloyWoJbcluyXCJcol1yXcJd4l4CXlJe0l8CX1Jf0mACYSJhUmGgAAAAAAAAIBAAAAAAAA AEEAAAAAAAAAAAAAAAAAACYcA transmission-2.92/macosx/da.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013012640354045022516 xustar0029 mtime=1451350053.19816338 29 atime=1451350053.19816338 30 ctime=1457295922.676853424 transmission-2.92/macosx/da.lproj/Localizable.strings0000644000175000017500000011154112640354045024150 0ustar00mikedldmikedld00000000000000/* Inspector -> selected torrents stats -> bytes */ "%@ bytes" = "%@ bytes"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "%@ files" = "%@ filer"; /* Prefs -> blocklist -> message */ "%@ IP address rules in list" = "%@ IP-adresse regler i listen"; /* Inspector -> selected torrents */ "%@ magnetized transfers" = "%@ magnet overførsler"; /* file size string Inspector -> Files tab -> file status string Status bar transfer count */ "%@ of %@" = "%1$@ af %2$@"; /* Torrent -> progress string */ "%@ of torrent metadata retrieved" = "%@ af torrent filens metadata er modtaget"; /* Torrent -> eta string */ "%@ remaining" = "%@ tilbage"; /* Add torrent -> info Inspector -> Activity tab -> progress Torrent -> progress string */ "%@ selected" = "%@ valgt"; /* stats window -> times opened */ "%@ times" = "%@ gange"; /* Drag overlay -> torrents */ "%@ Torrent Files" = "%@ Torrent filer"; /* Inspector -> selected torrents */ "%@ Torrents Selected" = "%@ Torrents valgt"; /* Inspector -> selected torrents stats total */ "%@ total" = "%@ total"; /* Filter Bar Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "%@ transfers" = "%@ overførsler"; /* Inspector -> Activity tab -> have */ "%@ verified" = "%@ kontrolleret"; /* Inspector -> Peers tab -> peers */ "%d cache" = "%d cache"; /* Inspector -> Peers tab -> peers */ "%d Connected" = "%d forbundet"; /* Inspector -> Peers tab -> peers */ "%d DHT" = "%d DHT"; /* Dock item - Downloading */ "%d Downloading" = "%d Henter"; /* Inspector -> Peers tab -> peers */ "%d incoming" = "%d indkommende"; /* Action menu -> upload/download limit Status Bar -> speed tooltip */ "%d KB/s" = "%d KB/s"; /* Inspector -> Peers tab -> peers */ "%d local discovery" = "%d local discovery"; /* Inspector -> Peers tab -> peers */ "%d LTEP" = "%d LTEP"; /* Info options -> global setting */ "%d minutes" = "%d minutter"; /* Inspector -> Peers tab -> peers */ "%d PEX" = "%d PEX"; /* Create torrent -> info */ "%d pieces, %@ each" = "%1$d stykker, %2$@ pr. stk."; /* Dock item - Seeding */ "%d Seeding" = "%d Deler"; /* Inspector -> Peers tab -> peers */ "%d tracker" = "%d tracker"; /* Torrent -> status string */ "%d web seeds" = "%d web seeds"; /* time string */ "%u days" = "%u dage"; /* time string */ "%u hr" = "%u t"; /* time string */ "%u min" = "%u min"; /* time string */ "%u sec" = "%u sek"; /* time string */ "%u years" = "%u Ã¥r"; /* time string */ "1 day" = "1 dag"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "1 file" = "1 fil"; /* Inspector -> selected torrents */ "1 magnetized transfer" = "1 magnet overførsel"; /* Info options -> global setting */ "1 minute" = "1 minut"; /* Create torrent -> info */ "1 piece, %@" = "1 stk., %@"; /* stats window -> times opened */ "1 time" = "1 gang"; /* Filter Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "1 transfer" = "1 overførsel"; /* time string */ "1 year" = "1 Ã¥r"; /* Open invalid alert -> title */ "\"%@\" is not a valid torrent file." = "\"%@\" er ikke en gyldig torrent fil."; /* Prefs -> blocklist -> message */ "A blocklist must first be downloaded" = "En blokeringsliste skal først hentes"; /* Create torrent -> file already exists warning -> warning */ "A file with the name \"%@\" already exists in the directory \"%@\". Choose a new name or directory to create the torrent file." = "En fil med navnet \"%1$@\" findes allerede i mappen \"%2$@\". Vælg et nyt navn eller en ny mappe for at oprette torrent filen."; /* Move inside itself alert -> title */ "A folder cannot be moved to inside itself." = "En mappe kan ikke blive flyttet til sig selv."; /* Create torrent -> zero size -> warning */ "A torrent file cannot be created for files with no size." = "En torrent kan ikke oprettes med filer uden størrelse."; /* Create torrent -> file already exists warning -> title */ "A torrent file with this name and directory cannot be created." = "En torrent med dette navn og mappe kan ikke oprettes."; /* Create torrent -> blank address -> message */ "A transfer marked as private with no tracker addresses will be unable to connect to peers. The torrent file will only be useful if you plan to upload the file to a tracker website that will add the addresses for you." = "En overførsel markeret som privat uden trackers vil ikke være i stand til at finde forbindelser. Torrent filen er kun brugbar hvis du overfører filen til en tracker side som vil tilføje adresserne for dig."; /* Open duplicate alert -> title Open duplicate magnet alert -> title */ "A transfer of \"%@\" already exists." = "Overførslen \"%@\" findes allerede."; /* Filter Bar -> filter button */ "Active" = "Aktive"; /* Inspector -> tab Inspector view -> title */ "Activity" = "Aktivitet"; /* Add torrent -> same name -> button */ "Add" = "Tilføj"; /* Inspector view -> tracker buttons */ "Add a tracker" = "Tilføj tracker"; /* Magnet link failed -> title */ "Adding magnetized transfer failed." = "Magnet overførsel kunne ikke tilføjes."; /* Filter Bar -> filter button inspector -> check all */ "All" = "Alle"; /* Filter Bar -> group filter menu Groups -> Button */ "All Groups" = "Alle grupper"; /* Create torrent -> failed -> warning */ "An unknown error has occurred." = "Der opstod en ukendt fejl."; /* Tracker last announce */ "Announce error" = "Annonceringsfejl"; /* Tracker next announce */ "Announce in progress" = "Annoncering i gang"; /* Tracker next announce */ "Announce is queued" = "Annoncering sat i kø"; /* Tracker next announce */ "Announce not scheduled" = "Annoncering ikke planlagt"; /* Tracker last announce */ "Announce timed out" = "Annoncering fik timeout"; /* All toolbar item -> label */ "Apply All" = "Anvend pÃ¥ alle"; /* Selected toolbar item -> label */ "Apply Selected" = "Anvend pÃ¥ valgte"; /* Confirm Quit panel -> title */ "Are you sure you want to quit?" = "Er du sikker pÃ¥, at du vil afslutte?"; /* Remove completed confirm panel -> title */ "Are you sure you want to remove %@ completed transfers from the transfer list?" = "Er du sikker pÃ¥, at du vil fjerne %@ færdige overførsler fra listen?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list and trash the data files?" = "Er du sikker pÃ¥, at du vil fjerne %@ overførsler fra listen og flytte data til papirkurven?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list?" = "Er du sikker pÃ¥, at du vil fjerne %@ overførsler fra listen?"; /* Remove trackers alert -> title */ "Are you sure you want to remove %d trackers?" = "Er du sikker pÃ¥, at du vil fjerne %d trackers?"; /* Removal confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list and trash the data file?" = "Er du sikker pÃ¥, at du vil fjerne \"%@\" fra listen og flytte data til papirkurven?"; /* Removal confirm panel -> title Remove completed confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list?" = "Er du sikker pÃ¥, at du vil fjerne \"%@\" fra listen?"; /* Remove trackers alert -> title */ "Are you sure you want to remove this tracker?" = "Er du sikker pÃ¥, at du vil fjerne denne tracker?"; /* Stats reset -> title */ "Are you sure you want to reset usage statistics?" = "Er du sikker pÃ¥, at du vil nulstille statistikker?"; /* inspector -> peer table -> header tool tip */ "Available" = "Tilgængelig"; /* Preferences -> toolbar item title */ "Bandwidth" = "BÃ¥ndbredde"; /* Growl notification description */ "Bandwidth settings changed" = "BÃ¥ndbredde-indstillinger er ændret"; /* Groups -> Name */ "Blue" = "BlÃ¥"; /* Add torrent -> same name -> button Blocklist -> cancel button Confirm Quit panel -> button Create torrent -> blank address -> button Removal confirm panel -> button Remove completed confirm panel -> button Remove trackers alert -> button rename sheet button Stats reset -> button URL sheet button */ "Cancel" = "Annuller"; /* Torrent Table -> tooltip */ "Change transfer settings" = "Ændre indstillinger for overførsel"; /* File Outline -> Menu */ "Check Selected" = "Tjek valgte"; /* Torrent -> status string */ "Checking existing data" = "Kontrollerer data"; /* Message window -> save button */ "Clear" = "Ryd"; /* inspector -> peer table -> header */ "Client" = "Klient"; /* View menu -> Quick Look */ "Close Quick Look" = "Luk Vis"; /* Prefs -> Notifications */ "Configure In Growl" = "Indstil i Growl"; /* Prefs -> Notifications */ "Configure In System Preferences" = "Indstil i Systemindstillinger"; /* Blocklist -> message */ "Connecting to site" = "Opretter forbindelse"; /* Torrent file copy alert -> title */ "Copy of \"%@\" Cannot Be Created" = "En kopi af \"%@\" kan ikke oprettes"; /* Create torrent -> failed -> warning */ "Could not read \"%s\": %s." = "Kunne ikke læse \"%1$s\": %2$s."; /* Create torrent -> failed -> warning */ "Could not write \"%s\": %s." = "Kunne ikke skrive \"%1$s\": %2$s."; /* Create toolbar item -> label Create torrent -> blank address -> button */ "Create" = "Opret"; /* Drag overlay -> file */ "Create a Torrent File" = "Ny torrent fil"; /* Create toolbar item -> tooltip */ "Create torrent file" = "Ny torrent fil"; /* Create toolbar item -> palette label Create torrent -> select file */ "Create Torrent File" = "Ny torrent fil"; /* Create torrent -> failed -> title */ "Creation of \"%@\" failed." = "Kunne ikke oprette \"%@\"."; /* Inspector -> peer -> status */ "Currently downloading (interested and not choked)" = "Henter i øjeblikket (interested and not choked)"; /* Inspector -> peer -> status */ "Currently uploading (interested and not choked)" = "Deler i øjeblikket (interested and not choked)"; /* Message window -> table column */ "Date" = "Dato"; /* Message window -> level Message window -> level string */ "Debug" = "Debug"; /* Info options -> global setting */ "disabled" = "deaktiveret"; /* inspector -> peer table -> header inspector -> web seed table -> header status bar -> status label Torrent -> status string */ "DL" = "DL"; /* Inspector -> Peers tab -> peers */ "DL from %d" = "DL fra %d"; /* Torrent disk space alert -> button */ "Do not check disk space again" = "Tjek ikke diskpladsen fremover"; /* Donation beg -> button */ "Don't bug me about this ever again." = "Giv mig ikke besked om dette fremover."; /* files tab -> tooltip */ "Don't Download" = "Hent ikke"; /* Donation beg -> button */ "Donate" = "Donér"; /* Donation beg -> message */ "Donate or not, there will be no difference to your torrenting experience." = "Om du vælger at donere eller ej, sÃ¥ har det ingen indflydelse pÃ¥ programoplevelsen."; /* file table -> header tool tip files tab -> tooltip */ "Download" = "Hent"; /* Torrent disk space alert -> button */ "Download Anyway" = "Hent alligevel"; /* notification title */ "Download Complete" = "En overførsel er færdig"; /* Blocklist -> message */ "Download of the blocklist failed." = "Blokeringsliste kunne ikke hentes."; /* files tab -> tooltip */ "Download Some" = "Hent nogle"; /* Torrent table -> group row -> tooltip */ "Download speed" = "Download hastighed"; /* Stats window -> label tracker peer stat */ "Downloaded" = "Hentet"; /* Filter Bar -> filter button Torrent -> status string */ "Downloading" = "Henter"; /* Blocklist -> message */ "Downloading blocklist" = "Downloader blockeringsliste"; /* Torrent -> status string */ "Downloading from %d of %d peers" = "Henter fra %1$d af %2$d forbindelser"; /* Torrent -> status string */ "Downloading from %d of 1 peer" = "Henter fra %d af 1 forbindelse"; /* inspector -> peer table -> header tool tip */ "Downloading From Peer" = "Henter fra forbindelse"; /* inspector -> web seed table -> header tool tip */ "Downloading From Web Seed" = "Henter fra web seed"; /* Inspector -> Peers tab -> table row tooltip */ "encrypted" = "krypteret"; /* inspector -> peer table -> header tool tip */ "Encrypted Connection" = "Krypteret forbindelse"; /* Message window -> level Message window -> level string Torrent -> status string */ "Error" = "Fejl"; /* Inspector -> tab Inspector view -> title */ "Files" = "Filer"; /* Filter toolbar item -> label inspector -> file filter Message window -> filter field */ "Filter" = "Filter"; /* Inspector -> Peers tab -> table row tooltip */ "From: cache" = "Fra: cache"; /* Inspector -> Peers tab -> table row tooltip */ "From: distributed hash table" = "Fra: distributed hash table"; /* Inspector -> Peers tab -> table row tooltip */ "From: incoming connection" = "Fra: incoming connection"; /* Inspector -> Peers tab -> table row tooltip */ "From: libtorrent extension protocol handshake" = "Fra: libtorrent extension protocol handshake"; /* Inspector -> Peers tab -> table row tooltip */ "From: local peer discovery" = "Fra: local peer discovery"; /* Inspector -> Peers tab -> table row tooltip */ "From: peer exchange" = "Fra: peer exchange"; /* Inspector -> Peers tab -> table row tooltip */ "From: tracker" = "Fra: tracker"; /* File size - gigabytes file/memory size - gigabytes */ "GB" = "GB"; /* Transfer speed (gigabytes per second) */ "GB/s" = "GB/s"; /* Preferences -> toolbar item title */ "General" = "Generelt"; /* Inspector -> tab Inspector view -> title */ "General Info" = "Generelt"; /* Status Bar -> speed tooltip */ "Global download limit" = "Generel download begrænsning"; /* Status Bar -> speed tooltip */ "Global upload limit" = "Generel upload begrænsning"; /* Tracker last announce */ "got %d peers" = "fik %d forbindelser"; /* Tracker last announce */ "got 1 peer" = "fik 1 forbindelse"; /* Groups -> Name */ "Gray" = "GrÃ¥"; /* Groups -> Name */ "Green" = "Grøn"; /* Groups -> Button */ "Group" = "Gruppe"; /* Preferences -> toolbar item title */ "Groups" = "Grupper"; /* View menu -> Filter Bar */ "Hide Filter Bar" = "Skjul filterlinje"; /* View menu -> Inspector */ "Hide Inspector" = "Skjul Inspector"; /* View menu -> Status Bar */ "Hide Status Bar" = "Skjul statuslinje"; /* File Outline -> Priority Menu */ "High" = "Høj"; /* files tab -> tooltip */ "High Priority" = "Høj priotet"; /* Legal alert -> button */ "I Accept" = "Accepter"; /* Add torrent -> same name -> message */ "If you are attempting to use already existing data, the root data directory should be inside the destination directory." = "Hvis du forsøger at bruge allerede eksisterende data, skal rod data mappen være i destinationsmappen."; /* Torrent -> eta string */ "inactive" = "inaktiv"; /* Message window -> level Message window -> level string */ "Info" = "Info"; /* Inspector toolbar item -> label */ "Inspector" = "Inspector"; /* URL sheet label */ "Internet address of torrent file:" = "Indtast internet adressen til torrent filen:"; /* inspector -> peer table -> header */ "IP Address" = "IP-adresse"; /* Download not a torrent -> message */ "It appears that the file \"%@\" from %@ is not a torrent file." = "Det lader til at filen \"%1$@\" fra %2$@ ikke er en torrent."; /* File size - kilobytes file/memory size - kilobytes */ "KB" = "KB"; /* Transfer speed (kilobytes per second) */ "KB/s" = "KB/s"; /* Tracker last announce */ "Last Announce" = "Sidste annoncering"; /* Tracker last scrape */ "Last Scrape" = "Sidste scrape"; /* Prefs -> blocklist -> message */ "Last updated" = "Sidst opdateret"; /* tracker peer stat */ "Leechers" = "Leechers"; /* About window -> license button */ "License" = "Licens"; /* Action menu -> upload/download limit torrent action menu -> upload/download limit */ "Limit (%d KB/s)" = "Begræns (%d KB/s)"; /* Save log alert panel -> title */ "Log Could Not Be Saved" = "Log filen kunne ikke gemmes"; /* File Outline -> Priority Menu */ "Low" = "Lav"; /* files tab -> tooltip */ "Low Priority" = "Lav priotet"; /* Open duplicate magnet alert -> title */ "Magnet link is a duplicate of an existing transfer." = "Magnet linket er en dublet af en eksisterende overførsel."; /* Inspector -> selected torrents Torrent -> progress string */ "Magnetized transfer" = "Magnet overførsel"; /* File size - megabytes file/memory size - megabytes */ "MB" = "MB"; /* Transfer speed (megabytes per second) */ "MB/s" = "MB/s"; /* Message window -> table column */ "Message" = "Besked"; /* Message window -> title */ "Message Log" = "Beskeder"; /* files tab -> tooltip */ "Multiple Priorities" = "Flere prioteter"; /* Inspector -> Peers tab -> table row tooltip No Ratio Prefs -> blocklist -> message Tracker last announce Tracker last scrape tracker peer stat */ "N/A" = "N/A"; /* Filter Bar -> filter menu */ "Name" = "Navn"; /* Preferences -> toolbar item title */ "Network" = "Netværk"; /* Prefs -> blocklist -> message */ "Never" = "Aldrig"; /* Inspector -> tracker table */ "New Tier" = "Ny liste"; /* Tracker next announce */ "Next announce in %@" = "Næste annoncering om %@"; /* Group table row */ "No Group" = "Ingen gruppe"; /* Inspector -> selected torrents */ "No Torrents Selected" = "Ingen torrents valgt"; /* Groups -> Button Groups -> Menu inspector -> check all */ "None" = "Ingen"; /* Donation beg -> button */ "Nope" = "Nej"; /* File Outline -> Priority Menu */ "Normal" = "Normal"; /* files tab -> tooltip */ "Normal Priority" = "Normal priotet"; /* Torrent disk space alert -> title */ "Not enough remaining disk space to download \"%@\" completely." = "Der er ikke tilstrækkelig diskplads til at fuldføre \"%@\"."; /* About window -> license close button Blocklist -> button Create torrent -> directory doesn't exist warning -> button Create torrent -> failed -> button Create torrent -> file already exists warning -> button Create torrent -> no files -> button Create torrent -> zero size -> button Download not a torrent -> button Magnet link failed -> button Move error alert -> button Move inside itself alert -> button Open duplicate alert -> button Open duplicate magnet alert -> button Open invalid alert -> button Save log alert panel -> button Torrent disk space alert -> button Torrent download failed -> button Torrent file copy alert -> button Transmission already running alert -> button */ "OK" = "OK"; /* Remove completed confirm panel -> message */ "Once removed, continuing the transfer will require the torrent file or magnet link." = "Fjernes denne, vil det kræve torrent filen eller magnet link at fortsætte overførslen."; /* Removal confirm panel -> message part 2 Remove completed confirm panel -> message */ "Once removed, continuing the transfers will require the torrent files or magnet links." = "Fjernes disse, vil det kræve torrent filerne eller magnet linksne at fortsætte overførslerne."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact it. This cannot be undone." = "Fjernes denne, vil programmet ikke længere forsøge at kontakte den. Denne handling kan ikke fortrydes."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact them. This cannot be undone." = "Fjernes disse, vil programmet ikke længere forsøge at kontakte dem. Denne handling kan ikke fortrydes."; /* File Outline -> Menu */ "Only Check Selected" = "Tjek kun valgte"; /* Open toolbar item -> label URL sheet button */ "Open" = "Ã…bn"; /* Open address toolbar item -> label */ "Open Address" = "Ã…bn torrent adresse"; /* Open address toolbar item -> palette label */ "Open Torrent Address" = "Ã…bn torrent adresse"; /* Open toolbar item -> tooltip */ "Open torrent files" = "Ã…bn en torrent"; /* Open toolbar item -> palette label */ "Open Torrent Files" = "Ã…bn en torrent"; /* Open address toolbar item -> tooltip */ "Open torrent web address" = "Ã…bn torrent adresse"; /* Inspector -> tab Inspector view -> title */ "Options" = "Valgmuligheder"; /* Groups -> Name */ "Orange" = "Orange"; /* Inspector -> Peers tab -> table row tooltip */ "Partial Seed" = "Delvist seed"; /* All toolbar item -> palette label */ "Pause / Resume All" = "Pause / genoptag alle"; /* Selected toolbar item -> palette label */ "Pause / Resume Selected" = "Pause / genoptag valgte"; /* All toolbar item -> label Dock item */ "Pause All" = "Pause alle"; /* All toolbar item -> tooltip */ "Pause all transfers" = "Pause alle overførsler"; /* Selected toolbar item -> label */ "Pause Selected" = "Pause valgte"; /* Selected toolbar item -> tooltip */ "Pause selected transfers" = "Pause valgte overførsler"; /* Torrent Table -> tooltip */ "Pause the transfer" = "Pause overførslen"; /* Filter Bar -> filter button Torrent -> status string */ "Paused" = "Pauset"; /* Inspector -> peer -> status */ "Peer is unchoking you, but you are not interested" = "Peer is unchoking you, but you are not interested"; /* Inspector -> peer -> status */ "Peer wants you to upload, but you do not want to (interested and choked)" = "Peer wants you to upload, but you do not want to (interested and choked)"; /* Inspector -> tab Inspector view -> title Preferences -> toolbar item title */ "Peers" = "Forbindelser"; /* Inspector -> Peers tab -> table row tooltip */ "Port" = "Port"; /* Preferences -> Network -> port status */ "Port check site is down" = "Port checksite er nede"; /* Preferences -> Network -> port status */ "Port is closed" = "Port lukket"; /* Preferences -> Network -> port status */ "Port is open" = "Port Ã¥ben"; /* File Outline -> Menu file table -> header tool tip */ "Priority" = "Priotet"; /* files tab -> tooltip */ "Priority Not Available" = "Priotet ikke tilgængelig"; /* Inspector -> private torrent */ "Private Torrent, non-tracker peer discovery disabled" = "Private Torrent, non-tracker peer discovery disabled"; /* Message window -> table column */ "Process" = "Proces"; /* Blocklist -> message */ "Processing blocklist" = "Behandler"; /* Stats window -> label */ "Program Started" = "Program startet"; /* Inspector -> Peers tab -> table row tooltip */ "Progress: %@" = "Fremskridt: %@"; /* Inspector -> Peers tab -> table row tooltip */ "Protocol: %@" = "Protokol: %@"; /* Inspector -> private torrent */ "Public Torrent" = "Offentlig"; /* Groups -> Name */ "Purple" = "Lilla"; /* QuickLook toolbar item -> label QuickLook toolbar item -> palette label QuickLook toolbar item -> tooltip View menu -> Quick Look */ "Quick Look" = "Vis"; /* Confirm Quit panel -> button Legal alert -> button */ "Quit" = "Slut"; /* Dock Badger -> quit */ "Quitting" = "Afslutter"; /* Stats window -> label status bar -> status label Torrent -> status string Torrent table -> group row -> tooltip */ "Ratio" = "Delingsforhold"; /* Groups -> Name */ "Red" = "Rød"; /* Action menu -> status string toggle */ "Remaining Time" = "Resterende tid"; /* Torrent -> eta string */ "remaining time unknown" = "resterende tid ukendt"; /* Preferences -> toolbar item title */ "Remote" = "Fjernkontrol"; /* Removal confirm panel -> button Remove completed confirm panel -> button Remove toolbar item -> label Remove trackers alert -> button */ "Remove" = "Fjern"; /* Main window -> 3rd bottom left button (remove all) tooltip */ "Remove all transfers that have completed seeding." = "Fjern alle overførsler som er færdige med at dele."; /* Remove toolbar item -> palette label */ "Remove Selected" = "Fjern valgte"; /* Inspector view -> tracker buttons */ "Remove selected trackers" = "Fjern valgte trackers"; /* Remove toolbar item -> tooltip */ "Remove selected transfers" = "Fjern valgte overførsler"; /* rename sheet button */ "Rename" = "Omdøb"; /* File Outline -> Menu */ "Rename File" = "Omdøb"; /* rename sheet label */ "Rename the file \"%@\":" = "Omdøb \"%@\":"; /* Stats reset -> button Stats window -> reset button */ "Reset" = "Nulstil"; /* All toolbar item -> label Dock item */ "Resume All" = "Genoptag alle"; /* All toolbar item -> tooltip */ "Resume all transfers" = "Genoptag alle overførsler"; /* Selected toolbar item -> label */ "Resume Selected" = "Genoptag valgte"; /* Selected toolbar item -> tooltip */ "Resume selected transfers" = "Genoptag valgte overførsler"; /* Torrent cell -> button info */ "Resume the transfer" = "Genoptag overførsel"; /* Torrent cell -> button info */ "Resume the transfer right away" = "Genoptag overførsel straks"; /* Stats window -> label */ "Running Time" = "Køre tid"; /* Message window -> save button */ "Save" = "Arkiver"; /* Tracker last scrape */ "Scrape error" = "Scrape fejl"; /* Tracker last scrape */ "Scrape timed out" = "Scrape fik timeout"; /* tracker peer stat */ "Seeders" = "Seeders"; /* Filter Bar -> filter button Torrent -> status string */ "Seeding" = "Deler"; /* Torrent -> status string */ "Seeding complete" = "Deling fuldført"; /* notification title */ "Seeding Complete" = "Deling fuldført"; /* Torrent -> status string */ "Seeding to %d of %d peers" = "Deler til %1$d af %2$d forbindelser"; /* Torrent -> status string */ "Seeding to %d of 1 peer" = "Deler til %d af 1 forbindelse"; /* Create torrent -> location sheet -> button Create torrent -> select file Move torrent -> prompt Open torrent -> prompt Preferences -> Open panel prompt */ "Select" = "Vælg"; /* Create torrent -> select file */ "Select a file or folder for the torrent file." = "Vælg en fil eller mappe til torrent filen."; /* Add -> select destination folder */ "Select the download folder for \"%@\"" = "Vælg placering til \"%@\""; /* Create torrent -> location sheet -> message */ "Select the name and location for the torrent file." = "Vælg navn og placering til torrent filen."; /* Move torrent -> select destination folder */ "Select the new folder for %d data files." = "Vælg ny mappe til %d data filer."; /* Move torrent -> select destination folder */ "Select the new folder for \"%@\"." = "Vælg ny mappe til \"%@\"."; /* Status Bar -> status menu */ "Session Ratio" = "Delingsforhold siden sidste start"; /* Status Bar -> status menu */ "Session Transfer" = "Overført siden sidste start"; /* Share toolbar item -> label Share toolbar item -> palette label */ "Share" = "Del"; /* Share toolbar item -> tooltip */ "Share torrent file" = "Del torrent fil"; /* Main window -> 1st bottom left button (action) tooltip */ "Shortcuts for changing global settings." = "Genveje til ændring af generelle indstillinger"; /* notification button */ "Show" = "Vis"; /* View menu -> Filter Bar */ "Show Filter Bar" = "Vis filterlinje"; /* File Outline -> Menu */ "Show in Finder" = "Vis i Finder"; /* View menu -> Inspector */ "Show Inspector" = "Vis Inspector"; /* View menu -> Status Bar */ "Show Status Bar" = "Vis statuslinje"; /* Torrent cell -> button info */ "Show the data file in Finder" = "Vis data i Finder"; /* Dock item Status Bar -> speed tooltip */ "Speed Limit" = "Begræns hastighed"; /* Growl notification title */ "Speed Limit Auto Disabled" = "Begræns hastighed automatisk deaktiveret"; /* Growl notification title */ "Speed Limit Auto Enabled" = "Begræns hastighed automatisk aktiveret"; /* Main window -> 2nd bottom left button (turtle) tooltip */ "Speed Limit overrides the total bandwidth limits with its own limits." = "SlÃ¥ 'Begræns hastighed' til."; /* Torrent -> status string */ "Stalled" = "GÃ¥et i stÃ¥"; /* Stats window -> title */ "Statistics" = "Statistikker"; /* Action menu -> status string toggle */ "Status of Selected Files" = "Status for valgte filer"; /* Action menu -> ratio stop torrent action menu -> ratio stop */ "Stop at Ratio (%.2f)" = "Stop ved delingsforhold (%.2f)"; /* Torrent cell -> button info */ "Stop waiting to start" = "Stop ventende for at starte"; /* Donation beg -> title */ "Support open-source indie software" = "Støt open source programmer"; /* File size - terabytes file/memory size - terabytes */ "TB" = "TB"; /* Transfer speed (terabytes per second) */ "TB/s" = "TB/s"; /* Create torrent -> directory doesn't exist warning -> title */ "The chosen torrent file location does not exist." = "Den valgte placering eksisterer ikke."; /* Add torrent -> same name -> title */ "The destination directory and root data directory have the same name." = "Placering og rod data mappen har samme navn."; /* Create torrent -> directory doesn't exist warning -> warning */ "The directory \"%@\" does not currently exist. Create this directory or choose a different one to create the torrent file." = "Mappen \"%@\" eksisterer ikke. Opret mappen eller vælg en anden for at oprette torrent filen."; /* Open duplicate magnet alert -> message */ "The magnet link \"%@\" cannot be added because it is a duplicate of an already existing transfer." = "Magnet link \"%@\" kan ikke tilføjes fordi det er en dublet af en eksisterende overførsel."; /* Move error alert -> message Move inside itself alert -> message */ "The move operation of \"%@\" cannot be done." = "Kan ikke flytte \"%@\""; /* blocklist fail message */ "The specified blocklist file did not contain any valid rules." = "Den angivede blokeringsliste indeholdte ingen gyldige regler."; /* Torrent download failed -> message */ "The torrent could not be downloaded from %@: %@." = "Torrent kunne ikke hentes fra %1$@: %2$@."; /* Torrent file copy alert -> message */ "The torrent file (%@) cannot be found." = "Torrent filen (%@) findes ikke."; /* Open invalid alert -> message */ "The torrent file cannot be opened because it contains invalid data." = "orrent filen kan ikke Ã¥bnes fordi den indeholder uglydige data."; /* Create torrent -> zero size -> title */ "The total file size is zero bytes." = "Samlet fil størrelse er nul bytes."; /* Open duplicate alert -> message */ "The transfer cannot be added because it is a duplicate of an already existing transfer." = "Overførslen kan ikke tilføjes fordi det er en dublet af en eksisterende overførsel."; /* Torrent disk space alert -> message */ "The transfer will be paused. Clear up space on %@ or deselect files in the torrent inspector to continue." = "Overførslen pauses. Ryd diskplads pÃ¥ %@ eller fravælg filer i Inspector for at fortsætte."; /* Create torrent -> blank address -> message */ "The transfer will not contact trackers for peers, and will have to rely solely on non-tracker peer discovery methods such as PEX and DHT to download and seed." = "Overførslen vil ikke kontakte trackere for at fÃ¥ forbindelser og vil udelukkende benytte non-tracker peer discovery sÃ¥som PEX og DHT til download og deling."; /* Removal confirm panel -> message part 1 */ "There are %@ active transfers." = "Der er %@ aktive overførsler."; /* Removal confirm panel -> message part 1 */ "There are %@ transfers (%@ active)." = "Der er %1$@ overførsler (%2$@ er aktive)."; /* Confirm Quit panel -> message */ "There are %d active transfers that will be paused on quit. The transfers will automatically resume on the next launch." = "Der er %d aktive overførsler som pauses ved afslutning. Overførslerne genoptages automatisk, næste gang programmet startes."; /* Create torrent -> blank address -> title */ "There are no tracker addresses." = "Der er ingen tracker adresser."; /* Transmission already running alert -> message */ "There is already a copy of Transmission running. This copy cannot be opened until that instance is quit." = "Transmission kører allerede. En kopi kan ikke startes før den nuværende afsluttes."; /* Confirm Quit panel -> message */ "There is an active transfer that will be paused on quit. The transfer will automatically resume on the next launch." = "Der er en aktiv overførsel som pauses ved afslutning. Overførslen genoptages automatisk, næste gang programmet startes."; /* Create torrent -> no files -> warning */ "There must be at least one file in a folder to create a torrent file." = "Der skal være mindst én fil i en mappe for at oprette en torrent."; /* Save log alert panel -> message */ "There was a problem creating the file \"%@\"." = "Der opstod et problem med at oprette \"%@\"."; /* Move error alert -> title */ "There was an error moving the data file." = "Data kan ikke flyttes."; /* Magnet link failed -> message */ "There was an error when adding the magnet link \"%@\". The transfer will not occur." = "Magnet link \"%@\" kunne ikke tilføjes. Overførslen startes ikke."; /* Create torrent -> no files -> title */ "This folder contains no files." = "Ingen filer i mappe."; /* Removal confirm panel -> message */ "This transfer is active. Once removed, continuing the transfer will require the torrent file or magnet link." = "Denne overførsel er aktiv. Hvis den fjernes, kræves torrent filen eller magnet linket for at fortsætte."; /* Stats reset -> message */ "This will clear the global statistics displayed by Transmission. Individual transfer statistics will not be affected." = "Dette vil rydde statistikker vist af Transmission. Individuelle overførselsstatistikker pÃ¥virkes ikke."; /* Inspector -> tracker table */ "Tier %d" = "Liste %d"; /* Filter toolbar item -> palette label */ "Toggle Filter" = "Vis / skjul filterlinje"; /* Inspector toolbar item -> palette label */ "Toggle Inspector" = "Vis / skjul Inspector"; /* Filter toolbar item -> tooltip */ "Toggle the filter bar" = "Vis / skjul filterlinje"; /* Inspector toolbar item -> tooltip */ "Toggle the torrent inspector" = "Vis / skjul Torrent Inspector"; /* Download not a torrent -> title Torrent download error -> title */ "Torrent download failed" = "Torrent kan ikke hentes"; /* notification title */ "Torrent File Auto Added" = "En torrent blev tilføjet"; /* Inspector -> title */ "Torrent Inspector" = "Torrent Inspector"; /* Torrent -> progress string */ "torrent metadata needed" = "torrent metadata kræves"; /* stats total */ "Total N/A" = "Samlet N/A"; /* Status Bar -> status menu */ "Total Ratio" = "Samlet delingsforhold"; /* Status Bar -> status menu */ "Total Transfer" = "Samlet overførsel"; /* Filter Bar -> filter menu */ "Tracker" = "Tracker"; /* Torrent -> status string */ "Tracker returned error" = "Tracker returnerede en fejl"; /* Torrent -> status string */ "Tracker returned warning" = "Tracker returnerede en advarsel"; /* Tracker next announce */ "Tracker will be used as a backup" = "Tracker benyttes som backup"; /* Inspector -> tab Inspector view -> title */ "Trackers" = "Trackers"; /* Inspector -> Peers tab -> peers */ "Transfer Not Active" = "Inaktiv overførsel"; /* Preferences -> toolbar item title */ "Transfers" = "Overførsler"; /* Inspector -> Peers tab -> peers */ "Transfers Not Active" = "Inaktive overførsler"; /* Legal alert -> message */ "Transmission is a file-sharing program. When you run a torrent, its data will be made available to others by means of upload. You and you alone are fully responsible for exercising proper judgement and abiding by your local laws." = "Transmission er et fildelingsprogram. NÃ¥r du kører en torrent, vil dens data være tilgængelig for andre. Du har alene det fulde ansvar for at udvise god dømmekraft og overholde dine lands love."; /* Donation beg -> message */ "Transmission is a full-featured torrent application. A lot of time and effort have gone into development, coding, and refinement. If you enjoy using it, please consider showing your love with a donation." = "Transmission er et gratis torrent program. Der bruges mange ressourcer pÃ¥ udvikling, kodning og refinement. Hvis du synes godt om programmet, venligst overvej at støtte projektet ved at donere."; /* Transmission already running alert -> title */ "Transmission is already running." = "Transmission kører allerede."; /* inspector -> peer table -> header status bar -> status label Torrent -> status string */ "UL" = "UL"; /* Inspector -> Peers tab -> peers */ "UL to %d" = "UL til %d"; /* File Outline -> Menu */ "Uncheck Selected" = "Fravælg valgte"; /* Status Bar -> speed tooltip */ "unlimited" = "ubegrænset"; /* Torrent -> error string unreadable */ "unreadable error" = "ulæselig fejl"; /* Save log panel -> default file name */ "untitled" = "Ikke-navngivet"; /* Torrent table -> group row -> tooltip */ "Upload speed" = "Upload hastighed"; /* Stats window -> label */ "Uploaded" = "Overført"; /* Torrent -> progress string */ "uploaded %@ (Ratio: %@)" = "Overført %1$@ (Delingsforhold: %2$@)"; /* inspector -> peer table -> header tool tip */ "Uploading To Peer" = "Overfører til forbindelse"; /* Torrent -> status string */ "Waiting to check existing data" = "Afventer kontrol af eksisterende data"; /* Torrent -> status string */ "Waiting to download" = "Afventer download"; /* Torrent -> status string */ "Waiting to seed" = "Afventer deling"; /* Drag overlay -> url */ "Web Address" = "Web adresse"; /* Torrent -> status string */ "web seed" = "Web seed"; /* inspector -> web seed table -> header */ "Web Seeds" = "Web seeds"; /* Legal alert -> title */ "Welcome to Transmission" = "Velkommen til Transmission"; /* Groups -> Name */ "Yellow" = "Gul"; /* Inspector -> peer -> status */ "You unchoked the peer, but the peer is not interested" = "You unchoked the peer, but the peer is not interested"; /* Inspector -> peer -> status */ "You want to download, but peer does not want to send (interested and choked)" = "You want to download, but peer does not want to send (interested and choked)"; transmission-2.92/macosx/da.lproj/PaxHeaders.4960/InfoOptionsView.xib0000644000000000000000000000013112664476420022501 xustar0029 mtime=1456635152.15349922 30 atime=1456635152.152499203 30 ctime=1457295922.676853424 transmission-2.92/macosx/da.lproj/InfoOptionsView.xib0000644000175000017500000012120312664476420024126 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/da.lproj/PaxHeaders.4960/InfoActivityView.xib0000644000000000000000000000013012664476420022641 xustar0029 mtime=1456635152.15349922 29 atime=1456635152.15349922 30 ctime=1457295922.676853424 transmission-2.92/macosx/da.lproj/InfoActivityView.xib0000644000175000017500000012745312664476420024304 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/da.lproj/PaxHeaders.4960/InfoGeneralView.xib0000644000000000000000000000013012664476420022422 xustar0029 mtime=1456635152.15349922 29 atime=1456635152.15349922 30 ctime=1457295922.676853424 transmission-2.92/macosx/da.lproj/InfoGeneralView.xib0000644000175000017500000006270212664476420024060 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/da.lproj/PaxHeaders.4960/AddMagnetWindow.xib0000644000000000000000000000013212662757243022417 xustar0030 mtime=1456201379.252861838 30 atime=1456201379.252861838 30 ctime=1457295922.676853424 transmission-2.92/macosx/da.lproj/AddMagnetWindow.xib0000644000175000017500000006536212662757243024060 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/da.lproj/PaxHeaders.4960/MainMenu.xib0000644000000000000000000000013212644245522021104 xustar0030 mtime=1452362578.789699695 30 atime=1452362578.789699695 30 ctime=1457295922.676853424 transmission-2.92/macosx/da.lproj/MainMenu.xib0000644000175000017500000045730012644245522022542 0ustar00mikedldmikedld00000000000000 CA CA YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7NjIsIDYyfdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPEgABAG5NTQAqAADwSAAAAAAG BgYGKioqKjs7Ozt9fX19kpKSks7Ozs7c3Nzc+/v7+/////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////z8/P/paWl/6Wlpf/z 8/P///////////////////////////////////////////////////////////////////////////// //////////////8GBgYGDg4ODjo6OjpMTExMjIyMjJ+fn5/T09PT4ODg4Pv7+/v///////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////////////////////// ////////////////////////////////////KysrKzs7Ozufn5+fuLi4uOjo6Ojy8vLy+vr6+vv7+/v/ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////// /////////////////////////////////////////////////////////zs7OztNTU1Ntra2ts7Ozs75 +fn5//////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////// //////////////////////////////////////////////////////////////////////////////98 fHx8jIyMjOjo6Oj4+Pj4//////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////8/Pz/6Wlpf+l paX/8/Pz//////////////////////////////////////////////////////////////////////// ////////////////////kZGRkZ6enp7y8vLy//////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////////////////////// /////////////////////////////////////////87Ozs7U1NTU+fn5+f////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////////////////////// ///////////////////////////////////////////////////////////////d3d3d4eHh4fv7+/v/ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////// //////////////////////////////////////////////////////////////////////////////// ////+/v7+/v7+/v///////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////Pz8/+l paX/paWl//Pz8/////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////z8/P/paWl/6Wlpf/z8/P///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////Pz8/+lpaX/paWl//Pz8/// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////z 8/P/paWl/6Wlpf/z8/P///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////z8/P/paWl/6Wlpf/z 8/P///////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////8/Pz/6Wlpf+l paX/8/Pz//////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////Pz8/+l paX/paWl//Pz8/////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////z8/P/paWl/6Wlpf/z8/P///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////Pz8/+lpaX/paWl//Pz8/// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////z 8/P/paWl/6Wlpf/z8/P///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////z8/P/paWl/6Wlpf/z 8/P///////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////8/Pz/6Wlpf+l paX/8/Pz//////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////Pz8/+l paX/paWl//Pz8/////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////z8/P/paWl/6Wlpf/z8/P///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////Pz8/+lpaX/paWl//Pz8/// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////z 8/P/paWl/6Wlpf/z8/P///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////z8/P/paWl/6Wlpf/z 8/P///////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////8/Pz/6Wlpf+l paX/8/Pz//////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////Pz8/+l paX/paWl//Pz8/////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////z8/P/paWl/6Wlpf/z8/P///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////Pz8/+lpaX/paWl//Pz8/// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////z 8/P/paWl/6Wlpf/z8/P///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////z8/P/paWl/6Wlpf/z 8/P///////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////8/Pz/6Wlpf+l paX/8/Pz//////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////Pz8/+l paX/paWl//Pz8/////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////z8/P/paWl/6Wlpf/z8/P///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////Pz8/+lpaX/paWl//Pz8/// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////z 8/P/paWl/6Wlpf/z8/P///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////z8/P/paWl/6Wlpf/z 8/P///////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////8/Pz/6Wlpf+l paX/8/Pz//////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////Pz8/+l paX/paWl//Pz8/////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////z8/P/paWl/6Wlpf/z8/P///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////Pz8/+lpaX/paWl//Pz8/// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////z 8/P/paWl/6Wlpf/z8/P///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////z8/P/paWl/6Wlpf/z 8/P///////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////8/Pz/6Wlpf+l paX/8/Pz//////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////Pz8/+l paX/paWl//Pz8/////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////z8/P/paWl/6Wlpf/z8/P///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////Pz8/+lpaX/paWl//Pz8/// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////z 8/P/paWl/6Wlpf/z8/P///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////z8/P/paWl/6Wlpf/z 8/P///////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////8/Pz/6Wlpf+l paX/8/Pz//////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////Pz8/+l paX/paWl//Pz8/////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////z8/P/paWl/6Wlpf/z8/P///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////Pz8/+lpaX/paWl//Pz8/// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////z 8/P/paWl/6Wlpf/z8/P///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////z8/P/paWl/6Wlpf/z 8/P///////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////8/Pz/6Wlpf+lpaX/8/Pz//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////Pz8/+lpaX/paWl//Pz8/////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////z8/P/paWl/6Wlpf/z8/P///////////// //////////////////////////////////////////////////////////////////////////////8A EQEAAAMAAAABAHwAAAEBAAMAAAABAHwAAAECAAMAAAAEAADxKgEDAAMAAAABAAEAAAEGAAMAAAABAAIA AAERAAQAAAABAAAACAESAAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABAHwAAAEXAAQAAAABAADw QAEaAAUAAAABAADxGgEbAAUAAAABAADxIgEcAAMAAAABAAEAAAEoAAMAAAABAAIAAAFSAAMAAAABAAEA AAFTAAMAAAAEAADxModzAAcAAA80AADxOgAAAAAAAACQAAAAAQAAAJAAAAABAAgACAAIAAgAAQABAAEA AQAADzRhcHBsAhAAAG1udHJSR0IgWFlaIAffAAwABQANABIACGFjc3BBUFBMAAAAAEFQUEwAAAAAAAAA AAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAEWRlc2MAAAFQAAAAYmRzY20AAAG0AAAEGmNwcnQAAAXQAAAAI3d0cHQAAAX0AAAA FHJYWVoAAAYIAAAAFGdYWVoAAAYcAAAAFGJYWVoAAAYwAAAAFHJUUkMAAAZEAAAIDGFhcmcAAA5QAAAA IHZjZ3QAAA5wAAAAMG5kaW4AAA6gAAAAPmNoYWQAAA7gAAAALG1tb2QAAA8MAAAAKGJUUkMAAAZEAAAI DGdUUkMAAAZEAAAIDGFhYmcAAA5QAAAAIGFhZ2cAAA5QAAAAIGRlc2MAAAAAAAAACERpc3BsYXkAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAACIAAAAMaHJIUgAAABQAAAGoa29LUgAAAAwAAAG8bmJO TwAAABIAAAHIaWQAAAAAABIAAAHaaHVIVQAAABQAAAHsY3NDWgAAABYAAAIAZGFESwAAABwAAAIWdWtV QQAAABwAAAIyYXIAAAAAABQAAAJOaXRJVAAAABQAAAJicm9STwAAABIAAAJ2bmxOTAAAABYAAAKIaGVJ TAAAABYAAAKeZXNFUwAAABIAAAJ2ZmlGSQAAABAAAAK0emhUVwAAAAwAAALEdmlWTgAAAA4AAALQc2tT SwAAABYAAALeemhDTgAAAAwAAALEcnVSVQAAACQAAAL0ZnJGUgAAABYAAAMYbXMAAAAAABIAAAMuY2FF UwAAABgAAANAdGhUSAAAAAwAAANYZXNYTAAAABIAAAJ2ZGVERQAAABAAAANkZW5VUwAAABIAAAN0cHRC UgAAABgAAAOGcGxQTAAAABIAAAOeZWxHUgAAACIAAAOwc3ZTRQAAABAAAAPSdHJUUgAAABQAAAPiamFK UAAAAA4AAAP2cHRQVAAAABYAAAQEAEwAQwBEACAAdQAgAGIAbwBqAGnO7LfsACAATABDAEQARgBhAHIA ZwBlAC0ATABDAEQATABDAEQAIABXAGEAcgBuAGEAUwB6AO0AbgBlAHMAIABMAEMARABCAGEAcgBlAHYA bgD9ACAATABDAEQATABDAEQALQBmAGEAcgB2AGUAcwBrAOYAcgBtBBoEPgQ7BEwEPgRABD4EMgQ4BDkA IABMAEMARCAPAEwAQwBEACAGRQZEBkgGRgYpAEwAQwBEACAAYwBvAGwAbwByAGkATABDAEQAIABjAG8A bABvAHIASwBsAGUAdQByAGUAbgAtAEwAQwBEIA8ATABDAEQAIAXmBdEF4gXVBeAF2QBWAOQAcgBpAC0A TABDAERfaYJyACAATABDAEQATABDAEQAIABNAOAAdQBGAGEAcgBlAGIAbgDpACAATABDAEQEJgQyBDUE QgQ9BD4EOQAgBBYEGgAtBDQEOARBBD8EOwQ1BDkATABDAEQAIABjAG8AdQBsAGUAdQByAFcAYQByAG4A YQAgAEwAQwBEAEwAQwBEACAAZQBuACAAYwBvAGwAbwByAEwAQwBEACAOKg41AEYAYQByAGIALQBMAEMA RABDAG8AbABvAHIAIABMAEMARABMAEMARAAgAEMAbwBsAG8AcgBpAGQAbwBLAG8AbABvAHIAIABMAEMA RAOIA7MDxwPBA8kDvAO3ACADvwO4A8wDvQO3ACAATABDAEQARgDkAHIAZwAtAEwAQwBEAFIAZQBuAGsA bABpACAATABDAEQwqzDpMPwAIABMAEMARABMAEMARAAgAGEAIABDAG8AcgBlAHMAAHRleHQAAAAAQ29w eXJpZ2h0IEFwcGxlIEluYy4sIDIwMTUAAFhZWiAAAAAAAADzFgABAAAAARbKWFlaIAAAAAAAAHHAAAA5 igAAAWdYWVogAAAAAAAAYSMAALnmAAAT9lhZWiAAAAAAAAAj8gAADJAAAL3QY3VydgAAAAAAAAQAAAAA BQAKAA8AFAAZAB4AIwAoAC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUA mgCfAKMAqACtALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgB PgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0C JgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08D WgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME 4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8G wAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI +wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4AL mAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8O mw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegS BxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V 4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e 6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/Ak HyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p 0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv /jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2 rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE9 4D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVF mkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN 3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxW qVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7Ng BWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp 8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0 cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/ hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqL MIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqX dZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+ak VqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/ 9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbO ts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3Zbe HN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7Zzu KO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+ 3P9t//9wYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKDnZjZ3QAAAAAAAAAAQABAAAAAAAAAAEA AAABAAAAAAAAAAEAAAABAAAAAAAAAAEAAG5kaW4AAAAAAAAANgAAp0AAAFWAAABMwAAAnsAAACWAAAAM wAAAUAAAAFRAAAIzMwACMzMAAjMzAAAAAAAAAABzZjMyAAAAAAABDHIAAAX4///zHQAAB7oAAP1y///7 nf///aQAAAPZAADAcW1tb2QAAAAAAAAGEAAAoA4AAAAAyc58GAAAAAAAAAAAAAAAAAAAAADSJSYnKFok Y2xhc3NuYW1lWCRjbGFzc2VzXxAQTlNCaXRtYXBJbWFnZVJlcKMnKSpaTlNJbWFnZVJlcFhOU09iamVj dNIlJiwtV05TQXJyYXmiLCrSJSYvMF5OU011dGFibGVBcnJheaMvLCrTMjMKNDU2V05TV2hpdGVcTlND b2xvclNwYWNlRDAgMAAQA4AM0iUmODlXTlNDb2xvcqI4KtIlJjs8V05TSW1hZ2WiOypfEA9OU0tleWVk QXJjaGl2ZXLRP0BUcm9vdIABAAAACAAAABEAAAAaAAAAIwAAAC0AAAAyAAAANwAAAEYAAABMAAAAVwAA AF4AAABlAAAAcgAAAHkAAACBAAAAgwAAAIUAAACKAAAAjAAAAI4AAACXAAAAnAAAAKcAAACpAAAAqwAA AK0AAACyAAAAtQAAALcAAAC5AAAAuwAAAL0AAADCAAAA2QAAANsAAADdAAEBUQABAVYAAQFhAAEBagAB AX0AAQGBAAEBjAABAZUAAQGaAAEBogABAaUAAQGqAAEBuQABAb0AAQHEAAEBzAABAdkAAQHeAAEB4AAB AeIAAQHnAAEB7wABAfIAAQH3AAEB/wABAgIAAQIUAAECFwABAhwAAAAAAAAEAQAAAAAAAABBAAAAAAAA AAAAAAAAAAECHg transmission-2.92/macosx/da.lproj/PaxHeaders.4960/GroupRules.xib0000644000000000000000000000013212666747213021512 xustar0030 mtime=1457245835.374999661 30 atime=1457245835.374999661 30 ctime=1457295922.676853424 transmission-2.92/macosx/da.lproj/GroupRules.xib0000644000175000017500000004156712666747213023154 0ustar00mikedldmikedld00000000000000 name comment name comment fFlatFileList.name allTrackersFlat fFlatFileList.name allTrackersFlat transmission-2.92/macosx/da.lproj/PaxHeaders.4960/AddWindow.xib0000644000000000000000000000013212640354045021250 xustar0030 mtime=1451350053.200163415 30 atime=1451350053.200163415 30 ctime=1457295922.676853424 transmission-2.92/macosx/da.lproj/AddWindow.xib0000644000175000017500000007304612640354045022707 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/da.lproj/PaxHeaders.4960/GlobalOptionsPopover.xib0000644000000000000000000000013212640354045023517 xustar0030 mtime=1451350053.196163345 30 atime=1451350053.196163345 30 ctime=1457295922.675853407 transmission-2.92/macosx/da.lproj/GlobalOptionsPopover.xib0000644000175000017500000006367712640354045025167 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/Defaults.plist0000644000000000000000000000013212442116643017777 xustar0030 mtime=1418239395.809786026 30 atime=1418239395.809786026 30 ctime=1457295922.482850125 transmission-2.92/macosx/Defaults.plist0000644000175000017500000001071212442116643021425 0ustar00mikedldmikedld00000000000000 AutoImport AutoSize AutoStartDownload AutoUpdateBeta BadgeDownloadRate BadgeUploadRate BindPort 51413 BlocklistAutoUpdate BlocklistNew CheckDownload CheckQuit CheckQuitDownloading CheckRemove CheckRemoveDownloading CheckStalled CheckUpload CreatorLocation ~/Desktop DeleteOriginalTorrent DHTGlobal DisplayGroupRowRatio DisplayNotifications DisplayPeerProgressBarNumber DisplayProgressBarAvailable DisplaySmallStatusRegular DisplayStatusProgressSelected DoneScriptEnabled DownloadAsk DownloadAskManual DownloadAskMulti DownloadFolder ~/Downloads DownloadLimit 100 DownloadLocationConstant DownloadSound Glass EncryptionPrefer EncryptionRequire Filter None FilterBar FilterGroup -2 FilterSearchType Name IdleLimitCheck IdleLimitMinutes 30 IncompleteDownloadFolder ~/Downloads InfoVisible InspectorSelected Info LocalPeerDiscoveryGlobal MagnetOpenAsk MessageLevel 1 MoveChoice Constant NatTraversal PeersTorrent 60 PeersTotal 200 PEXGlobal PiecesBar PiecesViewShowAvailability PlayDownloadSound PlaySeedingSound Queue QueueDownloadNumber 3 QueueSeed QueueSeedNumber 3 RandomPort RatioCheck RatioLimit 2 RemoveWhenFinishSeeding RenamePartialFiles RPC RPCAuthorize RPCPort 9091 RPCUsername admin RPCUseWhitelist RPCWebDiscovery SeedingSound Submarine ShowInspector SleepPrevent SmallView Sort Order SortByGroup SortReverse SpeedLimit SpeedLimitAuto SpeedLimitAutoDay 127 SpeedLimitAutoOffDate 2000-01-01T13:00:00Z SpeedLimitAutoOnDate 2000-01-01T03:00:00Z SpeedLimitDownloadLimit 10 SpeedLimitUploadLimit 10 StalledMinutes 30 StatusBar StatusLabel RatioTotal SUEnableAutomaticChecks UploadLimit 50 UseIncompleteDownloadFolder UTPGlobal WarningCreatorBlankAddress WarningCreatorPrivateBlankAddress WarningDonate WarningDuplicate WarningFolderDataSameName WarningInvalidOpen WarningLegal WarningRemainingSpace WarningRemoveCompleted WarningRemoveTrackers WarningResetStats transmission-2.92/macosx/PaxHeaders.4960/FileOutlineView.m0000644000000000000000000000013212644245522020406 xustar0030 mtime=1452362578.789699695 30 atime=1452362578.788699677 30 ctime=1457295923.121860991 transmission-2.92/macosx/FileOutlineView.m0000644000175000017500000001105212644245522022032 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: FileOutlineView.m 14665 2016-01-07 17:21:12Z mikedld $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "InfoWindowController.h" #import "FileListNode.h" #import "FileNameCell.h" #import "FileOutlineView.h" #import "FilePriorityCell.h" #import "Torrent.h" @implementation FileOutlineView - (void) awakeFromNib { FileNameCell * nameCell = [[FileNameCell alloc] init]; [[self tableColumnWithIdentifier: @"Name"] setDataCell: nameCell]; [nameCell release]; FilePriorityCell * priorityCell = [[FilePriorityCell alloc] init]; [[self tableColumnWithIdentifier: @"Priority"] setDataCell: priorityCell]; [priorityCell release]; [self setAutoresizesOutlineColumn: NO]; [self setIndentationPerLevel: 14.0]; fMouseRow = -1; } - (void) dealloc { [super dealloc]; } - (void) mouseDown: (NSEvent *) event { [[self window] makeKeyWindow]; [super mouseDown: event]; } - (NSMenu *) menuForEvent: (NSEvent *) event { const NSInteger row = [self rowAtPoint: [self convertPoint: [event locationInWindow] fromView: nil]]; if (row >= 0) { if (![self isRowSelected: row]) [self selectRowIndexes: [NSIndexSet indexSetWithIndex: row] byExtendingSelection: NO]; } else [self deselectAll: self]; return [self menu]; } - (NSRect) iconRectForRow: (int) row { FileNameCell * cell = (FileNameCell *)[self preparedCellAtColumn: [self columnWithIdentifier: @"Name"] row: row]; NSRect iconRect = [cell imageRectForBounds: [self rectOfRow: row]]; iconRect.origin.x += [self indentationPerLevel] * (CGFloat)([self levelForRow: row] + 1); return iconRect; } - (void) updateTrackingAreas { [super updateTrackingAreas]; for (NSTrackingArea * area in [self trackingAreas]) { if ([area owner] == self && [[area userInfo] objectForKey: @"Row"]) [self removeTrackingArea: area]; } NSRange visibleRows = [self rowsInRect: [self visibleRect]]; if (visibleRows.length == 0) return; NSPoint mouseLocation = [self convertPoint: [[self window] mouseLocationOutsideOfEventStream] fromView: nil]; for (NSInteger row = visibleRows.location, col = [self columnWithIdentifier: @"Priority"]; row < NSMaxRange(visibleRows); row++) { FilePriorityCell * cell = (FilePriorityCell *)[self preparedCellAtColumn: col row: row]; NSDictionary * userInfo = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: row] forKey: @"Row"]; [cell addTrackingAreasForView: self inRect: [self frameOfCellAtColumn: col row: row] withUserInfo: userInfo mouseLocation: mouseLocation]; } } - (NSInteger) hoveredRow { return fMouseRow; } - (void) mouseEntered: (NSEvent *) event { NSNumber * row; if ((row = [(NSDictionary *)[event userData] objectForKey: @"Row"])) { fMouseRow = [row intValue]; [self setNeedsDisplayInRect: [self frameOfCellAtColumn: [self columnWithIdentifier: @"Priority"] row: fMouseRow]]; } } - (void) mouseExited: (NSEvent *) event { NSNumber * row; if ((row = [(NSDictionary *)[event userData] objectForKey: @"Row"])) { [self setNeedsDisplayInRect: [self frameOfCellAtColumn: [self columnWithIdentifier: @"Priority"] row: [row intValue]]]; fMouseRow = -1; } } @end transmission-2.92/macosx/PaxHeaders.4960/DragOverlayWindow.h0000644000000000000000000000013212442116673020736 xustar0030 mtime=1418239419.183186569 30 atime=1418239419.183186569 30 ctime=1457295923.041859631 transmission-2.92/macosx/DragOverlayWindow.h0000644000175000017500000000336712442116673022374 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: DragOverlayWindow.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import @interface DragOverlayWindow : NSWindow { tr_session * fLib; NSViewAnimation * fFadeInAnimation, * fFadeOutAnimation; } - (id) initWithLib: (tr_session *) lib forWindow: (NSWindow *) window; - (void) setTorrents: (NSArray *) files; - (void) setFile: (NSString *) file; - (void) setURL: (NSString *) url; - (void) fadeIn; - (void) fadeOut; @end transmission-2.92/macosx/PaxHeaders.4960/PeerTableView.m0000644000000000000000000000013212442116616020027 xustar0030 mtime=1418239374.019412603 30 atime=1418239374.019412603 30 ctime=1457295923.416866008 transmission-2.92/macosx/PeerTableView.m0000644000175000017500000000420312442116616021453 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: PeerTableView.m 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "PeerTableView.h" @implementation PeerTableView - (void) mouseDown: (NSEvent *) event { NSPoint point = [self convertPoint: [event locationInWindow] fromView: nil]; if ([self rowAtPoint: point] != -1 && [self columnAtPoint: point] == [self columnWithIdentifier: @"Progress"]) { [[NSUserDefaults standardUserDefaults] setBool: ![[NSUserDefaults standardUserDefaults] boolForKey: @"DisplayPeerProgressBarNumber"] forKey: @"DisplayPeerProgressBarNumber"]; NSIndexSet * rowIndexes = [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [self numberOfRows])], * columnIndexes = [NSIndexSet indexSetWithIndex: [self columnAtPoint: point]]; [self reloadDataForRowIndexes: rowIndexes columnIndexes: columnIndexes]; } } @end transmission-2.92/macosx/PaxHeaders.4960/FileOutlineView.h0000644000000000000000000000013212442116621020372 xustar0030 mtime=1418239377.037464324 30 atime=1418239377.037464324 30 ctime=1457295923.115860889 transmission-2.92/macosx/FileOutlineView.h0000644000175000017500000000302512442116621022017 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: FileOutlineView.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @class Torrent; @interface FileOutlineView : NSOutlineView { NSInteger fMouseRow; } - (NSRect) iconRectForRow: (int) row; - (NSInteger) hoveredRow; @end transmission-2.92/macosx/PaxHeaders.4960/InfoTabButtonBack.m0000644000000000000000000000013212442116646020633 xustar0030 mtime=1418239398.192826864 30 atime=1418239398.192826864 30 ctime=1457295923.222862709 transmission-2.92/macosx/InfoTabButtonBack.m0000644000175000017500000000537512442116646022272 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoTabButtonBack.m 13251 2012-03-13 02:52:11Z livings124 $ * * Copyright (c) 2011-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "InfoTabButtonBack.h" @implementation InfoTabButtonBack - (id) initWithFrame: (NSRect) rect { if ((self = [super initWithFrame: rect])) { NSColor * lightColor = [NSColor colorWithCalibratedRed: 245.0/255.0 green: 245.0/255.0 blue: 245.0/255.0 alpha: 1.0]; NSColor * darkColor = [NSColor colorWithCalibratedRed: 215.0/255.0 green: 215.0/255.0 blue: 215.0/255.0 alpha: 1.0]; fGradient = [[NSGradient alloc] initWithStartingColor: lightColor endingColor: darkColor]; } return self; } - (void) dealloc { [fGradient release]; [super dealloc]; } - (void) drawRect: (NSRect) rect { NSInteger count = 0; NSRect gridRects[2]; NSColor * colorRects[2]; NSRect lineBorderRect = NSMakeRect(NSMinX(rect), NSHeight([self bounds]) - 1.0, NSWidth(rect), 1.0); if (NSIntersectsRect(lineBorderRect, rect)) { gridRects[count] = lineBorderRect; colorRects[count] = [NSColor grayColor]; ++count; rect.size.height -= 1.0; } lineBorderRect.origin.y = 0.0; if (NSIntersectsRect(lineBorderRect, rect)) { gridRects[count] = lineBorderRect; colorRects[count] = [NSColor grayColor]; ++count; rect.origin.y += 1.0; rect.size.height -= 1.0; } NSRectFillListWithColors(gridRects, colorRects, count); [fGradient drawInRect: rect angle: 270.0]; } @end transmission-2.92/macosx/PaxHeaders.4960/Info.plist0000644000000000000000000000013212664476420017133 xustar0030 mtime=1456635152.152499203 30 atime=1456635152.152499203 30 ctime=1457295922.488850227 transmission-2.92/macosx/Info.plist0000644000175000017500000000720512664476420020564 0ustar00mikedldmikedld00000000000000 CFBundleDevelopmentRegion en CFBundleDocumentTypes CFBundleTypeExtensions torrent CFBundleTypeIconFile TransmissionDocument CFBundleTypeName BitTorrent Document CFBundleTypeRole Viewer LSHandlerRank Owner LSItemContentTypes org.bittorrent.torrent CFBundleExecutable Transmission CFBundleGetInfoString VERSION_STRING_INFOPLIST (SVN_REVISION_NUM) CFBundleHelpBookFolder TransmissionHelp CFBundleHelpBookName Transmission Help CFBundleIconFile Transmission CFBundleIdentifier org.m0k.transmission CFBundleInfoDictionaryVersion 6.0 CFBundleName Transmission CFBundlePackageType APPL CFBundleShortVersionString VERSION_STRING_INFOPLIST CFBundleSignature TR## CFBundleURLTypes CFBundleURLName BitTorrent Magnet URL CFBundleURLSchemes magnet CFBundleVersion SVN_REVISION_NUM LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion 10.6.0 NSAppleScriptEnabled YES NSAppTransportSecurity NSAllowsArbitraryLoads NSHumanReadableCopyright Copyright © 2005-2016 The Transmission Project NSMainNibFile MainMenu NSPrincipalClass NSApplication NSServices NSPortName Transmission NSSendTypes NSStringPboardType NSURLPboardType NSSupportsAutomaticGraphicsSwitching SUAllowsAutomaticUpdates SUFeedURL https://update.transmissionbt.com/appcast.xml SUPublicDSAKeyFile sparkle_dsa_pub.pem SUScheduledCheckInterval 86400 UTExportedTypeDeclarations UTTypeConformsTo public.data public.item com.bittorrent.torrent UTTypeDescription BitTorrent Document UTTypeIconFile TransmissionDocument UTTypeIdentifier org.bittorrent.torrent UTTypeReferenceURL http://www.bittorrent.org/beps/bep_0000.html UTTypeTagSpecification com.apple.ostype TORR public.filename-extension torrent public.mime-type application/x-bittorrent transmission-2.92/macosx/PaxHeaders.4960/StatusBarView.m0000644000000000000000000000013212644245522020077 xustar0030 mtime=1452362578.821700255 30 atime=1452362578.821700255 30 ctime=1457295923.541868133 transmission-2.92/macosx/StatusBarView.m0000644000175000017500000001414712644245522021533 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: StatusBarView.m 14662 2016-01-06 11:05:37Z mikedld $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "StatusBarView.h" #import "NSApplicationAdditions.h" #import @interface StatusBarView (Private) - (void) reload; @end @implementation StatusBarView - (id) initWithFrame: (NSRect) rect { if ((self = [super initWithFrame: rect])) { NSColor * lightColor = [NSColor colorWithCalibratedRed: 160.0/255.0 green: 160.0/255.0 blue: 160.0/255.0 alpha: 1.0]; NSColor * darkColor = [NSColor colorWithCalibratedRed: 155.0/255.0 green: 155.0/255.0 blue: 155.0/255.0 alpha: 1.0]; fGradient = [[NSGradient alloc] initWithStartingColor: lightColor endingColor: darkColor]; if (![NSApp isOnYosemiteOrBetter]) { CIFilter * randomFilter = [CIFilter filterWithName: @"CIRandomGenerator"]; [randomFilter setDefaults]; fNoiseImage = [randomFilter valueForKey: @"outputImage"]; CIFilter * monochromeFilter = [CIFilter filterWithName: @"CIColorMonochrome"]; [monochromeFilter setDefaults]; [monochromeFilter setValue: fNoiseImage forKey: @"inputImage"]; CIColor * monoFilterColor = [CIColor colorWithRed: 1.0 green: 1.0 blue: 1.0]; [monochromeFilter setValue: monoFilterColor forKey: @"inputColor"]; fNoiseImage = [[monochromeFilter valueForKey:@"outputImage"] retain]; } else fNoiseImage = nil; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reload) name: NSWindowDidBecomeMainNotification object: [self window]]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reload) name: NSWindowDidResignMainNotification object: [self window]]; } return self; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; [fNoiseImage release]; [fGradient release]; [super dealloc]; } - (BOOL) mouseDownCanMoveWindow { return YES; } - (BOOL) isOpaque { return YES; } - (void) drawRect: (NSRect) rect { if ([NSApp isOnYosemiteOrBetter]) { [[NSColor windowBackgroundColor] setFill]; NSRectFill(rect); const NSRect lineBorderRect = NSMakeRect(NSMinX(rect), 0.0, NSWidth(rect), 1.0); if (NSIntersectsRect(lineBorderRect, rect)) { [[NSColor lightGrayColor] setFill]; NSRectFill(lineBorderRect); } } else { const BOOL active = [[self window] isMainWindow]; NSInteger count = 0; NSRect gridRects[active ? 2 : 3]; NSColor * colorRects[active ? 2 : 3]; //bottom line NSRect lineBorderRect = NSMakeRect(NSMinX(rect), 0.0, NSWidth(rect), 1.0); NSRect intersectLineBorderRect = NSIntersectionRect(lineBorderRect, rect); if (!NSIsEmptyRect(intersectLineBorderRect)) { gridRects[count] = intersectLineBorderRect; colorRects[count] = active ? [NSColor colorWithCalibratedWhite: 0.25 alpha: 1.0] : [NSColor colorWithCalibratedWhite: 0.5 alpha: 1.0]; ++count; rect.origin.y += intersectLineBorderRect.size.height; rect.size.height -= intersectLineBorderRect.size.height; } //top line if (active) { lineBorderRect.origin.y = NSHeight([self bounds]) - 1.0; intersectLineBorderRect = NSIntersectionRect(lineBorderRect, rect); if (!NSIsEmptyRect(intersectLineBorderRect)) { gridRects[count] = intersectLineBorderRect; colorRects[count] = [NSColor colorWithCalibratedWhite: 0.75 alpha: 1.0]; ++count; rect.size.height -= intersectLineBorderRect.size.height; } } if (!NSIsEmptyRect(rect)) { if (active) { const NSRect gradientRect = NSMakeRect(NSMinX(rect), 1.0, NSWidth(rect), NSHeight([self bounds]) - 1.0 - 1.0); //proper gradient requires the full height of the bar [fGradient drawInRect: gradientRect angle: 270.0]; } else { gridRects[count] = rect; colorRects[count] = [NSColor colorWithCalibratedWhite: 0.85 alpha: 1.0]; ++count; } } NSRectFillListWithColors(gridRects, colorRects, count); if (fNoiseImage) { [fNoiseImage drawInRect: rect fromRect: [self convertRectToBacking: rect] operation: NSCompositeSourceOver fraction: 0.12]; } } } @end @implementation StatusBarView (Private) - (void) reload { [self setNeedsDisplay: YES]; } @end transmission-2.92/macosx/PaxHeaders.4960/StatusBarController.h0000644000000000000000000000013212442116621021274 xustar0030 mtime=1418239377.037464324 30 atime=1418239377.037464324 30 ctime=1457295923.526867878 transmission-2.92/macosx/StatusBarController.h0000644000175000017500000000361112442116621022722 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: StatusBarController.h 13343 2012-06-10 13:47:32Z livings124 $ * * Copyright (c) 2011-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import @interface StatusBarController : NSViewController { IBOutlet NSButton * fStatusButton; IBOutlet NSTextField * fTotalDLField, * fTotalULField; IBOutlet NSImageView * fTotalDLImageView, * fTotalULImageView; tr_session * fLib; CGFloat fPreviousDownloadRate, fPreviousUploadRate; } - (id) initWithLib: (tr_session *) lib; - (void) updateWithDownload: (CGFloat) dlRate upload: (CGFloat) ulRate; - (void) setStatusLabel: (id) sender; - (void) updateSpeedFieldsToolTips; @end transmission-2.92/macosx/PaxHeaders.4960/TorrentTableView.m0000644000000000000000000000013212666747213020604 xustar0030 mtime=1457245835.374999661 30 atime=1457245835.374999661 30 ctime=1457295923.598869103 transmission-2.92/macosx/TorrentTableView.m0000644000175000017500000007205412666747213022241 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: TorrentTableView.m 14705 2016-03-03 17:57:08Z mikedld $ * * Copyright (c) 2005-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "TorrentTableView.h" #import "Controller.h" #import "FileListNode.h" #import "InfoOptionsViewController.h" #import "NSApplicationAdditions.h" #import "NSStringAdditions.h" #import "Torrent.h" #import "TorrentCell.h" #import "TorrentGroup.h" #define MAX_GROUP 999999 //eliminate when Lion-only #define ACTION_MENU_GLOBAL_TAG 101 #define ACTION_MENU_UNLIMITED_TAG 102 #define ACTION_MENU_LIMIT_TAG 103 #define ACTION_MENU_PRIORITY_HIGH_TAG 101 #define ACTION_MENU_PRIORITY_NORMAL_TAG 102 #define ACTION_MENU_PRIORITY_LOW_TAG 103 #define TOGGLE_PROGRESS_SECONDS 0.175 @interface TorrentTableView (Private) - (BOOL) pointInGroupStatusRect: (NSPoint) point; - (void) setGroupStatusColumns; @end @implementation TorrentTableView - (id) initWithCoder: (NSCoder *) decoder { if ((self = [super initWithCoder: decoder])) { fDefaults = [NSUserDefaults standardUserDefaults]; fTorrentCell = [[TorrentCell alloc] init]; NSData * groupData = [fDefaults dataForKey: @"CollapsedGroups"]; if (groupData) fCollapsedGroups = [[NSUnarchiver unarchiveObjectWithData: groupData] mutableCopy]; else fCollapsedGroups = [[NSMutableIndexSet alloc] init]; fMouseRow = -1; fMouseControlRow = -1; fMouseRevealRow = -1; fMouseActionRow = -1; fActionPopoverShown = NO; [self setDelegate: self]; fPiecesBarPercent = [fDefaults boolForKey: @"PiecesBar"] ? 1.0 : 0.0; } return self; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; [fCollapsedGroups release]; [fPiecesBarAnimation release]; [fMenuTorrent release]; [fSelectedValues release]; [fTorrentCell release]; [super dealloc]; } - (void) awakeFromNib { //set group columns to show ratio, needs to be in awakeFromNib to size columns correctly [self setGroupStatusColumns]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(setNeedsDisplay) name: @"RefreshTorrentTable" object: nil]; } - (BOOL) isGroupCollapsed: (NSInteger) value { if (value == -1) value = MAX_GROUP; return [fCollapsedGroups containsIndex: value]; } - (void) removeCollapsedGroup: (NSInteger) value { if (value == -1) value = MAX_GROUP; [fCollapsedGroups removeIndex: value]; } - (void) removeAllCollapsedGroups { [fCollapsedGroups removeAllIndexes]; } - (void) saveCollapsedGroups { [fDefaults setObject: [NSArchiver archivedDataWithRootObject: fCollapsedGroups] forKey: @"CollapsedGroups"]; } - (BOOL) outlineView: (NSOutlineView *) outlineView isGroupItem: (id) item { return ![item isKindOfClass: [Torrent class]]; } - (CGFloat) outlineView: (NSOutlineView *) outlineView heightOfRowByItem: (id) item { return [item isKindOfClass: [Torrent class]] ? [self rowHeight] : GROUP_SEPARATOR_HEIGHT; } - (NSCell *) outlineView: (NSOutlineView *) outlineView dataCellForTableColumn: (NSTableColumn *) tableColumn item: (id) item { const BOOL group = ![item isKindOfClass: [Torrent class]]; if (!tableColumn) return !group ? fTorrentCell : nil; else return group ? [tableColumn dataCellForRow: [self rowForItem: item]] : nil; } - (void) outlineView: (NSOutlineView *) outlineView willDisplayCell: (id) cell forTableColumn: (NSTableColumn *) tableColumn item: (id) item { if ([item isKindOfClass: [Torrent class]]) { if (!tableColumn) { [cell setRepresentedObject: item]; const NSInteger row = [self rowForItem: item]; [cell setHover: row == fMouseRow]; [cell setControlHover: row == fMouseControlRow]; [cell setRevealHover: row == fMouseRevealRow]; [cell setActionHover: row == fMouseActionRow]; } } else { NSString * ident = [tableColumn identifier]; if ([ident isEqualToString: @"UL Image"] || [ident isEqualToString: @"DL Image"]) { //ensure arrows are white only when selected [[cell image] setTemplate: [cell backgroundStyle] == NSBackgroundStyleLowered]; } } } - (NSRect) frameOfCellAtColumn: (NSInteger) column row: (NSInteger) row { if (column == -1) return [self rectOfRow: row]; else { NSRect rect = [super frameOfCellAtColumn: column row: row]; //adjust placement for proper vertical alignment if (column == [self columnWithIdentifier: @"Group"]) rect.size.height -= 1.0f; return rect; } } - (NSString *) outlineView: (NSOutlineView *) outlineView typeSelectStringForTableColumn: (NSTableColumn *) tableColumn item: (id) item { if ([item isKindOfClass: [Torrent class]]) return [(Torrent *)item name]; else return [[self dataSource] outlineView:outlineView objectValueForTableColumn:[self tableColumnWithIdentifier:@"Group"] byItem:item]; } - (NSString *) outlineView: (NSOutlineView *) outlineView toolTipForCell: (NSCell *) cell rect: (NSRectPointer) rect tableColumn: (NSTableColumn *) column item: (id) item mouseLocation: (NSPoint) mouseLocation { NSString * ident = [column identifier]; if ([ident isEqualToString: @"DL"] || [ident isEqualToString: @"DL Image"]) return NSLocalizedString(@"Download speed", "Torrent table -> group row -> tooltip"); else if ([ident isEqualToString: @"UL"] || [ident isEqualToString: @"UL Image"]) return [fDefaults boolForKey: @"DisplayGroupRowRatio"] ? NSLocalizedString(@"Ratio", "Torrent table -> group row -> tooltip") : NSLocalizedString(@"Upload speed", "Torrent table -> group row -> tooltip"); else if (ident) { NSUInteger count = [[item torrents] count]; if (count == 1) return NSLocalizedString(@"1 transfer", "Torrent table -> group row -> tooltip"); else return [NSString stringWithFormat: NSLocalizedString(@"%@ transfers", "Torrent table -> group row -> tooltip"), [NSString formattedUInteger: count]]; } else return nil; } - (void) updateTrackingAreas { [super updateTrackingAreas]; [self removeTrackingAreas]; const NSRange rows = [self rowsInRect: [self visibleRect]]; if (rows.length == 0) return; NSPoint mouseLocation = [self convertPoint: [[self window] mouseLocationOutsideOfEventStream] fromView: nil]; for (NSUInteger row = rows.location; row < NSMaxRange(rows); row++) { if (![[self itemAtRow: row] isKindOfClass: [Torrent class]]) continue; NSDictionary * userInfo = [NSDictionary dictionaryWithObject: [NSNumber numberWithInteger: row] forKey: @"Row"]; TorrentCell * cell = (TorrentCell *)[self preparedCellAtColumn: -1 row: row]; [cell addTrackingAreasForView: self inRect: [self rectOfRow: row] withUserInfo: userInfo mouseLocation: mouseLocation]; } } - (void) removeTrackingAreas { fMouseRow = -1; fMouseControlRow = -1; fMouseRevealRow = -1; fMouseActionRow = -1; for (NSTrackingArea * area in [self trackingAreas]) { if ([area owner] == self && [[area userInfo] objectForKey: @"Row"]) [self removeTrackingArea: area]; } } - (void) setRowHover: (NSInteger) row { NSAssert([fDefaults boolForKey: @"SmallView"], @"cannot set a hover row when not in compact view"); fMouseRow = row; if (row >= 0) [self setNeedsDisplayInRect: [self rectOfRow: row]]; } - (void) setControlButtonHover: (NSInteger) row { fMouseControlRow = row; if (row >= 0) [self setNeedsDisplayInRect: [self rectOfRow: row]]; } - (void) setRevealButtonHover: (NSInteger) row { fMouseRevealRow = row; if (row >= 0) [self setNeedsDisplayInRect: [self rectOfRow: row]]; } - (void) setActionButtonHover: (NSInteger) row { fMouseActionRow = row; if (row >= 0) [self setNeedsDisplayInRect: [self rectOfRow: row]]; } - (void) mouseEntered: (NSEvent *) event { NSDictionary * dict = (NSDictionary *)[event userData]; NSNumber * row; if ((row = [dict objectForKey: @"Row"])) { NSInteger rowVal = [row integerValue]; NSString * type = [dict objectForKey: @"Type"]; if ([type isEqualToString: @"Action"]) fMouseActionRow = rowVal; else if ([type isEqualToString: @"Control"]) fMouseControlRow = rowVal; else if ([type isEqualToString: @"Reveal"]) fMouseRevealRow = rowVal; else { fMouseRow = rowVal; if (![fDefaults boolForKey: @"SmallView"]) return; } [self setNeedsDisplayInRect: [self rectOfRow: rowVal]]; } } - (void) mouseExited: (NSEvent *) event { NSDictionary * dict = (NSDictionary *)[event userData]; NSNumber * row; if ((row = [dict objectForKey: @"Row"])) { NSString * type = [dict objectForKey: @"Type"]; if ([type isEqualToString: @"Action"]) fMouseActionRow = -1; else if ([type isEqualToString: @"Control"]) fMouseControlRow = -1; else if ([type isEqualToString: @"Reveal"]) fMouseRevealRow = -1; else { fMouseRow = -1; if (![fDefaults boolForKey: @"SmallView"]) return; } [self setNeedsDisplayInRect: [self rectOfRow: [row integerValue]]]; } } - (void) outlineViewSelectionIsChanging: (NSNotification *) notification { #warning elliminate when view-based? //if pushing a button, don't change the selected rows if (fSelectedValues) [self selectValues: fSelectedValues]; } - (void) outlineViewItemDidExpand: (NSNotification *) notification { NSInteger value = [[[notification userInfo] objectForKey: @"NSObject"] groupIndex]; if (value < 0) value = MAX_GROUP; if ([fCollapsedGroups containsIndex: value]) { [fCollapsedGroups removeIndex: value]; [[NSNotificationCenter defaultCenter] postNotificationName: @"OutlineExpandCollapse" object: self]; } } - (void) outlineViewItemDidCollapse: (NSNotification *) notification { NSInteger value = [[[notification userInfo] objectForKey: @"NSObject"] groupIndex]; if (value < 0) value = MAX_GROUP; [fCollapsedGroups addIndex: value]; [[NSNotificationCenter defaultCenter] postNotificationName: @"OutlineExpandCollapse" object: self]; } - (void) mouseDown: (NSEvent *) event { NSPoint point = [self convertPoint: [event locationInWindow] fromView: nil]; const NSInteger row = [self rowAtPoint: point]; //check to toggle group status before anything else if ([self pointInGroupStatusRect: point]) { [fDefaults setBool: ![fDefaults boolForKey: @"DisplayGroupRowRatio"] forKey: @"DisplayGroupRowRatio"]; [self setGroupStatusColumns]; return; } const BOOL pushed = row != -1 && (fMouseActionRow == row || fMouseRevealRow == row || fMouseControlRow == row); //if pushing a button, don't change the selected rows if (pushed) fSelectedValues = [[self selectedValues] retain]; [super mouseDown: event]; [fSelectedValues release]; fSelectedValues = nil; //avoid weird behavior when showing menu by doing this after mouse down if (row != -1 && fMouseActionRow == row) { #warning maybe make appear on mouse down [self displayTorrentActionPopoverForEvent: event]; } else if (!pushed && [event clickCount] == 2) //double click { id item = nil; if (row != -1) item = [self itemAtRow: row]; if (!item || [item isKindOfClass: [Torrent class]]) [fController showInfo: nil]; else { if ([self isItemExpanded: item]) [self collapseItem: item]; else [self expandItem: item]; } } else; } - (void) selectValues: (NSArray *) values { NSMutableIndexSet * indexSet = [NSMutableIndexSet indexSet]; for (id item in values) { if ([item isKindOfClass: [Torrent class]]) { const NSInteger index = [self rowForItem: item]; if (index != -1) [indexSet addIndex: index]; } else { const NSInteger group = [item groupIndex]; for (NSInteger i = 0; i < [self numberOfRows]; i++) { id tableItem = [self itemAtRow: i]; if ([tableItem isKindOfClass: [TorrentGroup class]] && group == [tableItem groupIndex]) { [indexSet addIndex: i]; break; } } } } [self selectRowIndexes: indexSet byExtendingSelection: NO]; } - (NSArray *) selectedValues { NSIndexSet * selectedIndexes = [self selectedRowIndexes]; NSMutableArray * values = [NSMutableArray arrayWithCapacity: [selectedIndexes count]]; for (NSUInteger i = [selectedIndexes firstIndex]; i != NSNotFound; i = [selectedIndexes indexGreaterThanIndex: i]) [values addObject: [self itemAtRow: i]]; return values; } - (NSArray *) selectedTorrents { NSIndexSet * selectedIndexes = [self selectedRowIndexes]; NSMutableArray * torrents = [NSMutableArray arrayWithCapacity: [selectedIndexes count]]; //take a shot at guessing capacity for (NSUInteger i = [selectedIndexes firstIndex]; i != NSNotFound; i = [selectedIndexes indexGreaterThanIndex: i]) { id item = [self itemAtRow: i]; if ([item isKindOfClass: [Torrent class]]) [torrents addObject: item]; else { NSArray * groupTorrents = [item torrents]; [torrents addObjectsFromArray: groupTorrents]; if ([self isItemExpanded: item]) i +=[groupTorrents count]; } } return torrents; } - (NSMenu *) menuForEvent: (NSEvent *) event { NSInteger row = [self rowAtPoint: [self convertPoint: [event locationInWindow] fromView: nil]]; if (row >= 0) { if (![self isRowSelected: row]) [self selectRowIndexes: [NSIndexSet indexSetWithIndex: row] byExtendingSelection: NO]; return fContextRow; } else { [self deselectAll: self]; return fContextNoRow; } } //make sure that the pause buttons become orange when holding down the option key - (void) flagsChanged: (NSEvent *) event { [self display]; [super flagsChanged: event]; } //option-command-f will focus the filter bar's search field - (void) keyDown: (NSEvent *) event { const unichar firstChar = [[event charactersIgnoringModifiers] characterAtIndex: 0]; if (firstChar == 'f' && [event modifierFlags] & NSAlternateKeyMask && [event modifierFlags] & NSCommandKeyMask) [fController focusFilterField]; else if (firstChar == ' ') [fController toggleQuickLook: nil]; else if ([event keyCode] == 53) //esc key [self deselectAll: nil]; else [super keyDown: event]; } - (NSRect) iconRectForRow: (NSInteger) row { return [fTorrentCell iconRectForBounds: [self rectOfRow: row]]; } - (void) paste: (id) sender { NSURL * url; if ((url = [NSURL URLFromPasteboard: [NSPasteboard generalPasteboard]])) [fController openURL: [url absoluteString]]; else { NSArray * items = [[NSPasteboard generalPasteboard] readObjectsForClasses: [NSArray arrayWithObject: [NSString class]] options: nil]; if (items) { NSDataDetector * detector = [NSDataDetector dataDetectorWithTypes: NSTextCheckingTypeLink error: nil]; for (NSString * pbItem in items) { pbItem = [pbItem stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; if ([pbItem rangeOfString: @"magnet:" options: (NSAnchoredSearch | NSCaseInsensitiveSearch)].location != NSNotFound) [fController openURL: pbItem]; else { #warning only accept full text? for (NSTextCheckingResult * result in [detector matchesInString: pbItem options: 0 range: NSMakeRange(0, [pbItem length])]) [fController openURL: [[result URL] absoluteString]]; } } } } } - (BOOL) validateMenuItem: (NSMenuItem *) menuItem { SEL action = [menuItem action]; if (action == @selector(paste:)) { if ([[[NSPasteboard generalPasteboard] types] containsObject: NSURLPboardType]) return YES; NSArray * items = [[NSPasteboard generalPasteboard] readObjectsForClasses: [NSArray arrayWithObject: [NSString class]] options: nil]; if (items) { NSDataDetector * detector = [NSDataDetector dataDetectorWithTypes: NSTextCheckingTypeLink error: nil]; for (NSString * pbItem in items) { pbItem = [pbItem stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; if (([pbItem rangeOfString: @"magnet:" options: (NSAnchoredSearch | NSCaseInsensitiveSearch)].location != NSNotFound) || [detector firstMatchInString: pbItem options: 0 range: NSMakeRange(0, [pbItem length])]) return YES; } } return NO; } return YES; } - (void) toggleControlForTorrent: (Torrent *) torrent { if ([torrent isActive]) [fController stopTorrents: [NSArray arrayWithObject: torrent]]; else { if ([NSEvent modifierFlags] & NSAlternateKeyMask) [fController resumeTorrentsNoWait: [NSArray arrayWithObject: torrent]]; else if ([torrent waitingToStart]) [fController stopTorrents: [NSArray arrayWithObject: torrent]]; else [fController resumeTorrents: [NSArray arrayWithObject: torrent]]; } } - (void) displayTorrentActionPopoverForEvent: (NSEvent *) event { const NSInteger row = [self rowAtPoint: [self convertPoint: [event locationInWindow] fromView: nil]]; if (row < 0) return; const NSRect rect = [fTorrentCell iconRectForBounds: [self rectOfRow: row]]; if (fActionPopoverShown) return; Torrent * torrent = [self itemAtRow: row]; NSPopover * popover = [[NSPopover alloc] init]; [popover setBehavior: NSPopoverBehaviorTransient]; InfoOptionsViewController * infoViewController = [[InfoOptionsViewController alloc] init]; [popover setContentViewController: infoViewController]; [popover setDelegate: self]; [popover showRelativeToRect: rect ofView: self preferredEdge: NSMaxYEdge]; [infoViewController setInfoForTorrents: [NSArray arrayWithObject: torrent]]; [infoViewController updateInfo]; [infoViewController release]; [popover release]; } //don't show multiple popovers when clicking the gear button repeatedly - (void) popoverWillShow: (NSNotification *) notification { fActionPopoverShown = YES; } - (void) popoverWillClose: (NSNotification *) notification { fActionPopoverShown = NO; } //eliminate when Lion-only, along with all the menu item instance variables - (void) menuNeedsUpdate: (NSMenu *) menu { //this method seems to be called when it shouldn't be if (!fMenuTorrent || ![menu supermenu]) return; if (menu == fUploadMenu || menu == fDownloadMenu) { NSMenuItem * item; if ([menu numberOfItems] == 3) { const NSInteger speedLimitActionValue[] = { 0, 5, 10, 20, 30, 40, 50, 75, 100, 150, 200, 250, 500, 750, 1000, 1500, 2000, -1 }; for (NSInteger i = 0; speedLimitActionValue[i] != -1; i++) { item = [[NSMenuItem alloc] initWithTitle: [NSString stringWithFormat: NSLocalizedString(@"%d KB/s", "Action menu -> upload/download limit"), speedLimitActionValue[i]] action: @selector(setQuickLimit:) keyEquivalent: @""]; [item setTarget: self]; [item setRepresentedObject: [NSNumber numberWithInt: speedLimitActionValue[i]]]; [menu addItem: item]; [item release]; } } const BOOL upload = menu == fUploadMenu; const BOOL limit = [fMenuTorrent usesSpeedLimit: upload]; item = [menu itemWithTag: ACTION_MENU_LIMIT_TAG]; [item setState: limit ? NSOnState : NSOffState]; [item setTitle: [NSString stringWithFormat: NSLocalizedString(@"Limit (%d KB/s)", "torrent action menu -> upload/download limit"), [fMenuTorrent speedLimit: upload]]]; item = [menu itemWithTag: ACTION_MENU_UNLIMITED_TAG]; [item setState: !limit ? NSOnState : NSOffState]; } else if (menu == fRatioMenu) { NSMenuItem * item; if ([menu numberOfItems] == 4) { const float ratioLimitActionValue[] = { 0.25, 0.5, 0.75, 1.0, 1.5, 2.0, 3.0, -1.0 }; for (NSInteger i = 0; ratioLimitActionValue[i] != -1.0; i++) { item = [[NSMenuItem alloc] initWithTitle: [NSString localizedStringWithFormat: @"%.2f", ratioLimitActionValue[i]] action: @selector(setQuickRatio:) keyEquivalent: @""]; [item setTarget: self]; [item setRepresentedObject: [NSNumber numberWithFloat: ratioLimitActionValue[i]]]; [menu addItem: item]; [item release]; } } const tr_ratiolimit mode = [fMenuTorrent ratioSetting]; item = [menu itemWithTag: ACTION_MENU_LIMIT_TAG]; [item setState: mode == TR_RATIOLIMIT_SINGLE ? NSOnState : NSOffState]; [item setTitle: [NSString localizedStringWithFormat: NSLocalizedString(@"Stop at Ratio (%.2f)", "torrent action menu -> ratio stop"), [fMenuTorrent ratioLimit]]]; item = [menu itemWithTag: ACTION_MENU_UNLIMITED_TAG]; [item setState: mode == TR_RATIOLIMIT_UNLIMITED ? NSOnState : NSOffState]; item = [menu itemWithTag: ACTION_MENU_GLOBAL_TAG]; [item setState: mode == TR_RATIOLIMIT_GLOBAL ? NSOnState : NSOffState]; } else if (menu == fPriorityMenu) { const tr_priority_t priority = [fMenuTorrent priority]; NSMenuItem * item = [menu itemWithTag: ACTION_MENU_PRIORITY_HIGH_TAG]; [item setState: priority == TR_PRI_HIGH ? NSOnState : NSOffState]; item = [menu itemWithTag: ACTION_MENU_PRIORITY_NORMAL_TAG]; [item setState: priority == TR_PRI_NORMAL ? NSOnState : NSOffState]; item = [menu itemWithTag: ACTION_MENU_PRIORITY_LOW_TAG]; [item setState: priority == TR_PRI_LOW ? NSOnState : NSOffState]; } } //the following methods might not be needed when Lion-only - (void) setQuickLimitMode: (id) sender { const BOOL limit = [sender tag] == ACTION_MENU_LIMIT_TAG; [fMenuTorrent setUseSpeedLimit: limit upload: [sender menu] == fUploadMenu]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptions" object: nil]; } - (void) setQuickLimit: (id) sender { const BOOL upload = [sender menu] == fUploadMenu; [fMenuTorrent setUseSpeedLimit: YES upload: upload]; [fMenuTorrent setSpeedLimit: [[sender representedObject] intValue] upload: upload]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptions" object: nil]; } - (void) setGlobalLimit: (id) sender { [fMenuTorrent setUseGlobalSpeedLimit: [(NSButton *)sender state] != NSOnState]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptions" object: nil]; } - (void) setQuickRatioMode: (id) sender { tr_ratiolimit mode; switch ([sender tag]) { case ACTION_MENU_UNLIMITED_TAG: mode = TR_RATIOLIMIT_UNLIMITED; break; case ACTION_MENU_LIMIT_TAG: mode = TR_RATIOLIMIT_SINGLE; break; case ACTION_MENU_GLOBAL_TAG: mode = TR_RATIOLIMIT_GLOBAL; break; default: return; } [fMenuTorrent setRatioSetting: mode]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptions" object: nil]; } - (void) setQuickRatio: (id) sender { [fMenuTorrent setRatioSetting: TR_RATIOLIMIT_SINGLE]; [fMenuTorrent setRatioLimit: [[sender representedObject] floatValue]]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptions" object: nil]; } - (void) setPriority: (id) sender { tr_priority_t priority; switch ([sender tag]) { case ACTION_MENU_PRIORITY_HIGH_TAG: priority = TR_PRI_HIGH; break; case ACTION_MENU_PRIORITY_NORMAL_TAG: priority = TR_PRI_NORMAL; break; case ACTION_MENU_PRIORITY_LOW_TAG: priority = TR_PRI_LOW; break; default: NSAssert1(NO, @"Unknown priority: %ld", [sender tag]); } [fMenuTorrent setPriority: priority]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil]; } - (void) togglePiecesBar { NSMutableArray * progressMarks = [NSMutableArray arrayWithCapacity: 16]; for (NSAnimationProgress i = 0.0625; i <= 1.0; i += 0.0625) [progressMarks addObject: [NSNumber numberWithFloat: i]]; //this stops a previous animation [fPiecesBarAnimation release]; fPiecesBarAnimation = [[NSAnimation alloc] initWithDuration: TOGGLE_PROGRESS_SECONDS animationCurve: NSAnimationEaseIn]; [fPiecesBarAnimation setAnimationBlockingMode: NSAnimationNonblocking]; [fPiecesBarAnimation setProgressMarks: progressMarks]; [fPiecesBarAnimation setDelegate: self]; [fPiecesBarAnimation startAnimation]; } - (void) animationDidEnd: (NSAnimation *) animation { if (animation == fPiecesBarAnimation) { [fPiecesBarAnimation release]; fPiecesBarAnimation = nil; } } - (void) animation: (NSAnimation *) animation didReachProgressMark: (NSAnimationProgress) progress { if (animation == fPiecesBarAnimation) { if ([fDefaults boolForKey: @"PiecesBar"]) fPiecesBarPercent = progress; else fPiecesBarPercent = 1.0 - progress; [self setNeedsDisplay: YES]; } } - (CGFloat) piecesBarPercent { return fPiecesBarPercent; } - (void) selectAndScrollToRow: (NSInteger) row { NSParameterAssert(row >= 0); NSParameterAssert(row < [self numberOfRows]); [self selectRowIndexes: [NSIndexSet indexSetWithIndex: row] byExtendingSelection: NO]; const NSRect rowRect = [self rectOfRow: row]; const NSRect viewRect = [[self superview] frame]; NSPoint scrollOrigin = rowRect.origin; scrollOrigin.y += (rowRect.size.height - viewRect.size.height) / 2; if (scrollOrigin.y < 0) scrollOrigin.y = 0; [[[self superview] animator] setBoundsOrigin: scrollOrigin]; } @end @implementation TorrentTableView (Private) - (BOOL) pointInGroupStatusRect: (NSPoint) point { NSInteger row = [self rowAtPoint: point]; if (row < 0 || [[self itemAtRow: row] isKindOfClass: [Torrent class]]) return NO; NSString * ident = [[[self tableColumns] objectAtIndex: [self columnAtPoint: point]] identifier]; return [ident isEqualToString: @"UL"] || [ident isEqualToString: @"UL Image"] || [ident isEqualToString: @"DL"] || [ident isEqualToString: @"DL Image"]; } - (void) setGroupStatusColumns { const BOOL ratio = [fDefaults boolForKey: @"DisplayGroupRowRatio"]; [[self tableColumnWithIdentifier: @"DL"] setHidden: ratio]; [[self tableColumnWithIdentifier: @"DL Image"] setHidden: ratio]; } @end transmission-2.92/macosx/PaxHeaders.4960/it.lproj0000644000000000000000000000013212666747213016652 xustar0030 mtime=1457245835.356999352 30 atime=1418239380.253519438 30 ctime=1457295922.787855311 transmission-2.92/macosx/it.lproj/0000755000175000017500000000000012666747213020354 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/it.lproj/PaxHeaders.4960/InfoPlist.strings0000644000000000000000000000013212664476420022246 xustar0030 mtime=1456635152.072497829 30 atime=1456635152.072497829 30 ctime=1457295922.787855311 transmission-2.92/macosx/it.lproj/InfoPlist.strings0000644000175000017500000000017512664476420023676 0ustar00mikedldmikedld00000000000000/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = "Copyright © 2005-2016 The Transmission Project";transmission-2.92/macosx/it.lproj/PaxHeaders.4960/Creator.xib0000644000000000000000000000013212640354044021016 xustar0030 mtime=1451350052.801156485 30 atime=1451350052.801156485 30 ctime=1457295922.786855294 transmission-2.92/macosx/it.lproj/Creator.xib0000644000175000017500000006020712640354044022450 0ustar00mikedldmikedld00000000000000 File File transmission-2.92/macosx/it.lproj/PaxHeaders.4960/PrefsWindow.xib0000644000000000000000000000013212640354044021666 xustar0030 mtime=1451350052.805156554 30 atime=1451350052.804156537 30 ctime=1457295922.787855311 transmission-2.92/macosx/it.lproj/PrefsWindow.xib0000644000175000017500000056431712640354044023333 0ustar00mikedldmikedld00000000000000 ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer NSAllRomanInputSourcesLocaleIdentifier NSAllRomanInputSourcesLocaleIdentifier YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7MTgsIDE4fdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPERHETU0AKgAABGKAACBQOCQW DQeEQmDAuBv6BveFRGJROKEMVBRGOZ1vVlNd1vdVRSRRQDQMEwMEQMJg8LhgcKM2ENILhdsdsrl2AxkN 1rNJBwN1QeSwIHwMMgwHg8MgoEA4MA4GgkKhYLBgQBoOiIPBwMhYOhaWhUIBIGhEFggBAojghrgB0vSS r99icAHA0F8kwNcQQSCUTIEtFkwGMSCcQA8NBgMAgNhsOAQGg6igsFAcAPp+PwAA0FAyBAJ/gB7vd9gB 1zcABZ5L4APV1SloBG8lsuls7vJ3OtFQQIhAKnNOKFOokoEslgN7Pd7AB/Px+gAAgMBADKQx1ut0gBrM hlAAXD4fAByudxgANPnWAd6NYAPRxPgAOMQmUAFkyG5QN5sNAwwceESShKFgNgxjECZ6HqeoAAQAgCgA AgDpKAwCpKex1nYABrl+XjLn20IHBQCIABKBpmuYeLsnycp4AAcwLv6N5EkqZJfloWAjIGeSBhAOA8D0 XZCj6PoSAAf7ngKBCTgGgZ6nwfQAFuWRaAAEIOg3IpynMAAKgycIAAwCp1gAfh4R0fR0qCdoFieABGl0 bZ1E0RhBBwgZvoGCIrjEMBbkwRxIBuftBAAdp3ni5h9NKdBymwAB0HObIAHmfQJAACADIgJYbnzSRxm0 0R3ueCIHIgeB9hmABTmwA5/DyOg2CIgZfoGAYhiQJhXlET5PCaATpgAZhil6AAHgQAIAAKftIgOAsRHs fAFABUblhIElOGYXVIn8AcRBeEh3NMczPGcAlYivc45uaexHIIGAbBsTZWFQVgyA0DYMAAaBlGMAADn6 dETmXMYHxwfODAAGgTHeAABRUABhGHTh+n0egAB8G0FHia1Dm6DT+iwNA3E8c5umwMaCBAEIRkIVRWFc PYYhcFQAHCckxHQbZVs2AqTg4GIuAAd5yGKAAPAs7J3GzO59guKtHGiW4ABMCJqMucsMHGDoyAAM5Aks YplmCW4joIBoGgsNBT3kS4kiGH4AHIcxzgAZRelIAANhJOoMA4D4AAYf5pWIBB2gAbxowUBoYaAeRuYE DJ6pCfp3zEdYHigABBlWZR0FMT5LiCgwDCWUBSFKWYtiwKIAnKchyAAc5ybmEgUhS8RvRMFYQ4WfZ4Oy c5vcSCQIOYee5gIeJvTHm2HmnDxJHEB55mIW5WCYg4YkAQ5HGKPQ5jaBLNNCfB7U4b/zgADIBaqCAHUO AB9uef59QUfx7nmAB+wS5h6Sefw9EWCyF2NUfIaBRjWC6PqBQuSDglPsG4YoPAaAvAkN8bg4R2jTGwNY dwMwVlYD6GoHpDB/kQH8ZhMY8WKjuHUiwdI4x0j7G6N8cw8RxDiG8OcZY1h0DOFcNEdIcyBuFIMA1CgC wiD7fopwgQ4iBgOD4GgK4kgTgbAUA8Zw0hqOxG0OYdI4B1jyHAOIdQ9CPD8H+N8hwAEMECXAQJMRAknk KWOQI0JCiUkCLoQI0pAmAECfwQIzUdiRkIICAA8BAAADAAAAAQASAAABAQADAAAAAQASAAABAgADAAAA BAAABRwBAwADAAAAAQAFAAABBgADAAAAAQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAA AQAEAAABFgADAAAAAQASAAABFwAEAAAAAQAABFoBHAADAAAAAQABAAABPQADAAAAAQACAAABUgADAAAA AQABAAABUwADAAAABAAABSSHcwAHAAAMmAAABSwAAAAAAAgACAAIAAgAAQABAAEAAQAADJhhcHBsAhAA AG1udHJSR0IgWFlaIAfdAAMADgAWAAEAO2Fjc3BBUFBMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2 1gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA EWRlc2MAAAFQAAAAYmRzY20AAAG0AAABgGNwcnQAAAM0AAAAJHd0cHQAAANYAAAAFHJYWVoAAANsAAAA FGdYWVoAAAOAAAAAFGJYWVoAAAOUAAAAFHJUUkMAAAOoAAAIDGFhcmcAAAu0AAAAIHZjZ3QAAAvUAAAA MG5kaW4AAAwEAAAAPmNoYWQAAAxEAAAALG1tb2QAAAxwAAAAKGJUUkMAAAOoAAAIDGdUUkMAAAOoAAAI DGFhYmcAAAu0AAAAIGFhZ2cAAAu0AAAAIGRlc2MAAAAAAAAACERpc3BsYXkAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAABtbHVjAAAAAAAAAB4AAAAMc2tTSwAAAAgAAAF4Y2FFUwAAAAgAAAF4aGVJTAAAAAgAAAF4cHRC UgAAAAgAAAF4aXRJVAAAAAgAAAF4aHVIVQAAAAgAAAF4dWtVQQAAAAgAAAF4a29LUgAAAAgAAAF4bmJO TwAAAAgAAAF4Y3NDWgAAAAgAAAF4emhUVwAAAAgAAAF4ZGVERQAAAAgAAAF4cm9STwAAAAgAAAF4c3ZT RQAAAAgAAAF4emhDTgAAAAgAAAF4amFKUAAAAAgAAAF4YXIAAAAAAAgAAAF4ZWxHUgAAAAgAAAF4cHRQ VAAAAAgAAAF4bmxOTAAAAAgAAAF4ZnJGUgAAAAgAAAF4ZXNFUwAAAAgAAAF4dGhUSAAAAAgAAAF4dHJU UgAAAAgAAAF4ZmlGSQAAAAgAAAF4aHJIUgAAAAgAAAF4cGxQTAAAAAgAAAF4cnVSVQAAAAgAAAF4ZW5V UwAAAAgAAAF4ZGFESwAAAAgAAAF4AGkATQBhAGN0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSwgSW5jLiwg MjAxMwBYWVogAAAAAAAA8xYAAQAAAAEWylhZWiAAAAAAAABxwAAAOYoAAAFnWFlaIAAAAAAAAGEjAAC5 5gAAE/ZYWVogAAAAAAAAI/IAAAyQAAC90GN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIA NgA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCjAKgArQCyALcAvADBAMYA ywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwB gwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoC hAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD 0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcF dwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EH dAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJ zwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUM jgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YP sw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMT QxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0X QRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4ob shvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwg mCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl 9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r 0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIy KjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5 BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNA ZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVI S0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQ u1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZ uFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBj Q2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQht YG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4 EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSD V4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6P No+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kb r5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKo xKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2 ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHE zsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TT xtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvj Y+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnz p/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//cGFyYQAAAAAAAwAAAAJm ZgAA8qcAAA1ZAAAT0AAACg52Y2d0AAAAAAAAAAEAAQAAAAAAAAABAAAAAQAAAAAAAAABAAAAAQAAAAAA AAABAABuZGluAAAAAAAAADYAAKdAAABVgAAATMAAAJ7AAAAlgAAADMAAAFAAAABUQAACMzMAAjMzAAIz MwAAAAAAAAAAc2YzMgAAAAAAAQxyAAAF+P//8x0AAAe6AAD9cv//+53///2kAAAD2QAAwHFtbW9kAAAA AAAABhAAAKAHAAAAAMknHgAAAAAAAAAAAAAAAAAAAAAA0iUmJyhaJGNsYXNzbmFtZVgkY2xhc3Nlc18Q EE5TQml0bWFwSW1hZ2VSZXCjJykqWk5TSW1hZ2VSZXBYTlNPYmplY3TSJSYsLVdOU0FycmF5oiwq0iUm LzBeTlNNdXRhYmxlQXJyYXmjLywq0zIzCjQ1NldOU1doaXRlXE5TQ29sb3JTcGFjZUQwIDAAEAOADNIl Jjg5V05TQ29sb3KiOCrSJSY7PFdOU0ltYWdlojsqXxAPTlNLZXllZEFyY2hpdmVy0T9AVHJvb3SAAQAI ABEAGgAjAC0AMgA3AEYATABXAF4AZQByAHkAgQCDAIUAigCMAI4AlwCcAKcAqQCrAK0AsgC1ALcAuQC7 AL0AwgDZANsA3RKlEqoStRK+EtES1RLgEukS7hL2EvkS/hMNExETGBMgEy0TMhM0EzYTOxNDE0YTSxNT E1YTaBNrE3AAAAAAAAACAQAAAAAAAABBAAAAAAAAAAAAAAAAAAATcg transmission-2.92/macosx/it.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212442116625022550 xustar0030 mtime=1418239381.879547303 30 atime=1418239381.879547303 30 ctime=1457295922.787855311 transmission-2.92/macosx/it.lproj/Localizable.strings0000644000175000017500000011521712442116625024204 0ustar00mikedldmikedld00000000000000/* Inspector -> selected torrents stats -> bytes */ "%@ bytes" = "%@ byte"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "%@ files" = "%@ file"; /* Prefs -> blocklist -> message */ "%@ IP address rules in list" = "%@ regole indirizzi IP nella lista"; /* Inspector -> selected torrents */ "%@ magnetized transfers" = "%@ trasferimenti magnetici"; /* file size string Inspector -> Files tab -> file status string Status bar transfer count */ "%@ of %@" = "%1$@ su %2$@"; /* Torrent -> progress string */ "%@ of torrent metadata retrieved" = "recuperati %@ metadati del torrent"; /* Torrent -> eta string */ "%@ remaining" = "tempo residuo %@"; /* Add torrent -> info Inspector -> Activity tab -> progress Torrent -> progress string */ "%@ selected" = "selezionati %@"; /* stats window -> times opened */ "%@ times" = "%@ volte"; /* Drag overlay -> torrents */ "%@ Torrent Files" = "%@ file torrent"; /* Inspector -> selected torrents */ "%@ Torrents Selected" = "%@ torrent selezionati"; /* Inspector -> selected torrents stats total */ "%@ total" = "totale %@"; /* Filter Bar Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "%@ transfers" = "%@ trasferimenti"; /* Inspector -> Activity tab -> have */ "%@ verified" = "verificati %@"; /* Inspector -> Peers tab -> peers */ "%d cache" = "%d cache"; /* Inspector -> Peers tab -> peers */ "%d Connected" = "%d connessi"; /* Inspector -> Peers tab -> peers */ "%d DHT" = "%d DHT"; /* Dock item - Downloading */ "%d Downloading" = "%d in ricezione"; /* Inspector -> Peers tab -> peers */ "%d incoming" = "%d in arrivo"; /* Action menu -> upload/download limit Status Bar -> speed tooltip */ "%d KB/s" = "%d KB/s"; /* Inspector -> Peers tab -> peers */ "%d local discovery" = "%d scoperta locale"; /* Inspector -> Peers tab -> peers */ "%d LTEP" = "%d LTEP"; /* Info options -> global setting */ "%d minutes" = "%d minuti"; /* Inspector -> Peers tab -> peers */ "%d PEX" = "%d PEX"; /* Create torrent -> info */ "%d pieces, %@ each" = "%1$d parti, %2$@ ciascuna"; /* Dock item - Seeding */ "%d Seeding" = "%d in distribuzione"; /* Inspector -> Peers tab -> peers */ "%d tracker" = "%d server traccia"; /* Torrent -> status string */ "%d web seeds" = "%d seeder web"; /* time string */ "%u days" = "%u giorni"; /* time string */ "%u hr" = "%u ore"; /* time string */ "%u min" = "%u min"; /* time string */ "%u sec" = "%u sec"; /* time string */ "%u years" = "%u anni"; /* time string */ "1 day" = "1 giorno"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "1 file" = "1 file"; /* Inspector -> selected torrents */ "1 magnetized transfer" = "1 trasferimento magnetico"; /* Info options -> global setting */ "1 minute" = "1 minuto"; /* Create torrent -> info */ "1 piece, %@" = "1 parte, %@"; /* stats window -> times opened */ "1 time" = "1 volta"; /* Filter Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "1 transfer" = "1 trasferimento"; /* time string */ "1 year" = "1 anno"; /* Open invalid alert -> title */ "\"%@\" is not a valid torrent file." = "\"%@\" non è un file torrent valido."; /* Prefs -> blocklist -> message */ "A blocklist must first be downloaded" = "Occorre prima scaricare una blocklist"; /* Create torrent -> file already exists warning -> warning */ "A file with the name \"%@\" already exists in the directory \"%@\". Choose a new name or directory to create the torrent file." = "Un file di nome \"%1$@\" esiste già nella cartella \"%2$@\". Scegliere un nuovo nome o una nuova cartella per creare il file torrent."; /* Move inside itself alert -> title */ "A folder cannot be moved to inside itself." = "Una cartella non può essere spostata dentro sé stessa."; /* Create torrent -> zero size -> warning */ "A torrent file cannot be created for files with no size." = "Un file torrent non può essere creato per file di dimensioni nulle."; /* Create torrent -> file already exists warning -> title */ "A torrent file with this name and directory cannot be created." = "Impossibile creare un file torrent con questo nome e cartella."; /* Create torrent -> blank address -> message */ "A transfer marked as private with no tracker addresses will be unable to connect to peers. The torrent file will only be useful if you plan to upload the file to a tracker website that will add the addresses for you." = "Un trasferimento marcato come privato e senza server traccia non sarà in grado di connettersi ai peer. Il file torrent sarà utile solo se si desidera inviarlo ad un sito web che aggiungerà l'indirizzo del server traccia."; /* Open duplicate alert -> title Open duplicate magnet alert -> title */ "A transfer of \"%@\" already exists." = "Esiste già un trasferimento di \"%@\"."; /* Filter Bar -> filter button */ "Active" = "Attivi"; /* Inspector -> tab Inspector view -> title */ "Activity" = "Attività"; /* Add torrent -> same name -> button */ "Add" = "Aggiungi"; /* Inspector view -> tracker buttons */ "Add a tracker" = "Aggiungi un server traccia"; /* Magnet link failed -> title */ "Adding magnetized transfer failed." = "L'aggiunta del trasferimento magnetico è fallita."; /* Filter Bar -> filter button inspector -> check all */ "All" = "Tutti"; /* Filter Bar -> group filter menu Groups -> Button */ "All Groups" = "Tutti i gruppi"; /* Create torrent -> failed -> warning */ "An unknown error has occurred." = "Si è verificato un errore sconosciuto."; /* Tracker last announce */ "Announce error" = "Errore annuncio"; /* Tracker next announce */ "Announce in progress" = "Annuncio in corso"; /* Tracker next announce */ "Announce is queued" = "Annuncio in coda"; /* Tracker next announce */ "Announce not scheduled" = "Annuncio non programmato"; /* Tracker last announce */ "Announce timed out" = "Annuncio scaduto"; /* All toolbar item -> label */ "Apply All" = "Applica tutti"; /* Selected toolbar item -> label */ "Apply Selected" = "Applica selezionati"; /* Confirm Quit panel -> title */ "Are you sure you want to quit?" = "Sei sicuro di voler uscire da Transmission?"; /* Remove completed confirm panel -> title */ "Are you sure you want to remove %@ completed transfers from the transfer list?" = "Sei sicuro di voler rimuovere %@ trasferimenti completati dalla lista?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list and trash the data files?" = "Sei sicuro di voler rimuovere %@ trasferimenti dalla lista e cestinare i file?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list?" = "Sei sicuro di voler rimuovere %@ trasferimenti dalla lista?"; /* Remove trackers alert -> title */ "Are you sure you want to remove %d trackers?" = "Sei sicuro di voler rimuovere %d server traccia?"; /* Removal confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list and trash the data file?" = "Sei sicuro di voler rimuovere \"%@\" dalla lista e cestinare il file dati?"; /* Removal confirm panel -> title Remove completed confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list?" = "Sei sicuro di voler rimuovere \"%@\" dalla lista?"; /* Remove trackers alert -> title */ "Are you sure you want to remove this tracker?" = "Sei sicuro di voler rimuovere questo server traccia?"; /* Stats reset -> title */ "Are you sure you want to reset usage statistics?" = "Sei sicuro di voler azzerare le statistiche d'utilizzo?"; /* inspector -> peer table -> header tool tip */ "Available" = "Disponibile"; /* Preferences -> toolbar item title */ "Bandwidth" = "Banda"; /* Growl notification description */ "Bandwidth settings changed" = "Le impostazioni di banda sono state modificate"; /* Groups -> Name */ "Blue" = "Blu"; /* Add torrent -> same name -> button Blocklist -> cancel button Confirm Quit panel -> button Create torrent -> blank address -> button Removal confirm panel -> button Remove completed confirm panel -> button Remove trackers alert -> button rename sheet button Stats reset -> button URL sheet button */ "Cancel" = "Annulla"; /* Torrent Table -> tooltip */ "Change transfer settings" = "Modifica le impostazioni per il trasferimento"; /* File Outline -> Menu */ "Check Selected" = "Spunta selezionati"; /* Torrent -> status string */ "Checking existing data" = "Verifica dati esistenti"; /* Message window -> save button */ "Clear" = "Pulisci"; /* inspector -> peer table -> header */ "Client" = "Client"; /* View menu -> Quick Look */ "Close Quick Look" = "Chiudi Visualizzazione rapida"; /* Prefs -> Notifications */ "Configure In Growl" = "Configura su Growl"; /* Prefs -> Notifications */ "Configure In System Preferences" = "Configura nelle Preferenze di Sistema"; /* Blocklist -> message */ "Connecting to site" = "Connessione al sito"; /* Torrent file copy alert -> title */ "Copy of \"%@\" Cannot Be Created" = "Impossibile creare copia di \"%@\""; /* Create torrent -> failed -> warning */ "Could not read \"%s\": %s." = "Impossibile leggere \"%1$s\": %2$s."; /* Create torrent -> failed -> warning */ "Could not write \"%s\": %s." = "Impossibile scrivere \"%1$s\": %2$s."; /* Create toolbar item -> label Create torrent -> blank address -> button */ "Create" = "Crea"; /* Drag overlay -> file */ "Create a Torrent File" = "Crea un file torrent"; /* Create toolbar item -> tooltip */ "Create torrent file" = "Crea file torrent"; /* Create toolbar item -> palette label Create torrent -> select file */ "Create Torrent File" = "Crea file torrent"; /* Create torrent -> failed -> title */ "Creation of \"%@\" failed." = "Creazione di \"%@\" fallita."; /* Inspector -> peer -> status */ "Currently downloading (interested and not choked)" = "Ricezione in corso (interessato e non limitato)"; /* Inspector -> peer -> status */ "Currently uploading (interested and not choked)" = "Invio in corso (interessato e non limitato)"; /* Message window -> table column */ "Date" = "Data"; /* Message window -> level Message window -> level string */ "Debug" = "Debug"; /* Info options -> global setting */ "disabled" = "disabilitata"; /* inspector -> peer table -> header inspector -> web seed table -> header status bar -> status label Torrent -> status string */ "DL" = "Ricezione"; /* Inspector -> Peers tab -> peers */ "DL from %d" = "Ricezione da %d"; /* Torrent disk space alert -> button */ "Do not check disk space again" = "Non controllare nuovamente lo spazio su disco"; /* Donation beg -> button */ "Don't bug me about this ever again." = "Non infastidirmi più con questa domanda."; /* files tab -> tooltip */ "Don't Download" = "Non scaricare"; /* Donation beg -> button */ "Donate" = "Dona"; /* Donation beg -> message */ "Donate or not, there will be no difference to your torrenting experience." = "La scelta non comporterà alcuna differenza nell'esperienza d'uso del programma."; /* file table -> header tool tip files tab -> tooltip */ "Download" = "Ricezione"; /* Torrent disk space alert -> button */ "Download Anyway" = "Scarica comunque"; /* notification title */ "Download Complete" = "Ricezione completata"; /* Blocklist -> message */ "Download of the blocklist failed." = "La ricezione della blocklist è fallita."; /* files tab -> tooltip */ "Download Some" = "Scarica alcuni"; /* Torrent table -> group row -> tooltip */ "Download speed" = "Velocità ricezione"; /* Stats window -> label tracker peer stat */ "Downloaded" = "Ricevuti"; /* Filter Bar -> filter button Torrent -> status string */ "Downloading" = "In ricezione"; /* Blocklist -> message */ "Downloading blocklist" = "Ricezione della blocklist..."; /* Torrent -> status string */ "Downloading from %d of %d peers" = "In ricezione da %1$d su %2$d peer"; /* Torrent -> status string */ "Downloading from %d of 1 peer" = "In ricezione da %d su 1 peer"; /* inspector -> peer table -> header tool tip */ "Downloading From Peer" = "In ricezione dal peer"; /* inspector -> web seed table -> header tool tip */ "Downloading From Web Seed" = "Ricezione da seeder web"; /* Inspector -> Peers tab -> table row tooltip */ "encrypted" = "cifrato"; /* inspector -> peer table -> header tool tip */ "Encrypted Connection" = "Connessione cifrata"; /* Message window -> level Message window -> level string Torrent -> status string */ "Error" = "Errore"; /* Inspector -> tab Inspector view -> title */ "Files" = "File"; /* Filter toolbar item -> label inspector -> file filter Message window -> filter field */ "Filter" = "Filtri"; /* Inspector -> Peers tab -> table row tooltip */ "From: cache" = "Da: cache"; /* Inspector -> Peers tab -> table row tooltip */ "From: distributed hash table" = "Da: tabella di hash distribuita"; /* Inspector -> Peers tab -> table row tooltip */ "From: incoming connection" = "Da: connessione in arrivo"; /* Inspector -> Peers tab -> table row tooltip */ "From: libtorrent extension protocol handshake" = "Da: libtorrent extension protocol handshake"; /* Inspector -> Peers tab -> table row tooltip */ "From: local peer discovery" = "Da: scoperta peer locali"; /* Inspector -> Peers tab -> table row tooltip */ "From: peer exchange" = "Da: scambio peer"; /* Inspector -> Peers tab -> table row tooltip */ "From: tracker" = "Da: server traccia"; /* File size - gigabytes file/memory size - gigabytes */ "GB" = "GB"; /* Transfer speed (gigabytes per second) */ "GB/s" = "GB/s"; /* Preferences -> toolbar item title */ "General" = "Generali"; /* Inspector -> tab Inspector view -> title */ "General Info" = "Informazioni generali"; /* Status Bar -> speed tooltip */ "Global download limit" = "Limite generale di ricezione"; /* Status Bar -> speed tooltip */ "Global upload limit" = "Limite generale di invio"; /* Tracker last announce */ "got %d peers" = "presenti %d peer"; /* Tracker last announce */ "got 1 peer" = "presente 1 peer"; /* Groups -> Name */ "Gray" = "Grigio"; /* Groups -> Name */ "Green" = "Verde"; /* Groups -> Button */ "Group" = "Gruppo"; /* Preferences -> toolbar item title */ "Groups" = "Gruppi"; /* View menu -> Filter Bar */ "Hide Filter Bar" = "Nascondi la barra dei filtri"; /* View menu -> Inspector */ "Hide Inspector" = "Nascondi proprietà"; /* View menu -> Status Bar */ "Hide Status Bar" = "Nascondi la barra di stato"; /* File Outline -> Priority Menu */ "High" = "Alta"; /* files tab -> tooltip */ "High Priority" = "Priorità alta"; /* Legal alert -> button */ "I Accept" = "Accetto"; /* Add torrent -> same name -> message */ "If you are attempting to use already existing data, the root data directory should be inside the destination directory." = "Se stai cercando di utilizzare dati già esistenti, la cartella radice dei dati dovrebbe essere dentro la cartella di destinazione."; /* Torrent -> eta string */ "inactive" = "inattivo"; /* Message window -> level Message window -> level string */ "Info" = "Info"; /* Inspector toolbar item -> label */ "Inspector" = "Proprietà"; /* URL sheet label */ "Internet address of torrent file:" = "Indirizzo Internet del file torrent:"; /* inspector -> peer table -> header */ "IP Address" = "Indirizzo IP"; /* Download not a torrent -> message */ "It appears that the file \"%@\" from %@ is not a torrent file." = "Sembra che il file \"%1$@\" da %2$@ non sia un file torrent."; /* File size - kilobytes file/memory size - kilobytes */ "KB" = "KB"; /* Transfer speed (kilobytes per second) */ "KB/s" = "KB/s"; /* Tracker last announce */ "Last Announce" = "Ultimo annuncio"; /* Tracker last scrape */ "Last Scrape" = "Ultima richiesta"; /* Prefs -> blocklist -> message */ "Last updated" = "Ultimo aggiornamento"; /* tracker peer stat */ "Leechers" = "Leecher"; /* About window -> license button */ "License" = "Licenza"; /* Action menu -> upload/download limit torrent action menu -> upload/download limit */ "Limit (%d KB/s)" = "Limitata (%d KB/s)"; /* Save log alert panel -> title */ "Log Could Not Be Saved" = "Il registro non può essere salvato"; /* File Outline -> Priority Menu */ "Low" = "Bassa"; /* files tab -> tooltip */ "Low Priority" = "Priorità bassa"; /* Open duplicate magnet alert -> title */ "Magnet link is a duplicate of an existing transfer." = "Il collegamento magnetico è una copia di un trasferimento esistente."; /* Inspector -> selected torrents Torrent -> progress string */ "Magnetized transfer" = "Trasferimento magnetico"; /* File size - megabytes file/memory size - megabytes */ "MB" = "MB"; /* Transfer speed (megabytes per second) */ "MB/s" = "MB/s"; /* Message window -> table column */ "Message" = "Messaggio"; /* Message window -> title */ "Message Log" = "Registro messaggi"; /* files tab -> tooltip */ "Multiple Priorities" = "Priorità multiple"; /* Inspector -> Peers tab -> table row tooltip No Ratio Prefs -> blocklist -> message Tracker last announce Tracker last scrape tracker peer stat */ "N/A" = "N/D"; /* Filter Bar -> filter menu */ "Name" = "Nome"; /* Preferences -> toolbar item title */ "Network" = "Rete"; /* Prefs -> blocklist -> message */ "Never" = "Mai"; /* Inspector -> tracker table */ "New Tier" = "Nuovo livello"; /* Tracker next announce */ "Next announce in %@" = "Prossimo annuncio in %@"; /* Group table row */ "No Group" = "Nessun gruppo"; /* Inspector -> selected torrents */ "No Torrents Selected" = "Nessun torrent selezionato"; /* Groups -> Button Groups -> Menu inspector -> check all */ "None" = "Nessuno"; /* Donation beg -> button */ "Nope" = "No"; /* File Outline -> Priority Menu */ "Normal" = "Normale"; /* files tab -> tooltip */ "Normal Priority" = "Priorità normale"; /* Torrent disk space alert -> title */ "Not enough remaining disk space to download \"%@\" completely." = "Spazio residuo su disco insufficiente per scaricare completamente \"%@\"."; /* About window -> license close button Blocklist -> button Create torrent -> directory doesn't exist warning -> button Create torrent -> failed -> button Create torrent -> file already exists warning -> button Create torrent -> no files -> button Create torrent -> zero size -> button Download not a torrent -> button Magnet link failed -> button Move error alert -> button Move inside itself alert -> button Open duplicate alert -> button Open duplicate magnet alert -> button Open invalid alert -> button Save log alert panel -> button Torrent disk space alert -> button Torrent download failed -> button Torrent file copy alert -> button Transmission already running alert -> button */ "OK" = "Ok"; /* Remove completed confirm panel -> message */ "Once removed, continuing the transfer will require the torrent file or magnet link." = "Dopo averlo rimosso, continuare il trasferimento richiederà il file torrent o il collegamento magnetico."; /* Removal confirm panel -> message part 2 Remove completed confirm panel -> message */ "Once removed, continuing the transfers will require the torrent files or magnet links." = "Dopo averli rimossi, continuare i trasferimenti richiederà i file torrent o i collegamenti magnetici."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact it. This cannot be undone." = "Dopo averlo rimosso, Transmission non tenterà più di contattarlo. Questa azione non può essere annullata. "; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact them. This cannot be undone." = "Dopo averli rimossi, Transmission non tenterà più di contattarli. Questa azione non può essere annullata."; /* File Outline -> Menu */ "Only Check Selected" = "Spunta solo selezionati"; /* Open toolbar item -> label URL sheet button */ "Open" = "Apri"; /* Open address toolbar item -> label */ "Open Address" = "Apri indirizzo"; /* Open address toolbar item -> palette label */ "Open Torrent Address" = "Apri indirizzo torrent"; /* Open toolbar item -> tooltip */ "Open torrent files" = "Apri file torrent"; /* Open toolbar item -> palette label */ "Open Torrent Files" = "Apri file torrent"; /* Open address toolbar item -> tooltip */ "Open torrent web address" = "Apri indirizzo web torrent"; /* Inspector -> tab Inspector view -> title */ "Options" = "Opzioni"; /* Groups -> Name */ "Orange" = "Arancione"; /* Inspector -> Peers tab -> table row tooltip */ "Partial Seed" = "Seeder parziale"; /* All toolbar item -> palette label */ "Pause / Resume All" = "Pausa / Riprendi tutti"; /* Selected toolbar item -> palette label */ "Pause / Resume Selected" = "Pausa / Riprendi selezionati"; /* All toolbar item -> label Dock item */ "Pause All" = "Metti tutti in pausa"; /* All toolbar item -> tooltip */ "Pause all transfers" = "Metti in pausa tutti i trasferimenti"; /* Selected toolbar item -> label */ "Pause Selected" = "Metti in pausa selezionati"; /* Selected toolbar item -> tooltip */ "Pause selected transfers" = "Metti in pausa i trasferimenti selezionati"; /* Torrent Table -> tooltip */ "Pause the transfer" = "Metti in pausa il trasferimento"; /* Filter Bar -> filter button Torrent -> status string */ "Paused" = "In pausa"; /* Inspector -> peer -> status */ "Peer is unchoking you, but you are not interested" = "Il peer sta rimuovendo il limite verso di te, ma non sei interessato"; /* Inspector -> peer -> status */ "Peer wants you to upload, but you do not want to (interested and choked)" = "Il peer vuole dati da parte tua, ma tu non vuoi inviarli (interessato e limitato)"; /* Inspector -> tab Inspector view -> title Preferences -> toolbar item title */ "Peers" = "Peer"; /* Inspector -> Peers tab -> table row tooltip */ "Port" = "Porta"; /* Preferences -> Network -> port status */ "Port check site is down" = "Il sito di test non è disponibile"; /* Preferences -> Network -> port status */ "Port is closed" = "La porta è chiusa"; /* Preferences -> Network -> port status */ "Port is open" = "La porta è aperta"; /* File Outline -> Menu file table -> header tool tip */ "Priority" = "Priorità"; /* files tab -> tooltip */ "Priority Not Available" = "Priorità non disponibile"; /* Inspector -> private torrent */ "Private Torrent, non-tracker peer discovery disabled" = "Torrent privato, scoperta dei peer non di tipo server traccia disabilitata"; /* Message window -> table column */ "Process" = "Elaborazione"; /* Blocklist -> message */ "Processing blocklist" = "Elaborazione della blocklist..."; /* Stats window -> label */ "Program Started" = "Programma avviato"; /* Inspector -> Peers tab -> table row tooltip */ "Progress: %@" = "Avanzamento: %@"; /* Inspector -> Peers tab -> table row tooltip */ "Protocol: %@" = "Protocollo: %@"; /* Inspector -> private torrent */ "Public Torrent" = "Torrent pubblico"; /* Groups -> Name */ "Purple" = "Viola"; /* QuickLook toolbar item -> label QuickLook toolbar item -> palette label QuickLook toolbar item -> tooltip View menu -> Quick Look */ "Quick Look" = "Visualizzazione rapida"; /* Confirm Quit panel -> button Legal alert -> button */ "Quit" = "Esci"; /* Dock Badger -> quit */ "Quitting" = "Uscita"; /* Stats window -> label status bar -> status label Torrent -> status string Torrent table -> group row -> tooltip */ "Ratio" = "Rapporto"; /* Groups -> Name */ "Red" = "Rosso"; /* Action menu -> status string toggle */ "Remaining Time" = "Tempo residuo"; /* Torrent -> eta string */ "remaining time unknown" = "tempo residuo sconosciuto"; /* Preferences -> toolbar item title */ "Remote" = "Remoto"; /* Removal confirm panel -> button Remove completed confirm panel -> button Remove toolbar item -> label Remove trackers alert -> button */ "Remove" = "Rimuovi"; /* Main window -> 3rd bottom left button (remove all) tooltip */ "Remove all transfers that have completed seeding." = "Rimuovi tutti i trasferimenti che hanno terminato la distribuzione."; /* Remove toolbar item -> palette label */ "Remove Selected" = "Rimuovi selezionati"; /* Inspector view -> tracker buttons */ "Remove selected trackers" = "Rimuovi i server traccia selezionati"; /* Remove toolbar item -> tooltip */ "Remove selected transfers" = "Rimuovi trasferimenti selezionati"; /* rename sheet button */ "Rename" = "Rinomina"; /* File Outline -> Menu */ "Rename File" = "Rinomina file"; /* rename sheet label */ "Rename the file \"%@\":" = "Rinomina il file \"%@\":"; /* Stats reset -> button Stats window -> reset button */ "Reset" = "Reset"; /* All toolbar item -> label Dock item */ "Resume All" = "Riprendi tutti"; /* All toolbar item -> tooltip */ "Resume all transfers" = "Riprendi tutti i trasferimenti"; /* Selected toolbar item -> label */ "Resume Selected" = "Riprendi selezionati"; /* Selected toolbar item -> tooltip */ "Resume selected transfers" = "Riprendi i trasferimenti selezionati"; /* Torrent cell -> button info */ "Resume the transfer" = "Riprendi il trasferimento"; /* Torrent cell -> button info */ "Resume the transfer right away" = "Riprendi il trasferimento ora"; /* Stats window -> label */ "Running Time" = "Tempo di esecuzione"; /* Message window -> save button */ "Save" = "Salva"; /* Tracker last scrape */ "Scrape error" = "Errore richiesta"; /* Tracker last scrape */ "Scrape timed out" = "Richiesta scaduta"; /* tracker peer stat */ "Seeders" = "Seeder"; /* Filter Bar -> filter button Torrent -> status string */ "Seeding" = "In distribuzione"; /* Torrent -> status string */ "Seeding complete" = "Distribuzione completata"; /* notification title */ "Seeding Complete" = "Distribuzione completata"; /* Torrent -> status string */ "Seeding to %d of %d peers" = "In distribuzione verso %1$d su %2$d peer"; /* Torrent -> status string */ "Seeding to %d of 1 peer" = "In distribuzione verso %d su 1 peer"; /* Create torrent -> location sheet -> button Create torrent -> select file Move torrent -> prompt Open torrent -> prompt Preferences -> Open panel prompt */ "Select" = "Seleziona"; /* Create torrent -> select file */ "Select a file or folder for the torrent file." = "Selezionare un file o una cartella per il file torrent."; /* Add -> select destination folder */ "Select the download folder for \"%@\"" = "Selezionare la cartella in cui scaricare \"%@\""; /* Create torrent -> location sheet -> message */ "Select the name and location for the torrent file." = "Selezionare nome e posizione per il file torrent."; /* Move torrent -> select destination folder */ "Select the new folder for %d data files." = "Selezionare la nuova cartella per %d file dati."; /* Move torrent -> select destination folder */ "Select the new folder for \"%@\"." = "Selezionare la nuova cartella per \"%@\"."; /* Status Bar -> status menu */ "Session Ratio" = "Rapporto sessione"; /* Status Bar -> status menu */ "Session Transfer" = "Trasferimento sessione"; /* Share toolbar item -> label Share toolbar item -> palette label */ "Share" = "Condividi"; /* Share toolbar item -> tooltip */ "Share torrent file" = "Condividi il file torrent"; /* Main window -> 1st bottom left button (action) tooltip */ "Shortcuts for changing global settings." = "Scorciatoie per cambiare le impostazioni generali."; /* notification button */ "Show" = "Mostra"; /* View menu -> Filter Bar */ "Show Filter Bar" = "Mostra la barra dei filtri"; /* File Outline -> Menu */ "Show in Finder" = "Mostra nel Finder"; /* View menu -> Inspector */ "Show Inspector" = "Mostra proprietà"; /* View menu -> Status Bar */ "Show Status Bar" = "Mostra la barra di stato"; /* Torrent cell -> button info */ "Show the data file in Finder" = "Mostra il file dati nel Finder"; /* Dock item Status Bar -> speed tooltip */ "Speed Limit" = "Limite velocità"; /* Growl notification title */ "Speed Limit Auto Disabled" = "Limite di velocità disabilitato automaticamente"; /* Growl notification title */ "Speed Limit Auto Enabled" = "Limite di velocità abilitato automaticamente"; /* Main window -> 2nd bottom left button (turtle) tooltip */ "Speed Limit overrides the total bandwidth limits with its own limits." = "Il limite di velocità sostituisce i limiti generali di banda."; /* Torrent -> status string */ "Stalled" = "In stallo"; /* Stats window -> title */ "Statistics" = "Statistiche"; /* Action menu -> status string toggle */ "Status of Selected Files" = "Stato dei file selezionati"; /* Action menu -> ratio stop torrent action menu -> ratio stop */ "Stop at Ratio (%.2f)" = "Ferma al rapporto (%.2f)"; /* Torrent cell -> button info */ "Stop waiting to start" = "Interrompi attesa per iniziare"; /* Donation beg -> title */ "Support open-source indie software" = "Supporta il software open-source indipendente"; /* File size - terabytes file/memory size - terabytes */ "TB" = "TB"; /* Transfer speed (terabytes per second) */ "TB/s" = "TB/s"; /* Create torrent -> directory doesn't exist warning -> title */ "The chosen torrent file location does not exist." = "La posizione scelta per il file torrent non esiste."; /* Add torrent -> same name -> title */ "The destination directory and root data directory have the same name." = "La cartella di destinazione e la cartella di origine dei dati hanno lo stesso nome."; /* Create torrent -> directory doesn't exist warning -> warning */ "The directory \"%@\" does not currently exist. Create this directory or choose a different one to create the torrent file." = "La cartella \"%@\" attualmente non esiste. Creare questa cartella o sceglierne una diversa per creare il file torrent."; /* Open duplicate magnet alert -> message */ "The magnet link \"%@\" cannot be added because it is a duplicate of an already existing transfer." = "Il collegamento magnetico \"%@\" non può essere aggiunto poiché è una copia di un trasferimento già esistente."; /* Move error alert -> message Move inside itself alert -> message */ "The move operation of \"%@\" cannot be done." = "Impossibile eseguire l'operazione di spostamento di \"%@\"."; /* blocklist fail message */ "The specified blocklist file did not contain any valid rules." = "Il file di blocklist specificato non contiene alcuna regola valida."; /* Torrent download failed -> message */ "The torrent could not be downloaded from %@: %@." = "Il torrent non può essere scaricato da %1$@: %2$@."; /* Torrent file copy alert -> message */ "The torrent file (%@) cannot be found." = "Impossibile trovare il file torrent (%@)."; /* Open invalid alert -> message */ "The torrent file cannot be opened because it contains invalid data." = "Non è possibile aprire il file torrent poiché contiene dati non validi."; /* Create torrent -> zero size -> title */ "The total file size is zero bytes." = "La dimensione complessiva del file è pari a zero byte."; /* Open duplicate alert -> message */ "The transfer cannot be added because it is a duplicate of an already existing transfer." = "Il trasferimento non può essere aggiunto poiché è una copia di un trasferimento già esistente."; /* Torrent disk space alert -> message */ "The transfer will be paused. Clear up space on %@ or deselect files in the torrent inspector to continue." = "Il trasferimento sarà messo in pausa. Liberare spazio in %@ o deselezionare alcuni file del torrent nelle proprietà per continuare."; /* Create torrent -> blank address -> message */ "The transfer will not contact trackers for peers, and will have to rely solely on non-tracker peer discovery methods such as PEX and DHT to download and seed." = "Il trasferimento non contatterà il server traccia per cercare i peer e dovrà fare affidamento unicamente a metodi di scoperta dei peer quali PEX e DHT per ricevere e distribuire dati."; /* Removal confirm panel -> message part 1 */ "There are %@ active transfers." = "Ci sono %@ trasferimenti in corso."; /* Removal confirm panel -> message part 1 */ "There are %@ transfers (%@ active)." = "Ci sono %1$@ trasferimenti (%2$@ in corso)"; /* Confirm Quit panel -> message */ "There are %d active transfers that will be paused on quit. The transfers will automatically resume on the next launch." = "Ci sono %d trasferimenti in corso che saranno messi in pausa all'uscita. I trasferimenti riprenderanno automaticamente al prossimo avvio."; /* Create torrent -> blank address -> title */ "There are no tracker addresses." = "Non ci sono indirizzi di server traccia."; /* Transmission already running alert -> message */ "There is already a copy of Transmission running. This copy cannot be opened until that instance is quit." = "Una copia di Transmission è già in esecuzione. Questa copia non potrà essere eseguita finché non verrà chiusa la prima istanza."; /* Confirm Quit panel -> message */ "There is an active transfer that will be paused on quit. The transfer will automatically resume on the next launch." = "C'è un trasferimento in corso che sarà messo in pausa all'uscita. Il trasferimento riprenderà automaticamente al prossimo avvio."; /* Create torrent -> no files -> warning */ "There must be at least one file in a folder to create a torrent file." = "Per creare un file torrent occorre che nella cartella sia presente almeno un file."; /* Save log alert panel -> message */ "There was a problem creating the file \"%@\"." = "Si è verificato un errore nel creare il file \"%@\"."; /* Move error alert -> title */ "There was an error moving the data file." = "Si è verificato un errore nello spostare il file dati."; /* Magnet link failed -> message */ "There was an error when adding the magnet link \"%@\". The transfer will not occur." = "Si è verificato un errore nell'aggiungere il collegamento magnetico \"%@\". Il trasferimento non potrà avvenire."; /* Create torrent -> no files -> title */ "This folder contains no files." = "Questa cartella non contiene alcun file."; /* Removal confirm panel -> message */ "This transfer is active. Once removed, continuing the transfer will require the torrent file or magnet link." = "Questo trasferimento è in corso. Dopo averlo rimosso, continuare il trasferimento richiederà il file torrent o il collegamento magnetico."; /* Stats reset -> message */ "This will clear the global statistics displayed by Transmission. Individual transfer statistics will not be affected." = "Questa azione ripulirà le statistiche generali mostrate da Transmission. Le statistiche dei singoli trasferimenti non saranno modificate."; /* Inspector -> tracker table */ "Tier %d" = "Livello %d"; /* Filter toolbar item -> palette label */ "Toggle Filter" = "Mostra/nascondi filtri"; /* Inspector toolbar item -> palette label */ "Toggle Inspector" = "Mostra/nascondi proprietà"; /* Filter toolbar item -> tooltip */ "Toggle the filter bar" = "Mostra/nascondi la barra dei filtri"; /* Inspector toolbar item -> tooltip */ "Toggle the torrent inspector" = "Mostra/nascondi proprietà"; /* Download not a torrent -> title Torrent download error -> title */ "Torrent download failed" = "Ricezione torrent fallita"; /* notification title */ "Torrent File Auto Added" = "File torrent aggiunto automaticamente"; /* Inspector -> title */ "Torrent Inspector" = "Proprietà torrent"; /* Torrent -> progress string */ "torrent metadata needed" = "necessari metadati torrent"; /* stats total */ "Total N/A" = "Totale N/D"; /* Status Bar -> status menu */ "Total Ratio" = "Rapporto totale"; /* Status Bar -> status menu */ "Total Transfer" = "Trasferimento totale"; /* Filter Bar -> filter menu */ "Tracker" = "Server traccia"; /* Torrent -> status string */ "Tracker returned error" = "Il server traccia ha restituito un errore"; /* Torrent -> status string */ "Tracker returned warning" = "Il server traccia ha restituito un avviso"; /* Tracker next announce */ "Tracker will be used as a backup" = "Il server traccia sarà usato come backup"; /* Inspector -> tab Inspector view -> title */ "Trackers" = "Server traccia"; /* Inspector -> Peers tab -> peers */ "Transfer Not Active" = "Trasferimento non in corso"; /* Preferences -> toolbar item title */ "Transfers" = "Trasferimenti"; /* Inspector -> Peers tab -> peers */ "Transfers Not Active" = "Trasferimenti non in corso"; /* Legal alert -> message */ "Transmission is a file-sharing program. When you run a torrent, its data will be made available to others by means of upload. You and you alone are fully responsible for exercising proper judgement and abiding by your local laws." = "Transmission è un programma di file-sharing. I contenuti dei torrent saranno messi a disposizione di altri utenti attraverso l'invio di dati. L'esercizio di un giudizio appropriato ed il rispetto delle leggi in vigore è di vostra esclusiva responsabilità."; /* Donation beg -> message */ "Transmission is a full-featured torrent application. A lot of time and effort have gone into development, coding, and refinement. If you enjoy using it, please consider showing your love with a donation." = "Transmission è una applicazione torrent ricca di funzionalità. Sviluppare, codificare e migliorare il programma ha richiesto molto tempo e molto impegno. Se ti piace usare questo software, per favore considera di mostrare il tuo gradimento tramite una donazione. "; /* Transmission already running alert -> title */ "Transmission is already running." = "Transmission è già in esecuzione."; /* inspector -> peer table -> header status bar -> status label Torrent -> status string */ "UL" = "Invio"; /* Inspector -> Peers tab -> peers */ "UL to %d" = "Invio a %d"; /* File Outline -> Menu */ "Uncheck Selected" = "Non spuntare selezionati"; /* Status Bar -> speed tooltip */ "unlimited" = "non limitata"; /* Torrent -> error string unreadable */ "unreadable error" = "errore illeggibile"; /* Save log panel -> default file name */ "untitled" = "senza titolo"; /* Torrent table -> group row -> tooltip */ "Upload speed" = "Velocità invio"; /* Stats window -> label */ "Uploaded" = "Inviati"; /* Torrent -> progress string */ "uploaded %@ (Ratio: %@)" = "inviati %1$@ (rapporto: %2$@)"; /* inspector -> peer table -> header tool tip */ "Uploading To Peer" = "Invio al peer"; /* Torrent -> status string */ "Waiting to check existing data" = "In attesa di verificare i dati esistenti"; /* Torrent -> status string */ "Waiting to download" = "In attesa di ricevere"; /* Torrent -> status string */ "Waiting to seed" = "In attesa di effettuare distribuzione"; /* Drag overlay -> url */ "Web Address" = "Sito web"; /* Torrent -> status string */ "web seed" = "seeder web"; /* inspector -> web seed table -> header */ "Web Seeds" = "Seeder web"; /* Legal alert -> title */ "Welcome to Transmission" = "Benvenuto in Transmission"; /* Groups -> Name */ "Yellow" = "Giallo"; /* Inspector -> peer -> status */ "You unchoked the peer, but the peer is not interested" = "Non stai più applicando un limite verso il peer, ma il peer non è interessato"; /* Inspector -> peer -> status */ "You want to download, but peer does not want to send (interested and choked)" = "Vuoi scaricare dati, ma il peer non vuole inviarli (interessato e limitato)";transmission-2.92/macosx/it.lproj/PaxHeaders.4960/InfoOptionsView.xib0000644000000000000000000000013212664476420022532 xustar0030 mtime=1456635152.073497846 30 atime=1456635152.073497846 30 ctime=1457295922.787855311 transmission-2.92/macosx/it.lproj/InfoOptionsView.xib0000644000175000017500000012123112664476420024157 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/it.lproj/PaxHeaders.4960/InfoActivityView.xib0000644000000000000000000000013212664476420022673 xustar0030 mtime=1456635152.073497846 30 atime=1456635152.073497846 30 ctime=1457295922.787855311 transmission-2.92/macosx/it.lproj/InfoActivityView.xib0000644000175000017500000012750212664476420024327 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/it.lproj/PaxHeaders.4960/InfoGeneralView.xib0000644000000000000000000000013212664476420022454 xustar0030 mtime=1456635152.074497863 30 atime=1456635152.073497846 30 ctime=1457295922.787855311 transmission-2.92/macosx/it.lproj/InfoGeneralView.xib0000644000175000017500000006271312664476420024112 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/it.lproj/PaxHeaders.4960/AddMagnetWindow.xib0000644000000000000000000000013212662757243022447 xustar0030 mtime=1456201379.330863165 30 atime=1456201379.330863165 30 ctime=1457295922.787855311 transmission-2.92/macosx/it.lproj/AddMagnetWindow.xib0000644000175000017500000006540712662757243024110 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/it.lproj/PaxHeaders.4960/MainMenu.xib0000644000000000000000000000013212644245522021134 xustar0030 mtime=1452362578.769699344 30 atime=1452362578.769699344 30 ctime=1457295922.786855294 transmission-2.92/macosx/it.lproj/MainMenu.xib0000644000175000017500000021663212644245522022573 0ustar00mikedldmikedld00000000000000 CA CA YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7NjIsIDYyfdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPEREyTU0AKgAAA6yANJsuF/gC DQeEQmFQuGQ2HQ+IRGJROKRWLReMRmIwKCRqPR+QSGRSOSSWHRyCyaVSuWS2XS+EyiYTOaTWbTcATKcT ueT2fRuBymf0OiUWaTqjUmlUuP0imU+oVGF06pVWrUmqVetVucVmuV+wSyvWGyWWm0GzWm1Rqx2u3W+Y tlwUK4XW7Tm5XS73u1QK53zAX284HCWS/XrC4mq4fFY2rYzHZGn5DJZWjNJsX/LZuh5jNZzQTvPYjQ6W X6PTamZ6jVa2xZnSa7ZU3YbPbSJo7Xb7uNbnP7zgRTfbHg8WF8PjcmH8jlc2FczndEAdDpc3qdXk9fsc Xtdvgd3vbvweHbePybLzefW+n1an2e3S+/4aD5RYlkQeAAD/uVvn/AAWpeGI+aVPqipEECPIAAhBgAHr B4AH3CSKgLCoAAXDAAHhDYADwP5DwIk0DIoRRBj2AEKgKABFEaSKQDsOg4QifR9AAOw+kKpglCGHb9P4 kb/HyABbF6YqtRGiZGEKPoAANJwADcOsmI+SBFEEAB+QmOg9kGphDkAPAAAtMaSHVMwADyQBESO3SSkc Q4/gACU5gAWE7TqW5fgAJwjh/HwDgBIIAFkXJggAKAkiCAAn0YAB30eAA5DyQKmDyOQ1AACNNJJR53gA Q5HEskh5nkeIAF4XBaUcdx1xQAgCIzJCJEgRNKAxW4AHRXQADgO841pW1cV0dFeV8AFgABW4MVzXdezi pYMgqCKXnOddPJGWZWlQAAHAaBQAAncMUQsjFZIiSRFy7OYJAAcN3AAPZBEUABCj8OwAAzfIAHPfl4Xl el7AAD+BgAd2DShKTzloVpTAAFoWhYAAG4mAABYtWM2pIShGxzJwDAAP5BENfdrXxaUoDWM4AEkSpM5J T1o2mQI/D0AEaRqNg5xOpdEUUBGfpIfGhTxPSRmIXxcgAEIQA7cFxVfWFy4ykZLEfEGPAAMg1jmhpEkF mo7j9kaGE4SpG5tGgADUOMFKWTJJXmDW5JIc26gAM43XukcHnoABtGqaD9AKAc/4w36RkwSJEgACnGzr O5+8iAAB8oAAk8uABb80AHIn7yfKih0IAHZ0gADQN47qZBEFcaCiSdIdkOw/NnDpEQw/9T1qV9gAA9ED xdoZOl1q2uq1zIhmKa+JEKSlkXBfmyD4QBCE3mNUNw5DsQwxjMNW2+s0oUhUFgYjsPQ/EgGQaBsH3wNM FAUhWGAkCWJosCEIYjCgD4QhEE77jEkBAAAPAQAAAwAAAAEAPgAAAQEAAwAAAAEAPgAAAQIAAwAAAAQA AARmAQMAAwAAAAEABQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEA BAAAARYAAwAAAAEAPgAAARcABAAAAAEAAAOjARwAAwAAAAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEA AQAAAVMAAwAAAAQAAARuh3MABwAADLwAAAR2AAAAAAAIAAgACAAIAAEAAQABAAEAAAy8YXBwbAIQAABt bnRyUkdCIFhZWiAH3gABAAgACQA1ABdhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYA AQAAAADTLWFwcGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFk ZXNjAAABUAAAAGJkc2NtAAABtAAAAaRjcHJ0AAADWAAAACN3dHB0AAADfAAAABRyWFlaAAADkAAAABRn WFlaAAADpAAAABRiWFlaAAADuAAAABRyVFJDAAADzAAACAxhYXJnAAAL2AAAACB2Y2d0AAAL+AAAADBu ZGluAAAMKAAAAD5jaGFkAAAMaAAAACxtbW9kAAAMlAAAAChiVFJDAAADzAAACAxnVFJDAAADzAAACAxh YWJnAAAL2AAAACBhYWdnAAAL2AAAACBkZXNjAAAAAAAAAAhEaXNwbGF5AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAbWx1YwAAAAAAAAAhAAAADGhySFIAAAAIAAABnGtvS1IAAAAIAAABnG5iTk8AAAAIAAABnGlkAAAA AAAIAAABnGh1SFUAAAAIAAABnGNzQ1oAAAAIAAABnGRhREsAAAAIAAABnHVrVUEAAAAIAAABnGFyAAAA AAAIAAABnGl0SVQAAAAIAAABnHJvUk8AAAAIAAABnG5sTkwAAAAIAAABnGhlSUwAAAAIAAABnGVzRVMA AAAIAAABnGZpRkkAAAAIAAABnHpoVFcAAAAIAAABnHZpVk4AAAAIAAABnHNrU0sAAAAIAAABnHpoQ04A AAAIAAABnHJ1UlUAAAAIAAABnGZyRlIAAAAIAAABnG1zAAAAAAAIAAABnGNhRVMAAAAIAAABnHRoVEgA AAAIAAABnGRlREUAAAAIAAABnGVuVVMAAAAIAAABnHB0QlIAAAAIAAABnHBsUEwAAAAIAAABnGVsR1IA AAAIAAABnHN2U0UAAAAIAAABnHRyVFIAAAAIAAABnGphSlAAAAAIAAABnHB0UFQAAAAIAAABnABpAE0A YQBjdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUgSW5jLiwgMjAxNAAAWFlaIAAAAAAAAPMWAAEAAAABFspY WVogAAAAAAAAccAAADmKAAABZ1hZWiAAAAAAAABhIwAAueYAABP2WFlaIAAAAAAAACPyAAAMkAAAvdBj dXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADYAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIA dwB8AIEAhgCLAJAAlQCaAJ8AowCoAK0AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0B EwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB 6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwAD CwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEE fgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcG SAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoI bgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK 8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN 3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMR MRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U 8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZ IBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkd wx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i 3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8o cSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwu gi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1 EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8 JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31D wEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL 4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJU j1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhd yV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1n k2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx 8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF8 4X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASI aYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCU ipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNih R6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2u oa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8 m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfL Nsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHa dtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDq W+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf6 5/t3/Af8mP0p/br+S/7c/23//3BhcmEAAAAAAAMAAAACZmYAAPKnAAANWQAAE9AAAAoOdmNndAAAAAAA AAABAAEAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAEAAAAAAAAAAQAAbmRpbgAAAAAAAAA2AACnQAAAVYAA AEzAAACewAAAJYAAAAzAAABQAAAAVEAAAjMzAAIzMwACMzMAAAAAAAAAAHNmMzIAAAAAAAEMcgAABfj/ //MdAAAHugAA/XL///ud///9pAAAA9kAAMBxbW1vZAAAAAAAAAYQAACgBwAAAADJJx4AAAAAAAAAAAAA AAAAAAAAANIlJicoWiRjbGFzc25hbWVYJGNsYXNzZXNfEBBOU0JpdG1hcEltYWdlUmVwoycpKlpOU0lt YWdlUmVwWE5TT2JqZWN00iUmLC1XTlNBcnJheaIsKtIlJi8wXk5TTXV0YWJsZUFycmF5oy8sKtMyMwo0 NTZXTlNXaGl0ZVxOU0NvbG9yU3BhY2VEMCAwABADgAzSJSY4OVdOU0NvbG9yojgq0iUmOzxXTlNJbWFn ZaI7Kl8QD05TS2V5ZWRBcmNoaXZlctE/QFRyb290gAEACAARABoAIwAtADIANwBGAEwAVwBeAGUAcgB5 AIEAgwCFAIoAjACOAJcAnACnAKkAqwCtALIAtQC3ALkAuwC9AMIA2QDbAN0SExIYEiMSLBI/EkMSThJX ElwSZBJnEmwSexJ/EoYSjhKbEqASohKkEqkSsRK0ErkSwRLEEtYS2RLeAAAAAAAAAgEAAAAAAAAAQQAA AAAAAAAAAAAAAAAAEuA transmission-2.92/macosx/it.lproj/PaxHeaders.4960/GroupRules.xib0000644000000000000000000000013212666747213021542 xustar0030 mtime=1457245835.356999352 30 atime=1457245835.356999352 30 ctime=1457295922.787855311 transmission-2.92/macosx/it.lproj/GroupRules.xib0000644000175000017500000004165312666747213023200 0ustar00mikedldmikedld00000000000000 name comment name comment fFlatFileList.name allTrackersFlat fFlatFileList.name allTrackersFlat transmission-2.92/macosx/it.lproj/PaxHeaders.4960/AddWindow.xib0000644000000000000000000000013212640354044021277 xustar0030 mtime=1451350052.802156502 30 atime=1451350052.802156502 30 ctime=1457295922.787855311 transmission-2.92/macosx/it.lproj/AddWindow.xib0000644000175000017500000007303212640354044022731 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/it.lproj/PaxHeaders.4960/GlobalOptionsPopover.xib0000644000000000000000000000013212640354044023546 xustar0030 mtime=1451350052.803156519 30 atime=1451350052.803156519 30 ctime=1457295922.787855311 transmission-2.92/macosx/it.lproj/GlobalOptionsPopover.xib0000644000175000017500000006371412640354044025206 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/InfoTextField.m0000644000000000000000000000013212442116666020042 xustar0030 mtime=1418239414.209101331 30 atime=1418239414.209101331 30 ctime=1457295923.246863117 transmission-2.92/macosx/InfoTextField.m0000644000175000017500000000333612442116666021474 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoTextField.m 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2009-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "InfoTextField.h" @implementation InfoTextField - (void) setStringValue: (NSString *) string { [super setStringValue: string]; [self setSelectable: ![[self stringValue] isEqualToString: @""]]; } - (void) setObjectValue: (id ) object { [super setObjectValue: object]; [self setSelectable: ![[self stringValue] isEqualToString: @""]]; } @end transmission-2.92/macosx/PaxHeaders.4960/AddMagnetWindowController.m0000644000000000000000000000013212442116673022414 xustar0030 mtime=1418239419.188186655 30 atime=1418239419.188186655 30 ctime=1457295922.900857233 transmission-2.92/macosx/AddMagnetWindowController.m0000644000175000017500000003125612442116673024050 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: AddMagnetWindowController.m 13602 2012-10-30 00:22:10Z livings124 $ * * Copyright (c) 2010-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "AddMagnetWindowController.h" #import "Controller.h" #import "ExpandedPathToIconTransformer.h" #import "GroupsController.h" #import "NSStringAdditions.h" #import "Torrent.h" #define POPUP_PRIORITY_HIGH 0 #define POPUP_PRIORITY_NORMAL 1 #define POPUP_PRIORITY_LOW 2 @interface AddMagnetWindowController (Private) - (void) confirmAdd; - (void) setDestinationPath: (NSString *) destination determinationType: (TorrentDeterminationType) determinationType; - (void) setGroupsMenu; - (void) changeGroupValue: (id) sender; - (void) sameNameAlertDidEnd: (NSAlert *) alert returnCode: (NSInteger) returnCode contextInfo: (void *) contextInfo; @end @implementation AddMagnetWindowController - (id) initWithTorrent: (Torrent *) torrent destination: (NSString *) path controller: (Controller *) controller { if ((self = [super initWithWindowNibName: @"AddMagnetWindow"])) { fTorrent = torrent; fDestination = [[path stringByExpandingTildeInPath] retain]; fController = controller; fGroupValue = [torrent groupValue]; fGroupDeterminationType = TorrentDeterminationAutomatic; } return self; } - (void) awakeFromNib { [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateGroupMenu:) name: @"UpdateGroups" object: nil]; NSString * name = [fTorrent name]; [[self window] setTitle: name]; [fNameField setStringValue: name]; [fNameField setToolTip: name]; [self setGroupsMenu]; [fGroupPopUp selectItemWithTag: fGroupValue]; NSInteger priorityIndex; switch ([fTorrent priority]) { case TR_PRI_HIGH: priorityIndex = POPUP_PRIORITY_HIGH; break; case TR_PRI_NORMAL: priorityIndex = POPUP_PRIORITY_NORMAL; break; case TR_PRI_LOW: priorityIndex = POPUP_PRIORITY_LOW; break; default: NSAssert1(NO, @"Unknown priority for adding torrent: %d", [fTorrent priority]); } [fPriorityPopUp selectItemAtIndex: priorityIndex]; [fStartCheck setState: [[NSUserDefaults standardUserDefaults] boolForKey: @"AutoStartDownload"] ? NSOnState : NSOffState]; if (fDestination) [self setDestinationPath: fDestination determinationType: TorrentDeterminationAutomatic]; else { [fLocationField setStringValue: @""]; [fLocationImageView setImage: nil]; } #warning when 10.7-only, switch to auto layout [fMagnetLinkLabel sizeToFit]; const CGFloat downloadToLabelOldWidth = [fDownloadToLabel frame].size.width; [fDownloadToLabel sizeToFit]; const CGFloat changeDestOldWidth = [fChangeDestinationButton frame].size.width; [fChangeDestinationButton sizeToFit]; NSRect changeDestFrame = [fChangeDestinationButton frame]; changeDestFrame.origin.x -= changeDestFrame.size.width - changeDestOldWidth; [fChangeDestinationButton setFrame: changeDestFrame]; NSRect downloadToBoxFrame = [fDownloadToBox frame]; const CGFloat downloadToBoxSizeDiff = ([fDownloadToLabel frame].size.width - downloadToLabelOldWidth) + (changeDestFrame.size.width - changeDestOldWidth); downloadToBoxFrame.size.width -= downloadToBoxSizeDiff; downloadToBoxFrame.origin.x -= downloadToLabelOldWidth - [fDownloadToLabel frame].size.width; [fDownloadToBox setFrame: downloadToBoxFrame]; NSRect groupPopUpFrame = [fGroupPopUp frame]; NSRect priorityPopUpFrame = [fPriorityPopUp frame]; const CGFloat popUpOffset = groupPopUpFrame.origin.x - NSMaxX([fGroupLabel frame]); [fGroupLabel sizeToFit]; [fPriorityLabel sizeToFit]; NSRect groupLabelFrame = [fGroupLabel frame]; NSRect priorityLabelFrame = [fPriorityLabel frame]; //first bring them both to the left edge groupLabelFrame.origin.x = MIN(groupLabelFrame.origin.x, priorityLabelFrame.origin.x); priorityLabelFrame.origin.x = MIN(groupLabelFrame.origin.x, priorityLabelFrame.origin.x); //then align on the right const CGFloat labelWidth = MAX(groupLabelFrame.size.width, priorityLabelFrame.size.width); groupLabelFrame.origin.x += labelWidth - groupLabelFrame.size.width; priorityLabelFrame.origin.x += labelWidth - priorityLabelFrame.size.width; groupPopUpFrame.origin.x = NSMaxX(groupLabelFrame) + popUpOffset; priorityPopUpFrame.origin.x = NSMaxX(priorityLabelFrame) + popUpOffset; [fGroupLabel setFrame: groupLabelFrame]; [fGroupPopUp setFrame: groupPopUpFrame]; [fPriorityLabel setFrame: priorityLabelFrame]; [fPriorityPopUp setFrame: priorityPopUpFrame]; const CGFloat minButtonWidth = 82.0; const CGFloat oldAddButtonWidth = [fAddButton bounds].size.width; const CGFloat oldCancelButtonWidth = [fCancelButton bounds].size.width; [fAddButton sizeToFit]; [fCancelButton sizeToFit]; NSRect addButtonFrame = [fAddButton frame]; NSRect cancelButtonFrame = [fCancelButton frame]; CGFloat buttonWidth = MAX(addButtonFrame.size.width, cancelButtonFrame.size.width); buttonWidth = MAX(buttonWidth, minButtonWidth); addButtonFrame.size.width = buttonWidth; cancelButtonFrame.size.width = buttonWidth; const CGFloat addButtonWidthIncrease = buttonWidth - oldAddButtonWidth; addButtonFrame.origin.x -= addButtonWidthIncrease; cancelButtonFrame.origin.x -= addButtonWidthIncrease + (buttonWidth - oldCancelButtonWidth); [fAddButton setFrame: addButtonFrame]; [fCancelButton setFrame: cancelButtonFrame]; [fStartCheck sizeToFit]; } - (void) windowDidLoad { //if there is no destination, prompt for one right away if (!fDestination) [self setDestination: nil]; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; [fDestination release]; [super dealloc]; } - (Torrent *) torrent { return fTorrent; } - (void) setDestination: (id) sender { NSOpenPanel * panel = [NSOpenPanel openPanel]; [panel setPrompt: NSLocalizedString(@"Select", "Open torrent -> prompt")]; [panel setAllowsMultipleSelection: NO]; [panel setCanChooseFiles: NO]; [panel setCanChooseDirectories: YES]; [panel setCanCreateDirectories: YES]; [panel setMessage: [NSString stringWithFormat: NSLocalizedString(@"Select the download folder for \"%@\"", "Add -> select destination folder"), [fTorrent name]]]; [panel beginSheetModalForWindow: [self window] completionHandler: ^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) [self setDestinationPath: [[[panel URLs] objectAtIndex: 0] path] determinationType:TorrentDeterminationUserSpecified]; else { if (!fDestination) [self performSelectorOnMainThread: @selector(cancelAdd:) withObject: nil waitUntilDone: NO]; } }]; } - (void) add: (id) sender { if ([[fDestination lastPathComponent] isEqualToString: [fTorrent name]] && [[NSUserDefaults standardUserDefaults] boolForKey: @"WarningFolderDataSameName"]) { NSAlert * alert = [[NSAlert alloc] init]; [alert setMessageText: NSLocalizedString(@"The destination directory and root data directory have the same name.", "Add torrent -> same name -> title")]; [alert setInformativeText: NSLocalizedString(@"If you are attempting to use already existing data," " the root data directory should be inside the destination directory.", "Add torrent -> same name -> message")]; [alert setAlertStyle: NSWarningAlertStyle]; [alert addButtonWithTitle: NSLocalizedString(@"Cancel", "Add torrent -> same name -> button")]; [alert addButtonWithTitle: NSLocalizedString(@"Add", "Add torrent -> same name -> button")]; [alert setShowsSuppressionButton: YES]; [alert beginSheetModalForWindow: [self window] modalDelegate: self didEndSelector: @selector(sameNameAlertDidEnd:returnCode:contextInfo:) contextInfo: nil]; } else [self confirmAdd]; } - (void) cancelAdd: (id) sender { [[self window] performClose: sender]; } //only called on cancel - (BOOL) windowShouldClose: (id) window { [fController askOpenMagnetConfirmed: self add: NO]; return YES; } - (void) changePriority: (id) sender { tr_priority_t priority; switch ([sender indexOfSelectedItem]) { case POPUP_PRIORITY_HIGH: priority = TR_PRI_HIGH; break; case POPUP_PRIORITY_NORMAL: priority = TR_PRI_NORMAL; break; case POPUP_PRIORITY_LOW: priority = TR_PRI_LOW; break; default: NSAssert1(NO, @"Unknown priority tag for adding torrent: %ld", [sender tag]); } [fTorrent setPriority: priority]; } - (void) updateGroupMenu: (NSNotification *) notification { [self setGroupsMenu]; if (![fGroupPopUp selectItemWithTag: fGroupValue]) { fGroupValue = -1; fGroupDeterminationType = TorrentDeterminationAutomatic; [fGroupPopUp selectItemWithTag: fGroupValue]; } } @end @implementation AddMagnetWindowController (Private) - (void) confirmAdd { [fTorrent setGroupValue: fGroupValue determinationType: fGroupDeterminationType]; if ([fStartCheck state] == NSOnState) [fTorrent startTransfer]; [self close]; [fController askOpenMagnetConfirmed: self add: YES]; //ensure last, since it releases this controller } - (void) setDestinationPath: (NSString *) destination determinationType: (TorrentDeterminationType) determinationType { destination = [destination stringByExpandingTildeInPath]; if (!fDestination || ![fDestination isEqualToString: destination]) { [fDestination release]; fDestination = [destination retain]; [fTorrent changeDownloadFolderBeforeUsing: fDestination determinationType: determinationType]; } [fLocationField setStringValue: [fDestination stringByAbbreviatingWithTildeInPath]]; [fLocationField setToolTip: fDestination]; ExpandedPathToIconTransformer * iconTransformer = [[ExpandedPathToIconTransformer alloc] init]; [fLocationImageView setImage: [iconTransformer transformedValue: fDestination]]; [iconTransformer release]; } - (void) setGroupsMenu { NSMenu * groupMenu = [[GroupsController groups] groupMenuWithTarget: self action: @selector(changeGroupValue:) isSmall: NO]; [fGroupPopUp setMenu: groupMenu]; } - (void) changeGroupValue: (id) sender { NSInteger previousGroup = fGroupValue; fGroupValue = [sender tag]; fGroupDeterminationType = TorrentDeterminationUserSpecified; if ([[GroupsController groups] usesCustomDownloadLocationForIndex: fGroupValue]) [self setDestinationPath: [[GroupsController groups] customDownloadLocationForIndex: fGroupValue] determinationType: TorrentDeterminationAutomatic]; else if ([fDestination isEqualToString: [[GroupsController groups] customDownloadLocationForIndex: previousGroup]]) [self setDestinationPath: [[NSUserDefaults standardUserDefaults] stringForKey: @"DownloadFolder"] determinationType: TorrentDeterminationAutomatic]; else; } - (void) sameNameAlertDidEnd: (NSAlert *) alert returnCode: (NSInteger) returnCode contextInfo: (void *) contextInfo { if ([[alert suppressionButton] state] == NSOnState) [[NSUserDefaults standardUserDefaults] setBool: NO forKey: @"WarningFolderDataSameName"]; [alert release]; if (returnCode == NSAlertSecondButtonReturn) [self performSelectorOnMainThread: @selector(confirmAdd) withObject: nil waitUntilDone: NO]; } @end transmission-2.92/macosx/PaxHeaders.4960/PrefsWindow.h0000644000000000000000000000013212442116663017575 xustar0030 mtime=1418239411.116048326 30 atime=1418239411.116048326 30 ctime=1457295923.470866926 transmission-2.92/macosx/PrefsWindow.h0000644000175000017500000000263312442116663021226 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: PrefsWindow.h 13251 2012-03-13 02:52:11Z livings124 $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface PrefsWindow : NSWindow { } @end transmission-2.92/macosx/PaxHeaders.4960/InfoWindowController.m0000644000000000000000000000013212664476420021470 xustar0030 mtime=1456635152.265501144 30 atime=1456635152.265501144 30 ctime=1457295923.333864596 transmission-2.92/macosx/InfoWindowController.m0000644000175000017500000005060512664476420023123 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoWindowController.m 14685 2016-02-27 20:29:57Z mikedld $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "InfoWindowController.h" #import "InfoViewController.h" #import "InfoGeneralViewController.h" #import "InfoActivityViewController.h" #import "InfoTrackersViewController.h" #import "InfoPeersViewController.h" #import "InfoFileViewController.h" #import "InfoOptionsViewController.h" #import "InfoTabButtonCell.h" #import "NSApplicationAdditions.h" #import "NSStringAdditions.h" #import "Torrent.h" #define TAB_INFO_IDENT @"Info" #define TAB_ACTIVITY_IDENT @"Activity" #define TAB_TRACKER_IDENT @"Tracker" #define TAB_PEERS_IDENT @"Peers" #define TAB_FILES_IDENT @"Files" #define TAB_OPTIONS_IDENT @"Options" #define TAB_MIN_HEIGHT 250 #define INVALID -99 typedef enum { TAB_GENERAL_TAG = 0, TAB_ACTIVITY_TAG = 1, TAB_TRACKERS_TAG = 2, TAB_PEERS_TAG = 3, TAB_FILE_TAG = 4, TAB_OPTIONS_TAG = 5 } tabTag; @interface InfoWindowController (Private) - (void) resetInfo; - (void) resetInfoForTorrent: (NSNotification *) notification; @end @implementation InfoWindowController - (id) init { self = [super initWithWindowNibName: @"InfoWindow"]; return self; } - (void) awakeFromNib { [fNoneSelectedField setStringValue: NSLocalizedString(@"No Torrents Selected", "Inspector -> selected torrents")]; //window location and size NSPanel * window = (NSPanel *)[self window]; [window setFloatingPanel: NO]; const CGFloat windowHeight = NSHeight([window frame]); fMinWindowWidth = [window minSize].width; [window setFrameAutosaveName: @"InspectorWindow"]; [window setFrameUsingName: @"InspectorWindow"]; NSRect windowRect = [window frame]; windowRect.origin.y -= windowHeight - NSHeight(windowRect); windowRect.size.height = windowHeight; [window setFrame: windowRect display: NO]; [window setBecomesKeyOnlyIfNeeded: YES]; //set tab tooltips [fTabMatrix setToolTip: NSLocalizedString(@"General Info", "Inspector -> tab") forCell: [fTabMatrix cellWithTag: TAB_GENERAL_TAG]]; [fTabMatrix setToolTip: NSLocalizedString(@"Activity", "Inspector -> tab") forCell: [fTabMatrix cellWithTag: TAB_ACTIVITY_TAG]]; [fTabMatrix setToolTip: NSLocalizedString(@"Trackers", "Inspector -> tab") forCell: [fTabMatrix cellWithTag: TAB_TRACKERS_TAG]]; [fTabMatrix setToolTip: NSLocalizedString(@"Peers", "Inspector -> tab") forCell: [fTabMatrix cellWithTag: TAB_PEERS_TAG]]; [fTabMatrix setToolTip: NSLocalizedString(@"Files", "Inspector -> tab") forCell: [fTabMatrix cellWithTag: TAB_FILE_TAG]]; [fTabMatrix setToolTip: NSLocalizedString(@"Options", "Inspector -> tab") forCell: [fTabMatrix cellWithTag: TAB_OPTIONS_TAG]]; //set selected tab fCurrentTabTag = INVALID; NSString * identifier = [[NSUserDefaults standardUserDefaults] stringForKey: @"InspectorSelected"]; NSInteger tag; if ([identifier isEqualToString: TAB_INFO_IDENT]) tag = TAB_GENERAL_TAG; else if ([identifier isEqualToString: TAB_ACTIVITY_IDENT]) tag = TAB_ACTIVITY_TAG; else if ([identifier isEqualToString: TAB_TRACKER_IDENT]) tag = TAB_TRACKERS_TAG; else if ([identifier isEqualToString: TAB_PEERS_IDENT]) tag = TAB_PEERS_TAG; else if ([identifier isEqualToString: TAB_FILES_IDENT]) tag = TAB_FILE_TAG; else if ([identifier isEqualToString: TAB_OPTIONS_IDENT]) tag = TAB_OPTIONS_TAG; else //safety { [[NSUserDefaults standardUserDefaults] setObject: TAB_INFO_IDENT forKey: @"InspectorSelected"]; tag = TAB_GENERAL_TAG; } [fTabMatrix selectCellWithTag: tag]; [self setTab: nil]; //set blank inspector [self setInfoForTorrents: [NSArray array]]; //allow for update notifications NSNotificationCenter * nc = [NSNotificationCenter defaultCenter]; [nc addObserver: self selector: @selector(resetInfoForTorrent:) name: @"ResetInspector" object: nil]; [nc addObserver: self selector: @selector(updateInfoStats) name: @"UpdateStats" object: nil]; [nc addObserver: self selector: @selector(updateOptions) name: @"UpdateOptions" object: nil]; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; if ([fViewController respondsToSelector: @selector(saveViewSize)]) [fViewController saveViewSize]; [fGeneralViewController release]; [fActivityViewController release]; [fTrackersViewController release]; [fPeersViewController release]; [fFileViewController release]; [fOptionsViewController release]; [fTorrents release]; [super dealloc]; } - (void) setInfoForTorrents: (NSArray *) torrents { if (fTorrents && [fTorrents isEqualToArray: torrents]) return; [fTorrents release]; fTorrents = [torrents retain]; [self resetInfo]; } - (NSRect) windowWillUseStandardFrame: (NSWindow *) window defaultFrame: (NSRect) defaultFrame { NSRect windowRect = [window frame]; windowRect.size.width = [window minSize].width; return windowRect; } - (void) windowWillClose: (NSNotification *) notification { if (fCurrentTabTag == TAB_FILE_TAG && ([QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible])) [[QLPreviewPanel sharedPreviewPanel] reloadData]; } - (void) setTab: (id) sender { const NSInteger oldTabTag = fCurrentTabTag; fCurrentTabTag = [fTabMatrix selectedTag]; if (fCurrentTabTag == oldTabTag) return; //take care of old view CGFloat oldHeight = 0; if (oldTabTag != INVALID) { //deselect old tab item [(InfoTabButtonCell *)[fTabMatrix cellWithTag: oldTabTag] setSelectedTab: NO]; if ([fViewController respondsToSelector: @selector(saveViewSize)]) [fViewController saveViewSize]; if ([fViewController respondsToSelector: @selector(clearView)]) [fViewController clearView]; NSView * oldView = [fViewController view]; oldHeight = NSHeight([oldView frame]); //remove old view [oldView removeFromSuperview]; } //set new tab item NSString * identifier; switch (fCurrentTabTag) { case TAB_GENERAL_TAG: if (!fGeneralViewController) { fGeneralViewController = [[InfoGeneralViewController alloc] init]; [fGeneralViewController setInfoForTorrents: fTorrents]; } fViewController = fGeneralViewController; identifier = TAB_INFO_IDENT; break; case TAB_ACTIVITY_TAG: if (!fActivityViewController) { fActivityViewController = [[InfoActivityViewController alloc] init]; [fActivityViewController setInfoForTorrents: fTorrents]; } fViewController = fActivityViewController; identifier = TAB_ACTIVITY_IDENT; break; case TAB_TRACKERS_TAG: if (!fTrackersViewController) { fTrackersViewController = [[InfoTrackersViewController alloc] init]; [fTrackersViewController setInfoForTorrents: fTorrents]; } fViewController = fTrackersViewController; identifier = TAB_TRACKER_IDENT; break; case TAB_PEERS_TAG: if (!fPeersViewController) { fPeersViewController = [[InfoPeersViewController alloc] init]; [fPeersViewController setInfoForTorrents: fTorrents]; } fViewController = fPeersViewController; identifier = TAB_PEERS_IDENT; break; case TAB_FILE_TAG: if (!fFileViewController) { fFileViewController = [[InfoFileViewController alloc] init]; [fFileViewController setInfoForTorrents: fTorrents]; } fViewController = fFileViewController; identifier = TAB_FILES_IDENT; break; case TAB_OPTIONS_TAG: if (!fOptionsViewController) { fOptionsViewController = [[InfoOptionsViewController alloc] init]; [fOptionsViewController setInfoForTorrents: fTorrents]; } fViewController = fOptionsViewController; identifier = TAB_OPTIONS_IDENT; break; default: NSAssert1(NO, @"Unknown info tab selected: %ld", fCurrentTabTag); return; } [[NSUserDefaults standardUserDefaults] setObject: identifier forKey: @"InspectorSelected"]; NSWindow * window = [self window]; [window setTitle: [NSString stringWithFormat: @"%@ - %@", [fViewController title], NSLocalizedString(@"Torrent Inspector", "Inspector -> title")]]; //selected tab item [(InfoTabButtonCell *)[fTabMatrix selectedCell] setSelectedTab: YES]; NSView * view = [fViewController view]; [fViewController updateInfo]; NSRect windowRect = [window frame], viewRect = [view frame]; const CGFloat difference = NSHeight(viewRect) - oldHeight; windowRect.origin.y -= difference; windowRect.size.height += difference; const CGFloat minWindowWidth = MAX(fMinWindowWidth, [view fittingSize].width); windowRect.size.width = MAX(NSWidth(windowRect), minWindowWidth); if ([fViewController respondsToSelector: @selector(saveViewSize)]) //a little bit hacky, but avoids requiring an extra method { if ([window screen]) { const CGFloat screenHeight = NSHeight([[window screen] visibleFrame]); if (NSHeight(windowRect) > screenHeight) { const CGFloat difference = screenHeight - NSHeight(windowRect); windowRect.origin.y -= difference; windowRect.size.height += difference; viewRect.size.height += difference; } } [window setMinSize: NSMakeSize(minWindowWidth, NSHeight(windowRect) - NSHeight(viewRect) + TAB_MIN_HEIGHT)]; [window setMaxSize: NSMakeSize(FLT_MAX, FLT_MAX)]; } else { [window setMinSize: NSMakeSize(minWindowWidth, NSHeight(windowRect))]; [window setMaxSize: NSMakeSize(FLT_MAX, NSHeight(windowRect))]; } viewRect.size.width = NSWidth(windowRect); [view setFrame: viewRect]; [window setFrame: windowRect display: YES animate: oldTabTag != INVALID]; [[window contentView] addSubview: view]; [[window contentView] addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"H:|-0-[view]-0-|" options: 0 metrics: nil views: @{ @"view": view }]]; [[window contentView] addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"V:[tabs]-0-[view]-0-|" options: 0 metrics: nil views: @{ @"tabs": fTabMatrix, @"view": view }]]; if ((fCurrentTabTag == TAB_FILE_TAG || oldTabTag == TAB_FILE_TAG) && ([QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible])) [[QLPreviewPanel sharedPreviewPanel] reloadData]; } - (void) setNextTab { NSInteger tag = [fTabMatrix selectedTag]+1; if (tag >= [fTabMatrix numberOfColumns]) tag = 0; [fTabMatrix selectCellWithTag: tag]; [self setTab: nil]; } - (void) setPreviousTab { NSInteger tag = [fTabMatrix selectedTag]-1; if (tag < 0) tag = [fTabMatrix numberOfColumns]-1; [fTabMatrix selectCellWithTag: tag]; [self setTab: nil]; } - (void) swipeWithEvent: (NSEvent *) event { if ([event deltaX] < 0.0) [self setNextTab]; else if ([event deltaX] > 0.0) [self setPreviousTab]; } - (void) updateInfoStats { [fViewController updateInfo]; } - (void) updateOptions { [fOptionsViewController updateOptions]; } - (NSArray *) quickLookURLs { return [fFileViewController quickLookURLs]; } - (BOOL) canQuickLook { if (fCurrentTabTag != TAB_FILE_TAG || ![[self window] isVisible]) return NO; return [fFileViewController canQuickLook]; } - (NSRect) quickLookSourceFrameForPreviewItem: (id ) item { return [fFileViewController quickLookSourceFrameForPreviewItem: item]; } @end @implementation InfoWindowController (Private) - (void) resetInfo { const NSUInteger numberSelected = [fTorrents count]; if (numberSelected != 1) { if (numberSelected > 0) { [fImageView setImage: [NSImage imageNamed: NSImageNameMultipleDocuments]]; [fNameField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%@ Torrents Selected", "Inspector -> selected torrents"), [NSString formattedUInteger: numberSelected]]]; [fNameField setHidden: NO]; uint64_t size = 0; NSUInteger fileCount = 0, magnetCount = 0; for (Torrent * torrent in fTorrents) { size += [torrent size]; fileCount += [torrent fileCount]; if ([torrent isMagnet]) ++magnetCount; } NSMutableArray * fileStrings = [NSMutableArray arrayWithCapacity: 2]; if (fileCount > 0) { NSString * fileString; if (fileCount == 1) fileString = NSLocalizedString(@"1 file", "Inspector -> selected torrents"); else fileString = [NSString stringWithFormat: NSLocalizedString(@"%@ files", "Inspector -> selected torrents"), [NSString formattedUInteger: fileCount]]; [fileStrings addObject: fileString]; } if (magnetCount > 0) { NSString * magnetString; if (magnetCount == 1) magnetString = NSLocalizedString(@"1 magnetized transfer", "Inspector -> selected torrents"); else magnetString = [NSString stringWithFormat: NSLocalizedString(@"%@ magnetized transfers", "Inspector -> selected torrents"), [NSString formattedUInteger: magnetCount]]; [fileStrings addObject: magnetString]; } NSString * fileString = [fileStrings componentsJoinedByString: @" + "]; if (magnetCount < numberSelected) { [fBasicInfoField setStringValue: [NSString stringWithFormat: @"%@, %@", fileString, [NSString stringWithFormat: NSLocalizedString(@"%@ total", "Inspector -> selected torrents"), [NSString stringForFileSize: size]]]]; NSString * byteString; if ([NSApp isOnMountainLionOrBetter]) { NSByteCountFormatter * formatter = [[NSByteCountFormatterMtLion alloc] init]; [formatter setAllowedUnits: NSByteCountFormatterUseBytes]; byteString = [formatter stringFromByteCount: size]; [formatter release]; } else byteString = [NSString stringWithFormat: NSLocalizedString(@"%@ bytes", "Inspector -> selected torrents"), [NSString formattedUInteger: size]]; [fBasicInfoField setToolTip: byteString]; } else { [fBasicInfoField setStringValue: fileString]; [fBasicInfoField setToolTip: nil]; } [fBasicInfoField setHidden: NO]; [fNoneSelectedField setHidden: YES]; } else { [fImageView setImage: [NSImage imageNamed: NSImageNameApplicationIcon]]; [fNoneSelectedField setHidden: NO]; [fNameField setHidden: YES]; [fBasicInfoField setHidden: YES]; } [fNameField setToolTip: nil]; } else { Torrent * torrent = [fTorrents objectAtIndex: 0]; [fImageView setImage: [torrent icon]]; NSString * name = [torrent name]; [fNameField setStringValue: name]; [fNameField setToolTip: name]; [fNameField setHidden: NO]; if (![torrent isMagnet]) { NSString * basicString = [NSString stringForFileSize: [torrent size]]; if ([torrent isFolder]) { NSString * fileString; const NSUInteger fileCount = [torrent fileCount]; if (fileCount == 1) fileString = NSLocalizedString(@"1 file", "Inspector -> selected torrents"); else fileString= [NSString stringWithFormat: NSLocalizedString(@"%@ files", "Inspector -> selected torrents"), [NSString formattedUInteger: fileCount]]; basicString = [NSString stringWithFormat: @"%@, %@", fileString, basicString]; } [fBasicInfoField setStringValue: basicString]; NSString * byteString; if ([NSApp isOnMountainLionOrBetter]) { NSByteCountFormatter * formatter = [[NSByteCountFormatterMtLion alloc] init]; [formatter setAllowedUnits: NSByteCountFormatterUseBytes]; byteString = [formatter stringFromByteCount: [torrent size]]; [formatter release]; } else byteString = [NSString stringWithFormat: NSLocalizedString(@"%@ bytes", "Inspector -> selected torrents"), [NSString formattedUInteger: [torrent size]]]; [fBasicInfoField setToolTip: byteString]; } else { [fBasicInfoField setStringValue: NSLocalizedString(@"Magnetized transfer", "Inspector -> selected torrents")]; [fBasicInfoField setToolTip: nil]; } [fBasicInfoField setHidden: NO]; [fNoneSelectedField setHidden: YES]; } [fGeneralViewController setInfoForTorrents: fTorrents]; [fActivityViewController setInfoForTorrents: fTorrents]; [fTrackersViewController setInfoForTorrents: fTorrents]; [fPeersViewController setInfoForTorrents: fTorrents]; [fFileViewController setInfoForTorrents: fTorrents]; [fOptionsViewController setInfoForTorrents: fTorrents]; [fViewController updateInfo]; } - (void) resetInfoForTorrent: (NSNotification *) notification { Torrent * torrent = [[notification userInfo] objectForKey: @"Torrent"]; if (fTorrents && (!torrent || [fTorrents containsObject: torrent])) [self resetInfo]; } @end transmission-2.92/macosx/PaxHeaders.4960/TrackerCell.h0000644000000000000000000000013212442116666017524 xustar0030 mtime=1418239414.205101262 30 atime=1418239414.205101262 30 ctime=1457295923.603869188 transmission-2.92/macosx/TrackerCell.h0000644000175000017500000000274012442116666021154 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: TrackerCell.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2009-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface TrackerCell : NSActionCell { NSMutableDictionary * fNameAttributes, * fStatusAttributes; } @end transmission-2.92/macosx/PaxHeaders.4960/TrackerTableView.h0000644000000000000000000000013212442116666020527 xustar0030 mtime=1418239414.197101125 30 atime=1418239414.197101125 30 ctime=1457295923.626869579 transmission-2.92/macosx/TrackerTableView.h0000644000175000017500000000322212442116666022153 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: TrackerTableView.h 13251 2012-03-13 02:52:11Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @class Torrent; @interface TrackerTableView : NSTableView { //weak references Torrent * fTorrent; NSArray * fTrackers; } - (void) setTorrent: (Torrent *) torrent; - (void) setTrackers: (NSArray *) trackers; - (void) copy: (id) sender; - (void) paste: (id) sender; @end transmission-2.92/macosx/PaxHeaders.4960/es.lproj0000644000000000000000000000013212666747213016645 xustar0030 mtime=1457245835.324998801 30 atime=1418239416.880147103 30 ctime=1457295922.742854546 transmission-2.92/macosx/es.lproj/0000755000175000017500000000000012666747213020347 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/es.lproj/PaxHeaders.4960/InfoPlist.strings0000644000000000000000000000013212664476420022241 xustar0030 mtime=1456635152.310501917 30 atime=1456635152.310501917 30 ctime=1457295922.742854546 transmission-2.92/macosx/es.lproj/InfoPlist.strings0000644000175000017500000000017512664476420023671 0ustar00mikedldmikedld00000000000000/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = "Copyright © 2005-2016 The Transmission Project";transmission-2.92/macosx/es.lproj/PaxHeaders.4960/Creator.xib0000644000000000000000000000013212640354045021012 xustar0030 mtime=1451350053.699172081 30 atime=1451350053.699172081 30 ctime=1457295922.741854529 transmission-2.92/macosx/es.lproj/Creator.xib0000644000175000017500000006023012640354045022440 0ustar00mikedldmikedld00000000000000 File File transmission-2.92/macosx/es.lproj/PaxHeaders.4960/PrefsWindow.xib0000644000000000000000000000013212640354045021662 xustar0030 mtime=1451350053.702172133 30 atime=1451350053.702172133 30 ctime=1457295922.742854546 transmission-2.92/macosx/es.lproj/PrefsWindow.xib0000644000175000017500000055164412640354045023326 0ustar00mikedldmikedld00000000000000 ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer Cuando esté activado, el Límite de Velocidad reemplaza los límites globales de ancho de banda NSAllRomanInputSourcesLocaleIdentifier NSAllRomanInputSourcesLocaleIdentifier YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7MTgsIDE4fdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPEQ3uTU0AKgAAAGiAOuBP8AQW DQeEQmFQuGQ2HQWBOuCQ+KRWLRSIxOLxuORaMx2QSGFx+RSWRSSTSmNyiVS2HyyXTGFTCZTWIQObTmDT SdS6eT2VT+gSahUOTzijTGi0mO0umSukU+UwEAAADwEAAAMAAAABABIAAAEBAAMAAAABABIAAAECAAMA AAAEAAABIgEDAAMAAAABAAUAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAESAAMAAAABAAEAAAEVAAMA AAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAAXwEcAAMAAAABAAEAAAE9AAMAAAABAAIAAAFSAAMA AAABAAEAAAFTAAMAAAAEAAABKodzAAcAAAy8AAABMgAAAAAACAAIAAgACAABAAEAAQABAAAMvGFwcGwC EAAAbW50clJHQiBYWVogB94AAQAIAAkANQAXYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA APbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAARZGVzYwAAAVAAAABiZHNjbQAAAbQAAAGkY3BydAAAA1gAAAAjd3RwdAAAA3wAAAAUclhZWgAAA5AA AAAUZ1hZWgAAA6QAAAAUYlhZWgAAA7gAAAAUclRSQwAAA8wAAAgMYWFyZwAAC9gAAAAgdmNndAAAC/gA AAAwbmRpbgAADCgAAAA+Y2hhZAAADGgAAAAsbW1vZAAADJQAAAAoYlRSQwAAA8wAAAgMZ1RSQwAAA8wA AAgMYWFiZwAAC9gAAAAgYWFnZwAAC9gAAAAgZGVzYwAAAAAAAAAIRGlzcGxheQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAG1sdWMAAAAAAAAAIQAAAAxockhSAAAACAAAAZxrb0tSAAAACAAAAZxuYk5PAAAACAAAAZxp ZAAAAAAACAAAAZxodUhVAAAACAAAAZxjc0NaAAAACAAAAZxkYURLAAAACAAAAZx1a1VBAAAACAAAAZxh cgAAAAAACAAAAZxpdElUAAAACAAAAZxyb1JPAAAACAAAAZxubE5MAAAACAAAAZxoZUlMAAAACAAAAZxl c0VTAAAACAAAAZxmaUZJAAAACAAAAZx6aFRXAAAACAAAAZx2aVZOAAAACAAAAZxza1NLAAAACAAAAZx6 aENOAAAACAAAAZxydVJVAAAACAAAAZxmckZSAAAACAAAAZxtcwAAAAAACAAAAZxjYUVTAAAACAAAAZx0 aFRIAAAACAAAAZxkZURFAAAACAAAAZxlblVTAAAACAAAAZxwdEJSAAAACAAAAZxwbFBMAAAACAAAAZxl bEdSAAAACAAAAZxzdlNFAAAACAAAAZx0clRSAAAACAAAAZxqYUpQAAAACAAAAZxwdFBUAAAACAAAAZwA aQBNAGEAY3RleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMTQAAFhZWiAAAAAAAADzFgABAAAA ARbKWFlaIAAAAAAAAHHAAAA5igAAAWdYWVogAAAAAAAAYSMAALnmAAAT9lhZWiAAAAAAAAAj8gAADJAA AL3QY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgA bQByAHcAfACBAIYAiwCQAJUAmgCfAKMAqACtALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEB BwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB 2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC 9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUE YwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYG JwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDII RghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4K xQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4N qQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ 9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsU rRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y 1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcd cB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9wo DSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEu Fi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0 njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7 qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdD OkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxL U0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT 9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZd J114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm 6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBx OnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8 IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuH n4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02T tpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qg aaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUSt uK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67 p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZ bNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6Lzp RunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5 x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//9wYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKDnZjZ3QA AAAAAAAAAQABAAAAAAAAAAEAAAABAAAAAAAAAAEAAAABAAAAAAAAAAEAAG5kaW4AAAAAAAAANgAAp0AA AFWAAABMwAAAnsAAACWAAAAMwAAAUAAAAFRAAAIzMwACMzMAAjMzAAAAAAAAAABzZjMyAAAAAAABDHIA AAX4///zHQAAB7oAAP1y///7nf///aQAAAPZAADAcW1tb2QAAAAAAAAGEAAAoAcAAAAAySceAAAAAAAA AAAAAAAAAAAAAADSJSYnKFokY2xhc3NuYW1lWCRjbGFzc2VzXxAQTlNCaXRtYXBJbWFnZVJlcKMnKSpa TlNJbWFnZVJlcFhOU09iamVjdNIlJiwtV05TQXJyYXmiLCrSJSYvMF5OU011dGFibGVBcnJheaMvLCrT MjMKNDU2V05TV2hpdGVcTlNDb2xvclNwYWNlRDAgMAAQA4AM0iUmODlXTlNDb2xvcqI4KtIlJjs8V05T SW1hZ2WiOypfEA9OU0tleWVkQXJjaGl2ZXLRP0BUcm9vdIABAAgAEQAaACMALQAyADcARgBMAFcAXgBl AHIAeQCBAIMAhQCKAIwAjgCXAJwApwCpAKsArQCyALUAtwC5ALsAvQDCANkA2wDdDs8O1A7fDugO+w7/ DwoPEw8YDyAPIw8oDzcPOw9CD0oPVw9cD14PYA9lD20PcA91D30PgA+SD5UPmgAAAAAAAAIBAAAAAAAA AEEAAAAAAAAAAAAAAAAAAA+cA transmission-2.92/macosx/es.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212640354045022543 xustar0030 mtime=1451350053.702172133 30 atime=1451350053.702172133 30 ctime=1457295922.742854546 transmission-2.92/macosx/es.lproj/Localizable.strings0000644000175000017500000005365012640354045024201 0ustar00mikedldmikedld00000000000000"\"%@\" is not a valid torrent file." = "\"%@\" no es un torrent válido."; "%@ bytes" = "%@ bytes"; "%@ files" = "%@ archivos"; "%@ IP address rules in list" = "%@ direcciones IP cargadas"; "%@ magnetized transfers" = "%@ tareas magnetizadas"; "%@ of %@" = "%1$@ de %2$@"; "%@ of torrent metadata retrieved" = "%@ de los metadatos del torrent recuperados"; "%@ remaining" = "%@ restante"; "%@ selected" = "%@ seleccionado"; "%@ times" = "%@ veces"; "%@ Torrent Files" = "%@ Torrents"; "%@ Torrents Selected" = "%@ Torrents seleccionados"; "%@ total" = "%@ total"; "%@ transfers" = "%@ tareas"; "%@ verified" = "%@ verificado"; "%d cache" = "%d caché"; "%d Connected" = "%d conectados"; "%d DHT" = "%d DHT"; "%d Downloading" = "%d Descargando"; "%d incoming" = "%d entrante"; "%d KB/s" = "%d KB/s"; "%d local discovery" = "%d descubrimientos locales"; "%d LTEP" = "%d LTEP"; "%d minutes" = "%d minutos"; "%d PEX" = "%d PEX"; "%d pieces, %@ each" = "%1$d partes, %2$@ cada una"; "%d Seeding" = "%d Compartiendo"; "%d tracker" = "%d tracker"; "%d web seeds" = "%d web seeds"; "%u days" = "%u días"; "%u hr" = "%u horas"; "%u min" = "%u minutos"; "%u sec" = "%u segundos"; "%u years" = "%u años"; "1 day" = "1 día"; "1 file" = "1 archivo"; "1 magnetized transfer" = "1 tarea magnetizada"; "1 minute" = "1 minuto"; "1 piece, %@" = "1 parte, %@"; "1 time" = "1 vez"; "1 transfer" = "1 tarea"; "1 year" = "1 año"; "A blocklist must first be downloaded" = "Primero hay que descargar una lista de bloqueo"; "A file with the name \"%@\" already exists in the directory \"%@\". Choose a new name or directory to create the torrent file." = "Ya existe un archivo con el nombre \"%1$@\" en la carpeta \"%2$@\". Elija un nombre nuevo o una carpeta nueva para crear el torrent."; "A folder cannot be moved to inside itself." = "No se puede mover una carpeta dentro de sí misma."; "A torrent file cannot be created for files with no size." = "No se puede crear un torrent a partir de archivos vacíos."; "A torrent file with this name and directory cannot be created." = "No se puede crear un torrent con este nombre y en esta carpeta."; "A transfer marked as private with no tracker addresses will be unable to connect to peers. The torrent file will only be useful if you plan to upload the file to a tracker website that will add the addresses for you." = "Una tarea marcada como privada sin direcciones de tracker será incapaz de conectar con clientes. El torrent sólo será útil si quieres subir el archivo a un tracker web que añada las direcciones por ti."; "A transfer of \"%@\" already exists." = "Ya existe una tarea de \"%@\"."; "Active" = "Activo"; "Activity" = "Actividad"; "Add" = "Añadir"; "Add a tracker" = "Añadir un tracker"; "Adding magnetized transfer failed." = "Fallo al añadir una descarga magnetizada."; "All" = "Todo"; "All Groups" = "Todos los grupos"; "An unknown error has occurred." = "Ha ocurrido un error desconocido"; "Announce error" = "Error en el anuncio"; "Announce in progress" = "Anuncio en progreso"; "Announce is queued" = "Anuncio en cola"; "Announce not scheduled" = "Anuncio no programado"; "Announce timed out" = "Anuncio expirado"; "Apply All" = "Aplicar a todos"; "Apply Selected" = "Aplicar a los seleccionados"; "Are you sure you want to quit?" = "¿Está seguro de querer salir?"; "Are you sure you want to remove \"%@\" from the transfer list and trash the data file?" = "¿Está seguro de querer eliminar \"%@\" de la lista y mover los datos a la papelera?"; "Are you sure you want to remove \"%@\" from the transfer list?" = "¿Está seguro de querer eliminar \"%@\" de la lista?"; "Are you sure you want to remove %@ completed transfers from the transfer list?" = "¿Está seguro de querer eliminar %@ tareas completadas de la lista?"; "Are you sure you want to remove %@ transfers from the transfer list and trash the data files?" = "¿Está seguro de querer eliminar %@ tareas completadas de la lista y eliminar los archivos del disco duro?"; "Are you sure you want to remove %@ transfers from the transfer list?" = "¿Está seguro de querer eliminar %@ tareas de la lista?"; "Are you sure you want to remove %d trackers?" = "¿Está seguro de querer eliminar %d trackers?"; "Are you sure you want to remove this tracker?" = "¿Está seguro de querer eliminar este tracker?"; "Are you sure you want to reset usage statistics?" = "¿Está seguro de querer reiniciar las estadísticas de uso?"; "Available" = "Disponible"; "Bandwidth" = "Ancho de banda"; "Bandwidth settings changed" = "La configuración de ancho de banda ha cambiado."; "Blue" = "Azul"; "Cancel" = "Cancelar"; "Change transfer settings" = "Cambiar la configuración de la tarea"; "Check Selected" = "Comprobar los seleccionados"; "Checking existing data" = "Comprobando datos existentes"; "Clear" = "Limpiar"; "Client" = "Cliente"; "Close Quick Look" = "Cerrar Vista Rápida"; "Configure In Growl" = "Configurar en Growl"; "Configure In System Preferences" = "Configurar en Preferencias del Sistema"; "Connecting to site" = "Conectando al sitio"; "Copy of \"%@\" Cannot Be Created" = "No se puede hacer una copia de \"%@\""; "Could not read \"%s\": %s." = "No se ha podido leer \"%1$s\": %2$s."; "Could not write \"%s\": %s." = "No se ha podido escribir \"%1$s\": %2$s."; "Create" = "Crear"; "Create a Torrent File" = "Crear torrent"; "Create torrent file" = "Crear torrent"; "Create Torrent File" = "Crear torrent"; "Creation of \"%@\" failed." = "No se ha podido crear \"%@\""; "Currently downloading (interested and not choked)" = "Actualmente descargando (interesado y no bloqueado)"; "Currently uploading (interested and not choked)" = "Actualmente subiendo (interesado y no bloqueado)"; "Date" = "Fecha"; "Debug" = "Debug"; "disabled" = "desactivado"; "DL" = "↓"; "DL from %d" = "bajando de %d"; "Do not check disk space again" = "No volver a comprobar el espacio del disco otra vez"; "Don't bug me about this ever again." = "No me vuelvas a molestar nunca más sobre esto."; "Don't Download" = "No descargar"; "Donate" = "Donar"; "Donate or not, there will be no difference to your torrenting experience." = "Dones o no, no habrá diferencia en el rendimiento de tus torrents."; "Download" = "Descargar"; "Download Anyway" = "Descargas de todos modos"; "Download Complete" = "Descarga completada"; "Download of the blocklist failed." = "Ha fallado la descarga de la lista de bloqueo."; "Download Some" = "Descargar algunos"; "Download speed" = "Velocidad de descarga"; "Downloaded" = "Descargado"; "Downloading" = "Descargando"; "Downloading blocklist" = "Descargando lista de bloqueo"; "Downloading from %d of %d peers" = "Descargando de %1$d de %2$d clientes"; "Downloading from %d of 1 peer" = "Descargando de %d de 1 peer"; "Downloading From Peer" = "Descargando del cliente"; "Downloading From Web Seed" = "Descargando desde web seed"; "encrypted" = "encriptado"; "Encrypted Connection" = "Conexión encriptada"; "Error" = "Error"; "Files" = "Archivos"; "Filter" = "Filtro"; "From: cache" = "De: caché"; "From: distributed hash table" = "Desde: tabla de hash distribuido"; "From: incoming connection" = "De: conexión entrante"; "From: libtorrent extension protocol handshake" = "De: libtorrent extension protocol handshake"; "From: local peer discovery" = "De: búsqueda de clientes local"; "From: peer exchange" = "De: intercambio de clientes"; "From: tracker" = "De: tracker"; "GB" = "GB"; "GB/s" = "GB/s"; "General" = "General"; "General Info" = "Información general"; "Global download limit" = "Límite global de descarga"; "Global upload limit" = "Límite global de subida"; "got %d peers" = "conseguidos %d clientes"; "got 1 peer" = "tomado 1 cliente"; "Gray" = "Gris"; "Green" = "Verde"; "Group" = "Grupo"; "Groups" = "Grupos"; "Hide Filter Bar" = "Ocultar barra de filtro"; "Hide Inspector" = "Ocultar Inspector"; "Hide Status Bar" = "Ocultar barra de estado"; "High" = "Alta"; "High Priority" = "Alta prioridad"; "I Accept" = "Acepto"; "If you are attempting to use already existing data, the root data directory should be inside the destination directory." = "Si estás intentando usar datos ya existentes, el directorio principal de los datos debería estar dentro del directorio de destino."; "inactive" = "inactivo"; "Info" = "Información"; "Inspector" = "Inspector"; "Internet address of torrent file:" = "URL del torrent:"; "IP Address" = "Dirección IP"; "It appears that the file \"%@\" from %@ is not a torrent file." = "Parece que el archivo \"%1$@\" de %2$@ no es un torrent."; "KB" = "KB"; "KB/s" = "KB/s"; "Last Announce" = "Último anuncio"; "Last Scrape" = "Último raspado"; "Last updated" = "Actualizado por última vez"; "Leechers" = "Leechers"; "License" = "Licencia"; "Limit (%d KB/s)" = "Limitado (%d KB/s)"; "Log Could Not Be Saved" = "No se ha podido guardar el registro"; "Low" = "Baja"; "Low Priority" = "Baja prioridad"; "Magnet link is a duplicate of an existing transfer." = "El enlace magnet es un duplicado o una tarea existente."; "Magnetized transfer" = "Tarea magnetizada"; "MB" = "MB"; "MB/s" = "MB/s"; "Message" = "Mensaje"; "Message Log" = "Registro de mensajes"; "Multiple Priorities" = "Múltiples prioridades"; "N/A" = "N/D"; "Name" = "Nombre"; "Network" = "Red"; "Never" = "Nunca"; "New Tier" = "Nuevo Tier"; "Next announce in %@" = "Próximo anuncio en %@"; "No Group" = "Sin grupo"; "No Torrents Selected" = "Ningún torrent seleccionado"; "None" = "Ninguno"; "Nope" = "Nop"; "Normal" = "Normal"; "Normal Priority" = "Prioridad normal"; "Not enough remaining disk space to download \"%@\" completely." = "No hay espacio de disco suficiente para descargar \"%@\"."; "OK" = "OK"; "Once removed, continuing the transfer will require the torrent file or magnet link." = "Una vez eliminada, para reanudarla necesitará el torrent o el enlace magnet."; "Once removed, continuing the transfers will require the torrent files or magnet links." = "Una vez eliminadas, necesitará los archivos torrent o enlaces magnet para reanudar las tareas."; "Once removed, Transmission will no longer attempt to contact it. This cannot be undone." = "Una vez eliminado, Transmission no volverá a intentar contactar con él. Esto no se puede deshacer."; "Once removed, Transmission will no longer attempt to contact them. This cannot be undone." = "Una vez eliminados, Transmission no volverá a intentar contactar con ellos. Esto no se puede deshacer."; "Only Check Selected" = "Comprobar sólo los seleccionados"; "Open" = "Abrir"; "Open Address" = "Abrir dirección"; "Open Torrent Address" = "Abrir dirección de torrent"; "Open torrent files" = "Abrir torrent"; "Open Torrent Files" = "Abrir torrent"; "Open torrent web address" = "Abrir dirección web de torrent"; "Options" = "Opciones"; "Orange" = "Naranja"; "Partial Seed" = "Seed incompleto"; "Pause / Resume All" = "Detener / Reanudar todos"; "Pause / Resume Selected" = "Detener / Reanudar seleccionados"; "Pause All" = "Detener todos"; "Pause all transfers" = "Detener todas las tareas"; "Pause Selected" = "Detener seleccionados"; "Pause selected transfers" = "Detener tareas seleccionadas"; "Pause the transfer" = "Detener la tarea"; "Paused" = "Parado"; "Peer is unchoking you, but you are not interested" = "El cliente te está desbloqueando, pero no estás interesado"; "Peer wants you to upload, but you do not want to (interested and choked)" = "El cliente quiere subir, pero tú no quieres (interesado y bloqueado)"; "Peers" = "Clientes"; "Port" = "Puerto"; "Port check site is down" = "Sitio de comprobación de puertos caido"; "Port is closed" = "El puerto está cerrado"; "Port is open" = "El puerto está abierto"; "Priority" = "Prioridad"; "Priority Not Available" = "Prioridad no disponible"; "Private Torrent, non-tracker peer discovery disabled" = "Torrent privado, búsqueda de clientes de fuera del tracker desactivado"; "Process" = "Proceso"; "Processing blocklist" = "Procesando lista de bloqueo"; "Program Started" = "Programa comenzado"; "Progress: %@" = "Progreso: %@"; "Protocol: %@" = "Protocolo: %@"; "Public Torrent" = "Torrent público"; "Purple" = "Violeta"; "Quick Look" = "Vista Rápida"; "Quit" = "Salir"; "Quitting" = "Saliendo"; "Ratio" = "Ratio"; "Red" = "Rojo"; "Remaining Time" = "Tiempo restante"; "remaining time unknown" = "tiempo restante desconocido"; "Remote" = "Remoto"; "Remove" = "Eliminar"; "Remove all transfers that have completed seeding." = "Eliminar todas las tareas que hayan terminado de compartir."; "Remove Selected" = "Eliminar seleccionados"; "Remove selected trackers" = "Eliminar trackers seleccionados."; "Remove selected transfers" = "Eliminar las tareas seleccionadas"; "Rename" = "Renombrar"; "Rename File" = "Renombrar archivo"; "Rename the file \"%@\":" = "Renombrar el archivo \"%@\":"; "Reset" = "Restaurar"; "Resume All" = "Reanudar todos"; "Resume all transfers" = "Reanudar todas las tareas"; "Resume Selected" = "Reanudar seleccionados"; "Resume selected transfers" = "Reanudar las tareas seleccionadas"; "Resume the transfer" = "Reanudar la tarea"; "Resume the transfer right away" = "Reanudar la tarea ya"; "Running Time" = "Tiempo de ejecución"; "Save" = "Guardar"; "Scrape error" = "Error en el raspado"; "Scrape timed out" = "Raspado fuera de tiempo"; "Seeders" = "Seeders"; "Seeding" = "Subiendo"; "Seeding complete" = "Compartir finalizado"; "Seeding Complete" = "Compartir finalizado"; "Seeding to %d of %d peers" = "Compartiendo con %1$d de %2$d clientes"; "Seeding to %d of 1 peer" = "Compartiendo con %d de 1 cliente"; "Select" = "Seleccionar"; "Select a file or folder for the torrent file." = "Seleccionar un archivo o carpeta para el torrent."; "Select the download folder for \"%@\"" = "Seleccionar una carpeta de descarga para \"%@\""; "Select the name and location for the torrent file." = "Seleccionar el nombre y la ubicación del torrent."; "Select the new folder for \"%@\"." = "Seleccionar una carpeta nueva para \"%@\"."; "Select the new folder for %d data files." = "Seleccionar una carpeta nueva para %d datos."; "Session Ratio" = "Ratio total en la sesión"; "Session Transfer" = "Descarga total en la sesión"; "Share" = "Compartir"; "Share torrent file" = "Compartir torrent"; "Shortcuts for changing global settings." = "Accesos directos para cambiar las preferencias globales"; "Show" = "Mostrar"; "Show Filter Bar" = "Mostrar barra de filtro"; "Show in Finder" = "Mostrar en el Finder"; "Show Inspector" = "Mostrar Inspector"; "Show Status Bar" = "Mostrar barra de estado"; "Show the data file in Finder" = "Mostrar archivos en el Finder"; "Speed Limit" = "Límite de Velocidad"; "Speed Limit Auto Disabled" = "Límite de Velocidad automático desactivado"; "Speed Limit Auto Enabled" = "Límite de Velocidad automático activado"; "Speed Limit overrides the total bandwidth limits with its own limits." = "El Límite de Velocidad reemplaza los límites de velocidad con los suyos propios"; "Stalled" = "Estancado"; "Statistics" = "Estadísticas"; "Status of Selected Files" = "Estado de los archivos seleccionados"; "Stop at Ratio (%.2f)" = "Parar con ratio (%.2f)"; "Stop waiting to start" = "Comenzar ya"; "Support open-source indie software" = "Apoya al software indie de código abierto"; "TB" = "TB"; "TB/s" = "TB/s"; "The chosen torrent file location does not exist." = "La ubicación del torrent elegida no existe."; "The destination directory and root data directory have the same name." = "El directorio de destino y el directorio principal de los datos tienen el mismo nombre."; "The directory \"%@\" does not currently exist. Create this directory or choose a different one to create the torrent file." = "El directorio \"%@\" no existe actualmente. Cree este directorio o elija uno distinto para crear el torrent."; "The magnet link \"%@\" cannot be added because it is a duplicate of an already existing transfer." = "El enlace magnet \"%@\" no puede ser añadido porque es un duplicado de una tarea ya existente."; "The move operation of \"%@\" cannot be done." = "La operación de mover \"%@\" no se puede realizar."; "The specified blocklist file did not contain any valid rules." = "El archivo de lista de bloqueo especificado no contenía ninguna regla válida."; "The torrent could not be downloaded from %@: %@." = "No se ha podido descarga el torrent de %1$@: %2$@."; "The torrent file (%@) cannot be found." = "El torrent (%@) no ha podido ser encontrado."; "The torrent file cannot be opened because it contains invalid data." = "El torrent no puede ser abierto porque contiene datos inválidos."; "The total file size is zero bytes." = "El tamaño total del archivo es cero bytes."; "The transfer cannot be added because it is a duplicate of an already existing transfer." = "La tarea no puede ser añadida porque es un duplicado de una tarea ya existente."; "The transfer will be paused. Clear up space on %@ or deselect files in the torrent inspector to continue." = "La tarea se detendrá. Libere espacio en %@ o deseleccione archivos en el inspector de torrents para continuar."; "The transfer will not contact trackers for peers, and will have to rely solely on non-tracker peer discovery methods such as PEX and DHT to download and seed." = "La tarea no pedirá clientes al tracker, y tendrá que contar sólo con métodos de búsqueda de clientes propios como PEX y DHT para descargar y compartir."; "There are %@ active transfers." = "Hay %@ tareas activas."; "There are %@ transfers (%@ active)." = "Hay %1$@ tareas (%2$@ activas)."; "There are %d active transfers that will be paused on quit. The transfers will automatically resume on the next launch." = "Hay %d tareas activas que se detendrán al salir. Las tareas se reanudarán automáticamente en el próximo arranque."; "There are no tracker addresses." = "No hay direcciones de tracker."; "There is already a copy of Transmission running. This copy cannot be opened until that instance is quit." = "Ya hay una copia de Transmission ejecutándose. Esta copia no puede ser abierta hasta que la otra instancia se cierre."; "There is an active transfer that will be paused on quit. The transfer will automatically resume on the next launch." = "Hay una tarea activa que se detendrá al salir. La tarea se reanudará automáticamente en el próximo arranque."; "There must be at least one file in a folder to create a torrent file." = "Tiene que haber por lo menos un archivo en la carpeta para crear un torrent."; "There was a problem creating the file \"%@\"." = "Hubo un problema creando el archivo \"%@\"."; "There was an error moving the data file." = "Hubo un error moviendo los datos."; "There was an error when adding the magnet link \"%@\". The transfer will not occur." = "Hubo un error al añadir el enlace magnet \"%@\". La tarea no se añadirá."; "This folder contains no files." = "Esta carpeta no contiene archivos."; "This transfer is active. Once removed, continuing the transfer will require the torrent file or magnet link." = "La tarea está activa. Una vez eliminada, necesitará el archivo torrent o el enlace magnet para reanudar la tarea."; "This will clear the global statistics displayed by Transmission. Individual transfer statistics will not be affected." = "Esto borrará las estadísticas globales mostradas por Transmission."; "Tier %d" = "Tier %d"; "Toggle Filter" = "Mostrar/Ocultar barra de filtro"; "Toggle Inspector" = "Mostrar/Ocultar Inspector"; "Toggle the filter bar" = "Mostrar/Ocultar barra de filtro"; "Toggle the torrent inspector" = "Mostrar/Ocultar Inspector"; "Torrent download failed" = "Fallo en la descarga del torrent"; "Torrent File Auto Added" = "Torrent añadido automáticamente"; "Torrent Inspector" = "Inspector de torrents"; "torrent metadata needed" = "se necesitan metadatos del torrent"; "Total N/A" = "Total N/D"; "Total Ratio" = "Ratio total"; "Total Transfer" = "Descarga total"; "Tracker" = "Tracker"; "Tracker returned error" = "El tracker dio error"; "Tracker returned warning" = "El tracker dio una alerta"; "Tracker will be used as a backup" = "El tracker será usado como backup"; "Trackers" = "Trackers"; "Transfer Not Active" = "Tarea no activa"; "Transfers" = "Tareas"; "Transfers Not Active" = "Tareas no activas"; "Transmission is a file-sharing program. When you run a torrent, its data will be made available to others by means of upload. You and you alone are fully responsible for exercising proper judgement and abiding by your local laws." = "Transmission es un programa de compartir archivos. Cuando pones en marcha un torrent, su contenido se hará disponible a otros mediante subida. Tú y sólo tú eres completamente responsable de ejercer el juicio correcto y respetar tus leyes locales."; "Transmission is a full-featured torrent application. A lot of time and effort have gone into development, coding, and refinement. If you enjoy using it, please consider showing your love with a donation." = "Transmission es un completo gestor de torrents. Si disfrutas usándolo, por favor, considera mostrar tu amor con una donación."; "Transmission is already running." = "Transmission ya está abierto."; "UL" = "↑"; "UL to %d" = "subiendo a %d"; "Uncheck Selected" = "Desmarcar seleccionados"; "unlimited" = "ilimitado"; "unreadable error" = "error ilegible"; "untitled" = "sin título"; "Upload speed" = "Velocidad de subida"; "Uploaded" = "Subido"; "uploaded %@ (Ratio: %@)" = "subido %1$@ (Ratio: %2$@)"; "Uploading To Peer" = "Subiendo a cliente"; "Waiting to check existing data" = "Esperando a la comprobación de datos"; "Waiting to download" = "Esperando a descargar"; "Waiting to seed" = "Esperando a compartir"; "Web Address" = "Dirección web"; "web seed" = "semilla web"; "Web Seeds" = "Semillas Web"; "Welcome to Transmission" = "Bienvenido a Transmission"; "Yellow" = "Amarillo"; "You unchoked the peer, but the peer is not interested" = "Has desbloqueado al cliente, pero no está interesado"; "You want to download, but peer does not want to send (interested and choked)" = "Quieres descargar, pero el cliente no quiere enviar (interesado y bloqueado)"; transmission-2.92/macosx/es.lproj/PaxHeaders.4960/InfoOptionsView.xib0000644000000000000000000000013212664476420022525 xustar0030 mtime=1456635152.311501934 30 atime=1456635152.310501917 30 ctime=1457295922.742854546 transmission-2.92/macosx/es.lproj/InfoOptionsView.xib0000644000175000017500000012131312664476420024153 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/es.lproj/PaxHeaders.4960/InfoActivityView.xib0000644000000000000000000000013212664476420022666 xustar0030 mtime=1456635152.311501934 30 atime=1456635152.311501934 30 ctime=1457295922.741854529 transmission-2.92/macosx/es.lproj/InfoActivityView.xib0000644000175000017500000012750412664476420024324 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/es.lproj/PaxHeaders.4960/InfoGeneralView.xib0000644000000000000000000000013212664476420022447 xustar0030 mtime=1456635152.311501934 30 atime=1456635152.311501934 30 ctime=1457295922.742854546 transmission-2.92/macosx/es.lproj/InfoGeneralView.xib0000644000175000017500000006271212664476420024104 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/es.lproj/PaxHeaders.4960/AddMagnetWindow.xib0000644000000000000000000000013212662757243022442 xustar0030 mtime=1456201379.279862297 30 atime=1456201379.279862297 30 ctime=1457295922.742854546 transmission-2.92/macosx/es.lproj/AddMagnetWindow.xib0000644000175000017500000006542012662757243024076 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/es.lproj/PaxHeaders.4960/MainMenu.xib0000644000000000000000000000013212644245522021127 xustar0030 mtime=1452362578.836700518 30 atime=1452362578.836700518 30 ctime=1457295922.742854546 transmission-2.92/macosx/es.lproj/MainMenu.xib0000644000175000017500000021461112644245522022561 0ustar00mikedldmikedld00000000000000 CA CA YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7NjIsIDYyfdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPEQ7OTU0AKgAAAUiAOyBP8AQW DQeEQmFQuGQ2HQ+IRGJROKRWLReMRCBOyCRmPR+QSGRSOSSWGRuOyaVSuWS2XS+DyiYTOaTWbTcATKcT ueT2fRqBz+hUOiTadUWkUmlR+j0unU+oQqm1GqVWkVOrVmtTisVuvV+WV2wWOyUyg2W0WmMWK1W23Qi2 W+5Wq43O7WO63e9Vq83u/VG+3/BUrA4PDUPC4fFTzE4vHTXG4/JS7I5PLSbK5fNSHM5vPWuz5/RS3O6P TQ/S6fVVLQ6vXRnU6/XbHZarabXTbfcaJ172U7vgQ3euvf8HjQjh8Xj8vk8vnQbm8/ndHpcfqdXg9fsb vtdva93va/weHV+PyafzefR+n1Z/2e3N+/4Zf5fPJ/X7Y/8fnF/v+MO/z/sHAMBL/AkCr3A8ELvBUFrn BsHLfCEIrbCcKLSgIAAPAQAAAwAAAAEAPgAAAQEAAwAAAAEAPgAAAQIAAwAAAAQAAAICAQMAAwAAAAEA BQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEABAAAARYAAwAAAAEA PgAAARcABAAAAAEAAAFAARwAAwAAAAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAQA AAIKh3MABwAADLwAAAISAAAAAAAIAAgACAAIAAEAAQABAAEAAAy8YXBwbAIQAABtbnRyUkdCIFhZWiAH 3gABAAgACQA1ABdhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFkZXNjAAABUAAAAGJk c2NtAAABtAAAAaRjcHJ0AAADWAAAACN3dHB0AAADfAAAABRyWFlaAAADkAAAABRnWFlaAAADpAAAABRi WFlaAAADuAAAABRyVFJDAAADzAAACAxhYXJnAAAL2AAAACB2Y2d0AAAL+AAAADBuZGluAAAMKAAAAD5j aGFkAAAMaAAAACxtbW9kAAAMlAAAAChiVFJDAAADzAAACAxnVFJDAAADzAAACAxhYWJnAAAL2AAAACBh YWdnAAAL2AAAACBkZXNjAAAAAAAAAAhEaXNwbGF5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAA AAAhAAAADGhySFIAAAAIAAABnGtvS1IAAAAIAAABnG5iTk8AAAAIAAABnGlkAAAAAAAIAAABnGh1SFUA AAAIAAABnGNzQ1oAAAAIAAABnGRhREsAAAAIAAABnHVrVUEAAAAIAAABnGFyAAAAAAAIAAABnGl0SVQA AAAIAAABnHJvUk8AAAAIAAABnG5sTkwAAAAIAAABnGhlSUwAAAAIAAABnGVzRVMAAAAIAAABnGZpRkkA AAAIAAABnHpoVFcAAAAIAAABnHZpVk4AAAAIAAABnHNrU0sAAAAIAAABnHpoQ04AAAAIAAABnHJ1UlUA AAAIAAABnGZyRlIAAAAIAAABnG1zAAAAAAAIAAABnGNhRVMAAAAIAAABnHRoVEgAAAAIAAABnGRlREUA AAAIAAABnGVuVVMAAAAIAAABnHB0QlIAAAAIAAABnHBsUEwAAAAIAAABnGVsR1IAAAAIAAABnHN2U0UA AAAIAAABnHRyVFIAAAAIAAABnGphSlAAAAAIAAABnHB0UFQAAAAIAAABnABpAE0AYQBjdGV4dAAAAABD b3B5cmlnaHQgQXBwbGUgSW5jLiwgMjAxNAAAWFlaIAAAAAAAAPMWAAEAAAABFspYWVogAAAAAAAAccAA ADmKAAABZ1hZWiAAAAAAAABhIwAAueYAABP2WFlaIAAAAAAAACPyAAAMkAAAvdBjdXJ2AAAAAAAABAAA AAAFAAoADwAUABkAHgAjACgALQAyADYAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAA lQCaAJ8AowCoAK0AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIB OAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQC HQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MD TwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE 0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0G rwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII 5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kL gAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQO fw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR 6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsV vRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0a BBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQe vh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij 8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWsp nSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Ev xy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2 cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9 oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJF VUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpN k03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9W XFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ff s2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNp mmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0 FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/ I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSK yoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+X Cpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj 5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqx YLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/ er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXO Ns62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDd lt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHt nO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+ S/7c/23//3BhcmEAAAAAAAMAAAACZmYAAPKnAAANWQAAE9AAAAoOdmNndAAAAAAAAAABAAEAAAAAAAAA AQAAAAEAAAAAAAAAAQAAAAEAAAAAAAAAAQAAbmRpbgAAAAAAAAA2AACnQAAAVYAAAEzAAACewAAAJYAA AAzAAABQAAAAVEAAAjMzAAIzMwACMzMAAAAAAAAAAHNmMzIAAAAAAAEMcgAABfj///MdAAAHugAA/XL/ //ud///9pAAAA9kAAMBxbW1vZAAAAAAAAAYQAACgBwAAAADJJx4AAAAAAAAAAAAAAAAAAAAAANIlJico WiRjbGFzc25hbWVYJGNsYXNzZXNfEBBOU0JpdG1hcEltYWdlUmVwoycpKlpOU0ltYWdlUmVwWE5TT2Jq ZWN00iUmLC1XTlNBcnJheaIsKtIlJi8wXk5TTXV0YWJsZUFycmF5oy8sKtMyMwo0NTZXTlNXaGl0ZVxO U0NvbG9yU3BhY2VEMCAwABADgAzSJSY4OVdOU0NvbG9yojgq0iUmOzxXTlNJbWFnZaI7Kl8QD05TS2V5 ZWRBcmNoaXZlctE/QFRyb290gAEACAARABoAIwAtADIANwBGAEwAVwBeAGUAcgB5AIEAgwCFAIoAjACO AJcAnACnAKkAqwCtALIAtQC3ALkAuwC9AMIA2QDbAN0Prw+0D78PyA/bD98P6g/zD/gQABADEAgQFxAb ECIQKhA3EDwQPhBAEEUQTRBQEFUQXRBgEHIQdRB6AAAAAAAAAgEAAAAAAAAAQQAAAAAAAAAAAAAAAAAA EHw transmission-2.92/macosx/es.lproj/PaxHeaders.4960/GroupRules.xib0000644000000000000000000000013212666747213021535 xustar0030 mtime=1457245835.324998801 30 atime=1457245835.324998801 30 ctime=1457295922.742854546 transmission-2.92/macosx/es.lproj/GroupRules.xib0000644000175000017500000004164112666747213023170 0ustar00mikedldmikedld00000000000000 name comment name comment fFlatFileList.name allTrackersFlat fFlatFileList.name allTrackersFlat transmission-2.92/macosx/es.lproj/PaxHeaders.4960/AddWindow.xib0000644000000000000000000000013212640354045021273 xustar0030 mtime=1451350053.699172081 30 atime=1451350053.699172081 30 ctime=1457295922.741854529 transmission-2.92/macosx/es.lproj/AddWindow.xib0000644000175000017500000007304112640354045022725 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/es.lproj/PaxHeaders.4960/GlobalOptionsPopover.xib0000644000000000000000000000013212640354045023542 xustar0030 mtime=1451350053.701172116 30 atime=1451350053.701172116 30 ctime=1457295922.742854546 transmission-2.92/macosx/es.lproj/GlobalOptionsPopover.xib0000644000175000017500000006372612640354045025205 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/PredicateEditorRowTemplateAny.h0000644000000000000000000000013212442116672023231 xustar0030 mtime=1418239418.292171301 30 atime=1418239418.292171301 30 ctime=1457295923.448866552 transmission-2.92/macosx/PredicateEditorRowTemplateAny.h0000644000175000017500000000272312442116672024662 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: PredicateEditorRowTemplateAny.h 13251 2012-03-13 02:52:11Z livings124 $ * * Copyright (c) 2009-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface PredicateEditorRowTemplateAny : NSPredicateEditorRowTemplate { } @end transmission-2.92/macosx/PaxHeaders.4960/StatsWindowController.m0000644000000000000000000000013212644245522021666 xustar0030 mtime=1452362578.820700238 30 atime=1452362578.820700238 30 ctime=1457295923.519867759 transmission-2.92/macosx/StatsWindowController.m0000644000175000017500000002521412644245522023317 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: StatsWindowController.m 14662 2016-01-06 11:05:37Z mikedld $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "StatsWindowController.h" #import "Controller.h" #import "NSApplicationAdditions.h" #import "NSStringAdditions.h" #define UPDATE_SECONDS 1.0 @interface StatsWindowController (Private) - (void) updateStats; - (void) performResetStats; - (void) resetSheetClosed: (NSAlert *) alert returnCode: (NSInteger) code contextInfo: (void *) info; @end @implementation StatsWindowController StatsWindowController * fStatsWindowInstance = nil; tr_session * fLib = NULL; + (StatsWindowController *) statsWindow { if (!fStatsWindowInstance) { if ((fStatsWindowInstance = [[self alloc] init])) { fLib = [(Controller *)[NSApp delegate] sessionHandle]; } } return fStatsWindowInstance; } - (id) init { return [super initWithWindowNibName: @"StatsWindow"]; } - (void) awakeFromNib { [self updateStats]; fTimer = [[NSTimer scheduledTimerWithTimeInterval: UPDATE_SECONDS target: self selector: @selector(updateStats) userInfo: nil repeats: YES] retain]; [[NSRunLoop currentRunLoop] addTimer: fTimer forMode: NSModalPanelRunLoopMode]; [[NSRunLoop currentRunLoop] addTimer: fTimer forMode: NSEventTrackingRunLoopMode]; [[self window] setRestorationClass: [self class]]; [[self window] setTitle: NSLocalizedString(@"Statistics", "Stats window -> title")]; //set label text [fUploadedLabelField setStringValue: [NSLocalizedString(@"Uploaded", "Stats window -> label") stringByAppendingString: @":"]]; [fDownloadedLabelField setStringValue: [NSLocalizedString(@"Downloaded", "Stats window -> label") stringByAppendingString: @":"]]; [fRatioLabelField setStringValue: [NSLocalizedString(@"Ratio", "Stats window -> label") stringByAppendingString: @":"]]; [fTimeLabelField setStringValue: [NSLocalizedString(@"Running Time", "Stats window -> label") stringByAppendingString: @":"]]; [fNumOpenedLabelField setStringValue: [NSLocalizedString(@"Program Started", "Stats window -> label") stringByAppendingString: @":"]]; //size of all labels const CGFloat oldWidth = [fUploadedLabelField frame].size.width; NSArray * labels = @[fUploadedLabelField, fDownloadedLabelField, fRatioLabelField, fTimeLabelField, fNumOpenedLabelField]; CGFloat maxWidth = CGFLOAT_MIN; for (NSTextField * label in labels) { [label sizeToFit]; const CGFloat width = [label frame].size.width; maxWidth = MAX(maxWidth, width); } for (NSTextField * label in labels) { NSRect frame = [label frame]; frame.size.width = maxWidth; [label setFrame: frame]; } //resize window for new label width - fields are set in nib to adjust correctly NSRect windowRect = [[self window] frame]; windowRect.size.width += maxWidth - oldWidth; [[self window] setFrame: windowRect display: YES]; //resize reset button const CGFloat oldButtonWidth = [fResetButton frame].size.width; [fResetButton setTitle: NSLocalizedString(@"Reset", "Stats window -> reset button")]; [fResetButton sizeToFit]; NSRect buttonFrame = [fResetButton frame]; buttonFrame.size.width += 10.0; buttonFrame.origin.x -= buttonFrame.size.width - oldButtonWidth; [fResetButton setFrame: buttonFrame]; } - (void) windowWillClose: (id) sender { [fTimer invalidate]; [fTimer release]; fTimer = nil; [fStatsWindowInstance autorelease]; fStatsWindowInstance = nil; } + (void) restoreWindowWithIdentifier: (NSString *) identifier state: (NSCoder *) state completionHandler: (void (^)(NSWindow *, NSError *)) completionHandler { NSAssert1([identifier isEqualToString: @"StatsWindow"], @"Trying to restore unexpected identifier %@", identifier); completionHandler([[StatsWindowController statsWindow] window], nil); } - (void) resetStats: (id) sender { if (![[NSUserDefaults standardUserDefaults] boolForKey: @"WarningResetStats"]) { [self performResetStats]; return; } NSAlert * alert = [[NSAlert alloc] init]; [alert setMessageText: NSLocalizedString(@"Are you sure you want to reset usage statistics?", "Stats reset -> title")]; [alert setInformativeText: NSLocalizedString(@"This will clear the global statistics displayed by Transmission." " Individual transfer statistics will not be affected.", "Stats reset -> message")]; [alert setAlertStyle: NSWarningAlertStyle]; [alert addButtonWithTitle: NSLocalizedString(@"Reset", "Stats reset -> button")]; [alert addButtonWithTitle: NSLocalizedString(@"Cancel", "Stats reset -> button")]; [alert setShowsSuppressionButton: YES]; [alert beginSheetModalForWindow: [self window] modalDelegate: self didEndSelector: @selector(resetSheetClosed:returnCode:contextInfo:) contextInfo: nil]; } - (NSString *) windowFrameAutosaveName { return @"StatsWindow"; } @end @implementation StatsWindowController (Private) - (void) updateStats { tr_session_stats statsAll, statsSession; tr_sessionGetCumulativeStats(fLib, &statsAll); tr_sessionGetStats(fLib, &statsSession); NSByteCountFormatter * byteFormatter = nil; if ([NSApp isOnMountainLionOrBetter]) { byteFormatter = [[NSByteCountFormatterMtLion alloc] init]; [byteFormatter setAllowedUnits: NSByteCountFormatterUseBytes]; } [fUploadedField setStringValue: [NSString stringForFileSize: statsSession.uploadedBytes]]; [fUploadedField setToolTip: [NSApp isOnMountainLionOrBetter] ? [byteFormatter stringFromByteCount: statsSession.uploadedBytes] : [NSString stringWithFormat: NSLocalizedString(@"%@ bytes", "stats -> bytes"), [NSString formattedUInteger: statsSession.uploadedBytes]]]; [fUploadedAllField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%@ total", "stats total"), [NSString stringForFileSize: statsAll.uploadedBytes]]]; [fUploadedAllField setToolTip: [NSApp isOnMountainLionOrBetter] ? [byteFormatter stringFromByteCount: statsAll.uploadedBytes] : [NSString stringWithFormat: NSLocalizedString(@"%@ bytes", "stats -> bytes"), [NSString formattedUInteger: statsAll.uploadedBytes]]]; [fDownloadedField setStringValue: [NSString stringForFileSize: statsSession.downloadedBytes]]; [fDownloadedField setToolTip: [NSApp isOnMountainLionOrBetter] ? [byteFormatter stringFromByteCount: statsSession.downloadedBytes] : [NSString stringWithFormat: NSLocalizedString(@"%@ bytes", "stats -> bytes"), [NSString formattedUInteger: statsSession.downloadedBytes]]]; [fDownloadedAllField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%@ total", "stats total"), [NSString stringForFileSize: statsAll.downloadedBytes]]]; [fDownloadedAllField setToolTip: [NSApp isOnMountainLionOrBetter] ? [byteFormatter stringFromByteCount: statsAll.downloadedBytes] : [NSString stringWithFormat: NSLocalizedString(@"%@ bytes", "stats -> bytes"), [NSString formattedUInteger: statsAll.downloadedBytes]]]; [byteFormatter release]; [fRatioField setStringValue: [NSString stringForRatio: statsSession.ratio]]; NSString * totalRatioString = statsAll.ratio != TR_RATIO_NA ? [NSString stringWithFormat: NSLocalizedString(@"%@ total", "stats total"), [NSString stringForRatio: statsAll.ratio]] : NSLocalizedString(@"Total N/A", "stats total"); [fRatioAllField setStringValue: totalRatioString]; if ([NSApp isOnYosemiteOrBetter]) { static NSDateComponentsFormatter *timeFormatter; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ timeFormatter = [NSDateComponentsFormatter new]; timeFormatter.unitsStyle = NSDateComponentsFormatterUnitsStyleFull; timeFormatter.maximumUnitCount = 3; timeFormatter.allowedUnits = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitWeekOfMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute; }); [fTimeField setStringValue: [timeFormatter stringFromTimeInterval:statsSession.secondsActive]]; [fTimeAllField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%@ total", "stats total"), [timeFormatter stringFromTimeInterval:statsAll.secondsActive]]]; } else { [fTimeField setStringValue: [NSString timeString: statsSession.secondsActive includesTimeRemainingPhrase:NO showSeconds: NO]]; [fTimeAllField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%@ total", "stats total"), [NSString timeString: statsAll.secondsActive includesTimeRemainingPhrase:NO showSeconds: NO]]]; } if (statsAll.sessionCount == 1) [fNumOpenedField setStringValue: NSLocalizedString(@"1 time", "stats window -> times opened")]; else [fNumOpenedField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%@ times", "stats window -> times opened"), [NSString formattedUInteger: statsAll.sessionCount]]]; } - (void) performResetStats { tr_sessionClearStats(fLib); [self updateStats]; } - (void) resetSheetClosed: (NSAlert *) alert returnCode: (NSInteger) code contextInfo: (void *) info { [[alert window] orderOut: nil]; if ([[alert suppressionButton] state] == NSOnState) [[NSUserDefaults standardUserDefaults] setBool: NO forKey: @"WarningResetStats"]; if (code == NSAlertFirstButtonReturn) [self performResetStats]; } @end transmission-2.92/macosx/PaxHeaders.4960/nl.lproj0000644000000000000000000000013212666747213016647 xustar0030 mtime=1457245835.389999919 30 atime=1418239409.752024952 30 ctime=1457295922.809855686 transmission-2.92/macosx/nl.lproj/0000755000175000017500000000000012666747213020351 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/nl.lproj/PaxHeaders.4960/InfoPlist.strings0000644000000000000000000000013212664476420022243 xustar0030 mtime=1456635152.225500457 30 atime=1456635152.225500457 30 ctime=1457295922.809855686 transmission-2.92/macosx/nl.lproj/InfoPlist.strings0000644000175000017500000000017212664476420023670 0ustar00mikedldmikedld00000000000000/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = "Copyright © 2005-2016 Het Transmission Project";transmission-2.92/macosx/nl.lproj/PaxHeaders.4960/Creator.xib0000644000000000000000000000013212640354045021014 xustar0030 mtime=1451350053.377166489 30 atime=1451350053.377166489 30 ctime=1457295922.809855686 transmission-2.92/macosx/nl.lproj/Creator.xib0000644000175000017500000006032612640354045022450 0ustar00mikedldmikedld00000000000000 Bestand Bestand transmission-2.92/macosx/nl.lproj/PaxHeaders.4960/PrefsWindow.xib0000644000000000000000000000013212640354045021664 xustar0030 mtime=1451350053.375166454 30 atime=1451350053.375166454 30 ctime=1457295922.809855686 transmission-2.92/macosx/nl.lproj/PrefsWindow.xib0000644000175000017500000055313512640354045023325 0ustar00mikedldmikedld00000000000000 ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer NSAllRomanInputSourcesLocaleIdentifier NSAllRomanInputSourcesLocaleIdentifier YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7MTgsIDE4fdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPEQ3uTU0AKgAAAGiAOuBP8AQW DQeEQmFQuGQ2HQWBOuCQ+KRWLRSIxOLxuORaMx2QSGFx+RSWRSSTSmNyiVS2HyyXTGFTCZTWIQObTmDT SdS6eT2VT+gSahUOTzijTGi0mO0umSukU+UwEAAADwEAAAMAAAABABIAAAEBAAMAAAABABIAAAECAAMA AAAEAAABIgEDAAMAAAABAAUAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAESAAMAAAABAAEAAAEVAAMA AAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAAXwEcAAMAAAABAAEAAAE9AAMAAAABAAIAAAFSAAMA AAABAAEAAAFTAAMAAAAEAAABKodzAAcAAAy8AAABMgAAAAAACAAIAAgACAABAAEAAQABAAAMvGFwcGwC EAAAbW50clJHQiBYWVogB94AAQAIAAkANQAXYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA APbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAARZGVzYwAAAVAAAABiZHNjbQAAAbQAAAGkY3BydAAAA1gAAAAjd3RwdAAAA3wAAAAUclhZWgAAA5AA AAAUZ1hZWgAAA6QAAAAUYlhZWgAAA7gAAAAUclRSQwAAA8wAAAgMYWFyZwAAC9gAAAAgdmNndAAAC/gA AAAwbmRpbgAADCgAAAA+Y2hhZAAADGgAAAAsbW1vZAAADJQAAAAoYlRSQwAAA8wAAAgMZ1RSQwAAA8wA AAgMYWFiZwAAC9gAAAAgYWFnZwAAC9gAAAAgZGVzYwAAAAAAAAAIRGlzcGxheQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAG1sdWMAAAAAAAAAIQAAAAxockhSAAAACAAAAZxrb0tSAAAACAAAAZxuYk5PAAAACAAAAZxp ZAAAAAAACAAAAZxodUhVAAAACAAAAZxjc0NaAAAACAAAAZxkYURLAAAACAAAAZx1a1VBAAAACAAAAZxh cgAAAAAACAAAAZxpdElUAAAACAAAAZxyb1JPAAAACAAAAZxubE5MAAAACAAAAZxoZUlMAAAACAAAAZxl c0VTAAAACAAAAZxmaUZJAAAACAAAAZx6aFRXAAAACAAAAZx2aVZOAAAACAAAAZxza1NLAAAACAAAAZx6 aENOAAAACAAAAZxydVJVAAAACAAAAZxmckZSAAAACAAAAZxtcwAAAAAACAAAAZxjYUVTAAAACAAAAZx0 aFRIAAAACAAAAZxkZURFAAAACAAAAZxlblVTAAAACAAAAZxwdEJSAAAACAAAAZxwbFBMAAAACAAAAZxl bEdSAAAACAAAAZxzdlNFAAAACAAAAZx0clRSAAAACAAAAZxqYUpQAAAACAAAAZxwdFBUAAAACAAAAZwA aQBNAGEAY3RleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMTQAAFhZWiAAAAAAAADzFgABAAAA ARbKWFlaIAAAAAAAAHHAAAA5igAAAWdYWVogAAAAAAAAYSMAALnmAAAT9lhZWiAAAAAAAAAj8gAADJAA AL3QY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgA bQByAHcAfACBAIYAiwCQAJUAmgCfAKMAqACtALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEB BwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB 2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC 9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUE YwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYG JwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDII RghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4K xQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4N qQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ 9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsU rRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y 1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcd cB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9wo DSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEu Fi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0 njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7 qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdD OkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxL U0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT 9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZd J114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm 6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBx OnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8 IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuH n4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02T tpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qg aaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUSt uK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67 p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZ bNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6Lzp RunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5 x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//9wYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKDnZjZ3QA AAAAAAAAAQABAAAAAAAAAAEAAAABAAAAAAAAAAEAAAABAAAAAAAAAAEAAG5kaW4AAAAAAAAANgAAp0AA AFWAAABMwAAAnsAAACWAAAAMwAAAUAAAAFRAAAIzMwACMzMAAjMzAAAAAAAAAABzZjMyAAAAAAABDHIA AAX4///zHQAAB7oAAP1y///7nf///aQAAAPZAADAcW1tb2QAAAAAAAAGEAAAoAcAAAAAySceAAAAAAAA AAAAAAAAAAAAAADSJSYnKFokY2xhc3NuYW1lWCRjbGFzc2VzXxAQTlNCaXRtYXBJbWFnZVJlcKMnKSpa TlNJbWFnZVJlcFhOU09iamVjdNIlJiwtV05TQXJyYXmiLCrSJSYvMF5OU011dGFibGVBcnJheaMvLCrT MjMKNDU2V05TV2hpdGVcTlNDb2xvclNwYWNlRDAgMAAQA4AM0iUmODlXTlNDb2xvcqI4KtIlJjs8V05T SW1hZ2WiOypfEA9OU0tleWVkQXJjaGl2ZXLRP0BUcm9vdIABAAgAEQAaACMALQAyADcARgBMAFcAXgBl AHIAeQCBAIMAhQCKAIwAjgCXAJwApwCpAKsArQCyALUAtwC5ALsAvQDCANkA2wDdDs8O1A7fDugO+w7/ DwoPEw8YDyAPIw8oDzcPOw9CD0oPVw9cD14PYA9lD20PcA91D30PgA+SD5UPmgAAAAAAAAIBAAAAAAAA AEEAAAAAAAAAAAAAAAAAAA+cA transmission-2.92/macosx/nl.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212640354045022545 xustar0030 mtime=1451350053.376166471 30 atime=1451350053.376166471 30 ctime=1457295922.809855686 transmission-2.92/macosx/nl.lproj/Localizable.strings0000644000175000017500000011213312640354045024173 0ustar00mikedldmikedld00000000000000/* Inspector -> selected torrents stats -> bytes */ "%@ bytes" = "%@ bytes"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "%@ files" = "%@ bestanden"; /* Prefs -> blocklist -> message */ "%@ IP address rules in list" = "%@ IP adressen in de lijst"; /* Inspector -> selected torrents */ "%@ magnetized transfers" = "%@ magnetized transfers"; /* Inspector -> Files tab -> file status string Blocklist -> message Torrent -> progress string */ "%@ of %@" = "%1$@ van %2$@"; /* Torrent -> progress string */ "%@ of torrent metadata retrieved" = "%@ van torrent metadata gevonden"; /* Torrent -> eta string */ "%@ remaining" = "%@ resterend"; /* Add torrent -> info Torrent -> progress string */ "%@ selected" = "%@ geselecteerd"; /* stats window -> times opened */ "%@ times" = "%@ keer"; /* Drag overlay -> torrents */ "%@ Torrent Files" = "%@ Torrent bestanden"; /* Inspector -> selected torrents */ "%@ Torrents Selected" = "%@ Torrents geselecteerd"; /* stats total Inspector -> selected torrents */ "%@ total" = "%@ totaal"; /* Filter Bar Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "%@ transfers" = "%@ transfers"; /* Inspector -> Activity tab -> have */ "%@ verified" = "%@ geverifieerd"; /* Inspector -> Peers tab -> peers */ "%d cache" = "%d cache"; /* Inspector -> Peers tab -> peers */ "%d Connected" = "%d verbonden"; /* Inspector -> Peers tab -> peers */ "%d DHT" = "%d DHT"; /* Dock item - Downloading */ "%d Downloading" = "%d downloaden"; /* Inspector -> Peers tab -> peers */ "%d incoming" = "%d inkomende"; /* Status Bar -> speed tooltip Action menu -> upload/download limit */ "%d KB/s" = "%d KB/s"; /* Inspector -> Peers tab -> peers */ "%d local discovery" = "%d Lokale peer-ontdekking"; /* Inspector -> Peers tab -> peers */ "%d LTEP" = "%d LTEP"; /* Info options -> global setting */ "%d minutes" = "%d minuten"; /* Inspector -> Peers tab -> peers */ "%d PEX" = "%d PEX"; /* Create torrent -> info */ "%d pieces, %@ each" = "%1$d fragmenten, %2$@ elk"; /* Dock item - Seeding */ "%d Seeding" = "%d seeden"; /* Inspector -> Peers tab -> peers */ "%d tracker" = "%d tracker"; /* Torrent -> status string */ "%d web seeds" = "%d web seeds"; /* time string */ "%u days" = "%u dagen"; /* time string */ "%u hr" = "%u uur"; /* time string */ "%u min" = "%u min"; /* time string */ "%u sec" = "%u sec"; /* time string */ "%u years" = "%u jaar"; /* time string */ "1 day" = "1 dag"; /* Inspector -> selected torrents Create torrent -> info Add torrent -> info Drag overlay -> torrents */ "1 file" = "1 bestand"; /* Inspector -> selected torrents */ "1 magnetized transfer" = "1 magnetized transfer"; /* Info options -> global setting */ "1 minute" = "1 minuut"; /* Create torrent -> info */ "1 piece, %@" = "1 fragment, %@"; /* stats window -> times opened */ "1 time" = "1 keer"; /* Torrent table -> group row -> tooltip Filter Button -> tool tip Status bar transfer count */ "1 transfer" = "1 transfer"; /* time string */ "1 year" = "1 jaar"; /* Open invalid alert -> title */ "\"%@\" is not a valid torrent file." = "\"%@\" is geen geldig torrent bestand."; /* Prefs -> blocklist -> message */ "A blocklist must first be downloaded" = "Een zwarte lijst moet eerst gedownload worden"; /* Create torrent -> file already exists warning -> warning */ "A file with the name \"%@\" already exists in the directory \"%@\". Choose a new name or directory to create the torrent file." = "Een bestand met de naam \"%1$@\" bestaat al in de map \"%2$@\". Kies een nieuwe naam of map om het torrent bestand aan te maken."; /* Move inside itself alert -> title */ "A folder cannot be moved to inside itself." = "Een map kan niet in zichzelf geplaatst worden."; /* Create torrent -> zero size -> warning */ "A torrent file cannot be created for files with no size." = "Een torrent bestand kan niet gemaakt worden voor bestanden zonder grootte."; /* Create torrent -> file already exists warning -> title */ "A torrent file with this name and directory cannot be created." = "Een torrent bestand met deze naam en map kan niet gemaakt worden."; /* Create torrent -> blank address -> message */ "A transfer marked as private with no tracker addresses will be unable to connect to peers. The torrent file will only be useful if you plan to upload the file to a tracker website that will add the addresses for you." = "Een transfer dat gemarkeerd is als privaat en geen tracker adressen bevat, zal niet met andere peers kunnen verbinden. Dit is enkel zinvol als je van plan bent dit torrent bestand te uploaden naar een tracker website dat de adressen voor jou toevoegt."; /* Open duplicate alert -> title */ "A transfer of \"%@\" already exists." = "Een transfer van \"%@\" bestaat al."; /* Filter Bar -> filter button */ "Active" = "Actief"; /* Inspector -> title */ "Activity" = "Activiteitenoverzicht"; /* Add torrent -> same name -> button */ "Add" = "Voeg toe"; /* Inspector view -> tracker buttons */ "Add a tracker" = "Voeg tracker toe"; /* Magnet link failed -> title */ "Adding magnetized transfer failed." = "Toevoegen van magnetized transfer faalde"; /* Filter Bar -> filter button */ "All" = "Alle"; /* Groups -> Button */ "All Groups" = "Alle groepen"; /* Create torrent -> failed -> warning */ "An unknown error has occurred." = "Er heeft zich een onbekende fout voorgedaan."; /* Tracker last announce */ "Announce error" = "Aankondiging fout"; /* Tracker next announce */ "Announce in progress" = "Aankondiging is bezig"; /* Tracker next announce */ "Announce is queued" = "Aankondiging is wachtende"; /* Tracker next announce */ "Announce not scheduled" = "Aankondiging is niet gepland"; /* Tracker last announce */ "Announce timed out" = "Aankondiging verlopen"; /* All toolbar item -> label */ "Apply All" = "Pas toe op alles"; /* Selected toolbar item -> label */ "Apply Selected" = "Pas toe op geselecteerde"; /* Confirm Quit panel -> title */ "Are you sure you want to quit?" = "Weet u zeker dat u wilt afsluiten?"; /* Remove completed confirm panel -> title */ "Are you sure you want to remove %@ completed transfers from the transfer list?" = "Weet u zeker dat u %@ vervolledigde transfers wilt verwijderen van de transfer lijst?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list and trash the data files?" = "Bent u zeker dat u %@ transfers wilt verwijderen van de transfer lijst en de data naar de prullenmand wil verplaatsen?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list?" = "Weet u zeker dat u %@ transfers wilt verwijderen van de transfer lijst?"; /* Remove trackers alert -> title */ "Are you sure you want to remove %d trackers?" = "Weet u zeker dat u %d trackers wilt verwijderen?"; /* Removal confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list and trash the data file?" = "Weet u zeker dat u \"%@\" wilt verwijderen van de transfer lijst en de data naar de prullenmand wil verplaatsen?"; /* Removal confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list?" = "Weet u zeker dat u \"%@\" wilt verwijderen van de transfer lijst?"; /* Remove trackers alert -> title */ "Are you sure you want to remove this tracker?" = "Weet u zeker dat u deze tracker wilt verwijderen?"; /* Stats reset -> title */ "Are you sure you want to reset usage statistics?" = "Weet u zeker dat u de gebruiks statistieken wilt wissen?"; /* inspector -> peer table -> header tool tip */ "Available" = "Beschikbaar"; /* Preferences -> toolbar item title */ "Bandwidth" = "Bandbreedte"; /* Growl notification description */ "Bandwidth settings changed" = "Bandbreedte instelling veranderde"; /* Groups -> Name */ "Blue" = "Blauw"; /* Confirm Quit panel -> button Create torrent -> blank address -> button Add torrent -> same name -> button Removal confirm panel -> button Blocklist -> cancel button Remove built-in tracker alert -> button Stats reset -> button */ "Cancel" = "Annuleer"; /* Torrent Table -> tooltip */ "Change transfer settings" = "Verander transfer instellingen"; /* File Outline -> Menu */ "Check Selected" = "Vink geselecteerde aan"; /* Torrent -> status string */ "Checking existing data" = "Verifiëren van bestaande data"; /* Message window -> save button */ "Clear" = "Wis"; /* inspector -> peer table -> header */ "Client" = "Client"; /* View menu -> Quick Look */ "Close Quick Look" = "Sluit Quick Look"; /* Prefs -> Notifications */ "Configure In Growl" = "Configureer in Growl"; /* Prefs -> Notifications */ "Configure In System Preferences" = "Configureer in Systeemvoorkeuren"; /* Blocklist -> message */ "Connecting to site" = "Verbinden met server"; /* Torrent file copy alert -> title */ "Copy of \"%@\" Cannot Be Created" = "Kopie van \"%@\" kan niet gemaakt worden"; /* Create torrent -> failed -> warning */ "Could not read \"%s\": %s." = "Kon \"%1$s\" niet lezen: %2$s."; /* Create torrent -> failed -> warning */ "Could not write \"%s\": %s." = "Kon \"%1$s\" niet schrijven: %2$s."; /* Create torrent -> blank address -> button Create toolbar item -> label */ "Create" = "Maak aan"; /* Drag overlay -> file */ "Create a Torrent File" = "Maak een torrent bestand"; /* Create toolbar item -> tooltip */ "Create torrent file" = "Maak torrent bestand"; /* Create torrent -> select file Create toolbar item -> palette label */ "Create Torrent File" = "Maak torrent bestand"; /* Create torrent -> failed -> title */ "Creation of \"%@\" failed." = "Maken van \"%@\" faalde."; /* Inspector -> peer -> status */ "Currently downloading (interested and not choked)" = "Momenteel downloaden (geïnteresseerd en niet choked)"; /* Inspector -> peer -> status */ "Currently uploading (interested and not choked)" = "Momenteel uploaden (geïnteresseerd en niet choked)"; /* Message window -> table column */ "Date" = "Datum"; /* Message window -> level string Message window -> level */ "Debug" = "Foutopsporing"; /* Info options -> global setting */ "disabled" = "uitgeschakeld"; /* Torrent -> status string status bar -> status label */ "DL" = "DL"; /* Inspector -> Peers tab -> peers */ "DL from %d" = "DL van %d"; /* Torrent disk space alert -> button */ "Do not check disk space again" = "Kon ruimte op schijf niet opnieuw controleren"; /* Donation beg -> button */ "Don't bug me about this ever again." = "Toon dit niet nog eens."; /* files tab -> tooltip */ "Don't Download" = "Niet downloaden"; /* Donation beg -> button */ "Donate" = "Doneer"; /* Donation beg -> message */ "Donate or not, there will be no difference to your torrenting experience." = "Of u nu doneert of niet, er zal geen verschil zijn in uw Bittorrent ervaring."; /* file table -> header tool tip files tab -> tooltip */ "Download" = "Download"; /* Torrent disk space alert -> button */ "Download Anyway" = "Download alsnog"; /* Growl notification title */ "Download Complete" = "Download klaar"; /* Blocklist -> message */ "Download of the blocklist failed." = "Downloaden van de zwarte lijst faalde."; /* files tab -> tooltip */ "Download Some" = "Importeer enkele"; /* Torrent table -> group row -> tooltip */ "Download speed" = "Downloadsnelheid"; /* Stats window -> label */ "Downloaded" = "Gedownload"; /* Torrent -> status string */ "Downloading" = "Downloaden"; /* Blocklist -> message */ "Downloading blocklist" = "Downloaden van zwarte lijst"; /* Torrent -> status string */ "Downloading from %d of %d peers" = "Downloaden van %1$d van %2$d peers"; /* Torrent -> status string */ "Downloading from %d of 1 peer" = "Downloaden van %d van 1 peer"; /* inspector -> peer table -> header tool tip */ "Downloading From Peer" = "Downloaden van peer"; /* inspector -> web seed table -> header tool tip */ "Downloading From Web Seed" = "Downloaden van Web Seed"; /* Inspector -> Peers tab -> table row tooltip */ "encrypted" = "gecodeerd"; /* inspector -> peer table -> header tool tip Inspector -> Peers tab -> table row tooltip */ "Encrypted Connection" = "Gecodeerde verbinding"; /* Message window -> level string Torrent -> status string Message window -> level Blocklist -> message */ "Error" = "Fout"; /* Inspector -> title */ "Files" = "Bestanden"; /* Filter toolbar item -> label */ "Filter" = "Filter"; /* Inspector -> Peers tab -> table row tooltip */ "From: cache" = "Van: cache"; /* Inspector -> Peers tab -> table row tooltip */ "From: distributed hash table" = "Van: distribueerde hash tabel"; /* Inspector -> Peers tab -> table row tooltip */ "From: incoming connection" = "Van: inkomende verbinding"; /* Inspector -> Peers tab -> table row tooltip */ "From: libtorrent extension protocol handshake" = "Van: libtorrent extension protocol handshake"; /* Inspector -> Peers tab -> table row tooltip */ "From: local peer discovery" = "Van: lokale peer-ontdekking"; /* Inspector -> Peers tab -> table row tooltip */ "From: peer exchange" = "Van: peer exchange"; /* Inspector -> Peers tab -> table row tooltip */ "From: tracker" = "Van: tracker"; /* File size - gigabytes */ "GB" = "GB"; /* Transfer speed (gigabytes per second) */ "GB/s" = "GB/s"; /* Preferences -> toolbar item title */ "General" = "Algemeen"; /* Inspector -> title */ "General Info" = "Algemene info"; /* Status Bar -> speed tooltip */ "Global download limit" = "Globale download limiet"; /* Status Bar -> speed tooltip */ "Global upload limit" = "Globale upload limiet"; /* Tracker last announce */ "got %d peers" = "kreeg %d peers"; /* Tracker last announce */ "got 1 peer" = "1 Peer ontvangen"; /* Groups -> Name */ "Gray" = "Grijs"; /* Groups -> Name */ "Green" = "Groen"; /* Groups -> Button */ "Group" = "Groep"; /* Preferences -> toolbar item title */ "Groups" = "Groepen"; /* View menu -> Filter Bar */ "Hide Filter Bar" = "Verberg filterbalk"; /* View menu -> Inspector */ "Hide Inspector" = "Verberg infovenster"; /* View menu -> Status Bar */ "Hide Status Bar" = "Verberg statusbalk"; /* File Outline -> Priority Menu */ "High" = "Hoog"; /* files tab -> tooltip */ "High Priority" = "Hoge prioriteit"; /* Legal alert -> button */ "I Accept" = "Ik ga akkoord"; /* Add torrent -> same name -> message */ "If you are attempting to use already existing data, the root data directory should be inside the destination directory." = "Als u probeert bestaande data te gebruiken, moet de data zich in de geselecteerde map bevinden."; /* Torrent -> eta string */ "inactive" = "inactief"; /* Message window -> level string Message window -> level */ "Info" = "Info"; /* Inspector toolbar item -> label */ "Inspector" = "Infovenster"; /* URL sheet label */ "Internet address of torrent file:" = "Internet adres van torrent bestand:"; /* inspector -> peer table -> header */ "IP Address" = "IP-adres"; /* Download not a torrent -> message */ "It appears that the file \"%@\" from %@ is not a torrent file." = "Het blijkt dat bestand \"%1$@\" van %2$@ geen torrent bestand is."; /* File size - kilobytes */ "KB" = "KB"; /* Transfer speed (kilobytes per second) */ "KB/s" = "KB/s"; /* Tracker last announce */ "Last Announce" = "Laatste aankondiging"; /* Tracker last scrape */ "Last Scrape" = "Laatste scrape"; /* Prefs -> blocklist -> message */ "Last updated" = "Laatst bijgewerkt"; /* tracker peer stat */ "Leechers" = "Leechers"; /* About window -> license button */ "License" = "Licentie"; /* torrent action menu -> upload/download limit Action menu -> upload/download limit */ "Limit (%d KB/s)" = "Beperk (%d KB/s)"; /* Save log alert panel -> title */ "Log Could Not Be Saved" = "Het log kon niet worden bewaard"; /* File Outline -> Priority Menu */ "Low" = "Laag"; /* files tab -> tooltip */ "Low Priority" = "Lage prioriteit"; /* Open duplicate magnet alert -> title */ "Magnet link is a duplicate of an existing transfer." = "Magnet link is een duplicaat van een bestaande transfer."; /* Inspector -> selected torrents Torrent -> progress string */ "Magnetized transfer" = "Magnetized transfer"; /* File size - megabytes */ "MB" = "MB"; /* Transfer speed (megabytes per second) */ "MB/s" = "MB/s"; /* Message window -> table column */ "Message" = "Bericht"; /* Message window -> title */ "Message Log" = "Berichten log"; /* files tab -> tooltip */ "Multiple Priorities" = "Meerdere Prioriteiten"; /* Prefs -> blocklist -> message No Ratio Inspector -> Peers tab -> table row tooltip */ "N/A" = "N/B"; /* Filter Bar -> filter menu */ "Name" = "Naam"; /* Preferences -> toolbar item title */ "Network" = "Netwerk"; /* Prefs -> blocklist -> message */ "Never" = "Nooit"; /* inspector -> add tracker */ "New Tier" = "Nieuwe tier"; /* Tracker next announce */ "Next announce in %@" = "Volgende aankondiging in %@"; /* Group table row */ "No Group" = "Geen groep"; /* Inspector -> selected torrents */ "No Torrents Selected" = "Geen torrents geselecteerd"; /* Groups -> Menu Groups -> Button */ "None" = "Geen"; /* Donation beg -> button */ "Nope" = "Later"; /* File Outline -> Priority Menu */ "Normal" = "Normaal"; /* files tab -> tooltip */ "Normal Priority" = "Normale prioriteit"; /* Torrent disk space alert -> title */ "Not enough remaining disk space to download \"%@\" completely." = "Niet genoeg harde-schijf ruimte om \"%@\" volledig te downloaden."; /* Torrent file copy alert -> button Move error alert -> button Create torrent -> file already exists warning -> button Save log alert panel -> button Folder cannot be used alert -> button Torrent download failed -> button Torrent disk space alert -> button Create torrent -> failed -> button Create torrent -> no files -> button Download not a torrent -> button Open invalid alert -> button About window -> license close button Blocklist -> button Open duplicate alert -> button Create torrent -> zero size -> button Move folder cannot be used alert -> button Move inside itself alert -> button */ "OK" = "OK"; /* Remove completed confirm panel -> message */ "Once removed, continuing the transfer will require the torrent file or magnet link." = "Eenmaal verwijderd, is het originele torrent bestand of magnet link nodig om de transfer te vervolledigen."; /* Removal confirm panel -> message part 2 */ "Once removed, continuing the transfers will require the torrent files or magnet links." = "Eenmaal verwijderd, zijn de originele torrent bestanden of magnet link nodig om de transfers te vervolledigen."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact it. This cannot be undone." = "Eenmaal verwijderd, Transmission zal niet meer probeerden om deze te contacteren. Dit kan niet ongedaan worden."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact them. This cannot be undone." = "Eenmaal verwijderd, Transmission zal niet meer probeerden om deze te contacteren. Dit kan niet ongedaan worden."; /* File Outline -> Menu */ "Only Check Selected" = "Vink enkel geselecteerde aan"; /* Open toolbar item -> label */ "Open" = "Open"; /* Open address toolbar item -> label */ "Open Address" = "Open adres"; /* Open address toolbar item -> palette label */ "Open Torrent Address" = "Open torrent adres"; /* Open toolbar item -> tooltip */ "Open torrent files" = "Open torrent bestanden"; /* Open toolbar item -> palette label */ "Open Torrent Files" = "Open torrent bestanden"; /* Open address toolbar item -> tooltip */ "Open torrent web address" = "Open torrent web adres"; /* Inspector -> title */ "Options" = "Opties"; /* Groups -> Name */ "Orange" = "Oranje"; /* Inspector -> Peers tab -> table row tooltip */ "Partial Seed" = "Onvolledige Seed"; /* All toolbar item -> palette label */ "Pause / Resume All" = "Pauzeer / Hervat alles"; /* Selected toolbar item -> palette label */ "Pause / Resume Selected" = "Pauzeer / Hervat geselecteerde"; /* All toolbar item -> label */ "Pause All" = "Pauzeer alles"; /* All toolbar item -> tooltip */ "Pause all transfers" = "Pauzeer alle transfers"; /* Selected toolbar item -> label */ "Pause Selected" = "Pauzeer geselecteerde"; /* Selected toolbar item -> tooltip */ "Pause selected transfers" = "Pauzeer geselecteerde transfers"; /* Torrent Table -> tooltip */ "Pause the transfer" = "Pauzeer de transfer"; /* Torrent -> status string */ "Paused" = "Gepauzeerd"; /* Inspector -> peer -> status */ "Peer is unchoking you, but you are not interested" = "Peer is ongechoked, maar wij zijn niet geïnteresseerd"; /* Inspector -> peer -> status */ "Peer wants you to upload, but you do not want to (interested and choked)" = "Peer wil dat we uploaden, maar wij willen niet (geïnteresseerd en choked)"; /* Inspector -> title Preferences -> toolbar item title */ "Peers" = "Peers"; /* Inspector -> Peers tab -> table row tooltip */ "Port" = "Poort"; /* Preferences -> Network -> port status */ "Port check site is down" = "Poort controle site onbereikbaar"; /* Preferences -> Network -> port status */ "Port is closed" = "Poort is gesloten"; /* Preferences -> Network -> port status */ "Port is open" = "Poort is open"; /* file table -> header tool tip File Outline -> Menu */ "Priority" = "Prioriteit"; /* files tab -> tooltip */ "Priority Not Available" = "Prioriteit niet beschikbaar"; /* Inspector -> private torrent */ "Private Torrent, non-tracker peer discovery disabled" = "Private torrent, enkel tracker peer-uitwisseling toegestaan"; /* Message window -> table column */ "Process" = "Taak"; /* Blocklist -> message */ "Processing blocklist" = "Verwerken van zwarte lijst"; /* Stats window -> label */ "Program Started" = "Programma gestart"; /* Inspector -> Peers tab -> table row tooltip */ "Progress: %@" = "Voortgang: %@"; /* Inspector -> Peers tab -> table row tooltip */ "Protocol: %@" = "Protocol: %@"; /* Inspector -> private torrent */ "Public Torrent" = "Publieke torrent"; /* Groups -> Name */ "Purple" = "Paars"; /* QuickLook toolbar item -> label QuickLook toolbar item -> palette label QuickLook toolbar item -> tooltip */ "Quick Look" = "Geef snel weer"; /* Transmission already running alert -> button Confirm Quit panel -> button */ "Quit" = "Stop"; /* Dock Badger -> quit */ "Quitting" = "Stoppen"; /* Stats window -> label status bar -> status label Torrent table -> group row -> tooltip Torrent -> status string */ "Ratio" = "Ratio"; /* Groups -> Name */ "Red" = "Rood"; /* Action menu -> status string toggle */ "Remaining Time" = "Resterende tijd"; /* Torrent -> eta string */ "remaining time unknown" = "resterende tijd onbekend"; /* Preferences -> toolbar item title */ "Remote" = "Extern beheer"; /* Remove built-in tracker alert -> button Removal confirm panel -> button Remove toolbar item -> label */ "Remove" = "Verwijder"; /* Main window -> 3rd bottom left button (remove all) tooltip */ "Remove all transfers that have completed seeding." = "Verwijder alle transfers dat volledig geseed zijn."; /* Remove toolbar item -> palette label */ "Remove Selected" = "Verwijder geselecteerde"; /* Inspector view -> tracker buttons */ "Remove selected trackers" = "Verwijder geselecteerde trackers"; /* Remove toolbar item -> tooltip */ "Remove selected transfers" = "Verwijder geselecteerde transfers"; /* rename sheet button */ "Rename" = "Wijzig naam"; /* File Outline -> Menu */ "Rename File" = "Wijzig bestandsnaam"; /* rename sheet label */ "Rename the file \"%@\":" = "Wijzig bestandsnaam van \"%@\":"; /* Stats window -> reset button Stats reset -> button */ "Reset" = "Wis"; /* All toolbar item -> label */ "Resume All" = "Hervat alles"; /* All toolbar item -> tooltip */ "Resume all transfers" = "Hervat alle transfers"; /* Selected toolbar item -> label */ "Resume Selected" = "Hervat geselecteerde"; /* Selected toolbar item -> tooltip */ "Resume selected transfers" = "Hervat geselecteerde transfers"; /* Torrent cell -> button info */ "Resume the transfer" = "Hervat de transfer"; /* Torrent cell -> button info */ "Resume the transfer right away" = "Hervat de transfer onmiddellijk"; /* Stats window -> label */ "Running Time" = "Loop tijd"; /* Message window -> save button */ "Save" = "Bewaar"; /* Tracker last scrape */ "Scrape error" = "scrape fout"; /* Tracker last scrape */ "Scrape timed out" = "Scrape verlopen"; /* tracker peer stat */ "Seeders" = "Seeders"; /* Torrent -> status string */ "Seeding" = "Seeden"; /* Torrent -> status string */ "Seeding complete" = "Seeden klaar"; /* Growl notification title */ "Seeding Complete" = "Seeden klaar"; /* Torrent -> status string */ "Seeding to %d of %d peers" = "Seeden naar %1$d van %2$d peers"; /* Torrent -> status string */ "Seeding to %d of 1 peer" = "Seeden naar %d van 1 peer"; /* Default incomplete folder cannot be used alert -> prompt Move torrent -> prompt Open torrent -> prompt Preferences -> Open panel prompt Create torrent -> select file Create torrent -> location sheet -> button Default folder cannot be used alert -> prompt Folder cannot be used alert -> prompt */ "Select" = "Selecteer"; /* Create torrent -> select file */ "Select a file or folder for the torrent file." = "Selecteer een bestand of map voor het torrent bestand."; /* Folder cannot be used alert -> select destination folder Add -> select destination folder */ "Select the download folder for \"%@\"" = "Selecteer de download map voor \"%@\""; /* Create torrent -> location sheet -> message */ "Select the name and location for the torrent file." = "Selecteer de naam en locatie voor het torrent bestand."; /* Move torrent -> select destination folder */ "Select the new folder for %d data files." = "Selecteer de nieuwe map voor %d data bestanden."; /* Move torrent -> select destination folder */ "Select the new folder for \"%@\"." = "Selecteer de nieuwe map voor \"%@\"."; /* Status Bar -> status menu */ "Session Ratio" = "Sessie ratio"; /* Status Bar -> status menu */ "Session Transfer" = "Sessie transfer"; /* Share toolbar item -> label Share toolbar item -> palette label */ "Share" = "Deel"; /* Share toolbar item -> tooltip */ "Share torrent file" = "Deel torrent bestand"; /* Main window -> 1st bottom left button (action) tooltip */ "Shortcuts for changing global settings." = "Snel aanpassen van globale instellingen"; /* notification button */ "Show" = "Toon"; /* View menu -> Filter Bar */ "Show Filter Bar" = "Toon filterbalk"; /* File Outline -> Menu */ "Show in Finder" = "Toon in Finder"; /* View menu -> Inspector */ "Show Inspector" = "Toon infovenster"; /* View menu -> Status Bar */ "Show Status Bar" = "Toon statusbalk"; /* Torrent cell -> button info */ "Show the data file in Finder" = "Toon data bestand in Finder"; /* Status Bar -> speed tooltip */ "Speed Limit" = "Snelheidslimiet"; /* Growl notification title */ "Speed Limit Auto Disabled" = "Snelheidsbeperking automatisch uitgeschakeld"; /* Growl notification title */ "Speed Limit Auto Enabled" = "Snelheidsbeperking automatisch ingeschakeld"; /* Main window -> 2nd bottom left button (turtle) tooltip */ "Speed Limit overrides the total bandwidth limits with its own limits." = "Snelheidsbeperking verandert de globale bandbreedte met zijn eigen limieten."; /* Torrent -> status string */ "Stalled" = "Passief"; /* Stats window -> title */ "Statistics" = "Statistieken"; /* Action menu -> status string toggle */ "Status of Selected Files" = "Status van geselecteerde bestanden"; /* torrent action menu -> ratio stop Action menu -> ratio stop */ "Stop at Ratio (%.2f)" = "Stop bij Ratio (%.2f)"; /* Torrent cell -> button info */ "Stop waiting to start" = "Stop wachten om te starten"; /* Donation beg -> title */ "Support open-source indie software" = "Steun open-source software"; /* File size - terabytes */ "TB" = "TB"; /* Transfer speed (terabytes per second) */ "TB/s" = "TB/s"; /* Create torrent -> directory doesn't exist warning -> title */ "The chosen torrent file location does not exist." = "Het gekozen locatie voor het torrent bestand bestaat niet."; /* Add torrent -> same name -> title */ "The destination directory and root data directory have the same name." = "De bestemmings map en de data hebben dezelfde naam."; /* Create torrent -> directory doesn't exist warning -> warning */ "The directory \"%@\" does not currently exist. Create this directory or choose a different one to create the torrent file." = "De map \"%@\" bestaat niet. Maak deze map aan, of kies een andere map om het torrent bestand te maken."; /* Open duplicate magnet alert -> message */ "The magnet link \"%@\" cannot be added because it is a duplicate of an already existing transfer." = "de magnet link \"%@\" kan niet toegevoegt worden omdat het een duplicaat is van een bestaande transfer."; /* Move error alert -> message Move inside itself alert -> message */ "The move operation of \"%@\" cannot be done." = "Het verplaatsen van \"%@\" kan niet ongedaan worden."; /* blocklist fail message */ "The specified blocklist file did not contain any valid rules." = "De gegeven zwarte lijst bevat geen geldige waardes."; /* Torrent download failed -> message */ "The torrent could not be downloaded from %@: %@." = "De torrent kon niet gedownload worden van %1$@: %2$@."; /* Torrent file copy alert -> message */ "The torrent file (%@) cannot be found." = "Het torrent bestand (%@) kan niet gevonden worden."; /* Open invalid alert -> message */ "The torrent file cannot be opened because it contains invalid data." = "Het torrent bestand kan niet geopend worden omdat het ongeldige data bevat."; /* Create torrent -> zero size -> title */ "The total file size is zero bytes." = "De totale bestand grootte is nul bytes."; /* Open duplicate alert -> message */ "The transfer cannot be added because it is a duplicate of an already existing transfer." = "Deze transfer kan niet toegevoegd worden, want het is een duplicaat van een al toegevoegde transfer."; /* Torrent disk space alert -> message */ "The transfer will be paused. Clear up space on %@ or deselect files in the torrent inspector to continue." = "De transfer zal gepauzeerd worden. Maak wat ruimte vrij op %@ of deselecteer bestanden in het infovenster."; /* Create torrent -> blank address -> message */ "The transfer will not contact trackers for peers, and will have to rely solely on non-tracker peer discovery methods such as PEX and DHT to download and seed." = "De transfer zal geen trackers contacteren voor peers, en zal dus moeten vertrouwen op methodes als DHT en PEX op te downloaden en te seeden."; /* Removal confirm panel -> message part 1 */ "There are %@ active transfers." = "Er zijn %@ actieve transfers."; /* Removal confirm panel -> message part 1 */ "There are %@ transfers (%@ active)." = "Er zijn %1$@ transfers (%2$@ actief)."; /* Confirm Quit panel -> message */ "There are %d active transfers that will be paused on quit. The transfers will automatically resume on the next launch." = "Er zijn %d actieve transfers die gepauzeerd zullen worden bij afsluiten. De transfers zullen automatisch hervat worden bij het herstarten."; /* Create torrent -> blank address -> title */ "There are no tracker addresses." = "Er zijn geen tracker addressen."; /* Transmission already running alert -> message */ "There is already a copy of Transmission running. This copy cannot be opened until that instance is quit." = "Er is al een exemplaar van Transmission actief. Dit exemplaar kan niet geopend worden voordat de ander afgesloten is."; /* Confirm Quit panel -> message */ "There is an active transfer that will be paused on quit. The transfer will automatically resume on the next launch." = "Er is een actieve transfer die gepauzeerd zal worden bij afsluiten. De transfer zal automatisch hervat worden bij het herstarten."; /* Create torrent -> no files -> warning */ "There must be at least one file in a folder to create a torrent file." = "Er moet minstens een bestand in een map zitten om een torrent te maken."; /* Save log alert panel -> message */ "There was a problem creating the file \"%@\"." = "Er was een probleem bij het maken van het bestand \"%@\"."; /* Move error alert -> title */ "There was an error moving the data file." = "Er trad een fout op bij het verplaatsen van het data bestand."; /* Magnet link failed -> message */ "There was an error when adding the magnet link \"%@\". The transfer will not occur." = "Er trad een fout op tijdens het toevoegen van de magnet link \"%@\". Deze transfer zal niet worden toegevoegd."; /* Create torrent -> no files -> title */ "This folder contains no files." = "Deze map bevat geen bestanden."; /* Removal confirm panel -> message */ "This transfer is active. Once removed, continuing the transfer will require the torrent file or magnet link." = "Deze transfer is actief. Eenmaal verwijderd is het originele torrent bestand of magnet link nodig om de transfer verder te zetten."; /* Stats reset -> message */ "This will clear the global statistics displayed by Transmission. Individual transfer statistics will not be affected." = "Dit zal de globale statistieken die Transmission toont wissen. Individuele transfer statistieken worden niet gewijzigd."; /* Inspector -> tracker table */ "Tier %d" = "Tier %d"; /* Filter toolbar item -> palette label */ "Toggle Filter" = "Schakel filter"; /* Inspector toolbar item -> palette label */ "Toggle Inspector" = "Schakel infovenster"; /* Filter toolbar item -> tooltip */ "Toggle the filter bar" = "Schakel de filterbalk"; /* Inspector toolbar item -> tooltip */ "Toggle the torrent inspector" = "Schakel het infovenster"; /* Torrent download error -> title Download not a torrent -> title */ "Torrent download failed" = "Torrent download mislukt"; /* Growl notification title */ "Torrent File Auto Added" = "Torrent bestand automatisch toegevoegd"; /* Inspector -> title */ "Torrent Inspector" = "Torrent infovenster"; /* Torrent -> progress string */ "torrent metadata needed" = "torrent metadata ontbreekt"; /* stats total */ "Total N/A" = "Totaal N/B"; /* Status Bar -> status menu */ "Total Ratio" = "Totaal ratio"; /* Status Bar -> status menu */ "Total Transfer" = "Totaal transfer"; /* Filter Bar -> filter menu */ "Tracker" = "Tracker"; /* Torrent -> status string */ "Tracker returned error" = "Tracker gaf een foutmelding"; /* Torrent -> status string */ "Tracker returned warning" = "Tracker gaf een waarschuwing"; /* Tracker next announce */ "Tracker will be used as a backup" = "Tracker zal gebruikt worden als reserve"; /* Inspector -> title */ "Trackers" = "Trackers"; /* Inspector -> Peers tab -> peers */ "Transfer Not Active" = "Transfer niet actief"; /* Preferences -> toolbar item title */ "Transfers" = "Transfers"; /* Inspector -> Peers tab -> peers */ "Transfers Not Active" = "Transfers niet actief"; /* Legal alert -> message */ "Transmission is a file-sharing program. When you run a torrent, its data will be made available to others by means of upload. You and you alone are fully responsible for exercising proper judgement and abiding by your local laws." = "Transmission is een programma om bestanden te delen. Als u een torrent download, dan wordt die gegevens beschikbaar voor anderen door middel van upload. U, en enkel u, bent volledig verantwoordelijk voor het respecteren van lokale wetgeving."; /* Donation beg -> message */ "Transmission is a full-featured torrent application. A lot of time and effort have gone into development, coding, and refinement. If you enjoy using it, please consider showing your love with a donation." = "Transmission is een compleet Bittorrent programma. Er is veel energie gestoken in het ontwikkelen, programmeren en het verfijnen. Als u er plezier aan heeft, toon dan uw liefde met een donatie."; /* Transmission already running alert -> title */ "Transmission is already running." = "Transmission is al actief."; /* Torrent -> status string status bar -> status label */ "UL" = "UL"; /* Inspector -> Peers tab -> peers */ "UL to %d" = "UL naar %d"; /* File Outline -> Menu */ "Uncheck Selected" = "Vink geselecteerde af"; /* Status Bar -> speed tooltip */ "unlimited" = "Onbeperkt"; /* Torrent -> error string unreadable */ "unreadable error" = "onleesbare foutmelding"; /* Save log panel -> default file name */ "untitled" = "naamloos"; /* Torrent table -> group row -> tooltip */ "Upload speed" = "Uploadsnelheid"; /* Stats window -> label */ "Uploaded" = "Geupload"; /* Torrent -> progress string */ "uploaded %@ (Ratio: %@)" = "geupload %1$@ (Ratio: %2$@)"; /* inspector -> peer table -> header tool tip */ "Uploading To Peer" = "Uploaden naar peer"; /* Torrent -> status string */ "Waiting to check existing data" = "Wachten om lokale data te verifiëren"; /* Torrent -> status string */ "Waiting to download" = "Wachten om te downloaden"; /* Torrent -> status string */ "Waiting to seed" = "Wachten om te seeden"; /* Drag overlay -> url */ "Web Address" = "Web adres"; /* Torrent -> status string */ "web seed" = "web seed"; /* inspector -> web seed table -> header */ "Web Seeds" = "Web Seeds"; /* Legal alert -> title */ "Welcome to Transmission" = "Welkom bij Transmission"; /* Groups -> Name */ "Yellow" = "Geel"; /* Inspector -> peer -> status */ "You unchoked the peer, but the peer is not interested" = "We ontchokedte de peer, maar hij is niet geïnteresseerd"; /* Inspector -> peer -> status */ "You want to download, but peer does not want to send (interested and choked)" = "We willen downloaden, maar de peer wil niets versturen (geïnteresseerd en choked)";transmission-2.92/macosx/nl.lproj/PaxHeaders.4960/InfoOptionsView.xib0000644000000000000000000000013212664476420022527 xustar0030 mtime=1456635152.226500474 30 atime=1456635152.226500474 30 ctime=1457295922.809855686 transmission-2.92/macosx/nl.lproj/InfoOptionsView.xib0000644000175000017500000012121012664476420024151 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/nl.lproj/PaxHeaders.4960/InfoActivityView.xib0000644000000000000000000000013212664476420022670 xustar0030 mtime=1456635152.226500474 30 atime=1456635152.226500474 30 ctime=1457295922.808855669 transmission-2.92/macosx/nl.lproj/InfoActivityView.xib0000644000175000017500000012772512664476420024333 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/nl.lproj/PaxHeaders.4960/InfoGeneralView.xib0000644000000000000000000000013212664476420022451 xustar0030 mtime=1456635152.226500474 30 atime=1456635152.226500474 30 ctime=1457295922.808855669 transmission-2.92/macosx/nl.lproj/InfoGeneralView.xib0000644000175000017500000006302712664476420024106 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/nl.lproj/PaxHeaders.4960/AddMagnetWindow.xib0000644000000000000000000000013212662757243022444 xustar0030 mtime=1456201379.273862195 30 atime=1456201379.273862195 30 ctime=1457295922.809855686 transmission-2.92/macosx/nl.lproj/AddMagnetWindow.xib0000644000175000017500000006537212662757243024106 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/nl.lproj/PaxHeaders.4960/MainMenu.xib0000644000000000000000000000013212644245522021131 xustar0030 mtime=1452362578.810700063 30 atime=1452362578.810700063 30 ctime=1457295922.809855686 transmission-2.92/macosx/nl.lproj/MainMenu.xib0000644000175000017500000021433112644245522022562 0ustar00mikedldmikedld00000000000000 CA CA YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7NjIsIDYyfdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPEQ7OTU0AKgAAAUiAOyBP8AQW DQeEQmFQuGQ2HQ+IRGJROKRWLReMRCBOyCRmPR+QSGRSOSSWGRuOyaVSuWS2XS+DyiYTOaTWbTcATKcT ueT2fRqBz+hUOiTadUWkUmlR+j0unU+oQqm1GqVWkVOrVmtTisVuvV+WV2wWOyUyg2W0WmMWK1W23Qi2 W+5Wq43O7WO63e9Vq83u/VG+3/BUrA4PDUPC4fFTzE4vHTXG4/JS7I5PLSbK5fNSHM5vPWuz5/RS3O6P TQ/S6fVVLQ6vXRnU6/XbHZarabXTbfcaJ172U7vgQ3euvf8HjQjh8Xj8vk8vnQbm8/ndHpcfqdXg9fsb vtdva93va/weHV+PyafzefR+n1Z/2e3N+/4Zf5fPJ/X7Y/8fnF/v+MO/z/sHAMBL/AkCr3A8ELvBUFrn BsHLfCEIrbCcKLSgIAAPAQAAAwAAAAEAPgAAAQEAAwAAAAEAPgAAAQIAAwAAAAQAAAICAQMAAwAAAAEA BQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEABAAAARYAAwAAAAEA PgAAARcABAAAAAEAAAFAARwAAwAAAAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAQA AAIKh3MABwAADLwAAAISAAAAAAAIAAgACAAIAAEAAQABAAEAAAy8YXBwbAIQAABtbnRyUkdCIFhZWiAH 3gABAAgACQA1ABdhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFkZXNjAAABUAAAAGJk c2NtAAABtAAAAaRjcHJ0AAADWAAAACN3dHB0AAADfAAAABRyWFlaAAADkAAAABRnWFlaAAADpAAAABRi WFlaAAADuAAAABRyVFJDAAADzAAACAxhYXJnAAAL2AAAACB2Y2d0AAAL+AAAADBuZGluAAAMKAAAAD5j aGFkAAAMaAAAACxtbW9kAAAMlAAAAChiVFJDAAADzAAACAxnVFJDAAADzAAACAxhYWJnAAAL2AAAACBh YWdnAAAL2AAAACBkZXNjAAAAAAAAAAhEaXNwbGF5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAA AAAhAAAADGhySFIAAAAIAAABnGtvS1IAAAAIAAABnG5iTk8AAAAIAAABnGlkAAAAAAAIAAABnGh1SFUA AAAIAAABnGNzQ1oAAAAIAAABnGRhREsAAAAIAAABnHVrVUEAAAAIAAABnGFyAAAAAAAIAAABnGl0SVQA AAAIAAABnHJvUk8AAAAIAAABnG5sTkwAAAAIAAABnGhlSUwAAAAIAAABnGVzRVMAAAAIAAABnGZpRkkA AAAIAAABnHpoVFcAAAAIAAABnHZpVk4AAAAIAAABnHNrU0sAAAAIAAABnHpoQ04AAAAIAAABnHJ1UlUA AAAIAAABnGZyRlIAAAAIAAABnG1zAAAAAAAIAAABnGNhRVMAAAAIAAABnHRoVEgAAAAIAAABnGRlREUA AAAIAAABnGVuVVMAAAAIAAABnHB0QlIAAAAIAAABnHBsUEwAAAAIAAABnGVsR1IAAAAIAAABnHN2U0UA AAAIAAABnHRyVFIAAAAIAAABnGphSlAAAAAIAAABnHB0UFQAAAAIAAABnABpAE0AYQBjdGV4dAAAAABD b3B5cmlnaHQgQXBwbGUgSW5jLiwgMjAxNAAAWFlaIAAAAAAAAPMWAAEAAAABFspYWVogAAAAAAAAccAA ADmKAAABZ1hZWiAAAAAAAABhIwAAueYAABP2WFlaIAAAAAAAACPyAAAMkAAAvdBjdXJ2AAAAAAAABAAA AAAFAAoADwAUABkAHgAjACgALQAyADYAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAA lQCaAJ8AowCoAK0AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIB OAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQC HQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MD TwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE 0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0G rwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII 5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kL gAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQO fw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR 6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsV vRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0a BBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQe vh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij 8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWsp nSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Ev xy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2 cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9 oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJF VUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpN k03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9W XFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ff s2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNp mmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0 FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/ I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSK yoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+X Cpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj 5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqx YLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/ er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXO Ns62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDd lt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHt nO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+ S/7c/23//3BhcmEAAAAAAAMAAAACZmYAAPKnAAANWQAAE9AAAAoOdmNndAAAAAAAAAABAAEAAAAAAAAA AQAAAAEAAAAAAAAAAQAAAAEAAAAAAAAAAQAAbmRpbgAAAAAAAAA2AACnQAAAVYAAAEzAAACewAAAJYAA AAzAAABQAAAAVEAAAjMzAAIzMwACMzMAAAAAAAAAAHNmMzIAAAAAAAEMcgAABfj///MdAAAHugAA/XL/ //ud///9pAAAA9kAAMBxbW1vZAAAAAAAAAYQAACgBwAAAADJJx4AAAAAAAAAAAAAAAAAAAAAANIlJico WiRjbGFzc25hbWVYJGNsYXNzZXNfEBBOU0JpdG1hcEltYWdlUmVwoycpKlpOU0ltYWdlUmVwWE5TT2Jq ZWN00iUmLC1XTlNBcnJheaIsKtIlJi8wXk5TTXV0YWJsZUFycmF5oy8sKtMyMwo0NTZXTlNXaGl0ZVxO U0NvbG9yU3BhY2VEMCAwABADgAzSJSY4OVdOU0NvbG9yojgq0iUmOzxXTlNJbWFnZaI7Kl8QD05TS2V5 ZWRBcmNoaXZlctE/QFRyb290gAEACAARABoAIwAtADIANwBGAEwAVwBeAGUAcgB5AIEAgwCFAIoAjACO AJcAnACnAKkAqwCtALIAtQC3ALkAuwC9AMIA2QDbAN0Prw+0D78PyA/bD98P6g/zD/gQABADEAgQFxAb ECIQKhA3EDwQPhBAEEUQTRBQEFUQXRBgEHIQdRB6AAAAAAAAAgEAAAAAAAAAQQAAAAAAAAAAAAAAAAAA EHw transmission-2.92/macosx/nl.lproj/PaxHeaders.4960/GroupRules.xib0000644000000000000000000000013212666747213021537 xustar0030 mtime=1457245835.389999919 30 atime=1457245835.389999919 30 ctime=1457295922.809855686 transmission-2.92/macosx/nl.lproj/GroupRules.xib0000644000175000017500000004161112666747213023167 0ustar00mikedldmikedld00000000000000 name comment name comment fFlatFileList.name allTrackersFlat fFlatFileList.name allTrackersFlat transmission-2.92/macosx/nl.lproj/PaxHeaders.4960/AddWindow.xib0000644000000000000000000000013212640354045021275 xustar0030 mtime=1451350053.378166506 30 atime=1451350053.378166506 30 ctime=1457295922.809855686 transmission-2.92/macosx/nl.lproj/AddWindow.xib0000644000175000017500000007267412640354045022742 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/nl.lproj/PaxHeaders.4960/GlobalOptionsPopover.xib0000644000000000000000000000013212640354045023544 xustar0030 mtime=1451350053.374166437 30 atime=1451350053.374166437 30 ctime=1457295922.808855669 transmission-2.92/macosx/nl.lproj/GlobalOptionsPopover.xib0000644000175000017500000006367312640354045025210 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/StatsWindowController.h0000644000000000000000000000013212442116616021656 xustar0030 mtime=1418239374.018412586 30 atime=1418239374.018412586 30 ctime=1457295923.514867674 transmission-2.92/macosx/StatsWindowController.h0000644000175000017500000000367012442116616023311 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: StatsWindowController.h 13318 2012-05-27 22:31:58Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import @interface StatsWindowController : NSWindowController { IBOutlet NSTextField * fUploadedField, * fUploadedAllField, * fDownloadedField, * fDownloadedAllField, * fRatioField, * fRatioAllField, * fTimeField, * fTimeAllField, * fNumOpenedField, * fUploadedLabelField, * fDownloadedLabelField, * fRatioLabelField, * fTimeLabelField, * fNumOpenedLabelField; IBOutlet NSButton * fResetButton; NSTimer * fTimer; } + (StatsWindowController *) statsWindow; - (void) resetStats: (id) sender; @end transmission-2.92/macosx/PaxHeaders.4960/PredicateEditorRowTemplateAny.m0000644000000000000000000000013212442116673023237 xustar0030 mtime=1418239419.184186587 30 atime=1418239419.184186587 30 ctime=1457295923.454866654 transmission-2.92/macosx/PredicateEditorRowTemplateAny.m0000644000175000017500000000401212442116673024661 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: PredicateEditorRowTemplateAny.m 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2009-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "PredicateEditorRowTemplateAny.h" @implementation PredicateEditorRowTemplateAny - (NSPredicate *) predicateWithSubpredicates: (NSArray *) subpredicates { //we only make NSComparisonPredicates NSComparisonPredicate * predicate = (NSComparisonPredicate *)[super predicateWithSubpredicates: subpredicates]; //construct a near-identical predicate return [NSComparisonPredicate predicateWithLeftExpression: [predicate leftExpression] rightExpression: [predicate rightExpression] modifier: NSAnyPredicateModifier type: [predicate predicateOperatorType] options: [predicate options]]; } @end transmission-2.92/macosx/PaxHeaders.4960/ColorTextField.h0000644000000000000000000000013212442116666020220 xustar0030 mtime=1418239414.203101228 30 atime=1418239414.203101228 30 ctime=1457295922.995858849 transmission-2.92/macosx/ColorTextField.h0000644000175000017500000000264112442116666021650 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: ColorTextField.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface ColorTextField : NSTextField @end transmission-2.92/macosx/PaxHeaders.4960/ColorTextField.m0000644000000000000000000000013212442116666020225 xustar0030 mtime=1418239414.206101279 30 atime=1418239414.206101279 30 ctime=1457295923.000858934 transmission-2.92/macosx/ColorTextField.m0000644000175000017500000000324612442116666021657 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: ColorTextField.m 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "ColorTextField.h" @implementation ColorTextField - (void) awakeFromNib { [self setEnabled: [self isEnabled]]; } - (void) setEnabled: (BOOL) flag { [super setEnabled: flag]; NSColor * color = flag ? [NSColor controlTextColor] : [NSColor disabledControlTextColor]; [self setTextColor: color]; } @end transmission-2.92/macosx/PaxHeaders.4960/PrefsController.h0000644000000000000000000000013212442116666020454 xustar0030 mtime=1418239414.202101211 30 atime=1418239414.202101211 30 ctime=1457295923.458866722 transmission-2.92/macosx/PrefsController.h0000644000175000017500000001414612442116666022107 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: PrefsController.h 14161 2013-08-10 02:29:12Z livings124 $ * * Copyright (c) 2005-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import @class PortChecker; @interface PrefsController : NSWindowController { tr_session * fHandle; NSUserDefaults * fDefaults; BOOL fHasLoaded; IBOutlet NSView * fGeneralView, * fTransfersView, * fBandwidthView, * fPeersView, * fNetworkView, * fRemoteView, * fGroupsView; NSString * fInitialString; IBOutlet NSButton * fBuiltInGrowlButton, *fGrowlAppButton; IBOutlet NSTextField * fCheckForUpdatesLabel; IBOutlet NSButton * fCheckForUpdatesButton, * fCheckForUpdatesBetaButton; IBOutlet NSPopUpButton * fFolderPopUp, * fIncompleteFolderPopUp, * fImportFolderPopUp, * fDoneScriptPopUp; IBOutlet NSButton * fShowMagnetAddWindowCheck; IBOutlet NSTextField * fRatioStopField, * fIdleStopField, * fQueueDownloadField, * fQueueSeedField, * fStalledField; IBOutlet NSTextField * fUploadField, * fDownloadField, * fSpeedLimitUploadField, * fSpeedLimitDownloadField; IBOutlet NSPopUpButton * fAutoSpeedDayTypePopUp; IBOutlet NSTextField * fPeersGlobalField, * fPeersTorrentField, * fBlocklistURLField, * fBlocklistMessageField, * fBlocklistDateField; IBOutlet NSButton * fBlocklistButton; PortChecker * fPortChecker; IBOutlet NSTextField * fPortField, * fPortStatusField; IBOutlet NSButton * fNatCheck; IBOutlet NSImageView * fPortStatusImage; IBOutlet NSProgressIndicator * fPortStatusProgress; NSTimer * fPortStatusTimer; int fPeerPort, fNatStatus; IBOutlet NSTextField * fRPCPortField, * fRPCPasswordField; IBOutlet NSTableView * fRPCWhitelistTable; NSMutableArray * fRPCWhitelistArray; IBOutlet NSSegmentedControl * fRPCAddRemoveControl; NSString * fRPCPassword; } - (id) initWithHandle: (tr_session *) handle; - (void) setAutoUpdateToBeta: (id) sender; - (void) setPort: (id) sender; - (void) randomPort: (id) sender; - (void) setRandomPortOnStart: (id) sender; - (void) setNat: (id) sender; - (void) updatePortStatus; - (void) portCheckerDidFinishProbing: (PortChecker *) portChecker; - (NSArray *) sounds; - (void) setSound: (id) sender; - (void) setUTP: (id) sender; - (void) setPeersGlobal: (id) sender; - (void) setPeersTorrent: (id) sender; - (void) setPEX: (id) sender; - (void) setDHT: (id) sender; - (void) setLPD: (id) sender; - (void) setEncryptionMode: (id) sender; - (void) setBlocklistEnabled: (id) sender; - (void) updateBlocklist: (id) sender; - (void) setBlocklistAutoUpdate: (id) sender; - (void) updateBlocklistFields; - (void) updateBlocklistURLField; - (void) updateBlocklistButton; - (void) setAutoStartDownloads: (id) sender; - (void) setBadge: (id) sender; - (IBAction) setBuiltInGrowlEnabled: (id) sender; - (IBAction) openGrowlApp: (id) sender; - (void) openNotificationSystemPrefs: (id) sender; - (void) resetWarnings: (id) sender; - (void) setDefaultForMagnets: (id) sender; - (void) setQueue: (id) sender; - (void) setQueueNumber: (id) sender; - (void) setStalled: (id) sender; - (void) setStalledMinutes: (id) sender; - (void) setDownloadLocation: (id) sender; - (void) folderSheetShow: (id) sender; - (void) incompleteFolderSheetShow: (id) sender; - (void) setUseIncompleteFolder: (id) sender; - (void) setRenamePartialFiles: (id) sender; - (IBAction) setShowAddMagnetWindow: (id) sender; - (void) updateShowAddMagnetWindowField; - (void) setDoneScriptEnabled: (id) sender; - (void) doneScriptSheetShow: (id) sender; - (void) applyRatioSetting: (id) sender; - (void) setRatioStop: (id) sender; - (void) updateRatioStopField; - (void) updateRatioStopFieldOld; - (void) applyIdleStopSetting: (id) sender; - (void) setIdleStop: (id) sender; - (void) updateLimitStopField; - (void) applySpeedSettings: (id) sender; - (void) applyAltSpeedSettings; - (void) updateLimitFields; - (void) setGlobalLimit: (id) sender; - (void) setSpeedLimit: (id) sender; - (void) setAutoSpeedLimit: (id) sender; - (void) setAutoSpeedLimitTime: (id) sender; - (void) setAutoSpeedLimitDay: (id) sender; + (NSInteger) dateToTimeSum: (NSDate *) date; + (NSDate *) timeSumToDate: (NSInteger) sum; - (void) setAutoImport: (id) sender; - (void) importFolderSheetShow: (id) sender; - (void) setAutoSize: (id) sender; - (void) setRPCEnabled: (id) sender; - (void) linkWebUI: (id) sender; - (void) setRPCAuthorize: (id) sender; - (void) setRPCUsername: (id) sender; - (void) setRPCPassword: (id) sender; - (void) updateRPCPassword; - (void) setRPCPort: (id) sender; - (void) setRPCUseWhitelist: (id) sender; - (void) setRPCWebUIDiscovery: (id) sender; - (void) updateRPCWhitelist; - (void) addRemoveRPCIP: (id) sender; - (void) helpForScript: (id) sender; - (void) helpForPeers: (id) sender; - (void) helpForNetwork: (id) sender; - (void) helpForRemote: (id) sender; - (void) rpcUpdatePrefs; @end transmission-2.92/macosx/PaxHeaders.4960/MessageWindow.xib0000644000000000000000000000013212640354044020432 xustar0030 mtime=1451350052.801156485 30 atime=1451350052.801156485 30 ctime=1457295922.458849717 transmission-2.92/macosx/MessageWindow.xib0000644000175000017500000006375412640354044022076 0ustar00mikedldmikedld00000000000000 YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7MTQsIDE0fdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPERxuTU0AKgAADEgAAAAAAAAA AAAAAAAAAAAAAAAAAAMBAAcVCAA3Hw0BSlArDYxSLA2RMRkHZygUBlsRCABCDQYAPAsEADQKBAAyBQAA KQQAACYAAAAeAAAAGgAAABAAAAANAAAABgAAAAUAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAABAAAA AQEBAQUEAgENFQkBOyEQA09cNROWYTkVnEgrEHlAJg5vKRkJVyQWB1EgEARJHg8ERhYLAzsUCQM4DQgC LQsHAikIAwEcBwMBGAMBABEDAQAOAAAABwAAAAYAAAAAAAAAAAAAAAEAAAACBAQEDAUFBRENCw0kEAwN LhwPCFYxHg5sonE1zrmDPuDQlUfm0JNG5bZ8NtmvdDHUnFwlw5VWIr19SRmqdUQWo101EYtUMA6COB0I ZDAYB1wbDgBLFQsARAQBACYBAAAdAAAABgAAAAIAAAABAAAAAwYGBhEJCQkZFxUXQRsYGU0jGBJrNyYX gKp6PNnDjETq56pU+eqrVPnTk0TwzIxA7Lt1Mty0bi7Xm2Elw5RcIbx8Shmoc0QWn1UvDoFLKAx5LxgE ZiUTA1sHAgAuAgAAIgAAAAYAAAACAAAAAAEBAgYODg4qGRkZRk9QUc9WWFjjR0pM2E9NSNmObT3rpHtB 8Oq2Zvz1wG3+98Nx+/fDb/v0u2L59Lle+PGzVPjwr1D37aFB8uqaPPHbfy3uznQo6I5IGct0ORSzGgoC PwoCACcBAAAFAAAAAAAAAAACAgIHEBESMh0eH1FdXl7nZWdo/VpeYetfX1zqi25G7597SPHpuGz99sNz /vzNev39zXj9+sNp/vrBZf76vFv/+rlX//2sR//8pkL/8Y0y/+OBLfqcUBzbfz8Wwh4OBksNBQMxAQAA BwAAAAEAAAAAAwMDCRkbHEQoKixjcHN16YGEh/+foaf8oqGl/JSEef2diHP937t8/+zGfv/90oP//M9/ /+auZP/ip1//2qFY/9ufVf/tnEn/8JpE//GPOP/jhDP6jVAf3HJCG8snHRiAGBUVZgMDAhUAAAAHAAAA AAMEBAocHh9MLC4wa3V6feqJjZD/s7S4/7a1t/+fkon/pJOC/927gP/pxID//NKF//vOgP/hqWL/3KJd /9KaXf/UmVr/6ppK/+6YRv/ykTn/5Ic1+45WKeB0SSbSMCgimCEfHn4EBAQZAAAACQAAAAQFBQYSJikq aTg7PYiFiJLunqGo/+rl1//y69r/2M27/9TFr//VtIb/2raA//XMgv/1yH3/1p9i/8+YYf/Cl3j/xZh2 /+ObUv/pm0v/8ZpD/+eWRf+lfFv6kXNd+FlZVe5GSkrRDQ0NLQMDAxIAAAAFBgYGFSosLnE8P0KQiYyW 8KKlrP/y7tz//PXf/+PWvv/dzLL/0rOI/9Wzgf/0y4L/9cl9/9qiZP/Tm2P/w5h6/8aYeP/lnVT/651N /++aRP/ml0j/q4Zn/5h+av5hYl/4TVJS2w4ODi4DAwMSAQEBBwgJCRo3OTuLSk1QqpCXofOorrT/8/LU //340v/v2qT/6NCa/8atkP/IrI3/8cuF//fNgf/zvGv/77Zn/9ugZ//bnmT/86lY//SoU//mlED/3pJG /7mYfv+okYP6Z2dk2lFUVLwMDA0oAQEBDwEBAQgJCQkbOz0/lE5RVbKUmqP0q7G2//Px1P/+99D/8tue /+vRlP/IrY7/yKyM/+7Hgf/1yn3/98Fs//S7Z//goWD/4J5d//SsWP/1qlT/5JNA/9uRR/+7moH/qpSF +WVlZdBPUlSyDAwMJgEBAQ4EBAQMDQ4OIkVGR6haXF7Goaet97e7vv/17tn///LS//vbkf/20ob/2rOB /9euff/er2n/47Jm//jAZ//3vWT/35lP/9+XTP/7r1L/+65Q/9+SQv/Vj0n/tZmF/6OSiPVZWVm1REZI lwkKCh0AAAAJBAQEDA4ODiNHSkuuXWBizKarsPi7v8L/9u7c///z1v/53Jf/9NOL/9m0hP/VrX//16Rk /9ynYP/3v2f/971k/+KcTP/imkr/+7BR//uvUP/dk0T/05BL/7KYhv+fkIfzVFRUqz9BQ40ICQkaAAAA CAMEBQ8OEBEpUlZWwWlubt+yuLr7xsvN//f39P/9+/T/6uTL/+LZv//Cq5//vZ6S/8GDYf/Jh1r/9b5k //vEY//0sVL/9K9P//6zT//6sE//2JRP/8yQV/+kkYP/kIV/7z9BQYksLzBqBgYGFAAAAAUDBAUQDxAR KlRZWsdscXPktbu8/MjOz//39/n//Pv6/+ro2P/j3c3/xamm/8CcmP/CgWj/yYVg//K9Zf/4xGP/+LdW //i1U//+s07/+q9O/9WVVP/JkFz/n4+B/4qCfO05OzuAJioqYQUFBREAAAAEBQUFERESEi1bX2HWc3h6 87e8wv7JzdT/7PHz//P3+f/3+/n/9/Hu//evsv/yo6X/25mT/9qci//ntmz/7Ltm//zGYP/+xF3/+rJL //SsTP/OmWT/v5Rr/5CEfv96dXTpJigoYxYYGEQDAwMJAAAAAAYGBhQTExQwXGBi2nN4e/eyt77+wcfN /+Dm6//n7fH/8vb3//Xt7//7srT/96eo/9yioP/ZpJf/37Ju/+S3Z//8x2H//8Zd//mxS//yq0z/zZpp /76UcP+Jgnz+c3Fx5yMjI1wTFBQ9AgICCAAAAAALCwsgFxcYO2BhY+Nxc3b+jJSe/5Ocpv+gqrX/p7C7 /8XJz//Ny8//4Lu4/9+5tf/EvLv/v7iy/7ygeP/Dom3/98Jh//7DXf/3q0v/8KVP/8efff+3mYL+fHd2 8mVlZ9kYGhpNCgwMLwEBAQYAAAAADAwMIBcXFzlYWVvSZmhr63uCiu+AiJHwiZOd9JCao/aws7r4uLe8 +cyyrfvMsaz7tLW1/rCxrf6tlXb/tpdr//O9YP/8v1z/9ahK/+2jT//Bm3z/sJSA/XRxcexeX2LSFRYW RwgJCSoBAQEFAAAAAAgICBcMDAwjJSUmZCoqK3M1NjaHOTo6j0ZISa5LTU+2XV1dzGFhYdJqamvgbG1u 5WtxdvNscXT2dW5i/oV1Xf/bo1T/66lS/++hTP/km0//oH9l/4t2ZvlVVlbSREhKtxARETUHBwccAQEB BAAAAAAHBwcTCgoKGxkZGUkdHR1UJCQjaCgoJ3A1NTWROjo6mkZGRrBJSUq3UVZWyFJYWc1XXGLdWV1h 4mFeVu1yZlPxzpVN+t+dTPvqmkr/35RM/5J0Xfp9aV3yS0xLxDs/QKgPDxAvBwcHGAAAAAMAAAAAAQEB AgEBAQMEBAQKBAQECwUFBQ8HBwcTDg4OJRERESsXFxc5GBgYPRwdHUodHh5PIiIjYCMjJGkmJCGONSwi nY1ZLNOjZS/g0Hw49Md4OvNlTjzbT0M6yy0sLYYjJCZtBwgIGQMDAwoAAAABAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAQEBAggICBIJCQkWDg4OIA8PDyQQEBAvERERMxcXF0MYGBdMGBcWcSYfGIJ5SiLCj1Um 0cRzMu28cDTrVkAwxEA2LrIkIyRvHBweWQYHBxMDAwMHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAABAQECAQEBAgEBAQQBAQEEAgICBwICAggDAwMIAwMDDAMDAyIMBwQxQCMKeFMuDo6VUh7Ijk8e wCQYEFkSDg1CCQgIHgcHBxYBAQEEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAATBwMAITMaB2ZEIwp8hEgYun5FGLEaEApBCQcH KgUEBA8EBAQKAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgMBABAcDQJKJhIDXEwnC4tJJguDCwYBIAEBAA4AAAADAAAA AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAMDAQAMGAoBRSEOAlZDIgmDQCEJewkEARsAAAAKAAAAAQAAAAAAAAAAAAAA AAAAAAAAAAAAABEBAAADAAAAAQAcAAABAQADAAAAAQAcAAABAgADAAAABAAADSoBAwADAAAAAQABAAAB BgADAAAAAQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAEAAABFgADAAAAAQAcAAAB FwAEAAAAAQAADEABGgAFAAAAAQAADRoBGwAFAAAAAQAADSIBHAADAAAAAQABAAABKAADAAAAAQACAAAB UgADAAAAAQABAAABUwADAAAABAAADTKHcwAHAAAPNAAADToAAAAAAAAAkAAAAAEAAACQAAAAAQAIAAgA CAAIAAEAAQABAAEAAA80YXBwbAIQAABtbnRyUkdCIFhZWiAH3wAMAAUADQASAAhhY3NwQVBQTAAAAABB UFBMAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAABFkZXNjAAABUAAAAGJkc2NtAAABtAAABBpjcHJ0AAAF0AAAACN3 dHB0AAAF9AAAABRyWFlaAAAGCAAAABRnWFlaAAAGHAAAABRiWFlaAAAGMAAAABRyVFJDAAAGRAAACAxh YXJnAAAOUAAAACB2Y2d0AAAOcAAAADBuZGluAAAOoAAAAD5jaGFkAAAO4AAAACxtbW9kAAAPDAAAAChi VFJDAAAGRAAACAxnVFJDAAAGRAAACAxhYWJnAAAOUAAAACBhYWdnAAAOUAAAACBkZXNjAAAAAAAAAAhE aXNwbGF5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAAAAAiAAAADGhySFIAAAAUAAABqGtvS1IA AAAMAAABvG5iTk8AAAASAAAByGlkAAAAAAASAAAB2mh1SFUAAAAUAAAB7GNzQ1oAAAAWAAACAGRhREsA AAAcAAACFnVrVUEAAAAcAAACMmFyAAAAAAAUAAACTml0SVQAAAAUAAACYnJvUk8AAAASAAACdm5sTkwA AAAWAAACiGhlSUwAAAAWAAACnmVzRVMAAAASAAACdmZpRkkAAAAQAAACtHpoVFcAAAAMAAACxHZpVk4A AAAOAAAC0HNrU0sAAAAWAAAC3npoQ04AAAAMAAACxHJ1UlUAAAAkAAAC9GZyRlIAAAAWAAADGG1zAAAA AAASAAADLmNhRVMAAAAYAAADQHRoVEgAAAAMAAADWGVzWEwAAAASAAACdmRlREUAAAAQAAADZGVuVVMA AAASAAADdHB0QlIAAAAYAAADhnBsUEwAAAASAAADnmVsR1IAAAAiAAADsHN2U0UAAAAQAAAD0nRyVFIA AAAUAAAD4mphSlAAAAAOAAAD9nB0UFQAAAAWAAAEBABMAEMARAAgAHUAIABiAG8AagBpzuy37AAgAEwA QwBEAEYAYQByAGcAZQAtAEwAQwBEAEwAQwBEACAAVwBhAHIAbgBhAFMAegDtAG4AZQBzACAATABDAEQA QgBhAHIAZQB2AG4A/QAgAEwAQwBEAEwAQwBEAC0AZgBhAHIAdgBlAHMAawDmAHIAbQQaBD4EOwRMBD4E QAQ+BDIEOAQ5ACAATABDAEQgDwBMAEMARAAgBkUGRAZIBkYGKQBMAEMARAAgAGMAbwBsAG8AcgBpAEwA QwBEACAAYwBvAGwAbwByAEsAbABlAHUAcgBlAG4ALQBMAEMARCAPAEwAQwBEACAF5gXRBeIF1QXgBdkA VgDkAHIAaQAtAEwAQwBEX2mCcgAgAEwAQwBEAEwAQwBEACAATQDgAHUARgBhAHIAZQBiAG4A6QAgAEwA QwBEBCYEMgQ1BEIEPQQ+BDkAIAQWBBoALQQ0BDgEQQQ/BDsENQQ5AEwAQwBEACAAYwBvAHUAbABlAHUA cgBXAGEAcgBuAGEAIABMAEMARABMAEMARAAgAGUAbgAgAGMAbwBsAG8AcgBMAEMARAAgDioONQBGAGEA cgBiAC0ATABDAEQAQwBvAGwAbwByACAATABDAEQATABDAEQAIABDAG8AbABvAHIAaQBkAG8ASwBvAGwA bwByACAATABDAEQDiAOzA8cDwQPJA7wDtwAgA78DuAPMA70DtwAgAEwAQwBEAEYA5AByAGcALQBMAEMA RABSAGUAbgBrAGwAaQAgAEwAQwBEMKsw6TD8ACAATABDAEQATABDAEQAIABhACAAQwBvAHIAZQBzAAB0 ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBJbmMuLCAyMDE1AABYWVogAAAAAAAA8xYAAQAAAAEWylhZWiAA AAAAAABxwAAAOYoAAAFnWFlaIAAAAAAAAGEjAAC55gAAE/ZYWVogAAAAAAAAI/IAAAyQAAC90GN1cnYA AAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANgA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwA gQCGAIsAkACVAJoAnwCjAKgArQCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkB HwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB +gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYD IQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwE mgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkG agZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIII lgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsL Igs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgO Ew4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8R bRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIV NBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZ axmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHewe Fh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwoj OCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo 1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu 7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01 hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8 pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANE R0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpM cky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtV KFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpe bF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+lo P2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwckty pnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9 oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6J M4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSV X5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobai JqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxav i7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9 j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bM Ncy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvb gNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXr cOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8 B/yY/Sn9uv5L/tz/bf//cGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACg52Y2d0AAAAAAAAAAEA AQAAAAAAAAABAAAAAQAAAAAAAAABAAAAAQAAAAAAAAABAABuZGluAAAAAAAAADYAAKdAAABVgAAATMAA AJ7AAAAlgAAADMAAAFAAAABUQAACMzMAAjMzAAIzMwAAAAAAAAAAc2YzMgAAAAAAAQxyAAAF+P//8x0A AAe6AAD9cv//+53///2kAAAD2QAAwHFtbW9kAAAAAAAABhAAAKAOAAAAAMnOfBgAAAAAAAAAAAAAAAAA AAAA0iUmJyhaJGNsYXNzbmFtZVgkY2xhc3Nlc18QEE5TQml0bWFwSW1hZ2VSZXCjJykqWk5TSW1hZ2VS ZXBYTlNPYmplY3TSJSYsLVdOU0FycmF5oiwq0iUmLzBeTlNNdXRhYmxlQXJyYXmjLywq0zIzCjQ1NldO U1doaXRlXE5TQ29sb3JTcGFjZUQwIDAAEAOADNIlJjg5V05TQ29sb3KiOCrSJSY7PFdOU0ltYWdlojsq XxAPTlNLZXllZEFyY2hpdmVy0T9AVHJvb3SAAQAIABEAGgAjAC0AMgA3AEYATABXAF4AZQByAHkAgQCD AIUAigCMAI4AlwCcAKcAqQCrAK0AsgC1ALcAuQC7AL0AwgDZANsA3R1PHVQdXx1oHXsdfx2KHZMdmB2g HaMdqB23Hbsdwh3KHdcd3B3eHeAd5R3tHfAd9R39HgAeEh4VHhoAAAAAAAACAQAAAAAAAABBAAAAAAAA AAAAAAAAAAAeHA transmission-2.92/macosx/PaxHeaders.4960/InfoTrackersView.xib0000644000000000000000000000013012664476420021112 xustar0029 mtime=1456635152.11449855 29 atime=1456635152.11449855 30 ctime=1457295922.446849513 transmission-2.92/macosx/InfoTrackersView.xib0000644000175000017500000001710612664476420022546 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/Makefile.am0000644000000000000000000000013212442116650017205 xustar0030 mtime=1418239400.334863572 30 atime=1418239400.334863572 30 ctime=1457295922.395848645 transmission-2.92/macosx/Makefile.am0000644000175000017500000001232112442116650020631 0ustar00mikedldmikedld00000000000000EXTRA_DIST = \ Credits.rtf \ AboutWindow.xib \ BlocklistStatusWindow.xib \ FileRenameSheetController.xib \ FilterBar.xib \ InfoFileView.xib \ InfoPeersView.xib \ InfoTrackersView.xib \ InfoWindow.xib \ MessageWindow.xib \ StatsWindow.xib \ StatusBar.xib \ URLSheetWindow.xib \ Defaults.plist \ Info.plist \ Transmission_Prefix.pch \ Growl.framework \ Sparkle.framework \ sparkle_dsa_pub.pem \ TransmissionHelp \ QuickLookPlugin \ VDKQueue \ Images \ da.lproj \ de.lproj \ en.lproj \ es.lproj \ fr.lproj \ it.lproj \ nl.lproj \ pt_PT.lproj \ ru.lproj \ tr.lproj \ AboutWindowController.h \ AboutWindowController.m \ AddMagnetWindowController.h \ AddMagnetWindowController.m \ AddWindowController.h \ AddWindowController.m \ Badger.h \ Badger.m \ BadgeView.h \ BadgeView.m \ BlocklistDownloader.h \ BlocklistDownloader.m \ BlocklistDownloaderViewController.h \ BlocklistDownloaderViewController.m \ BlocklistScheduler.h \ BlocklistScheduler.m \ BonjourController.h \ BonjourController.m \ ButtonToolbarItem.h \ ButtonToolbarItem.m \ ColorTextField.h \ ColorTextField.m \ Controller.h \ Controller.m \ CreatorWindowController.h \ CreatorWindowController.m \ DragOverlayView.h \ DragOverlayView.m \ DragOverlayWindow.h \ DragOverlayWindow.m \ ExpandedPathToIconTransformer.h \ ExpandedPathToIconTransformer.m \ ExpandedPathToPathTransformer.h \ ExpandedPathToPathTransformer.m \ FileRenameSheetController.h \ FileRenameSheetController.m \ FileListNode.h \ FileListNode.m \ FileNameCell.h \ FileNameCell.m \ FileOutlineController.h \ FileOutlineController.m \ FileOutlineView.h \ FileOutlineView.m \ FilePriorityCell.h \ FilePriorityCell.m \ FilterBarController.h \ FilterBarController.m \ FilterBarView.h \ FilterBarView.m \ FilterButton.h \ FilterButton.m \ GlobalOptionsPopoverViewController.h \ GlobalOptionsPopoverViewController.m \ GroupsController.h \ GroupsController.m \ GroupsPrefsController.h \ GroupsPrefsController.m \ GroupToolbarItem.h \ GroupToolbarItem.m \ InfoTabButtonBack.h \ InfoTabButtonBack.m \ InfoTabButtonCell.h \ InfoTabButtonCell.m \ InfoTextField.h \ InfoTextField.m \ InfoActivityViewController.h \ InfoActivityViewController.m \ InfoFileViewController.h \ InfoFileViewController.m \ InfoGeneralViewController.h \ InfoGeneralViewController.m \ InfoOptionsViewController.h \ InfoOptionsViewController.m \ InfoPeersViewController.h \ InfoPeersViewController.m \ InfoTrackersViewController.h \ InfoTrackersViewController.m \ InfoViewController.h \ InfoWindowController.h \ InfoWindowController.m \ main.m \ MessageWindowController.h \ MessageWindowController.m \ NSApplicationAdditions.h \ NSApplicationAdditions.m \ NSImageAdditions.h \ NSImageAdditions.m \ NSMutableArrayAdditions.h \ NSMutableArrayAdditions.m \ NSStringAdditions.h \ NSStringAdditions.m \ PeerProgressIndicatorCell.h \ PeerProgressIndicatorCell.m \ PeerTableView.h \ PeerTableView.m \ PiecesView.h \ PiecesView.m \ PortChecker.h \ PortChecker.m \ PredicateEditorRowTemplateAny.h \ PredicateEditorRowTemplateAny.m \ PrefsController.h \ PrefsController.m \ PrefsWindow.h \ PrefsWindow.m \ ProgressGradients.h \ ProgressGradients.m \ ShareToolbarItem.h \ ShareToolbarItem.m \ ShareTorrentFileHelper.h \ ShareTorrentFileHelper.m \ StatsWindowController.h \ StatsWindowController.m \ StatusBarController.h \ StatusBarController.m \ StatusBarView.h \ StatusBarView.m \ ToolbarSegmentedCell.h \ ToolbarSegmentedCell.m \ TorrentCell.h \ TorrentCell.m \ TorrentGroup.h \ TorrentGroup.m \ Torrent.h \ Torrent.m \ TorrentTableView.h \ TorrentTableView.m \ TrackerCell.h \ TrackerCell.m \ TrackerNode.h \ TrackerNode.m \ TrackerTableView.h \ TrackerTableView.m \ URLSheetWindowController.h \ URLSheetWindowController.m \ WebSeedTableView.h \ WebSeedTableView.m dist-hook: rm -rf `find $(distdir)/ -type d -name .svn` rm -rf `find $(distdir)/ -type d -name .deps` if BUILD_MAC # Use Xcode do make the actual build all: @(cd .. && xcodebuild -alltargets -activeconfiguration | grep -v "^$$") clean-local: @(cd .. && xcodebuild -alltargets -activeconfiguration clean | grep -v "^$$") endif define PACKAGE_RULE1 $(RM) tmp "Transmission $(VERSION_PACKAGE)" \ Transmission-$(VERSION_PACKAGE).dmg mkdir -p tmp cp -R macosx/Transmission.app tmp/ endef define PACKAGE_RULE2 mv tmp "Transmission $(VERSION_PACKAGE)" hdiutil create -format UDZO -imagekey zlib-level=9 -srcfolder \ "Transmission $(VERSION_PACKAGE)" Transmission-$(VERSION_PACKAGE).dmg rm -rf "Transmission $(VERSION_PACKAGE)" endef package: $(PACKAGE_RULE1) $(PACKAGE_RULE2) package-release: $(PACKAGE_RULE1) strip -S tmp/Transmission.app/Contents/MacOS/Transmission $(PACKAGE_RULE2) transmission-2.92/macosx/PaxHeaders.4960/ToolbarSegmentedCell.h0000644000000000000000000000013212442116672021364 xustar0030 mtime=1418239418.291171283 30 atime=1418239418.291171283 30 ctime=1457295923.548868252 transmission-2.92/macosx/ToolbarSegmentedCell.h0000644000175000017500000000266112442116672023016 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: ToolbarSegmentedCell.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface ToolbarSegmentedCell : NSSegmentedCell @end transmission-2.92/macosx/PaxHeaders.4960/Sparkle.framework0000644000000000000000000000013212442116661020473 xustar0030 mtime=1418239409.751024934 30 atime=1418239400.856872517 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/0000755000175000017500000000000012442116661022175 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/PaxHeaders.4960/Sparkle0000644000000000000000000000013212442116654022076 xustar0030 mtime=1418239404.008926534 30 atime=1418239404.007926516 30 ctime=1457295922.540851111 transmission-2.92/macosx/Sparkle.framework/Sparkle0000755000175000017500000163260012442116654023536 0ustar00mikedldmikedld00000000000000Êþº¾ýÐ Œ 0€ þíúÎ p…Œ__TEXT@@__text__TEXTôÚ@ô€__picsymbolstub1__TEXTî4€î4€ __cstring__TEXTö´H»ö´__literal8__TEXT?pp?p__literal4__TEXT?à?à__DATA@ @ __data__DATA@¤@__dyld__DATAD¤D¤__la_symbol_ptr__DATAD¬D¬D__nl_symbol_ptr__DATAE¼ÈE¼ˆ__cfstring__DATAF„ àF„__const__DATATdTd__bss__DATAT€ð__OBJC`0`0__message_refs__OBJC`Ø`__cls_refs__OBJCfØäfØ__class__OBJCg¼àg¼__meta_class__OBJClœàlœ__cls_meth__OBJCq|pq|__inst_meth__OBJCrì rì__instance_vars__OBJC~|”~|__module_info__OBJC‚À‚__symbols__OBJCƒÐ̃Ð__cat_cls_meth__OBJC…œ”…œ__category__OBJC†0Œ†0__cat_inst_meth__OBJC†¼†¼__protocol__OBJC‡Ð‡Ð__image_info__OBJC‡ä‡ä8__LINKEDITmÐmÐ X@loader_path/../Frameworks/Sparkle.framework/Versions/A/Sparkle\Ý3f,ªÁîPh{ñÑÍ8Ò`Æë Ä PGGåˆGçÀçôÆâ ºÛ¨ßL 8  /usr/lib/libcrypto.0.9.7.dylib \y’/System/Library/Frameworks/Security.framework/Versions/A/Security X /System/Library/Frameworks/WebKit.framework/Versions/A/WebKit T/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit `¥ ,/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation Xµ-/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 4/usr/lib/libgcc_s.1.dylib 4o/usr/lib/libSystem.B.dylib d /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices 4ã/usr/lib/libobjc.A.dylib hÜ–/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation p"/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices|¦BŸ}ˆ¦|¦}€cx=ŒŒ0¨}‰¦| x=ŒŒ,N€ |¦¿ÿð<Œ||xì8BR€|»+x€—Jà}Ÿcx”!ÿ€€a88a8ß<€–JØ€cQàKþÿ€—JàKþÿ||xz?DH>߀˜JÌ?¿eÛx€yQ䃽JìKþÿÅóx|fx¤ëxƒãxKþÿ<€–JØ€cQÜKþÿ<ŸeÛx€„JðKþÿ<Ÿ~ Ãóx€„JôKþÿ<Ÿ<¿<_€„JüÃóx€¥Jø8ÀÈ"*4Kþÿ8!€Ãóx€ºÁÿØ|¦N€ |¦¿ÿð<Œ||x߀™B|?¿?€xH;½(T>ÿKþÿ<_€–B€€B'„|zx£ëxƒ›B„€¢Kþÿ!¤8à|fxÅóxCÓx„ãxKþÿ€™B|€xHKþÿ<_€–B€€B'|||x£ëxƒ{B„€¢Kþÿ8!p!¤€|fxdÛxƒãxÅóx8àºÁÿØ|¦Kþÿ8!p€ºÁÿØ|¦N€ |¦¾ÁÿØ}Ÿcx8”!ü€a˜ÿ?>߀˜A(??Ÿ€wG<;œ'Kþÿ<_€–A,€B&0|}xƒãxƒ[A8ƒ!˜€¢KþÿDÓx%Ëx|fx£ëxKþÿ€˜A(€wGÌKþÿ<Ÿ€Ý?0€„?¬Åóx8àKþÿ<Ÿ<_€„>ôÃóx8À€½?0È" }Ÿcx|}x”!ÿ°Kþÿ<Ÿ<߀„?¥ëx8à€Æ>„Kþÿ8!P<Ÿ€£ëx»¡ÿô€„>€|¦Kþÿ|¦|½+x}Ÿcx”!ÿ°€Â€c Kþÿ/Až<<ŸÃóx€„>HKþÿ<_È ÿ@ž<_<ŸÃóx€„>¨È"8Kþÿ<ŸÃóx?¿€„=ÀKþÿ<Ÿ€Ý>$€„> Åóx8àKþÿ8!P<Ÿ€<_Ãóx€½>$8À»¡ÿô€„=èÈ"0|¦Kþÿ|¦<Œ¿Áÿø€„=t}Ÿcx|~x”!ÿ°Kþÿ<_ÈLÿAž0<_8!P<Ÿ€B"¸€€~ »Áÿø€„=Ø€¢|¦Kþÿ8!P8`€»Áÿø|¦N€ €c@ˆ>?>Ÿ>_>>¿?>ßKþÿ<Ÿ€„:à|wxÃóxKþÿ|yxHX€˜9¸8µ °ƒR:èƒ@Àƒq9ìKþÿ8¶ À€˜9¸|}xÃóxKþÿdÛx¦ëx|gx8³  ƒãxKþÿDÓx|ex~ã»xKþÿ€”:ä#ËxKþÿ|~y@‚ÿœ<Ÿ<_}ã{x€„:ì;B ÐKþÿ/ƒAž?ß;^ àH?ß<Ÿ}ã{xƒ°@À€„:´ƒ‘9ìKþÿ<Ÿ8¾ à€„:ð|{x~ã»xKþÿ<¿„ãx|hxfÛxGÓx£ëx8¥ ð?ŸKþÿ<Ÿ?¿€„:ô8 ƒœ@ƒ½:ÄKþÿ8!€|exƒãx¤ëx¹áÿ¼|¦Kþÿ8!}ã{x€¹áÿ¼|¦N€ |¦¿ÿè<Œ|~x xKþÿ|zxHÆ¡8ž8|}xCÓxHȱ/ƒ@žd€D@žX @; p@A‚LCÓxHÇ¥|xxH;}<Ÿ|9 x8„ÙücÛxHÈ¥/ƒAžì<ŸcÛx8„ÚHÈ/ƒA¾ÔCÓxHÈ݈]DÓx!£8 ;½T6¥ëx|Ð}!n;@ƒãxHȉ<Ÿ¥ëx8„ÚƒãxHÈU¥ëxdÛxƒãx?¿HÈA<Ÿ<€„4¤€c:tKþÿƒ½4¨|{xƒãxHÈ]…ãx|fx¤ëxcÛxKþÿ<Ÿ€„4¬|ex~ã»xKþÿ€!ËxTc>|cÐT}ÿ@¢H$€!ËxÃxHÆá|}y@‚þà; ÃxHÄMH; €!£ëx€ºáÿÜ|¦N€ |¦<Œ_€„2ü?¿>Ÿ>¿?>ß>ÿ??Kþÿ<Ÿ<¿€„3Æóx8¥;ÀKþÿ€’3ƒ½3|zx~c›xKþÿ|ex¤ëxCÓxKþÿ|}xH@€’3~c›x;~ƒ¶8ˆƒ—1´KþÿÇóx8¹|hxFÓx£ëx„ãx~ÛxKþÿ|}x€•2Ü€t8¬Kþÿ€˜3 ¥ëxKþÿ/ƒAž /žè@žÿ 8!€£ëx€ºAÿÈ|¦N€ |¦<Œ¾!ÿÄ€„14?¬}Ÿcx|@&|²+x|Å3x|×3x|ô;xA|qx?`ÿÿ”!þ`c{›Kþÿ€0ü||x~C“xKþÿ€0ü|vxƒãxKþÿ€0ü|yx~ã»xKþÿ8„|~xHÄÍ888`8€8 8Á8H½1ƒØAžÿè/ƒ@¾€Á;¡X<¿€á”8¥Ö´8€*£ëx;:¡ä.:a<~»«xHÄM=?~£«x8I#ü)#ü8€€Â8 p;@€~|›xbB €â‘!<‘aD@‘AH‘LáPÁTHÂ5=?=<_9)Ö¼9kÖÀ8BÖÄ’Á‘a‘!“!A4“¡8“Á<‘!ä“!è‘aô“Áø“!ü“Á H,A²€a88 fÛxKÿú!.|xx;Z;œ;{€œ/„@žÿÐA²<Ÿ~#‹x~å»x€„18Kþÿ8T 6T:³•H(A²€a88 †ãxKÿù½.|xx;½;œ€/„@žÿÔ€a8H»é@’<<Ÿ<¿€c6¬8¥L~F“x€„/Ø~ç»xKþÿ/”|exAžä<_=?<€B<Ÿ?Ÿ)ˆ?¿€„1<ƒb<_€B€€c6ăI€Âƒœ6ȃ½1@KþÿeÛxFÓx|gxƒãx¤ëxKþÿtH|/”;Ažp<_=?<€B<Ÿ?Ÿ)ˆ?¿<¿€„1<8¥\ƒB<_€B€€c6ăi€Âƒœ6ȃ½1@KþÿEÓxfÛx|gxƒãx¤ëxKþÿt8! Ãx€º!ÿÄa|¦}p N€ |¦¾ÿÐ?L?l|vx€z3t€›-¤}Ÿcx|Þ3x|¹+x|÷;x”!ÿ€Kþÿ<ŸÅóx€„-ÔKþÿ/ƒ@ž˜<<Ÿ<¿€c3P8¥Çóx€„,|&ËxÈóxKþÿ/—|exAž`<_=?<€B4<Ÿ?Ÿ)8?¿€„-àƒB<_€B$€c3hƒœ3l€Âƒ½-äƒiKþÿEÓx|gx¤ëxƒãxfÛxH`€›-¤?Ÿ€z3tKþÿ€œ-èÅóxKþÿ/ƒAž@€›-¤>Ÿ€z3tKþÿ€”-샜-è|}xÃóxKþÿ|ex„ãx£ëxKþÿ/ƒ@ž(<Ÿ~óx%Ëx€„-ðÆóx~ç»xKþÿ|`xH€<ŸÅóx~óx€„-ØKþÿ€›-¤|ux€z3tKþÿ<ŸÅóx€„-ô~¦«x~dzxKþÿ/ƒ@ž¨/—Až0<Ÿ<<_=?€B4<¿)8~§«x8¥ €„,|Æóx?_€c3P??Ÿ?¿ƒƒ)ƒZ3lƒ{-䃜3hƒ½-àKþÿ<_€B$|exƒãx¤ëx€ÂKþÿdÛxÃx|gx&ËxCÓxKþÿ8wH˜€›-¤€z3tKþÿ<Ÿ%Ëx€„-øÆóx~dzxKþÿ/ƒ@žœ/—Až`<Ÿ<<_=?€B4<¿)8&ËxÇóx€„,|8¥0?€c3P?_?Ÿ?¿ƒ"ƒ ƒ{3lƒZ-䃜3hƒ½-àKþÿ<_€B$|exƒãx¤ëx€ÂKþÿDÓx%Ëx|gxÃxcÛxKÿÿ0<Ÿ<8€„-ü??Ÿ€c3d?¿8Kþÿ<_€”-ì€B(|xx~£«xƒ{.ƒBKþÿ<Ÿ€„.|yx~£«xƒœ3ƒ½.Kþÿ|exƒãx¤ëxKþÿ<ÿdÛx|hxEÓxÃx&Ëx8ç 9!8Kþÿ/ƒ@¾<~¤«x8c@H¹ñ<Ÿ~óxÅóx€„-ÜKþÿ8H88!€|x€ºÿÐ|¦N€ ÿAh>?>}¶kxKþÿ€Ž&$<_aH€o+@ApKþÿ€Ž&$<_|ux€o+@A`Kþÿ<_ƒÁpAt<_|sxAx<_A|<_AT<_A€H<Ÿ€„&(Kþÿ€A`€‚%TKþÿ/ƒA¾´<Ÿ£ëx8 €„&,Kþÿ|}xH€Ap£ëx€‚&0Kþÿ|{yA‚d€At~£«xeÛx€‚$0Kþÿ||y@¢4€Ad€‚%P€Al€b+Kþÿ€A€fÛx||x~£«x…ãx€‚$LKþÿ€Axƒãx¥ëx€‚%`Kþÿ€A|£ëx€‚&4Kþÿ|}x/@žÿp<Ÿ~£«x€„&8Kþÿ|txHœ<Ÿ?¿EÓx€„$0~£«xƒ½&ÿ€„Ð????_?>ßKþÿ<Ÿ|~x<€„È€c"xKþÿ||xH4€™ø8¸PKþÿ€š¼Kþÿ€›Ø,@¢8v|exƒãxKþÿ€—ÔÃóxKþÿ/ƒ@žÿÀ<Ÿ<…ãx€„ü?_€c"ÀKþÿ€šô8 Kþÿ<Ÿ<_€„|~xƒãxÅóxƒbKþÿ/ƒ@ž <_;ÂÅóxƒãxdÛxKþÿ<ÿ`ÿÿ|exƒ@¾8 €šô£ëx8!p€ºÁÿØ|¦Kþÿ8!p€ºÁÿØ|¦N€ |¦¿¡ÿô|}x}Ÿcx|¾+x”!ÿ°€cƒ(Až$<Œ€„(Kþÿ<ŸÃóx€„(Kþÿ}8!P€»¡ÿô|¦N€ £ N€ |¦¿Áÿø<Œ€„È}Ÿcx”!ÿ°€cKþÿ8!P<Ÿ€»Áÿø€„P|¦Kþÿ|¦¿¡ÿô|}x}Ÿcx|¾+x”!ÿ°€cƒ(Až$<Œ€„„Kþÿ<ŸÃóx€„„Kþÿ}8!P€»¡ÿô|¦N€ |¦¿Áÿø<Œ€„,}Ÿcx”!ÿ°€cKþÿ8!P<Ÿ€»Áÿø€„´|¦Kþÿ|¦¿¡ÿô|}x}Ÿcx|¾+x”!ÿ°€cƒ(Až$<Œ€„èKþÿ<ŸÃóx€„èKþÿ}8!P€»¡ÿô|¦N€ |¦¿Áÿø<Œ€„}Ÿcx”!ÿ°€c Kþÿ8!P<Ÿ€»Áÿø€„|¦Kþÿ|¦¿¡ÿô|}x}Ÿcx|¾+x”!ÿ°€c ƒ(Až$<Œ€„LKþÿ<ŸÃóx€„LKþÿ} 8!P€»¡ÿô|¦N€ |¦¿Áÿø<Œ€„ô}Ÿcx”!ÿ°€cKþÿ8!P<Ÿ€»Áÿø€„||¦Kþÿ|¦¿¡ÿô|}x}Ÿcx|¾+x”!ÿ°€cƒ(Až$<Œ€„°Kþÿ<ŸÃóx€„°Kþÿ}8!P€»¡ÿô|¦N€ |¦¿Áÿø<Œ€„X}Ÿcx”!ÿ°€cKþÿ8!P<Ÿ€»Áÿø€„à|¦Kþÿ|¦¿¡ÿô|}x}Ÿcx|¾+x”!ÿ°€cƒ(Až$<Œ€„Kþÿ<ŸÃóx€„Kþÿ}8!P€»¡ÿô|¦N€ |¦¿Áÿø<Œ€„¼}Ÿcx”!ÿ°€c Kþÿ8!P<Ÿ€»Áÿø€„D|¦Kþÿ|¦¿¡ÿô|}x}Ÿcx|¾+x”!ÿ°€c ƒ(Až$<Œ€„xKþÿ<ŸÃóx€„xKþÿ} 8!P€»¡ÿô|¦N€ |¦¿Áÿø<Œ€„ }Ÿcx”!ÿ°€c$Kþÿ8!P<Ÿ€»Áÿø€„¨|¦Kþÿ|¦¿¡ÿô|}x}Ÿcx|¾+x”!ÿ°€c$ƒ(Až$<Œ€„ÜKþÿ<ŸÃóx€„ÜKþÿ}$8!P€»¡ÿô|¦N€ |¦¿Áÿø<Œ€„„}Ÿcx”!ÿ°€c(Kþÿ8!P<Ÿ€»Áÿø€„ |¦Kþÿ|¦¿¡ÿô|}x}Ÿcx|¾+x”!ÿ°€c(ƒ(Až$<Œ€„@Kþÿ<ŸÃóx€„@Kþÿ}(8!P€»¡ÿô|¦N€ |¦¿Áÿø<Œ€„è}Ÿcx”!ÿ°€cKþÿ8!P<Ÿ€»Áÿø€„p|¦Kþÿ|¦¿¡ÿô|}x}Ÿcx|¾+x”!ÿ°€cƒ(Až$<Œ€„¤Kþÿ<ŸÃóx€„¤Kþÿ}8!P€»¡ÿô|¦N€ |¦¿Áÿø<Œ€„L}Ÿcx”!ÿ°€cKþÿ8!P<Ÿ€»Áÿø€„Ô|¦Kþÿ|¦¿¡ÿô|}x}Ÿcx|¾+x”!ÿ°€cƒ(Až$<Œ€„Kþÿ<ŸÃóx€„Kþÿ}8!P€»¡ÿô|¦N€ |¦¾¡ÿÔß>¿€c¨Kþÿ<ŸÃx€„¸Kþÿ<¿~,8¥ü€Ãx€š˜ƒ½Kþÿ|ex¤ëxÃóxKþÿ?¿€š˜ƒ½<¿Ãx8¥ûÐKþÿ|ex¤ëxÃóxKþÿ?¿€š˜ƒ½<¿Ãx8¥üKþÿ|ex¤ëxÃóxKþÿ€š˜…ãx#Ëx?¿ƒ–pƒ½ ƒu¤Kþÿ<Ÿ€„Ô8 KþÿdÛx|exƒãxKþÿ¤ëx?¿|exÃóxKþÿ€š˜<¿ƒ½8¥ü #ËxKþÿ|ex¤ëxÃóxKþÿ<Ÿ~å»x€„Ãóx?¿Kþÿ€š˜<¿ƒ½8¥ü°ÃxKþÿ|ex¤ëxÃóxKþÿ?¿€š˜ƒ½<¿Ãx8¥üÀKþÿ|ex¤ëxÃóxKþÿ€š˜<¿#Ëx8¥üÐKþÿ,A‚<Ÿ|exÃóx€„ H(<Ÿ?¿Ãóx€„$ƒ½ Kþÿ|ex¤ëxÃóxKþÿ<_€š˜;"üàÃx%ËxKþÿ/ƒAžD€š˜%Ëx?¿ƒ–pÃxƒu¤ƒ½(Kþÿ|exƒãxdÛxKþÿ¤ëx|exÃóxH|?¿Ãóx€,Kþÿ<Ÿ<¿€„08¥üðKþÿ/ƒAž@€,Ãóx?¿ƒ–pƒu¤ƒ½(Kþÿ|exƒãxdÛxKþÿ¤ëx|exÃóxH<ŸÃóx8 €„(Kþÿ8!€Ãóx€º¡ÿÔ|¦N€ 8 |¦<Œ¿¡ÿô€„ø}Ÿcx|}x”!ÿ Kþÿ<Ÿ£ëx€„ü8 Kþÿ<Ÿ£ëx€„8 Kþÿ<Ÿ£ëx€„ 8 Kþÿ<Ÿ£ëx€„8 Kþÿ<Ÿ£ëx€„8 Kþÿ<Ÿ£ëx€„ 8 Kþÿ<Ÿ£ëx€„8 Kþÿ<Ÿ£ëx€„8 Kþÿ<Ÿ£ëx€„8 Kþÿ<Ÿ€},€„¤Kþÿ<_<Ÿ8B €„Ü8a8€“¡80ü <Ÿ€„þ”Kþÿ8!P<Ÿ€Åóx€~H»Áÿø€„ýì|¦Kþÿ|¦¿¡ÿô|}x}Ÿcx|¾+x”!ÿ°€c<ƒ(Až$<Œ€„ú°Kþÿ<ŸÃóx€„û°Kþÿ}<8!P€»¡ÿô|¦N€ |¦BŸ|hx} Cx9@|Ȧ|¦}*Kx|x8@˜8cH(U@628@}*Kx|Kx˜8cH 8@9@9kˆ /€@žÿ4˜|hPN€ |¦¿¡ÿô|}x”!ÿ Hm|dx£ëx; H‡½|~yA‚`8888 8À8Hн/ƒAž8H‰q|}yA‚,€¡88€tH‰/ƒAž€a8Hˆ­£ëx; H‰!ÃóxH‡98!`£ëx€»¡ÿô|¦N€ ¾AÿÈ|Ó3y|¦}Ÿcx|²+x|þ;x”!ÿPA‚ /‡Až˜<ŒÌ€„ù´>¬>ÿ€cÿd???Kþÿ<Ÿ<_€„úô:‚âŒ|zx~…£xÃóxKþÿ<Ÿ€„ù¼Kþÿ|{xH8€™ü,€xÿpƒ·ùœƒ•ùÄKþÿ|ex¤ëxÃóxKþÿ„ãx|exCÓxKþÿ€–ùÀcÛxKþÿ|~y@‚ÿ¼<Ÿ~…£xCÓx€„ùÌ?ßKþÿ€žü0KþÿKÿþm|{yA‚È€žü0~c›xKþÿ|xxKÿýI<Ÿ|yx<€„ü4€cÿä~E“xKþÿ||yA‚<Ÿ;AH;À€„ü8Kþÿ<Ÿ€„ü<|}xƒãxKþÿEÓx|dx£ëxH‰5H‡ñ|dx8a8H‡%/ƒ@¾4DÓx8 8a8H‡-Ãx%Ëx8a8fÛxH‡™h~ ÀñcÛxH‡EH;À8!°Ãóx€ºAÿÈ|¦N€ |¦<Œ¿Aÿ耄úd}Ÿcx|¼+x?L?”!ÿ Kþÿ<Ÿ€„÷àKþÿ|}x€š÷ä£ëxKþÿ|~yA‚T€›úh…ãxKþÿ/ƒAžÿÜ<ŸÃóx€„öÀKþÿ<Ÿ…ãx€„úlKþÿ8!`<Ÿ€»Aÿ耄÷X|¦Kþÿ8!`€»Aÿè|¦N€ |¦<Œ¿aÿ쀄ö}Ÿcx?Œ?¬ƒœý |{x”!ÿ ƒ½ö8Kþÿ8!`€û€<¿|fx¤ëxƒãx8¥ÜŒ»aÿì|¦Kþÿ£N€ N€ |¦¿€˜ñp>ß>??>Ÿ?¿:AÿÈ:Í€›ñÌ€|ô¨Kþÿ€˜ñÐ|}x€yôüKþÿ€—ñÔ¦ëx€¶Kþÿ/ƒAž€a¸€•ñÈKþÿ/ƒAžÿ¸8! €ºAÿÈ|¦N€ €cN€ |¦¿¡ÿô|}x}Ÿcx|¾+x”!ÿ°€cƒ(Až$<Œ€„ê Kþÿ<ŸÃóx€„ê$Kþÿ}8!P€»¡ÿô|¦N€ €cN€ |¦¿¡ÿô|}x}Ÿcx|¾+x”!ÿ°€cƒ(Až$<Œ€„é¼Kþÿ<ŸÃóx€„éÀKþÿ}8!P€»¡ÿô|¦N€ €c N€ |¦¿¡ÿô|}x}Ÿcx|¾+x”!ÿ°€c ƒ(Až$<Œ€„éXKþÿ<ŸÃóx€„é\Kþÿ} 8!P€»¡ÿô|¦N€ €cN€ |¦¿¡ÿô|}x}Ÿcx|¾+x”!ÿ°€cƒ(Až$<Œ€„èôKþÿ<ŸÃóx€„èøKþÿ}8!P€»¡ÿô|¦N€ ˆc|ctN€ ˜£N€ €cN€ £N€ |¦<Œ¿ÿð€„ì}Ÿcx||x?¬|£+x”!ÿ°ƒ½ìŸ;`=ÿ>>¿:À>?>_Kþÿ<Ÿ€„éðKþÿ<Ÿ€„ç4Kþÿ€”êä|ex|zx~c›xKþÿ€žê<|}xÃxKþÿ:ãÿÿH´€•êèeÛx8ÀÃx’Á<“a8Kþÿ€”êä|~x~c›xÅóxKþÿ||x@ž /@žT€‘最oíœKþÿ€’êìEÓxKþÿ€çÄ|ex|}x#ËxKþÿ<Ÿ£ëx€„æ¨Kþÿ<ŸÅóx€„êðCÓxH<ŸÅóxCÓx€„êôKþÿ;{ãx›¸@ÿL<Ÿ€oíœEÓx€„êøƒ°çÄKþÿ|ex¤ëx#ËxKþÿ8! #Ëx€¹áÿ¼|¦N€ |¦¾¡ÿÔ?¬€é@}Ÿcx|Ü3x|vx>¿”!ÿKþÿ€é@…ãx|wx~óxKþÿ€•åü|xx~ã»xKþÿ€•åü|}xÃxKþÿ@@œ€•åü~ã»xH €•åüÃxKþÿ;@|yxH˜?¿EÓx~ã»x€ç$Kþÿ€ç$EÓx|~x?¿ÃxKþÿ€é(Åóx|{x~óxKþÿ€é(eÛx||x~óxKþÿœ@žp/œ@¾@?ŸÃóx€œéDKþÿ€œéD|}xcÛxKþÿAAœT;Z™ÐAÿhHL/œ@žÿì<ŸÃóxeÛx€„éHKþÿ,A‚ÿÐHÜ/œAž/ƒA¾È/œA¾À8`ÿÿH¼€•åü~ã»xKþÿ€•åü|}xÃxKþÿ8`Až”€•åü~ã»xKþÿ€•åü|}xÃxKþÿ@@(<Ÿ%Ëx~ã»x€„ç$;Àÿÿ; Kþÿ|exH$<Ÿ%ËxÃx€„ç$;À; ÿÿKþÿ|ex<Ÿ~óx€„é(Kþÿ/ƒÃóxAž£ëxH8`8!p€º¡ÿÔ|¦N€ |¦¿Áÿø?Ì}Ÿcx€×”!ÿ°/€@¾$<Œ€„â Kþÿ<Ÿ€„â¨Kþÿ~×|`x8!P|x€»Áÿø|¦N€ |¦<Œ¿ÿð€„â@?Œ?¬ƒœéT}Ÿcx”!ÿ°ƒ½æ°Kþÿ|ex¤ëxƒãxKþÿ<Ÿ<¿€„æ´<ß8¥Í´8ÆÍÄKþÿ<Ÿ|}x<€„âD€cé\Kþÿ<Ÿ¥ëx€„æ¸Kþÿ8!P<Ÿ€»ÿð€„âÜ|¦Kþÿ|¦<Œ¾ÿÀ€„æ}Ÿcx>l|°+x>Ÿ”!ÿpKþÿ<Ÿ|qx<€„â¼€cèlKþÿ€”å¤<¿|~x€sèp<ß<ÿ=8¥È”8çȤ8ÆÍ49ÍD9 Kþÿ<Ÿ8 |ux<€„æ €cè¨8¡8_€cè¤Kþÿ€’áœ|yx~#‹x%ËxKþÿ|hy@¢(Ëx€”å¤?Ÿ?¿€sèp<¿<߃œè¼'Ëx9 ƒ½æ$?8¥Î„8ÆÎ”ƒ{âÌKþÿ~¦«x|ex¤ëxƒãxKþÿdÛx|exÃóxKþÿH>_/šAžCÓxHo¥H>_<~å»x888c¦D8À8àHr¡/ƒ@¾œ?_?€¡8€›æ(???Ÿ€zèh?¿ƒ9ẫœè¼ƒ½æ$ƒèp‚ôå¤Kþÿ|vx€›æ(€¡8€zèhKþÿ<¿<ß|hx~ä»x8¥Î¤8ÆÎ´~dzx9 ÃxKþÿ¤ëx~¦«x|exƒãxKþÿ$Ëx|exÃóxKþÿ<Ÿ<€„æ4€céKþÿ€’áœ<¿8¥ÎÄKþÿ|vyA‚¬<Ÿ€„âÀKþÿ/ƒA¾˜?8 ~óx€˜ãè??Ÿ?¿ƒ{ẫœè¼ƒ½æ$ƒSèpƒ4å¤Kþÿ8 €˜ãè|wx~óxKþÿ<¿<ß|hx~ç»x9 $Ëx8¥ÎÔ8ÆÎäCÓxKþÿ¤ëx~¦«x|exƒãxKþÿdÛx|exÃóxKþÿ<Ÿ~ƒx€„ãœKþÿ|gyA‚d€”å¤?Ÿ?¿€sèp<¿<߃œè¼|è;x9 ƒ½æ$8¥Îô8ÆÏ?ƒ{âÌKþÿ~¦«x|ex¤ëxƒãxKþÿ|exdÛxÃóxKþÿ<Ÿ~ƒx€„äØKþÿ|gyA‚d€”å¤?Ÿ?¿€sèp<¿<߃œè¼|è;x9 ƒ½æ$8¥Ï8ÆÏ$?ƒ{âÌKþÿ~¦«x|ex¤ëxƒãxKþÿ|exdÛxÃóxKþÿ:Á@<`mc`clk~ijxHjÉ/ƒ@¾Ð?¿<Ÿ€¡@€„æ(?_?€}èh?ŸƒZẫ{較œæ$ƒ3èpƒå¤Kþÿ<@C0€@<Ÿ|wxAH<_ÈÁ0<_l€È"Á8Lƒ½èh€„âÜÉ¡H£ëxý­(ü-$Kþÿ<¿<ß|hxÃx8¥Ï48ÆÏD~ç»x9 #ËxKþÿ„ãx~¦«x|excÛxKþÿDÓx|exÃóxKþÿ<`ra~ijx`cmmHiå/ƒ@žœ?_?€¡@€›æ(???Ÿ€zèh?¿ƒ9ẫœè¼ƒ½æ$ƒèp‚ôå¤Kþÿ|vx€›æ(€¡@€zèhKþÿ<¿<ß|hx~ä»x8¥ÏT8ÆÏd~dzx9 ÃxKþÿ¤ëx~¦«x|exƒãxKþÿ$Ëx|exÃóxKþÿ8!Ãóx€ºÿÀ|¦N€ |¦Ì|px|Ã3x|×3x|í;x|±+x”!ÿp??¿=ß‘8‘!ì? }Cx”!ÿp|Þ3x|ó;x|º+xƒ½ÍŒ>¿Kþÿ€˜ÊEÓx||x€wÏ´Kþÿ<_€•É:¯ä~ųxKþÿ¤ëx…ãx|fxcÛxKþÿ/ƒ@¾Ì€™ËØÃóx?Ÿ?¿ƒœÏ¤ƒ½ÈÐKþÿ€˜ÊEÓx|{x€wÏ´Kþÿ€•É~ųxKþÿ<¿¤ëx|gxfÛxƒãx8¥·d?Ÿ?¿Kþÿ<_=?€B®ˆ|ex<Ÿ)®È<€„Ê4ƒB<_€B®x€cϼƒi€ÂƒœÏÀƒ½Ê8KþÿEÓxfÛx|gxƒãx¤ëxKþÿ8 a8H8<Ÿ?¿Ãóx€„È̃½ÍKþÿEÓx8á8|fx¤ëx~ƒ£xKþÿ|ex<Ÿ€á8~ƒ£x€„ÍxÆóx~h›xKþÿ8!€ºaÿÌ|¦N€ |¦¾ÁÿØ<Œ|vxÿ€„Å0???€cÊ?_??Ÿ?¿‚©‚‚‚÷ȃÊ$ƒ9ÄœƒZÊ ƒ{ĘƒœÊƒ½Ã4Kþÿ<Ÿ€„Å4<ÿ<¿<ß8竈8¥²88ƪXKþÿ<Ÿ€„Å|vxÃóxKþÿ¤ëx~ųx|fxƒãxKþÿ<_dÛx€B¨Ü|exCÓx€ÂKþÿ$Ëx~…£x|gx~¦«xÃxKþÿ~ä»x|ex~c›xH<<Ÿ<?€„Ã?¿€cÊKþÿ<Ÿ€„ÃKþÿ||xHQ<Ÿ€„ÃãxKþÿ<Ÿ~e›x€„ȃãxKþÿ<ŸÃóx€„ѽÃ4ƒ;ÊKþÿ<Ÿ€„Æ8|xxÃóxKþÿ<Ÿ<¿|zx<€„Å0€cÊ8¥«hKþÿ<Ÿ<¿€„Ãô8¥ªHKþÿ<¿GÓx|hx¤ëx8¥²HÃx#Ëx?¿Kþÿ<Ÿ8À€„È8 Kþÿ<Ÿƒ{Ê€„Ƥƒ½È Kþÿ8À|ex¤ëxcÛxKþÿ<Ÿ€„È$|exƒãxKþÿ<Ÿƒãx€„È(~å»xKþÿ8!€ºaÿÌ|¦N€ |¦¿ÿð?¬€Å„|~x}Ÿcx?Œ”!ÿ°€cKþÿ<Ÿ€¼Åˆ€„À˜Kþÿ/ƒAž$€Å„€~Kþÿ€œÅˆ€¾Kþÿ/ƒ@¾(8!P<<Ÿ€»ÿð€cÇÀ€„ÅŒ|¦Kþÿ8!P€»ÿð|¦N€ |¦<Œ¿Aÿ耄Äô}Ÿcx|»+x||x?¿”!ÿ Kþÿ<Ÿƒ½Ä¬|zx€„Âø€|Kþÿ<Ÿ€„ÂH||xcÛxKþÿ¤ëx…ãx|fxCÓxKþÿ8!` cÿÿ |`€»Aÿè|¦N€ |¦¿aÿì?l€›Â}Ÿcx|}x|£+x|¾+x”!ÿ Kþÿ/ƒAžl€›ÂÃóxKþÿ<Ÿ<¿€„Àœ8¥¦ˆKþÿ/ƒ@¾D<Ÿ€}?¿€„ÄlKþÿ€›Âƒ½Áˆ||xÃóxKþÿ|ex¤ëxƒãxKþÿ/ƒAž¤?¿Ãóx€ÄpKþÿ/ƒAž”€ÄpÃóxKþÿ<Ÿ<¿€„Àœ8¥¦ˆKþÿ/ƒ@žl<Ÿ<€„Äd€cƘKþÿ€Äp?¿|{xÃóxƒ½Ä Kþÿ<Ÿ||x<€„ô€cÆÿ€„¼ ???€cÁˆ?_??Ÿ?¿‚©‚‚‚÷¿„ƒÁ”ƒ9¼ ƒZÁƒ{¼ƒœÁxƒ½º¤Kþÿ<Ÿ€„¼¤<ÿ<¿<ß8ç¢ø8¥©È8Æ¡ÈKþÿ<Ÿ|vx€„¼p€~Kþÿ¤ëx~ųx|fxƒãxKþÿ<_dÛx€B L|exCÓx€ÂKþÿ$Ëx~…£x|gx~¦«xÃxKþÿ8!p~ä»x€|exÃóxºÿÐ|¦Kþÿ|¦¿!ÿä<Œ|zxŸ€„ºt>¿>ƒ´¿|;@>߃•¸¨???Kþÿ<Ÿ>ÿ|{x€„»°€rKþÿ<¿fÛx|gx„ãx8¥§ì£ëxKþÿ|{xHIU€“ºDeÛxKþÿ|~xHDHI=€•¸¨GÓx|}x€t¿|fÛxƒ“ºD8·§üKþÿ|ex„ãx£ëxKþÿ;º|~xºëx€™¹Ð€v¿ Kþÿ€˜ºÅóxKþÿ/ƒAž /šè@žÿœ€™¹Ð€v¿ Kþÿ<ŸÅóx€„½ð8ÀKþÿ/ƒ@ž°<Ÿ€r??€„½ô?_??Ÿ?¿Kþÿ<_=?)ž´<¿Æóx€Bž`8¥¨ €•¸¨€t¿|ƒ ‚âƒ9½ˆƒZ¿˜ƒ{ºƒœ¿”ƒ½º Kþÿ<_€BžP|exƒãx¤ëx€ÂKþÿdÛx~å»x|gxÃxCÓxKþÿ$Ëx|ex~C“xKþÿ€“ºD~%‹xÃóxKþÿ<Ÿ€„¸ŒKþÿ8!€<Ÿr|ex8À€r€º!ÿÄ€„ºT|¦Kþÿ|¦<Œ¿!ÿ䀄»”}Ÿcx|~x|£+x?Ÿ?”!ÿ Kþÿ<Ÿ€„¹\Kþÿ€œ»˜|zxKþÿ<_€›·|;¢¥¸¥ëxKþÿ/ƒAžl€œ»˜€~ Kþÿ€›·|¥ëxKþÿ/ƒA¾L?¿CÓx€¹Kþÿ/ƒA¾4€¹€~ Kþÿ/ƒA¾ ??€~€™»œKþÿ/ƒ@¾ Hì??<Ÿ€~?Ÿ€„» ?¿ƒœ½œƒ½»¤ƒ^Kþÿ|{x€™»œ€~Kþÿ¤ëxEÓx|gxfÛxƒãxKþÿ/ƒ@¾”<_=?<€B›ü<Ÿ?)œL?Ÿ<¿€„·¨?¿8¥¥Èƒ"<_€B›ì€c½0ƒI€Âƒ{½4ƒœ·¬ƒ½»$Kþÿ%Ëx|gxFÓxcÛx„ãxKþÿ8!`¤ëx€|exÃóx»!ÿä|¦Kþÿ8!`<ŸÃóx€»!ÿ䀄»¨|¦Kþÿ|¦¾aÿÌ}Ÿcx|~x|Ô3x”!ÿ€€/€Až <Œl€„µð??Ÿ€c»X?¿:ó›”Kþÿ<Ÿ<_€Bš|xx€„µà€~ƒ"ƒ{µüKþÿ<Ÿƒœ»|zx€„µô€~ƒ½µøKþÿ|ex¤ëxƒãxKþÿdÛx%Ëx|hxFÓxÃx~ç»x9 KþÿH>l<Ÿ<<_=?€Bš(<¿)šˆ8¥œ¤?€„¶l???_€c»T?Ÿ?¿‚É‚¢ƒ¹Pƒ9»`ƒZµØƒœ»\ƒ½¶tKþÿ<Ÿ€„¶p<¿<ÿ8Ó›”8¥¤8çœÄKþÿ<Ÿ<_€Bš|wx~ƒ£x€„¶„ƒbKþÿ<_¤ëx€Bš<|gx~å»xfÛxƒãx9 KþÿDÓx~¥«x|gx~Ƴx#ËxKþÿ8!€Ãx€|exÃóxºaÿÌ|¦Kþÿ|¦“áÿü<¬€¥¸|Ä3x<Ì8Æ¢P”!ÿ8aPHFù€P<`ÿ8!p`cÿÿƒáÿü|x C|b€|¦N€ |¦¿¡ÿô<Œ|~x쀙³|? Kþÿ€—®€¸´Kþÿ/ƒA¾¸<ŸÃóx?Ÿ€„®T?¿?ƒ½´ƒœµÐKþÿ<Ÿ€»´ €„´Kþÿ<Ÿ€„®hKþÿ¤ëx|exƒãxKþÿ<Ÿ€»´ €„´|}xKþÿ<ŸÅóx€„±Ô£ëxKþÿ8€™³|˜¢Ð€~Kþÿ€˜´§ëx€¾€ÞKþÿ/ƒA¾H?,>ì<ŸÃóx?¿€„´ Kþÿ<Ÿ<€„¯€cµ8Kþÿ<_<Ÿ€B” Æóx€„´$€¢Kþÿ€™³|€~Kþÿ€—®€½´(Kþÿ/ƒA¾€™³|€~Kþÿ€´(€¾Kþÿ€ /€Až0<Ÿ<€„¯¬€cµ|Kþÿ<Ÿ€¾ €„¯ÜKþÿ/ƒ@ž4<Ÿ<<_=?€B”<<¿)”œ8¥–¸>Ÿ€„°€>¿>ÿ€cµh?????Ÿ‚i‚BƒTµX‚÷³dƒµtƒ9¯ìƒ{µpƒœ°ˆ‚Õ®„Kþÿ<Ÿ€„°„<ÿ<¿<ß8ç–Ø8¥žh8Æ•¨Kþÿ<Ÿ|}x€„°P€~Kþÿ¥ëx~ijx|fxCÓxKþÿ<_€•®„€B”,|zx<¿€Þ 8¥žx€tµXƒ¢Kþÿ<_„ãx€B”P|gxEÓx¦ëx9 cÛxKþÿ$Ëx~E“x|gx~f›xÃxKþÿ~ä»x|exÃóxH<Ÿ€~?¿€„®€Kþÿ€™³||vx€~Kþÿ€—®€½´,Kþÿ/ƒA¾ €™³|€~Kþÿ€´,€¾Kþÿ|vx<Ÿ<?€„´0???_€cµÌ??Ÿ?¿ƒµ´ƒ9³XƒZµ$ƒ{²XƒœµXƒ½®„‚þ Kþÿ<Ÿ€„´4Kþÿ<¿¤ëx|fx8¥žˆƒãxKþÿdÛx~ųx|fx8àCÓxKþÿ$Ëx~å»x|fxÃxKþÿ<_<Ÿ€B”pÅóx€„´8€b8!€€ºAÿÈ|¦Kþÿ8!€€ºAÿÈ|¦N€ |¦¿aÿì<Œ|{xß>ÿ‚Ö¬¬?Ÿ‚÷« ?¿;œŒlKþÿ€š§H;½œ<¿†ãx§ëx8¥•ŒKþÿ€™§DeÛx|tx€x¬,Kþÿ€š§H<¿†ãx§ëx8¥•œKþÿ€™§DeÛx|ux€x¬,Kþÿ€š§H<¿†ãx§ëx8¥•¬Kþÿ<Ÿ||x€„§€~Kþÿ<Ÿ|}x€„¨L€~Kþÿ~ä»x~…£xa8~¦«x‰ãxªëx~óx8à9Kþÿ<Ÿ€„«$|exÃóxKþÿ8!€<Ÿ€ÃóxºÿЀ„«|¦Kþÿ|¦¿¡ÿô<Œ|}x€„¦Œ}Ÿcx”!ÿ°€c(Kþÿ<Ÿ¥ëx€„©„Kþÿ<Ÿ<€„¤@€cªhKþÿ<_8!P€B‰ <Ÿ<߀¥ëx8Æ”(€„©”»¡ÿô€â|¦Kþÿ|¦¾ÁÿØ<Œ|~x€„£}Ÿcx|Ý3x?Œ”!ÿ€c(Kþÿ8<_(8 ƒb‰H€~€œ£°€ÛKþÿ/AžX+Aœ/@¾hH<Ÿ<>ÿ€„£??_€cª”;Z‹h>ß?¿??Ÿ;{ŠX;œ‹ˆKþÿ<Ÿ€¾€„©KþÿEÓx~$|yx€˜¥0€wªƒ½©Kþÿ€–¥4<¿fÛx‡ãx8¥“¸Kþÿ<_9È"‚d|ex¤ëx#Ëx?¿Kþÿ€˜¥0EÓx€wªƒ½©$ƒ^$Kþÿ€–¥4<¿8¥“ÈfÛx‡ãxKþÿ<ÿ¤ëx€ç© |exÆóxCÓx9Kþÿ<Ÿ€~$€„©(ÅóxKþÿ<ŸÃóx€„¨lH<<Ÿ€~€„¥Œƒœ£°ƒ¾Kþÿ€Û|ex„ãx£ëxKþÿ<ŸÃóx€„¨ì8!p€ºÁÿØ|¦Kþÿ8!p€ºÁÿØ|¦N€ |¦¿ÿð<Œ€„§H?¬ƒ½¤Œ”!ÿ°ƒƒ$|Ã3xKþÿH3Y8!P¤ëx€ƒãx»ÿð|¦KþÿÌ€–¤´}Ÿcx?¬|~x|Ü3xƒ½¢>¿”!ÿƒc$cÛxKþÿ<C0“<8<_cÛxÈ~P¤ëxÉ¡8ý­(ü!h*Kþÿ€~$€•¤¸Kþÿ<_È}èÿ@Ì<Ÿ<<¿€„ ´8¥†ì??€c¥œ??Ÿƒ9¡ø?¿ƒ{¥Œƒœž¸‚þ$Kþÿ<Ÿ€„ ¸<¿<ß<ÿ8¥Ì8Æ…Ü8ç‡ Kþÿƒ]¤¼|xx€–¤´€~$KþÿDÓxÃóxKþÿƒ½¤¼|zx€•¤¸€~$Kþÿ¤ëxÃóxKþÿ„ãxÃx|gxFÓxcÛxKþÿ$Ëx|ex~ã»xH¤<Ÿ<<¿€„ ´8¥†ì?_€c¥œ??ŸƒZ¡ø?¿ƒ{¥Œƒœž¸ƒ$Kþÿ<Ÿ€„ ¸<ÿ<¿<ß8ç‡ 8¥Ü8Æ…ÜKþÿƒ½¤¼|yx€–¤´€~$Kþÿ¤ëxÃóxKþÿ„ãx%Ëx|fxcÛxKþÿDÓx|exÃx8!p€º¡ÿÔ|¦Kþÿ|¦¿Áÿø|~x}Ÿcx”!ÿ°€c/ƒAž<Œ€„¢Kþÿ8!P<ŸÃóx€»Áÿø€„¢p|¦Kþÿ|¦¿aÿì<Œ||x¬>ì?Œ|yxÛáÿø;œ‚Ô}Ÿcx>Ì?¬…ãx?_?;ZÄ;{‚ô”!ÿ€€—œœ€u¡„ƒ½ ˆƒ$Kþÿ€–œ <¿FÓxgÛx8¥‹äKþÿ<_9Ëâyà|ex¤ëxÃx?¿ü øKþÿü ø<Ÿ€y$€„žKþÿ<Ÿ€y$€„ ¨8 Kþÿ€—œœ…ãx€u¡„ƒ½ ƒ™$Kþÿ€–œ <¿FÓxgÛx8¥‹ôKþÿ<ÿ¤ëx€ç ¬|ex&Ëxƒãx9Kþÿ<_8!€€B€Œ<Ÿ8  €º¡ÿÌ€„ °€b|¦ËáÿøKþÿ<Œ€„žØKþÿ|¦¿aÿì<Œ||xì? ?¬|sx€˜š„;½€¼}Ÿcx>Ì?,”!ÿp?L|´+x€wŸl¥ëx?ƒ9Ÿì?Ÿ;{¬ƒZž`;œ€ÜKþÿ€–šˆ<¿fÛx‡ãx8¥‰üKþÿ€˜š„¥ëx|ux€wŸlKþÿ€–šˆ<¿‡ãxfÛx8¥Š Kþÿ<Ÿ€„šœ|}x~ƒ£xKþÿ¦ëxDÓx|ix~¥«x8à9#ËxKþÿ<Ÿ€„žd|ex~c›xKþÿ<_<Ÿ8B£4€„h~…£x€8a8’a8¿”!ÿp>ß?;{vÐ>Ÿ?¿?_?ŸKþÿ<Ÿ~å»x€„”€;ZuÀ;œvðKþÿ<Ÿy,€„‘tKþÿ<Ÿ€„‘Kþÿ€–˜eÛx€u•€ƒ½”„ƒ,Kþÿ€”œ<¿FÓx‡ãx8¥€PKþÿ<_9È"mÌ|ex¤ëxÃx?¿Kþÿ€–˜eÛx€u•€ƒ½”Œƒy,Kþÿ€”œ<¿8¥0FÓx‡ãxKþÿ<ÿ9€ç”Ä|ex&ËxcÛx¤ëxKþÿ<Ÿ€y,€„”%ËxKþÿ<_<Ÿ8Bš8€„$~e›x€8a8~æ»x“!8Ì? ??”!ÿ`?ŸKþÿ<Ÿ€„‰¨Kþÿ<Ÿƒ¶‹h|tx<€„x€c‘Kþÿ<Ÿ€„Kþÿ¤ëx|ex<8c{ Kþÿ€™Šô|~x€xÄKþÿ€œ‹$ÅóxKþÿ|}y@‚H€™Šô?_€xÄKþÿ€šÅóx8ÀKþÿ€™Šô€xÄKþÿ€œ‹$ÅóxKþÿ/ƒA¾>?>_€×€’ <ÿ=?€ql=_<¿<_8ç{À9){Ð8B{ð9J{àÈóx8¥{°A8>“¡?>_>€’ ?Ÿ?¿€ql<¿<ÿƒœüÆóx8¥| ƒ½Ž 8ç|09Kþÿ;s||fxeÛxƒãx¤ëxH €™Šô€xÄKþÿ<ŸÅóx€„‹„8ÀKþÿ8! <Ÿ€~ƒ£x¹¡ÿ´€„„|¦Kþÿ<Œ|ex€„ŒhKþÿ|¦¿¡ÿôì}Ÿcx|¾+x€w¨”!ÿp/€@¾˜¿>ß>ÿ?HHFÓx8€Åóx8a8H €˜‡tÅóx€w‡˜ƒµ‡Lƒ–‡pKþÿ8à|fx¤ëx#Ëx…ãxKþÿ8 8a88€`¥€fÛxH…|~y@‚ÿ CÓxH5<¿€•‡L€¥‡H#Ëx8À8àKþÿH4À&;`<Ÿ<¿#Ëx€„‡L8À8à€¥‡PKþÿØ A‚ cÛxH½<Ÿ~ƒ£x€„„¸Kþÿ€!€ºÿÐ|¦N€ <Œ<¬€„…x8¥rKþÿ<Œ<¬€„…d8¥rKþÿ<Œ<¬€„…P8¥r Kþÿ<Œ<¬€„…<8¥rKþÿ<Œ|ex€„…Kþÿ¿¡ÿô|½+y|¦}Ÿcx|~x”!ÿ @¢values.SUNoFeedURLYou must specify the URL of the appcast as the SUFeedURLKey in either the Info.plist or the user defaults!"'%@=%@keyvalue?&%@%@%@i20@0:4r*8@12i16c20@0:4@8@12^@16releaseFromQuarantine:removeXAttr:fromFile:options:copyPathWithAuthentication:overPath:error:_copyPathWithForcedAuthentication:toPath:error:_temporaryCopyNameForPath:currentUserOwnsPath:stringByAppendingPathComponent:enumeratorAtPath:fileAttributesAtPath:traverseLink:performFileOperation:source:destination:files:tag:arrayWithObject:lastPathComponentsharedWorkspacecopyPath:toPath:handler:movePath:toPath:handler:stringByDeletingLastPathComponentisWritableFileAtPath:errorWithDomain:code:userInfo:dictionaryWithObject:forKey:fileExistsAtPath:stringByAppendingPathExtension:pathExtensionstringByAppendingFormat:stringByDeletingPathExtensioninvertedSetformUnionWithCharacterSet:alphanumericCharacterSetisEqualToString:bundleWithPath:stringWithFileSystemRepresentation:length:defaultManagerfileSystemRepresentationMMExtendedAttributesSUPlainInstallerInternalsNSFileManagerNSMutableCharacterSetNSErrorNSDictionaryNSWorkspace.../CFBundleVersion.-()old (%@)%@ %d.%@/bin/rm/bin/mv/usr/sbin/chown%d:%d-rf-f-RAuthenticated file copy from %@ to %@ failed.Couldn't get permission to authenticate.Couldn't copy %@ over %@ because there is no file at %@.Couldn't move %@ to %@.Couldn't copy %@ to %@.Sparkle error: couldn't move %@ to the trash. This is often a sign of a permissions error.com.apple.quarantine@"NSArray"@"NSString"@20@0:4@8@12@16v16@0:4@8@12itemsuserAgentStringdownloadFilenamesetUserAgentString:bestNodeInNodes:reportError:download:willSendRequest:redirectResponse:download:didFailWithError:downloadDidFinish:download:didCreateDestination:download:decideDestinationWithSuggestedFilename:fetchAppcastFromURL:indexOfObject:containsObject:preferredLocalizationsFromArray:attributeForName:objectAtIndex:localizedDescriptionappcast:failedToLoadWithError:appcastDidFinishLoading:dictionaryWithObjectsAndKeys:localizedStringForKey:value:table:bundleWithIdentifier:sortUsingDescriptors:initWithKey:ascending:removeAllObjectsinitWithDictionary:whitespaceAndNewlineCharacterSetdateWithNaturalLanguageString:stringValueattributeskeyEnumeratornextSiblingnamechildAtIndex:childrendictionarynodesForXPath:error:removeFileAtPath:handler:initWithContentsOfURL:options:error:fileURLWithPath:setDestination:allowOverwrite:initWithRequest:delegate:setValue:forHTTPHeaderField:requestWithURL:cachePolicy:timeoutInterval:SUAppcastNSMutableURLRequestNSURLDownloadNSXMLDocumentSUAppcastItemNSSortDescriptorUser-Agent/rss/channel/itemenclosurepubDateSparkle Updater: Failed to parse appcast item with appcast dictionary %@!org.andymatuschak.SparkleAn error occurred while parsing the update feed.SparkleAn error occurred in retrieving update information. Please try again later.xml:lang@"NSDate"@"NSURL"@"NSDictionary"titleitemDescriptionreleaseNotesURLDSASignatureminimumSystemVersiontagfileURLversionStringdisplayVersionStringpropertiesDictionarysetTag:setMinimumSystemVersion:setDisplayVersionString:setVersionString:setFileURL:setDSASignature:setReleaseNotesURL:setItemDescription:setDate:setTitle:hasPrefix:lastObjectcomponentsSeparatedByString:sparkle:versionurl_sparkle:dsaSignaturesparkle:minimumSystemVersionsparkle:tagsparkle:shortVersionStringsparkle:releaseNotesLinkhttp://@"SUAppcastItem"@"WebView"@"NSTextField"@"NSProgressIndicator"cv28@0:4@8@12@16@20@24@16@0:4@8@12updateItemreleaseNotesViewreleaseNotesSpinnerwebViewFinishedLoadingwebView:contextMenuItemsForElement:defaultMenuItems:webView:decidePolicyForNavigationAction:request:frame:decisionListener:webView:didFinishLoadForFrame:descriptionTexttitleTextapplicationIconwindowShouldClose:awakeFromNiballowsAutomaticUpdatesshowsReleaseNotesdisplayReleaseNotesremindMeLater:skipThisVersion:installUpdate:endWithSelection:initWithAppcastItem:host:removeObjectIdenticalTo:mutableCopyuseignoreopenURL:URLdisplaysetHidden:parentFrameversiondisplayVersioniconcentersetFrame:display:setFrame:setShowsResizeIndicator:setLevel:windowboolValueloadRequest:loadHTMLString:baseURL:mainFrameisFileURLaddSubview:startAnimation:setStyle:initWithFrame:framesuperviewsetDefaultFontSize:systemFontSizeForControlSize:setStandardFontFamily:familyNamesystemFontOfSize:preferencessetPreferencesIdentifier:bundleIdentifierupdateAlert:finishedWithChoice:closesetPolicyDelegate:setFrameLoadDelegate:stopLoading:setShouldCascadeWindows:initWithHost:windowNibName:SUUpdateAlertSUWindowControllerNSFontNSProgressIndicatorNSURLRequestRelease notes with file:// URLs are not supported for security reasons—Javascript would be able to read files on your file system.A new version of %@ is available!%@ %@ is now available--you have %@. Would you like to download it now?d@"NSButton"v24@0:4@8@12:16c20v24@0:4@8d12@20progressValuemaxProgressValuestatusTextbuttonTitleactionButtonprogressBarsetStatusText:setMaxProgressValue:setProgressValue:setButtonEnabled:progressBarShouldAnimatesetButtonTitle:target:action:isDefault:beginActionWithTitle:maxProgressValue:statusText:windowTitleinitWithHost:setEnabled:setKeyEquivalent:setAction:setTarget:setFrameOrigin:setFrameSize:sizeToFitsetUsesThreadedAnimation:setFrameAutosaveName:SUStatusControllerSUStatusSUStatusFrameUpdating %@ c20@0:4@8@12@16validatePath:withEncodedDSASignature:withPublicDSAKey:lengthbytesdataWithContentsOfFile:UTF8StringwhitespaceCharacterSetSUDSAVerifierNSData SUSparkleErrorDomainSULastProfileSubmissionDateSUSendProfileInfoSUCheckAtStartupSUEnableAutomaticChecksSUEnableSystemProfilingSUAllowsAutomaticUpdatesSUAutomaticallyUpdateSUPublicDSAKeyFileSUPublicDSAKeySUExpectsDSASignatureSULastCheckTimeSUScheduledCheckIntervalSUSkippedVersionSUShowReleaseNotesSUFeedURLSUHasLaunchedBeforeSUTechnicalErrorInformationSUUpdaterWillRestartNotificationNamearchivePathunarchiverForPath:start_initWithPath:_canUnarchivePath:_unarchiverImplementationsSUUnarchiverdoNotInstall:installLater:installNow:initWithAppcastItem:host:delegate:automaticUpdateAlert:finishedWithChoice:SUAutomaticUpdateAlertA new version of %@ is ready to install!%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?i8@0:4v24@0:4@8@12@16@20@"NSTask"@"NSPipe"@"NSData"i@24@0:4@8@12@16@20taskDidTerminate:taskOutputAvailable:setResult:resultsetDone:donesetOutput:outputsetInputPipe:inputPipesetOutputPipe:outputPipesetTask:taskrun:directory:withArgs:input:mv_taskmv_outputPipemv_inputPipemv_outputmv_donemv_resulttask:directory:withArgs:input:terminationStatususerInforunMode:beforeDate:currentRunLoopdateWithTimeIntervalSinceNow:closeFilewriteData:fileHandleForWritinglaunchreadToEndOfFileInBackgroundAndNotifyForModes:arrayWithObjects:fileHandleForReadingsetArguments:setLaunchPath:setCurrentDirectoryPath:drainsetStandardOutput:setStandardInput:NotificationsNTSynchronousTaskPrivateNSTaskNSPipeNSAutoreleasePoolNSRunLoopi16@0:4@8@12i12@0:4@8defaultComparatorcompareVersion:toVersion:splitVersionString:typeOfCharacter:compare:intValuestringWithString:appendString:setString:initWithString:substringWithRange:substringToIndex:characterIsMember:characterAtIndex:decimalDigitCharacterSetSUStandardVersionComparatorSUVersionComparisonsharedSystemProfilersystemProfileArrayForHost:modelTranslationTablestandardUserDefaultsstringWithUTF8String:numberWithBool:numberWithInt:dictionaryWithObjects:forKeys:systemVersionStringinitWithContentsOfFile:pathForResource:ofType:bundleForClass:SUSystemProfilerNSUserDefaultsSUModelTranslationplistdisplayKeydisplayValueosVersionOS Versionhw.cputypeIntelPowerPCUnknowncputypeCPU Typehw.cpu64bit_capablehw.optional.x86_64hw.optional.64bitopscpu64bitCPU is 64-Bit?YesNohw.cpusubtypeIntel Core 2Intel CoreG3G4G5OthercpusubtypeCPU Subtypehw.modelmodelMac Modelhw.ncpuncpuNumber of CPUsAppleLanguageslangPreferred LanguageappNameApplication NameappVersionApplication VersioncpuFreqMHzCPU Speed (GHz)ramMBMemory (MB)@"NSView"v20@0:4@8@12@16systemProfileInformationArraydescriptionTextFieldmoreInfoViewmoreInfoButtonisShowingMoreInfoshouldSendProfilefinishPrompt:toggleMoreInfo:promptDescriptioninitWithHost:systemProfile:delegate:shouldAskAboutProfilestopModalsetNeedsDisplay:setFrame:display:animate:removeFromSuperviewaddSubview:positioned:relativeTo:contentViewrunModalForWindow:activateIgnoringOtherApps:isBackgroundApplicationShould %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu.SUInvalidDelegateSUUpdatePermissionPrompt's delegate (%@) doesn't respond to updatePermissionPromptFinishedWithResult:!initWithWindowNibPath:owner:sharedFrameworksPathNSWindowControllernibSparkle.frameworkv24@0:4c8@12@16@20v28@0:4@8@12@16c20@24_finishInstallationWithResult:host:error:delegate:_mdimportHost:installFromUpdateFolder:overHost:delegate:synchronously:versionComparator:_isAliasFolderAtPath:installerForHost:failedWithError:installerFinishedForHost:performInstallationWithPath:host:delegate:synchronously:versionComparator:skipDescendentsSUInstallerSUPackageInstallerpkgmpkgCouldn't find an appropriate update in the downloaded package./usr/bin/mdimport_performInstallationWithInfo:installPath:overHost:delegate:versionComparator:detachNewThreadSelector:toTarget:withObject:NSThreadSUInstallerVersionComparatorSUInstallerDelegateSUInstallerHostSUInstallerPathSparkle Updater: Possible attack in progress! Attempting to "upgrade" from %@ to %@. Aborting update.waitUntilExitlaunchedTaskWithLaunchPath:arguments:absolutePathForAppBundleWithIdentifier:com.apple.installer/usr/bin/open-W-n-bCouldn't find Apple's installer tool!@"NSURLDownload"c16@0:4@8@12downloaddownloadPathrelaunchPathabortUpdateWithError:abortUpdatecleanUprelaunchHostAppinstallUpdateshouldInstallSynchronouslyunarchiverDidFail:unarchiverDidFinish:extractUpdatedownload:shouldDecodeSourceDataOfMIMEType:downloadUpdatedidNotFindUpdatedidFindValidUpdateitemContainsValidUpdate:itemContainsSkippedVersion:hostSupportsItem:isItemNewer:_versionComparatorlocalizedFailureReasoncodeterminate:processIdentifierprocessInfopathToRelaunchForUpdater:updaterWillRelaunchApplication:postNotificationName:object:setSelector:invocationWithMethodSignature:instanceMethodSignatureForSelector:updater:shouldPostponeRelaunchForUpdate:untilInvoking:updater:willInstallUpdate:rangeOfString:publicDSAKeyschemerequestcancelcreateDirectoryAtPath:attributes:requestWithURL:updaterDidNotFindUpdate:updater:didFindValidUpdate:bestValidUpdateInAppcast:forUpdater:updater:didFinishLoadingAppcast:versionComparatorForUpdater:stringWithCString:encoding:dataUsingEncoding:allowLossyConversion:isRunningOnReadOnlyVolumeSUBasicUpdateDriverSUUpdateDriverNSInvocationNSProcessInfo%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again.%@/%@ Sparkle/%@You already have the newest version of %@.txt%@ %@ Update%@ %dCan't make a temporary directory for the update download at %@.httpsThe update is improperly signed.An error occurred while downloading the update. Please try again later.gzipSparkle Error: No valid unarchiver for %@!An error occurred while extracting the archive. Please try again later.relaunchAn error occurred while relaunching %1$@, but the new version will be available next time you run %1$@.Couldn't find the relauncher (expected to find it at %@)%dAn error occurred while installing the update. Please try again later.Sparkle Error: %@Sparkle Error (continued): %@@"SUStatusController"@"SUUpdateAlert"v16@0:4@8l12v16@0:4@8I12@16@0:4d8v16@0:4@8i12statusControllerupdateAlertshowModalAlert:installAndRestart:unarchiver:extractedLength:cancelDownload:download:didReceiveDataOfLength:_humanReadableSizeFromDouble:download:didReceiveResponse:applicationDidBecomeActive:runModalsetIcon:requestUserAttention:expectedContentLengthshowWindow:removeObserver:name:object:alertWithMessageText:defaultButton:alternateButton:otherButton:informativeTextWithFormat:makeKeyAndOrderFront:isActivesetHidesOnDeactivate:SUUIBasedUpdateDriverNSAlertYou're up-to-date!OK%@ %@ is currently the newest version available.NSApplicationDidBecomeActiveNotificationDownloading update...Cancel%.0lf %@BKB%.1lf %@MB%.2lf %@GB%@ of %@%@ downloadedExtracting update...Ready to InstallInstall and RelaunchInstalling update...Update Error!Cancel Update@"SUAutomaticUpdateAlert"postponingInstallationshowErrorsalertapplicationWillTerminate:@"SUUpdater"updaterappcastURLsetValue:forKey:SUUpdateDriverFinishedcheckingControllerisCanceledcancelCheckForUpdates:closeCheckingWindowChecking for updates...load_extractDMG_registerImplementation:_notifyDelegateOfFailureperformSelectorOnMainThread:withObject:waitUntilDone:_notifyDelegateOfSuccessisReadableFileAtPath:directoryContentsAtPath:initWithBytes:length:globallyUniqueStringSUDiskImageUnarchiverdmg/Volumesattach-mountpoint-noverify-nobrowse-noautoopenyes /usr/bin/hdiutildetach-forcev12@0:4#8v12@0:4l8_notifyDelegateOfExtractedLength:arrayWithArray:performSelector:withObject::12@0:4@8_selectorConformingToTypeOfPath:_extractZIP_extractTBZ_extractTGZ_extractTAR_extractArchivePipingDataToCommand:numberWithLong:substringFromIndex:SUPipedUnarchiver.zip.tar.tar.gz.tgz.tar.bz2.tbzrDESTINATIONwtar -xC "$DESTINATION"tar -zxC "$DESTINATION"tar -jxC "$DESTINATION"ditto -x -k - "$DESTINATION"@"NSBundle"v16@0:4c8@12dictionaryWithContentsOfFile:setBool:forKey:stringWithContentsOfFile:encoding:error:iconForFileType:displayNameAtPath:NSImageSparkle Error: the bundle being updated at %@ has no CFBundleIdentifier! This will cause preference read/write to not work properly.CFBundleDisplayNameCFBundleNameSUNoVersionExceptionThis host (%@) has no CFBundleVersion! This attribute is required.CFBundleShortVersionStringCFBundleIconFileicnsBNDLLSUIElement%d.%d.%d/System/Library/CoreServices/SystemVersion.plistProductVersion@¬ ?ð@õÁ"u@>C0€@@@‰À@A0?PAÐC0AB?A€B A ApF„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>ÿÿÿÿÿÿÿÿÿÿÿÿ?456789:;<=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ !"#$%&'()*+,-./0123ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¥¤£¢¡  ¹ ¸ÐëêéèJJ$J4JDJTJdJtJ„J”J¤J´JÄJÔJäJôKKK$K4N”N¤N´NÄQÔààôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôD\DpDPD`D€DLD D„DTDHDtD DDD$D8D@D|DXDD DDD(D0D4DxDDŒD<D,DhDdÈÀ#ÈäÈú$ÈìÈô ÈjÈlÈpÈxÈ|ȄȈȌÈÌÈtÈÜÈäÈèÈðÈ0-È`(ÈŒ8ÈÈÈàÈøZÈ D È PÈ d È pÈ xIÈþDÈ ÄÈ à0ÈÈKÈhÈ$È4È8ÈœÈú È<ÈTÈt ȀȜȸÈÌ ÈˆÈ¨!ÈÌGÈ0È< ÈL Èx ÈXÈÈ È$È@ÈTÈhȀȘȴÈÌÈàÈðÈÈÈ4ÈHÈ\ ÈhÈ|Ș$È´ÈÌ(ÈøfÈÀÈ#PÈ#dÈ#l È#x È#ˆ È#” È#¬È#´È#¼È#ÄÈ#ÌÈ$È$$È$4È$8È$L È$\ È$hÈ$lÈ$pÈ$tÈ$| È$ˆ È$ È$¨ È$¼È$ÄÈ$ÔÈ$äÈ$ìÈ%È%È% È%(È%< È%HÈ%XÈ%` È´È'DjÈ%àÈ'°È'ÄfÈ(xÈ(|È* È*$È*,>È*lÈ+È+0È+DÈ+TÈ+deÈ,,È,@ È,PÈ,TÈ,XÈ,\%È1P´È2È2*È2HÈ2L È2\È2d?È2¤È2¬ È2ÐGÈ3È3 *È3LGÈ3”È3 gÈ48È4DÈ4HFÈ4È4¤È7DÈ7XÈ7\0È7(È7¼È7ÔÈ7ÜÈ7èÈ7ìÈ7ðÈ7üÈ8È8 È8È8 È8,È8DÈ8XÈ8pÈ8ˆ È8˜ È9DÈþdÈ9¨È:ÜÈ:àÈ:ìÈ:ô È; È; È; È;,ÈÈÈ;@È;HÈ;è ÈTÈ>h È>xÈ>BÈ>ÔÈ>ðÈ?È? È? È? È?,0È?`üü P÷œ4$ú¤úœ ÿðÿàùú|ÿ¸ÿ¬ÿ˜ÿ|ÿHÿ4ÿùÿþðþÀøPþ þxú ù4þpþdþXøðú$þLþDþ,ø ùðýèø¬ýÔýÈù¤÷Ìý°ýýxø8ý\ýLú8ý(ý ýüäü¼ü¬üüTùHø üHü,üüûðûÌû¨û˜ûˆû€ø˜ûhû`ûXûDû8û,û$ûúÜúÈú¼ùxøú´ùÜ älÔÀ¤ˆ|\@0üP¼Ü¼¤€ dH8$ÜÔ¸¤„ ´ ” x X D   è Ü Ð À ¸ ¬ œä  „ d @ ,   è Ð ¬ Œø p P 8 (  ð à ÐøàÔÀŒ˜x@8\ø¬¤ì°”„lXP0äôàÔ¼œˆ|tdXH<´0$ üðè܈Àp´ ˜œ€xl`XTH@<0ìè° Ü̼°¤„ÈØÌ´¬¤ øèˆX< d0 DL 0 lð ( üìÌÔ¸ÀˆpdX8(øôä!Ð!¼!¨!”!!€!p!d!T!@!!4!(##"ì"P"Ø"¸"¨"˜"€"h&d','&<&ü&ð&Ì&¸&œ&ˆúP&|(L(,)L)ð(¼)¤(ð)ˆ)d äô* *€*Ô,+Ü+Ì0ð,Ô÷à0È0¬Ð ¸÷ˆ0Œ Ð.8ø|Ô..(-ø0h0@¤-´-Ü-È0$-¤0ð/ø/Ô/Ì/Ä/¼/¬Äl-h/œÌ-<à-/€- )-/H/$/.ô,ø.Ô.´.˜.Œ.x.l,ì.d.Lø7 76è66Œ5L6pt45Œ 6d6LHX5ÀÜ5\646(6d8ð909|9”9È:¬:”Ô:x:`:D: 9ð9Ô5p-P;œ;Œ?@ABCDEFµGÆß      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅ.objc_category_name_NTSynchronousTask_Notifications.objc_category_name_NTSynchronousTask_Private.objc_category_name_SUPlainInstaller_Internals.objc_category_name_SUPlainInstaller_MMExtendedAttributes.objc_category_name_SUUnarchiver_Private.objc_class_name_NTSynchronousTask.objc_class_name_SUAppcast.objc_class_name_SUAppcastItem.objc_class_name_SUAutomaticUpdateAlert.objc_class_name_SUAutomaticUpdateDriver.objc_class_name_SUBasicUpdateDriver.objc_class_name_SUDSAVerifier.objc_class_name_SUDiskImageUnarchiver.objc_class_name_SUHost.objc_class_name_SUInstaller.objc_class_name_SUPackageInstaller.objc_class_name_SUPipedUnarchiver.objc_class_name_SUPlainInstaller.objc_class_name_SUProbingUpdateDriver.objc_class_name_SUScheduledUpdateDriver.objc_class_name_SUStandardVersionComparator.objc_class_name_SUStatusController.objc_class_name_SUSystemProfiler.objc_class_name_SUUIBasedUpdateDriver.objc_class_name_SUUnarchiver.objc_class_name_SUUpdateAlert.objc_class_name_SUUpdateDriver.objc_class_name_SUUpdatePermissionPrompt.objc_class_name_SUUpdater.objc_class_name_SUUserInitiatedUpdateDriver.objc_class_name_SUWindowController_SUAllowsAutomaticUpdatesKey_SUAppcastError_SUAppcastParseError_SUAuthenticationFailure_SUAutomaticallyUpdateKey_SUDowngradeError_SUEnableAutomaticChecksKey_SUEnableAutomaticChecksKeyOld_SUEnableSystemProfilingKey_SUExpectsDSASignatureKey_SUFeedURLKey_SUFileCopyFailure_SUHasLaunchedBeforeKey_SUInstallationError_SUInstallerDelegateKey_SUInstallerHostKey_SUInstallerPathKey_SUInstallerVersionComparatorKey_SULastCheckTimeKey_SULastProfileSubmitDateKey_SUMissingInstallerToolError_SUMissingUpdateError_SUNoUpdateError_SUPublicDSAKeyFileKey_SUPublicDSAKeyKey_SURelaunchError_SURunningFromDiskImageError_SUScheduledCheckIntervalKey_SUSendProfileInfoKey_SUShowReleaseNotesKey_SUSignatureError_SUSkippedVersionKey_SUSparkleErrorDomain_SUTechnicalErrorInformationKey_SUTemporaryDirectoryError_SUUnarchivingError_SUUpdateDriverFinishedNotification_SUUpdaterWillRestartNotification_b64decode_load_dsa_key.objc_class_name_NSAlert.objc_class_name_NSArray.objc_class_name_NSAutoreleasePool.objc_class_name_NSBundle.objc_class_name_NSCharacterSet.objc_class_name_NSData.objc_class_name_NSDate.objc_class_name_NSDictionary.objc_class_name_NSError.objc_class_name_NSException.objc_class_name_NSFileManager.objc_class_name_NSFont.objc_class_name_NSImage.objc_class_name_NSInvocation.objc_class_name_NSMutableArray.objc_class_name_NSMutableCharacterSet.objc_class_name_NSMutableDictionary.objc_class_name_NSMutableURLRequest.objc_class_name_NSNotificationCenter.objc_class_name_NSNumber.objc_class_name_NSObject.objc_class_name_NSPipe.objc_class_name_NSProcessInfo.objc_class_name_NSProgressIndicator.objc_class_name_NSRunLoop.objc_class_name_NSSortDescriptor.objc_class_name_NSString.objc_class_name_NSTask.objc_class_name_NSThread.objc_class_name_NSTimer.objc_class_name_NSURL.objc_class_name_NSURLDownload.objc_class_name_NSURLRequest.objc_class_name_NSUserDefaults.objc_class_name_NSUserDefaultsController.objc_class_name_NSValue.objc_class_name_NSWindowController.objc_class_name_NSWorkspace.objc_class_name_NSXMLDocument_AuthorizationCreate_AuthorizationExecuteWithPrivileges_AuthorizationFree_BIO_free_BIO_new_mem_buf_CFBooleanGetValue_CFMakeCollectable_CFPreferencesCopyAppValue_CFPreferencesSetValue_CFPreferencesSynchronize_CFRelease_CFRetain_CFURLGetFSRef_CGWindowLevelForKey_DSA_free_EVP_DigestInit_EVP_DigestUpdate_EVP_PKEY_assign_EVP_PKEY_free_EVP_PKEY_new_EVP_VerifyFinal_EVP_dss1_FSIsAliasFile_Gestalt_GetCurrentProcess_NSApp_NSAppKitVersionNumber_NSApplicationDidBecomeActiveNotification_NSApplicationWillTerminateNotification_NSDefaultRunLoopMode_NSEventTrackingRunLoopMode_NSFileHandleNotificationDataItem_NSFileHandleReadToEndOfFileCompletionNotification_NSFileSize_NSFileType_NSFileTypeDirectory_NSFileTypeForHFSTypeCode_NSLocalizedDescriptionKey_NSLocalizedFailureReasonErrorKey_NSLog_NSModalPanelRunLoopMode_NSSelectorFromString_NSTaskDidTerminateNotification_NSTemporaryDirectory_NSWorkspaceRecycleOperation_PEM_read_bio_DSA_PUBKEY_ProcessInformationCopyDictionary_SHA1_UTGetOSTypeFromString___CFConstantStringClassReference___error___floatdidf__setjmp_closedir_fclose_floor_fopen_fread_free_fwrite_getuid_kCFPreferencesAnyHost_kCFPreferencesCurrentUser_malloc_memset_objc_exception_extract_objc_exception_match_objc_exception_throw_objc_exception_try_enter_objc_exception_try_exit_objc_msgSendSuper_objc_msgSend_stret_opendir_pclose_popen_readdir_removexattr_setenv_signal_snprintf$LDBL128_stat_statfs_strcmp_strlcat_strlcpy_strlen_sysctlbyname_waitsingle moduleÎúíþd …Œ__TEXTPP__text__TEXT0wí0€__cstring__TEXT¨ ÀE¨ __literal8__TEXThOPhO__literal4__TEXT¸O¸O__const__TEXTÐO0ÐOH__DATAP P __data__DATAP¸P__dyld__DATA¸T¸T__cfstring__DATAÀTà ÀT__bss__DATA bð__OBJCp0p0__message_refs__OBJCpØp__cls_refs__OBJCØväØv__class__OBJCÀwpÀw__meta_class__OBJC@~p@~__cls_meth__OBJCÀ„€À„__inst_meth__OBJC@†¤ @†__instance_vars__OBJC“ “__module_info__OBJC —À —__symbols__OBJCà˜Ìà˜__cat_cls_meth__OBJCÀš¬Àš__category__OBJCl›Œl›__cat_inst_meth__OBJCœDœ__protocol__OBJCDD__image_info__OBJCXXÀ__IMPORT  __pointers__IMPORT È __jump_table__IMPORT¡h¡28__LINKEDIT°Œj°Œj X@loader_path/../Frameworks/Sparkle.framework/Versions/A/SparkleÿŽ(½döÎÆ…Ö¡:]¦ðÆÄÈ PGG@Gx¬ÆXz`ùß° 8  /usr/lib/libcrypto.0.9.7.dylib \’y/System/Library/Frameworks/Security.framework/Versions/A/Security X /System/Library/Frameworks/WebKit.framework/Versions/A/WebKit T/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit ` ¥,/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation Xµ-/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 4/usr/lib/libgcc_s.1.dylib 4o/usr/lib/libSystem.B.dylib d /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices 4ã/usr/lib/libobjc.A.dylib hÜ–/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation p"/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServicesèXÿ°Ë3‹€ƒ8ÿàU‰åSè[ƒì‹ƒ³S‰D$‹ƒ×Z‰$襅‰D$‹ƒ·S‰D$‹E‰$茅ƒÄ[ÉÃU‰åƒì8‰}ü‹}‹E‰]ôè[…ÿ‰uø‰Eäu‹ƒaS‰D$‹ƒ…Z‰$èL…‰Ç‹³F‰|$‹ƒiS‰D$‹ƒZ‰$è(…‰D$‹ƒmS‰4$‰D$è……ÀuE‹ƒqS‰D$‹Eä‰$èù„‹“uS‰T$‰$èç„‹uø‰}‹“yS‹}ü‹]ô‰U ‰EÉéÉ„‹]ô‹uø‹}üÉÃU‰åWVSè[ƒì<‹EUà‰$‰Eà‹ƒiZ‰E䋃ÁR‰D$è„‹U…Ò‰Çu‹ƒ¥R‰D$‹ƒÉY‰$èj„‰E‹E‹³EE‰D$‹ƒ­R‰D$‹ƒÅY‰$èB„‰4$‰D$‹ƒ±R‰D$è,„…À‰Æt+‹ƒÅR‰<$‰D$è„‹ƒÉR‰4$‰D$脉Çéû…ÿ„ó‹ƒEE…Àu0‹ƒ¹R‰D$‹ƒÁY‰$èу‹“ÁR‰T$‰$迃‰ƒEE‹ƒ­R‹U‹³EE‰D$‹ƒÅY‰T$‰$蔃‰|$‰4$‰D$ ‹ƒÍR‰D$èzƒ‹ƒ¹R‰D$‹ƒ½Y‰$èbƒ‹U‰T$‹“ÑR‰$‰T$èIƒ‰G ‹ƒÕR‰<$‰D$è4ƒ‹ƒÙRÇD$ÇD$ÇD$ ‰D$‹ƒÝR‰<$‰D$胃Ä<‰ø[^_ÉÃU‰åSè[ƒì‹ƒßP‰D$‹ƒX‰$èÑ‚‰D$‹ƒ÷P‰D$‹E‰$踂ƒÄ[ÉÃU‰åƒìH‰]ôè[‰}ü‹}‰uø‹ƒªW‰E䋃ÒP‹W ‰D$‰$è|‚‰<$‰Æ‹ƒ¦P‰D$èh‚‰t$‰D$ ƒf5‰D$‹ƒÖP‰D$‹Eä‰$èA‚‹]ô‹uø‹}üÉÃU‰åƒìH‰]ôè[‰uø‰}ü‹}‹³:€‹W ‹‰D$‹ƒ^P‰$‰D$èý…ÀuD‹ƒbP‹W‰D$‹ƒfP‰$‰D$èÚ„Àt<‹G‰|$‹“bP‰$‰T$轄À…Ý‹ƒŠP‹uø‰}‹]ô‹}ü‰E Ééš‹‹W ‰D$‹ƒ&P‰$‰D$è…ÀuÆ‹³"€‹W ‹‰D$‹ƒ^P‰$‰D$èZ…Àt1‹‹W ‰D$‹ƒjP‰$‰D$è;¾À‰D$‹ƒnP‰<$‰D$ëC‹³6€‹W ‹‰D$‹ƒjP‰$‰D$è„Àu(‹‹G ÇD$‰T$ ‹“rP‰$‰T$èÝ€é#ÿÿÿ‹W ‹ƒvP‰$‰D$èÀ‰E䋃zP‹W‰D$‹ƒfP‰$‰D$è¡€„ÀtN‹ƒ~P‹w‰<$‰D$舀‰|$¾À‰D$ ‹ƒzP‰4$‰D$èk€‰D$‹ƒ‚P‰D$‹Eä‰$èR€‰Eä‰|$‹Eä‰D$ ‹G ‰D$‹ƒ†P‰D$‹ƒ*W‰$è%€‹]ô‹uø‹}üÉÃU1À‰åƒì‰]øè[ƒ}‰uü‹u”À‰D$‹ƒPN‰4$‰D$èæ‹ƒpN‰u‹]ø‹uü‰E ÉéÎU‰åƒì‰]øè[‰uü‹u‹ƒ*N‰D$‹E‰$è¤;F‰ÂuJ‹ƒ.N‰$‰D$è‹„Àt4‹F‹“ÒM‰$‰T$èrÇF‹ƒ"N‰u‹]ø‹uü‰E ÉéS‹]ø‹uüÉÃU‰åSè[ƒì‹E‹P ‹ƒ8}‹‰$‰D$‹ƒxM‰D$èƒÄ[ÉÃU‰åƒìX‰}ü‹}‰]ô‰uøè[‹W…Òt‹ƒoM‰$‰D$èã~ÇG‹ƒsM‰<$‰D$èÊ~„À„à‹ƒwM‰<$‰D$è°~…À‰Æu‹ƒ{M‰D$‹ƒûS‰$è’~‰Æ‹ƒM‰D$‹ƒûS‰$èx~‹“ƒM‰t$‰T$‰$èl~‹ƒ‡M‰<$‰D$Ý]àèW~òƒW,Ý]ÐòMÐò_Áf(ÈfWÀf.Màv f(Áò\Eà‹ƒ‹MòD$ÇD$ÇD$‰|$‰D$‹ƒM‰D$‹ƒ÷S‰$èå}‰G‹]ô‹uø‹}üÉÃU‰åVSè[ƒì‹u‰4$‹ƒcL‰D$è´}„Àt‹ƒÏK‰D$‹ƒÃR닃ÏK‰D$‹ƒ¿R‰$è†}‰Â‹ƒÓK‰$‰D$èr}‹“gL‰t$‰T$‰$è\}‹“kL‰T$‰$èJ}‰4$‰D$‹ƒoL‰D$è4}ƒÄ[^ÉÃU‰åVSè[ƒì‹u‹ƒ)K‰D$‹ƒR‰$è}‰t$‹“½K‰T$‰$èî|‹“ÁK‰T$‰$èÜ|‰E‹ƒÅK‰u‰E ƒÄ[^ÉéÂ|U‰åVSè[ƒì‹u‹ƒ¾J‰D$‹ƒ¢Q‰$è™|‹“RK‰t$‰T$‰$èƒ|‹“VK‰T$‰$èq|‰4$‰D$‹ƒZK‰D$è[|ƒÄ[^ÉÃU‰åWVSè[ƒì,‹ƒïJ‰D$‹E‰$è0|„À…ó‹E‹P…Òt‹ƒ»J‰$‰D$è |‹EÇ@ƒ/‰Eä‰D$‹ƒóJ‰D$‹E‰$èà{‹E‹x ‹ƒ?z‹0‹ƒËJ‰D$‹ƒGQ‰$èº{‰t$ ‰<$‰D$‹ƒ÷J‰D$è {‹Eä‰D$‹ƒûJ‰D$‹E‰$è„{‹ƒ_J‰D$‹E‰$èo{‰Ç‹E‰x‹p ‹ƒÿJ‰D$‹E‰$èO{‰t$ ‰<$‰D$‹ƒK‰D$è5{ƒÄ,[^_ÉÃU‰åƒìH‰]ôè[‰uø‰}ü‹ƒÝI‰D$‹ƒP‰$è{‹“)yÇD$‹‰$‰T$‹“áI‰T$ ‹U‰T$‹“åI‰T$èÉz‹E‹P ‹ƒéI‰$‰D$è±z‰Æ‹ƒI‰D$‹ƒ5P‰$è—z9Æ…Ú‹ƒíI‰D$‹ƒP‰$èwz“.‹³)‰Uä‰Ç‹ƒ9y‹‰$‰D$‹ƒñI‰D$èHz‰t$‰<$ÇD$‰D$ ‹E‰D$‹ƒõI‰D$èz‹ƒíI‰D$‹ƒP‰$èz‹U䋳)‰Ç‹ƒ1y‹‰$‰D$‹ƒñI‰D$èÞy‰t$ÇD$‰<$‰D$ ‹E‰D$‹ƒõI‰D$èµy‹]ô‹uø‹}üÉÃU‰åWVSè[ìŒu‹ƒ]H‰D$‹ƒ…N‰$è}y‹U‰T$‹“yH‰$‰T$èdyÇE€‰4$èKy‰4$èóx…Àthu‰4$è y‰4$‰E„è)y‰4$èÑx…ÀtE‰$èþx‰E€éã‹E„‰D$‹ƒ}N‰$èæx…À…Æ‹E„‰E€E‰$èáxé°‹ƒmH»,‰D$‹ƒN‰$èÃx‰Æ‹ƒ¹w‹‰<$‰D$‹ƒqH‰D$è£x‹U‰4$‰T$‰D$ ‹ƒ}H‰D$è†x‹ƒmH‰D$‹ƒN‰$ènx‰Æ‹ƒ±w‹‰<$‰D$‹ƒqH‰D$èNx‹U‰4$‰T$‰D$ ‹ƒ}H‰D$è1x‹M€…ÉuE‰$èxÄŒ[^_ÉËE€‰$èõwU‰åVSè[ƒì0‹M‹u9‹õ%up‹ƒF‰4$‰D$èÛw‹“eFÇD$‰t$‰T$ ‹“áF‰$‰T$è³w‹ƒeFÇD$ÇD$ð?ÇD$ ‰D$‹ƒ)F‰4$‰D$èwë:‹ƒµMUð‰uð‰L$‰$‰Eô‹E‰D$‹E‰D$ ‹E‰D$‹ƒåF‰D$èHwƒÄ0[^ÉÃU‰åƒì(‰]øè[‰uü‹u‹ƒ0E‰4$‰D$èwÇD$‹“”E‰t$‰T$ ‹“F‰$‰T$èív‹ƒE‰u‹]ø‹uü‰E ÉéÕvU‰åƒìH‰]ôè[‰uø¶u‰}ü‹}‰ñ‹ƒÙt‹W ‹‰$‰D$ ¾Á‰D$‹ƒE‰D$èv‰ð„ÀtH‹ƒQE‰<$‰D$èvÝ]àòEàf.ƒ)$u$z"‹ƒ±EÇD$ÇD$ õ@‰<$‰D$èAv‹ƒÉD‰<$‰D$è/v‹“-E‰|$ÇD$‰T$ ‹“©E‰$‰T$èv‹ƒ-E‰<$ÇD$ÇD$ð?‰D$‹ƒñDÇD$ ‰D$èÓu‹]ô‹uø‹}üÉÃU‰åƒì(‰]øè[‰uü‹u‰4$‹ƒDD‰D$è«u1ÀÝ]ðòEðf.ƒ#zt!‹ƒÌs‹V ‹‰$‰D$‹ƒ¨D‰D$èju‹]ø‹uüÉÃU‰åSè[ƒì‹E¾U‹H ‹ƒWs‹‰T$‰ $‰D$ ‹ƒ£C‰D$è)uƒÄ[ÉÃU‰åƒì(‰]ôè[‰}ü‰uø‹u‹»s‹V ‹‰$‰D$‹ƒD‰D$èêt…Àt!‹‹V ‰D$‹ƒ D‰$‰D$èËt1Ò„Àt#‹ƒs‹V ‹‰$‰D$‹ƒWC‰D$è¤t‰Â‹]ô‰Ð‹uø‹}üÉÃU‰åƒì(‰]ô‹Eè[‰uø‰}ü‹x ‹ƒ†r‹0‹ƒ~C‰D$‹E‰$è]t‰t$ ‰<$‰D$‹ƒ2C‰D$èCt‹]ô‹uø‹}üÉÃU‰åƒì(‰]ô‹Eè[‰}ü‰uø‹P ‹ƒ)r‹‰$‰D$‹ƒ%B‰D$èÿs…À‰Çu,ƒ'‰D$ ƒ)'‰D$‹ƒ%C‰D$‹ƒI‰$èÍsƒ9'‰D$‹ƒ)C‰D$‹ƒI‰$è«s‹³ýH‰<$‰D$‹ƒ-C‰D$ès‰4$‰D$‹ƒ1C‰D$èys‹]ô‹uø‹}üÉÃU‰åƒì(‰}ü‹}‰]ô‰uø‹uè[‹W9òtD‹ƒbB‰t$‰$‰D$è6s„Àu*‹W‹ƒfA‰$‰D$ès‹ƒfB‰4$‰D$è s‰G‹]ô‹uø‹}üÉÃU‰åSè[ƒì‹E‹P‹ƒ A‰$‰D$èØr‹“’A‰U ‰EƒÄ[ÉéÂrU‰åSè[ƒì‹E¾U‹H ‹ƒ¿p‹‰T$‰ $‰D$ ‹ƒA‰D$è‰rƒÄ[ÉÃU‰åSè[ƒì‹E‹P ‹ƒ€p‹‰$‰D$‹ƒ¼@‰D$èRrƒÄ[ÉÃU‰åWVSè[ƒì\‹u‰4$‹ƒWA‰D$è(r‰4$‰EÔ‹ƒ—@‰D$èr‹‹WpˆEÛ‹‹V ‰D$‹ƒw@‰$‰D$èïq…À‰Âu‹ƒ¿@‰D$‹ƒ?G‰$èÑq‰Â‹ƒ[A‰$‰D$èÇqòƒ«¶UÛÝ]¸f.E¸“À‰Ç‹ƒ_A!׉D$‹ƒG‰$èŠq‰EÜ‹ƒ“@‹V‰D$‹ƒ@‰$‰D$èhq„Àt>‰ù‹V¾Á‰D$ ‹ƒ“@‰t$‰$‰D$èBq‰D$‹ƒ›@‰D$‹E܉$è)q‰E܉ú„Òtt‹V ‹ƒ@‰$‰D$è q‹M܉ $‰D$‹ƒ›@‰D$èòp‰EÜ‹ƒWp‹v ‰uÀ‹0‹ƒÃ@‰D$‹ƒ?G‰$èÉp‹UÀ‰t$ ‰$‰D$‹ƒï@‰D$è¬p‹uÜ…ö„È‹ƒcA‹M܉D$‰ $èŒp…À„«‹ƒ_A‰D$‹ƒG‰$èlp‰EÄ‹ƒgA‰D$‹E܉$èTp“ƒ%‰ỦEà逃c%‹‹GG‰D$‹ƒ?@‰<$‰MȉD$èp‰<$‰Æƒs%‰D$‹ƒ?@‰D$èp‹Uȉt$‰$‰D$ ‹ẺD$‹ƒs@‰D$èÜo‹Mĉ $‰D$‹ƒoA‰D$èÃo‹ƒkA‰D$‹Eà‰$è®o…À‰Ç…aÿÿÿ‹ƒsA““%‹MÔ‰Uä‰D$‰ $è†o“£%…Àt‰U䋃wA‹‹GG‰T$‰D$‹EĉMЉ$èWo‹UÔ‰$‰Æ‹ƒ;A‰D$è@o‹Mä‰t$‰L$‰D$ ƒ³%‰D$‹ƒs@‰D$‹EЉ$èo‹“{A‹³GÇD$‰T$‰$èòn‰4$‰D$‹ƒKA‰D$èÜn‰EÔ‹EÔƒÄ\[^_ÉÃU‰åWVSè[ƒì<‹EòEòEà‹x ‹ƒÝl‹0òD$‹ƒ>‰D$‹ƒC‰$è‰n‰t$ ‰<$‰D$‹ƒq=‰D$èonòEàf.ƒ%uz‹ƒ =ÇD$‰D$‹E‰$èAn‹U‹ƒÅ<‰$‰D$è,n‹“)=ÇD$‰T$ ‹U‰$‰T$‹“¥=‰T$èn‹ƒ)=ÇD$ÇD$ð?ÇD$ ‰D$‹ƒí<‰D$‹E‰$èÊmƒÄ<[^_ÉÃU‰åSè[ƒì‹E‹P ‹ƒÓk‹‰D$‹ƒ·;‰$‰D$è‘m…À‰Ât‹ƒû<‰U‰E ƒÄ[Éém݃+ƒÄ[ÉÃU‰åVSè[ƒì ‹u‰4$‹ƒ¥<‰D$èFm‹V ‹ƒq;‰$‰D$è1m‹V…Òt‹ƒÑ;‰$‰D$èm‹V‹ƒq;‰$‰D$èm‹ƒCUð‰uð‰$‰Eô‹ƒ©<‰D$èçlƒÄ [^ÉÃU‰åSè[ƒì‹ƒ <‰D$‹E‰$è¹lº;ƒ$<u‹ƒx;‰D$‹E‰$è—l„À”ƒÄ‰Ð[ÉÃU‰å‹U‹E‰PÉÃU‰åSƒì‹Eè[‹P…Òt‹ƒÛ:‰$‰D$èSlº„Àt1҃ĉÐ[ÉÃU‰å‹E‹@ÉÃUèY‰å‹E‹P ‹ù:‰U‰E ÉélU‰åW‰×V‰Îƒì@ÇD$‰EàÇ$èlÇD$‰t$‰|$‰Eä‹E‰D$ ‹Eà‰$èÃj…Àu!Eô‰$èl@t‹Eô¨u Áø¾…Àt1ö‹UäÇ$‰T$è¿kƒÄ@‰ò^¾Â_ÉÃU‰åWVSè[ìÌ‹ƒÑ:‰D$‹E‰$è_k‰…|ÿÿÿè'k‰ÆEˆ‰D$‹…|ÿÿÿ‰$ètk…À…£;u”…šöE‘@¾„‹•|ÿÿÿ‰$è#k‰E€éM‹M„»¿ßü‰¥tÿÿÿ‰½dÿÿÿƒÁ‰xÿÿÿ‹µxÿÿÿ¹ó¦¸t ¶Fÿ¶Oÿ)È…À„‹µxÿÿÿ»Áß¹‰½dÿÿÿó¦¸t ¶Fÿ¶Oÿ)È…À„Ћ|ÿÿÿ‰ $èÍj‹}„¶WÐpƒÀ ƒàð)ĉt$‹…|ÿÿÿ|$‰<$‰D$èšjƒÄ߉t$‰D$‰<$èj‰t$‹•xÿÿÿ‰<$‰T$èij‹“¥@‹ƒÕ:‰$‰D$èj‰<$‰ÆèQj‰|$‰D$ ‹ƒÙ:‰4$‰D$èìi‰D$‹ƒÝ:‰D$‹M‰ $èÓi‹¥tÿÿÿ„À•À„À‰Æuë!‹¥tÿÿÿ‹U€‰$èÒi…À‰E„…þÿÿ¾‹M€‰ $è?ië1öeô‰ð[^_ÉÃU‰åWVSè[ƒì<‹E‰D$‹ƒá8‰D$‹ƒ‘>‰$èXi“ý‰T$‹“m8‰T$‰$è‰$èúh‰Æƒ‰D$‹ƒ}8‰D$‹ƒU>‰$èÖh‰4$‰D$‹ƒí8‰D$èÀh‹ƒñ8‰4$‰D$è®h‰<$‰D$‹ƒ8‰D$è˜h‰Æë³-‹ƒõ8‰D$‹E‰$èyh“=‰T$‹“ù8‰t$ ‰T$‰$èYh‰Eà‹ƒý8‰D$‹E‰$èAh‰D$‹ƒ9‰D$‹Eà‰$è(hÇEä‰ÇƒM‰EÜëO‹ƒý8‹»>‰D$‹E‰$èùg‹uä‰<$F‰D$‹Eä‰D$‹Eà‰D$ ‹E܉D$‹ƒ­7‰D$èÊg‰uä‰Ç‹ƒÕ8‰D$‹ƒ¥>‰$è­g‹“9‰|$‰T$‰$è—g„Àt }äè…rÿÿÿƒÄ<‰ø[^_ÉÃU‰åWVSè[ì\‹E‹U‰D$‰$‹ƒÿ6‰D$èNg‹M‰ $‰Æ‹ƒÇ6‰D$è7g‰4$u䉅¼þÿÿ‹ƒÇ6‰D$èg‰…Àþÿÿ‹ƒÇ6‰D$‹E‰$èg‰Ç…<ÿÿÿ‰D$‰<$è$gÇEä‰t$ ÇD$ÇD$Ç$è¸e=›ÿÿtÙ…À…L‹…Lÿÿÿuž‰4$ÇD$*‰D$‹…Hÿÿÿ‰D$ ƒÑÛ‰D$è¸f“×ÛƒßÛ‰UȉẺEЃçÛ‰UÔ•Ìþÿÿ‰•¸þÿÿ‰$ÇE؉EÜÇEàÇD$pÇD$èfƒûÛ‹Àþÿÿ‰…Üþÿÿ“÷Û‰…ìþÿÿ‹…¼þÿÿ‰½àþÿÿ‰½ôþÿÿ‰½$ÿÿÿ‹½¸þÿÿ‰…ðþÿÿƒþÛ‰µ ÿÿÿ1ö‰•Ìþÿÿ‰Ðþÿÿ‰äþÿÿ‰•üþÿÿ‰ÿÿÿ‰…ÿÿÿÆ…Çþÿÿë €½Çþÿÿt‹Eä1ɉ<$èŒùÿÿˆ…ÇþÿÿFƒÇ‹TµÈ…ÒuØ€½Çþÿÿt‹U‹ƒ7‹M‰T$‰D$‰ $èie‹½¸þÿÿFUÈ4‚ÁàÇë"€½Çþÿÿt‹Eä1ɉ<$è)ùÿÿˆ…ÇþÿÿƒÆƒÇ‹…ÒuØ‹EäÇD$‰$èd€½Çþÿÿ…‹E‹U‰D$ƒS‰D$‹ƒ£5‰T$ ‰D$‹ƒw<‰$èÛd‹M…ɉ„ߋƒe‹³“<‰T$‹‰D$ ‹ƒ7‰D$‹ƒ<‰$è d‰D$‹ƒ—e‹‰D$ ‹ƒŸe‹‰4$‰D$‹ƒ 7‰D$èrd‹M‰ë|‹EÆ…Çþÿÿ…Àtn‹ƒe‹³“<‹‰D$ ƒc‰D$‹ƒ7‰D$‹ƒ<‰$è)d‰D$‹ƒ—e‹‰D$ ‹ƒŸe‹‰4$‰D$‹ƒ 7‰D$èûc‹U‰Æ…Çþÿÿ¶…ÇþÿÿÄ\[^_ÉÃU‰åWVSè[ƒì\‹}‹ƒ,3‰D$‹ƒü8‰$è³c‹“\3‰|$‰T$‰$èc„À…š‹E‰|$‰|$‰D$ ƒÔ‰D$‹ƒ2‰D$‹ƒØ8‰$èdc‰Â‹E…À„È‹ƒða‹³ô8‰T$‹‰D$ ‹ƒh3‰D$‹ƒð8‰$è)c‰D$‹ƒb‹‰D$ ‹ƒb‹‰4$‰D$‹ƒl3‰D$韋ƒ,3‰D$‹ƒü8‰$èãb‹“p3‰|$‰T$‰$èÍb„ÀtF‹ƒ,3‰D$‹ƒü8‰$è±b‰<$‰Æ‹ƒt3‰D$èb‰4$‰D$‹ƒp3‰D$è‡b„Àu,‹E‹U‰|$ ‰D$‹ƒx3‰T$‰D$‹E‰$è\béÊ‹U‹ƒ`3‰|$‰$‰D$è>b‰EÔ‹ƒ,3‰D$‹ƒü8‰$è#b‹U‰|$‰T$‹UÔ‰$‰T$ ‹“|3‰T$èÿa„À…ª‹E…À„]‹ƒô8‹“ð8‰|$ ‰EÀ‹ƒða‰UÄ‹0‹EÔ‰D$ƒä‰D$‹ƒ2‰D$‹ƒØ8‰$è¥a‹Uĉt$ ‰$‰D$‹ƒh3‰D$èˆa‰D$‹ƒb‹‰D$ ‹ƒb‹‰D$‹ƒl3‰D$‹EÀ‰$èWa‹U‰é¾‹ƒ,3‰D$‹ƒü8‰$è5a‹U‰|$ ‰T$‹U‰$‰T$‹“€3‰T$èa„À…‹u…ö„o‹ƒô8‹“ð8‰|$‰EÈ‹ƒða‰UÌ‹0‹E‰D$ ƒô‰D$‹ƒ2‰D$‹ƒØ8‰$è·`‹Ủt$ ‰$‰D$‹ƒh3‰D$èš`‰D$‹ƒb‹‰D$ ‹ƒb‹‰D$‹ƒl3‰D$‹EÈé ÿÿÿ‹ƒ„3ÇEä‰D$‹ƒì8‰$èM`‹³¤8‰EЋƒˆ3‰D$‹EÔ‰$è/`‰4$‰D$‹ƒŒ3‰D$è`‹UÔ‰$‰Æ‹ƒt3‰D$è`Uä‰T$“d‰t$‰T$‰D$ ‹ƒôa‹‰D$‹ƒ3‰D$‹EЉ$èÈ_„Àu‹UÔƒ‰$‰T$è-_‹ƒd3‰|$‰D$‹E‰$è–_¸ë1ÀƒÄ\[^_ÉÃU‰åVSè[ƒÄ€‹ƒu …Àuè _ÇN¸ÿÿÿÿéÐuœÇEôÇE”‰4$è5_‰4$èÝ^…ÀtCuœ‰4$è _‰4$è_‰4$è¾^…ÀtEœ‰$èë^‰E”ë,è ^Ç!‹u”…öu:ë!‹E‹“Ñ.‰$‰T$èÛ^‰Eô‹M”…Éuë"Eœ‰$è¿^‹U”¸ÿÿÿÿ…Òt0‹E”‰$è™^Eœ‰$è^‹E‹U‹Mô‰D$‰T$‰ $ÿ“u ƒì€[^ÉÃU‰åWVSè[ƒì<‹}ÇD$‰|$ ƒ+Ô‰Eä‰D$‹ƒ8.‰D$‹E‰$èA^‹ƒÐ-‰D$‹ƒ 3‰$è)^‹“<.ÇD$ ‰|$‰T$‰$è ^‹“ \‹‰$‰T$‹“t,‰T$èí]‹“¬\;…†‹ƒÐ-‰D$‹ƒ 3‰$èÇ]‹“@.‰|$‰T$‰$è±]‰Æë>‰D$‹ƒD.‰<$‰D$è—]ÇD$‰D$ ‹Eä‰D$‹ƒ8.‰D$‹E‰$èo]‹ƒ -‰4$‰D$è]]…Àu¬ƒÄ<[^_ÉÃU‰åƒì(‰]øè[‰uü‹u‹V‹ƒU+‰$‰D$è']‹V‹ƒU+‰$‰D$è]‹ƒ93Uð‰uð‰$‰Eô‹ƒ,‰D$èö\‹]ø‹uüÉÃU‰å‹E‹@ÉÃU‰åƒì8‰]ôè[‰uø‰}ü‹}ÇD$ÇD$>@ÇD$ ‹E‰D$‹ƒ¢,‰D$‹ƒ2‰$è\‹W…Ò‰Æt ƒ‰D$ ‰T$‹ƒ¦,‰4$‰D$èf\‹ƒÖ*‰D$‹ƒ 2‰$èN\‰|$ ‰t$‹“ª,‰$‰T$è4\‹“n+‰T$‰$è"\‹]ô‹uø‹}ü‰EÉé9[U‰åƒì(‰]ôè[‰uø‹u‰}ü‹}èx[‰t$‹“Ð+‰T$‰$èÚ[‹uøÇE‰E‹ƒà+‰}‹]ô‹}ü‰E Ééµ[U‰åƒì‰]øè[‰uü‹u‹V‹ƒ¹)‰$‰D$è‹[‹ƒ¹*‰D$‹E‰$èv[‰F‹]ø‹uüÉÃU‰åWVSè[ƒì|‹E}ä‰$èrZ‹ƒf)ÇEä‰D$‹ƒ–0‰$è/[‹U‰Æ‹B‰D$‹ƒB+‰D$‹ƒ60‰$è [‰|$ÇD$ ‰4$‰D$‹ƒF+‰D$èéZ‰E¬‹ƒ~*‰D$‹ƒ.0‰$èÎZ‰E¸‹ƒº*‰D$‹ƒŠ0‰$è³Z‹MÇD$ ‹Q‰$‰T$‹“J+‰T$èZ‹E‹P‹ƒr)‰$‰D$èwZ‹UÇB‹U¬…Ò„qƒ²‹M¬‰D$‹ƒN+‰|$ ‰ $‰D$è?Z…À‰Â„D‹ƒ†*‰$‰D$è#Z‰EÀ‹ƒR+‰D$‹ƒn0‰$èZ‰E°‹ƒR+‰D$‹ƒn0‰$èíY‰Eȃ‰E éÊ‹ƒV+‰4$‰D$èÊY‹“‚*‰T$‰$è¸Y…À„Ç‹ƒZ+ÇD$‰4$‰D$éš‹ƒ^+‹UĉD$‰$èY…À‰Æto‰D$‹M°‹ƒ^)‰ $‰D$èbY…À‰Çu7‹ƒ~*‰D$‹ƒ.0‰$èDY‰t$ ‰Ç‰D$‹ƒz)‰D$‹E°‰$è%Y‹UÄ‹ƒŽ*‰<$‰T$‰D$è Y‹ƒb+‹MĉD$‰ $è÷X‰EÄ‹EÄ…À…Sÿÿÿ‹ƒf+‰D$‹E°‰$èÔX‹U ‰U¤‰EÌéò‹M°‹ƒ^)‰|$‰ $‰D$è­X‰D$‹ƒj+‰D$‹E‰$è”X‹U¤‰<$‰U¨‰T$‰EÔ‹ƒÊ*‰D$èuX„À„È‹MÔ‹ƒn+‰ $‰D$èXX‹“†*‰T$‰$èFX‰EЋƒR+‰D$‹ƒn0‰$è+X‰E´ëC‹ƒ^+‰<$‰D$èX‰<$‰Æ‹ƒr+‰D$èX‰t$ ‰D$‹ƒz)‰D$‹E´‰$èãW‹ƒŠ*‹UЉD$‰$èÎW…À‰Çu¢‹E´‹M¨‹UȉD$‹ƒz)‰L$ ‰$‰D$é̃Ò‰D$‹ƒÊ*‰<$‰D$è‰W„ÀtO‹MÔ‹ƒr+‹³^0‰ $‰D$èjW‰4$‰D$‹ƒv+‰D$èTW…Àt|‰D$‹ƒz)‰|$ ‰D$‹Eȉ$ë]‹UÔ‹ƒr+‰$‰D$è!W‰Æ‹ƒz+‰D$‹ƒ:0‰$èW‰4$‰D$‹ƒf*‰D$èñV‹Mȉ|$ ‰ $‰D$‹ƒz)‰D$èÔV‹ƒŠ*‰D$‹Ẻ$è¿V…À‰Ç…ïýÿÿ‹ƒf)‰D$‹ƒ’0‰$èV‹UȉT$‹“~+‰$‰T$è„V…À‰Æt-‰D$‹M¸‹ƒŽ*‰ $‰D$èeV‹ƒr)‰4$‰D$èSVë‹EȉD$ƒâ‰$èºU‹ƒ‚+‹U°‰D$‰$è'V‹ƒ‚+‹MȉD$‰ $èV‹ƒŠ*‰D$‹EÀ‰$èýU…À‰Æ…üÿÿ뾋ƒr)‹U¬‰D$‰$è×U‹ƒ‚*‹M¸‰D$‰ $èÂU…À„ž‹ƒf)‰D$‹ƒŽ0‰$è¢U“ò‰T$‹“†+ÇD$ ‰T$‰$è~U‹“þ)‰T$‰$èlU‰D$‹ƒ+‰D$‹ƒ20‰$èPU‰D$‹ƒŠ+‰D$‹E¸‰$è7U‹ƒr*‹U¸‰D$‰$è"U‹M‰A‰ð„À„Ò‹ƒ~Y‹“‚0‹³~0‹8ƒ‰D$‹ƒŽ+‰U¼‰D$‹ƒv0‰$èÙT“‰T$“ò‰T$ “"‰T$‹“’+‰$‰T$è©TÇD$‰|$ ‰4$‰D$‹ƒ–+‰D$è‡T‹M¼‰D$‹ƒžY‹‰D$ ‹ƒŽY‹‰ $‰D$‹ƒú*‰D$èVT‰D$‹ƒš+‰D$‹E‰$ë=‹ƒž+‹M‹Q ‰D$‹ƒž)‰$‰D$èT„Àt‹E‹P ‰D$‹ƒž+‰$‰D$èþSƒÄ|[^_ÉÃU‰åƒì(‰]ô‹Eè[‰uø‹u‰}ü‹}‰$èôR‹ƒ?#‰D$‹ƒ)‰$è¸SÇD$ ‹V‰T$‹“Ï#‰$‰T$è—S‹ƒ÷!‹V‰D$‰$è‚SÇF‰}‹ƒ$‹}ü‰u‹]ô‹uø‰E Éé]SU‰å‹EÉÃU‰åƒìH‰]ô‹Eè[‰uø‰}ü‹P ‹ƒ†#‰$‰D$‹ƒ‚!‰D$èS„À„‹ƒf(‹U‹R ‰EÜ‹ƒ†Q‰UØ‹“b(‹‰Uà‰E䋃Š#‰D$‹E‰$èÛR‰Ç‹ƒbQ‹0ƒæ‰D$‹ƒr#‰D$‹ƒZ(‰$è¯R“ö‰T$“Ö‰T$ “‰T$‹“v#‰$‰T$èR‹UäÇD$‰|$‰t$ ‰T$‰D$‹ƒz#‰D$‹Eà‰$èOR‹U܉D$‹ƒ~Q‹‰D$ ‹ƒrQ‹‰$‰D$‹ƒÞ"‰D$èR‹U؉$‰D$ ‹E‰D$‹ƒ†#‰D$èþQ‹]ô‹uø‹}üÉÃU‰åWVSè[ƒì,‹E‰EÜ‹ƒ !‰D$‹E܉$èÉQHu ÇEéD‹ƒ !‰D$‹E܉$è¥Q…À„B‹ƒ!‰D$‹E܉$èˆQ‰Æ‹ƒ!‰D$‹ƒ¶&‰$ènQ‰EäƒÊ‰EàëO‹Eà‰D$‹ƒ6"‰<$‰D$èGQ‹“ú!‰T$‰$è5Q“z…ÀD‰D$‹ƒ!‰D$‹Eä‰$èQ‹ƒ!‰4$‰D$èÿP…À‰Çu™‹Eä‰D$‹ƒ:"‰D$‹ƒþ&‰$èÚPÇD$‹“2"‰T$‰$èÀP‰D$‰Æ‹ƒ>"‰D$‹Eä‰$è¥P„ÀƒzDð‰t$‹ƒB"‰D$‹Eä‰$èP=ÿÿÿDljE‹ƒ2"‰E ‹E܉EƒÄ,[^_Éé[PƒÄ,1À[^_ÉÃU‰åƒì(‰}ü‹}‰]ô‰uø‹uè[‹W9òt'‹ƒI‰$‰D$èP‹ƒI‰4$‰D$è P‰G‹]ô‹uø‹}üÉÃU‰å‹U‹E‰P ÉÃU‰åSè[ƒì‹E‹P‹ƒü‰$‰D$èÊO‹“„‰U ‰EƒÄ[Éé´OU‰åƒì(‰}ü‹}‰]ô‰uø‹uè[‹W9òt'‹ƒ¬‰$‰D$è€O‹ƒ¬‰4$‰D$ènO‰G‹]ô‹uø‹}üÉÃU‰åSè[ƒì‹E‹P‹ƒm‰$‰D$è;O‹“õ‰U ‰EƒÄ[Éé%OU‰åƒì(‰}ü‹}‰]ô‰uø‹uè[‹W9òt'‹ƒ‰$‰D$èñN‹ƒ‰4$‰D$èßN‰G‹]ô‹uø‹}üÉÃU‰åSè[ƒì‹E‹P ‹ƒÞ‰$‰D$è¬N‹“f‰U ‰EƒÄ[Éé–NU‰åƒì(‰}ü‹}‰]ô‰uø‹uè[‹W 9òt'‹ƒŽ‰$‰D$èbN‹ƒŽ‰4$‰D$èPN‰G ‹]ô‹uø‹}üÉÃU‰åSè[ƒì‹E‹P‹ƒO‰$‰D$èN‹“׉U ‰EƒÄ[ÉéNU‰åƒì(‰}ü‹}‰]ô‰uø‹uè[‹W9òt'‹ƒÿ‰$‰D$èÓM‹ƒÿ‰4$‰D$èÁM‰G‹]ô‹uø‹}üÉÃU‰åSè[ƒì‹E‹P‹ƒÀ‰$‰D$èŽM‹“H‰U ‰EƒÄ[ÉéxMU‰åƒì(‰}ü‹}‰]ô‰uø‹uè[‹W9òt'‹ƒp‰$‰D$èDM‹ƒp‰4$‰D$è2M‰G‹]ô‹uø‹}üÉÃU‰åSè[ƒì‹E‹P ‹ƒ1‰$‰D$èÿL‹“¹‰U ‰EƒÄ[ÉééLU‰åƒì(‰}ü‹}‰]ô‰uø‹uè[‹W 9òt'‹ƒá‰$‰D$èµL‹ƒá‰4$‰D$è£L‰G ‹]ô‹uø‹}üÉÃU‰åSè[ƒì‹E‹P$‹ƒ¢‰$‰D$èpL‹“*‰U ‰EƒÄ[ÉéZLU‰åƒì(‰}ü‹}‰]ô‰uø‹uè[‹W$9òt'‹ƒR‰$‰D$è&L‹ƒR‰4$‰D$èL‰G$‹]ô‹uø‹}üÉÃU‰åSè[ƒì‹E‹P(‹ƒ‰$‰D$èáK‹“›‰U ‰EƒÄ[ÉéËKU‰åƒì(‰}ü‹}‰]ô‰uø‹uè[‹W(9òt'‹ƒÃ‰$‰D$è—K‹ƒÃ‰4$‰D$è…K‰G(‹]ô‹uø‹}üÉÃU‰åSè[ƒì‹E‹P‹ƒ„‰$‰D$èRK‹“ ‰U ‰EƒÄ[Éé„Àt3‹W4‹ƒô‰$‰D$èæ>“¬÷‰T$‹“øÇD$ ‰T$ër‹W4‹ƒô‰$‰D$è³>‹³<‰E¬‹ƒì‹W(‰D$‰$è•>ÇD$ÇD$>@ÇD$ ‰4$‰D$‹ƒÌ‰D$èg>‰D$‹ƒü‰D$‹E¬‰$ëE‹W4‹ƒô‰$‰D$è<>‹W(‰$‰Æ‹ƒŒ‰D$è%>ÇD$ ‰4$‰D$‹ƒø‰D$è>eô[^_ÉÃU‰åSè[ƒì‹E‹P,‹ƒ<<‹‰D$‹ƒè ‰$‰D$èÎ=…À‰Ât‹ƒü‰U‰E ƒÄ[Éé²=ƒÄ¸[ÉÃU‰åƒì(‰]ôè[‰uø‰}ü‹}‹³‹;‹W,‹‰$‰D$‹ƒ‹ ‰D$èn=º…Àt‹‹G,‰T$‹“ ‰$‰T$èJ=‰Â‹]ô‰Ð‹uø‹}üÉÃU‰åWVSè[ƒì|‹}‹ƒ:‰<$‰D$è=Ç$‰ÆèA<‰D$‹ƒ>‰4$u¨‰D$èð<‹ƒ:‰<$‰D$èÞ<‹“‰4$‰T$‰D$è×<‹E¨‰EÈ‹E¬ƒì‰EÌ‹E°‰EЋE´‰EÔ‹ƒB‰<$‰D$è›<„À……óEÔ‹ƒóE¤‹W4‰4$‰D$‰T$è<‹E¨óƒâêóM¤‰EØ‹E¬ƒì‰EÜ‹E°‰Eà‹E´‰E䋃:óXEäó\ÈóMÔ‰D$‰<$è(<ÇD$‹“F‰T$‰$è<‹ƒJ‰<$‰D$èü;„À…Í‹W4‹ƒ ‰$‰D$èß;‹“ ‰T$‰$èÍ;‹“‰4$‰T$‰D$èÆ;‹E¨ó‹æê‰E¸‹E¬ƒì‰E¼‹E°óE¼‰EÀ‹E´ó\ÁóE¼‰EÄ‹ƒ óXMÄóMÄ‹W4‰D$‰$èg;‹“ ‰T$‰$èU;‹U¸‰T$‹U¼‰T$ ‹UÀ‰T$‹UĉT$‹“N‰$‰T$è';‹ƒ:‰<$‰D$è;ÇD$‹UȉT$‹ỦT$ ‹UЉT$‹UÔ‰T$‹“R‰$‰T$èß:‹ƒ:‰<$‰D$èÍ:‹“V‰T$‰$è»:‹ƒB‰<$‰D$è©:„Àt‹ƒZ‰}‰E eô[^_Éé:eô[^_ÉÃU‰åSè[ƒìÇD$‹ƒ2 ‰D$‹E‰$è[:ƒÄ¸[ÉÃUèY‰å‹E‹P,‹x ‰U‰E Éé/:U‰åƒì8‰]ô‹Eè[‰uø‰}ü‹P,‹ƒ ‹»$‰$‰D$èü9‰ÆƒÀî‰D$‹ƒL ‰D$‹ƒ4‰$èØ9“Ðî‰T$“°í‰T$ “àï‰T$‹“P ‰$‰T$è¨9‰t$ ‰<$‰D$‹ƒP‰D$èŽ9‹]ô‹uø‹}üÉÃU‰åWVSè[ƒì<‹E‹P(‹ƒª ‰$‰D$è\9‰Eä‹E‹P,‹ƒ® ‰$‰D$èA9‹Uä‰$‰D$‰Ç‹ƒâ‰D$è&9„Àtr‹E³:í‹P(‹ƒ ‰$‰D$è9‹Uä‰t$‰$‰D$ ‹ƒö‰D$èç8‰Eä‹E‹P,‹ƒ² ‰$‰D$èÌ8‰<$‰t$‰D$ ‹ƒö‰D$è²8‰Ç‹“~‹E‰Uà‹P,‹ƒv ‰$‰D$è8‰Æƒî‰D$‹ƒ¦ ‰D$‹ƒŽ‰$èk8“*î‰T$“ í‰T$ “Jï‰T$‹“ª ‰$‰T$è;8‹Uä‰|$‰t$ ‰T$‰D$‹ƒª‰D$‹Eà‰$è8ƒÄ<[^_ÉÃU‰åƒì(‰]ôè[‰uø‹u‰}ü‹}‹ƒ; ‰D$‹E‰$èÛ7…Àu<ÆF@‹F<ÇD$‹“? ‰$‰T$è¶7‹ƒC ‹uø‰}‹]ô‹}ü‰E Éé›7‹]ô‹uø‹}üÉÃU‰åƒì8‹E‰]ô‰uø‹u ‰}ü‹}è[€x@uN‹ƒ%‰D$‹ƒ ‰$èT7‰E䋃½‰<$‰D$è?7‰D$‹ƒÁ‰D$‹Eä‰$è&7‹ƒÅ닃ɉu‹]ô‰E ‹uø‹}üÉé7U‰åWVSè[ƒì,‹u‰4$‹ƒR‰D$èß6‹“–‰T$‰$èÍ6…À‰Eätn‹ƒ‰4$‰D$è´6‰Çë@‹ƒV‰4$‰D$èž6ƒø ‰Áw'¸Óà©¶t‹ƒZ‰t$‰D$‹Eä‰$èp6‹ƒ"‰<$‰D$è^6…À‰Æu¨‹EäƒÄ,[^_ÉÃU‰å‹U‹E‰P0ÉÃU‰åƒì8‰]ô‹EUàè[‰}ü‹}‰uø‰Eà‰$‰|$‹ƒá ‰Eäƒ ì‰D$ ‹ƒÅ‰D$èú5…À‰Æt/‹ƒA‰<$‰D$èÝ5‰FL‹ƒÉÇD$‰4$‰D$èÀ5‰ð‹]ô‹uø‹}üÉÃU‰åVSè[ƒì ‹u‹VL‹ƒ»‰$‰D$è5‹V8‹ƒ»‰$‰D$èx5‹V<‹ƒ»‰$‰D$èc5‹V@‹ƒ»‰$‰D$èN5‹ƒ_ Uð‰uð‰$‰Eô‹ƒó‰D$è25ƒÄ [^ÉÃU‰åƒìH‰]ôè[‰}ü‹}‰uø‹ƒ ‰E䋃F‹WL‰D$‰$èð4‰<$‰Æ‹ƒ‰D$èÜ4‰t$‰D$ ƒÚç‰D$‹ƒJ‰D$‹Eä‰$èµ4‹]ô‹uø‹}üÉÃU‰åVSè[ƒì‹u‰4$‹ƒª‰D$è‡4‹“ƉT$‰$èu4‹ƒª‰4$‰D$èc4“’ê‰T$‹“‰T$‰$èG4‹VH‹ƒ ÇD$‰$‰D$è*4ƒÄ[^ÉÃU‰åƒì8‰]ô‹Eè[‰uø‰}ü‹PL‹ƒ‹» ‰$‰D$èð3‰Æƒ´è‰D$‹ƒ@‰D$‹ƒ( ‰$èÌ3“Äè‰T$“¤ç‰T$ “ê‰T$‹“D‰$‰T$èœ3‰t$ ‰<$‰D$‹ƒD‰D$è‚3‹]ô‹uø‹}üÉÃUèY‰å‹E‹PL‹Ÿ‰U‰E ÉéV3U‰åƒìH‰]ô‹EòEè[òE؉uø‹u‰}ü‹}‰EÔƒbè‰Eä‰D$‹ƒê‰4$‰D$è 3‹ƒR‰<$‰D$èú2‰F8‹Eä‰D$‹ƒò‰4$‰D$èÞ2òEØòD$‹ƒ®‰4$‰D$èÁ2‹EÔ‹}ü‰E‹ƒ²‰u‹]ô‹uø‰E Éé 2U‰åWVS쬋Eè[‹U‹u‹}‰…dÿÿÿ¶E‰•`ÿÿÿ“žèˆ…_ÿÿÿ‰•xÿÿÿ‰T$‹ƒ6‰4$‰D$èJ2‹V@9út'‹ƒž‰$‰D$è12‹ƒž‰<$‰D$è2‰F@‹…xÿÿÿ‰D$‹ƒ>‰4$‰D$è2‹ƒ–‰4$‰D$èî1‹VD‹ƒ‰$‰D$èÙ1Eˆ‹VD‰…Xÿÿÿ‹ƒj‰•|ÿÿÿ‰D$‰T$‹•Xÿÿÿ‰$èº1‹Eˆ‰E˜‹EŒƒì‰Eœ‹E‰E ‹E”‰E¤‹ƒj‹VD‹}¤‰D$‰T$‹…Xÿÿÿ‰$è}1‹Eˆ“Fàó‰½tÿÿÿ‹•tÿÿÿ‰E¨‹EŒƒì‰E¬‹E‰E°‹E”óXE°‰E´ó…pÿÿÿ‹…pÿÿÿ‰T$ ‰D$‹ƒ‰D$‹•|ÿÿÿ‰$è 1‹FD‰E€‹ƒj‰D$‹U€‰T$‹…Xÿÿÿ‰$èô0‹Eˆ‰E¸‹EŒƒì‰E¼‹E‹}¼‰EÀ‹E”‰EÄ‹ƒ–‰4$‰D$èµ0‹“j‰T$‰D$‹•Xÿÿÿ‰$è¨0‹Eˆ‰EÈ‹EŒƒì‰EÌ‹E‰EЋE”óEЉEÔƒFàóE„ó\‹ƒjóE„‹VD‰D$‰T$‹•Xÿÿÿ‰$èU0‹EˆóE„‰½lÿÿÿ‹•lÿÿÿ‰EØ‹EŒƒì‰EÜ‹E‰Eà‹E”ó\Eà‰Eäó…hÿÿÿ‹…hÿÿÿ‰T$ ‰D$‹ƒ ‰D$‹U€‰$èê/‹VD‹ƒf‰$‰D$èÕ/‹“Ò‰T$‰$èÃ/‹…dÿÿÿ‹VD‰D$‹ƒ‰$‰D$è¤/‹…`ÿÿÿ‹VD‰D$‹ƒ‰$‰D$è…/ƒ®è‹ND€½_ÿÿÿ“æD‰E‹ƒ‰M‰E eô[^_ÉéQ/U¸‰åÉÃU‰å‹EèY‹PD¾E‰E‹Ê‰U‰E Éé/U‰å‹EÝ@(ÉÃU‰å‹EòEò@(ÉÃU‰å‹EÝ@0ÉÃUfWÉf(Á‰åƒì‰]øò_Eè[‰uü‹uòF0òL$‹ƒn‰4$‰D$è¸.‹VH‰u‹ƒÆÿ‹uü‹]ø‰U‰E Ééš.U‰åƒì(‰}ü‹}‰]ô‰uø‹uè[‹W<9òt'‹ƒ’ü‰$‰D$èf.‹ƒ’ý‰4$‰D$èT.‰G<‹]ô‹uø‹}üÉÃU‰åWVSè[ƒì‹}ÇEäÇEà‰þƒM܉EÜé¹€ù ”€ù ”ÀÂtÇEäÇEàé•‹UܶÁ‹ ‚ƒùÿ„ƒƒ}ät( ‹Eä…Àt‰Màëoƒ}ät3ƒ}äuïëK‰MàÇEäëU‹Uà‰Èƒà0ÁøÁâ ˆG‰MàÇEäë6¶Uà‰Èƒà<ÁøÁâ ˆG‰MàÇEäë¶EàÁà ȈG‰MàÇEäF¶„É…<ÿÿÿÆ+}ƒÄ[^‰ø_ÉÃU‰åW1ÿVƒì ‹u‰4$èx-‰4$‰D$è',…À‰ÆtlEôÇEôÇD$ ÇD$‰D$‰4$è‚,…Àt:èB,…À‰Çt/‹EôÇD$t‰<$‰D$è,Ht‹Eô‰$èþ+‰<$1ÿè,‰4$è°+ƒÄ ‰ø^_ÉÃU‰åWVSƒìl‹Uè[‹u…Ò„à…ö„Ø‹ƒ³û‰D$‹ƒc‰$èi,‰4$‰E¨ƒÇâ‰E¤‰D$‹ƒóü‰D$èG,‹“»û‰T$‰$è5,‰ÇëG‹ƒ+þ‰D$‹ƒo‰$è,‰4$‰D$‹ƒ›û‰D$è,‹U¨‰$‰D$‹ƒÃû‰D$èê+‹ƒ¿û‰<$‰D$èØ+…À‰Æu¡‹E¤‹U¨‰D$‹ƒËû‰$‰D$è¶+‹“/þ‰T$‰$è¤+‰$èZþÿÿ…À‰E¬„苃/þ‰D$‹E‰$è|+‰E°‰$è+ýÿÿ‹U‰T$‰E´‹ƒ3þ‰D$‹ƒã‰$èO+…À‰Ç„œ‹ƒ;þ‰<$‰D$è3+‰<$}؉Ƌƒ7þ‰D$è+UĉU ‰T$‰t$1ö‰$è›*è_*‰<$‰D$è5*Hu:‹E ÇD$‰<$‰D$è *‹U¬‹E´‰<$‰T$ ‹U°‰D$‰T$è*H”À‰Æ‹U¬‰$èü)ë1öƒÄl‰ð[^_ÉÃU‰åWVSè[ƒì,‹E‰E䋃<ü‰D$‹E‰$ès*‹“¸ù‰T$‰$èa*‰Ç‹ƒ¼ù‰<$‰D$èM*…À‰Æt`‹Uä‰T$‹ƒ@ü‰4$‰D$è.*„ÀtË‹ƒ˜ø‰4$‰D$è*‹Uä‰T$‹“Dü‰$‰T$èÿ)‹“0ù‰U ‰EƒÄ,[^_Ééç)ƒÄ,1À[^_ÉÃU‰åƒì8‰]ô‹Uè[‰}ü‰uø‹r‰$‹ƒÎ÷‹»Òþ‰D$èª)‰t$‰<$‰D$ ƒŽÜ‰D$‹ƒþ÷‰D$è†)‹]ô‹uø‹}üÉÃU‰å‹U‹E‰PÉÃU‰åÉÃU‰åWVSè[ƒì,‹E‹}Uà‰$‰Eà‰|$‹ƒÓ‰EäƒÏà‰D$ ‹ƒ÷ù‰D$è))…À‰Ætq‹ƒs÷‰D$‹E‰$è )‰F(‹E‰F,‹ƒs÷‰<$‰D$èî(‰F0‹ƒûùÇD$‰4$‰D$èÑ(‹ƒgú‰4$‰D$è¿(‹“ƒú‰T$‰$è­(ƒÄ,‰ð[^_ÉÃU‰åƒì(‰]øè[‰uü‹u‹V0‹ƒ§ö‰$‰D$èy(‹V(‹ƒ§ö‰$‰D$èd(‹ƒ Uð‰uð‰$‰Eô‹ƒß÷‰D$èH(‹]ø‹uüÉÃU‰åƒìH‰]ôè[‰}ü‹}‰uø‹ƒ3ý‰E䋃[ö‹W0‰D$‰$è(‰<$‰Æ‹ƒ/ö‰D$èñ'‰t$‰D$ ƒïÚ‰D$‹ƒ_ö‰D$‹Eä‰$èÊ'‹]ô‹uø‹}üÉÃU‰åƒì‰]øè[‰uü‹u‰4$‹ƒ_ø‰D$è˜'‹V,‹ƒgù‰t$ÇD$ ‰$‰D$èw'‹]ø‹uüÉÃU‰åƒì‰]øè[‰uü‹u‰4$‹ƒø‰D$èH'‹V,‹ƒù‰t$ÇD$ ‰$‰D$è''‹]ø‹uüÉÃU‰åƒì‰]øè[‰uü‹u‰4$‹ƒ¿÷‰D$èø&‹V,‹ƒÇø‰t$ÇD$ ‰$‰D$è×&‹]ø‹uüÉÃUèY‰å‹E‹P0‹÷÷‰U‰E Éé®&U‰åƒì8‰]ô‹Eè[‰uø‰}ü‹P0‹ƒ›ö‹»£û‰$‰D$è{&‰Æƒ?Û‰D$‹ƒËö‰D$‹ƒ³û‰$èW&“OÛ‰T$“/Ú‰T$ “Þ‰T$‹“Ïö‰$‰T$è'&‰t$ ‰<$‰D$‹ƒÏô‰D$è &‹]ô‹uø‹}üÉÃU‰åWVSè[ƒì<‹u‹ƒýú‰E䋃-÷‹V0‰D$‰$èÒ%‹V0‰$‰Ç‹ƒõõ‰D$è»%‰Æƒ™Ú‰D$‹ƒ%ö‰D$‹ƒ û‰$è—%“©Ú‰T$“‰Ù‰T$ “‰Ý‰T$‹“)ö‰$‰T$èg%‰|$‰t$ ‰D$‹ƒ)ô‰D$‹Eä‰$èF%ƒÄ<[^_ÉÃU‰åWVSè[ƒì,‹EUà‰$‰Eà‹ƒéü‰E䋃Aó‰D$è%…À‰Ç„n‹ƒ9ó‰D$‹ƒ•ú‰$èé$‹“Aó‰T$‰$è×$‹“Ñó‰T$‰$èÅ$‰<$‰D$‹ƒíö‰D$è¯$‹ƒ9ó‰D$‹ƒ‘ú‰$è—$‹“Aó‰T$‰$è…$‹“Ñó‰T$‰$ès$‰<$‰D$‹ƒñö‰D$è]$‹ƒ9ó‰D$‹ƒ‘ú‰$èE$‹“Aó‰T$‰$è3$‹“Ñó‰T$‰$è!$‰<$‰D$‹ƒõö‰D$è $‹ƒùö‰<$‰D$èù#‰<$‰Æ‹ƒýö‰D$èå#‰4$‰D$‹ƒ÷‰D$èÏ#‹ƒùö‰<$‰D$è½#‰<$‰Æ‹ƒ÷‰D$è©#‰4$‰D$‹ƒ ÷‰D$è“#ƒÄ,‰ø[^_ÉÃU‰åVSè[ƒì ‹u‹ƒ=ò‰D$‹ƒeø‰$è`#‹“Yò‰t$‰T$‰$èJ#‹ƒ9õ‰4$ÇD$‰D$è0#‹ƒ=õ‰4$ÇD$‰D$è#‹ƒAõ‰4$ÇD$‰D$èü"‹ƒYõ‰4$ÇD$‰D$èâ"‹ƒ5ûUð‰uð‰$‰Eô‹ƒÉò‰D$èÆ"ƒÄ [^ÉÃU‰åWVSè[ìœuˆ‹ƒµð‰D$‹ƒ ø‰$è"‹“½ð‰T$‰$è{"ÇE€‰4$‰EäÇEàèX"‰4$è"…Àthuˆ‰4$è-"‰4$‰E„è6"‰4$èÞ!…ÀtEˆ‰$è "‰E€éÜ‹E„‰D$‹ƒ÷‰$èó!…À…¿‹E„‰E€Eˆ‰$èî!é©‹ƒµð‰D$‹ƒø‰$èÖ!‹“½ð‰T$‰$èÄ!‰Ç‹E‹U‹M‹u‰D$‹ƒô‰T$‰L$ ‰t$‰D$‰<$è”!‹ƒ‘ô‰<$‰D$è‚!…Àu'‹ƒ•ô‰<$‰D$èl!‹“Åð‰T$‰$èZ!‰Eà‹ƒÁð‰<$‰D$èE!‹E€…Àt ‹E€‰$è!Eˆ‰$è#!‹U䋃™ô‰$‰D$è!‹Uà‹ƒMñ‰$‰D$èþ ‹EàÄœ[^_ÉÃU‰åWVSìœÆEç‹Eè[…Àt.‹U‹ƒžò‰$‰D$è¾ ‹U‰T$‹“Æò‰$‰T$è¥ ‹U‹ƒžò‰$‰D$è ‹U‰T$‹“Êò‰$‰T$èw ‹U‹ƒžò‰$‰D$èb ‹U‰T$‹“Îò‰$‰T$èI ‹ƒ–ï‰D$‹ƒ¾õ‰$è1 ‹U‰$‰Æ‹ƒªò‰D$è ‹“Öò‰T$‰$è ‹U‰4$‰T$‰D$‹ƒ2‹‰D$‹ƒÒò‰D$ ‹ƒžï‰D$èÕ‹ƒ–ï‰D$‹ƒ¾õ‰$轋U‰$‰Æ‹ƒžò‰D$見U‰4$‰T$‰D$‹ƒ"‹‰D$‹ƒÚò‰D$ ‹ƒžï‰D$ès‹U‹ƒªò‰$‰D$è^‹“Öò‰T$‰$èLÇD$‰Æ‹ƒ*‹‰D$‹ƒ.‹‰D$ ‹ƒ6‹‰D$‹ƒÞò‰D$‹ƒªõ‰$è‰4$uŒ‰D$‹ƒâò‰D$èíÇE€‰4$èÔ‰4$è|…Àt^uŒ‰4$詉4$‰E„貉4$èZ…ÀtEŒ‰$臉E€ëW‹E„‰D$‹ƒ¶õ‰$èr…Àu>‹E„‰E€EŒ‰$èqë+‹U‹ƒžò‰$‰D$è_‹“æò‰T$‰$èMÆEç‹U€…Òt ‹E€‰$è#EŒ‰$è'¶Eç„À„‹E…Àty‹U‹ƒ¢ò‰$‰D$è‹“êò‰T$‰$èò‹U‰T$‹“îò‰$‰T$èÙ‹U‹ƒ¢ò‰$‰D$èÄ‹“êò‰T$‰$貋“òò‰T$‰$è ‹E‹“öò‰$‰T$è‹„À…‹»6‹ƒúòÇD$ÇD$ ð?‰D$‹ƒÖõ‰$èU‰Æ‹ƒþò‰D$‹ƒ*ö‰$è;‹‰t$ ‰T$‹“ó‰$‰T$è„Àt‹E‹“öò‰$‰T$è„Àt…Äœ[^_ÉÃU‰å‹E‹@ÉÃU‰åƒì(‰}ü‹}‰]ô‰uø‹uè[‹W9òt'‹ƒäê‰$‰D$踋ƒèê‰4$‰D$覉G‹]ô‹uø‹}üÉÃU‰å‹E‹@ÉÃU‰åƒì(‰}ü‹}‰]ô‰uø‹uè[‹W9òt'‹ƒ…ê‰$‰D$èY‹ƒ‰ê‰4$‰D$èG‰G‹]ô‹uø‹}üÉÃU‰å‹E‹@ ÉÃU‰åƒì(‰}ü‹}‰]ô‰uø‹uè[‹W 9òt'‹ƒ&ê‰$‰D$èú‹ƒ*ê‰4$‰D$èè‰G ‹]ô‹uø‹}üÉÃU‰å‹E‹@ÉÃU‰åƒì(‰}ü‹}‰]ô‰uø‹uè[‹W9òt'‹ƒÇé‰$‰D$蛋ƒËé‰4$‰D$艉G‹]ô‹uø‹}üÉÃU‰å‹E¶@ÉÃU‰å‹U‹EˆPÉÃU‰å‹E‹@ÉÃU‰å‹U‹E‰PÉÃU‰åVSè[ƒì‹u‹ƒlí‰D$‹E‰$è"‹“Œ‹‰T$‹“<é‰$‰T$è‰D$‹ƒí‰4$‰D$èîÇE‹ƒpí‰u‰E ƒÄ[^ÉéÐU‰åƒì‰]øè[‰uü‹u‹ƒˆì‰4$‰D$è©‹“øì‰T$‰$è—‰E‹ƒüì‰u‹]ø‹uü‰E Éé|U‰åSè[ƒì‹ƒ Û…Àu0‹ƒyè‰D$‹ƒÙï‰$èM‹“è‰T$‰$è;‰ƒ Û‹ƒ ÛƒÄ[ÉÃU‰åƒì(‰]ôè[‰}ü‹}‰uø‰<$ƒ½Ñ‰D$‹ƒ…é‰D$èõº„ÀuT‹ƒYì‰D$‹ƒõî‰$èÔÇD$‰<$‰Æ‹ƒ]ì‰D$踉4$·À‰D$‹ƒaì‰D$èŸ1Ò„À”‹]ô‰Ð‹uø‹}üÉÃU‰åWVSè[ƒì<‹ƒžè‰D$‹ƒNî‰$èd‰E䋃&ë‰D$‹E‰$èL…À„¸‹U‹ƒÊëÇD$‰$‰D$è'‹“Úê‰T$‰$è‹“è‰T$‰$è‰EÔ‰D$‹ƒÎë‰D$‹E‰$èç‹U‰$‰Æ‹ƒ&ë‰D$èÐÇEØH‰EÜéð‹EØÇEÌ‹ỦEÈ‹EȉT$ ‹U‰D$‹ƒÒë‰$‰D$è‰D$‰Ç‹ƒÎë‰D$‹E‰$èu9Æ•ƒþ‰Eà”ÀÂtt‹ƒ†ç‰D$‹ƒ†î‰$èK‹UÔ‰T$‹“Öë‰$‰T$è2‰Æ‰D$‹ƒ®è‰D$‹Eä‰$苃’ç‰4$‰D$苃Úë‹UÔ‰|$‰D$‰$닃Þë‰|$‰D$‹EÔ‰$èÖ‹uàÿEØ‹UÜ9UØŽÿÿÿ‹EÔ‰D$‹ƒâë‰D$‹ƒ†î‰$襋Uä‰$‰D$‹ƒ®è‰D$茋EäƒÄ<[^_ÉÃU‰åWVSè[ƒì<‹E‰D$‹ƒÜé‰D$‹E‰$èV‰EÔ‹E‰D$‹ƒÜé‰D$‹E‰$è7‰EØ‹ƒ˜æ‰D$‹EÔ‰$è‰Æ‹ƒ˜æ‰D$‹E؉$è9Æs‹ƒ˜æ‰D$‹EÔë ‹ƒ˜æ‰D$‹E؉$èàÇEà‰Eäé´‹Eà‰D$‹ƒÀç‰D$‹EÔ‰$赉EÜ‹Eà‰D$‹ƒÀç‰D$‹E؉$薉NjE܉D$‹ƒÄé‰D$‹E‰$èx‰|$‰Æ‹ƒÄé‰D$‹E‰$è]9ƉÁuo…öuD‹ƒàé‰D$‹E܉$è>‰<$‰Æ‹ƒàé‰D$è*9ÆC|bÿEà‹Eà9Eä@ÿÿÿë[Nu싃äé‰|$‰D$‹E܉$èó…À‰ÂtÍéƒþ•ƒø”À„Ð…õƒþ”ÂI•À„Ðu…ö„ߺÿÿÿÿéÚ‹ƒ˜æ‰D$‹EÔ‰$蟉Ƌƒ˜æ‰D$‹E؉$èˆ1Ò9Æ„¤‹ƒ˜æ‰D$‹EÔ‰$èi‰Æ‹ƒ˜æ‰D$‹E؉$èR9Æv(‹Eä¿ÿÿÿÿ¾‰D$‹ƒÀç‰D$‹EÔ‰$è(ë&‹E俾ÿÿÿÿ‰D$‹ƒÀç‰D$‹E؉$è‰D$‹ƒÄé‰D$‹E‰$èç‰úHEÖ뺃Ä<‰Ð[^_ÉÃU‰åSè[ƒì‹ƒaÕ…Àu-‹ƒÍâ‰D$‹E‰$褋“Õâ‰T$‰$è’‰ƒaÕ‹ƒaÕƒÄ[ÉÃU‰åVSè[ƒì‹ƒx⋳Œé‰D$‹E‰$èW‰D$‹ƒèæ‰4$‰D$èA“(̉T$ “8̉T$‹“ìæ‰$‰T$è‰Æ‹ƒ|â‰D$‹ƒ”é‰$è‰t$‹“ðæ‰T$‰$èë‹“ã‰U ‰EƒÄ[^ÉéÔU‰åWVSè[쌋ƒGæ‰D$‹E‰$è­‰E¼‹ƒçâ‰D$‹ƒ—è‰$è’ÇD$‰EÀƒ›Ë‰D$ƒëƉD$ƒ«Ë‰D$ ƒûƉD$‹ƒÏå‰D$‹ƒ›è‰$èGÇEäÇEà‰EÄ‹ƒKæ‰D$‹ƒÓè‰$è…Àtx‰D$‹³çè‰D$ƒ»Ë‰D$ ƒËˉD$‹ƒÏåÇD$‰D$‹ƒ›è‰$èØ‹Uĉ4$‰T$ ‰D$‹ƒOæ‰D$軉D$‹ƒ÷â‰D$‹EÀ‰$è¢EäUà‰E”‰D$ƒ¿¢ÇD$ÇD$ ‰U˜‰T$‰$èÀÇEÈÿÿÿÿ…À…Ä‹UäƒÛˉEЃú‰UÈtƒ}È“û˃ëËE‰EЋEÈ‹»ç苳›è‰D$‹ƒSæ‰D$‹ƒ“è‰$è ‹UÐÇD$‰4$‰T$‰D$ƒ ̉D$ ƒ̉D$‹ƒÏå‰D$èÓ‹Uĉ<$‰T$ ‰D$‹ƒOæ‰D$趉D$‹ƒ÷â‰D$‹EÀ‰$è‹E”‹U˜ÇD$ÇD$ ‰D$ƒñ¢‰T$‰$èÁ…Àth‹E”‹U˜ÇD$ÇD$ ‰D$ƒ£‰T$‰$è‘…Àt8‹E”‹U˜ÇD$ÇD$ ‰D$ƒ£‰T$‰$èaÆEÏ…À…¹ƒ}äƒ;Ì‹“çè³+Ì‹»›è”EÏ€}ωU Dð¾EωD$‹ƒWæ‰D$‹ƒ“è‰$è»ÇD$‰t$‰<$‰D$ƒK̉D$ ƒ[̉D$‹ƒÏå‰D$è…‹UĉT$ ‰D$‹ƒOæ‰D$‹E ‰$èe‹UÀ‰$‰D$‹ƒ÷â‰D$èL‹E˜‹U”ÇD$ÇD$ ‰D$ƒL£‰T$‰$èp…À…ƒ}Èuƒk̉EÔƒ{Ì€}ÏEEÔëHƒ}ȃ»Ìu<‹E䓫̉UÔƒødt1“‹Ìƒø ‰UÔt!|“›Ìƒø ‰UÔ~“»Ì‰UÔë‰EÔ‹Eä‰D$‹ƒSæ‹»ç苳›è‰D$‹ƒ“è‰$胋UÔÇD$‰4$‰T$‰D$ƒË̉D$ ƒÛ̉D$‹ƒÏå‰D$èJ‹Uĉ<$‰T$ ‰D$‹ƒOæ‰D$è-‰D$‹ƒ÷â‰D$‹EÀ‰$è‹U˜³˜£ÇD$ÇD$ ÇD$‰T$‰4$è7…À…‹Eà‰$è¬ÇD$ÇD$ ‰4$‰E¤‹E˜‹U¤‰D$‰T$èû…À…·‹E¤‰D$‹ƒ[æ‰D$‹ƒÏè‰$è„‹U¼‰$‰Æ‰D$‹ƒÇá‰D$èi‹»çèÇD$‰t$…ÀDƉD$ƒë̉D$ ƒû̉D$‹ƒÏå‰D$‹ƒ›è‰$è"‹Uĉ<$‰T$ ‰D$‹ƒOæ‰D$è‰D$‹ƒ÷â‰D$‹EÀ‰$èì ‹U¤…Òt ‹U¤‰$è£ ‹E˜‹U”ÇD$ÇD$ ‰D$ƒ±£‰T$‰$èþ …À…¾‹ƒçè‹»›è‰E¨‹Eä‰D$‹ƒSæ‰D$‹ƒ“è‰$èx ‰Æ‹Eä‰D$‹ƒSæ‰D$‹ƒ“è‰$èW ÇD$‰t$‰<$‰D$ƒ ͉D$ ƒ͉D$‹ƒÏå‰D$è! ‹UĉT$ ‰D$‹ƒOæ‰D$‹E¨‰$è ‹UÀ‰$‰D$‹ƒ÷â‰D$èè ‹ƒ_æ‰D$‹ƒ3é‰$èÐ “+͉T$‹“Çá‰T$‰$è´ …À‰E¬„׋ƒëâ‰D$‹E¬‰$è” …À„º‹ƒä‹“çè‹»›èÇD$‰D$‹E¬‰U°‰$è` ‹U¬ÇD$‰$‰Æ‹ƒä‰D$èA ÇD$‰t$‰<$‰D$ƒ;͉D$ ƒK͉D$‹ƒÏå‰D$è ‹UĉT$ ‰D$‹ƒOæ‰D$‹E°‰$èë ‹UÀ‰$‰D$‹ƒ÷â‰D$èÒ ‹ƒÇã‰D$‹E‰$è½ …Àtx‰D$‹³çè‰D$ƒ[͉D$ ƒk͉D$‹ƒÏåÇD$‰D$‹ƒ›è‰$èw ‹Uĉ4$‰T$ ‰D$‹ƒOæ‰D$èZ ‰D$‹ƒ÷â‰D$‹EÀ‰$èA ‹ƒå‹U‰D$‰$è, …Àtx‰D$‹³çè‰D$ƒ{͉D$ ƒ‹Í‰D$‹ƒÏåÇD$‰D$‹ƒ›è‰$èæ ‹Uĉ4$‰T$ ‰D$‹ƒOæ‰D$èÉ ‰D$‹ƒ÷â‰D$‹EÀ‰$è° U܉Uœ‰T$Ç$klcmè f…À…Ê‹ƒçèò*EÜò^ƒCÁ‹»›èòD$‰E´‹ƒã‰D$‹ƒ“è‰$èW ‰Æ‹E܉D$‹ƒSæ‰D$‹ƒ“è‰$è6 ÇD$‰t$‰<$‰D$ƒ›Í‰D$ ƒ«Í‰D$‹ƒÏå‰D$è ‹UĉT$ ‰D$‹ƒOæ‰D$‹E´‰$èà ‹UÀ‰$‰D$‹ƒ÷â‰D$èÇ ‹EœÇ$mmar‰D$è f…À…¾‹EÜ‹“çè‹»›è‰D$‹ƒSæ‰U¸‰D$‹ƒ“è‰$è} ‰Æ‹E܉D$‹ƒSæ‰D$‹ƒ“è‰$è\ ÇD$‰t$‰<$‰D$ƒ»Í‰D$ ƒË͉D$‹ƒÏå‰D$è& ‹UĉT$ ‰D$‹ƒOæ‰D$‹E¸‰$è ‹UÀ‰$‰D$‹ƒ÷â‰D$èí‹EÀÄŒ[^_ÉÃU‰åSè[ƒì‹E‹P(‹ƒ<‹‰D$‹ƒÈ׉$‰D$讋“ÜÙ‰U ‰EƒÄ[Éé˜U‰åƒì8‰]ô‹EUàè[‰}ü‹}‰uø‰Eà‰$‰|$‹ƒúà‰E䃖‰D$ ‹ƒÙ‰D$èS…À‰Ætf‹ƒšÖ‰<$‰D$è6‰F(‹EÆF@‰F0‹ƒÛ‰4$‰D$èˆFA‹ƒšÖ‰D$‹E‰$èÿ‰F,‹ƒ"ÙÇD$‰4$‰D$èâ‰ð‹]ô‹uø‹}üÉÃU‰åWVSè[ƒì<‹E‹U‹u‹}‰Eä‰Uà‹ƒhÚ‰4$‰D$袄Àt"‹ƒ,‹ÇD$‹ƒlÚ‰$‰D$è|‹ƒÌÕ‰<$‰D$èj‹“ÐÕ‰T$‰$èX‹Uà‰T$‹Uä‰t$‰T$ ‹“pÚ‰$‰T$è4‹“,‹2‹“ÔØ‰$‰T$è‰E‹ƒtÚ‰u‰E ƒÄ<[^_ÉéÿU‰åƒìH‰]ôè[‰}ü‹}‰uø‹ƒ÷Û‰E䋃Õ‹W(‰D$‰$èɉ<$‰Æ‹ƒóÔ‰D$赉t$‰D$ ƒ³¹‰D$‹ƒ#Õ‰D$‹Eä‰$莋]ô‹uø‹}üÉÃU‰åƒìx‰]ôè[‰}ü‹}‰uø‰<$‹ƒÙ‰D$èY„À…Û‹ƒ×u¸‰<$‰D$è<‹“S׉4$‰T$‰D$è5‹E¸‰EÈ‹E¼ƒì‰EÌ‹EÀ‰EЋEĉEÔ‹ƒS×óEÔóE´‹W<‰D$‰4$‰T$è÷‹E¸óE´‰EØ‹E¼ƒì‰<$‰EÜ‹EÀ‰Eà‹EĉE䋃×ó\Eä‰D$óEÔ謋UÈÇD$‰T$‹Ủ$‰T$ ‹UЉT$‹UÔ‰T$‹“—׉T$èv‹]ô‹uø‹}üÉÃU‰åƒì(‰]øè[‰uü‹u‹V(‹ƒoÓ‰$‰D$èA‹V,‹ƒoÓ‰$‰D$è,‹ƒÓÝUð‰uð‰$‰Eô‹ƒ§Ô‰D$è‹]ø‹uüÉÃUèY‰å‹E‹P(‹+Ö‰U‰E ÉéâU‰åƒì8‰]ô‹Eè[‰uø‰}ü‹P(‹ƒÏÔ‹»×Ù‰$‰D$诉ƃs¹‰D$‹ƒÿÔ‰D$‹ƒçÙ‰$è‹“ƒ¹‰T$“c¸‰T$ “ó¾‰T$‹“Õ‰$‰T$è[‰t$ ‰<$‰D$‹ƒÓ‰D$èA‹]ô‹uø‹}üÉÃU‰åWVSè[쬋}³]¾‰t$‹ƒÕÒ‰<$‰D$è€@”G@‰t$‹ƒÝÒuˆ‰<$‰D$è䋃5Õ‰<$‰D$èÒ‹“ÙÖ‰T$‰$èÀ‰…hÿÿÿ‹ƒ Õ‰D$‹…hÿÿÿ‰4$‰D$è­‹Eˆ‰EØ‹EŒƒì‰EÜ‹E‰Eà‹E”‰E䋃5ÕóEäóE€‰D$‰<$èg‹“ Õ‰4$‰T$‰D$è`‹Eˆ‰EÈ‹EŒƒì‰EÌ‹EóẺEЋE”óE„‰EÔ‹ƒ ÕóEÔó…|ÿÿÿ‹W8‰D$‰4$‰T$è‹Eˆ‰E¸‹EŒƒì‰E¼‹E‰EÀ‹E”‰EÄ‹ƒ ÕóEÄó…xÿÿÿ‹W<‰D$‰4$‰T$èÔ‹Eˆ‰E¨‹EŒƒì‰E¬‹E‰E°‹E”‰E´‹ƒ Õ‹W4‰4$‰D$‰T$è ‹Eˆ‰E˜‹EŒƒì‰Eœ‹E‰E ‹E”‰E¤€@„ëóE€‹E˜óX…xÿÿÿ‰E¸‹E ó…lÿÿÿóE¬‰EÀ‹E¸ó\…xÿÿÿóE¼ó…xÿÿÿóX…|ÿÿÿó…tÿÿÿóE„ó\…xÿÿÿó…pÿÿÿ‹W8ó…xÿÿÿóEĉD$‹E¼‰D$ ‹EÀ‰D$‹EĉD$‹ƒIÕ‰$‰D$è΋W8ÇD$‹ƒmÕ‰$‰D$豋G<ÇD$ ÿÿÿÿ‰D$‹G8‰D$‹ƒÝÖ‰D$‹…hÿÿÿ‰$èƒët‹W8ÇD$‹ƒmÕ‰$‰D$èd‹W8‹ƒáÖ‰$‰D$èOóE€ó\…xÿÿÿó…lÿÿÿó…|ÿÿÿó\…xÿÿÿó…tÿÿÿóE„óX…xÿÿÿó…pÿÿÿ‹ƒ5Õ‰<$‰D$èûó…pÿÿÿóEÌó…tÿÿÿóEÔÇD$ÇD$‹UȉT$‹ỦT$ ‹UЉT$‹UÔ‰T$‹“åÖ‰$‰T$裋EØó…lÿÿÿóEä‰D$‹E܉D$ ‹Eà‰D$‹Eä‰D$‹ƒIÕ‰D$‹…hÿÿÿ‰$èbÇD$‹ƒéÖ‰D$‹…hÿÿÿ‰$èB1À‹W8€@”À‰E‹ƒmÕ‰U‰E eô[^_ÉéU‰åWVSè[ƒì<‹E‹}‰Eä‹W0‹ƒÒÒ‰D$‹ƒNΉ$‰D$èäÿ„Àu3‹G0‰D$ƒRº‰D$ ƒbº‰D$‹ƒωD$‹ƒîÔ‰$è­ÿ‹ƒþ‹W(‹‰D$ ¾GA‰D$‹ƒZΉ$‰D$è„ÿ‹ƒnÑ‹w0‰D$‹Eä‰$èlÿH•À¶À‰D$‹ƒÒÒ‰4$‰D$èOÿ‹ƒщ<$‰D$è=ÿ‹“¾Ð‰T$‰$è+ÿ‹ƒrþ‹‹ƒÖÒ‰$‰D$èÿ‹ƒ®Î‰}‰E ƒÄ<[^_ÉéùþU‰åWVSè[ƒì,‹}‰<$‹ƒðÌ‹³Ô‰D$èÏþ‰4$³P¹‰D$‹ƒ`щD$è³þ‹U‰t$ ‰T$‹“dщ$‰T$è–þ…À‰Ául‹ƒ¸Ñ‰D$‹E‰$è{þ“`¹‰T$‹“¼Î‰T$‰$è_þ‰D$‹ƒTΉD$‹ƒÔ‰$èCþ‹U‰t$ ‰T$‹“dщ$‰T$è&þ‰Á‹ƒ¤×Uà‰}à‰|$ ‰L$‰E䋃¼Ñ‰$‰D$èþƒÄ,[^_ÉÃU‰åVSè[ƒìp‹Eu¦‰D$‹ƒË͉D$‹ƒ¿Ò‰$èÃý‰t$‰$èêü„Àt,Eö‰D$E÷‰D$‰4$èýf…Àu€}÷t €}ö¸u1ÀƒÄp[^ÉÃU‰åWVSƒì\‹E‹Uè[‰EЋE‰UÌ‹U‰EÈ‹E ‰UĶU‰E¼‹ƒ˜ËˆUÉD$‹Eȉ$è5ý‹“ ͉T$‰$è#ý‰EØ‹ƒh͉D$‹Uȉ$è ý‰Æ‹ƒ˜Ë‰D$‹Eȉ$èôü‹“ì̉T$‰$èâü‰D$‹ƒð̉4$‰D$èÌü‰EÜ‹ƒÄ̉D$‹ƒ”Ò‰$è±ü‹ỦT$‹“4͉$‰T$è˜ü‰Eà鯉|$‹ƒ8͉D$‹Ẻ$èwü‰E䋃 ͉<$‰D$èbü‹U؉T$‹“Ổ$‰T$èIü„À…ˆ‹ƒ ͉<$‰D$è/ü‹U܉T$‹“Ổ$‰T$èü„À…U‹ƒì̉<$‰D$èüû“ì·‰UÔ‰T$‹“Ổ$‰T$èÝû„Àu2‹ƒì̉<$‰D$èÇû“ü·‰T$‹“ỔT$‰$è«û„ÀtY‹ƒ ͉<$‰D$è•û‹“ä̉T$‰$èƒû‰Æ‹ƒä̉D$‹E؉$èlû‰D$‹ƒỔ4$‰D$èVû„À…Ž‹Uä‰T$‹ƒÐ̉D$‹ƒ€Ò‰$è/û…À‰ÂtY‹ƒ$Ή$‰D$èû‰Æ‹ƒ4̉D$‹Eȉ$èû‹“$ΉT$‰$èîú‰D$‹ƒỔ4$‰D$èØú„À…‹Uä‰T$‹ƒ<ЉD$‹EЉ$è´ú„À…¶‹ƒì̉<$‰D$èšú‰Æ‹ƒ˜Ë‰D$‹Uȉ$èƒú‹“ì̉T$‰$èqú‰D$‹ƒỔ4$‰D$è[ú„Àua‹ƒì̉<$‰D$èEú‹UÔ‰T$‹“Ổ$‰T$è,ú„Àu2‹ƒì̉<$‰D$èú“ü·‰T$‹“ỔT$‰$èúù„Àt‹ƒ@ЉD$‹Eà‰$èáù‹ƒ”̉D$‹Uà‰$èÌù…À‰Ç…2ýÿÿë¸ë1À‹Uä…Ò…“‹ƒˆû‹³ŒÒ‹‰D$ ƒ ¸‰D$‹ƒÍ‰D$‹ƒˆÒ‰$èxù‰D$‹ƒÔû‹‰D$ ‹ƒ˜û‹‰D$‹ƒ͉4$‰D$èJù‹UÄÇE‰U‹UЉE‹EȉE‹ƒDЉU‰E ƒÄ\[^_Ééù„Àt‹ƒlˉD$‹ƒÜÒ닃lˉD$‹ƒØÒ‰$èëø‰Â‹E¼‰E ¾EÉE‹EĉE‹EȉE‹Eä‰E‹ƒHЉU‰E ƒÄ\[^_Éé²øU‰åWVSè[ƒì,‹E‰E䋃­Æ‰D$‹ƒ Ή$è…ø‹“µÆ‰T$‰$èsø‹“EljT$‰$èaø‰ÆƒY³‰D$‹ƒ™Ê‰4$‰D$èCø‹ƒÕÆ‹»y͉D$‹Eä‰$è(ø‰D$‹ƒaȉ<$‰D$èø‰D$‹ƒÊ‰4$‰D$èü÷‹ƒµÊ‰u‰E ƒÄ,[^_Ééä÷U‰åƒì8‹E‰]ô‹Uè[€}‰uø‹u‰}ü‹}‰EäuT‰|$‹ƒ²Ê‰$‰D$è¤÷‹ƒ¶Ê‰D$‹ƒƉ4$‰D$èˆ÷„Àtb‰}‹ƒ¶Ê‹}ü‰u‹]ô‹uø‰E Ééf÷‹ƒºÊ‰D$‹ƒƉ4$‰D$èJ÷„Àt$‹Eä‰}‹}ü‰E‹ƒºÊ‰u‹]ô‹uø‰E Éé"÷‹]ô‹uø‹}üÉÃU‰åWVSè[ƒìL‹}‰|$‹ƒrƉD$‹ƒ"̉$èéö“Žª‰UЉT$‹“þʼn$‰T$èÊö‰Æ‹ƒFȉD$‹E‰$è³ö‰t$ ‰D$‹ƒúɉD$‹E‰$è–öH…ß‹ƒrÆ‹“̉|$‰D$‹ƒ"̉UÔ‰$èjö‹UЉT$‹“þʼn$‰T$èQö‰Æ‹ƒFȉD$‹E‰$è:ö‹UÔ‰t$‰$‰D$ ƒ²‰D$‹ƒ>ʼnD$èö‹“*õ‹³.Ì‹‰D$‹ƒ¢Æ‰T$ ‰D$‹ƒ*̉$èåõ‰D$‹ƒzõ‹‰D$ ‹ƒ:õ‹‰4$‰D$‹ƒ¦Æ‰D$è·õ1Ò‰Eäë;‹ƒ:ʼnD$‹E‰$è›õUä‰T$‹U‰|$‰$‰D$ ‹ƒþɉD$èwõ‰Â‹E‰D$‹Eä‰D$‹E‰D$ ¾Â‹U‰D$‹ƒæÉ‰$‰D$èDõƒÄL[^_ÉÃU‰åWVSè[ƒì<‹E‹u‰EØ‹ƒ7ÉD$‹ƒ‹Ê‰$è õ‹“?ÉT$‰$èúô‰E䋃ǧ‰D$‹ƒ/É4$‰D$èÛô‰EÜ‹ƒË§‰D$‹ƒ/É4$‰D$è¼ô‰Eà‹ƒÏ§‰D$‹ƒ/É4$‰D$èô‰Ç‹ƒÓ§‰D$‹ƒ/É4$‰D$èô‹U܉T$‹Uà‰|$ ‰D$‰T$‹ƒ'ȉD$‹E؉$èTô‹ƒÇ‹Uä‰E ‰UƒÄ<[^_Éé9ôU‰åƒìH‰]ôè[‰uø¶u‰}ü‹}ÇD$(‹ƒÁ¦‰D$$‹E ‰D$ ‹ƒÅ¦‰D$‹E‰D$‹ƒÉ¦‰D$‹E‰D$‹ƒÍ¦‰D$ ‹E‰D$‹ƒaĉD$‹ƒIɉ$è¹ó‰ò„Òt‰E‹ƒ%Ç‹uø‰}‹]ô‹}ü‰E Éé•ó‰}‹uø‰E‹ƒ%Ç‹}ü‰E‹ƒ)ljE ‹ƒ¡É‹]ô‰EÉéeóU‰åWVSƒìL‹Eè[‹U‰Eà‹E‰UÜ‹U‰EØ‹ƒÆñ‰UÔòò$èäòÝ]ÈòEÈf.ƒÖ …Âм‹ƒÉD$‹ƒnȉ$èöò“f®‰T$‹“VƉT$‰$èÚò‰E䋃®Â‰D$‹ƒ~ȉ$è¿ò‹Uä‰T$‹“Þ‰$‰T$è¦ò„À‰Ç„=‹³¶ÈÇD$ ‹E܉D$‹ƒZʼnD$‹ƒ&ȉ$èoò‰D$ ‹Uä‰T$‹ƒZƉ4$‰D$騋ƒ®Â³v®‰D$‹ƒ~ȉ$è4ò‰t$‹“Þ‰T$‰$èò„À‰Ç„µÇD$‹E܉D$ƒf®‰D$ƒ†®‰D$ƒ–®‰D$ ƒ¦®‰D$‹ƒZʼnD$‹ƒ&ȉ$èÅñ‰t$‰D$ ‹ƒZƉD$‹ƒ¶È‰$è¥ñ‹“^ƉT$‰$è“ñ1À‹UÔ‰E‹E؉U‰ú‰E¾Â‰E‹ƒ.ƉE ‹Eà‰EƒÄL[^_Éé_ñ‹ƒrñ‹³vÈ‹‰D$ ƒ¶®‰D$‹ƒê‰D$‹ƒrȉ$è+ñ‰D$‹ƒÊñ‹‰D$ ‹ƒ‚ñ‹‰D$‹ƒî‰4$‰D$èýðégÿÿÿU‰åWVSè[ƒì\‹EUà‰$‰Eà‹ƒ£Ê‰Eä‹E‰D$ ‹E‰D$‹ƒ§¿‰D$è¼ð‹ƒûËU‰D$‰$è¢ð„À„ ‹ƒÆ‹“ Æ‹»óʼnEÄ‹ƒ ï‰UÈ‹‰EÌ‹ƒëÀ‰D$‹E‰$èbð‰Æƒ¥‰D$‹ƒÁ‰D$‹ƒƉ$è>𓟥‰T$“¤‰T$ “_¬‰T$‹“Á‰$‰T$èð‰t$ ‰<$‰D$‹ƒ¿‰D$èôï‹ỦT$ ‰D$‹ƒƒÀ‰D$‹Eȉ$èÔï‹UĉD$‹ƒoD$ ‹ƒ$‰D$‹ƒ‡À‰D$è£ï‰D$‹ƒÿÉD$‹Eé‹‹ƒó¾‰D$‹ƒ{Ɖ$èuï‹“û¾‰T$‰$ècï‰EЉ$èÿ¾‹UЉD$‰$èCï‹E‹UЉD$‹ƒĉ$‰D$è'óʼnEÔƒ¥‰D$‹ƒÁ‰D$‹ƒƉ$èüî“o¤‰T$‹“ß¿‰T$‰$èàî‹U‰$‰Ç‹ƒ#‰D$èÉî‰Æ‹ƒëÀ‰D$‹E‰$è²î‹UÔ‰t$‰|$‰$‰D$ ƒo¬‰D$‹ƒ¿‰D$è‡î‹“ÄÇD$ ÇD$‰T$‰$èe‹³óʼnT$‰$èMîÇD$ ‰4$‰D$‹ƒ ĉD$è/î‰D$‹ƒĉD$‹EЉ$èÄ‹U‰D$‹EЉT$‰$èúíƒÄ\[^_ÉÃU‰åVSè[ƒì‹u‹V‹ƒÁ‰$‰D$èÌí‹“Á‰T$‹“&¼‰$‰T$è°í„Àt2‹V‹ƒÁ‰$‰D$è—í‹V‰T$‹“Á‰$‰T$è~í…Àu‹ƒÁ‰E ‹ƒNÉEƒÄ[^Éé]íƒÄ[^ÉÃU‰åƒì(‰]ôè[‰uø‰}ü‹ƒ~À‰D$‹E‰$è,í‰Ç‹ƒÒ½‰D$‹E‰$èí‰Æ‹E‹P‹ƒ‚¾‰$‰D$èûì‰t$ ‰<$‰D$‹ƒ6À‰D$èáì‹]ô‹uø‹}üÉ@”ÀÃU‰åWVSè[ƒì‹ƒ%¾‰D$‹E‰$è®ì…À„‚‹ƒ%¾‰D$‹E‰$è‘ì“Y ‰T$‹“1¼‰T$‰$èuì„ÀuM‹E‹P‹ƒÀ‰$‰D$èYì‰Æ‹ƒ%¾‰D$‹E‰$èBì‰4$‰D$‹ƒ½‰D$è,ì„À„¸‹ƒÀ‰D$‹E‰$èì…À„Ÿ‹ƒÀ‰D$‹E‰$èòë“Y ‰T$‹“1¼‰T$‰$èÖë„Àuj‹ƒù¿‰D$‹ƒ-‰$èºë‰Ç‹ƒI¿‰D$‹ƒÑÁ‰$è ë‰Æ‹ƒÀ‰D$‹E‰$è‰ë‰t$ ‰<$‰D$‹ƒµ¿‰D$èoëHu1À븃Ä[^_ÉÃU‰åƒì(‰]ôè[‰uø‹u‰}ü‹V‹ƒÓ鋉$‰D$‹ƒƒ¹‰D$è"ë‰Ç1À…ÿtI‹ƒƒ¾‰4$‰D$èë‰Æ‹ƒ×»‰D$‹E‰$èñê‰|$ ‰4$‰D$‹ƒ;¾‰D$è×êƒø•À‹]ô‹uø‹}üÉÃU‰åƒì(‰]ôè[‰uø‹u‰}ü‹}‰t$‹ƒú½‰<$‰D$è•ê„Àt9‹ƒþ½‰t$‰<$‰D$è{ê„Àt‹ƒ¾‰t$‰<$‰D$èa꺄Àt1Ò‹]ô‰Ð‹uø‹}üÉÃU‰åWVSè[ƒì,‹E‹}‰Eà‹W‹ƒh½‰$‰D$èê‹“Œ½‰T$‹“|¸‰$‰T$èê„Àt5‹W‹ƒh½‰$‰D$èçé‹Uà‰T$ ‹W‰T$‹“Œ½‰$‰T$èÇé‹W‹ƒh½‰$‰D$è²é‹“½‰T$‹“|¸‰$‰T$è–é„Àt9‹W‹ƒh½‰$‰D$è}é‹W‰T$ ‹Uà‰T$‹“½‰$‰T$è]鉯ë_‹ƒ”½‰D$‹Eà‰$èDé‹“d¹‰T$‰$è2é‰E䋃h¹‰D$‹Uä‰$èé…À‰Æt‰D$‹ƒ€½‰<$‰D$èþè„ÀtË‹ƒT¸‰4$‰D$èèè‰G‹Eà‰$èþç‹G…Àt2‰D$‹ƒœ½‰<$‰D$è½è„Àt‹ƒ ½‰E ‰}ƒÄ,[^_Éé¡è‹ƒ˜½ëæU‰åƒì(‰]ô‹Eè[‰uø‹u‰}ü‹}‰$è—ç‰u‹ƒš»‹uø‰}‹]ô‹}ü‰E ÉéUèU‰åVSè[ƒì‹u‹V‹ƒu»‰$‰D$è/è‹“±»‰T$‹“‰¶‰$‰T$èè„Àt5‹V‹ƒu»‰$‰D$èúç‹V‰T$ ‹V‰T$‹“±»‰$‰T$èÚ狃µ»‰u‰E ƒÄ[^ÉéÃçU‰åWVSè[ƒì<‹E‹P‹ƒâº‰$‰D$èœç‹“&»‰T$‹“öµ‰$‰T$è€ç„Àt4‹M‹ƒâº‹Q‰D$‰$èdç‹M‹Q‰$‰T$‹“&»‰T$èH狃ڼ‹M‹“Ö¼‹»¾¼‰EÜ‹ƒÖå‰Uà‹‰E䋃¶·‹Q‰D$‰$è ç‰ÆƒZœ‰D$‹ƒæ·‰D$‹ƒÎ¼‰$èéæ“jœ‰T$“J›‰T$ “J£‰T$‹“ê·‰$‰T$è¹æ‰t$ ‰<$‰D$‹ƒêµ‰D$èŸæ‹Uä‹Mà‰T$ ‰ $‰D$‹ƒN·‰D$èæ‰D$‹ƒN拉D$ ‹ƒæå‹‰D$‹ƒR·‰D$‹E܉$èNæ‹U‰$‰D$‹ƒÊº‰D$è5æƒÄ<[^_ÉÃU‰åƒì(‰]ôè[‰uø‰}ü‹ƒ%´‰D$‹ƒY»‰$èæ‹»a»‰Æ‹E‹P‹ƒ‘¹‰$‰D$èàå‰<$‰D$‹ƒ•¹‰D$èÊå‹U‰4$‰T$ ‰D$‹ƒùµ‰D$è­å‹U‰B‹]ô‹uø‹}üÉÃU‰åWVSè[ƒìL‹E‹U‰EЉUÌ‹ƒµ‰$‰D$èoå“3¡‰T$‹“û´‰T$‰$èSå„Àt‹ƒ µ‰D$‹M̉ $è:å‰EÌ‹EЋ»—º‹P‹ƒË¶‰$‰D$èå‹MЋQ‰Æ‹ƒµ‰$‰D$èÿä‰t$‰D$ ƒC¡‰D$‹ƒÃ³‰<$‰D$èÛä‰EÜè[ä‹U܉T$‹“_µ‰$‰T$èºä‹S¡ÇEä‰MÔ‰EàëTè(ä‹}äG‰Æ‹Eä‰D$‹U܉T$ ‹MÔ‰L$‹ƒÃ³‰D$‹ƒ—º‰$èmä‰D$‹ƒ_µ‰4$‰D$èWä‰}ä‰Eà‹ƒë´‰D$‹ƒ»º‰$è9ä‹Uà‰T$‹“µ‰$‰T$è ä„Àt }äè…jÿÿÿ‹ƒë´‰D$‹ƒ»º‰$è÷ãÇD$ ‹Mà‰L$‹“ ¹‰$‰T$èÖã„À…¼‹EЋP‹ƒ¹‰$‰D$è¶ã‹ƒ¯ã‹“³º‹Mà‹»¯º‹0ƒc¡‰U؉L$ ‰D$‹ƒÃ³‰D$‹ƒ—º‰$èvã‰t$ ‰D$‹ƒ'µ‰<$‰D$è\ã‰D$‹ƒ䋉D$ ‹ƒ¿ã‹‰D$‹ƒ+µ‰D$‹E؉$è+ã‰D$‹ƒ£¸‰D$‹UЉ$èã‹M̉L$‹ƒ_µ‰D$‹Eà‰$èöâ‹“§³‰T$‰$èäâ‹UЉB‹MЋQÇE‰E‹ƒoµ‰U‰E ƒÄL[^_Éé¶âU‰åWVSè[ƒì<‹E‰E䋃-¶³ž‰D$‹E‰$è†â‹“õ³‰T$‰$ètâ‰Ç‹ƒ1¶‰<$‰D$è`â‰t$‹“²‰T$‰$èJâ„À„„‹Eä‹P ‹ƒ1¶‰$‰D$è*â‰t$‹“²‰T$‰$èâ„ÀtR‹ƒ¡³‰<$‰D$èþá„Àt<‹Uä‹B ‹“¡³‰$‰T$èâá„Àt ‹Uä‹B‹“5¶‰$‰T$èÆá…À„ä‹Eä‹»5¸‹P‹ƒ5¶‰$‰D$è á‰Æ‹Eä‹P‹ƒ9¶‰$‰D$è†á‰t$‰D$ ‹Uä‹B‰D$‹ƒ=¶‰<$‰D$èbá„À…€‹ƒÉà‹³Í·‹‰D$ ƒž‰D$‹ƒA²‰D$‹ƒÉ·‰$è&á‰D$‹ƒ9ዉD$ ‹ƒÙà‹‰D$‹ƒE²‰4$‰D$èøà‰E‹ƒ½µ‰E ‹Eä‰EƒÄ<[^_ÉéÚà‹ƒA¶‹Uä‰E ‰UƒÄ<[^_Éé¿àU‰åWVSƒìL‹E‹Uè[‰E؉UÔ‹U؃=”‰EЋB…À„¦‹ƒ]°‰D$‹ƒÅµ‰$èuà‹³}µ‰Ç‹EØ‹P‹ƒa°‰$‰D$èUà‰D$‹ƒe°‰4$‰D$è?à“=”‰UЉƋEØ‹P‹ƒM°‰$‰D$èàÇD$‰t$‹UЉD$ ‹ƒÍÞ‰T$‹‰D$‹ƒi°‰<$‰D$èçß‹ƒÍµ‹“ɵ‰EÜ‹ƒíÞ‰Uà‹‰E䋃ñ°‰D$‹EÔ‰$èµß‰Ç‹ƒÉÞ‹0ƒM•‰D$‹ƒÙ°‰D$‹ƒÁµ‰$è‰ß“]•‰T$‹UЉT$ “­œ‰T$‹“ݰ‰$‰T$è\ßÇD$‹Uä‰|$‰t$ ‰T$‰D$‹ƒá°‰D$‹Eà‰$è,߉D$‹ƒ5ß‹‰D$ ‹ƒÙÞ‹‰D$‹ƒE°‰D$‹U܉$èûÞ‰E‹ƒ½³‰E ‹E؉EƒÄL[^_ÉéÝÞU‰åSè[ƒìƒæš‰D$‹ƒn²‰D$‹E‰$è±Þ=ÿÿÿ”ÀƒÄ[ÉÃU‰åƒì(‰}ü‹}‰]ôè[‰uø‹G‰D$‹ƒ-²‰D$‹ƒ´‰$èlÞ…À‰Æu:‹G‰D$ƒ±š‰$èÏÝÇD$‹ƒ1²‰<$‰D$è7Þ‹]ô‹uø‹}üÉÉ$èM݉|$‹ƒ¥±‰4$‰D$èÞ‹ƒ5²‹}ü‰u‹]ô‹uø‰E ÉéóÝU‰åƒì‹E‰]øè[‰uü‹u…Àt‰$èóÜ‹ƒŒ±‰u‹]ø‹uü‰E Éé·ÝU‰åWVSƒì<‹Eè[‰Eà‹E…Àt‰$è·Ü‹ƒÈ²‹»Ä²‰E䋃ÄÛ‹0ƒH’‰D$‹ƒÔ­‰D$‹ƒ¼²‰$èZÝ“X’‰T$“8‘‰T$ “Ø™‰T$‹“Ø­‰$‰T$è*݉t$ ‰D$‹ƒ<­‰<$‰D$è݉D$‹ƒ@Ü‹‰D$ ‹ƒÔÛ‹‰D$‹ƒ@­‰D$‹Eä‰$èß܉E‹ƒ¸°‰E ‹Eà‰EƒÄ<[^_ÉéÁÜU1À‰åÉÃU‰åWVSè[ƒì<‹E‹P‹ƒÙ¯‰$‰D$è“Ü‹“]°‰T$‹“íª‰$‰T$èwÜ„Àt;‹M‹ƒÙ¯‹Q‰D$‰$è[Ü‹M‹Q‰T$ ‹Q‰$‰T$‹“]°‰T$è8Ü‹ƒ±ª‹³Å±‰D$‹E‰$è܉4$‰D$‹ƒ!¯‰D$èÜ“A‰T$ “ñ˜‰T$‹“%¯‰$‰T$èáÛ‰ÇèbÛ‰<$‰Æ‹ƒe¬‰D$èÆÛ‰4$‰D$‹ƒ}¬‰D$è°Û‰Æ‹ƒ ¬‰D$‹ƒÙ±‰$è–Û‹“™¬ÇD$ ‰t$‰T$‰$èxÛ‹ƒ ¬‰D$‹ƒÙ±‰$è`Û‹“]¬ÇD$‰t$ ‰|$‰T$‰$è>Û„Àt‹ƒÅª‰4$‰D$è(Û‹U‰B ‹ƒå¯‹‹1²‰D$‹E‰Mà‰$èÛ‹U‰$‰Ç‹ƒa°‰D$èíÚ‹MˆE狃Q¬‹Q‹q‰D$‰$èÏÚ¾Uç‹Mà‰|$‰t$ ‰T$‹U‰ $‰D$‹ƒe°‰T$‰D$èŸÚƒÄ<[^_ÉÃU‰å‹U‹EèY9Bu‹C®‰E ÉétÚÉÃU‰åWVSè[ƒìL€»›… ‹E‹P‹ƒ‘­‰$‰D$è>Ú‹“%®‰T$‹“¥¨‰$‰T$è"Ú„À„ä‹U‹ƒi¨‹³å¯‰$‰D$èÿÙ‹“!®‰T$‹“)®‰$‰T$èãÙ‹“}¨‰T$‰$èÑÙ‰4$‰D$‹ƒ-®‰D$è»Ù‰Æ‹ƒ!®‰4$‰D$‹ƒ1®‰D$èÙ‹M‹ƒé«‰4$‰L$‰D$è„Ù‹Eƃ›‹P‹ƒ‘­‰$‰D$èeÙ‹M‰t$‹Q‰T$ ‹Q‰$‰T$‹“%®‰T$è>Ù„À…¶‹ƒ5®‰D$‹E‰$è!Ù‹ƒ%©‰D$‹ƒM¯‰$è Ù‹U‰T$ ‹“ùØ‹‰$‰T$‹“9®‰T$è䨋M‹ƒ‘­‹Q‰D$‰$èÌØ‹“=®‰T$‹“¥¨‰$‰T$è°Ø„Àt4‹E‹P‹ƒ‘­‰$‰D$è”Ø‹M‹Q‰$‰T$‹“=®‰T$èxØ‹E‹P …Òt<‹ƒÁ©‰D$‹ƒ‘¯‰$èVØ‹M‹Q ‰$‰T$‹“ñ©‰T$è:Ø„À…`‹ƒ‰¯‹M‹“…¯‰EÌ‹ƒ©Ø‰UЋ‰EÔ‹A ‰D$ ƒ¹–‰D$‹ƒ™¨‰D$‹ƒm¯‰$èé׋»m¯‰EØ‹ƒ…Ø‹‰EÜ‹E‹P‹ƒeª‰$‰D$è½×‰Æƒ ‰D$‹ƒ•ª‰D$‹ƒ}¯‰$è™×“‰T$“ù‰T$ “É–‰T$‹“™ª‰$‰T$èi׉t$ ‰<$‰D$‹ƒ™¨‰D$èO׋UÔ‹MØÇD$‰T$‹U܉L$‹MЉD$‹ƒª‰T$ ‰ $‰D$è׉D$‹ƒñØ‹‰D$ ‹ƒ•Ø‹‰D$‹ƒª‰D$‹Ẻ$èèÖ‹U‰D$‹ƒy­‰D$éJ‹M‹ƒ•¨‹Q‰D$‰$èºÖ‰Eä‹E‹P‹ƒ‘­‰$‰D$èŸÖ‹“A®‰T$‹“¥¨‰$‰T$èƒÖ„Àt7‹M‹ƒ‘­‹Q‰D$‰$ègÖ‹M‹Q‰$‰T$‹“A®‰T$èKÖ‰E䋃ɯ‹»9¯‹³m¯‰Eà‹ƒE®‰D$‹ƒá¯‰$èÖ‹“I®‰T$‰$è Ö‰4$‰D$ ƒÙ–‰D$‹ƒ™¨‰D$èéÕ‹UäÇD$‰<$‰T$‰D$ ‹ƒm¬‰D$èÄÕ‹M‰D$ ‹A ‰D$‹ƒm­‰D$‹Eà‰$è¡Õ‹ƒÉØ‹M‹‹ƒM®‰L$‰D$‰$è€ÕƒÄL[^_ÉÃU‰åƒì‰]øè[‰uü‹ƒÄ¤‰D$‹ƒ”ª‰$èNՉƋE‹P‹ƒ ¥‰$‰D$è4Õ‰4$ÇD$ ‰D$‹ƒT¥‰D$èÕ‹]ø‹uüÉÃU‰åƒìH‰}ü‹}‹E‰]ô‰uø‹uè[9G…G‹ƒK¤‰D$‹ƒª‰$èÏÔÇD$ ‹W ‰T$‹“Û¤‰$‰T$è®Ô‹ƒª‹“ª‰EØ‹ƒ3Ó‰UÜ‹‰Eà‹ƒ7¥‰4$‰D$èÔ‰E䋃Ó‹0ƒ“‰‰D$‹ƒ¥‰D$‹ƒª‰$èRÔ“£‰‰T$“ƒˆ‰T$ “s‘‰T$‹“#¥‰$‰T$è"ÔÇD$‹Uà‰T$‹Uä‰t$ ‰D$‰T$‹ƒ'¥‰D$‹E܉$èïÓ‰D$‹ƒkÓ‹‰D$ ‹ƒÓ‹‰D$‹ƒ‹¤‰D$‹U؉$è¾Ó‹uø‰E‹ƒ¨‰}‹]ô‹}ü‰E Éé Ó‹]ô‹uø‹}üÉÃU‰åƒì(‰]øè[‰uü‹u‹ƒE¢‰D$‹ƒm¨‰$èhÓ‹“a¢‰t$‰T$‰$èRÓ‹ƒ=­Uð‰uð‰$‰Eô‹ƒq§‰D$è6Ó‹]ø‹uüÉÃU‰åƒì(‰]ôè[‰uø‹u‰}ü‹}‹ƒ §‰4$‰D$èüÒ‹“±Ñ;t$‹ƒa£‰4$‰D$èàÒ‰D$ƒ­‰$èLÒ‹ƒ §‰4$‰D$è¼Ò…Àt$‹ƒ §‰4$‰D$è¦Ò‰D$ƒ½‰$èÒ‹W…Òt‹ƒ™¦‰$‰D$è{Ò‹ƒ§‹uø‰}‹]ô‹}ü‰E Éé`ÒU‰åVSè[ƒì ‹u‹V‹ƒh ‰$‰D$è:Ò‹V‹ƒh ‰$‰D$è%Ò‹V‹ƒh ‰$‰D$èÒ‹V ‹ƒh ‰$‰D$èûÑ‹ƒ ¬Uð‰uð‰$‰Eô‹ƒ ¡‰D$èßÑƒÄ [^ÉÃU‰åWVSè[ƒì,‹u‹ƒÎŸ‰D$‹ƒb§‰$è©Ñ‹V‰T$ ‹V‰$‰T$‹“¾¥‰T$è‰Ñ‰F(‹“Þ¤‰$‰t$‰T$èpÑ‹V‹ƒò¤‰$‰D$è[Ñ‹“.¥‰T$‹“ ‰$‰T$è?Ñ„Àt5‹V‹ƒò¤‰$‰D$è&Ñ‹V‰T$ ‹V‰$‰T$‹“.¥‰T$èÑ‹F‹“f¤‰$‰T$èñЄÀtQ‹V(‹ƒÒ¢‰$‰D$èØÐ‹“Â¥ÇD$‰T$‰$è¾Ð‹ƒ*Ћ‹ƒj¤ÇD$‰$‰D$èœÐ‹»*Ћ“Æ¥‹‰T$‰$è‚ЄÀt-‹V(‹ƒÒ¢‰$‰D$èiЋ“Ê¥‰t$‰T$‰$èSÐëJ‹ƒ† ‰D$‹ƒ®¦‰$è9Ћ‰T$‹“jЋ‰t$‰$‰T$‹“Î¥‰T$ ‹“Ž ‰T$èЃÄ,[^_ÉÃU‰åWVSè[ƒì\‹}‹W‹ƒ£‰$‰D$èØÏ‹“b£‰T$‹“2ž‰$‰T$è¼Ï„Àt.‹W‹ƒ£‰$‰D$è£Ï‹W‰T$‹“b£‰$‰T$èŠÏ‹ƒŠ¥‰EÌ‹ƒ*¡‹W‰D$‰$èlωEЋƒòŸ‹W‰D$‰$èTÏ“–„‰U؉EÔ‰T$‹ƒ" ‰D$‹ƒ ¥‰$è,Ï“¦„‰UÜ“†ƒ‰Uà‹U܉T$‹Uà‰T$ “¦Œ‰T$‹“& ‰$‰T$èðΉEä‹E؉D$‹ƒ" ‰D$‹ƒ ¥‰$èÎ΋U܉T$‹Uà‰T$ “¶Œ‰T$‹“& ‰$‰T$è¤Î‰Æ‹E؉D$‹ƒ" ‰D$‹ƒ ¥‰$èƒÎ‹U܉T$‹Uà‰T$ “ÆŒ‰T$‹“& ‰$‰T$èY΋UЉT$ ‹UÔ‰T$‹Uä‰t$ ÇD$ÇD$‰T$‰D$‹ƒþ£‰D$‹Ẻ$èΉD$‹ƒ¤‰<$‰D$è΋ƒÞ£‰}‰E ƒÄ\[^_ÉééÍU‰åVSè[ƒì ‹u‹V(‹ƒéž‰$‰D$èÃÍ‹“ᡉt$‰T$‰$è­Í‹ƒœ‰D$‹ƒÅ¢‰$è•Í‹“AÌ‹‰t$‰$‰T$“ÁЉT$ ‹“ñ¡‰T$èiÍƒÄ [^ÉÃU‰åWVSè[ƒìL‹}‹u‹W(‹ƒi›‰$‰D$è8Í‹‹ÝËÇG(‹W‹ÇD$‰D$ ‹ƒœ‰$‰D$è̓þ„®rƒþ…»é^‹ƒ]›‰D$‹ƒé¢‰$è×Ì‹W‰T$‹“m¡‰$‰T$è¾Ì‰G$‰Æƒù‰EÔ‰D$‹ƒ…‰D$‹ƒm¢‰$è”̋逓 ‚‰M܉U؉T$“IЉL$ ‰T$‹“‰‰$‰T$è^ÌÇD$ÇD$ ÇD$‰D$‹ƒq¡‰4$‰D$è0Ì‹G$‹UÔ‹³u¡‰Eà‰T$‹ƒ…‰D$‹ƒm¢‰$èÌ‹M؉L$‹U܉T$ “YЉT$‹“‰‰$‰T$èÛËÇD$‰t$‰|$ ‰D$‹ƒy¡‰D$‹Mà‰ $è²Ë‹W$‰|$‹ƒ}¡‰$‰D$è™Ë‹ƒÁ ëF‹G‹“ÝˉE䋃á‹2‹W‰D$‰$ènˉt$ ‰D$‹ƒœ‰D$‹Mä‰ $èQË‹ƒA¡‰E ‰}ƒÄL[^_Éé9˃ÄL[^_ÉÃU‰åƒì8‰]ø‹Eè[‰uü‹p$‹ƒJŸ‰D$‹E‰$èË-€ò*ÊòY‹âxfnÀóæÀf)EèòXƒòxòXÁf)EèÝEèÝ]‹ƒŽœ‰u‹]ø‹uü‰E Éé·ÊU‰åVSè[ƒì0òEòEðf.ƒ7xsezcƒO‹³³Ÿ‰D$‹ƒÛš‰D$‹ƒÃŸ‰$èkÊ“_‰T$“?~‰T$ “¿‡‰T$‹“ßš‰$‰T$è;ÊòMð‰D$ëzòEðf.ƒ?xs|zzƒO‹³³Ÿ‰D$‹ƒÛš‰D$‹ƒÃŸ‰$è÷É“_‰T$“?~‰T$ “߇‰T$‹“ßš‰$‰T$èÇÉòMðòY‹Gx‰D$ƒÏ‡òL$ é!òEðf.ƒOxƒˆŠ‚ƒO‹³³Ÿ‰D$‹ƒÛš‰D$‹ƒÃŸ‰$èdÉ“_‰T$“?~‰T$ “T$‹“ßš‰$‰T$è4ÉòƒGxòMðòYÈòYÁòD$ ‰D$ƒÿ‡é†ƒO‹³³Ÿ‰D$‹ƒÛš‰D$‹ƒÃŸ‰$èâÈ“_‰T$“?~‰T$ “ˆ‰T$‹“ßš‰$‰T$è²ÈòƒGxòMðòYÈòMðòYÈòYÁòD$ ‰D$ƒˆ‰D$‹ƒß˜‰4$‰D$ènȃÄ0[^ÉÃU‰åWVSè[ƒìl‹E‹u‰EÌ‹x$ƒŠœ‰<$‰D$è>ÈfnÎóæÉf)M¸òX‹>vf)M¸Ý]°òE°òXE¸òD$‹ƒî™‰<$‰D$èõÇ‹EÌ‹P$‹ƒŽœ‰$‰D$èçÇÝ]ÐòEÐf.ƒ¾u†ÿ‹EÌ‹@$‰EÜ‹ƒb‰Eà‹ƒŽœ‰D$‹E܉$èªÇÝ\$‹ƒ’œ‰D$‹Ẻ$è‡Ç‰Ç‹EÌ‹P$‹ƒŠœ‰$‰D$èwÇÝ\$‹ƒ’œ‰D$‹Ẻ$èTljƃþ|‰D$‹ƒŠ˜‰D$‹ƒr‰$è0Ç“}‰T$“î{‰T$ “Þ…‰T$‹“Ž˜‰$‰T$èlj|$‰t$ ‰D$‹ƒŽ–‰D$‹Eà‰$è߯‰E‹ƒÎ™‰E ‹E܉E麋EÌ‹x$‹ƒb‰Eä‹ƒŠœ‰<$‰D$è±ÆÝ\$‹ƒ’œ‰D$‹Ẻ$èŽÆ‰Æƒþ|‰D$‹ƒŠ˜‰D$‹ƒr‰$èjÆ“}‰T$“î{‰T$ “î…‰T$‹“Ž˜‰$‰T$è:Ɖt$ ‰D$‹ƒŽ–‰D$‹Eä‰$èƉE‹ƒÎ™‰}‰E ƒÄl[^_ÉéÆU‰åƒì‰uü‹u‰]øè[‹V…Òt‹ƒl™‰$‰D$èÔÅ‹ƒØ™‰u‹]ø‹uü‰E Éé¼ÅU‰åWVSè[ƒì<‹u‹~$ƒSz‰D$‹ƒß•‰D$‹ƒÇš‰$è…Å“cz‰T$“Cy‰T$ “Sƒ‰T$‹“㕉$‰T$èUʼn<$ÇD$ÇD$ ÇD$‰D$‹ƒË™‰D$è'Å‹V$‹ƒë™ÇD$‰$‰D$è Å‹ƒ§ŸUà‰uà‰$‰E䋃G™‰D$èîăÄ<[^_ÉÃU‰åƒìH‰]ô‹Eè[‰}ü‹}‰uø‰EÔ‹W$‹ƒ™‰$‰D$è¸ÄÝ]ØòEØf.ƒ2r…ˆŠ‚‹ƒ*”‹w$‰D$‹ƒú™‰$èwÄÇD$ ‹W‰T$‹“–”‰$‰T$èVÄ‹“nˉT$‹“Î’‰$‰T$è8Ä‹“”‰T$‰$è0ÄÝ\$‹ƒ>–‰4$‰D$èÄ‹w$‹ƒþ˜‰4$‰D$èÄò*EÔ‹}üÝ]àòXEàòE‹ƒb–‰u‹]ô‹uø‰E ÉéÎÃU‰åWVSè[ƒì<‹u‹~$ƒex‰E؉D$‹ƒñ“‰D$‹ƒÙ˜‰$è”Óux‰UÜ“Uw‰Uà‹U܉T$‹Uà‰T$ “u‰T$‹“õ“‰$‰T$èXÃÇD$ÇD$ ÇD$ð?‰D$‹ƒÝ—‰<$‰D$è*ËV$ÇD$ÇD$ ð?‹ƒU•‰$‰D$èËV$ÇD$‹ƒý—‰$‰D$èè‹F$‹UØ‹»˜‰Eä‰T$‹ƒñ“‰D$‹ƒÙ˜‰$è½Â‹U܉T$‹Uà‰T$ “…‰T$‹“õ“‰$‰T$蓉|$‰t$ ÇD$‰D$‹ƒå—‰D$‹Eä‰$èj‹ƒ%‹ÇE ‹ƒ˜‰U‰E ƒÄ<[^_ÉéCÂèYU‰å‹è•‰E Éé+ÂU‰åWVSè[ƒì<‹u‹~$ƒÂv‰D$‹ƒN’‰D$‹ƒ6—‰$èôÁ“Òv‰T$“²u‰T$ “ò‰T$‹“R’‰$‰T$èÄÁ‰<$ÇD$ÇD$ ÇD$‰D$‹ƒ:–‰D$è–Á‹V$‹ƒZ–ÇD$‰$‰D$èyÁ‹ƒœUà‰uà‰$‰E䋃ʕ‰D$è]ÁƒÄ<[^_ÉÃU‰åWVSè[ƒìL‹U‰$‹ƒÛ–³÷u‰EÈ‹ƒ‹‘‰D$èÁ‰Ẽçu‰EЉD$‹ƒs‘‰D$‹ƒ[–‰$èõÀ“×t‰UÔ‰T$ “'‰T$‹“w‘‰t$‰$‰T$èÈÀ‰Ç‹EЉD$‹ƒs‘‰D$‹ƒ[–‰$è§À‹UÔ‰t$‰T$ “7‰T$‹“w‘‰$‰T$è€À‹Ủ|$ ÇD$ÇD$‰T$‰D$‹ƒO•‰D$‹Eȉ$èLÀ‹U‰$‰D$‹ƒS•‰D$è3À‹EUà‰$‰Eà‹ƒ;›‰Eä‹E‰D$‹ƒW”‰D$è ÀƒÄL[^_ÉÃU‰åƒì(‰uü‹u‰]øè[‹V$…Òt'‹ƒš‰$‰D$èÒ¿‹V$‹ƒŠŽ‰$‰D$轿‹ƒâ™Uð‰uð‰$‰Eô‹ƒÖ“‰D$è¡¿‹]ø‹uüÉÃU‰åƒì(‰]ôè[‰uø‹u‰}ü‹}‹F‹“$’‰$‰T$èd¿„Àt"‹ƒè½‹ÇD$‹ƒ(’‰$‰D$è>¿‹V‹ƒ´‰$‰D$è)¿‰D$‹ƒÌ“‰<$‰D$è¿‹ƒÐ“‹uø‰}‹]ô‹}ü‰E Ééø¾U‰åWVSè[ƒì,‹u‹ƒóŒ‰D$‹ƒ‹”‰$èξ‰t$‹V‰T$ ‹V‰T$‹“;“‰$‰T$誾‹»O½‰F(‹‹ƒë’‰$‰D$辄Àt0‹V(‹ƒ÷‰$‰D$èt¾‰u‹“ï’‰U ‰EƒÄ,[^_ÉéY¾‹ƒ«‰D$‹ƒÓ“‰$èA¾‹‰T$‹“½‹‰T$‹“ó’‰t$‰T$ ‹“³‰$‰T$较Ä,[^_ÉÃU‰åVSè[ƒì ‹u‹V(‹ƒ‰$‰D$èὋ“ÿ‘‰t$‰T$‰$è˽‹ƒ»Œ‰D$‹ƒã’‰$è³½‹“_¼‹‰t$‰$‰T$“ßz‰T$ ‹“’‰T$臽ƒÄ [^ÉÃU‰åƒìH‹E‰]ôè[‰}ü‹}ƒø‰uøtr ƒø…ºë]‹ƒ‘é˜ÆG$‹ƒ-Œ‰D$‹ƒU’‰$è,½‹“¼ÇD$‹‰T$‹“Á‘‰|$‰T$ ‹“5Œ‰$‰T$èø¼ë[‹G‰E䋃õ»‹W‹0‹ƒù‰$‰D$èÓ¼‰t$ ‰D$‹ƒŒ‰D$‹Eä‰$è¶¼‹ƒY‘‰}‹]ô‰E ‹uø‹}üÉ雼‹]ô‹uø‹}üÉÃU‰å‹E¶@$ÉÃU‰åSè[ƒì$‹EUðÆ@%‰Eð‹ƒ±–‰$‰Eô‹ƒ%‰D$èT¼ƒÄ$[ÉÃèYU‰å‹î‰E Éé1¼U‰å‹U‹EèY9Bu€z$u‹Ý‰E Éé¼ÉÃU‰åSƒì$‹Uè[€z%t*‹ƒ-–‰UðUð‰$‰Eô‹E‰D$‹ƒ ‰D$èͻ닃á‰$‰D$è´»ƒÄ$[ÉÃU‰åSè[ƒì$‹EUðÆ@,‰Eð‹ƒ–‰$‰Eô‹ƒ‰D$è~»ƒÄ$[ÉÃU‰åVSè[ƒì‹u‹V‹ƒ“މ$‰D$èM»‹“׎‰T$‹“§‰‰$‰T$è1»„Àt.‹V‹ƒ“މ$‰D$軋V‰T$‹“׎‰$‰T$èÿº‹ƒS‰u‰E ƒÄ[^ÉéèºU‰åSƒì$‹Uè[€z,t*‹ƒO•‰UðUð‰$‰Eô‹E‰D$‹ƒë‰D$诺닃Ãމ$‰D$è–ºƒÄ$[ÉÃU‰åSè[ƒì$‹EUð‰$‰Eð‹ƒ=•‰Eô‹ƒ•ˆ‰D$èdº…Àt‹U‰PƒÄ$[ÉÃU‰åƒìH‰]ôè[‰}ü‹}‰uø‹ƒG‰E䋃oˆ‹W‰D$‰$躉<$‰Æ‹ƒCˆ‰D$躉t$‰D$ ƒm‰D$‹ƒsˆ‰D$‹Eä‰$èÞ¹‹]ô‹uø‹}üÉÃU‰åƒì‰]øè[‰uü‹u‹ƒ×ˆ‰D$‹E‰$詹‰F ‹ƒÛ‡‰D$‹E‰$葹‰F‹]ø‹uüÉÃU‰åVSè[ƒì‹uÇD$‹ƒ Œ‰D$‹ƒFމ$èU¹“Žw‰T$ ‰4$‰D$‹ƒÒ‰D$è5¹‹ƒ:ˆ‰D$‹ƒbމ$蹋“"l‰t$ ‰T$‹“N‰$‰T$èý¸ƒÄ[^ÉÃU‰å‹E¶@ÉÃU‰åƒì(‰]øè[‰uü‹u‹V‹ƒî†‰$‰D$èÀ¸‹V ‹ƒî†‰$‰D$諸‹ƒ’“Uð‰uð‰$‰Eô‹ƒ&ˆ‰D$踋]ø‹uüÉÃU‰åVSè[ƒì‹u‹V‹ƒ¢‹‰$‰D$è\¸‹“Þ‹‰T$‹“¶†‰$‰T$è@¸„Àt5‹V‹ƒ¢‹‰$‰D$è'¸‹V‰T$ ‹V‰T$‹“Þ‹‰$‰T$踋ƒbŒ‰u‰E ƒÄ[^Ééð·U‰åVSè[ƒì‹u‹V‹ƒ‹‰$‰D$èÊ·‹“T‹‰T$‹“$†‰$‰T$è®·„Àt.‹V‹ƒ‹‰$‰D$è•·‹V‰T$‹“T‹‰$‰T$è|·‹ƒÐ‹‰u‰E ƒÄ[^Éée·U‰åWVSè[ƒìL‹ƒ`…‰D$‹ƒìŒ‰$è>·‹U‰T$‹“p‹‰$‰T$è%·‹U‰B,‹“dˆ‰$‰T$è ·‹“€ˆ‰T$‰$èû¶‹E“ük‹@,‰ỦT$‰EÈ‹ƒˆ‡‰D$‹ƒpŒ‰$èͶ“ l‰UГìj‰UÔ‹UЉT$‹UÔ‰$‰T$ “|u‰T$‹“Œ‡‰T$è‘¶ÇD$ÇD$ ÇD$‰D$‹ƒt‹‰D$‹Eȉ$è`¶‹U‹EÌ‹»´‹‹r,‰D$‹ƒˆ‡‰D$‹ƒpŒ‰$è5¶‹UЉT$‹UÔ‰$‰T$ “\t‰T$‹“Œ‡‰T$è ¶‹UÇD$‰|$‰4$‰T$ ‰D$‹ƒ|‹‰D$èⵋE‹P,‰D$‹ƒ€‹‰$‰D$èÆµ‹ƒ’‹U‰Eä‹E‰UàUà‰$‰D$ ‹E‰D$‹ƒ†‰D$虵‹ƒø‰‹U‰D$‰$资Àt"‹ƒ¼µ‹‹ƒü‰ÇD$‰$‰D$èYµƒÄL[^_ÉÃU‰åƒì‰uü‹u‰]øè[‹V,…Òt@‹ƒG†‰$‰D$è#µ‹“ë…‰T$‰$赋V,‹ƒOƒ‰$‰D$èü´ÇF,‹]ø‹uüÉÃU‰åƒì‰]øè[‰uü‹u‰4$‹ƒ=‰‰D$èÆ´ÆF0‹]ø‹uüÉÃU‰åƒì(‰uü‹u‰]øè[€~0t‹ƒˆ‰4$‰D$è´ë:‹ƒ‰‰4$‰D$èy´‹ƒÜUð‰uð‰$‰Eô‹E‰D$‹ƒä„‰D$èV´‹]ø‹uüÉÃU‰åƒì(‰]øè[‰uü‹u‰4$‹ƒ™ˆ‰D$è"´‹ƒqUð‰uð‰$‰Eô‹E‰D$‹ƒM‡‰D$èÿ³‹]ø‹uüÉÃU‰åƒì(‰]øè[‰uü‹u‰4$‹ƒBˆ‰D$è˳‹ƒUð‰uð‰$‰Eô‹ƒÎ‡‰D$诳‹]ø‹uüÉÃU‰åSƒì$‹Uè[€z0t‹ƒ}‡‰$‰D$èz³ë/‹ƒÉމUðUð‰$‰Eô‹E‰D$ ‹E‰D$‹ƒÕƒ‰D$èN³ƒÄ$[ÉÃU‰åƒì(‰]ôè[‰uø‹u‰}ü‹}‰t$‹ƒw†‰<$‰D$賄Àt‹ƒ{†‰t$‰<$‰D$èø²º„Àu1Ò‹]ô‰Ð‹uø‹}üÉÃU‰åSè[ƒì‹ƒY‚‰D$‹E‰$è¾²“ q‰U‹“A‚‰U ‰EƒÄ[É韲U‰åSè[ƒì$‹EÇD$‰D$ ‹ƒø†‰D$‹ƒ”…‰D$‹ƒ ˆ‰$èa²ƒÄ$[ÉÃU‰åWVSè[ƒì\‹E‰EЋƒV€‰D$‹ƒª‡‰$è.²‹“^€‰T$‰$貉EÔ‹ƒ.†‰D$‹ƒÊ‡‰$貋“¶†‰T$‰$èﱉD$‹ƒ‚‰D$ƒ’p‰$èÓ±‰EØ‹ƒª‰D$‹ƒz‡‰$踱‹U؉T$‹“Ú‰$‰T$蟱„À…5‹ƒª‰D$‹ƒz‡‰$è±ÇD$ ‹U؉T$‹“Ê…‰$‰T$è^±‹ƒª‰D$‹ƒz‡‰$èF±‹U؉T$‹“Ú‰$‰T$è-±„À„âp‰D$ ƒ²p‰D$ƒÂpÇD$$‰D$‹E؉D$ƒÒp‰D$‹UЋB‰D$ ƒâp‰D$‹ƒV„‰D$‹ƒ"‡‰$谉ƋƒV€‰D$‹ƒž‡‰$訰“úYÇD$ ‰T$‹“º†‰$‰T$è„°‹“T$‰$èr°“q‰Ủt$‰T$‰D$ƒòp‰D$ ‹ƒ¾†‰D$‹ƒ¦‡‰$è;°…À„Ñ‹EЋP‹ƒò‰$‰D$谉Ƌƒ‚‰D$‹U؉$è°‰D$‹ƒ‚‰4$‰D$èEÜ‹ƒª‰D$‹ƒz‡‰$èÓ¯ÇD$ ‹U܉T$‹“Ê…‰$‰T$貯„À„L‹ƒª‰D$‹ƒz‡‰$è’¯‹U؉T$‹“†‰$‰T$èy¯‹“v‰T$‰$èg¯‰Eàé­‰|$‹ƒ‚‰D$‹E؉$èF¯‰E䋃ª‰D$‹ƒz‡‰$è+¯‹Uä‰T$‹“Ɔ‰$‰T$评Àt\‹ƒª‰D$‹ƒz‡‰$èö®‰|$‰Æ‹ƒ‚‰D$‹E܉$èÛ®ÇD$‰D$ ‹Uä‰T$‹ƒþ‰4$‰D$è¶®„ÀtT‹ƒz‰D$‹Eà‰$è®…À‰Ç…4ÿÿÿÇD$ÇD$ ‹ƒÊ†‰D$‹ƒÎ†‰D$‹UЉ$èd®ëG1öë¾ÇD$ÇD$ ‹ƒÒ†‰D$‹ƒÎ†‰D$‹EЉ$è*®‰ò„Òtiƒq‰Ẽq‹³²‡‰D$ƒ"qÇD$‹U؉D$‰T$ ‹ƒV„‰D$‹ƒ"‡‰$èÚ­‰D$ ‹ẺD$‹ƒV…‰4$‰D$è½­ë9‹ƒª‰D$‹ƒz‡‰$裭ÇD$ ‹U؉T$‹“:‚‰$‰T$è‚­‹ƒ:„‰E ‹EÔ‰EƒÄ\[^_Éég­U‰åSè[ƒì‹U‰T$‰$‹ƒä‰D$èA­ƒÄ[ÉÃU‰åƒì(‰]ø‹EUðè[‰uü‰$‰Eð‹ƒÉ‚‰Eô‹ƒ5{‰D$è ­…À‰Æt‹ƒ9|‰D$‹E‰$èꬉF‰ð‹]ø‹uüÉÃU‰åƒì(‰]øè[‰uü‹u‹V‹ƒáz‰$‰D$賬‹ƒq‚Uð‰uð‰$‰Eô‹ƒ|‰D$è—¬‹]ø‹uüÉÃU1À‰åÉÃU‰åƒì‰]øè[‰uü‹u‹V‹ƒÿ€‰$‰D$‹ƒ³z‰D$èO¬„Àt ‹U‹F‰t$‰T$ ‹“ÿ€‰$‰T$è+¬‹]ø‹uüÉÃU‰åƒì‰]øè[‰uü‹u‹V‹ƒ£€‰$‰D$‹ƒSz‰D$èï«„Àt#‹“£€‹F‰t$ ‰T$‹“§€‰$‰T$èÈ«‹]ø‹uüÉÃU‰åƒì‰]øè[‰uü‹u‹V‹ƒT‰$‰D$‹ƒðy‰D$茫„Àt#‹“T‹F‰t$ ‰T$‹“D€‰$‰T$èe«‹]ø‹uüÉÃU‰åƒì‰]øè[‰uü‹u‹ƒñk…Àu0‹ƒUy‰D$‹ƒ€‰$è&«‹“]y‰T$‰$諉ƒñk‰u‹ƒ}z‹uü‰E ‹ƒñk‹]ø‰EÉéíªU‰åSè[ƒì‹ƒ†k‰D$‹ƒz‰D$‹ƒ¶‰$辪ƒÄ[ÉÃU‰åWVSè[ƒì\‹u‹ƒSk…À…¤ƒi‰D$4ƒŸi‰D$,ƒ¿i‰D$$ƒÏi‰D$ƒïi‰D$ƒÿi‰D$ƒj“¯i‹ßi‰D$ ƒj‰T$0‰T$(‰L$ ‰L$ÇD$8‰D$‹ƒãz‰D$‹ƒË‰$è ª‹“Ãx‰T$‰$èú©‰ƒSk‹ƒcz‰4$‰D$è⩉Eà‹ƒ³z‰D$‹ƒSk‰$èÇ©‰E䋃×y‰D$‹Eä‰$诩…À‰Ç„º‹ƒS|‰<$‰D$è“©‰Æ‹ƒS|‰D$‹Eà‰$è|©9Æw´‹ƒS|‰D$‹Eà‰$èc©‰Æ‹ƒS|‰<$‰D$èO©)Ɖt$‹ƒG‰D$‹Eà‰$è4©‰|$‹“z‰T$‰$è©„À„Rÿÿÿ‰|$‹ƒ«x‰D$‹ƒSk‰$èú¨‰EƒÄ\[^_Één¨ƒÄ\1À[^_ÉÃU‰åƒì8‰]ôè[‰uø‹u‰}ü‰4$‹ƒÕv‹»I~‰D$豨‹V‰T$‹“q}‰$‰T$蘨‰t$ ‰<$ÇD$‰D$‹ƒÑ{‰D$èv¨‹]ô‹uø‹}üÉÃU‰åSè[ƒì‹E‰D$‹ƒ}‰D$‹E‰$èB¨…À•ÀƒÄ[ÉÃU‰åWVSè[ì<€‹ƒ2v‰D$‹ƒ†}‰$è ¨‹“:v‰T$‰$èû§‰…àÿÿ‹ƒ†w‰D$‹ƒV}‰$èݧ‹MÇD$ ‹Q‰$‰T$‹“òw‰T$è¹§‹“ʦ‹‰$‰T$‹“*v‰T$è›§…À„Š‹E‹P‹ƒ‚w‰$‰D$è{§“üQ‰T$‰$è(§…À‰…äÿÿ„\‹M‹ƒÎw‹Q‰D$‰$èC§‹“‚w‰T$‰$è1§ÇD$‰D$ƒþQ‰$è?§‹ƒ‚w‰D$‹E‰$è§“ R‰T$‰$è§èÿÿ‰Üÿÿ…À‰ÇujéÚ‹…Üÿÿ‰|$ ‰t$ÇD$‰$艦‹ƒÒ|‰t$‰D$‹ƒö|‰$蟦‹MÇD$‰ $‰D$ ‹ƒÎ|‰D$‹ƒª|‰D$èt¦‹…äÿÿ‹ÜÿÿÇD$€ÇD$‰D$ ‰ $覅À‰Æ…iÿÿÿ‰<$èS¦‹ƒ¦|ÇD$ÇD$ ‰D$‹ƒª|‰D$‹E‰$è ¦ëCÇ…äÿÿ‹ƒ®|‹MÇD$ÇD$ ‰D$‹ƒª|‰ $‰D$èÐ¥‹•äÿÿ…Òt‹…äÿÿ‰$èm¥‹ƒz‹àÿÿ‰D$‰ $è ¥Ä<€[^_ÉÃU‰åSè[ƒìƒe‰D$‹ƒ6z‰D$‹E‰$èi¥ƒÄ[ÉÃU‰åSè[ƒìƒìd‰D$‹ƒz‰D$‹E‰$è7¥ƒÄ[ÉÃU‰åSè[ƒìƒÊd‰D$‹ƒÒy‰D$‹E‰$襃Ä[ÉÃU‰åSè[ƒìƒ¨d‰D$‹ƒ y‰D$‹E‰$èÓ¤ƒÄ[ÉÃU‰åSè[ƒì‹U‰T$‰$‹ƒJy‰D$觤ƒÄ[ÉÃU‰åƒì8‰}ü‹}‰]ôè[‰uø…ÿu‹ƒr‰D$‹ƒ£y‰$èm¤‰Ç‹EUà‰$‰Eà‹ƒƒ€‰E䋃›r‰D$èL¤…À‰Æt9‹ƒ£r‰<$‰D$è/¤‰F‹“Gu‰$‰T$褅ÀuƒOd‰$膣‰ð‹]ô‹uø‹}üÉÃU‰åƒì(‰]øè[‰uü‹u‹V‹ƒÿq‰$‰D$èÑ£‹ƒãUð‰uð‰$‰Eô‹ƒ7s‰D$èµ£‹]ø‹uüÉÃU‰åƒìH‰]ôè[‰uø‹u‰}ü‰4$‹ƒ x‰E䋃Èq‰D$èu£‰4$‰Ç‹ƒœq‰D$èa£‰|$‰D$ ƒ\V‰D$‹ƒÌq‰D$‹Eä‰$è:£‹]ô‹uø‹}üÉÃU‰å‹E‹@ÉÃUèY‰å‹E‹P‹Lq‰U‰E Éé£U‰åƒì(‰]ôè[‰}ü‹}‰uø‹G“Çb‰T$‹“çq‰$‰T$èÌ¢…À…€ƒ×b‰D$‹ƒçq‰<$‰D$訢…Àu`‹ƒOr‰D$‹ƒx‰$茢‹W‰Æ‹ƒ#q‰$‰D$èu¢‰D$‹ƒ£w‰4$‰D$è_¢‹“or‹uø‹]ô‹}ü‰U ‰EÉéD¢‹]ô‹uø‹}üÉÃU‰åƒì8‰]ô‹Uè[‰}ü‰uø‹B“ªU‰T$‹“q‰$‰T$袅À‰Çt ƒºU‰D$‹ƒ’q‰<$‰D$èà¡„ÀtE‹ƒVp‹³w‰D$‹E‰$èÁ¡‰4$‰D$ƒb‰D$ ƒ*b‰D$‹ƒ&q‰D$è—¡‰ø‹]ô‹uø‹}üÉÃU‰åƒì‰]øè[‰uü‹u‹F“Ža‰T$‹“np‰$‰T$èV¡…Àu‹ƒ¶r‰u‹]ø‹uü‰E Éé:¡‹]ø‹uüÉÃU‰åWVSè[ƒì‹E‹p‹ƒp»Ya‰|$‰4$‰D$è¡“Ia‰4$‰T$ ‰D$‹ƒs‰D$èá …À‰Æu<‹E‹p‹ƒp‰|$‰4$‰D$è¿ ‰4$ÇD$ ‰D$‹ƒs‰D$è¡ ‰Æ‹ƒ-o‰D$‹ƒÑv‰$臠‹“¡s‰t$‰T$‰$èq ‹“Åo‰T$‰$è_ …Àuo‹ƒÙp‰D$‹ƒAv‰$èC ‰Ç‹E‹p‹ƒo‰D$‹ƒ=v‰$è# ºLPPA9Ætƒia‰$訟‰Â‰$è{Ÿ‰<$‰D$‹ƒÙu‰D$è쟃Ä[^_ÉÃU‰åSè[ì$‹E‹P‹ƒ n‰$‰D$輟‹“1o‰T$‰$誟•èþÿÿ‰T$‰$èÔŸ¶…ÿÿÿÄ$[ɃàÃU‰åƒì8‰]ôè[‰uøuà‰}ü‰4$èÙž‰4$ÇD$ÿÿÿÿè瞉ƃÉ_‰D$‹ƒum‰4$‰D$è7Ÿ‹“}p‰T$‰$è%Ÿ…ö‰Çt‰4$è;ž‰ø‹]ô‹uø‹}üÉÃU‰åƒìH‰]ôè[‰uø‰}ü‹}‹ƒ¦‹W‹‰$‰D$‹ƒîm‰D$èÑž…À‰Æup‹ƒª‹‰<$‰D$‹ƒîm‰D$è­ž…ÀtN‹W‰D$‹ƒrq‹³tÇD$ ‰$‰D$肞Uä‰4$‰T$ÇD$ ‰D$‹ƒ²s‰D$è]ž‰Æ‰ð‹]ô‹uø‹}üÉÃU‰åSè[ƒì‹ƒÿr‰D$‹ƒës‰$è)ž‹U‰T$‹“s‰$‰T$螃Ä[ÉÃUèY‰å‹E‹P‹öl‰U‰E ÉééU‰åSè[ƒì‹E‰D$‹ƒÒl‰D$‹E‰$èÀ‹“æn‰U ‰EƒÄ[ÉéªU‰åƒì8‰]ô‹Eè[‰}ü‹}‰uø‰Eä‹w‹ƒ‹k‰D$‹ƒ¯r‰$èq9Æu9‹ƒ/p‰D$‹ƒs‰$èU‹Uä‹uø‹}ü‰U‹“—k‹]ô‰E‰U Éé4‹“Sn‹G‰T$‰$è‰D$‹Eä‰$è%œ1Ò…Àt ‰$蜉‹ƒ7l‹uø‰U‹]ô‹}ü‰E ÉéåœU‰åƒìH‰]ô‹Eè[‹U‰}ü‹}‰uø‰Eà‰UÜ‹w‹ƒÆj‰D$‹ƒêq‰$覜9Æu?‹ƒjo‰D$‹ƒ>r‰$芜‹UÜ‹uø‹}ü‰U‹Uà‰U‹“îj‰E‹]ô‰U Éécœ‹ƒ†›‹‰Eä‹ƒŠ›‹W‹0‹ƒŽm‰$‰D$è;œ‹Uä‰t$ ‰T$‰D$‹Eà‰D$‹U܉$è4›‹W‹ƒŽm‰$‰D$蜋Uä‰u ‹]ô‹uø‹}ü‰U‰EÉé ›U‰åƒì8‰]ô‹Eè[‰}ü‹}‰uø‰Eä‹w‹ƒËi‰D$‹ƒïp‰$è±›9Æu9‹ƒon‰D$‹ƒCq‰$è•›‹Uä‹uø‹}ü‰U‹“Çj‹]ô‰E‰U Éét›‹G1ÿ‹““l‰$‰T$è]›‰D$‹Eä‰$ècš…À‰Æt‰$èKš‰4$‰ÇèZš‰ø‹]ô‹uø‹}üÉÃU‰åWVSè[ƒì<‹E‹}¶U‰EØ‹ƒiˆUß‹w‰D$‹ƒ4p‰$èïš9Æu=‹ƒ´m‰D$‹ƒˆp‰$èÓš‹U؉U¾U߉U‹“ào‰E‰U ƒÄ<[^_É鮚‹ƒÐ™‹‰Eà‹ƒÔ™‹‰E䋃Øk‹W‰D$‰$胚‰Æ¾E߉D$‹ƒ¬m‰D$‹ƒèo‰$èaš‹Uà‰T$‹Uä‰t$‰D$‰T$ ‹E؉$èZ™‹W‹ƒØk‰$‰D$è+š‹Uà‰U‹Uä‰E‰U ƒÄ<[^_Éé/™U‰åƒì(‰]ôè[‰uø‹u‰}ü‹}‰t$‹ƒ8h‰<$‰D$èß™…Àu‰u‹ƒôh‹uø‰}‹]ô‹}ü‰E Éé½™‹]ô‹uø‹}üÉÃU‰åƒì(‰]ôè[‰uø‹u‰}ü‹}‰t$‹ƒÚg‰<$‰D$è™…Àt ‰u‹ƒægë ‰u‹ƒšh‰}‹]ô‰E ‹uø‹}üÉéT™U‰åƒìH‰]ôEäè[‰uø‰}ü‰D$Ç$1sysè–˜Ç$2sys‰ÆEà‰D$è˜Ç$3sys‰ÇEÜ þ‰D$èj˜f ðu9‹E܉D$‹Eà‰D$‹Eä‰D$ ƒ¥Y‰D$‹ƒug‰D$‹ƒIn‰$èĘëPƒµY‰D$‹ƒ n‰D$‹ƒan‰$è ˜“ÅY‰T$‹“Ag‰T$‰$脘‹“Yg‰T$‰$èr˜‹]ô‹uø‹}üÉÃ@"NSTimer"@"SUUpdateDriver"@@"NSSet"@8@0:4c12@0:4@8d8@0:4v16@0:4d8v12@0:4c8v24@0:4@8@12@16^v20v12@0:4i8checkTimerdriverhosttagsupdaterForBundle:sharedUpdaterhostBundleupdateInProgressvalidateMenuItem:updateCheckIntervalsetUpdateCheckInterval:parameterizedFeedURLsendsSystemProfilesetSendsSystemProfile:setAllowedTags:feedURLsetFeedURL:automaticallyDownloadsUpdatessetAutomaticallyDownloadsUpdates:automaticallyChecksForUpdatessetAutomaticallyChecksForUpdates:resetUpdateCycleobserveValueForKeyPath:ofObject:change:context:unregisterAsObserverregisterAsObservercheckForUpdatesWithDriver:checkForUpdateInformationcheckForUpdates:checkForUpdatesInBackgroundscheduleNextUpdateCheckupdateDriverDidFinish:updatePermissionPromptFinishedWithResult:startUpdateCycleinitForBundle:actionnumberWithDouble:stringByAddingPercentEscapesUsingEncoding:componentsJoinedByString:queryaddObject:countarraytimeIntervalSinceNowisEqualToSet:URLWithString:stringByTrimmingCharactersInSet:characterSetWithCharactersInString:raise:format:absoluteStringcancelPreviousPerformRequestsWithTarget:selector:object:removeObserver:forKeyPath:removeObserver:addObserver:forKeyPath:options:context:stringByAppendingString:sharedUserDefaultsControlleraddObserver:selector:name:object:defaultCentercheckForUpdatesAtURL:host:didChangeValueForKey:initWithUpdater:scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:timeIntervalSinceDate:datedistantPastinvalidatefinishedobjectpromptWithHost:systemProfile:delegate:arrayByAddingObjectsFromArray:feedParametersForUpdater:sendingSystemProfile:updaterShouldPromptForPermissionToCheckForUpdates:performSelector:withObject:afterDelay:initWithBundle:releaseallocobjectForKey:valueWithNonretainedObject:mainBundleSUUpdaterNSValueSUUpdatePermissionPromptNSTimerSUAutomaticUpdateDriverSUScheduledUpdateDriverSUUserInitiatedUpdateDriverSUProbingUpdateDriverNSNotificationCenterNSUserDefaultsControllerNSExceptionNSCharacterSetSUUpdaterDefaultsObservationContext%@ <%@>lastUpdateCheckDatevalues.You must specify the URL of the appcast as the SUFeedURLKey in either the Info.plist or the user defaults!SUNoFeedURL"'valuekey%@=%@?&%@%@%@v12@0:4@8i20@0:4r*8@12i16c20@0:4@8@12^@16@12@0:4@8releaseFromQuarantine:removeXAttr:fromFile:options:copyPathWithAuthentication:overPath:error:_copyPathWithForcedAuthentication:toPath:error:_temporaryCopyNameForPath:currentUserOwnsPath:stringByAppendingPathComponent:nextObjectenumeratorAtPath:fileAttributesAtPath:traverseLink:performFileOperation:source:destination:files:tag:arrayWithObject:lastPathComponentcopyPath:toPath:handler:movePath:toPath:handler:stringByDeletingLastPathComponentisWritableFileAtPath:errorWithDomain:code:userInfo:dictionaryWithObject:forKey:stringWithFormat:stringByAppendingPathExtension:pathExtensionstringByAppendingFormat:invertedSetformUnionWithCharacterSet:alphanumericCharacterSetstringWithFileSystemRepresentation:length:fileSystemRepresentationMMExtendedAttributesSUPlainInstallerInternalsNSFileManagerNSMutableCharacterSetNSString.../.-()old%@ %d.%@%d:%d/bin/rm/bin/mv/usr/sbin/chown-rf-f-RAuthenticated file copy from %@ to %@ failed.Couldn't get permission to authenticate.Couldn't copy %@ over %@ because there is no file at %@.Couldn't move %@ to %@.Couldn't copy %@ to %@.Sparkle error: couldn't move %@ to the trash. This is often a sign of a permissions error.com.apple.quarantine@"NSArray"itemsuserAgentStringdownloadFilenamesetDelegate:bestNodeInNodes:reportError:download:willSendRequest:redirectResponse:download:didFailWithError:downloadDidFinish:download:didCreateDestination:download:decideDestinationWithSuggestedFilename:fetchAppcastFromURL:indexOfObject:preferredLocalizationsFromArray:attributeForName:localizedDescriptionappcast:failedToLoadWithError:appcastDidFinishLoading:dictionaryWithObjectsAndKeys:localizedStringForKey:value:table:sortUsingDescriptors:initWithKey:ascending:removeAllObjectsinitWithDictionary:whitespaceAndNewlineCharacterSetdateWithNaturalLanguageString:stringValueattributesnextSiblingsetObject:forKey:namechildAtIndex:childrendictionaryobjectEnumeratornodesForXPath:error:defaultManagerinitWithContentsOfURL:options:error:setDestination:allowOverwrite:autoreleaseinitWithRequest:delegate:setValue:forHTTPHeaderField:requestWithURL:cachePolicy:timeoutInterval:SUAppcastNSMutableURLRequestNSURLDownloadNSXMLDocumentNSURLNSMutableArrayNSSortDescriptorNSArrayNSErrorNSDictionaryUser-Agent/rss/channel/itemSparkle Updater: Failed to parse appcast item with appcast dictionary %@!An error occurred while parsing the update feed.An error occurred in retrieving update information. Please try again later.xml:lang@"NSString"@"NSDate"@"NSURL"@"NSDictionary"itemDescriptionreleaseNotesURLDSASignatureminimumSystemVersiontagfileURLdisplayVersionStringpropertiesDictionarysetTag:setMinimumSystemVersion:setDisplayVersionString:setVersionString:setFileURL:setDSASignature:setReleaseNotesURL:setItemDescription:setDate:setTitle:hasPrefix:lastObjectcomponentsSeparatedByString:copySUAppcastItemNSMutableDictionaryenclosuresparkle:versionurl_titlepubDatedescriptionsparkle:dsaSignaturesparkle:minimumSystemVersionsparkle:tagsparkle:shortVersionStringsparkle:releaseNotesLinkhttp://@"SUAppcastItem"@"WebView"@"NSTextField"@20@0:4@8@12@16v28@0:4@8@12@16@20@24v16@0:4@8@12updateItemreleaseNotesViewreleaseNotesSpinnerwebViewFinishedLoadingwebView:contextMenuItemsForElement:defaultMenuItems:webView:decidePolicyForNavigationAction:request:frame:decisionListener:webView:didFinishLoadForFrame:windowShouldClose:awakeFromNiballowsAutomaticUpdatesshowsReleaseNotesdisplayReleaseNotesremindMeLater:skipThisVersion:installUpdate:endWithSelection:initWithAppcastItem:host:removeObjectIdenticalTo:mutableCopyuseignoreopenURL:URLdisplaysetHidden:parentFrameisEqualToString:centersetFrame:display:setFrame:setShowsResizeIndicator:setLevel:boolValueloadRequest:loadHTMLString:baseURL:mainFrameisFileURLaddSubview:startAnimation:setStyle:initWithFrame:framesuperviewsetDefaultFontSize:systemFontSizeForControlSize:setStandardFontFamily:familyNamesystemFontOfSize:preferencessetPreferencesIdentifier:bundleWithIdentifier:respondsToSelector:updateAlert:finishedWithChoice:closesetPolicyDelegate:setFrameLoadDelegate:stopLoading:retainNSObjectNSFontNSProgressIndicatorNSWorkspaceSUUpdateAlertorg.andymatuschak.SparkleRelease notes with file:// URLs are not supported for security reasons—Javascript would be able to read files on your file system.A new version of %@ is available! (%@)%@ %@ is now available--you have %@. Would you like to download it now?d@"NSProgressIndicator"c8@0:4v24@0:4@8@12:16c20v24@0:4@8d12@20progressValuemaxProgressValuestatusTextactionButtonprogressBarsetStatusText:setMaxProgressValue:setProgressValue:setButtonEnabled:progressBarShouldAnimatesetButtonTitle:target:action:isDefault:beginActionWithTitle:maxProgressValue:statusText:windowTitlesetEnabled:setKeyEquivalent:setAction:setTarget:setFrameOrigin:setFrameSize:sizeToFitwillChangeValueForKey:setUsesThreadedAnimation:setFrameAutosaveName:windowclassSUStatusControllerSUStatusSUStatusFrameUpdating %@buttonTitle c20@0:4@8@12@16validatePath:withEncodedDSASignature:withPublicDSAKey:bytesdataWithContentsOfFile:UTF8StringwhitespaceCharacterSetSUDSAVerifier SUSparkleErrorDomainSULastProfileSubmissionDateSUSendProfileInfoSUCheckAtStartupSUEnableAutomaticChecksSUEnableSystemProfilingSUAllowsAutomaticUpdatesSUAutomaticallyUpdateSUPublicDSAKeyFileSUPublicDSAKeySUExpectsDSASignatureSULastCheckTimeSUScheduledCheckIntervalSUSkippedVersionSUShowReleaseNotesSUFeedURLSUHasLaunchedBeforeSUTechnicalErrorInformationSUUpdaterWillRestartNotificationNamearchivePathunarchiverForPath:delegatedescriptionTexttitleTextapplicationIcondoNotInstall:installLater:installNow:deallocinitWithAppcastItem:host:delegate:automaticUpdateAlert:finishedWithChoice:setShouldCascadeWindows:initWithHost:windowNibName:SUAutomaticUpdateAlertA new version of %@ is ready to install!%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?i8@0:4@"NSTask"@"NSPipe"@"NSData"ci@24@0:4@8@12@16@20taskDidTerminate:taskOutputAvailable:setResult:resultsetDone:donesetOutput:outputsetInputPipe:inputPipesetOutputPipe:outputPipesetTask:taskrun:directory:withArgs:input:mv_taskmv_outputPipemv_inputPipemv_outputmv_donemv_resulttask:directory:withArgs:input:terminationStatususerInforunMode:beforeDate:currentRunLoopdateWithTimeIntervalSinceNow:closeFilewriteData:fileHandleForWritinglaunchreadToEndOfFileInBackgroundAndNotifyForModes:arrayWithObjects:fileHandleForReadingsetArguments:setCurrentDirectoryPath:setStandardOutput:setStandardInput:NotificationsNTSynchronousTaskNSPipeNSAutoreleasePoolNSDateNSRunLoopi16@0:4@8@12i12@0:4@8defaultComparatorsplitVersionString:typeOfCharacter:compare:intValuestringWithString:appendString:setString:initWithString:substringWithRange:substringToIndex:characterIsMember:characterAtIndex:decimalDigitCharacterSetSUStandardVersionComparatorSUVersionComparisonsharedSystemProfilermodelTranslationTableobjectAtIndex:standardUserDefaultsstringWithUTF8String:numberWithBool:numberWithInt:dictionaryWithObjects:forKeys:initWithContentsOfFile:SUSystemProfilerSUHostplistSUModelTranslationdisplayValuedisplayKeyOS VersionosVersionhw.cputypeIntelPowerPCUnknownCPU Typecputypehw.cpu64bit_capablehw.optional.x86_64hw.optional.64bitopsYesNoCPU is 64-Bit?cpu64bithw.cpusubtypeIntel Core 2Intel CoreG3G4G5OtherCPU Subtypecpusubtypehw.modelMac Modelmodelhw.ncpuNumber of CPUsncpuAppleLanguagesPreferred LanguagelangApplication NameappNameApplication VersionappVersionCPU Speed (GHz)cpuFreqMHzMemory (MB)ramMB@"SUHost"@"NSView"@"NSButton"v20@0:4@8@12@16systemProfileInformationArraydescriptionTextFieldmoreInfoViewmoreInfoButtonisShowingMoreInfoshouldSendProfilefinishPrompt:toggleMoreInfo:promptDescriptioninitWithHost:systemProfile:delegate:shouldAskAboutProfilestopModalsetNeedsDisplay:setFrame:display:animate:removeFromSuperviewaddSubview:positioned:relativeTo:contentViewrunModalForWindow:activateIgnoringOtherApps:SUWindowControllerNSBundleSparkleShould %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu.SUUpdatePermissionPrompt's delegate (%@) doesn't respond to updatePermissionPromptFinishedWithResult:!SUInvalidDelegate@16@0:4@8@12initWithWindowNibPath:owner:sharedFrameworksPathNSWindowControllernibSparkle.frameworkv24@0:4c8@12@16@20_finishInstallationWithResult:host:error:delegate:_mdimportHost:installFromUpdateFolder:overHost:delegate:synchronously:versionComparator:_isAliasFolderAtPath:installerForHost:failedWithError:installerFinishedForHost:setLaunchPath:performInstallationWithPath:host:delegate:synchronously:versionComparator:skipDescendentsbundlebundleWithPath:stringByDeletingPathExtensionfileURLWithPath:pkgmpkgCouldn't find an appropriate update in the downloaded package./usr/bin/mdimportv28@0:4@8@12@16c20@24v24@0:4@8@12@16@20_performInstallationWithInfo:installPath:overHost:delegate:versionComparator:detachNewThreadSelector:toTarget:withObject:compareVersion:toVersion:objectForInfoDictionaryKey:versionNSThreadSUInstallerVersionComparatorSUInstallerDelegateSUInstallerHostSUInstallerPathCFBundleVersionSparkle Updater: Possible attack in progress! Attempting to "upgrade" from %@ to %@. Aborting update.waitUntilExitlaunchedTaskWithLaunchPath:arguments:fileExistsAtPath:absolutePathForAppBundleWithIdentifier:sharedWorkspaceSUPackageInstallerNSTaskcom.apple.installer/usr/bin/open-b-n-WCouldn't find Apple's installer tool!@"NSURLDownload"c16@0:4@8@12downloaddownloadPathrelaunchPathabortUpdateWithError:cleanUprelaunchHostAppinstallUpdateshouldInstallSynchronouslyunarchiverDidFinish:extractUpdatedownload:shouldDecodeSourceDataOfMIMEType:didNotFindUpdatedidFindValidUpdateitemContainsValidUpdate:itemContainsSkippedVersion:hostSupportsItem:_versionComparatorlocalizedFailureReasoncodeterminate:processIdentifierprocessInfopathToRelaunchForUpdater:bundlePathupdaterWillRelaunchApplication:postNotificationName:object:setSelector:invocationWithMethodSignature:instanceMethodSignatureForSelector:updater:shouldPostponeRelaunchForUpdate:untilInvoking:removeFileAtPath:handler:pathForResource:ofType:bundleForClass:updater:willInstallUpdate:rangeOfString:publicDSAKeyschemerequestcreateDirectoryAtPath:attributes:requestWithURL:updaterDidNotFindUpdate:updater:didFindValidUpdate:bestValidUpdateInAppcast:forUpdater:updater:didFinishLoadingAppcast:containsObject:allowedTagsversionComparatorForUpdater:setUserAgentString:stringWithCString:encoding:dataUsingEncoding:allowLossyConversion:displayVersioninitisRunningOnReadOnlyVolumeSUBasicUpdateDriverSUUpdateDriverNSURLRequestSUInstallerNSInvocation%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again.%@/%@ Sparkle/%@You already have the newest version of %@.txt%@ %@ Update%@ %dCan't make a temporary directory for the update download at %@.httpsThe update is improperly signed.An error occurred while downloading the update. Please try again later.gzipSparkle Error: No valid unarchiver for %@!An error occurred while extracting the archive. Please try again later.relaunchCouldn't find the relauncher (expected to find it at %@)An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@.%dAn error occurred while installing the update. Please try again later.Sparkle Error: %@Sparkle Error (continued): %@@"SUStatusController"@"SUUpdateAlert"v16@0:4@8l12v16@0:4@8I12@16@0:4d8statusControllerupdateAlertshowModalAlert:installAndRestart:cancelDownload:download:didReceiveDataOfLength:_humanReadableSizeFromDouble:download:didReceiveResponse:applicationDidBecomeActive:runModalsetIcon:iconrequestUserAttention:doubleValuecancelexpectedContentLengthversionStringdownloadUpdateinitWithHost:setObject:forUserDefaultsKey:removeObserver:name:object:alertWithMessageText:defaultButton:alternateButton:otherButton:informativeTextWithFormat:makeKeyAndOrderFront:isActivesetHidesOnDeactivate:SUUIBasedUpdateDriverNSAlert%@ %@ is currently the newest version available.OKYou're up-to-date!NSApplicationDidBecomeActiveNotificationDownloading update...B%.0lf %@KBMB%.1lf %@GB%.2lf %@%@ of %@%@ downloadedExtracting update...Ready to InstallInstall and RelaunchInstalling update...Cancel UpdateUpdate Error!@"SUAutomaticUpdateAlert"v16@0:4@8i12postponingInstallationshowErrorsalertapplicationWillTerminate:abortUpdate@"SUUpdater"updaterappcastURLsetValue:forKey:SUUpdateDriverFinishedcheckingControllerisCanceledcancelCheckForUpdates:closeCheckingWindowisItemNewer:isBackgroundApplicationshowWindow:Checking for updates...Cancelv8@0:4load_canUnarchivePath:_extractDMGdrain_notifyDelegateOfFailureperformSelectorOnMainThread:withObject:waitUntilDone:_notifyDelegateOfSuccessisReadableFileAtPath:directoryContentsAtPath:initWithBytes:length:globallyUniqueStringSUDiskImageUnarchiverNSProcessInfoNSDatadmg/Volumes-noautoopen-nobrowse-noverify-mountpointattachyes /usr/bin/hdiutil-forcedetachv12@0:4#8v12@0:4l8_unarchiverImplementations_notifyDelegateOfExtractedLength:_initWithPath:arrayWithArray:unarchiverDidFail:performSelector:withObject:unarchiver:extractedLength:PrivateSUUnarchiver:12@0:4@8_selectorConformingToTypeOfPath:_extractTBZ_extractTAR_extractArchivePipingDataToCommand:start_registerImplementation:numberWithLong:substringFromIndex:lengthkeyEnumeratorSUPipedUnarchiverNSNumber.tbz.tar.bz2.tgz.tar.gz_extractTGZ.tar.zip_extractZIPrDESTINATIONwtar -xC "$DESTINATION"tar -zxC "$DESTINATION"tar -jxC "$DESTINATION"ditto -x -k - "$DESTINATION"@"NSBundle"v16@0:4c8@12systemVersionStringboolForKey:setBool:forUserDefaultsKey:boolForUserDefaultsKey:objectForUserDefaultsKey:boolForInfoDictionaryKey:systemProfiledictionaryWithContentsOfFile:setBool:forKey:systemProfileArrayForHost:stringWithContentsOfFile:encoding:error:iconForFileType:displayNameAtPath:bundleIdentifierNSImageNSUserDefaultsSparkle Error: the bundle being updated at %@ has no CFBundleIdentifier! This will cause preference read/write to not work properly.CFBundleDisplayNameCFBundleNameThis host (%@) has no CFBundleVersion! This attribute is required.SUNoVersionExceptionCFBundleShortVersionStringicnsCFBundleIconFileBNDLLSUIElement%d.%d.%d/System/Library/CoreServices/SystemVersion.plistProductVersion ¬@u"Áõ@@@À‰@@0AP?ÐA?€A B ApAðAàAàAÀTÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>ÿÿÿÿÿÿÿÿÿÿÿÿ?456789:;<=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ !"#$%&'()*+,-./0123ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¥¤£¢¡ ¹ ¸ ÐëêéèPX`XpX€XX X°XÀXÐXàXðXYY Y0Y@YPY`YpYÐ\à\ð\]`ààÈÌ#ÈðÈøÈ ÈjÈ È‹ÈŽÈ”È˜ÈžÈ È¢ÈB9ÈðÈZÈ_È"%ÈeÈ -ÈÐ(Èü8È5ÈMÈhZÈN ÈYÈú È ÈlIÈÈZ$Ȉ4ȸ0ÈìKÈ8ÈÈÈÈÈ( È4ÈIÈf ÈrÈȦÈL$ Èt$ˆÈ%!È(%GÈœ'È¥' ȶ' ÈÄ' ÈÐ'Èt(Èx(È(È©(È»(ÈÌ(Èä(Èü(È)È+)È>)ÈM)Èc)Ès)ÈŒ)È)Ȱ) Ⱥ)ÈÎ)Èì)$È+È4+(È`+fÈRȼ0ÈÂ0ÈÕ0 Èä0 Èï0 Èú0 È1È1È1È%1È.1Èr1Èv1Èy1Ȉ1ÈŸ1 Ȭ1 È·1Ⱥ1Ƚ1ÈÀ1ÈÆ1 ÈÒ1 Èæ1 Èð1Èþ1È 2È2È!2È42È92ÈJ2ÈR2Èf2 Èq2È2 ÈŒ2 Ș2ÈúÈ4jÈ"3Èü4fÈc5ÈÐ5ÈÔ5Èœ7È 7Ȩ7>Èç7Èñ8È9È"9È29ÈT9eÈ\:Èp: È~:È:È„:Ȉ:%Ȱ?´Èe@Èx@*È£@ȧ@ È´@ȼ@?Èü@ÈA È(AGÈpAÈxA*ȤAGÈìAÈøA8È4BgÈœBÈ BFÈçBÈùBȬE0ÈÝEÈàEÈôE(ÈFÈ>HÈ6FÈ8FÈAFÈDFÈGFÈPFÈSFÈ\FÈeF ÈsFȈFÈ™FÈ®FÈÃF ÈÑF È‹GȬÈ&HÈxIÈ|IÈ…I È‘I È›I È¥I ȱIÈWÈ¿IÈÐIÈ×IÈ¡KȦKÈåJ ȯKÈ´KȼK ÈÈKÈñJ ÈÍKÈÒK ÈîKÈLÈLÈ5LÈÜM„ÈaNÈuN È„NBÈÇNÈÜNÈ÷NÈüNÈ OÈO ÈOÈ(O0ÈYOÚ? ¾°€'¨Ø D? $˜õ Æ h„<ÊL4ž#°L| ”LþLÏ ä¼j ž µ¬¡^ ø•yŽ N 8 &X j ,'¼Dº ôæ‚ ÄP7¥ŒdT9° ¢ †LÄ8äLî à ¼ ˜ † x Ì b \ V ØÈK E +  î dDà Œ*ç = Ö¨“X7"Œqeh7J<ô9xäë̶”H{b0:P? ûèÓ¨ €d8ˆ7X=éÍÁ±¬‰tK{oP,ðÙˆ#´“*wXB 0- œ>ú¬Ÿˆk:F(öîDWt’+ä*$í#Ú#Ô#´#‰!²Mm#a#O#D#-##û"ñ"ë"Ú"Ð"À"´"„ª" "ˆ"y"o"x'd"4!K"!A"/"("F!FDÄ4?à8"ú!ò!î!å!Þ!Ú!Î!¶µ!_'E' &ü%''ÿ&ò&ç&Õ&É& &I(<($((jKöIVH6J¸*•,{,c,ž,q,G.Š,4.Q,£,<,\,xH.â6.,ò- ,Þ-°-¨-“-ˆ-~-L,`-Q-=-4-C, -1,/{/h/V/ä.B/2/'///Ð.þ.õ.Š=r=‡0ñ/rLh0X0H02003HH4x324#44é3Ï3¾3œ ³3¤5…5‹6@7ü5ô6/6Æ6¤6ª8H8'8|8:Ì9¼9I?ó:  ?î>Ú>å0*»>¾. <¬>¡ù;ðGÝ;x>P>ä ;Ä;±;3>žD>º >è=pDÞ=×=È=”ä'e;¸=*VJ$K$;œ=2;@6; =ü<Ü<Î< ;°<<j<^<L<><NG9<"<›!vEjETEDøDƒCÚD®Dˆ&©C`&HzD¶%Ä%ÝC2&“CND=D4D”*1GzGÂGÙGiH0II-þHèHÎH˜H~H*K†JP;iJEJVKÄJJFKKœMˆM\MÙ/@M-MM˜K0º®•€jN6–.úH´0äò|4@$@8/ ÔúìØ†?+$$$pI.i.„.|.T:¦/ÌM@:è8`I ?”?¬Jc(̆'¤EL$+$ 0ÃM@~$å“@†€~$Ì@“ˆÀ~$Ô0€“ ˆf4L$D ”À‰@f4†'P€”ÀŠ€$c(À$¬J 䔀‹€f4+4•À‹@€$i.@•@Œ€€$¦/`Œ ›À€$ 0 Œf4úD •ÀŒ@º5f4(4€$”?À”?‚@:@‚w?c?$ –`€‚c?E,T–ÀŽÀ‚c?,€– ƒE60¨– @ƒ$w?À–`€ƒc?j$ÀÀƒEN4ô–à„¬JHI `‘@„¬J…K €‘€„$´0—à‘$$å0À„$$Ì0$$Ô0$f4L$0$f4†'0$$c(0à„$$¬J0ô„$f4+0$$i.0…$$¦/0… ›$$ 000…$f4ú0D…$º5f40$$”?0`…$”?0 …$@:0Ì…$w?c?0$c?E0$c?0$E60$$w?0$c?j0$EN0$¬JHI0à…$¬J…K0†$$´00,†? ؈Q Ô Dä'Ô'hu*Øqw-ô+T¾.Ô ’‡Ù/Ô >¼Â29šü5è5*ª/6¬\©@6ü7¤‹6Ü ¤ô6ü7Õ­'8¬Ò¬H88÷ªô6ü7©®QHHH§ôVHÜ .ïQHHHAýVHÜ £ùÄJ¹JV÷rLÔ º#_ Ô Ù50*Ô Î5j Œ%’5 ¬„5| Ü 35Œ*HH¥4Ž é L4¢ ð @3º Ô Â/Ï Œ%‹/â ú L/¬>Ô /ù ¬ . Ô Ö- ¬y- Œ%ë,< ú ¬,^ Œ%F,| ú 9+ž HHÒ*°  *à HHd(õ HHá& ¬º%# HHL%= ¬á$N HH7$j HHú"øÔ Ã"‚ ¬@"œ  ô!Æ HHØ(Ô \D?Ô Ø ØP ¬RÚ>¬½QØP*¬¹N8Þ±Nc N~¬£F” YF´ þEå¬0EäÔ %EŒ*HH½DÙÔ a]Œ*HH\صWî¬aW¶Ô &Wö¬ÒV¡Ô —V¬CVÄÔ V(¬´UDÔ yU:¬%UºÔ êTF¬–T”Ô [TW¬T„Ô ÌSk¬xStÔ =S¬éRÔ ®Rˆ¬ZRÔ R ¬Ák\ Þ k” î~jÜ  j:*Ô ‹hJ*Ô ßgT*Ô ¾gý Ü ‰g!HHÓd!Œ%gd4!Œ%dF!HH `Z!¬ê_i!¬Ë_z!¬¬_‰! ì^Œ*HH„^(Ô ^›!x5l]ü%¬ts &ð sÄ%é  s &ð úr¶%é ïr2&ú ÇrD&Œ%½r`&“%noˆ&¦%¸nT*Ô —nº&Ô ëm!HHdm(Ô èlŒ*HH[l®DØÏk$KHH¡x ¬“x(Ô 1x :*Ô  |J*Ô `{T*Ô ?{d*¬ïzr*¬Ÿz€*¬Oz(Ô ÓyŒ*HHky”*Þ¦xŒ*HH…~D?Ô Ð|ª8§.ŠÐ.؃ˆä.´.å‡@MØ:Žñ/Ô Ž G3¬ó¡U3¬Øe3Ô ,FDÔ  Œ*HH£œ!HH‹›(Ô ›x3Þv™3Œ%/™+x5£Œ*HH®Ïó:¬åÎNGHHyΤ6 Í ;HH–Ì;HHœÇÆ6¬wÇ$;HHTÅ2;Œ%MÅVJ¬WÄP;¬Äe;HHkÃt;Ã:1Ãc OÁ~¬X¿´ r¼žDHHá» ;HHKº±;HH¹¹X u¹w¬Å·Ä;Ü H·Ý;Ü ³¶ù;Ü <µðGÜ ¸´ <Ô ´ô ±ƒC¬zâNGHHâó:¬¾à$;HHãß“C¬ËßP;¬@Þ†J@C-Ýe;HHRÜ©C¬ ܼCMC§ÙÝCZCW×ûC ÝÖ´#üF¬ÔD¬%Ô ;HHÒ±;HH;Ðó:¬æÆ6¬Ýå1G¬Åå$;HHŠå2;Œ%~å¸*üFŽäD¬äP;¬ãó:¬&ç ;HH›æ±;HH`æŒ*HH$鬌%éNGHHˆèô ;è(Ô ¿ç&Ø~ç ;HHê±;HHŒéÄ;Ü ËîX lîNGHHîó:¬Åíw¬TíÂG¬!íÙGHH½ìô ©êiHHH³ï$KHHoïÒKHHýåJHHÝü¼KHH«üñJHHyüK¬×ù$KHH-ù†LÜ \°Øþ”LcLå°LÜ $¼D )ÊLØdäLÜ %Ä8ØþLÔ ÀÈ=Ô HŒ%‰I?Œ%*FDÔ Ü4?Ô „à8Ô Õÿ¬Ô  ÿ„<Ô êþP7Ô ßþ(Ô fþŒ*HHþØmý" ¨ - ³ 4  2 0*Ç : É äØêD0*Ç  ûD DPtD „Z”D¡D¶DºZ DD$ÄD(Ùc, °(4  2,0*Ç 0 Á4(Ì81 r%<E ð+@¶%p%(Ä%p%0D8×%D<Ä'D@â%´2Dï%r%H4  2L0*Ç *D °(0*Ç ,4  20Á,Ò+É,Ü+×,Ü+ ä,æ+î,ð+ö,ò+4  2(Ò2Ø,0*Ç 0ñ2Ì43ª283´2<"3ð+@43ð+A °Ð:±:Ù:Dæ:D fCC$wC.C( Gð+$ Gð+%+GâF( Gð+,4  2gGZGoGZ ¬ð+¤GC,·Gð+0P7TLðà˜ðð˜ð™ð™ð$™ð4™ðD™ðT™ðd™ðt™ðŒ™ðœ™ð¬™ð¼™ðÌ™ðÜ™ðì™ðü™ð šðšð,šð<šðLšð\šðlšð|šðŒšðœšÀwˆ›l›x@x€xÀxy@y€yÀyÀ›¤›z@z€zÀz{@{€{À{|@|€|À|}@}€}Ü›À}~Ç1>HÇ’:x؈8“Ü ˆ6ä¬Cû¶‰BDöIÔ !÷*KßI±öVHÜ „õÀšï›¤Ji.œ[.i.Àœ¤J¬J@› 1, ¸†<,È+­†C,ú Ÿ†L,Œ%“†Q,¬?†\,Ô 4†c,¬à…q,Ô Õ…{,¬…Š,Ô v…•,¬"…ž,Ô …£,8 ,¬>‡,¬Ɔª8§.~HHHNöÎHHHëõJêI‹õŒ*HH1õ6JØÓôÂ/àœpT„TdTtT”T`T´T˜ThT\TˆT4TXT8TLTTTTlT0T T,T$TDTHTŒT(T?@ABCDEFºGÆß      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅ.objc_category_name_NTSynchronousTask_Notifications.objc_category_name_NTSynchronousTask_Private.objc_category_name_SUPlainInstaller_Internals.objc_category_name_SUPlainInstaller_MMExtendedAttributes.objc_category_name_SUUnarchiver_Private.objc_class_name_NTSynchronousTask.objc_class_name_SUAppcast.objc_class_name_SUAppcastItem.objc_class_name_SUAutomaticUpdateAlert.objc_class_name_SUAutomaticUpdateDriver.objc_class_name_SUBasicUpdateDriver.objc_class_name_SUDSAVerifier.objc_class_name_SUDiskImageUnarchiver.objc_class_name_SUHost.objc_class_name_SUInstaller.objc_class_name_SUPackageInstaller.objc_class_name_SUPipedUnarchiver.objc_class_name_SUPlainInstaller.objc_class_name_SUProbingUpdateDriver.objc_class_name_SUScheduledUpdateDriver.objc_class_name_SUStandardVersionComparator.objc_class_name_SUStatusController.objc_class_name_SUSystemProfiler.objc_class_name_SUUIBasedUpdateDriver.objc_class_name_SUUnarchiver.objc_class_name_SUUpdateAlert.objc_class_name_SUUpdateDriver.objc_class_name_SUUpdatePermissionPrompt.objc_class_name_SUUpdater.objc_class_name_SUUserInitiatedUpdateDriver.objc_class_name_SUWindowController_SUAllowsAutomaticUpdatesKey_SUAppcastError_SUAppcastParseError_SUAuthenticationFailure_SUAutomaticallyUpdateKey_SUDowngradeError_SUEnableAutomaticChecksKey_SUEnableAutomaticChecksKeyOld_SUEnableSystemProfilingKey_SUExpectsDSASignatureKey_SUFeedURLKey_SUFileCopyFailure_SUHasLaunchedBeforeKey_SUInstallationError_SUInstallerDelegateKey_SUInstallerHostKey_SUInstallerPathKey_SUInstallerVersionComparatorKey_SULastCheckTimeKey_SULastProfileSubmitDateKey_SUMissingInstallerToolError_SUMissingUpdateError_SUNoUpdateError_SUPublicDSAKeyFileKey_SUPublicDSAKeyKey_SURelaunchError_SURunningFromDiskImageError_SUScheduledCheckIntervalKey_SUSendProfileInfoKey_SUShowReleaseNotesKey_SUSignatureError_SUSkippedVersionKey_SUSparkleErrorDomain_SUTechnicalErrorInformationKey_SUTemporaryDirectoryError_SUUnarchivingError_SUUpdateDriverFinishedNotification_SUUpdaterWillRestartNotification_b64decode_load_dsa_key.objc_class_name_NSAlert.objc_class_name_NSArray.objc_class_name_NSAutoreleasePool.objc_class_name_NSBundle.objc_class_name_NSCharacterSet.objc_class_name_NSData.objc_class_name_NSDate.objc_class_name_NSDictionary.objc_class_name_NSError.objc_class_name_NSException.objc_class_name_NSFileManager.objc_class_name_NSFont.objc_class_name_NSImage.objc_class_name_NSInvocation.objc_class_name_NSMutableArray.objc_class_name_NSMutableCharacterSet.objc_class_name_NSMutableDictionary.objc_class_name_NSMutableURLRequest.objc_class_name_NSNotificationCenter.objc_class_name_NSNumber.objc_class_name_NSObject.objc_class_name_NSPipe.objc_class_name_NSProcessInfo.objc_class_name_NSProgressIndicator.objc_class_name_NSRunLoop.objc_class_name_NSSortDescriptor.objc_class_name_NSString.objc_class_name_NSTask.objc_class_name_NSThread.objc_class_name_NSTimer.objc_class_name_NSURL.objc_class_name_NSURLDownload.objc_class_name_NSURLRequest.objc_class_name_NSUserDefaults.objc_class_name_NSUserDefaultsController.objc_class_name_NSValue.objc_class_name_NSWindowController.objc_class_name_NSWorkspace.objc_class_name_NSXMLDocument_AuthorizationCreate_AuthorizationExecuteWithPrivileges_AuthorizationFree_BIO_free_BIO_new_mem_buf_CFBooleanGetValue_CFMakeCollectable_CFPreferencesCopyAppValue_CFPreferencesSetValue_CFPreferencesSynchronize_CFRelease_CFRetain_CFURLGetFSRef_CGWindowLevelForKey_DSA_free_EVP_DigestInit_EVP_DigestUpdate_EVP_PKEY_assign_EVP_PKEY_free_EVP_PKEY_new_EVP_VerifyFinal_EVP_dss1_FSIsAliasFile_Gestalt_GetCurrentProcess_NSApp_NSAppKitVersionNumber_NSApplicationDidBecomeActiveNotification_NSApplicationWillTerminateNotification_NSDefaultRunLoopMode_NSEventTrackingRunLoopMode_NSFileHandleNotificationDataItem_NSFileHandleReadToEndOfFileCompletionNotification_NSFileSize_NSFileType_NSFileTypeDirectory_NSFileTypeForHFSTypeCode_NSLocalizedDescriptionKey_NSLocalizedFailureReasonErrorKey_NSLog_NSModalPanelRunLoopMode_NSSelectorFromString_NSTaskDidTerminateNotification_NSTemporaryDirectory_NSWorkspaceRecycleOperation_PEM_read_bio_DSA_PUBKEY_ProcessInformationCopyDictionary_SHA1_UTGetOSTypeFromString___CFConstantStringClassReference___error__setjmp_closedir_fclose_floor_fopen_fread_free_fwrite_getuid_kCFPreferencesAnyHost_kCFPreferencesCurrentUser_malloc_memset_objc_exception_extract_objc_exception_match_objc_exception_throw_objc_exception_try_enter_objc_exception_try_exit_objc_msgSend_objc_msgSendSuper_objc_msgSend_fpret_objc_msgSend_stret_opendir_pclose_popen_readdir_removexattr_setenv_signal_snprintf_stat_statfs_strlcat_strlcpy_strlen_sysctlbyname_waitsingle moduleÏúíþˆ …(__TEXT€€__text__TEXT ëß €__symbol_stub1__TEXT òt ò€__stub_helper__TEXT€óè€ó__cstring__TEXThöˆFhö__literal8__TEXTð<ð<__eh_frame__TEXT€=€B€= `H__DATA€À€À__dyld__DATA€€__nl_symbol_ptr__DATA€˜€>__la_symbol_ptr__DATA¨€ð¨€Q__objc_msgrefs__DATA ‚6 ‚__objc_classrefs__DATA0¹(0¹__data__DATA`¾HR`¾__objc_classlist__DATA¨Ш__objc_selrefs__DATAx0x__objc_superrefs__DATA¨€¨__cfstring__DATA(À(__gcc_except_tab__DATAè.Xè.__objc_catlist__DATA@0(@0__objc_protolist__DATAh0h0__objc_nlclslist__DATAp0p0__objc_imageinfo__DATA€0€0__bss__DATAˆ00H__LINKEDIT@€Å@€Å X@loader_path/../Frameworks/Sparkle.framework/Versions/A/Sparkle‹æ,•¿Vƒ do8ZÅñÕ8£+°ãÐ! P¨¨ƒpáèµq@ ðH 8  /usr/lib/libcrypto.0.9.7.dylib `’y/System/Library/Frameworks/Security.framework/Versions/A/Security X /System/Library/Frameworks/WebKit.framework/Versions/A/WebKit X/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit ` ¥,/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation Xµ-/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 8/usr/lib/libgcc_s.1.dylib 8o/usr/lib/libSystem.B.dylib h /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices 8ã/usr/lib/libobjc.A.dylib hÜ–/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation p"/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServicesASL×íÿÿASÿ%ÏmUH5´uH‰åH‰]ðL‰eøHƒìL‹%ŽuH‰ûH‹=l§ÿŽuH‰ßH‰ÂH‹$M‰ãH5juL‹d$ÉAÿãUH‰åL‰mðL‰uøI‰ÕH‰]àL‰eèHƒì H…ÒI‰þuH‹=§H5@uÿ:uI‰ÅH‹ÈL‹%ùtL‰êH‹=ï¦H5øtÿòtH5ÛtH‰ÂH‰ßAÿÔH…ÀuKL‰÷H5³tÿ­tH5–tH‰ÇÿtL‰êL‹stH‹$L‹d$L‹l$H‰ÇL‹t$H5VtÉAÿãH‹$L‹d$L‹l$L‹t$ÉÃUH5%tH‰åL‰mðL‰uøI‰ÖH‰]àL‰eèHƒì0H‹,ÿH‰}ÐH}ÐH‰EØÿòsM…öI‰ÅuH‹=+¦H5LtÿFtI‰ÆH‹ÔL‹%tL‰òH‹=û¥H5tÿþsH‰ßH‰ÂH5ásAÿÔH…ÀH‰Ãt(L‰ïH5|sÿvsH5_sH‰ßÿVsI‰ÅéÖM…í„ÍHƒ=eu+H‹=Œ¥H5msÿgsH5sH‰ÇÿsH‰8H‹1L‹%ârL‰òH‹=X¥H5asÿ[sL‰êH‰ÁH5¾rH‰ßAÿÔH‹=!¥H5 sÿsL‰òH‰ÇH5‡rÿrH‹º©H5crL‰ïI‰DÿUrH‹¦üfWÀ1ÉH51rL‰ïÿ(rL‰èH‹]àL‹eèL‹mðL‹uøÉÃUH5ërH‰åH‰]ðL‰eøHƒìL‹%urH‰ûH‹=£¤ÿÅrH‰ßH‰ÂH‹$M‰ãH5QrL‹d$ÉAÿãUH5°qH‰åH‰]àL‰eèI‰üL‰mðL‰uøHƒì H‹ÿ¨L‹-0¤L‹5qqH‹<ÿwqH‰ÃL‰çH5rÿrI‰ØH‰ÁL‰ïM‰óH‹$L‹d$L‹l$L‹t$H†ýH5'q1ÀÉAÿãUH5 qH‰åH‰]ØL‰uðI‰þL‰eàL‰mèL‰}øHƒì0H‹t¨HUÆH‹<H‹ÿÐpH…À…äH‹H¨H‹YûH5¢pI‹<ÿ˜p„Àt(H‹%¨L‰òH5spI‹<ÿip„À…Óé™H‹¨H‹H5KqI‹<ÿAqH…À…uH‹á§L%ºÅH5CpI‹<I‹$ÿ5pH…Àt7H‹¹§H‹âoH5ëoI‹$I‹<ÿÝoH5Æo¾ÐL‰÷ÿÓéH‹‚§HÃÅH5´oI‹<H‹ÿ§o„Àu%H‹\§H‹ H5roºI‹<ÿcoéËH‹7§H5@oI‹<ÿ6oI‰ÇH‹§H‹-úH5noI‹<ÿdo„ÀtOH‹ñ¦L‹-ÒnH5ënL‹%ÔnL‰÷I‹ÿ×nL‰ò¾ÈH5ºnH‰ßAÿÔL‰ÿH‰ÂH5—nAÿÕI‰ÇH‹ª¦H‹=Ó¡M‰ðL‰ùL‹fnH‹]ØL‹eàL‹mèH5SnI‹L‹}øL‹uðÉAÿãL‰÷L‹)nH‹]ØL‹eàL‹mèH5nL‹uðL‹}øÉAÿãUH5rnH‰åSH‰ûHƒì…Ҕ¶ÒÿYnL‹ÒmH‰ßHƒÄH5Äm[ÉAÿãUH5§mH‰åSH‰ûH‰×Hƒìÿ“mH‰ÂH‰ØHî¥H;uUH5jmH‰×ÿam„ÀtAH‹Î¥H5¿nH‹<ÿµnH‹¶¥H‰ßH5dmHÇL‹UmHƒÄ[ÉAÿãHƒÄ[ÉÃUH‹}¥H5æmL‹ßmH‰åH‹<HÃH‹ÉAÿãUH‰åATI‰üSHƒìH‹U¥H‹<H…ÿtH5µlÿ¯lH‹8¥IÇH5‰lL‰çÿ€l„À„ºH5alL‰çÿXlH…ÀH‰ÃuH‹= H52lÿ,lH‰ÃH‹=úŸH5 lÿlH‰ÚH‰ÇH5èkÿâkH5ËkòEèL‰çÿ½kò #ò_ÈfWÀf.Mèv f(Áò\EèL‰âH‹=“ŸH‹ Œ÷E1ÉE1ÀH5okÿikH‹b¤I‰HƒÄ[A\ÉÃUH5=kH‰åATSH‰ûL‹%ýjÿ'k„Àt H‹=4ŸëH‹=#ŸH5LmÿFmH5/mH‰Çÿ&mH‰ÚH‰ÇH5ÙjÿÓjH5¼jH‰Çÿ³jH‰ßM‰ãH‰Â[A\H5jÉAÿãUH5älH‰åATSL‹%wjH‰ûH‹=¥žÿÇlH‰ÚH‰ÇH5zjÿtjH5]jH‰ÇÿTjH‰ßM‰ãH‰Â[A\H51jÉAÿãUH5…lH‰åATSL‹%jH‰ûH‹=>žÿhlH‰ÚH‰ÇH5jÿjH5þiH‰ÇÿõiH‰ßM‰ãH‰Â[A\H5ÒiÉAÿãUH5¶iH‰åL‰uðL‰}øI‰þH‰]ØL‰eàI‰×L‰mèHƒì0ÿi„À…H‹ТI‹<H…ÿtH50jÿ*jH‹³¢IÇHŒ÷L‰÷H5:iÿ4iH‹}¢L‹-iH5¯iH‹=M‹$H}ÀH‹ÿ”iL‰çH‰ÂH5çhH‰ÙAÿÕH2÷L‰÷H5ÀhÿºhL‰ÿH5kÿ kH‹¢L‰÷H5‰hI‰H‹¢L‹-ghM‹$H‹ì¡I‹ÿbhL‰çM‰ëL‹eàH‰ÙL‹mèH‹]ØL‹uðL‹}øH‰ÂH5+hÉAÿãH‹]ØL‹eàL‹mèL‹uðL‹}øÉÃUH5ùgH‰åH‰]àL‰uøI‰þL‰eèL‰mðHƒì H‹=pœÿÒgH‰ÇH æE1ÉH‹ †ôL‰òH5¤gL‹ÿ›gH‹D¡H5}gI‹<ÿsgH‰ÃH‹=œH5¢jÿœjH9Ã…ÏH‹=ü›H55gÿ/gH‹°¦I‰ÄH¿L‹-÷fH5gH=ñõH‹ÿðfI‰ÙH‰ÁE1ÀL‰òL‰çH5ÊfAÿÕH‹= ›H5ÙfÿÓfL‹-¬fI‰ÄH‹J¦Hs¾H5¤fH=•õH‹ÿ”fI‰ÙL‰òL‰çM‰ëH‹$L‹d$L‹l$L‹t$H‰ÁE1ÀH5XfÉAÿãH‹$L‹d$L‹l$L‹t$ÉÃUH5‡fH‰åAUATSH‰ûHƒìH‹= ›ÿkfH5fH‰ÇH‰ÚÿøeH‹=ášH5fÿfI‰ÅH¾L‹%ÃeH5ìeH=ÝôH‹ÿÜeH‰ÁH‰ÚH5ŸeL‰ïAÿÔH‹=’šH5ËeÿÅeI‰ÅHs½L‹%teH5eH=ŽôH‹ÿeH‰ÁH‰ÚH5PeL‰ïAÿÔë'HÿÊH‰ÃuH‰ÇèñÓèòÓëH‰ÃèèÓH‰ßè’ÓHƒÄ[A\A]ÉÃUH‰åSH‰ûHƒìL9 ˤuMH5JhÿDhH‰ÚH‰ÇH‹ 'òE1ÀH5ÍdÿÇdH‹òò`H5qg1ÉH‰ßÿfgë H‹õòH‰}àH5‚dH}àH‰EèÿtdHƒÄ[ÉÃUH5ÕgH‰åSH‰ûHƒìÿÄgH‰ÚH‰ÇH5WdH‹  ñE1ÀÿGdL‹ fH‰ßHƒÄH5f[ÉAÿãUH5efH‰åATA‰Ô¾ÒSH‹2žH‰ûH‹<H ¼H‹ÿ;fE„ät4H5/eH‰ßÿ&ef.ŽuzòŠH5«cH‰ßÿ¢cH‰ßH5gÿgH‰ÚH‰ÇH‹ õðH5žcE1Àÿ•cH‰ßH‹ÛðL‹Df[ò#1ÉA\H50fÉAÿãUH5¤dH‰åSH‰ûHƒìÿ“df.ûzt,H‹`L‹ cH5cH‹<H/»H‹HƒÄ[ÉAÿãHƒÄ1À[ÉÃUH‹*¾ÒL‹@eH59eH‰åH‹<H »H‹ÉAÿãUH5œbH‰åATL%èºSH‹èœH‰ûI‹$H‹<ÿwbH…Àt H‹ËœI‹$H5PbH‹<ÿFb„Àt*H‹«œL‹ädH5ÝdH‹<H’º[A\H‹ÉAÿã[A\É1ÀÃUH5ùaH‰åH‰]èL‰eðL‰møHƒì H‹_œL‹-øbL‹$HºH‰×H‹ÿÁaL‰çM‰ëL‹eðH‰ÙL‹møH‹]èH‰ÂH5ÂbÉAÿãUH5feH‰åL‰møH‰]èL‰eðHƒì H‹ü›H‹<H1ºH‹ÿ8eH…ÀI‰Åu$H‹=Á–H ñH#ñH54a1Àÿ,aH‹=•–H&ñH5aÿaH‹r–L‹%Ó`L‰ïH‰ÂH5Ö`ÿÐ`H‰ßM‰ãH‹]èL‹eðL‹møH‰ÂH5¤`ÉAÿãUH‰åH‰]ðL‰eøHƒìH‹9›I‰üH‰ÓH‹<H9×tDH5c`ÿ]`„Àu3H‹›H5dI‹<ÿdH5*`H‰ßÿ!`H‹êšI‰H‹$L‹d$ÉÃUH‹ÓšH5ÌcH‰åH‹<ÿ¿cL‹¨aH‰ÇH5žaÉAÿãUH‹²š¾ÒL‹ÈbH5ÁbH‰åH‹<Hk¸H‹ÉAÿãUH‹„šH5½bL‹¶bH‰åH‹<H@¸H‹ÉAÿãUH5i_H‰åAWAVAUI‰ýATSHƒì(ÿP_H59bL‰ïH‰EÀÿ,bL=õ·‰ÃH‹šH5…bI‹|I‹ÿwbH…ÀuH‹=#•H5Daÿ>aH‰ÇH5ä^ÿÞ^ò vH‹=Ÿ”H5¸^f.ÈA“Äÿª^I‰ÆH‹¨™A!ÜH‹¾ìH5ÿaI‹|ÿôa„Àt9H‹™H‹baA¾ÌL‰êH5daI‹|ÿYaL‰÷H‰ÂH5ˆH‹ÿMWH^ªI‰ÀHtªH5%WH‰ßHc H‹AÿÔé{H‹=5ˆH5FXÿ@XL‰úH‰ÇH5ãVÿÝV„ÀtBH‹= ˆH5XÿXH‰ÃL‹%»VH5¤VL‰ÿÿ›VH5¤VH‰ÂH‰ßAÿÔ„Àu"H‹½pÿÿÿH5iVM‰ðL‰ùL‰êÿZVéL‰úH5«VH‹½pÿÿÿÿžVH‹=‡H5 WH‰E¨ÿ–WL‹…pÿÿÿH‰ÇH‹M¨L‰úH5þUÿøU„À…ŸM…ö„=H‹ ‡L‹%‡L‰ùL‹E¨H‹=‡HüâH5=VH‰EˆH‹òUH‰E¸H‹÷UH‰E°H‹üLH‹1ÀÿVH5ÚUH‰ÂL‰çH‰ÙÿU°HߨI‰ÀHõ¨H5¦UH‹}ˆHc H‹ÿU¸I‰é§H‹=²†H5ÃVÿ½VL‹…pÿÿÿH‰ÇL‰ùL‰êH5UÿU„À…¡M…ö„eH‹H†L‹%9†M‰øL‰éH‹=<†HEâH5fUH‰EH‹UH‰…xÿÿÿH‹UH‰E€H‹"LH‹1Àÿ7UL‰çH‰ÂH5úTH‰ÙÿU€H¨I‰ÀH¨H‹}H5ÈTHc H‹ÿ•xÿÿÿéÿÿÿH‹= …H5ITHÇEÈÿ;TH‹|…H‰E˜H5TH‹òSL‹%ûSH‹}¨H‰E ÿýSH‰ßH‰ÂH5àSAÿÔH56TH‰ÃH‹}¨ÿ)TH‰ÁHEÈI‰ÙL0àH5¡SH‹}˜H‰$H‹JKH‹ÿU „ÀuH‹u¨H=Eá追H‹½pÿÿÿH5TL‰úÿT¸ë1ÀH‹]ØL‹eàL‹mèL‹uðL‹}øÉÃUH‰åH‰]ðL‰eøHƒìHƒ=BI‰ÔD‰Ãu 蔽ÇNë^H5îTH‰ÏÿåT‰ÚL‰æL‹H‹$L‹d$H‰ÇÉAÿãHÿÊH‰Ãu"H‰Çè’½èK½Ç!舽ëH‰Ãè~½H‰ßè(½H‹$L‹d$¸ÿÿÿÿÉÃUA¸H‰ÑH5†RH‰åL‰eèI‰ÔL‰uøHLÎH‰]àL‰mðI‰þHƒì ÿ\RH‹=„H5.Tÿ(T1ÉH‰ÇL‰âH5)Rÿ#RH‰ÇH‹ùIH5RH‹ÿùQH‹êIH;uwH‹=΃H5ßSÿÙSH5ÂQH‰ÇL‰âÿ¶QI‰Åë6H‰ÂH5‡QL‰çH‹ÍQÿwQA¸H‰ÁH’ÍH5°QL‰÷ÿÓH5dQL‰ïÿ[QH…ÀuµH‹$L‹d$L‹l$L‹t$ÉÃUH‰åH‰]ðL‰eøHƒì H‹²ŽL%³VH‰ûL‰æH‹<ÿ£VH‹ŒŽL‰æH‹<ÿVH‹˜ÛH‰]àH}àH5iVH‰Eèÿ_VH‹]ðL‹eøÉÃH‹VŽUH‰åH‹ÉÃUòùH5VH‰åATI‰üSH‹=ƒÿ VH‰ÃH‹ŽI‹H…ÒtH ·ÞH5ØUH‰ßÿÏUH‹=à‚H5±Uÿ«UL‰áH‰ÚH‰ÇH5‹Uÿ…UH5nUH‰ÇÿeU[A\ÉH‰ÇéfºUH‰åH‰]ðL‰eøH‰ËHƒìI‰Ô豺H‰ÚH‰ÇH5!UÿUL‰çL‹UH‹$L‹d$1ÉH‰ÂH5ìTÉAÿãUH5`UH‰åH‰]ðL‰eøHƒìH‹*H‰ËI‰üH‹<ÿ:UH‰ßH5 TÿšTH‹H‹$I‰L‹d$ÉÃUH‰åAWAVAULmÈATSHƒìXH‰}€H‰×èš¹H‹=ÌH5¥THÇEÈÿ—TH‹M€H‰ÃH‹©ŒL‹%TH‹=“H5TH‹ÿ TM‰è1ÉH‰ÂH5ëSH‰ßAÿÔH‹=^H5ÇSH‰Eˆÿ½SH‹=>H5ŸSH‰E˜ÿ•SH‹M€H‰ÇH‹7ŒH5pSH‹1ÉÿdSH‹ŒH‹U€H52TH‹<ÿ(TH‹ŒH‹M€HÇHƒ}ˆ„ËL‰éHÈÜH5 SH‹}ˆÿÿRH…À„§H5ßRH‰ÇÿÖRH‹=€H5¸RH‰E¨ÿ®RH‹=w€H5 RH‰Eÿ–RH‰E°é<H5fRH‰ßÿ]RH5FRH‰Çÿ=RH…À„¨H5R1ÒH‰ßÿRé…H5öQL‰ïÿíQH…ÀH‰Ãt]H‰ÂH5ËQH‹}ÿÁQH…ÀI‰Äu.H‹=òH5[RÿURH‰ÙI‰ÄH‰ÂH5…QH‹}ÿ{QL‰êH5aQL‰çÿXQH5AQL‰ïÿ8QH…ÀI‰Å…oÿÿÿH‹}H5Qÿ QH‰E¸éªH‹ëPL‰òH51QH‹}ÿ'QH5ÐPH‰ÂH‹}€ÿÓHhÛI‰ÇH5¦PL‰÷ÿP„À„L‰ÿH5{PÿuPH5NQH‰ÇÿEQH‹=þ~H5'QI‰ÇÿQI‰Æë=H5ÂPL‰ïL‹%˜Pÿ²PH‰ÃH5PL‰ïÿPH‰ÙH‰ÂH5rPL‰÷AÿÔH5ÅPL‰ÿÿ¼PH…ÀI‰Åu«H µÚL‰òëTHÉÚH5êOL‰÷ÿáO„ÀtLH‹^~L‹%ŸOH5¨OL‰ÿÿŸOH5ˆOH‰ÂH‰ßAÿÔH…ÀtrL‰ñH‰ÂH‹}°H5éOÿãOëYH5jOL‰ÿL‹-ÐOÿZOH‰ÃL‹% OH‹=é}H5"OÿOH5OH‰ÂH‰ßAÿÔL‰ñH‰ÂH5OH‹}°AÿÕH5áOH‹}¸ÿ×OH…ÀI‰Æ…9þÿÿH‹=Œ}H5Pÿ—PH‹U°H‰ÇH5™Nÿ“NH…ÀH‰Ãt&H‹}˜H‰ÂH5OÿOH5 PH‰ßÿ—PëH‹u°H=²Ù1À芵H5ÔH·ÖH5XJÿRJM‰éM‰àH‰ÙH‰ÂL‰÷HÇ$H5$J1ÀÿUÈHD›I‰ÀHF›H‹}¸H5óIHc H‹ÿUÀL‰úH‹}¨L‹]°H‹]ØL‹eàH‰ÁL‹mèL‹uðH5uIL‹}øÉAÿãH‹]ØL‹eàL‹mèL‹uðL‹}øÉÃUH5KH‰×H‰åL‰uðH‰]ØI‰ÖL‰eàL‰mèL‰}øHƒì0ÿèJHÿÈu1ÒéH5ÕJL‰÷ÿÌJH…À„)H5üJL‰÷ÿóJH‹=¼xH5%KH‰ÃÿKI‰ÇëEH¸ÕH5©HL‰ïÿ HH5ÉIH‰ÇÿÀIHñÒH…ÀH5JL‰ÿHEÐÿJH5kJH‰ßÿbJH…ÀI‰Åu£H‹=ówL‰úH59Hÿ3H1ÒH‰ÇH5GHÿAHL‹%úGH‰ÃH‰ÂH5ýGL‰ÿÿôG„ÀHsÒH5ÔGL‰ÿHDØH‰ÚAÿÔHºÿÿÿÿÿÿÿH9ÐIDÅH‰ÂL‰÷L‹éGH‹]ØL‹eàL‹mèH5ÖGL‹uðL‹}øÉAÿãH‹]ØL‹eà1ÀL‹mèL‹uðL‹}øÉÃUH‰åH‰]ðL‰eøHƒìH‹›‚I‰üH‰ÓH‹<H9×t(H5•JÿJH5øIH‰ßÿïIH‹h‚I‰H‹$L‹d$ÉÃH‹J‚UH‰åH‰ÉÃUH‹À…H5 LH‰åH‹<ÿüKL‹åKH‰ÇH5ÛKÉAÿãUH‰åH‰]ðL‰eøHƒìH‹€…I‰üH‰ÓH‹<H9×t(H5šKÿ”KH5}KH‰ßÿtKH‹M…I‰H‹$L‹d$ÉÃUH‹.…H5KH‰åH‹<ÿrKL‹[KH‰ÇH5QKÉAÿãUH‰åH‰]ðL‰eøHƒìH‹î„I‰üH‰ÓH‹<H9×t(H5Kÿ KH5óJH‰ßÿêJH‹»„I‰H‹$L‹d$ÉÃUH‹œ„H5õJH‰åH‹<ÿèJL‹ÑJH‰ÇH5ÇJÉAÿãUH‰åH‰]ðL‰eøHƒìH‹\„I‰üH‰ÓH‹<H9×t(H5†Jÿ€JH5iJH‰ßÿ`JH‹)„I‰H‹$L‹d$ÉÃUH‹ „H5kJH‰åH‹<ÿ^JL‹GJH‰ÇH5=JÉAÿãUH‰åH‰]ðL‰eøHƒìH‹ʃI‰üH‰ÓH‹<H9×t(H5üIÿöIH5ßIH‰ßÿÖIH‹—ƒI‰H‹$L‹d$ÉÃUH‹xƒH5áIH‰åH‹<ÿÔIL‹½IH‰ÇH5³IÉAÿãUH‰åH‰]ðL‰eøHƒìH‹8ƒI‰üH‰ÓH‹<H9×t(H5rIÿlIH5UIH‰ßÿLIH‹ƒI‰H‹$L‹d$ÉÃUH‹Ö‚H5WIH‰åH‹<ÿJIL‹3IH‰ÇH5)IÉAÿãUH‰åH‰]ðL‰eøHƒìH‹–‚I‰üH‰ÓH‹<H9×t(H5èHÿâHH5ËHH‰ßÿÂHH‹c‚I‰H‹$L‹d$ÉÃUH‹D‚H5ÍHH‰åH‹<ÿÀHL‹©HH‰ÇH5ŸHÉAÿãUH‰åH‰]ðL‰eøHƒìH‹‚I‰üH‰ÓH‹<H9×t(H5^HÿXHH5AHH‰ßÿ8HH‹ÑI‰H‹$L‹d$ÉÃUH‹²H5CHH‰åH‹<ÿ6HL‹HH‰ÇH5HÉAÿãUH‰åH‰]ðL‰eøHƒìH‹rI‰üH‰ÓH‹<H9×t(H5ÔGÿÎGH5·GH‰ßÿ®GH‹?I‰H‹$L‹d$ÉÃUH‹HH5¹GH‰åH‹<ÿ¬GL‹•GH‰ÇH5‹GÉAÿãUH‰åH‰]ðL‰eøHƒìH‹I‰üH‰ÓH‹<H9×t(H5JGÿDGH5-GH‰ßÿ$GH‹Õ€I‰H‹$L‹d$ÉÃUH‹¶€H5/GH‰åH‹<ÿ"GL‹ GH‰ÇH5GÉAÿãUH‰åH‰]ðL‰eøHƒìH‹v€I‰üH‰ÓH‹<H9×t(H5ÀFÿºFH5£FH‰ßÿšFH‹C€I‰H‹$L‹d$ÉÃUH5lFH‰åL‰uðH‰]ØL‰eàL‰mèL‰}øHƒìPH‹âÉH‰}ÀH‰U°H}ÀH‰EÈÿ4FH…ÀI‰Æ„ÈH‰ÍH5 FH‹}°ÿFH‘ÎI‰ÇH5ïEH‰ÇÿæEH…ÀH‰E¸ukHŽÎH5ÏEL‰ÿÿÆEH—ÎH‰ÇH5¥EÿŸEH5ˆEH‰ÃH‰Çÿ|EHƒøv$H5_EH‰ßÿVEH5?EH‰Çÿ6EH‰E¸M…ÿt#HÎH5_EL‰ÿÿVEH…ÀtHƒ}¸uH5sEL‰÷E1öÿgEéâH‹=»pH5ÔDÿÎDH‹U°H‰ÇH5°DÿªDH‹³~H5üDI‰HéÍH‹zDH‹}°ÿàDH5iDH‰ÂL‰÷ÿÓH‹JDH[ÌH5¼DH‹}°ÿ²DH5+DH‰ÂL‰÷ÿÓH‹ DH­ÍH5ŽDH‹}°ÿ„DH5íCH‰ÂL‰÷ÿÓH‹öoL‹-§CHÍL‹%©CH5RDL‰ÿÿIDºH‰ÇH5šCÿ”CH‰ßH‰ÂH5wCAÿÔH5]CH‰ÂL‰÷AÿÕH‹=CH>ÍH5ÿCL‰ÿÿöCH5CH‰ÂL‰÷ÿÓH‹U¸H5üBL‰÷ÿóBH‹ÜBHÍH5¾CH‹}°ÿ´CH5½BH‰ÂL‰÷ÿÓH‹žBHÍH5CH‹}°ÿ†CH5BH‰ÂL‰÷ÿÓHÍH5iCL‰ÿÿ`CH…ÀtH5DBH‰ÂL‰÷ÿ8Bë&H5BL‰÷H‹%BÿBH5BH‰ÂL‰÷ÿÓHÑÌH5CH‹}°ÿCH…Àt/L‹-ÌAH‹}nH¦ÌL‹%7BH‹}°H5ÜBÿÖBëPH5AL‰÷ÿ„AH•ÌH‰ÇH5cAÿ]A„ÀtGL‹-rAH‹#nH5TAL‹%ÝAL‰÷ÿDAH‰ßH‰ÂH5ÇAAÿÔH5=AH‰ÂL‰÷AÿÕë1ÒH5)AL‰÷ÿ AL‰ðH‹]ØL‹eàL‹mèL‹uðL‹}øÉÃU1ÒH5½AH‰åSH‰ûHƒìÿ¬AH‰ß1ÒH5AÿŠAH‰ß1ÒH5nAÿhAH‰ß1ÒH5¼@ÿ¶@H‰ß1ÒH5 AÿAH‰ß1ÒH5AÿAH‰ß1ÒH5Ö@ÿÐ@H‰ß1ÒH5”@ÿŽ@H‰ß1ÒH5¢@ÿœ@1ÒH‰ßH5€@ÿz@H‹#{H5œAH‹<ÿ’AH‹ÅH‰]àH}àH5ì?H‰Eèÿâ?HƒÄ[ÉÃH‹äzUH‰åH‹ÉÃUH5FH‰åH‰]èL‰eðLEÐL‰møHƒì0H‹´ÄH‰}ÐI‰ÕI‰ÌH ëÊH‰EØH‹ €H‹L‰Çÿ»EH…ÀH‰ÃtHH5œEL‰çÿ“EH‹ôH5…EL‰ïH‰ÿxEH‹áH5ZEH‰ßH‰1ÒÿKEH‰ØL‹eðH‹]èL‹møÉÃUH5EH‰åH‰]àL‰eèI‰üL‰mðL‰uøHƒì H‹‰L‹- lL‹5ÓDH‹<ÿÙDH‰ÃL‰çH5ÜDÿÖDI‰ØH‰ÁL‰ïM‰óH‹$L‹d$L‹l$L‹t$H8ÄH5‰D1ÀÉAÿãUH‰åH‰]ðL‰eøHƒì H‹L%UDH‰ûL‰æH‹<ÿEDH‹ö~L‰æH‹<ÿ1DH‹ZÃH‰]àH}àH5 DH‰EèÿDH‹]ðL‹eøÉÃUH5ßCH‰åATA‰ÔSH‹—~H‰ûH‰ÚH‹<ÿ¿CH‹€~1ÒH5ŸCH‹<ÿ•CH‹f~1ÒH5uCH‹<ÿkCH5TCH‰ßÿKCH‹D~H‹½ÁH5&CH‹<ÿC„Àt&H‹!~H‰ÚD‰áL‹ôBH5íBH‹<[A\ÉAÿã[A\ÉÃU1ÒL‹ÃBH5¼BH‰åÉAÿãUºL‹¨BH5¡BH‰åÉAÿãUºL‹BH5†BH‰åÉAÿãUHoÆH5`BH‰åAWI‰ÿAVAUATSHì¸H‹{}L‹%BH‹H‹=ùiÿ+BH5BH‰Çÿ BH‰ßH‰ÂH5îAAÿÔH‹<}H5ÍAI‹<ÿÃAH‰ÃòìL‹%AH‹=šiH5“AÿAH5vAH‰ÇÿmAH‰ßH‰ÂH5PAAÿÔH‹Þ|H5oAI‹<ÿeAL‹%AH‰ÃH‹=DiºH5AÿAò,ÐH5ç@H‰ßAÿÔH‹’|L‰úH5°AI‹<ÿ¦AH‹w|L‰úH5…AI‹<ÿ{AH‹\|H5@I‹<ÿƒ@Hl@H‰ÆH½pÿÿÿÿ\@H‹…pÿÿÿH‹=¦hH57@H‰EH‹…xÿÿÿH‰E˜H‹E€òU˜H‰E H‹Eˆò•hÿÿÿòM òUH‰E¨ò@ÿÿÿòE¨ò•`ÿÿÿò…PÿÿÿÿÞ?ò®êH‰Çò@ÿÿÿH¸@@ò…PÿÿÿH‰EÈòYËò‰êòYÃH‰EÀH5Š?òX`ÿÿÿòX…hÿÿÿò\Êò\ÂòM°H‹E°òE¸H‰$H‹E¸H‰D$H‹EÀH‰D$H‹EÈH‰D$ÿ??H5(?H‰Çÿ?H‹{H5?I‰H‹þzºI‹<ÿç>H‹èzL‰úH5Æ>I‹<ÿ¼>H‹ÅzH5?AÆH‹ÊzI‹<ÿø>H‰ÇH‹¦zH5w>I‹ÿm>H‹¶zH5O>I‹<ÿE>H…À„ìH‹•zH5.>I‹<ÿ$>H5 >H‰Çÿ>„Àt7H‹QzH5â=I‹<ÿØ=L‹Á=H"ÅH5³=H‰Ç1ÉéÕH‹zH5«=I‹<ÿ¡=H‹zfI‰ÅH‹zL‹5Y=L‹%b=H5›=I‹<ÿ‘=H‰ßH‰ÂH5D=ò¤è¹AÿÔHĸL‰ïM‰ó[A\A]A^A_H‰ÂH5=ÉAÿãH‹‘yH5"=I‹<ÿ=H‰ÃH‹ŽyL‹%÷<H5À<I‹<ÿ¶<H5ß<1ÉH‰ÂH‰ßM‰ãHĸ[A\A]A^A_ÉAÿãUH‹@yH5q<H‰åH‹<H‹‡H‹ÿZ<H…ÀtL‹><H57<H‰ÇÉAÿãɸÃUH51<H‰åH‰]ðL‰eøHƒìH‹ãxL%ü†H‰ûI‹$H‹<ÿ<H…Àt*H‹¿xI‹$H5Ì;L‹Å;L‹d$H‹<H‹$ÉAÿãH‹$L‹d$¸ÉÃUH5Œ;H‰åAUI‰ýATSHì¸ÿt;¿H‰ÃL‹%U;èiœH‰ßH`ÿÿÿHcÐH5<;AÿÔH5B;L‰ïÿ9;HB<H‰ÆH‰ßÿ6<H‹…`ÿÿÿH5ø:L‰ïH‰E H‹…hÿÿÿH‰E¨H‹…pÿÿÿH‰E°H‹…xÿÿÿH‰E¸ÿÊ:„À…•H‹ÃwòE¸Hß;H‰ßò…XÿÿÿI‹tÿÉ;H‹…`ÿÿÿò’æòXÿÿÿH5›:L‰ïH‰EÀH‹…hÿÿÿH‰EÈH‹…pÿÿÿH‰EÐH‹…xÿÿÿH‰EØòXEØò\ÈòM¸ÿ_:1ÒH‰ÇH5#:ÿ:H5:L‰ïÿý9„À…äH‹wH5G;I‹|ÿ<;H55;H‰Çÿ,;H;H‰ÆH‰ßÿ ;H‹…`ÿÿÿò ÚåH5;H‰E€H‹…hÿÿÿH‰EˆH‹…pÿÿÿòEˆH‰EH‹…xÿÿÿò\ÁH‰E˜H‹–vòXM˜òEˆòM˜I‹|ÿ´:H5­:H‰Çÿ¤:H‰ÇH‹E€H5&9H‰$H‹EˆH‰D$H‹EH‰D$H‹E˜H‰D$ÿ9H5J9L‰ïÿA9H‰ÇH‹E 1ÒH5Ñ8H‰$H‹E¨H‰D$H‹E°H‰D$H‹E¸H‰D$ÿ¬8H59L‰ïÿü8H5…8H‰Çÿ|8H5Å8L‰ïÿ¼8„Àt!L‹Q8HĸL‰ï[A\A]H5;8ÉAÿãHĸ[A\A]ÉÃUºH5\:H‰åÿS:ɸÃUH‹|uH5í7L‹æ7H‰åH‹<ÉAÿãUH5³7H‰åH‰]èL‰eðL‰møHƒì H‹AuL‹%ÂaL‹-‹:H‹<ÿ7H‰ÃH‹=ŸaHؽH5É9ÿÃ9H ¤»H‰ÇHú¿H5[7L̽ÿN7H‰ÙH‰ÂL‰çM‰ëH‹]èL‹eðL‹møH5:1ÀÉAÿãUH57H‰åL‰uðL‰}øI‰þH‰]ØL‰eàL‰mèHƒì@H‹œtH‹<ÿÒ6H‰EÈH‹tH5°6I‹<ÿ¦6H56I‰ÇH‰ÂH‹}Èÿ6„ÀtvH‹TtH‹M6H5V6I‹<ÿL6H-»H‰ÁH5+6H‹}È1ÀÿÓH‰EÈH‹tH56H‹ 6I‹<ÿð5L‰ÿH‰ÁHëºH5ì51ÀÿÓI‰ÇH‹ÖsL‹%W`H5 6L‹-9I‹<ÿ6H‰ÃH‹=-`Hf¼H5W8ÿQ8Lr¼H‰ÇH (ºH¡¾H5â5ÿÜ5M‰ùL‹EÈH‰ÙH‰ÂL‰çM‰ëH‹]ØL‹eàH5ª8L‹mèL‹uð1ÀL‹}øÉAÿãUH5 5H‰åH‰]ðL‰eøH‰ûHƒìI‰ÔH‰Ïÿ5H…ÀuFH‹ærH5ß4ºÆH‹×rH‹<ÿÅ4L‰çL‹«4H‹$L‹d$H5›4ÉAÿãH‹$L‹d$ÉÃUH‰åL‰mðL‰uøM‰ÅH‰]àL‰eèHƒì H‹zrL‹u€<uQH‹=ñ^H5B4ÿ<4H‰ÃL‹%4H54L‰ïÿ4H5û3H‰ßH‰ÂAÿÔL‹Û3H5Ô3L‰÷ëL‹¸3H5±3L‰÷H‹$L‹d$L‹l$L‹t$ÉAÿãUL‰ÇH5|3H‰åAVAUATSL‰Ãÿi3H5â5H‰ÇÿÙ5H…ÀI‰ÅtlH5:3H‰ßA¾ÿ+3I‰Äë9H5ÿ2H‰ßÿö2Hƒø H‰Áw L‰ðHÓà©¶tH‰ÚH5Æ2L‰ïÿ½2H5Ö2L‰çÿÍ2H…ÀH‰Ãu¯[A\L‰èA]A^ÉÃH‹bqUH‰åH‰ÉÃUH ˜¼H5 9H‰åATI‰ÔSHƒìH‹½µH‰}àH}àH‰Eèÿã8H…ÀH‰Ãt-H5Ä8L‰çÿ»8H‹DuH58H‰ßH‰1ÒÿŽ8HƒÄH‰Ø[A\ÉÃUH‰åATI‰üSHa8HƒìH‹uH‰ÞH‹<ÿI8H‹uH‰ÞI‹<ÿ58H‹þtH‰ÞI‹<ÿ!8H‹âtH‰ÞI‹<ÿ 8H‹þ´L‰eàH}àH5ç7H‰EèÿÝ7HƒÄ[A\ÉÃUH5¬7H‰åH‰]àL‰eèI‰üL‰mðL‰uøHƒì H‹ktL‹-Ä\L‹5m7H‹<ÿs7H‰ÃL‰çH5v7ÿp7I‰ØH‰ÁL‰ïM‰óH‹$L‹d$L‹l$L‹t$Hâ´H5#71ÀÉAÿãUH‰åATL%7SH‰ûL‰æÿó6H5Ü6H‰ÇÿÓ6L‰æH‰ßÿ×6HøºH‰ÇH5¦6ÿ 6H‹ÁsL‹‚6ºH5v6H‹<[A\ÉAÿãUH536H‰åH‰]èL‰eðL‰møHƒì H‹ysL‹%Ò[L‹-{6H‹<ÿ6H‰ÃH‹=¯[HØ·H5 6ÿ6H ¤µH‰ÇHzºH5Û5LÌ·ÿÎ5H‰ÙH‰ÂL‰çM‰ëH‹]èL‹eðL‹møH561ÀÉAÿãUH‹ñrH5z5L‹s5H‰åH‹<ÉAÿãUH5P5H‰åL‰eèL%J¸L‰mðI‰ÕH‰]àL‰uøH‰ûHƒì0I‰ÎòEØL‰âÿ5L‰ïH55ÿû4H‹¬rH‰ßH5Ú4H‰L‰âÿÍ4H‰ßòEØH5®4ÿ¨4L‰òH‰ßL‹‹4H‹]àL‹eèH5|4L‹mðL‹uøÉAÿãUH5¨4H‰åAWI‰ÏAVI‰þAUATSH‰ÓHt¹HìL‰…ØþÿÿDˆ×þÿÿÿq4H‹rI‹<H9ßt(H5*5ÿ$5H5=4H‰ßÿ44H‹ÕqI‰H¹L‰÷H54ÿ4L‰÷H5˜4Hðþÿÿÿ‹4H‹”qH5­3I‹<ÿ£3H‹|qL‹-u3H‰ßH{3M‹$L‰æÿn3H‹…ðþÿÿH`3H‰ßH‰…PÿÿÿH‹…øþÿÿH‰…XÿÿÿH‹…ÿÿÿH‰…`ÿÿÿH‹…ÿÿÿH‰…hÿÿÿH‹qò…hÿÿÿò…àþÿÿI‹4ÿ 3H‹…ðþÿÿL‰çH5ê2òàþÿÿH‰…pÿÿÿH‹…øþÿÿòM¸H‰…xÿÿÿH‹…ÿÿÿH‰E€H‹…ÿÿÿòE€òXaÛH‰EˆòE°AÿÕH‹–pHŸ2H‰ßL‹-u2M‹$L‰æÿˆ2H‹…ðþÿÿL‰÷H5W3H‰…0ÿÿÿH‹…øþÿÿH‰…8ÿÿÿH‹…ÿÿÿò…8ÿÿÿH‰…@ÿÿÿH‹…ÿÿÿò…èþÿÿH‰…Hÿÿÿÿ3H‰ßH‰ÆH#2ÿ2H‹…ðþÿÿH2H‰ßH‰EH‹…øþÿÿH‰E˜H‹…ÿÿÿH‰E H‹…ÿÿÿòE ò\†ÚH‰E¨H‹ÃoI‹4ò…ÀþÿÿÿÁ1H‹…ðþÿÿL‰çH51ò…ÀþÿÿòèþÿÿH‰…ÿÿÿH‹…øþÿÿòMÈH‰…ÿÿÿH‹…ÿÿÿH‰… ÿÿÿH‹…ÿÿÿò\… ÿÿÿH‰…(ÿÿÿòEÀAÿÕH‹CoH51I‹<ÿ1H5û0H‰Çÿò0H‹oL‰úH5Ñ0I‹<ÿÇ0H‹oH‹•ØþÿÿH5¢0I‹<ÿ˜0H‹án€½×þÿÿHK¶L‹l0H5e0I‹<H±HDÐHÄ[A\A]A^A_ÉAÿãU¸H‰åÉÃUH‹n¾ÒL‹0H50H‰åH‹<ÉAÿãH‹”nUH‰åòÉÃH‹‚nUH‰åòÉÃH‹hnUH‰åòÉÃfWÉUH5±/f(ÑH‰åSH‰ûò_ÐHƒìH‹7nf(Áòÿˆ/H‹ùmH‰ÚH5g/L‹`/H‹<HƒÄ[ÉAÿãUH‰åH‰]ðL‰eøHƒìH‹ÜmI‰üH‰ÓH‹<H9×t(H5ö0ÿð0H5 0H‰ßÿ0H‹©mI‰H‹$L‹d$ÉÃULòrI‰øH‰þE1ÉE1ÒH‰åé±€ù ”€ù ”ÀÂt E1ÉE1Òé“¶ÁA‹ ƒƒùÿ„ƒAƒùt% E…ÉtA‰ÊëqAƒùt6AƒùuïëOA‰ÊA¹ëX‰ÈB•A¹ƒà0A‰ÊÁø ÂAˆIÿÀë5‰ÈD‰ÒA¹ƒà<ÁâA‰ÊÁø ÂAˆIÿÀëD‰ÐE1ÉA‰ÊÁà ÈAˆIÿÀHÿƶ„É…DÿÿÿAÆÉI)øL‰ÀÃUH‰åATE1äSH‰ûHƒìèmH‰ß‰ÆèŒH…ÀH‰Ãt[Huè1É1ÒH‰ÇHÇEèèŒH…Àt6èIŒH…ÀI‰Ät)H‹Uè¾tH‰Çè$ŒÿÈtH‹}èèŒL‰çE1äèŒH‰ßè°‹HƒÄL‰à[A\ÉÃUH‰åAWAVAUATSL‰ÃHƒìhH…ÉH‰U€H‰xÿÿÿ„§M…À„žH‹=GTH50ÿ0Hc³H5ä/H‰ßI‰ÇÿØ/H5Á/H‰Çÿ¸/I‰ÆëAH‹|/H‹=õSH5~/L‹%W/ÿq/H5Z/H‰ÂL‰ïÿÓH5;/H‰ÂL‰ÿAÿÔH5[/L‰÷ÿR/H…ÀI‰Åu§HÛ²H5ü.L‰ÿÿó.H5Ü.H‰ÇÿÓ.H‰ÇèuþÿÿH…ÀI‰Å„ÇH5¸.H‹½xÿÿÿÿ«.H‰ÇI‰ÆèfýÿÿH‹=ASH‰EˆH5~.H‹U€ÿt.H…ÀI‰Ä„€L}°H5=.H‰Çÿ4.L‰çH‰ÃLeH53.ÿ-.H‰ÞH‰ÇL‰úèĊ胊L‰çH‰Æ1ÛèRŠÿÈu'ºL‰þL‰çèDŠ‹UˆL‰éL‰öL‰çèKŠƒø”ÃL‰ïè1Šë1ÛHƒÄh‰Ø[A\A]A^A_ÉÃUH5í.H‰åAUI‰ÕATSHƒìÿØ.H5Á.H‰Çÿ¸.I‰ÄH5ž.L‰çÿ•.H…ÀH‰ÃtXL‰êH5s.H‰Çÿj.„ÀtÑH‰ßH5L.ÿF.L‰êH‰ÇH5).ÿ#.L‹ .HƒÄH‰Ç[A\A]H5ù-ÉAÿãHƒÄ1À[A\A]ÉÃUH5Ð-H‰åH‰]èL‰eðL‰møHƒì H‹¶sL‹%ÏQL‹-˜-H‹ÿž-L‰çH‰ÁM‰ëI‰ØL‹eðH‹]èL‹møHç©H5h-1ÀÉAÿãH‹ssUH‰åH‰ÉÃUH‰åÉÃUH5Ó.H‰åH‰]àL‰eèI‰ÌL‰mðL‰uøHƒì0H‹"©H‰}ÐI‰ÕM‰ÆH}ÐH å²L‰âH‰EØÿ.H…ÀH‰ÃtsH5q.L‰ïÿh.H‹AuH5Z.L‰çH‰H‹$uL‰4ÿB.H‹ uH5$.H‰ßH‰1Òÿ.H5þ-H‰ßÿõ-H5Þ-H‰ÇÿÕ-H‰ØL‹eèH‹]àL‹mðL‹uøÉÃUH‰åH‰]ðL‰eøHƒì H‹©tL%’-H‰ûL‰æH‹<ÿ‚-H‹›tL‰æH‹<ÿn-H‹'¨H‰]àH}àH5H-H‰Eèÿ>-H‹]ðL‹eøÉÃUH5 -H‰åH‰]àL‰eèI‰üL‰mðL‰uøHƒì H‹+tL‹-PL‹5Í,H‹<ÿÓ,H‰ÃL‰çH5Ö,ÿÐ,I‰ØH‰ÁL‰ïM‰óH‹$L‹d$L‹l$L‹t$H¨H5ƒ,1ÀÉAÿãUH5e,H‰åSH‰ûHƒìÿT,H‹µsL‹6,H‰Ú1ÉH5*,H‹<HƒÄ[ÉAÿãUH5%,H‰åSH‰ûHƒìÿ,H‹usL‹ö+H‰Ú¹H5ç+H‹<HƒÄ[ÉAÿãUH5â+H‰åSH‰ûHƒìÿÑ+H‹2sL‹³+H‰Ú¹H5¤+H‹<HƒÄ[ÉAÿãUH‹ÿrH5x+L‹q+H‰åH‹<ÉAÿãUH5.+H‰åH‰]èL‰eðL‰møHƒì H‹ÄrL‹%­NL‹-f+H‹<ÿü*H‰ÃH‹=ŠNHƒªH5+ÿþ*H O¨H‰ÇH%°H5Ö*LwªÿÉ*H‰ÙH‰ÂL‰çM‰ëH‹]èL‹eðL‹møH5ú*1ÀÉAÿãUH5|*H‰åH‰]àL‰eèH‰ûL‰mðL‰uøHƒì H‹rL‹-NL‹5½*H‹<ÿC*I‰ÄH‹ùqH5B*H‹<ÿ8*H‰ÃH‹=ÆMH¿©H5@*ÿ:*LË©H‰ÇH §Hz¯H5 *ÿ*M‰àH‰ÙH‰ÂL‰ïM‰óH‹$L‹d$L‹l$H51*L‹t$1ÀÉAÿãUH5N-H‰åAUATSHƒìH‹¥H‰}ÐH}ÐH‰EØÿ)-H…ÀI‰Å„RH‹Ö,H‹=_MH5ø,ÿò,H5Û,H‰ÇÿÒ,H5»,H‰Çÿ²,H5›,H‰ÂL‰ïÿÓH‹|,H‹= MH5®,ÿ¨,H5‘,H‰Çÿˆ,H5q,H‰Çÿh,H5A,H‰ÂL‰ïÿÓH‹",H‹=ÃLH5d,ÿ^,H5G,H‰Çÿ>,H5',H‰Çÿ,H5ç+H‰ÂL‰ïÿÓH5È+L‰ïÿ¿+H‰ÃL‹%•+H5ž+L‰ïÿ•+H‰ßH‰ÂH5x+AÿÔH5Ž+L‰ïÿ…+H‰ÃH5K+L‰ïL‹%1+ÿ;+H5$+H‰ÂH‰ßAÿÔHƒÄL‰è[A\A]ÉÃUH5õ*H‰åSH‰ûHƒìH‹=ãKÿÝ*H‰ÚH‰ÇH5À*ÿº*H‰ß1ÒH5>+ÿ8+H‰ß1ÒH5+ÿ+H‰ß1ÒH5ú*ÿô*H‰ß1ÒH5h*ÿb*H‹£H‰]àH}àH5<*H‰Eèÿ2*HƒÄ[ÉÃUH5+H‰åL‰eàL‰mèM‰ÌL‰uðL‰}øI‰ÎH‰]ØI‰×Hƒì@M‰ÅH‹=KÿÏ*H5¸*H‰Çÿ¯*HÇEÈH‰EÀH5¬*H‹=åJÿŸ*H‰ÇH5…*ÿ*H‰ÃM‰áM‰èL‰ñL‰úH5‰)H‰Çÿ€)H5i)H‰ßÿ`)…Àu$H5E)H‰ßÿ<)H‰ÇH5")ÿ)H‰EÈH5)H‰ßÿø(ë'HÿÊH‰ÃuH‰Çè?‚è@‚ëH‰Ãè6‚H‰ßèàH‹}ÀH5´(ÿ®(H‹}ÈH5Ã)ÿ½)H‹EÈH‹]ØL‹eàL‹mèL‹uðL‹}øÉÃUH‰åAWM‰ÏAVM‰ÆAUI‰ýATI‰ÔSH‰ËHƒìH…Ét H57)ÿ1)H‰ÚH‰ÇH54(ÿ.(H5)L‰ïÿ)L‰âH‰ÇH5(ÿû'H5ô(L‰ïÿë(L‰òH‰ÇH5Î'ÿÈ'H‹=IH5z(ÿt(L‹%'H‰ÃH5ƒ(L‰ïÿz(H5ƒ'H‰Çÿz'I‰ÁH‹8H‹ ÁŸL‰êH‰ßH5L'L‹AÿÔH‹=IH5(ÿ(L‹%+'H‰ÃH5Q(L‰ïÿH(I‰ÁH‹î H‹ wŸL‰êH‰ßH5ú&L‹AÿÔH5í'L‰ïÿä'H5í&H‰Çÿä&H‰ÃH‹² L‹%£&H‹=„HE1ÉH5¢&L‹H‹˜ H‹H‹– H‹1Àÿƒ&H5l&H‰ßH‰ÂAÿÔH5¬'L‰ïÿ£'H‰ÇH59&ÿ3&M…ÿu/éHÿÊH‰ÃuH‰Çè€è€éðH‰ÃèöH‰ßè H5H'L‰ïÿ?'H5Ø%H‰ÇÿÏ%L‰úH‰ÇH5²%ÿ¬%H5'L‰ïÿ 'H5¥%H‰Çÿœ%H5u%H‰Çÿl%H5U%L‰ïÿL%„ÀuiL‹%© òAÉH‹=bGH5%ÿ%H‰ÃH‹=CGH5ô$ÿî$H‰ÙH‰ÇI‹$H5Í$ÿÇ$„ÀtH5ì$L‰ïÿã$„ÀtžHƒÄ[A\A]A^A_ÉÃH‹ámUH‰åH‹ÉÃUH‰åH‰]ðL‰eøHƒìH‹ÀmI‰üH‰ÓH‹<H9×t(H5b%ÿ\%H5e%H‰ßÿ\%H‹mI‰H‹$L‹d$ÉÃH‹omUH‰åH‹ÉÃUH‰åH‰]ðL‰eøHƒìH‹NmI‰üH‰ÓH‹<H9×t(H5ø$ÿò$H5û$H‰ßÿò$H‹mI‰H‹$L‹d$ÉÃH‹ýlUH‰åH‹ÉÃUH‰åH‰]ðL‰eøHƒìH‹ÜlI‰üH‰ÓH‹<H9×t(H5Ž$ÿˆ$H5‘$H‰ßÿˆ$H‹©lI‰H‹$L‹d$ÉÃH‹‹lUH‰åH‹ÉÃUH‰åH‰]ðL‰eøHƒìH‹jlI‰üH‰ÓH‹<H9×t(H5$$ÿ$H5'$H‰ßÿ$H‹7lI‰H‹$L‹d$ÉÃH‹lUH‰å¶ÉÃH‹lUH‰åˆÉÃH‹ðkUH‰å‹ÉÃH‹àkUH‰å‰ÉÃUH5Ÿ"H‰åATSH‰ûL‹%ÿ#H‰×ÿ†"H‰ÇH‹, H5e"H‹ÿ\"H‰ßH‰ÂH5Ï#AÿÔH‰ßL‹2"º[A\H5#"ÉAÿãUH5$H‰åH‰]ðL‰eøHƒìL‹%á!H‰ûÿø#H5á!H‰ÇÿØ!H‰ßM‰ãH‹$L‹d$‰ÂH5°!ÉAÿãHƒ=ĹUH‰åu+H‹=—DH5 %ÿš%H5ƒ%H‰Çÿz%H‰“¹H‹Œ¹ÉÃUH5R%H‰åL‰møI‰ÕH‰]èL‰eðHá¥Hƒì L‰ïÿ,%„ÀºuGH‹=$DH5%ÿÿ$H‰Ã1ÒL‹%Ó$H5Ü$L‰ïÿÓ$H5¼$·ÐH‰ßAÿÔ1Ò„À”ÂH‹]èL‹eð‰ÐL‹møÉÃUH5„$H‰åAWAVAUATSHƒì8H‰}¨H‰U H‹=¥Cÿ_$H5H$H‰E¸H‹} ÿ:$H…À„vºH5$H‹} ÿ $H5ô#H‰ÇA½ÿå#H5Î#H‰ÇÿÅ#H5®#H‰ÂH‹}¨I‰Çÿž#H‹} H5Ó#‰ÃÿË#HÿÈH‰E°éÌL‰ê¹H5`#H‹} HÇEÈL‰mÀÿJ#H5S#H‰ÂI‰ÄH‹}¨ÿC#A‰ÆL9ó•ÂHƒû”ÀÂtcH‹=°BH5Ñ#ÿË#L‰úH‰ÇH5î"ÿè"H‰ÃH‰ÂH‹}¸H5Ç"ÿÁ"H‰ßH5§"ÿ¡"H5Š"L‰âL‰ÿÿ~"ëL‰âH5b"L‰ÿÿY"IÿÅL‰óL;m°Ž*ÿÿÿH‹=*BL‰úH5("H‹a"ÿ"H5T"H‰ÂH‹}¸ÿÓH‹E¸HƒÄ8[A\A]A^A_ÉÃUH5à!H‰åAWAVAUATSH‰ËHƒì(H‰}°ÿÃ!H‰ÚH5¹!H‹}°H‰E¸ÿ«!H5”!H‹}¸H‰EÀÿ†!H‰ÃH5|!H‹}Àÿr!H9Ãs H‹}¸H5b!ë H‹}ÀH5U!E1ÿÿL!H‰EÈé™L‰úH5)!H‹}¸ÿ!L‰úI‰ÆH5!H‹}Àÿ!I‰ÅL‰òH5›!H‹}°ÿ‘!L‰êA‰Ä‰ÃH5‚!H‹}°ÿx!‰ÁI9Ìug…Ûu?H5¶ L‰÷ÿ­ H5¦ HcØL‰ïÿš H˜H9Ã0|aIÿÇL9}È]ÿÿÿë^ÿËuíL‰êH5` L‰÷ÿW H…ÀH‰ÂtÒéIƒü•ÂHƒù”À„Ð…åIÿÌ”ÂHÿÉ•À„Ðu…Û„ÍHÇÂÿÿÿÿéÆH59 H‹}¸ÿ/ H‰ÃH5% H‹}Àÿ 1ÒH9Ä–H5 H‹}¸ÿÿH‰ÃH5õH‹}ÀÿëH9Ãv&H‹}¸H5ËH‹UÈIÇÄÿÿÿÿ»ÿµH‰Âë%H‹UÈH5¥H‹}ÀA¼HÇÃÿÿÿÿÿŽH‰ÂH‹}°H5 ÿ L‰âÿÈHEÓëºHƒÄ(H‰Ð[A\A]A^A_ÉÃHƒ=¸´UH‰åu$H5"ÿý!H5æ!H‰ÇÿÝ!H‰Ž´H‹‡´ÉÃUH5µ!H‰åATSH‹ˆ?L‹%‘!ÿ›!H‰ßH‰ÂH5~!AÿÔH Ü Hõ H‰ÇH5S!ÿM!H‰ÃH‹=;?H5|!ÿv!H‰ÚH‰ÇH5!ÿ![L‹û H‰ÇH5ñ A\ÉAÿãUH5Ó H‰åAWAVAUATSHì¨H‰•hÿÿÿÿ³ H‹=Ì>H5• H‰E€ÿ‹ H‹=¬>H‰EˆL q L —H ƒ H—H5M 1ÀHÇ$ÿ= ÇEÌH‰EH5 HÇEÀH‹=L>ÿ H…ÀtlH‹R>I‰ÁI‰ÀL‹%ÝH‹=.>H 7 HP H5áL‹-ªHÇ$1ÀÿÊH5£H‰ÂH‰ßH‹MAÿÔH5H‰ÂH‹}ˆAÿÕHEÀH=iŸE1À1ÉH‰…XÿÿÿHEÌH‹•XÿÿÿH‰ÆH‰…Pÿÿÿè‡u…ÀÇE˜ÿÿÿÿ…¿‹EÌL㟃ø‰E˜tƒøL HêŸLDÀL‹-=L‹5H5éH‹Z=L‹%H‹=<=‹U˜L‰…HÿÿÿL‹=Óÿ½L‹…HÿÿÿH ןHðŸH5áH‰ßHÇ$M‰ÁI‰À1ÀAÿÔH5¤H‰ÂL‰ïH‹MAÿÖH5€H‰ÂH‹}ˆAÿ×H‹•XÿÿÿH‹µPÿÿÿH=’žE1À1Éèšt…ÀtNH‹•XÿÿÿH‹µPÿÿÿH=ƒžE1À1Éèwt…Àt+H‹•XÿÿÿH‹µPÿÿÿH=sžE1À1ÉèTt…ÀÆEŸ…­ƒ}ÌH‹úHKŸL‹5d<L‹%M<H5¾L‹=çL‹-H‰E¸H=ŸH‹=<”EŸ€}Ÿ¾UŸHDØÿˆI‰ÙI‰ÀH 3ŸHLŸH5½L‰çHÇ$1ÀAÿÕH5†H‰ÂL‰÷H‹MAÿ×H5bH‰ÂH‹}ˆÿU¸H‹•XÿÿÿH‹µPÿÿÿH=ÏE1À1Éè|s…À…÷ƒ}˜u€}ŸLøžHŸLDÀëAƒ}˜L€Ÿu4‹UÌLTŸƒúdt(ƒú LŸt| ƒú LŸ~ LLŸë‹UÌL‹-@;L‹5ÑH5ªH‹;L‹%ÜH‹=ý:L‰…HÿÿÿL‹=—ÿL‹…HÿÿÿH ŸH4ŸH5¥H‰ßHÇ$M‰ÁI‰À1ÀAÿÔH5hH‰ÂL‰ïH‹MAÿÖH5DH‰ÂH‹}ˆAÿ×H‹•XÿÿÿH=E1À1É1öècr…À…ÝH‹}ÀèìqH‹•XÿÿÿH=ÙœE1À1ÉH‰ÆI‰Çè4r…À…¡H‹=2:L‰úH5¨ÿ¢H5‹H‰ÃH‰ÂH‹}€ÿ{L‹%,:H…ÀI‰ÙLEÈL‹-³H‹=:I‰ØH jžHƒžH5´L‹5}HÇ$1ÀÿH5vH‰ÂL‰çH‹MAÿÕH5RH‰ÂH‹}ˆAÿÖM…ÿtL‰ÿèqH‹•XÿÿÿH‹µPÿÿÿH=œE1À1Éè_q…À…¨H‹ L‹5~9H5ïL‹%`9L‹=L‹-H‹=;9‹UÌH‰E°ÿÆH‰ÃH‹=$9‹UÌH5²ÿ¬I‰ÙI‰ÀH ÇHàH5ÑL‰çHÇ$1ÀAÿÕH5šH‰ÂL‰÷H‹MAÿ×H5vH‰ÂH‹}ˆÿU°H‹=­8H5ÿH©H‰ÇH5ÿH…ÀH‰…xÿÿÿ„¿H5ÊH‰ÇÿÁH…À„¦H‹L‹5‚81ÒL‹%i8L‹= H5ƒL‹-H‹½xÿÿÿH‰E¨ÿkH‰Ã1ÒH5_H‹½xÿÿÿÿRI‰ÙI‰ÀH -HFH5×L‰çHÇ$1ÀAÿÕH5 H‰ÂL‰÷H‹MAÿ×H5|H‰ÂH‹}ˆÿU¨H5ëH‹½hÿÿÿÿÞH…ÀtlH‹Ê7I‰ÁI‰ÀL‹%UH‹=¦7H ïœHH5YL‹-"HÇ$1ÀÿBH5H‰ÂH‰ßH‹MAÿÔH5÷H‰ÂH‹}ˆAÿÕH5VH‹½hÿÿÿÿIH…ÀtlH‹E7I‰ÁI‰ÀL‹%ÐH‹=!7H ªœHÜH5ÔL‹-HÇ$1Àÿ½H5–H‰ÂH‰ßH‹MAÿÔH5rH‰ÂH‹}ˆAÿÕHEÈ¿klcmH‰ÆH‰…`ÿÿÿèµmf…À…²H‹@ò*EÈò^S¸L‹5¤6L‹%6H5~L‹='L‹-@H‹=a6H‰E ÿ_H‰ÃH‹=M6‹UÈH5ÛÿÕI‰ÙI‰ÀH œH)œH5úL‰çHÇ$1ÀAÿÕH5ÃH‰ÂL‰÷H‹MAÿ×H5ŸH‰ÂH‹}ˆÿU H‹µ`ÿÿÿ¿mmarèélf…À…®H‹tL‹5å5H5VL‹%Ç5L‹=hL‹-H‹=¢5‹UÈH‰…pÿÿÿÿ*H‰ÃH‹=ˆ5‹UÈH5ÿI‰ÙI‰ÀH ‹›H¤›H55L‰çHÇ$1ÀAÿÕH5þH‰ÂL‰÷H‹MAÿ×H5ÚH‰ÂH‹}ˆÿ•pÿÿÿH‹EˆHĨ[A\A]A^A_ÉÃUH‹7dH5èH‰åH‹<HÊUH‹ÿÑL‹ºH‰ÇH5°ÉAÿãUH5”H‰åH‰]àL‰eèI‰ÔL‰mðL‰uøHƒì0H‹ŒH‰}ÐI‰ÎM‰ÅH}ÐH öšH‰EØÿTH…ÀH‰ÃtxH55L‰çÿ,H‹cH5H‰ßH‰H‹xcL‰,H‹McÆÿëH‹4cH5íL‰÷ˆÿáH‹JcH5³H‰ßH‰1Òÿ¤H‰ØL‹eèH‹]àL‹mðL‹uøÉÃUH5wH‰åH‰]àL‰eèH‰ÓL‰mðL‰uøI‰üHƒì I‰ÎM‰ÅH‰×ÿK„ÀtH‹˜øºH5$H‹8ÿL‰çH5ÿûH5äH‰ÇÿÛH‰ÚM‰èL‰ñH‰ÇH5¸ÿ²H‰ÇH‹@øL‹%H5ŠH‹ÿM‰ãL‹l$L‹d$H‰ßL‹t$H‹$H‰ÂH5NÉAÿãUH52H‰åH‰]àL‰eèI‰üL‰mðL‰uøHƒì H‹)bL‹-23L‹5óH‹<ÿùH‰ÃL‰çH5<ÿ6I‰ØH‰ÁL‰ïM‰óH‹$L‹d$L‹l$L‹t$HhŠH5©1ÀÉAÿãUH5;H‰åATI‰üSHìÿ%„À…ãH]H5¢L‰çÿ™HRH‰ÆH‰ßÿFH‹EH;H‰ßH‰E°H‹E˜H‰E¸H‹E H‰EÀH‹E¨H‰EÈH‹%aòEÈI‹4òEˆÿH‹EH56L‰çòEˆH‰EÐH‹E˜H‰EØH‹E H‰EàH‹E¨H‰Eèò\EèòEÈÿH‰ÇH‹E°ºH5ŸH‰$H‹E¸H‰D$H‹EÀH‰D$H‹EÈH‰D$ÿzHÄ[A\ÉÃUH‰åH‰]ðL‰eøHƒì H‹Ÿ`L%@H‰ûL‰æH‹<ÿ0H‹y`L‰æH‹<ÿH‹•ˆH‰]àH}àH5öH‰EèÿìH‹]ðL‹eøÉÃUH‹B`H5ÃL‹¼H‰åH‹<ÉAÿãUH5yH‰åH‰]èL‰eðL‰møHƒì H‹`L‹%1L‹-ÑH‹<ÿGH‰ÃH‹=í0H.ŒH5OÿIH ú‰H‰ÇH—H5!L"ŒÿH‰ÙH‰ÂL‰çM‰ëH‹]èL‹eðL‹møH5e1ÀÉAÿãUHï–H5ÀH‰åAUATI‰üSH ÿÿÿHì(ÿ¡L‰àH_H¸–H5yL‰ç€8”ÿjH53L‰çÿ*H5CH‰Çÿ:HÓH‰ÆI‰ÅH‰ßÿÄH‹… ÿÿÿH5öL‰çH‰EÀH‹…(ÿÿÿH‰EÈH‹…0ÿÿÿH‰EÐH‹…8ÿÿÿH‰EØòEØò…ÿÿÿÿ»HtH‰ÆH‰ßÿhH‹… ÿÿÿHZH‰ßH‰E H‹…(ÿÿÿH‰E¨H‹…0ÿÿÿòE¨H‰E°H‹…8ÿÿÿò…ÿÿÿH‰E¸H‹6^òE¸ò…øþÿÿI‹4ÿH‹… ÿÿÿHùH‰ßH‰E€H‹…(ÿÿÿH‰EˆH‹…0ÿÿÿH‰EH‹…8ÿÿÿH‰E˜H‹Ú]òE˜ò…ÿÿÿI‹4ÿ³H‹… ÿÿÿH¥H‰ßH‰…`ÿÿÿH‹…(ÿÿÿH‰…hÿÿÿH‹…0ÿÿÿH‰…pÿÿÿH‹…8ÿÿÿH‰…xÿÿÿH‹Š]I‹4ÿ`H‹… ÿÿÿH‰…@ÿÿÿH‹…(ÿÿÿH‰…HÿÿÿH‹…0ÿÿÿH‰…PÿÿÿH‹…8ÿÿÿH‰…XÿÿÿH‹)]A€<„ò…ÿÿÿH‹…@ÿÿÿH5PòX…ÿÿÿH‰E€H‹…PÿÿÿH‰EH‹ú\ò…èþÿÿò…hÿÿÿò\…ÿÿÿòEˆò…ÿÿÿòX…øþÿÿò…ÿÿÿò…ÿÿÿò\…ÿÿÿò…ðþÿÿI‹<H‹E€ò…ÿÿÿòE˜H‰$H‹EˆH‰D$H‹EH‰D$H‹E˜H‰D$ÿ«H‹l\ºH5ˆI‹<ÿ~H‹O\H5`HÇÁÿÿÿÿL‰ïI‹H‹+\M‹ÿAëzH‹ \1ÒH5?I‹<ÿ5H‹\H5I‹<ÿýò…ÿÿÿò\…ÿÿÿò…èþÿÿò…øþÿÿò\…ÿÿÿò…ÿÿÿò…ÿÿÿòX…ÿÿÿò…ðþÿÿL‰çH5ËÿÅò…ðþÿÿH‰ÇH‹E ¹ºòE¨H5pò…ÿÿÿòE¸H‰$H‹E¨H‰D$H‹E°H‰D$H‹E¸H‰D$ÿ>H‹EÀò…èþÿÿL‰ïH5hòEØH‰$H‹EÈH‰D$H‹EÐH‰D$H‹EØH‰D$ÿ>L‰ïºH5ßÿÙH‹êZ1ÒL‹ H5I‹<H‹¿ZA€<”ÂHÄ([A\A]ÉAÿãUH5‡H‰åL‰mðL‰uøI‰ýH‰]àL‰eèHƒì H‹žZI‰ÖH‹ÄH‹<ÿR„Àu0H‹ZH‹=ˆ+H ’H*’H5M‹D1ÀÿH‹_ZH5ð I‹|H‹ZA¾THÏKH‹ÿÎ H‹ZL‹%  L‰÷H5¦ I‹\ÿ› 1ÒHƒøH5~ •ÂH‰ßAÿÔL‰ïH5ûÿõH5N H‰ÇÿE H‹†ïH5' H‹8ÿ L‰ïL‹ H‹$L‹d$L‹l$H5ï L‹t$ÉAÿãUH5¾H‰åH‰]ØL‰eàL‰mèL‰uðI‰ÎL‰}øHƒì@H‹‰*I‰ýI‰×L‹%|ÿ†H5oH‰ÂH‰ßAÿÔL‰òH‰ÇH ‘H5Bÿ<H…ÀH‰Âu[H5L‰ÿÿH‘H‰ÇH5óÿíH‹=*H‰ÂH5ÌÿÆL‰òH‰ÇH ±H5âÿÜH‰ÂH‹ú€L‰mÀH}ÀL‰éH5€H‰EÈÿvH‹]ØL‹eàL‹mèL‹uðL‹}øÉÃUH5ÈH‰åSH]HƒìhH‹=Ý)ÿ¯H‰ÞH‰Çè`„Àt&HUîHuïH‰ßè/`f…Àu€}ït €}î¸u1ÀHƒÄh[ÉÃUH5YH‰åAWI‰ÏAVAUATSHƒìHH‹EL‰E DˆMŸH‰U¨H‰}°H‰ÏH‰Eÿ%H5H‰ÇÿH5îL‰ÿH‰E¸ÿáH‰ÃL‹%·H5ðL‰ÿÿçH5°H‰Çÿ§H5H‰ÂH‰ßAÿÔH‹=ð(H5iH‰EÀÿ_H‹U¨H5DH‰Çÿ;H‰EÈéWL‰êH5H‹}¨ÿþH5gL‰ïI‰Æÿ[H‹U¸H‰ÇH5ÍÿÇ„À…:H58L‰ïÿ/H‹UÀH‰ÇH5¡ÿ›„À…H5ìL‰ïÿãHôŽH‰ÇH5rÿl„Àu+H5ÁL‰ïÿ¸HéŽH‰ÇH5GÿA„ÀtSH5¶L‰ïÿ­H5H‰Çÿ H‰ÃL‹%H5ü H‹}¸ÿò H5û H‰ÂH‰ßAÿÔ„À…^H‹=›'L‰òH5¹ ÿ³ H…ÀtRH5— H‰ÇÿŽ H‰ÃL‹%´ H5m L‰ÿÿd H5m H‰Çÿd H5 H‰ÂH‰ßAÿÔ„À…÷L‰òH5" H‹}°ÿ „À…¤H5¹ L‰ïÿ° H‰ÃL‹%F H5Ï L‰ÿÿÆ H5 H‰Çÿ† H5 H‰ÂH‰ßAÿÔ„ÀuVH5k L‰ïÿb HsH‰ÇH5ñ ÿë „Àu+H5@ L‰ïÿ7 HhH‰ÇH5Æ ÿÀ „ÀtH5U H‹}ÈÿK H5Ä H‹}Èÿº H…ÀI‰Å…Œýÿÿë¸ë1ÀM…ö…‰H‹3êL‹-Ü HH‹&L‹%× H5à H‹=ñ%H‹ÿÐ HùEI‰ÀHFH‰ßH5¥ Hc H‹AÿÔL‹M H‹}°HƒÄH[A\M‰ëL‰ùI‰ÀA]A^A_1ÒH5e ÉAÿã„Àt H‹=†%ëH‹=u%H56 ÿ0 H‰ÇH‹ED¾MŸL‹E L‰òL‰ùH5 H‰EL‹ø HƒÄH[A\A]A^A_ÉAÿãUH5Ï H‰åH‰]ØL‰eàL‰mèL‰uðL‰}øHƒì0I‰×H‹=ú$ÿ¤ H5 H‰Çÿ„ H5m H‰Çÿd HŒH‰ÃH‰ÇH5@ ÿ: L‹%«$L‹5 L‰ÿL‹- H5› ÿ• L‰çH‰ÂH5ø AÿÕH‰ßH5Û H‰ÂAÿÖH‰ßL‹» H‹]ØL‹eàL‹mèH5¨ L‹uðL‹}øÉAÿãUH‰åH‰]èL‰eðL‰ËL‰møHƒì þÊI‰ÌM‰ÅuOH‰ÊH5a ÿ[ H‹zH5= H‰ßÿ4 „ÀtfL‰âH‰ßL‹ H‹]èL‹eðH5 L‹møÉAÿãH‹ÝyH5þL‰Ïÿõ„Àt'L‰éL‰âH‰ßL‹ÁH‹]èH5¶L‹eðL‹møÉAÿãH‹]èL‹eðL‹møÉÃUH5¤ H‰åH‰]ØL‰eàM‰ÌL‰mèL‰uðI‰ÖL‰}øHƒìPI‰ÏL‰E°H‰}¸L‹-Q H‹=²#ÿd H%|H‰ÇH5C ÿ= H‰ÃH5S L‰ÿÿJ H‰ÙH‰ÂH5 L‰çAÿÕHÿÈ…ÆL‹%W#L‹-à L‰òH‹=N#H5ÿ ÿù Hº{H‰ÇH5Ø ÿÒ H‰ÃH5è L‰ÿÿß I‰ØH‰ÁL‰çH‡ŠH5ˆ 1ÀAÿÕH‹¼æH‹Ý"H5^ L‹%G H‹=À"H‹ H‰ÂÿD H}BI‰ÀH«BH5 H‰ßHc H‹AÿÔH‰EÈ1Àë.H5ñ L‰ÿH‹× ÿá LEÈH‰ÁL‰òH5À H‹}¸ÿÓL‹M°L‹EÈL‰ùH‹}¸¾ÐH5‘ ÿ‹ H‹]ØL‹eàL‹mèL‹uðL‹}øÉÃUH5] H‰åH‰]ØL‰eàI‰ÔL‰mèL‰uðH L‰}øHƒìPH‰}¸H‹=å!ÿ' H5 H‰Çÿ H‰EÈH‹ÜH‰ÞL‰çH‹_XH‰EÀÿÕH‰ÞI‰ÇL‰çH‹MXÿ¿H‰ÞI‰ÆL‰çH‹?Xÿ©I‰ÅH‰ÞL‰çH‹1Xÿ“H‹}¸M‰ùM‰ðL‰éH5oH‰ÂÿUÀH‹}ÈL‹NH5GH‹]ØL‹eàL‹mèL‹uðL‹}øÉAÿãUH‰ÎH‰åATI‰üSD‰ËHƒì0H‹=!H‹ ÅWHÇD$ H‹WH‰D$H‹EH‰D$H‹WL‰$I‰ðH5ÊH‰D$1ÀL‹ |Wÿ¶„ÛtL‹›HƒÄ0L‰ç[A\H‰ÂH5‡ÉAÿãH‹=Œ H‹UvL‰áL‹[HƒÄ0I‰À[A\H5JÉAÿãUH‰åL‰}øH‰]ØI‰×L‰eàL‰mèL‰uðHƒì`H‹äH‰}ÈH‰MÀL‰E¸òèôVf.[¡…§Š¡H‹=h H5™ÿ“HćH‰ÇH5rÿlI‰ÆH‹=2 H5KÿEL‰òH‰ÇH5(ÿ"„ÀA‰Å„H‹øL‹%é1ÉL‰úH‹=ÝH5æ1ÀÿÞH5ÇH‰ÁL‰òH‰ßAÿÔé“H‹=¿H5ØÿÒHC‡H‰ÇH5±ÿ«„ÀA‰Å„¨H‹=yH Z‡Hs‡H5tHÇD$L‰<$L ؆L‡1ÀÿQH‹=BH‰ÁH؆H5)ÿ#H‰ÇH5 ÿ1ÀA¾ÕL‹M¸H‹MÀH‹}ÈL‹ºI‰ÀH‹]ØL‹eàH5¨L‹mèL‹uðL‹}øÉAÿãH‹âH‹ÂHë†L‹%ŒH‹=¥H5ŽH‹ÿ…HJ>I‰ÀHl>H5]H‰ßHc H‹AÿÔékÿÿÿUH5Ä H‰åAWI‰ÏAVAUATSHƒìXH‹êtH‰}ˆH‰U€H‰}ÀH}ÀH‰EÈÿ H5y L‰ÿÿp „À„H‹ñ L‹%ºL‰ÿL‹- H5 H‰EH‹®H‰E˜H‹Ó H‰E H‹H‰E¨H‹Í H‰E°H‹‚áL‹0ÿÙ H‰ÃH‹=WH`xH5á ÿÛ LlxH‰ÇH "vHÛ…H5¬ ÿ¦ H‰ÙH‰ÂL‰çH5v 1ÀAÿÕL‰ñH‹}¨H‰ÂH5P ÿU°H=I‰ÀH$=H‹}˜H5! Hc H‹ÿU H‹}ˆH5ý H‰ÂÿUéPH‹=«H5Ô ÿÎ H5· H‰Çÿ® I‰ÅH‰ÇèàRH5Œ L‰ïÿƒ H‹UˆH5h L‰ïÿ_ H‹È L‹5aHbwH‹=KH5Ü H‰E¸ÿÒ HuH‰ÇH5 ÿû H5 I‰ÄL‰ÿÿø H‰ÃH5~ L‰ÿÿu M‰áI‰ØH‰ÁH½„H5N L‰÷1ÀÿU¸¹ºH‰ÇH5’ ÿŒ H‹ÅH‰ÇL‹%[ H5d ÿ^ ¹H‰ÂH5? H‰ßAÿÔH5" H‰ÂL‰ïÿ H‹U€H5û L‰ïÿò HƒÄX[A\A]A^A_ÉÃUH5Ë H‰åATL%`SH‰ûI‹$H‹<ÿ­ H‹.qH‰ÇH5Œ ÿ† „Àt2I‹$H5‡ H‹<ÿ} H‰ÇI‹$H5O H‹ÿE H…Àu[H‹=ÐL‹! H5 A\ÉAÿã[A\ÉÃUH5÷H‰åH‰]àH‰ÓL‰eèL‰mðL‰uøI‰üHƒì ÿÔL‹5I‰ÅH‰ßH5 ÿšH‰ÃH¸_H5™H‹I‹<ÿŒH‰ÙL‰ïH‰ÂH5\AÿÖH‹$L‹d$HÿÀL‹l$L‹t$”ÀÉÃUH5&H‰åH‰]àL‰uøH‰ûL‰eèL‰mðI‰ÖHƒì H‰×ÿH…ÀtxH5ôL‰÷ÿëHÜrH‰ÇH5ÊÿÄ„ÀuMH _H5¢H‹H‹<ÿ•H‰ÃL‹%{H5¤L‰÷ÿ›H5dH‰ÂH‰ßAÿÔ„À„¡H5<L‰÷ÿ3H…À„ŒH5#L‰÷ÿHKrH‰ÇH59ÿ3„ÀuaH‹=0H5ÿ{L‹-4I‰ÄH‹= H5Ãÿ½H‰ÃH5ÃL‰÷ÿºH‰ÙH‰ÂH5ýL‰çAÿÕHÿÈu1Àë¸H‹$L‹d$L‹l$L‹t$ÉÃUH5\H‰åH‰]àL‰mðH‰ûL‰uøL‰eèHƒì Hã]I‰ÖH‹H‹<H:9H‹ÿ!I‰Å1ÀM…ítDH‰ßH5­ÿ§H‰ÃL‹%mH5vL‰÷ÿmL‰éH‰ÂH5PH‰ßAÿÔHƒø•ÀH‹$L‹d$L‹l$L‹t$ÉÃUH5¦H‰åH‰]ðL‰eøH‰ÓHƒìI‰üÿ‹„Àt3H‰ÚH5mL‰çÿd„ÀtH‰ÚH5FL‰çÿ=„Àºt1ÒH‹$L‹d$‰ÐÉÃUH5-H‰åAVI‰ÖAUATI‰üSHÖ\H‹H‹<ÿ H‹’mH‰ÇH5èÿâ„Àt.H‹H5äI‹<ÿÚH‰ÇH‹L‰ñH5ªI‹ÿ H‹H5¶I‹<ÿ¬H‹=mH‰ÇH5‹ÿ…„Àt3H‹H5‡I‹<ÿ}H‰ÇH‹H5@L‰òI‹ ÿ3H‰ÃëRH5L‰÷ÿH5÷H‰ÇÿîI‰ÅH5ÔL‰ïÿËH…ÀH‰ÃtH‰ÂH5)L‰çÿ „ÀtÑH5•H‰ßÿŒH‹ýNL‰÷I‰èÀLH‹êNI‹H…Òt0H5BL‰çÿ9„ÀtL‹H5L‰ç[A\A]A^ÉAÿãL‹"H5L‰çëâUH‰åH‰]ðL‰eøH‰ûHƒìH‰×I‰ÌèOLL‰âH‰ßL‹+H‹$L‹d$H5ÉAÿãUH5OH‰åATL%[SH‰ûI‹$H‹<ÿ1H‹ÊkH‰ÇH5ÿ „Àt8I‹$H5 H‹<ÿH‰ÇH‹ÿMH5@H‹ I‹$H‹ÿ.H‰ßL‹H5 [A\ÉAÿãUH5¾H‰åH‰]ØL‰}øI‰ÿL‰eàL‰mèL‰uðHƒì`HYZH‹H‹<ÿŒH‹-kH‰ÇH5kÿe„Àt+H‹H5gI‹<ÿ]H‰ÇH‹H5€I‹ÿvH‹ÿL‹%ÈH51H‰E¨H‹ÆH‰E°H‹ëH‰E¸H‹¨H‰EÀH‹åH‰EÈH‹šØL‹-ãL‹0H±YH‹I‹<ÿÜH‰ÃH‹=ZHcoH5äÿÞLooH‰ÇH %mH}H5¯ÿ©H‰ÙH‰ÂL‰çH5y1ÀAÿÕL‰ñH‹}ÀH‰ÂH5SÿUÈH)4I‰ÀH'4H‹}°H5$Hc H‹ÿU¸L‰ÿL‹]¨H‹]ØL‹eàL‹mèH‰ÂL‹uðL‹}øH5æÉAÿãUH5ÊH‰åH‰]ØL‰eàH‰ûL‰mèL‰uðL‰}øHƒì0H‹=]ÿŸL‹%HI‰ÆH‹æKL‹=×ÿL‹-àÿH5éÿH‹<ÿßÿL‰çH‰ÂH5ÂÿAÿÕH‰ÙH‰ÂL‰÷H5ŸÿAÿ×H‹•KL‹eàL‹mèL‹uðL‹}øH‰H‹]ØÉÃUH5cÿH‰åAWAVAUATSHƒì8H‰}°H‰M¨H‰ÏÿBÿHã{H‰ÇH5±ÿ«„ÀtH5ÿH‹}¨ÿÿH‰E¨HãWH‹U°H5ÀL‹5ùL‹-’H‹H‹<ÿ¥H‹M°I‰ÄH‹H5äH‹<ÿÚM‰àH‰ÁH…{H5¶L‰ï1ÀAÿÖH‰EÈA¾èòHH‹UÈH5tþH‰ÇÿkþI‰ÇëMEnèÐHH‰ÃE‰ðL‹%PþH‹= H‹MÈHF{H5W1ÀE‰îÿLH5%þH‰ÂH‰ßAÿÔI‰ÇH‹=šH5ûýÿõýL‰úH‰ÇH5ØýÿÒý„Àt Aþè…{ÿÿÿH‹=bH5Ãýÿ½ý1ÉH‰ÇL‰úH5Žýÿˆý„À…¹H‹ÙIH‹U°H5^ýH‹<ÿTýH‹ }L‹%NH§zL‹5HH‹=1H5ŠH‰M¸H‹_L‰ùH‰EÀH‹!ÕL‹-ZH‹1Àÿ_H5HH‰ÂL‰çH‰ÙAÿÕH 1I‰ÀH1H5L‰÷Hc H‹ÿUÀH5ñÿH‰ÂH‹}°ÿU¸H‹U¨L‰ÿH5éüÿãüH5œýH‰Çÿ“ýH‹M°H‹ðHH5qüH‰H‹æHL‹_üH‹<H‹ÌHH‹HƒÄ8¹[A\A]A^A_ÉAÿãUH5"üH‰åAVI‰þH‰×AUATSÿ üH5õûH‰ÇÿìûH5ÕûH‰ÇH‰ÃÿÉûHŠyH‰ÇH5ØýÿÒý„À„ˆL% UH5œûI‹$I‹<ÿŽûHOyH‰ÇH5ýÿ—ý„ÀtQH5\ûH‰ßÿSû„Àt=I‹$H5DûI‹<ÿ:û„Àt$H·TH5ûH‹I‹<ÿ ûH…À„ßH“TL‹%H5íúL‹-ÆúH‹I‹<ÿÙúH‰ÃH‹§GH5¸úI‹<ÿ®úH‰ÁH‹|GI‰ØH5ŠúL‰çI‹AÿÕ„ÀuyH‹ÓL‹-þHxH‹ðL‹%þH5"þH‹=ÓH‹ÿþH×.I‰ÀHé.H‰ßH5çýHc H‹AÿÔ[A\M‰ëL‰÷H‰ÂA]A^H5·ýÉAÿã[A\A]L‰÷L‹äùH5ÝùA^ÉAÿãUH‰åAWAVAUATSHƒìHH‹·FH‰}°H‰M¨Hƒ<„£H‹=íH5ŽùÿˆùH‹ÑH‹U°I‰ÅH‹{FL‹%<ùH5EùL‹5ùH‹<ÿ4ùH‰ßH‰ÂH5ùAÿÔH‹U°H‰ÃH‹>FH5ùH‹<ÿùH‰ÁH‹ÓÑHÇ$I‰ÙL‘fH5ÂøL‰ïH‹AÿÖH‹ÂüH‹›H5”øL‹5…H‹}¨H‰UÀH‰E¸H‹ªüH‰EÈH‹ÑL‹=XøL‹(ÿ_øI‰ÄH‹UÑH‹=6H?hH5ÀüH‹ÿ·üLHhH‰ÇH þeH×vH5ˆüÿ‚üM‰éM‰àH‰ÙH‰ÂL‰÷HÇ$H5ä÷1ÀAÿ×Hà,I‰ÀH-H‹}ÀH5üHc H‹ÿUÈH‹}°L‹]¸HƒÄH[A\A]A^A_H‰ÂH5ËûÉAÿãUH‰ÏHtvH5u÷H‰åHƒì ÿh÷H‰EðH¸ÿÿÿÿÿÿÿH9EðÉ”ÀÃUH59÷H‰åATI‰üSH‹±DH‹=ê I‹ÿ÷H…ÀH‰Ãu3H‹‘DH=*vI‹41Àè¾B[L‰çL‹Üö1ÒA\H5ÑöÉAÿãH‰ÇèBBH‰ßL‰âH5ØúÿÒúH‰ßL‹˜öH5‘ö[A\ÉAÿãUH‰åSH‰ûHƒìH…ÒtH‰×èøAL‹ZöH‰ßHƒÄH5Lö[ÉAÿãUH‰åH‰]ØL‰eàL‰mèL‰uðL‰}øHƒì@H…ÒH‰}ÀtH‰×è±AH‹“úL‹%d H]fL‹5^ H‹=? H5ÐúH‰EÈH‹EÏL‹=núL‹-wúH‹ÿ®úL?fH‰ÇH õcH.uH5úÿyúH‰ÙL‰çH‰ÂH59úAÿÕHÿ*I‰ÀH +L‰÷H5 úHc H‹Aÿ×H‹}ÀL‹]ÈH‰ÂH‹]ØL‹eàH5ØùL‹mèL‹uðL‹}øÉAÿãU1ÀH‰åÉÃUH5øøH‰åAWI‰ÿAVAUATSHƒì(HžOH‹H‹<ÿÑøH‹z`H‰ÇH5°øÿªø„Àt6H‹H5¬øI‹<ÿ¢øH‰ÇH‹ BH5ÁôI‹ H‹I‹ÿ°ôH‹ L‹%‚ôH5‹ôL‰ÿÿ‚ôH‰ßH‰ÂH5eôAÿÔH ÃbHtH‰ÇH5:ôÿ4ôI‰Åèo@H‰ÃL‹%òõH5ëôL‰ïÿâôH‰ßH‰ÂH5ÕõAÿÔH‰ÃH‹=P H5±õÿ«õ1ÉH‰ÚH‰ÇH5ÌóÿÆóH‹=' H5ˆõÿ‚õE1ÀH‰ÇH‰ÙL‰êH5óÿ‰ó„ÀtH5.öH‰ßÿ%öH‹~AI‰H‹CóL‹5¬ L‰ÿH52÷H‰EÈÿ(÷L‰ÿI‰ÅH5+óÿ%óA‰ÄHNH5$ôH‹I‹H‹.AI‹<ÿ ôL‰,$E¾ÌM‰øH‰ÙL‰÷H‰ÂH5ÑòÿUÈHƒÄ([A\A]A^A_ÉÃHÀMUH‰åH‹H9uL‹”òH5òÉAÿãÉÃUH‰åAWAVAUATSHƒìh€=ï|H‰}ˆ…L-nMH5§öI‹EH‹<ÿ™öH‹J^H‰ÇH5xöÿrö„À„ÖH‹›L‹%üñH5…òH‹}ˆÿ{òH‹^H‰ÇH5êñÿäñH5ÍôH‰ÇÿÄôH‰ßH‰ÂH5·ñAÿÔH‰ÃH‰ÇH‹×]H5ñÿŠñH‹UˆH5oñH‰ßÿfñH‹MˆI‹EH5çõÆ|H‹<ÿÖõH‹uˆH‰ÇH‹Ð?I‰ØH‹ I‹EH‹H5ñÿ ñ„À…½H5íðH‹}ˆÿãðH‹=¬H5Åðÿ¿ðH‰ÇHÍ'H‹MˆH5šðH‹ÿ‘ðHLH‹UˆH5OõH‹H‹<ÿBõH‹]H‰ÇH5!õÿõ„Àt3H‹H‹MˆH5õH‹<ÿõH‹uˆH‰ÇH‹H‹H5ðÿðH‹Ý>H‹EˆHƒ<tBH‹=3H5”òÿŽòH‹MˆH‰ÇH‹°>H5iòH‹ÿ_ò„À…dH‹>H‹YõH‹52H‹ #H‹=H‰u˜H‰]H‹EõH‹uˆH‰M¨H‰E H‹"ÊH‹ëðH‹H‰]°H‰E¸1ÀH‹ H;pH5,õÿ&õI‰ÇH‹ÌÉH‹UˆL‹%±L‹- õH5õL‹0HÑJH‹H‹<ÿüôH‰ÃH‹=zHƒ`H5õÿþôL`H‰ÇH E^HÞoH5ÏôÿÉôH‰ÙH‰ÂH5œôL‰ç1ÀAÿÕHÇ$H‰ÂL‹M¸M‰øL‰ñH5ðH‹}¨1ÀÿU°H%I‰ÀH6%H57ôH‹}˜Hc H‹ÿU H‹}ˆL‹]H5 ôH‰ÂéKHJH‹MˆH5AîH‹H‹<ÿ4îH‹uˆH‰EÈH‹H‹<H5óÿóH‹ÑZH‰ÇH5çòÿáò„Àt7H‹UˆH‹H5ßòH‹<ÿÕòH‹MˆH‰ÇH‹H5ÄíH‹ÿºíH‰EÈH‹oíL‹-èH5‘íL‹=²H‹=£H‰]ÀH‹L‹5QíL‹%jóÿdíH5MíH‰ÇÿDíH•n‰ÁH5DóH‰ß1ÀAÿÔE1ÀH‰ÁH‹UÈH5 íL‰ï1ÀAÿÖH‹uˆH‰ÁH‹<L‰ÿH‹H5×ìÿUÀH‹ÈH‹UˆH5²ìL‹«ìH‹8HƒÄh[A\A]A^A_ÉAÿãHƒÄh[A\A]A^A_ÉÃUH5ïH‰åH‰]èL‰eðH‰ûL‰møHƒì H‹= ÿmïL‹-–íI‰ÄH‹”;H5uîH‹<ÿkîL‰çM‰ëH‹]èL‹eðL‹mø1ÉH‰ÂH5]íÉAÿãUH‰åH‰]ØL‰}øH‰ËL‰eàL‰mèI‰ÿL‰uðHƒì`HHH‹H9…<H‹=„H5åîÿßîH‰ÇH‹;1ÉH5üìI‹ÿòìH‹»ñL‹5ŒH‰ßH5ŠíH‰E°H‹H‰E¸H‹¤ñH‰EÀH‹YíH‰EÈH‹~ÆL‹(ÿUíI‰ÄH‹KÆH‹=,H5]H5¶ñH‹ÿ­ñL>]H‰ÇH ôZHÍlH5~ñÿxñM‰éM‰àH‰ÙH‰ÂL‰÷HÇ$H5Úì1ÀÿUÈHÒ!I‰ÀHü!H‹}¸H5ùðHc H‹ÿUÀL‰ÿL‹]°H‹]ØL‹eàL‹mèH‰ÂL‹uðL‹}øH5»ðÉAÿãH‹]ØL‹eàL‹mèL‹uðL‹}øÉÃUH5ëH‰åSH‰ûHƒìH‹=çÿëH‰ÚH‰ÇH5TêÿNêH‹'XH‰]àH}àH5(êH‰EèÿêHƒÄ[ÉÃUH5ÿéH‰åATI‰üH‰×SH‰ÓÿêéH#!HcH9Ðt!H5ôëH‰ßÿëëH=¼kH‰Æ1Àèq7H5£éH‰ßÿšéH…Àt!H5ŽéH‰ßÿ…éH=¦kH‰Æ1Àè;7H‹ý8I‹<H…ÿt H5}ìÿwì[L‰çL‹<éH55éA\ÉAÿãUH‰åATI‰üSHNïHƒìH‹»8H‰ÞH‹<ÿ6ïH‹Ÿ8H‰ÞI‹<ÿ"ïH‹ƒ8H‰ÞI‹<ÿïH‹g8H‰ÞI‹<ÿúîH‹ãVL‰eàH}àH5¤èH‰EèÿšèHƒÄ[A\ÉÃUH5 óH‰åAVAUATSH‰ûH‹=ýÿïòL-àDH‰ÇL58H5ÇòI‹EH‹ I‹H‹ÿ²òH‹{<H5”òH‰H‹i<H‰ÚH‹<ÿ|òL%…DH5^òI‹$H‹<ÿPòH‹IUH‰ÇH5/òÿ)ò„Àt4I‹$H5*òH‹<ÿ òH‰ÇI‹H5óñH‹ I‹$H‹ÿáñI‹EH5ÆñH‹<ÿ¼ñ„ÀtFH‹Ñ;H5šñH‹<ÿñ1ÒH‰ÇH5tñÿnñH‹úH5KñH‹8ÿBñL‹%óÂH5$ñI‹<$ÿñ„Àt7H‹o;H58ñH‹<ÿ.ñH‰ÚL‹äðH‰Ç[A\A]A^H5ÓðÉAÿãH‹=xÿH5±ðÿ«ðH‰ÚH‰ÇH‹–Â[M‹ $H‹ ZTH5{ðA\A]L‹L‹mðA^ÉAÿãUH5ÿðH‰åAWI‰ÿAVAUATSHƒì8HCH‹H‹<ÿØðH‹ÙSH‰ÇH5·ðÿ±ð„Àt+H‹H5³ðI‹<ÿ©ðH‰ÇH‹H5ìïI‹ÿâïH‹³þH¬BH5ïH‰EÀH‹rïH‰EÈH‹I‹<ÿqïI‰ÆH‹H5tïI‹<ÿjïH‹=cþI‰ÅH1XH5rïÿlïL=XH öUH‰ÇH,hH5=ïÿ7ïH‹= þI‰ÄHîWH5/ïÿ)ïLúWH ³UH‰ÇH hH5úîÿôîH‰ÃH‹=ÚýH«WH5ìîÿæîL·WH‰ÇH mUHægH5·îÿ±îL‰t$L‰l$H‰ÙL‰$$H‰ÂH‹}ÀE1ÉE1ÀH5\î1ÀÿUÈL‰ÿH5=îH‰Âÿ4îL‹îHƒÄ8L‰ÿ[A\A]A^A_H5îÉAÿãUH5ÚîH‰åSH‰ûHƒìH‹ø8H‹<ÿ¾îH‰ÚH‰ÇH5qîÿkîH‹=ýH5MîÿGîH‰ÇH‹%ÀL‹–íH‰ÚH 4gH5…íL‹HƒÄ[ÉAÿãUH5aíH‰åH‰]àL‰eèA‰ÌL‰mðL‰uøHƒì H‹p8I‰þH‹<ÿ3íH‹\8L-@1ÒHìH5íIÇI‹EH‹ I‹<ÿììAƒü„rAƒü…¬é?H‹=2üH5Cîÿ=îH‰ÇI‹EH5ŸìI‹ÿ•ìH‹æ7H5'íI‰H‹Ô7HÍUL‹%^ìH‹=çûI‹ÿýìLÎUH‰ÇH „SH=fH5ÎìÿÈìfWÀ1ÉH‰ÂH‰ßH5ìAÿÔH‹s7H‹´PHeUL‹-æëH‹=ûH5˜ìM‹$ÿŽìL_UH‰ÇH SHîeH5_ìÿYìE1ÉH‰ÂI‰ØL‰ñH5–ëL‰çAÿÕH‹7H5rëL‰òI‹<ÿeëL‹NëH5GëL‰÷ëQI‹EH‹H5$ëL‹-}ëM‹$H*2H‹I‹<ÿëH‰ÙH‰ÂH5XëL‰çAÿÕL‹{ëH5tëL‰÷H‹$L‹d$L‹l$L‹t$ÉAÿãH‹$L‹d$L‹l$L‹t$ÉÃUH5êH‰åH‰]ðL‰eøHƒìH‹?6L‹%pêH‹H‰ÏÿsêòH*ÀM‰ãH‰ßL‹d$H‹$H5HêÉAÿãUH‰åATSHƒìòEèf.LzsZzXH‹úL‹% êHÛSH‹=üùH5ëÿëH  QH‰ÇLÖSHdH5àêÿÚêòEèH‰ÁëwòEèf.ëyƒˆŠ‚H‹= ùHqSH5²êH‹{ùL‹%„éÿžêH /QH‰ÇLeSH^dH5oêÿiêòEèH‰ÁòY‰yHdHƒÄH‰ßM‰ã[A\H5.é¸ÉAÿãòMèf. `ystzrH‹= ùHÞRH5êH‹èøL‹%ñèÿ êH œPHõcH‰ÇLËRH5ÜéÿÖéòþxHïcòMèH‰ÁòYÈòYÁé`ÿÿÿH‹=›øHlRH5­éH‹vøL‹%èÿ™éH *PHÃcH‰ÇLYRH5jéÿdéòŒxH½còMèH‰ÁòYÈòMèòYÈòYÁéåþÿÿUH5èH‰åH‰]ØL‰}øH‰ËL‰eàL‰mèI‰ÿL‰uðHƒìPH‹Ï3L‹-ÐçL‹$L‰çÿÓçH…ÛòH*ËyH‰ØƒãHÑèH ØòH*ÈòXÉòXÁH5™çL‰çAÿÕH‹„3H5uçI‹<ÿkçf.cw†êH‹^3L‹5o÷H5HçM‹,H‹çH‰EÈH‹bçL‰ïH‰EÀH‹çÿçH5çL‰ÿÿÓI‰ÄH‹3H‹ñæH5çI‹<ÿçH5ÙæL‰ÿÿÓH‰ÃH‹= ÷HÛPH5èÿèLçPH‰ÇH NHvbH5ççÿáçH5ÊæH‰ÂL‰÷M‰àH‰Ù1ÀÿUÀL‹]ÈH5^æH‰ÂL‰ïé°H‹t2L‹-…öH5~æM‹$H‹3æL‰çH‰E¸H‹5æL‹5næÿXæH5!æL‰ÿÿÓH‰ÃH‹=RöH#PH5dçÿ^çL/PH‰ÇH åMHÞaH5/çÿ)çH5æH‰ÂL‰ïH‰Ù1ÀAÿÖL‹]¸H5©åH‰ÂL‰çH‹]ØL‹eàL‹mèL‹uðL‹}øÉAÿãUH‰åSH‰ûHƒìH-H‹H‹<H…ÿt H5UåÿOåL‹hæH‰ßHƒÄH5Zæ[ÉAÿãUHeOH5¦æH‰åH‰]èL‰møH‰ûL‰eðHƒì0H‹A1L‹-ÒåL‹$H‹=WõÿqæLBOH‰ÇH øLHaH5Bæÿ<æ1ÉfWÀH‰ÂL‰çH5‰åAÿÕH‹ç01ÒH5–äH‹<ÿŒäH‹½JH‰]ÐH}ÐH5fäH‰EØÿ\äH‹]èL‹eðL‹møÉÃUH5–äH‰åL‰mðL‰uøI‰ýH‰]àL‰eèHƒì H‹}0I‰ÎH‹<ÿhäf.`t…zH‹Y0H‹=bôH5ããL‹%|äI‹\ÿÑãH‰ÇH+1ÉH5®ãH‹I‹Tÿ ãH‰ÇH‹†·H5ãH‹ÿvãH5_ãH‰ÇÿVãH5äH‰ßAÿÔH‹Ú/L‹%ÛãH5äãI‹\H‰ßÿÖãòI*ÎH‰ßM‰ãH‹$L‹d$L‹l$L‹t$H5¡ãÉòXÁAÿãUH‰MH5ÊäH‰åH‰]ØL‰uðH‰ûL‰}øL‰eàL=…ML‰mèHƒì0H‹V/L‹-çãL‹$H‹=lóÿ†äM‰øH‰ÇH KHJ_H5[äÿUä1ÉH‰ÂL‰çòýrH5žãAÿÕH‹ü.òärH5õâH‹<ÿëâH‹Ü.ºH5ˆâH‹<ÿ~âH‹¿.L‹%HH±LL‹52ãH‹=ËòH5äãL‹,ÿÚãM‰øH‰ÇH eJH¾^H5¯ãÿ©ãL‰ïH‰ÂM‰àH‰ÙH5æâA¹AÿÖH‹®µL‹Ÿáº H‹]ØL‹eàH5‹áL‹mèL‹uðH‹8L‹}øÉAÿãUH5`áL‹YáH‰åÉAÿãUHLH5CãH‰åH‰]èL‰møH‰ûL‰eðHƒì0H‹Þ-L‹-oâL‹$H‹=ôñÿãLßKH‰ÇH •IH^H5ßâÿÙâ1ÉfWÀH‰ÂL‰çH5&âAÿÕH‹„-1ÒH53áH‹<ÿ)áH‹ZGH‰]ÐH}ÐH5“àH‰EØÿ‰àH‹]èL‹eðL‹møÉÃUH5càH‰åH‰]ØL‰eàHIKL‰mèL‰uðL-KL‰}øHƒÄ€H‰U˜H‹7ñH‹âL5AâL%ÒHH‰} H‹}˜H‰U°H‰E¨ÿàL‰êL‰öH‰E¸H‹=óðÿ âI‰ØL‰áH‰ÇH5]H5æáÿàáL‰êI‰ÇL‰öH‹=ÀðÿÚáI‰ØL‰áH‰ÇH"]H5³áÿ­áH‹U¸L‰ùE1ÉE1ÀH‹}¨H5eáH‰$H‰Â1ÀÿU°H‹} H‰ÂH5;áÿ5áH‹E H}ÀH‹U˜H5BßH‰EÀH‹FH‰EÈÿ-ßH‹]ØL‹eàL‹mèL‹uðL‹}øÉÃUH‰åSH‰ûHƒìH‹ì+H‹<H…ÿt%H5äÞÿÞÞH‹Ï+H5ÀÞH‹<ÿ¶ÞH‹§EH‰]àH}àH5ÞH‰Eèÿ†ÞHƒÄ[ÉÃUH5gáH‰åL‰eèL‰mðI‰üL‰uøH‰]àHƒì L5ž3I‰ÕI‹H‹<ÿ6á„ÀtH‹³²ºH5ïàH‹8ÿæàI‹H‹üÝH5ÞI‹<ÿûÝL‰ïH5áÝH‰ÂÿÓL‰ïL‹ÂÝH‹$L‹d$L‹l$H5­ÝL‹t$ÉAÿãUH5 âH‰åATSH‰ûH‹=$ïÿöáH‰ÇHô2I‰ØH5ÒáH‹H‹ H&H‹H‹ÿ·áH‹ð-L‹%ñ±H5’áH‰I‹<$ÿ„á„Àt3H‹É-H5báH‹<ÿXáH‰ÚL‹>áH‰Ç[A\H51áÉAÿãH‹=†îH5áÿ áH‰ÇH‹—±H‰Ú[M‹ $H‹ XCH5ÙàL‹L‹ÏàA\ÉAÿãUH5ñàH‰åSH‰ûHƒìH‹?-H‹<ÿÕàH‰ÚH‰ÇH5¸àÿ²àH‹= îH5”àÿŽàH‰ÇH‹ ±L‹]àH‰ÚH XH5LàL‹HƒÄ[ÉAÿãUH‰åL‰uøH‰]àI‰þL‰eèL‰mðHƒì ƒùt r ƒù…èëqL‹üßH5õßé¼H‹©,H5àÆH‹=wíÿàH‰ÇH‹Ÿ°H‹ pBL‰òL‹ÖßH‹$L‹d$L‹l$E1ÉL‹L‹t$H5¶ßÉAÿãH1L‹-dßH5mßH‹L‹$H_ H‹H-$H‹H‹<ÿHßH51ßL‰çH‰ÙH‰ÂAÿÕL‹ßH5ßL‰÷H‹$L‹d$L‹l$L‹t$ÉAÿãH‹$L‹d$L‹l$L‹t$ÉÃH‹Á+UH‰å¶ÉÃUH5¯ÞH‰åHƒìH‹™+ÆH‹&BH‰}ðH}ðH‰Eøÿ„ÞÉÃUH5ºÞL‹³ÞH‰åÉAÿãH-0UH‰åH‹H9uH‹Q+€<uL‹4ÞH5-ÞÉAÿãÉÃUH‰åHƒìH‹ +€<t"H‹«AH‰}ðH5ðÝH}ðH‰EøÿâÝë H5 ÞÿÞÉÃUH5 ßH‰åHƒìH‹‹-ÆH‹hAH‰}ðH}ðH‰EøÿÞÞÉÃUH5ÄÞH‰åATL%h/SH‰ûI‹$H‹<ÿ¦ÞH‹7@H‰ÇH5…ÞÿÞ„Àt-I‹$H5€ÞH‹<ÿvÞH‰ÇI‹$H5HÞH‹ÿ>ÞH‰ßL‹$ÞH5Þ[A\ÉAÿãUH‰åHƒìH‹×,€<t"H‹²@H‰}ðH5ßÝH}ðH‰EøÿÑÝë H5ØÝÿÒÝÉÃUH5ÈÞH‰åSH‰ÓHƒìH‹v@H‰}àH}àH‰Eèÿ¤ÞH…ÀH‰Ât H‹u.H‰HƒÄH‰Ð[ÉÃUH5_ÞH‰åH‰]àL‰eèI‰üL‰mðL‰uøHƒì H‹F.L‹-wêL‹5 ÞH‹<ÿ&ÞH‰ÃL‰çH5)Þÿ#ÞI‰ØH‰ÁL‰ïM‰óH‹$L‹d$L‹l$L‹t$H@H5ÖÝ1ÀÉAÿãUH5¸ÝH‰åH‰]ðL‰eøH‰ËHƒìI‰üH‰×ÿšÝH‹«-H‰ßH5yÝI‰ÿoÝH‹ -H‹$I‰L‹d$ÉÃUºH5<ÝH‰åATI‰üSH‹ÝH‹=éÿÝH VH‰ÂL‰çH5ûÜÿÓH‹=réH5ÛÜÿÕÜ[H‹¥/L‰áL‹³ÜA\H‰ÇH5§ÜÉAÿãH‹ü,UH‰å¶ÉÃUH‰åH‰]ðL‰eøHƒì H‹ó,L%dÜH‰ûL‰æH‹<ÿTÜH‹Å,L‰æH‹<ÿ@ÜH‹™>H‰]àH}àH5ÜH‰EèÿÜH‹]ðL‹eøÉÃUH5þÜH‰åATL%‚,SH‰ûI‹$H‹<ÿàÜH‹I=H‰ÇH5¿Üÿ¹Ü„Àt;I‹$H5ºÜH‹<ÿ°ÜH‰ÇH~H5ÜH‹H‹ I‹$H‹ÿjÜH‰ßL‹PÜH5IÜ[A\ÉAÿãUH5jÜH‰åATL%î+SH‰ûI‹$H‹<ÿLÜH‹½<H‰ÇH5+Üÿ%Ü„Àt-I‹$H5&ÜH‹<ÿÜH‰ÇI‹$H5ÎÛH‹ÿÄÛH‰ßL‹ÊÛH5ÃÛ[A\ÉAÿãUH5DÝH‰åAWAVI‰ÎAUATSH‰ûHƒì(H‰U¸H‹=£çÿÝL‰òH‰ÇH5ÝÿúÜH‹K/H5ÜÜH‰H‹9/H‹<ÿÇÜH5°ÜH‰Çÿ§ÜH‹/L‹-iÜHÊ@H‹=3çH5tÜL‹$ÿjÜLË@H‰ÇH >HšSH5;Üÿ5ÜfWÀ1ÉH‰ÂL‰çH5ÜAÿÕH‹°.L‹%É;Hb@L‹=ãÛH‹=ÄæH5ÜL‹,ÿûÛL\@H‰ÇH >HëPH5ÌÛÿÆÛE1ÉM‰àH‰ÙH‰ÂH5“ÛL‰ïAÿ×H‹>.H‰ÚH5lÛH‹<ÿbÛH‹ó;H}ÀL‰ñH‹U¸H59ÛH‰]ÀH‰EÈÿ+ÛH5ÛL‰÷ÿ Û„ÀtH‹©ºH5äÚH‹8ÿÛÚHƒÄ([A\A]A^A_ÉÃUH‰åSH‰ûHƒìH‹±-H‹<H…ÿtDH59Ûÿ3ÛH5ŒÚH‰ÇÿƒÚH‹„-H5eÚH‹<ÿ[ÚH‹l-HÇHƒÄ[ÉÃUH5-ÚH‰åSH‰ûHƒìÿÚH‹5-ÆHƒÄ[ÉÃUH‰åH‰]ðL‰eøHƒì H‹-H‰ûI‰Ô€<tH5ÐÙÿÊÙë0H5ÑÙÿËÙH‹¼:H‰]àH}àL‰âH5’ÙH‰EèÿˆÙH‹]ðL‹eøÉÃUH5–ÙH‰åH‰]ðL‰eøH‰ûHƒì I‰Ôÿ{ÙH‹l:H‰]àH}àL‰âH52ÙH‰Eèÿ(ÙH‹]ðL‹eøÉÃUH5FÙH‰åSH‰ûHƒìÿ5ÙH‹&:H‰]àH}àH5ߨH‰EèÿÕØHƒÄ[ÉÃUH‰åHƒìH‹,€<tH5âØÿÜØë H‹Û9H‰}ðH5ˆØH}ðH‰EøÿzØÉÃUH5`ØH‰åH‰]ðL‰eøH‰ÓHƒìI‰üÿEØ„ÀtH‰ÚH5'ØL‰çÿØ„Àºu1ÒH‹$L‹d$‰ÐÉÃUH‰×H5ûÚH‰åÿòÚL‹ÛÚH‰ÇHYPH5ÊÚÉAÿãUH‰øH‹‹8H‹=ÔãL‹ÚE1ÀH‰åH‰ÁH5ÚÉAÿãUH5qÚH‰åAWAVAUATSHƒìHH‰}°H‹=ŽãÿPÚH59ÚH‰Çÿ0ÚH‹=iãH‰E¸H5ÚH‹çÙÿÚH5êÙH‰ÇÿáÙH5ÊÙH‰ÂH=ÈOÿÓI‰ÆH‹=ãH5Ùÿ—ÙL‰òH‰ÇH5zÙÿtÙ„À…´H‹=íâH5nÙÿhÙ1ÉL‰òH‰ÇH59Ùÿ3ÙH‹=ÄâH5EÙÿ?ÙL‰òH‰ÇH5"ÙÿÙ„À„\L%ÍH‹U°M‰ñH‹=âL OH5ÑØI‹$H‹ H*OHCOHÇD$H‰D$HNOH‰T$H‚OH‰$1ÀÿŽØH‰ÃH‹=âH5ýØÿ÷عHø[H‰ÇH5QØÿKØH54ØH‰Çÿ+ØH‹=ÔáI‰ÁI‰ØH ?OHXOH5ù×ÿó×H…À„‚H‹U°I‹$H5Ë×H‹<ÿÁ×H‰ÃL‹%7ØH5 ×L‰÷ÿ—×H5 ØH‰ÂH‰ßAÿÔH‹=xáH5ù×H‰EÀÿï×1ÉH‰ÇH‹UÀH5¿×ÿ¹×„À„ H‹=BáH5Ã×ÿ½×L‰òH‰ÇH5 ×ÿ×H5×H‰ÇÿúÖH‰EÈéL‰êH5—×L‰÷ÿŽ×I‰ÇH‹=ìàH5m×ÿg×L‰úH‰ÇH5šÖÿ”Ö„ÀtLH‹=ÁàH5B×ÿ<×H‰ÃL‹%bÖL‰êH58×H‹}Àÿ.×E1ÀH‰ÁL‰úH5>ÖH‰ßAÿÔ„Àt@H5MÖH‹}ÈÿCÖH…ÀI‰Å…VÿÿÿH‹(5H‹}°H5õÕE1À1ÉÿêÕë*1Ûë»E1À1ÉH‹5H5ÌÕH‹}°ÿÂÕ„ÛtQH‹ïßL‹% ÕL‰ñH‹=ößE1ÉL”MH­MH5>Ö1Àÿ6ÖHWMH5hÕH‰ÁH‰ßAÿÔë)H‹=¾ßH5?Öÿ9Ö1ÉH‰ÇL‰òH5*Õÿ$ÕH‹}¸L‹ ÕHƒÄH[A\A]A^A_H5õÔÉAÿãUH‰úL‹ÖÔH5ÏÔH‰åÉAÿãUH5×H‰åH‰]ðL‰eøHƒì H‹rßH‰}àI‰ÔH}àH‰EèÿåÖH…ÀH‰ÃtH5ÆÖL‰çÿ½ÖHFþH‹H‰H‰ØL‹eøH‹]ðÉÃUH5ŠÖH‰åSH‰ûHƒìHþH‹H‹<ÿkÖH‹üÞH‰]àH}àH5EÖH‰Eèÿ;ÖHƒÄ[ÉÃU1ÀH‰åÉÃUH5ÖH‰åH‰]èL‰eðH‰ûL‰møHƒì L%¿ýI‰ÕH‹U3I‹$H‹<ÿßÕ„Àt,I‹$L‰éH‰ÚL‹ºÕL‹eðH5¯ÕL‹møH‹<H‹]èÉAÿãH‹]èL‹eðL‹møÉÃUH5™ÕH‰åH‰]ðL‰eøHƒìL%KýH‰ûH‹é2I‹$H‹<ÿkÕ„Àt-I‹$H‹Ì2H‰ÙL‹2ÕL‹d$H5&ÕH‹<H‹$ÉAÿãH‹$L‹d$ÉÃUH5'ÕH‰åH‰]ðL‰eøHƒìL%ÙüH‰ûH‹2I‹$H‹<ÿùÔ„Àt-I‹$H‹b2H‰ÙL‹ÀÔL‹d$H5´ÔH‹<H‹$ÉAÿãH‹$L‹d$ÉÃUH‰åSH‰ÓHƒìHƒ=1Pu+H‹=PÝH5iÔÿcÔH5LÔH‰ÇÿCÔH‰PH‹=ýOL‹ÔH‰ÚHƒÄH5Ô[ÉAÿãUH5óÓH‹=ôÜH‹ÍOL‹ÞÓH‰åÉAÿãUH‰åAWAVAUATSH‰ÓHƒìXHƒ=«O…±HvJH‹=çÜL (KLAKH ZKHsKH‰D$8H‡JH5ˆÕHÇD$@H‰D$0HKJH‰D$(H_JH‰D$ HsJH‰D$H§JH‰D$H{JH‰D$HJH‰$1Àÿ+ÕH5ÕH‰Çÿ ÕH‰ôNH5íÔH‰ßÿäÔH‹=ÝNI‰ÆH5ÃÔÿ½ÔI‰ÇH5£ÔL‰ÿÿšÔH…ÀI‰Å„­H5wÔH‰ÇÿnÔH‰ÃH5dÔL‰÷ÿ[ÔH9Ãw¼L‹%?ÔH5HÔL‰÷ÿ?ÔH‰ÃH55ÔL‰ïÿ,ÔH)ÃH5ÔL‰÷H‰ÚAÿÔL‰êH‰ÇH5ìÓÿæÓ„À„dÿÿÿH‹='NL‰êH5½Óÿ·ÓHƒÄXH‰Ç[A\A]A^A_ÉéþHƒÄX1À[A\A]A^A_ÉÃUH5xÓH‰åH‰]èL‰eðH‰ûL‰møHƒì L‹%ÛL‹-4ÓÿNÓH‰ÇHäùH5-ÓH‹H‹ÿ ÓH‰ÙL‰çM‰ëH‹]èL‹eðE1ÀL‹møH‰ÂH5îÒÉAÿãUH5òÒH‰åÿéÒÉH…À•ÀÃUH5¹ÒH‰åAWI‰ÿAVAUATI‰ÔSHì€H‹=yÚÿ“ÒH5|ÒH‰ÇÿsÒH‹=TÚH5UÒH‰…ÈÿÿÿHÒH1ùH‰Ç1ÉH5%ÒH‹I‹ÿÒH‰ÇH‹®œH5wÒH‹ÿnÒH…À„6H‹H5ÛÑI‹<ÿÑÑH5¶UH‰ÇèáH…ÀI‰Æ„ H‹H5œÑI‹<ÿ’ÑH5›ÑH‰Çÿ’ÑH=yUºH‰ÆèëH5wÑL‰çÿnÑH5aUH‰ÇèÀI‰ÅH…ÐÿÿM…íH‰…ÀÿÿuSé˜H‹½ÀÿÿL‰éL‰â¾è^H‹=6ÙL‰âH5üÐH‹åÐÿïÐH‹Ø-H‰ÁE1ÀH5ËÐL‰ÿÿÓH‹½ÀÿÿL‰ñº€¾èH…ÀI‰Äu‘L‰ïè(H‹n-H5ÐE1À1ÉL‰ÿÿÐë$E1öE1À1ÉH‹P-H5iÐL‰ÿÿ`ÐM…ötL‰÷è– H‹½ÈÿÿH55Ðÿ/ÐHÄ€[A\A]A^A_ÉÃUHMGL‹þÏH5÷ÏH‰åÉAÿãUHPGL‹áÏH5ÚÏH‰åÉAÿãUHSGL‹ÄÏH5½ÏH‰åÉAÿãUHVGL‹§ÏH5 ÏH‰åÉAÿãUH‰úL‹~ÏH5wÏH‰åÉAÿãUH‰åATI‰ÔSH‰ûHƒìH…ÒuH‹=3ØH5üÒÿöÒI‰ÄH‹ì,H‰]àH}àH5ÍÒH‰EèÿÃÒH…ÀH‰ÃtDH5¤ÒL‰çÿ›ÒH‹”&H5}ÒH‰H‹‚&H‹<ÿhÒH…Àu H=´Fè HƒÄH‰Ø[A\ÉÃUH53ÒH‰åSH‰ûHƒìH‹A&H‹<ÿÒH‹P,H‰]àH}àH5ñÑH‰EèÿçÑHƒÄ[ÉÃUH5¸ÑH‰åH‰]àL‰eèI‰üL‰mðL‰uøHƒì L‹-/×L‹5€ÑÿŠÑH‰ÃL‰çH5Ñÿ‡ÑI‰ØH‰ÁL‰ïM‰óH‹$L‹d$L‹l$L‹t$Hé+H5:Ñ1ÀÉAÿãH‹%UH‰åH‹ÉÃUH‹{%H5$ÑL‹ÑH‰åH‹<ÉAÿãUHÂEH5ãÐH‰åL‰møH‰]èI‰ýL‰eðHƒì H‹6%H‹<ÿ¼ÐH…À…„H¤EH5¥ÐL‰ïÿœÐH…ÀuhH‹=@ÖH5yÐÿsÐH‰ÃH‹é$L‹%RÐH5‹ÐI‹|ÿ€ÐH‰ßH56ÐH‰ÂAÿÔL‹ÐH‹]èH‰ÇL‹eðL‹møH5ÐÉAÿãH‹]èL‹eðL‹møÉÃUHQ,H5ÐH‰åL‰mðL‰uøI‰þH‰]àL‰eèHƒì H‹a$H‹<ÿçÏH…ÀI‰ÅtH0,H5‘ÏH‰ÇÿˆÏ„Àt>H‹eÕH5ÖÏL‰÷L‹%\ÏÿÆÏH ·DI‰ÀHÍDH5>ÏH‰ß1ÀAÿÔL‰èH‹$L‹d$L‹l$L‹t$ÉÃUH¾DH5_ÏH‰åSH‰ûHƒìH‹½#H‹<ÿCÏH…ÀuL‹×ÎH‰ßHƒÄH5ÉÎ[ÉAÿãHƒÄ[ÉÃUH­DH5ÏH‰åL‰mðH‰]àI‰ýL‰eèL‰uøHƒì H‹]#L‹%vÎH‹H‰ßÿÙÎH‰ßH GDH‰ÂH5UÎAÿÔH…ÀH‰Ãu?H‹##L‹%<ÎH=DH5žÎI‹\H‰ßÿÎH‰ß1ÉH‰ÂH5ÎAÿÔH‰ÃH‹=ÔH5íÍÿçÍH‰ÚH‰ÇH5ÊÍÿÄÍH5­ÍH‰Çÿ¤ÍH…À…‚H‹=ÌÓH5}ÍÿwÍI‰ÆH‹"H‹=ÖÓL‹%OÍH5˜ÎI‹\ÿοLPPAH9ÃtH=¤Cè"‰ÇèñL‰÷M‰ãH‹$L‹d$L‹l$H‰ÂL‹t$H5ýÌÉAÿãH‹$L‹d$L‹l$L‹t$ÉÃUH5¼ÍH‰åHìPH‹û!H‹<ÿ¡ÍH5ªÌH‰Çÿ¡ÌHµ°þÿÿH‰Çè'¶…ÿÿÿɃàÃUH‰åATSH]àHƒìH‰ßèJH‰ß¾ÿÿÿÿèaH‰ÃHCH5AÌH‰Çÿ8ÌH5!ÌH‰ÇÿÌH…ÛA‰ÄtH‰ßè¯HƒÄD‰à[A\ÉÃUH5äÌH‰åH‰]èL‰møI‰ýL‰eðHƒì0H‹7!H‹<H¬ðH‹ÿ³ÌH…ÀH‰ÃugHŒðH5ÌL‰ïH‹ÿ‘ÌH…ÀH‰ÂtEH‹:ÒH‹ë 1ÉL‹%rËH5ûËI‹|ÿðËH‰ßLEعH‰ÂH5JËAÿÔH‰ÃH‰ØL‹eðH‹]èL‹møÉÃUH5ËH‰åSH‰ûHƒìH‹=©ÑÿËL‹ìÊH‰ÚHƒÄH‰ÇH5ÛÊ[ÉAÿãUH‹^ H5çËL‹àËH‰åH‹<ÉAÿãUH5ÍËH‰åÿÄËL‹ÍÊH‰ÇH5ÃÊÉAÿãUH57ÌH‰åL‰eðL‰møI‰üH‰]èHƒì H‹úI‰ÕH‹H‹=<ÑÿÌH9Ãu8H‹=òÐH53Êÿ-ÊL‰êL‹sÊH‹]èL‹eðL‹møH‰ÇH5]ÊÉAÿãH‹¢H5‹ËI‹<ÿËL‰ïH‰Æè»1ÿH…Àt H‰Çè¦H‰ÇL‹]ÊH‹]èH5RÊL‹eðL‹møÉAÿãUH5nËH‰åL‰mèL‰uðI‰ýL‰}øH‰]ØI‰×L‰eàHƒì0H‹&I‰ÎH‹H‹=hÐÿ2ËH9ÃuCH‹=ÐH5_ÉÿYÉL‰ñL‰úL‹<ÉH‹]ØL‹eàH‰ÇL‹mèL‹uðH5"ÉL‹}øÉAÿãH‹S’H5¬ÊL‹ H‹J’H‹H‹¨I‹|ÿÊM‰àH‰ÂH‰ÙL‰þL‰÷èÄH‹‚H5kÊI‹|ÿ`ÊL‰âH‰ÞL‹eàH‹]ØL‹mèH‰ÇL‹uðL‹}øÉéŽUH5eÊH‰åL‰eðL‰møI‰üH‰]èHƒì H‹(I‰ÕH‹H‹=jÏÿ4ÊH9Ãu8H‹= ÏH5aÈÿ[ÈL‰êL‹1ÈH‹]èL‹eðL‹møH‰ÇH5ÈÉAÿãH‹ÐH5¹ÉI‹<E1äÿ¬ÉL‰ïH‰ÆèæH…ÀH‰ÃtH‰ÇèÊH‰ßA‰ÄèÝD‰àH‹]èL‹eðL‹møÉÃUH5ÉH‰åL‰uðL‰}øI‰þH‰]ØL‰eàA‰×L‰mèHƒì@H‹UH‰MÈH‹H‹=–Îÿ`ÉH9ÃuEH‹=LÎH5Çÿ‡ÇA¾×H‹MÈL‹HÇH‹]ØL‹eàH‰ÇL‹mèL‹uðH5.ÇL‹}øÉAÿãH‹H5ØÈL‹(H‹vL‹ H‹ÔI‹<ÿºÈA¾×H‰ÃH‹=ÌÍH5ÕÆÿÏÆH‹}ÈH‰ÚH‰ÆM‰èL‰áèÕH‹“H5|ÈI‹<ÿrÈL‰êL‰æH‹]ØL‹eàL‹mèH‰ÇL‹uðL‹}øÉé UH5gÆH‰åH‰]ðL‰eøH‰ÓHƒìI‰üÿLÆH…Àu!H‰ÚL‰çL‹ºÇH‹$L‹d$H5ªÇÉAÿãH‹$L‹d$ÉÃUH5ÆH‰åH‰]ðL‰eøH‰ÓHƒìI‰üÿøÅH…ÀtL‹ÜÅH5ÕÅH‰ÚL‰çëL‹¶ÅH5¯ÅH‰ÚL‰çH‹$L‹d$ÉAÿãU¿1sysH‰åATHuìSHƒìè(Huè¿2sys‰ÃèHuäA‰Ä¿3sysD ãèf Øu*H‹=«Ì‹MìHá<D‹MäD‹EèH5êÆ1ÀÿâÆëBH‹=AÌHÚ<H5 ÅÿÅH5ÎÅH‰ÇHÜ<ÿ¾ÅH5ÇH‰ÇÿþÆHƒÄ[A\ÉÃÿ%—Žÿ%™Žÿ%›Žÿ%Žÿ%ŸŽÿ%¡Žÿ%£Žÿ%¥Žÿ%§Žÿ%©Žÿ%«Žÿ%­Žÿ%¯Žÿ%±Žÿ%³Žÿ%µŽÿ%·Žÿ%¹Žÿ%»Žÿ%½Žÿ%¿Žÿ%ÁŽÿ%ÃŽÿ%ÅŽÿ%ÇŽÿ%ÉŽÿ%ËŽÿ%ÍŽÿ%ÏŽÿ%ÑŽÿ%ÓŽÿ%ÕŽÿ%׎ÿ%ÙŽÿ%ÛŽÿ%ÝŽÿ%ߎÿ%áŽÿ%ãŽÿ%åŽÿ%çŽÿ%éŽÿ%ëŽÿ%íŽÿ%ïŽÿ%ñŽÿ%óŽÿ%õŽÿ%÷Žÿ%ùŽÿ%ûŽÿ%ýŽÿ%ÿŽÿ%ÿ%ÿ%ÿ%ÿ% ÿ% ÿ% ÿ%ÿ%L‰Žé”ÿÿL…ŽéˆÿÿLŽé|ÿÿLŽépÿÿLùŒédÿÿLÍŽéXÿÿL)ŽéLÿÿL}Žé@ÿÿL9Žé4ÿÿLuŽé(ÿÿLŽéÿÿLmŽéÿÿLYŽéÿÿLŽéøÿÿL‘éìÿÿLmŒéàÿÿL ŽéÔÿÿLµéÈÿÿLYŒé¼ÿÿL é°ÿÿLAé¤ÿÿL}Œé˜ÿÿLùŒéŒÿÿL]Œé€ÿÿLiŒétÿÿLŒéhÿÿLÑŒé\ÿÿLuŒéPÿÿLYŒéDÿÿL5Œé8ÿÿLIŒé,ÿÿLÅ‹é ÿÿL™ŒéÿÿL=ŒéÿÿLŒéüÿÿLý‹éðÿÿLŒéäÿÿLEéØÿÿL±ŒéÌÿÿLŒéÀÿÿLù‹é´ÿÿL•‹é¨ÿÿLÙ‹éœÿÿLEŒéÿÿLé‹é„ÿÿL5ŒéxÿÿL‘ŒélÿÿLuŒé`ÿÿL)ŒéTÿÿL ŒéHÿÿLIŒé<ÿÿLÝ‹é0ÿÿL±‹é$ÿÿLm‹éÿÿLQŒé ÿÿLM‹éÿÿLq‹éôÿÿL­ŠéèÿÿL™ŠéÜÿÿLŠéÐÿÿL™ŠéÄÿÿLmŠé¸ÿÿ@"NSTimer"@"SUUpdateDriver"@@"NSSet"c24@0:8@16d16@0:8v20@0:8c16v48@0:8@16@24@32^v40checkTimerdriverdelegatetagsupdaterForBundle:sharedUpdaterhostBundleupdateInProgresssetDelegate:validateMenuItem:updateCheckIntervalsetUpdateCheckInterval:parameterizedFeedURLsendsSystemProfilesetSendsSystemProfile:allowedTagssetAllowedTags:feedURLsetFeedURL:automaticallyDownloadsUpdatessetAutomaticallyDownloadsUpdates:automaticallyChecksForUpdatessetAutomaticallyChecksForUpdates:resetUpdateCycleobserveValueForKeyPath:ofObject:change:context:unregisterAsObserverregisterAsObservercheckForUpdatesWithDriver:checkForUpdateInformationcheckForUpdates:checkForUpdatesInBackgroundscheduleNextUpdateCheckupdateDriverDidFinish:updatePermissionPromptFinishedWithResult:startUpdateCycleinitForBundle:feedParametersForUpdater:sendingSystemProfile:updaterShouldPromptForPermissionToCheckForUpdates:valueWithNonretainedObject:objectForKey:classperformSelector:withObject:afterDelay:objectForUserDefaultsKey:boolForUserDefaultsKey:setBool:forUserDefaultsKey:systemProfilearrayByAddingObjectsFromArray:promptWithHost:systemProfile:delegate:objectfinishedinvalidatedistantPastdatetimeIntervalSinceDate:scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:initWithUpdater:autoreleasedidChangeValueForKey:checkForUpdatesAtURL:host:defaultCenteraddObserver:selector:name:object:sharedUserDefaultsControllerstringByAppendingString:addObserver:forKeyPath:options:context:removeObserver:removeObserver:forKeyPath:cancelPreviousPerformRequestsWithTarget:selector:object:boolForKey:boolForInfoDictionaryKey:absoluteStringraise:format:characterSetWithCharactersInString:stringByTrimmingCharactersInSet:URLWithString:isEqualToSet:timeIntervalSinceNowarraycountobjectEnumeratoraddObject:querystringByAddingPercentEscapesUsingEncoding:doubleValueactionSUUpdaterSUUpdaterDefaultsObservationContext%@ <%@>lastUpdateCheckDatevalues.You must specify the URL of the appcast as the SUFeedURLKey in either the Info.plist or the user defaults!SUNoFeedURL"'valuekey%@=%@?&%@%@%@v24@0:8@16i36@0:8r*16@24i32c40@0:8@16@24^@32releaseFromQuarantine:removeXAttr:fromFile:options:copyPathWithAuthentication:overPath:error:_copyPathWithForcedAuthentication:toPath:error:_temporaryCopyNameForPath:currentUserOwnsPath:fileSystemRepresentationstringWithFileSystemRepresentation:length:alphanumericCharacterSetformUnionWithCharacterSet:invertedSetstringByAppendingFormat:pathExtensionstringByAppendingPathExtension:fileExistsAtPath:dictionaryWithObject:forKey:errorWithDomain:code:userInfo:isWritableFileAtPath:stringByDeletingLastPathComponentmovePath:toPath:handler:sharedWorkspaceperformFileOperation:source:destination:files:tag:fileAttributesAtPath:traverseLink:enumeratorAtPath:stringByAppendingPathComponent:MMExtendedAttributesInternals.../CFBundleVersion.-()old (%@)%@ %d.%@%d:%d/bin/rm/bin/mv/usr/sbin/chown-rf-f-RAuthenticated file copy from %@ to %@ failed.Couldn't get permission to authenticate.Couldn't copy %@ over %@ because there is no file at %@.Couldn't move %@ to %@.Couldn't copy %@ to %@.Sparkle error: couldn't move %@ to the trash. This is often a sign of a permissions error.com.apple.quarantine@"NSArray"v32@0:8@16@24itemsuserAgentStringdownloadFilenamebestNodeInNodes:reportError:download:willSendRequest:redirectResponse:download:didFailWithError:downloadDidFinish:download:didCreateDestination:download:decideDestinationWithSuggestedFilename:appcast:failedToLoadWithError:appcastDidFinishLoading:releaserequestWithURL:cachePolicy:timeoutInterval:setValue:forHTTPHeaderField:initWithRequest:delegate:setDestination:allowOverwrite:fileURLWithPath:initWithContentsOfURL:options:error:nodesForXPath:error:dictionarychildrenchildAtIndex:setObject:forKey:nextSiblingkeyEnumeratorattributesstringValuedateWithNaturalLanguageString:whitespaceAndNewlineCharacterSetremoveAllObjectsinitWithKey:ascending:sortUsingDescriptors:localizedStringForKey:value:table:localizedDescriptionobjectAtIndex:attributeForName:preferredLocalizationsFromArray:containsObject:indexOfObject:SUAppcastUser-Agent/rss/channel/itemenclosurepubDateSparkle Updater: Failed to parse appcast item with appcast dictionary %@!An error occurred while parsing the update feed.An error occurred in retrieving update information. Please try again later.xml:lang@"NSString"@"NSDate"@"NSURL"@"NSDictionary"itemDescriptionreleaseNotesURLDSASignatureminimumSystemVersiontagfileURLversionStringpropertiesDictionaryinitWithDictionary:setTag:setMinimumSystemVersion:setDisplayVersionString:setVersionString:setFileURL:setDSASignature:setReleaseNotesURL:setItemDescription:setDate:setTitle:initcomponentsSeparatedByString:lastObjecthasPrefix:SUAppcastItemsparkle:versionurl_sparkle:dsaSignaturesparkle:minimumSystemVersionsparkle:tagsparkle:shortVersionStringsparkle:releaseNotesLinkhttp://@"SUAppcastItem"@"WebView"@"NSTextField"v56@0:8@16@24@32@40@48c16@0:8v20@0:8i16hostreleaseNotesViewreleaseNotesSpinnerwebViewFinishedLoadingwebView:contextMenuItemsForElement:defaultMenuItems:webView:decidePolicyForNavigationAction:request:frame:decisionListener:webView:didFinishLoadForFrame:windowShouldClose:awakeFromNiballowsAutomaticUpdatesshowsReleaseNotesdisplayReleaseNotesremindMeLater:skipThisVersion:installUpdate:endWithSelection:initWithAppcastItem:host:updateAlert:finishedWithChoice:initWithHost:windowNibName:bundlePathstopLoading:setFrameLoadDelegate:setPolicyDelegate:bundleIdentifiersetPreferencesIdentifier:preferencessystemFontOfSize:familyNamesetStandardFontFamily:systemFontSizeForControlSize:setDefaultFontSize:superviewframeinitWithFrame:setStyle:startAnimation:addSubview:mainFrameloadHTMLString:baseURL:loadRequest:setLevel:setShowsResizeIndicator:setFrame:displayVersionStringversionparentFramesetHidden:displayURLopenURL:ignoreusemutableCopynextObjectremoveObjectIdenticalTo:SUUpdateAlertRelease notes with file:// URLs are not supported for security reasons—Javascript would be able to read files on your file system.A new version of %@ is available!%@ %@ is now available--you have %@. Would you like to download it now?d@"NSProgressIndicator"v24@0:8d16v44@0:8@16@24:32c40v40@0:8@16d24@32progressValuemaxProgressValuestatusTextbuttonTitleactionButtonprogressBarsetStatusText:setMaxProgressValue:setButtonEnabled:progressBarShouldAnimatesetButtonTitle:target:action:isDefault:beginActionWithTitle:maxProgressValue:statusText:windowTitlesetShouldCascadeWindows:windowsetFrameAutosaveName:setUsesThreadedAnimation:iconcopysizeToFitsetFrameSize:setFrameOrigin:setAction:setKeyEquivalent:setEnabled:SUStatusControllerSUStatusSUStatusFrameUpdating %@title c40@0:8@16@24@32validatePath:withEncodedDSASignature:withPublicDSAKey:whitespaceCharacterSetcomponentsJoinedByString:UTF8StringdataWithContentsOfFile:SUDSAVerifier SUSparkleErrorDomainSULastProfileSubmissionDateSUSendProfileInfoSUCheckAtStartupSUEnableAutomaticChecksSUEnableSystemProfilingSUAllowsAutomaticUpdatesSUAutomaticallyUpdateSUPublicDSAKeyFileSUPublicDSAKeySUExpectsDSASignatureSULastCheckTimeSUScheduledCheckIntervalSUSkippedVersionSUShowReleaseNotesSUFeedURLSUHasLaunchedBeforeSUTechnicalErrorInformationSUUpdaterWillRestartNotificationNamearchivePathunarchiverForPath:SUUnarchiverv16@0:8@40@0:8@16@24@32descriptionTexttitleTextapplicationIcondoNotInstall:installLater:installNow:descriptiondeallocinitWithAppcastItem:host:delegate:centercloseautomaticUpdateAlert:finishedWithChoice:displayVersionSUAutomaticUpdateAlertA new version of %@ is ready to install!%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?i16@0:8@"NSTask"@"NSPipe"@"NSData"i@48@0:8@16@24@32@40taskDidTerminate:taskOutputAvailable:setResult:resultsetDone:donesetOutput:outputsetInputPipe:inputPipesetOutputPipe:outputPipesetTask:taskrun:directory:withArgs:input:mv_taskmv_outputPipemv_inputPipemv_outputmv_donemv_resulttask:directory:withArgs:input:setStandardInput:setStandardOutput:drainsetCurrentDirectoryPath:setArguments:fileHandleForReadingreadToEndOfFileInBackgroundAndNotifyForModes:fileHandleForWritingwriteData:closeFiledateWithTimeIntervalSinceNow:currentRunLooprunMode:beforeDate:userInfoterminationStatusNotificationsNTSynchronousTaskq32@0:8@16@24i24@0:8@16splitVersionString:typeOfCharacter:decimalDigitCharacterSetcharacterAtIndex:characterIsMember:substringToIndex:substringWithRange:initWithString:setString:appendString:stringWithString:intValuecompare:SUStandardVersionComparatorSUVersionComparison@16@0:8@24@0:8@16sharedSystemProfilersystemProfileArrayForHost:modelTranslationTableinitWithContentsOfFile:arrayWithObjects:dictionaryWithObjects:forKeys:numberWithInt:stringWithUTF8String:standardUserDefaultsnumberWithDouble:SUSystemProfilerplistSUModelTranslationdisplayValuedisplayKeyOS VersionosVersionhw.cputypeIntelPowerPCUnknownCPU Typecputypehw.cpu64bit_capablehw.optional.x86_64hw.optional.64bitopsYesNoCPU is 64-Bit?cpu64bithw.cpusubtypeIntel Core 2Intel CoreG3G4G5OtherCPU Subtypecpusubtypehw.modelMac Modelmodelhw.ncpuNumber of CPUsncpuAppleLanguagesPreferred LanguagelangApplication NameappNameApplication VersionappVersionCPU Speed (GHz)cpuFreqMHzMemory (MB)ramMB@"SUHost"@"NSView"@"NSButton"v40@0:8@16@24@32systemProfileInformationArraydescriptionTextFieldmoreInfoViewmoreInfoButtonisShowingMoreInfoshouldSendProfilefinishPrompt:toggleMoreInfo:promptDescriptioninitWithHost:systemProfile:delegate:shouldAskAboutProfileobjectForInfoDictionaryKey:boolValueactivateIgnoringOtherApps:runModalForWindow:stringWithFormat:setFrame:display:willChangeValueForKey:contentViewaddSubview:positioned:relativeTo:removeFromSuperviewsetFrame:display:animate:setNeedsDisplay:stopModalSUUpdatePermissionPromptShould %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu.SUUpdatePermissionPrompt's delegate (%@) doesn't respond to updatePermissionPromptFinishedWithResult:!SUInvalidDelegate@32@0:8@16@24bundleForClass:pathForResource:ofType:sharedFrameworksPathbundleWithPath:initWithWindowNibPath:owner:SUWindowControllernibSparkle.frameworkv44@0:8c16@20@28@36_finishInstallationWithResult:host:error:delegate:_mdimportHost:installFromUpdateFolder:overHost:delegate:synchronously:versionComparator:_isAliasFolderAtPath:installerForHost:failedWithError:installerFinishedForHost:lastPathComponentnamedefaultManagerisEqualToString:bundleskipDescendentsperformInstallationWithPath:host:delegate:synchronously:versionComparator:setLaunchPath:launchSUInstallerpkgmpkgCouldn't find an appropriate update in the downloaded package./usr/bin/mdimportv52@0:8@16@24@32c40@44v48@0:8@16@24@32@40_performInstallationWithInfo:installPath:overHost:delegate:versionComparator:detachNewThreadSelector:toTarget:withObject:SUPlainInstallerSUInstallerVersionComparatorSUInstallerDelegateSUInstallerHostSUInstallerPathSparkle Updater: Possible attack in progress! Attempting to "upgrade" from %@ to %@. Aborting update.absolutePathForAppBundleWithIdentifier:launchedTaskWithLaunchPath:arguments:waitUntilExitSUPackageInstallercom.apple.installer/usr/bin/open-b-n-WCouldn't find Apple's installer tool!@"NSURLDownload"c32@0:8@16@24updateItemdownloaddownloadPathrelaunchPathabortUpdateWithError:abortUpdatecleanUprelaunchHostAppinstallUpdateshouldInstallSynchronouslyunarchiverDidFail:unarchiverDidFinish:download:shouldDecodeSourceDataOfMIMEType:didNotFindUpdatedidFindValidUpdateitemContainsValidUpdate:itemContainsSkippedVersion:hostSupportsItem:isItemNewer:_versionComparatorpathToRelaunchForUpdater:updaterWillRelaunchApplication:updater:shouldPostponeRelaunchForUpdate:untilInvoking:updater:willInstallUpdate:updater:didFindValidUpdate:bestValidUpdateInAppcast:forUpdater:updater:didFinishLoadingAppcast:versionComparatorForUpdater:bundleWithIdentifier:dataUsingEncoding:allowLossyConversion:bytesstringWithCString:encoding:setUserAgentString:fetchAppcastFromURL:respondsToSelector:defaultComparatorcompareVersion:toVersion:systemVersionStringretainrequestWithURL:createDirectoryAtPath:attributes:cancelrequestschemeisFileURLpublicDSAKeyarrayWithObject:dictionaryWithObjectsAndKeys:rangeOfString:startremoveFileAtPath:handler:copyPath:toPath:handler:instanceMethodSignatureForSelector:invocationWithMethodSignature:setSelector:setTarget:postNotificationName:object:processIdentifierterminate:codelocalizedFailureReasonSUBasicUpdateDriver%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again.%@/%@ Sparkle/%@You already have the newest version of %@.txt%@ %@ Update%@ %dCan't make a temporary directory for the update download at %@.httpsThe update is improperly signed.An error occurred while downloading the update. Please try again later.gzipSparkle Error: No valid unarchiver for %@!An error occurred while extracting the archive. Please try again later.relaunchCouldn't find the relauncher (expected to find it at %@)An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@.%dAn error occurred while installing the update. Please try again later.Sparkle Error: %@Sparkle Error (continued): %@@"SUStatusController"@"SUUpdateAlert"v32@0:8@16q24v32@0:8@16Q24@24@0:8d16v28@0:8@16i24statusControllerupdateAlertshowModalAlert:installAndRestart:unarchiver:extractedLength:extractUpdatecancelDownload:download:didReceiveDataOfLength:_humanReadableSizeFromDouble:download:didReceiveResponse:applicationDidBecomeActive:updaterDidNotFindUpdate:setHidesOnDeactivate:isActivemakeKeyAndOrderFront:alertWithMessageText:defaultButton:alternateButton:otherButton:informativeTextWithFormat:removeObserver:name:object:initWithHost:showWindow:downloadUpdateexpectedContentLengthsetProgressValue:requestUserAttention:setIcon:runModalSUUIBasedUpdateDriver%@ %@ is currently the newest version available.OKYou're up-to-date!NSApplicationDidBecomeActiveNotificationDownloading update...CancelB%.0lf %@KBMB%.1lf %@GB%.2lf %@%@ of %@%@ downloadedExtracting update...Ready to InstallInstall and RelaunchInstalling update...Cancel UpdateUpdate Error!c@"SUAutomaticUpdateAlert"postponingInstallationshowErrorsalertapplicationWillTerminate:setObject:forUserDefaultsKey:SUAutomaticUpdateDriverSUScheduledUpdateDriver@"SUUpdater"updaterappcastURLsetValue:forKey:SUUpdateDriverSUUpdateDriverFinishedSUProbingUpdateDrivercheckingControllerisCanceledcancelCheckForUpdates:closeCheckingWindowallocSUUserInitiatedUpdateDriverorg.andymatuschak.SparkleSparkleChecking for updates...load_canUnarchivePath:_extractDMGprocessInfogloballyUniqueStringinitWithBytes:length:directoryContentsAtPath:isReadableFileAtPath:performSelectorOnMainThread:withObject:waitUntilDone:SUDiskImageUnarchiverdmg/Volumes-noautoopen-nobrowse-noverify-mountpointattachyes /usr/bin/hdiutil-forcedetachv24@0:8#16v24@0:8q16_unarchiverImplementations_notifyDelegateOfSuccess_notifyDelegateOfExtractedLength:_initWithPath:performSelector:withObject:arrayWithArray:Private:24@0:8@16_selectorConformingToTypeOfPath:_extractTBZ_extractTAR_extractArchivePipingDataToCommand:_notifyDelegateOfFailurelengthsubstringFromIndex:numberWithLong:_registerImplementation:SUPipedUnarchiver.tbz.tar.bz2.tgz.tar.gz_extractTGZ.tar.zip_extractZIPrDESTINATIONwtar -xC "$DESTINATION"tar -zxC "$DESTINATION"tar -jxC "$DESTINATION"ditto -x -k - "$DESTINATION"@"NSBundle"v28@0:8c16@20isBackgroundApplicationisRunningOnReadOnlyVolumeinitWithBundle:mainBundledisplayNameAtPath:stringByDeletingPathExtensioniconForFileType:stringWithContentsOfFile:encoding:error:setBool:forKey:numberWithBool:dictionaryWithContentsOfFile:SUHostSparkle Error: the bundle being updated at %@ has no CFBundleIdentifier! This will cause preference read/write to not work properly.CFBundleDisplayNameCFBundleNameThis host (%@) has no CFBundleVersion! This attribute is required.SUNoVersionExceptionCFBundleShortVersionStringicnsCFBundleIconFileBNDLLSUIElement%d.%d.%d/System/Library/CoreServices/SystemVersion.plistProductVersion ¬@ð?õ@u"Á>@ @à?0@D@4@.@@@À‰@@0AP?ÐAzPLRx› C <$ŒÔþÿÿÿÿÿK†  ŒƒDd—ÔþÿÿÿÿÿÔ† ŽŒƒD¬#Õþÿÿÿÿÿª† ŽŒƒ<ô…ÖþÿÿÿÿÿK†  ŒƒD4Öþÿÿÿÿÿ‡† ŒƒŽD|ÏÖþÿÿÿÿÿW† ŽƒŒ4ÄÞØþÿÿÿÿÿ;† ƒ4üáØþÿÿÿÿÿІ ƒ443Ùþÿÿÿÿÿ+† <l&Ùþÿÿÿÿÿ† Œƒ<¬ûÙþÿÿÿÿÿ‰† ƒŒ<ìDÚþÿÿÿÿÿ_† ƒŒ<,cÚþÿÿÿÿÿ_† ƒŒDl‚Úþÿÿÿÿÿ]† ŽŒƒD´—Ûþÿÿÿÿÿr† ŽƒŒ<üÁÜþÿÿÿÿÿ Wí† ƒŒ4<ŠÝþÿÿÿÿÿ‰† ƒ4tÛÝþÿÿÿÿÿP† ƒ<¬óÝþÿÿÿÿÿÁ† Œƒ4ìtÞþÿÿÿÿÿZ† ƒ4$–Þþÿÿÿÿÿ.† <\ŒÞþÿÿÿÿÿƒ† Œƒ<œÏÞþÿÿÿÿÿc† Œƒ<ÜòÞþÿÿÿÿÿ¾† Œƒ<pßþÿÿÿÿÿu†  Œƒ4\¥ßþÿÿÿÿÿ1† 4”žßþÿÿÿÿÿ.† 4Ì”ßþÿÿÿÿÿ+† D‡ßþÿÿÿÿÿ-† Ž ƒŒDLlâþÿÿÿÿÿé† ƒŽŒ4” ãþÿÿÿÿÿJ† 4Ìãþÿÿÿÿÿ† ƒ4tãþÿÿÿÿÿH† ƒ4<„ãþÿÿÿÿÿ† 4t]ãþÿÿÿÿÿ0† 4¬Uãþÿÿÿÿÿ† 4ä.ãþÿÿÿÿÿ!† zPLRx›õ9 L$÷âþÿÿÿÿÿœ† Œƒ Ž <tCãþÿÿÿÿÿ¦è† ƒŒŽ<´©äþÿÿÿÿÿц  ƒŒŽLô:æþÿÿÿÿÿ/† ŽƒŒLDéþÿÿÿÿÿ%† ƒŽŒ<”îìþÿÿÿÿÿ›ç†  ŒƒDÔIíþÿÿÿÿÿ† ŒƒŽzRx 4ÿíþÿÿÿÿÿl†  Œƒ,T3îþÿÿÿÿÿ† 4„îþÿÿÿÿÿ›† Œƒ4¼wîþÿÿÿÿÿQ† Œƒ4ôîþÿÿÿÿÿT†  Œƒ<,¬îþÿÿÿÿÿ¯† Ž ƒŒ4lõþÿÿÿÿÿˆ† Œƒ,¤kõþÿÿÿÿÿ † <ÔDõþÿÿÿÿÿ}† ƒŽŒ<öþÿÿÿÿÿ•† ƒŽŒ4TÖ÷þÿÿÿÿÿY†  Œƒ,Œ÷÷þÿÿÿÿÿ† zRx ,À÷þÿÿÿÿÿ1† 4LÁ÷þÿÿÿÿÿY†  Œƒ,„â÷þÿÿÿÿÿ1† 4´ã÷þÿÿÿÿÿY†  Œƒ,ìøþÿÿÿÿÿ1† 4øþÿÿÿÿÿY†  Œƒ,T&øþÿÿÿÿÿ1† 4„'øþÿÿÿÿÿY†  Œƒ,¼Høþÿÿÿÿÿ1† 4ìIøþÿÿÿÿÿY†  Œƒ,$jøþÿÿÿÿÿ1† 4TkøþÿÿÿÿÿY†  Œƒ,ŒŒøþÿÿÿÿÿ1† 4¼øþÿÿÿÿÿY†  Œƒ,ô®øþÿÿÿÿÿ1† 4$¯øþÿÿÿÿÿY†  Œƒ,\Ðøþÿÿÿÿÿ1† 4ŒÑøþÿÿÿÿÿY†  Œƒ,Äòøþÿÿÿÿÿ1† 4ôóøþÿÿÿÿÿY†  Œƒ4,ùþÿÿÿÿÿ-† ŒƒŽ,d ýþÿÿÿÿÿü† ƒ,”Õýþÿÿÿÿÿ† zRx 4žýþÿÿÿÿÿ°† Œƒ<Tþþÿÿÿÿÿ‡† ŒƒŽ4”]þþÿÿÿÿÿl†  Œƒ4Ì‘þþÿÿÿÿÿº† Œƒ,ÿþÿÿÿÿÿ† ,4ûþþÿÿÿÿÿ† ,dæþþÿÿÿÿÿ† <”Ñþþÿÿÿÿÿo† ƒŒŽ,ÔÿÿÿÿÿÿG† 4ÿÿÿÿÿÿu†  Œƒ<<Tÿÿÿÿÿÿë†  ƒŒ,|ÿÿÿÿÿÿÿ† ,¬ìÿÿÿÿÿÿ!† 4ÜÝÿÿÿÿÿÿ¢† Œƒ<Gÿÿÿÿÿÿ† ŽŒƒ4Tˆÿÿÿÿÿÿ|† Œƒ<ŒÌÿÿÿÿÿÿ¥† ŽŒƒ4Ì1ÿÿÿÿÿÿ®† ƒŒŽ,§ÿÿÿÿÿÿ† zRx 4pÿÿÿÿÿÿv† Œƒ4T®ÿÿÿÿÿÿކ Œƒ<Œ ÿÿÿÿÿÿ‡† ŒƒŽ4ÌK ÿÿÿÿÿÿr† Œƒ4… ÿÿÿÿÿÿ¢† Œƒ,<ï ÿÿÿÿÿÿ!† <là ÿÿÿÿÿÿ¨† Œ  ŽƒD¬H ÿÿÿÿÿÿž† ŽƒŒ,ôž ÿÿÿÿÿÿ † ,$y ÿÿÿÿÿÿ$† ,Tm ÿÿÿÿÿÿ† ,„O ÿÿÿÿÿÿ† ,´1 ÿÿÿÿÿÿ† ,ä ÿÿÿÿÿÿZ† ƒ4= ÿÿÿÿÿÿY†  ŒƒzRx ,F ÿÿÿÿÿÿä† 4Lú ÿÿÿÿÿÿ† Œƒ4„Qÿÿÿÿÿÿ↠ ƒŒŽzRx <ãÿÿÿÿÿÿ­†  ƒŒ4\Pÿÿÿÿÿÿf† Œƒ,”~ÿÿÿÿÿÿ† ,Ä_ÿÿÿÿÿÿ† zRx <ÿÿÿÿÿÿÛ† ŒƒŽ4\¸ÿÿÿÿÿÿl†  Œƒ<”ìÿÿÿÿÿÿ‡† ŒƒŽ,Ô3ÿÿÿÿÿÿ@† ƒ,CÿÿÿÿÿÿC† ƒ,4VÿÿÿÿÿÿC† ƒ,diÿÿÿÿÿÿ!† 4”Zÿÿÿÿÿÿ¢† Œƒ<ÌÄÿÿÿÿÿÿΆ ŒƒŽzPLRx›=% <$2ÿÿÿÿÿÿ™†  ƒŒ4d‹ÿÿÿÿÿÿ¢† ƒLœõÿÿÿÿÿÿH¯Ó† Œ ŽƒTìíÿÿÿÿÿÿó§Ó† ŽŒƒ4Dˆÿÿÿÿÿÿ† <|aÿÿÿÿÿÿY†  Œƒ4¼zÿÿÿÿÿÿ† <ôSÿÿÿÿÿÿY†  Œƒ44lÿÿÿÿÿÿ† <lEÿÿÿÿÿÿY†  Œƒ4¬^ÿÿÿÿÿÿ† <ä7ÿÿÿÿÿÿY†  Œƒ4$Pÿÿÿÿÿÿ† 4\)ÿÿÿÿÿÿ† 4”ÿÿÿÿÿÿ† 4ÌÙÿÿÿÿÿÿ† <±ÿÿÿÿÿÿh† ƒŒ<DÙÿÿÿÿÿÿS†  ŒƒzRx ,ÔÿÿÿÿÿÿB † <Læÿÿÿÿÿÿކ Œƒ4Œ4ÿÿÿÿÿÿÔ†  ƒŒŽ4ÄÐÿÿÿÿÿÿp†  ƒŒŽzRx ,ðÿÿÿÿÿÿ; † 4Lûÿÿÿÿÿÿ’† ƒŒ4„UÿÿÿÿÿÿÔ † ƒŒŽzRx ,Ù$ÿÿÿÿÿÿ;† <Lä$ÿÿÿÿÿÿ݆ ŒƒŽ<Œ%ÿÿÿÿÿÿÕ† ŒƒŽ<Ì&ÿÿÿÿÿÿ‡† ŒƒŽ4 ]&ÿÿÿÿÿÿ† Œ ƒ4D:'ÿÿÿÿÿÿl†  Œƒ,|n'ÿÿÿÿÿÿ!† 4¬_'ÿÿÿÿÿÿ¢† Œƒ<äÉ'ÿÿÿÿÿÿ°† Œƒ<$9,ÿÿÿÿÿÿ9† ŽŒƒzRx <-ÿÿÿÿÿÿ† ŽŒƒ zRx ,È-ÿÿÿÿÿÿ_† ƒ<L÷-ÿÿÿÿÿÿ:† ƒŒŽ4Œñ1ÿÿÿÿÿÿÛ† ŽŒƒ<Ä”2ÿÿÿÿÿÿÀ† Œƒ zRx Dü2ÿÿÿÿÿÿ·† Œƒ Ž <dk4ÿÿÿÿÿÿö† ŒƒŽ4¤!5ÿÿÿÿÿÿ¹† ŒƒzRx <Š5ÿÿÿÿÿÿ*† ƒŽŒzRx <\7ÿÿÿÿÿÿ¹† ƒŒŽ4\Õ9ÿÿÿÿÿÿ”† Œƒ<”1:ÿÿÿÿÿÿ‘† ƒŽŒ<Ô‚:ÿÿÿÿÿÿj† ŽƒŒ<¬;ÿÿÿÿÿÿ¦† ƒŒŽ4T<ÿÿÿÿÿÿi† Œƒ<ŒC<ÿÿÿÿÿÿŸ† ŽŒƒ4Ì¢=ÿÿÿÿÿÿ?† Œƒ4©=ÿÿÿÿÿÿ‘† Œƒ<<>ÿÿÿÿÿÿ¤† ƒŽŒ<|f?ÿÿÿÿÿÿ§† ŒƒŽ4¼Í?ÿÿÿÿÿÿÁ†  ƒŒŽ<ôVBÿÿÿÿÿÿã† Ž ƒŒ44ùCÿÿÿÿÿÿІ  ƒŒŽ,l‘Eÿÿÿÿÿÿ6† 4œ—Eÿÿÿÿÿÿ—† Œƒ,ÔöEÿÿÿÿÿÿ3† ƒ4ùEÿÿÿÿÿÿÿ† ŽŒƒ,<ÀFÿÿÿÿÿÿ† <l˜Fÿÿÿÿÿÿ† ƒŒŽ,¬YHÿÿÿÿÿÿ(† 4ÜQHÿÿÿÿÿÿÿ†  ƒŒŽ<Mÿÿÿÿÿÿo† Œƒ <TGMÿÿÿÿÿÿˆ† ƒŽŒ,”NÿÿÿÿÿÿZ† ƒ4ĹNÿÿÿÿÿÿ¸† Œƒ4ü9Oÿÿÿÿÿÿކ ŒƒzRx 4wOÿÿÿÿÿÿÚ† ƒŒŽ<TQÿÿÿÿÿÿå† ƒŒŽ,”¾Rÿÿÿÿÿÿy† ƒ<ÄSÿÿÿÿÿÿD† ŒƒŽ4 UÿÿÿÿÿÿQ†  Œƒ4<$Uÿÿÿÿÿÿ † ƒŒ<tùVÿÿÿÿÿÿL† ƒŽŒ,´YÿÿÿÿÿÿF† ƒ<äYÿÿÿÿÿÿdž ƒ Œ<$¢Yÿÿÿÿÿÿ† ŽŒƒDdwZÿÿÿÿÿÿq† Žƒ Œ,¬ [ÿÿÿÿÿÿ† <܆[ÿÿÿÿÿÿdž ƒ ŒD \ÿÿÿÿÿÿD† ŒƒŽ,d ]ÿÿÿÿÿÿh† ƒ<”A]ÿÿÿÿÿÿ«† ŒƒŽzRx 4”]ÿÿÿÿÿÿë† ƒŒ,TG^ÿÿÿÿÿÿy† ƒ<„^ÿÿÿÿÿÿ(† ƒŽŒ,Äx_ÿÿÿÿÿÿ† ,ôY_ÿÿÿÿÿÿ5† ,$^_ÿÿÿÿÿÿ† ,TD_ÿÿÿÿÿÿ5† ,„I_ÿÿÿÿÿÿF† zRx ,G_ÿÿÿÿÿÿ5† 4LL_ÿÿÿÿÿÿ†† Œƒ,„š_ÿÿÿÿÿÿF† zRx ,˜_ÿÿÿÿÿÿI† ƒ<L±_ÿÿÿÿÿÿ‡† ŒƒŽ4Œø_ÿÿÿÿÿÿW† Œƒ4Ä`ÿÿÿÿÿÿv† Œƒ,üU`ÿÿÿÿÿÿ† 4,6`ÿÿÿÿÿÿl†  ŒƒzRx 4R`ÿÿÿÿÿÿ”† Œƒ4T®`ÿÿÿÿÿÿ†† ŒƒzRx <ä`ÿÿÿÿÿÿІ ŽƒŒ,\tbÿÿÿÿÿÿg† ƒ,Œ«bÿÿÿÿÿÿ+† ƒ4¼¦bÿÿÿÿÿÿl†  Œƒ4ôÚbÿÿÿÿÿÿP† Œƒ,,òbÿÿÿÿÿÿ@† ƒ,\cÿÿÿÿÿÿF† 4ŒcÿÿÿÿÿÿR† ŒƒzRx ,cÿÿÿÿÿÿ0† ,Lcÿÿÿÿÿÿ-† 4|cÿÿÿÿÿÿ(†  ƒŒŽ,´gÿÿÿÿÿÿ† zRx 4Øfÿÿÿÿÿÿf†  Œƒ,TgÿÿÿÿÿÿN† ƒ,„$gÿÿÿÿÿÿ† <´üfÿÿÿÿÿÿ{† Œƒ 4ô7gÿÿÿÿÿÿr†  Œƒ4,qgÿÿÿÿÿÿr†  Œƒ,d«gÿÿÿÿÿÿb† ƒ,”Ýgÿÿÿÿÿÿ$† zRx 4¹gÿÿÿÿÿÿ׆  ƒŒŽ<TXiÿÿÿÿÿÿv† Œƒ ,”Žiÿÿÿÿÿÿ† DÄwiÿÿÿÿÿÿ$†  ŒŽ ƒ, Skÿÿÿÿÿÿ† ,<@kÿÿÿÿÿÿ† ,l-kÿÿÿÿÿÿ† ,œkÿÿÿÿÿÿ† ,Ìkÿÿÿÿÿÿ† zRx 4Øjÿÿÿÿÿÿ¥† Œƒ,TEkÿÿÿÿÿÿK† ƒ<„`kÿÿÿÿÿÿ|† ŒƒŽ,Äœkÿÿÿÿÿÿ† ,ô}kÿÿÿÿÿÿ!† <$nkÿÿÿÿÿÿц ƒ Œ<dÿkÿÿÿÿÿÿ³† ŽŒƒ,¤rlÿÿÿÿÿÿQ† ƒ<Ô“lÿÿÿÿÿÿy† ƒŽŒ,ÌmÿÿÿÿÿÿN† 4Dêmÿÿÿÿÿÿj† ƒŒ<|nÿÿÿÿÿÿ¹† ƒ Œ,¼•nÿÿÿÿÿÿ=† ƒ,ì¢nÿÿÿÿÿÿ!† ,“nÿÿÿÿÿÿ&† <L‰nÿÿÿÿÿÿɆ Œ ƒDŒoÿÿÿÿÿÿ † Ž ƒ Œ<ÔÓoÿÿÿÿÿÿȆ Œ ƒ<[pÿÿÿÿÿÿ&† ŽŒƒ4TAqÿÿÿÿÿÿT† Œƒ4Œ]qÿÿÿÿÿÿ_† Œƒ4Ä„qÿÿÿÿÿÿ·†  ƒŒÀ_ÿÀ_ÿ4ô°óXôôô¬ô\ö8ö,öDöPö”ô|ôlõ ôÜôõ$õÐôèôÄô0õ õxõ`õöüõdôõˆô¸ô öõðõ˜ópô(ôäõ„õœõÌõTõÀõÈóHõLô€óŒóàóØõ´õô¨õ¤ó@ôÔóöìóôôøó<õ¼óQþ¨¸øEþ¼þ  þþàìýæýàýËýØ÷ì¸ý©ýˆý`ýRýCý)ýòýe÷ˆøàüÀü°üˆünüQü $(üüùû}÷ãûü4€ !÷àøÒûÁûì÷€ûQ÷cû^ûRû”þ2øGû>û7ûrøBùûðúÈù’÷ÞúÂúPøªúøù¼*ŒúP Ú `úÍø‚:¸¦  +˜¦ ´ù6XúJú.úöö’:`àIJú ”ÿè”+à#Ôþ+ºèÿ˜`<}ÿP (øß´:ˆýÏ´`ý˜$ò€"3hø#H èÏÀ`«¼*˜`¨+ˆ0*n”+VEî ˆý óè$‡ÙÍþ¸Júò#§æý˜àŠìýtä+ø#àýH4ì`Òûï6Ì ¨˜¨â x k Æ #   < Z N ©ýþ “ œ î 6´:Ô æý± Jú¦ ì˜Òû +ïº àìýÓÏÈ¿»Ô³¨œ”߯ $xò#ˆà" Öh kù R Hœ)ý òx 4  z+ˆ ýíãÒûÐ6ĺ¦ˆqfTH.0*e ˜ ¼*à ô ç ¨˜P Ú Xú€ +¸ í3G5*l,³ºÄ÷ÆÕãûì€ àò#ˆ0*ÀªÖœP Ú Xú¨˜€ +¸ 9p*1& þˆýîàìý± àýP XúÒû286p6àìýÔ7ò#ˆ0*àèàP Ú Xú¨˜Öœ€ +¸ RwdJúhTE'mý $ÈD(ü¬žŠ$~x˜ +}]Ĩr°üü`«N’¿„œ¶Òû¦ 6¦ “ŠÀæýÆxj_˜þO;ÚÒûÓ)9àýë$¦ 6¼”ò#Àæý¥Jú‰(;zþX+DàýÒû*P"@"Xú¦ 6Òû!àxùº ÂúRý¼*!æ Ò ° ¨k ãû€ ò#ˆ0*ਘh ÄP Ú : œ°6Xú P:€Õ +¸  ò"€"`h"P"@"Xú #Â#¼*## $ž”+Š$Òû¦ 68$Xúð"`<'$ƒ# $€"´:$`àIø#øò#à#Ú 4¨%K%¨+xp%Jú¦ 6ð"¸ÿÚ `<P è*ò€"”ð"`<î&È&D(ø# &Ô¨Ü'Æ,Á,Ü'°ü¶,È&D¡,6)Ú 8)},üê'X)l,_,@,,ò'8#(þ+ä+P"@"Xú)(Ø+-( Æ+¨+«è”+à#˜Ô>1°˜ „+z+s+»g+Z+8+(ø#`´:øï'+¾ à1Ô2«)™(°(ˆ( +àìý^È)ð)É(÷(å(Œú+¥  ¼÷$º è*Æ ”)Ð**¼*èö¦*’*v*p*H*ò2÷˜¦ 6Æ'`<P ò#ˆ0*h:ùû@373àÜ'ÒûàÆ'«((3EþJú ø#>1ìZ+Æ1z3lP Õé2Æ Ô2È2@´2ü4˜’2Ü'ú082ò#ˆ0*à1(üü 22 þ1œP:«)¼*èö2÷w 6Æ'ò'(Ü'ü4Æ (’2(üü 2œ2°6Æ'Ü'à1¼*èö™(¨˜},ün5(; +ìP Ú Xú¦ à1Ü'«)¼*èö÷(å(`Ü'Æ'Ü'ñ5˜à P:ùûÈ2@ˆ0*Öœ´26L9xä+È&7þ+é6àìýÌ6à#˜(Òû´6D8+(ø#`œ66¦ 6¨%$ø`8þ¦ 6C8"1¼*¨˜ì¦ L9Ð8x7:9˜H ø#¦ 6¨%ˆ8XúJú$!99àÙà# +¨+8;)ýªúŒú(;;ý¸¥øãè: JúHÓ:ÔÒû*6P"”Rý$´:¡:ø#òP Ú Xú¨˜ +¦ ’:À`@ÿ€üÀê @ñ É â ç @ñó€ïÝ Ö  ç ÅÀÒ`Î@ßÀÒ âÝàè( @¿à¾0\þ࿀À¿((\þ@Ã#÷Ж)èöÐ…)!÷Ü U)2÷HÿD)?÷˜öü(¨0o(Q÷£ö%(e÷6<'}÷Ð$’÷Ü ä#¥÷®ö¶#¼÷Ð…#È÷Hÿ#Ø÷ÐR"à÷Hÿï!ì÷Ü l!ø®ö>!2øÜ ä Pø®ö# rø0Óˆø¹öJ¸ø0AÍø0ÏàøHÿrûø0ùHÿ´&ù0+Bù0”þÐë^ùHÿaxùä &¢ù0ÏœÐH¦ Ðý´ùØSööØ÷Ð4 €¾Ñöhöx¾Üösöp¾ð Ðh¾èö‡ö`¾ñö‰ö(•@ñ€Ä¸ÿeÿù0èÿeÿÊ-Øù+3˜öS*€@ñ@Å}ÿHÿ¹5”ÿSÿ5 @ÆàÅ((àÆ È€Æ((( 2÷Hÿ7C’*HÿÞB‡ØIA˜HÿÌ?¨8Ã?ÓP;?îHÿŒ8P88(Pç7¦*HÿL7^Ð;7¨0Ï6 ˜Å^@ÅdH ˆÅèö‡ö€ÅuH XPH@80( ÀÉ`É`í `Ê ÌÊ((í Ù ÐÕM¨0ÙLî Ø¬H HÿSHº Ð"H HÿÉG¥ ИG# Hÿ?GxÐG< HÿµFÆ Ð„FN Hÿ+F¾ ÐúEZ Hÿ¡E˜ ÐpEk HÿEˆ ÐæD HÿDx Ð\D“ HÿD^ûÐÒCœ HÿyCŒÐHC ÉŒH É^ûT Éx H øÈˆ ^ ðȘ H èÈ¥ H àȺ H ØÈ¾ ^ ÐÈÆ H ÈÈxH ÀÈÙ g €xph`XPÏ î ÎP Ï€ÑÀî@Ï((2÷Hÿ×\8 8)\p Ä „[¸ P[JЇYZÐåXdÐÄXÙ ˜ö§Xì 0¼Uù Ü GU Ü U" 0‘P6 HÿvPE Hÿ[PV HÿCPe ä ‰O¨0OœÐ–Nw 0"æM PΘ' HÎð Ð@Îèö‡ö8Îö ¥ 0Μ° (Î  Î ˜4ˆ€xph`XP`Ó îÓPSÔ€ÕÀî Ó((SÆHÿ­dÕ6Sdz£öAd36/dl£ödì®öùcþÜ îcDP`@X¨_dЇ_rÐå^ì 0s^œÐì]¨0^]´2Øè\ ¸Òl°Òz¨ÒŒH  Ò‘H ˜ÒœH Ò¨èˆÒµ€Òð Ð@×àÖN€×((Nà×°˜yfÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>ÿÿÿÿÿÿÿÿÿÿÿÿ?456789:;<=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ !"#$%&'()*+,-./0123ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¥¤£¢¡ ¹ ¸ ÐëêéèHhˆ¨Èè(Hhˆ¨Èè(Hhˆ Ý@Ý@ÞÀÞàÝ(( ÞØ+0i2÷HÿniœÐi Ø[h èÜèö‡öàÜýH `XPàß î€ßPh.€à`áÀî à((. JÐÜlZÐ:ldÐltHÿÖk‚Hÿ“kHÿSkœÐÌj¨0`j°8…i 0ߘ' (ßèö‡ö ßð Ð,( Àâ`â0›`ãÀãã((› ã¨0Co¦ Ъm(åo ââõâêÿøáøÿðá èá˜4àáp8 âàä Rä ùu]æéud®öÙumÜ ÈurHÿou}Ð^u„Hÿu’ÐôtœHÿ›t«ÐŠt¶Hÿ1t¿Ð tÄ2%-q â`æ+Hÿqv=Hÿ v¸çHè*­Àç`çœ`èPèè((œÀèPè æè*­hyÆØ”wÚ»wÐ*ÐÄv€é éÎ êÀé((Î`êøØ¥|Ð|ãÐØ{€xph`XP`ë îëP‚ !ìíÀî ë(( !àì HÿáHÿ1‹ÐŠàÐnЍ0Šì 0툜Ðfˆ°8´†ÕÜ y†ûö‘‡ ¸êð аê@¨êèö‡ö ê'° ˜ê<ÞêIèˆêX˜4€êj˜4Àî`îPP­"`ïï((­"¸ 0"‘ ðÀï«$`ð((«$Àðð"Ø"”—##Hÿ¹–8#%’ƒ#˜ö ’àñ€ï€ñÕ% ð ò((Õ%€ò8$%›K%Hÿ šp%2%T˜H#h#ˆ#¨# ó@ñ@ó'àñàó(('@ô8$%º›@80( õ@Àô(HÝ,Àõ`øà`õ((Ý,¨0¡»Æ'HÿéºÜ'0º #P¹ê'0˜¸ò'0™³Â#Hÿq³(0p±(Ü h±-(Hÿi°@(Hÿ6°>10Ÿ¯X(‡'i¯ÓP™­îHÿ¶«(Põ¨Ô20N¨ˆ(0ª¦™(0¦`PÚ¥Hÿ;¤°(˜öÒ£É(˜ö,£å(˜ö¡÷(˜ö1¡)РùûPä xô˜' pô£'q'hô¬'H `ô¹'H PHÀù€ô`ùHXI3`úü õú((I3ú0HÿqÍÜ'0 ÍÆ'HÿÅË(0þÊ 1HÿèÊ@(HÿwÉ"1¢0bÈ>10›ÇL1HÿUÇ`1°0 Å1¾0üŸ1P«Â˜ Ï0gÀÀ1Hÿ(0 ¾™(0/¼ ùÝ0x0ùî0Ž0PIH ý€ôÀüHX5Àý þ õ`ý((5Æ'Hÿ9ÑÂ#HÿÑÝ4HÿîÐ(0¹Ð(Ü ¨ÐèÏ0€ÏÀ1HÿÏ@(HÿÎ püµ4˜4hüÌ4˜4`ü×4š4Xàÿ ù€ÿXY65€àÀù ((65Æ'Hÿ:Òˆ(0´Ñ™(0Ñ  ÿÌ4˜4 à€!5€  ((5¨0.Ô>ûÜ ÔÜ'0§ÓùûPPÓœÐÉÒÁûØ€Ò 8ð Ð0[5N5(c5^  >û˜4È)`€ôHH¥5 õ ((¥5ˆ(0.Õ™(0šÔ`X ù Xa6 €Àù@((6°(˜öXÙ`PÙÜ'0ÒØÆ'Hÿ‚ØHÿØÚ5Hÿë×ñ50„×ùûP´Õ H¼5x0@Ï5˜4€Ý 77  ÝÀ((77` ƒ60ÚØ+0ÚÙk60/Þp6˜öªÙp8Ýà ` ú80ñßô70ß8Æ7ߨ0®Þ28ØHÞÔ7ÐÅàL9¸7càp6˜öüÞ` Ý e9  Ý  ((e9  °90Êå­80­å–90å½80såÐ8HÿOãØ+0Àâk60çåp6˜ö6ãˆ8{8éàÀ ` V;`€((V;`ý˜öõðJúØ¡ðÂúB:{ïªú˜ö³îü4PªíŒúØáì)ý˜ö»ìòØšìÞúÐ]ì„+ФëP:Ü :ëh:Ü ìêàÐséÐ"é”Ðoèò#ОçÚ Ð}ç $ÐlçœÐðæ¨0¥æ‚:Øæ+ÐTñ   $0: ¾ Å É`ÎÀÒ ÖÝ@ß â çàèÀê î€ï@ñó€ô ù€ü@ÿ@À`àÀ  ¢ùøùÈù&ù^ùrøù`˜ =+xùÂ# #K%*ð)È)«)à1)X)ò'8))À1L1 1Ý4Ú5ƒ6ô7ú8"1@(-(8 ¾ Å É`ÎÀÒ@ß âÀê î€ô ù€ü@ÿ@` Èhþ#ÈŒþÈ”þȨþȰþjÈÿ È'ÿÈ*ÿÈ0ÿÈ4ÿÈ:ÿÈ<ÿÈ>ÿÈ¦È øÈ·È¼ÈÀÈÆÈ-È0(È`8șȱÈÐZÈ2 È=ÈO ÈYÈhIÈ^ûÈ06ÈJ6ȸ0ÈðKÈ< Èý È È ÈŒÈœ È È* ÈG  ÈS Èn ȇ È ÈˆÈ¨!ÈÐGÈfÈo È€ Èœ È–È\È`ÈuȑȣȴÈÌÈäÈýÈÈ&È5ÈKÈ[ÈtȅȘ È¢È¶ÈØ$È.ÈH(ÈxfÈŸÈßÈåÈø È  È È% È:È@ÈHÈPÈYÈȡȤȳÈÊ È× ÈâÈåÈèÈëÈñ Èý È ÈÈ)È8È=ÈLÈ_ÈdÈuÈ}È‘ ȜȬ È· ÈÃÈ !È@!jÈXȰ!fÈ"ÈÀ"ÈÄ"È·$È»$ÈÀ$>Èÿ$Èæ%È&È&È'&È8&eÈ'È*' È8'È;'È>'ÈH'%Èø,´È­-ÈÀ-*Èë-Èï- Èü-È.?ÈH.ÈP. Èx.GÈÀ.ÈÈ.*Èø.GÈ@/ÈP/8È/gÈø/È0FÈG0ÈY0È`30È‘3È”3Ȩ3(ÈÑ3Èç3Èî3Èð3Èù3Èü3Èÿ3È4È 4È4È4 È+4È@4ÈQ4Èf4È{4 ȉ4 ÈŽ5È>ûÈS6ÈM7ÈQ7ÈZ7 Èf7 Èp7 Èz7 Ȇ7ȤȔ7È¥7Ȭ7Èw9È|9È­8 ȉ9ÈŽ9È–9 È¢9Ƚ8 È«9Ȱ9 ÈÌ9Èã9Èû9È:È`;„Èå;Èù; È<BÈK<È`<È{<È€<È‘<È–< È¢<Ȱ<0Èá<ÿE4E×âîçÿÿ'%MÛqZ`1ÿMA 7YVd {tÿE46f}åðüõ9ÿE4,„ºÚåôêöÅ@Ä æ ä   æàÀ ¨°¸ÀÈÐØàèðø (08@HPX`hpx€ˆ˜ ¨°¸ÀÈÐØàèðø (08@HPX`hpx€ˆ¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø  ( 8 H X h x ˆ ˜ ¨ ¸ È Ø è ø   ( 8 H X h x ˆ ˜ ¨ ¸ È Ø è ø   ( 8 H X h x ˆ ˜ ¨ ¸ È Ø è ø   ( 8 H X h x ˆ ˜ ¨ ¸ È Ø è ø   ( 8 H X h x ˆ ˜ ¨ ¸ È Ø è ø (8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø  ( 8 H X h x ˆ ˜ ¨ ¸ È Ø è ø !!(!8!H!X!h!x!ˆ!˜!¨!¸!È!Ø!è!ø!""("8"H"X"h"x"ˆ"˜"¨"¸"È"Ø"è"ø"##(#8#H#X#h#x#ˆ#˜#¨#¸#È#Ø#è#ø#$$($8$H$X$h$x$ˆ$˜$¨$¸$È$Ø$è$ø$%%(%8%H%X%h%x%ˆ%˜%¨%¸%È%Ø%è%ø%&&(&8&H&X&h&x&ˆ&˜&¨&¸&È&Ø&è&ø&''('8'H'X'h'x'ˆ'˜'¨'¸'È'Ø'è'ø'((((8(H(X(h(x(ˆ(˜(¨(¸(È(Ø(è(ø())()8)H)X)h)x)ˆ)˜)¨)¸)È)Ø)è)ø)**(*8*H*X*h*x*ˆ*˜*¨*¸*È*Ø*è*ø*++(+8+H+X+h+x+ˆ+˜+¨+¸+È+Ø+è+ø+,,(,8,H,X,h,x,ˆ,˜,¨,¸,È,Ø,è,ø,--(-8-H-X-h-x-ˆ-˜-¨-¸-È-Ø-è-ø-..(.8.H.X.h.x.ˆ.˜.¨.¸.È.Ø.è.ø.//(/8/H/X/h/x/ˆ/˜/¨/¸/È/Ø/è/ø/00(080H0X0h0x0ˆ0˜0¨0¸0È0Ø0è0ø011(181H1X1h1x1ˆ1˜1¨1¸1È1Ø1è1ø122(282H2X2h2x2ˆ2˜2¨2¸2È2Ø2è2ø233(383H3X3h3x3ˆ3˜3¨3¸3È3Ø3è3ø344(484H4X4h4x4ˆ4˜4¨4¸4È4Ø4è4ø455(585H5X5h5x5ˆ5˜5¨5¸5È5Ø5è5ø566(686H6X6h6x6ˆ6˜6¨6¸6È6Ø6è6ø677(787H7X7h7x7ˆ7˜7¨7¸7È7Ø7è7ø788(888H8X8h8x8ˆ8˜8¨8¸8È8Ø8è8ø899(9p9 x9 €9 ˆ9  9 °9 Ð9 H: 0; p; ; è; ð;  < ¨< À< à< è< ð< (= H= X= €= = Ø=  >  > À> ø>? ? `? ˜? ? è?ð?ø?@@@@ @(@0@8@@@H@P@X@`@h@p@x@€@ˆ@@˜@ @¨@°@¸@À@È@Ð@Ø@à@è@ð@ø@AAAA A(A0A8A@AHAPAXA`AhApAxA€AˆAA˜A A¨A°A¸AÀAÈAÐAØAàAèAðAøABBBB B(B0B8B@BHBPBXB`BhBpBxB€BˆBB˜B B¨B°B¸BÀBÈBÐBØBàBèBðBøBCCCC C(CHCPCXC`ChCpCˆC C˜C¨C °C¸CÈC ÐCØCèC ðCøCD DD(D@DHD XD ˆDD˜D D¨D°D¸DÀDÈDÐDØDàDEE E HEPEXE`EhEpE E ÀE øEF F `F ˜FèFðFøFGGGG G(G0G8G@GHGPGXG`GhGpGxG€GˆGG˜G G¨G°G¸GÀGÈGÐGØGàGèGðGøGH(H 0H8HHH PHXHhH pHxHˆH H˜H I @I xI€I I àI JhJpJxJ€JˆJJ˜J J¨J°J¸JÀJÈJÐJØJàJèJðJøJKKKK K(K0K8K@KHKPKXK`KhKpKxK€KˆKK˜K K¨K°K¸KÀKÈKÐKØKàKèKðKøKLLLL L(L0L8L@LHLPLXL`LhLpLxL€LˆL¨L °L¸LÈL ÐLØLèL ðLøLM MM(M 0M8MHM PMXMhM pMxMˆM M˜M¨M °M¸MÈM ÐMØMèM ðMøM`N hN €N ¸NÀN ÐN O  O XO¨O°O¸OÀOÈOÐOØOàOèOðOøOPPPP P(P0P8P@PHPPPXP`PhPpPxP€PˆPP˜P P¨P°P¸PÀPÈPÐPØPàPèPðPøPQQQQ Q(Q0Q8Q@QHQPQXQ`QhQˆQ Q˜Q¨Q °Q¸QÈQ ÐQØQèQ ðQøQR RR(R 0R8RHR PRXRÀR ÈR àR S S 0S hS €S ¸STTT T(T0T8T@THTPTXT`ThTpTxT€TˆTT˜T T¨T°T¸TÀTÈTÐTØTàTèTðTøTUUUU U(U0U8U@UHUPUXU`UhUˆU U˜U¨U °U¸UÈU ÐUØUèU ðUøUV VV(V 0V8VHV PVXVhV pVxV V ÀV øV`W ˜W W èWðWøW8\@\H\P\X\`\h\p\x\€\ˆ\\˜\ \¨\°\¸\À\È\]  ] X]`] p] À] ø]^ H^P^X^`^h^p^x^€^ˆ^¨^°^¸^È^ Ð^Ø^è^ ð^ø^@_ H_ `_ ˜_ _ °_ è_ ` 8`ˆ``˜` `¨`°`¸`À`È`Ð`Ø`à`è`ð`ø`aaaa a(a0a8a@aHaPaXaha paxaˆa a˜a¨a °a¸a b @b xb€b b àb c c hcpcxc€cˆcc¨c°c¸cÈc ÐcØcèc ðcøcd dd(d 0d8dHd PdXdhd pdxd d¨d °d èdðdødeeee e(e0e8e@eHePeXe`ehepexe€eˆee˜e e¨e°e¸eÀeÈeÐeØeàeèeðeøeffff f(f 0f hfpfxf€fˆff¨f¸f gg g @g xg€g ˆg àg h h (h Xh hhphxh€hˆhh˜h h¨hÈhÐhØhàh i 8i@i  i Øiài (j0j8j@jHjPjhjpjxjÀj Èj àj k k 0k hk €k ¸kÀk lll l(l0l8l@lHlPlXl`lhlplxl€lˆll˜l l¨l°l¸lÀlÈlÐlØlèlðlølm mm(m 0m8mHm PmXmhm pmxmˆm m˜m¨m °m¸mÈm ÐmØmèm ðmøm n @n xn€n àn ohopoxo€o  o Øo@p xp€p ÈpÐpØpàpèpðpøpqqqq q@q Hq `q ˜qèq r 8r@r ˆrr˜r r¨r°r¸rÀrÈrÐrØràrèrs s  s Xs¨s Às øst HtPtXt€t ˆt  t Øtàt ðt (u @u xuÈuÐuØuàuèuðuøuvvvv v(v0v8v@vHvPvXv`vhvpvxv€vˆvv˜v v¨v°v¸vÀvÈvÐvØvàvèvðvøvwwww w(w0w8w@wHwPwXw`whwpwxw€wˆww˜w w¨w°w¸wÀwÈwÐwØwàwèwðwøwxxxx x(x0x8x@xHxhx pxxxˆx x˜x¨x °x¸xÈx ÐxØx y (y @y xy€y y Èy ày zhzpzxz€zˆzz˜z z¨z°z¸zÀzÈzÐzØzàzèzðzøz{{{{ {({0{8{@{H{P{X{`{h{p{x{€{ˆ{{˜{ {¨{°{¸{À{È{Ð{Ø{à{| ||(| 0|8|€| ˆ|  | Ø|à| ð| (} @} x}È}Ð}Ø}à}è}ð}ø}~~~~ ~(~0~8~@~H~P~X~`~h~p~x~€~¨~ °~¸~È~ Ð~Ø~è~ ð~ø~@ H ` ˜  ° è € 8€ˆ€€˜€ €¨€°€¸€À€È€è€ ð€ø€@ ` ˜  ° ‚ 8‚ˆ‚‚˜‚ ‚¨‚°‚¸‚À‚È‚ЂØ‚à‚è‚ð‚ø‚ƒƒƒ(ƒ 0ƒ8ƒHƒ PƒXƒhƒ pƒxƒˆƒ ƒ˜ƒ¨ƒÀƒ ȃ àƒ „ „ h„ €„ ¸„……… …(…0…`… h… €… ¸…À… Ð… †  † X†¨†°†¸†À†ȆІ؆à†è†ð†ø†‡‡‡‡ ‡(‡0‡8‡@‡H‡P‡X‡`‡ˆ‡ ‡˜‡¨‡ °‡¸‡à‡ è‡ ˆ 8ˆ@ˆ ˆˆ  ˆ ؈àˆ (‰0‰8‰@‰H‰P‰h‰p‰x‰€‰ˆ‰‰ ‰¨‰ °‰ ¸‰ è‰ð‰ø‰ŠŠŠŠ Š(Š0Š8Š@ŠHŠPŠXŠhŠpŠxŠ€ŠˆŠŠ˜Š Š¨ŠÀŠ ÈŠ àŠ ‹ ‹ h‹ €‹ ¸‹À‹ ŒŒŒ Œ(Œ0Œ8Œ@ŒHŒPŒXŒ`ŒhŒpŒxŒ€ŒˆŒŒ¨Œ°Œ¸ŒÀŒÈŒÐŒØŒàŒèŒ @ x€  à Ž Ž hŽpŽxŽ€ŽˆŽŽ˜Ž Ž¨Ž°Ž¸ŽÀŽÈŽÐŽØŽàŽèŽðŽøŽ (08@HPX`hpx€ˆ˜ ¨°¸ÀÈÐØàèðø (08@HPXhpxˆ ˜¨ ° ¸ À È Ð Ø à è ð ø ‘ ‘ ‘ ‘  ‘ (‘ 0‘ 8‘ @‘ H‘ P‘ X‘ `‘ h‘ p‘ x‘€‘ˆ‘‘˜‘ ‘¨‘°‘¸‘À‘È‘БØ‘à‘è‘ð‘ø‘’’’’ ’(’0’8’@’H’P’X’`’h’p’x’€’ˆ’’˜’ ’¨’ °’ ¸’ À’ È’ Ð’ Ø’ à’ è’ ð’ ø’ “ “ “ “  “ 8“X“x“˜“¸“Ø“ø“”8”X”x”˜”¸”Ø”ø”•8•X•x•˜•¸•Ø•ø•–8–X–x–˜–¸–Ø–ø–—8—X—x—˜—¸—Ø—ø—˜8˜X˜x˜˜˜¸˜ؘø˜™8™X™x™˜™¸™Ø™ø™š8šXšxš˜š¸šØšøš›8›X›x›˜›¸›Ø›ø›œ8œXœxœ˜œ¸œØœøœ8Xx˜¸Øøž8žXžxž˜ž¸žØžøžŸ8ŸXŸxŸ˜Ÿ¸ŸØŸøŸ 8 X x ˜ ¸ Ø ø ¡8¡X¡x¡˜¡¸¡Ø¡ø¡¢8¢X¢x¢˜¢¸¢Ø¢ø¢£8£X£x£˜£¸£Ø£ø£¤8¤X¤x¤˜¤¸¤ؤø¤¥8¥X¥x¥˜¥¸¥Ø¥ø¥¦8¦X¦x¦˜¦¸¦ئø¦§8§X§x§˜§¸§اø§¨8¨X¨x¨˜¨¸¨بø¨©8©X©x©˜©¸©Ø©ø©ª8ªXªxª˜ª¸ªتøª«8«X«x«˜«¸«Ø«ø«¬8¬X¬x¬˜¬¸¬جø¬­8­X­x­˜­¸­Ø­ø­®8®X®x®˜®¸®Ø®@° H° P° X° `° h° p° x° ­$  3   !!           ! &%                   *           '     '"!       ,!     M                                            !  &         ¯#Ü b         '0  › N   ,5                 6 c*      1     4   7      !                                    +   (      .&'          +;                               "                          #              ! &               YDK            0   '  )  . <     5 % %      %        "  1   %         ! &      '        ;T G <]     +  $ £        p     !     ,  ! &   !   $              .     4 F           ;        ! ! ! !            (       $       * N  )           T †  B  b  E        2  +  +  !    ,    # ! &  & 4%#       ; </; ?!‡   R%2*  !      %       F4                             '  0  %     7   "3          3   *0                         #   &&           1!   *           0    %       . %   "!    "           "                  (    '9    #                            $         +  -     ."                                %     !  "          7 ' * !  &( *       1     !      %           )  !           @     6              ! &   !          !          "  "        #                               &    *   "         /  "       %   H  5 $      ! &     !    ( !      /!  I  $           $ (    +    ?(   + \     ´Ž˜¸)‘ƒ  À'P8f•Ïø â  Å0 ÉL @ßq €ü— €ô¹  ÖÕ àù  €ï( óI À i @ñˆ À¬ @ÿÒ çü ÀÒ àè< ù` Ý{ `Η @´ ÀêÛ  ¾ó ` î> èáe øá‘ ðẠâç àá â7 ˆÅW €Å ˜Åœ Åà ðÈë É  ÈÈ; ØÈ^ ɉ èȹ ÀÈé øÈ àÈ3 ÉT ÐÈ} (ߪ ßÓ 0ß `ü- püi hü™ pôà hôñ `ô  xôK  f  ÿ–  Òà  ˜Òï  €Ò  °ÒE  ˆÒq  ¸ÒŸ   ÒÊ  ¨Òð  ù$  ùS  àÜy  èÜœ  @ÎÀ  0Îç  HÎ  (Î6  8Îb  PΈ  κ  (á    8'  0K  ¨êz   êµ  ¸êà  ˆê êM ˜ê€ €ê¸ °êü €¾ h¾> x¾\ p¾x `¾” HÐ @ Àâ( @ÆD ÀÉd àß ý· õÝ @×ý €% À > ð\  ó ` ¥ àñÈ `ð àÿ ÀçH `Óm €é Àù¸  Ý× Ï÷ à `ëC @¿_  Àî² hÜÏ ,Üß 4Üô Ü  pÜ' Ü9 XÜU PÜt `Ü ˆÜª °Ü¸ ÜË ¸Üã Üø Øò àò$ èò8 ÐòY Üm @܉ ܦ ܼ 0ÜÍ xÜä €Ü÷ Ü (Ü% ˜ÜB HÜX ¨Üo Ü  Ü– 8ܬ ÀÜÌ $Üç Üû ¨ ÈÜAeLêeZo“¦°Á Ô ç   3 > H W lv†˜©¸Æ×á ð ù *T| ’®Ð0Je‡Ž§½Ýó& <\s ¥ º Õë !6L g „¨ Êì& =Rn ¨ÇÞó  4Pk ˆ¯Åæ 7G b‡  ÂÈ ßï   1 D X b j q x  …  •  ¬  Ç Ï × é ù !'!A!J!R!Y!b!o!w!!‰!!—!Ÿ!¨!±!¹!Ç!8=Õ@9ÖØ9Ö8:Ö(;Ö˜;ÖØ;Ö`<Ö°<Ö =ÖÈ=Ö8;×(<׸=×ð=×È9Ø:Ø :ØÈ:ØØ:Ø;ذ;ØÀ;ØÐ;Ø<ØH<Øø<Ø0=Øx=ØP>ØP9Ù:ÙP:Ùð:Ùh;Ùè:Ú˜=Ú˜9ÛX:Û ;Ûè9Ü(:ܨ;Üø;Ü0<ÜP<Ü=Ü>Ü>Üð9Ý0:Ý<Ý8<ÝX<Ý=ÝX9Þ¸;Þ8>Þ:ßh:ß<ßp<ßÈ<ß=ߨ=ßè=ß@>ßÀ:à0>á˜<â89ãp:ãø:ã`;ã ;ãÐ=ã:ä¸9å`:å :å:æh9ç@;ç<ç@=çP=ç`=ç09èˆ;èh=èà=è>è¨>é¨Eé(Ié¨Vé]é(bé(géèhéˆoéHé(éH;ê€<ë°=ë¸:ì;í@:î¨9ïø9ïÐ:ïà:ï;ï;ïX;ï€;ïÈ;ï@<ï=ï =ïp=ïH>ïP;ðà;ðh<ðˆ<ðˆ=ð <ñÀ=ñø=ñ9òH9óx:ó˜:ó<óˆ:ôØ<ô°:õÐ<õx;ö>ö`9÷À9ø(nùà9ú¨:úx<ú¸<ú(>ú€:û(¯üð¯ü8°ü¨¯ý@?þH?þ@FþHFþÀIþÈIþOþ`Sþ@WþHWþ ]þ¨]þà_þÀbþÈbþÀgþÈgþ€iþˆiþ`kþÀnþ pþ(pþàqþ sþ uþÀyþ }þàþàþèþ`„þ†þ€ˆþ`‹þÀþÈþÈnÿ(“H“h“ˆ“¨“ȓ蓔(”H”h”ˆ”¨”Ȕ蔕(•H•h•ˆ•¨•ȕ蕖(–H–h–ˆ–¨–È–è–—(—H—h—ˆ—¨—È—è—˜(˜H˜h˜ˆ˜¨˜Ș蘙(™H™h™ˆ™¨™È™è™š(šHšhšˆš¨šÈšèš›(›H›h›ˆ›¨›È›è›œ(œHœhœˆœ¨œÈœèœ(Hhˆ¨Èèž(žHžhžˆž¨žÈžèžŸ(ŸHŸhŸˆŸ¨ŸÈŸèŸ ( H h ˆ ¨ È è ¡(¡H¡h¡ˆ¡¨¡È¡è¡¢(¢H¢h¢ˆ¢¨¢È¢è¢£(£H£h£ˆ£¨£È£è£¤(¤H¤h¤ˆ¤¨¤Ȥ褥(¥H¥h¥ˆ¥¨¥È¥è¥¦(¦H¦h¦ˆ¦¨¦Ȧ覧(§H§h§ˆ§¨§ȧ觨(¨H¨h¨ˆ¨¨¨Ȩ訩(©H©h©ˆ©¨©È©è©ª(ªHªhªˆª¨ªȪ誫(«H«h«ˆ«¨«È«è«¬(¬H¬h¬ˆ¬¨¬Ȭ謭(­H­h­ˆ­¨­È­è­®(®H®h®ˆ®¨®È®°>P?°EPF0IÐIpNOÐRpS°VPW]°]P_ð_0bÐb0gÐgðhiÐjpk0nÐno0pPqðqs°st0u0yÐy|0}PðPðЃp„p…†ð‡ˆЊp‹0и> X? ¸E XF 8I ØI xN O ØR xS ¸V XW ] ¸] X_ ø_ 8b Øb 8g Øg øh ˜i Øj xk 8n Øn ˜o 8p Xq øq s ¸s ˜t 8u 8y Øy ˜| 8} X ø X ø ؃ x„ x… † ø‡ ˜ˆ ØŠ x‹ 8 Ø °@€ °  €ðÀ`PP € À$%°+ð+ ,@,°,P/p/@00 0P1Ð1à1ð12p205`5Ð89 ÀÐàð 0@P`p€ °ÀÐàð 0P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p °ÀÐàð 0@P`p€ °ÀÐàð   0 @ P ` p €    ° À Ð à ð    0 @ P ` p €    ° À Ð à ð    0 @ P ` p €    ° À Ð à ð    0 @ P ` p €    ° À Ð à ð    0 @ P ` p €   À Ð à ð  0@P`p€ °ÀÐàð0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@Pp€ °ÀÐàð 0@P`p °ÀÐà 0@P`p€°ÀÐàð 0@P`p€ °Ðàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@Pp€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@`p °ÀÐàð   0 @ ` p    ° À Ð à ð !! !0!@!P!`!p!€!! !°!À!Ð!à!ð!"" "0"@"P"`"p"€"" "°"À"Ð"à"ð"## #0#@#P#`#p#€## #°#À#Ð#à#ð#$$ $0$@$P$`$p$€$$ $°$Ð$à$ð$% %0%@%P%`%p%€%% %°%À%Ð%à%ð%&& &0&@&P&`&p&€&& &°&À&Ð&à&ð&'' '0'@'P'`'p'€'' '°'À'Ð'à'ð'(( (0(@(P(`(p(€(( (°(À(Ð(à(ð()) )0)@)P)`)p)€)) )°)À)Ð)à)ð)** *0*@*P*`*p*€** *°*À*Ð*à*ð*++ +0+@+P+`+p+€++ +À+Ð+à+,,0,P,`,p,€,, ,À,Ð,à,ð,-- -0-@-P-`-p-€-- -°-À-Ð-à-ð-.. .0.@.P.`.p.€.. .°.À.Ð.à.ð.// /0/@/`/€// /°/À/Ð/à/ð/00 000P0`0p0€0°0À0Ð0à0ð011 101@1`1p1€11 1°1À12 202@2P2`2€22 2°2À2Ð2à2ð233 303@3P3`3p3€33 3°3À3Ð3à3ð344 404@4P4`4p4€44 4°4À4Ð4à4ð455 5@5P5p5€55 5°5À5Ð5à5ð566 606@6P6`6p6€66 6°6À6Ð6à6ð677 707@7P7`7p7€77 7°7À7Ð7à7ð788 808@8P8`8p8€88 8°8À8à8ð89 9` €xE¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÌÏÑÓ     !"#$%&'()*ÍÔÊËÎÈÒÆÐÅÇÁÂÃÉĨ©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÌÏÑÓ     !"#$%&'()*.objc_category_name_NTSynchronousTask_Notifications.objc_category_name_NTSynchronousTask_Private.objc_category_name_SUPlainInstaller_Internals.objc_category_name_SUPlainInstaller_MMExtendedAttributes.objc_category_name_SUUnarchiver_Private_OBJC_CLASS_$_NTSynchronousTask_OBJC_CLASS_$_SUAppcast_OBJC_CLASS_$_SUAppcastItem_OBJC_CLASS_$_SUAutomaticUpdateAlert_OBJC_CLASS_$_SUAutomaticUpdateDriver_OBJC_CLASS_$_SUBasicUpdateDriver_OBJC_CLASS_$_SUDSAVerifier_OBJC_CLASS_$_SUDiskImageUnarchiver_OBJC_CLASS_$_SUHost_OBJC_CLASS_$_SUInstaller_OBJC_CLASS_$_SUPackageInstaller_OBJC_CLASS_$_SUPipedUnarchiver_OBJC_CLASS_$_SUPlainInstaller_OBJC_CLASS_$_SUProbingUpdateDriver_OBJC_CLASS_$_SUScheduledUpdateDriver_OBJC_CLASS_$_SUStandardVersionComparator_OBJC_CLASS_$_SUStatusController_OBJC_CLASS_$_SUSystemProfiler_OBJC_CLASS_$_SUUIBasedUpdateDriver_OBJC_CLASS_$_SUUnarchiver_OBJC_CLASS_$_SUUpdateAlert_OBJC_CLASS_$_SUUpdateDriver_OBJC_CLASS_$_SUUpdatePermissionPrompt_OBJC_CLASS_$_SUUpdater_OBJC_CLASS_$_SUUserInitiatedUpdateDriver_OBJC_CLASS_$_SUWindowController_OBJC_IVAR_$_NTSynchronousTask.mv_done_OBJC_IVAR_$_NTSynchronousTask.mv_inputPipe_OBJC_IVAR_$_NTSynchronousTask.mv_output_OBJC_IVAR_$_NTSynchronousTask.mv_outputPipe_OBJC_IVAR_$_NTSynchronousTask.mv_result_OBJC_IVAR_$_NTSynchronousTask.mv_task_OBJC_IVAR_$_SUAppcast.delegate_OBJC_IVAR_$_SUAppcast.downloadFilename_OBJC_IVAR_$_SUAppcast.items_OBJC_IVAR_$_SUAppcast.userAgentString_OBJC_IVAR_$_SUAppcastItem.DSASignature_OBJC_IVAR_$_SUAppcastItem.date_OBJC_IVAR_$_SUAppcastItem.displayVersionString_OBJC_IVAR_$_SUAppcastItem.fileURL_OBJC_IVAR_$_SUAppcastItem.itemDescription_OBJC_IVAR_$_SUAppcastItem.minimumSystemVersion_OBJC_IVAR_$_SUAppcastItem.propertiesDictionary_OBJC_IVAR_$_SUAppcastItem.releaseNotesURL_OBJC_IVAR_$_SUAppcastItem.tag_OBJC_IVAR_$_SUAppcastItem.title_OBJC_IVAR_$_SUAppcastItem.versionString_OBJC_IVAR_$_SUAutomaticUpdateAlert.delegate_OBJC_IVAR_$_SUAutomaticUpdateAlert.host_OBJC_IVAR_$_SUAutomaticUpdateAlert.updateItem_OBJC_IVAR_$_SUAutomaticUpdateDriver.alert_OBJC_IVAR_$_SUAutomaticUpdateDriver.postponingInstallation_OBJC_IVAR_$_SUAutomaticUpdateDriver.showErrors_OBJC_IVAR_$_SUBasicUpdateDriver.download_OBJC_IVAR_$_SUBasicUpdateDriver.downloadPath_OBJC_IVAR_$_SUBasicUpdateDriver.relaunchPath_OBJC_IVAR_$_SUBasicUpdateDriver.updateItem_OBJC_IVAR_$_SUHost.bundle_OBJC_IVAR_$_SUScheduledUpdateDriver.showErrors_OBJC_IVAR_$_SUStatusController.actionButton_OBJC_IVAR_$_SUStatusController.buttonTitle_OBJC_IVAR_$_SUStatusController.host_OBJC_IVAR_$_SUStatusController.maxProgressValue_OBJC_IVAR_$_SUStatusController.progressBar_OBJC_IVAR_$_SUStatusController.progressValue_OBJC_IVAR_$_SUStatusController.statusText_OBJC_IVAR_$_SUStatusController.title_OBJC_IVAR_$_SUUIBasedUpdateDriver.statusController_OBJC_IVAR_$_SUUIBasedUpdateDriver.updateAlert_OBJC_IVAR_$_SUUnarchiver.archivePath_OBJC_IVAR_$_SUUnarchiver.delegate_OBJC_IVAR_$_SUUpdateAlert.delegate_OBJC_IVAR_$_SUUpdateAlert.description_OBJC_IVAR_$_SUUpdateAlert.host_OBJC_IVAR_$_SUUpdateAlert.releaseNotesSpinner_OBJC_IVAR_$_SUUpdateAlert.releaseNotesView_OBJC_IVAR_$_SUUpdateAlert.updateItem_OBJC_IVAR_$_SUUpdateAlert.webViewFinishedLoading_OBJC_IVAR_$_SUUpdateDriver.appcastURL_OBJC_IVAR_$_SUUpdateDriver.finished_OBJC_IVAR_$_SUUpdateDriver.host_OBJC_IVAR_$_SUUpdateDriver.updater_OBJC_IVAR_$_SUUpdatePermissionPrompt.delegate_OBJC_IVAR_$_SUUpdatePermissionPrompt.descriptionTextField_OBJC_IVAR_$_SUUpdatePermissionPrompt.host_OBJC_IVAR_$_SUUpdatePermissionPrompt.isShowingMoreInfo_OBJC_IVAR_$_SUUpdatePermissionPrompt.moreInfoButton_OBJC_IVAR_$_SUUpdatePermissionPrompt.moreInfoView_OBJC_IVAR_$_SUUpdatePermissionPrompt.shouldSendProfile_OBJC_IVAR_$_SUUpdatePermissionPrompt.systemProfileInformationArray_OBJC_IVAR_$_SUUpdater.checkTimer_OBJC_IVAR_$_SUUpdater.delegate_OBJC_IVAR_$_SUUpdater.driver_OBJC_IVAR_$_SUUpdater.host_OBJC_IVAR_$_SUUpdater.tags_OBJC_IVAR_$_SUUserInitiatedUpdateDriver.checkingController_OBJC_IVAR_$_SUUserInitiatedUpdateDriver.isCanceled_OBJC_METACLASS_$_NTSynchronousTask_OBJC_METACLASS_$_SUAppcast_OBJC_METACLASS_$_SUAppcastItem_OBJC_METACLASS_$_SUAutomaticUpdateAlert_OBJC_METACLASS_$_SUAutomaticUpdateDriver_OBJC_METACLASS_$_SUBasicUpdateDriver_OBJC_METACLASS_$_SUDSAVerifier_OBJC_METACLASS_$_SUDiskImageUnarchiver_OBJC_METACLASS_$_SUHost_OBJC_METACLASS_$_SUInstaller_OBJC_METACLASS_$_SUPackageInstaller_OBJC_METACLASS_$_SUPipedUnarchiver_OBJC_METACLASS_$_SUPlainInstaller_OBJC_METACLASS_$_SUProbingUpdateDriver_OBJC_METACLASS_$_SUScheduledUpdateDriver_OBJC_METACLASS_$_SUStandardVersionComparator_OBJC_METACLASS_$_SUStatusController_OBJC_METACLASS_$_SUSystemProfiler_OBJC_METACLASS_$_SUUIBasedUpdateDriver_OBJC_METACLASS_$_SUUnarchiver_OBJC_METACLASS_$_SUUpdateAlert_OBJC_METACLASS_$_SUUpdateDriver_OBJC_METACLASS_$_SUUpdatePermissionPrompt_OBJC_METACLASS_$_SUUpdater_OBJC_METACLASS_$_SUUserInitiatedUpdateDriver_OBJC_METACLASS_$_SUWindowController_SUAllowsAutomaticUpdatesKey_SUAppcastError_SUAppcastParseError_SUAuthenticationFailure_SUAutomaticallyUpdateKey_SUDowngradeError_SUEnableAutomaticChecksKey_SUEnableAutomaticChecksKeyOld_SUEnableSystemProfilingKey_SUExpectsDSASignatureKey_SUFeedURLKey_SUFileCopyFailure_SUHasLaunchedBeforeKey_SUInstallationError_SUInstallerDelegateKey_SUInstallerHostKey_SUInstallerPathKey_SUInstallerVersionComparatorKey_SULastCheckTimeKey_SULastProfileSubmitDateKey_SUMissingInstallerToolError_SUMissingUpdateError_SUNoUpdateError_SUPublicDSAKeyFileKey_SUPublicDSAKeyKey_SURelaunchError_SURunningFromDiskImageError_SUScheduledCheckIntervalKey_SUSendProfileInfoKey_SUShowReleaseNotesKey_SUSignatureError_SUSkippedVersionKey_SUSparkleErrorDomain_SUTechnicalErrorInformationKey_SUTemporaryDirectoryError_SUUnarchivingError_SUUpdateDriverFinishedNotification_SUUpdaterWillRestartNotification_b64decode_load_dsa_key_AuthorizationCreate_AuthorizationExecuteWithPrivileges_AuthorizationFree_BIO_free_BIO_new_mem_buf_CFBooleanGetValue_CFMakeCollectable_CFPreferencesCopyAppValue_CFPreferencesSetValue_CFPreferencesSynchronize_CFRelease_CFRetain_CFURLGetFSRef_CGWindowLevelForKey_DSA_free_EVP_DigestInit_EVP_DigestUpdate_EVP_PKEY_assign_EVP_PKEY_free_EVP_PKEY_new_EVP_VerifyFinal_EVP_dss1_FSIsAliasFile_Gestalt_GetCurrentProcess_NSApp_NSAppKitVersionNumber_NSApplicationDidBecomeActiveNotification_NSApplicationWillTerminateNotification_NSDefaultRunLoopMode_NSEventTrackingRunLoopMode_NSFileHandleNotificationDataItem_NSFileHandleReadToEndOfFileCompletionNotification_NSFileSize_NSFileType_NSFileTypeDirectory_NSFileTypeForHFSTypeCode_NSLocalizedDescriptionKey_NSLocalizedFailureReasonErrorKey_NSLog_NSModalPanelRunLoopMode_NSSelectorFromString_NSTaskDidTerminateNotification_NSTemporaryDirectory_NSWorkspaceRecycleOperation_OBJC_CLASS_$_NSAlert_OBJC_CLASS_$_NSArray_OBJC_CLASS_$_NSAutoreleasePool_OBJC_CLASS_$_NSBundle_OBJC_CLASS_$_NSCharacterSet_OBJC_CLASS_$_NSData_OBJC_CLASS_$_NSDate_OBJC_CLASS_$_NSDictionary_OBJC_CLASS_$_NSError_OBJC_CLASS_$_NSException_OBJC_CLASS_$_NSFileManager_OBJC_CLASS_$_NSFont_OBJC_CLASS_$_NSImage_OBJC_CLASS_$_NSInvocation_OBJC_CLASS_$_NSMutableArray_OBJC_CLASS_$_NSMutableCharacterSet_OBJC_CLASS_$_NSMutableDictionary_OBJC_CLASS_$_NSMutableURLRequest_OBJC_CLASS_$_NSNotificationCenter_OBJC_CLASS_$_NSNumber_OBJC_CLASS_$_NSObject_OBJC_CLASS_$_NSPipe_OBJC_CLASS_$_NSProcessInfo_OBJC_CLASS_$_NSProgressIndicator_OBJC_CLASS_$_NSRunLoop_OBJC_CLASS_$_NSSortDescriptor_OBJC_CLASS_$_NSString_OBJC_CLASS_$_NSTask_OBJC_CLASS_$_NSThread_OBJC_CLASS_$_NSTimer_OBJC_CLASS_$_NSURL_OBJC_CLASS_$_NSURLDownload_OBJC_CLASS_$_NSURLRequest_OBJC_CLASS_$_NSUserDefaults_OBJC_CLASS_$_NSUserDefaultsController_OBJC_CLASS_$_NSValue_OBJC_CLASS_$_NSWindowController_OBJC_CLASS_$_NSWorkspace_OBJC_CLASS_$_NSXMLDocument_OBJC_EHTYPE_$_NSException_OBJC_EHTYPE_id_OBJC_METACLASS_$_NSObject_OBJC_METACLASS_$_NSWindowController_PEM_read_bio_DSA_PUBKEY_ProcessInformationCopyDictionary_SHA1_UTGetOSTypeFromString__Unwind_Resume___CFConstantStringClassReference___error___objc_personality_v0__objc_empty_cache__objc_empty_vtable_closedir_fclose_floor_fopen_fread_free_fwrite_getuid_kCFPreferencesAnyHost_kCFPreferencesCurrentUser_malloc_memset_objc_begin_catch_objc_end_catch_objc_msgSendSuper2_fixup_objc_msgSend_fixup_objc_msgSend_stret_fixup_opendir_pclose_popen_readdir_removexattr_setenv_signal_snprintf_stat_statfs_strcmp_strlcat_strlcpy_strlen_sysctlbyname_waittransmission-2.92/macosx/Sparkle.framework/PaxHeaders.4960/Headers0000644000000000000000000000013212442116661022046 xustar0030 mtime=1418239409.649023186 30 atime=1418239409.563021713 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Headers/0000755000175000017500000000000012442116661023550 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Headers/PaxHeaders.4960/Sparkle.h0000644000000000000000000000013212442116661023675 xustar0030 mtime=1418239409.648023169 30 atime=1418239409.648023169 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Headers/Sparkle.h0000644000175000017500000000103012442116661025314 0ustar00mikedldmikedld00000000000000// // Sparkle.h // Sparkle // // Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07) // Copyright 2006 Andy Matuschak. All rights reserved. // #ifndef SPARKLE_H #define SPARKLE_H // This list should include the shared headers. It doesn't matter if some of them aren't shared (unless // there are name-space collisions) so we can list all of them to start with: #import #import #import #import #endif transmission-2.92/macosx/Sparkle.framework/Headers/PaxHeaders.4960/SUVersionComparisonProtocol.h0000644000000000000000000000013212442116661027746 xustar0030 mtime=1418239409.647023152 30 atime=1418239409.647023152 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Headers/SUVersionComparisonProtocol.h0000644000175000017500000000130112442116661031366 0ustar00mikedldmikedld00000000000000// // SUVersionComparisonProtocol.h // Sparkle // // Created by Andy Matuschak on 12/21/07. // Copyright 2007 Andy Matuschak. All rights reserved. // #ifndef SUVERSIONCOMPARISONPROTOCOL_H #define SUVERSIONCOMPARISONPROTOCOL_H /*! @protocol @abstract Implement this protocol to provide version comparison facilities for Sparkle. */ @protocol SUVersionComparison /*! @method @abstract An abstract method to compare two version strings. @discussion Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, and NSOrderedSame if they are equivalent. */ - (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; @end #endif transmission-2.92/macosx/Sparkle.framework/Headers/PaxHeaders.4960/SUAppcastItem.h0000644000000000000000000000013212442116661024756 xustar0030 mtime=1418239409.648023169 30 atime=1418239409.648023169 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Headers/SUAppcastItem.h0000644000175000017500000000203312442116661026401 0ustar00mikedldmikedld00000000000000// // SUAppcastItem.h // Sparkle // // Created by Andy Matuschak on 3/12/06. // Copyright 2006 Andy Matuschak. All rights reserved. // #ifndef SUAPPCASTITEM_H #define SUAPPCASTITEM_H @interface SUAppcastItem : NSObject { NSString *title; NSDate *date; NSString *itemDescription; NSURL *releaseNotesURL; NSString *DSASignature; NSString *minimumSystemVersion; NSString *tag; NSURL *fileURL; NSString *versionString; NSString *displayVersionString; NSDictionary *propertiesDictionary; } // Initializes with data from a dictionary provided by the RSS class. - initWithDictionary:(NSDictionary *)dict; - (NSString *)title; - (NSString *)versionString; - (NSString *)displayVersionString; - (NSDate *)date; - (NSString *)itemDescription; - (NSURL *)releaseNotesURL; - (NSURL *)fileURL; - (NSString *)DSASignature; - (NSString *)minimumSystemVersion; - (NSString *)tag; // Returns the dictionary provided in initWithDictionary; this might be useful later for extensions. - (NSDictionary *)propertiesDictionary; @end #endif transmission-2.92/macosx/Sparkle.framework/Headers/PaxHeaders.4960/SUAppcast.h0000644000000000000000000000013212442116661024137 xustar0030 mtime=1418239409.649023186 30 atime=1418239409.649023186 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Headers/SUAppcast.h0000644000175000017500000000123012442116661025560 0ustar00mikedldmikedld00000000000000// // SUAppcast.h // Sparkle // // Created by Andy Matuschak on 3/12/06. // Copyright 2006 Andy Matuschak. All rights reserved. // #ifndef SUAPPCAST_H #define SUAPPCAST_H @class SUAppcastItem; @interface SUAppcast : NSObject { NSArray *items; NSString *userAgentString; id delegate; NSString *downloadFilename; } - (void)fetchAppcastFromURL:(NSURL *)url; - (void)setDelegate:delegate; - (void)setUserAgentString:(NSString *)userAgentString; - (NSArray *)items; @end @interface NSObject (SUAppcastDelegate) - (void)appcastDidFinishLoading:(SUAppcast *)appcast; - (void)appcast:(SUAppcast *)appcast failedToLoadWithError:(NSError *)error; @end #endif transmission-2.92/macosx/Sparkle.framework/Headers/PaxHeaders.4960/SUUpdater.h0000644000000000000000000000013212442116661024150 xustar0030 mtime=1418239409.648023169 30 atime=1418239409.648023169 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Headers/SUUpdater.h0000644000175000017500000001162212442116661025577 0ustar00mikedldmikedld00000000000000// // SUUpdater.h // Sparkle // // Created by Andy Matuschak on 1/4/06. // Copyright 2006 Andy Matuschak. All rights reserved. // #ifndef SUUPDATER_H #define SUUPDATER_H #import @class SUUpdateDriver, SUAppcastItem, SUHost, SUAppcast; @interface SUUpdater : NSObject { NSTimer *checkTimer; SUUpdateDriver *driver; SUHost *host; IBOutlet id delegate; NSSet *tags; } + (SUUpdater *)sharedUpdater; + (SUUpdater *)updaterForBundle:(NSBundle *)bundle; - initForBundle:(NSBundle *)bundle; - (NSBundle *)hostBundle; - (void)setDelegate:(id)delegate; - delegate; - (void)setAutomaticallyChecksForUpdates:(BOOL)automaticallyChecks; - (BOOL)automaticallyChecksForUpdates; - (void)setUpdateCheckInterval:(NSTimeInterval)interval; - (NSTimeInterval)updateCheckInterval; - (void)setFeedURL:(NSURL *)feedURL; - (NSURL *)feedURL; - (void)setSendsSystemProfile:(BOOL)sendsSystemProfile; - (BOOL)sendsSystemProfile; - (void)setAutomaticallyDownloadsUpdates:(BOOL)automaticallyDownloadsUpdates; - (BOOL)automaticallyDownloadsUpdates; - (void)setAllowedTags:(NSSet *)aTags; - (NSSet *)allowedTags; // This IBAction is meant for a main menu item. Hook up any menu item to this action, // and Sparkle will check for updates and report back its findings verbosely. - (IBAction)checkForUpdates:sender; // This kicks off an update meant to be programmatically initiated. That is, it will display no UI unless it actually finds an update, // in which case it proceeds as usual. If the fully automated updating is turned on, however, this will invoke that behavior, and if an // update is found, it will be downloaded and prepped for installation. - (void)checkForUpdatesInBackground; // Date of last update check. Returns null if no check has been performed. - (NSDate*)lastUpdateCheckDate; // This begins a "probing" check for updates which will not actually offer to update to that version. The delegate methods, though, // (up to updater:didFindValidUpdate: and updaterDidNotFindUpdate:), are called, so you can use that information in your UI. - (void)checkForUpdateInformation; // Call this to appropriately schedule or cancel the update checking timer according to the preferences for time interval and automatic checks. This call does not change the date of the next check, but only the internal NSTimer. - (void)resetUpdateCycle; - (BOOL)updateInProgress; @end @interface NSObject (SUUpdaterDelegateInformalProtocol) // This method allows you to add extra parameters to the appcast URL, potentially based on whether or not Sparkle will also be sending along the system profile. This method should return an array of dictionaries with keys: "key", "value", "displayKey", "displayValue", the latter two being specifically for display to the user. - (NSArray *)feedParametersForUpdater:(SUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile; // Use this to override the default behavior for Sparkle prompting the user about automatic update checks. - (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SUUpdater *)bundle; // Implement this if you want to do some special handling with the appcast once it finishes loading. - (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast; // If you're using special logic or extensions in your appcast, implement this to use your own logic for finding // a valid update, if any, in the given appcast. - (SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SUUpdater *)bundle; // Sent when a valid update is found by the update driver. - (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)update; // Sent when a valid update is not found. - (void)updaterDidNotFindUpdate:(SUUpdater *)update; // Sent immediately before installing the specified update. - (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update; // Return YES to delay the relaunch until you do some processing; invoke the given NSInvocation to continue. - (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)update untilInvoking:(NSInvocation *)invocation; // Called immediately before relaunching. - (void)updaterWillRelaunchApplication:(SUUpdater *)updater; // This method allows you to provide a custom version comparator. // If you don't implement this method or return nil, the standard version comparator will be used. - (id )versionComparatorForUpdater:(SUUpdater *)updater; // Returns the path which is used to relaunch the client after the update is installed. By default, the path of the host bundle. - (NSString *)pathToRelaunchForUpdater:(SUUpdater *)updater; @end // Define some minimum intervals to avoid DOS-like checking attacks. These are in seconds. #ifdef DEBUG #define SU_MIN_CHECK_INTERVAL 60 #else #define SU_MIN_CHECK_INTERVAL 60*60 #endif #ifdef DEBUG #define SU_DEFAULT_CHECK_INTERVAL 60 #else #define SU_DEFAULT_CHECK_INTERVAL 60*60*24 #endif #endif transmission-2.92/macosx/Sparkle.framework/PaxHeaders.4960/Resources0000644000000000000000000000013212442116661022445 xustar0030 mtime=1418239409.264016589 30 atime=1418239403.867924117 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Resources/0000755000175000017500000000000012442116661024147 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/PaxHeaders.4960/fr.lproj0000644000000000000000000000013112442116657024205 xustar0030 mtime=1418239407.180980892 29 atime=1418239406.36796696 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/0000755000175000017500000000000012442116657025710 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/PaxHeaders.4960/SUAutomaticUpdateAlert0000644000000000000000000000013112442116656030535 xustar0029 mtime=1418239406.43096804 30 atime=1418239406.368966977 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116656033007 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000031312442116656030763 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 29 mtime=1418239406.43096804 29 atime=1418239406.43096804 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobject0000644000175000017500000001611512442116656035226 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯Ÿ 156<=AEPXfmnˆ‰‘’•–™¡§¨¬±ÈÉÌÏÙåîïðñòóôõ  "&'1238:?@CFIQRY^fgopqxy‚ƒŠ‹•–š›ž¢£¥¦§¨«¬¯´µº»ÅÆÇÈËÒÓÔÛÜÝäèìíîüÿ./0123456789:=@Wnopqrstuvwxyz{.|}~€„‡ŠU$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€ž€p€„€€€u€€ƒ€…€v€›€€€t€œ%€†Ò234[NSClassName€€_SUAutomaticUpdateAlertÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€S¨HIJKLMNO€ €€\€^€`€e€h€kÔQRSTVW]NSDestinationXNSSourceWNSLabel€€€ €×YZ[\]^_`abcd__NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabled[NSSuperview€ €€ €  € ÕYg\h+jkclZNSSubviews[NSFrameSize€€U€€T_{{102, 12}, {86, 32}}Ýopqrstuvwxyz{|}~€‚€V…†‡[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsþ€€€€€€€ Èÿÿÿÿ†‚@ÿWIgnorerÔŠ‹ŒŽVNSSizeVNSNameXNSfFlags€#@*€\LucidaGrandeÒ78“”¢”;VNSFontPÒ—˜•YNS.string€Ò78𛣛œ;_NSMutableStringXNSStringÒ78žŸ¤Ÿ [;\NSButtonCell\NSActionCellÒ78¢£¥£¤¥¦;XNSButtonYNSControlVNSView[NSResponder]doNotInstall:Ò78©ª£ª«;_NSNibControlConnector^NSNibConnectorÔQRS­®°€[€€€Zܲ³´µ¶·¸¹º»¼_¾¿}ÁÂÃÄÅÆÇ\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €Y€V€px€€€X€W€_{{139, 604}, {559, 152}}Ò—˜Ë€XNSWindowÒ—˜Î€TViewÒ>FÑ€S§ÒÓÔÕÖVØ€€/€>€B€G€ €LÙYZÚ[Û\]^_ÝÞdàáâd_ZNSEditable[NSDragTypes€ €.€' €(€  € Ò>?瀦èéêëìí€!€"€#€$€%€&_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{23, 73}, {64, 64}}Øoöu÷øyùúûüýüüþÿWNSStyleWNSAlignWNSScaleZNSAnimatesþ€-€)Ó2^NSResourceName€,€*€+WNSImage_NSApplicationIconÒ78 ¢ ;_NSCustomResourceÒ78  £ [;[NSImageCellÒ78¥¤¥¦;[NSImageView×YZ[\]^_âd_€ €=€0€1 € _{{105, 120}, {389, 17}}Øouvwy{}Ó !_NSBackgroundColor[NSTextColor€<€4€€2€/@€9ÔŠ‹ŒŽ$%€€3_LucidaGrande-BoldÕ()*+,-./0WNSColor\NSColorSpace[NSColorName]NSCatalogName€8€7€6€5VSystem\controlColorÓ)4,67WNSWhite€8K0.66666669Ò789(¢(;Õ()*+,<.=0€8€;€:€5_controlTextColorÓ)4,6B€8B0Ò78DE¤E [;_NSTextFieldCellÒ78GH¥H¤¥¦;[NSTextField×YZ[\]^_LMNd_€ €=€?€@ € _{{105, 81}, {435, 31}}Øouvwy{}VÔ !€<€4€€A€>€9ÔŠ‹Œ[]€#@&€ ×YZ[\]^_`abcd_€ €€C€D € _{{384, 12}, {162, 32}}Ýopqrstuvwxyz{|}~€kl€Õ…†‡€€€€F€E€€B_Installer et relancerQ ×YZ[\]^_`tucd_€ €€H€I € _{{220, 12}, {164, 32}}Ýopqrstuvwxyz{|}~€}~€Ö…†‡€€€€K€J€€G_Installer en quittantQ×YZ[\]^_`†‡cd_€ €€M€N € _{{105, 58}, {382, 18}}Ýopqrstuvwxyz{|}~ÅŽ}VØ…“”€€€P€€O€A€LH€f_value: descriptionText_descriptionText×Q¼½RS¾¿×ÂÓÚÅ€d€€j€b€/€i_value: titleTextYtitleText×Q¼½RS¾¿ßàÂØãÅ€d€l€o€b€L€nÒåæd_NSSharedInstance€m Ò78éê£êë;_NSUserDefaultsController\NSController_#value: values.SUAutomaticallyUpdate_values.SUAutomaticallyUpdateÒ>ïð€s«Ö_ÒØßV®ÔÓÕû€G€ €€L€l€ €€>€/€B€qÒ23þ€€r]NSApplicationÒ78¡¢¡;Ò>ï€s«_®______€ €€ € €€ €€ € € €Ò>ï€s¬Ö_ÒØßV®ÔÓÕû€G€€ €€L€l€ €€>€/€B€qÒ>ï!€s¬"#$%&'()*+,-€w€x€y€z€{€|€}€~€€€€€‚_#Push Button (Installer en quittant)\File's Owner\Content View_Image View (NSApplicationIcon)oPCheck Box (Automatiquement télécharger et installer les mises à jour à l'avenir)_Shared Defaults_Push Button (Ignorer)VWindow[Static Text]Static Text-1_#Push Button (Installer et relancer)[ApplicationÒ>ï<€s Ò>ï?€s Ò>ïB€s¯ÖMÒØLJV®ÔKIûH_ONßÓÕ€G€e€€L€`€\€ €€>€^€€q€ €€ €k€h€l€/€BÒ>ïY€s¯Z[\]^_`abcdefghijklm€‡€ˆ€‰€Š€‹€Œ€€Ž€€€‘€’€“€”€•€–€—€˜€™€š ! "ÿÿÿÿÿÿÿý#$ Ò>Fƒ€S Ò>s Ò>s Ò78‹Œ¢Œ;^NSIBObjectData"'1:?DRTf§­øÿ&BP\hv«¹ÌÞø!#%')+-/13<HJLenw‚‡–Ÿ²»ÆÈÉÒÙæìõ÷  )7@HJLNPm‡Ž—¡­¯±³µ¸¹»ÐÛçéëíï<H^s‚•§²¼ÊÜé÷üþ  &7>ENPY[^kty€Š”–Ÿ¦¸ÁÊÓàíö '5>E]l}ƒ…¶ÃÐÞèö 3=IKMOQVXZ\^`b}†ˆ‘šœ¡ª¬»½¿ÁÃÅÇÉîù         ! . 0 2 4 6 8 : V r ¦ ¾ ß ü  4 < D L W \ ^ ` b g h u „ † ˆ Š ’ ¦ ¯ ´ Ç Ð × ã ì ÷  " $ & ( ) + E f z † ˆ Š Œ Ž • — ¨ ª ¬ ¯ Ã Ø à í ù     % 2 : < > J S X m o q s u ˆ • — š £ ¬ ¾ Ç Ò Þ û ý ÿ     " C E G I K M O ` b k m p ‘ “ • ˜ ™ › ´ é ë í ï ñ ó õ ÷.024679R‡‰‹‘“•­¯ÌÎÐÒÔÕ×ð%')+-/138=ÈÑÝßáêóø-5@IPhs™ž±¸ÁÈßðòôöø+HR\{}ƒ…‡ ¦¸ÁÈàýÿ "4QSUWY[]pz—™›Ÿ¡£¬¿ÁÂËÒíú ?HJacegikmoqsuw€‚„’› ©«ÂÄÆÈÊÌÎÐÒÔÖØáãüþ  8:<>@BDFHJLNPvƒ±Tf~…‘ŸÅÑÚÜÝæèéòô!#%')+-/13579;=?ACEGPR}ƒ…‡‰‹‘“•—™›Ÿ¡£¥§©«­¯±³µ·¹»ÄÆÈÊÌÎÐÒÛÝÞçéêóõöÿtransmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000013012442116656030760 xustar0029 mtime=1418239406.43096804 29 atime=1418239406.43096804 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nib0000644000175000017500000000217012442116656035136 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController ACTIONS doNotInstall id installLater id installNow id CLASS SUAutomaticUpdateAlert LANGUAGE ObjC SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000012712442116656030766 xustar0029 mtime=1418239406.43096804 29 atime=1418239406.43096804 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nib0000644000175000017500000000066612442116656034444 0ustar00mikedldmikedld00000000000000 IBFramework Version 629 IBOldestOS 5 IBOpenObjects IBSystem Version 9D34 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/PaxHeaders.4960/SUUpdatePermissionProm0000644000000000000000000000013112442116657030606 xustar0030 mtime=1418239407.181980909 29 atime=1418239406.51796953 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/0000755000175000017500000000000012442116657033424 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031712442116657031143 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239407.181980909 30 atime=1418239407.180980892 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobje0000644000175000017500000003154412442116657035317 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯ 156<=AEW_wxy}„Ž˜¥¦¿ÀÈÉÌÍÑ×Þßèéêòóýþ "%-.56;BCOPUVWZV^aluvwxyz{|‡‹Œ’𛥩ª¬­®¯²³·¼½ÀÅÆËÌÑÖÞãôú '(,-05FMPUVYbchilov|ƒˆ‰ŒŽ”•˜¤¥¦©±²³¶½¾ÅÆÕÖÇÊËÐÑÝÞßàéêt£ìïòúûüý !"#%',-./7=DEFMNOVWX_`ax}‚ƒ„‡Š‹¤¼ÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéìï=>?@ABCDEFGHIJKLMNOPQRSTUV¶WXYZ [\]ž^adgU$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€Å€ç€€Ï€€æ€è€Ð€€€Î¢€éÒ234[NSClassName€€_SUUpdatePermissionPromptÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€R¯HIJKLMNOPQRSTUV€ €[€^€`€b€c€˜€š€¥€¬€·€¹€¼€¿€ÂÔXYZ[\^]NSDestinationXNSSourceWNSLabel€Z€ €€YÜ`abcdefghijklmnopqrstuv\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€€X€U€ px€ € €W€V€_{{115, 815}, {438, 168}}PÒz{|YNS.string€XNSWindowÒ78~£€;_NSMutableStringXNSStringÒz{ƒ€TViewÕ…†‡ˆ+Š‹Œ_NSNextResponderZNSSubviewsXNSvFlags[NSFrameSize€€T€€SÒ>F€R§‘’“”•–—€€€!€1€6€A€OØ…™š‡›œkŸ ¡¢£ktWNSFrameVNSCellYNSEnabled[NSSuperviewUNSTag€€€€ €_{{362, 12}, {62, 32}}Þ§¨©ª«¬­®¯°±²³´n¶t·¸¹·‘¼½¾t[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsÿÿÿÿ„þ€€ €€€€€Èÿÿÿÿ†‚@ÿSOuiÔÁÂÃÄÅÆÇVNSSizeVNSNameXNSfFlags€#@*€\LucidaGrandeÒ78ÊË¢Ë;VNSFontQ Ò78ÎϤÏК;\NSButtonCell\NSActionCellÒ78ÒÓ¥ÓÔÕÖ;XNSButtonYNSControlVNSView[NSResponder×…™š‡›œkŸÚÛ¢£k€€€€ €_{{296, 12}, {66, 32}}ݧ¨©ª«¬­®¯°±²à´n¶t·äå·’¼½¾þ€€ €€ €€€SNonQ×…™š‡›œkìíîï£k€€0€"€# €_{{104, 114}, {326, 34}}اô­®¯±õàö÷øù“ûü_NSBackgroundColor[NSTextColor€/€'€$€%€!@€,o-Rechercher automatiquement les mises à jour ?ÔÁÂÃÄÅ€€&_LucidaGrande-BoldÕ    WNSColor\NSColorSpace[NSColorName]NSCatalogName€+€*€)€(VSystem\controlColorÓWNSWhite€+K0.66666669Ò78¢;Õ  €+€.€-€(_controlTextColorÓ€+B0Ò78 !¤!К;_NSTextFieldCellÒ78#$¥$ÔÕÖ;[NSTextField×…™š‡›œkì()*£k€€0€2€3 €_{{104, 81}, {315, 42}}اô­®¯±õàö÷12”ûü€/€'€4€5€1€,_DO NOT LOCALIZEÔÁÂÃÄ8Æ:€#@&€ ×…™š‡›œkŸ>?ï£k€€€7€8 €_{{104, 53}, {294, 18}}Þ§¨D©ª«¬­®¯°±²³´nG¶sHnJ2•¼MN]NSNormalImage€€ €:€>€ €9€5€6€H?n€¦opqrst€C€D€E€F€G€H_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{23, 84}, {64, 64}}ا}­~±€‚ƒ„ƒt…£WNSStyleWNSAlignWNSScaleZNSAnimatesþ€M€K Ó2QRSŠ€=€;€L_NSApplicationIconÒ78Ž£Žš;[NSImageCellÒ78‘¥‘ÔÕÖ;[NSImageView×…™š‡›œkŸ•–—£k€€€P€Q €_{{80, 50}, {27, 26}}ܧ¨©ª¬­®¯°±²à´n¶žnn·—¼£¤€€ …€ € €€O€ÿÿÿÿ¸Ì@ÿÒ78¦§£§¨;^NSMutableArrayWNSArrayZ{438, 168}Ò78«Õ£ÕÖ;_{{0, 0}, {1600, 1178}}Z{213, 129}_{3.40282e+38, 3.40282e+38}Ò78°±¢±;_NSWindowTemplateVwindowÒ78´µ£µ¶;_NSNibOutletConnector^NSNibConnectorÔXYZ¸‘»€]€€€\]finishPrompt:Ò78¾¿£¿¶;_NSNibControlConnectorÔXYZ[—Ä€Z€O€€_^moreInfoButtonÔXYZ¸—Ê€]€€O€a_toggleMoreInfo:ÔXYZ¸’»€]€€€\ÔXYZ[ÓÕ€Z€d€€—×…†‡ˆ2×+ÙÚ*ÛÜÝ[NSExtension€€–€e€“€”€•Ò>Fà€R¢áâ€f€Û…ä™å†懜çèÓêëìíîïðÓòó[NSHScrollerXNSsFlags\NSScrollAmts[NSVScroller]NSContentView€d€‹€Ž€€gOA€A€€d€‡€hÒ>Fö€R£óòê€h€‡€‹Ù…™û†‡üýœáÿáYNScvFlagsYNSDocViewYNSBGColor€f€†€ƒ€i €j€„€fÒ>F €R¡€jß…  ô‡ˆ›œóƒ £"#ó%&_NSDraggingSourceMaskForNonLocalYNSTvFlags_NSAllowsTypeSelect\NSCornerView_NSIntercellSpacingWidth_NSColumnAutoresizingStyle_NSIntercellSpacingHeight[NSGridColor_NSDraggingSourceMaskForLocal^NSTableColumns[NSRowHeight€h€‚ÿÿÿÿÒÀ€z€l#@#@€k €€h€o#@,Z{356, 162}Ô…™‡+*+Œ€€n€m_{{346, 0}, {12, 17}}Ò78./¤/ÕÖ;]_NSCornerViewÒ>F2€R¢34€p€|Ù6789:;<=£?@ABCD^NSIsResizeable\NSHeaderCellWNSWidthZNSDataCell^NSResizingMaskZNSMinWidthZNSMaxWidth[NSTableView €{€q#@`€v#@D#@@€j×§ô­®±õGHIn2ƒLþ€u€r€ €5€sÓO€+K0.33333299Õ S €+€.€t€(_headerTextColorÒ78WX¥X!К;_NSTableHeaderCellاô­®¯±õZö\]2`ü!þ€/€x€w€5€j€,YText CellÕ f €+€z€y€(_textBackgroundColorÓk€+B1Ò78mn¢n;]NSTableColumnÙ6789:;<=£?rstCD €{€}#@dà€~€j×§ô­®±õGHIn2ƒL€u€r€ €5€sاô­®¯±õZö\]2`ü€/€x€w€5€j€,Õ… † €+€€€€(YgridColorÓ‹€+D0.5Ò78=¥=ÔÕÖ;_{{1, 1}, {356, 162}}Õ  ’ €+€*€…€(_controlBackgroundColorÒ78–—¤—ÕÖ;ZNSClipViewÙ…™™å‡šœ›áសŒ ¡á£XNSTargetXNSActionYNSPercent€f€f€Š€ˆÿÿÿÿ€€‰€f#?é_{{-22, 1}, {11, 125}}\_doScroller:Ò78§¨¥¨ÔÕÖ;ZNSScrollerÙ…™™å‡šœ›ááž­¢Œ¡á°€f€f€Š€Œ€‰€f#?ï±û _{{-100, -100}, {345, 11}}_{{4, 5}, {358, 164}}Ò78´µ¤µÕÖ;\NSScrollView×…™š‡›œÓ칺*£Ó€d€0€€‘ €d_{{1, 177}, {361, 70}}اô­®¯±õàö÷Á2âûü€/€'€’€5€€,oÏLes informations anonymes des profils système nous aident à planifier les futurs développements. Contactez-nous pour toute question à ce sujet. Ci-dessous figurent les informations qui seraient transmises :Z{365, 254}Ò78ÈɤÉÕÖ;\NSCustomView\moreInfoViewÔXYZ[”Ï€Z€1€€™_descriptionTextFieldØXÒÓYZÔÕÖØÙ•ÛÜsYNSKeyPathYNSBindingYNSOptions_NSNibBindingConnectorVersion€¤€€€œ€6€›€ž_value: shouldSendProfileUvalue_shouldSendProfileÓá>âãæWNS.keys€£¢ä借€ ¢ç耡€¢_NSNullPlaceholder_NSValidatesImmediately Ò78íî¢î;\NSDictionaryÒ78ðñ£ñ¶;_NSNibBindingConnectorØXÒÓYZÔÕÖõö—øùs€¤€€¨€§€O€¦€©_hidden: shouldAskAboutProfileVhidden_shouldAskAboutProfileÓá>âÿ€£¡€ª¡€«_NSValueTransformerName_NSNegateBoolean×XÒÓYZÕÖ   s€¤€€¶€µ€­€´Ø £££££_NSFilterRestrictsInsertion_NSPreservesSelection__NSManagedProxy^NSDeclaredKeys_"NSClearsFilterPredicateOnInsertion_NSSelectsInsertedObjects_NSAvoidsEmptySelection €³ €±€® Ò>F€R¢ €¯€°ZvisibleKey\visibleValueÑ$€²Ò78&¢;Ò78()¤)*+;_NSArrayController_NSObjectController\NSController_+contentArray: systemProfileInformationArray\contentArray_systemProfileInformationArrayØXÒÓYZÔÕÖõö•ø6s€¤€€¨€§€6€¦€¸Óá>â9;€£¡€ª¡€«×XÒÓYZÕÖ@Ù”Cs€¤€€»€œ€1€º_value: promptDescription_promptDescription×XÒÓYZÕÖ IÙ3Ls€¤€­€¾€œ€p€½_!value: arrangedObjects.visibleKey_arrangedObjects.visibleKey×XÒÓYZÕÖ RÙ4Us€¤€­€Á€œ€|€À_#value: arrangedObjects.visibleValue_arrangedObjects.visibleValue×XÒÓYZÕÖ[Ù–^s€¤€€Ä€œ€A€Ã[value: iconTiconÒ>bc€Í¯—eá•\–â“m4B3‘’”k Ót€O€Æ€f€6€ €A€€j€!€Ë€|€v€p€€€1€€­€d€~Óyz{£_NSAppliesImmediately€Ê€Ç Ò>F€R¢€€È€É_SUIncludeProfile_SUSendProfileInfoÒ78…†£†+;_NSUserDefaultsControllerÒ23‰€€Ì]NSApplicationÒ78Œ¨¢¨;Ò>b€Í¯kÓkkÓák3kkk\4€€€d€€€€d€f€€€j€p€j€€€€ €€€|Ò>b¦€Í¯—eá•–\â“m4B3‘’”k Ót€O€Æ€f€6€A€ €€j€!€€Ë€|€v€p€€€1€€­€d€~Ò>b¾€Í¯¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒӀрҀӀԀՀր׀؀ـڀۀ܀݀ހ߀à€á€â€ã€ä€åZDisclosure_User Defaults Controller[Scroll Viewo;Check Box (Avec transmission anonyme de mon profil système)_Image View (NSApplicationIcon)\Profile InfooÝStatic Text (Les informations anonymes des profils système nous aident à planifier les futurs développements. Contactez-nous pour toute question à ce sujet. Ci-dessous figurent les informations qui seraient transmises :)ZTable Viewo;Static Text (Rechercher automatiquement les mises à jour ?)\File's Owner[Application\Table Column_Text Field Cell (Text Cell)-1^Table Column-1_Push Button (Oui)_Push Button (Non)_Static Text (DO NOT LOCALIZE)\Content View_Array Controller\MoreInfoView_Text Field Cell (Text Cell)Ò>bë€Í Ò>bî€Í Ò>bñ€Í¯$—IeKá•\–âHPTJMR“Lm4BV3U‘QS’”Ok ÓtN€O€[€Æ€`€f€6€ €A€€ €¥€j€¼€^€c€·€!€b€€Ë€|€v€Â€p€¿€€¬€¹€€1€š€€­€d€~€˜Ò>b€Í¯$ !"#$%&'()*+,-./0123456789:;<€ê€ë€ì€í€î€ï€ð€ñ€ò€ó€ô€õ€ö€÷€ø€ù€ú€û€ü€ý€þ€ÿ     G1ƒ("%.~‹)/„ ‘•ÿÿÿÿÿÿÿý,+‚*0 ¡!”'-Ò>F`€R Ò>bc€Í Ò>bf€Í Ò78hi¢i;^NSIBObjectData"'1:?DRTfޔ߿íû )7CO]hv’ ³Åßéöøûýÿ  '357R[dotƒŒŸ¨³µ¶¿ÆÓÙâä   !#4BKSUWY[Œ™¦´¾ÌÙãõ !#%',.02468:UV_ikt}„–Ÿ¨ª¯ÄÖáêöøúüÿ  !#%')JRYcouwy{}€ƒ›Ôàö -?JTbt˜šœž ¢¤¦¨ª¯¸¼ÍÔÛäæïñô     ! * 7 D M X a k r ~ › Ÿ ¡ £ ¤ ¦ ¾ ó ø ú ü þ    ) + - / 1 4 5 7 Q r † ’ ” – ˜ š œ ¡ £     , A I V b p r t v x z Ž › £ ¥ § ³ ¼ Á Ö Ø Ú Ü Þ ñ þ   ' 0 ; G d f h j l o p r ‹ ¬ ® ° ² ´ ¶ ¸ Ê Û Ý æ è ë      , e s u w y { }  ƒ ˆ î û  !*/BKWY[di¤¯»½¿ÁÂÄÆÇÉÒÔáãåçéëí %Yq’¯Æçï÷ÿ (*,.BKR^gr~›Ÿ¡£¦§©Àñóõ÷ùûýÿ ,4?HOhs™ž±¸ÁÈßîÿ%=NPRTVevxz|~¡£¥§©º¼¾ÀÂßëíïñóõ÷  8DMZftvxz|”—™›¦¨¯±³µÚäîøúüþ  fˆ’§´Îê0?KMOXZ[]fortuwy{}†‘¢¤¦¨¿ÈÑßèêïñó'4<GValxy{}†ˆ‘šœ¹¾ÀÂÄÆÈÕ×ãøúüþ&:[`bdfhjoq{’”–˜®»½ÀÉÎÜ02468:[]_aceg|~€‚„Ž›¢«¶Íâäæèê  ENWacegirtv—¤­¸Ãèêìîðòôý09BOlnprtuw°²´¶¸º¼]hqz‡”¥§©«­Äåïù"$&(*,.0KQerz|ƒ…ŠŒŽ¢»¼ÅÊ×àçÿ "$&(*,.NUmz|„†Ÿ±ÎÐÒÔÖØÚû/APu©ª¬­¯±²³´½¿ÄÆÈÓàåçðõþ   0 = k x ˜ ¹ » ½ ¿ Á Ã Å Ç Ô Ö Ù Û Þ à ý ÿ!!!!! !$!8!U!W!Y![!]!_!a!…!¢!¿!Á!Ã!Å!Ç!É!Ë!ñ""-"/"1"3"5"7"9"E"J"S"U"€"‚"„"†"ˆ"Š"Œ"Ž""’"”"–"˜"š"œ"ž" "¢"¤"¦"¨"µ"Ì"Î"Ð"Ñ"Ú"Ü"á"ã"å"ø# ###7#@#B#D#R#[#`#i#k#–#˜#š#œ#ž# #¢#¤#¦#¨#ª#¬#®#°#²#´#¶#¸#º#¼#¾#Ç#É#ö#ø#ú#ü#þ$$$$$$ $ $$$$$$$$$$ $)$+$X$Z$\$^$`$b$d$f$h$j$l$n$p$r$t$v$x$z$|$~$€$‚$$¨$´%-%N%[''#'œ'©'µ'Â'â'ñ(((9(F(Y(f(„((((™(›(œ(¥(§(ò(ô(ö(ø(ú(ü(þ)))))) ) )))))))))) )")$)&)()*),).)0)2)4)6)8):)C)E))’)”)–)˜)š)œ)ž) )¢)¤)¦)¨)ª)¬)®)°)²)´)¶)¸)º)¼)¿)Â)Å)È)Ë)Î)Ñ)Ô)×)Ú)Ý)à)ã)æ)è)ê)ì)î)ð)ò)ô)ö)ø)ú)ü)þ****** * *******!*#*%*'*)*+*-*/*8*:*;*D*F*G*P*R*S*\*aj*ptransmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031212442116657031136 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239407.181980909 30 atime=1418239407.181980909 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.n0000644000175000017500000000253612442116657035246 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController ACTIONS finishPrompt id toggleMoreInfo id CLASS SUUpdatePermissionPrompt LANGUAGE ObjC OUTLETS delegate id descriptionTextField NSTextField moreInfoButton NSButton moreInfoView NSView SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000013212442116657031136 xustar0030 mtime=1418239407.180980892 30 atime=1418239407.180980892 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nib0000644000175000017500000000066612442116657035061 0ustar00mikedldmikedld00000000000000 IBFramework Version 629 IBOldestOS 5 IBOpenObjects IBSystem Version 9E17 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/PaxHeaders.4960/SUUpdateAlert.nib0000644000000000000000000000013212442116656027436 xustar0030 mtime=1418239406.515969496 30 atime=1418239406.431968057 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116656031140 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/PaxHeaders.4960/keye0000644000000000000000000000013212442116656030373 xustar0030 mtime=1418239406.515969496 30 atime=1418239406.515969496 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nib0000644000175000017500000002414212442116656034310 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯î 156<=AEW_muv‘™šžŸ£©ª®³ÍÎÏÐÔØäðùúûüýþÿ #$/34>?@EGLMPSV]^efkst|}‘•›Ÿ¯¿ÀÁÂÃÄÅÆÇÈÉÊÐÛÜÝÞ‡ßãæéíîðñòøü  '(2378;BCKLMNOPQTUX]^cdijopuv€‚ƒ†‘’˜™šœ¤¥¦¬³´µ¼ÀÄÅÆÎÔÜâéêëý'9:;<=>?@ABCDEFGHKNp’“;”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°³¶¹U$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€í€±€È€ì€€¶€€Ç€É€·€ê€€€µ€ë§€ÊÒ234[NSClassName€€]SUUpdateAlertÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€d¯HIJKLMNOPQRSTUV€ €€‡€‰€‹€€€‘€–€ž€¢€¥€ª€¬€®ÔXYZ[]^]NSDestinationXNSSourceWNSLabel€€€ €×`abcdefghijkf_NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabled[NSSuperview€ €€ € ! € Õ`nco+qrstZNSSubviews[NSFrameSize€€f€€€_{{481, 12}, {91, 32}}Ýwxyz{|}~€‚ƒ„…†‡ˆ‰Šˆ]Ž[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsÿÿÿÿ„þ€€€€€€€ Èÿÿÿÿ†‚@ÿYInstallerÔ’“”•–—˜VNSSizeVNSNameXNSfFlags€#@*€\LucidaGrandeÒ78›œ¢œ;VNSFontPQ Ò78 ¡¤¡¢b;\NSButtonCell\NSActionCellÒ78¤¥¥¥¦§¨;XNSButtonYNSControlVNSView[NSResponder^installUpdate:Ò78«¬£¬­;_NSNibControlConnector^NSNibConnectorÔXYZ¯±²€†€€€…Ý´µ¶·¸¹º»¼½¾¿fÁÂ…ÄÅÆÇÈÉÊËÌ\NSWindowView\NSScreenRect_NSFrameAutosaveName]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €„€€€ÿÿÿÿðx€€€ƒ€‚€_{{305, 568}, {586, 370}}oMise à jour de logicielXNSWindowÒÑÒÓYNS.string€TViewÒ78ÕÖ£Ö×;_NSMutableStringXNSStringÒ>FÚ€d©ÛÜÝÞ]àáâ〠€0€?€D€ €I€p€t€{Ù`aåbæcdefèékëìíkfZNSEditable[NSDragTypes€ €/€( €)€! € Ò>?ò€¦óôõö÷ø€"€#€$€%€&€'_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{24, 291}, {64, 64}}Øw}  WNSStyleWNSAlignWNSScaleZNSAnimatesþ€.€*Ó2  ^NSResourceName€-€+€,WNSImage_NSApplicationIconÒ78¢;_NSCustomResourceÒ78£b;[NSImageCellÒ78¥¦§¨;[NSImageView×`abcdef kf€ €>€1€2 € _{{106, 338}, {443, 17}}Øw%}~&'()…+Ü-._NSBackgroundColor[NSTextColorþ€=€5€€3€0@€:Ô’“”•–12€€4_LucidaGrande-BoldÕ56789:;<=WNSColor\NSColorSpace[NSColorName]NSCatalogName€9€8€7€6VSystem\controlColorÓ6A9CDWNSWhite€9K0.66666669Ò78F5¢5;Õ56789I;J=€9€<€;€6_controlTextColorÓ6A9CO€9B0Ò78QR¤R¢b;_NSTextFieldCellÒ78TU¥U¦§¨;[NSTextField×`abcdefYZíkf€ €>€@€A € _{{106, 277}, {443, 17}}Øw%}~&'()abÝ-.€=€5€B€C€?€:_Notes de version :Ô’“”•h1j€#@&€4 ×`abcdefgnopkf€ €€E€F € _{{103, 12}, {171, 32}}Ýwxyz{|}~€‚'„…†‡ˆxyˆÞŽ€€€€H€G€€D_Ignorer cette versionÒÑÒ€Ý`€a‚ncƒ„…e†fCˆ‰Š Œ‡ŽfYNSBoxType[NSTitleCell]NSTransparent\NSBorderTypeYNSOffsets_NSTitlePosition]NSContentView€ €o€i€g€J€h€ €KÒ>F“€d¡€KÖ`anceàq˜™sà€I€f€e€L€IÒ>F€d¡ž€MÛ`a ¡æc¢£¤e¦§k©ª… …ZAllowsUndo[PreferencesYGroupName_UseBackForwardListYFrameName€K€c€Y €Z€N€€€KÒ>?±€­²³´÷¶·¸¹ºö¼ø¾€O€P€Q€&€R€S€T€U€V€%€W€'€XZpublic.url_NeXT RTFD pasteboard type_NSStringPboardType_Apple URL pasteboard type_WebURLsWithTitlesPboardType_!Apple Web Archive pasteboard type_public.url-name_Apple HTML pasteboard type_NSColor pasteboard type_*NeXT Rich Text Format v1.0 pasteboard type_{{-1, 0}, {456, 197}}ÓËÌÍ…ÏZIdentifierVValues€b€€[ÓÑ>ÒÓ×WNS.keys€a£ÔÕÖ€\€]€^£ØØÚ€_€_€`_WebKitDefaultFixedFontSize_WebKitDefaultFontSize_WebKitMinimumFontSize Ò78àá£áâ;_NSMutableDictionary\NSDictionaryÒ78äå¢å;^WebPreferencesÒ78çè¤觨;WWebViewÒ78êë£ëì;^NSMutableArrayWNSArray_{{1, 1}, {455, 197}}Ò78ï§£§¨;_{{109, 76}, {457, 199}}V{0, 0}×w%}~&'(ô…ö÷€=€k€€j€nÔ’“”•h—û€€Õ56789þ;ÿ=€9€m€l€6_textBackgroundColorÓ6A9C€9B1Ó6A9C€9M0 0.80000001Ò78  ¤ §¨;UNSBox×`abcdefkf€ €>€q€r € _{{106, 302}, {463, 28}}Øw%}~&'()…á.€=€5€€s€p@€:Ô’“”•h—€€ ×`abcdefg#$skf€ €€u€v € _{{106, 48}, {442, 18}}Ýwxyz{|}~€‚'„…†É+…-â01€€€x€€w€s€tH?jkf€ €€|€} € _{{344, 12}, {137, 32}}Ýwxyz{|}~€‚'„…†‡ˆGHˆãŽ€€€€€~€€{^Pas maintenantQZ{586, 370}_{{0, 0}, {1440, 878}}W{0, 22}_{3.40282e+38, 3.40282e+38}Ò78RS¢S;_NSWindowTemplateXdelegateÒ78VW£W­;_NSNibOutletConnectorÔXYZ¯á\€†€p€€ˆ[descriptionÔXYZ¯žb€†€M€€Š_releaseNotesViewÔXYZ[ãh€€€{€Œ^remindMeLater:ÔXYZ¯±n€†€€€ŽVwindowÔXYZ[Þt€€€D€_skipThisVersion:×XwxYZyz|}ÜÉYNSKeyPathYNSBinding_NSNibBindingConnectorVersion€•€€”€“€0€’_value: titleTextUvalueYtitleTextÒ78„…£…­;_NSNibBindingConnectorØXwxYZ‡yzŠ‹âŽÉYNSOptions€•€€™€˜€t€—€š_hidden: allowsAutomaticUpdatesVhidden_allowsAutomaticUpdatesÓÑ>“”–€¡•€›¡—€œ_NSValueTransformerName_NSNegateBooleanÒ78›â¢â;ØXwxYZ‡yzŸ‹Ý¢£É€•€€ €˜€?€Ÿ€¡_hidden: showsReleaseNotes_showsReleaseNotesÓÑ>“¨ª€¡•€›¡—€œ×XwxYZyz¯}á²É€•€€¤€“€p€£_value: descriptionText_descriptionText×XwxYZyz·¸}â»É€•€¦€©€“€t€¨Ò½¾k_NSSharedInstance€§ Ò78Á£ÂÃ;_NSUserDefaultsController\NSController_#value: values.SUAutomaticallyUpdate_values.SUAutomaticallyUpdateØXwxYZ‡yzŸ‹à¢ÍÉ€•€€ €˜€I€Ÿ€«ÓÑ>“ÐÒ€¡•€›¡—€œØXwxYZ‡yzŸ‹ž¢ÛÉ€•€€ €˜€M€Ÿ€­ÓÑ>“Þà€¡•€›¡—€œ×XwxYZyzå}ÛèÉ€•€€°€“€ €¯_value: applicationIcon_applicationIconÒ>ì퀴¯áâfÞ·Ûà]öžã±ÝÜ€p€t€ €D€¦€ €I€ €²€M€{€€?€0€KÒ23ÿ€€³]NSApplicationÒ78ì¢ì;Ò>쀴¯ff±fffffffà€ € €€ €€ € € €€K€ €€ € €IÒ>쀴¯áâf·ÞÛàö]ãž±ÝÜ€p€t€ €¦€D€ €I€²€ €{€M€€€?€0Ò>ì)€´¯*+,-./012345678€¸€¹€º€»€¼€½€¾€¿€À€Á€Â€Ã€Ä€Å€Æ[Static TextoPCheck Box (Automatiquement télécharger et installer les mises à jour à l'avenir)\Content View_Shared Defaults_#Push Button (Ignorer cette version)_Image View (NSApplicationIcon)SBox[Application_Push Button (Installer)_Push Button (Pas maintenant)XWeb View_Update Alert (release notes)\File's Owner_ Static Text (Notes de version :)]Static Text-1Ò>ìJ€´ Ò>ìM€´ Ò>ìP€´¯MHfKÞIöãUQONáâ·Ûà]žJVT±RSPÝLÜ€€ € €‰€D€€²€{€¬€ž€‘€€p€t€¦€ €I€ €M€‡€®€ª€€¢€€¥€–€?€‹€0€KÒ>ìr€´¯stuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ó€Ô€Õ€Ö€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€â€ã€ä€å€æ€ç€è€éEM 2ÿÿÿÿÿÿÿý¡H !eu]YLi ¤g¥‡" ¦Ò>F²€d Ò>ìµ€´ Ò>츀´ Ò78º»¢»;^NSIBObjectData"'1:?DRTfEK–¤²Äàîú-IWj|– ­¯±³µ·¹»½¿ÁÃÅÇÉËÍÏÑÚæèêø )2ENY[\elyˆŠ«­¯±³µ·¹»½¿ÁÃÅÇÉÚèñùûýÿ08?HR^`bdfijlŒ˜šœž¡£»ðü'6I[fp~«´¶¸º¼¾ÀÂÄÆÈÍÖàñøÿ %.3:;=FO\ir}†—£²»ÂÚéúüþ7DQguš¤¶ÊÔàâäæèêóõ÷ùûýÿ   M V _ i k p y € ’ › ¤ ¦ ¹ » ½ ¿ Á Ã Å Ç É Ë ð û        ! # 0 2 4 6 8 : < X t ¨ À á þ  7 ? G O Z _ a c e j k x ‡ ‰ ‹ • © ² · Ê Ó Ú æ ï ú  # % ' ) + . / 1 K l € Œ ‘ “ • — ™ ›   ¢ ³ µ · º Î ã ë ø        # 0 = E G I U ^ c x z | ~ € “   ¢ ¥ ® · É Ò Ý é  +LNPRTVXm~€‰‹Ž«­¯±³¶·¹Ò   -68mwƒ‘ž¨ºÈÊÌÎÐÑÓÖØÚÜåçêì   LWcm‚ŒŽ’“•—™šœž§©ÄÆÈÊÌÎÐÒÔÖØÚÜÞé6TxЧÁî%')+8@BIKMOVXZ\y‘©«´»ÑÞçìû %4<S\c}„¡£¥§©«¼¾ÀÂ×ÙÛÝßõ$-6<Y[]_adeg¢¤¦¨ª¬±³ÄÆÈËèêìîðñó ACEGIKMOTYäíùûý*GIKMOPRk ¢¤¦¨ª¬®½¿Êâê(1:AXikmoq}Ž’”–©º¼¾ÀÂÑâäæèêñ :DNmoqsuwyŒ’œ¥¬Äåïñóõ÷ùûý%>KMPRUWp‚‹±³µ·¹»½¿Ûïüþ%')+-/1J\y{}ƒ…Ž¡£¤­´ÏÜ!BDFHJLNP]_bdgiŠŒŽ’”–˜¥§ª¬¯±ÎÐÒÔÖØÚó13579;=?ACEGIKMOXZ\jsxƒ¤¦¨ª¬®°²´¶¸º¼¾ÀÂËÍîðòôöøúüþ  8:<>@BDFHJLNPRTVb$Jko{•´½Üé #%&/12;=~€‚„†ˆŠŒŽ’”–˜šœž ¢¤¦¨ª¬®°²´¶¸º¼ÅÇ           " $ & ( * , . 0 2 4 6 8 : < > @ B D F H J L N P Y [ ] _ a c e g i k m o q s u w y { }  ƒ … ‡ ‰ ’ ” • ž   ¡ ª ¬ ­ ¶ »¼ Êtransmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/PaxHeaders.4960/clas0000644000000000000000000000013212442116656030360 xustar0030 mtime=1418239406.515969496 30 atime=1418239406.515969496 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/classes.nib0000644000175000017500000000277412442116656033301 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController CLASS NSApplication LANGUAGE ObjC SUPERCLASS NSResponder ACTIONS installUpdate id remindMeLater id skipThisVersion id CLASS SUUpdateAlert LANGUAGE ObjC OUTLETS delegate id description NSTextField releaseNotesView WebView SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/PaxHeaders.4960/info0000644000000000000000000000013212442116656030371 xustar0030 mtime=1418239406.514969479 30 atime=1418239406.514969479 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000066612442116656032575 0ustar00mikedldmikedld00000000000000 IBFramework Version 629 IBOldestOS 5 IBOpenObjects IBSystem Version 9E17 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/PaxHeaders.4960/Sparkle.strings0000644000000000000000000000013112442116657027276 xustar0030 mtime=1418239407.180980892 30 atime=1418239407.180980892 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/Sparkle.strings0000644000175000017500000002122412442116657030725 0ustar00mikedldmikedld00000000000000þÿ/* No comment provided by engineer. */ "%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ a été téléchargé. Voulez-vous l'installer et relancer %1$@ maintenant ?"; /* No comment provided by engineer. */ "%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ ne peut pas être mis à jour quand il fonctionne à partir d'un volume en lecture seule, comme une image disque ou un lecteur optique. Déplacez-la %1$@ dans votre dossier Applications, relancez-le à partir delà, et réessayez."; /* No comment provided by engineer. */ "%@ %@ is currently the newest version available." = "%1$@ %2$@ est la version la plus récente disponible."; /* No comment provided by engineer. */ "%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ est disponible ; vous utilisez la version %3$@. Voulez-vous le télécharger maintenant ?"; /* No comment provided by engineer. */ "%@ downloaded" = "%@ téléchargé"; /* No comment provided by engineer. */ "%@ of %@" = "%1$@ sur %2$@"; /* No comment provided by engineer. */ "A new version of %@ is available!" = "Une nouvelle version de %@ est disponible !"; /* No comment provided by engineer. */ "A new version of %@ is ready to install!" = "Une nouvelle version de %@ est prête à être installée !"; /* No comment provided by engineer. */ "An error occurred in retrieving update information. Please try again later." = "Une erreur est survenue en récupérant les informations de mise à jour. Veuillez réessayer plus tard."; /* No comment provided by engineer. */ "An error occurred while downloading the update. Please try again later." = "Une erreur est survenue en téléchargeant la mise à jour. Veuillez réessayer plus tard."; /* No comment provided by engineer. */ "An error occurred while extracting the archive. Please try again later." = "Une erreur est survenue en extrayant les données de l'archive. Veuillez réessayer plus tard."; /* No comment provided by engineer. */ "An error occurred while installing the update. Please try again later." = "Une erreur est survenue en installant la mise à jour. Veuillez réessayer plus tard."; /* No comment provided by engineer. */ "An error occurred while parsing the update feed." = "Une erreur est survenue en analysant les informations de mise à jour."; /* No comment provided by engineer. */ "An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Une erreur est survenue en relançant %1$@, mais la nouvelle version sera disponible à la prochaine ouverture de %1$@."; /* the unit for bytes */ "B" = "octets"; /* No comment provided by engineer. */ "Cancel" = "Annuler"; /* No comment provided by engineer. */ "Cancel Update" = "Annuler la mise à jour"; /* No comment provided by engineer. */ "Checking for updates..." = "Recherche de mises à jour &"; /* Take care not to overflow the status window. */ "Downloading update..." = "Téléchargement de la mise à jour &"; /* Take care not to overflow the status window. */ "Extracting update..." = "Extraction de la mise à jour &"; /* the unit for gigabytes */ "GB" = "Go"; /* No comment provided by engineer. */ "Install and Relaunch" = "Installer et relancer"; /* Take care not to overflow the status window. */ "Installing update..." = "Installation de la mise à jour &"; /* the unit for kilobytes */ "KB" = "ko"; /* the unit for megabytes */ "MB" = "Mo"; /* No comment provided by engineer. */ "OK" = "OK"; /* No comment provided by engineer. */ "Ready to Install" = "Prêt pour l'installation"; /* No comment provided by engineer. */ "Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "%1$@ doit-il rechercher automatiquement les mises à jour ? La mise à jour est toujours possible manuellement depuis le menu de %1$@."; /* No comment provided by engineer. */ "Update Error!" = "Erreur durant la mise à jour !"; /* No comment provided by engineer. */ "Updating %@" = "Mise à jour de %@"; /* No comment provided by engineer. */ "You already have the newest version of %@." = "Vous possédez déjà la version la plus récente de %@."; /* No comment provided by engineer. */ "You're up-to-date!" = "Votre logiciel est à jour !"; transmission-2.92/macosx/Sparkle.framework/Resources/PaxHeaders.4960/sv.lproj0000644000000000000000000000013212442116661024222 xustar0030 mtime=1418239409.262016554 30 atime=1418239408.469002965 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/0000755000175000017500000000000012442116661025724 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/PaxHeaders.4960/SUAutomaticUpdateAlert0000644000000000000000000000013212442116660030552 xustar0030 mtime=1418239408.538004147 30 atime=1418239408.470002982 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116660033023 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000031512442116660031001 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239408.538004147 30 atime=1418239408.538004147 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobject0000644000175000017500000001646212442116660035247 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯¡ 156<=AEPXhr sŽ–—š›œ¡§¨¬±ÈÉÍÑÔÞëôõö÷øùúû    !,12<=>CFKLOTW`ajoxy†‡ˆ‘’Ÿ £¬­º»¿ÀÃÇ ÈÊËÌÍÐÑÕÚÛàáëïôõö÷ü  %()+9HWXYZ[\]^_`abcfi€—˜™š›œžŸ 9¡¢£¤¥¦§¨©ª­°³U$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€ €r€†€Ÿ€€w€€…€‡€x€€€€v€ž%€ˆÒ234[NSClassName€€_SUAutomaticUpdateAlertÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€T¨HIJKLMNO€ €€^€`€b€i€l€oÔQRSTVW]NSDestinationXNSSourceWNSLabel€€€ €ØYZ[\]^_`abcdef`_NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabledXNSWindow[NSSuperview€ €€ € € € ×Yi\j^_flmnofqZNSSubviews[NSFrameSize€ €W€€U€ €V_{{226, 12}, {160, 32}}Ýtuvwxyz{|}~€‚ƒ„…†‡…VŠ‹Œ[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsþ€€€€€€€ Èÿÿÿÿ†‚@ÿ_Installera vid avslutÔ‘’“”•VNSSizeVNSNameXNSfFlags€#@*€\LucidaGrandeÒ78˜™¢™;VNSFontPQÒ78ž¤žŸ ;\NSButtonCell\NSActionCellVNSCellÒ78¢£¥£¤¥¦;XNSButtonYNSControlVNSView[NSResponder]installLater:Ò78©ª£ª«;_NSNibControlConnector^NSNibConnectorÔQRS­®°€]€€€\ܲ³´µ¶·¸¹º»¼`¾¿‚ÁÂÃÄÅ„ÆÇ\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €[€X€px€€€Z€Y€_{{114, 521}, {586, 152}}ÒÊËÌYNS.string€XNSWindowÒ78ÎÏ£ÏÐ;_NSMutableStringXNSStringÒÊËÓ€TViewÒ>FÖ€T§×ØÙÚVÜÝ€ €0€?€C€ €H€MÚYZß[à\]^_`âãeåæçef`ZNSEditable[NSDragTypes€ €/€( €)€! € € Ò>?퀦îïðñòó€"€#€$€%€&€'_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{23, 73}, {64, 64}}Øtüzýþ~ÿWNSStyleWNSAlignWNSScaleZNSAnimatesþ€.€*Ó2  ^NSResourceName€-€+€,WNSImage_NSApplicationIconÒ78¢;_NSCustomResourceÒ78£;[NSImageCellVNSCellÒ78¥¤¥¦;[NSImageViewØYZ[\]^_`ef`€ €>€1€2 € € _{{105, 120}, {389, 17}}Øt"z{|~#$%&‚(Ø*+_NSBackgroundColor[NSTextColorþ€=€5€€3€0@€:Ô‘’./0€#@*€4_LucidaGrande-BoldÕ3456789:;WNSColor\NSColorSpace[NSColorName]NSCatalogName€9€8€7€6VSystem\controlColorÓ4?7ABWNSWhite€9K0.66666669Ò78DE¢E;WNSColorÕ34567H9I;€9€<€;€6_controlTextColorÓ4?7AN€9B0Ò78PQ¤QRS;_NSTextFieldCell\NSActionCellVNSCellÒ78UV¥V¤¥¦;[NSTextFieldØYZ[\]^_`Z[\ef`€ €>€@€A € € _{{105, 81}, {460, 31}}Øt"z{|~#b%&‚fÙh+þ€=€5€€B€?@€:Ô‘’l”n€#@&€ ØYZ[\]^_`arstef`€ €€D€E € € _{{386, 12}, {186, 32}}Ýtuvwxyz{|}~z‚}„…€…Úƒ„…þ€€€€G€F€€CÈÿÿÿÿ†‚@ÿ_Installera och starta omQ ØYZ[\]^_`a‹Œef`€ €€I€J € € _{{102, 12}, {116, 32}}Ýtuvwxyz{|}~“‚–„…˜™…Üœžþ€€€€L€K€€HÈÿÿÿÿ†‚@ÿ_Installera inteÒÊË¢€PØYZ[\]^_`a¦§¨ef`€ €€N€O € € _{{105, 58}, {382, 18}}Ýtuvwxyz{|}~®‚±Å²‚´fÝ·¸¹þ€€€Q€€P€B€MÈHLadda hem och installera uppdateringar automatiskt i framtidenÒ¼½¾[NSImageName€S€RXNSSwitchÒ78Á¢Â;_NSButtonImageSourceÒ78Äţů;^NSMutableArrayWNSArrayZ{586, 152}Ò78É¥£¥¦;_{{0, 0}, {1280, 778}}Z{511, 174}_{3.40282e+38, 3.40282e+38}Ò78ÎÏ¢Ï;_NSWindowTemplateVwindowÒ78ÒÓ£ÓÔ;_NSNibOutletConnector^NSNibConnectorÔQRSTÚÙ€€€C€_[installNow:ÔQRSTÜ߀€€H€a]doNotInstall:×QâãRSäåæçèÝêÅYNSKeyPathYNSBinding_NSNibBindingConnectorVersion€h€c€g€f€M€eÒìíe_NSSharedInstance€d Ò78ðó£ñò;_NSUserDefaultsController\NSController_NSUserDefaultsController_#value: values.SUAutomaticallyUpdateUvalue_values.SUAutomaticallyUpdateÒ78øû£ùú;_NSNibBindingConnector^NSNibConnector_NSNibBindingConnector×QâãRSäåÿèÙÅ€h€€k€f€?€j_value: descriptionText_descriptionText×QâãRSäåèØ Å€h€€n€f€0€m_value: titleTextYtitleText×QâãRSäåè×Å€h€€q€f€ €p_value: applicationIcon_applicationIconÒ>€u«ÚÝØVæ×®Ù`Ü€C€M€0€s€ €c€ €€?€ €HÒ23'€€t]NSApplicationÒ78*Æ¢Æ;Ò>-€u«``````®`€ € € €€ €€ €€ €€ Ò>;€u¬ÚÝØVæ×®Ù`Ü€C€M€0€s€ €c€ €€?€€ €HÒ>J€u¬KLMNOPQRSTUV€y€z€{€|€}€~€€€€€‚€ƒ€„_&Push Button (Installera och starta om)_JCheck Box (Ladda hem och installera uppdateringar automatiskt i framtiden)[Static Text[Application_#Push Button (Installera vid avslut)_Shared Defaults_Image View (NSApplicationIcon)VWindow]Static Text-1\File's Owner\Content View_Push Button (Installera inte)Ò>e€u Ò>h€u Ò>k€u¯KÚJIVæONHM`ÝØL×®ÙÜ€`€C€^€€ €c€o€l€ €i€ €M€0€s€b€ €€?€€HÒ>‚€u¯ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–€‰€Š€‹€Œ€€Ž€€€‘€’€“€”€•€–€—€˜€™€š€›€œ#!  "ÿÿÿÿÿÿÿý $Ò>F¬€T Ò>¯€u Ò>²€u Ò78´µ¢µ;^NSIBObjectData"'1:?DRTf«±ü *FT`lz…“¯½Ðâü!#%')+-/1357@LNPir{†‹š£¶¿ÊÌÍÖÝêðùû -;DLNPRTu‡–Ÿ©²¾ÀÂÄÆÉÊÌÎëö  *_k–¥¸ÊÕßíÿ !#%')+-/138AYjqxƒŒŽ‘ž§¬³´¶¿ÈÕâéòý#1:AYhy{}²¿ÌÚäòÿ /9EGIKMRTVXZ\^y‚ŒŽ— §¹ÂËÍÒÛÝìîðòôöøú # . : < > @ A C E H I K M V X e g i k m o q © Ý õ  3 J k s { ƒ Ž “ • — ™ ž Ÿ ¬ » ½ ¿ Á É Ý æ ë þ    ! * 5 A b d f h j m n p r Œ ­ Á Í Ò Ô Ö Ø Ú Ü á ã ô ö ÿ    - 5 B N \ ^ ` b d f m z ‡ ‘ “ Ÿ ¨ ­ µ Ê Ì Î Ð Ò å ò ô ÷  ( / 8 C O p r t v x { | ~ € ™ º ¿ Á Ã Å Ç É Î Ð á ã ì î ñ ";puwy{}ƒ…‡Œ•°²ÓÕ×ÙÛÞßáãü168:<>@BDFHMVhqst•—™› ¡£¥¾óøúüþ U^jlnw€…›¤«ºÂÍÖÝõ&+>ENUl{ŒŽ’” ±³µ·¹Çäîø!#,?ABKRmz•»Áàéð/LNPRTVXqƒ ¢¤¦¨ª¬¿Éæèêìîðò &(?ACEGIKMOQSU^`bpy~‡‰ ¢¤¦¨ª¬®°²´¶¿ÁÚÜÞàâäæèêìîðòûý "$&(*,.W¤°¼âô*7Ddmopy{|…‡²´¶¸º¼¾ÀÂÄÆÈÊÌÎÐÒÔÖØÚãå "$&(*,.02468:<>@BDFHJLNPY[]_acenpqz|}†ˆ‰’—¶¦transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000013212442116660030776 xustar0030 mtime=1418239408.538004147 30 atime=1418239408.538004147 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/classes.nib0000644000175000017500000000217012442116660035152 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController ACTIONS doNotInstall id installLater id installNow id CLASS SUAutomaticUpdateAlert LANGUAGE ObjC SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000013212442116660030776 xustar0030 mtime=1418239408.538004147 30 atime=1418239408.538004147 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nib0000644000175000017500000000105112442116660034445 0ustar00mikedldmikedld00000000000000 IBFramework Version 670 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 6 IBSystem Version 10A96 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/PaxHeaders.4960/SUUpdatePermissionProm0000644000000000000000000000013212442116661030623 xustar0030 mtime=1418239409.263016571 30 atime=1418239408.948011173 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/0000755000175000017500000000000012442116661033440 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031712442116661031157 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239409.262016554 30 atime=1418239409.262016554 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobje0000644000175000017500000003225312442116661035331 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯ 156<=AEW_oy z”•ž¡¢£¨®¯³¸ÂÃÐÑÒ×îïó÷ú  *+,149:=BENOXY^ghwx}~‚†‡Š— ¡¢£¤¥¦§²¶·»¾ÇÈÕÙ ÚÜÝÞßâãçìíòóø-1MNSTX]nux}~„Œ‘’•˜¡¨°µ¶¹½¾ÃÄÇÔÕÖÙãäåèðñúû¬­üÿ!&-./07GLMNPTZ[\defno‹lqxyz{‚ƒ„‹Œ•›²µ¶»ÀÁÂÇÉàø !"#$%(+Ryz{|}~€‚ƒ'„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œŸ¢¥U$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€Æ€è€€Ð€€ç€é€Ñ€€€Ï¢€êÒ234[NSClassName€€_SUUpdatePermissionPromptÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€W¯HIJKLMNOPQRSTUV€ €€€a€c€e€™€›€¤€¨€²€º€¾€Á€ÄÔXYZ[]^]NSDestinationXNSSourceWNSLabel€€€ €Ø`abcdefghijklmg_NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabledXNSWindow[NSSuperview€ €€ € € € ×`pcqefmstuvmxZNSSubviews[NSFrameSize€ €Z€%€X€ €Y_{{188, 12}, {92, 32}}Ý{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽŒ]‘’“[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsþ€€€€€€€ Èÿÿÿÿ†‚@ÿXNej tackÔ–—˜™š›œVNSSizeVNSNameXNSfFlags€#@*€\LucidaGrandeÒ78Ÿ ¢ ;VNSFontPQÒ78¤¥¤¥¦§;\NSButtonCell\NSActionCellVNSCellÒ78©ª¥ª«¬­;XNSButtonYNSControlVNSView[NSResponder]finishPrompt:Ò78°±£±²;_NSNibControlConnector^NSNibConnectorÔXYZ[¶^€€€€Ù`abcdef¹gh¼½¾lmg‹UNSTag€ €€€ € € _{{280, 12}, {142, 32}}Þ{|}~€‚ƒ„…†¹Äˆ‰Ç‹ŒÉÊŒ¶ÍÎÏ‹ÿÿÿÿ„þ€€€€€€€Èÿÿÿÿ†‚@ÿoSök automatisktQ ÔXYZÓÔÖ€`€ €€_ÜØÙÚÛÜÝÞßàáâgäå‰çèéêë‹ìí\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €^€[€px€"€!€]€\€$_{{452, 123}, {438, 168}}ÒðñòYNS.string€#XNSWindowÒ78ôõ£õö;_NSMutableStringXNSStringÒðñù€#TViewÒ>Fü€W§¶]ÿ€€ €&€6€;€F€TØ`abcdefg lmg€ €5€'€( € € _{{104, 114}, {289, 34}}Ø{‚ƒ…ÿ_NSBackgroundColor[NSTextColorþ€4€,€)€*€&@€1o$Sök efter uppdateringar automatiskt?Ô–—˜™€#@*€+_LucidaGrande-BoldÕ!"#$%&'()WNSColor\NSColorSpace[NSColorName]NSCatalogName€0€/€.€-VSystem\controlColorÓ"-%/0WNSWhite€0K0.66666669Ò7823¢3;WNSColorÕ!"#$%6'7)€0€3€2€-_controlTextColorÓ"-%/<€0B0Ò78>?¤?@A;_NSTextFieldCell\NSActionCellVNSCellÒ78CD¥D«¬­;[NSTextFieldØ`abcdefgHIJlmg€ €5€7€8 € € _{{104, 81}, {315, 42}}Ø{‚ƒ…PSTVþ€4€,€9€:€6@€1_DO NOT LOCALIZEÔ–—˜™[›]€#@&€ Ø`abcdefghabclmg€ €€<€= € € _{{104, 53}, {278, 18}}Þ{|i}~€‚ƒ„…†jˆ‰mnëo‰qTtuv]NSNormalImageÿÿÿÿ„þ€€€?€C€€>€:€;È€H?™€¦š›œžŸ€H€I€J€K€L€M_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{23, 84}, {64, 64}}Ø{¨©ª…«¬­®¯®‹°lWNSStyleWNSAlignWNSScaleZNSAnimatesþ€R€P Ó2yz{µ€B€@€Q_NSApplicationIconÒ78¸¹£¹º;[NSImageCellVNSCellÒ78¼½¥½«¬­;[NSImageViewØ`abcdefghÁÂÃlmg€ €€U€V € € _{{80, 50}, {27, 26}}Ü{|}~€‚ƒ„…†Ɉ‰Ì͉‰ŒÒÓÔþ€€…€€€€TÈ€ÿÿÿÿ¸Ì@ÿÒ78Öףר;^NSMutableArrayWNSArrayZ{438, 168}Ò78Û¬£¬­;_{{0, 0}, {1280, 778}}Z{213, 129}_{3.40282e+38, 3.40282e+38}Ò78àá¢á;_NSWindowTemplateVwindowÒ78äå£åæ;_NSNibOutletConnector^NSNibConnectorÔXYZÓë€`€T€€b^moreInfoButtonÔXYZÓñ€`€6€€d_descriptionTextFieldÔXYZÓõ÷€`€f€€˜×`pcq2ù+ûüýþÿ[NSExtension€€—€g €”€•€–Ò>F€W¢€h€Ü`ap cf   õõ[NSHScrollerXNSsFlags\NSScrollAmts[NSVScroller]NSNextKeyView]NSContentView€f€Œ€€Ž€iOA€A€€f€ˆ€j€jÒ>F€W£€j€ˆ€ŒÚ`a pc!"f $%&'()*)YNScvFlagsYNSDocViewYNSBGColor€h€‡€„€k €l€…€h€lÒ>F/€W¡)€lß`2345678cqd9:f;<®>?@ABC&DEFlHIKL_NSDraggingSourceMaskForNonLocalYNSTvFlags_NSAllowsTypeSelect\NSCornerView_NSIntercellSpacingWidth_NSColumnAutoresizingStyle_NSIntercellSpacingHeight[NSGridColor_NSDraggingSourceMaskForLocal^NSTableColumns[NSRowHeight€j€ƒÿÿÿÿÒÀ€{€n#@#@€m €€€j€q#@,Z{356, 162}Ô`ac+PQR€€p€o_{{346, 0}, {12, 17}}Ò78UW¤V¬­;]_NSCornerView]_NSCornerViewÒ>FZ€W¢[\€r€}Ù^_`abcdelghij/kl)^NSIsResizeable\NSHeaderCellWNSWidthZNSDataCell^NSResizingMaskZNSMinWidthZNSMaxWidth[NSTableView €|€s#@`€x#@D#@@€l×{‚…opq‰T®tþ€w€t€€:€uÓ"-%/w€0K0.33333299Õ!"#$%6'{)€0€3€v€-_headerTextColorÒ78ƒ¥€?‚;_NSTableHeaderCell\NSActionCellVNSCell_NSTableHeaderCell×{‚ƒ……‡T)Š!þ€4€y€:€l€1Õ!"#$%@')€0€{€z€-_textBackgroundColorÓ"-%/”€0B1Ò78–—¢—;]NSTableColumnÙ^_`abcdelg›œ/žŸ) €|€~#@dà€#@D#@@€l×{‚…¢pq‰T®tþ€w€t€€:€u×{‚ƒ…©‡T)®!þ€4€y€:€l€1Õ!"#$%²'³)€0€‚€€-YgridColorÓ"-%/¸€0D0.5Ò78º¼¥»«¬­;[NSTableView[NSTableView_{{1, 1}, {356, 162}}Õ!"#$%&'Á)€0€/€†€-_controlBackgroundColorÒ78ÅƤƬ­;ZNSClipViewÙ`ÈacÉfÊÍÎÏÐÑÓXNSTargetXNSActionYNSPercent€h€h€‹€‰ÿÿÿÿ€€Š€h#?é_{{-22, 1}, {11, 125}}\_doScroller:Ò78ר¥Ø«¬­;ZNSScrollerÙ`ÈacÉfÊÍÝÞßÑâ€h€h€‹€€Š€h#?ï±û _{{-100, -100}, {345, 11}}_{{4, 5}, {358, 164}}Ò78æç¤笭;\NSScrollView×`abcdfõëìílõ€f€5€‘€’ €f_{{1, 177}, {361, 70}}Ø{‚ƒ…òõTøþ€4€,€“€:€@€1ožAnonym systeminformation hjälper oss planera framtida utvecklingsarbete. Kontakta oss gärna om du har frågor kring detta. Detta är informationen som skickas:Z{365, 254}Ò78ýþ¤þ¬­;\NSCustomView\moreInfoViewÔXYZ[€€€T€š_toggleMoreInfo:ØXYZ    ëYNSKeyPathYNSBindingYNSOptions_NSNibBindingConnectorVersion€£€€ž€€;€œ€Ÿ_hidden: shouldAskAboutProfileVhidden_shouldAskAboutProfileÓ>WNS.keys€¢¡€ ¡€¡_NSValueTransformerName_NSNegateBooleanÒ78 ¢ ;\NSDictionaryÒ78"%£#$;_NSNibBindingConnector^NSNibConnector_NSNibBindingConnector×XYZ  )*,뀣€€§€¦€F€¥[value: iconUvalueTicon×XYZ  23*\6뀣€©€±€¦€}€°Ø89:;<=>l@lBClll_NSFilterRestrictsInsertion_NSPreservesSelection__NSManagedProxy^NSDeclaredKeys_"NSClearsFilterPredicateOnInsertion_NSSelectsInsertedObjects_NSAvoidsEmptySelection €¯ €­€ª Ò>FI€W¢JK€«€¬ZvisibleKey\visibleValueÑO€®Ò78QS¢R;__NSManagedProxy__NSManagedProxyÒ78UY¤VWX;_NSArrayController_NSObjectController\NSController_NSArrayController_#value: arrangedObjects.visibleValue_arrangedObjects.visibleValueØXYZ   _*bc뀣€€´€¦€;€³€µ_value: shouldSendProfile_shouldSendProfileÓ>hk€¢¢ij€¶€·¢lm€¸€¹_NSNullPlaceholder_NSValidatesImmediately ×XYZ  tu2w뀣€€½€¼€©€»_+contentArray: systemProfileInformationArray\contentArray_systemProfileInformationArray×XYZ  ~*뀣€€À€¦€6€¿_value: promptDescription_promptDescription×XYZ  2‡*[Šë€£€©€Ã€¦€r€Â_!value: arrangedObjects.visibleKey_arrangedObjects.visibleKeyØXYZ    ”뀣€€ž€€T€œ€ÅÓ>—™€¢¡€ ¡€¡Ò>œ€Î¯¶ÿ]¢Ôgj\)®2õ[€€&€6€ €Ç€ € €F€€T€;€x€}€l€€h€É€©€f€rÒ23´€€È]NSApplicationÓ;·¸¹l_NSAppliesImmediately€Í€Ê Ò>F½€W¢¾¿€Ë€Ì_SUIncludeProfile_SUSendProfileInfoÒ78ÃÆ£ÄÅ;_NSUserDefaultsController\NSController_NSUserDefaultsControllerÒ78ÈØ¢Ø;Ò>œˀίggggÔg\gg[)õõ)€ € € € €€€ € €}€ € €r€l€h€f€f€€€€lÒ>œâ€Î¯¶ÿ]¢Ôgj\)®2õ[€€&€6€ €Ç€ € €€F€€T€;€x€}€l€€h€É€©€f€rÒ>œú€Î¯ûüýþÿ     €Ò€Ó€Ô€Õ€Ö€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€â€ã€ä€å€æoPush Button (Sök automatiskt)o2Static Text (Sök efter uppdateringar automatiskt?)_Static Text (DO NOT LOCALIZE)_Push Button (Nej tack)[Application\Profile Info\Content View\File's Owner_Image View (NSApplicationIcon)_Text Field CellZDisclosure_.Check Box (Inkludera anonym systeminformation)_Text Field Cell-1\Table ColumnZTable Viewo¬Static Text (Anonym systeminformation hjälper oss planera framtida utvecklingsarbete. Kontakta oss gärna om du har frågor kring detta. Detta är informationen som skickas:)_!Bordered Scroll View (Table View)_User Defaults Controller_Array Controller\MoreInfoView^Table Column-1Ò>œ'€Î Ò>œ*€Î Ò>œ-€Î¯$H¶KÿT]QI¢Ôgj\)L®J2õ[POMUNVSR€ €€a€&€6€¾€ €¨€€Ç€ € €€F€€T€;€x€}€l€€c€h€É€€©€f€r€¤€›€e€Á€™€Ä€º€²Ò>œT€Î¯$UVWXYZ[\]^_`abcdefghijklmnopqrstuvwx€ë€ì€í€î€ï€ð€ñ€ò€ó€ô€õ€ö€÷€ø€ù€ú€û€ü€ý€þ€ÿ     ‘ „ !¡0ÿÿÿÿÿÿÿý•%-G"+,).…(1~'*‚/ƒ‹”Ò>Fž€W Ò>œ¡€Î Ò>œ¤€Î Ò78¦§¢§;^NSIBObjectData"'1:?DRTf–áèïý+9EQ_jx”¢µÇáëøúýÿ   )579T]fqv…Ž¡ªµ·¸ÁÈÕÛäæ   !#%6DMUWY[]~˜Ÿ¨²»ÇÉËÍÏÒÓÕ×ôÿ  2gs‰ž­ÀÒÝçõ"')+-/13579;@IRcjqz|…‡Š— ¥¬­¯¸ÁÎÛâëöÿ *3:RartvxzŸ¥§©«­°±³µÎ          " ' 0 Q S d f h j l ª · Å Ï Ý ê ô   $ 0 2 4 6 8 = ? A C E G I d m w y ‚ ‹ ’ ¤ ­ ¶ ¸ ½ Æ È × Ù Û Ý ß á ã å        0 Q e q v x z | ~ € … ‡ Ò ã å î ð ó   $ 1 = K M O Q S U \ i v ~ € ‚ Ž — œ ¤ ¹ » ½ ¿ Á Ô á ã æ ï ø   ' 2 > _ a c e g j k m o ˆ © ® ° ² ´ ¶ ¸ ½ ¿ Ñ â ä í ï ò!#<uƒŒŽ’”–˜šœž ¥ªÏÜëíïñù #,8:<ENSi’©«­¯°²´·¸º¼ÅÇÔÖØÚÜÞàüLd…¢¹Úâêòý !5>EQXalx™›Ÿ¡¤¥§©Àñöøúüþ &5=HQXp{˜¡¦¹ÀÉÐçö   /1357N_aceg„’”–™›Ÿ¨ª¯±³äðù .02469;NQSUWYbdkmoq𤮏º¼¾ÀÂÅÇÉËÍÖØÛÝ(JTiv¬ÇÓò (14679;=?HSdfhjm„–¤²»½ÂÄÆëú)4?KLNPY[dmoŒ‘“•—™›¨ª¶ËÍÏÑÓåîù !5RWY[]_df{}ƒ™¦¨«´¹Çìíïñúü-2468:<Y^`bdfkm‚„†ˆŠ”¡£¨±¼ÈÔë!*3>cluƒ…‡Š“•— ¸ÅÎÙä   $@W`iv“•—™›žŸ¡¹Úßáãåçéîð/:CLYfwy{}‘²¼ÆÐïñóõ÷ùûý$<IQSVX[]vˆ‘–£¬³ËÚò'-2OQSUWY[|™°ÂÑö  * + - . 0 2 3 4 5 > @ E G I T a f h q v ˆ š £ ¬ À Õ â ö!!;!\!^!`!b!d!f!h!j!…!™!¦!¨!­!¯!±!¶!¸!º!Î!ç!è""" " " """?"L"l"‰"‹"""‘"“"•"°"Ä"á"ã"å"ç"é"ë"í##.#O#Q#S#U#W#Y#[#]#j#l#o#q#t#v###¬#®#°#²#´#¶#¸#º#¼#¾#À#Â#Ä#Æ#È#Ê#Ì#Î#Ð#Ò#Ô#Ý#ß#á#ï#ü$$$$$!$#$($*$,$?$S$\$c$~$‹$¦$¯$´$½$¿$ê$ì$î$ð$ò$ô$ö$ø$ú$ü$þ%%%%%% % %%%%%%J%L%N%P%R%T%V%X%Z%\%^%`%b%d%f%h%j%l%n%p%r%t%}%%¬%®%°%²%´%¶%¸%º%¼%¾%À%Â%Ä%Æ%È%Ê%Ì%Î%Ð%Ò%Ô%Ö&&z&š&³&¿&Ì&Ù&æ'''$'U'i'v'(Ü))).);)J)S)U)V)_)a)b)k)m)¸)º)¼)¾)À)Â)Ä)Æ)È)Ê)Ì)Î)Ð)Ò)Ô)Ö)Ø)Ú)Ü)Þ)à)â)ä)æ)è)ê)ì)î)ð)ò)ô)ö)ø)ú)ü)þ** * *V*X*Z*\*^*`*b*d*f*h*j*l*n*p*r*t*v*x*z*|*~*€*ƒ*†*‰*Œ**’*•*˜*›*ž*¡*¤*§*ª*­*¯*±*³*µ*·*¹*»*½*¿*È*Ê*Ì*Î*Ð*Ò*Ô*Ö*Ø*Ú*Ü*Þ*à*â*ä*æ*è*ê*ì*î*ð*ò*ô*ö*ø*ú++++++++++'+,¨+;transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031212442116661031152 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239409.263016571 30 atime=1418239409.263016571 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.n0000644000175000017500000000253612442116661035262 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController ACTIONS finishPrompt id toggleMoreInfo id CLASS SUUpdatePermissionPrompt LANGUAGE ObjC OUTLETS delegate id descriptionTextField NSTextField moreInfoButton NSButton moreInfoView NSView SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000013212442116661031152 xustar0030 mtime=1418239409.262016554 30 atime=1418239409.262016554 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nib0000644000175000017500000000105112442116661035062 0ustar00mikedldmikedld00000000000000 IBFramework Version 670 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 6 IBSystem Version 10A96 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/PaxHeaders.4960/SUUpdateAlert.nib0000644000000000000000000000013212442116660027452 xustar0030 mtime=1418239408.946011139 30 atime=1418239408.539004164 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116660031154 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdateAlert.nib/PaxHeaders.4960/keye0000644000000000000000000000013212442116660030407 xustar0030 mtime=1418239408.946011139 30 atime=1418239408.946011139 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdateAlert.nib/keyedobjects.nib0000644000175000017500000002370412442116660034327 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯ï 156<=AEW_yz{|€„Œ˜©²³´µ¶·¸¹ÇÌÍÎÑÔÚâãðñùúý  '(/05=>RSWXY\_ghpqsz{„…†˜œ¢¦¹ÉÊËÌÍÎÏÐÑÒÓ ÔÚåæçèIéíðó÷øúûü  &*23=>BCFGHIJMNRWX[`afglmrsxyƒ„…†‰’“”•›œŸ§¨©¯¶·¸¿ÀÁÉÏÖÚÞßàèî*<=>?@ABCDEFGHIJKNQs•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­”®¯°±²µ¸»U$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€î€²€É€í€€·€€È€Ê€¸€ë€€€¶€ì§€ËÒ234[NSClassName€€]SUUpdateAlertÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€g¯HIJKLMNOPQRSTUV€ €…€ˆ€Š€Œ€Ž€€’€—€Ÿ€£€¦€©€«€°ÔXYZ[\^]NSDestinationXNSSourceWNSLabel€„€ €€ƒÝ`abcdefghijklmnopqrstuvwx\NSWindowView\NSScreenRect_NSFrameAutosaveName]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€€‚€€%€ ÿÿÿÿðx€ € €€€€_{{248, 386}, {586, 370}}_ProgramuppdateringXNSWindowÒ}~YNS.string€TViewÒ78‚£‚ƒ;_NSMutableStringXNSStringÔ…†‡+‰Š‹_NSNextResponderZNSSubviews[NSFrameSize€€i€€~Ò>FŽ€g©‘’“”•–—€€"€3€8€A€F€K€s€wÙ…™š›œžŸl¡¢£¤¥¦£lWNSFrameZNSEditableVNSCell[NSDragTypesXNSvFlagsYNSEnabled[NSSuperview€€!€ €€ €Ò>?«€¦¬­®¯°±€€€€€€_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{24, 291}, {64, 64}}غ»¼½¾¿ÀÁÂÃÄÃÃÅÆ[NSCellFlagsWNSStyleZNSContentsWNSAlignWNSScale\NSCellFlags2ZNSAnimatesþ€ €Ó2ÈÉÊË^NSResourceName€€€WNSImage_NSApplicationIconÒ78ÏТÐ;_NSCustomResourceÒ78ÒÓ£Ó›;[NSImageCellÒ78ÕÖ¥ÖרÙ;[NSImageViewYNSControlVNSView[NSResponder×…™›žŸlÜÝÞߣl€€2€#€$ €_{{106, 338}, {443, 17}}غä¼åæ¿çèéêoìîï_NSBackgroundColorYNSSupport]NSControlView[NSTextColorþ€1€)€%€&€"@€.PÔòóôõö÷øVNSSizeVNSNameXNSfFlags€(#@*€'_LucidaGrande-BoldÒ78ûü¢ü;VNSFontÕþÿWNSColor\NSColorSpace[NSColorName]NSCatalogName€-€,€+€*VSystem\controlColorÓÿ   WNSWhite€-K0.66666669Ò78þ¢þ;Õþÿ€-€0€/€*_controlTextColorÓÿ  €-B0Ò78¤›;_NSTextFieldCell\NSActionCellÒ78¥רÙ;[NSTextField×…™›žŸlÜ#$¦£l€€2€4€5 €_{{106, 280}, {443, 14}}غä¼åæ¿çèéê+,‘îï€1€)€6€7€3€.\Information:Ôòóôõ2÷4€(#@&€' ×…™›žŸl789:£l€€@€9€:! €_{{296, 12}, {158, 32}}ݺ?@ABC¼åæD¿EèFoHIJKLJ’OPQ_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalent_NSPeriodicDelay]NSButtonFlags€?€%€<€>€;€<€8Èÿÿÿÿ†‚@ÿoPåminn mig senareÔòóôõöUV€(€=\LucidaGrandeQÒ78Z[¤[›;\NSButtonCellÒ78]^¥^רÙ;XNSButton×…™›žŸl7bcd£l€€@€B€C €_{{103, 12}, {179, 32}}ݺ?@ABC¼åæD¿EèFoHIJlmJ“OPQ€?€%€<€E€D€<€A_Ignorera denna versionÒ}~ð€×…™›žŸl7vw:£l€€@€G€H €_{{454, 12}, {118, 32}}ݺ?@ABC¼åæD¿E|FoHIJ€J”OPQÿÿÿÿ„þ€?€%€<€J€I€<€F]Installera nuQ Ý…‡ˆ™‰†Š‹ŒŸl ‘Æ“”I•Ãl—YNSBoxType[NSTitleCell]NSTransparent\NSBorderTypeYNSOffsets_NSTitlePosition]NSContentView€€r€l€j€L€k€€MÒ>Fš€g¡—€MÕ…™†Ÿ•‰Ÿ •€K€i€h€N€KÒ>F¤€g¡¥€OÜ…™§¨œ©ª«Ÿ¬—®¯£±²³oÆo—¸ZAllowsUndo[PreferencesYGroupName_UseBackForwardListYFrameName]NSNextKeyView€M€f€[ €]€P€%€%€M€\Ò>?»€­¼½¾°ÀÁÂÃįƱÈ€Q€R€S€€T€U€V€W€X€€Y€€ZZpublic.url_NeXT RTFD pasteboard type_NSStringPboardType_Apple URL pasteboard type_WebURLsWithTitlesPboardType_!Apple Web Archive pasteboard type_public.url-name_Apple HTML pasteboard type_NSColor pasteboard type_*NeXT Rich Text Format v1.0 pasteboard type_{{-1, 0}, {456, 197}}ÓÕÖ×oÙZIdentifierVValues€e€%€^ÓÛ>ÜÝáWNS.keys€d£Þßà€_€`€a£âãâ€b€c€b_WebKitDefaultFixedFontSize_WebKitMinimumFontSize_WebKitDefaultFontSize Ò78êë£ëì;_NSMutableDictionary\NSDictionaryÒ78îï¢ï;^WebPreferencesÒ78ñò¤òØÙ;WWebViewÒ78ôõ£õö;^NSMutableArrayWNSArray_{{1, 1}, {455, 197}}Ò78ùØ£ØÙ;_{{109, 76}, {457, 199}}V{0, 0}׺ä¼å¿çèéþoÀ1€n€%€m€qÔòóôõ2U€(€=Õþÿ €-€p€o€*_textBackgroundColorÓÿ  €-B1Óÿ  €-M0 0.80000001Ò78¤ØÙ;UNSBox×…™›žŸlÜ£l€€2€t€u €_{{106, 302}, {463, 28}}غä¼åæ¿çèéêo"–$ï€1€)€%€v€s@€.Ôòóôõ2U)€(€= ×…™›žŸl7-./£l€€@€x€y €_{{106, 50}, {442, 16}}ݺ?@ABC¼åæD¿EèFoHu6o8"—O;<€?€%€{€%€z€v€wHLadda hem och installera uppdateringar automatiskt i framtidenÒ?@A[NSImageName€}€|XNSSwitchÒ78DE¢E;_NSButtonImageSourceZ{586, 370}_{{0, 0}, {1280, 778}}W{0, 22}_{3.40282e+38, 3.40282e+38}Ò78KL¢L;_NSWindowTemplateVwindowÒ78OP£PQ;_NSNibOutletConnector^NSNibConnectorÔXYZS’V€‡€€8€†^remindMeLater:Ò78YZ£ZQ;_NSNibControlConnectorÔXYZ[\_€„€€ €‰XdelegateÔXYZS”e€‡€€F€‹^installUpdate:ÔXYZS“k€‡€€A€_skipThisVersion:ÔXYZ[–q€„€s€€[descriptionÔXYZ[¥w€„€O€€‘_releaseNotesView×Xz{YZ|}€–‚uYNSKeyPathYNSBinding_NSNibBindingConnectorVersion€–€€•€”€s€“_value: descriptionTextUvalue_descriptionTextÒ78‡ˆ£ˆQ;_NSNibBindingConnectorØXz{YZŠ|}Ž•‘uYNSOptions€–€€š€™€K€˜€›_hidden: showsReleaseNotesVhidden_showsReleaseNotesÓÛ>–—™€ž¡˜€œ¡š€_NSValueTransformerName_NSNegateBooleanÒ78žì¢ì;ØXz{YZŠ|}¢Ž—¥¦u€–€€¡€™€w€ €¢_hidden: allowsAutomaticUpdates_allowsAutomaticUpdatesÓÛ>–«­€ž¡˜€œ¡š€×Xz{YZ|}²€µu€–€€¥€”€"€¤_value: titleTextYtitleText×Xz{YZ|}»€¾u€–€€¨€”€€§_value: applicationIcon_applicationIconØXz{YZŠ|}Ž¥Èu€–€€š€™€O€˜€ªÓÛ>–ËÍ€ž¡˜€œ¡š€×Xz{YZ|}ÑÒ€—Õu€–€¬€¯€”€w€®Òר£_NSSharedInstance€­ Ò78ÛÜ£ÜÝ;_NSUserDefaultsController\NSController_#value: values.SUAutomaticallyUpdate_values.SUAutomaticallyUpdateØXz{YZŠ|}Ž‘çu€–€€š€™€3€˜€±ÓÛ>–ê쀞¡˜€œ¡š€Ò>ïð€µ¯\•—“Ñö¥‘—l”’–€ €K€w€A€¬€³€"€O€3€M€€F€8€s€Ò23€€´]NSApplicationÒ78ö¢ö;Ò>¯llll—l•\llll€€€€€€€€M€€K€ €€€€Ò>¯\•—“Ñö¥‘l’”–€ €K€w€A€¬€³€"€O€3€€8€F€s€€Ò>ï,€µ¯-./0123456789:;€¹€º€»€¼€½€¾€¿€À€Á€Â€Ã€Ä€Å€Æ€Ç_Update Alert (release notes)SBox_DCheck Box (Automatically download and install updates in the future)_Push Button (Skip This Version)_Shared Defaults[Application]Static Text-1XWeb View_Static Text (Release Notes:)\Content View_Push Button (Remind Me Later)_Push Button (Install Update)[Static Text_Image View (NSApplicationIcon)\File's OwnerÒ>ïM€µ Ò>ïP€µ Ò>ïS€µ¯•“JMRÑöT‘l’”–NI\—LPSUO—Q¥KHV€K€A€ˆ€Ž€£€¬€³€©€3€€8€F€s€€€…€ €w€Œ€"€—€¦€«€’€M€Ÿ€O€€Š€ €°Ò>ïu€µ¯vwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ó€Ô€Õ€Ö€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€â€ã€ä€å€æ€ç€è€é€êY2i ]ÿÿÿÿÿÿÿý¡Le¥ "u! ¤ ‡g¦MEHÒ>F´€g Ò>ï·€µ Ò>ﺀµ Ò78¼½¢½;^NSIBObjectData"'1:?DRTfGM˜Ÿ¦´Æâðü!/KYl~˜¢¯±³µ·¹»½¿ÁÃÅÇÉËÍÏÑÓÜèêìú +4GP[]^gn{ŠŒ­¯±³µ·¹»½¿ÁÃÅÇÉËÜêóûýÿ8ERhv€Ž›¥·ËÕáãåçéëôöøúüþ2;DNPU^ew€‘£®º¼¾ÀÂËÍàâäæèêìîðò*1=FP\^`bcegjkmvx…‡‰‹‘­Éý6SkŒ˜ «³»ÈÓØÚÜÞãäñ     " + 0 C L S _ h s  ‰ œ ¹ » ½ ¿ Á Ä Å Ç á   . : ? A C E G I N P Q b i p y { „ † ‰ ¦ « ² Ç Ï Ü è ö ø ú ü þ   ! ) + - 9 B G \ ^ ` b d w „ † ‰ ’ › ­ º Ã Î Ú ÷ ù û ý ÿ   = ? A C E G I V g i r t w ” – ˜ š œ Ÿ   ¢ » ð   * = O a o q s u w y { }  ƒ ˆ ‘ ¶ Ç É Ë Î Û Ý æ ï ü68:<>ABD]’”–˜šœž ¹ÂÄáãåçéêì:CEGIKMOQ_a– ¬ºÇÑãñóõ÷ùúüþ )+-/13<>ACt‹•ª´ÂÄÆÈÉËÍÐÒÓÕ×Ùâäÿ   $@Uq³Åâü)ANY`bdfs{}„†ˆŠ‘“•—´Ìäæïö "'6?HPY`owŽ—ž¸¿ÜÞàâäæ÷ùûý0=?BOQ_hqw”–˜šœŸ ¢¼Ýßáãåçìîÿ#%')+./1Jƒ…‡‰‹’—Øáíïñú)AIfot‡Ž—žµÄÕ×ÙÛÝìõü%')+-6GIKMO^oqsuwŠ›Ÿ¡£¯ÀÂÄÆÈÛø +-/1357PVhqx±»½¿ÁÃÅÇÉåì 2DMRsuwy{}¢»ÈÊÍÏÒÔñóõ÷ùûý79;=?AC\n‘“•—™›ª¬¯±´¶ÓÕ×ÙÛÝßèûýþ)6\{œž ¢¤¦¨ª·¹¼¾ÁÃÌÎïñóõ÷ùûýÿ   (16?Abdfhjlnprtvxz|~€‰‹¬®°²´¶¸º¼¾ÀÂÄÆÈÊÓÕöøúüþ  37~ ²¾ÌÕô!@Lmzƒ…†‘’›Þàâäæèêìîðòôöøúüþ  %'hjlnprtvxz|~€‚„†ˆŠŒŽ’”–˜šœž ¢¤¦¨ª¬®°²»½¿ÁÃÅÇÉËÍÏÑÓÕ×ÙÛÝßáãåçðòóüþÿ   ¾ (transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdateAlert.nib/PaxHeaders.4960/clas0000644000000000000000000000013212442116660030374 xustar0030 mtime=1418239408.946011139 30 atime=1418239408.946011139 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdateAlert.nib/classes.nib0000644000175000017500000000176112442116660033310 0ustar00mikedldmikedld00000000000000{ IBClasses = ( { CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { CLASS = NSApplication; LANGUAGE = ObjC; SUPERCLASS = NSResponder; }, { CLASS = NSObject; LANGUAGE = ObjC; }, { ACTIONS = { installUpdate = id; remindMeLater = id; skipThisVersion = id; }; CLASS = SUUpdateAlert; LANGUAGE = ObjC; OUTLETS = { delegate = id; description = NSTextField; releaseNotesView = WebView; }; SUPERCLASS = SUWindowController; }, { CLASS = SUWindowController; LANGUAGE = ObjC; SUPERCLASS = NSWindowController; } ); IBVersion = 1; }transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdateAlert.nib/PaxHeaders.4960/info0000644000000000000000000000013212442116660030405 xustar0030 mtime=1418239408.946011139 30 atime=1418239408.946011139 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000106312442116660032601 0ustar00mikedldmikedld00000000000000 IBDocumentLocation 69 14 356 240 0 0 1280 778 IBFramework Version 489.0 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBSystem Version 9D34 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/PaxHeaders.4960/Sparkle.strings0000644000000000000000000000013212442116661027313 xustar0030 mtime=1418239409.262016554 30 atime=1418239409.262016554 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/Sparkle.strings0000644000175000017500000001771612442116661030754 0ustar00mikedldmikedld00000000000000þÿ/* No comment provided by engineer. */ "%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ har laddats ned och är redo att användas! Vill du installera det och därefter starta om %1$@?"; /* No comment provided by engineer. */ "%1$@ can't be updated when it's running from a disk image. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ kan inte uppdateras när det körs från en skivavbild. Flytta %1$@ till din Program-mapp, starta det därifrån och testa igen."; /* No comment provided by engineer. */ "%@ %@ is currently the newest version available." = "%1$@ %2$@ är just nu den nyaste versionen."; /* No comment provided by engineer. */ "%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ finns nu att tillgå, du har %3$@. Vill du ladda hem den nyare versionen nu?"; /* No comment provided by engineer. */ "%@ of %@" = "%1$@ av %2$@"; /* No comment provided by engineer. */ "A new version of %@ is available!" = "En ny version av %@ finns tillgänglig!"; /* No comment provided by engineer. */ "A new version of %@ is ready to install!" = "En ny version av %@ finns för installation!"; /* No comment provided by engineer. */ "An error occurred in retrieving update information. Please try again later." = "Kunde inte hämta information om uppdateringar. Försök igen senare."; /* No comment provided by engineer. */ "An error occurred while downloading the update. Please try again later." = "Ett fel uppstod när uppdateringen laddades ned. Försök igen senare."; /* No comment provided by engineer. */ "An error occurred while extracting the archive. Please try again later." = "Kunde inte extrahera arkivet. Försök igen senare."; /* No comment provided by engineer. */ "An error occurred while installing the update. Please try again later." = "Ett fel uppstod när uppdateringen installerades. Försök igen senare."; /* No comment provided by engineer. */ "An error occurred while parsing the update feed." = "Ett fel uppstod vid tydandet av uppdateringsinformationen."; /* No comment provided by engineer. */ "An error occurred while parsing the update feed: %@" = "Ett fel uppstod vid tydandet av uppdateringsinformationen: %@"; /* No comment provided by engineer. */ "An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Ett fel uppstod vid omstarten av %1$@. Den nya versionen kommer startas nästa gång du manuellt kör %1$@."; /* the unit for bytes */ "B" = "B"; /* No comment provided by engineer. */ "Cancel" = "Avbryt"; /* No comment provided by engineer. */ "Cancel Update" = "Avbryt uppdateringen"; /* No comment provided by engineer. */ "Checking for updates..." = "Söker efter uppdateringar..."; /* No comment provided by engineer. */ "Downloading update..." = "Hämtar uppdatering &"; /* No comment provided by engineer. */ "Extracting update..." = "Extraherar uppdatering &"; /* the unit for gigabytes */ "GB" = "GB"; /* No comment provided by engineer. */ "Install and Relaunch" = "Installera och starta om"; /* No comment provided by engineer. */ "Installing update..." = "Installerar uppdatering &"; /* the unit for kilobytes */ "KB" = "KB"; /* the unit for megabytes */ "MB" = "MB"; /* No comment provided by engineer. */ "OK" = "OK"; /* No comment provided by engineer. */ "Ready to Install" = "Klar att installera"; /* No comment provided by engineer. */ "Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Ska %1$@ automatiskt söka efter uppdateringar? Du kan alltid söka manuellt från %1$@-menyn."; /* No comment provided by engineer. */ "Update Error!" = "Uppdateringsfel!"; /* No comment provided by engineer. */ "Updating %@" = "Uppdaterar %@"; /* No comment provided by engineer. */ "You already have the newest version of %@." = "Du har redan den senaste versionen av %@."; /* No comment provided by engineer. */ "You're up-to-date!" = "Du har senaste versionen."; transmission-2.92/macosx/Sparkle.framework/Resources/PaxHeaders.4960/de.lproj0000644000000000000000000000013112442116660024160 xustar0029 mtime=1418239408.46700293 30 atime=1418239407.182980926 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/0000755000175000017500000000000012442116660025663 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/PaxHeaders.4960/SUAutomaticUpdateAlert0000644000000000000000000000013212442116660030512 xustar0030 mtime=1418239408.073996196 30 atime=1418239407.182980926 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116660032763 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000031512442116660030741 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239408.073996196 30 atime=1418239408.073996196 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobject0000644000175000017500000001615612442116660035207 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯£ 156<=AEPXpqrvz} Š”¤­®¯°±²³´ÂÇÈÉÌÏÕÝÞëóô÷ #$+01:;NOSTWZbcklmuv~‰Š–—›œ› £§ ¨ª«¬­°±µº»¾ÃÄÉÊÔÕÖ×Úáåéêëòóôûüý .=>?@ABCDEFGHILOfþ}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ“–™U$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€¢€t€ˆ€¡€€y€€‡€‰€z€Ÿ€€€x€ %€ŠÒ234[NSClassName€€_SUAutomaticUpdateAlertÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€S¨HIJKLMNO€ €]€`€b€d€i€n€qÔQRSTUW]NSDestinationXNSSourceWNSLabel€\€ €€[ÜYZ[\]^_`abcdefghijklmno\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€€Z€W€ px€ € €Y€X€_{{114, 521}, {680, 152}}PÒstuYNS.string€XNSWindowÒ78wx£xy;_NSMutableStringXNSStringÒst|€TView×~€u‚ƒ„…†‡ƒ‰_NSNextResponderZNSSubviewsXNSvFlags[NSFrameSize[NSSuperview€€V€€T€€UÒ>FŒ€S§Ž‘’“€€#€3€8€@€E€JÚ~•–—˜€™u‚d›œžŸ ƒdWNSFrameZNSEditableVNSCell[NSDragTypesYNSEnabled€€"€ €€ €€Ò>?¦€¦§¨©ª«¬€€€€€€_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{23, 73}, {64, 64}}ص¶·¸¹º»¼½¾¿¾¾ÀÁ[NSCellFlagsWNSStyleZNSContentsWNSAlignWNSScale\NSCellFlags2ZNSAnimatesþ€!€Ó2ÃÄÅÆ^NSResourceName€ €€WNSImage_NSApplicationIconÒ78ÊË¢Ë;_NSCustomResourceÒ78ÍΣΗ;[NSImageCellÒ78ÐÑ¥ÑÒÓÔ;[NSImageViewYNSControlVNSView[NSResponderØ~•—€™u‚d×ØÙ ƒd€€2€$€% €€_{{105, 120}, {389, 17}}صß·àáºâãäågçŽéê_NSBackgroundColorYNSSupport]NSControlView[NSTextColorþ€1€)€ €&€#@€.ÔìíîïðñòVNSSizeVNSNameXNSfFlags€(#@*€'_LucidaGrande-BoldÒ78õö¢ö;VNSFontÕøùúûüýþÿWNSColor\NSColorSpace[NSColorName]NSCatalogName€-€,€+€*VSystem\controlColorÓùüWNSWhite€-K0.66666669Ò78 ø¢ø;Õøùúûü þ €-€0€/€*_controlTextColorÓùü€-B0Ò78¤—;_NSTextFieldCell\NSActionCellÒ78¥ÒÓÔ;[NSTextFieldØ~•—€™u‚d׃d€€2€4€5 €€_{{105, 81}, {558, 31}}صß·àáºâãäåg(éê€1€)€ €6€3€.Ôìíîï-./€(#@&€7 \LucidaGrandeØ~•—€™u‚d3456ƒd€€?€9€: €€_{{456, 12}, {210, 32}}ݵ<=>?@·àáAºBãCgEmFGHFKLM_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalent_NSPeriodicDelay]NSButtonFlags€>€ €<€=€;€<€8Èÿÿÿÿ†‚@ÿ_Installieren und neustartenÔìíîïð.R€(€7Q Ò78UV¤V—;\NSButtonCellÒ78XY¥YÒÓÔ;XNSButtonØ~•—€™u‚d3]^6ƒd€€?€A€B €€_{{254, 12}, {202, 32}}ݵ<=>?@·àáAºBãCgEmFghF‘KLM€>€ €<€D€C€<€@_Beim Beenden installierenQØ~•—€™u‚d3pq†ƒd€€?€F€G €€_{{102, 12}, {147, 32}}ݵ<=>?@·àáAºBãCgEmFz{F’KLM€>€ €<€I€H€<€E_Nicht installierenÒstq€Ø~•—€™u‚d3„…†ƒd€€?€K€L €€_{{105, 58}, {419, 18}}Þµ<‹=>?@·àáAºBãCgŽElg‘(“K”•]NSNormalImage€>€ €N€P€ €M€6€JHþÿ€w«d’“ŽUÜ‘€€E€8€J€u€#€ €j€3€@€Ò23 €€v]NSApplicationÒ78¦¢¦;Ò>þ€w«Uddddddd€ €€€€€€€€€€Ò>þ!€w¬d’“ŽUÜ‘€€E€8€J€u€#€ €€j€3€@€Ò>þ0€w¬123456789:;<€{€|€}€~€€€€€‚€ƒ€„€…€†\Content View_ Push Button (Nicht installieren)_)Push Button (Installieren und neustarten)_RCheck Box (Aktualisierungen in Zukunft automatisch herunterladen und installieren)[Application[Static TextVWindow\File's Owner_Shared Defaults]Static Text-1_'Push Button (Beim Beenden installieren)_Image View (NSApplicationIcon)Ò>þK€w Ò>þN€w Ò>þQ€w¯dKUOÜ’N“HJŽLI‘M€€b€u€ €q€j€€E€n€8€J€ €`€#€d€€]€3€@€iÒ>þh€w¯ijklmnopqrstuvwxyz{|€‹€Œ€€Ž€€€‘€’€“€”€•€–€—€˜€™€š€›€œ€€ž#ÿÿÿÿÿÿÿý " $! Ò>F’€S Ò>þ•€w Ò>þ˜€w Ò78𛢛;^NSIBObjectData"'1:?DRTf¯µ.JXdp~‰—³ÁÔæ !#%')+-/13579;DPRTmvŠž§ºÃÎÐÑÚáîôýÿ 1?HPRTVX‰–£±»ÉÖàò "$)+-/1357RS\fhqz“œ¥§¬ÉÛæïû   !02468:<>goz—™›ž ¢¥¦¨ª³µÂÄÆÈÊÌÎê:Rs§ÈÔÜçï÷ -<>@BJ^glˆ›¤¯»ÅÌØùûýÿ     A U _ m y ~ € ‚ „ † ˆ   § ® · ¹ Â Ä Ç Û ä é ð   & 4 6 8 : < > E R _ g i k w € … š œ ž   ¢ µ Â Ä Ç Ð Ù ë ø   9 ; = ? A D E G I b ƒ … ‡ ‰ ‹   ¢ « ­ ° ½ Þ à â ä æ é ê ì î  < R g v ‰ › ­ » ½ ¿ Á Ã Å Ç É Ë Í Ò Û ù     % 2 ; F O p r t v x y { } – Ë Í Ï Ñ Ó Õ × Ù õ ÷ !#%>suwy{}–Ÿ¡ÂÄÆÈÊËÍÏè!/13579;=?DI’Ÿ¡£¥®·ÃÅÇÐÕëôû &-FQnw|–Ÿ¦½ÌÝßáãåñú*,.02@QSUWYg„Ž˜·¹»½¿ÁÃÖÜæïö+-/1357@SUV_fŽ´Óðòôöøúü'DFHJLNPi{„†Ÿ¡£¥§©«­¯±³¼¾ÀÎ×Üåçþ  8:<>@BDFHJLNPY[tvxz|~€‚„†ˆŠŒ™¼è=IU\i{‰³ÔÝßàéëìõ÷"$&(*,.02468:<>@BDFHJSU€‚„†ˆŠŒŽ’”–˜šœž ¢¤¦¨ª³µ·¹»½¿ÁÃÅÇÉËÍÏÑÓÕÞàáêìíöøùœtransmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000013212442116660030736 xustar0030 mtime=1418239408.073996196 30 atime=1418239408.073996196 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nib0000644000175000017500000000217012442116660035112 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController ACTIONS doNotInstall id installLater id installNow id CLASS SUAutomaticUpdateAlert LANGUAGE ObjC SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000013212442116660030736 xustar0030 mtime=1418239408.072996178 30 atime=1418239408.072996178 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nib0000644000175000017500000000105012442116660034404 0ustar00mikedldmikedld00000000000000 IBFramework Version 667 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 6 IBSystem Version 9D34 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/PaxHeaders.4960/SUUpdatePermissionProm0000644000000000000000000000013212442116660030562 xustar0030 mtime=1418239408.468002948 30 atime=1418239408.270999572 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/0000755000175000017500000000000012442116660033377 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031712442116660031116 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239408.468002948 30 atime=1418239408.468002948 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobje0000644000175000017500000003160512442116660035270 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯ 156<=AEW_lq†Œšž½¾ÃÄÉÎàìíõöùþ   $%(-.03:@GKPQTWX]^adpqru~€ƒŠ‹”•š›žÇÈŸ¢£§¬µ¼ ½ÑÒרÛÞßâçïð÷øùþ *34=>?HIPQUV^_klqrsvrz}‰’“”•–—˜™£§¨«®·¸ ÃÅÆÇÈËÌÑÖ×ÜÝç÷üýþ    !")*+.6<CDELMNOVWX`abjkÈ·m„‡ˆ’“”—™°Èàáâãäåæçèéêëìíîïðñòóôõøû"IJK»LMNOPQRÇSTUVWXYZ[\]^_`abcdefghijmpsU$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€Ç€é€€Ñ€€è€ê€Ò€€€Ð¢€ëÒ234[NSClassName€€_SUUpdatePermissionPromptÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€/¯HIJKLMNOPQRSTUV€ €N€[€a€—€˜€š€œ€¨€«€³€µ€¸€¼€¿ÔXYZ[\^]NSDestinationXNSSourceWNSLabel€M€ €€L×`abc2d+fghijk_NSNextResponderZNSSubviewsXNSvFlags[NSFrameSize[NSExtension€€K€  €H€I€JÒ>Fn€/¢op€ €AÜ`rstaubvwxy\{|}~€\ƒ„„[NSHScrollerWNSFrameXNSsFlags\NSScrollAmts[NSSuperview[NSVScroller]NSNextKeyView]NSContentView€ €=€@€?€ OA€A€€ €9€€Ò>Fˆ€/£„ƒ{€€9€=Ú`sabŽvxo‘’“”•–—o–YNScvFlagsYNSDocViewYNSBGColor€ €8€4€ €€5€ €Ò>Fœ€/¡–€ß`Ÿ ¡¢£¤¥¦bc§¨©vª«„­®¯°±²³“´µ¶·¸¹„»¼_NSDraggingSourceMaskForNonLocalYNSTvFlags_NSBackgroundColor_NSAllowsTypeSelect\NSCornerView_NSIntercellSpacingWidth_NSColumnAutoresizingStyle_NSIntercellSpacingHeightYNSEnabled[NSGridColor_NSDraggingSourceMaskForLocal^NSTableColumns[NSRowHeight€€3ÿÿÿÿÒÀ€'€#@#@€ €0€€#@,Z{356, 162}Ô`sb+ÀÁ€€€_{{346, 0}, {12, 17}}Ò78ÅÆ¤ÆÇÈ;]_NSCornerViewVNSView[NSResponderÒ>FË€/¢ÌÍ€€,ÙÏÐÑÒÓÔÕÖ·ØÙÚÛÜÝÞ–^NSIsResizeable\NSHeaderCellWNSWidthZNSDataCell^NSResizingMaskZNSMinWidthZNSMaxWidth[NSTableView €+€#@`€##@D#@@€×á¡âãäåæçèéê­ë[NSCellFlagsZNSContentsYNSSupport\NSCellFlags2[NSTextColorþ€"€€€€PÔîïðñòóôVNSSizeVNSNameXNSfFlags€#@&€ \LucidaGrandeÒ78÷ø¢ø;VNSFontÓúûüÜý\NSColorSpaceWNSWhite€K0.33333299Ò78ÿ¢;WNSColorÕúü[NSColorName]NSCatalogName€€!€ €VSystem_headerTextColorÓúûüÜ €B0Ò78¥;_NSTableHeaderCell_NSTextFieldCell\NSActionCellVNSCellØá¡âãäåê–]NSControlView!þ€*€%€$€€€(YText CellÕúü°"€€'€&€_textBackgroundColorÓúûüÜ'€B1Õúü+€€!€)€_controlTextColorÒ78/¤;Ò7812¢2;]NSTableColumnÙÏÐÑÒÓÔÕÖ·Ø678ÜÝÞ– €+€-#@dà€.€×á¡âãäåæçèéê­ë€"€€€€Øá¡âãäåê–€*€%€$€€€(Ò78HI£IJ;^NSMutableArrayWNSArrayÕúüMN€€2€1€YgridColorÓúûüÜS€D0.5Ò78UÖ¥ÖVÇÈ;YNSControl_{{1, 1}, {356, 162}}ÕúüZ[€€7€6€_controlBackgroundColorÓúûüÜ`€K0.66666669Ò78bc¤cÇÈ;ZNSClipViewÙ`estbfvgoojkÂlmooXNSTargetXNSActionYNSPercent€ € €<€:ÿÿÿÿ€€;€ #?é_{{-22, 1}, {11, 125}}\_doScroller:Ò78st¥tVÇÈ;ZNSScrollerÙ`estbfvgoojyzÂmo}€ € €<€>€;€ #?ï±û _{{-100, -100}, {345, 11}}_{{4, 5}, {358, 164}}Ò78‚¤‚ÇÈ;\NSScrollView×`sb§v\…†‡h·\€ €G€B€C € _{{1, 177}, {361, 70}}Øá¡âãä匎êp’þ€*€E€D€€A@€(oÎDas anonymisierte Systemprofil unerstützt uns bei der zukünftigen Entwicklung. Bitte kontaktieren Sie uns, wenn Sie Fragen zum anonymisierten Systemprofil haben. Diese Informationen würden an uns gesendet:ÕúüZ˜€€7€F€\controlColorÒ78œ¥VÇÈ;[NSTextFieldZ{365, 254}Ò78 ¡¤¡ÇÈ;\NSCustomView\moreInfoViewÒ78¤¥£¥¦;_NSNibOutletConnector^NSNibConnectorÔXYZ¨ª«€Z€€O€YØ`sb§­v®¯°±z·³®XNSWindow€P€X€Q€S €R€P×`abc­v³·¸Â¹³»€R€‘€g€€R€_{{134, 12}, {122, 32}}Ý᾿ÀÁÂâãÃäÄŒÅéÇÈÉÊËɪÎÏÐ_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalent_NSPeriodicDelay]NSButtonFlags€W€€U€V€T€U€OÈÿÿÿÿ†‚@ÿ\Nicht suchenÔîïðñÔóÖ€#@*€QÒ78ÙÚ¤Ú;\NSButtonCellÒ78ÜÝ¥ÝVÇÈ;XNSButton]finishPrompt:Ò78àá£á¦;_NSNibControlConnectorÔXYZ[俀M€\€€`Ø`sb§­v®…êëh·³®€P€G€]€^ €R€P_{{104, 81}, {315, 42}}Øá¡âãä匎óêä’€*€E€_€€\€(_DO NOT LOCALIZE_descriptionTextFieldÔXYZ[ûý€M€b€€–Üÿ ®  éÈ\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€P€•€’€px€d€c€”€“€f_{{83, 492}, {438, 168}}Ò­YNS.string€eÒ78£;_NSMutableStringXNSStringÒ€eTViewÒ>F"€/§#ª%ä'()€h€O€m€\€s€~€ŒÙ`sb§­v+®¯./z·³®ÈUNSTag€P€X€i€j €R€P_{{256, 12}, {168, 32}}Þ᾿ÀÁÂâãÃäÄ+5ÅéÇÈÉ9:É#ÎÏÐÈÿÿÿÿ„þ€W€€U€l€k€U€h_Automatisch suchenQ Ø`sb§­v®…BCD·³®€P€G€n€o €R€P_{{104, 114}, {315, 34}}Øá¡âãä匎LM%’€*€E€p€q€m€(_)Automatisch nach Aktualisierungen suchen?ÔîïðñÔST€€r_LucidaGrande-BoldØ`sb§­v®¯YZD·³®€P€X€t€u €R€P_{{104, 53}, {278, 18}}Þá¾`¿ÀÁÂâãÃäÄ5ÅécÇdéfê'Îij]NSNormalImage€W€€w€{€€v€€s€H?‹€¦ŒŽ‘€€€€‚€ƒ€„€…_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{23, 84}, {64, 64}}Øášâ›œäžŸ­ ­È¡·WNSStyleWNSAlignWNSScaleZNSAnimatesþ€Š€ˆ Ó2mno¦€z€x€‰_NSApplicationIconÒ78©ª£ª;[NSImageCellÒ78¬­¥­VÇÈ;[NSImageViewØ`sb§­v®¯±²³·³®€P€X€€Ž €R€P_{{80, 50}, {27, 26}}Ü᾿ÀÂâãÃäÄŒÅéÇ»ééÉ)ÎÀÁ€W€…€€€U€Œ€ÿÿÿÿ¸Ì@ÿZ{438, 168}Ò78ÄÇ£ÇÈ;_{{0, 0}, {1680, 1028}}Z{213, 129}_{3.40282e+38, 3.40282e+38}Ò78ÉÊ¢Ê;_NSWindowTemplateVwindowÔXYZ¨#«€Z€€h€YÔXYZ[)Õ€M€Œ€€™^moreInfoButtonÔXYZ¨)Û€Z€€Œ€›_toggleMoreInfo:×XÞßYZàáâãäÌæYNSKeyPathYNSBinding_NSNibBindingConnectorVersion€§€€¦€¥€€¤Øèéêëìíî·ð·òó···_NSFilterRestrictsInsertion_NSPreservesSelection__NSManagedProxy^NSDeclaredKeys_"NSClearsFilterPredicateOnInsertion_NSSelectsInsertedObjects_NSAvoidsEmptySelection €£ €¡€ž Ò>Fù€/¢úû€Ÿ€ ZvisibleKey\visibleValueÑÿ€¢Ò78ê¢ê;Ò78¤;_NSArrayController_NSObjectController\NSController_!value: arrangedObjects.visibleKeyUvalue_arrangedObjects.visibleKeyÒ78  £ ¦;_NSNibBindingConnector×XÞßYZàáä䀧€€ª€¥€\€©_value: promptDescription_promptDescriptionØXÞßYZàá'YNSOptions€§€€®€­€s€¬€¯_hidden: shouldAskAboutProfileVhidden_shouldAskAboutProfileÓ#>$%'WNS.keys€²¡&€°¡(€±_NSValueTransformerName_NSNegateBooleanÒ78,-¢-;\NSDictionaryØXÞßYZàá)5€§€€®€­€Œ€¬€´Ó#>$8:€²¡&€°¡(€±×XÞßYZàá?ä(B€§€€·€¥€~€¶[value: iconTicon×XÞßYZàáHIâK€§€€»€º€€¹_+contentArray: systemProfileInformationArray\contentArray_systemProfileInformationArray×XÞßYZàáâRäÍU€§€€¾€¥€,€½_#value: arrangedObjects.visibleValue_arrangedObjects.visibleValueØXÞßYZàá[ä'^_€§€€Á€¥€s€À€Â_value: shouldSendProfile_shouldSendProfileÓ#>$dg€²¢ef€Ã€Ä¢hi€Å€Æ_NSNullPlaceholder_NSValidatesImmediately Ò>no€Ï¯(–p#%û8'®)\ÛâªÌäo‚Í€~€€A€h€m€b€.€s€P€Œ€ €#€€O€€È€\€ €Ê€,Ò23†€€É]NSApplicationÓ뉊‹·_NSAppliesImmediately€Î€Ë Ò>F€/¢‘€Ì€Í_SUIncludeProfile_SUSendProfileInfoÒ78•–£–;_NSUserDefaultsControllerÒ78˜J¢J;Ò>n›€Ï¯®o\®®Í®û®Ì®–®\–€P€ € €P€P€€,€P€b€P€€€€P€€€P€ €€Ò>n²€Ï¯(–p#%û8'®)\Û⪂oäÌÍ€~€€€A€h€m€b€.€s€P€Œ€ €#€€O€Ê€È€ €\€€,Ò>nʀϯËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞ߀ӀԀՀր׀؀ـڀۀ܀݀ހ߀à€á€â€ã€ä€å€æ€ç_Image View (NSApplicationIcon)\File's OwnerZTable ViewoÜStatic Text (Das anonymisierte Systemprofil unerstützt uns bei der zukünftigen Entwicklung. Bitte kontaktieren Sie uns, wenn Sie Fragen zum anonymisierten Systemprofil haben. Diese Informationen würden an uns gesendet:)_ Push Button (Automatisch suchen)_7Static Text (Automatisch nach Aktualisierungen suchen?)\Profile Info_Text Field Cell (Text Cell)-1o2Check Box (Anonymisiertes Systemprofil übertragen)\Content ViewZDisclosure\MoreInfoView_Text Field Cell (Text Cell)_Array Controller_Push Button (Nicht suchen)_User Defaults Controller[Application_!Bordered Scroll View (Table View)_Static Text (DO NOT LOCALIZE)\Table Column^Table Column-1Ò>n÷€Ï Ò>nú€Ï Ò>ný€Ï¯$(–JLpH#%û8TN'®)\ISKÛâPªÌäo‚ÍVQOMRU€~€€€[€—€A€ €h€m€b€.€¸€š€s€P€Œ€ €N€µ€a€#€€¨€O€€È€\€ €Ê€,€¿€«€œ€˜€³€¼Ò>n$€Ï¯$%&'()*+,-./0123456789:;<=>?@ABCDEFGH€ì€í€î€ï€ð€ñ€ò€ó€ô€õ€ö€÷€ø€ù€ú€û€ü€ý€þ€ÿ     %•).  -ƒ"G'‘‚~+¡*ÿÿÿÿÿÿÿý!(1,”/„‹0Ò>Fl€/ Ò>no€Ï Ò>nr€Ï Ò78tu¢u;^NSIBObjectData"'1:?DRTf’˜ãêñÿ-;GSalz–¤·Éãíúüÿ   "+79;V_hsx‡£¬·¹ºÃÊ×Ýæè   !#%'8FOWY[]_|Ž™¢®º¼¾ÀÃÅÇÉÒÔÙÛÝ"+8DP^lnprtwyŒ‘“•— ¢©«­¯Øâìöøúüþ  fˆ’¦»Èâþ#/N]ikmoxz{}†’”•—™›¦±ÂÄÆÈËâëô    % ' ) N ] j r } Œ — ¢ ® ¯ ± ³ ¼ ¾ À É Ò Ô ñ ý    + 0 2 4 6 8 : ; L S Z c e n p s € ‰ Ž • ¢ ¯ · ¹ Å Î Ó Û ð ü      - : < ? H S g y † ® ¼ Á Ã Å Ç É Ë Ð Ò Ü ñ ó õ ÷ ù    ! 6 8 : < > Q Z c l q  ¤ ¥ § © ² ´ ¶ Ó Õ × Ù Û Ý þ       ) 1 F H J L N X e g l u € Š ¡ ¶ ¸ º ¼ ¾ × ä æ ò û4=FPRTVXacen†“œ§²×ÙÛÝßâäæï "+4A^`bdfgi¢§©«­¯±¶¸WlnprtŠ•¡¬µ¾ËØáèÿ!#%'HQSUWYZ\^{}ƒ…‡ Õë"4FTVXZ\^`bdfhmvƒ”–Ÿ¡¤¦¯¸ÅÎÙâðù)+-/1RTVXZ[]_x™›Ÿ¡£¥·Îßáãåç%2@JXeo•Ÿ«­¯±³¸º¼¾ÀÂÄÞçñóü').79HJLNPRTV{ƒ…‡‰ŠŒŽ§àéëíïñóõ÷ /1357:;=?Yz|~€‚„†²ÃÅÇÊÞÿ  %^lnprtvxz|†Õâñóõ÷ÿ)2>@BKPfš¦¨ª¬­¯±²´¶¿ÁÎÐÒÔÖØÚöF^œ³ÔÜäì÷üþ-6=IR]iŠŒŽ’•–˜š±âäæèêìîðõþ 2=Zch{‚“•—™›¬®°²´ÃÔÖØÚÜî >@BDFHJkˆŸ±Àå!"#$-/468CPUW`enw‹ ­Ñ×ôý9;=?ACE`t•Ÿ¡£¥§©«­ÍÔìù     & 8 A F S t v x z | ~ € ‚ ‘ ” – ™ › ¸ º ¼ ¾ À Â Ä Ð Õ ò ô ö ø ú ü þ!,!9!Y!v!x!z!|!~!€!‚!¨!Ç!è!ê!ì!î!ð!ò!ô!ö""%"2"4"9";"="B"D"F"Z"s"t"}""ª"¬"®"°"²"´"¶"¸"º"¼"¾"À"Â"Ä"Æ"È"Ê"Ì"Î"Ð"Ò"Û"Ý"ß"í"ú######!#&#(#*#=#Q#Z#a#|#…#Š#“#•#À#Â#Ä#Æ#È#Ê#Ì#Î#Ð#Ò#Ô#Ö#Ø#Ú#Ü#Þ#à#â#ä#æ#è#ñ#ó$ $"$$$&$($*$,$.$0$2$4$6$8$:$<$>$@$B$D$F$H$J$S$U$‚$„$†$ˆ$Š$Œ$Ž$$’$”$–$˜$š$œ$ž$ $¢$¤$¦$¨$ª$¬$Í$Ú$å& &Ã&ý' '*'‘'ž'©'¶'Ô'ç(((+(O(o(|(‹(”(–(—( (¢(£(¬(®(ù(û(ý(ÿ))))) ) ) ))))))))))!)#)%)')))+)-)/)1)3)5)7)9);)=)?)A)J)L)—)™)›))Ÿ)¡)£)¥)§)©)«)­)¯)±)³)µ)·)¹)»)½)¿)Â)Å)È)Ë)Î)Ñ)Ô)×)Ú)Ý)à)ã)æ)é)ì)ï)ñ)ó)õ)÷)ù)û)ý)ÿ***** * * ********$*&*(***,*.*0*2*4*6*8*A*C*D*M*O*P*Y*[*\*e*jv*ytransmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031212442116660031111 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239408.468002948 30 atime=1418239408.468002948 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.n0000644000175000017500000000253612442116660035221 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController ACTIONS finishPrompt id toggleMoreInfo id CLASS SUUpdatePermissionPrompt LANGUAGE ObjC OUTLETS delegate id descriptionTextField NSTextField moreInfoButton NSButton moreInfoView NSView SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000013112442116660031110 xustar0030 mtime=1418239408.468002948 29 atime=1418239408.46700293 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nib0000644000175000017500000000105012442116660035020 0ustar00mikedldmikedld00000000000000 IBFramework Version 667 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 6 IBSystem Version 9D34 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/PaxHeaders.4960/SUUpdateAlert.nib0000644000000000000000000000013212442116660027412 xustar0030 mtime=1418239408.268999537 30 atime=1418239408.074996213 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116660031114 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdateAlert.nib/PaxHeaders.4960/keye0000644000000000000000000000013212442116660030347 xustar0030 mtime=1418239408.268999537 30 atime=1418239408.268999537 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdateAlert.nib/keyedobjects.nib0000644000175000017500000002437512442116660034274 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯ó 156<=AEW_oy z”•ž¡¢£§­®²·ÑÒeÓ×Ûçôýþÿ()489CDEJLQRUX[cdklqyz‚ƒ„Ž–—™¬°·»ÎÞßàáâãäåæçè éïúûüý‹þ   !$'*34<@HIUVZ[Z_b cdefijmrsxy~„…Š‹•™žŸ £¬­®¯µ¶·¹ÀÁÂÉÊËÒÓÔÜÝÞäìòú*<NOPQRSTUVWXYZ[\]`c…§¨©ª«¬­®¯°±²³´µ¶@·¸¹º»¼½¾¿ÀÁÂÃÄÅÈËÎU$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€ò€¶€Í€ñ€€»€€Ì€Î€¼€ï€€€º€ð§€ÏÒ234[NSClassName€€]SUUpdateAlertÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€k¯HIJKLMNOPQRSTUV€ €€Œ€Ž€€’€”€–€€¥€¨€«€®€²€´ÔXYZ[]^]NSDestinationXNSSourceWNSLabel€€€ €Ø`abcdefghijklmg_NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabledXNSWindow[NSSuperview€ €€ €! € € ×`pcqefmstuvmxZNSSubviews[NSFrameSize€ €m€ €„€ €…_{{476, 12}, {110, 32}}Ý{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽŒ]‘’“[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsÿÿÿÿ„þ€€€€€€€ Èÿÿÿÿ†‚@ÿ\InstallierenÔ–—˜™š›œVNSSizeVNSNameXNSfFlags€#@*€\LucidaGrandeÒ78Ÿ ¢ ;VNSFontPQ Ò78¤¥¤¥¦b;\NSButtonCell\NSActionCellÒ78¨©¥©ª«¬;XNSButtonYNSControlVNSView[NSResponder^installUpdate:Ò78¯°£°±;_NSNibControlConnector^NSNibConnectorÔXYZ³µ¶€‹€€€ŠÝ¸¹º»¼½¾¿ÀÁÂÃgÅÆ‰ÈÉÊËÌÍÎÏÐ\NSWindowView\NSScreenRect_NSFrameAutosaveName]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €‰€†€€ÿÿÿÿðx€€€ˆ€‡€_{{248, 468}, {600, 370}}_Software-AktualisierungÒÔÕÖYNS.string€TViewÒ78ØÙ£ÙÚ;_NSMutableStringXNSStringÒ>FÝ€k©Þßàáâ]ä忀!€1€@€E€J€ €O€w€{Ú`aèbécdefgëìlîïðlmgZNSEditable[NSDragTypes€ €0€) €*€" € € Ò>?ö€¦÷øùúûü€#€$€%€&€'€(_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{24, 291}, {64, 64}}Ø{…       WNSStyleWNSAlignWNSScaleZNSAnimatesþ€/€+Ó2^NSResourceName€.€,€-WNSImage_NSApplicationIconÒ78¢;_NSCustomResourceÒ78£b;[NSImageCellÒ78¥ª«¬;[NSImageViewØ`abcdefg!"#$lmg€ €?€2€3 € € _{{106, 338}, {443, 17}}Ø{*‚ƒ…+,-.‰0ß23_NSBackgroundColor[NSTextColorþ€>€6€€4€1@€;Ô–—˜™š67€€5_LucidaGrande-BoldÕ:;<=>?@ABWNSColor\NSColorSpace[NSColorName]NSCatalogName€:€9€8€7VSystem\controlColorÓ;F>HIWNSWhite€:K0.66666669Ò78K:¢:;Õ:;<=>N@OB€:€=€<€7_controlTextColorÓ;F>HT€:B0Ò78VW¤W¦b;_NSTextFieldCellÒ78YZ¥Zª«¬;[NSTextFieldØ`abcdefg!^_ðlmg€ €?€A€B € € _{{106, 280}, {443, 14}}Ø{*‚ƒ…+,-.ghà23€>€6€C€D€@€;_Versionshinweise:Ô–—˜™n6p€#@&€5 Ø`abcdefghtuklmg€ €€F€G € € _{{339, 12}, {137, 32}}Ý{|}~€‚ƒ„…†,ˆ‰Š‹Œ~Œá‘’“€€€€I€H€€EoSpäter erinnernQØ`abcdefgh‡ˆ‰lmg€ €€K€L € € _{{103, 12}, {215, 32}}Ý{|}~€‚ƒ„…†,ˆ‰Š‹Œ’“Œâ‘’“€€€€N€M€€JoDiese Version überspringenÒÔÕ¡€Þ`š›aœpcežŸf gH¢£¤¦§‹m© g«YNSBoxType[NSTitleCell]NSTransparent\NSBorderTypeYNSOffsets_NSTitlePosition]NSContentView€ €v€p€n€P€ €o€ €QÒ>F®€k¡«€Q×`apcefäs³´umä€O€m€l€R€ €OÒ>F¹€k¡º€SÝ`a¼½éc¾¿eÀfÁ«ÃÄlÆÇ§‰m‰«ÍZAllowsUndo[PreferencesYGroupName_UseBackForwardListYFrameName]NSNextKeyView€Q€j€_ €a€T€€ €€Q€`Ò>?Ѐ­ÑÒÓûÕÖרÙúÛüÝ€U€V€W€'€X€Y€Z€[€\€&€]€(€^Zpublic.url_NeXT RTFD pasteboard type_NSStringPboardType_Apple URL pasteboard type_WebURLsWithTitlesPboardType_!Apple Web Archive pasteboard type_public.url-name_Apple HTML pasteboard type_NSColor pasteboard type_*NeXT Rich Text Format v1.0 pasteboard type_{{-1, 0}, {470, 197}}Óêëì‰îZIdentifierVValues€i€€bÓð>ñòöWNS.keys€h£óôõ€c€d€e£÷ø÷€f€g€f_WebKitDefaultFixedFontSize_WebKitMinimumFontSize_WebKitDefaultFontSize Ò78ÿ£;_NSMutableDictionary\NSDictionaryÒ78¢;^WebPreferencesÒ78¤«¬;WWebViewÒ78  £  ;^NSMutableArrayWNSArray_{{1, 1}, {469, 197}}Ò78«£«¬;_{{109, 76}, {471, 199}}V{0, 0}×{*‚…+,-‰ €>€r€€q€uÔ–—˜™n›€€Õ:;<=>@B€:€t€s€7_textBackgroundColorÓ;F>H#€:B1Ó;F>H&€:M0 0.80000001Ò78()¤)«¬;UNSBoxØ`abcdefg!-./lmg€ €?€x€y € € _{{106, 302}, {477, 28}}Ø{*‚ƒ…+,-.‰8å:3€>€6€€z€w@€;Ô–—˜™n›?€€ Ø`abcdefghCDulmg€ €€|€} € € _{{106, 50}, {442, 16}}Þ{|J}~€‚ƒ„…†,ˆ‰MŠÍN‰P8æ‘ST]NSNormalImage€€€€€€~€z€{H°±³€¤¡²€¢¡´€£_NSValueTransformerName_NSNegateBooleanÒ78¸¢;×XŒYZ޼’Þ¿Í€œ€€§€š€!€¦_value: applicationIcon_applicationIcon×XŒYZŽÅ’ßÈÍ€œ€€ª€š€1€©_value: titleTextYtitleText×XŒYZŽÎ’åÑÍ€œ€€­€š€w€¬_value: descriptionText_descriptionTextØXŒYZ¤Ž×¨ºÚÛÍ€œ€€°€Ÿ€S€¯€±_hidden: showsReleaseNotes_showsReleaseNotesÓð>°à․¡²€¢¡´€£ØXŒYZ¤Ž×¨äÚëÍ€œ€€°€Ÿ€O€¯€³Óð>°îð€¤¡²€¢¡´€£ØXŒYZ¤Ž×¨àÚùÍ€œ€€°€Ÿ€@€¯€µÓð>°üþ€¤¡²€¢¡´€£Ò>€¹¯äßåÞµâ] ºá«gàæ€O€—€1€w€!€€J€ €·€S€E€Q€ €@€{Ò23€€¸]NSApplicationÒ78 ¢ ;Ò>€¹¯gggggg«gäµgg€ €€ € € €€ € €€Q€ €O€€ € Ò>,€¹¯äßåÞµâ] ºágàæ€O€1€w€!€€J€ €·€S€E€€—€ €@€{Ò>>€¹¯?@ABCDEFGHIJKLM€½€¾€¿€À€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€ËSBox[Static Text]Static Text-1_Image View (NSApplicationIcon)_Update Alert (release notes)o(Push Button (Diese Version überspringen)_Push Button (Installieren)[ApplicationXWeb ViewoPush Button (Später erinnern)\File's Owner_Shared Defaults\Content View_Static Text (Versionshinweise:)_RCheck Box (Aktualisierungen in Zukunft automatisch herunterladen und installieren)Ò>_€¹ Ò>b€¹ Ò>e€¹¯JOåµNâL] IVMUSTgäßÞHRPKº«áQàæ€Œ€–€w€€”€J€€ €·€€´€’€²€«€®€€ €O€1€!€ €¨€€Ž€S€Q€E€¥€—€@€{Ò>‡€¹¯ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦€Ð€Ñ€Ò€Ó€Ô€Õ€Ö€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€â€ã€ä€å€æ€ç€è€é€ê€ë€ì€í€î ‡e!ELÿÿÿÿÿÿÿý2H"¤g¡¥Y M i¦ ]uÒ>FÇ€k Ò>Ê€¹ Ò>Í€¹ Ò78ÏТÐ;^NSIBObjectData"'1:?DRTfOU §®¼Îêø)7Sat† ª·¹»½¿ÁÃÅÇÉËÍÏÑÓÕ×ÙÛäðòô $3<OXcefovƒ‰’”µ·¹»½¿ÁÃÅÇÉËÍÏÑÓäòû  ,>FMV`iuwy{}€ƒ…¢­¹»½¿ÂÄÆÈá"8M\oŒ–¤¶ÃÑÚÜÞàâäæèêìîóü !(13<>ANW\cdfox…’›¦¯¹ÀÌÛäë#%')+`mzž¨¶ÃÍßóý      " $ & ( * E _ h r t y ‚ ‰ › ¤ ­ ¯ Â Ä Æ È Ê Ì Î Ð Ò Ô ý         " # % ' 0 2 ? A C E G I K g ƒ · Ï ð % F N V ^ i n p r t y z ‡ – ˜ š œ ¤ ¸ Á Æ Ù â é õ þ  6 8 : < > A B D F ` • ¡ ¦ ¨ ª ¬ ® ° µ · È Ê Ì Ï ã ø  ' ) + - / 1 8 E R Z \ ^ j s x ‘ “ • ¨ µ · º Ã Ì Þ ç ò þ!#%'(*,Fgikmoqs‡˜š£¥¨ÉËÍÏÑÒÔÖï$&(*,.02SUvxz|~‚„†ŸÔÖØÚÜÞàâ"$]gsŽ˜ª¸º¼¾ÀÁÃÆÈÊÌÎ×ÙÜÞûýÿLWcm‚Œšœž ¡£¥§¨ª¬®°¹»ÖØÚÜÞàâäæèêìîðû,HfŠœ¹Ó%079;=JRT[]_ahjln‹£»½ÆÍãðùþ '07FNenu–³µ·¹»½ÎÐÒÔéëíïñ&(6?HNoqsuwz{}™º¼¾ÀÂÄÉËÜÞàã   *cqsuwy{}†‹Ôáãåçðù -8Q\y‚‡š£¬³ÊÛÝßáãö   ,.024;LNPRTctvxz|¬¶Àßáãåçéëô  5Bhn–µÖàâäæèêìî/<>ACFHas|ž ¢¤¦¨ªÃÕòôöøúüþ8:<>@BD]o’”–˜šœžºÎÛÝàâåç  #%(*-/PRTVXZ\^kmpruw€‚£¥§©«­¯±³µ·¹»½¿ÁÊÌÎÜåêóõ "$&(*,.024=?`bdfhjlnprtvxz|~‡‰ª¬®°²´¶¸º¼¾ÀÂÄÆÈÌØæ&y–¢«èõ6‹”–— ¢£¬®ïñóõ÷ùûýÿ              ! # % ' ) + - 6 8 y { }  ƒ … ‡ ‰ ‹ ‘ “ • — ™ › Ÿ ¡ £ ¥ § © « ­ ¯ ± ³ µ · ¹ » ½ ¿ Á Ã Å Ç Ð Ò Ô Ö Ø Ú Ü Þ à â ä æ è ê ì î ð ò ô ö ø ú!!!!!!!!!!'!,Ñ!;transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdateAlert.nib/PaxHeaders.4960/clas0000644000000000000000000000013212442116660030334 xustar0030 mtime=1418239408.268999537 30 atime=1418239408.268999537 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdateAlert.nib/classes.nib0000644000175000017500000000277412442116660033255 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController CLASS NSApplication LANGUAGE ObjC SUPERCLASS NSResponder ACTIONS installUpdate id remindMeLater id skipThisVersion id CLASS SUUpdateAlert LANGUAGE ObjC OUTLETS delegate id description NSTextField releaseNotesView WebView SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdateAlert.nib/PaxHeaders.4960/info0000644000000000000000000000013012442116660030343 xustar0029 mtime=1418239408.26799952 29 atime=1418239408.26799952 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000105012442116660032535 0ustar00mikedldmikedld00000000000000 IBFramework Version 667 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 6 IBSystem Version 9D34 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/PaxHeaders.4960/Sparkle.strings0000644000000000000000000000013012442116660027250 xustar0029 mtime=1418239408.46700293 29 atime=1418239408.46700293 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/Sparkle.strings0000644000175000017500000002311612442116660030702 0ustar00mikedldmikedld00000000000000þÿ/* de_DE v0.1 - No comment provided by engineer. */ "%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ wurde heruntergeladen und steht zur Verwendung bereit. Möchten Sie %1$@ jetzt durch die neue Version ersetzen und das Programm neu starten?"; /* de_DE v0.1 - No comment provided by engineer. */ "%1$@ can't be updated when it's running from a disk image. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ kann nicht in einem Disk Image aktualisiert werden. Bitte verschieben Sie %1$@ in den Programme-Ordner, starten es von dort und versuchen es erneut."; /* de_DE v0.1 - No comment provided by engineer. */ "%@ %@ is currently the newest version available." = "%1$@ %2$@ ist die aktuelle Version."; /* de_DE v0.1 - No comment provided by engineer. */ "%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ ist verfügbar (Sie verwenden Version %3$@). Möchten Sie die aktualisierte Version jetzt herunterladen?"; /* No comment provided by engineer. */ "%@ downloaded" = "%@ heruntergeladen"; /* de_DE v0.1 - No comment provided by engineer. */ "%@ of %@" = "%1$@ von %2$@"; /* de_DE v0.1 - No comment provided by engineer. */ "A new version of %@ is available!" = "Eine aktualisierte Version von %@ ist verfügbar."; /* de_DE v0.1 - No comment provided by engineer. */ "A new version of %@ is ready to install!" = "Eine aktualisierte Version von %@ ist zur Installation bereit."; /* de_DE v0.1 - No comment provided by engineer. */ "An error occurred in retrieving update information. Please try again later." = "Beim Abfragen der Aktualisierungsdaten trat ein Fehler auf. Bitte versuchen Sie es später erneut."; /* de_DE v0.1 - No comment provided by engineer. */ "An error occurred while downloading the update. Please try again later." = "Beim Laden der Aktualisierung ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut."; /* de_DE v0.1 - No comment provided by engineer. */ "An error occurred while extracting the archive. Please try again later." = "Beim Entpacken des heruntergeladenen Archivs ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut."; /* de_DE v0.1 - No comment provided by engineer. */ "An error occurred while installing the update. Please try again later." = "Bei der Installation der Aktualisierung ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut."; /* de_DE v0.1 - No comment provided by engineer. */ "An error occurred while parsing the update feed." = "Beim Lesen der Aktualisierungsinformationen ist ein Fehler aufgetreten."; /* de_DE v0.1 - No comment provided by engineer. */ "An error occurred while parsing the update feed: %@" = "Beim Lesen der Aktualisierungsinformationen ist ein Fehler aufgetreten: %@"; /* de_DE v0.1 - No comment provided by engineer. */ "An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Beim erneuten Starten von %1$@ ist ein Fehler aufgetreten. Die neue Version von %1$@ steht aber trotzdem beim nächsten Programmstart zur Verfügung."; /* de_DE v0.1 - the unit for bytes */ "B" = "B"; /* de_DE v0.1 - No comment provided by engineer. */ "Cancel" = "Abbrechen"; /* de_DE v0.1 - No comment provided by engineer. */ "Cancel Update" = "Aktualisierung abbrechen"; /* de_DE v0.1 - No comment provided by engineer. */ "Checking for updates..." = "Suche nach Aktualisierungen &"; /* de_DE v0.1 - No comment provided by engineer. */ "Downloading update..." = "Aktualisierung wird heruntergeladen &"; /* de_DE v0.1 - No comment provided by engineer. */ "Extracting update..." = "Aktualisierung entpacken &"; /* de_DE v0.1 - the unit for gigabytes */ "GB" = "GB"; /* de_DE v0.1 - No comment provided by engineer. */ "Install and Relaunch" = "Installieren und erneut starten"; /* No comment provided by engineer. */ "Installing update..." = "Aktualisierung installieren &"; /* the unit for kilobytes */ "KB" = "KB"; /* the unit for megabytes */ "MB" = "MB"; /* No comment provided by engineer. */ "OK" = "OK"; /* No comment provided by engineer. */ "Ready to Install" = "Bereit zum Installieren"; /* No comment provided by engineer. */ "Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Soll %1$@ automatisch nach Aktualisierungen suchen? Sie können mit dem Befehl im %1$@-Menü auch manuell nach Aktualisierungen suchen."; /* No comment provided by engineer. */ "Update Error!" = "Fehler beim Aktualisieren."; /* No comment provided by engineer. */ "Updating %@" = "Aktualisierung von %@"; /* No comment provided by engineer. */ "You already have the newest version of %@." = "Sie haben bereits die aktuelle Version von %@."; /* No comment provided by engineer. */ "You're up-to-date!" = "Sie sind auf dem neuesten Stand."; transmission-2.92/macosx/Sparkle.framework/Resources/PaxHeaders.4960/SUStatus.nib0000644000000000000000000000013212442116654024751 xustar0030 mtime=1418239404.857941083 30 atime=1418239404.729938889 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/SUStatus.nib/0000755000175000017500000000000012442116654026453 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/SUStatus.nib/PaxHeaders.4960/keyedobjects.nib0000644000000000000000000000013212442116654030173 xustar0030 mtime=1418239404.857941083 30 atime=1418239404.857941083 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/SUStatus.nib/keyedobjects.nib0000644000175000017500000001626012442116654031625 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯¨ 156<=AET\lv w‘’š›žŸ£§¬²³·¼ÓÔÕØÛãðùúûüýþÿ %&1278BCDILQRUZ]jlpqu~ˆ‰ Ž‘’“–—¡¢£¤©°±²³¼½¾ÅÆÇÈÑÒÓÔÛÜÝàçèïðñøùúû   #$&1=IJKLMNOPQRUXpˆ‰Š‹Œ?Ž‘’“”•–—˜™š›œŸ¢¥U$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€§€{€Œ€¦€€€€€‹€€€¤€€€€¥,€ŽÒ234[NSClassName€€_SUStatusControllerÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€J¬HIJKLMNOPQRS€ €€S€X€\€_€c€k€m€p€t€yÔUVWXY[]NSDestinationXNSSourceWNSLabel€€ €€Ø]^_`abcdefghijd_NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabledXNSWindow[NSSuperview€ €€ € € € ×]m`nbcjpqrsjuZNSSubviews[NSFrameSize€ €M€ €K€ €L_{{257, 12}, {110, 32}}Ýxyz{|}~€‚ƒ„…†‡ˆ‰Š‹‰YŽ[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsþ€€€€€€€ Èÿÿÿÿ†‚@ÿVButtonÔ“”•–—˜™VNSSizeVNSNameXNSfFlags€#@*€\LucidaGrandeÒ78œ¢;VNSFontPÒ ¡¢YNS.string€PÒ78¤¥£¥¦;_NSMutableStringXNSStringÒ78¨©¤©ª«;\NSButtonCell\NSActionCellVNSCellÒ78­®¥®¯°±;XNSButtonYNSControlVNSView[NSResponder\actionButtonÒ78´µ£µ¶;_NSNibOutletConnector^NSNibConnectorÔUVWX¹»€€€€Rܽ¾¿ÀÁÂÃÄÅÆÇdÉÊËÌÍÎÏЈÑÒ\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €Q€N€px€€€P€O€_{{200, 222}, {384, 107}}[Set in CodeÒ ¡×€XNSWindowÒ ¡Ú€TViewÒ>FÝ€J¥ÞßàYâ€!€1€A€ €FÚ]^ä_å`abcdçèiêëìijdZNSEditable[NSDragTypes€ €0€) €*€" € € Ò>?ò€¦óôõö÷ø€#€$€%€&€'€(_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{24, 28}, {64, 64}}Øx~‚ˆ  WNSStyleWNSAlignWNSScaleZNSAnimatesþ€/€+Ó2  ^NSResourceName€.€,€-WNSImage_NSApplicationIconÒ78¢;_NSCustomResourceÒ78£;[NSImageCellVNSCellÒ78¥¯°±;[NSImageViewØ]^_`abcd !ijd€ €@€2€3 € € _{{106, 75}, {258, 17}}Øx'~€‚()*+,-ß/0_NSBackgroundColor[NSTextColorþ€?€7€4€5€1@€<_(Status Text (set by loc. string in code)Ô“”•–456€#@*€6_LucidaGrande-BoldÕ9:;<=>?@AWNSColor\NSColorSpace[NSColorName]NSCatalogName€;€:€9€8VSystem\controlColorÓ:E=GHWNSWhite€;K0.66666669Ò78JK¢K;WNSColorÕ9:;<=N?OA€;€>€=€8_controlTextColorÓ:E=GT€;B0Ò78VW¤WXY;_NSTextFieldCell\NSActionCellVNSCellÒ78[\¥\¯°±;[NSTextFieldÙ]^^`b_c`dbcdejgdiZNSMaxValueYNSpiFlags\NSDrawMatrix€ €E€D#@Y€ @ € €BÑk€CÒ78mo¢n;ZNSPSMatrixZNSPSMatrix_{{107, 47}, {256, 20}}Ò78rt¤s°±;_NSProgressIndicator_NSProgressIndicatorØ]^_`abcdxyzijd€ €@€G€H € € _{{106, 22}, {152, 17}}Øx'~€‚(€*+ƒ‰â†0þ€?€7€I€€F@€<_Small System Font TextÒ78Š‹£‹Œ;^NSMutableArrayWNSArrayZ{384, 107}Ò78°£°±;_{{0, 0}, {1280, 778}}Z{213, 129}_{3.40282e+38, 3.40282e+38}Ò78”•¢•;_NSWindowTemplateVwindow×U˜™VWš›žÞ ÐYNSKeyPathYNSBinding_NSNibBindingConnectorVersion€W€€V€U€!€T_value: applicationIconUvalue_applicationIconÒ78¥¨£¦§;_NSNibBindingConnector^NSNibConnector_NSNibBindingConnector×U˜™VW𛬭à¯Ð€W€€[€Z€A€Y_maxValue: maxProgressValueXmaxValue_maxProgressValueØU˜™´VWš›·žKà»Ð_NSPreviousConnector€W€€^€U€X€A€]_value: progressValue]progressValue×U˜™VWš›Á¹ÄЀW€€b€a€€`_title: windowTitleUtitle[windowTitleØU˜™VWÉš›ÌÍâÏÐÐYNSOptions€W€€f€e€F€d€g_hidden: statusTextVhiddenZstatusTextÓÕ>Ö×ÙWNS.keys€j¡Ø€h¡Ú€i_NSValueTransformerNameWNSIsNilÒ78Þߢß;\NSDictionary×U˜™VWš›ÂžßæÐ€W€€a€U€1€l\value: title×U˜™VWš›ëÂYîЀW€€o€a€ €n_title: buttonTitle[buttonTitle×U˜™VWš›ôõà÷ЀW€€s€r€A€q_!animate: progressBarShouldAnimateWanimate_progressBarShouldAnimateÙU˜™´VWÉš›¬ÿQàЀW€€[€v€p€A€u€w_!isIndeterminate: maxProgressValue_isIndeterminateÓÕ>Ö €j¡Ø€h¡ €x_NSNegateBoolean×U˜™VWš›ÌžâЀW€€f€U€F€z_value: statusTextÒ>€~¨Þ¹dàßâY€!€|€€ €A€1€F€ Ò23"€€}]NSApplicationÒ78%Œ¢Œ;Ò>(€~¨d¹dddd€ €€€€ € € € Ò>3€~©d¹ßYÞà†€€1€ €!€A€|€F€Ò>?€~©@ABCDEFGH€‚€ƒ€„€…€†€‡€ˆ€‰€Š\Content ViewVWindow_6Static Text (Status Text (set by loc. string in code))_Push Button (Button)_Image View (NSApplicationIcon)_Horizontal Progress Indicator[Application_$Static Text (Small System Font Text)\File's OwnerÒ>T€~ Ò>W€~ Ò>Z€~¯PLßIKd¹HMYSRÞàONâJQ€m€\€1€€X€|€ €€ €_€ €y€t€!€A€k€c€F€S€€pÒ>r€~¯stuvwxyz{|}~€‚ƒ„…†‡€€€‘€’€“€”€•€–€—€˜€™€š€›€œ€€ž€Ÿ€ €¡€¢€£ ÿÿÿÿÿÿÿý" * ! +)Ò>Fž€J Ò>¡€~ Ò>¤€~ Ò78¦§¢§;^NSIBObjectData"'1:?DRTf¹¿ &8Tbnzˆ“¡½ËÞð !#%')+-/13579;=?ACENZ\^s|…•¤­ÀÉÔÖ×àçôú "$&(*,.0246GU^fhjln¡©°¹ÃÌØÚÜÞàãäæè "%')+Dy…›°¿Òäïù&49;=?ACEGIKMR[bszŠŒ•—š§°µ¼½ÆÐÒÓÜãõþ*1:ENX_kxˆŸ®¿ÁÃÅÇø *8EOau‹‘“˜šœž ¢¤¿ËÔÖßèêïøú    8 C O Q S U V X Z ] ^ ` b k m z | ~ € ‚ „ † ¢ ¾ ò + H _ € ˆ ˜ £ ¨ ª ¬ ® ³ ´ Á Ð Ò Ô Ö Þ ò û   # / 6 ? J V w y { }  ‚ ƒ … ‡   Á Õ á æ è ê ì î ð õ ÷ " 3 5 > @ C W l t › Ÿ ¡ £ ¥ ¬ ¹ Æ Î Ð Ò Þ ç ì ô   $ 1 3 6 ? H Z g n w ‚ Ž ³ ¾ È Õ × Ù Û ä ç é ì î ð õ ÷4=F\r“•—™›žŸ¡£¼Ýâäæèêìñó +3>GNfqŽ—œ¯¶ÓÝç  +1CLSkz’¯±³µ·¹»Øáô+-/13579P^{}ƒ…‡œ¢®ÏÙÛÝßáãåçü#%(*-/HPY^kˆŠŒŽ’”¡¾ÀÂÄÆÈÊßë  8@[€‚„†ˆŠŒŽ´ÆÓÕØÚÝßñ.79JLNPRTVXZcegu~ƒŒŽŸ¡£¥§©«­¯¸ºÍÏÑÓÕ×ÙÛÝßèêýÿ   #\s”´Àçôýÿ   DFHJLNPRTVXZ\^`bdfhjlnwy¦¨ª¬®°²´¶¸º¼¾ÀÂÄÆÈÊÌÎÐÒÔÖØÚãåçéëíïñóõ÷ùûýÿ   "#,1¨@transmission-2.92/macosx/Sparkle.framework/Resources/SUStatus.nib/PaxHeaders.4960/classes.nib0000644000000000000000000000013212442116654027155 xustar0030 mtime=1418239404.857941083 30 atime=1418239404.857941083 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/SUStatus.nib/classes.nib0000644000175000017500000000241212442116654030601 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController CLASS NSApplication LANGUAGE ObjC SUPERCLASS NSResponder CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC CLASS SUStatusController LANGUAGE ObjC OUTLETS actionButton NSButton progressBar NSProgressIndicator SUPERCLASS SUWindowController IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/SUStatus.nib/PaxHeaders.4960/info.nib0000644000000000000000000000013212442116654026453 xustar0030 mtime=1418239404.857941083 30 atime=1418239404.857941083 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/SUStatus.nib/info.nib0000644000175000017500000000104612442116654030101 0ustar00mikedldmikedld00000000000000 IBFramework Version 670 IBLastKnownRelativeProjectPath Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 6 IBSystem Version 10A96 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/PaxHeaders.4960/License.txt0000644000000000000000000000013212442116654024647 xustar0030 mtime=1418239404.009926551 30 atime=1418239404.008926534 30 ctime=1457295922.540851111 transmission-2.92/macosx/Sparkle.framework/Resources/License.txt0000644000175000017500000000204112442116654026271 0ustar00mikedldmikedld00000000000000Copyright (c) 2006 Andy Matuschak 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.transmission-2.92/macosx/Sparkle.framework/Resources/PaxHeaders.4960/ru.lproj0000644000000000000000000000013112442116656024223 xustar0030 mtime=1418239406.037961305 30 atime=1418239405.711955718 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/0000755000175000017500000000000012442116656025726 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/PaxHeaders.4960/SUAutomaticUpdateAlert0000644000000000000000000000013212442116655030554 xustar0030 mtime=1418239405.779956883 30 atime=1418239405.712955735 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116655033025 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000031512442116655031003 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239405.779956883 30 atime=1418239405.779956883 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobject0000644000175000017500000001677312442116655035256 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯£ 156<=AEPXhr sŽ–—š›œ ¦§«°¸¹ÁÂÅÉÊÏæçéìö  #$%(+.67AEFPQRWY^_behqry~†‡‘™š¦§«¬«°³· ¸º»¼½ÀÁÄÉÊÔÕÖ×Úáâãêîòóôûüý .=>?@ABCDEFGHILOf}~€‚ƒ„…†‡ˆ‰Š‹ŒMŽ“–™U$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€¢€t€ˆ€¡€€y€€‡€‰€z€Ÿ€€€x€ %€ŠÒ234[NSClassName€€_SUAutomaticUpdateAlertÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€X¨HIJKLMNO€ €€!€b€d€i€l€qÔQRSTVW]NSDestinationXNSSourceWNSLabel€€€ €ØYZ[\]^_`abcdef`_NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabledXNSWindow[NSSuperview€ €€ € € € ×Yi\j^_flmnofqZNSSubviews[NSFrameSize€ €[€&€Y€ €Z_{{245, 12}, {290, 32}}Ýtuvwxyz{|}~€‚ƒ„…†‡…VŠ‹Œ[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsþ€€€€€€€ Èÿÿÿÿ†‚@ÿo##AB0=>28BL ?@8 7025@H5=88 ?@>3@0<<KÔ‘’“”•VNSSizeVNSNameXNSfFlags€#@*€\LucidaGrandeÒ78˜™¢™;VNSFontPQÒ78ž¤žŸ[;\NSButtonCell\NSActionCellÒ78¡¢¥¢£¤¥;XNSButtonYNSControlVNSView[NSResponder]installLater:Ò78¨©£©ª;_NSNibControlConnector^NSNibConnectorÔQRST®¯€€€€ ØYZ[\]^_`a³´nef`€ €€€ € € _{{102, 12}, {143, 32}}Ýtuvwxyz{|}~€‚ƒ„…½¾…®Š‹Œ€€€€€€€o5 CAB0=02;820BLÒÃÄšYNS.string€Ò78ÆÇ£ÇÈ;_NSMutableStringXNSString]doNotInstall:ÔQRSËÌ΀a€"€€`ÜÐÑÒÓÔÕÖרÙÚ`ÜÝ‚ßàáâã„äå\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €_€\€px€$€#€^€]€%_{{114, 521}, {763, 152}}ÒÃÄ^€ÒÃÄë€TViewÒ>Fî€X§ïðñòV®õ€'€7€F€J€ €€OÚYZ÷[ø\]^_`úûeýþÿef`ZNSEditable[NSDragTypes€ €6€/ €0€( € € Ò>?€¦   €)€*€+€,€-€._Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{23, 73}, {64, 64}}Øtz~WNSStyleWNSAlignWNSScaleZNSAnimatesþ€5€1Ó2 !"^NSResourceName€4€2€3WNSImage_NSApplicationIconÒ78&'¢';_NSCustomResourceÒ78)*£*[;[NSImageCellÒ78,-¥-£¤¥;[NSImageViewØYZ[\]^_`012ÿef`€ €E€8€9 € € _{{105, 120}, {389, 17}}Øt8z{|~9€:;‚=ð?@_NSBackgroundColor[NSTextColor€D€<€€:€7@€AÔ‘’“CD€€;_LucidaGrande-BoldÕGHIJKLMNOWNSColor\NSColorSpace[NSColorName]NSCatalogName€@€?€>€=VSystem\controlColorÓHSKUVWNSWhite€@K0.66666669Ò78XG¢G;ÕGHIJK[M\O€@€C€B€=_controlTextColorÓHSKUa€@B0Ò78cd¤dŸ[;_NSTextFieldCellÒ78fg¥g£¤¥;[NSTextFieldØYZ[\]^_`0klmef`€ €E€G€H € € _{{105, 81}, {435, 31}}Øt8z{|~9€:;‚vñ?@€D€<€€I€F€AÔ‘’{”}€#@&€ ØYZ[\]^_`a‚def`€ €€K€L € € _{{535, 12}, {214, 32}}Ýtuvwxyz{|}~€‚ƒ„…‹Œ…òŠ‹Œ€€€€N€M€€Jo#AB0=>28BL 8 ?5@570?CAB8BLQ ØYZ[\]^_`a”•nef`€ €€P€Q € € _{{105, 58}, {506, 18}}Þtu›vwxyz{|}~€‚žƒãŸ‚¡võФ¥]NSNormalImage€€€S€U€€R€I€OH1=>2;5=8O 4;O 1C4CI8E 25@A89 ?@>3@0<<K 02B><0B8G5A:8Ó2 !ª€4€2€TXNSSwitchÒ­®¯[NSImageName€W€VÒ78±²¢²;_NSButtonImageSourceÒ78´µ£µ¶;^NSMutableArrayWNSArrayZ{763, 152}Ò78¹¤£¤¥;_{{0, 0}, {1440, 878}}Z{511, 174}_{3.40282e+38, 3.40282e+38}Ò78¾¿¢¿;_NSWindowTemplateVwindowÒ78Âãê;_NSNibOutletConnectorÔQRSTòÈ€€€J€c[installNow:×QËÌRSÍÎÐÑñÓãYNSKeyPathYNSBinding_NSNibBindingConnectorVersion€h€€g€f€F€e_value: descriptionTextUvalue_descriptionTextÒ78ØÙ£Ùª;_NSNibBindingConnector×QËÌRSÍÎÝÑïàã€h€€k€f€'€j_value: applicationIcon_applicationIcon×QËÌRSÍÎåæÑõéã€h€m€p€f€O€oÒëìe_NSSharedInstance€n Ò78ïð£ðñ;_NSUserDefaultsController\NSController_#value: values.SUAutomaticallyUpdate_values.SUAutomaticallyUpdate×QËÌRSÍÎ÷Ñðúã€h€€s€f€7€r_value: titleTextYtitleTextÒ>þÿ€w«åVÌñõ®ï`ðò€m€ €"€F€O€€'€u€ €7€JÒ23 €€v]NSApplicationÒ78¶¢¶;Ò>þ€w«`````Ì``€€ €€ € € € €€"€ € Ò>þ!€w¬åVÌñõ®ï`ðò€m€ €"€F€O€€€'€u€ €7€JÒ>þ0€w¬123456789:;<€{€|€}€~€€€€€‚€ƒ€„€…€†_Shared Defaultso1Push Button (#AB0=>28BL ?@8 7025@H5=88 ?@>3@0<<K)VWindow[Static Texto[Check Box (03@C60BL 8 CAB0=02;820BL >1=>2;5=8O 4;O 1C4CI8E 25@A89 ?@>3@0<<K 02B><0B8G5A:8)\File's OwneroPush Button (5 CAB0=02;820BL)_Image View (NSApplicationIcon)[Application\Content View]Static Text-1o(Push Button (#AB0=>28BL 8 ?5@570?CAB8BL)Ò>þK€w Ò>þN€w Ò>þQ€w¯HINO®åVJÌñõLKï`ðòM€ €€l€q€€u€m€ €!€"€F€O€d€b€€'€ €7€J€iÒ>þh€w¯ijklmnopqrstuvwxyz{|€‹€Œ€€Ž€€€‘€’€“€”€•€–€—€˜€™€š€›€œ€€ž"# ÿÿÿÿÿÿÿý !$ Ò>F’€X Ò>þ•€w Ò>þ˜€w Ò78𛢛;^NSIBObjectData"'1:?DRTf¯µ.JXdp~‰—³ÁÔæ !#%')+-/13579;DPRTmvŠž§ºÃÎÐÑÚáîôýÿ 1?HPRTVXy‹“𣭶ÂÄÆÈÊÍÎÐÒïú  .co…š©¼ÎÙãñ#%')+-/1357<EŽŸ¦­¶¸ÁÃÆÓÜáèéëôý  +4>EQ_ho‡–§©«­¯ÐÒÔÖØÙÛÝö+-/13579\eoqz“œª»½¿ÁÃô    & 4 A K ] q { ‡ ‰ ‹ ” – ˜ š œ ž   » Ä Æ Ï Ñ Ö ß á ð ò ô ö ø ú ü þ ' 2 > @ B D E G I L M O Q Z \ i k m o q s u ‘ ­ á ù  7 N o w  ‡ ’ — ™ › ¢ £ ° ¿ Á Ã Å Í á ê ï    ' 2 > _ a c e g h j l † § » Ç É Ë Í Ï Ñ Ö Ø é ë í ð   ! . : H J L N P R Y f s { }  ‹ ” ™ ® ° ² ´ ¶ É Ö Ø Û ä í ÿ@BDFHKLNPiŠŒŽ’”–§©²´·ØÚÜÞàáãåþ3579;=?Axz›Ÿ¡£¤¦¨Áú  "ÃÐÒÔÖßèôöø%,;CNW^vž§¬¿ÆÏÖíþ/9Cbdfhjln‡Ÿ¨¯Çäæèêìîð 8:<>@BDM`bclsŽ›Áàýÿ &/1HJLNPRTVXZ\^giky‚‡’©«­¯±³µ·¹»½¿ÈÊãåçéëíïñóõ÷ùû!#%')+-/1357I®µÁz‡Æçóajlmvxy‚„¯±³µ·¹»½¿ÁÃÅÇÉËÍÏÑÓÕ×àâ !#%')+-/13579;=?HJLNPRTVXZ\^`bkmnwyzƒ…†”œ£transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000013212442116655031000 xustar0030 mtime=1418239405.779956883 30 atime=1418239405.779956883 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/classes.nib0000644000175000017500000000217012442116655035154 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController ACTIONS doNotInstall id installLater id installNow id CLASS SUAutomaticUpdateAlert LANGUAGE ObjC SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000013212442116655031000 xustar0030 mtime=1418239405.779956883 30 atime=1418239405.779956883 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nib0000644000175000017500000000105012442116655034446 0ustar00mikedldmikedld00000000000000 IBFramework Version 670 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 6 IBSystem Version 9E17 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/PaxHeaders.4960/SUUpdatePermissionProm0000644000000000000000000000013112442116656030624 xustar0030 mtime=1418239406.038961322 30 atime=1418239405.994960568 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/0000755000175000017500000000000012442116656033442 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031612442116656031160 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239406.038961322 30 atime=1418239406.038961322 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobje0000644000175000017500000003114212442116656035327 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯ 156<=AEW_lq†Œšž½¾ÃÄÉÎàìíõöùþ   $%(-.03:@GKPQTWX]^adpqru~€ƒŠ‹”•š›žÇÈŸ¢£§¬³¸¹ÍÎÓÔ×ÚÛÞãúûÿ"#$,-459:ABIJQR^_defiemp{„…†‡ˆ‰Š‹•™š ¨©³´¶·¸¹¼½ÂÇÈÍÎÓÔàáâãìíÄ·ïòõüýþ (-./1389:BHOPQXYZ[bcd{€…†‡ŠŽ§¿×ØÙÚÛÜÝÞßàáâãäåæçèéêëìïòÃ@ABCDEFGHIJKLMNOPQRST¬UVWXYZ[\]^_`adgjU$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€Å€ç€€Ï€€æ€è€Ð€€€Î¢€éÒ234[NSClassName€€_SUUpdatePermissionPromptÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€/¯HIJKLMNOPQRSTUV€ €N€Z€“€”€–€˜€š€¥€¨€¯€¹€»€¾€ÂÔXYZ[\^]NSDestinationXNSSourceWNSLabel€M€ €€L×`abc2d+fghijk_NSNextResponderZNSSubviewsXNSvFlags[NSFrameSize[NSExtension€€K€  €H€I€JÒ>Fn€/¢op€ €AÜ`rstaubvwxy\{|}~€\ƒ„„[NSHScrollerWNSFrameXNSsFlags\NSScrollAmts[NSSuperview[NSVScroller]NSNextKeyView]NSContentView€ €=€@€?€ OA€A€€ €9€€Ò>Fˆ€/£„ƒ{€€9€=Ú`sabŽvxo‘’“”•–—o–YNScvFlagsYNSDocViewYNSBGColor€ €8€4€ €€5€ €Ò>Fœ€/¡–€ß`Ÿ ¡¢£¤¥¦bc§¨©vª«„­®¯°±²³“´µ¶·¸¹„»¼_NSDraggingSourceMaskForNonLocalYNSTvFlags_NSBackgroundColor_NSAllowsTypeSelect\NSCornerView_NSIntercellSpacingWidth_NSColumnAutoresizingStyle_NSIntercellSpacingHeightYNSEnabled[NSGridColor_NSDraggingSourceMaskForLocal^NSTableColumns[NSRowHeight€€3ÿÿÿÿÒÀ€'€#@#@€ €0€€#@,Z{353, 113}Ô`sb+ÀÁ€€€_{{346, 0}, {12, 17}}Ò78ÅÆ¤ÆÇÈ;]_NSCornerViewVNSView[NSResponderÒ>FË€/¢ÌÍ€€,ÙÏÐÑÒÓÔÕÖ·ØÙÚÛÜÝÞ–^NSIsResizeable\NSHeaderCellWNSWidthZNSDataCell^NSResizingMaskZNSMinWidthZNSMaxWidth[NSTableView €+€#@`€##@D#@@€×á¡âãäåæçèéê­ë[NSCellFlagsZNSContentsYNSSupport\NSCellFlags2[NSTextColorþ€"€€€€PÔîïðñòóôVNSSizeVNSNameXNSfFlags€#@&€ \LucidaGrandeÒ78÷ø¢ø;VNSFontÓúûüÜý\NSColorSpaceWNSWhite€K0.33333299Ò78ÿ¢;WNSColorÕúü[NSColorName]NSCatalogName€€!€ €VSystem_headerTextColorÓúûüÜ €B0Ò78¥;_NSTableHeaderCell_NSTextFieldCell\NSActionCellVNSCellØá¡âãäåê–]NSControlView!þ€*€%€$€€€(YText CellÕúü°"€€'€&€_textBackgroundColorÓúûüÜ'€B1Õúü+€€!€)€_controlTextColorÒ78/¤;Ò7812¢2;]NSTableColumnÙÏÐÑÒÓÔÕÖ·Ø678ÜÝÞ– €+€-#@k`€.€×á¡âãäåæçèéê­ë€"€€€€Øá¡âãäåê–€*€%€$€€€(Ò78HI£IJ;^NSMutableArrayWNSArrayÕúüMN€€2€1€YgridColorÓúûüÜS€D0.5Ò78UÖ¥ÖVÇÈ;YNSControl_{{1, 1}, {353, 113}}ÕúüZ[€€7€6€_controlBackgroundColorÓúûüÜ`€K0.66666669Ò78bc¤cÇÈ;ZNSClipViewÙ`estbfvgoojkÂlmooXNSTargetXNSActionYNSPercent€ € €<€:ÿÿÿÿ€€;€ #?é_{{-22, 1}, {11, 125}}\_doScroller:Ò78st¥tVÇÈ;ZNSScrollerÙ`estbfvgoojyzÂmo}€ € €<€>€;€ #?ï±û _{{-100, -100}, {345, 11}}_{{4, 5}, {355, 115}}Ò78‚¤‚ÇÈ;\NSScrollView×`sb§v\…†‡h·\€ €G€B€C € _{{1, 128}, {358, 70}}Øá¡âãä匎êp’þ€*€E€D€€A@€(os=D>@<0F8O > A8AB5<5 ?><>305B =0< ?;0=8@>20BL 40;L=59H55 @0728B85 ?@>3@0<<K. !;54CNI0O 8=D>@<0F8O 1C45B >B?@02;5=0:ÕúüZ˜€€7€F€\controlColorÒ78œ¥VÇÈ;[NSTextFieldZ{362, 205}Ò78 ¡¤¡ÇÈ;\NSCustomView\moreInfoViewÒ78¤¥£¥¦;_NSNibOutletConnector^NSNibConnectorÔXYZ¨ª«€Y€€O€X×`sb§v­®¯°z·­€P€W€Q€R €PÕ`abc+µ¶Â·€€€`€Œ_{{138, 12}, {117, 32}}Ýẻ¼½¾âã¿äÀŒÁéÃÄÅÆÇŪÊËÌ_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalent_NSPeriodicDelay]NSButtonFlags€V€€T€U€S€T€OÈÿÿÿÿ†‚@ÿl5 ?@>25@OBLÔîïðñÐóÒ€#@*€QÒ78ÕÖ¤Ö;\NSButtonCellÒ78ØÙ¥ÙVÇÈ;XNSButton]finishPrompt:Ò78Üݣݦ;_NSNibControlConnectorÔXYZ[àâ€M€[€€’Üäåæçèéêëìíî­ðñéóôõö÷Äøù\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€P€‘€Ž€px€]€\€€€__{{83, 492}, {470, 168}}ÒüýþYNS.string€^XNSWindowÒ78£;_NSMutableStringXNSStringÒüý€^TViewÒ>F€/§ ª   €a€O€f€l€p€{€‰Ø`sb§v­®z·­ÄUNSTag€P€W€b€c €P_{{255, 12}, {201, 32}}Þẻ¼½¾âã¿äÀÁéÃÄÅÅ ÊËÌÄÿÿÿÿ„þ€V€€T€e€d€T€ao@>25@OBL 02B><0B8G5A:8Q ×`sb§v­…'()·­€P€G€g€h €P_{{104, 114}, {289, 34}}Øá¡âãä匎01 ’€*€E€i€j€f€(o#@>25@OBL >1=>2;5=8O 02B><0B8G5A:8?ÔîïðñÐ78€€k_LucidaGrande-Bold×`sb§v­…=>h·­€P€G€m€n €P_{{104, 81}, {315, 42}}Øá¡âãä匎Eê ’€*€E€o€€l€(_DO NOT LOCALIZE×`sb§v­®MN)·­€P€W€q€r €P_{{104, 53}, {278, 18}}ÞáºS»¼½¾âã¿äÀÁéVÃ÷WéYê Ê\]]NSNormalImage€V€€t€x€€s€€p€H@<0F8N > A8AB5<5Ó2`abc^NSResourceName€w€u€vWNSImageXNSSwitchÒ78gh¢h;_NSCustomResourceÒjkl[NSImageName€z€yÒ78no¢o;_NSButtonImageSourceÙ`sqrb§v­tu·wx)·­ZNSEditable[NSDragTypes€P€ˆ€ƒ €„€| €PÒ>?}€¦~€‚ƒ€}€~€€€€€‚_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{23, 84}, {64, 64}}ØáŒâŽä‘­’­Ä“·WNSStyleWNSAlignWNSScaleZNSAnimatesþ€‡€… Ó2`ab˜€w€u€†_NSApplicationIconÒ78›œ£œ;[NSImageCellÒ78žŸ¥ŸVÇÈ;[NSImageView×`sb§v­®£¤¥·­€P€W€Š€‹ €P_{{80, 50}, {27, 26}}Üẻ¼¾âã¿äÀŒÁéìééÅʱ²€V€…€€€T€‰€ÿÿÿÿ¸Ì@ÿZ{470, 168}Ò78µÇ£ÇÈ;_{{0, 0}, {1440, 878}}Z{213, 129}_{3.40282e+38, 3.40282e+38}Ò78º»¢»;_NSWindowTemplateVwindowÔXYZ¨ «€Y€€a€XÔXYZ[ Æ€M€l€€•_descriptionTextFieldÔXYZ[Ì€M€‰€€—^moreInfoButtonÔXYZ¨Ò€Y€€‰€™_toggleMoreInfo:ØXÕÖYZרÙÛÜ Þß÷YNSKeyPathYNSBindingYNSOptions_NSNibBindingConnectorVersion€¤€€€œ€p€›€ž_value: shouldSendProfileUvalue_shouldSendProfileÓä>åæéWNS.keys€£¢ç耟€ ¢ê뀡€¢_NSNullPlaceholder_NSValidatesImmediately Ò78ðñ¢ñ;\NSDictionaryÒ78óô£ô¦;_NSNibBindingConnector×XÕÖYZØÙøÜû÷€¤€€§€œ€{€¦[value: iconTiconØXÕÖYZרÙ÷€¤€€«€ª€‰€©€¬_hidden: shouldAskAboutProfileVhidden_shouldAskAboutProfileÓä>å  €£¡ €­¡€®_NSValueTransformerName_NSNegateBoolean×XÕÖYZØÙÜÍ÷€¤€°€¸€œ€,€·Ø·!·#$···_NSFilterRestrictsInsertion_NSPreservesSelection__NSManagedProxy^NSDeclaredKeys_"NSClearsFilterPredicateOnInsertion_NSSelectsInsertedObjects_NSAvoidsEmptySelection €¶ €´€± Ò>F*€/¢+,€²€³ZvisibleKey\visibleValueÑ0€µÒ782¢;Ò7845¤567;_NSArrayController_NSObjectController\NSController_#value: arrangedObjects.visibleValue_arrangedObjects.visibleValueØXÕÖYZ×ØÙ A÷€¤€€«€ª€p€©€ºÓä>åDF€£¡ €­¡€®×XÕÖYZØÙKÜÌN÷€¤€°€½€œ€€¼_!value: arrangedObjects.visibleKey_arrangedObjects.visibleKey×XÕÖYZØÙTUW÷€¤€€Á€À€°€¿_+contentArray: systemProfileInformationArray\contentArray_systemProfileInformationArray×XÕÖYZØÙ^Ü a÷€¤€€Ä€œ€l€Ã_value: promptDescription_promptDescriptionÒ>ef€Í¯8oàÌ–  Û\stª Íp­ €.€ €[€€€p€°€f€{€‰€#€ €Æ€Ë€O€l€,€A€P€aÓ|}~·_NSAppliesImmediately€Ê€Ç Ò>F‚€/¢ƒ„€È€É_SUIncludeProfile_SUSendProfileInfoÒ78ˆ‰£‰7;_NSUserDefaultsControllerÒ23Œ€€Ì]NSApplicationÒ78J¢J;Ò>e’€Í¯Í\–o­­­­Ì­­–\à­€,€ €€€ €P€€P€P€P€€€€€P€P€€ €[€PÒ>e©€Í¯8oàÌ–  Û\stª Íp­ €.€ €[€€€€p€°€{€f€‰€#€ €Æ€Ë€O€l€,€A€P€aÒ>eÁ€Í¯ÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕրрҀӀԀՀր׀؀ـڀۀ܀݀ހ߀à€á€â€ã€ä€å_Text Field Cell (Text Cell)-1_!Bordered Scroll View (Table View)\Profile Info\Table ColumnZTable View\File's Ownero+Check Box (B?@02;OBL 8=D>@<0F8N > A8AB5<5)_Array Controller_Image View (NSApplicationIcon)o1Static Text (@>25@OBL >1=>2;5=8O 02B><0B8G5A:8?)ZDisclosure_Text Field Cell (Text Cell)\MoreInfoView_User Defaults Controller[ApplicationoPush Button (5 ?@>25@OBL)_Static Text (DO NOT LOCALIZE)^Table Column-1oStatic Text (=D>@<0F8O > A8AB5<5 ?><>305B =0< ?;0=8@>20BL 40;L=59H55 @0728B85 ?@>3@0<<K. !;54CNI0O 8=D>@<0F8O 1C45B >B?@02;5=0:)\Content Viewo%Push Button (@>25@OBL 02B><0B8G5A:8)Ò>eî€Í Ò>eñ€Í Ò>eô€Í¯$U8TRoàÌ–P  IVMHÛ\sLKOtª ÍQSpJN­ €¾€.€»€¯€ €[€€€¥€€p€°€f€{€N€Â€–€‰€ €#€ €Æ€”€“€š€Ë€O€l€,€¨€¹€A€Z€˜€P€aÒ>e€Í¯$ !"#$%&'()*+,-./0123456789:;<=>?€ê€ë€ì€í€î€ï€ð€ñ€ò€ó€ô€õ€ö€÷€ø€ù€ú€û€ü€ý€þ€ÿ     -/0(*)‚•" %‘¡„G+'1”ÿÿÿÿÿÿÿý!,‹.~ƒ Ò>Fc€/ Ò>ef€Í Ò>ei€Í Ò78kl¢l;^NSIBObjectData"'1:?DRTfޔ߿íû )7CO]hv’ ³Åßéöøûýÿ  '357R[dotƒŒŸ¨³µ¶¿ÆÓÙâä   !#4BKSUWY[xŠ•žª¶¸º¼¿ÁÃÅÎÐÕ×Ù '4@LZhjlnpsuˆ‹‘“œž¥§©«ÔÞèòôöøúüÿb„Ž¢·ÄÞú+JYegiktvwy‚‹Ž‘“•—™¢­¾ÀÂÄÇÞçðþ     ! # % J Y f n y ˆ “ ž ª « ­ ¯ ¸ º ¼ Å Î Ð í ù    ' , . 0 2 4 6 7 H O V _ a j l o | … Š ‘ ž « ³ µ Á Ê Ï × ì ø      ) 6 8 ; D O c u ‚ ‰ ª ¸ ½ ¿ Á Ã Å Ç Ì Î Ø í ï ñ ó õ    2 4 6 8 : M V _ h m {   ¡ £ ¥ ® ° ² Ï Ñ Ó Õ × Ù ú ü þ      % - B D F H J T a c h q | † ² ´ ¶ ¸ º Ó à â î ÷ 09BLNPRT]_aj‚˜£®ÓÕ×ÙÛÞàâë'0=Z\^`bce}ž£¥§©«­²´²´¶¸ºÇÐÛçòû'.ETegikmŠŒŽ’“•ª¬®°²Ë+:M_qƒ…‡‰‹‘“˜¡ºËÍÖØÛÝæïü'07O`bdfh™¦³ÁËÙæð ,.0249;=?ACE_hrt}†Ÿ¨±³¸ÁÃÒÔÖØÚÜÞà   +dmoqsuwy{¬®ËÍÏÑÓÖ×Ùó iz|~•²´¶¸º»½Ö÷ùûýÿ2468:;=VŸ¡£¥§©«­²·ø"+49LUacens‰®¹ÅÇÉËÌÎÐÑÓÜÞëíïñóõ÷/c{œ¹Ðñù "#0246JSZfoz†£¥§©«®¯±Èùûýÿ  )0HSpy~‘˜©«­¯±ÂÄÆÈÊáòôöøú  "4U_is’”–˜šœž »ÁÕâêìñóõúüþ+,5:GPWoŒŽ’”–˜¤©ÊÌÎÐÒÔÖØøÿ$&)+.0I[xz|~€‚„¥ÂÙëú:STVWY[\]^ginpr}Š‘šŸ¨±ÅÚç , M O Q S U W Y [ h j m o r t ‘ “ • — ™ › Á Þ û ý ÿ!!!!!5!B!b!!!ƒ!…!‡!‰!‹!¦!º!Ã!Å!ð!ò!ô!ö!ø!ú!ü!þ"""""" " """""""%"<">"@"A"J"L"Q"S"U"h"|"…"Œ"§"°"²"´"Â"Ë"Ð"Ù"Û### # ########## #"#$#&#(#*#,#.#7#9#f#h#j#l#n#p#r#t#v#x#z#|#~#€#‚#„#†#ˆ#Š#Œ#Ž##™#›#È#Ê#Ì#Î#Ð#Ò#Ô#Ö#Ø#Ú#Ü#Þ#à#â#ä#æ#è#ê#ì#î#ð#ò$$6$C$P$[$h$Á$Ô$õ%Z%e%ƒ%%«%·%î&&'"'/'|'…'‡'ˆ'‘'“'”''Ÿ'ê'ì'î'ð'ò'ô'ö'ø'ú'ü'þ(((((( ( (((((((((( ("($(&(((*(,(.(0(2(;(=(ˆ(Š(Œ(Ž((’(”(–(˜(š(œ(ž( (¢(¤(¦(¨(ª(¬(®(°(²(´(·(º(½(À(Ã(Æ(É(Ì(Ï(Ò(Õ(Ø(Û(Þ(à(â(ä(æ(è(ê(ì(î(ð(ò(ô(ö(ø(ú(ü(þ)))))) ) )))))))!)#)%)')0)2)3)<)>)?)H)J)K)T)Ym)htransmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031112442116656031153 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239406.038961322 30 atime=1418239406.038961322 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.n0000644000175000017500000000253612442116656035264 0ustar00mikedldmikedld00000000000000 IBClasses CLASS NSObject LANGUAGE ObjC CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController ACTIONS finishPrompt id toggleMoreInfo id CLASS SUUpdatePermissionPrompt LANGUAGE ObjC OUTLETS delegate id descriptionTextField NSTextField moreInfoButton NSButton moreInfoView NSView SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000013112442116656031153 xustar0030 mtime=1418239406.038961322 30 atime=1418239406.038961322 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nib0000644000175000017500000000101012442116656035057 0ustar00mikedldmikedld00000000000000 IBFramework Version 670 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects IBSystem Version 9E17 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/PaxHeaders.4960/SUUpdateAlert.nib0000644000000000000000000000012712442116655027460 xustar0030 mtime=1418239405.891958803 28 atime=1418239405.7809569 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116655031156 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdateAlert.nib/PaxHeaders.4960/keye0000644000000000000000000000013112442116655030410 xustar0030 mtime=1418239405.891958803 30 atime=1418239405.891958803 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdateAlert.nib/keyedobjects.nib0000644000175000017500000002521712442116655034332 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯ó 156<=AEW_oy zŠ‹“”—¡¢£¨ª¯°³·½¾ÂÇÜãóôõö÷øùúûüýþÿ !"'01EFKLORSV[uvew{‹— ¡¢£¤¯´µ¶¹¼¿ÈÉÑÕÖÞßæçëóôüýþ%)-12456<@EFILOWXdeijinq rstuxy~„…Š‹•™žŸ £¬­®¯µ¶·¹ÀÁÂÊËÌÒÙÚÛãéðñòú*<NOPQRSTUVWXYZ[\]`c…§¨©ª«¬­®¯°ž±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÈËÎU$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€ò€¶€Í€ñ€€»€€Ì€Î€¼€ï€€€º€ð§€ÏÒ234[NSClassName€€]SUUpdateAlertÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€t¯HIJKLMNOPQRSTUV€ €€=€H€€’€”€–€€¥€¨€¬€¯€±€´ÔXYZ[\^]NSDestinationXNSSourceWNSLabel€€ €€Ø`abcdefghijklmg_NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabledXNSWindow[NSSuperview€ €€ € € € ×`pcqefmstuvmxZNSSubviews[NSFrameSize€ €v€O€‰€ €Š_{{106, 302}, {463, 28}}Ø{|}~€‚ƒ„…†\ˆ‰[NSCellFlags_NSBackgroundColorZNSContentsYNSSupport]NSControlView\NSCellFlags2[NSTextColorþ€€€€€ @€PÔŒŽ‘’VNSSizeVNSNameXNSfFlags€#@&€ \LucidaGrandeÒ78•–¢–;VNSFontÕ˜™š›œžŸ WNSColor\NSColorSpace[NSColorName]NSCatalogName€€€€VSystem\controlColorÓ™¤œ¦§WNSWhite€K0.66666669Ò78©˜¢˜;Õ˜™š›œ¬ž­ €€€€_controlTextColorÓ™¤œ¦²€B0Ò78´µ¤µ¶b;_NSTextFieldCell\NSActionCellÒ78¸¹¥¹º»¼;[NSTextFieldYNSControlVNSView[NSResponder[descriptionÒ78¿À£ÀÁ;_NSNibOutletConnector^NSNibConnectorÔXYZ[ÄÆ€€ €€<Ý`aÈÉÊcËÌeÍfÎÏÐÑlÓÔÕ…×m…ÏÛZAllowsUndo[Preferences[NSDragTypesYGroupName_UseBackForwardListYFrameName]NSNextKeyView€!€;€0 €2€"€€ €€!€1×`apcefÝsßàumÝ€q€v€u€s€ €qÒ>?倭æçèéêëìíîïðñò€#€$€%€&€'€(€)€*€+€,€-€.€/Zpublic.url_NeXT RTFD pasteboard type_NSStringPboardType_NeXT TIFF v4.0 pasteboard type_Apple URL pasteboard type_WebURLsWithTitlesPboardType_!Apple Web Archive pasteboard type_public.url-name_Apple HTML pasteboard type_NSFilenamesPboardType_NSColor pasteboard type_Apple PICT pasteboard type_*NeXT Rich Text Format v1.0 pasteboard type_{{-1, 0}, {527, 197}}Ó…ZIdentifierVValues€:€€3Ó>  WNS.keys€9£   €4€5€6£€7€8€7_WebKitDefaultFixedFontSize_WebKitMinimumFontSize_WebKitDefaultFontSize Ò78£;_NSMutableDictionary\NSDictionaryÒ78¢;^WebPreferencesÒ78 ¤ »¼;WWebView_releaseNotesViewÔXYZ#%&€G€€>€FØ`abcdefg)*+,lmg€ €E€?€@! € € _{{459, 12}, {182, 32}}Ý{23456}~7€89:…<=>?=%BCD_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalent_NSPeriodicDelay]NSButtonFlagsÿÿÿÿ„þ€D€€B€C€A€B€>Èÿÿÿÿ†‚@ÿo#AB0=>28BL >1=>2;5=85ÔŒŽH‘J€#@*€Q Ò78MN¤N¶b;\NSButtonCellÒ78PQ¥Qº»¼;XNSButton^installUpdate:Ò78TU£UÁ;_NSNibControlConnectorÔXYZ[XZ€€I€€Ý\]^_`abcdefggij…lmnopqrst\NSWindowView\NSScreenRect_NSFrameAutosaveName]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €Ž€‹€€Kÿÿÿÿðx€L€J€€Œ€M_{{248, 468}, {655, 370}}o>ABC?=> >1=>2;5=85 ?@>3@0<<KÒxyzYNS.string€NTViewÒ78|}£}~;_NSMutableStringXNSStringÒ>F€t©‚ƒ„…†%Ý\Š€P€]€b€g€l€>€q€ €€Ú`aŒbÊcdefgŽl‘’“lmgZNSEditable€ €\€U €V€Q € € Ò>?™€¦š›œïéñ€R€S€T€,€&€._Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_{{24, 291}, {64, 64}}Ø{¥}¦§€¨©ª«¬««­×WNSStyleWNSAlignWNSScaleZNSAnimatesþ€[€WÓ2°±²³^NSResourceName€Z€X€YWNSImage_NSApplicationIconÒ78·¸¢¸;_NSCustomResourceÒ78º»£»b;[NSImageCellÒ78½¾¥¾º»¼;[NSImageViewØ`abcdefghÂÃÄlmg€ €€^€_ € € _{{106, 338}, {443, 17}}Ø{|}~€‚ƒ„…̓ω€€€€`€]@€ÔŒŽHÓÔ€€a_LucidaGrande-BoldØ`abcdefghÙÚ“lmg€ €€c€d € € _{{106, 280}, {443, 14}}Ø{|}~€‚ƒ„âã„ω€€€e€f€b€o !?8A>: 87<5=5=89 2 =>2>9 25@A88:ÔŒŽÓꀀa Ø`abcdefg)îï,lmg€ €E€h€i € € _{{313, 12}, {146, 32}}Ý{23456}~7€8‚:…<=øù=…BCD€D€€B€k€j€B€go0?><=8BL ?>765QØ`abcdefg)lmg€ €E€m€n € € _{{103, 12}, {210, 32}}Ý{23456}~7€8‚:…<=  =†BCD€D€€B€p€o€B€lo@>?CAB8BL MB> >1=>2;5=85ÒxyŠ€NÞ`apcefg¦× Õm"«gÏYNSBoxType[NSTitleCell]NSTransparent\NSBorderTypeYNSOffsets_NSTitlePosition]NSContentView€ €€y€w€r€ €x€ €!Ò>F'€t¡Ï€!Ò>F+€t¡Ä€ Ò78./£/0;^NSMutableArrayWNSArray_{{1, 1}, {524, 197}}Ò783»£»¼;_{{109, 76}, {526, 199}}V{0, 0}×{|}~€‚ƒ8…:«;€€{€€z€~ÔŒŽ‘?€€Õ˜™š›œBžC €€}€|€_textBackgroundColorÓ™¤œ¦H€B1Ó™¤œ¦K€M0 0.80000001Ò78MN¤N»¼;UNSBoxØ`abcdefg)RSulmg€ €E€€‚ € € _{{106, 48}, {506, 18}}Þ{2Y3456}~7€8‚:…\<q]…_†ŠBbc]NSNormalImage€D€€„€†€€ƒ€€€H1=>2;5=8O 4;O 1C4CI8E 25@A89 ?@>3@0<<K 02B><0B8G5A:8Ó2°±²h€Z€X€…XNSSwitchÒklm[NSImageName€ˆ€‡Ò78op¢p;_NSButtonImageSourceZ{655, 370}_{{0, 0}, {1440, 878}}Z{586, 392}_{3.40282e+38, 3.40282e+38}Ò78vw¢w;_NSWindowTemplateVwindowÔXYZ[X}€€€I€‘XdelegateÔXYZ#†ƒ€G€€l€“_skipThisVersion:ÔXYZ#…‰€G€€g€•^remindMeLater:×XŒYZŽ‘’Š”qYNSKeyPathYNSBinding_NSNibBindingConnectorVersion€œ€—€›€š€€€™Ò–—l_NSSharedInstance€˜ Ò78𛣛œ;_NSUserDefaultsController\NSController_#value: values.SUAutomaticallyUpdateUvalue_values.SUAutomaticallyUpdateÒ78¡¢£¢Á;_NSNibBindingConnectorØXŒYZ¤Ž§¨Ýª«qYNSOptions€œ€€ €Ÿ€q€ž€¡_hidden: showsReleaseNotesVhidden_showsReleaseNotesÓ>°±³€¤¡²€¢¡´€£_NSValueTransformerName_NSNegateBooleanÒ78¸¢;×XŒYZ޼’ƒ¿q€œ€€§€š€]€¦_value: titleTextYtitleTextØXŒYZ¤ŽÅ¨ŠÈÉq€œ€€ª€Ÿ€€€©€«_hidden: allowsAutomaticUpdates_allowsAutomaticUpdatesÓ>°ÎЀ¤¡²€¢¡´€£×XŒYZŽÕ’‚Øq€œ€€®€š€P€­_value: applicationIcon_applicationIconØXŒYZ¤Ž§¨„ªâq€œ€€ €Ÿ€b€ž€°Ó>°å瀤¡²€¢¡´€£×XŒYZŽì’\ïq€œ€€³€š€ €²_value: descriptionText_descriptionTextØXŒYZ¤Ž§¨Äªùq€œ€€ €Ÿ€ €ž€µÓ>°üþ€¤¡²€¢¡´€£Ò>€¹¯%†Ä\„ƒ X…g‚ÝŠÏ€>€l€ € €b€]€·€—€I€g€ €P€q€€€!Ò23€€¸]NSApplicationÒ780¢0;Ò>€¹¯ggÏggggXgggÝ€ € €!€ € € €€€€ €I€ € € €qÒ>,€¹¯%†Ä\„ƒ X…g‚ÝŠ€>€l€ € €b€]€·€—€I€€g€ €P€q€€Ò>>€¹¯?@ABCDEFGHIJKLM€½€¾€¿€À€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ëo#Push Button (#AB0=>28BL >1=>2;5=85)o'Push Button (@>?CAB8BL MB> >1=>2;5=85)XWeb View[Static Texto.Static Text (!?8A>: 87<5=5=89 2 =>2>9 25@A88:)]Static Text-1[Application_Shared Defaults_Update Alert (release notes)\File's OwneroPush Button (0?><=8BL ?>765)\Content View_Image View (NSApplicationIcon)SBoxo[Check Box (03@C60BL 8 CAB0=02;820BL >1=>2;5=8O 4;O 1C4CI8E 25@A89 ?@>3@0<<K 02B><0B8G5A:8)Ò>_€¹ Ò>b€¹ Ò>e€¹¯N%IJT\O X…gRŠHMV†ÄPL„ƒUKÏSQ‚Ý€”€>€€=€¯€ €–€·€I€g€ €¨€€€ €’€´€l€ €€€b€]€±€—€H€!€€¬€¥€P€qÒ>‡€¹¯ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦€Ð€Ñ€Ò€Ó€Ô€Õ€Ö€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€â€ã€ä€å€æ€ç€è€é€ê€ë€ì€í€î"L MHe‡ÿÿÿÿÿÿÿýui!¡¤2 g]E¦¥  YÒ>FÇ€t Ò>Ê€¹ Ò>Í€¹ Ò78ÏТÐ;^NSIBObjectData"'1:?DRTfOU §®¼Îêø)7Sat† ª·¹»½¿ÁÃÅÇÉËÍÏÑÓÕ×ÙÛäðòô $3<OXcefovƒ‰’”µ·¹»½¿ÁÃÅÇÉËÍÏÑÓäòû  ,>FMV`iuwy{}€ƒ…¢­¹»½¿ÂÄÆÈâ#.8FS_dfhjlnsuv‡Ž•ž ©«®»ÄÉÐåíú%2?GIKW`ez|~€‚•¢¤§°¹ËØáìø !*1HWhjlnp¥°¼ÈÒçñÿ            5 7 9 ; = ? A J L g i k m o q s u w y { }  Œ ¨ ½ Þ ú  < N k ƒ º ç ÿ   " $ 1 9 ; B D F H O Q S U r Š ¢ ¤ ¦ ¯ ¶ Ì Ù â ç ö ÿ   # 4 6 8 : < ] _ a c e h i k m † » Ñ æ õ   , : C E G I K M O Q S U Z c ¡ £ ¬ ® ± ³ ¼ Å Ò Û æ ï þ&79;=?tޤ²¼Ê×áó!#%'02468:<>Y–Ÿ©«°¹ÀÒÛäæùûýÿ  4?ACEFHJMNPR[]jlnprtv’®âú#+3>CEGINO\kmoqy–›®·¾ÊÓÞê  5VXZ\^`egxz|“´¶¸º¼½¿ÁÛüþK\^`c„†ˆŠŒ‘ªßáãåçéëí13579<=?AZ‘“•—™›ÒÛÝ ,:GQcqsuwyz|~€‚„’”Ÿ¢¤­´ÃËâëò 02468:KMOQfhjln„‘“–£¥³¼ÅËìîðòôõ÷ùKY[]_acegins!#%'09EGIRWmx›¸ÁÆÙàñóõ÷ù.?ACEGVs}‡¦¨ª¬®°²»ÎÐÑÚáü /5T]d|§©«­¯±³µÑØìùûþ09>[]_acegz„¥§©«­¯±³Ôíúüÿ#%')+-/HZ{}ƒ…‡‰–˜› ¢¿ÁÃÅÇÉËäö!#%2479<>GIjlnprtvxz|~€‚„†ˆ‘“•£¬±º¼Ýßáãåçéëíïñóõ÷ùû')+-/13579;=?ACENPqsuwy{}ƒ…‡‰‹Ø)2>«·Éèõ 2 ? ` d!!&!(!)!2!4!5!>!@!!ƒ!…!‡!‰!‹!!!‘!“!•!—!™!›!!Ÿ!¡!£!¥!§!©!«!­!¯!±!³!µ!·!¹!»!½!¿!È!Ê" " """"""""""!"#"%"'")"+"-"/"1"3"5"7"9";"="?"A"C"E"G"I"K"M"O"Q"S"U"W"`"b"d"f"h"j"l"n"p"r"t"v"x"z"|"~"€"‚"„"†"ˆ"Š"Œ"•"—"˜"¡"£"¤"­"¯"°"¹"¾Ñ"Ítransmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdateAlert.nib/PaxHeaders.4960/clas0000644000000000000000000000013112442116655030375 xustar0030 mtime=1418239405.891958803 30 atime=1418239405.891958803 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdateAlert.nib/classes.nib0000644000175000017500000000277412442116655033317 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController CLASS NSApplication LANGUAGE ObjC SUPERCLASS NSResponder ACTIONS installUpdate id remindMeLater id skipThisVersion id CLASS SUUpdateAlert LANGUAGE ObjC OUTLETS delegate id description NSTextField releaseNotesView WebView SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdateAlert.nib/PaxHeaders.4960/info0000644000000000000000000000013112442116655030406 xustar0030 mtime=1418239405.891958803 30 atime=1418239405.891958803 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000105012442116655032577 0ustar00mikedldmikedld00000000000000 IBFramework Version 670 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 6 IBSystem Version 9E17 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/PaxHeaders.4960/Sparkle.strings0000644000000000000000000000013212442116656027315 xustar0030 mtime=1418239406.037961305 30 atime=1418239406.037961305 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/Sparkle.strings0000644000175000017500000002025412442116656030745 0ustar00mikedldmikedld00000000000000þÿ/* No comment provided by engineer. */ "%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "1=>2;5=85 %1$@ %2$@ 703@C65=> 8 3>B>2> : 8A?>;L7>20=8N. #AB0=>28BL >1=>2;5=85 8 ?5@570?CAB8BL %1$@?"; /* No comment provided by engineer. */ "%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ =5 <>65B 1KBL >1=>2;5=0, ?>:0 >=0 70?CI5=0 87 >1@070 48A:0 8;8 4@C3>3> 8AB>G=8:0, 4>ABC?=>3> B>;L:> 4;O GB5=8O. 5@5<5AB8B5 %1$@ 2 ?0?:C @>3@0<<K, ?5@570?CAB8B5 55 8 ?>?@>1C9B5 5I5 @07."; /* No comment provided by engineer. */ "%@ %@ is currently the newest version available." = "# 20A C65 CAB0=>2;5=0 ?>A;54=OO 25@A8O %1$@ %2$@."; /* No comment provided by engineer. */ "%@ %@ is now available--you have %@. Would you like to download it now?" = "1=>2;5=85 %1$@ %2$@ 4>ABC?=> 4;O 703@C7:8  C 20A CAB0=>2;5=0 25@A8O %3$@. %>B8B5 703@C78BL >1=>2;5=85?"; /* No comment provided by engineer. */ "%@ downloaded" = "%@ 703@C65=>"; /* No comment provided by engineer. */ "%@ of %@" = "%1$@ 87 %2$@"; /* No comment provided by engineer. */ "A new version of %@ is available!" = ">ABC?=0 =>20O 25@A8O %@."; /* No comment provided by engineer. */ "A new version of %@ is ready to install!" = ">20O 25@A8O %@ 3>B>20 : CAB0=>2:5."; /* No comment provided by engineer. */ "An error occurred in retrieving update information. Please try again later." = "@8 ?>;CG5=88 8=D>@<0F88 >1 >1=>2;5=88 2>7=8:;0 >H81:0. >?@>1C9B5 ?>2B>@8BL ?>?KB:C ?>765."; /* No comment provided by engineer. */ "An error occurred while downloading the update. Please try again later." = "@8 703@C7:5 >1=>2;5=8O ?@>87>H;0 >H81:0. >?@>1C9B5 ?>2B>@8BL ?>?KB:C ?>765."; /* No comment provided by engineer. */ "An error occurred while extracting the archive. Please try again later." = "@8 @0A?0:>2:5 0@E820 2>7=8:;0 >H81:0. >?@>1C9B5 ?>2B>@8BL ?>?KB:C ?>765."; /* No comment provided by engineer. */ "An error occurred while installing the update. Please try again later." = "@8 CAB0=>2:5 >1=>2;5=8O ?@>87>H;0 >H81:0. >?@>1C9B5 ?>2B>@8BL ?>?KB:C ?>765."; /* No comment provided by engineer. */ "An error occurred while parsing the update feed." = "@8 >1@01>B:5 8=D>@0F88 >1 >1=>2;5=88 ?@>87>H;0 >H81:0."; /* No comment provided by engineer. */ "An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "@8 ?5@570?CA:5 %1$@ ?@>87>H;0 >H81:0. 1=>2;5=85 1C45B CAB0=>2;5=> ?@8 A;54CNI5< 70?CA:5 %1$@."; /* the unit for bytes */ "B" = ""; /* No comment provided by engineer. */ "Cancel" = "B<5=8BL"; /* No comment provided by engineer. */ "Cancel Update" = "B<5=8BL >1=>2;5=85"; /* No comment provided by engineer. */ "Checking for updates..." = "1=>2;5=8O..."; /* No comment provided by engineer. */ "Downloading update..." = "03@C60N >1=>2;5=85..."; /* No comment provided by engineer. */ "Extracting update..." = " 0A?0:>2K20N >1=>2;5=85..."; /* the unit for gigabytes */ "GB" = ""; /* No comment provided by engineer. */ "Install and Relaunch" = "#AB0=>28BL 8 ?5@570?CAB8BL"; /* No comment provided by engineer. */ "Installing update..." = "#AB0=02;820N >1=>2;5=85..."; /* the unit for kilobytes */ "KB" = ""; /* the unit for megabytes */ "MB" = ""; /* No comment provided by engineer. */ "OK" = "OK"; /* No comment provided by engineer. */ "Ready to Install" = ">B>2 : CAB0=>2:5"; /* No comment provided by engineer. */ "Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "@>25@OBL >1=>2;5=8O 4;O %1$@ 02B><0B8G5A:8? K 2A5340 <>65B5 ?@>25@8BL =0;8G85 >1=>2;5=8O 2@CG=CN 87 <5=N ?@>3@0<<K."; /* No comment provided by engineer. */ "Update Error!" = "H81:0 >1=>2;5=8O."; /* No comment provided by engineer. */ "Updating %@" = "1=>2;ON %@"; /* No comment provided by engineer. */ "You already have the newest version of %@." = "# 20A C65 CAB0=>2;5=0 ?>A;54=OO 25@A8O %@."; /* No comment provided by engineer. */ "You're up-to-date!" = "# 20A CAB0=>2;5=0 ?>A;54=OO 25@A8O."; transmission-2.92/macosx/Sparkle.framework/Resources/PaxHeaders.4960/da.lproj0000644000000000000000000000013212442116655024161 xustar0030 mtime=1418239405.710955701 30 atime=1418239405.259947972 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/0000755000175000017500000000000012442116655025663 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/PaxHeaders.4960/SUAutomaticUpdateAlert0000644000000000000000000000013212442116655030512 xustar0030 mtime=1418239405.325949103 30 atime=1418239405.260947989 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116655032763 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000031512442116655030741 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239405.324949086 30 atime=1418239405.324949086 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUAutomaticUpdateAlert.nib/keyedobject0000644000175000017500000001552712442116655035210 0ustar00mikedldmikedld00000000000000bplist00Ô’“X$versionX$objectsY$archiverT$top† ¯˜#$*.2=Ecdeimpq‹œ¥¦§¨©ª«¬µÃÈÉÊÍÑרâï÷øû  !*167ABVW\]benowxy‚ƒ‹Œ›œ ¡¤¨©«¬­®±²¶»¼ÀÅÆËÌÖÚßàáâçîïð÷øù2Pnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰ŒU$nullÛ _NSVisibleWindows]NSObjectsKeysVNSRoot\NSOidsValuesV$classZNSOidsKeys]NSConnections_NSObjectsValues_NSAccessibilityConnectors_NSAccessibilityOidsKeys_NSAccessibilityOidsValues€€s€€y€—€x€€w€•€–€–Ò !"[NSClassName€€_SUAutomaticUpdateAlertÒ%&'(Z$classnameX$classes^NSCustomObject¢')XNSObjectÒ +,-ZNS.objects€ Ò%&/0\NSMutableSet£/1)UNSSetÒ +34€S¨56789:;<€€\€_€a€c€j€m€pÔ >?@ABCWNSLabel]NSDestinationXNSSource€[€Z€ €ßFGHIJKLM NOPQRSTUVWXYZ[\]^_`ab\NSWindowRect]NSWindowTitle_NSUserInterfaceItemIdentifierYNSMaxSize\NSWindowViewYNSMinSize_NSWindowIsRestorable\NSScreenRect_NSWindowContentMinSize_NSWindowBackingYNSWTFlags]NSWindowClass[NSViewClass_NSWindowStyleMask€ € €€X€€W €V€Y€px€ €_{{114, 521}, {559, 152}}PÒ fghYNS.string€ XNSWindowÒ%&jk_NSMutableString£jl)XNSStringÒ fgo€ TViewZ{511, 152}Ør stuvwxyz{|{~€]NSNextKeyView[NSSuperviewXNSvFlags_NSNextResponder[NSFrameSizeXNSWindowZNSSubviews€€U€€€T€€Ò +3ƒ€S§y…†‡ˆ‰Š€€€&€:€C€H€6ÛŒrŽst uwZ…“Z•X—˜X›YNSEnabledWNSFrameZNSEditableVNSCell[NSDragTypes €€ €€ €$€€€Ò +,ž€¦Ÿ ¡¢£¤€€€€€€_Apple PNG pasteboard type_Apple PDF pasteboard type_NSFilenamesPboardType_Apple PICT pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NeXT TIFF v4.0 pasteboard type_{{23, 73}, {64, 64}}ÙŒrst uwZ†¯°X—²X €&€%€'€€4€€ض·¸¹º» ¼½¾¿¿À¿ÁÂ[NSCellFlags\NSCellFlags2WNSAlignWNSScaleZNSContentsWNSStyleZNSAnimatesþ€€#Ó Ä ÅÆÇ^NSResourceName€"€!€ WNSImage_NSApplicationIconÒ%&ËÌ_NSCustomResource¢Ë)Ò%&ÎÏ[NSImageCell£ÎÐ)VNSCellÒ%&ÒÓ[NSImageView¥ÒÔÕÖ)YNSControlVNSView[NSResponder_{{105, 120}, {389, 17}}ÙŒrst uwZŠÛÜXÞ²X €6€5€7€€4€€ض·ºã äåæçèU…ëìíî]NSControlView[NSTextColorYNSSupport_NSBackgroundColorþ@€ €€3€0€(€+Ô ðñòóôõöVNSNameVNSSizeXNSfFlags€*€)#@*_LucidaGrande-BoldÒ%&ùúVNSFont¢ù)Õü ýþÿ]NSCatalogName[NSColorName\NSColorSpaceWNSColor€,€/€-€.VSystem\controlColorÓ þ  WNSWhite€/M0.6666666667Ò%& WNSColor¢ )Õü ýþÿ€,€/€1€2_controlTextColorÓ þ €/B0Ò%&_NSTextFieldCell¤)\NSActionCellVNSCellÒ%&[NSTextField¥ÔÕÖ)_{{105, 81}, {435, 31}}ÙŒrst uwZ‰$%X|'X €H€M€N€€B€€ض·ºã äåæçèU†ëì/î€ €&€3€0€8€+Ô ðñòó345€*€9#@& \LucidaGrandeÙŒrst uwZ9:;X='X €<€;€=€€B€€_{{380, 12}, {168, 32}}ÝC¶D·EFGºã åHIJçKLUNOP‡ROTU_NSPeriodicInterval]NSButtonFlags_NSAlternateContents_NSKeyEquivalent_NSAlternateImage_NSPeriodicDelay^NSButtonFlags2ÿÿÿÿ†‚@ÿ€ €@€?€>€:€A€?È_Installer og genstartÔ ðñòó3Z[€*€9#@*Q Ò%&^_\NSButtonCell¤^`a)\NSActionCellVNSCellÒ%&cdXNSButton¥cÔÕÖ)ÙŒrst uwZ‡hiX='X €:€D€E€€B€€_{{235, 12}, {145, 32}}ÝC¶D·EFGºã åHIJçKLUqOsˆROTU€ €G€?€F€C€A€?oNår der afsluttesQÙŒrst uwZˆ|}X|'X €C€I€J€€B€€_{{102, 12}, {121, 32}}ÝC¶D·EFGºã åHIJçKLU…O‡‰ROTU€ €L€?€K€H€A€?^Installer ikkeÒ fgŽ€ P_{{105, 58}, {382, 18}}ÝC¶D·EFGºã åHIJç‘’UU•–ŠR/TšH?@·¸‡€^€]€€:[installNow:Ò%&½¾_NSNibControlConnector£½¿)^NSNibConnectorÔ >?@·Âˆ€^€`€€C]installLater:Ô >?@·È‰€^€b€€H]doNotInstall:×ÍÎÏ >?@КÑÒÓÔŠYNSKeyPath_NSNibBindingConnectorVersionYNSBinding€h€g€i€f€d€6Ò ×ØZ_NSSharedInstance€e Ò%&ÛÜ_NSUserDefaultsController£ÝÞ)_NSUserDefaultsController\NSController_#value: values.SUAutomaticallyUpdateUvalue_values.SUAutomaticallyUpdateÒ%&ãä_NSNibBindingConnector£åæ)_NSNibBindingConnector^NSNibConnector×ÍÎÏ >?@èšÑÒ놀l€g€i€k€€&_value: descriptionText_descriptionText×ÍÎÏ >?@ñšÑÒô…€o€g€i€n€€_value: titleTextYtitleText×ÍÎÏ >?@úšÑÒýy€r€g€i€q€€_value: applicationIcon_applicationIconÒ +€v¯CXy•…°†Ü‡;ˆiŠ%‰}Ô€t€ €€€€€'€&€7€:€=€C€E€6€N€H€J€dÒ !€€u]NSApplicationÒ%&§¢§)Ò +€v¯CXyX…X†X‡XˆXŠX‰€€€ €€€€€€&€€:€€C€€6€€H€Ò +4€v¯CXy•…°†Ü‡;ˆiŠ%‰}Ô56789:;<€€t€ €€€€€'€&€7€:€=€C€E€6€N€H€J€d€€\€_€a€c€j€m€pÒ +R€v¯STUVWXYZ[\]^_`abcdefghijklm€z€{€|€}€~€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€€‘€’€“€”-./0123456789:;<=>?@ABCDEFGÒ +3‹€S Ò +Ž€v Ò%&‘^NSIBObjectData¢)_NSKeyedArchiverÑ”•]IB.objectdata€"+5:?rx¥¸ÆÍÚáìú (B^`bdfhjlnprt}‰‹¦¯ºÃÒ×àéôö÷ #%68:<>@BDFW_mvxz|~½ÊØø0=Vhr€Œ ¢¤¦¨ª¬­¯±³µº¼¾ÀÛÜåïñú%.05@ao{„–¢«¶¸º¼¿ÁÃÅÇÐÒáãåçéëíï&.9@LMOQRTVY[]_ajly{}ƒ…¡½Õò&G^ƒ„†ˆŠŒŽ’³¿ÌÔÜçïúÿ  ')+-5IRejs†–¢­·¾Êä        < J V ` t y ~ € ‚ „ † ˆ Š › ¢ © ² ´ ¶ ¿ Â Ö ß æ ë   ' / 1 3 5 7 9 @ M Z b d f t } … Š Ÿ ¡ £ ¥ § º Ç É Ì Õ ç ð ý   $ = b c e g i k m o q ’ ” – ˜ š œ ž ¯ ± ³ ¼ ¿ Ì ñ ò ô ö ø ú ý ÿ    Q f t Š œ ¯ Á Ð Ò Û à â ä æ è ê ì î ð ò    ( + - 6 C L Y ` i r } ¢ £ ¥ § © « ­ ¯ ± Ê ÿ   24YZ\^`bdfh¶¸º¼¾ÀÂÄÓÜÞßø-279;=?ACEGƒŒ˜šœ¥®ÄÉÒáèðû $/R[nszƒš¡°ÁÃÅÇÉÕÞöý !#%3DFHJLZw ª¬®°²´¶¿ÒÔÕÞù(NTs|”›³Âßáãåçéë3579;=?R\y{}ƒ…ž°¹»âäæèêìîðòôöøúüþ!*/8:acegikmoqsuwy{}ƒ…ŽÉËÍÏÑÓÕ×ÙÛÝßáãåçéëíïñóõ÷ùûýÿ CEGIKMOQSUWY[]_acegikmoqsuwy{}ƒ…‡‰‹‘“•—™›Ÿ¡£¥§©«­¯¸º»ÄÆÇÐßäöû – transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000031312442116655030737 xustar00113 path=transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUAutomaticUpdateAlert.nib/designable.nib 30 mtime=1418239405.325949103 30 atime=1418239405.325949103 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUAutomaticUpdateAlert.nib/designable.0000644000175000017500000005750312442116655035073 0ustar00mikedldmikedld00000000000000 1050 11D50 2182 1138.32 568.00 com.apple.InterfaceBuilder.CocoaPlugin 2182 NSTextField NSView NSWindowTemplate NSUserDefaultsController NSTextFieldCell NSImageCell NSButtonCell NSImageView NSButton NSCustomObject com.apple.InterfaceBuilder.CocoaPlugin PluginDependencyRecalculationVersion SUAutomaticUpdateAlert FirstResponder NSApplication 1 2 {{114, 521}, {559, 152}} 1886912512 NSWindow View {511, 152} 256 268 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{23, 73}, {64, 64}} YES 130560 33554432 NSImage NSApplicationIcon 0 0 0 NO YES 268 {{105, 120}, {389, 17}} YES 67239424 272629760 LucidaGrande-Bold 13 2072 6 System controlColor 3 MC42NjY2NjY2NjY3AA 6 System controlTextColor 3 MAA 270 {{105, 81}, {435, 31}} YES 67239424 272629760 LucidaGrande 11 3100 257 {{380, 12}, {168, 32}} YES 67239424 134217728 Installer og genstart LucidaGrande 13 1044 -2038284033 1 DQ 200 25 257 {{235, 12}, {145, 32}} YES 67239424 134217728 NÃ¥r der afsluttes -2038284033 1 Gw 200 25 256 {{102, 12}, {121, 32}} YES 67239424 134217728 Installer ikke -2038284033 1 200 25 256 {{105, 58}, {382, 18}} YES 67239424 131072 Download og installer opdateringer automatisk i fremtiden 1211912703 2 NSSwitch 200 25 {559, 152} {{0, 0}, {1920, 1178}} {511, 174} {10000000000000, 10000000000000} YES YES installNow: 33 doNotInstall: 35 window 22 installLater: 34 value: applicationIcon value: applicationIcon value applicationIcon 2 10 value: titleText value: titleText value titleText 2 11 value: descriptionText value: descriptionText value descriptionText 2 14 value: values.SUAutomaticallyUpdate value: values.SUAutomaticallyUpdate value values.SUAutomaticallyUpdate 2 19 0 -2 File's Owner -1 First Responder -3 Application 5 Window 6 7 8 9 15 16 17 30 18 Shared Defaults 38 39 40 41 42 43 44 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin 44 0 IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx YES 3 NSApplicationIcon {128, 128} transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/PaxHeaders.4960/SUUpdatePermissionProm0000644000000000000000000000013212442116655030562 xustar0030 mtime=1418239405.710955701 30 atime=1418239405.516952376 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdatePermissionPrompt.nib/0000755000175000017500000000000012442116655033377 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031712442116655031116 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239405.710955701 30 atime=1418239405.710955701 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdatePermissionPrompt.nib/keyedobje0000644000175000017500000003010612442116655035263 0ustar00mikedldmikedld00000000000000bplist00Ô}~X$versionX$objectsY$archiverT$top† ¯#$*.2DL^ijt„…Ž‘›œ¢¥ª«®³¹º¾ÃÄÎàáæëîïôü'+PQUVZ_px{€‡‘–—𦬳·¼½ÀÄÅÊËÎÚÛÜßèéêíôõüý·¸þ$%)-01;EFSTU^_ghirsz{€‚•–—šž¡®·¸¹º»¼½¾ÈÌÍÑÔÕרÙÚÝÞãäèíòóÿ   *123457;ABCDKLMTUV^_`hiNUksy€‚‰Š‹Œ­°±¶»¼½ÂÄåGHIJKLMNOPQRSTÞUVWXYZ[\]^_`abcdefghijklmnopqrstwzU$nullÛ _NSVisibleWindows]NSObjectsKeysVNSRoot\NSOidsValuesV$classZNSOidsKeys]NSConnections_NSObjectsValues_NSAccessibilityConnectors_NSAccessibilityOidsKeys_NSAccessibilityOidsValues€€Ê€€Õ€Ô€€ÓÒ !"[NSClassName€€_SUUpdatePermissionPromptÒ%&'(Z$classnameX$classes^NSCustomObject¢')XNSObjectÒ +,-ZNS.objects€ Ò%&/0\NSMutableSet£/1)UNSSetÒ +34€D¯56789:;<=>?@ABC€€€(€_€—€š€›€€¦€³€¶€¹€Á€Ã€ÆÔ EFGHIJWNSLabel]NSDestinationXNSSource€€€ €ÙMNOPQR STUVWXYZ[Y]YNSEnabled]NSNextKeyViewWNSFrameVNSCell[NSSuperviewXNSvFlags_NSNextResponderXNSWindow € € €€  €€ € ØN QRS_T`abcdcf]h[NSFrameSizeZNSSubviews€‚€‘€f€f€€ €g_{{104, 81}, {315, 42}}ÙMNOPQR STUlmnYpqY] €!€ €"€  €&€ € Øuvwx yz{|}~J€‚ƒ[NSCellFlags\NSCellFlags2ZNSContents]NSControlView[NSTextColorYNSSupport_NSBackgroundColorþ@€€ €€€€_DO NOT LOCALIZEÔ †‡ˆ‰Š‹ŒVNSNameVNSSizeXNSfFlags€€#@& \LucidaGrandeÒ%&VNSFont¢)Õ’ “”•–—˜™š]NSCatalogName[NSColorName\NSColorSpaceWNSColor€€€€VSystem\controlColorÓ ”ž— ¡WNSWhite€M0.6666666667Ò%&£¤WNSColor¢£)Õ’ “”•–—¨™©€€€€_controlTextColorÓ ”ž— ­€B0Ò%&¯°_NSTextFieldCell¤¯±²)\NSActionCellVNSCellÒ%&´µ[NSTextField¥´¶·¸)YNSControlVNSView[NSResponder_descriptionTextFieldÒ%&»¼_NSNibOutletConnector£»½)^NSNibConnectorÔ EFGHÀV€€'€ €_{{80, 50}, {27, 26}}ÙMNOPQR STUÆÇÈYÊqY] €n€y€z€ €&€ € ÜÏuÐvÑÒwx zÓÔÕ|Ö×ØØØVÜÝÞß_NSPeriodicInterval]NSButtonFlags_NSAlternateContents_NSKeyEquivalent_NSPeriodicDelay^NSButtonFlags2ÿÿÿÿ¸Ì@ÿ€€#€#€#€ €%€$È…PÔ †‡ˆ‰Šä倀#@*Ò%&çè\NSButtonCell¤çéê)\NSActionCellVNSCellÒ%&ìíXNSButton¥ì¶·¸)^moreInfoButtonÔ EFGHñò€€^€)€×õ R S_`ö÷Zøùúû[NSExtension€\€]€[€€Z€*Ò +3þ€D¢ÿ€+€VÜNO QRS`  ò òXNSsFlags]NSContentView[NSVScroller\NSScrollAmts[NSHScroller€- €T€-€U€)€N€)OA€A€€,€RÒ +3€D£€-€N€RÚNO QRS` !"ÿ$ÿ&YNSBGColorYNSDocViewYNScvFlags€K€/€/€J€M€+ €+€.Ò +3)€D¡€/ß_R,S-{. /0123456M7Q89:;<=?@?ABCDEFGBIUKMNO_NSColumnAutoresizingStyle_NSDraggingSourceMaskForNonLocal_#NSTableViewDraggingDestinationStyleZNSDelegate_NSIntercellSpacingHeight[NSRowHeightYNSTvFlags_NSDraggingSourceMaskForLocal\NSCornerView\NSDataSource[NSGridColor_NSIntercellSpacingWidth^NSTableColumns_NSTableViewGroupRowStyle_NSAllowsTypeSelect€0€-€?€I€H#@#@,ÿÿÿÿÒÀ€1€H€E #@€-€4Z{353, 113}ÔO RSRSdù€2€3€_{{346, 0}, {12, 17}}Ò%&WX]_NSCornerView¤Y·¸)]_NSCornerViewÒ +3\€D¢]^€5€AÙ`ab cdefgUiklmn o^NSIsResizeableZNSDataCell[NSTableView\NSHeaderCellZNSMaxWidthZNSMinWidth^NSResizingMaskWNSWidth €;€/€@€6#@@#@D#@`×uvw yz{qrØtu‚wþ@€#€:€8€€7Ó ”ž— z€K0.33333299Õ’ “”•–—~™©€€€9€_headerTextColorÒ%&‚ƒ_NSTableHeaderCell¥„¯…†)_NSTableHeaderCell\NSActionCellVNSCellØuvwx yz{ˆ‰Š€‚!þ€<€/€€€€=YText CellÕ’ “”•–—”™@€€€>€?_textBackgroundColorÓ ”ž— ™€B1Ò%&›œ]NSTableColumn¢›)Ù`ab cdefgUŸk¢£¤ ¥ €C€/€@€B#@@#@D#@k`×uvw yz{qrØtu‚w€#€:€8€€7Øuvwx yz{ˆ‰Š€‚€<€/€€€€=Ò%&´µ^NSMutableArray£´¶)WNSArrayÕ’ “”•–—º™»€€€F€GYgridColorÓ ”ž— ¿€D0.5Ò%&ÁÂ[NSTableView¥ö·¸)[NSTableView_{{1, 1}, {353, 113}}Õ’ “”•–—È™š€€€L€_controlBackgroundColorÒ%&ÌÍZNSClipView¤Ì·¸)ÙÏOÐÑQR SÒdÓÿÕÿרÿXNSActionXNSTargetYNSPercent€P€O€+#?é€+ÿÿÿÿ€€Q€+_{{-22, 1}, {11, 125}}\_doScroller:Ò%&ÝÞZNSScroller¥ݶ·¸)ÙÏOÐÑQR SÒáâÿäÿdØÿ€P€S€+#?ï±û €+€Q€+_{{-100, -100}, {345, 11}}_{{4, 5}, {355, 115}}Ò%&ëì\NSScrollView¤ë·¸)×MOPQR SUïðòZ[ò €W€X€)€€)_{{1, 128}, {358, 70}}Øuvwx yz{|}ö€‚ƒ€Y€V€€€€_ºAnonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this. This is the information that would be sent:Z{362, 205}Ò%&ÿ\NSCustomView¤ÿ·¸)\moreInfoViewÔ EFGH€€–€`€ß      ØùYU !"#N\NSWindowRect]NSWindowTitle_NSUserInterfaceItemIdentifierYNSMaxSize\NSWindowViewYNSMinSize_NSWindowIsRestorable\NSScreenRect_NSWindowContentMinSize_NSWindowBackingYNSWTFlags]NSWindowClass[NSViewClass_NSWindowStyleMask€a€#€€”€ €“ €’€•€epx€b€d_{{83, 492}, {438, 168}}Ò &'(YNS.string€cXNSWindowÒ%&*+_NSMutableString£*,)XNSStringÒ &'/€cTViewZ{213, 107}Ò +33€D§4Æ6JlaV€h€n€s€ €!€‚€ ÚMNOPQR ST<U>?@YáqY]NUNSTag €j€i€k€ €&€ € _{{284, 12}, {138, 32}}ÞÏuÐvÑÒGwx zÓ<ÔÕHIJØLÝN4ÜÝÞNR_NSAlternateImageÿÿÿÿ„þÿÿÿÿ†‚@ÿ€#€m€$€l€h€%€$nSøg automatiskQ ÙMNOPQR STU4XYYáqY] €h€o€p€ €&€ € _{{190, 12}, {94, 32}}ÝÏuÐvÑÒGwx zÓÔÕ|IJØaÝcÆÜÝÞR€#€r€$€q€n€%€$hSøg ikkeQÙMNOPQR STUJlmYÊ[Y] € €t€u€ €€ € _{{104, 114}, {289, 34}}Øuvwx yz{|}t6€xƒ€v€s€€€w€o"Søg efter opdateringer automatisk?Ô †‡ˆ‰}~€€x#@*_LucidaGrande-Bold_{{104, 53}, {278, 18}}ÞÏuÐvÑÒƒwxG zÓÔÕH„…ØØˆ‰l‹Ü‚ÞŽ]NSNormalImageH?@)_NSArrayController_NSObjectController\NSController_#value: arrangedObjects.displayValueUvalue_arrangedObjects.displayValue×ôõö EFGEŽúH]€µ€±€¥€´€§€5_!value: arrangedObjects.displayKey_arrangedObjects.displayKey×ôõö EFGNŽúQa€¸€±€¥€·€€‚[value: iconTiconØôõö EFG÷WŽúZl]€»€±€¥€º€€!€¼_value: shouldSendProfile_shouldSendProfileÓ +be€¤¢cd€½€¾¢fg€¿€À_NSNullPlaceholder_NSValidatesImmediately Øôõö EFG÷øŽùúûlr€ €Ÿ€¥€ž€€!€ÂÓ +uw€¤¡€¢¡€£×ôõö EFGzŽú}J€Å€±€¥€Ä€€ _value: promptDescription_promptDescription×ôõö EFGƒŽ„ú†€É€È€¥€Ç€€§_+contentArray: systemProfileInformationArray\contentArray_systemProfileInformationArrayÒ +Ž€Ò¯Y4@ÆY6mJXlÈa¨Vnòÿ]i^Ÿð¬€Ë€`€ €h€k€n€p€s€u€ €€!€z€‚€‹€ €"€§€)€+€/€5€;€A€C€R€N€V€X€ÍÒ !¯€€Ì]NSApplicationÓ² U´µ_NSAppliesImmediately €Î€ÑÒ +3¸€D¢¹º€Ï€Ð_SUIncludeProfile_SUSendProfileInfoÒ%&¾¿_NSUserDefaultsController£ÀÁ)_NSUserDefaultsController\NSControllerÒ%&¶â¶)Ò +Æ€Ò¯Y4YÆY6YJYlYaYVòÿ]^ÿÿò€€€`€ €h€ €n€ €s€ € € €!€ €‚€ € €€€)€+€/€5€/€A€+€+€)€V€Ò +ç€Ò¯.Y4@ÆY6mJXlÈa¨Vnòÿ]i^Ÿð¬56789:;<=>?@ABC€€Ë€`€ €h€k€n€p€s€u€ €€!€z€‚€‹€ €"€§€)€+€/€5€;€A€C€R€N€V€X€Í€€€(€_€—€š€›€€¦€³€¶€¹€Á€Ã€ÆÒ +€Ò¯. !"#$%&'()*+,-./0123456789:;<=>?@ABCDEF€Ö€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€â€ã€ä€å€æ€ç€è€é€ê€ë€ì€í€î€ï€ð€ñ€ò€ó€ô€õ€ö€÷€ø€ù€ú€û€ü€ý€þ€ÿº»¼½¾¿ÀÁÂÃÄÅÆÇÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçÒ +3v€D Ò +y€Ò Ò%&{|^NSIBObjectData¢{)_NSKeyedArchiverÑ€]IB.objectdata€"+5:?QW„—¥¬¹ÀËÙë!=?ACEHJLNQTW`lnp‹”Ÿ¨·¼ÅÎÙÛÜåòùÿ +-/13579;=?ACEGIZbpy{}¦°¾ÆÍÙâôýþ   0<GIKMPRTVXq–—™›Ÿ¢¤¦¨ÉÕâíû%*/13579;M^eluwy‚…’›¢§¼ÊÖãëíïñóõü  "09AF[]_acvƒ…ˆ‘£¬¹ÀÉÕàêñý4;J[]_aczŸ ¢¤¦¨«­¯±â÷   - ? N P Y ^ ` b d f h j l n o € ‚ „ ™ ¦ ¯ ¼ Ã Ì Õ à ï     % 1 3 5 7 9 ; = F H M O Q ‚ ‹ ™ ¥ ² ¾ À Å Ç É Ë Í Ð Ò Ô ç é ë ô ö ý ÿ   , 6 @ J L N P R T V X [ ] _ h j m o Ê æ  . 9 T ` j ‰ – £ ¯ É Ø ó        " + 4 6 8 : < = F H J L M X i k m o † ¦ ´ ½ ¿ Ä Æ È í ü +6EMNPRTV_hqŽ“–˜šœž ­¯»ÐÒÔÖØêó&3:[`egikmoq{’”–˜®»½ÀÉ×Ü %BDFHJLmoqsuwy‚‘˜ µ·¹»½ÇÔÖÛäðû3579;T]hq–Ÿ¨²´¶¸ÁÃÌÎÐèõþ 9;>@BKMOQm„š£ÀÁÃÅÇÉËã  ÍØáî÷\iw—¡®¸ÏÜõ+?ACEGIKLNPRTY[]w€ŠŒ•ž°·ÀÉËÐÛäæõ÷ùûýÿ,23579;=?AZ“¦¯¸½¿ÁÃÅÇÉËÍêì 8moqsuwy{ŒŽ³´¶¸º¼¾ÀÂÜýÿ Pacenq…ž×åêïñóõ÷ùûýÿ -<>@BJS\ot}‰‹–¬±Þéõöøúûýÿ!#%')+Gc—¯Ðí%-5=HMRTVWdfhj~‡“š¡ª¶ÁÌÕÜõ#,?DK\^`bdr{“š©º¼¾ÀÂÓÕ×ÙÛí7AKMOQSUWYy€˜¥­¯²´·¹Òäíúÿ '?Nkmoqsuw˜¯¾Ùò!FGIKLMNPQZ\egikmx…’¢¤­¿ÄÖßóü  % 2 X ^ } š œ ž   ¢ ¤ ¦ Ê ç!!!! ! !!!!!!B!D!F!H!J!L!N!P!k!!Œ!Ž!“!•!—!œ!ž! !´!Í!Î!ï!ñ!ó!õ!÷!ù!û!ý" " """""3"5"7"9";"="?"Z"n"‹"""‘"“"•"—"Å"Ò"ò"û"ý#<#>#@#B#D#F#H#J#L#N#P#R#T#V#X#Z#\#^#`#b#d#f#h#j#l#n#p#r#t#v#x##ƒ#…#“# #·#¸#º#¼#Å#Ç#Ì#Î#Ð#ã#÷$$$"$=$J$S$X$a$c$¢$¤$¦$¨$ª$¬$®$°$²$´$¶$¸$º$¼$¾$À$Â$Ä$Æ$È$Ê$Ì$Î$Ð$Ò$Ô$Ö$Ø$Ú$Ü$Þ$ç$é%H%J%L%N%P%R%T%V%X%Z%\%^%`%b%d%f%h%j%l%n%p%r%t%v%x%z%|%~%€%‚%„%†%ˆ%Š%Œ%Ž%%’%”%–%˜%š%œ%ž% %¢%¤%­%¯&&&&&&&&&& &"&$&&&(&*&,&.&0&2&4&6&8&:&<&>&@&B&D&F&H&J&L&N&P&R&T&V&X&Z&\&^&`&b&e&h&k&n&p&r&t&v&x&z&|&~&€&‚&„&†&ˆ&Š&Œ&Ž&&’&”&–&˜&š&œ&ž& &¢&¤&¦&¨&ª&¬&®&°&²&´&¶&¸&º&¼&¾&À&Â&Ä&Æ&È&Ñ&Ó&Ô&Ý&ß&à&é&ø&ý'''"'$transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031512442116655031114 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdatePermissionPrompt.nib/designable.nib 30 mtime=1418239405.710955701 30 atime=1418239405.710955701 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdatePermissionPrompt.nib/designabl0000644000175000017500000012377612442116655035272 0ustar00mikedldmikedld00000000000000 1050 11D50 2182 1138.32 568.00 com.apple.InterfaceBuilder.CocoaPlugin 2182 NSUserDefaultsController NSScroller NSArrayController NSButton NSScrollView NSImageView NSTextFieldCell NSButtonCell NSImageCell NSTableView NSCustomView NSCustomObject NSView NSWindowTemplate NSTextField NSTableColumn com.apple.InterfaceBuilder.CocoaPlugin PluginDependencyRecalculationVersion SUUpdatePermissionPrompt FirstResponder NSApplication 1 2 {{83, 492}, {438, 168}} 1886912512 NSWindow View {213, 107} 256 257 {{284, 12}, {138, 32}} 1 YES -2080244224 134217728 Søg automatisk LucidaGrande 13 1044 1 -2038284033 1 DQ 200 25 257 {{190, 12}, {94, 32}} YES 67239424 134217728 Søg ikke -2038284033 1 Gw 200 25 264 {{104, 114}, {289, 34}} YES 67239424 272629760 Søg efter opdateringer automatisk? LucidaGrande-Bold 13 2072 6 System controlColor 3 MC42NjY2NjY2NjY3AA 6 System controlTextColor 3 MAA 266 {{104, 81}, {315, 42}} YES 67239424 272629760 DO NOT LOCALIZE LucidaGrande 11 3100 264 {{104, 53}, {278, 18}} YES -2080244224 163840 Inkluder anonym systemprofil 1211912703 2 NSImage NSSwitch NSSwitch 200 25 264 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{23, 84}, {64, 64}} YES 130560 33554432 NSImage NSApplicationIcon 0 1 0 YES YES 265 {{80, 50}, {27, 26}} YES 67239424 134250496 -1194573569 133 200 25 {438, 168} {{0, 0}, {1920, 1178}} {213, 129} {10000000000000, 10000000000000} YES visibleKey visibleValue displayValue displayKey YES YES YES YES YES 266 274 2304 4352 {353, 113} YES 256 {{346, 0}, {12, 17}} 128 40 1000 75628096 2048 3 MC4zMzMzMzI5OQA 6 System headerTextColor 69336577 131072 Text Cell 6 System textBackgroundColor 3 MQA 3 YES 219 40 1000 75628096 2048 69336577 131072 Text Cell 3 YES 3 2 6 System gridColor 3 MC41AA 14 -759169024 4 15 0 NO 0 1 {{1, 1}, {353, 113}} 6 System controlBackgroundColor 4 -2147483392 {{-22, 1}, {11, 125}} 256 _doScroller: 0.78125 256 {{-100, -100}, {345, 11}} 257 _doScroller: 0.99047619104385376 {{4, 5}, {355, 115}} 133650 AAAAAAAAAABBgAAAQYAAAA 266 {{1, 128}, {358, 70}} YES 67239424 272629760 QW5vbnltb3VzIHN5c3RlbSBwcm9maWxlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gaGVscCB1cyBwbGFu IGZ1dHVyZSBkZXZlbG9wbWVudCB3b3JrLiBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgaGF2ZSBhbnkg cXVlc3Rpb25zIGFib3V0IHRoaXMuCgpUaGlzIGlzIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdvdWxkIGJl IHNlbnQ6A {362, 205} NSView NSResponder SUIncludeProfile SUSendProfileInfo YES finishPrompt: 144 descriptionTextField 133 window 126 finishPrompt: 145 moreInfoView 127 toggleMoreInfo: 131 moreInfoButton 132 contentArray: systemProfileInformationArray contentArray: systemProfileInformationArray contentArray systemProfileInformationArray 2 25 value: promptDescription value: promptDescription value promptDescription 2 161 hidden: shouldAskAboutProfile hidden: shouldAskAboutProfile hidden shouldAskAboutProfile NSValueTransformerName NSNegateBoolean 2 143 value: shouldSendProfile value: shouldSendProfile value shouldSendProfile 2 148 value: icon value: icon value icon 2 130 value: arrangedObjects.displayKey value: arrangedObjects.displayKey value arrangedObjects.displayKey 2 174 value: arrangedObjects.displayValue value: arrangedObjects.displayValue value arrangedObjects.displayValue 2 173 hidden: shouldAskAboutProfile hidden: shouldAskAboutProfile hidden shouldAskAboutProfile NSValueTransformerName NSNegateBoolean 2 139 0 -2 File's Owner -1 First Responder -3 Application 5 Profile Info 6 13 14 32 33 34 37 71 24 Array Controller 39 MoreInfoView 40 41 42 43 44 45 46 49 User Defaults Controller 176 177 178 179 180 181 182 183 184 185 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin 185 0 IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx YES 3 {128, 128} {15, 15} transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/PaxHeaders.4960/SUUpdateAlert.nib0000644000000000000000000000013212442116655027412 xustar0030 mtime=1418239405.487951879 30 atime=1418239405.325949103 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116655031114 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdateAlert.nib/PaxHeaders.4960/keye0000644000000000000000000000013212442116655030347 xustar0030 mtime=1418239405.487951879 30 atime=1418239405.487951879 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdateAlert.nib/keyedobjects.nib0000644000175000017500000002362112442116655034265 0ustar00mikedldmikedld00000000000000bplist00ÔÊËX$versionX$objectsY$archiverT$top† ¯é#$*.2DL^ijt„…Ž‘›œ¢¥ª«®³¹º¾Ã×ßñòóôõö÷øùúûüýþÿ!%&+KLMNRVWcoxyz{|†‘–—˜›Ÿ¢£«°±²ÅÌÍÒÜÝæúû  !*+,0489;<=DINORUXabmnrsvwxyz}~ƒ„‰ŠŽ“”™š¤¨­®¯°µ¾¿ÀÁÇÈÉËÒÓÔÜÝÞäìòú +./1JsœžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³ø´µ¶·¸¹º»¼½¾¿ÀÁÄÇU$nullÛ _NSVisibleWindows]NSObjectsKeysVNSRoot\NSOidsValuesV$classZNSOidsKeys]NSConnections_NSObjectsValues_NSAccessibilityConnectors_NSAccessibilityOidsKeys_NSAccessibilityOidsValues€€¹€€¿€è€¾€€½€æ€ç€çÒ !"[NSClassName€€]SUUpdateAlertÒ%&'(Z$classnameX$classes^NSCustomObject¢')XNSObjectÒ +,-ZNS.objects€ Ò%&/0\NSMutableSet£/1)UNSSetÒ +34€w¯56789:;<=>?@ABC€€€A€€’€•€—€™€ €¨€«€¯€±€³€¶Ô EFGHIJWNSLabel]NSDestinationXNSSource€€€ €ÙMNOPQR STUVWXYZ[Y]YNSEnabled]NSNextKeyViewWNSFrameVNSCell[NSSuperviewXNSvFlags_NSNextResponderXNSWindow € € €€  €€ € ØN QRS_T`abcdcf]h[NSFrameSizeZNSSubviews€K€y€I€I€Š€ €J_{{106, 302}, {463, 28}}ÙMNOPQR STUlmnYp[Y] €^€]€_€  €€ € Øuvwx yz{|}~J€‚ƒ[NSCellFlags\NSCellFlags2ZNSContents]NSControlView[NSTextColorYNSSupport_NSBackgroundColorþ@€€ €€€€PÔ †‡ˆ‰Š‹ŒVNSNameVNSSizeXNSfFlags€€#@& \LucidaGrandeÒ%&VNSFont¢)Õ’ “”•–—˜™š]NSCatalogName[NSColorName\NSColorSpaceWNSColor€€€€VSystem\controlColorÓ ”ž— ¡WNSWhite€M0.6666666667Ò%&£¤WNSColor¢£)Õ’ “”•–—¨™©€€€€_controlTextColorÓ ”ž— ­€B0Ò%&¯°_NSTextFieldCell¤¯±²)\NSActionCellVNSCellÒ%&´µ[NSTextField¥´¶·¸)YNSControlVNSView[NSResponder[descriptionÒ%&»¼_NSNibOutletConnector£»½)^NSNibConnectorÔ EFGHÀÁ€€@€ €ÝÄÅNÆOÇ QRÈSTÉÊËÌÍÎUÐÑÒ~Ñ]ÖYGroupName_UseBackForwardList[PreferencesZAllowsUndoYFrameName[NSDragTypes€4€3€5€2 €?€!€€!€ €"ØNO QRST`ÁÙblÒl]Þ€ €x€y€^€^€ €vÒ +,ုâãäåæçèéêëìíîïð€#€$€%€&€'€(€)€*€+€,€-€.€/€0€1_Apple PDF pasteboard type_NeXT TIFF v4.0 pasteboard type_NSFilenamesPboardType_Apple HTML pasteboard type_public.url-name_WebURLsWithTitlesPboardType_*NeXT Rich Text Format v1.0 pasteboard type_Apple URL pasteboard type_!Apple Web Archive pasteboard type_NSStringPboardTypeZpublic.urlZpublic.png_NeXT RTFD pasteboard type_NSColor pasteboard type_Apple PICT pasteboard type_{{-1, 0}, {456, 197}}PÓ ~VValuesZIdentifier€6€>€Ó  +  WNS.keys€=£  €7€8€9£€:€;€<_WebKitMinimumFontSize_WebKitDefaultFixedFontSize_WebKitDefaultFontSize  Ò%&_NSMutableDictionary£)\NSDictionaryÒ%&^WebPreferences¢ )^WebPreferencesÒ%&"#WWebView¤$·¸)WWebView_releaseNotesViewÔ EFGH()€€€B€ß,-./01234 56789:;<=>Y@~UCDEFGHIJ\NSWindowRect]NSWindowTitle_NSUserInterfaceItemIdentifierYNSMaxSize\NSWindowViewYNSMinSize_NSFrameAutosaveName_NSWindowIsRestorable\NSScreenRect_NSWindowContentMinSize_NSWindowBackingYNSWTFlags]NSWindowClass[NSViewClass_NSWindowStyleMask€C€D€€€ €Œ€ €‹€Ž€Hÿÿÿÿðx€E€F_{{248, 468}, {586, 370}}_Software UpdateXNSWindowÒ OPQYNS.string€GTViewÒ%&ST_NSMutableString£SU)XNSStringZ{586, 370}Ò +3Y€w©a[V]^_lJb€K€Q€ €b€k€d€^€ €ƒÛMNOdPQR STÉU[gUiYpkY]nZNSEditable €Q€P €R€ €X€ € €LÒ +,q€¦rstäãð€M€N€O€%€$€1_Apple PNG pasteboard type_Apple PDF pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_{{24, 291}, {64, 64}}ÙMNOPQR STUJ€Y‚[Y] € €Y€Z€ €€ € Øuv‡ˆw‰ Š‹ŒŽËWNSAlignWNSScaleWNSStyleZNSAnimatesþ€S€WÓ ’ “”•^NSResourceName€V€U€TWNSImage_NSApplicationIconÒ%&™š_NSCustomResource¢™)Ò%&œ[NSImageCell£œž)VNSCellÒ%& ¡[NSImageView¥ ¶·¸)_{{106, 338}, {443, 17}}Øuvwx yz{|¤~[€©ƒ@€€Q€€€[€Ô †‡ˆ‰­®¯€€\#@*_LucidaGrande-Bold_{{106, 277}, {443, 17}}ß³´NOµ QR¶S·T`¸¹ ËѼѾYÒY]ÂÃÄYNSBoxType]NSTransparent]NSContentView\NSBorderType_NSTitlePosition[NSTitleCellYNSOffsets€!€z€!€‚€ € € €u€|€{Øuvwx yz{|¤ÆV€ʃ€`€ €€€a€_Udgivelsesnoter:Ô †‡ˆ‰­ÐÑ€€\#@& ÙMNOPQR STU_ÕÖYØÙY] €d€c€e€ !€j€ € _{{299, 12}, {161, 32}}ÙMNOPQR STUßàáYØÙY] €q€p€r€ €j€ € Ýçuèvéêëwx zìíî|ïð~òóô]öóøù_NSPeriodicInterval]NSButtonFlags_NSAlternateContents_NSKeyEquivalent_NSAlternateImage_NSPeriodicDelay^NSButtonFlags2ÿÿÿÿ†‚@ÿ€€h€g€f€b€i€gÈoPåmind mig senereÔ †‡ˆ‰Šþÿ€€#@*QÒ%&\NSButtonCell¤)\NSActionCellVNSCellÒ%&XNSButton¥¶·¸)ÙMNOPQR STU]  YÙY] €b€l€m€  €j€ € _{{103, 12}, {155, 32}}Ýçuèvéêëwx zìíî|ïð~ó^öóøù€€o€g€n€k€i€g_Spring denne overÒ OP€GP_{{461, 12}, {111, 32}}Ýçuèvéêëwx zìíî"ïð~$ó&_öóøùÿÿÿÿ„þ€€t€g€s€d€i€g\Installer nuQ Ò +3.€w¡Ñ€!Ò +32€w¡Á€ Ò%&56^NSMutableArray£57)WNSArray_{{1, 1}, {455, 197}}Ò%&·:£·¸)_{{109, 76}, {457, 199}}V{0, 0}×uvw yz{|>~€ABC€€€€}€~Ô †‡ˆ‰ŠGH€€#@&Õ’ “”•–—L™M€€€€€_textBackgroundColorÓ ”ž— Q€B1Ó ”ž— T€M0 0.80000001Ò%&VWUNSBox¤V·¸)ÙMNOPQR STU^[\YdÙY] €k€„€…€ €j€ € _{{106, 48}, {442, 18}}Ýçuèvéêëwx zìíî|cd~~ghbö‚ølH?@ABC€€º€B€ €K€R€Q€Z€ €_€b€e€k€m€d€r€^€ € €€ƒ€…€š€€€A€€’€•€—€™€ €¨€«€¯€±€³€¶Ò +u€¼¯&vwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›€À€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ó€Ô€Õ€Ö€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€â€ã€ä€å°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÉÊËÌÍÎÏÐÑÒÓÔÕÒ +3Àw Ò +Æ€¼ Ò%&ÈÉ^NSIBObjectData¢È)_NSKeyedArchiverÑÌÍ]IB.objectdata€"+5:?GZho|ƒŽœ®Êä  +-/=FQZinw€‹Ž—¤«±º¼Ýßáãåçéëíïñóõ÷ùû "+-/13Xbpx‹”¦¯°²´¶¸»½¿Áâîùûýÿ $IJLNPRUWY[|ˆ• ®ºÄØÝâäæèêìîï$'4=DI^lx…‘“•—ž«¸ÀÂÄÒÛãèýÿ%'*3EN[bkw‚Œ“Ÿ«´ËÒáòôöøú/9NZeo{}~€‚„…‡‰ŒŽ’”µ·¹»½¿ÁÃÌÎïñóõ÷ùûýÿ     ) J b  ‘ ¯ Ü ø  1 < G c } š ² ³ À Ç Ò Ô Ö Ø å í ï ö ø ú ü    ! > V X Z \ e { ‚ ˜ § ¬ » Ä Ì Õ Ý ð     L Y g ‡ ‘ ž ¨ ¾ Õ â û  % 1 E G I K M O Q S T V X Z \ e g i k † ˜ ¡ ª ´ ¶ » Ä Ö Ý æ ñ ú ü!NYZ\^_acegiktvƒ…‡‰‹«Çû89;=?ADFHJks{ƒŽ“˜šœžŸ¬»½¿ÁÉÝæùþ!*6A[|ƒ…‡‰‹ž ¢«®ÂÜ%3AN`lvwy{}ƒ…‡‰‹¬®°²´¶¸ËÜÞàéì!#<abdfhjlnp¥ºÈÞð$&/468:<>@BDFk|~€‰ŒŽ—¤­ºÁÊÓÞ  .cegikmoq…Ž‘ªßèêìîðòôö #%.=DLcls”±³µ·¹»½ÎÐÒÛÝòôöøú"/1?HNW|}ƒ…‡‰‹¤ÙÞãåçéëíïñó/8DFHQZpu€™¤ÇÐãèï"$&(*9BZapƒ…‡‰œ­¯±³µÄáë  )<>?Hcj…’¸¾Ýæþ,MWY[]_ace†¦³µ¸º½¿Øêóø!:Lmoqsuwy{—«¸º½¿ÂÄåçéëíïñó  -/13579;HJMORTqsuwy{}š·¹»½¿ÁÃÜî÷ù(*,.02468:<>@BDFHJLNPRT]_aox}†ˆ·¹»½¿ÁÃÅÇÉËÍÏÑÓÕ×ÙÛÝßáãìî=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}ƒ…‡‰’”ãåçéëíïñóõ÷ùûýÿ   !#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy‚„…Ž‘š©®ÀÅÓÎÕtransmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdateAlert.nib/PaxHeaders.4960/desi0000644000000000000000000000013212442116655030336 xustar0030 mtime=1418239405.487951879 30 atime=1418239405.487951879 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdateAlert.nib/designable.nib0000644000175000017500000010527212442116655033712 0ustar00mikedldmikedld00000000000000 1050 11D50 2182 1138.32 568.00 2182 1117 NSButton NSTextFieldCell NSButtonCell NSImageView NSBox NSImageCell WebView NSCustomObject NSView NSWindowTemplate NSTextField NSUserDefaultsController com.apple.InterfaceBuilder.CocoaPlugin com.apple.WebKitIBPlugin PluginDependencyRecalculationVersion SUUpdateAlert FirstResponder NSApplication 15 2 {{248, 468}, {586, 370}} -260571136 Software Update NSWindow View {586, 370} 256 268 Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{24, 291}, {64, 64}} YES 130560 33554432 NSImage NSApplicationIcon 0 0 0 NO YES 264 {{106, 338}, {443, 17}} YES 67239424 272629760 LucidaGrande-Bold 13 2072 6 System controlColor 3 MC42NjY2NjY2NjY3AA 6 System controlTextColor 3 MAA 268 {{106, 277}, {443, 17}} YES 67239424 272629760 Udgivelsesnoter: LucidaGrande-Bold 11 3357 289 {{299, 12}, {161, 32}} YES 67239424 134217728 PÃ¥mind mig senere LucidaGrande 13 1044 -2038284033 1 Gw 200 25 288 {{103, 12}, {155, 32}} YES 67239424 134217728 Spring denne over -2038284033 1 200 25 289 {{461, 12}, {111, 32}} YES -2080244224 134217728 Installer nu -2038284033 1 DQ 200 25 274 274 274 Apple HTML pasteboard type Apple PDF pasteboard type Apple PICT pasteboard type Apple URL pasteboard type Apple Web Archive pasteboard type NSColor pasteboard type NSFilenamesPboardType NSStringPboardType NeXT RTFD pasteboard type NeXT Rich Text Format v1.0 pasteboard type NeXT TIFF v4.0 pasteboard type WebURLsWithTitlesPboardType public.png public.url public.url-name {{-1, 0}, {456, 197}} NO YES {{1, 1}, {455, 197}} {{109, 76}, {457, 199}} {0, 0} 67239424 0 LucidaGrande 11 16 6 System textBackgroundColor 3 MQA 3 MCAwLjgwMDAwMDAxAA 1 3 0 NO 266 {{106, 302}, {463, 28}} YES 67239424 4194304 LucidaGrande 11 3100 256 {{106, 48}, {442, 18}} YES 67239424 131072 Download og installer opdateringer automatisk i fremtiden 1211912703 2 NSSwitch 200 25 {586, 370} {{0, 0}, {1920, 1178}} {586, 392} {10000000000000, 10000000000000} YES YES installUpdate: 77 remindMeLater: 34 skipThisVersion: 33 window 69 description 105 releaseNotesView 32 delegate 50 value: applicationIcon value: applicationIcon value applicationIcon 2 9 value: titleText value: titleText value titleText 2 11 hidden: showsReleaseNotes hidden: showsReleaseNotes hidden showsReleaseNotes NSValueTransformerName NSNegateBoolean 2 72 hidden: showsReleaseNotes hidden: showsReleaseNotes hidden showsReleaseNotes NSValueTransformerName NSNegateBoolean 2 161 hidden: showsReleaseNotes hidden: showsReleaseNotes hidden showsReleaseNotes NSValueTransformerName NSNegateBoolean 2 164 value: descriptionText value: descriptionText value descriptionText 2 103 value: values.SUAutomaticallyUpdate value: values.SUAutomaticallyUpdate value values.SUAutomaticallyUpdate 2 135 hidden: allowsAutomaticUpdates hidden: allowsAutomaticUpdates hidden allowsAutomaticUpdates NSValueTransformerName NSNegateBoolean 2 141 0 -2 File's Owner -1 First Responder -3 Application 5 Update Alert (release notes) 6 7 10 17 22 23 76 89 101 117 93 Shared Defaults 168 169 170 171 172 173 174 175 18 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.WebKitIBPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin 175 0 IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx YES 3 NSApplicationIcon {128, 128} transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/PaxHeaders.4960/Sparkle.strings0000644000000000000000000000013212442116655027252 xustar0030 mtime=1418239405.710955701 30 atime=1418239405.709955684 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/Sparkle.strings0000644000175000017500000001775412442116655030715 0ustar00mikedldmikedld00000000000000þÿ/* No comment provided by engineer. */ "%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ er blevet hentet og klar til brug. Vil du installere opdateringen og genstarte %1$@ nu?"; /* No comment provided by engineer. */ "%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ kan ikke opdateres når programmet kører fra en read-only volume, f.eks. en billedfil eller et optisk drev. Flyt %1$@ til Programmer, genstart derfra og prøv igen."; /* No comment provided by engineer. */ "%@ %@ is currently the newest version available." = "%1$@ %2$@ er den aktuelle version."; /* No comment provided by engineer. */ "%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ er tilgængelig, du har %3$@. Vil du hente opdateringen nu?"; /* No comment provided by engineer. */ "%@ downloaded" = "%@ hentet"; /* No comment provided by engineer. */ "%@ of %@" = "%1$@ ud af %2$@"; /* No comment provided by engineer. */ "A new version of %@ is available!" = "Der er en ny version af %@ tilgængelig!"; /* No comment provided by engineer. */ "A new version of %@ is ready to install!" = "Der er en ny version af %@ klar til installering."; /* No comment provided by engineer. */ "An error occurred in retrieving update information. Please try again later." = "Der opstod en fejl under modtagelse af informationer. Prøv igen senere."; /* No comment provided by engineer. */ "An error occurred while downloading the update. Please try again later." = "Der opstod en fejl under download af opdateringen. Prøv igen senere."; /* No comment provided by engineer. */ "An error occurred while extracting the archive. Please try again later." = "Der opstod en fejl under udpakning af arkiver. Prøv igen senere."; /* No comment provided by engineer. */ "An error occurred while installing the update. Please try again later." = "Der opstod en fejl under installering af opdateringen. Prøv igen senere."; /* No comment provided by engineer. */ "An error occurred while parsing the update feed." = "Der opstod en fejl ved analyse af opdateringsfeed."; /* No comment provided by engineer. */ "An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Der opstod en fejl under genstart af %1$@, men den nye version vil være tilgængelig, næste gang du starter programmet."; /* the unit for bytes */ "B" = "B"; /* No comment provided by engineer. */ "Cancel" = "Annuller"; /* No comment provided by engineer. */ "Cancel Update" = "Annuller"; /* No comment provided by engineer. */ "Checking for updates..." = "Søger efter opdateringer &"; /* Take care not to overflow the status window. */ "Downloading update..." = "Henter opdatering &"; /* Take care not to overflow the status window. */ "Extracting update..." = "Udpakker filer &"; /* the unit for gigabytes */ "GB" = "GB"; /* No comment provided by engineer. */ "Install and Relaunch" = "Installer og genstart"; /* Take care not to overflow the status window. */ "Installing update..." = "Installerer opdatering &"; /* the unit for kilobytes */ "KB" = "KB"; /* the unit for megabytes */ "MB" = "MB"; /* No comment provided by engineer. */ "OK" = "OK"; /* No comment provided by engineer. */ "Ready to Install" = "Klar til installering"; /* No comment provided by engineer. */ "Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Skal %1$@ søge efter opdateringer automatisk? Du kan altid søge efter opdateringer manuelt fra %1$@ menuen."; /* No comment provided by engineer. */ "Update Error!" = "Opdateringsfejl!"; /* No comment provided by engineer. */ "Updating %@" = "%@"; /* No comment provided by engineer. */ "You already have the newest version of %@." = "Du har allerede den nyeste version af %@."; /* No comment provided by engineer. */ "You're up-to-date!" = "Softwaren er ajour!"; transmission-2.92/macosx/Sparkle.framework/Resources/PaxHeaders.4960/Info.plist0000644000000000000000000000013212442116654024474 xustar0030 mtime=1418239404.929942317 30 atime=1418239404.929942317 30 ctime=1457295922.540851111 transmission-2.92/macosx/Sparkle.framework/Resources/Info.plist0000644000175000017500000000132412442116654026121 0ustar00mikedldmikedld00000000000000 CFBundleDevelopmentRegion en CFBundleExecutable Sparkle CFBundleIdentifier org.andymatuschak.Sparkle CFBundleInfoDictionaryVersion 6.0 CFBundleName Sparkle CFBundlePackageType FMWK CFBundleShortVersionString 1.5 Beta (bzr) CFBundleSignature ???? CFBundleVersion 337 transmission-2.92/macosx/Sparkle.framework/Resources/PaxHeaders.4960/it.lproj0000644000000000000000000000013212442116654024210 xustar0030 mtime=1418239404.602936713 30 atime=1418239403.870924169 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/0000755000175000017500000000000012442116654025712 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/PaxHeaders.4960/SUAutomaticUpdateAlert0000644000000000000000000000013212442116654030541 xustar0030 mtime=1418239404.010926568 30 atime=1418239403.870924169 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116654033012 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000031512442116654030770 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239404.009926551 30 atime=1418239404.009926551 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobject0000644000175000017500000001577112442116654035240 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯¡ 156<=AEPXhr sŽ–—š›œ ¦§«°ÇÈËÏÒÜéòóôõö÷øù   '+,678=?DEHKNWX_dlmuvw€ˆ‰‹“”žŸ£¤§« ¬®¯°±´µ¸½¾ÃÄÎÏÐÑÔÛÜÝäåæíñõö÷  (789:;<=>?@ABCFI`wxyz{|}~€‚ƒ„…†‡ˆ3‰Š“U$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€ €r€†€Ÿ€€w€€…€‡€x€€€€v€ž%€ˆÒ234[NSClassName€€_SUAutomaticUpdateAlertÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€T¨HIJKLMNO€ €€^€`€b€g€j€mÔQRSTVW]NSDestinationXNSSourceWNSLabel€€€ €ØYZ[\]^_`abcdef`_NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabledXNSWindow[NSSuperview€ €€ € € € ×Yi\j^_flmnofqZNSSubviews[NSFrameSize€ €W€€U€ €V_{{267, 12}, {133, 32}}Ýtuvwxyz{|}~€‚ƒ„…†‡…VŠ‹Œ[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsþ€€€€€€€ Èÿÿÿÿ†‚@ÿ_Installa ed EsciÔ‘’“”•VNSSizeVNSNameXNSfFlags€#@*€\LucidaGrandeÒ78˜™¢™;VNSFontPQÒ78ž¤žŸ[;\NSButtonCell\NSActionCellÒ78¡¢¥¢£¤¥;XNSButtonYNSControlVNSView[NSResponder]installLater:Ò78¨©£©ª;_NSNibControlConnector^NSNibConnectorÔQRS¬­¯€]€€€\ܱ²³´µ¶·¸¹º»`½¾‚ÀÁÂÃĄů\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €[€X€px€€€Z€Y€_{{114, 521}, {559, 152}}ÒÉÊ^YNS.string€Ò78ÌÍ£ÍÎ;_NSMutableStringXNSStringÒÉÊÑ€TViewÒ>FÔ€T§ÕÖרVÚÛ€ €0€?€C€ €H€MÚYZÝ[Þ\]^_`àáeãäåef`ZNSEditable[NSDragTypes€ €/€( €)€! € € Ò>?뀦ìíîïðñ€"€#€$€%€&€'_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{23, 73}, {64, 64}}Øtúzûü~ýþÿWNSStyleWNSAlignWNSScaleZNSAnimatesþ€.€*Ó2^NSResourceName€-€+€,WNSImage_NSApplicationIconÒ78  ¢ ;_NSCustomResourceÒ78£[;[NSImageCellÒ78¥£¤¥;[NSImageViewØYZ[\]^_`åef`€ €>€1€2 € € _{{105, 120}, {437, 17}}Øtz{|~€ !‚#Ö%&_NSBackgroundColor[NSTextColor€=€5€€3€0@€:Ô‘’“)*€€4_LucidaGrande-BoldÕ-./012345WNSColor\NSColorSpace[NSColorName]NSCatalogName€9€8€7€6VSystem\controlColorÓ.91;-¢-;Õ-./01A3B5€9€<€;€6_controlTextColorÓ.91;G€9B0Ò78IJ¤JŸ[;_NSTextFieldCellÒ78LM¥M£¤¥;[NSTextFieldØYZ[\]^_`QRSef`€ €>€@€A € € _{{105, 81}, {435, 31}}Øtz{|~€ !‚\×%&€=€5€€B€?€:Ô‘’a”c€#@&€ ØYZ[\]^_`aghdef`€ €€D€E € € _{{400, 12}, {145, 32}}Ýtuvwxyz{|}~€‚ƒ„…qr…ØŠ‹Œ€€€€G€F€€C_Installa e RiavviaQ ØYZ[\]^_`az{nef`€ €€I€J € € _{{102, 12}, {128, 32}}Ýtuvwxyz{|}~€‚ƒ„…„……ÚŠ‹Œ€€€€L€K€€H^Non installareÒÉÊš€ØYZ[\]^_`aŽnef`€ €€N€O € € _{{105, 58}, {382, 18}}Ýtuvwxyz{|}~€‚ƒÄ—‚™\ÛŠœ€€€Q€€P€B€MHIn futuro scarica e installa automaticamente gli aggiornamentiÒ ¡¢[NSImageName€S€RXNSSwitchÒ78¥¦¢¦;_NSButtonImageSourceÒ78¨©£©ª;^NSMutableArrayWNSArrayZ{559, 152}Ò78­¤£¤¥;_{{0, 0}, {1680, 1028}}Z{511, 174}_{3.40282e+38, 3.40282e+38}Ò78²³¢³;_NSWindowTemplateVwindowÒ78¶·£·ª;_NSNibOutletConnectorÔQRSTؼ€€€C€_[installNow:ÔQRSTÚ€€€H€a]doNotInstall:×QÅÆRSÇÈÊËÖÍÄYNSKeyPathYNSBinding_NSNibBindingConnectorVersion€f€€e€d€0€c_value: titleTextUvalueYtitleTextÒ78ÒÓ£Óª;_NSNibBindingConnector×QÅÆRSÇÈ×ËÕÚÄ€f€€i€d€ €h_value: applicationIcon_applicationIcon×QÅÆRSÇÈàË×ãÄ€f€€l€d€?€k_value: descriptionText_descriptionText×QÅÆRSÇÈèéËÛìÄ€f€n€q€d€M€pÒîïe_NSSharedInstance€o Ò78òó£óô;_NSUserDefaultsController\NSController_#value: values.SUAutomaticallyUpdate_values.SUAutomaticallyUpdateÒ>øù€u«­ÖüØÕÚèV×Û`€€0€s€C€ €H€n€ €?€M€ Ò23€€t]NSApplicationÒ78 ª¢ª;Ò>ø €u«```````­€€ €€ € € €€ € € €Ò>ø€u¬­ÖüÚÕØèV×Û`€€0€s€H€ €C€n€ €?€M€ €Ò>ø*€u¬+,-./0123456€y€z€{€|€}€~€€€€€‚€ƒ€„VWindow[Static Text[Application_Push Button (Non installare)_Image View (NSApplicationIcon)_ Push Button (Installa e Riavvia)_Shared Defaults_Push Button (Installa ed Esci)]Static Text-1_JCheck Box (In futuro scarica e installa automaticamente gli aggiornamenti)\Content View\File's OwnerÒ>øE€u Ò>øH€u Ò>øK€u¯JüÚÕØIOLÛHN­ÖèV×MK`€^€s€H€ €C€€m€b€M€ €j€€0€n€ €?€g€`€ €Ò>øb€u¯cdefghijklmnopqrstuv€‰€Š€‹€Œ€€Ž€€€‘€’€“€”€•€–€—€˜€™€š€›€œ!ÿÿÿÿÿÿÿý "  #$Ò>FŒ€T Ò>ø€u Ò>ø’€u Ò78”•¢•;^NSIBObjectData"'1:?DRTf«±ü *FT`lz…“¯½Ðâü!#%')+-/1357@LNPir{†‹š£¶¿ÊÌÍÖÝêðùû -;DLNPRTu‡–Ÿ©²¾ÀÂÄÆÉÊÌÎëö  *_k–¥¸ÊÕßíÿ !#%')+-/138ATels|~‡‰Œ™¢§®¯±ºÃÐÝæñú %.5M\moqsu¦³ÀÎØæóý#-9;=?AFHJLNPRmv€‚‹’¤­¶¸½ÆÈ×ÙÛÝßáãå   % ' ) + , . 0 3 4 6 8 A C P R T V X Z \ x ” È à   5 V ^ f n y ~ € ‚ „ ‰ Š — ¦ ¨ ª ¬ ´ È Ñ Ö é ò ù    % F H J L N O Q S m Ž ¢ ® ° ² ´ ¶ ¸ ½ ¿ Ð Ò Ô × ë   ! / 1 3 5 7 9 @ M Z b d f r { € • — ™ › ° ½ ¿ Â Ë Ô æ ï ú  ' ) + - / 2 3 5 7 P q s u w y { } Ž ™ › ž ¿ Á Ã Å Ç È Ê Ì å "$&(=?`bdfhikm†»½¿ÁÃÅÇÉØáã   *_acegikmrw¸ÁÍÏÑÚãèþ%09@YdŠ¢©²¹Ðáãåçéõ  9CMlnprtvx‹‘›¤«Ãàâäæèêì468:<>@YkˆŠŒŽ’”°²³¼ÃÞë09;RTVXZ\^`bdfhqsuƒŒ‘šœ³µ·¹»½¿ÁÃÅÇÉÒÔíïñóõ÷ùûýÿ)+-/13579;=?AHT` ÃÕöQ^ktvw€‚ƒŒŽ¹»½¿ÁÃÅÇÉËÍÏÑÓÕ×ÙÛÝßáêì!#%')+-/13579;=?AJLNPRTVXZ\^`bdfhjluwxƒ„™ž–­transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000013212442116654030765 xustar0030 mtime=1418239404.010926568 30 atime=1418239404.010926568 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nib0000644000175000017500000000217012442116654035141 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController ACTIONS doNotInstall id installLater id installNow id CLASS SUAutomaticUpdateAlert LANGUAGE ObjC SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000013212442116654030765 xustar0030 mtime=1418239404.009926551 30 atime=1418239404.009926551 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nib0000644000175000017500000000105012442116654034433 0ustar00mikedldmikedld00000000000000 IBFramework Version 667 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 6 IBSystem Version 9D34 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/PaxHeaders.4960/SUUpdatePermissionProm0000644000000000000000000000013112442116654030610 xustar0029 mtime=1418239404.60393673 30 atime=1418239404.219930149 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/0000755000175000017500000000000012442116654033426 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031712442116654031145 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239404.602936713 30 atime=1418239404.602936713 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobje0000644000175000017500000003056312442116654035321 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯ 156<=AEW_oy z”•ž¡¢£§­®²·ÀÅÖÜéí  +38=@HIJMQZ[`adijlov|ƒ‡Œ’“˜™œŸ«¬­°¸¹º½ÄÅÍÎÓÔ׫¬ØÛÜßäíîøùþ236:=GPQZ[\efmnrs{|ˆ‰Ž“—𦝰±²³´µ¶ÀÄÅÈË ÌÎÏÐÑÔÕÚäåæçêóôõöýþÿ  "$)*+345=>‹l@GHIPQRSZ[\dj„…Š‘”–­ÅÝÞßàáâãäåæçèéêëìíîïðñòõøFGEŠHIJKLMNOPQRSTUVWXñYZ[\]^_`abcdefgjmpU$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€Ç€é€€Ñ€€è€ê€Ò€€€Ð¢€ëÒ234[NSClassName€€_SUUpdatePermissionPromptÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€<¯HIJKLMNOPQRSTUV€ €€[€`€f€h€›€œ€¡€©€³€»€¾€Â€ÅÔXYZ[]^]NSDestinationXNSSourceWNSLabel€€€ €Ø`abcdefghijklmg_NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabledXNSWindow[NSSuperview€ €€ € € € ×`pcqefmstuvmxZNSSubviews[NSFrameSize€ €•€n€“€ €”_{{119, 12}, {138, 32}}Ý{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽŒ]‘’“[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsþ€€€€€€€ Èÿÿÿÿ†‚@ÿ_Non controllareÔ–—˜™š›œVNSSizeVNSNameXNSfFlags€#@*€\LucidaGrandeÒ78Ÿ ¢ ;VNSFontPQÒ78¤¥¤¥¦b;\NSButtonCell\NSActionCellÒ78¨©¥©ª«¬;XNSButtonYNSControlVNSView[NSResponder]finishPrompt:Ò78¯°£°±;_NSNibControlConnector^NSNibConnectorÔXYZ³´¶€Z€€€Y×`pcq2¸+º»¼½¾¿[NSExtension€€X€ €U€V€WÒ>F€<¢ÃÄ€€NÛ`ÆaÇpÈcfÉÊ´ÌÍÎÏÐÑÒ´ÔÕ[NSHScrollerXNSsFlags\NSScrollAmts[NSVScroller]NSContentView€€J€M€L€OA€A€€€F€Ò>FØ€<£ÕÔÌ€€F€JÙ`aÝpcÞßfÃáâãäåæçÃYNScvFlagsYNSDocViewYNSBGColor€€E€A€ € €B€Ò>Fë€<¡æ€ ß`îïðñòóôõcqdö÷føùÕûüýþÿãlÕ  _NSDraggingSourceMaskForNonLocalYNSTvFlags_NSBackgroundColor_NSAllowsTypeSelect\NSCornerView_NSIntercellSpacingWidth_NSColumnAutoresizingStyle_NSIntercellSpacingHeight[NSGridColor_NSDraggingSourceMaskForLocal^NSTableColumns[NSRowHeight€€@ÿÿÿÿÒÀ€4€"#@#@€! €=€€%#@,Z{353, 113}Ô`ac+u€€$€#_{{346, 0}, {12, 17}}Ò78¤«¬;]_NSCornerViewÒ>F€<¢€&€9Ù !l#$%&'()æ^NSIsResizeable\NSHeaderCellWNSWidthZNSDataCell^NSResizingMaskZNSMinWidthZNSMaxWidth[NSTableView €8€'#@`€0#@D#@@€ ×{ð‚…,-./‰1û2[NSTextColorþ€/€)€€(€+Ô–—˜™5›7€#@&€ Ó9:;'<\NSColorSpaceWNSWhite€*K0.33333299Ò78>?¢?;WNSColorÕ?9AB;DEFG[NSColorName]NSCatalogName€*€.€-€,VSystem_headerTextColorÓ9:;'L€*B0Ò78NO¥OP¦b;_NSTableHeaderCell_NSTextFieldCellØ{ð‚ƒ…,RSTU1æXY!þ€7€2€1€(€ €5YText CellÕ?9AB;þE^G€*€4€3€,_textBackgroundColorÓ9:;'c€*B1Õ?9AB;DEgG€*€.€6€,_controlTextColorÒ78kP¤P¦b;Ò78mn¢n;]NSTableColumnÙ !l#rst'()æ €8€:#@k`€;€ ×{ð‚…,-./‰1û2€/€)€€(€+Ø{ð‚ƒ…,RSTU1æXY€7€2€1€(€ €5Ò78„…£…†;^NSMutableArrayWNSArrayÕ?9AB;‰EŠG€*€?€>€,YgridColorÓ9:;'€*D0.5Ò78‘!¥!ª«¬;_{{1, 1}, {353, 113}}Õ?9AB;•E–G€*€D€C€,_controlBackgroundColorÓ9:;'›€*K0.66666669Ò78ž¤ž«¬;ZNSClipViewÙ` aÇc¡f¢ÃÃ¥¦u§¨ÃªXNSTargetXNSActionYNSPercent€€€I€Gÿÿÿÿ€€H€#?é_{{-22, 1}, {11, 125}}\_doScroller:Ò78®¯¥¯ª«¬;ZNSScrollerÙ` aÇc¡f¢ÃÃ¥´ku¨Ã·€€€I€K€H€#?ï±û _{{-100, -100}, {345, 11}}_{{4, 5}, {355, 115}}Ò78»¼¤¼«¬;\NSScrollView×`abcdf´¿ÀÁ¼l´€€T€O€P €_{{1, 128}, {358, 70}}Ø{ð‚ƒ…,‡SÇÈ1ÄËY€7€R€Q€(€N@€5_ÌLe informazioni del profilo di sistema anomino sono utilizzate per aiutarci in futuri lavori di sviluppo. Contattaci se hai dei quesiti sull'argomento. Queste sono le informazioni che verrebbero inviate:Õ?9AB;•EÑG€*€D€S€,\controlColorÒ78ÕÖ¥Öª«¬;[NSTextFieldZ{362, 205}Ò78ÙÚ¤Ú«¬;\NSCustomView\moreInfoViewÒ78ÝÞ£Þ±;_NSNibOutletConnectorÔXYZ³áã€Z€\€€_Ø`abcdefghçèélmg€ €€]€^ € € _{{79, 49}, {27, 26}}Ü{|}~€‚ƒ„…†‡ˆ‰Šñ‰‰Œá‘ö÷€€…€€€€\€ÿÿÿÿ¸Ì@ÿ^moreInfoButtonÔXYZ³ûý€Z€a€€eØ`abcdefg¿¼lmg€ €T€b€c € € _{{104, 63}, {362, 42}}Ø{ð‚ƒ…,‡SÇ 1ûËY€7€R€d€(€a€5_DO NOT LOCALIZE_descriptionTextFieldÔXYZ[က€\€g_toggleMoreInfo:ÔXYZ³€Z€i€€šÜ !"#$%&g()‰+,-./‹01\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €™€–€px€k€j€˜€—€m_{{83, 493}, {485, 167}}Ò45eYNS.string€lÒ7878£89;_NSMutableStringXNSStringÒ45<€lTViewÒ>F?€<§@]BûDEá€o€ €t€a€z€…€\Ù`abcdefHghKLklmg‹UNSTag€ €€p€q € € _{{257, 12}, {214, 32}}Þ{|}~€‚ƒ„…†HRˆ‰Š‹ŒVWŒ@‘’“‹ÿÿÿÿ„þ€€€€s€r€€o_Controlla AutomaticamenteQ Ø`abcdefg¿_`almg€ €T€u€v € € _{{104, 113}, {362, 34}}Ø{ð‚ƒ…,‡SÇijBËY€7€R€w€x€t€5_,Controllo automaticamente gli aggiornamenti?Ô–—˜™špq€€y_LucidaGrande-BoldØ`abcdefghvwalmg€ €€{€| € € _{{104, 52}, {278, 18}}Þ{|}}~€‚ƒ„…†Rˆ‰€Š/‰ƒ1D‘†‡]NSNormalImage€€€~€‚€€}€(€z€H?¨€¦©ª«¬­®€‡€ˆ€‰€Š€‹€Œ_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{23, 83}, {64, 64}}Ø{·¸¹…º»¼û½û‹¾lWNSStyleWNSAlignWNSScaleZNSAnimatesþ€‘€ Ó2Š‹ŒÀ€€_NSApplicationIconÒ78ÆÇ£Çb;[NSImageCellÒ78ÉÊ¥ʪ«¬;[NSImageViewZ{485, 167}Ò78Í«£«¬;_{{0, 0}, {1680, 1028}}Z{213, 129}_{3.40282e+38, 3.40282e+38}Ò78ÒÓ¢Ó;_NSWindowTemplateVwindowÔXYZ[@^€€€o€×XÛÜYZÝÞàáEã/YNSKeyPathYNSBinding_NSNibBindingConnectorVersion€ €€Ÿ€ž€…€[value: iconUvalueTiconÒ78èé£é±;_NSNibBindingConnectorØXÛÜYZëÝÞîïDñò/YNSOptions€ €€¤€£€z€¢€¥_hidden: shouldAskAboutProfileVhidden_shouldAskAboutProfileÓ÷>øùûWNS.keys€¨¡ú€¦¡ü€§_NSValueTransformerName_NSNegateBooleanÒ78¢;\NSDictionary×XÛÜYZÝÞá/€ €ª€²€ž€&€±Ø    lllll_NSFilterRestrictsInsertion_NSPreservesSelection__NSManagedProxy^NSDeclaredKeys_"NSClearsFilterPredicateOnInsertion_NSSelectsInsertedObjects_NSAvoidsEmptySelection €° €®€« Ò>F€<¢€¬€­ZvisibleKey\visibleValueÑ!€¯Ò78# ¢ ;Ò78%&¤&'(;_NSArrayController_NSObjectController\NSController_!value: arrangedObjects.visibleKey_arrangedObjects.visibleKeyØXÛÜYZëÝÞ.áD12/€ €€µ€ž€z€´€¶_value: shouldSendProfile_shouldSendProfileÓ÷>ø7:€¨¢89€·€¸¢;<€¹€º_NSNullPlaceholder_NSValidatesImmediately ×XÛÜYZÝÞCáF/€ €ª€½€ž€9€¼_#value: arrangedObjects.visibleValue_arrangedObjects.visibleValue×XÛÜYZÝÞLMO/€ €€Á€À€ª€¿_+contentArray: systemProfileInformationArray\contentArray_systemProfileInformationArray×XÛÜYZÝÞVáûY/€ €€Ä€ž€a€Ã_value: promptDescription_promptDescriptionØXÛÜYZëÝÞîïáñc/€ €€¤€£€\€¢€ÆÓ÷>øfh€¨¡ú€¦¡ü€§Ò>kl€Ï¯gÄpDæ&t]áûô@EB€€ª€ €N€È€z€ €0€9€;€ €\€a€€€i€o€…€&€t€ÊÒ23ƒ€€É]NSApplicationÓ †‡ˆl_NSAppliesImmediately€Î€Ë Ò>FŒ€<¢Ž€Ì€Í_SUIncludeProfile_SUSendProfileInfoÒ78’“£“(;_NSUserDefaultsControllerÒ78•†¢†;Ò>k˜€Ï¯´gÃæggg´ggæg€€i€€€ €€&€ €9€ € € €€€€ € € € €Ò>k¯€Ï¯gÄpDæ&t]áûô@EB€€ª€ €N€È€z€ €0€9€€;€ €\€a€€€i€o€…€&€t€ÊÒ>kǀϯÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛ܀ӀԀՀր׀؀ـڀۀ܀݀ހ߀à€á€â€ã€ä€å€æ€ç_Array Controller\Content View_ÚStatic Text (Le informazioni del profilo di sistema anomino sono utilizzate per aiutarci in futuri lavori di sviluppo. Contattaci se hai dei quesiti sull'argomento. Queste sono le informazioni che verrebbero inviate:)[Application_.Check Box (Include profilo di sistema anonimo)ZTable View_Text Field Cell (Text Cell)-1\Table Column\File's Owner_Text Field Cell (Text Cell)_Push Button (Non controllare)ZDisclosure_Static Text (DO NOT LOCALIZE)_!Bordered Scroll View (Table View)\MoreInfoView\Profile Info_'Push Button (Controlla Automaticamente)_Image View (NSApplicationIcon)^Table Column-1_:Static Text (Controllo automaticamente gli aggiornamenti?)_User Defaults ControllerÒ>kô€Ï Ò>k÷€Ï Ò>kú€Ï¯$UgTÄSpDæ&LJMNtPQ]áKûÃI´OVR@EB€H€ª€Â€ €¾€N€»€È€z€ €0€f€9€[€h€›€€;€¡€©€ €\€`€a€€€€œ€Å€³€i€o€…€&€t€Ê€ Ò>k!€Ï¯$"#$%&'()*+,-./0123456789:;<=>?@ABCDE€ì€í€î€ï€ð€ñ€ò€ó€ô€õ€ö€÷€ø€ù€ú€û€ü€ý€þ€ÿ     ¡.0ÿÿÿÿÿÿÿý")+ƒ,„~•-/G!('‚‹” %* 1‘Ò>Fi€< Ò>kl€Ï Ò>ko€Ï Ò78qr¢r;^NSIBObjectData"'1:?DRTf’˜ãêñÿ-;GSalz–¤·Éãíúüÿ   "+79;V_hsx‡£¬·¹ºÃÊ×Ýæè   !#%'8FOWY[]_€’š¡ª´½ÉËÍÏÑÔÕ×Ùö 5jvŒ¡°ÃÕàêø %*,.02468:<>CL^ov}†ˆ‘“–£¬±¸¹»ÄÍÚçðû!/8?Wfwy{}œ¨ª¬®±³µ·ÀÂÇÉËø   & 4 6 8 : < ? A T W Y [ ] f h o q s u š ¤ ® ¸ º ¼ ¾ À Â Å Ç É Ë Ô Ö Ù Û & H R f { ˆ ¢ ¾ Ù å    ! # % . 0 1 3 < E H J K M O Q S \ g x z | ~ • ž § µ ¾ À Å Ç É î ý   , 7 B N O Q S \ ^ ` i r t ‘ ¢ ¤ ¦ ¨ ª ¬ ½ ¿ È Ê Í Ú ç ï ñ ý   ( 4 B D F H J L S e r t w € ‹ Ÿ ± Ò × Ù Û Ý ß á æ è ò   %247LNPRTgpy‚‡•º»½¿ÈÊÌéëíïñó )0?G\^`bdn{}‚‹–­ÂÄÆÈÊãðòþ@IR\^`bdmoqz’Ÿ¨³¾ãåçéëíïø+4=JgikmoprŠ«­¯±³µº¼‹ ¢¤¦¨µ¾ÉÕàéòÿ 3DFHJLmoqsuxy{}”ÅÇÉËÍÏÑÓØáð *,.02357Pqsuwy{}¦·¹»½¿Ñâäæèê(5CM[hr„˜¢®°²´¶»½¿ÁÃÅÇáêôöÿ!*,1:<KMOQSUWY~„†ˆŠŒ‘ªãìîðòôöøú9;=?ADEGIc„†ˆŠŒŽ¿ÐÒÔ×ë 2ky{}ƒ…‡‰Ž“¸ÅÔÖØÚâëôù !#%.3Ir}‰‹’”•—™¢¤±³µ·¹»½Ùõ)Ab–·¿ÇÏÚßáãèéöøúü ,5@LW`g€‹¨±¶ÉÐáãåçé9;=?ACEQW\el„¥¯±³µ·¹»½Ýäü 6HQVc€‚„†ˆŠŒ­Êáó'B[\^_acdefoqvxz…’—™¢§°¹Íâï0QSUWY[]_zŽ›¢¤¦«­¯ÃÜÝúüþ    , K h j l n p r t ¢ ¯ Ï ì î ð ò ô ö ø!!'!H!J!L!N!P!R!T!V!c!e!h!j!m!o!x!z!¥!§!©!«!­!¯!±!³!µ!·!¹!»!½!¿!Á!Ã!Å!Ç!É!Ë!Í!Ö!Ø!Ú!è!õ" """"""!"#"%"8"L"U"\"w"€"…"Ž""»"½"¿"Á"Ã"Å"Ç"É"Ë"Í"Ï"Ñ"Ó"Õ"×"Ù"Û"Ý"ß"á"ã"ì"î####!###%#'#)#+#-#/#1#3#5#7#9#;#=#?#A#C#E#N#P#}###ƒ#…#‡#‰#‹###‘#“#•#—#™#›##Ÿ#¡#£#¥#§#º#Ç$¤$°$á$ì% %%&%D%d%o%%³%À%Í%÷&&'&d&&ˆ&Š&‹&”&–&—& &¢&í&ï&ñ&ó&õ&÷&ù&û&ý&ÿ''''' ' ' ''''''''''!'#'%''')'+'-'/'1'3'5'>'@'‹'''‘'“'•'—'™'›''Ÿ'¡'£'¥'§'©'«'­'¯'±'³'¶'¹'¼'¿'Â'Å'È'Ë'Î'Ñ'Ô'×'Ú'Ý'à'ã'å'ç'é'ë'ô'ö'ø'ú'ü'þ(((((( ( (((((((((( ("($(&(((*(,(5(7(8(A(C(D(M(O(P(Y(^s(mtransmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031012442116654031136 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nib 29 mtime=1418239404.60393673 29 atime=1418239404.60393673 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.n0000644000175000017500000000253612442116654035250 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController ACTIONS finishPrompt id toggleMoreInfo id CLASS SUUpdatePermissionPrompt LANGUAGE ObjC OUTLETS delegate id descriptionTextField NSTextField moreInfoButton NSButton moreInfoView NSView SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000013212442116654031140 xustar0030 mtime=1418239404.602936713 30 atime=1418239404.602936713 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nib0000644000175000017500000000105012442116654035047 0ustar00mikedldmikedld00000000000000 IBFramework Version 667 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 5 IBSystem Version 9D34 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/PaxHeaders.4960/SUUpdateAlert.nib0000644000000000000000000000013212442116654027441 xustar0030 mtime=1418239404.218930132 30 atime=1418239404.010926568 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116654031143 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdateAlert.nib/PaxHeaders.4960/keye0000644000000000000000000000013212442116654030376 xustar0030 mtime=1418239404.217930115 30 atime=1418239404.217930115 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdateAlert.nib/keyedobjects.nib0000644000175000017500000002417012442116654034314 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯ñ 156<=AEW_yz{|€„ ‘­¶·¸¹º»¼½ËÐÑÒÕØÞçèõöþÿ  "%-.56;DEYZ^_`cfopxy{ƒ„Ž¢¦­±ÄÔÕÖרÙÚÛÜÝÞ ßåðñòóPôøûþ  )*26>?IJNOR STUVYZ^cdijopsxy~„…‘’•œž¥©­®¯¸¹º»ÁÂÃÅÌÍÎÖ×ØÞæìôú $6HIJKLMNOPQRSTUVWZ]¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º» ¼½¾¿ÂÅÈU$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€ð€´€Ë€ï€€¹€€Ê€Ì€º€í€€€¸€î§€ÍÒ234[NSClassName€€]SUUpdateAlertÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€h¯HIJKLMNOPQRSTUV€ €‡€‰€‹€Ž€€’€”€™€œ€¡€©€¬€°€²ÔXYZ[]^]NSDestinationXNSSourceWNSLabel€†€€ €…Ý`abcdefghijklmnopqrstuvwx\NSWindowView\NSScreenRect_NSFrameAutosaveName]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€€„€€&€ ÿÿÿÿðx€ € €ƒ€‚€_{{248, 464}, {612, 374}}_Aggiormento SoftwareXNSWindowÒ}~YNS.string€TViewÒ78‚£‚ƒ;_NSMutableStringXNSString×…†‡ˆ{‰Š‹ŒŽŠ_NSNextResponderZNSSubviewsXNSvFlags[NSFrameSize[NSSuperview€€j€€€€€Ò>F“€h©”•–—˜™š›œ€€#€4€9€B€G€L€t€xÚ…žŸ ¡‡¢{‰l¤¥¦§¨©¦ŠlWNSFrameZNSEditableVNSCell[NSDragTypesYNSEnabled€€"€ €€ €€Ò>?¯€¦°±²³´µ€€€€€€_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{24, 295}, {64, 64}}ؾ¿ÀÁÂÃÄÅÆÇÈÇÇÉÊ[NSCellFlagsWNSStyleZNSContentsWNSAlignWNSScale\NSCellFlags2ZNSAnimatesþ€!€Ó2ÌÍÎÏ^NSResourceName€ €€WNSImage_NSApplicationIconÒ78ÓÔ¢Ô;_NSCustomResourceÒ78Ö×£× ;[NSImageCellÒ78ÙÚ¥ÚÛÜÝ;[NSImageViewYNSControlVNSView[NSResponderØ…ž ‡¢{‰làáâ㦊l€€3€$€% €€_{{106, 342}, {443, 17}}ؾéÀêëÃìíîïoñ•óô_NSBackgroundColorYNSSupport]NSControlView[NSTextColorþ€2€*€&€'€#@€/PÔ÷øùúûüýVNSSizeVNSNameXNSfFlags€)#@*€(_LucidaGrande-BoldÒ78¢;VNSFontÕ   WNSColor\NSColorSpace[NSColorName]NSCatalogName€.€-€,€+VSystem\controlColorÓWNSWhite€.K0.66666669Ò78¢;Õ  €.€1€0€+_controlTextColorÓ€.B0Ò78 ¤ ! ;_NSTextFieldCell\NSActionCellÒ78#$¥$ÛÜÝ;[NSTextFieldØ…ž ‡¢{‰là()©¦Šl€€3€5€6 €€_{{106, 281}, {443, 17}}ؾéÀêëÃìíîï12–óô€2€*€7€8€4€/_Note di rilascio:Ô÷øùú8ü:€)#@&€( Ø…ž ‡¢{‰l=>?@¦Šl€€A€:€;! €€_{{336, 12}, {176, 32}}ݾFGHIJÀêëKÃLíMoOPQRSQ—VWX_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalent_NSPeriodicDelay]NSButtonFlags€@€&€=€?€<€=€9Èÿÿÿÿ†‚@ÿoRicordamelo più tardiÔ÷øùúû\]€)€>\LucidaGrandeQÒ78ab¤b! ;\NSButtonCellÒ78de¥eÛÜÝ;XNSButtonØ…ž ‡¢{‰l=ijk¦Šl€€A€C€D €€_{{103, 12}, {184, 32}}ݾFGHIJÀêëKÃLíMoOPQtuQ˜VWX€@€&€=€F€E€=€B_Ignora questa versioneÒ}~õ€Ø…ž ‡¢{‰l=~@¦Šl€€A€H€I €€_{{512, 12}, {86, 32}}ݾFGHIJÀêëKÃL…MoOPQ‰ŠQ™VWXÿÿÿÿ„þ€@€&€=€K€J€=€GXInstallaQ Þ…‘ž’†‡“{”•‰–l˜™šÊœPŠŸÇl¡YNSBoxType[NSTitleCell]NSTransparent\NSBorderTypeYNSOffsets_NSTitlePosition]NSContentView€€s€m€k€M€€l€€NÒ>F¤€h¡¡€N×…ž†‡{‰š‹©ªŠš€L€j€i€O€€LÒ>F¯€h¡°€PÝ…ž²³¡‡´µ{¶‰·¡¹º¦¼½oÊŠo¡ÃZAllowsUndo[PreferencesYGroupName_UseBackForwardListYFrameName]NSNextKeyView€N€g€\ €^€Q€&€€&€N€]Ò>?Æ€­ÇÈÉ´ËÌÍÎϳѵÓ€R€S€T€€U€V€W€X€Y€€Z€€[Zpublic.url_NeXT RTFD pasteboard type_NSStringPboardType_Apple URL pasteboard type_WebURLsWithTitlesPboardType_!Apple Web Archive pasteboard type_public.url-name_Apple HTML pasteboard type_NSColor pasteboard type_*NeXT Rich Text Format v1.0 pasteboard type_{{-1, 0}, {482, 201}}ÓàáâoäZIdentifierVValues€f€&€_Óæ>çèìWNS.keys€e£éêë€`€a€b£íîí€c€d€c_WebKitDefaultFixedFontSize_WebKitMinimumFontSize_WebKitDefaultFontSize Ò78õö£ö÷;_NSMutableDictionary\NSDictionaryÒ78ùú¢ú;^WebPreferencesÒ78üý¤ýÜÝ;WWebViewÒ78ÿ£;^NSMutableArrayWNSArray_{{1, 1}, {481, 201}}Ò78Ü£ÜÝ;_{{109, 76}, {483, 203}}V{0, 0}×¾éÀêÃìíî o Ç €2€o€&€n€rÔ÷øùú8\€)€>Õ  €.€q€p€+_textBackgroundColorÓ€.B1Ó€.M0 0.80000001Ò78¤ÜÝ;UNSBoxØ…ž ‡¢{‰là#$%¦Šl€€3€u€v €€_{{106, 306}, {489, 28}}ؾéÀêëÃìíîïo.›0ô€2€*€&€w€t@€/Ô÷øùú8\5€)€> Ø…ž ‡¢{‰l=9:¦Šl€€A€y€z €€_{{106, 48}, {442, 18}}ݾFGHIJÀêëKÃLíMoOuBoD.œVGH€@€&€|€&€{€w€xHIn futuro scarica e installa automaticamente gli aggiornamentiÒKLM[NSImageName€~€}XNSSwitchÒ78PQ¢Q;_NSButtonImageSourceZ{612, 374}_{{0, 0}, {1680, 1028}}Z{586, 392}_{3.40282e+38, 3.40282e+38}Ò78WX¢X;_NSWindowTemplateXdelegateÒ78[\£\];_NSNibOutletConnector^NSNibConnectorÔXYZ[]b€†€ €€ˆVwindowÔXYZ[°h€†€P€€Š_releaseNotesViewÔXYZk™n€€€G€Œ^installUpdate:Ò78qr£r];_NSNibControlConnectorÔXYZk—w€€€9€^remindMeLater:ÔXYZ[›}€†€t€€‘[descriptionÔXYZk˜ƒ€€€B€“_skipThisVersion:×X†‡YZˆ‰‹Œ•ŽuYNSKeyPathYNSBinding_NSNibBindingConnectorVersion€˜€€—€–€#€•_value: titleTextUvalueYtitleTextÒ78“”£”];_NSNibBindingConnector×X†‡YZˆ‰˜Œ”›u€˜€€›€–€€š_value: applicationIcon_applicationIcon×X†‡YZˆ‰ ¡Œœ¤u€˜€€ €–€x€ŸÒ¦§¦_NSSharedInstance€ž Ò78ª«£«¬;_NSUserDefaultsController\NSController_#value: values.SUAutomaticallyUpdate_values.SUAutomaticallyUpdateØX†‡YZ°ˆ‰³´œ¶·uYNSOptions€˜€€¤€£€x€¢€¥_hidden: allowsAutomaticUpdatesVhidden_allowsAutomaticUpdatesÓæ>¼½¿€¨¡¾€¦¡À€§_NSValueTransformerName_NSNegateBooleanÒ78Ä÷¢÷;×X†‡YZˆ‰ÈŒ›Ëu€˜€€«€–€t€ª_value: descriptionText_descriptionTextØX†‡YZ°ˆ‰Ñ´°ÔÕu€˜€€®€£€P€­€¯_hidden: showsReleaseNotes_showsReleaseNotesÓæ>¼ÚÜ€¨¡¾€¦¡À€§ØX†‡YZ°ˆ‰Ñ´šÔåu€˜€€®€£€L€­€±Óæ>¼èꀨ¡¾€¦¡À€§ØX†‡YZ°ˆ‰Ñ´–Ôóu€˜€€®€£€4€­€³Óæ>¼öø€¨¡¾€¦¡À€§Ò>ûü€·¯• ÿ”˜œ›°l™—¡š–]€#€€µ€€B€x€t€P€€G€9€N€L€4€ Ò23€€¶]NSApplicationÒ78¢;Ò>û€·¯lllll¡]llšll€€€€€€€€N€ €€€L€€€Ò>û&€·¯• ÿ”˜œ›™l—°š–]€#€€µ€€€B€x€t€G€€9€P€L€4€ Ò>û8€·¯9:;<=>?@ABCDEFG€»€¼€½€¾€¿€À€Á€Â€Ã€Ä€Å€Æ€Ç€È€É[Static Text_Shared Defaults[Application_Image View (NSApplicationIcon)\File's Owner_$Push Button (Ignora questa versione)_JCheck Box (In futuro scarica e installa automaticamente gli aggiornamenti)]Static Text-1_Push Button (Installa)\Content Viewo#Push Button (Ricordamelo più tardi)XWeb ViewSBox_Static Text (Note di rilascio:)_Update Alert (release notes)Ò>ûY€· Ò>û\€· Ò>û_€·¯VLRœ›IMTQ¡š–• ]PSKNÿU”˜JH°l™—O€²€Ž€¡€€x€t€‡€€¬€œ€N€L€4€#€€ €™€©€‹€’€µ€°€€B€‰€ €P€€G€9€”Ò>û€·¯‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ €Î€Ï€Ð€Ñ€Ò€Ó€Ô€Õ€Ö€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€â€ã€ä€å€æ€ç€è€é€ê€ë€ìH"¥ueEi¡‡¦Y ] gM!ÿÿÿÿÿÿÿý¤ 2L Ò>FÁ€h Ò>ûÄ€· Ò>ûÇ€· Ò78ÉÊ¢Ê;^NSIBObjectData"'1:?DRTfKQœ£ª¸Êæô %3O]p‚œ¦³µ·¹»½¿ÁÃÅÇÉËÍÏÑÓÕ×àìîðþ /8KT_abkr…ޱ³µ·¹»½¿ÁÃÅÇÉËÍÏàî÷ÿ<IVlz„’Ÿ©»ÏÙåçéëíïøúüþ!8AJTV[dk}†£µÀÉÕáãåçêìîðùû IQ\coy{}€‚„‡ˆŠŒ•—¤¦¨ª¬®°Ìè4UrŠ«·¿ÊÒÚçò÷ùûý     ! # % - A J O b k r ~ ‡ ’ ž ¨ ¯ » Ü Þ à â ä ç è ê ì  ' ; E S _ d f h j l n s u v ‡ Ž • ž   © « ® Â Ë Ð × ì ô     ! # % , 9 F N P R ^ g l ƒ … ‡ ‰ œ © « ® · À Ò ß è ó ÿ " $ & ( ) + - G h j l n p r t ˆ ™ › ¤ ¦ © Ê Ì Î Ð Ò Õ Ö Ø Ú ó ( > S b u ‡ ™ § © « ­ ¯ ± ³ µ · ¹ » À É ö  &/<EPYz|~€‚…†ˆŠ£ØÚÜÞàâäæÿ +-/13468P…Ž’”–˜šœ¥§àêö-;=?ACDFIKMOQZ\_a~€‚„†ˆŠ“•˜šÏÚæð!#$&(*+-/13<>Y[]_acegikmoqs~š¯Ëé <Vƒ›¨³º¼¾ÀÍÕ×Þàâäëíïñ&>@IPfs|™¢ª³ºÉÑèñø68:<>@QSUWlnprtŠ—™œ©«¹ÂËÑòôöøúýþ=?ACEGLN_acf‡‰‹’”­âäæèêìîðõú;DPRT]fkŒ¥°ÍÖÛî÷->@BDFM^`bdfyŠŒŽ’¡ª±ÉÚÜÞàâñ ')+-/B_is’”–˜šœž±·ÁÊÑé  +=Z\^`bdfo‚„…Ž•°½ã#-/13579;\c|‰‹Ž“•®ÀÉÎëíïñóõ÷"CEGIKMOQmŽ“•˜š»½¿ÁÃÅÇÉÖØÛÝàâ    #%(*35VXZ\^`bdfhjlnprt}˜¦¨ÉËÍÏÑÓÕ×ÙÛÝßáãåçðò!#%')+-/1:<]_acegikmoqsuwy{‡™¥ÆÓúGUn{ÄÍÑó')*35vxz|~€‚„†ˆŠŒŽ’”–˜šœž ¢¤¦¨ª¬®°²´½¿              " $ & ( * , . 0 2 4 6 8 : < > @ B D F H J L N P R T V X Z \ ^ ` b d f o q s u w y { }  Š Œ – ˜ ™ ¢ ¤ ¥ ® ³Ë Âtransmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdateAlert.nib/PaxHeaders.4960/clas0000644000000000000000000000013212442116654030363 xustar0030 mtime=1418239404.218930132 30 atime=1418239404.218930132 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdateAlert.nib/classes.nib0000644000175000017500000000277412442116654033304 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController CLASS NSApplication LANGUAGE ObjC SUPERCLASS NSResponder ACTIONS installUpdate id remindMeLater id skipThisVersion id CLASS SUUpdateAlert LANGUAGE ObjC OUTLETS delegate id description NSTextField releaseNotesView WebView SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdateAlert.nib/PaxHeaders.4960/info0000644000000000000000000000013212442116654030374 xustar0030 mtime=1418239404.217930115 30 atime=1418239404.217930115 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000105012442116654032564 0ustar00mikedldmikedld00000000000000 IBFramework Version 667 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 6 IBSystem Version 9D34 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/PaxHeaders.4960/Sparkle.strings0000644000000000000000000000013212442116654027301 xustar0030 mtime=1418239404.602936713 30 atime=1418239404.602936713 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/Sparkle.strings0000644000175000017500000002132212442116654030726 0ustar00mikedldmikedld00000000000000þÿ/* No comment provided by engineer. */ "%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ è stato scaricato ed è pronto per essere utilizzato! Desideri installare e riavviare %1$@ ora?"; /* No comment provided by engineer. */ "%1$@ can't be updated when it's running from a disk image. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ non può essere aggiornato se eseguito da un'immagine disco. Sposta %1$@ nella tua cartella Applicazioni, riavviala e prova nuovamente."; /* No comment provided by engineer. */ "%@ %@ is currently the newest version available." = "%1$@ %2$@ è la versione più recente attualmente disponibile."; /* No comment provided by engineer. */ "%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ è disponbile; disponi della versione %3$@. Desideri eseguire l'aggiornamento ora?"; /* No comment provided by engineer. */ "%@ downloaded" = "%@ scaricato"; /* No comment provided by engineer. */ "%@ of %@" = "%1$@ di %2$@"; /* No comment provided by engineer. */ "A new version of %@ is available!" = "E' disponibile una nuova versione di %@!"; /* No comment provided by engineer. */ "A new version of %@ is ready to install!" = "Una nuova versione di %@ è pronta per essere installata!"; /* No comment provided by engineer. */ "An error occurred in retrieving update information. Please try again later." = "Si è verificato un errore durante il recupero delle informazioni sull'aggiornamento. Riprova in seguito."; /* No comment provided by engineer. */ "An error occurred while downloading the update. Please try again later." = "Si è verificato un errore durante lo scaricamento dell'aggiornamento. Riprova in seguito."; /* No comment provided by engineer. */ "An error occurred while extracting the archive. Please try again later." = "Si è verificato un errore durante l'estrazione dell'archivio. Riprova in seguito."; /* No comment provided by engineer. */ "An error occurred while installing the update. Please try again later." = "Si è verificato un errore durante l'installazione dell'aggiornamento. Riprova in seguito."; /* No comment provided by engineer. */ "An error occurred while parsing the update feed." = "Si è verificato un errore durante la lettura del feed di aggiornamento."; /* No comment provided by engineer. */ "An error occurred while parsing the update feed: %@" = "Durante la lettura del feed di aggiornamento si è verificato il seguente errore: %@"; /* No comment provided by engineer. */ "An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Si è verificato un errore al riavvio di %1$@. La nuova versione sarà comunque disponibile alla prossima esecuzione di %1$@."; /* the unit for bytes */ "B" = "B"; /* No comment provided by engineer. */ "Cancel" = "Annulla"; /* No comment provided by engineer. */ "Cancel Update" = "Annulla Aggiornamento"; /* No comment provided by engineer. */ "Checking for updates..." = "Controllo aggiornamenti in corso &"; /* No comment provided by engineer. */ "Downloading update..." = "Scaricamento dell'aggiornamento &"; /* No comment provided by engineer. */ "Extracting update..." = "Estrazione dell'aggiornamento &"; /* the unit for gigabytes */ "GB" = "GB"; /* No comment provided by engineer. */ "Install and Relaunch" = "Installa e Riavvia"; /* No comment provided by engineer. */ "Installing update..." = "Installazione aggiornamento in corso &"; /* the unit for kilobytes */ "KB" = "KB"; /* the unit for megabytes */ "MB" = "MB"; /* No comment provided by engineer. */ "OK" = "OK"; /* No comment provided by engineer. */ "Ready to Install" = "Pronto per l'installazione"; /* No comment provided by engineer. */ "Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Desideri che %1$@ verifichi gli aggiornamenti automaticamente? Puoi effettuare la verifica manualmente dal menu di %1$@."; /* No comment provided by engineer. */ "Update Error!" = "Errore di Aggiornamento!"; /* No comment provided by engineer. */ "Updating %@" = "Aggiornamento di %@"; /* No comment provided by engineer. */ "You already have the newest version of %@." = "Disponi della versione più recente di %@."; /* No comment provided by engineer. */ "You're up-to-date!" = "La tua applicazione è aggiornata!"; transmission-2.92/macosx/Sparkle.framework/Resources/PaxHeaders.4960/fr_CA.lproj0000644000000000000000000000013112442116657024550 xustar0030 mtime=1418239407.180980892 29 atime=1418239406.36796696 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/0000755000175000017500000000000012442116657026253 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/PaxHeaders.4960/SUAutomaticUpdateAl0000644000000000000000000000013112442116656030365 xustar0029 mtime=1418239406.43096804 30 atime=1418239406.368966977 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116656033352 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/PaxHeade0000644000000000000000000000050512442116656030706 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 118 path=transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 29 mtime=1418239406.43096804 29 atime=1418239406.43096804 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/keyedobj0000644000175000017500000000000012442116656060107 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/PaxHeade0000644000000000000000000000031112442116656030701 xustar00113 path=transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/classes.nib 29 mtime=1418239406.43096804 29 atime=1418239406.43096804 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/classes.0000644000175000017500000000000012442116656057742 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/PaxHeade0000644000000000000000000000012712442116656030706 xustar0029 mtime=1418239406.43096804 29 atime=1418239406.43096804 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/info.nib0000644000175000017500000000000012442116656057227 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/PaxHeaders.4960/SUUpdatePermissionP0000644000000000000000000000013112442116657030433 xustar0030 mtime=1418239407.181980909 29 atime=1418239406.51796953 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/0000755000175000017500000000000012442116657033767 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/PaxHea0000644000000000000000000000051312442116657031011 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 120 path=transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239407.181980909 30 atime=1418239407.180980892 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/keyedo0000644000175000017500000000000012442116657060275 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/PaxHea0000644000000000000000000000050112442116657031006 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib 115 path=transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239407.181980909 30 atime=1418239407.181980909 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/classe0000644000175000017500000000000012442116657060217 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/PaxHea0000644000000000000000000000031212442116657031006 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239407.180980892 30 atime=1418239407.180980892 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/info.n0000644000175000017500000000000012442116657057745 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/PaxHeaders.4960/SUUpdateAlert.nib0000644000000000000000000000013212442116656030001 xustar0030 mtime=1418239406.515969496 30 atime=1418239406.431968057 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116656031503 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdateAlert.nib/PaxHeaders.4960/k0000644000000000000000000000013212442116656030233 xustar0030 mtime=1418239406.515969496 30 atime=1418239406.515969496 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdateAlert.nib/keyedobjects.nib0000644000175000017500000000000012442116656056751 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdateAlert.nib/PaxHeaders.4960/c0000644000000000000000000000013212442116656030223 xustar0030 mtime=1418239406.515969496 30 atime=1418239406.515969496 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdateAlert.nib/classes.nib0000644000175000017500000000000012442116656054715 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdateAlert.nib/PaxHeaders.4960/i0000644000000000000000000000013212442116656030231 xustar0030 mtime=1418239406.514969479 30 atime=1418239406.514969479 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000000012442116656053511 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/PaxHeaders.4960/Sparkle.strings0000644000000000000000000000013112442116657027641 xustar0030 mtime=1418239407.180980892 30 atime=1418239407.180980892 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/fr_CA.lproj/Sparkle.strings0000644000175000017500000000000012442116657050006 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/PaxHeaders.4960/SUModelTranslation.plist0000644000000000000000000000013212442116654027330 xustar0030 mtime=1418239404.009926551 30 atime=1418239404.009926551 30 ctime=1457295922.540851111 transmission-2.92/macosx/Sparkle.framework/Resources/SUModelTranslation.plist0000644000175000017500000001354312442116654030763 0ustar00mikedldmikedld00000000000000 ADP2,1 Developer Transition Kit MacBook1,1 MacBook (Core Duo) MacBook2,1 MacBook (Core 2 Duo) MacBook4,1 MacBook (Core 2 Duo Feb 2008) MacBookAir1,1 MacBook Air (January 2008) MacBookPro1,1 MacBook Pro Core Duo (15-inch) MacBookPro1,2 MacBook Pro Core Duo (17-inch) MacBookPro2,1 MacBook Pro Core 2 Duo (17-inch) MacBookPro2,2 MacBook Pro Core 2 Duo (15-inch) MacBookPro3,1 MacBook Pro Core 2 Duo (15-inch LED, Core 2 Duo) MacBookPro3,2 MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo) MacBookPro4,1 MacBook Pro (Core 2 Duo Feb 2008) MacPro1,1 Mac Pro (four-core) MacPro2,1 Mac Pro (eight-core) MacPro3,1 Mac Pro (January 2008 4- or 8- core "Harpertown") Macmini1,1 Mac Mini (Core Solo/Duo) PowerBook1,1 PowerBook G3 PowerBook2,1 iBook G3 PowerBook2,2 iBook G3 (FireWire) PowerBook2,3 iBook G3 PowerBook2,4 iBook G3 PowerBook3,1 PowerBook G3 (FireWire) PowerBook3,2 PowerBook G4 PowerBook3,3 PowerBook G4 (Gigabit Ethernet) PowerBook3,4 PowerBook G4 (DVI) PowerBook3,5 PowerBook G4 (1GHz / 867MHz) PowerBook4,1 iBook G3 (Dual USB, Late 2001) PowerBook4,2 iBook G3 (16MB VRAM) PowerBook4,3 iBook G3 Opaque 16MB VRAM, 32MB VRAM, Early 2003) PowerBook5,1 PowerBook G4 (17 inch) PowerBook5,2 PowerBook G4 (15 inch FW 800) PowerBook5,3 PowerBook G4 (17-inch 1.33GHz) PowerBook5,4 PowerBook G4 (15 inch 1.5/1.33GHz) PowerBook5,5 PowerBook G4 (17-inch 1.5GHz) PowerBook5,6 PowerBook G4 (15 inch 1.67GHz/1.5GHz) PowerBook5,7 PowerBook G4 (17-inch 1.67GHz) PowerBook5,8 PowerBook G4 (Double layer SD, 15 inch) PowerBook5,9 PowerBook G4 (Double layer SD, 17 inch) PowerBook6,1 PowerBook G4 (12 inch) PowerBook6,2 PowerBook G4 (12 inch, DVI) PowerBook6,3 iBook G4 PowerBook6,4 PowerBook G4 (12 inch 1.33GHz) PowerBook6,5 iBook G4 (Early-Late 2004) PowerBook6,7 iBook G4 (Mid 2005) PowerBook6,8 PowerBook G4 (12 inch 1.5GHz) PowerMac1,1 Power Macintosh G3 (Blue & White) PowerMac1,2 Power Macintosh G4 (PCI Graphics) PowerMac10,1 Mac Mini G4 PowerMac10,2 Mac Mini (Late 2005) PowerMac11,2 Power Macintosh G5 (Late 2005) PowerMac12,1 iMac G5 (iSight) PowerMac2,1 iMac G3 (Slot-loading CD-ROM) PowerMac2,2 iMac G3 (Summer 2000) PowerMac3,1 Power Macintosh G4 (AGP Graphics) PowerMac3,2 Power Macintosh G4 (AGP Graphics) PowerMac3,3 Power Macintosh G4 (Gigabit Ethernet) PowerMac3,4 Power Macintosh G4 (Digital Audio) PowerMac3,5 Power Macintosh G4 (Quick Silver) PowerMac3,6 Power Macintosh G4 (Mirrored Drive Door) PowerMac4,1 iMac G3 (Early/Summer 2001) PowerMac4,2 iMac G4 (Flat Panel) PowerMac4,4 eMac PowerMac4,5 iMac G4 (17-inch Flat Panel) PowerMac5,1 Power Macintosh G4 Cube PowerMac6,1 iMac G4 (USB 2.0) PowerMac6,3 iMac G4 (20-inch Flat Panel) PowerMac6,4 eMac (USB 2.0, 2005) PowerMac7,2 Power Macintosh G5 PowerMac7,3 Power Macintosh G5 PowerMac8,1 iMac G5 PowerMac8,2 iMac G5 (Ambient Light Sensor) PowerMac9,1 Power Macintosh G5 (Late 2005) RackMac1,1 Xserve G4 RackMac1,2 Xserve G4 (slot-loading, cluster node) RackMac3,1 Xserve G5 Xserve1,1 Xserve (Intel Xeon) Xserve2,1 Xserve (January 2008 quad-core) iMac1,1 iMac G3 (Rev A-D) iMac4,1 iMac (Core Duo) iMac4,2 iMac for Education (17-inch, Core Duo) iMac5,1 iMac (Core 2 Duo, 17 or 20 inch, SuperDrive) iMac5,2 iMac (Core 2 Duo, 17 inch, Combo Drive) iMac6,1 iMac (Core 2 Duo, 24 inch, SuperDrive) iMac8,1 iMac (April 2008) transmission-2.92/macosx/Sparkle.framework/Resources/PaxHeaders.4960/relaunch0000644000000000000000000000013212442116654024250 xustar0030 mtime=1418239404.856941066 30 atime=1418239404.856941066 30 ctime=1457295922.540851111 transmission-2.92/macosx/Sparkle.framework/Resources/relaunch0000755000175000017500000016305412442116654025711 0ustar00mikedldmikedld00000000000000Êþº¾FÔ `Fœ €°6, þíúÎ œ…8__PAGEZEROH__TEXT __text__TEXT&xx€__symbol_stub1__TEXT,€€€__cstring__TEXT-æ__literal8__TEXT/øøÐ__DATA0 __data__DATA0 __nl_symbol_ptr__DATA0  __dyld__DATA0  __la_symbol_ptr__DATA0($ ( __cfstring__DATA0L L__common__DATA0\8œ__OBJC@0 __message_refs__OBJC@@0__cls_refs__OBJC@@0@__class__OBJC@X00X__meta_class__OBJC@ˆ00ˆ__inst_meth__OBJC@¸,0¸__instance_vars__OBJC@ä0ä__module_info__OBJCA1__symbols__OBJCA1__image_info__OBJCA 1 8__LINKEDITPÔ@Ô@/BD PB<B4 /usr/lib/dyld‹+CO … æyX¬’ˆ°(&x Xµ-/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 4/usr/lib/libgcc_s.1.dylib 4o/usr/lib/libSystem.B.dylib 4ã/usr/lib/libobjc.A.dylib hÜ–/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation p"/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices `¥ ,/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation|: x8!ÿüT!48”!ÿÀ€z8š;cW{:|¤ÚH à|¦<@¿!ÿä= |œ#x|yx|»+x”!ÿ€b0 ‰0<@¢0$/‰8I@ž0= 9)-H4|i¦|lxN€!HL/€/@ž|Ix8Bˆÿÿ|t/€@žÿä<@fÛx‘"0H8Æ€/€@žÿô<@;F€B0€B/‚Až|I¦|LxN€!<@€B0€B/‚Až|I¦|LxN€!H<@€B0€/€Až|I¦|LxN€!<`8<8c-Hõ€<| ¦| xN€!<`8@8c-DHÕ<`888c-XHÅ<`8H8c-pHµ<`8L8c-ˆH¥<`8P8c-¨H•€A@/‚Až(€8/€Až€H/€Až€L/€Až€P/€Ažø|I¦|Lx? ;à;½-ÌN€!|~xHЀ8ãûx| ¦| xN€!8CH/€/@ž|Cx8Bˆÿÿ|t/€@žÿä=`9 9k-Ĉ |t/‚Až |H®9k|t€@ž`9)KÿÿØ€Hãûx| ¦| xN€!/ƒAž<€L¤ëx8 | ¦| xN€!/ƒAž€P| ¦| xN€!,@‚ý¸;ÿŸð@Aœÿ0<`8D8c-ØHU€aD/ƒAžHA<@8„ãxeÛx€B0FÓx#ËxHH9=€Œ0 }‰¦=€9ŒN€ =`k0$}i¦N€ |¦¿¡ÿô<@<€|¾+x|Ý3x”!ÿ €B@\€„@a88a8A 0|X 0€y 0„› 0ˆ¿ 0Œà0é 0ú&xBa{”±ÃÙû5=CJPYl0L$P"#%'(*+-.,)&%'*-+".#(.objc_class_name_TerminationListener_NXArgc_NXArgv___darwin_gcc3_preregister_frame_info___progname__mh_execute_header_catch_exception_raise_catch_exception_raise_state_catch_exception_raise_state_identity_clock_alarm_reply_do_mach_notify_dead_name_do_mach_notify_no_senders_do_mach_notify_port_deleted_do_mach_notify_send_once_do_seqnos_mach_notify_dead_name_do_seqnos_mach_notify_no_senders_do_seqnos_mach_notify_port_deleted_do_seqnos_mach_notify_send_once_environ_receive_samplesstart.objc_class_name_NSApplication.objc_class_name_NSAutoreleasePool.objc_class_name_NSFileManager.objc_class_name_NSObject.objc_class_name_NSTimer.objc_class_name_NSWorkspace_GetProcessForPID_NSTemporaryDirectory___CFConstantStringClassReference___keymgr_dwarf2_register_sections__cthread_init_routine_atexit_atoi_errno_exit_getppid_mach_init_routine_objc_msgSendSuper_strlen__startdyld_stub_binding_helper__dyld_func_lookup-[TerminationListener initWithExecutablePath:parentProcessId:]-[TerminationListener watchdog:]-[TerminationListener relaunch]_mainÎúíþì…8__PAGEZEROÀ__TEXT__text__TEXT¹ €__cstring__TEXTÌ2Ì H__DATA __data__DATA __dyld__DATA __cfstring__DATA __common__DATA( 4œ__OBJC0  __message_refs__OBJC0@ __cls_refs__OBJC@0@ __class__OBJC`00` __meta_class__OBJC 00  __inst_meth__OBJCà0,à __instance_vars__OBJC 1 !__module_info__OBJC(1(!__symbols__OBJC818!__image_info__OBJCH1H!À__IMPORT@0__pointers__IMPORT@ 0__jump_table__IMPORT@@2@08__LINKEDITPœ@œ@/pB, P?@CF]tuvwxyz{|}~1€‚ƒ„…†‡ŠU$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€Ÿ€q€…€ž€€v€€„€†€w€œ€€€u€%€‡Ò234[NSClassName€€_SUAutomaticUpdateAlertÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€S¨HIJKLMNO€ €€]€_€a€f€i€lÔQRSTVW]NSDestinationXNSSourceWNSLabel€€€ €ØYZ[\]^_`abcdef`_NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabledXNSWindow[NSSuperview€ €€ € € € ×Yi\j^_flmdnfpZNSSubviews[NSFrameSize€ €V€€T€ €U_{{232, 18}, {133, 32}}Ýstuvwxyz{|}~€‚ƒ„†„V‰Š‹[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsþ€€€€€€€ Èÿÿÿÿ†‚@ÿ_Instalar al salirÔŽ‘’“”VNSSizeVNSNameXNSfFlags€#@*€\LucidaGrandeÒ78—˜¢˜;VNSFontPÒ78›œ¤œ[;\NSButtonCell\NSActionCellÒ78Ÿ ¥ ¡¢£;XNSButtonYNSControlVNSView[NSResponder]installLater:Ò78¦§£§¨;_NSNibControlConnector^NSNibConnectorÔQRSª«­€\€€€[ܯ°±²³´µ¶·¸¹`»¼¾¿ÀÁƒÃÄ\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €Z€W€px€€€Y€X€_{{171, 543}, {587, 158}}ÒÇÈ^YNS.string€Ò78ÊË£ËÌ;_NSMutableStringXNSStringÒÇÈÏ€TViewÒ>FÒ€S§ÓÔÕV×ØÙ€€/€>€ €B€G€NÚYZÛ[Ü\]^_`Þßeáâãef`ZNSEditable[NSDragTypes€ €.€' €(€  € € Ò>?逦êëìíîï€!€"€#€$€%€&_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{23, 79}, {64, 64}}Øsøyùú}ûüýþÿþþWNSStyleWNSAlignWNSScaleZNSAnimatesþ€-€)Ó2^NSResourceName€,€*€+WNSImage_NSApplicationIconÒ78  ¢ ;_NSCustomResourceÒ78 £[;[NSImageCellÒ78¥¡¢£;[NSImageViewØYZ[\]^_`ãef`€ €=€0€1 € € _{{105, 126}, {465, 17}}Øsyz{}!Ô#$_NSBackgroundColor[NSTextColor€<€4€€2€/@€9ÔŽ‘’'(€€3_LucidaGrande-BoldÕ+,-./0123WNSColor\NSColorSpace[NSColorName]NSCatalogName€8€7€6€5VSystem\controlColorÓ,7/9:WNSWhite€8K0.66666669Ò78<+¢+;Õ+,-./?1@3€8€;€:€5_controlTextColorÓ,7/9E€8B0Ò78GH¤H[;_NSTextFieldCellÒ78JK¥K¡¢£;[NSTextFieldØYZ[\]^_`OPãef`€ €=€?€@ € € _{{105, 87}, {465, 31}}Øsyz{}YÕ#$€<€4€€A€>€9ÔŽ‘^“`€#@&€ ØYZ[\]^_`adedef`€ €€C€D € € _{{102, 18}, {109, 32}}Ýstuvwxyz{|}~€‚ƒ„no„׉Ћ€€€€F€E€€B[No instalarÒÇÈ™€ØYZ[\]^_`axydef`€ €€H€I € € _{{105, 64}, {382, 18}}Ýstuvwxyz{|}~€‚ƒY؉†‡€€€K€€J€A€GH€g_value: descriptionText_descriptionText×QÂÃRSÄÅÝÈÓà€e€€k€c€€j_value: applicationIcon_applicationIcon×QÂÃRSÄÅåæÈØé€e€m€p€c€G€oÒëìe_NSSharedInstance€n Ò78ïð£ðñ;_NSUserDefaultsController\NSController_#value: values.SUAutomaticallyUpdate_values.SUAutomaticallyUpdateÒ>õö€t«Ù`Õ«ÓVÔåØ×€N€ €>€€€ €/€m€G€r€BÒ23€€s]NSApplicationÒ78§¢§;Ò>õ €t«`«``````€ €€ €€ € € €€ €€ Ò>õ€t¬Ù`Õ«ÓVåÔØ×€N€ €€>€€€ €m€/€G€r€BÒ>õ'€t¬()*+,-./0123€x€y€z€{€|€}€~€€€€€‚€ƒ_*Push Button (Instalar y volver a arrancar)\Content View\File's Owner[Static TextVWindow_Image View (NSApplicationIcon)_Push Button (Instalar al salir)_Shared Defaults]Static Text-1oDCheck Box (Descargar e instalar automáticamente las actualizaciones)[Application_Push Button (No instalar)Ò>õB€t Ò>õE€t Ò>õH€t¯×KÕÓVåMÙOH`«ÔNØIJL€B€_€€>€€ €m€f€N€l€ € €€/€i€G€r€€]€aÒ>õ_€t¯`abcdefghijklmnopqrs€ˆ€‰€Š€‹€Œ€€Ž€€€‘€’€“€”€•€–€—€˜€™€š€›#$ " ÿÿÿÿÿÿÿý! Ò>F‰€S Ò>õŒ€t Ò>õ€t Ò78‘’¢’;^NSIBObjectData"'1:?DRTf©¯ú(DR^jxƒ‘­»Îàú!#%')+-/135>JLNgpy„‰˜¡´½ÈÊËÔÛèî÷ù  +9BJLNPRs…”§°¼¾ÀÂÄÇÈÊÌéô  %Zf|‘ ³ÅÐÚèú "$&(*,.3<Pahoxzƒ…ˆ•ž£ª«´½Ê×àëôþ(/GVgikmo ­ºÈÒàí÷ '3579;@BDFHJLgpz|…Œž§°²·ÀÂÑÓÕ×ÙÛÝß    ! # % & ( * - . 0 2 ; = J L N P R T V r Ž Â Ú û  / P X ` h s x z | ~ ƒ „ ‘   ¢ ¤ ¦ ® Â Ë Ð ã ì ó ÿ    @ B D F H I K M g ˆ œ ¨ ª ¬ ® ° ² · ¹ Ê Ì Î Ñ å ú    ) + - / 1 3 : G T \ ^ ` l u z ‘ “ • — ª · ¹ ¼ Å Î à é ô ! # % ' ) * , . G h j l n p r t … ‡ ’ • ¶ ¸ º ¼ ¾ ¿ Á à Ü+46WY[]_`bd}²´¶¸º¼¾ÀÅÊ=FRTV_hmƒ¤¦¨ª¬­¯±Êÿ   ,.7>MU`ip‰”±º¿ÒÙâé%68:<>Lis}œž ¢¤¦¨»ÁËÔÛó5Gdfhjlnp‰›¸º¼¾ÀÂÄÍàâãìóA`ik‚„†ˆŠŒŽ’”–˜¡£¥³¼ÁÊÌãåçéëíïñóõ÷ù!#%')+-/135>@Y[]_acegikmoqž«¸ÄËì .¹Åáêìíöøù/13579;=?ACEGIKMOQSUW`b‘“•—™›Ÿ¡£¥§©«­¯±³µ·¹»½¿ÁÃÅÇÉËÍÏÑÓÜÞàâëíî÷ùú“#transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000013112442116656030761 xustar0030 mtime=1418239406.188963892 30 atime=1418239406.188963892 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUAutomaticUpdateAlert.nib/classes.nib0000644000175000017500000000217012442116656035136 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController ACTIONS doNotInstall id installLater id installNow id CLASS SUAutomaticUpdateAlert LANGUAGE ObjC SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000013112442116656030761 xustar0030 mtime=1418239406.188963892 30 atime=1418239406.188963892 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nib0000644000175000017500000000105012442116656034430 0ustar00mikedldmikedld00000000000000 IBFramework Version 667 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 6 IBSystem Version 9D34 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/PaxHeaders.4960/SUUpdatePermissionProm0000644000000000000000000000013112442116656030605 xustar0030 mtime=1418239406.366966943 30 atime=1418239406.251964972 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/0000755000175000017500000000000012442116656033423 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031612442116656031141 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239406.366966943 30 atime=1418239406.366966943 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobje0000644000175000017500000003213412442116656035312 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯ 156<=AEW_lq†Œšž½¾ÃÄÉÎàìíõöùþ   "#&+,.18>DHMNQTUZ[^amnor{|}€‡ˆ‘’—˜›ÇÈœŸ ¤©³º »ÍÒÕØÙÞæçîïðõýþ    ,-047AJKTUV_`ghlmuv‚ƒˆ‰Š‰‘” ©ª«¬­®¯°º¾¿ÂÅ ÆÈÉÊËÎÏÔÕÚäåæçêñòóüýþÿ !"#+,·.5EJKLNPUVWX_`ahij†‹Œ“”–­ÅÝÞßàáâãäåæçèéêëìíîïðñòõøFGHIJKLMNOPQRSTUVWXYÄZÅ[\]^_`abcdefgjmpU$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€Æ€è€€Ð€€ç€é€Ñ€€€Ï¢€êÒ234[NSClassName€€_SUUpdatePermissionPromptÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€.¯HIJKLMNOPQRSTUV€ €M€W€]€e€˜€š€›€ €£€«€­€µ€À€ÃÔXYZ[\^]NSDestinationXNSSourceWNSLabel€L€ €€K×`abc2d+fghijk_NSNextResponderZNSSubviewsXNSvFlags[NSFrameSize[NSExtension€€J€  €G€H€IÒ>Fn€.¢op€ €@Ü`rstaubvwxy\{|}~€\ƒ„„[NSHScrollerWNSFrameXNSsFlags\NSScrollAmts[NSSuperview[NSVScroller]NSNextKeyView]NSContentView€ €<€?€>€ OA€A€€ €8€€Ò>Fˆ€.£„ƒ{€€8€<Ú`sabŽvxo‘’“”•–—o–YNScvFlagsYNSDocViewYNSBGColor€ €7€3€ €€4€ €Ò>Fœ€.¡–€ß`Ÿ ¡¢£¤¥¦bc§¨©vª«„­®¯°±²³“´µ¶·¸¹„»¼_NSDraggingSourceMaskForNonLocalYNSTvFlags_NSBackgroundColor_NSAllowsTypeSelect\NSCornerView_NSIntercellSpacingWidth_NSColumnAutoresizingStyle_NSIntercellSpacingHeightYNSEnabled[NSGridColor_NSDraggingSourceMaskForLocal^NSTableColumns[NSRowHeight€€2ÿÿÿÿÒÀ€&€#@#@€ €/€€#@,Z{356, 162}Ô`sb+ÀÁ€€€_{{346, 0}, {12, 17}}Ò78ÅÆ¤ÆÇÈ;]_NSCornerViewVNSView[NSResponderÒ>FË€.¢ÌÍ€€+ÙÏÐÑÒÓÔÕÖ·ØÙÚÛÜÝÞ–^NSIsResizeable\NSHeaderCellWNSWidthZNSDataCell^NSResizingMaskZNSMinWidthZNSMaxWidth[NSTableView €*€#@`€##@D#@@€×á¡âãäåæçèéê­ë[NSCellFlagsZNSContentsYNSSupport\NSCellFlags2[NSTextColorþ€"€€€€PÔîïðñòóôVNSSizeVNSNameXNSfFlags€#@&€ \LucidaGrandeÒ78÷ø¢ø;VNSFontÓúûüÜý\NSColorSpaceWNSWhite€K0.33333299Ò78ÿ¢;WNSColorÕúü[NSColorName]NSCatalogName€€!€ €VSystem_headerTextColorÓúûüÜ €B0Ò78¥;_NSTableHeaderCell_NSTextFieldCell\NSActionCellVNSCell×á¡ãäåê–]NSControlView!þ€)€$€€€'Õúü° €€&€%€_textBackgroundColorÓúûüÜ%€B1Õúü)€€!€(€_controlTextColorÒ78-¤;Ò78/0¢0;]NSTableColumnÙÏÐÑÒÓÔÕÖ·Ø456ÜÝÞ– €*€,#@dà€-€×á¡âãäåæçèéê­ë€"€€€€×á¡ãäåê–€)€$€€€'Ò78EF£FG;^NSMutableArrayWNSArrayÕúüJK€€1€0€YgridColorÓúûüÜP€D0.5Ò78RÖ¥ÖSÇÈ;YNSControl_{{1, 1}, {356, 162}}ÕúüWX€€6€5€_controlBackgroundColorÓúûüÜ]€K0.66666669Ò78_`¤`ÇÈ;ZNSClipViewÙ`bstbcvdooghÂijolXNSTargetXNSActionYNSPercent€ € €;€9ÿÿÿÿ€€:€ #?é_{{-22, 1}, {11, 125}}\_doScroller:Ò78pq¥qSÇÈ;ZNSScrollerÙ`bstbcvdoogvwÂjoz€ € €;€=€:€ #?ï±û _{{-100, -100}, {345, 11}}_{{4, 5}, {358, 164}}Ò78~¤ÇÈ;\NSScrollView×`sb§v\‚ƒ„h·\€ €F€A€B € _{{1, 177}, {361, 70}}Øá¡âãä剋Œêpþ€)€D€C€€@@€'oäLa información de perfil de sistema anónimo se usa para ayudarnos a planear el trabajo de desarrollo futuro. Por favor, póngase en cantacto con nosotros si tiene preguntas sobre esto. Esta es la información que se nos enviaría:ÕúüW•€€6€E€\controlColorÒ78™š¥šSÇÈ;[NSTextFieldZ{365, 254}Ò78ž¤žÇÈ;\NSCustomView\moreInfoViewÒ78¡¢£¢£;_NSNibOutletConnector^NSNibConnectorÔXYZ[¦¨€L€N€€VØ`sb§ªv«¬­®¯·±«XNSWindow€O€U€P€R €Q€O×`abcªv±µ¶Â·±¹€Q€’€k€€Q€‘_{{80, 50}, {27, 26}}Üá¼½¾¿âãÀäÁ‰ÂéÄÅééȦÊËÌ_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSKeyEquivalent_NSPeriodicDelay]NSButtonFlags€T€…€€€S€NÈ€ÿÿÿÿ¸Ì@ÿÔîïðñÏóÑ€#@*€Ò78ÓÔ¤Ô;\NSButtonCellÒ78Ö×¥×SÇÈ;XNSButton^moreInfoButtonÔXYZ[ÛÝ€L€X€€\Ø`sb§ªv«‚áâh·±«€O€F€Y€Z €Q€O_{{104, 58}, {319, 42}}Øá¡âãä剋êêÛ€)€D€[€€X€'\NO LOCALIZAR_descriptionTextFieldÔXYZñóô€d€€^€cØ`sb§ªv«¬øùw·±«€O€U€_€` €Q€O_{{100, 16}, {121, 32}}Ýá¼½¾ÿ¿âãÀäÁ‰ÂéÄÈÈóÊ _NSAlternateImage€T€€S€b€a€S€^ÿÿÿÿ†‚@ÿ\No comprobarQ]finishPrompt:Ò78££;_NSNibControlConnectorÔXYZ[€L€f€€—Ü «"#é%&'()*+\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€O€–€“€px€h€g€•€”€j_{{83, 492}, {442, 168}}Ò./ªYNS.string€iÒ7812£23;_NSMutableStringXNSStringÒ./6€iTViewÒ>F9€.§:ó<Û>?¦€l€^€q€X€w€‚€NÙ`sb§ªvB«¬EFw·±«UNSTag€O€U€m€n €Q€O_{{221, 16}, {216, 32}}Þá¼½¾ÿ¿âãÀäÁBLÂéÄÈPQÈ:Ê ÿÿÿÿ„þ€T€€S€p€o€S€loComprobar automáticamenteQ Ø`sb§ªv«‚YZ[·±«€O€F€r€s €Q€O_{{104, 114}, {289, 34}}Øá¡âãä剋cd<€)€D€t€u€q€'o2¿Comprobar si hay actualizaciones automáticamente?ÔîïðñÏjk€€v_LucidaGrande-BoldØ`sb§ªv«¬pq[·±«€O€U€x€y €Q€O_{{104, 53}, {278, 18}}Þá¼w½¾ÿ¿âãÀäÁLÂézÄ){é}ê>Ê€]NSNormalImage€T€€{€€€z€€w€H?¢€¦£¤¥¦§¨€„€…€†€‡€ˆ€‰_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{23, 84}, {64, 64}}Øá±â²³ä´µ¶­·­¸·WNSStyleWNSAlignWNSScaleZNSAnimatesþ€Ž€Œ Ó2„…†½€~€|€_NSApplicationIconÒ78ÀÁ£Á;[NSImageCellÒ78ÃÄ¥ÄSÇÈ;[NSImageViewZ{442, 168}Ò78ÇÇ£ÇÈ;_{{0, 0}, {1680, 1028}}Z{213, 129}_{3.40282e+38, 3.40282e+38}Ò78ÌÍ¢Í;_NSWindowTemplateVwindowÔXYZñ¦Ó€d€€N€™_toggleMoreInfo:ÔXYZñ:ô€d€€l€c×XÛÜYZÝÞàá?ã)YNSKeyPathYNSBinding_NSNibBindingConnectorVersion€Ÿ€€ž€€‚€œ[value: iconUvalueTiconÒ78èé£é£;_NSNibBindingConnector×XÛÜYZÝÞíáÛð)€Ÿ€€¢€€X€¡_value: promptDescription_promptDescriptionØXÛÜYZôÝÞ÷ø¦úû)YNSOptions€Ÿ€€¦€¥€N€¤€§_hidden: shouldAskAboutProfileVhidden_shouldAskAboutProfileÓ>WNS.keys€ª¡€¨¡€©_NSValueTransformerName_NSNegateBooleanÒ78  ¢ ;\NSDictionaryØXÛÜYZôÝÞ÷ø>ú)€Ÿ€€¦€¥€w€¤€¬Ó>€ª¡€¨¡€©ØXÛÜYZôÝÞá> )€Ÿ€€¯€€w€®€°_value: shouldSendProfile_shouldSendProfileÓ>%(€ª¢&'€±€²¢)*€³€´_NSNullPlaceholder_NSValidatesImmediately ×XÛÜYZÝÞ1234)€Ÿ€€¿€¾€¶€½Ø6789:;<·>·@A···_NSFilterRestrictsInsertion_NSPreservesSelection__NSManagedProxy^NSDeclaredKeys_"NSClearsFilterPredicateOnInsertion_NSSelectsInsertedObjects_NSAvoidsEmptySelection €¼ €º€· Ò>FG€.¢HI€¸€¹ZvisibleKey\visibleValueÑM€»Ò78O8¢8;Ò78QR¤RST;_NSArrayController_NSObjectController\NSController_+contentArray: systemProfileInformationArray\contentArray_systemProfileInformationArray×XÛÜYZÝÞ3[áÍ^)€Ÿ€¶€Â€€+€Á_#value: arrangedObjects.visibleValue_arrangedObjects.visibleValue×XÛÜYZÝÞ3dáÌg)€Ÿ€¶€Å€€€Ä_!value: arrangedObjects.visibleKey_arrangedObjects.visibleKeyÒ>kl€Î¯«<–ó:3?Û\6Û>zpoÌ~ͦ€O€q€€^€l€¶€‚€X€f€ €-€#€w€Ç€@€ €€Ì€+€NÓ9‚ƒ„·_NSAppliesImmediately€Ë€È Ò>Fˆ€.¢‰ЀɀÊ_SUIncludeProfile_SUSendProfileInfoÒ78Ž£T;_NSUserDefaultsControllerÒ23’€€Í]NSApplicationÒ78•G¢G;Ò>k˜€Î¯«o««««ÍÌ«\\––«€f€O€ €O€O€€O€O€€€+€€O€€ € €€€€OÒ>k¯€Î¯«<–ó:3?Û\6Ûz>poÌ~¦Í€O€q€€^€l€¶€‚€X€f€ €-€#€€Ç€w€@€ €€Ì€N€+Ò>kǀίÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛ܀ҀӀԀՀր׀؀ـڀۀ܀݀ހ߀à€á€â€ã€ä€å€æ\Content Viewo@Static Text (¿Comprobar si hay actualizaciones automáticamente?)ZTable View_Push Button (No comprobar)o'Push Button (Comprobar automáticamente)_Array Controller_Image View (NSApplicationIcon)_Static Text (NO LOCALIZAR)\Profile Info\MoreInfoView_Text Field Cell-1_Text Field Cell\File's Owner_User Defaults Controllero-Check Box (Incluir perfil de sistema anónimo)oòStatic Text (La información de perfil de sistema anónimo se usa para ayudarnos a planear el trabajo de desarrollo futuro. Por favor, póngase en cantacto con nosotros si tiene preguntas sobre esto. Esta es la información que se nos enviaría:)_!Bordered Scroll View (Table View)\Table Column[ApplicationZDisclosure^Table Column-1Ò>kô€Î Ò>k÷€Î Ò>kú€Î¯$«<–óMQLPKN:3?HÛ\6IOÛTJ>zpVUoSÌ~R¦Í€O€q€€^€˜€£€e€ €]€š€l€¶€‚€ €X€f€ €-€M€›€#€µ€€W€w€Ç€@€Ã€À€ €­€€Ì€«€N€+Ò>k!€Î¯$"#$%&'()*+,-./0123456789:;<=>?@ABCDE€ë€ì€í€î€ï€ð€ñ€ò€ó€ô€õ€ö€÷€ø€ù€ú€û€ü€ý€þ€ÿ      )ƒ‹~¡‘ %!'-„‚+•"1./0(”*ÿÿÿÿÿÿÿýG,Ò>Fi€. Ò>kl€Î Ò>ko€Î Ò78qr¢r;^NSIBObjectData"'1:?DRTf–áèïý+9EQ_jx”¢µÇáëøúýÿ   )579T]fqv…Ž¡ªµ·¸ÁÈÕÛäæ   !#%6DMUWY[]zŒ— ¬¸º¼¾ÁÃÅÇÐÒ×ÙÛ  )6BN\jlnpruwŠ‘“•ž §©«­Öàêôöøúüþ d†¤¹Æàü!-L[gikmvxy{„’“•—™›¤¯ÀÂÄÆÉàéò     # % ' L [ h p { Š •   ¬ ­ ¯ ± º ¼ ¾ Ç Ð Ò ï û    ) . 0 2 4 6 8 9 J Q X a c l n q ~ ‡ Œ “   ­ µ · Ã Ì Ñ Ù î ú      + 8 : = F Q e w „ ‹ ¨ ¶ » ½ ¿ Á Ã È Ê ß á ã å ç ý  $ & ( * , ? H Q Z _ m ’ “ • —   ¢ ¤ Á Ã Å Ç É Ë è ê ì î ð ò û    . 0 2 4 6 @ M O T ] h r ‰ ž   ¢ ¤ ¦ ¿ Ì Î Ú ã ì ÷%.8:<>@IKMVn{„š¿ÁÃÅÇÊÌÎ×ó )FHJLNOQiŠ‘“•—™ž k€‚„†ˆ•ž©µÀÉÒßìõü"3579;\egikmpqsu’”–˜šœžµæü 2DRTVXZ\^`bdirƒ…Ž“œ¥²»ÆÏÞïñóõ÷ !#%>_acegikx ¢¤¦¨ÉËÍÏÑÒÔÖï$79;=?ACEGLUbdr{‚š«­¯±³äñþ $1;Makwy{}„†ˆŠŒŽª³½¿ÈÏáêóõú "GMOQSUVXZs¬µ·¹»½¿ÁÃøú!#&')+EfhjlnprÙêìîñ&(*,./13L…“•—™›Ÿ¡£¨­òÿ%.3FO[]_hmƒ¬·ÃÅÇÉÊÌÎÏÑÓÜÞëíïñóõ÷/c{œ¹Ðñù "#0246JSZfoz†‘š¡ºÅâëð !#5FHJLNkuž ¢¤¦¨ª¶¼ÁÊÑé  -Ablnprtvxz𡹯ÎÐÓÕØÚó ACEGIKMO\^acfh‰‹‘“•—²ÆÓÕÚÜÞãåçû   2 4 6 8 : < > _ | “ ¥ ´ Ù ô! !!!!!!!!!!!#!(!*!,!7!D!I!K!T!Y!b!k!!”!¡!Ï!Ü!ü"""""!"#"%"K"j"‡"‰"‹"""‘"“"·"Ô"Ý"ß# # ########## #"#$#&#(#*#,#.#0#2#?#V#X#Z#[#d#f#k#m#o#‚#–#Ÿ#¦#Á#Ê#Ì#Î#Ü#å#ê#ó#õ$ $"$$$&$($*$,$.$0$2$4$6$8$:$<$>$@$B$D$F$H$Q$S$€$‚$„$†$ˆ$Š$Œ$Ž$$’$”$–$˜$š$œ$ž$ $¢$¤$¦$¨$ª$³$µ$â$ä$æ$è$ê$ì$î$ð$ò$ô$ö$ø$ú$ü$þ%%%%%% % %%œ%§%Ä&&(&I&f&s&€&”&¦&³&Î'+))6)C)O)Z)i)r)t)u)~)€))Š)Œ)×)Ù)Û)Ý)ß)á)ã)å)ç)é)ë)í)ï)ñ)ó)õ)÷)ù)û)ý)ÿ***** * * **********(***u*w*y*{*}***ƒ*…*‡*‰*‹***‘*“*•*—*™*›**Ÿ*¢*¥*¨*«*®*±*´*·*º*½*À*Ã*Æ*É*Ì*Î*Ð*Ò*Ô*Ö*Ø*Ú*Ü*Þ*à*â*ä*æ*è*ê*ì*î*ð*ò*ô*ö*ø*ú*ü*þ++++++++++ +!+*+,+-+6+8+9+B+Gs+Vtransmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031112442116656031134 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239406.366966943 30 atime=1418239406.366966943 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.n0000644000175000017500000000253612442116656035245 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController ACTIONS finishPrompt id toggleMoreInfo id CLASS SUUpdatePermissionPrompt LANGUAGE ObjC OUTLETS delegate id descriptionTextField NSTextField moreInfoButton NSButton moreInfoView NSView SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000013112442116656031134 xustar0030 mtime=1418239406.366966943 30 atime=1418239406.366966943 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nib0000644000175000017500000000105312442116656035047 0ustar00mikedldmikedld00000000000000 IBFramework Version 667 IBLastKnownRelativeProjectPath ../../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 6 IBSystem Version 9D34 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/PaxHeaders.4960/SUUpdateAlert.nib0000644000000000000000000000013112442116656027435 xustar0030 mtime=1418239406.238964749 30 atime=1418239406.189963909 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116656031140 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdateAlert.nib/PaxHeaders.4960/keye0000644000000000000000000000013112442116656030372 xustar0030 mtime=1418239406.238964749 30 atime=1418239406.238964749 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdateAlert.nib/keyedobjects.nib0000644000175000017500000002465412442116656034320 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯ò 156<=AEW_oy z”•ž¡¢£§­®²·ÀÁËÐÚÛÜáãèéìïòóöûe+8ABCDEFGHSXYZ]`ckltxy‚‰ŠŽ–—Ÿ ¡ª«³´¶ÉÍÔØëûüýþÿ  ‹ #&*+-./59>?BEHPQ[\`ad efghilmrsxy~„…‘’“”š›œž¡¨©ª«³¹ÀÁÂÉÊËÓÔÕÛâæêëìôú $6HIJKLMNOPQRSTUVWZ]¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼×½¾ÁÄÇU$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€ñ€¶€Í€ð€€»€€Ì€Î€¼€î€€€º€ï§€ÏÒ234[NSClassName€€]SUUpdateAlertÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€s¯HIJKLMNOPQRSTUV€ €€*€Ž€€’€”€–€Ÿ€£€¥€¨€«€¯€´ÔXYZ[]^]NSDestinationXNSSourceWNSLabel€€€ €Ø`abcdefghijklmg_NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabledXNSWindow[NSSuperview€ €€ €! € € ×`pcqefmstuvmxZNSSubviews[NSFrameSize€ €u€1€†€ €‡_{{425, 12}, {164, 32}}Ý{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽŒ]‘’“[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsþ€€€€€€€ Èÿÿÿÿ†‚@ÿoInstalar actualizaciónÔ–—˜™š›œVNSSizeVNSNameXNSfFlags€#@*€\LucidaGrandeÒ78Ÿ ¢ ;VNSFontPQ Ò78¤¥¤¥¦b;\NSButtonCell\NSActionCellÒ78¨©¥©ª«¬;XNSButtonYNSControlVNSView[NSResponder^installUpdate:Ò78¯°£°±;_NSNibControlConnector^NSNibConnectorÔXYZ³´¶€)€€€(Ø`abcdefg¹º»¼lmg€ €'€€ € € _{{106, 305}, {474, 28}}Ø{‚ƒ…ÇÄʼnǴÉÊ_NSBackgroundColor[NSTextColor€&€€€€@€#Ô–—˜™Í›Ï€#@&€ ÕÑÒÓÔÕÖרÙWNSColor\NSColorSpace[NSColorName]NSCatalogName€"€!€ €VSystem\controlColorÓÒÝÕßàWNSWhite€"K0.66666669Ò78âÑ¢Ñ;ÕÑÒÓÔÕå×æÙ€"€%€$€_controlTextColorÓÒÝÕßë€"B0Ò78íî¤î¦b;_NSTextFieldCellÒ78ðñ¥ñª«¬;[NSTextField[descriptionÒ78ôõ£õ±;_NSNibOutletConnectorÔXYZ³øú€)€+€€Ýüýþÿg     \NSWindowView\NSScreenRect_NSFrameAutosaveName]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €Œ€ˆ€‹€-px€.€,€Š€‰€/_{{313, 386}, {597, 373}}oActualización de softwareÒYNS.string€0TViewÒ78£;_NSMutableStringXNSStringÒ>F!€s©"#$%&](´*€2€B€G€L€Q€ €V€€Ú`a,b-cdefg/0l234lmgZNSEditable[NSDragTypes€ €A€: €;€3 € € Ò>?:€¦;<=>?@€4€5€6€7€8€9_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{24, 294}, {64, 64}}Ø{IJK…LMNOPOOQRWNSStyleWNSAlignWNSScaleZNSAnimatesþ€@€<Ó2TUVW^NSResourceName€?€=€>WNSImage_NSApplicationIconÒ78[\¢\;_NSCustomResourceÒ78^_£_b;[NSImageCellÒ78ab¥bª«¬;[NSImageViewØ`abcdefg¹fg¼lmg€ €'€C€D € € _{{106, 341}, {474, 17}}Ø{‚ƒ…ÇÄʼnp#rÊ€&€€€E€B@€#Ô–—˜™švw€€F_LucidaGrande-BoldØ`abcdefg¹|}4lmg€ €'€H€I € € _{{106, 280}, {443, 17}}Ø{‚ƒ…ÇÄÅ…†$rÊ€&€€J€K€G€#oNotas de la versión:Ô–—˜™Ív€€F Ø`abcdefgh‘’klmg€ €€M€N € € _{{307, 12}, {118, 32}}Ý{|}~€‚ƒ„…†‡ˆ‰Š‹Œ›œŒ%‘’“€€€€P€O€€LlRecordármeloQØ`abcdefgh¤¥¦lmg€ €€R€S € € _{{103, 12}, {175, 32}}Ý{|}~€‚ƒ„…†‡ˆ‰Š‹Œ¯°Œ&‘’“€€€€U€T€€QoNo instalar esta versiónÒ¡€0Þ`·¸a¹pcºe»¼f½gß¿ÀÁRÃÄ‹mÆOgÈYNSBoxType[NSTitleCell]NSTransparent\NSBorderTypeYNSOffsets_NSTitlePosition]NSContentView€ €~€x€v€W€ €w€ €XÒ>FË€s¡È€X×`apcef(sÐÑum(€V€u€t€Y€ €VÒ>FÖ€s¡×€ZÝ`aÙÚ-cÛÜeÝfÞÈàálãäĉRm‰ÈêZAllowsUndo[PreferencesYGroupName_UseBackForwardListYFrameName]NSNextKeyView€X€r€f €h€[€€ €€X€gÒ>?퀭îïð?òóôõö>ø@ú€\€]€^€8€_€`€a€b€c€7€d€9€eZpublic.url_NeXT RTFD pasteboard type_NSStringPboardType_Apple URL pasteboard type_WebURLsWithTitlesPboardType_!Apple Web Archive pasteboard type_public.url-name_Apple HTML pasteboard type_NSColor pasteboard type_*NeXT Rich Text Format v1.0 pasteboard type_{{-1, 0}, {468, 201}}Ó ‰ ZIdentifierVValues€q€€iÓ >WNS.keys€p£€j€k€l£€m€n€o_WebKitDefaultFixedFontSize_WebKitMinimumFontSize_WebKitDefaultFontSize  Ò78£;_NSMutableDictionary\NSDictionaryÒ78!"¢";^WebPreferencesÒ78$%¤%«¬;WWebViewÒ78'(£();^NSMutableArrayWNSArray_{{1, 1}, {466, 201}}Ò78,«£«¬;_{{109, 75}, {468, 203}}V{0, 0}×{‚…ÇÄ1‰3O4€&€z€€y€}Ô–—˜™Í›8€€ÕÑÒÓÔÕ;×<Ù€"€|€{€_textBackgroundColorÓÒÝÕßA€"B1ÓÒÝÕßD€"M0 0.80000001Ò78FG¤G«¬;UNSBoxØ`abcdefghKLulmg€ €€€€ € € _{{106, 50}, {442, 16}}Ý{|}~€‚ƒ„…†‡ˆ‰ŠT‰VÇ*‘YZ€€€ƒ€€‚€€H•–˜€¡—€›¡™€œ_NSValueTransformerName_NSNegateBooleanÒ78¢;Ò78Ÿ £ ±;_NSNibBindingConnector×X†‡YZ‰Š¤¥´§€ž€€¢€¡€€ _value: descriptionTextUvalue_descriptionTextØX†‡YZˆ‰ŠŒ×²€ž€€™€˜€Z€—€¤Ó >•µ·€¡—€›¡™€œ×X†‡YZ‰Š¼¥"¿€ž€€§€¡€2€¦_value: applicationIcon_applicationIcon×X†‡YZ‰ŠÅ¥#È€ž€€ª€¡€B€©_value: titleTextYtitleTextØX†‡YZˆ‰ŠÎ*ÑÒ€ž€€­€˜€€¬€®_hidden: allowsAutomaticUpdates_allowsAutomaticUpdatesÓ >•×Ù€¡—€›¡™€œ×X†‡YZ‰ŠÝÞ¥*သ€°€³€¡€€²Òãäl_NSSharedInstance€± Ò78çè£èé;_NSUserDefaultsController\NSController_#value: values.SUAutomaticallyUpdate_values.SUAutomaticallyUpdateØX†‡YZˆ‰ŠŒ$󀞀€™€˜€G€—€µÓ >•öø€¡—€›¡™€œÒ>ûü€¹¯´*×$]#%ø"ÝÈg(&€€€Z€G€ €B€L€+€2€°€X€·€ €V€QÒ23€€¸]NSApplicationÒ78)¢);Ò>û€¹¯ggÈggggg(øgg€ € €X€ € € € €€ €€V€€+€ € Ò>û&€¹¯*$]#%×øÝ"g(&´€€G€€ €B€L€Z€+€°€2€·€ €V€Q€Ò>û8€¹¯9:;<=>?@ABCDEFG€½€¾€¿€À€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ëo@Check Box (Descargar e instalar actualizaciones automáticamente)o"Static Text (Notas de la versión:)\File's Ownero$Push Button (Instalar actualización)]Static Text-1oPush Button (Recordármelo)XWeb View_Update Alert (release notes)_Shared Defaults_Image View (NSApplicationIcon)[Application\Content ViewSBoxo&Push Button (No instalar esta versión)[Static TextÒ>ûY€¹ Ò>û\€¹ Ò>û_€¹¯*øÝLOIPVMJ(&´U×$]S#%H"QÈNTKgR€€€+€°€€–€€Ÿ€·€´€’€*€V€Q€€¯€Z€G€ €¨€B€L€ €2€£€X€”€«€Ž€ €¥Ò>û€¹¯‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”–—˜™š›œžŸ €Ð€Ñ€Ò€Ó€Ô€Õ€Ö€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€â€o€ã€ä€å€æ€ç€è€é€ê€ë€ì€íu¥] ¤igÿÿÿÿÿÿÿýH2EYe‡L M¡¦"! Ò>FÀ€s Ò>ûÀ¹ Ò>ûÆ€¹ Ò78ÈÉ¢É;^NSIBObjectData"'1:?DRTfMSž¥¬ºÌèö'5Q_r„ž¨µ·¹»½¿ÁÃÅÇÉËÍÏÑÓÕ×Ùâîðò "1:MVacdmt‡’³µ·¹»½¿ÁÃÅÇÉËÍÏÑâðù *<DKT^gsuwy{~ƒ «·¹»½ÀÂÄÆß 6KZmŠ”¢´ÁÏÔÖØÚÜÞàâäæèíö%6=DMOXZ]jsx€‚‹”¡®·ÂËÕÜè÷.?ACEGhjlnpstvx’³ÇÓÕ×ÙÛÝâäõ÷    " / ; I K M O Q S Z g t | ~ € Œ • š ¯ ± ³ µ · Ê × Ù Ü å î  , 5 < S d f h j l ¡ ® » Ñ ß é ÷   4 > J L N P R T Y [ ] _ a c e g ‚ · À Ê Ì Ñ Ú á ó ü      " $ & ( * , U ` l n p r s u w z { }  ˆ Š — ™ › Ÿ ¡ £ ¿ Û  ' H e } ž ¦ ® ¶ Á Æ È Ê Ì Ñ Ò ß î ð ò ô ü1:AMVamŽ’”–—™›µÖØÚÜÞàåçøúüÿ468:<=?A[|~€‚„†ˆ³ÄÆÈËìîðòôõ÷ùGIKMOQSUnp‘“•—™œŸ¡ºïñóõ÷ùûý09;t~Š˜¥¯ÁÏÑÓÕרÚÝßáãåîðóõ'),.cnz„™£±³µ·¸º¼¾¿ÁÃÅÇÐÒíïñóõ÷ùûýÿ.C_}¡³Ðê/<GNPRTaikrtvxƒ…¢ºÒÔÖßæü &/8@IP_g~‡Ž¨¯ÌÎÐÒÔÖçéëí  -/2?AOXagˆŠŒŽ‘“•®ãåçéëíïñöûfo{}ˆ‘–¬·ÐÛø .5FHJLNartvxzž ¢¤¦¯ÀÂÄÆÈ×ø 579;=?AC_fz‡‰ŒŽ‘“¬¾ÇÌÕÜô6<Noqsuwy{}ŠŒ‘”–³µ·¹»½¿Øê   &0QSUWY[]_€™¦¨«­°²ÏÑÓÕ×ÙÛä÷ùú %2Xw˜šœž ¢¤¦³µ¸º½¿ÈÊëíïñóõ÷ùûýÿ $-2;=^`bdfhjlnprtvxz|…‡¨ª¬®°²´¶¸º¼¾ÀÂÄÆÏÑòôöøúüþ  “Úç2@w€Ÿ±ÒÞëï > J S U V _ a b k m ® ° ² ´ ¶ ¸ º ¼ ¾ À Â Ä Æ È Ê Ì Î Ð Ò Ô Ö Ø Ú Ü Þ à â ä æ è ê ì õ ÷!8!:!!@!B!D!F!H!J!L!N!P!R!T!V!X!Z!\!^!`!b!d!f!h!j!l!n!p!r!t!v!x!z!|!~!€!‚!„!†!!‘!“!•!—!™!›!!Ÿ!¡!£!¥!§!©!«!­!¯!±!³!µ!·!À!Â!Ã!Ì!Î!Ï!Ø!Ú!Û!ä!éÊ!øtransmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdateAlert.nib/PaxHeaders.4960/clas0000644000000000000000000000013112442116656030357 xustar0030 mtime=1418239406.238964749 30 atime=1418239406.238964749 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdateAlert.nib/classes.nib0000644000175000017500000000277412442116656033301 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController CLASS NSApplication LANGUAGE ObjC SUPERCLASS NSResponder ACTIONS installUpdate id remindMeLater id skipThisVersion id CLASS SUUpdateAlert LANGUAGE ObjC OUTLETS delegate id description NSTextField releaseNotesView WebView SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdateAlert.nib/PaxHeaders.4960/info0000644000000000000000000000013112442116656030370 xustar0030 mtime=1418239406.237964732 30 atime=1418239406.237964732 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000105012442116656032561 0ustar00mikedldmikedld00000000000000 IBFramework Version 667 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 6 IBSystem Version 9D34 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/PaxHeaders.4960/Sparkle.strings0000644000000000000000000000013112442116656027275 xustar0030 mtime=1418239406.365966926 30 atime=1418239406.365966926 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/Sparkle.strings0000644000175000017500000001752412442116656030734 0ustar00mikedldmikedld00000000000000þÿ/* No comment provided by engineer. */ "%@ of %@" = "%1$@ de %2$@"; /* byte units */ "B" = "B"; "KB" = "KB"; "MB" = "MB"; "GB" = "GB"; /* No comment provided by engineer. */ "%1$@ can't be updated when it's running from a disk image. Move %1$@ to your Applications folder, relaunch it, and try again." = "%1$@ no se puede actualizar cuando se está ejecutando desde una imagen de disco. Traslade %1$@ a su carpeta Aplicaciones, arranque la aplicación e inténtelo de nuevo."; /* No comment provided by engineer. */ "%@ %@ has been installed and will be ready to use next time %@ starts! Would you like to relaunch now?" = "%1$@ %2$@ ha sido instalada y estará disponible la próxima vez que %3$@ se inicie. ¿Desea reiniciar la aplicación?"; /* No comment provided by engineer. */ "%@ %@ is currently the newest version available." = "%1$@ %2$@ es la última versión disponible."; /* No comment provided by engineer. */ "%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ está disponible (usted tiene la %3$@). ¿Desea descargarla ahora?"; /* No comment provided by engineer. */ "%@ does not have permission to write to the application's directory! Are you running off a disk image? If not, ask your system administrator for help." = "%@ no tiene permiso para escribir en el directorio de la aplicación ¿Está ejecutando la aplicación desde una imagen de disco? Si no, pida ayuda a su administrador de sistemas."; /* No comment provided by engineer. */ "A new version of %@ has been installed!" = "¡Se ha instalado una nueva versión de %@ !"; /* No comment provided by engineer. */ "A new version of %@ is available!" = "¡Hay una nueva versión de %@ !"; /* No comment provided by engineer. */ "An error occurred during installation. Please try again later." = "Ocurrió un error durante la instalación. Por favor, inténtelo de nuevo más tarde."; /* No comment provided by engineer. */ "An error occurred in retrieving update information. Please try again later." = "Ocurrió un error al recopilar información sobre la actualización. Por favor, inténtelo de nuevo más tarde."; /* No comment provided by engineer. */ "An error occurred while extracting the archive. Please try again later." = "Ocurrió un error al extraer el archivo. Por favor, inténtelo de nuevo más tarde."; /* No comment provided by engineer. */ "An error occurred while trying to download the file. Please try again later." = "Ocurrió un error al descargar el archivo. Por favor, inténtelo de nuevo más tarde."; /* No comment provided by engineer. */ "An update is already in progress!" = "¡Hay una actualización en proceso!"; /* No comment provided by engineer. */ "Cancel" = "Cancelar"; /* No comment provided by engineer. */ "Check for updates on startup?" = "¿Desea comprobar si hay actualizaciones al arrancar?"; /* No comment provided by engineer. */ "Downloading update..." = "Descargando actualización &"; /* No comment provided by engineer. */ "Extracting update..." = "Extrayendo actualización &"; /* No comment provided by engineer. */ "Install and Relaunch" = "Instalar y volver a arrancar"; /* No comment provided by engineer. */ "Installing update..." = "Instalando actualización &"; /* No comment provided by engineer. */ "No" = "No"; /* No comment provided by engineer. */ "OK" = "OK"; /* No comment provided by engineer. */ "Ready to Install" = "Preparado para instalar"; /* No comment provided by engineer. */ "Update Error!" = "¡Error de actualización!"; /* No comment provided by engineer. */ "Updating %@" = "Actualizando %@"; /* No comment provided by engineer. */ "Would you like %@ to check for updates on startup? If not, you can initiate the check manually from the %@ menu." = "¿Quiere que %1$@ compruebe si hay actualizaciones al arrancar? Si no, puede iniciar la comprobación manualmente desde el menú %2$@."; /* No comment provided by engineer. */ "Yes" = "Sí"; /* No comment provided by engineer. */ "You're up-to-date!" = "Ya tiene la versión más reciente"; transmission-2.92/macosx/Sparkle.framework/Resources/PaxHeaders.4960/nl.lproj0000644000000000000000000000013212442116661024203 xustar0030 mtime=1418239409.560021661 30 atime=1418239409.264016589 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/0000755000175000017500000000000012442116661025705 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/PaxHeaders.4960/SUAutomaticUpdateAlert0000644000000000000000000000013212442116661030534 xustar0030 mtime=1418239409.327017668 30 atime=1418239409.264016589 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116661033005 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000031512442116661030763 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239409.326017651 30 atime=1418239409.326017651 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobject0000644000175000017500000001610212442116661035220 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯£ 156<=AEPXhr sŽ–—š›œ ¦§«°ÇÈËÏÒÜéòóôõö÷øù   '+,678=?DEHKNWX_dlmuvw€ˆ‰‹“” ¡¥¦¥ª­± ²´µ¶·º»¾ÃÄÉÊÔÕÖ×Úáåéêëòóôûüý .=>?@ABCDEFGHILOf}~€‚ƒ„…†3‡ˆ‰Š‹ŒŽ“–™U$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€¢€t€ˆ€¡€€y€€‡€‰€z€Ÿ€€€x€ %€ŠÒ234[NSClassName€€_SUAutomaticUpdateAlertÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€V¨HIJKLMNO€ €€`€b€d€i€n€qÔQRSTVW]NSDestinationXNSSourceWNSLabel€€€ €ØYZ[\]^_`abcdef`_NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabledXNSWindow[NSSuperview€ €€ € € € ×Yi\j^_flmnofqZNSSubviews[NSFrameSize€ €Y€€W€ €X_{{201, 12}, {174, 32}}Ýtuvwxyz{|}~€‚ƒ„…†‡…VŠ‹Œ[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsþ€€€€€€€ Èÿÿÿÿ†‚@ÿ_Installeer bij afsluitenÔ‘’“”•VNSSizeVNSNameXNSfFlags€#@*€\LucidaGrandeÒ78˜™¢™;VNSFontPQÒ78ž¤žŸ[;\NSButtonCell\NSActionCellÒ78¡¢¥¢£¤¥;XNSButtonYNSControlVNSView[NSResponder]installLater:Ò78¨©£©ª;_NSNibControlConnector^NSNibConnectorÔQRS¬­¯€_€€€^ܱ²³´µ¶·¸¹º»`½¾‚ÀÁÂÃĄů\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €]€Z€px€€€\€[€_{{139, 604}, {559, 152}}ÒÉÊ^YNS.string€Ò78ÌÍ£ÍÎ;_NSMutableStringXNSStringÒÉÊÑ€TViewÒ>FÔ€V§ÕÖרVÚÛ€ €0€?€C€ €H€MÚYZÝ[Þ\]^_`àáeãäåef`ZNSEditable[NSDragTypes€ €/€( €)€! € € Ò>?뀦ìíîïðñ€"€#€$€%€&€'_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{23, 73}, {64, 64}}Øtúzûü~ýþÿWNSStyleWNSAlignWNSScaleZNSAnimatesþ€.€*Ó2^NSResourceName€-€+€,WNSImage_NSApplicationIconÒ78  ¢ ;_NSCustomResourceÒ78£[;[NSImageCellÒ78¥£¤¥;[NSImageViewØYZ[\]^_`åef`€ €>€1€2 € € _{{105, 120}, {389, 17}}Øtz{|~€ !‚#Ö%&_NSBackgroundColor[NSTextColor€=€5€€3€0@€:Ô‘’“)*€€4_LucidaGrande-BoldÕ-./012345WNSColor\NSColorSpace[NSColorName]NSCatalogName€9€8€7€6VSystem\controlColorÓ.91;-¢-;Õ-./01A3B5€9€<€;€6_controlTextColorÓ.91;G€9B0Ò78IJ¤JŸ[;_NSTextFieldCellÒ78LM¥M£¤¥;[NSTextFieldØYZ[\]^_`QRSef`€ €>€@€A € € _{{105, 81}, {435, 31}}Øtz{|~€ !‚\×%&€=€5€€B€?€:Ô‘’a”c€#@&€ ØYZ[\]^_`aghdef`€ €€D€E € € _{{375, 12}, {170, 32}}Ýtuvwxyz{|}~€‚ƒ„…qr…ØŠ‹Œ€€€€G€F€€C_Installeer en herstartQ ØYZ[\]^_`az{nef`€ €€I€J € € _{{14, 12}, {134, 32}}Ýtuvwxyz{|}~€‚ƒ„…„……ÚŠ‹Œ€€€€L€K€€H_Niet installerenÒÉÊš€ØYZ[\]^_`aŽnef`€ €€N€O € € _{{105, 58}, {382, 18}}Þtu•vwxyz{|}~€‚˜ƒÄ™‚›\ÛŠžŸ]NSNormalImage€€€Q€S€€P€B€MHþÿ€w«`­ØVÛÖÕ×ÚÜ€ €€C€ €u€M€0€ €?€H€jÒ23 €€v]NSApplicationÒ78°¢°;Ò>þ€w«­```````€€€ € €€ € € € € €Ò>þ!€w¬`­ØVÛÖÕ×ÚÜ€ €€€C€ €u€M€0€ €?€H€jÒ>þ0€w¬123456789:;<€{€|€}€~€€€€€‚€ƒ€„€…€†\Content ViewVWindow\File's Owner_$Push Button (Installeer en herstart)_&Push Button (Installeer bij afsluiten)[Application_ECheck Box (Download en installeer updates in de toekomst automatisch)[Static Text_Image View (NSApplicationIcon)]Static Text-1_Push Button (Niet installeren)_Shared DefaultsÒ>þK€w Ò>þN€w Ò>þQ€w¯­VJOÖHÕI×`ØMKÛNLÚÜ€€ €u€`€q€0€ € €€?€ €€C€i€b€M€n€d€H€jÒ>þh€w¯ijklmnopqrstuvwxyz{|€‹€Œ€€Ž€€€‘€’€“€”€•€–€—€˜€™€š€›€œ€€žÿÿÿÿÿÿÿý! " $# Ò>F’€V Ò>þ•€w Ò>þ˜€w Ò78𛢛;^NSIBObjectData"'1:?DRTf¯µ.JXdp~‰—³ÁÔæ !#%')+-/13579;DPRTmvŠž§ºÃÎÐÑÚáîôýÿ 1?HPRTVXy‹“𣭶ÂÄÆÈÊÍÎÐÒïú  .co…š©¼ÎÙãñ#%')+-/1357<E`qxˆŠ“•˜¥®³º»½ÆÏÜéòý#1:AYhy{}²¿ÌÚäòÿ /9EGIKMRTVXZ\^y‚ŒŽ—ž°¹ÂÄÉÒÔãåçéëíïñ  % 1 3 5 7 8 : < ? @ B D M O \ ^ ` b d f h „   Ô ì * A b j r z … Š Œ Ž • – £ ² ´ ¶ ¸ À Ô Ý â õ þ    % 1 R T V X Z [ ] _ y š ® º ¼ ¾ À Â Ä É Ë Ü Þ à ã ÷  ! - ; = ? A C E L Y f n p r ~ ‡ Œ ¡ £ ¥ § © ¼ É Ë Î × à ò û   3 5 7 9 ; > ? A C \ }  ƒ … ‡ ‰ š œ ¥ § ª Ë Í Ï Ñ Ó Ô Ö Ø ñ&(*,.024MOprtvxy{}•ÊÌÎÐÒÔÖØëôö "$=v„†ˆŠŒŽ’”™žÚçéëíöÿ  3<CRZenu˜µ¾ÃÖÝæí):<>@BPmw ¢¤¦¨ª¬ÅËÝæí"$&(*,.7JLMV]x…«Êçéëíïñó ;=?ACEGZdmo†ˆŠŒŽ’”–˜šœ¥§©·ÀÅÎÐçéëíïñóõ÷ùûý!#%')+-/13579BD]_acegikmoqsu‚‰–½æò:Fgu–¨±³´½¿ÀÉËöøúüþ  ')TVXZ\^`bdfhjlnprtvxz|~€‰‹‘“•—™›Ÿ¡£¥§©²´µ¾ÀÁÊÌÍÖÛœêtransmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000013212442116661030760 xustar0030 mtime=1418239409.327017668 30 atime=1418239409.327017668 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nib0000644000175000017500000000217012442116661035134 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController ACTIONS doNotInstall id installLater id installNow id CLASS SUAutomaticUpdateAlert LANGUAGE ObjC SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000013212442116661030760 xustar0030 mtime=1418239409.326017651 30 atime=1418239409.326017651 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nib0000644000175000017500000000072612442116661034437 0ustar00mikedldmikedld00000000000000 IBFramework Version 629 IBOldestOS 5 IBOpenObjects 6 IBSystem Version 9D34 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/PaxHeaders.4960/SUUpdatePermissionProm0000644000000000000000000000013212442116661030604 xustar0030 mtime=1418239409.561021678 30 atime=1418239409.454019845 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/0000755000175000017500000000000012442116661033421 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031712442116661031140 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239409.561021678 30 atime=1418239409.561021678 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobje0000644000175000017500000003036712442116661035316 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯ 156<=AEW_muvŽ—˜›Ÿ¥¦ª¯·¸ÂÇÑÒÓØÚßàãæéêïðóø&/0<=>EFNOPXY`aefmnz{€‚…‰Œ— ¡¢£¤¥¦§²¶·º½ÁÂÄÅÆÇÊËÐØÝîô!"&'*/@GJOPS\]bcfipv}‚ƒ†ˆ‰Ž’žŸ £«¬­°·¸¿À£¤ÁÄÅÊËÐÚêñòóôõ÷ùþÿ    !*+ k-0789@ABCKLMNTUV^d{€…†‡ŠŽ§¿×ØÙÚÛÜÝÞßàáâãäåæçèéêëìïò@ABCDEFGHÎIJK…LMNOPQRSTUV†WXYZ[\]^_`adgjU$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€Æ€è€€Ð€€ç€é€Ñ€€€Ï¯€êÒ234[NSClassName€€_SUUpdatePermissionPromptÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€Y¯HIJKLMNOPQRSTUV€ €€&€)€a€–€˜€™€§€ª€­€¶€¹€½€ÄÔXYZ[\^]NSDestinationXNSSourceWNSLabel€€ €€×`abcdefghijkf_NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabled[NSSuperview€ €€ €  € Õ`nco+qrstZNSSubviews[NSFrameSize€€[€/€Z_{{80, 50}, {27, 26}}Üwxyz{|}~€‚ƒ„…†„„‰\‹Œ[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsþ€€…€€€€ È€ÿÿÿÿ¸Ì@ÿPÔ‘’“”•–VNSSizeVNSNameXNSfFlags€#@*€\LucidaGrandeÒ78™š¢š;VNSFontÒ78œ¤žb;\NSButtonCell\NSActionCellÒ78 ¡¥¡¢£¤;XNSButtonYNSControlVNSView[NSResponder^moreInfoButtonÒ78§¨£¨©;_NSNibOutletConnector^NSNibConnectorÔXYZ[¬®€€€€%×`abcdef±²³´kf€ €$€€ € _{{104, 81}, {315, 42}}Øw¹|}~€º‚»¼„¾¬ÀÁ_NSBackgroundColor[NSTextColor€#€€€€@€ Ô‘’“ĕƀ#@&€ ÕÈÉÊËÌÍÎÏÐWNSColor\NSColorSpace[NSColorName]NSCatalogName€€€€VSystem\controlColorÓÉÔÌÖ×WNSWhite€K0.66666669Ò78ÙÈ¢È;ÕÈÉÊËÌÜÎÝЀ€"€!€_controlTextColorÓÉÔÌÖâ€B0Ò78äå¤åžb;_NSTextFieldCellÒ78çè¥è¢£¤;[NSTextField_descriptionTextFieldÔXYZë\î€(€€ €'_toggleMoreInfo:Ò78ñò£ò©;_NSNibControlConnectorÔXYZ[õ÷€€*€€`Üùúûüýþÿf„     \NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €_€\€px€,€+€^€]€._{{99, 573}, {438, 168}}ÒYNS.string€-XNSWindowÒ78£;_NSMutableStringXNSStringÒ€-TViewÒ>F€Y§ !¬#$\€0€5€:€€@€K€ Ø`abcde'fg*+,kf UNSTag€ €€1€2 € _{{270, 12}, {154, 32}}Þwxyz1{|}~€'2ƒ„… ‰67‰‹:; _NSAlternateImageÿÿÿÿ„þ€€€€4€3€€0ÿÿÿÿ†‚@ÿ_Zoek automatischQ ×`abcdefgAB,kf€ €€6€7 € _{{153, 12}, {117, 32}}Ýwxyz1{|}~€‚ƒ„… ‰JK‰ ‹:;€€€€9€8€€5[Niet zoekenQ×`abcdef±STUkf€ €$€;€< € _{{104, 114}, {289, 34}}Øw¹|}~€º‚»¼\]!ÀÁ€#€€=€>€:€ _'Automatisch zoeken naar nieuwe versies?Ô‘’“”cd€€?_LucidaGrande-Bold×`abcdefgijUkf€ €€A€B € _{{104, 53}, {278, 18}}Þwxoyz1{|}~€2ƒ„r… s„u¾#‹xy]NSNormalImage€€€D€H€€C€€@€H?™€¦š›œžŸ€M€N€O€P€Q€R_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{23, 84}, {64, 64}}Øw¨|©ª€«¬­®¯® °kWNSStyleWNSAlignWNSScaleZNSAnimatesþ€W€U Ó2|}~µ€G€E€V_NSApplicationIconÒ78¸¹£¹b;[NSImageCellÒ78»¼¥¼¢£¤;[NSImageViewÒ78¾¿£¿À;^NSMutableArrayWNSArrayZ{438, 168}Ò78㣣¤;_{{0, 0}, {1440, 878}}Z{213, 129}_{3.40282e+38, 3.40282e+38}Ò78ÈÉ¢É;_NSWindowTemplateVwindowÔXYZ[ÍÏ€€b€€•×`nco2Ñ+ÓÔ´ÕÖ×[NSExtension€€”€c€‘€’€“Ò>FÚ€Y¢ÛÜ€d€Û`ÞaßnàceáâÍäåæçèéêÍìí[NSHScrollerXNSsFlags\NSScrollAmts[NSVScroller]NSContentView€b€‰€Œ€‹€eOA€A€€b€…€fÒ>Fð€Y£íìä€f€…€‰Ù`aõncö÷eÛùúûüýþÿÛYNScvFlagsYNSDocViewYNSBGColor€d€„€€g €h€‚€dÒ>F€Y¡þ€hß`¹    cod eí®ûkí _NSDraggingSourceMaskForNonLocalYNSTvFlags_NSAllowsTypeSelect\NSCornerView_NSIntercellSpacingWidth_NSColumnAutoresizingStyle_NSIntercellSpacingHeight[NSGridColor_NSDraggingSourceMaskForLocal^NSTableColumns[NSRowHeight€f€€ÿÿÿÿÒÀ€x€j#@#@€i €}€f€m#@,Z{353, 113}Ô`ac+$%s€€l€k_{{346, 0}, {12, 17}}Ò78()¤)£¤;]_NSCornerViewÒ>F,€Y¢-.€n€zÙ01234567k9:;<Ö=>þ^NSIsResizeable\NSHeaderCellWNSWidthZNSDataCell^NSResizingMaskZNSMinWidthZNSMaxWidth[NSTableView €y€o#@`€t#@D#@@€h×w¹|}€ºABC„¾®Fþ€s€p€€€qÓÉÔÌÖI€K0.33333299ÕÈÉÊËÌÜÎMЀ€"€r€_headerTextColorÒ78QR¥Råžb;_NSTableHeaderCellØw¹|}~€ºT»VW¾þZÁ!þ€#€v€u€€h€ YText CellÕÈÉÊËÌÎ`Ѐ€x€w€_textBackgroundColorÓÉÔÌÖe€B1Ò78gh¢h;]NSTableColumnÙ01234567k9lmnÖ=>þ €y€{#@k`€|€h×w¹|}€ºABC„¾®F€s€p€€€qØw¹|}~€ºT»VW¾þZÁ€#€v€u€€h€ ÕÈÉÊËÌ΀Ѐ€€~€YgridColorÓÉÔÌÖ…€D0.5Ò78‡7¥7¢£¤;_{{1, 1}, {353, 113}}ÕÈÉÊËÌÍΌЀ€€ƒ€_controlBackgroundColorÒ78‘¤‘£¤;ZNSClipViewÙ`“aßc”e•ÛÛ˜™sš›ÛXNSTargetXNSActionYNSPercent€d€d€ˆ€†ÿÿÿÿ€€‡€d#?é_{{-22, 1}, {11, 125}}\_doScroller:Ò78¡¢¥¢¢£¤;ZNSScrollerÙ`“aßc”e•ÛÛ˜§,s›Ûª€d€d€ˆ€Š€‡€d#?ï±û _{{-100, -100}, {345, 11}}_{{4, 5}, {355, 115}}Ò78®¯¤¯£¤;\NSScrollView×`abcdeͱ³´´kÍ€b€$€Ž€ €b_{{1, 128}, {358, 70}}Øw¹|}~€º‚»¼»¾ÜÀÁ€#€€€€€ _ÖAnonieme systeemprofiel-informatie wordt gebruikt om ons te helpen met het plannen van toekomstige ontwikkelingen. Als u hierover vragen heeft, kunt u contact met ons opnemen. Deze informatie zal worden verzonden:Z{362, 205}Ò78Âäã¤;\NSCustomView\moreInfoViewÔXYZëÉ€(€€0€—]finishPrompt:ÔXYZë É€(€€5€—×XÑÒYZÓÔÕÖ×.Ù YNSKeyPathYNSBinding_NSNibBindingConnectorVersion€¦€š€¥€¤€z€£ØÛÜÝÞßàákãkåækkk_NSFilterRestrictsInsertion_NSPreservesSelection__NSManagedProxy^NSDeclaredKeys_"NSClearsFilterPredicateOnInsertion_NSSelectsInsertedObjects_NSAvoidsEmptySelection €¢ € €› Ò>Fì€Y¤íîïð€œ€€ž€ŸZvisibleKey\visibleValue\displayValueZdisplayKeyÑö€¡Ò78øÝ¢Ý;Ò78úû¤ûüý;_NSArrayController_NSObjectController\NSController_#value: arrangedObjects.displayValueUvalue_arrangedObjects.displayValueÒ78£©;_NSNibBindingConnector×XÑÒYZÓÔ׬  €¦€€©€¤€€¨_value: promptDescription_promptDescription×XÑÒYZÓÔ×$ €¦€€¬€¤€K€«[value: iconTiconØXÑÒYZÓÔ×# YNSOptions€¦€€¯€¤€@€®€°_value: shouldSendProfile_shouldSendProfileÓ">#$'WNS.keys€µ¢%&€±€²¢()€³€´_NSNullPlaceholder_NSValidatesImmediately Ò78./¢/;\NSDictionary×XÑÒYZÓÔÕ3×-6 €¦€š€¸€¤€n€·_!value: arrangedObjects.displayKey_arrangedObjects.displayKey×XÑÒYZÓÔ<=Õ? €¦€€¼€»€š€º_+contentArray: systemProfileInformationArray\contentArray_systemProfileInformationArrayØXÑÒYZÓÔFG\IJ €¦€€À€¿€ €¾€Á_hidden: shouldAskAboutProfileVhidden_shouldAskAboutProfileÓ">#PR€µ¡Q€Â¡S€Ã_NSValueTransformerName_NSNegateBooleanØXÑÒYZÓÔFG#I] €¦€€À€¿€@€¾€ÅÓ">#`b€µ¡Q€Â¡S€ÃÒ>ef€Î¯Û Õ-.f<\p!õ#¬Üþw$nÍ€d€5€0€š€n€z€ €t€ €Ç€:€*€@€€€h€Ì€K€|€bÓÞ|}~k_NSAppliesImmediately€Ë€È Ò>F‚€Y¢ƒ„€É€Ê_SUIncludeProfile_SUSendProfileInfoÒ78ˆ‰£‰ý;_NSUserDefaultsControllerÒ23Œ€€Í]NSApplicationÒ78À¢À;Ò>e’€Î¯Íffþþõ-ffffÍÛf.€b€ € €€h€h€*€n€ €€ €€ € €b€d€€ €z€Ò>e©€Î¯Û Õ-.f<\p!õ#¬Üþw$nÍ€d€5€0€€š€n€z€ €t€ €Ç€:€*€@€€€h€Ì€K€|€bÒ>eÁ€Î¯ÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕրҀӀԀՀր׀؀ـڀۀ܀݀ހ߀à€á€â€ã€ä€å€æ[Scroll View_Push Button (Niet zoeken)_Push Button (Zoek automatisch)\File's Owner_Array Controller\Table Column^Table Column-1\Content View_Text Field Cell (Text Cell)ZDisclosure_User Defaults Controller_5Static Text (Automatisch zoeken naar nieuwe versies?)\Profile Info_+Check Box (Voeg anoniem systeemprofiel toe)[Static Text_äStatic Text (Anonieme systeemprofiel-informatie wordt gebruikt om ons te helpen met het plannen van toekomstige ontwikkelingen. Als u hierover vragen heeft, kunt u contact met ons opnemen. Deze informatie zal worden verzonden:)ZTable View[Application_Image View (NSApplicationIcon)_Text Field Cell (Text Cell)-1\MoreInfoViewÒ>eî€Î Ò>eñ€Î Ò>eô€Î¯$Û JÕK-.f<H\TSRMLUpN!õ#¬IQÜPOþVw$nÍ€d€5€&€0€€š€)€n€z€ €t€ € €¹€¶€­€–€a€½€Ç€˜€:€*€@€€€ª€€§€™€h€Ä€Ì€K€|€bÒ>e€Î¯$ !"#$%&'()*+,-./0123456789:;<=>?€ë€ì€í€î€ï€ð€ñ€ò€ó€ô€õ€ö€÷€ø€ù€ú€û€ü€ý€þ€ÿ     (ƒ •~*,+„G®”‹1‘ "!‚.¡­)ÿÿÿÿÿÿÿý%-'Ò>Fc€Y Ò>ef€Î Ò>ei€Î Ò78kl¢l;^NSIBObjectData"'1:?DRTf–áèïý+9EQ_jx”¢µÇáëøúýÿ   )579T]fqv…Ž¡ªµ·¸ÁÈÕÛäæ   !#%6DMUWY[]zŒ”›¤®º¼¾ÀÂÅÆÈÝèôöøúýÿGSi~Ÿª´ÂÔáïôöøúüþ &-4=?HJMZchoxŽ›¤¯¸ÂÉÕäíô +-/13PRTVX[\^w˜¬¸º¼¾ÀÂÇÉÚÜåçêÿ   . 0 2 4 6 8 ? L Y a c e q z  ” – ˜ š œ ¯ ¼ ¾ Á Ê Ó å î ù   - / 1 3 5 G P W o € ‚ „ † ˆ ¹ Æ Ó á ë ù   " 6 @ L N P R T Y [ ] _ a c e g Š ” – Ÿ ¨ ¯ Á Ê Ó Õ Ú ã å ô ö ø ú ü þ  # ) + - / 1 4 5 7 P ‰ œ ¥ § © « ­ ¯ ± ³ ¸ Á Ô Ö ó õ ÷ ù û ü þ  L N P R T V X Z f h … ‡ ‰ ‹ ‘ “ ­ Î Ð Ò Ô Ö Ø Ú0MOQSUVXqª¸º¼¾ÀÂÄÆÈÍÒô'05HQ]_ajo…ªµÁÃÅÇÈÊÌÍÏØÚçéëíïñó+_w˜µÌíõý !.024HQXdmx„”£«¶¿ÆÞé'.?ACEGdprtvxz|…‡ŒŽ½ÉÒßëùûýÿ "+-468:_is}ƒ…‡ŠŒŽ™›ž ë ,9SoŠ–µÄÐÒÔÝßàâëô÷ùúüþ ')+-DMVdmotvx¬¹ÁÌÛæñýþ  !>CEGIKMZ\h}ƒ…— «¿àåçéëíïôö3@BENSa†‡‰‹”–˜µ·¹»½¿àâäæèêì  "'0;Rgikmoˆ‘š¥ÊÓÜæèêìî÷ùû)2=Hmoqsuwy‚žµ¾ÇÔñóõ÷ùúü579;=?A%.7DQbdfhjx‰‹‘®¸Âáãåçéëí+BTcˆ£¼½¿ÀÂÄÅÆÇÐÒÛÝßáãîû#(1:Ncp–œ»ÄËã  ';XZ\^`bdpu– ¢¤¦¨ª¬®ÉÝêòôùûý34=BOlnprtvxœ¹ÖØÚÜÞàâ   = ^ ` b d f h j l Œ “ « ¸ º ½ ¿ Â Ä Ý ï!!!!!!!!!+!-!0!2!5!7!@!B!m!o!q!s!u!w!y!{!}!!!ƒ!…!‡!‰!‹!!!‘!“!•!¢!¹!»!½!¾!Ç!É!Î!Ð!Ò!å!ù"" "$"-"/"1"?"H"M"V"X"ƒ"…"‡"‰"‹"""‘"“"•"—"™"›""Ÿ"¡"£"¥"§"©"«"´"¶"ã"å"ç"é"ë"í"ï"ñ"ó"õ"÷"ù"û"ý"ÿ##### # # ###E#G#I#K#M#O#Q#S#U#W#Y#[#]#_#a#c#e#g#i#k#m#o#{#—#¸#Å#Ø#å#ô$$$*$E$}$Š$¸$Ä%«%¶%Â%ã&&&&&&%&'&(&1&3&~&€&‚&„&†&ˆ&Š&Œ&Ž&&’&”&–&˜&š&œ&ž& &¢&¤&¦&¨&ª&¬&®&°&²&´&¶&¸&º&¼&¾&À&Â&Ä&Æ&Ï&Ñ''' '"'$'&'('*','.'0'2'4'6'8':'<'>'@'B'D'F'I'L'O'R'U'X'['^'a'd'g'j'm'p's'u'w'y'{'}'''ƒ'…'‡'‰'‹'''‘'“'•'—'™'›''Ÿ'¡'£'¥'§'©'«'­'¶'¸'º'¼'Å'Ç'È'Ñ'Ó'Ô'Ý'ß'à'é'îm'ýtransmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031212442116661031133 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239409.561021678 30 atime=1418239409.561021678 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.n0000644000175000017500000000253612442116661035243 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController ACTIONS finishPrompt id toggleMoreInfo id CLASS SUUpdatePermissionPrompt LANGUAGE ObjC OUTLETS delegate id descriptionTextField NSTextField moreInfoButton NSButton moreInfoView NSView SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000013212442116661031133 xustar0030 mtime=1418239409.561021678 30 atime=1418239409.561021678 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nib0000644000175000017500000000066612442116661035056 0ustar00mikedldmikedld00000000000000 IBFramework Version 629 IBOldestOS 5 IBOpenObjects IBSystem Version 9E17 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/PaxHeaders.4960/SUUpdateAlert.nib0000644000000000000000000000013212442116661027434 xustar0030 mtime=1418239409.393018799 30 atime=1418239409.328017685 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116661031136 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdateAlert.nib/PaxHeaders.4960/keye0000644000000000000000000000013212442116661030371 xustar0030 mtime=1418239409.393018799 30 atime=1418239409.393018799 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdateAlert.nib/keyedobjects.nib0000644000175000017500000002375412442116661034316 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯ð 156<=AEW_muv†‡“žŸ¤¦«¬¯³¹º¾ÃËÌàáæéíðóô÷ü$%&'()*+,-./0128CDEF×GKNQRW_`ijklq‹ŒŽ‘¨±²³´µÀÅÆÇÊÍÐØÙáåæíîõöú   !%)*,-.48=>ADGNO[\`a`ehijklopuv{|ˆ‰Š‹‘’“•˜ ¡¢¨¯°±²¹½ÁÂÃÊËÌÔÚáâãëñ -?@ABCDEFGHIJKLMNQTvš˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶¹¼¿U$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€ï€³€Ê€î€€¸€€É€Ë€¹€ì€€€·€í§€ÌÒ234[NSClassName€€]SUUpdateAlertÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€t¯HIJKLMNOPQRSTUV€ €€*€G€N€€‘€“€œ€ €¤€©€¬€®€±ÔXYZ[\^]NSDestinationXNSSourceWNSLabel€€ €€×`abcdefghijkf_NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabled[NSSuperview€ €€ €  € Õ`nco+qrstZNSSubviews[NSFrameSize€€v€T€‰_{{106, 302}, {463, 28}}Øwxyz{|}~€‚\„…[NSCellFlags_NSBackgroundColorZNSContentsYNSSupport]NSControlView\NSCellFlags2[NSTextColorþ€€€€€ @€PÔˆ‰Š‹ŒŽVNSSizeVNSNameXNSfFlags€#@&€ \LucidaGrandeÒ78‘’¢’;VNSFontÕ”•–—˜™š›œWNSColor\NSColorSpace[NSColorName]NSCatalogName€€€€VSystem\controlColorÓ• ˜¢£WNSWhite€K0.66666669Ò78¥”¢”;Õ”•–—˜¨š©œ€€€€_controlTextColorÓ• ˜¢®€B0Ò78°±¤±²b;_NSTextFieldCell\NSActionCellÒ78´µ¥µ¶·¸;[NSTextFieldYNSControlVNSView[NSResponder[descriptionÒ78»¼£¼½;_NSNibOutletConnector^NSNibConnectorÔXYZ¿Á€)€€€(×`abcdefÅÆÇÈkf€ €'€ €! € _{{103, 12}, {160, 32}}ÝwÍÎÏÐÑyz{Ò|Ó~ÔÖרÙÚØÁÝÞß_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalent_NSPeriodicDelay]NSButtonFlags€&€€#€$€"€#€Èÿÿÿÿ†‚@ÿ_Sla deze versie overÔˆ‰Š‹ãå€#@*€Òçè†YNS.string€%Ò78êë£ëì;_NSMutableStringXNSStringÒ78îï¤ï²b;\NSButtonCellÒ78ñò¥ò¶·¸;XNSButton_skipThisVersion:Ò78õö£ö½;_NSNibControlConnectorÔXYZ[ùû€€+€€FÛ`aýþÿcek  ZAllowsUndo[Preferences[NSDragTypesYGroupName_UseBackForwardListYFrameName€,€E€; €<€-€€€,Ö`anceqs€q€v€u€s€qÒ>?€­ !"#€.€/€0€1€2€3€4€5€6€7€8€9€:Zpublic.url_NeXT RTFD pasteboard type_NSStringPboardType_NeXT TIFF v4.0 pasteboard type_Apple URL pasteboard type_WebURLsWithTitlesPboardType_!Apple Web Archive pasteboard type_public.url-name_Apple HTML pasteboard type_NSFilenamesPboardType_NSColor pasteboard type_Apple PICT pasteboard type_*NeXT Rich Text Format v1.0 pasteboard type_{{-1, 0}, {456, 197}}Ó3457ZIdentifierVValues€D€€=Ó9>:;?WNS.keys€C£<=>€>€?€@£@A@€A€B€A_WebKitDefaultFixedFontSize_WebKitMinimumFontSize_WebKitDefaultFontSize Ò78HI£IJ;_NSMutableDictionary\NSDictionaryÒ78LM¢M;^WebPreferencesÒ78OP¤P·¸;WWebView_releaseNotesViewÔXYZ¿UV€)€€H€M×`abcdefÅZ[\kf€ €'€I€J! € _{{426, 12}, {146, 32}}ÝwÍÎÏÐÑyz{Ò|ÓaÔÖרefØUÝÞßÿÿÿÿ„þ€&€€#€L€K€#€H_Installeer updateQ ^installUpdate:ÔXYZ[op€€€O€ŽÝrstuvwxyz{|}f€‚ƒ„…†‡ˆ‰Š\NSWindowView\NSScreenRect_NSFrameAutosaveName]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €€Š€€Qÿÿÿÿðx€R€P€Œ€‹€S_{{194, 361}, {586, 370}}_Software-updateXNSWindowÒçè€%TViewÒ>F“€t©”•–—ÁU\œ€U€b€g€l€€H€q€ €€Ù`ažbÿcdef ¡k£¤¥kfZNSEditable€ €a€Z €[€V € Ò>?ª€¦«¬­ "€W€X€Y€7€1€9_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_{{24, 291}, {64, 64}}Øw¶y·¸|¹º»¼½¼¼¾ WNSStyleWNSAlignWNSScaleZNSAnimatesþ€`€\Ó2ÁÂÃÄ^NSResourceName€_€]€^WNSImage_NSApplicationIconÒ78ÈÉ¢É;_NSCustomResourceÒ78ËÌ£Ìb;[NSImageCellÒ78ÎÏ¥϶·¸;[NSImageView×`abcdefgÓÔÕkf€ €€c€d € _{{106, 338}, {443, 17}}Øwxyz{|}~€Ý•ß…€€€€e€b@€Ôˆ‰Š‹ãã䀀f_LucidaGrande-Bold×`abcdefgéê¥kf€ €€h€i € _{{106, 280}, {443, 14}}Øwxyz{|}~€ñò–ß…€€€j€k€g€_Versie-informatie:Ôˆ‰Š‹Œãù€€f ×`abcdefÅýþ\kf€ €'€m€n € _{{280, 12}, {146, 32}}ÝwÍÎÏÐÑyz{Ò|Ó~ÔÖרØ—ÝÞ߀&€€#€p€o€#€l_Herinner me laterQÝ` ancef¢  ×¼fYNSBoxType[NSTitleCell]NSTransparent\NSBorderTypeYNSOffsets_NSTitlePosition]NSContentView€ €€y€w€r€x€ €,Ò>F€t¡€,Ò>F#€t¡ù€+Ò78&'£'(;^NSMutableArrayWNSArray_{{1, 1}, {455, 197}}Ò78+·£·¸;_{{109, 76}, {457, 199}}V{0, 0}×wxyz|}~02¼3€€{€€z€~Ôˆ‰Š‹Œ7€€Õ”•–—˜:š;œ€€}€|€_textBackgroundColorÓ• ˜¢@€B1Ó• ˜¢C€M0 0.80000001Ò78EF¤F·¸;UNSBox×`abcdefÅJKskf€ €'€€‚ € _{{106, 50}, {442, 16}}ÞwÍPÎÏÐÑyz{Ò|Ó~ÔSÖ‡TV‚œÝYZ]NSNormalImage€&€€„€†€€ƒ€€€HŒ€š¡Ž€˜¡€™_NSValueTransformerName_NSNegateBooleanÒ78”J¢J;Ò78–—£—½;_NSNibBindingConnectorØX}~YZ€›„œžŸ‡€›€€ž€•€€€€Ÿ_hidden: allowsAutomaticUpdates_allowsAutomaticUpdatesÓ9>Œ¤¦€š¡Ž€˜¡€™×X}~YZ€«¬\®‡€›€€£€¢€ €¡_value: descriptionTextUvalue_descriptionText×X}~YZ€´µ¬œ¸‡€›€¥€¨€¢€€€§Òº»k_NSSharedInstance€¦ Ò78¾¿£¿À;_NSUserDefaultsController\NSController_#value: values.SUAutomaticallyUpdate_values.SUAutomaticallyUpdate×X}~YZ€Æ¬”ɇ€›€€«€¢€U€ª_value: applicationIcon_applicationIconØX}~YZ€ƒ„ù†Ó‡€›€€–€•€+€”€­Ó9>ŒÖØ€š¡Ž€˜¡€™×X}~YZ€Ý¬•à‡€›€€°€¢€b€¯_value: titleTextYtitleTextØX}~YZ€ƒ„†ê‡€›€€–€•€q€”€²Ó9>Œí¡Ž€˜¡€™Ò>ò󀶯f•o´U\—œý–Áù”€ €b€O€¥€H€q€ €l€€€´€g€€+€,€UÒ23€€µ]NSApplicationÒ78(¢(;Ò>ò €¶¯offfffffff€O€ €€€ € € € € €€ € €,€q€ Ò>ò€¶¯f´•oU\—œý–Áù”€ €¥€b€O€€H€q€ €l€€€´€g€€+€UÒ>ò/€¶¯0123456789:;<=>€º€»€¼€½€¾€¿€À€Á€Â€Ã€Ä€Å€Æ€Ç€È\Content View_Shared Defaults[Static Text_Update Alert (release notes)\File's Owner_Push Button (Installeer update)SBox]Static Text-1_Push Button (Herinner me later)_ECheck Box (Download en installeer updates in de toekomst automatisch)[Application_ Static Text (Versie-informatie:)_"Push Button (Sla deze versie over)XWeb View_Image View (NSApplicationIcon)Ò>òP€¶ Ò>òS€¶ Ò>òV€¶¯f•TU\QœUMýK”IO´oJH—RLVNSÁ–ùP€ €b€¬€H€q€ € €€€®€€´€G€,€U€€“€¥€O€*€€ €l€¤€N€±€‘€©€€g€+€œÒ>òx€¶¯yz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—€Í€Î€Ï€Ð€Ñ€Ò€Ó€Ô€Õ€Ö€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€â€ã€ä€å€æ€ç€è€é€ê€ë ¡LYegu "ÿÿÿÿÿÿÿýM¦!H] ¥i‡2¤E Ò>F¸€t Ò>ò»€¶ Ò>ò¾€¶ Ò78ÀÁ¢Á;^NSIBObjectData"'1:?DRTfIO𡍶Èäòþ #1M[n€š¤±³µ·¹»½¿ÁÃÅÇÉËÍÏÑÓÕÞêìîü-6IR]_`ip}ƒŒŽ¯±³µ·¹»½¿ÁÃÅÇÉËÍÞìõýÿ"4<CLVbdfhjmnp…œž ¢¥§Áâî %2>CEGIKMRTUfmt}ˆŠš£¨¯ÄÌÙåóõ÷ùûý&(*6?DY[]_atƒ†˜ª·ÀË×áèô '6GIKMOlnprtwxz“ÈÞó   ' 9 G I K M O Q S U W Y [ ` i € ‘ “ œ ž ¡ ª ´ ¶ ¿ Æ Ø á ê ó   0 9 @ X i k m o q ž © µ Á Ë à ê ì î ð ñ ó õ ø ú û ý ÿ     " + - H J L N P R T V X Z \ ^ ` b m ‰ ž ¿ Û ù  / L d ~ › È à í ø ÿ       # % ' ) 0 2 4 6 S k ƒ … Ž • « ¸ Á Æ Õ Þ ç ï8:<>@CDF_”Ÿ¡£¥§©«¿ÁÐáãåçé+8N\ft‹±»ÇÉËÍÏÑÚÜÞàâäæè').79LNPRTVXZ\^ƒŽ’”•—™œŸ¨ª·¹»½¿ÁÃßû/Ghpx€‹’”–›œ©¸º¼¾ÆÚãèû  +7TVXZ\_`b|Ÿ¡£¥§¬®¿ÁÃÆÚ÷ùûýÿ=?ACEGI^oqsv“•—™›œž·ìîðòôöøúEO[iv€’ ¢¤¦¨©«­¯±º¼¿ÁÊÌÏÑÚáðø9@]_acegxz|~“•—™›±¾ÀÃÐÒàéòø 9r€‚„†ˆŠŒŽ•šÖãåçéòû  /:R]zƒˆ›¤µ·¹»½ÌÝßáãåì !+JLNPRTVXt{œž¡£¦¨ÁÓÜáêñ *,.02468Yr„†‰‹¨ª¬®°²´ÍÓå  *,-6=Xe‹ªÇÉËÍÏÑÓìþ!#%')+-:<?ADFcegikmo‚Œ­¯±³µ·¹»ÈÊÍÏÒÔÝß  ')+9BGPRsuwy{}ƒ…‡‰‹‘šœ½¿ÁÃÅÇÉËÍÏÑÓÕ×ÙÛäæ   !#%2DPo|ž¢°Ò&Inw˜¡£¤­¯°¹»üþ   "$&(*,.02468:CE†ˆŠŒŽ’”–˜šœž ¢¤¦¨ª¬®°²´¶¸º¼¾ÀÂÄÆÈÊÌÎÐÒÔÖßáãåçéëíïñóõ÷ùûýÿ           ( * + 4 9 Htransmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdateAlert.nib/PaxHeaders.4960/clas0000644000000000000000000000013212442116661030356 xustar0030 mtime=1418239409.393018799 30 atime=1418239409.393018799 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdateAlert.nib/classes.nib0000644000175000017500000000277412442116661033277 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController CLASS NSApplication LANGUAGE ObjC SUPERCLASS NSResponder ACTIONS installUpdate id remindMeLater id skipThisVersion id CLASS SUUpdateAlert LANGUAGE ObjC OUTLETS delegate id description NSTextField releaseNotesView WebView SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdateAlert.nib/PaxHeaders.4960/info0000644000000000000000000000013212442116661030367 xustar0030 mtime=1418239409.393018799 30 atime=1418239409.393018799 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000066612442116661032573 0ustar00mikedldmikedld00000000000000 IBFramework Version 629 IBOldestOS 5 IBOpenObjects IBSystem Version 9E17 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/PaxHeaders.4960/Sparkle.strings0000644000000000000000000000013212442116661027274 xustar0030 mtime=1418239409.560021661 30 atime=1418239409.560021661 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/Sparkle.strings0000644000175000017500000002050212442116661030720 0ustar00mikedldmikedld00000000000000þÿ/* No comment provided by engineer. */ "%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ is gedownload en is klaar voor gebruik! Wilt u %1$@ nu installeren en herstarten?"; /* No comment provided by engineer. */ "%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ kan niet worden geupdate als het van een alleen-lezen volume, zoals een schijfkopie of CD, geopend is. Verplaats %1$@ naar de Map 'Programma's', herstart van daar, en probeer opnieuw."; /* No comment provided by engineer. */ "%@ %@ is currently the newest version available." = "%1$@ %2$@ is momenteel de recentste versie."; /* No comment provided by engineer. */ "%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ is nu beschikbaar--u heeft %3$@. Wilt u het nu downloaden?"; /* No comment provided by engineer. */ "%@ downloaded" = "%@ gedownload"; /* No comment provided by engineer. */ "%@ of %@" = "%1$@ van %2$@"; /* No comment provided by engineer. */ "A new version of %@ is available!" = "Een nieuwe versie van %@ is beschikbaar!"; /* No comment provided by engineer. */ "A new version of %@ is ready to install!" = "Een nieuwe versie van %@ is klaar om te installeren!"; /* No comment provided by engineer. */ "An error occurred in retrieving update information. Please try again later." = "Bij het ophalen van update-informatie deed zich een fout voor. Probeer alstublieft later opnieuw."; /* No comment provided by engineer. */ "An error occurred while downloading the update. Please try again later." = "Bij het downloaden deed zich een fout voor. Probeer alstublieft later opnieuw."; /* No comment provided by engineer. */ "An error occurred while extracting the archive. Please try again later." = "Bij het uitpakken van het archief deed zich een fout voor. Probeer alstublieft later opnieuw."; /* No comment provided by engineer. */ "An error occurred while installing the update. Please try again later." = "Bij het installeren van de update deed zich een fout voor. Probeer alstublieft later opnieuw."; /* No comment provided by engineer. */ "An error occurred while parsing the update feed." = "Bij het afhandelen van de update feed deed zich een fout voor."; /* No comment provided by engineer. */ "An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "Bij het herstarten van %1$@ deed zich een fout voor. Maar de nieuwe versie is beschikbaar de volgende keer u %1$@ opstart."; /* the unit for bytes */ "B" = "B"; /* No comment provided by engineer. */ "Cancel" = "Annuleer"; /* No comment provided by engineer. */ "Cancel Update" = "Annuleer bijwerken"; /* No comment provided by engineer. */ "Checking for updates..." = "Zoek naar nieuwe versies &"; /* Take care not to overflow the status window. */ "Downloading update..." = "Downloaden update &"; /* Take care not to overflow the status window. */ "Extracting update..." = "Bezig met uitpakken van de update &"; /* the unit for gigabytes */ "GB" = "GB"; /* No comment provided by engineer. */ "Install and Relaunch" = "Installeer en herstart"; /* Take care not to overflow the status window. */ "Installing update..." = "Update installeren &"; /* the unit for kilobytes */ "KB" = "KB"; /* the unit for megabytes */ "MB" = "MB"; /* No comment provided by engineer. */ "OK" = "OK"; /* No comment provided by engineer. */ "Ready to Install" = "Klaar om te installeren"; /* No comment provided by engineer. */ "Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Zou %1$@ automatisch naar updates moeten zoeken? U kan altijd nog manueel naar updates zoeken via het %1$@ menu."; /* No comment provided by engineer. */ "Update Error!" = "Update-fout!"; /* No comment provided by engineer. */ "Updating %@" = "Updaten %@"; /* No comment provided by engineer. */ "You already have the newest version of %@." = "U heeft al de nieuwste versie van %@."; /* No comment provided by engineer. */ "You're up-to-date!" = "U heeft de nieuwste versie!";transmission-2.92/macosx/Sparkle.framework/Resources/PaxHeaders.4960/en.lproj0000644000000000000000000000013212442116655024177 xustar0030 mtime=1418239405.257947938 30 atime=1418239404.861941152 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/0000755000175000017500000000000012442116655025701 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/PaxHeaders.4960/SUAutomaticUpdateAlert0000644000000000000000000000013212442116654030527 xustar0030 mtime=1418239404.930942334 30 atime=1418239404.861941152 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116654033000 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000031512442116654030756 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239404.929942317 30 atime=1418239404.929942317 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobject0000644000175000017500000001575412442116654035227 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯¡ 156<=AEPXhr sŽ–—š›œ ¦§«°¸¹ÁÂÅÉÊÏæçéìö  #$%(+.67AEFPQRWY^_behqry~†‡‘™š¤¥©ª­± ²´µ¶·º»¾ÃÄÎÏÐÑÔÛßãäåìíîõö÷  (789:;<=>?@ABCFI`wxyMz{|}~€‚ƒ„…†‡ˆ‰Š“U$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€ €r€†€Ÿ€€w€€…€‡€x€€€€v€ž%€ˆÒ234[NSClassName€€_SUAutomaticUpdateAlertÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€V¨HIJKLMNO€ €€!€`€b€g€l€oÔQRSTVW]NSDestinationXNSSourceWNSLabel€€€ €ØYZ[\]^_`abcdef`_NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabledXNSWindow[NSSuperview€ €€ € € € ×Yi\j^_flmnofqZNSSubviews[NSFrameSize€ €Y€&€W€ €X_{{378, 12}, {167, 32}}Ýtuvwxyz{|}~€‚ƒ„…†‡…VŠ‹Œ[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsþ€€€€€€€ Èÿÿÿÿ†‚@ÿ_Install and RelaunchÔ‘’“”•VNSSizeVNSNameXNSfFlags€#@*€\LucidaGrandeÒ78˜™¢™;VNSFontPQ Ò78ž¤žŸ[;\NSButtonCell\NSActionCellÒ78¡¢¥¢£¤¥;XNSButtonYNSControlVNSView[NSResponder[installNow:Ò78¨©£©ª;_NSNibControlConnector^NSNibConnectorÔQRST®¯€€€€ ØYZ[\]^_`a³´nef`€ €€€ € € _{{102, 12}, {116, 32}}Ýtuvwxyz{|}~€‚ƒ„…½¾…®Š‹Œ€€€€€€€]Don't InstallÒÃÄšYNS.string€Ò78ÆÇ£ÇÈ;_NSMutableStringXNSString]doNotInstall:ÔQRSËÌ΀_€"€€^ÜÐÑÒÓÔÕÖרÙÚ`ÜÝ‚ßàáâã„äå\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €]€Z€px€$€#€\€[€%_{{114, 521}, {559, 152}}ÒÃÄ^€ÒÃÄë€TViewÒ>Fî€V§ïðñVó®õ€'€7€F€ €J€€OÚYZ÷[ø\]^_`úûeýþÿef`ZNSEditable[NSDragTypes€ €6€/ €0€( € € Ò>?€¦   €)€*€+€,€-€._Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{23, 73}, {64, 64}}Øtz~WNSStyleWNSAlignWNSScaleZNSAnimatesþ€5€1Ó2 !"^NSResourceName€4€2€3WNSImage_NSApplicationIconÒ78&'¢';_NSCustomResourceÒ78)*£*[;[NSImageCellÒ78,-¥-£¤¥;[NSImageViewØYZ[\]^_`012ÿef`€ €E€8€9 € € _{{105, 120}, {389, 17}}Øt8z{|~9€:;‚=ð?@_NSBackgroundColor[NSTextColor€D€<€€:€7@€AÔ‘’“CD€€;_LucidaGrande-BoldÕGHIJKLMNOWNSColor\NSColorSpace[NSColorName]NSCatalogName€@€?€>€=VSystem\controlColorÓHSKUVWNSWhite€@K0.66666669Ò78XG¢G;ÕGHIJK[M\O€@€C€B€=_controlTextColorÓHSKUa€@B0Ò78cd¤dŸ[;_NSTextFieldCellÒ78fg¥g£¤¥;[NSTextFieldØYZ[\]^_`0klmef`€ €E€G€H € € _{{105, 81}, {435, 31}}Øt8z{|~9€:;‚vñ?@€D€<€€I€F€AÔ‘’{”}€#@&€ ØYZ[\]^_`a‚def`€ €€K€L € € _{{245, 12}, {133, 32}}Ýtuvwxyz{|}~€‚ƒ„…‹Œ…󊋌€€€€N€M€€J_Install on QuitQØYZ[\]^_`a”•nef`€ €€P€Q € € _{{105, 58}, {382, 18}}Ýtuvwxyz{|}~€‚ƒã‚ŸvõŠ¢£€€€S€€R€I€OHøù€u«Ö®Výï`óÌõðñ€h€€ €s€'€ €J€"€O€7€FÒ23€€t]NSApplicationÒ78 °¢°;Ò>ø €u«```Ì````€€ € €€ €"€ €€ € € Ò>ø€u¬Ö®Výïó`Ìõðñ€h€€ €s€'€J€€ €"€O€7€FÒ>ø*€u¬+,-./0123456€y€z€{€|€}€~€€€€€‚€ƒ€„_Shared Defaults_Push Button (Don't Install)_"Push Button (Install and Relaunch)[Application_Image View (NSApplicationIcon)_Push Button (Install on Quit)\File's Owner\Content ViewVWindow_DCheck Box (Automatically download and install updates in the future)[Static Text]Static Text-1Ò>øE€u Ò>øH€u Ò>øK€u¯®Vï`ÌõðÖIñýHóJNOMLK€€ €'€ €"€O€7€h€€F€s€ €J€€!€l€o€g€b€`Ò>øb€u¯cdefghijklmnopqrstuv€‰€Š€‹€Œ€€Ž€€€‘€’€“€”€•€–€—€˜€™€š€›€œ# ÿÿÿÿÿÿÿý!$  "Ò>FŒ€V Ò>ø€u Ò>ø’€u Ò78”•¢•;^NSIBObjectData"'1:?DRTf«±ü *FT`lz…“¯½Ðâü!#%')+-/1357@LNPir{†‹š£¶¿ÊÌÍÖÝêðùû -;DLNPRTu‡–Ÿ©²¾ÀÂÄÆÉÊÌÎëö  *_k–¥¸ÊÕßíÿ !#%')+-/138AXipw€‚‹¦«²³µ¾ÇÔáêõþ'07O^oqsuw˜šœž ¡£¥¾óõ÷ùûýÿ"$-4FO]nprtv§´ÁÏÙçôþ  $ . : < > @ B G I K M O Q S n w y ‚ „ ‰ ’ ” £ ¥ § © « ­ ¯ ± Ú å ñ ó õ ÷ ø ú ü ÿ      " $ & ( D ` ” ¬ Í ê  " * 2 : E J L N P U V c r t v x € ” ¢ µ ¾ Å Ñ Ú å ñ         9 Z n z | ~ € ‚ „ ‰ ‹ œ ž   £ · Ì Ô á í û ý ÿ     & . 0 2 > G L a c e g i | ‰ ‹ Ž —   ² » Æ Ò ó õ ÷ ù û þ ÿ=?ACEGIZ\egj‹‘“”–˜±æèêìîðòô)+-/1246O„†ˆŠŒŽ’—œ×àìîðù&-<DOX_w‚Ÿ¨­ÀÇÐ×îÿ2<FegikmoqŠ¢«²Êçéëíïñóü"=Jp¬®°²´¶¸Ñã  )24KMOQSUWY[]_ajln|…Š“•¬®°²´¶¸º¼¾ÀÂËÍæèêìîðòôöøúüþ "$&(*,.02468:Lj›¼ÜéöýDP^gijsuv¬®°²´¶¸º¼¾ÀÂÄÆÈÊÌÎÐÒÔÝß   "$&(*,.02468:<>@BDMOQSUWY[]_hjktvw€‚ƒŒ‘– transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000013212442116654030753 xustar0030 mtime=1418239404.930942334 30 atime=1418239404.930942334 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nib0000644000175000017500000000217012442116654035127 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController ACTIONS doNotInstall id installLater id installNow id CLASS SUAutomaticUpdateAlert LANGUAGE ObjC SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUAutomaticUpdateAlert.nib/PaxHeaders.0000644000000000000000000000013212442116654030753 xustar0030 mtime=1418239404.929942317 30 atime=1418239404.929942317 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nib0000644000175000017500000000105212442116654034423 0ustar00mikedldmikedld00000000000000 IBFramework Version 658 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 6 IBSystem Version 9C7010 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/PaxHeaders.4960/SUUpdatePermissionProm0000644000000000000000000000013212442116655030600 xustar0030 mtime=1418239405.258947955 30 atime=1418239405.166946378 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/0000755000175000017500000000000012442116655033415 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031712442116655031134 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239405.258947955 30 atime=1418239405.258947955 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobje0000644000175000017500000003171712442116655035312 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯ 156<=AEW_q{ |•–žŸ¢£¤©¯°´¹ÂÃÎÏÔÞßàåèíîñöùúþ#&09:GHIRS\]bclm|}‚ƒ„‡‹Œœ¥¦§¨©ª«¬·»¼ÀÃÌÍÚÞ ßáâãäçèíò ý+/LMRSW\mtw|}ƒŒ’“–™¢©²·¸»¿ÀÅÆÉרÙÜçèéìõöÿ ­®   '(),19?FGHIPQRYipqrstvz€‚ƒ‹Œ•–pm˜Ÿ ¡¢©ª«ÂÅÆËÐÑÒ×Ùð !"#$%&'()*+,-./0123458;b‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥Û¦§¨©ª«¬¯²µU$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€Ì€î€€Ö€€í€ï€×€€€Õ¯€ðÒ234[NSClassName€€_SUUpdatePermissionPromptÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€Y¯HIJKLMNOPQRSTUV€ €€+€b€c€š€œ€ž€§€©€­€°€½€Å€ÉÔXYZ[]^]NSDestinationXNSSourceWNSLabel€€€ €Ù`abcdefghijklmnhp_NSNextResponderWNSFrameVNSCellXNSvFlagsYNSEnabledXNSWindow[NSSuperviewUNSTag€ €€ € € € ×`rcsefnuvwxnzZNSSubviews[NSFrameSize€ €\€1€Z€ €[_{{255, 12}, {169, 32}}Þ}~€‚ƒ„…†‡ˆg‰Š‹ŒpŽ]’“”p[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsÿÿÿÿ„þ€€€€€€€ Èÿÿÿÿ†‚@ÿ_Check AutomaticallyÔ—˜™š›œVNSSizeVNSNameXNSfFlags€#@*€\LucidaGrandeÒ78 ¡¢¡;VNSFontPQ Ò78¥¦¤¦§¨;\NSButtonCell\NSActionCellVNSCellÒ78ª«¥«¬­®;XNSButtonYNSControlVNSView[NSResponder]finishPrompt:Ò78±²£²³;_NSNibControlConnector^NSNibConnectorÔXYZµ¶¸€*€€€)Ø`abcdefh»¼½¾mnh€ €(€€ € € _{{104, 81}, {315, 42}}Ø}ă„…‡ÅÆÇÈÉʶÌÍ_NSBackgroundColor[NSTextColorþ€'€€€€@€$_DO NOT LOCALIZEÔ—˜™šÑœÓ€#@&€ ÕÕÖרÙÚÛÜÝWNSColor\NSColorSpace[NSColorName]NSCatalogName€#€"€!€ VSystem\controlColorÓÖáÙãäWNSWhite€#K0.66666669Ò78æç¢ç;WNSColorÕÕÖרÙêÛëÝ€#€&€%€ _controlTextColorÓÖáÙãð€#B0Ò78òó¤óôõ;_NSTextFieldCell\NSActionCellVNSCellÒ78÷ø¥ø¬­®;[NSTextField_descriptionTextFieldÒ78ûü£üý;_NSNibOutletConnector^NSNibConnectorÔXYZµ€*€,€€aÜ     h‹p\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€ €`€]€px€.€-€_€^€0_{{83, 492}, {438, 168}}ÒYNS.string€/XNSWindowÒ78 !£!";_NSMutableStringXNSStringÒ%€/TViewÒ>F(€Y§]*+¶-./€ €2€7€€=€H€VØ`abcdefhi345mnh€ €€3€4 € € _{{138, 12}, {117, 32}}Ý}~€‚ƒ„…†‡ˆ;Š‹>p@A*DEFþ€€€€6€5€€2Èÿÿÿÿ†‚@ÿ[Don't CheckQØ`abcdefh»LMNmnh€ €(€8€9 € € _{{104, 114}, {289, 34}}Ø}ă„…‡ÅTÇÈWX+ZÍþ€'€€:€;€7@€$_ Check for updates automatically?Ô—˜™š_`a€#@*€<_LucidaGrande-BoldØ`abcdefhifghmnh€ €€>€? € € _{{104, 53}, {278, 18}}Þ}~n€‚ƒ„…†‡ˆoŠ‹rst‹vÊ-yz{]NSNormalImageÿÿÿÿ„þ€€€A€E€€@€€=È€H?ž€¦Ÿ ¡¢£¤€J€K€L€M€N€O_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NSFilenamesPboardType_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{23, 84}, {64, 64}}Ø}­ƒ®¯‡°±²³´³pµmWNSStyleWNSAlignWNSScaleZNSAnimatesþ€T€R Ó2~€º€D€B€S_NSApplicationIconÒ78½¾£¾¿;[NSImageCellVNSCellÒ78ÁÂ¥¬­®;[NSImageViewØ`abcdefhiÆÇÈmnh€ €€W€X € € _{{80, 50}, {27, 26}}Ü}~€‚ƒ„…†‡ˆΊ‹ÑÒ‹‹/רÙþ€€…€€€€VÈ€ÿÿÿÿ¸Ì@ÿÒ78ÛÜ£ÜÝ;^NSMutableArrayWNSArrayZ{438, 168}Ò78à­£­®;_{{0, 0}, {1280, 778}}Z{213, 129}_{3.40282e+38, 3.40282e+38}Ò78忢æ;_NSWindowTemplateVwindowÔXYZ[*^€€€2€ÔXYZµïñ€*€d€€™Ù`rcse2ófôõö÷øôúûü[NSExtension€e€˜€f €”€e€–€—€•Ò>Fÿ€Y¢€g€Ý`arcefï    ôï[NSHScrollerXNSsFlags\NSScrollAmts[NSVScroller]NSNextKeyView]NSContentView€d€Œ€€Ž€hOA€A€€e€d€ˆ€i€iÒ>F€Y£ €i€ˆ€ŒÛ`arcef!"#$%&ô(&YNScvFlagsYNSDocViewYNSBGColor€g€‡€„€j €k€e€…€g€kÒ>F-€Y¡&€kß`01Ä23456csde78f9:³<=>?@A#BCDmôGHJK_NSDraggingSourceMaskForNonLocalYNSTvFlags_NSAllowsTypeSelect\NSCornerView_NSIntercellSpacingWidth_NSColumnAutoresizingStyle_NSIntercellSpacingHeight[NSGridColor_NSDraggingSourceMaskForLocal^NSTableColumns[NSRowHeight€i€ƒÿÿÿÿÒÀ€{€m#@#@€l €e€€€i€p#@,Z{353, 113}Ô`ac+OPQ€€o€n_{{346, 0}, {12, 17}}Ò78TV¤U­®;]_NSCornerView]_NSCornerViewÒ>FY€Y¢Z[€q€}Ù]^_`abcdmfghiãjk&^NSIsResizeable\NSHeaderCellWNSWidthZNSDataCell^NSResizingMaskZNSMinWidthZNSMaxWidth[NSTableView €|€r#@`€w#@D#@@€k×}ㄇÅnop‹Ê³sþ€v€s€€€tÓÖáÙãv€#K0.33333299ÕÕÖרÙêÛzÝ€#€&€u€ _headerTextColorÒ78~‚¥ó€;_NSTableHeaderCell\NSActionCellVNSCell_NSTableHeaderCellØ}ă„…‡Å„dž‡Ê&ŠÍ!þ€'€y€x€€k€$YText CellÕÕÖרÙ>ÛÝ€#€{€z€ _textBackgroundColorÓÖáÙã•€#B1Ò78—˜¢˜;]NSTableColumnÙ]^_`abcdmfœžãŸ & €|€~#@k`€#@D#@@€k×}ㄇÅ£op‹Ê³sþ€v€s€€€tØ}ă„…‡ÅªÇ†‡Ê&°Í!þ€'€y€x€€k€$ÕÕÖרٴ۵݀#€‚€€ YgridColorÓÖáÙ㺀#D0.5Ò78¼¾¥½¬­®;[NSTableView[NSTableView_{{1, 1}, {353, 113}}ÕÕÖרÙÚÛÃÝ€#€"€†€ _controlBackgroundColorÒ78ÇȤÈ­®;ZNSClipViewÚ`ÊaceËfÌÏÐÑÒôÔÖXNSTargetXNSActionYNSPercent€g€g€‹€‰ÿÿÿÿ€€e€Š€g#?é_{{-22, 1}, {11, 125}}\_doScroller:Ò78ÚÛ¥Û¬­®;ZNSScrollerÚ`ÊaceËfÌÏàáâôÔæ€g€g€‹€€e€Š€g#?ï±û _{{-100, -100}, {345, 11}}_{{4, 5}, {355, 115}}Ò78êë¤ë­®;\NSScrollViewØ`abcdefï»ïðñmôï€d€(€‘€’ €e€d_{{1, 128}, {358, 70}}Ø}ă„…‡Å÷ÇÈúÊýÍþ€'€€“€€@€$_ºAnonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this. This is the information that would be sent:Z{362, 205}Ò78¤­®;\NSCustomView\moreInfoViewÔXYZ[/ €€€V€›_toggleMoreInfo:ÔXYZµ/€*€V€€^moreInfoButtonØXYZ/YNSKeyPathYNSBindingYNSOptions_NSNibBindingConnectorVersion€¦€€¡€ €V€Ÿ€¢_hidden: shouldAskAboutProfileVhidden_shouldAskAboutProfileÓ!>"#%WNS.keys€¥¡$€£¡&€¤_NSValueTransformerName_NSNegateBooleanÒ78*+¢+;\NSDictionaryÒ78-0£./;_NSNibBindingConnector^NSNibConnector_NSNibBindingConnectorØXYZ-8€¦€€¡€ €=€Ÿ€¨Ó!>";=€¥¡$€£¡&€¤×XYZBC.E€¦€€¬€«€H€ª[value: iconUvalueTicon×XYZLC¶O€¦€€¯€«€€®_value: promptDescription_promptDescription×XYZTUV[X€¦€±€¼€»€}€ºØZ[\]^_`mbmdemmm_NSFilterRestrictsInsertion_NSPreservesSelection__NSManagedProxy^NSDeclaredKeys_"NSClearsFilterPredicateOnInsertion_NSSelectsInsertedObjects_NSAvoidsEmptySelection €¹ €·€² Ò>Fk€Y¤lmno€³€´€µ€¶ZvisibleKey\visibleValue\displayValueZdisplayKeyÑu€¸Ò78wy¢x;__NSManagedProxy__NSManagedProxyÒ78{¤|}~;_NSArrayController_NSObjectController\NSController_NSArrayController_#value: arrangedObjects.displayValueUvalue_arrangedObjects.displayValueØXYZ†C-‰Š€¦€€¿€«€=€¾€À_value: shouldSendProfile_shouldSendProfileÓ!>"’€¥¢‘€Á€Â¢“”€Ã€Ä_NSNullPlaceholder_NSValidatesImmediately ×XYZ›œTž€¦€€È€Ç€±€Æ_+contentArray: systemProfileInformationArray\contentArray_systemProfileInformationArray×XYZT¥VZ¨€¦€±€Ë€»€q€Ê_!value: arrangedObjects.displayKey_arrangedObjects.displayKeyÒ>¬­€Ô¯iž.+¶-Zï&*h¼T]/À[€w€€H€7€€=€q€d€k€€2€g€,€ €Í€±€ €V€Ï€}Ò23Ä€€Î]NSApplicationÓ]ÇÈÉm_NSAppliesImmediately€Ó€Ð Ò>FÍ€Y¢ÎπрÒ_SUIncludeProfile_SUSendProfileInfoÒ78ÓÖ£ÔÕ;_NSUserDefaultsController\NSController_NSUserDefaultsControllerÒ78ØÝ¢Ý;Ò>¬Û€Ô¯Z[hhhh&ïhïhh&€q€}€ € € € €k€€g€d€ €d€€,€€€ € €€kÒ>¬ò€Ô¯iž.+¶-Zï&*h¼T]/À[€w€€€H€7€€=€q€d€k€€2€g€,€ €Í€±€ €V€Ï€}Ò>¬ €Ô¯   €Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€â€ã€ä€å€æ€ç€è€é€ê€ë€ì_Text Field Cell (Text Cell)_Text Field Cell (Text Cell)-1\File's Owner_Image View (NSApplicationIcon)_.Static Text (Check for updates automatically?)_Static Text (DO NOT LOCALIZE)_,Check Box (Include anonymous system profile)\Table Column\MoreInfoViewZTable View_ÈStatic Text (Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this. This is the information that would be sent:)_Push Button (Don't Check)_!Bordered Scroll View (Table View)\Profile Info\Content View[Application_Array Controller_!Push Button (Check Automatically)ZDisclosure_User Defaults Controller^Table Column-1Ò>¬7€Ô Ò>¬:€Ô Ò>¬=€Ô¯$iNžL.+¶QV-ZIï&SKJ*HORUTMPh¼T]/À[€w€œ€€€c€H€7€€©€É€=€q€€d€k€°€b€+€€2€g€ €,€ž€­€Å€½€š€§€ €Í€±€ €V€Ï€}Ò>¬d€Ô¯$efghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ€ñ€ò€ó€ô€õ€ö€÷€ø€ù€ú€û€ü€ý€þ€ÿ     +„-•% !‚®"*…')­‘~.(‹¡”ƒÿÿÿÿÿÿÿý G1,Ò>F®€Y Ò>¬±€Ô Ò>¬´€Ô Ò78¶·¢·;^NSIBObjectData"'1:?DRTfœ¢íôû 7EQ]kv„ ®ÁÓí÷   !#%(*,5ACE`ir}‚‘š­¶ÁÃÄÍÔáçðò!#%')+-/1BPYacegiŽ ¨¯¸ÂË×Ýßáãåèéëíï #%'),.02K„¦»ÊÝïú$1?HJLNPRTVXZ_h~–¦¨±³¶ÃÌÑØÙÛäíú"+5<HV_f~ž ¢¤¦ÇÉËÍÏÒÓÕ×ð  % 1 6 8 : < > @ E G Y j l u w z — ¤ ° ¾ À Â Ä Æ È Ï Ü é ñ ó õ    , . 0 2 4 G T V Y b k } Š ‘ š ¥ ± È Ñ Ø ï þ      H U b p z ˆ • Ÿ ± Å Ï Û Ý ß á ã è ê ì î ð ò ô   ! # , 5 < N W ` b g p r ƒ … ‡ ‰ ‹ ° ² ´ ¶ ¸ » ¼ ¾ À Ù         ! # % * 3 ? A b d f h j m n p r Œ ­ ² ´ ¶ ¸ º ¼ Á à æ ÷ ù<>@BDGHJLež¬µ·¹»½¿ÁÃÅÇÉÎÓö )27JS_acluz¹ÄÐÒÔÖ×ÙÛÞßáãìîûýÿ#?s‹¬Éà $)+-/45BDFH\elxˆ“ŸÀÂÄÆÈËÌÎÐç!#%')+-/4=FM\dox—¢¿ÈÍàçøúüþ>JLNPSUWY[]fhmoq¦²»ÈÔâðòôöøûý&(/135blv€‚„†ˆŠ‘“•— ¢¥§ö"7D^z•¡ÀÏÛÝßèêëíöÿ   #468:=T]ft‚‹’”–»Ê×ßêù )+4=?\acegikxz†›Ÿ¡£µ¾ÉÝêñ&+-/135:<F[]_acy†ˆ‹”™§ÌÍÏÑÚÜåîð =BDFHJLQShjlnpz‡‰Ž—¢®ºÑæèêìî$MV_ikmoqt}ƒŒ¤±ºÅÐùûýÿ   2IR[h‰‹‘”•—™±Ò×ÙÛÝßáæè¥°¹ÂÏÜíïñóõ /PZdn‘“•—™›»ÂÚçïñôöùû&/4AJQix±³µ·¹»½¿ÌÎÑÓÖØõ÷ùûýÿ 579;=?A\p‘“•—™º×î  4 O h i k l n p q r s | ~ ‡ ‰ ‹ š § ´ ¿ Ä Æ Ï Ô æ ø!! !!3!@!T!z!€!Ÿ!À!Â!Ä!Æ!È!Ê!Ì!Î!é!ý" " """""""2"K"L"i"k"m"o"q"s"u"£"°"Ð"í"ï"ñ"ó"õ"÷"ù##:#C#E#p#r#t#v#x#z#|#~#€#‚#„#†#ˆ#Š#Œ#Ž##’#”#–#˜#¡#£#¥#³#À#×#Ù#Û#Ü#å#ç#ì#î#ð$$$ $'$B$O$j$s$x$$ƒ$®$°$²$´$¶$¸$º$¼$¾$À$Â$Ä$Æ$È$Ê$Ì$Î$Ð$Ò$Ô$Ö$ß$á%%%%%%%%%% %"%$%&%(%*%,%.%0%2%4%6%8%A%C%p%r%t%v%x%z%|%~%€%‚%„%†%ˆ%Š%Œ%Ž%%’%”%–%˜%š%¸%Ø%å&&7&W&†&“& &«'v'’'¶'Ã'Ð'Ü'ï(((9(H(Q(S(T(](_(`(i(k(¶(¸(º(¼(¾(À(Â(Ä(Æ(È(Ê(Ì(Î(Ð(Ò(Ô(Ö(Ø(Ú(Ü(Þ(à(â(ä(æ(è(ê(ì(î(ð(ò(ô(ö(ø(ú(ü(þ)) )T)V)X)Z)\)^)`)b)d)f)h)j)l)n)p)r)u)x){)~))„)‡)Š)))“)–)™)œ)Ÿ)¢)¥)¨)«)®)±)³)µ)·)¹)»)½)¿)Á)Ã)Å)Ç)É)Ë)Í)Ï)Ñ)Ó)Õ)×)Ù)Û)Ý)ß)á)ã)å)ç)é)ë)ô)ö)ø)ú)ü)þ** * *****!*"*+*0¸*?transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000031212442116655031127 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239405.258947955 30 atime=1418239405.258947955 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.n0000644000175000017500000000253612442116655035237 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController ACTIONS finishPrompt id toggleMoreInfo id CLASS SUUpdatePermissionPrompt LANGUAGE ObjC OUTLETS delegate id descriptionTextField NSTextField moreInfoButton NSButton moreInfoView NSView SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/PaxHeader0000644000000000000000000000013212442116655031127 xustar0030 mtime=1418239405.257947938 30 atime=1418239405.257947938 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nib0000644000175000017500000000110112442116655035033 0ustar00mikedldmikedld00000000000000 IBFramework Version 670 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 6 41 IBSystem Version 10A96 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/PaxHeaders.4960/SUUpdateAlert.nib0000644000000000000000000000013212442116655027430 xustar0030 mtime=1418239405.165946361 30 atime=1418239404.930942334 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116655031132 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdateAlert.nib/PaxHeaders.4960/keye0000644000000000000000000000013212442116655030365 xustar0030 mtime=1418239405.164946344 30 atime=1418239405.164946344 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nib0000644000175000017500000002457712442116655034316 0ustar00mikedldmikedld00000000000000bplist00Ô X$versionT$topY$archiverX$objects† Ñ]IB.objectdata€_NSKeyedArchiver¯ò 156<=AEW_y‚’“”•–—˜™š›œžŸ  ¡¢¨³´µ¶·¸¹½ÁÇÈÌÑÜåæÿ    :;<=AEQ]fghijuz{|ƒ†› ¡«¬­²µº»¾ÃÆÏÐÙÚßèéö÷ø&*.23567>CHILOR[\ejst‚†‡Š ‹ŒŽ‘’—˜ž£¤©ª´¸½¾¿ÀÅÌÍÎÕÖ×Þßàéêëìòóôöþÿ"478:L^pqrstuvwxyz{|}~‚…§ÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâ¨ãäåæéìïU$nullß  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValues€€ñ€¶€Í€ð€€»€€Ì€Î€¼€î€€€º€ï§€ÏÒ234[NSClassName€€]SUUpdateAlertÒ789:X$classesZ$classname¢:;^NSCustomObjectXNSObject_IBCocoaFrameworkÒ>?@ZNS.objects€ Ò78BC£CD;\NSMutableSetUNSSetÒ>FG€p¯HIJKLMNOPQRSTUV€ €,€:€Ž€€’€”€–€€ €£€¦€®€²€´ÔXYZ[\^]NSDestinationXNSSourceWNSLabel€+€ €€*Ý`abcdefghijklmnopqrstuvlx_NSNextResponderWNSFrameZAllowsUndo[Preferences[NSDragTypesXNSvFlagsYGroupName_UseBackForwardListXNSWindowYFrameName[NSSuperview]NSNextKeyView€ €)€ €€ €€€€ €×`azehj{|}~u{ZNSSubviews€m€r€q€o€€mÒ>?„€­…†‡ˆ‰Š‹ŒŽ‘€ €€€€€€€€€€€€Zpublic.url_NeXT RTFD pasteboard type_NSStringPboardType_NeXT TIFF v4.0 pasteboard type_Apple URL pasteboard type_WebURLsWithTitlesPboardType_!Apple Web Archive pasteboard type_public.url-name_Apple HTML pasteboard type_NSFilenamesPboardType_NSColor pasteboard type_Apple PICT pasteboard type_*NeXT Rich Text Format v1.0 pasteboard type_{{-1, 0}, {456, 197}}PPÓ£¤¥v§ZIdentifierVValues€(€€ Ó©>ª«¯WNS.keys€'£¬­®€!€"€#£°±²€$€%€&_WebKitDefaultFixedFontSize_WebKitMinimumFontSize_WebKitDefaultFontSize  Ò78º»£»¼;_NSMutableDictionary\NSDictionaryÒ78¾À¢¿;^WebPreferences^WebPreferencesÒ78ÂÆ¤ÃÄÅ;WWebViewVNSView[NSResponderWWebView_releaseNotesViewÒ78ÉÊ£ÊË;_NSNibOutletConnector^NSNibConnectorÔXYZÍÏЀ9€€-€8Ø`aÒeÓhjÔÕÖרouÔVNSCellYNSEnabled€.€7€/€0! €€.×`zeÝhju|àáâuä[NSFrameSize€€r€A€‡€€ˆ_{{445, 12}, {127, 32}}Ýçèéêëìíîïðñòóôvö·÷øù÷Ïüýþ[NSCellFlags_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSAlternateImage_NSKeyEquivalentZNSContentsYNSSupport]NSControlView_NSPeriodicDelay\NSCellFlags2]NSButtonFlagsÿÿÿÿ„þ€6€€2€5€1€2€-Èÿÿÿÿ†‚@ÿ^Install UpdateÔVNSSizeVNSNameXNSfFlags€4#@*€3\LucidaGrandeÒ78  ¢ ;VNSFontQ Ò78¤;\NSButtonCell\NSActionCellVNSCellÒ78¥ÄÅ;XNSButtonYNSControl^installUpdate:Ò78£;_NSNibControlConnector^NSNibConnectorÔXYZ[€+€€;€Ý!"#$%&'()*+,Ô./v123456789\NSWindowView\NSScreenRect_NSFrameAutosaveName]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass€.€Œ€‰€€=ÿÿÿÿðx€>€<€‹€Š€?_{{248, 468}, {586, 370}}_Software UpdateXNSWindowÒ>?@YNS.string€@TViewÒ78BC£CD;_NSMutableStringXNSStringÒ>FG€p©HIJKLÏ{OP€B€O€^€c€h€-€m€|€€Ú`aRÒdeÓhjÔTUoWXYouÔZNSEditable€.€N€G €H€C €€.Ò>?_€¦`abŽˆ€D€E€F€€€_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_{{24, 291}, {64, 64}}ØçkílmñnopqrqqstWNSStyleWNSAlignWNSScaleZNSAnimatesþ€M€IÓ2vwxy^NSResourceName€L€J€KWNSImage_NSApplicationIconÒ78}~¢~;_NSCustomResourceÒ78€£‚;[NSImageCellVNSCellÒ78„…¥…ÄÅ;[NSImageViewØ`aÒeÓhjÔˆ‰Š‹ouÔ€.€]€P€Q €€._{{106, 338}, {443, 17}}Øç‘íîïñ’“”•v—I™š_NSBackgroundColor[NSTextColorþ€\€T€€R€O@€YÔžŸ€4#@*€S_LucidaGrande-BoldÕ¢£¤¥¦§¨©ªWNSColor\NSColorSpace[NSColorName]NSCatalogName€X€W€V€UVSystem\controlColorÓ£®¦°±WNSWhite€XK0.66666669Ò78³´¢´;WNSColorÕ¢£¤¥¦·¨¸ª€X€[€Z€U_controlTextColorÓ£®¦°½€XB0Ò78¿À¤ÀÁÂ;_NSTextFieldCell\NSActionCellVNSCellÒ78ÄÅ¥ÅÄÅ;[NSTextFieldØ`aÒeÓhjÔˆÉÊËouÔ€.€]€_€` €€._{{106, 280}, {443, 14}}Øç‘íîïñ’Ñ”•ÔÕJךþ€\€T€a€b€^@€Y^Release Notes:ÔÜžÞ€4#@&€S Ø`aÒeÓhjÔÕâãäouÔ€.€7€d€e! €€._{{299, 12}, {146, 32}}Ýçèéêëìíîïðñòêôví·÷ïð÷Kóôõþ€6€€2€g€f€2€cÈÿÿÿÿ†‚@ÿ_Remind Me LaterQØ`aÒeÓhjÔÕûüýouÔ€.€7€i€j €€._{{103, 12}, {149, 32}}Ýçèéêëìíîïðñòôv·÷ ÷L  þ€6€€2€l€k€2€hÈÿÿÿÿ†‚@ÿ_Skip This VersionÒ>?€@PÞ`azehjÔ°t !·u#qÔlYNSBoxType[NSTitleCell]NSTransparent\NSBorderTypeYNSOffsets_NSTitlePosition]NSContentView€.€{€u€s€n€€t€.€ Ò>F(€p¡l€ Ò>F,€p¡\€ Ò78/0£01;^NSMutableArrayWNSArray_{{1, 1}, {455, 197}}Ò784Ä£ÄÅ;_{{109, 76}, {457, 199}}V{0, 0}×ç‘íîñ’8”:v<q=þ€\€w€€v€zÔ@B€4#@&€3Õ¢£¤¥¦E¨Fª€X€y€x€U_textBackgroundColorÓ£®¦°K€XB1Ó£®¦°N€XM0 0.80000001Ò78PQ¤QÄÅ;UNSBoxØ`aÒeÓhjÔˆUVWouÔ€.€]€}€~ €€._{{106, 302}, {463, 28}}Øç‘íîïñ’]”•vaOcšþ€\€T€€€|@€YÔgi€4#@&€3 Ø`aÒeÓhjÔÕmnoouÔ€.€7€€‚ €€._{{106, 50}, {442, 16}}Ýçèéêëìíîïðñòuôvx6yv{aP~€þ€6€€„€€ƒ€€€ÈHíîð€­¡¡ñ€¬_NSValueTransformerName_NSNegateBooleanÒ78õ¼¢¼;ØX«¬YZá­®ùåJüý6€œ€€°€¨€^€¯€±_hidden: showsReleaseNotes_showsReleaseNotesÓ©>퀭¡¡ñ€¬ØX«¬YZá­®ùå{ü 6€œ€€°€¨€m€¯€³Ó©>퀭¡¡ñ€¬ØX«¬YZá­®ùå\ü6€œ€€°€¨€ €¯€µÓ©>í €­¡¡ñ€¬Ò>#$€¹¯K\¯OlJHÏ.I{ÔLP€c€ €—€|€ €;€^€B€-€·€O€m€.€h€€Ò236€€¸]NSApplicationÒ7891¢1;Ò>#<€¹¯ÔlÔ{ÔÔÔÔÔÔÔ€.€ €€.€m€€.€.€.€€.€.€;€.€.Ò>#N€¹¯K\¯OJHÏ.I{ÔLP€c€ €—€|€;€€^€B€-€·€O€m€.€h€€Ò>#`€¹¯abcdefghijklmno€½€¾€¿€À€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë_Push Button (Remind Me Later)XWeb View_Shared Defaults[Static Text_Update Alert (release notes)\File's Owner_Static Text (Release Notes:)_Image View (NSApplicationIcon)_Push Button (Install Update)[Application]Static Text-1SBox\Content View_Push Button (Skip This Version)_DCheck Box (Automatically download and install updates in the future)Ò>#€¹ Ò>#„€¹ Ò>#‡€¹¯K\LPVIÏ.I{KMURL¯JOlHJHNTSÔQPO€c€ €€;€€€´€,€-€·€O€m€Ž€’€²€£€h€—€:€|€ € €^€B€”€®€¦€.€ €€€–Ò>#©€¹¯ª«¬­®²°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇȀЀрҀӀԀ&€Õ€Ö€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€â€ã€ä€å€æ€ç€è€é€ê€ë€ì€í!¥¡MLÿÿÿÿÿÿÿý Y"E¤g]2e¦ iH u‡Ò>Fè€p Ò>#뀹 Ò># Ò78ðñ¢ñ;^NSIBObjectData"'1:?DRTfMSž¥¬ºÌèö'5Q_r„ž¨µ·¹»½¿ÁÃÅÇÉËÍÏÑÓÕ×Ùâîðò "1:MVacdmt‡’³µ·¹»½¿ÁÃÅÇÉËÍÏÑâðù >PXco{„Ž£¬¶ÂÐÒÔÖ×ÙÛÞàáãåçé )+FHJLNPRTVXZ\^`k‡œ½Ù÷-Jb|™ÆÞßàíøÿ#%')0246Skƒ…‡‰’™¯¼ÅÊÙèñú    0 9 @ W f w y { }    § ± ³ µ · ¹ ¼ ½ ¿ Á Þ ê ì î ð ó õ ÷ ù  G S i ~   ² ½ Ç Õ ç ô          " + : K R Y b d m o r  ˆ ” – Ÿ ¨ µ Â É Ò Ý æ ð ÿ   ' 6 G I K M O „ ‘ ž ´ Â Ì Ú ç ñ   ! - / 1 3 5 7 @ B D F H J L N i { „ — ™ ž § ® À É Ò Ô ç é ë í ï ñ ó õ ÷ ù"-/13468;<>@IKXZ\^`bd€œÐè !,1357<=JY[]_g{„‰œ¥¬¸¿ÈÓß  *K_kprtvxz’”Ÿ¢¶ËÓàìúüþ %-/1=FKShjlnpƒ’•ž§¹ÆÍÖáí8Y^`bdfhmo~‘šœŸÀÂÄÆÈËÌÎÐé#%')+-/135:CUWxz|~€ƒ„†ˆ¡ÖÛÝßáãåçéëíòûT^jx…¡¯±³µ·¸º½¿ÁÃÅÎÐÓÕÞàãåîõ #,3MTqvxz|~€‘“œž µ·¹»½Óàâåòô ;=?ACFGIKe†‹‘“•šœ­¯¸º½Þàâäæéêìî<ACEGIKMOQSX]˜¡­¯±ºÃÈÞé )27JSdfhjl{ŒŽ’”§¸º¼¾ÀÇØÚÜÞàì <>@BDFHQdfgpw’Ÿºàæ-<Tqsuwy{}š·¹»½¿ÁÃÜî  0Bcmoqsuwy{œ£¼ÉËÎÐÓÕî /13579;=Ymz|„†§©«­¯±³µÂÄÇÉÌÎïñóõ÷ùûý  !BDFHJLNPRTVXZ\^`ikm{„‰’”µ·¹»½¿ÁÃÅÇÉËÍÏÑÓÜÞÿ   &(IKMOQSUWY[]_aceg‡¢®ÍÚù9ESWd†ÍÖØÙâäåîð 1 3 5 7 9 ; = ? A C E G I K M O Q S U W Y [ ] _ a c e g i k m o x z » ½ ¿ Á Ã Å Ç É Ë Í Ï Ñ Ó Õ × Ù Û Ý ß á ã å ç é ë í ï ñ ó õ ÷ ù û ý ÿ!!!!! !!!!!!!! !"!$!&!(!*!,!.!0!2!4!6!8!:!C!E!F!O!Q!R![!]!^!g!lò!{transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdateAlert.nib/PaxHeaders.4960/clas0000644000000000000000000000013212442116655030352 xustar0030 mtime=1418239405.164946344 30 atime=1418239405.164946344 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdateAlert.nib/classes.nib0000644000175000017500000000277412442116655033273 0ustar00mikedldmikedld00000000000000 IBClasses CLASS SUWindowController LANGUAGE ObjC SUPERCLASS NSWindowController CLASS NSApplication LANGUAGE ObjC SUPERCLASS NSResponder ACTIONS installUpdate id remindMeLater id skipThisVersion id CLASS SUUpdateAlert LANGUAGE ObjC OUTLETS delegate id description NSTextField releaseNotesView WebView SUPERCLASS SUWindowController CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject CLASS NSObject LANGUAGE ObjC IBVersion 1 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdateAlert.nib/PaxHeaders.4960/info0000644000000000000000000000013212442116655030363 xustar0030 mtime=1418239405.164946344 30 atime=1418239405.164946344 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000105212442116655032555 0ustar00mikedldmikedld00000000000000 IBFramework Version 670 IBLastKnownRelativeProjectPath ../Sparkle.xcodeproj IBOldestOS 5 IBOpenObjects 18 IBSystem Version 10A96 targetFramework IBCocoaFramework transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/PaxHeaders.4960/Sparkle.strings0000644000000000000000000000013212442116655027270 xustar0030 mtime=1418239405.257947938 30 atime=1418239405.257947938 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/Sparkle.strings0000644000175000017500000002003012442116655030710 0ustar00mikedldmikedld00000000000000þÿ/* No comment provided by engineer. */ "%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?" = "%1$@ %2$@ has been downloaded and is ready to use! Would you like to install it and relaunch %1$@ now?"; /* No comment provided by engineer. */ "%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again." = "%1$@ can't be updated when it's running from a read-only volume like a disk image or an optical drive. Move %1$@ to your Applications folder, relaunch it from there, and try again."; /* No comment provided by engineer. */ "%@ %@ is currently the newest version available." = "%1$@ %2$@ is currently the newest version available."; /* No comment provided by engineer. */ "%@ %@ is now available--you have %@. Would you like to download it now?" = "%1$@ %2$@ is now available you have %3$@. Would you like to download it now?"; /* No comment provided by engineer. */ "%@ downloaded" = "%@ downloaded"; /* No comment provided by engineer. */ "%@ of %@" = "%1$@ of %2$@"; /* No comment provided by engineer. */ "A new version of %@ is available!" = "A new version of %@ is available!"; /* No comment provided by engineer. */ "A new version of %@ is ready to install!" = "A new version of %@ is ready to install!"; /* No comment provided by engineer. */ "An error occurred in retrieving update information. Please try again later." = "An error occurred in retrieving update information. Please try again later."; /* No comment provided by engineer. */ "An error occurred while downloading the update. Please try again later." = "An error occurred while downloading the update. Please try again later."; /* No comment provided by engineer. */ "An error occurred while extracting the archive. Please try again later." = "An error occurred while extracting the archive. Please try again later."; /* No comment provided by engineer. */ "An error occurred while installing the update. Please try again later." = "An error occurred while installing the update. Please try again later."; /* No comment provided by engineer. */ "An error occurred while parsing the update feed." = "An error occurred while parsing the update feed."; /* No comment provided by engineer. */ "An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@." = "An error occurred while relaunching %1$@, but the new version will be available next time you run %1$@."; /* the unit for bytes */ "B" = "B"; /* No comment provided by engineer. */ "Cancel" = "Cancel"; /* No comment provided by engineer. */ "Cancel Update" = "Cancel Update"; /* No comment provided by engineer. */ "Checking for updates..." = "Checking for updates &"; /* Take care not to overflow the status window. */ "Downloading update..." = "Downloading update &"; /* Take care not to overflow the status window. */ "Extracting update..." = "Extracting update &"; /* the unit for gigabytes */ "GB" = "GB"; /* No comment provided by engineer. */ "Install and Relaunch" = "Install and Relaunch"; /* Take care not to overflow the status window. */ "Installing update..." = "Installing update &"; /* the unit for kilobytes */ "KB" = "KB"; /* the unit for megabytes */ "MB" = "MB"; /* No comment provided by engineer. */ "OK" = "OK"; /* No comment provided by engineer. */ "Ready to Install" = "Ready to Install"; /* No comment provided by engineer. */ "Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu." = "Should %1$@ automatically check for updates? You can always check for updates manually from the %1$@ menu."; /* No comment provided by engineer. */ "Update Error!" = "Update Error!"; /* No comment provided by engineer. */ "Updating %@" = "Updating %@"; /* No comment provided by engineer. */ "You already have the newest version of %@." = "You already have the newest version of %@."; /* No comment provided by engineer. */ "You're up-to-date!" = "You're up-to-date!"; transmission-2.92/macosx/Sparkle.framework/PaxHeaders.4960/Versions0000644000000000000000000000013212442116661022303 xustar0030 mtime=1418239409.651023221 30 atime=1418239400.858872552 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/0000755000175000017500000000000012442116661024005 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/PaxHeaders.4960/Current0000644000000000000000000000013212442116661023725 xustar0030 mtime=1418239409.563021713 30 atime=1418239400.858872552 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/Current/0000755000175000017500000000000012442116661025427 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/PaxHeaders.4960/Sparkle0000644000000000000000000000013212442116654025330 xustar0030 mtime=1418239404.008926534 30 atime=1418239404.007926516 30 ctime=1457295922.540851111 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Sparkle0000755000175000017500000000000012442116654040301 1transmission-2.92/macosx/Sparkle.framework/Sparkleustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/PaxHeaders.4960/Headers0000644000000000000000000000013212442116661025300 xustar0030 mtime=1418239409.649023186 30 atime=1418239409.563021713 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Headers/0000755000175000017500000000000012442116661027002 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Headers/PaxHeaders.4960/Sparkle.h0000644000000000000000000000013212442116661027127 xustar0030 mtime=1418239409.648023169 30 atime=1418239409.648023169 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Headers/Sparkle.h0000644000175000017500000000000012442116661043676 1transmission-2.92/macosx/Sparkle.framework/Headers/Sparkle.hustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Headers/PaxHeaders.4960/SUVersionCompari0000644000000000000000000000013212442116661030510 xustar0030 mtime=1418239409.647023152 30 atime=1418239409.647023152 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Headers/SUVersionComparisonProtocol.h0000644000175000017500000000000012442116661054020 1transmission-2.92/macosx/Sparkle.framework/Headers/SUVersionComparisonProtocol.hustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Headers/PaxHeaders.4960/SUAppcastItem.h0000644000000000000000000000013212442116661030210 xustar0030 mtime=1418239409.648023169 30 atime=1418239409.648023169 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Headers/SUAppcastItem.h0000644000175000017500000000000012442116661046040 1transmission-2.92/macosx/Sparkle.framework/Headers/SUAppcastItem.hustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Headers/PaxHeaders.4960/SUAppcast.h0000644000000000000000000000013212442116661027371 xustar0030 mtime=1418239409.649023186 30 atime=1418239409.649023186 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Headers/SUAppcast.h0000644000175000017500000000000012442116661044402 1transmission-2.92/macosx/Sparkle.framework/Headers/SUAppcast.hustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Headers/PaxHeaders.4960/SUUpdater.h0000644000000000000000000000013212442116661027402 xustar0030 mtime=1418239409.648023169 30 atime=1418239409.648023169 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Headers/SUUpdater.h0000644000175000017500000000000012442116661044424 1transmission-2.92/macosx/Sparkle.framework/Headers/SUUpdater.hustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/PaxHeaders.4960/Resources0000644000000000000000000000013212442116661025677 xustar0030 mtime=1418239409.264016589 30 atime=1418239403.867924117 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/0000755000175000017500000000000012442116661027401 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/PaxHeaders.4960/fr.lproj0000644000000000000000000000013112442116657027437 xustar0030 mtime=1418239407.180980892 29 atime=1418239406.36796696 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/0000755000175000017500000000000012442116657031142 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/PaxHeaders.4960/SUAut0000644000000000000000000000031512442116656030443 xustar00116 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/ 29 mtime=1418239406.43096804 30 atime=1418239406.368966977 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUAutomaticUpdateAler0000755000175000017500000000000012442116656035227 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUAutomaticUpdateAler0000644000000000000000000000052312442116656031163 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 132 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 29 mtime=1418239406.43096804 29 atime=1418239406.43096804 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116656060247 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUAutomaticUpdateAler0000644000000000000000000000032712442116656031165 xustar00127 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nib 29 mtime=1418239406.43096804 29 atime=1418239406.43096804 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116656060163 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUAutomaticUpdateAler0000644000000000000000000000032312442116656031161 xustar00124 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nib 29 mtime=1418239406.43096804 29 atime=1418239406.43096804 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116656057461 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000031712442116657030445 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239407.181980909 29 atime=1418239406.51796953 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdatePermissionPro0000755000175000017500000000000012442116657035307 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdatePermissionPro0000644000000000000000000000053112442116657031242 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 134 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239407.181980909 30 atime=1418239407.180980892 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116657060414 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdatePermissionPro0000644000000000000000000000051712442116657031246 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib 129 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239407.181980909 30 atime=1418239407.181980909 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116657060344 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdatePermissionPro0000644000000000000000000000033012442116657031237 xustar00126 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239407.180980892 30 atime=1418239407.180980892 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116657060155 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000013212442116656030437 xustar0030 mtime=1418239406.515969496 30 atime=1418239406.431968057 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116656034372 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000032512442116656030777 xustar00123 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239406.515969496 30 atime=1418239406.515969496 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdateAlert.nib/key0000644000175000017500000000000012442116656057206 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000032012442116656030772 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239406.515969496 30 atime=1418239406.515969496 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdateAlert.nib/cla0000644000175000017500000000000012442116656056137 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000031512442116656030776 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdateAlert.nib/info.nib 30 mtime=1418239406.514969479 30 atime=1418239406.514969479 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/SUUpdateAlert.nib/inf0000644000175000017500000000000012442116656055452 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/PaxHeaders.4960/Spark0000644000000000000000000000013112442116657030517 xustar0030 mtime=1418239407.180980892 30 atime=1418239407.180980892 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr.lproj/Sparkle.strings0000644000175000017500000000000012442116657052675 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/PaxHeaders.4960/sv.lproj0000644000000000000000000000013212442116661027454 xustar0030 mtime=1418239409.262016554 30 atime=1418239408.469002965 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/0000755000175000017500000000000012442116661031156 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/PaxHeaders.4960/SUAut0000644000000000000000000000031612442116660030460 xustar00116 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/ 30 mtime=1418239408.538004147 30 atime=1418239408.470002982 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUAutomaticUpdateAler0000755000175000017500000000000012442116660035243 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUAutomaticUpdateAler0000644000000000000000000000052512442116660031201 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 132 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239408.538004147 30 atime=1418239408.538004147 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116660060304 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUAutomaticUpdateAler0000644000000000000000000000033112442116660031174 xustar00127 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/classes.nib 30 mtime=1418239408.538004147 30 atime=1418239408.538004147 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116660060220 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUAutomaticUpdateAler0000644000000000000000000000032612442116660031200 xustar00124 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nib 30 mtime=1418239408.538004147 30 atime=1418239408.538004147 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116660057516 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000032012442116661030453 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239409.263016571 30 atime=1418239408.948011173 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdatePermissionPro0000755000175000017500000000000012442116661035323 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdatePermissionPro0000644000000000000000000000053112442116661031256 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 134 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239409.262016554 30 atime=1418239409.262016554 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116661060451 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdatePermissionPro0000644000000000000000000000051712442116661031262 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib 129 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239409.263016571 30 atime=1418239409.263016571 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116661060401 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdatePermissionPro0000644000000000000000000000033012442116661031253 xustar00126 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239409.262016554 30 atime=1418239409.262016554 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116661060212 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000013212442116660030453 xustar0030 mtime=1418239408.946011139 30 atime=1418239408.539004164 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116660034406 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000032512442116660031013 xustar00123 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239408.946011139 30 atime=1418239408.946011139 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdateAlert.nib/key0000644000175000017500000000000012442116660057243 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000032012442116660031006 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239408.946011139 30 atime=1418239408.946011139 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdateAlert.nib/cla0000644000175000017500000000000012442116660056174 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000031512442116660031012 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdateAlert.nib/info.nib 30 mtime=1418239408.946011139 30 atime=1418239408.946011139 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/SUUpdateAlert.nib/inf0000644000175000017500000000000012442116660055507 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/PaxHeaders.4960/Spark0000644000000000000000000000013212442116661030534 xustar0030 mtime=1418239409.262016554 30 atime=1418239409.262016554 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/sv.lproj/Sparkle.strings0000644000175000017500000000000012442116661052732 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/PaxHeaders.4960/de.lproj0000644000000000000000000000013112442116660027412 xustar0029 mtime=1418239408.46700293 30 atime=1418239407.182980926 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/0000755000175000017500000000000012442116660031115 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/PaxHeaders.4960/SUAut0000644000000000000000000000031612442116660030420 xustar00116 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUAutomaticUpdateAlert.nib/ 30 mtime=1418239408.073996196 30 atime=1418239407.182980926 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUAutomaticUpdateAler0000755000175000017500000000000012442116660035203 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUAutomaticUpdateAler0000644000000000000000000000052512442116660031141 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 132 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239408.073996196 30 atime=1418239408.073996196 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116660060204 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUAutomaticUpdateAler0000644000000000000000000000033112442116660031134 xustar00127 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nib 30 mtime=1418239408.073996196 30 atime=1418239408.073996196 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116660060120 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUAutomaticUpdateAler0000644000000000000000000000032612442116660031140 xustar00124 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nib 30 mtime=1418239408.072996178 30 atime=1418239408.072996178 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116660057416 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000032012442116660030412 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239408.468002948 30 atime=1418239408.270999572 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdatePermissionPro0000755000175000017500000000000012442116660035262 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdatePermissionPro0000644000000000000000000000053112442116660031215 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 134 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239408.468002948 30 atime=1418239408.468002948 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116660060350 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdatePermissionPro0000644000000000000000000000051712442116660031221 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nib 129 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239408.468002948 30 atime=1418239408.468002948 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116660060300 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdatePermissionPro0000644000000000000000000000032712442116660031220 xustar00126 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239408.468002948 29 atime=1418239408.46700293 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116660060111 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000013212442116660030413 xustar0030 mtime=1418239408.268999537 30 atime=1418239408.074996213 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116660034346 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000032512442116660030753 xustar00123 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239408.268999537 30 atime=1418239408.268999537 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdateAlert.nib/key0000644000175000017500000000000012442116660057143 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000032012442116660030746 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239408.268999537 30 atime=1418239408.268999537 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdateAlert.nib/cla0000644000175000017500000000000012442116660056074 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000031312442116660030750 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdateAlert.nib/info.nib 29 mtime=1418239408.26799952 29 atime=1418239408.26799952 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/SUUpdateAlert.nib/inf0000644000175000017500000000000012442116660055407 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/PaxHeaders.4960/Spark0000644000000000000000000000013012442116660030471 xustar0029 mtime=1418239408.46700293 29 atime=1418239408.46700293 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/de.lproj/Sparkle.strings0000644000175000017500000000000012442116660052631 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/PaxHeaders.4960/SUStatus.nib0000644000000000000000000000013212442116654030203 xustar0030 mtime=1418239404.857941083 30 atime=1418239404.729938889 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/SUStatus.nib/0000755000175000017500000000000012442116654031705 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/SUStatus.nib/PaxHeaders.4960/k0000644000000000000000000000013212442116654030435 xustar0030 mtime=1418239404.857941083 30 atime=1418239404.857941083 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/SUStatus.nib/keyedobjects.nib0000644000175000017500000000000012442116654054470 1transmission-2.92/macosx/Sparkle.framework/Resources/SUStatus.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/SUStatus.nib/PaxHeaders.4960/c0000644000000000000000000000013212442116654030425 xustar0030 mtime=1418239404.857941083 30 atime=1418239404.857941083 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/SUStatus.nib/classes.nib0000644000175000017500000000000012442116654052434 1transmission-2.92/macosx/Sparkle.framework/Resources/SUStatus.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/SUStatus.nib/PaxHeaders.4960/i0000644000000000000000000000013212442116654030433 xustar0030 mtime=1418239404.857941083 30 atime=1418239404.857941083 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/SUStatus.nib/info.nib0000644000175000017500000000000012442116654051230 1transmission-2.92/macosx/Sparkle.framework/Resources/SUStatus.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/PaxHeaders.4960/License.txt0000644000000000000000000000013212442116654030101 xustar0030 mtime=1418239404.009926551 30 atime=1418239404.008926534 30 ctime=1457295922.540851111 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/License.txt0000644000175000017500000000000012442116654045620 1transmission-2.92/macosx/Sparkle.framework/Resources/License.txtustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/PaxHeaders.4960/ru.lproj0000644000000000000000000000013112442116656027455 xustar0030 mtime=1418239406.037961305 30 atime=1418239405.711955718 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/0000755000175000017500000000000012442116656031160 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/PaxHeaders.4960/SUAut0000644000000000000000000000031612442116655030462 xustar00116 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/ 30 mtime=1418239405.779956883 30 atime=1418239405.712955735 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUAutomaticUpdateAler0000755000175000017500000000000012442116655035245 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUAutomaticUpdateAler0000644000000000000000000000052512442116655031203 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 132 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239405.779956883 30 atime=1418239405.779956883 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116655060304 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUAutomaticUpdateAler0000644000000000000000000000033112442116655031176 xustar00127 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/classes.nib 30 mtime=1418239405.779956883 30 atime=1418239405.779956883 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116655060220 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUAutomaticUpdateAler0000644000000000000000000000032612442116655031202 xustar00124 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nib 30 mtime=1418239405.779956883 30 atime=1418239405.779956883 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116655057516 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000031712442116656030463 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239406.038961322 30 atime=1418239405.994960568 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdatePermissionPro0000755000175000017500000000000012442116656035325 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdatePermissionPro0000644000000000000000000000053012442116656031257 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 134 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239406.038961322 30 atime=1418239406.038961322 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116656060451 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdatePermissionPro0000644000000000000000000000051612442116656031263 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib 129 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239406.038961322 30 atime=1418239406.038961322 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116656060401 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdatePermissionPro0000644000000000000000000000032712442116656031263 xustar00126 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239406.038961322 30 atime=1418239406.038961322 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116656060212 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000012712442116655030461 xustar0030 mtime=1418239405.891958803 28 atime=1418239405.7809569 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116655034410 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000032412442116655031014 xustar00123 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239405.891958803 30 atime=1418239405.891958803 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdateAlert.nib/key0000644000175000017500000000000012442116655057243 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000031712442116655031016 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239405.891958803 30 atime=1418239405.891958803 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdateAlert.nib/cla0000644000175000017500000000000012442116655056174 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000031412442116655031013 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdateAlert.nib/info.nib 30 mtime=1418239405.891958803 30 atime=1418239405.891958803 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/SUUpdateAlert.nib/inf0000644000175000017500000000000012442116655055507 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/PaxHeaders.4960/Spark0000644000000000000000000000013212442116656030536 xustar0030 mtime=1418239406.037961305 30 atime=1418239406.037961305 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/ru.lproj/Sparkle.strings0000644000175000017500000000000012442116656052732 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/PaxHeaders.4960/da.lproj0000644000000000000000000000013212442116655027413 xustar0030 mtime=1418239405.710955701 30 atime=1418239405.259947972 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/0000755000175000017500000000000012442116655031115 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/PaxHeaders.4960/SUAut0000644000000000000000000000031612442116655030420 xustar00116 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUAutomaticUpdateAlert.nib/ 30 mtime=1418239405.325949103 30 atime=1418239405.260947989 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUAutomaticUpdateAler0000755000175000017500000000000012442116655035203 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUAutomaticUpdateAler0000644000000000000000000000052512442116655031141 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 132 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239405.324949086 30 atime=1418239405.324949086 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116655060200 1transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUAutomaticUpdateAler0000644000000000000000000000052112442116655031135 xustar00117 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUAutomaticUpdateAlert.nib/designable.nib 130 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUAutomaticUpdateAlert.nib/designable.nib 30 mtime=1418239405.325949103 30 atime=1418239405.325949103 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116655060063 1transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUAutomaticUpdateAlert.nib/designable.ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000032012442116655030412 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239405.710955701 30 atime=1418239405.516952376 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUUpdatePermissionPro0000755000175000017500000000000012442116655035262 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUUpdatePermissionPro0000644000000000000000000000053112442116655031215 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 134 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239405.710955701 30 atime=1418239405.710955701 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116655060344 1transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUUpdatePermissionPro0000644000000000000000000000052512442116655031220 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdatePermissionPrompt.nib/designable.nib 132 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUUpdatePermissionPrompt.nib/designable.nib 30 mtime=1418239405.710955701 30 atime=1418239405.710955701 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116655060333 1transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdatePermissionPrompt.nib/designablustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000013212442116655030413 xustar0030 mtime=1418239405.487951879 30 atime=1418239405.325949103 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116655034346 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000032512442116655030753 xustar00123 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239405.487951879 30 atime=1418239405.487951879 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUUpdateAlert.nib/key0000644000175000017500000000000012442116655057137 1transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000032312442116655030751 xustar00121 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUUpdateAlert.nib/designable.nib 30 mtime=1418239405.487951879 30 atime=1418239405.487951879 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/SUUpdateAlert.nib/des0000644000175000017500000000000012442116655056544 1transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdateAlert.nib/designable.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/PaxHeaders.4960/Spark0000644000000000000000000000013212442116655030473 xustar0030 mtime=1418239405.710955701 30 atime=1418239405.709955684 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/da.lproj/Sparkle.strings0000644000175000017500000000000012442116655052625 1transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/PaxHeaders.4960/Info.plist0000644000000000000000000000013212442116654027726 xustar0030 mtime=1418239404.929942317 30 atime=1418239404.929942317 30 ctime=1457295922.540851111 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/Info.plist0000644000175000017500000000000012442116654045272 1transmission-2.92/macosx/Sparkle.framework/Resources/Info.plistustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/PaxHeaders.4960/it.lproj0000644000000000000000000000013212442116654027442 xustar0030 mtime=1418239404.602936713 30 atime=1418239403.870924169 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/0000755000175000017500000000000012442116654031144 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/PaxHeaders.4960/SUAut0000644000000000000000000000031612442116654030447 xustar00116 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUAutomaticUpdateAlert.nib/ 30 mtime=1418239404.010926568 30 atime=1418239403.870924169 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUAutomaticUpdateAler0000755000175000017500000000000012442116654035232 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUAutomaticUpdateAler0000644000000000000000000000052512442116654031170 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 132 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239404.009926551 30 atime=1418239404.009926551 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116654060257 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUAutomaticUpdateAler0000644000000000000000000000033112442116654031163 xustar00127 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nib 30 mtime=1418239404.010926568 30 atime=1418239404.010926568 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116654060173 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUAutomaticUpdateAler0000644000000000000000000000032612442116654031167 xustar00124 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nib 30 mtime=1418239404.009926551 30 atime=1418239404.009926551 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116654057471 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000031712442116654030447 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdatePermissionPrompt.nib/ 29 mtime=1418239404.60393673 30 atime=1418239404.219930149 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdatePermissionPro0000755000175000017500000000000012442116654035311 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdatePermissionPro0000644000000000000000000000053112442116654031244 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 134 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239404.602936713 30 atime=1418239404.602936713 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116654060423 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdatePermissionPro0000644000000000000000000000051512442116654031246 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nib 129 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nib 29 mtime=1418239404.60393673 29 atime=1418239404.60393673 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116654060353 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdatePermissionPro0000644000000000000000000000033012442116654031241 xustar00126 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239404.602936713 30 atime=1418239404.602936713 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116654060164 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000013212442116654030442 xustar0030 mtime=1418239404.218930132 30 atime=1418239404.010926568 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116654034375 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000032512442116654031002 xustar00123 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239404.217930115 30 atime=1418239404.217930115 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdateAlert.nib/key0000644000175000017500000000000012442116654057216 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000032012442116654030775 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239404.218930132 30 atime=1418239404.218930132 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdateAlert.nib/cla0000644000175000017500000000000012442116654056147 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000031512442116654031001 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdateAlert.nib/info.nib 30 mtime=1418239404.217930115 30 atime=1418239404.217930115 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/SUUpdateAlert.nib/inf0000644000175000017500000000000012442116654055462 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/PaxHeaders.4960/Spark0000644000000000000000000000013212442116654030522 xustar0030 mtime=1418239404.602936713 30 atime=1418239404.602936713 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/it.lproj/Sparkle.strings0000644000175000017500000000000012442116654052704 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/PaxHeaders.4960/fr_CA.lproj0000644000000000000000000000013112442116657030002 xustar0030 mtime=1418239407.180980892 29 atime=1418239406.36796696 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/0000755000175000017500000000000012442116657031505 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/PaxHeaders.4960/SU0000644000000000000000000000032012442116656030330 xustar00119 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/ 29 mtime=1418239406.43096804 30 atime=1418239406.368966977 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUAutomaticUpdateA0000755000175000017500000000000012442116656035067 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUAutomaticUpdateA0000644000000000000000000000052612442116656031026 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 135 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 29 mtime=1418239406.43096804 29 atime=1418239406.43096804 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUAutomaticUpdateA0000644000175000017500000000000012442116656060107 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUAutomaticUpdateA0000644000000000000000000000033212442116656031021 xustar00130 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/classes.nib 29 mtime=1418239406.43096804 29 atime=1418239406.43096804 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUAutomaticUpdateA0000644000175000017500000000000012442116656060023 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUAutomaticUpdateA0000644000000000000000000000032612442116656031024 xustar00127 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/info.nib 29 mtime=1418239406.43096804 29 atime=1418239406.43096804 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUAutomaticUpdateA0000644000175000017500000000000012442116656057321 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/PaxHeaders.4960/SU0000644000000000000000000000032212442116657030333 xustar00121 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239407.181980909 29 atime=1418239406.51796953 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdatePermission0000755000175000017500000000000012442116657035171 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdatePermission0000644000000000000000000000053412442116657031127 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 137 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239407.181980909 30 atime=1418239407.180980892 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdatePermission0000644000175000017500000000000012442116657060276 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdatePermission0000644000000000000000000000052212442116657031124 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib 132 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239407.181980909 30 atime=1418239407.181980909 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdatePermission0000644000175000017500000000000012442116657060226 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdatePermission0000644000000000000000000000033312442116657031124 xustar00129 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239407.180980892 30 atime=1418239407.180980892 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdatePermission0000644000175000017500000000000012442116657060037 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/PaxHeaders.4960/SU0000644000000000000000000000013212442116656030331 xustar0030 mtime=1418239406.515969496 30 atime=1418239406.431968057 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116656034735 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdateAlert.nib/0000644000000000000000000000033012442116656030665 xustar00126 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239406.515969496 30 atime=1418239406.515969496 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdateAlert.nib/0000644000175000017500000000000012442116656057040 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdateAlert.nib/0000644000000000000000000000032312442116656030667 xustar00121 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239406.515969496 30 atime=1418239406.515969496 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdateAlert.nib/0000644000175000017500000000000012442116656056022 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdateAlert.nib/0000644000000000000000000000032012442116656030664 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdateAlert.nib/info.nib 30 mtime=1418239406.514969479 30 atime=1418239406.514969479 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/SUUpdateAlert.nib/0000644000175000017500000000000012442116656055320 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/PaxHeaders.4960/Sp0000644000000000000000000000013112442116657030364 xustar0030 mtime=1418239407.180980892 30 atime=1418239407.180980892 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/fr_CA.lproj/Sparkle.strings0000644000175000017500000000000012442116657053240 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/PaxHeaders.4960/SUModelTransla0000644000000000000000000000013212442116654030536 xustar0030 mtime=1418239404.009926551 30 atime=1418239404.009926551 30 ctime=1457295922.540851111 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/SUModelTranslation.plist0000644000175000017500000000000012442116654052762 1transmission-2.92/macosx/Sparkle.framework/Resources/SUModelTranslation.plistustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/PaxHeaders.4960/relaunch0000644000000000000000000000013212442116654027502 xustar0030 mtime=1418239404.856941066 30 atime=1418239404.856941066 30 ctime=1457295922.540851111 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/relaunch0000755000175000017500000000000012442116654044625 1transmission-2.92/macosx/Sparkle.framework/Resources/relaunchustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/PaxHeaders.4960/es.lproj0000644000000000000000000000013112442116656027436 xustar0030 mtime=1418239406.365966926 30 atime=1418239406.039961339 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/0000755000175000017500000000000012442116656031141 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/PaxHeaders.4960/SUAut0000644000000000000000000000031412442116656030442 xustar00116 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUAutomaticUpdateAlert.nib/ 30 mtime=1418239406.188963892 29 atime=1418239406.05696163 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUAutomaticUpdateAler0000755000175000017500000000000012442116656035227 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUAutomaticUpdateAler0000644000000000000000000000052412442116656031164 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 132 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239406.188963892 30 atime=1418239406.188963892 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116656060247 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUAutomaticUpdateAler0000644000000000000000000000033012442116656031157 xustar00127 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUAutomaticUpdateAlert.nib/classes.nib 30 mtime=1418239406.188963892 30 atime=1418239406.188963892 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116656060163 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUAutomaticUpdateAler0000644000000000000000000000032512442116656031163 xustar00124 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nib 30 mtime=1418239406.188963892 30 atime=1418239406.188963892 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116656057461 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000031712442116656030444 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239406.366966943 30 atime=1418239406.251964972 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdatePermissionPro0000755000175000017500000000000012442116656035306 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdatePermissionPro0000644000000000000000000000053012442116656031240 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 134 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239406.366966943 30 atime=1418239406.366966943 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116656060413 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdatePermissionPro0000644000000000000000000000051612442116656031244 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib 129 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239406.366966943 30 atime=1418239406.366966943 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116656060343 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdatePermissionPro0000644000000000000000000000032712442116656031244 xustar00126 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239406.366966943 30 atime=1418239406.366966943 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116656060154 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000013112442116656030436 xustar0030 mtime=1418239406.238964749 30 atime=1418239406.189963909 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116656034372 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000032412442116656030776 xustar00123 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239406.238964749 30 atime=1418239406.238964749 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdateAlert.nib/key0000644000175000017500000000000012442116656057206 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000031712442116656031000 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239406.238964749 30 atime=1418239406.238964749 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdateAlert.nib/cla0000644000175000017500000000000012442116656056137 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000031412442116656030775 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdateAlert.nib/info.nib 30 mtime=1418239406.237964732 30 atime=1418239406.237964732 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/SUUpdateAlert.nib/inf0000644000175000017500000000000012442116656055452 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/PaxHeaders.4960/Spark0000644000000000000000000000013112442116656030516 xustar0030 mtime=1418239406.365966926 30 atime=1418239406.365966926 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/es.lproj/Sparkle.strings0000644000175000017500000000000012442116656052674 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/PaxHeaders.4960/nl.lproj0000644000000000000000000000013212442116661027435 xustar0030 mtime=1418239409.560021661 30 atime=1418239409.264016589 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/0000755000175000017500000000000012442116661031137 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/PaxHeaders.4960/SUAut0000644000000000000000000000031612442116661030442 xustar00116 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/ 30 mtime=1418239409.327017668 30 atime=1418239409.264016589 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUAutomaticUpdateAler0000755000175000017500000000000012442116661035225 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUAutomaticUpdateAler0000644000000000000000000000052512442116661031163 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 132 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239409.326017651 30 atime=1418239409.326017651 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116661060247 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUAutomaticUpdateAler0000644000000000000000000000033112442116661031156 xustar00127 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nib 30 mtime=1418239409.327017668 30 atime=1418239409.327017668 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116661060163 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUAutomaticUpdateAler0000644000000000000000000000032612442116661031162 xustar00124 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nib 30 mtime=1418239409.326017651 30 atime=1418239409.326017651 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116661057461 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000032012442116661030434 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239409.561021678 30 atime=1418239409.454019845 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdatePermissionPro0000755000175000017500000000000012442116661035304 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdatePermissionPro0000644000000000000000000000053112442116661031237 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 134 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239409.561021678 30 atime=1418239409.561021678 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116661060413 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdatePermissionPro0000644000000000000000000000051712442116661031243 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nib 129 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239409.561021678 30 atime=1418239409.561021678 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116661060343 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdatePermissionPro0000644000000000000000000000033012442116661031234 xustar00126 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239409.561021678 30 atime=1418239409.561021678 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116661060154 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000013212442116661030435 xustar0030 mtime=1418239409.393018799 30 atime=1418239409.328017685 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116661034370 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000032512442116661030775 xustar00123 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239409.393018799 30 atime=1418239409.393018799 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdateAlert.nib/key0000644000175000017500000000000012442116661057206 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000032012442116661030770 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239409.393018799 30 atime=1418239409.393018799 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdateAlert.nib/cla0000644000175000017500000000000012442116661056137 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000031512442116661030774 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdateAlert.nib/info.nib 30 mtime=1418239409.393018799 30 atime=1418239409.393018799 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/SUUpdateAlert.nib/inf0000644000175000017500000000000012442116661055452 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/PaxHeaders.4960/Spark0000644000000000000000000000013212442116661030515 xustar0030 mtime=1418239409.560021661 30 atime=1418239409.560021661 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/nl.lproj/Sparkle.strings0000644000175000017500000000000012442116661052674 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/PaxHeaders.4960/en.lproj0000644000000000000000000000013212442116655027431 xustar0030 mtime=1418239405.257947938 30 atime=1418239404.861941152 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/0000755000175000017500000000000012442116655031133 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/PaxHeaders.4960/SUAut0000644000000000000000000000031612442116654030435 xustar00116 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUAutomaticUpdateAlert.nib/ 30 mtime=1418239404.930942334 30 atime=1418239404.861941152 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUAutomaticUpdateAler0000755000175000017500000000000012442116654035220 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUAutomaticUpdateAler0000644000000000000000000000052512442116654031156 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 132 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239404.929942317 30 atime=1418239404.929942317 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116654060233 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUAutomaticUpdateAler0000644000000000000000000000033112442116654031151 xustar00127 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nib 30 mtime=1418239404.930942334 30 atime=1418239404.930942334 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116654060147 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUAutomaticUpdateAler0000644000000000000000000000032612442116654031155 xustar00124 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nib 30 mtime=1418239404.929942317 30 atime=1418239404.929942317 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUAutomaticUpdateAler0000644000175000017500000000000012442116654057445 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000032012442116655030430 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239405.258947955 30 atime=1418239405.166946378 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdatePermissionPro0000755000175000017500000000000012442116655035300 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdatePermissionPro0000644000000000000000000000053112442116655031233 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 134 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239405.258947955 30 atime=1418239405.258947955 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116655060400 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdatePermissionPro0000644000000000000000000000051712442116655031237 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib 129 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239405.258947955 30 atime=1418239405.258947955 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116655060330 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdatePermissionPro0000644000000000000000000000033012442116655031230 xustar00126 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239405.257947938 30 atime=1418239405.257947938 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdatePermissionPro0000644000175000017500000000000012442116655060141 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/PaxHeaders.4960/SUUpd0000644000000000000000000000013212442116655030431 xustar0030 mtime=1418239405.165946361 30 atime=1418239404.930942334 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116655034364 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000032512442116655030771 xustar00123 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239405.164946344 30 atime=1418239405.164946344 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdateAlert.nib/key0000644000175000017500000000000012442116655057173 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000032012442116655030764 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239405.164946344 30 atime=1418239405.164946344 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdateAlert.nib/cla0000644000175000017500000000000012442116655056124 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdateAlert.nib/Pax0000644000000000000000000000031512442116655030770 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdateAlert.nib/info.nib 30 mtime=1418239405.164946344 30 atime=1418239405.164946344 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/SUUpdateAlert.nib/inf0000644000175000017500000000000012442116655055437 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/PaxHeaders.4960/Spark0000644000000000000000000000013212442116655030511 xustar0030 mtime=1418239405.257947938 30 atime=1418239405.257947938 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/Current/Resources/en.lproj/Sparkle.strings0000644000175000017500000000000012442116655052661 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/PaxHeaders.4960/A0000644000000000000000000000013212442116661022463 xustar0030 mtime=1418239409.563021713 30 atime=1418239400.858872552 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/A/0000755000175000017500000000000012442116661024165 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/PaxHeaders.4960/Sparkle0000644000000000000000000000013212442116654024066 xustar0030 mtime=1418239404.008926534 30 atime=1418239404.007926516 30 ctime=1457295922.540851111 transmission-2.92/macosx/Sparkle.framework/Versions/A/Sparkle0000755000175000017500000000000012442116654037037 1transmission-2.92/macosx/Sparkle.framework/Sparkleustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/PaxHeaders.4960/Headers0000644000000000000000000000013212442116661024036 xustar0030 mtime=1418239409.649023186 30 atime=1418239409.563021713 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/A/Headers/0000755000175000017500000000000012442116661025540 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Headers/PaxHeaders.4960/Sparkle.h0000644000000000000000000000013212442116661025665 xustar0030 mtime=1418239409.648023169 30 atime=1418239409.648023169 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/A/Headers/Sparkle.h0000644000175000017500000000000012442116661042434 1transmission-2.92/macosx/Sparkle.framework/Headers/Sparkle.hustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Headers/PaxHeaders.4960/SUVersionComparisonPro0000644000000000000000000000013212442116661030447 xustar0030 mtime=1418239409.647023152 30 atime=1418239409.647023152 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h0000644000175000017500000000000012442116661052556 1transmission-2.92/macosx/Sparkle.framework/Headers/SUVersionComparisonProtocol.hustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Headers/PaxHeaders.4960/SUAppcastItem.h0000644000000000000000000000013212442116661026746 xustar0030 mtime=1418239409.648023169 30 atime=1418239409.648023169 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h0000644000175000017500000000000012442116661044576 1transmission-2.92/macosx/Sparkle.framework/Headers/SUAppcastItem.hustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Headers/PaxHeaders.4960/SUAppcast.h0000644000000000000000000000013212442116661026127 xustar0030 mtime=1418239409.649023186 30 atime=1418239409.649023186 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/A/Headers/SUAppcast.h0000644000175000017500000000000012442116661043140 1transmission-2.92/macosx/Sparkle.framework/Headers/SUAppcast.hustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Headers/PaxHeaders.4960/SUUpdater.h0000644000000000000000000000013212442116661026140 xustar0030 mtime=1418239409.648023169 30 atime=1418239409.648023169 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/A/Headers/SUUpdater.h0000644000175000017500000000000012442116661043162 1transmission-2.92/macosx/Sparkle.framework/Headers/SUUpdater.hustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/PaxHeaders.4960/Resources0000644000000000000000000000013212442116661024435 xustar0030 mtime=1418239409.264016589 30 atime=1418239403.867924117 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/0000755000175000017500000000000012442116661026137 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/PaxHeaders.4960/fr.lproj0000644000000000000000000000013112442116657026175 xustar0030 mtime=1418239407.180980892 29 atime=1418239406.36796696 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/0000755000175000017500000000000012442116657027700 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/PaxHeaders.4960/SUAutomatic0000644000000000000000000000013112442116656030372 xustar0029 mtime=1418239406.43096804 30 atime=1418239406.368966977 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116656034777 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000051512442116656030734 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 126 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 29 mtime=1418239406.43096804 29 atime=1418239406.43096804 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116656060017 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000032112442116656030727 xustar00121 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nib 29 mtime=1418239406.43096804 29 atime=1418239406.43096804 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116656057733 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000031512442116656030732 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nib 29 mtime=1418239406.43096804 29 atime=1418239406.43096804 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116656057231 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/PaxHeaders.4960/SUUpdatePer0000644000000000000000000000031112442116657030336 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239407.181980909 29 atime=1418239406.51796953 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.ni0000755000175000017500000000000012442116657035173 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000052312442116657031127 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 128 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239407.181980909 30 atime=1418239407.180980892 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116657060300 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000051112442116657031124 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib 123 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239407.181980909 30 atime=1418239407.181980909 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116657060230 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000032212442116657031124 xustar00120 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239407.180980892 30 atime=1418239407.180980892 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116657060041 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/PaxHeaders.4960/SUUpdateAle0000644000000000000000000000013212442116656030311 xustar0030 mtime=1418239406.515969496 30 atime=1418239406.431968057 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116656033130 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031712442116656030647 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239406.515969496 30 atime=1418239406.515969496 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/keyedobje0000644000175000017500000000000012442116656057115 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031212442116656030642 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239406.515969496 30 atime=1418239406.515969496 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/classes.n0000644000175000017500000000000012442116656056027 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000013212442116656030642 xustar0030 mtime=1418239406.514969479 30 atime=1418239406.514969479 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000000012442116656055136 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/PaxHeaders.4960/Sparkle.str0000644000000000000000000000013112442116657030405 xustar0030 mtime=1418239407.180980892 30 atime=1418239407.180980892 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings0000644000175000017500000000000012442116657051433 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/PaxHeaders.4960/sv.lproj0000644000000000000000000000013212442116661026212 xustar0030 mtime=1418239409.262016554 30 atime=1418239408.469002965 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/0000755000175000017500000000000012442116661027714 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/PaxHeaders.4960/SUAutomatic0000644000000000000000000000013212442116660030407 xustar0030 mtime=1418239408.538004147 30 atime=1418239408.470002982 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116660035013 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000051712442116660030752 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 126 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239408.538004147 30 atime=1418239408.538004147 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116660060054 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000032312442116660030745 xustar00121 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/classes.nib 30 mtime=1418239408.538004147 30 atime=1418239408.538004147 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116660057770 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000032012442116660030742 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nib 30 mtime=1418239408.538004147 30 atime=1418239408.538004147 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116660057266 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/PaxHeaders.4960/SUUpdatePer0000644000000000000000000000031212442116661030353 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239409.263016571 30 atime=1418239408.948011173 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.ni0000755000175000017500000000000012442116661035207 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000052312442116661031143 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 128 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239409.262016554 30 atime=1418239409.262016554 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116661060335 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000051112442116661031140 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib 123 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239409.263016571 30 atime=1418239409.263016571 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116661060265 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000032212442116661031140 xustar00120 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239409.262016554 30 atime=1418239409.262016554 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116661060076 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/PaxHeaders.4960/SUUpdateAle0000644000000000000000000000013212442116660030325 xustar0030 mtime=1418239408.946011139 30 atime=1418239408.539004164 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116660033144 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031712442116660030663 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239408.946011139 30 atime=1418239408.946011139 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/keyedobje0000644000175000017500000000000012442116660057152 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031212442116660030656 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239408.946011139 30 atime=1418239408.946011139 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/classes.n0000644000175000017500000000000012442116660056064 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000013212442116660030656 xustar0030 mtime=1418239408.946011139 30 atime=1418239408.946011139 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000000012442116660055173 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/PaxHeaders.4960/Sparkle.str0000644000000000000000000000013212442116661030422 xustar0030 mtime=1418239409.262016554 30 atime=1418239409.262016554 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings0000644000175000017500000000000012442116661051470 1transmission-2.92/macosx/Sparkle.framework/Resources/sv.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/PaxHeaders.4960/de.lproj0000644000000000000000000000013112442116660026150 xustar0029 mtime=1418239408.46700293 30 atime=1418239407.182980926 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/0000755000175000017500000000000012442116660027653 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/PaxHeaders.4960/SUAutomatic0000644000000000000000000000013212442116660030347 xustar0030 mtime=1418239408.073996196 30 atime=1418239407.182980926 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116660034753 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000051712442116660030712 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 126 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239408.073996196 30 atime=1418239408.073996196 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116660057754 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000032312442116660030705 xustar00121 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nib 30 mtime=1418239408.073996196 30 atime=1418239408.073996196 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116660057670 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000032012442116660030702 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nib 30 mtime=1418239408.072996178 30 atime=1418239408.072996178 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116660057166 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/PaxHeaders.4960/SUUpdatePer0000644000000000000000000000031212442116660030312 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239408.468002948 30 atime=1418239408.270999572 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.ni0000755000175000017500000000000012442116660035146 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000052312442116660031102 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 128 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239408.468002948 30 atime=1418239408.468002948 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116660060234 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000051112442116660031077 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nib 123 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239408.468002948 30 atime=1418239408.468002948 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116660060164 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000032112442116660031076 xustar00120 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239408.468002948 29 atime=1418239408.46700293 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116660057775 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/PaxHeaders.4960/SUUpdateAle0000644000000000000000000000013212442116660030265 xustar0030 mtime=1418239408.268999537 30 atime=1418239408.074996213 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116660033104 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031712442116660030623 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239408.268999537 30 atime=1418239408.268999537 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/keyedobje0000644000175000017500000000000012442116660057052 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031212442116660030616 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239408.268999537 30 atime=1418239408.268999537 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/classes.n0000644000175000017500000000000012442116660055764 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000013012442116660030614 xustar0029 mtime=1418239408.26799952 29 atime=1418239408.26799952 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000000012442116660055073 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/PaxHeaders.4960/Sparkle.str0000644000000000000000000000013012442116660030357 xustar0029 mtime=1418239408.46700293 29 atime=1418239408.46700293 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings0000644000175000017500000000000012442116660051367 1transmission-2.92/macosx/Sparkle.framework/Resources/de.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/PaxHeaders.4960/SUStatus.nib0000644000000000000000000000013212442116654026741 xustar0030 mtime=1418239404.857941083 30 atime=1418239404.729938889 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/SUStatus.nib/0000755000175000017500000000000012442116654030443 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/SUStatus.nib/PaxHeaders.4960/keyedob0000644000000000000000000000013212442116654030363 xustar0030 mtime=1418239404.857941083 30 atime=1418239404.857941083 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/SUStatus.nib/keyedobjects.nib0000644000175000017500000000000012442116654053226 1transmission-2.92/macosx/Sparkle.framework/Resources/SUStatus.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/SUStatus.nib/PaxHeaders.4960/classes0000644000000000000000000000013212442116654030376 xustar0030 mtime=1418239404.857941083 30 atime=1418239404.857941083 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib0000644000175000017500000000000012442116654051172 1transmission-2.92/macosx/Sparkle.framework/Resources/SUStatus.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/SUStatus.nib/PaxHeaders.4960/info.ni0000644000000000000000000000013212442116654030301 xustar0030 mtime=1418239404.857941083 30 atime=1418239404.857941083 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib0000644000175000017500000000000012442116654047766 1transmission-2.92/macosx/Sparkle.framework/Resources/SUStatus.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/PaxHeaders.4960/License.txt0000644000000000000000000000013212442116654026637 xustar0030 mtime=1418239404.009926551 30 atime=1418239404.008926534 30 ctime=1457295922.540851111 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/License.txt0000644000175000017500000000000012442116654044356 1transmission-2.92/macosx/Sparkle.framework/Resources/License.txtustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/PaxHeaders.4960/ru.lproj0000644000000000000000000000013112442116656026213 xustar0030 mtime=1418239406.037961305 30 atime=1418239405.711955718 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/0000755000175000017500000000000012442116656027716 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/PaxHeaders.4960/SUAutomatic0000644000000000000000000000013212442116655030411 xustar0030 mtime=1418239405.779956883 30 atime=1418239405.712955735 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116655035015 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000051712442116655030754 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 126 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239405.779956883 30 atime=1418239405.779956883 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116655060054 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000032312442116655030747 xustar00121 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/classes.nib 30 mtime=1418239405.779956883 30 atime=1418239405.779956883 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116655057770 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000032012442116655030744 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nib 30 mtime=1418239405.779956883 30 atime=1418239405.779956883 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116655057266 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/PaxHeaders.4960/SUUpdatePer0000644000000000000000000000031112442116656030354 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239406.038961322 30 atime=1418239405.994960568 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.ni0000755000175000017500000000000012442116656035211 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000052212442116656031144 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 128 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239406.038961322 30 atime=1418239406.038961322 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116656060335 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000051012442116656031141 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib 123 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239406.038961322 30 atime=1418239406.038961322 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116656060265 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000032112442116656031141 xustar00120 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239406.038961322 30 atime=1418239406.038961322 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116656060076 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/PaxHeaders.4960/SUUpdateAle0000644000000000000000000000012712442116655030333 xustar0030 mtime=1418239405.891958803 28 atime=1418239405.7809569 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116655033146 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031612442116655030664 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239405.891958803 30 atime=1418239405.891958803 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/keyedobje0000644000175000017500000000000012442116655057152 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031112442116655030657 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239405.891958803 30 atime=1418239405.891958803 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/classes.n0000644000175000017500000000000012442116655056064 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000013112442116655030657 xustar0030 mtime=1418239405.891958803 30 atime=1418239405.891958803 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000000012442116655055173 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/PaxHeaders.4960/Sparkle.str0000644000000000000000000000013212442116656030424 xustar0030 mtime=1418239406.037961305 30 atime=1418239406.037961305 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings0000644000175000017500000000000012442116656051470 1transmission-2.92/macosx/Sparkle.framework/Resources/ru.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/PaxHeaders.4960/da.lproj0000644000000000000000000000013212442116655026151 xustar0030 mtime=1418239405.710955701 30 atime=1418239405.259947972 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/0000755000175000017500000000000012442116655027653 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/PaxHeaders.4960/SUAutomatic0000644000000000000000000000013212442116655030347 xustar0030 mtime=1418239405.325949103 30 atime=1418239405.260947989 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116655034753 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000051712442116655030712 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 126 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239405.324949086 30 atime=1418239405.324949086 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116655057750 1transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000051312442116655030706 xustar00117 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUAutomaticUpdateAlert.nib/designable.nib 124 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib/designable.nib 30 mtime=1418239405.325949103 30 atime=1418239405.325949103 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116655057633 1transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUAutomaticUpdateAlert.nib/designable.ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/PaxHeaders.4960/SUUpdatePer0000644000000000000000000000031212442116655030312 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239405.710955701 30 atime=1418239405.516952376 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.ni0000755000175000017500000000000012442116655035146 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000052312442116655031102 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 128 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239405.710955701 30 atime=1418239405.710955701 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116655060230 1transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000051712442116655031105 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdatePermissionPrompt.nib/designable.nib 126 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib/designable.nib 30 mtime=1418239405.710955701 30 atime=1418239405.710955701 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116655060217 1transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdatePermissionPrompt.nib/designablustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/PaxHeaders.4960/SUUpdateAle0000644000000000000000000000013212442116655030265 xustar0030 mtime=1418239405.487951879 30 atime=1418239405.325949103 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116655033104 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031712442116655030623 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239405.487951879 30 atime=1418239405.487951879 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib/keyedobje0000644000175000017500000000000012442116655057046 1transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031512442116655030621 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib/designable.nib 30 mtime=1418239405.487951879 30 atime=1418239405.487951879 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib/designabl0000644000175000017500000000000012442116655056457 1transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/SUUpdateAlert.nib/designable.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/PaxHeaders.4960/Sparkle.str0000644000000000000000000000013212442116655030361 xustar0030 mtime=1418239405.710955701 30 atime=1418239405.709955684 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings0000644000175000017500000000000012442116655051363 1transmission-2.92/macosx/Sparkle.framework/Resources/da.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/PaxHeaders.4960/Info.plist0000644000000000000000000000013212442116654026464 xustar0030 mtime=1418239404.929942317 30 atime=1418239404.929942317 30 ctime=1457295922.540851111 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/Info.plist0000644000175000017500000000000012442116654044030 1transmission-2.92/macosx/Sparkle.framework/Resources/Info.plistustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/PaxHeaders.4960/it.lproj0000644000000000000000000000013212442116654026200 xustar0030 mtime=1418239404.602936713 30 atime=1418239403.870924169 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/0000755000175000017500000000000012442116654027702 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/PaxHeaders.4960/SUAutomatic0000644000000000000000000000013212442116654030376 xustar0030 mtime=1418239404.010926568 30 atime=1418239403.870924169 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116654035002 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000051712442116654030741 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 126 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239404.009926551 30 atime=1418239404.009926551 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116654060027 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000032312442116654030734 xustar00121 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nib 30 mtime=1418239404.010926568 30 atime=1418239404.010926568 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116654057743 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000032012442116654030731 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nib 30 mtime=1418239404.009926551 30 atime=1418239404.009926551 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116654057241 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/PaxHeaders.4960/SUUpdatePer0000644000000000000000000000031112442116654030340 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/ 29 mtime=1418239404.60393673 30 atime=1418239404.219930149 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.ni0000755000175000017500000000000012442116654035175 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000052312442116654031131 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 128 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239404.602936713 30 atime=1418239404.602936713 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116654060307 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000050712442116654031133 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nib 123 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nib 29 mtime=1418239404.60393673 29 atime=1418239404.60393673 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116654060237 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000032212442116654031126 xustar00120 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239404.602936713 30 atime=1418239404.602936713 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116654060050 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/PaxHeaders.4960/SUUpdateAle0000644000000000000000000000013212442116654030314 xustar0030 mtime=1418239404.218930132 30 atime=1418239404.010926568 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116654033133 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031712442116654030652 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239404.217930115 30 atime=1418239404.217930115 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/keyedobje0000644000175000017500000000000012442116654057125 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031212442116654030645 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239404.218930132 30 atime=1418239404.218930132 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/classes.n0000644000175000017500000000000012442116654056037 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000013212442116654030645 xustar0030 mtime=1418239404.217930115 30 atime=1418239404.217930115 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000000012442116654055146 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/PaxHeaders.4960/Sparkle.str0000644000000000000000000000013212442116654030410 xustar0030 mtime=1418239404.602936713 30 atime=1418239404.602936713 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings0000644000175000017500000000000012442116654051442 1transmission-2.92/macosx/Sparkle.framework/Resources/it.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/PaxHeaders.4960/fr_CA.lproj0000644000000000000000000000013112442116657026540 xustar0030 mtime=1418239407.180980892 29 atime=1418239406.36796696 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/0000755000175000017500000000000012442116657030243 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/PaxHeaders.4960/SUAutoma0000644000000000000000000000031212442116656030236 xustar00113 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/ 29 mtime=1418239406.43096804 30 atime=1418239406.368966977 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.n0000755000175000017500000000000012442116656034750 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.n0000644000000000000000000000052012442116656030701 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 129 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 29 mtime=1418239406.43096804 29 atime=1418239406.43096804 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.n0000644000175000017500000000000012442116656057770 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.n0000644000000000000000000000032412442116656030703 xustar00124 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/classes.nib 29 mtime=1418239406.43096804 29 atime=1418239406.43096804 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.n0000644000175000017500000000000012442116656057704 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.n0000644000000000000000000000032012442116656030677 xustar00121 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.nib/info.nib 29 mtime=1418239406.43096804 29 atime=1418239406.43096804 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUAutomaticUpdateAlert.n0000644000175000017500000000000012442116656057202 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/PaxHeaders.4960/SUUpdate0000644000000000000000000000031412442116657030235 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239407.181980909 29 atime=1418239406.51796953 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdatePermissionPrompt0000755000175000017500000000000012442116657035131 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdatePermissionPrompt0000644000000000000000000000052612442116657031070 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 131 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239407.181980909 30 atime=1418239407.180980892 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdatePermissionPrompt0000644000175000017500000000000012442116657060236 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdatePermissionPrompt0000644000000000000000000000051412442116657031065 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib 126 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239407.181980909 30 atime=1418239407.181980909 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdatePermissionPrompt0000644000175000017500000000000012442116657060166 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdatePermissionPrompt0000644000000000000000000000032512442116657031065 xustar00123 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239407.180980892 30 atime=1418239407.180980892 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdatePermissionPrompt0000644000175000017500000000000012442116657057777 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/PaxHeaders.4960/SUUpdate0000644000000000000000000000013212442116656030232 xustar0030 mtime=1418239406.515969496 30 atime=1418239406.431968057 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116656033473 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdateAlert.nib/PaxHea0000644000000000000000000000032212442116656030513 xustar00120 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239406.515969496 30 atime=1418239406.515969496 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdateAlert.nib/keyedo0000644000175000017500000000000012442116656056777 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdateAlert.nib/PaxHea0000644000000000000000000000031512442116656030515 xustar00115 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239406.515969496 30 atime=1418239406.515969496 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdateAlert.nib/classe0000644000175000017500000000000012442116656055753 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdateAlert.nib/PaxHea0000644000000000000000000000031212442116656030512 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdateAlert.nib/info.nib 30 mtime=1418239406.514969479 30 atime=1418239406.514969479 30 ctime=1457295922.549851264 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/SUUpdateAlert.nib/info.n0000644000175000017500000000000012442116656055166 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/PaxHeaders.4960/Sparkle.0000644000000000000000000000013112442116657030217 xustar0030 mtime=1418239407.180980892 30 atime=1418239407.180980892 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/fr_CA.lproj/Sparkle.strings0000644000175000017500000000000012442116657051776 1transmission-2.92/macosx/Sparkle.framework/Resources/fr.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/PaxHeaders.4960/SUModelTranslation.p0000644000000000000000000000013212442116654030424 xustar0030 mtime=1418239404.009926551 30 atime=1418239404.009926551 30 ctime=1457295922.540851111 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist0000644000175000017500000000000012442116654051520 1transmission-2.92/macosx/Sparkle.framework/Resources/SUModelTranslation.plistustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/PaxHeaders.4960/relaunch0000644000000000000000000000013212442116654026240 xustar0030 mtime=1418239404.856941066 30 atime=1418239404.856941066 30 ctime=1457295922.540851111 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/relaunch0000755000175000017500000000000012442116654043363 1transmission-2.92/macosx/Sparkle.framework/Resources/relaunchustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/PaxHeaders.4960/es.lproj0000644000000000000000000000013112442116656026174 xustar0030 mtime=1418239406.365966926 30 atime=1418239406.039961339 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/0000755000175000017500000000000012442116656027677 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/PaxHeaders.4960/SUAutomatic0000644000000000000000000000013012442116656030371 xustar0030 mtime=1418239406.188963892 29 atime=1418239406.05696163 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116656034777 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000051612442116656030735 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 126 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239406.188963892 30 atime=1418239406.188963892 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116656060017 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000032212442116656030730 xustar00121 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/classes.nib 30 mtime=1418239406.188963892 30 atime=1418239406.188963892 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116656057733 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000031712442116656030734 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nib 30 mtime=1418239406.188963892 30 atime=1418239406.188963892 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116656057231 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/PaxHeaders.4960/SUUpdatePer0000644000000000000000000000031112442116656030335 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239406.366966943 30 atime=1418239406.251964972 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.ni0000755000175000017500000000000012442116656035172 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000052212442116656031125 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 128 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239406.366966943 30 atime=1418239406.366966943 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116656060277 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000051012442116656031122 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib 123 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239406.366966943 30 atime=1418239406.366966943 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116656060227 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000032112442116656031122 xustar00120 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239406.366966943 30 atime=1418239406.366966943 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116656060040 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/PaxHeaders.4960/SUUpdateAle0000644000000000000000000000013112442116656030310 xustar0030 mtime=1418239406.238964749 30 atime=1418239406.189963909 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116656033130 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031612442116656030646 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239406.238964749 30 atime=1418239406.238964749 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/keyedobje0000644000175000017500000000000012442116656057115 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031112442116656030641 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239406.238964749 30 atime=1418239406.238964749 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/classes.n0000644000175000017500000000000012442116656056027 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000013112442116656030641 xustar0030 mtime=1418239406.237964732 30 atime=1418239406.237964732 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000000012442116656055136 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/PaxHeaders.4960/Sparkle.str0000644000000000000000000000013112442116656030404 xustar0030 mtime=1418239406.365966926 30 atime=1418239406.365966926 29 ctime=1457295922.54785123 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings0000644000175000017500000000000012442116656051432 1transmission-2.92/macosx/Sparkle.framework/Resources/es.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/PaxHeaders.4960/nl.lproj0000644000000000000000000000013212442116661026173 xustar0030 mtime=1418239409.560021661 30 atime=1418239409.264016589 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/0000755000175000017500000000000012442116661027675 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/PaxHeaders.4960/SUAutomatic0000644000000000000000000000013212442116661030371 xustar0030 mtime=1418239409.327017668 30 atime=1418239409.264016589 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116661034775 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000051712442116661030734 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 126 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239409.326017651 30 atime=1418239409.326017651 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116661060017 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000032312442116661030727 xustar00121 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nib 30 mtime=1418239409.327017668 30 atime=1418239409.327017668 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116661057733 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000032012442116661030724 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nib 30 mtime=1418239409.326017651 30 atime=1418239409.326017651 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116661057231 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/PaxHeaders.4960/SUUpdatePer0000644000000000000000000000031212442116661030334 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239409.561021678 30 atime=1418239409.454019845 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.ni0000755000175000017500000000000012442116661035170 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000052312442116661031124 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 128 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239409.561021678 30 atime=1418239409.561021678 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116661060277 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000051112442116661031121 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nib 123 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239409.561021678 30 atime=1418239409.561021678 30 ctime=1457295922.553851332 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116661060227 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000032212442116661031121 xustar00120 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239409.561021678 30 atime=1418239409.561021678 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116661060040 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/PaxHeaders.4960/SUUpdateAle0000644000000000000000000000013212442116661030307 xustar0030 mtime=1418239409.393018799 30 atime=1418239409.328017685 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116661033126 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031712442116661030645 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239409.393018799 30 atime=1418239409.393018799 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/keyedobje0000644000175000017500000000000012442116661057115 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031212442116661030640 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239409.393018799 30 atime=1418239409.393018799 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/classes.n0000644000175000017500000000000012442116661056027 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000013212442116661030640 xustar0030 mtime=1418239409.393018799 30 atime=1418239409.393018799 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000000012442116661055136 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/PaxHeaders.4960/Sparkle.str0000644000000000000000000000013212442116661030403 xustar0030 mtime=1418239409.560021661 30 atime=1418239409.560021661 30 ctime=1457295922.550851281 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings0000644000175000017500000000000012442116661051432 1transmission-2.92/macosx/Sparkle.framework/Resources/nl.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/PaxHeaders.4960/en.lproj0000644000000000000000000000013212442116655026167 xustar0030 mtime=1418239405.257947938 30 atime=1418239404.861941152 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/0000755000175000017500000000000012442116655027671 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/PaxHeaders.4960/SUAutomatic0000644000000000000000000000013212442116654030364 xustar0030 mtime=1418239404.930942334 30 atime=1418239404.861941152 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/0000755000175000017500000000000012442116654034770 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000051712442116654030727 xustar00119 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 126 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239404.929942317 30 atime=1418239404.929942317 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116654060003 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjectustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000032312442116654030722 xustar00121 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nib 30 mtime=1418239404.930942334 30 atime=1418239404.930942334 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116654057717 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/0000644000000000000000000000032012442116654030717 xustar00118 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nib 30 mtime=1418239404.929942317 30 atime=1418239404.929942317 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/0000644000175000017500000000000012442116654057215 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/PaxHeaders.4960/SUUpdatePer0000644000000000000000000000031212442116655030330 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/ 30 mtime=1418239405.258947955 30 atime=1418239405.166946378 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.ni0000755000175000017500000000000012442116655035164 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000052312442116655031120 xustar00121 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 128 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib 30 mtime=1418239405.258947955 30 atime=1418239405.258947955 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116655060264 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/keyedobjeustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000051112442116655031115 xustar00116 linkpath=transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib 123 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib 30 mtime=1418239405.258947955 30 atime=1418239405.258947955 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116655060214 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.ni0000644000000000000000000000032212442116655031115 xustar00120 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nib 30 mtime=1418239405.257947938 30 atime=1418239405.257947938 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.ni0000644000175000017500000000000012442116655060025 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/PaxHeaders.4960/SUUpdateAle0000644000000000000000000000013212442116655030303 xustar0030 mtime=1418239405.165946361 30 atime=1418239404.930942334 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/0000755000175000017500000000000012442116655033122 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031712442116655030641 xustar00117 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nib 30 mtime=1418239405.164946344 30 atime=1418239405.164946344 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/keyedobje0000644000175000017500000000000012442116655057102 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000031212442116655030634 xustar00112 path=transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib 30 mtime=1418239405.164946344 30 atime=1418239405.164946344 30 ctime=1457295922.544851179 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.n0000644000175000017500000000000012442116655056014 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdateAlert.nib/classes.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/PaxHeader0000644000000000000000000000013212442116655030634 xustar0030 mtime=1418239405.164946344 30 atime=1418239405.164946344 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib0000644000175000017500000000000012442116655055123 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/SUUpdateAlert.nib/info.nibustar00mikedldmikedld00000000000000transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/PaxHeaders.4960/Sparkle.str0000644000000000000000000000013212442116655030377 xustar0030 mtime=1418239405.257947938 30 atime=1418239405.257947938 30 ctime=1457295922.543851162 transmission-2.92/macosx/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings0000644000175000017500000000000012442116655051417 1transmission-2.92/macosx/Sparkle.framework/Resources/en.lproj/Sparkle.stringsustar00mikedldmikedld00000000000000transmission-2.92/macosx/PaxHeaders.4960/AboutWindowController.m0000644000000000000000000000013212442116666021644 xustar0030 mtime=1418239414.210101348 30 atime=1418239414.210101348 30 ctime=1457295922.888857029 transmission-2.92/macosx/AboutWindowController.m0000644000175000017500000000701712442116666023276 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: AboutWindowController.m 13251 2012-03-13 02:52:11Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "AboutWindowController.h" @implementation AboutWindowController AboutWindowController * fAboutBoxInstance = nil; + (AboutWindowController *) aboutController { if (!fAboutBoxInstance) fAboutBoxInstance = [[self alloc] initWithWindowNibName: @"AboutWindow"]; return fAboutBoxInstance; } - (void) awakeFromNib { NSDictionary * info = [[NSBundle mainBundle] infoDictionary]; [fVersionField setStringValue: [NSString stringWithFormat: @"%@ (%@)", [info objectForKey: @"CFBundleShortVersionString"], [info objectForKey: (NSString *)kCFBundleVersionKey]]]; [fCopyrightField setStringValue: [[NSBundle mainBundle] localizedStringForKey: @"NSHumanReadableCopyright" value: nil table: @"InfoPlist"]]; [[fTextView textStorage] setAttributedString: [[[NSAttributedString alloc] initWithPath: [[NSBundle mainBundle] pathForResource: @"Credits" ofType: @"rtf"] documentAttributes: nil] autorelease]]; //size license button const CGFloat oldButtonWidth = NSWidth([fLicenseButton frame]); [fLicenseButton setTitle: NSLocalizedString(@"License", "About window -> license button")]; [fLicenseButton sizeToFit]; NSRect buttonFrame = [fLicenseButton frame]; buttonFrame.size.width += 10.0; buttonFrame.origin.x -= NSWidth(buttonFrame) - oldButtonWidth; [fLicenseButton setFrame: buttonFrame]; } - (void) windowDidLoad { [[self window] center]; } - (void) windowWillClose: (id) sender { [fAboutBoxInstance autorelease]; fAboutBoxInstance = nil; } - (IBAction) showLicense: (id) sender { NSString * licenseText = [NSString stringWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"COPYING" ofType: nil] usedEncoding: nil error: NULL]; [fLicenseView setString: licenseText]; [fLicenseCloseButton setTitle: NSLocalizedString(@"OK", "About window -> license close button")]; [NSApp beginSheet: fLicenseSheet modalForWindow: [self window] modalDelegate: nil didEndSelector: nil contextInfo: nil]; } - (IBAction) hideLicense: (id) sender { [fLicenseSheet orderOut: nil]; [NSApp endSheet: fLicenseSheet]; } @end transmission-2.92/macosx/PaxHeaders.4960/AboutWindowController.h0000644000000000000000000000013212442116666021637 xustar0030 mtime=1418239414.208101314 30 atime=1418239414.208101314 30 ctime=1457295922.884856961 transmission-2.92/macosx/AboutWindowController.h0000644000175000017500000000341212442116666023264 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: AboutWindowController.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface AboutWindowController : NSWindowController { IBOutlet NSTextView * fTextView, * fLicenseView; IBOutlet NSTextField * fVersionField, * fCopyrightField; IBOutlet NSButton * fLicenseButton, * fLicenseCloseButton; IBOutlet NSPanel * fLicenseSheet; } + (AboutWindowController *) aboutController; - (IBAction) showLicense: (id) sender; - (IBAction) hideLicense: (id) sender; @end transmission-2.92/macosx/PaxHeaders.4960/DragOverlayView.h0000644000000000000000000000013112442116673020400 xustar0030 mtime=1418239419.184186587 30 atime=1418239419.184186587 29 ctime=1457295923.02885941 transmission-2.92/macosx/DragOverlayView.h0000644000175000017500000000314012442116673022024 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: DragOverlayView.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface DragOverlayView : NSView { NSImage * fBadge; NSDictionary * fMainLineAttributes, * fSubLineAttributes; } - (void) setOverlay: (NSImage *) icon mainLine: (NSString *) mainLine subLine: (NSString *) subLine; @end transmission-2.92/macosx/PaxHeaders.4960/TrackerTableView.m0000644000000000000000000000013212442116666020534 xustar0030 mtime=1418239414.198101142 30 atime=1418239414.198101142 30 ctime=1457295923.632869681 transmission-2.92/macosx/TrackerTableView.m0000644000175000017500000000727012442116666022167 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: TrackerTableView.m 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2008-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "TrackerTableView.h" #import "Torrent.h" #import "TrackerNode.h" @implementation TrackerTableView - (void) mouseDown: (NSEvent *) event { [[self window] makeKeyWindow]; [super mouseDown: event]; } - (void) setTorrent: (Torrent *) torrent { fTorrent = torrent; } - (void) setTrackers: (NSArray *) trackers { fTrackers = trackers; } - (void) copy: (id) sender { NSMutableArray * addresses = [NSMutableArray arrayWithCapacity: [fTrackers count]]; NSIndexSet * indexes = [self selectedRowIndexes]; for (NSUInteger i = [indexes firstIndex]; i != NSNotFound; i = [indexes indexGreaterThanIndex: i]) { id item = [fTrackers objectAtIndex: i]; if (![item isKindOfClass: [TrackerNode class]]) { for (++i; i < [fTrackers count] && [[fTrackers objectAtIndex: i] isKindOfClass: [TrackerNode class]]; ++i) [addresses addObject: [(TrackerNode *)[fTrackers objectAtIndex: i] fullAnnounceAddress]]; --i; } else [addresses addObject: [(TrackerNode *)item fullAnnounceAddress]]; } NSString * text = [addresses componentsJoinedByString: @"\n"]; NSPasteboard * pb = [NSPasteboard generalPasteboard]; [pb clearContents]; [pb writeObjects: [NSArray arrayWithObject: text]]; } - (void) paste: (id) sender { NSAssert(fTorrent != nil, @"no torrent but trying to paste; should not be able to call this method"); BOOL added = NO; NSArray * items = [[NSPasteboard generalPasteboard] readObjectsForClasses: [NSArray arrayWithObject: [NSString class]] options: nil]; NSAssert(items != nil, @"no string items to paste; should not be able to call this method"); for (NSString * pbItem in items) { for (NSString * item in [pbItem componentsSeparatedByString: @"\n"]) if ([fTorrent addTrackerToNewTier: item]) added = YES; } //none added if (!added) NSBeep(); } - (BOOL) validateMenuItem: (NSMenuItem *) menuItem { const SEL action = [menuItem action]; if (action == @selector(copy:)) return [self numberOfSelectedRows] > 0; if (action == @selector(paste:)) return fTorrent && [[NSPasteboard generalPasteboard] canReadObjectForClasses: [NSArray arrayWithObject: [NSString class]] options: nil]; return YES; } @end transmission-2.92/macosx/PaxHeaders.4960/FileNameCell.h0000644000000000000000000000013212442116666017611 xustar0030 mtime=1418239414.195101091 30 atime=1418239414.195101091 30 ctime=1457295923.093860515 transmission-2.92/macosx/FileNameCell.h0000644000175000017500000000302412442116666021235 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: FileNameCell.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface FileNameCell : NSActionCell { NSMutableDictionary * fTitleAttributes, * fStatusAttributes; } - (NSRect) imageRectForBounds: (NSRect) bounds; @end transmission-2.92/macosx/PaxHeaders.4960/FilterBar.xib0000644000000000000000000000013212640354045017531 xustar0030 mtime=1451350053.033160514 30 atime=1451350053.033160514 30 ctime=1457295922.426849172 transmission-2.92/macosx/FilterBar.xib0000644000175000017500000002420712640354045021163 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/InfoTabButtonCell.h0000644000000000000000000000013212442116666020647 xustar0030 mtime=1418239414.200101177 30 atime=1418239414.200101177 30 ctime=1457295923.228862811 transmission-2.92/macosx/InfoTabButtonCell.h0000644000175000017500000000300412442116666022271 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoTabButtonCell.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import @interface InfoTabButtonCell : NSButtonCell { NSImage * fIcon; BOOL fSelected; } - (void) setSelectedTab: (BOOL) selected; @end transmission-2.92/macosx/PaxHeaders.4960/PortChecker.m0000644000000000000000000000013212442116666017547 xustar0030 mtime=1418239414.211101365 30 atime=1418239414.211101365 30 ctime=1457295923.441866433 transmission-2.92/macosx/PortChecker.m0000644000175000017500000001137312442116666021201 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: PortChecker.m 13492 2012-09-10 02:37:29Z livings124 $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "PortChecker.h" #define CHECKER_URL(port) [NSString stringWithFormat: @"http://portcheck.transmissionbt.com/%ld", port] #define CHECK_FIRE 3.0 @interface PortChecker (Private) - (void) startProbe: (NSTimer *) timer; - (void) callBackWithStatus: (port_status_t) status; @end @implementation PortChecker - (id) initForPort: (NSInteger) portNumber delay: (BOOL) delay withDelegate: (id) delegate { if ((self = [super init])) { fDelegate = delegate; fStatus = PORT_STATUS_CHECKING; fTimer = [[NSTimer scheduledTimerWithTimeInterval: CHECK_FIRE target: self selector: @selector(startProbe:) userInfo: [NSNumber numberWithInteger: portNumber] repeats: NO] retain]; if (!delay) [fTimer fire]; } return self; } - (void) dealloc { [fTimer invalidate]; [fTimer release]; [fConnection release]; [fPortProbeData release]; [super dealloc]; } - (port_status_t) status { return fStatus; } - (void) cancelProbe { [fTimer invalidate]; [fTimer release]; fTimer = nil; [fConnection cancel]; } - (void) connection: (NSURLConnection *) connection didReceiveResponse: (NSURLResponse *) response { [fPortProbeData setLength: 0]; } - (void) connection: (NSURLConnection *) connection didReceiveData: (NSData *) data { [fPortProbeData appendData: data]; } - (void) connection: (NSURLConnection *) connection didFailWithError: (NSError *) error { NSLog(@"Unable to get port status: connection failed (%@)", [error localizedDescription]); [self callBackWithStatus: PORT_STATUS_ERROR]; } - (void) connectionDidFinishLoading: (NSURLConnection *) connection { NSString * probeString = [[NSString alloc] initWithData: fPortProbeData encoding: NSUTF8StringEncoding]; [fPortProbeData release]; fPortProbeData = nil; if (probeString) { if ([probeString isEqualToString: @"1"]) [self callBackWithStatus: PORT_STATUS_OPEN]; else if ([probeString isEqualToString: @"0"]) [self callBackWithStatus: PORT_STATUS_CLOSED]; else { NSLog(@"Unable to get port status: invalid response (%@)", probeString); [self callBackWithStatus: PORT_STATUS_ERROR]; } [probeString release]; } else { NSLog(@"Unable to get port status: invalid data received"); [self callBackWithStatus: PORT_STATUS_ERROR]; } } @end @implementation PortChecker (Private) - (void) startProbe: (NSTimer *) timer { [fTimer release]; fTimer = nil; NSURLRequest * portProbeRequest = [NSURLRequest requestWithURL: [NSURL URLWithString: CHECKER_URL([[timer userInfo] integerValue])] cachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval: 15.0]; if ((fConnection = [[NSURLConnection alloc] initWithRequest: portProbeRequest delegate: self])) fPortProbeData = [[NSMutableData alloc] init]; else { NSLog(@"Unable to get port status: failed to initiate connection"); [self callBackWithStatus: PORT_STATUS_ERROR]; } } - (void) callBackWithStatus: (port_status_t) status { fStatus = status; if (fDelegate && [fDelegate respondsToSelector: @selector(portCheckerDidFinishProbing:)]) [fDelegate performSelectorOnMainThread: @selector(portCheckerDidFinishProbing:) withObject: self waitUntilDone: NO]; } @end transmission-2.92/macosx/PaxHeaders.4960/InfoTrackersViewController.m0000644000000000000000000000012512644245522022627 xustar0028 mtime=1452362578.8357005 28 atime=1452362578.8357005 29 ctime=1457295923.31586429 transmission-2.92/macosx/InfoTrackersViewController.m0000644000175000017500000003552012644245522024257 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoTrackersViewController.m 14662 2016-01-06 11:05:37Z mikedld $ * * Copyright (c) 2010-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "InfoTrackersViewController.h" #import "NSApplicationAdditions.h" #import "Torrent.h" #import "TrackerCell.h" #import "TrackerNode.h" #import "TrackerTableView.h" #define TRACKER_GROUP_SEPARATOR_HEIGHT 14.0 #define TRACKER_ADD_TAG 0 #define TRACKER_REMOVE_TAG 1 @interface InfoTrackersViewController (Private) - (void) setupInfo; - (void) addTrackers; - (void) removeTrackers; @end @implementation InfoTrackersViewController - (id) init { if ((self = [super initWithNibName: @"InfoTrackersView" bundle: nil])) { [self setTitle: NSLocalizedString(@"Trackers", "Inspector view -> title")]; fTrackerCell = [[TrackerCell alloc] init]; } return self; } - (void) awakeFromNib { [[fTrackerAddRemoveControl cell] setToolTip: NSLocalizedString(@"Add a tracker", "Inspector view -> tracker buttons") forSegment: TRACKER_ADD_TAG]; [[fTrackerAddRemoveControl cell] setToolTip: NSLocalizedString(@"Remove selected trackers", "Inspector view -> tracker buttons") forSegment: TRACKER_REMOVE_TAG]; const CGFloat height = [[NSUserDefaults standardUserDefaults] floatForKey: @"InspectorContentHeightTracker"]; if (height != 0.0) { NSRect viewRect = [[self view] frame]; viewRect.size.height = height; [[self view] setFrame: viewRect]; } } - (void) dealloc { [fTorrents release]; [fTrackers release]; [fTrackerCell release]; [super dealloc]; } - (void) setInfoForTorrents: (NSArray *) torrents { //don't check if it's the same in case the metadata changed [fTorrents release]; fTorrents = [torrents retain]; fSet = NO; } - (void) updateInfo { if (!fSet) [self setupInfo]; if ([fTorrents count] == 0) return; //get updated tracker stats if ([fTrackerTable editedRow] == -1) { NSArray * oldTrackers = fTrackers; if ([fTorrents count] == 1) fTrackers = [[[fTorrents objectAtIndex: 0] allTrackerStats] retain]; else { fTrackers = [[NSMutableArray alloc] init]; for (Torrent * torrent in fTorrents) [fTrackers addObjectsFromArray: [torrent allTrackerStats]]; } [fTrackerTable setTrackers: fTrackers]; if (oldTrackers && [fTrackers isEqualToArray: oldTrackers]) [fTrackerTable setNeedsDisplay: YES]; else [fTrackerTable reloadData]; [oldTrackers release]; } else { NSAssert1([fTorrents count] == 1, @"Attempting to add tracker with %ld transfers selected", [fTorrents count]); NSIndexSet * addedIndexes = [NSIndexSet indexSetWithIndexesInRange: NSMakeRange([fTrackers count]-2, 2)]; NSArray * tierAndTrackerBeingAdded = [fTrackers objectsAtIndexes: addedIndexes]; [fTrackers release]; fTrackers = [[[fTorrents objectAtIndex: 0] allTrackerStats] retain]; [fTrackers addObjectsFromArray: tierAndTrackerBeingAdded]; [fTrackerTable setTrackers: fTrackers]; NSIndexSet * updateIndexes = [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fTrackers count]-2)], * columnIndexes = [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [[fTrackerTable tableColumns] count])]; [fTrackerTable reloadDataForRowIndexes: updateIndexes columnIndexes: columnIndexes]; } } - (void) saveViewSize { [[NSUserDefaults standardUserDefaults] setFloat: NSHeight([[self view] frame]) forKey: @"InspectorContentHeightTracker"]; } - (void) clearView { [fTrackers release]; fTrackers = nil; } - (NSInteger) numberOfRowsInTableView: (NSTableView *) tableView { return fTrackers ? [fTrackers count] : 0; } - (id) tableView: (NSTableView *) tableView objectValueForTableColumn: (NSTableColumn *) column row: (NSInteger) row { id item = [fTrackers objectAtIndex: row]; if ([item isKindOfClass: [NSDictionary class]]) { const NSInteger tier = [[item objectForKey: @"Tier"] integerValue]; NSString * tierString = tier == -1 ? NSLocalizedString(@"New Tier", "Inspector -> tracker table") : [NSString stringWithFormat: NSLocalizedString(@"Tier %d", "Inspector -> tracker table"), tier]; if ([fTorrents count] > 1) tierString = [tierString stringByAppendingFormat: @" - %@", [item objectForKey: @"Name"]]; return tierString; } else return item; //TrackerNode or NSString } - (NSCell *) tableView: (NSTableView *) tableView dataCellForTableColumn: (NSTableColumn *) tableColumn row: (NSInteger) row { const BOOL tracker = [[fTrackers objectAtIndex: row] isKindOfClass: [TrackerNode class]]; return tracker ? fTrackerCell : [tableColumn dataCellForRow: row]; } - (CGFloat) tableView: (NSTableView *) tableView heightOfRow: (NSInteger) row { //check for NSDictionay instead of TrackerNode because of display issue when adding a row if ([[fTrackers objectAtIndex: row] isKindOfClass: [NSDictionary class]]) return TRACKER_GROUP_SEPARATOR_HEIGHT; else return [tableView rowHeight]; } - (BOOL) tableView: (NSTableView *) tableView shouldEditTableColumn: (NSTableColumn *) tableColumn row: (NSInteger) row { //don't allow tier row to be edited by double-click return NO; } - (void) tableViewSelectionDidChange: (NSNotification *) notification { [fTrackerAddRemoveControl setEnabled: [fTrackerTable numberOfSelectedRows] > 0 forSegment: TRACKER_REMOVE_TAG]; } - (BOOL) tableView: (NSTableView *) tableView isGroupRow: (NSInteger) row { return ![[fTrackers objectAtIndex: row] isKindOfClass: [TrackerNode class]] && [tableView editedRow] != row; } - (NSString *) tableView: (NSTableView *) tableView toolTipForCell: (NSCell *) cell rect: (NSRectPointer) rect tableColumn: (NSTableColumn *) column row: (NSInteger) row mouseLocation: (NSPoint) mouseLocation { id node = [fTrackers objectAtIndex: row]; if ([node isKindOfClass: [TrackerNode class]]) return [(TrackerNode *)node fullAnnounceAddress]; else return nil; } - (void) tableView: (NSTableView *) tableView setObjectValue: (id) object forTableColumn: (NSTableColumn *) tableColumn row: (NSInteger) row { Torrent * torrent= [fTorrents objectAtIndex: 0]; BOOL added = NO; for (NSString * tracker in [object componentsSeparatedByString: @"\n"]) if ([torrent addTrackerToNewTier: tracker]) added = YES; if (!added) NSBeep(); //reset table with either new or old value [fTrackers release]; fTrackers = [[torrent allTrackerStats] retain]; [fTrackerTable setTrackers: fTrackers]; [fTrackerTable reloadData]; [fTrackerTable deselectAll: self]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil]; //incase sort by tracker } - (void) addRemoveTracker: (id) sender { //don't allow add/remove when currently adding - it leads to weird results if ([fTrackerTable editedRow] != -1) return; [self updateInfo]; if ([[sender cell] tagForSegment: [sender selectedSegment]] == TRACKER_REMOVE_TAG) [self removeTrackers]; else [self addTrackers]; } @end @implementation InfoTrackersViewController (Private) - (void) setupInfo { const NSUInteger numberSelected = [fTorrents count]; if (numberSelected != 1) { if (numberSelected == 0) { [fTrackers release]; fTrackers = nil; [fTrackerTable setTrackers: nil]; [fTrackerTable reloadData]; } [fTrackerTable setTorrent: nil]; [fTrackerAddRemoveControl setEnabled: NO forSegment: TRACKER_ADD_TAG]; [fTrackerAddRemoveControl setEnabled: NO forSegment: TRACKER_REMOVE_TAG]; } else { [fTrackerTable setTorrent: [fTorrents objectAtIndex: 0]]; [fTrackerAddRemoveControl setEnabled: YES forSegment: TRACKER_ADD_TAG]; [fTrackerAddRemoveControl setEnabled: NO forSegment: TRACKER_REMOVE_TAG]; } [fTrackerTable deselectAll: self]; fSet = YES; } #warning doesn't like blank addresses - (void) addTrackers { [[[self view] window] makeKeyWindow]; NSAssert1([fTorrents count] == 1, @"Attempting to add tracker with %ld transfers selected", [fTorrents count]); [fTrackers addObject: [NSDictionary dictionaryWithObject: [NSNumber numberWithInteger: -1] forKey: @"Tier"]]; [fTrackers addObject: @""]; [fTrackerTable setTrackers: fTrackers]; [fTrackerTable reloadData]; [fTrackerTable selectRowIndexes: [NSIndexSet indexSetWithIndex: [fTrackers count]-1] byExtendingSelection: NO]; [fTrackerTable editColumn: [fTrackerTable columnWithIdentifier: @"Tracker"] row: [fTrackers count]-1 withEvent: nil select: YES]; } - (void) removeTrackers { NSMutableDictionary * removeIdentifiers = [NSMutableDictionary dictionaryWithCapacity: [fTorrents count]]; NSUInteger removeTrackerCount = 0; NSIndexSet * selectedIndexes = [fTrackerTable selectedRowIndexes]; BOOL groupSelected = NO; NSUInteger groupRowIndex = NSNotFound; NSMutableIndexSet * removeIndexes = [NSMutableIndexSet indexSet]; for (NSUInteger i = 0; i < [fTrackers count]; ++i) { id object = [fTrackers objectAtIndex: i]; if ([object isKindOfClass: [TrackerNode class]]) { if (groupSelected || [selectedIndexes containsIndex: i]) { Torrent * torrent = [(TrackerNode *)object torrent]; NSMutableSet * removeSet; if (!(removeSet = [removeIdentifiers objectForKey: torrent])) { removeSet = [NSMutableSet set]; [removeIdentifiers setObject: removeSet forKey: torrent]; } [removeSet addObject: [(TrackerNode *)object fullAnnounceAddress]]; ++removeTrackerCount; [removeIndexes addIndex: i]; } else groupRowIndex = NSNotFound; //don't remove the group row } else { //mark the previous group row for removal, if necessary if (groupRowIndex != NSNotFound) [removeIndexes addIndex: groupRowIndex]; groupSelected = [selectedIndexes containsIndex: i]; if (!groupSelected && i > [selectedIndexes lastIndex]) { groupRowIndex = NSNotFound; break; } groupRowIndex = i; } } //mark the last group for removal, too if (groupRowIndex != NSNotFound) [removeIndexes addIndex: groupRowIndex]; NSAssert2(removeTrackerCount <= [removeIndexes count], @"Marked %ld trackers to remove, but only removing %ld rows", removeTrackerCount, [removeIndexes count]); //we might have no trackers if remove right after a failed add (race condition ftw) #warning look into having a failed add apply right away, so that this can become an assert if (removeTrackerCount == 0) return; if ([[NSUserDefaults standardUserDefaults] boolForKey: @"WarningRemoveTrackers"]) { NSAlert * alert = [[NSAlert alloc] init]; if (removeTrackerCount > 1) { [alert setMessageText: [NSString stringWithFormat: NSLocalizedString(@"Are you sure you want to remove %d trackers?", "Remove trackers alert -> title"), removeTrackerCount]]; [alert setInformativeText: NSLocalizedString(@"Once removed, Transmission will no longer attempt to contact them." " This cannot be undone.", "Remove trackers alert -> message")]; } else { [alert setMessageText: NSLocalizedString(@"Are you sure you want to remove this tracker?", "Remove trackers alert -> title")]; [alert setInformativeText: NSLocalizedString(@"Once removed, Transmission will no longer attempt to contact it." " This cannot be undone.", "Remove trackers alert -> message")]; } [alert addButtonWithTitle: NSLocalizedString(@"Remove", "Remove trackers alert -> button")]; [alert addButtonWithTitle: NSLocalizedString(@"Cancel", "Remove trackers alert -> button")]; [alert setShowsSuppressionButton: YES]; NSInteger result = [alert runModal]; if ([[alert suppressionButton] state] == NSOnState) [[NSUserDefaults standardUserDefaults] setBool: NO forKey: @"WarningRemoveTrackers"]; [alert release]; if (result != NSAlertFirstButtonReturn) return; } [fTrackerTable beginUpdates]; for (Torrent * torrent in removeIdentifiers) [torrent removeTrackers: [removeIdentifiers objectForKey: torrent]]; //reset table with either new or old value [fTrackers release]; fTrackers = [[NSMutableArray alloc] init]; for (Torrent * torrent in fTorrents) [fTrackers addObjectsFromArray: [torrent allTrackerStats]]; [fTrackerTable removeRowsAtIndexes: removeIndexes withAnimation: NSTableViewAnimationSlideLeft]; [fTrackerTable setTrackers: fTrackers]; [fTrackerTable endUpdates]; [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil]; //incase sort by tracker } @end transmission-2.92/macosx/PaxHeaders.4960/GroupsPrefsController.m0000644000000000000000000000013212666747213021667 xustar0030 mtime=1457245835.389999919 30 atime=1457245835.389999919 30 ctime=1457295923.200862335 transmission-2.92/macosx/GroupsPrefsController.m0000644000175000017500000003432412666747213023322 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: GroupsPrefsController.m 14699 2016-03-02 07:55:37Z mikedld $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "GroupsPrefsController.h" #import "GroupsController.h" #import "ExpandedPathToPathTransformer.h" #import "ExpandedPathToIconTransformer.h" #import "NSApplicationAdditions.h" #define GROUP_TABLE_VIEW_DATA_TYPE @"GroupTableViewDataType" #define ADD_TAG 0 #define REMOVE_TAG 1 @interface GroupsPrefsController (Private) - (void) updateSelectedGroup; - (void) refreshCustomLocationWithSingleGroup; @end @implementation GroupsPrefsController - (void) awakeFromNib { [fTableView registerForDraggedTypes: [NSArray arrayWithObject: GROUP_TABLE_VIEW_DATA_TYPE]]; [fSelectedColorView addObserver: self forKeyPath: @"color" options: 0 context: NULL]; [self updateSelectedGroup]; } - (NSInteger) numberOfRowsInTableView: (NSTableView *) tableview { return [[GroupsController groups] numberOfGroups]; } - (id) tableView: (NSTableView *) tableView objectValueForTableColumn: (NSTableColumn *) tableColumn row: (NSInteger) row { GroupsController * groupsController = [GroupsController groups]; NSInteger groupsIndex = [groupsController indexForRow: row]; NSString * identifier = [tableColumn identifier]; if ([identifier isEqualToString: @"Color"]) return [groupsController imageForIndex: groupsIndex]; else return [groupsController nameForIndex: groupsIndex]; } - (void) tableViewSelectionDidChange: (NSNotification *) notification { [self updateSelectedGroup]; } - (void) observeValueForKeyPath: (NSString *) keyPath ofObject: (id) object change: (NSDictionary *) change context: (void *) context { if (object == fSelectedColorView && [fTableView numberOfSelectedRows] == 1) { NSInteger index = [[GroupsController groups] indexForRow: [fTableView selectedRow]]; [[GroupsController groups] setColor: [fSelectedColorView color] forIndex: index]; [fTableView setNeedsDisplay: YES]; } } - (void) controlTextDidEndEditing: (NSNotification *) notification { if ([notification object] == fSelectedColorNameField) { NSInteger index = [[GroupsController groups] indexForRow: [fTableView selectedRow]]; [[GroupsController groups] setName: [fSelectedColorNameField stringValue] forIndex: index]; [fTableView setNeedsDisplay: YES]; } } - (BOOL) tableView: (NSTableView *) tableView writeRowsWithIndexes: (NSIndexSet *) rowIndexes toPasteboard: (NSPasteboard *) pboard { [pboard declareTypes: [NSArray arrayWithObject: GROUP_TABLE_VIEW_DATA_TYPE] owner: self]; [pboard setData: [NSKeyedArchiver archivedDataWithRootObject: rowIndexes] forType: GROUP_TABLE_VIEW_DATA_TYPE]; return YES; } - (NSDragOperation) tableView: (NSTableView *) tableView validateDrop: (id ) info proposedRow: (NSInteger) row proposedDropOperation: (NSTableViewDropOperation) operation { NSPasteboard * pasteboard = [info draggingPasteboard]; if ([[pasteboard types] containsObject: GROUP_TABLE_VIEW_DATA_TYPE]) { [fTableView setDropRow: row dropOperation: NSTableViewDropAbove]; return NSDragOperationGeneric; } return NSDragOperationNone; } - (BOOL) tableView: (NSTableView *) tableView acceptDrop: (id ) info row: (NSInteger) newRow dropOperation: (NSTableViewDropOperation) operation { NSPasteboard * pasteboard = [info draggingPasteboard]; if ([[pasteboard types] containsObject: GROUP_TABLE_VIEW_DATA_TYPE]) { NSIndexSet * indexes = [NSKeyedUnarchiver unarchiveObjectWithData: [pasteboard dataForType: GROUP_TABLE_VIEW_DATA_TYPE]]; NSInteger oldRow = [indexes firstIndex]; if (oldRow < newRow) newRow--; [fTableView beginUpdates]; [[GroupsController groups] moveGroupAtRow: oldRow toRow: newRow]; [fTableView moveRowAtIndex: oldRow toIndex: newRow]; [fTableView endUpdates]; } return YES; } - (void) addRemoveGroup: (id) sender { if ([NSColorPanel sharedColorPanelExists]) [[NSColorPanel sharedColorPanel] close]; NSInteger row; switch ([[sender cell] tagForSegment: [sender selectedSegment]]) { case ADD_TAG: [fTableView beginUpdates]; [[GroupsController groups] addNewGroup]; row = [fTableView numberOfRows]; [fTableView insertRowsAtIndexes: [NSIndexSet indexSetWithIndex: row] withAnimation: NSTableViewAnimationSlideUp]; [fTableView endUpdates]; [fTableView selectRowIndexes: [NSIndexSet indexSetWithIndex: row] byExtendingSelection: NO]; [fTableView scrollRowToVisible: row]; [[fSelectedColorNameField window] makeFirstResponder: fSelectedColorNameField]; break; case REMOVE_TAG: row = [fTableView selectedRow]; [fTableView beginUpdates]; [[GroupsController groups] removeGroupWithRowIndex: row]; [fTableView removeRowsAtIndexes: [NSIndexSet indexSetWithIndex: row] withAnimation: NSTableViewAnimationSlideUp]; [fTableView endUpdates]; if ([fTableView numberOfRows] > 0) { if (row == [fTableView numberOfRows]) --row; [fTableView selectRowIndexes: [NSIndexSet indexSetWithIndex: row] byExtendingSelection: NO]; [fTableView scrollRowToVisible: row]; } break; } [self updateSelectedGroup]; } - (void) customDownloadLocationSheetShow: (id) sender { NSOpenPanel * panel = [NSOpenPanel openPanel]; [panel setPrompt: NSLocalizedString(@"Select", "Preferences -> Open panel prompt")]; [panel setAllowsMultipleSelection: NO]; [panel setCanChooseFiles: NO]; [panel setCanChooseDirectories: YES]; [panel setCanCreateDirectories: YES]; [panel beginSheetModalForWindow: [fCustomLocationPopUp window] completionHandler: ^(NSInteger result) { const NSInteger index = [[GroupsController groups] indexForRow: [fTableView selectedRow]]; if (result == NSFileHandlingPanelOKButton) { NSString * path = [[[panel URLs] objectAtIndex: 0] path]; [[GroupsController groups] setCustomDownloadLocation: path forIndex: index]; [[GroupsController groups] setUsesCustomDownloadLocation: YES forIndex: index]; } else { if (![[GroupsController groups] customDownloadLocationForIndex: index]) [[GroupsController groups] setUsesCustomDownloadLocation: NO forIndex: index]; } [self refreshCustomLocationWithSingleGroup]; [fCustomLocationPopUp selectItemAtIndex: 0]; }]; } - (IBAction) toggleUseCustomDownloadLocation: (id) sender { NSInteger index = [[GroupsController groups] indexForRow: [fTableView selectedRow]]; if ([fCustomLocationEnableCheck state] == NSOnState) { if ([[GroupsController groups] customDownloadLocationForIndex: index]) [[GroupsController groups] setUsesCustomDownloadLocation: YES forIndex: index]; else [self customDownloadLocationSheetShow: nil]; } else [[GroupsController groups] setUsesCustomDownloadLocation: NO forIndex: index]; [fCustomLocationPopUp setEnabled: ([fCustomLocationEnableCheck state] == NSOnState)]; } #pragma mark - #pragma mark Rule editor - (IBAction) toggleUseAutoAssignRules: (id) sender; { NSInteger index = [[GroupsController groups] indexForRow: [fTableView selectedRow]]; if ([fAutoAssignRulesEnableCheck state] == NSOnState) { if ([[GroupsController groups] autoAssignRulesForIndex: index]) [[GroupsController groups] setUsesAutoAssignRules: YES forIndex: index]; else [self orderFrontRulesSheet: nil]; } else [[GroupsController groups] setUsesAutoAssignRules: NO forIndex: index]; [fAutoAssignRulesEditButton setEnabled: [fAutoAssignRulesEnableCheck state] == NSOnState]; } - (IBAction) orderFrontRulesSheet: (id) sender; { if (!fGroupRulesSheetWindow) [NSBundle loadNibNamed: @"GroupRules" owner: self]; NSInteger index = [[GroupsController groups] indexForRow: [fTableView selectedRow]]; NSPredicate *predicate = [[GroupsController groups] autoAssignRulesForIndex: index]; [fRuleEditor setObjectValue: predicate]; if ([fRuleEditor numberOfRows] == 0) [fRuleEditor addRow: nil]; [NSApp beginSheet: fGroupRulesSheetWindow modalForWindow: [fTableView window] modalDelegate: nil didEndSelector: NULL contextInfo: NULL]; } - (IBAction) cancelRules: (id) sender; { [fGroupRulesSheetWindow orderOut: nil]; [NSApp endSheet: fGroupRulesSheetWindow]; NSInteger index = [[GroupsController groups] indexForRow: [fTableView selectedRow]]; if (![[GroupsController groups] autoAssignRulesForIndex: index]) { [[GroupsController groups] setUsesAutoAssignRules: NO forIndex: index]; [fAutoAssignRulesEnableCheck setState: NO]; [fAutoAssignRulesEditButton setEnabled: NO]; } } - (IBAction) saveRules: (id) sender; { [fGroupRulesSheetWindow orderOut: nil]; [NSApp endSheet: fGroupRulesSheetWindow]; NSInteger index = [[GroupsController groups] indexForRow: [fTableView selectedRow]]; [[GroupsController groups] setUsesAutoAssignRules: YES forIndex: index]; NSPredicate * predicate = [fRuleEditor objectValue]; [[GroupsController groups] setAutoAssignRules: predicate forIndex: index]; [fAutoAssignRulesEnableCheck setState: [[GroupsController groups] usesAutoAssignRulesForIndex: index]]; [fAutoAssignRulesEditButton setEnabled: [fAutoAssignRulesEnableCheck state] == NSOnState]; } - (void) ruleEditorRowsDidChange: (NSNotification *) notification { NSScrollView * ruleEditorScrollView = [fRuleEditor enclosingScrollView]; const CGFloat rowHeight = [fRuleEditor rowHeight]; const CGFloat bordersHeight = [ruleEditorScrollView frame].size.height - [ruleEditorScrollView contentSize].height; const CGFloat requiredRowCount = [fRuleEditor numberOfRows]; const CGFloat maxVisibleRowCount = (long)((NSHeight([[[fRuleEditor window] screen] visibleFrame]) * 2 / 3) / rowHeight); [fRuleEditorHeightConstraint setConstant: MIN(requiredRowCount, maxVisibleRowCount) * rowHeight + bordersHeight]; [ruleEditorScrollView setHasVerticalScroller: requiredRowCount > maxVisibleRowCount]; } @end @implementation GroupsPrefsController (Private) - (void) updateSelectedGroup { [fAddRemoveControl setEnabled: [fTableView numberOfSelectedRows] > 0 forSegment: REMOVE_TAG]; if ([fTableView numberOfSelectedRows] == 1) { const NSInteger index = [[GroupsController groups] indexForRow: [fTableView selectedRow]]; [fSelectedColorView setColor: [[GroupsController groups] colorForIndex: index]]; [fSelectedColorView setEnabled: YES]; [fSelectedColorNameField setStringValue: [[GroupsController groups] nameForIndex: index]]; [fSelectedColorNameField setEnabled: YES]; [self refreshCustomLocationWithSingleGroup]; [fAutoAssignRulesEnableCheck setState: [[GroupsController groups] usesAutoAssignRulesForIndex: index]]; [fAutoAssignRulesEnableCheck setEnabled: YES]; [fAutoAssignRulesEditButton setEnabled: ([fAutoAssignRulesEnableCheck state] == NSOnState)]; } else { [fSelectedColorView setColor: [NSColor whiteColor]]; [fSelectedColorView setEnabled: NO]; [fSelectedColorNameField setStringValue: @""]; [fSelectedColorNameField setEnabled: NO]; [fCustomLocationEnableCheck setEnabled: NO]; [fCustomLocationPopUp setEnabled: NO]; [fAutoAssignRulesEnableCheck setEnabled: NO]; [fAutoAssignRulesEditButton setEnabled: NO]; } } - (void) refreshCustomLocationWithSingleGroup { const NSInteger index = [[GroupsController groups] indexForRow: [fTableView selectedRow]]; const BOOL hasCustomLocation = [[GroupsController groups] usesCustomDownloadLocationForIndex: index]; [fCustomLocationEnableCheck setState: hasCustomLocation]; [fCustomLocationEnableCheck setEnabled: YES]; [fCustomLocationPopUp setEnabled: hasCustomLocation]; NSString * location = [[GroupsController groups] customDownloadLocationForIndex: index]; if (location) { ExpandedPathToPathTransformer * pathTransformer = [[[ExpandedPathToPathTransformer alloc] init] autorelease]; [[fCustomLocationPopUp itemAtIndex: 0] setTitle: [pathTransformer transformedValue: location]]; ExpandedPathToIconTransformer * iconTransformer = [[[ExpandedPathToIconTransformer alloc] init] autorelease]; [[fCustomLocationPopUp itemAtIndex: 0] setImage: [iconTransformer transformedValue: location]]; } else { [[fCustomLocationPopUp itemAtIndex: 0] setTitle: @""]; [[fCustomLocationPopUp itemAtIndex: 0] setImage: nil]; } } @end transmission-2.92/macosx/PaxHeaders.4960/en.lproj0000644000000000000000000000013212666747213016640 xustar0030 mtime=1457245835.354999317 30 atime=1418239377.548473081 30 ctime=1457295922.717854121 transmission-2.92/macosx/en.lproj/0000755000175000017500000000000012666747213020342 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/en.lproj/PaxHeaders.4960/InfoPlist.strings0000644000000000000000000000013212664476420022234 xustar0030 mtime=1456635152.053497503 30 atime=1456635152.053497503 30 ctime=1457295922.717854121 transmission-2.92/macosx/en.lproj/InfoPlist.strings0000644000175000017500000000017312664476420023662 0ustar00mikedldmikedld00000000000000/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = "Copyright © 2005-2016 The Transmission Project"; transmission-2.92/macosx/en.lproj/PaxHeaders.4960/Creator.xib0000644000000000000000000000013212640354044021004 xustar0030 mtime=1451350052.679154366 30 atime=1451350052.679154366 30 ctime=1457295922.716854104 transmission-2.92/macosx/en.lproj/Creator.xib0000644000175000017500000006005712640354044022441 0ustar00mikedldmikedld00000000000000 File File transmission-2.92/macosx/en.lproj/PaxHeaders.4960/PrefsWindow.xib0000644000000000000000000000013212640354044021654 xustar0030 mtime=1451350052.682154418 30 atime=1451350052.682154418 30 ctime=1457295922.717854121 transmission-2.92/macosx/en.lproj/PrefsWindow.xib0000644000175000017500000057014512640354044023315 0ustar00mikedldmikedld00000000000000 ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer ExpandedPathToIconTransformer ExpandedPathToPathTransformer NSAllRomanInputSourcesLocaleIdentifier NSAllRomanInputSourcesLocaleIdentifier YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7MTgsIDE4fdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPESRuTU0AKgAAFEjr6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr /+vr6//r6+v/6+vr/+vr6/8AEQEAAAMAAAABACQAAAEBAAMAAAABACQAAAECAAMAAAAEAAAVKgEDAAMA AAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAESAAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMA AAABACQAAAEXAAQAAAABAAAUQAEaAAUAAAABAAAVGgEbAAUAAAABAAAVIgEcAAMAAAABAAEAAAEoAAMA AAABAAIAAAFSAAMAAAABAAEAAAFTAAMAAAAEAAAVModzAAcAAA80AAAVOgAAAAAAAACQAAAAAQAAAJAA AAABAAgACAAIAAgAAQABAAEAAQAADzRhcHBsAhAAAG1udHJSR0IgWFlaIAffAAwABQANABIACGFjc3BB UFBMAAAAAEFQUEwAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWRlc2MAAAFQAAAAYmRzY20AAAG0AAAEGmNwcnQA AAXQAAAAI3d0cHQAAAX0AAAAFHJYWVoAAAYIAAAAFGdYWVoAAAYcAAAAFGJYWVoAAAYwAAAAFHJUUkMA AAZEAAAIDGFhcmcAAA5QAAAAIHZjZ3QAAA5wAAAAMG5kaW4AAA6gAAAAPmNoYWQAAA7gAAAALG1tb2QA AA8MAAAAKGJUUkMAAAZEAAAIDGdUUkMAAAZEAAAIDGFhYmcAAA5QAAAAIGFhZ2cAAA5QAAAAIGRlc2MA AAAAAAAACERpc3BsYXkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAACIAAAAMaHJIUgAAABQA AAGoa29LUgAAAAwAAAG8bmJOTwAAABIAAAHIaWQAAAAAABIAAAHaaHVIVQAAABQAAAHsY3NDWgAAABYA AAIAZGFESwAAABwAAAIWdWtVQQAAABwAAAIyYXIAAAAAABQAAAJOaXRJVAAAABQAAAJicm9STwAAABIA AAJ2bmxOTAAAABYAAAKIaGVJTAAAABYAAAKeZXNFUwAAABIAAAJ2ZmlGSQAAABAAAAK0emhUVwAAAAwA AALEdmlWTgAAAA4AAALQc2tTSwAAABYAAALeemhDTgAAAAwAAALEcnVSVQAAACQAAAL0ZnJGUgAAABYA AAMYbXMAAAAAABIAAAMuY2FFUwAAABgAAANAdGhUSAAAAAwAAANYZXNYTAAAABIAAAJ2ZGVERQAAABAA AANkZW5VUwAAABIAAAN0cHRCUgAAABgAAAOGcGxQTAAAABIAAAOeZWxHUgAAACIAAAOwc3ZTRQAAABAA AAPSdHJUUgAAABQAAAPiamFKUAAAAA4AAAP2cHRQVAAAABYAAAQEAEwAQwBEACAAdQAgAGIAbwBqAGnO 7LfsACAATABDAEQARgBhAHIAZwBlAC0ATABDAEQATABDAEQAIABXAGEAcgBuAGEAUwB6AO0AbgBlAHMA IABMAEMARABCAGEAcgBlAHYAbgD9ACAATABDAEQATABDAEQALQBmAGEAcgB2AGUAcwBrAOYAcgBtBBoE PgQ7BEwEPgRABD4EMgQ4BDkAIABMAEMARCAPAEwAQwBEACAGRQZEBkgGRgYpAEwAQwBEACAAYwBvAGwA bwByAGkATABDAEQAIABjAG8AbABvAHIASwBsAGUAdQByAGUAbgAtAEwAQwBEIA8ATABDAEQAIAXmBdEF 4gXVBeAF2QBWAOQAcgBpAC0ATABDAERfaYJyACAATABDAEQATABDAEQAIABNAOAAdQBGAGEAcgBlAGIA bgDpACAATABDAEQEJgQyBDUEQgQ9BD4EOQAgBBYEGgAtBDQEOARBBD8EOwQ1BDkATABDAEQAIABjAG8A dQBsAGUAdQByAFcAYQByAG4AYQAgAEwAQwBEAEwAQwBEACAAZQBuACAAYwBvAGwAbwByAEwAQwBEACAO Kg41AEYAYQByAGIALQBMAEMARABDAG8AbABvAHIAIABMAEMARABMAEMARAAgAEMAbwBsAG8AcgBpAGQA bwBLAG8AbABvAHIAIABMAEMARAOIA7MDxwPBA8kDvAO3ACADvwO4A8wDvQO3ACAATABDAEQARgDkAHIA ZwAtAEwAQwBEAFIAZQBuAGsAbABpACAATABDAEQwqzDpMPwAIABMAEMARABMAEMARAAgAGEAIABDAG8A cgBlAHMAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMTUAAFhZWiAAAAAAAADzFgABAAAA ARbKWFlaIAAAAAAAAHHAAAA5igAAAWdYWVogAAAAAAAAYSMAALnmAAAT9lhZWiAAAAAAAAAj8gAADJAA AL3QY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgA bQByAHcAfACBAIYAiwCQAJUAmgCfAKMAqACtALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEB BwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB 2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC 9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUE YwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYG JwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDII RghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4K xQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4N qQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ 9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsU rRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y 1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcd cB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9wo DSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEu Fi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0 njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7 qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdD OkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxL U0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT 9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZd J114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm 6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBx OnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8 IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuH n4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02T tpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qg aaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUSt uK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67 p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZ bNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6Lzp RunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5 x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//9wYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKDnZjZ3QA AAAAAAAAAQABAAAAAAAAAAEAAAABAAAAAAAAAAEAAAABAAAAAAAAAAEAAG5kaW4AAAAAAAAANgAAp0AA AFWAAABMwAAAnsAAACWAAAAMwAAAUAAAAFRAAAIzMwACMzMAAjMzAAAAAAAAAABzZjMyAAAAAAABDHIA AAX4///zHQAAB7oAAP1y///7nf///aQAAAPZAADAcW1tb2QAAAAAAAAGEAAAoA4AAAAAyc58GAAAAAAA AAAAAAAAAAAAAADSJSYnKFokY2xhc3NuYW1lWCRjbGFzc2VzXxAQTlNCaXRtYXBJbWFnZVJlcKMnKSpa TlNJbWFnZVJlcFhOU09iamVjdNIlJiwtV05TQXJyYXmiLCrSJSYvMF5OU011dGFibGVBcnJheaMvLCrT MjMKNDU2V05TV2hpdGVcTlNDb2xvclNwYWNlRDAgMAAQA4AM0iUmODlXTlNDb2xvcqI4KtIlJjs8V05T SW1hZ2WiOypfEA9OU0tleWVkQXJjaGl2ZXLRP0BUcm9vdIABAAgAEQAaACMALQAyADcARgBMAFcAXgBl AHIAeQCBAIMAhQCKAIwAjgCXAJwApwCpAKsArQCyALUAtwC5ALsAvQDCANkA2wDdJU8lVCVfJWgleyV/ JYolkyWYJaAloyWoJbcluyXCJcol1yXcJd4l4CXlJe0l8CX1Jf0mACYSJhUmGgAAAAAAAAIBAAAAAAAA AEEAAAAAAAAAAAAAAAAAACYcA transmission-2.92/macosx/en.lproj/PaxHeaders.4960/Localizable.strings0000644000000000000000000000013212640354044022535 xustar0030 mtime=1451350052.683154435 30 atime=1451350052.683154435 30 ctime=1457295922.717854121 transmission-2.92/macosx/en.lproj/Localizable.strings0000644000175000017500000011157612640354044024175 0ustar00mikedldmikedld00000000000000/* Inspector -> selected torrents stats -> bytes */ "%@ bytes" = "%@ bytes"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "%@ files" = "%@ files"; /* Prefs -> blocklist -> message */ "%@ IP address rules in list" = "%@ IP address rules in list"; /* Inspector -> selected torrents */ "%@ magnetized transfers" = "%@ magnetized transfers"; /* file size string Inspector -> Files tab -> file status string Status bar transfer count */ "%@ of %@" = "%1$@ of %2$@"; /* Torrent -> progress string */ "%@ of torrent metadata retrieved" = "%@ of torrent metadata retrieved"; /* Torrent -> eta string */ "%@ remaining" = "%@ remaining"; /* Add torrent -> info Inspector -> Activity tab -> progress Torrent -> progress string */ "%@ selected" = "%@ selected"; /* stats window -> times opened */ "%@ times" = "%@ times"; /* Drag overlay -> torrents */ "%@ Torrent Files" = "%@ Torrent Files"; /* Inspector -> selected torrents */ "%@ Torrents Selected" = "%@ Torrents Selected"; /* Inspector -> selected torrents stats total */ "%@ total" = "%@ total"; /* Filter Bar Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "%@ transfers" = "%@ transfers"; /* Inspector -> Activity tab -> have */ "%@ verified" = "%@ verified"; /* Inspector -> Peers tab -> peers */ "%d cache" = "%d cache"; /* Inspector -> Peers tab -> peers */ "%d Connected" = "%d Connected"; /* Inspector -> Peers tab -> peers */ "%d DHT" = "%d DHT"; /* Dock item - Downloading */ "%d Downloading" = "%d Downloading"; /* Inspector -> Peers tab -> peers */ "%d incoming" = "%d incoming"; /* Action menu -> upload/download limit Status Bar -> speed tooltip */ "%d KB/s" = "%d KB/s"; /* Inspector -> Peers tab -> peers */ "%d local discovery" = "%d local discovery"; /* Inspector -> Peers tab -> peers */ "%d LTEP" = "%d LTEP"; /* Info options -> global setting */ "%d minutes" = "%d minutes"; /* Inspector -> Peers tab -> peers */ "%d PEX" = "%d PEX"; /* Create torrent -> info */ "%d pieces, %@ each" = "%1$d pieces, %2$@ each"; /* Dock item - Seeding */ "%d Seeding" = "%d Seeding"; /* Inspector -> Peers tab -> peers */ "%d tracker" = "%d tracker"; /* Torrent -> status string */ "%d web seeds" = "%d web seeds"; /* time string */ "%u days" = "%u days"; /* time string */ "%u hr" = "%u hr"; /* time string */ "%u min" = "%u min"; /* time string */ "%u sec" = "%u sec"; /* time string */ "%u years" = "%u years"; /* time string */ "1 day" = "1 day"; /* Add torrent -> info Create torrent -> info Drag overlay -> torrents Inspector -> selected torrents */ "1 file" = "1 file"; /* Inspector -> selected torrents */ "1 magnetized transfer" = "1 magnetized transfer"; /* Info options -> global setting */ "1 minute" = "1 minute"; /* Create torrent -> info */ "1 piece, %@" = "1 piece, %@"; /* stats window -> times opened */ "1 time" = "1 time"; /* Filter Button -> tool tip Status bar transfer count Torrent table -> group row -> tooltip */ "1 transfer" = "1 transfer"; /* time string */ "1 year" = "1 year"; /* Open invalid alert -> title */ "\"%@\" is not a valid torrent file." = "\"%@\" is not a valid torrent file."; /* Prefs -> blocklist -> message */ "A blocklist must first be downloaded" = "A blocklist must first be downloaded"; /* Create torrent -> file already exists warning -> warning */ "A file with the name \"%@\" already exists in the directory \"%@\". Choose a new name or directory to create the torrent file." = "A file with the name \"%1$@\" already exists in the directory \"%2$@\". Choose a new name or directory to create the torrent file."; /* Move inside itself alert -> title */ "A folder cannot be moved to inside itself." = "A folder cannot be moved to inside itself."; /* Create torrent -> zero size -> warning */ "A torrent file cannot be created for files with no size." = "A torrent file cannot be created for files with no size."; /* Create torrent -> file already exists warning -> title */ "A torrent file with this name and directory cannot be created." = "A torrent file with this name and directory cannot be created."; /* Create torrent -> blank address -> message */ "A transfer marked as private with no tracker addresses will be unable to connect to peers. The torrent file will only be useful if you plan to upload the file to a tracker website that will add the addresses for you." = "A transfer marked as private with no tracker addresses will be unable to connect to peers. The torrent file will only be useful if you plan to upload the file to a tracker website that will add the addresses for you."; /* Open duplicate alert -> title Open duplicate magnet alert -> title */ "A transfer of \"%@\" already exists." = "A transfer of \"%@\" already exists."; /* Filter Bar -> filter button */ "Active" = "Active"; /* Inspector -> tab Inspector view -> title */ "Activity" = "Activity"; /* Add torrent -> same name -> button */ "Add" = "Add"; /* Inspector view -> tracker buttons */ "Add a tracker" = "Add a tracker"; /* Magnet link failed -> title */ "Adding magnetized transfer failed." = "Adding magnetized transfer failed."; /* Filter Bar -> filter button inspector -> check all */ "All" = "All"; /* Filter Bar -> group filter menu Groups -> Button */ "All Groups" = "All Groups"; /* Create torrent -> failed -> warning */ "An unknown error has occurred." = "An unknown error has occurred."; /* Tracker last announce */ "Announce error" = "Announce error"; /* Tracker next announce */ "Announce in progress" = "Announce in progress"; /* Tracker next announce */ "Announce is queued" = "Announce is queued"; /* Tracker next announce */ "Announce not scheduled" = "Announce not scheduled"; /* Tracker last announce */ "Announce timed out" = "Announce timed out"; /* All toolbar item -> label */ "Apply All" = "Apply All"; /* Selected toolbar item -> label */ "Apply Selected" = "Apply Selected"; /* Confirm Quit panel -> title */ "Are you sure you want to quit?" = "Are you sure you want to quit?"; /* Remove completed confirm panel -> title */ "Are you sure you want to remove %@ completed transfers from the transfer list?" = "Are you sure you want to remove %@ completed transfers from the transfer list?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list and trash the data files?" = "Are you sure you want to remove %@ transfers from the transfer list and trash the data files?"; /* Removal confirm panel -> title */ "Are you sure you want to remove %@ transfers from the transfer list?" = "Are you sure you want to remove %@ transfers from the transfer list?"; /* Remove trackers alert -> title */ "Are you sure you want to remove %d trackers?" = "Are you sure you want to remove %d trackers?"; /* Removal confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list and trash the data file?" = "Are you sure you want to remove \"%@\" from the transfer list and trash the data file?"; /* Removal confirm panel -> title Remove completed confirm panel -> title */ "Are you sure you want to remove \"%@\" from the transfer list?" = "Are you sure you want to remove \"%@\" from the transfer list?"; /* Remove trackers alert -> title */ "Are you sure you want to remove this tracker?" = "Are you sure you want to remove this tracker?"; /* Stats reset -> title */ "Are you sure you want to reset usage statistics?" = "Are you sure you want to reset usage statistics?"; /* inspector -> peer table -> header tool tip */ "Available" = "Available"; /* Preferences -> toolbar item title */ "Bandwidth" = "Bandwidth"; /* Growl notification description */ "Bandwidth settings changed" = "Bandwidth settings changed"; /* Groups -> Name */ "Blue" = "Blue"; /* Add torrent -> same name -> button Blocklist -> cancel button Confirm Quit panel -> button Create torrent -> blank address -> button Removal confirm panel -> button Remove completed confirm panel -> button Remove trackers alert -> button rename sheet button Stats reset -> button URL sheet button */ "Cancel" = "Cancel"; /* Torrent Table -> tooltip */ "Change transfer settings" = "Change transfer settings"; /* File Outline -> Menu */ "Check Selected" = "Check Selected"; /* Torrent -> status string */ "Checking existing data" = "Checking existing data"; /* Message window -> save button */ "Clear" = "Clear"; /* inspector -> peer table -> header */ "Client" = "Client"; /* View menu -> Quick Look */ "Close Quick Look" = "Close Quick Look"; /* Prefs -> Notifications */ "Configure In Growl" = "Configure In Growl"; /* Prefs -> Notifications */ "Configure In System Preferences" = "Configure In System Preferences"; /* Blocklist -> message */ "Connecting to site" = "Connecting to site"; /* Torrent file copy alert -> title */ "Copy of \"%@\" Cannot Be Created" = "Copy of \"%@\" Cannot Be Created"; /* Create torrent -> failed -> warning */ "Could not read \"%s\": %s." = "Could not read \"%1$s\": %2$s."; /* Create torrent -> failed -> warning */ "Could not write \"%s\": %s." = "Could not write \"%1$s\": %2$s."; /* Create toolbar item -> label Create torrent -> blank address -> button */ "Create" = "Create"; /* Drag overlay -> file */ "Create a Torrent File" = "Create a Torrent File"; /* Create toolbar item -> tooltip */ "Create torrent file" = "Create torrent file"; /* Create toolbar item -> palette label Create torrent -> select file */ "Create Torrent File" = "Create Torrent File"; /* Create torrent -> failed -> title */ "Creation of \"%@\" failed." = "Creation of \"%@\" failed."; /* Inspector -> peer -> status */ "Currently downloading (interested and not choked)" = "Currently downloading (interested and not choked)"; /* Inspector -> peer -> status */ "Currently uploading (interested and not choked)" = "Currently uploading (interested and not choked)"; /* Message window -> table column */ "Date" = "Date"; /* Message window -> level Message window -> level string */ "Debug" = "Debug"; /* Info options -> global setting */ "disabled" = "disabled"; /* inspector -> peer table -> header inspector -> web seed table -> header status bar -> status label Torrent -> status string */ "DL" = "DL"; /* Inspector -> Peers tab -> peers */ "DL from %d" = "DL from %d"; /* Torrent disk space alert -> button */ "Do not check disk space again" = "Do not check disk space again"; /* Donation beg -> button */ "Don't bug me about this ever again." = "Don't bug me about this ever again."; /* files tab -> tooltip */ "Don't Download" = "Don't Download"; /* Donation beg -> button */ "Donate" = "Donate"; /* Donation beg -> message */ "Donate or not, there will be no difference to your torrenting experience." = "Donate or not, there will be no difference to your torrenting experience."; /* file table -> header tool tip files tab -> tooltip */ "Download" = "Download"; /* Torrent disk space alert -> button */ "Download Anyway" = "Download Anyway"; /* notification title */ "Download Complete" = "Download Complete"; /* Blocklist -> message */ "Download of the blocklist failed." = "Download of the blocklist failed."; /* files tab -> tooltip */ "Download Some" = "Download Some"; /* Torrent table -> group row -> tooltip */ "Download speed" = "Download speed"; /* Stats window -> label tracker peer stat */ "Downloaded" = "Downloaded"; /* Filter Bar -> filter button Torrent -> status string */ "Downloading" = "Downloading"; /* Blocklist -> message */ "Downloading blocklist" = "Downloading blocklist"; /* Torrent -> status string */ "Downloading from %d of %d peers" = "Downloading from %1$d of %2$d peers"; /* Torrent -> status string */ "Downloading from %d of 1 peer" = "Downloading from %d of 1 peer"; /* inspector -> peer table -> header tool tip */ "Downloading From Peer" = "Downloading From Peer"; /* inspector -> web seed table -> header tool tip */ "Downloading From Web Seed" = "Downloading From Web Seed"; /* Inspector -> Peers tab -> table row tooltip */ "encrypted" = "encrypted"; /* inspector -> peer table -> header tool tip */ "Encrypted Connection" = "Encrypted Connection"; /* Message window -> level Message window -> level string Torrent -> status string */ "Error" = "Error"; /* Inspector -> tab Inspector view -> title */ "Files" = "Files"; /* Filter toolbar item -> label inspector -> file filter Message window -> filter field */ "Filter" = "Filter"; /* Inspector -> Peers tab -> table row tooltip */ "From: cache" = "From: cache"; /* Inspector -> Peers tab -> table row tooltip */ "From: distributed hash table" = "From: distributed hash table"; /* Inspector -> Peers tab -> table row tooltip */ "From: incoming connection" = "From: incoming connection"; /* Inspector -> Peers tab -> table row tooltip */ "From: libtorrent extension protocol handshake" = "From: libtorrent extension protocol handshake"; /* Inspector -> Peers tab -> table row tooltip */ "From: local peer discovery" = "From: local peer discovery"; /* Inspector -> Peers tab -> table row tooltip */ "From: peer exchange" = "From: peer exchange"; /* Inspector -> Peers tab -> table row tooltip */ "From: tracker" = "From: tracker"; /* File size - gigabytes file/memory size - gigabytes */ "GB" = "GB"; /* Transfer speed (gigabytes per second) */ "GB/s" = "GB/s"; /* Preferences -> toolbar item title */ "General" = "General"; /* Inspector -> tab Inspector view -> title */ "General Info" = "General Info"; /* Status Bar -> speed tooltip */ "Global download limit" = "Global download limit"; /* Status Bar -> speed tooltip */ "Global upload limit" = "Global upload limit"; /* Tracker last announce */ "got %d peers" = "got %d peers"; /* Tracker last announce */ "got 1 peer" = "got 1 peer"; /* Groups -> Name */ "Gray" = "Gray"; /* Groups -> Name */ "Green" = "Green"; /* Groups -> Button */ "Group" = "Group"; /* Preferences -> toolbar item title */ "Groups" = "Groups"; /* View menu -> Filter Bar */ "Hide Filter Bar" = "Hide Filter Bar"; /* View menu -> Inspector */ "Hide Inspector" = "Hide Inspector"; /* View menu -> Status Bar */ "Hide Status Bar" = "Hide Status Bar"; /* File Outline -> Priority Menu */ "High" = "High"; /* files tab -> tooltip */ "High Priority" = "High Priority"; /* Legal alert -> button */ "I Accept" = "I Accept"; /* Add torrent -> same name -> message */ "If you are attempting to use already existing data, the root data directory should be inside the destination directory." = "If you are attempting to use already existing data, the root data directory should be inside the destination directory."; /* Torrent -> eta string */ "inactive" = "inactive"; /* Message window -> level Message window -> level string */ "Info" = "Info"; /* Inspector toolbar item -> label */ "Inspector" = "Inspector"; /* URL sheet label */ "Internet address of torrent file:" = "Internet address of torrent file:"; /* inspector -> peer table -> header */ "IP Address" = "IP Address"; /* Download not a torrent -> message */ "It appears that the file \"%@\" from %@ is not a torrent file." = "It appears that the file \"%1$@\" from %2$@ is not a torrent file."; /* File size - kilobytes file/memory size - kilobytes */ "KB" = "KB"; /* Transfer speed (kilobytes per second) */ "KB/s" = "KB/s"; /* Tracker last announce */ "Last Announce" = "Last Announce"; /* Tracker last scrape */ "Last Scrape" = "Last Scrape"; /* Prefs -> blocklist -> message */ "Last updated" = "Last updated"; /* tracker peer stat */ "Leechers" = "Leechers"; /* About window -> license button */ "License" = "License"; /* Action menu -> upload/download limit torrent action menu -> upload/download limit */ "Limit (%d KB/s)" = "Limit (%d KB/s)"; /* Save log alert panel -> title */ "Log Could Not Be Saved" = "Log Could Not Be Saved"; /* File Outline -> Priority Menu */ "Low" = "Low"; /* files tab -> tooltip */ "Low Priority" = "Low Priority"; /* Open duplicate magnet alert -> title */ "Magnet link is a duplicate of an existing transfer." = "Magnet link is a duplicate of an existing transfer."; /* Inspector -> selected torrents Torrent -> progress string */ "Magnetized transfer" = "Magnetized transfer"; /* File size - megabytes file/memory size - megabytes */ "MB" = "MB"; /* Transfer speed (megabytes per second) */ "MB/s" = "MB/s"; /* Message window -> table column */ "Message" = "Message"; /* Message window -> title */ "Message Log" = "Message Log"; /* files tab -> tooltip */ "Multiple Priorities" = "Multiple Priorities"; /* Inspector -> Peers tab -> table row tooltip No Ratio Prefs -> blocklist -> message Tracker last announce Tracker last scrape tracker peer stat */ "N/A" = "N/A"; /* Filter Bar -> filter menu */ "Name" = "Name"; /* Preferences -> toolbar item title */ "Network" = "Network"; /* Prefs -> blocklist -> message */ "Never" = "Never"; /* Inspector -> tracker table */ "New Tier" = "New Tier"; /* Tracker next announce */ "Next announce in %@" = "Next announce in %@"; /* Group table row */ "No Group" = "No Group"; /* Inspector -> selected torrents */ "No Torrents Selected" = "No Torrents Selected"; /* Groups -> Button Groups -> Menu inspector -> check all */ "None" = "None"; /* Donation beg -> button */ "Nope" = "Nope"; /* File Outline -> Priority Menu */ "Normal" = "Normal"; /* files tab -> tooltip */ "Normal Priority" = "Normal Priority"; /* Torrent disk space alert -> title */ "Not enough remaining disk space to download \"%@\" completely." = "Not enough remaining disk space to download \"%@\" completely."; /* About window -> license close button Blocklist -> button Create torrent -> directory doesn't exist warning -> button Create torrent -> failed -> button Create torrent -> file already exists warning -> button Create torrent -> no files -> button Create torrent -> zero size -> button Download not a torrent -> button Magnet link failed -> button Move error alert -> button Move inside itself alert -> button Open duplicate alert -> button Open duplicate magnet alert -> button Open invalid alert -> button Save log alert panel -> button Torrent disk space alert -> button Torrent download failed -> button Torrent file copy alert -> button Transmission already running alert -> button */ "OK" = "OK"; /* Remove completed confirm panel -> message */ "Once removed, continuing the transfer will require the torrent file or magnet link." = "Once removed, continuing the transfer will require the torrent file or magnet link."; /* Removal confirm panel -> message part 2 Remove completed confirm panel -> message */ "Once removed, continuing the transfers will require the torrent files or magnet links." = "Once removed, continuing the transfers will require the torrent files or magnet links."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact it. This cannot be undone." = "Once removed, Transmission will no longer attempt to contact it. This cannot be undone."; /* Remove trackers alert -> message */ "Once removed, Transmission will no longer attempt to contact them. This cannot be undone." = "Once removed, Transmission will no longer attempt to contact them. This cannot be undone."; /* File Outline -> Menu */ "Only Check Selected" = "Only Check Selected"; /* Open toolbar item -> label URL sheet button */ "Open" = "Open"; /* Open address toolbar item -> label */ "Open Address" = "Open Address"; /* Open address toolbar item -> palette label */ "Open Torrent Address" = "Open Torrent Address"; /* Open toolbar item -> tooltip */ "Open torrent files" = "Open torrent files"; /* Open toolbar item -> palette label */ "Open Torrent Files" = "Open Torrent Files"; /* Open address toolbar item -> tooltip */ "Open torrent web address" = "Open torrent web address"; /* Inspector -> tab Inspector view -> title */ "Options" = "Options"; /* Groups -> Name */ "Orange" = "Orange"; /* Inspector -> Peers tab -> table row tooltip */ "Partial Seed" = "Partial Seed"; /* All toolbar item -> palette label */ "Pause / Resume All" = "Pause / Resume All"; /* Selected toolbar item -> palette label */ "Pause / Resume Selected" = "Pause / Resume Selected"; /* All toolbar item -> label Dock item */ "Pause All" = "Pause All"; /* All toolbar item -> tooltip */ "Pause all transfers" = "Pause all transfers"; /* Selected toolbar item -> label */ "Pause Selected" = "Pause Selected"; /* Selected toolbar item -> tooltip */ "Pause selected transfers" = "Pause selected transfers"; /* Torrent Table -> tooltip */ "Pause the transfer" = "Pause the transfer"; /* Filter Bar -> filter button Torrent -> status string */ "Paused" = "Paused"; /* Inspector -> peer -> status */ "Peer is unchoking you, but you are not interested" = "Peer is unchoking you, but you are not interested"; /* Inspector -> peer -> status */ "Peer wants you to upload, but you do not want to (interested and choked)" = "Peer wants you to upload, but you do not want to (interested and choked)"; /* Inspector -> tab Inspector view -> title Preferences -> toolbar item title */ "Peers" = "Peers"; /* Inspector -> Peers tab -> table row tooltip */ "Port" = "Port"; /* Preferences -> Network -> port status */ "Port check site is down" = "Port check site is down"; /* Preferences -> Network -> port status */ "Port is closed" = "Port is closed"; /* Preferences -> Network -> port status */ "Port is open" = "Port is open"; /* File Outline -> Menu file table -> header tool tip */ "Priority" = "Priority"; /* files tab -> tooltip */ "Priority Not Available" = "Priority Not Available"; /* Inspector -> private torrent */ "Private Torrent, non-tracker peer discovery disabled" = "Private Torrent, non-tracker peer discovery disabled"; /* Message window -> table column */ "Process" = "Process"; /* Blocklist -> message */ "Processing blocklist" = "Processing blocklist"; /* Stats window -> label */ "Program Started" = "Program Started"; /* Inspector -> Peers tab -> table row tooltip */ "Progress: %@" = "Progress: %@"; /* Inspector -> Peers tab -> table row tooltip */ "Protocol: %@" = "Protocol: %@"; /* Inspector -> private torrent */ "Public Torrent" = "Public Torrent"; /* Groups -> Name */ "Purple" = "Purple"; /* QuickLook toolbar item -> label QuickLook toolbar item -> palette label QuickLook toolbar item -> tooltip View menu -> Quick Look */ "Quick Look" = "Quick Look"; /* Confirm Quit panel -> button Legal alert -> button */ "Quit" = "Quit"; /* Dock Badger -> quit */ "Quitting" = "Quitting"; /* Stats window -> label status bar -> status label Torrent -> status string Torrent table -> group row -> tooltip */ "Ratio" = "Ratio"; /* Groups -> Name */ "Red" = "Red"; /* Action menu -> status string toggle */ "Remaining Time" = "Remaining Time"; /* Torrent -> eta string */ "remaining time unknown" = "remaining time unknown"; /* Preferences -> toolbar item title */ "Remote" = "Remote"; /* Removal confirm panel -> button Remove completed confirm panel -> button Remove toolbar item -> label Remove trackers alert -> button */ "Remove" = "Remove"; /* Main window -> 3rd bottom left button (remove all) tooltip */ "Remove all transfers that have completed seeding." = "Remove all transfers that have completed seeding."; /* Remove toolbar item -> palette label */ "Remove Selected" = "Remove Selected"; /* Inspector view -> tracker buttons */ "Remove selected trackers" = "Remove selected trackers"; /* Remove toolbar item -> tooltip */ "Remove selected transfers" = "Remove selected transfers"; /* rename sheet button */ "Rename" = "Rename"; /* File Outline -> Menu */ "Rename File" = "Rename File"; /* rename sheet label */ "Rename the file \"%@\":" = "Rename the file \"%@\":"; /* Stats reset -> button Stats window -> reset button */ "Reset" = "Reset"; /* All toolbar item -> label Dock item */ "Resume All" = "Resume All"; /* All toolbar item -> tooltip */ "Resume all transfers" = "Resume all transfers"; /* Selected toolbar item -> label */ "Resume Selected" = "Resume Selected"; /* Selected toolbar item -> tooltip */ "Resume selected transfers" = "Resume selected transfers"; /* Torrent cell -> button info */ "Resume the transfer" = "Resume the transfer"; /* Torrent cell -> button info */ "Resume the transfer right away" = "Resume the transfer right away"; /* Stats window -> label */ "Running Time" = "Running Time"; /* Message window -> save button */ "Save" = "Save"; /* Tracker last scrape */ "Scrape error" = "Scrape error"; /* Tracker last scrape */ "Scrape timed out" = "Scrape timed out"; /* tracker peer stat */ "Seeders" = "Seeders"; /* Filter Bar -> filter button Torrent -> status string */ "Seeding" = "Seeding"; /* Torrent -> status string */ "Seeding complete" = "Seeding complete"; /* notification title */ "Seeding Complete" = "Seeding Complete"; /* Torrent -> status string */ "Seeding to %d of %d peers" = "Seeding to %1$d of %2$d peers"; /* Torrent -> status string */ "Seeding to %d of 1 peer" = "Seeding to %d of 1 peer"; /* Create torrent -> location sheet -> button Create torrent -> select file Move torrent -> prompt Open torrent -> prompt Preferences -> Open panel prompt */ "Select" = "Select"; /* Create torrent -> select file */ "Select a file or folder for the torrent file." = "Select a file or folder for the torrent file."; /* Add -> select destination folder */ "Select the download folder for \"%@\"" = "Select the download folder for \"%@\""; /* Create torrent -> location sheet -> message */ "Select the name and location for the torrent file." = "Select the name and location for the torrent file."; /* Move torrent -> select destination folder */ "Select the new folder for %d data files." = "Select the new folder for %d data files."; /* Move torrent -> select destination folder */ "Select the new folder for \"%@\"." = "Select the new folder for \"%@\"."; /* Status Bar -> status menu */ "Session Ratio" = "Session Ratio"; /* Status Bar -> status menu */ "Session Transfer" = "Session Transfer"; /* Share toolbar item -> label Share toolbar item -> palette label */ "Share" = "Share"; /* Share toolbar item -> tooltip */ "Share torrent file" = "Share torrent file"; /* Main window -> 1st bottom left button (action) tooltip */ "Shortcuts for changing global settings." = "Shortcuts for changing global settings."; /* notification button */ "Show" = "Show"; /* View menu -> Filter Bar */ "Show Filter Bar" = "Show Filter Bar"; /* File Outline -> Menu */ "Show in Finder" = "Show in Finder"; /* View menu -> Inspector */ "Show Inspector" = "Show Inspector"; /* View menu -> Status Bar */ "Show Status Bar" = "Show Status Bar"; /* Torrent cell -> button info */ "Show the data file in Finder" = "Show the data file in Finder"; /* Dock item Status Bar -> speed tooltip */ "Speed Limit" = "Speed Limit"; /* Growl notification title */ "Speed Limit Auto Disabled" = "Speed Limit Auto Disabled"; /* Growl notification title */ "Speed Limit Auto Enabled" = "Speed Limit Auto Enabled"; /* Main window -> 2nd bottom left button (turtle) tooltip */ "Speed Limit overrides the total bandwidth limits with its own limits." = "Speed Limit overrides the total bandwidth limits with its own limits."; /* Torrent -> status string */ "Stalled" = "Stalled"; /* Stats window -> title */ "Statistics" = "Statistics"; /* Action menu -> status string toggle */ "Status of Selected Files" = "Status of Selected Files"; /* Action menu -> ratio stop torrent action menu -> ratio stop */ "Stop at Ratio (%.2f)" = "Stop at Ratio (%.2f)"; /* Torrent cell -> button info */ "Stop waiting to start" = "Stop waiting to start"; /* Donation beg -> title */ "Support open-source indie software" = "Support open-source indie software"; /* File size - terabytes file/memory size - terabytes */ "TB" = "TB"; /* Transfer speed (terabytes per second) */ "TB/s" = "TB/s"; /* Create torrent -> directory doesn't exist warning -> title */ "The chosen torrent file location does not exist." = "The chosen torrent file location does not exist."; /* Add torrent -> same name -> title */ "The destination directory and root data directory have the same name." = "The destination directory and root data directory have the same name."; /* Create torrent -> directory doesn't exist warning -> warning */ "The directory \"%@\" does not currently exist. Create this directory or choose a different one to create the torrent file." = "The directory \"%@\" does not currently exist. Create this directory or choose a different one to create the torrent file."; /* Open duplicate magnet alert -> message */ "The magnet link \"%@\" cannot be added because it is a duplicate of an already existing transfer." = "The magnet link \"%@\" cannot be added because it is a duplicate of an already existing transfer."; /* Move error alert -> message Move inside itself alert -> message */ "The move operation of \"%@\" cannot be done." = "The move operation of \"%@\" cannot be done."; /* blocklist fail message */ "The specified blocklist file did not contain any valid rules." = "The specified blocklist file did not contain any valid rules."; /* Torrent download failed -> message */ "The torrent could not be downloaded from %@: %@." = "The torrent could not be downloaded from %1$@: %2$@."; /* Torrent file copy alert -> message */ "The torrent file (%@) cannot be found." = "The torrent file (%@) cannot be found."; /* Open invalid alert -> message */ "The torrent file cannot be opened because it contains invalid data." = "The torrent file cannot be opened because it contains invalid data."; /* Create torrent -> zero size -> title */ "The total file size is zero bytes." = "The total file size is zero bytes."; /* Open duplicate alert -> message */ "The transfer cannot be added because it is a duplicate of an already existing transfer." = "The transfer cannot be added because it is a duplicate of an already existing transfer."; /* Torrent disk space alert -> message */ "The transfer will be paused. Clear up space on %@ or deselect files in the torrent inspector to continue." = "The transfer will be paused. Clear up space on %@ or deselect files in the torrent inspector to continue."; /* Create torrent -> blank address -> message */ "The transfer will not contact trackers for peers, and will have to rely solely on non-tracker peer discovery methods such as PEX and DHT to download and seed." = "The transfer will not contact trackers for peers, and will have to rely solely on non-tracker peer discovery methods such as PEX and DHT to download and seed."; /* Removal confirm panel -> message part 1 */ "There are %@ active transfers." = "There are %@ active transfers."; /* Removal confirm panel -> message part 1 */ "There are %@ transfers (%@ active)." = "There are %1$@ transfers (%2$@ active)."; /* Confirm Quit panel -> message */ "There are %d active transfers that will be paused on quit. The transfers will automatically resume on the next launch." = "There are %d active transfers that will be paused on quit. The transfers will automatically resume on the next launch."; /* Create torrent -> blank address -> title */ "There are no tracker addresses." = "There are no tracker addresses."; /* Transmission already running alert -> message */ "There is already a copy of Transmission running. This copy cannot be opened until that instance is quit." = "There is already a copy of Transmission running. This copy cannot be opened until that instance is quit."; /* Confirm Quit panel -> message */ "There is an active transfer that will be paused on quit. The transfer will automatically resume on the next launch." = "There is an active transfer that will be paused on quit. The transfer will automatically resume on the next launch."; /* Create torrent -> no files -> warning */ "There must be at least one file in a folder to create a torrent file." = "There must be at least one file in a folder to create a torrent file."; /* Save log alert panel -> message */ "There was a problem creating the file \"%@\"." = "There was a problem creating the file \"%@\"."; /* Move error alert -> title */ "There was an error moving the data file." = "There was an error moving the data file."; /* Magnet link failed -> message */ "There was an error when adding the magnet link \"%@\". The transfer will not occur." = "There was an error when adding the magnet link \"%@\". The transfer will not occur."; /* Create torrent -> no files -> title */ "This folder contains no files." = "This folder contains no files."; /* Removal confirm panel -> message */ "This transfer is active. Once removed, continuing the transfer will require the torrent file or magnet link." = "This transfer is active. Once removed, continuing the transfer will require the torrent file or magnet link."; /* Stats reset -> message */ "This will clear the global statistics displayed by Transmission. Individual transfer statistics will not be affected." = "This will clear the global statistics displayed by Transmission. Individual transfer statistics will not be affected."; /* Inspector -> tracker table */ "Tier %d" = "Tier %d"; /* Filter toolbar item -> palette label */ "Toggle Filter" = "Toggle Filter"; /* Inspector toolbar item -> palette label */ "Toggle Inspector" = "Toggle Inspector"; /* Filter toolbar item -> tooltip */ "Toggle the filter bar" = "Toggle the filter bar"; /* Inspector toolbar item -> tooltip */ "Toggle the torrent inspector" = "Toggle the torrent inspector"; /* Download not a torrent -> title Torrent download error -> title */ "Torrent download failed" = "Torrent download failed"; /* notification title */ "Torrent File Auto Added" = "Torrent File Auto Added"; /* Inspector -> title */ "Torrent Inspector" = "Torrent Inspector"; /* Torrent -> progress string */ "torrent metadata needed" = "torrent metadata needed"; /* stats total */ "Total N/A" = "Total N/A"; /* Status Bar -> status menu */ "Total Ratio" = "Total Ratio"; /* Status Bar -> status menu */ "Total Transfer" = "Total Transfer"; /* Filter Bar -> filter menu */ "Tracker" = "Tracker"; /* Torrent -> status string */ "Tracker returned error" = "Tracker returned error"; /* Torrent -> status string */ "Tracker returned warning" = "Tracker returned warning"; /* Tracker next announce */ "Tracker will be used as a backup" = "Tracker will be used as a backup"; /* Inspector -> tab Inspector view -> title */ "Trackers" = "Trackers"; /* Inspector -> Peers tab -> peers */ "Transfer Not Active" = "Transfer Not Active"; /* Preferences -> toolbar item title */ "Transfers" = "Transfers"; /* Inspector -> Peers tab -> peers */ "Transfers Not Active" = "Transfers Not Active"; /* Legal alert -> message */ "Transmission is a file-sharing program. When you run a torrent, its data will be made available to others by means of upload. You and you alone are fully responsible for exercising proper judgement and abiding by your local laws." = "Transmission is a file-sharing program. When you run a torrent, its data will be made available to others by means of upload. You and you alone are fully responsible for exercising proper judgement and abiding by your local laws."; /* Donation beg -> message */ "Transmission is a full-featured torrent application. A lot of time and effort have gone into development, coding, and refinement. If you enjoy using it, please consider showing your love with a donation." = "Transmission is a full-featured torrent application. A lot of time and effort have gone into development, coding, and refinement. If you enjoy using it, please consider showing your love with a donation."; /* Transmission already running alert -> title */ "Transmission is already running." = "Transmission is already running."; /* inspector -> peer table -> header status bar -> status label Torrent -> status string */ "UL" = "UL"; /* Inspector -> Peers tab -> peers */ "UL to %d" = "UL to %d"; /* File Outline -> Menu */ "Uncheck Selected" = "Uncheck Selected"; /* Status Bar -> speed tooltip */ "unlimited" = "unlimited"; /* Torrent -> error string unreadable */ "unreadable error" = "unreadable error"; /* Save log panel -> default file name */ "untitled" = "untitled"; /* Torrent table -> group row -> tooltip */ "Upload speed" = "Upload speed"; /* Stats window -> label */ "Uploaded" = "Uploaded"; /* Torrent -> progress string */ "uploaded %@ (Ratio: %@)" = "uploaded %1$@ (Ratio: %2$@)"; /* inspector -> peer table -> header tool tip */ "Uploading To Peer" = "Uploading To Peer"; /* Torrent -> status string */ "Waiting to check existing data" = "Waiting to check existing data"; /* Torrent -> status string */ "Waiting to download" = "Waiting to download"; /* Torrent -> status string */ "Waiting to seed" = "Waiting to seed"; /* Drag overlay -> url */ "Web Address" = "Web Address"; /* Torrent -> status string */ "web seed" = "web seed"; /* inspector -> web seed table -> header */ "Web Seeds" = "Web Seeds"; /* Legal alert -> title */ "Welcome to Transmission" = "Welcome to Transmission"; /* Groups -> Name */ "Yellow" = "Yellow"; /* Inspector -> peer -> status */ "You unchoked the peer, but the peer is not interested" = "You unchoked the peer, but the peer is not interested"; /* Inspector -> peer -> status */ "You want to download, but peer does not want to send (interested and choked)" = "You want to download, but peer does not want to send (interested and choked)"; transmission-2.92/macosx/en.lproj/PaxHeaders.4960/InfoOptionsView.xib0000644000000000000000000000013012664476420022516 xustar0029 mtime=1456635152.05449752 29 atime=1456635152.05449752 30 ctime=1457295922.716854104 transmission-2.92/macosx/en.lproj/InfoOptionsView.xib0000644000175000017500000012113212664476420024145 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/en.lproj/PaxHeaders.4960/InfoActivityView.xib0000644000000000000000000000013012664476420022657 xustar0029 mtime=1456635152.05449752 29 atime=1456635152.05449752 30 ctime=1457295922.717854121 transmission-2.92/macosx/en.lproj/InfoActivityView.xib0000644000175000017500000012745112664476420024320 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/en.lproj/PaxHeaders.4960/InfoGeneralView.xib0000644000000000000000000000013012664476420022440 xustar0029 mtime=1456635152.05449752 29 atime=1456635152.05449752 30 ctime=1457295922.717854121 transmission-2.92/macosx/en.lproj/InfoGeneralView.xib0000644000175000017500000006270312664476420024077 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/en.lproj/PaxHeaders.4960/AddMagnetWindow.xib0000644000000000000000000000013212662757243022435 xustar0030 mtime=1456201379.327863113 30 atime=1456201379.327863113 30 ctime=1457295922.717854121 transmission-2.92/macosx/en.lproj/AddMagnetWindow.xib0000644000175000017500000006534512662757243024077 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/en.lproj/PaxHeaders.4960/MainMenu.xib0000644000000000000000000000013212644245522021122 xustar0030 mtime=1452362578.760699186 30 atime=1452362578.760699186 30 ctime=1457295922.717854121 transmission-2.92/macosx/en.lproj/MainMenu.xib0000644000175000017500000045736212644245522022570 0ustar00mikedldmikedld00000000000000 CA CA YnBsaXN0MDDUAQIDBAUGPT5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK4HCBMU GR4fIyQrLjE3OlUkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVw c1dOU0NvbG9ygAKADRIgwAAAgAOAC1h7NjIsIDYyfdIVChYYWk5TLm9iamVjdHOhF4AEgArSFQoaHaIb HIAFgAaACRAA0iAKISJfEBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPEgABAG5NTQAqAADwSPLy8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y 8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v8A EQEAAAMAAAABAHwAAAEBAAMAAAABAHwAAAECAAMAAAAEAADxKgEDAAMAAAABAAEAAAEGAAMAAAABAAIA AAERAAQAAAABAAAACAESAAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABAHwAAAEXAAQAAAABAADw QAEaAAUAAAABAADxGgEbAAUAAAABAADxIgEcAAMAAAABAAEAAAEoAAMAAAABAAIAAAFSAAMAAAABAAEA AAFTAAMAAAAEAADxModzAAcAAA80AADxOgAAAAAAAACQAAAAAQAAAJAAAAABAAgACAAIAAgAAQABAAEA AQAADzRhcHBsAhAAAG1udHJSR0IgWFlaIAffAAwABQANABIACGFjc3BBUFBMAAAAAEFQUEwAAAAAAAAA AAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAEWRlc2MAAAFQAAAAYmRzY20AAAG0AAAEGmNwcnQAAAXQAAAAI3d0cHQAAAX0AAAA FHJYWVoAAAYIAAAAFGdYWVoAAAYcAAAAFGJYWVoAAAYwAAAAFHJUUkMAAAZEAAAIDGFhcmcAAA5QAAAA IHZjZ3QAAA5wAAAAMG5kaW4AAA6gAAAAPmNoYWQAAA7gAAAALG1tb2QAAA8MAAAAKGJUUkMAAAZEAAAI DGdUUkMAAAZEAAAIDGFhYmcAAA5QAAAAIGFhZ2cAAA5QAAAAIGRlc2MAAAAAAAAACERpc3BsYXkAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAACIAAAAMaHJIUgAAABQAAAGoa29LUgAAAAwAAAG8bmJO TwAAABIAAAHIaWQAAAAAABIAAAHaaHVIVQAAABQAAAHsY3NDWgAAABYAAAIAZGFESwAAABwAAAIWdWtV QQAAABwAAAIyYXIAAAAAABQAAAJOaXRJVAAAABQAAAJicm9STwAAABIAAAJ2bmxOTAAAABYAAAKIaGVJ TAAAABYAAAKeZXNFUwAAABIAAAJ2ZmlGSQAAABAAAAK0emhUVwAAAAwAAALEdmlWTgAAAA4AAALQc2tT SwAAABYAAALeemhDTgAAAAwAAALEcnVSVQAAACQAAAL0ZnJGUgAAABYAAAMYbXMAAAAAABIAAAMuY2FF UwAAABgAAANAdGhUSAAAAAwAAANYZXNYTAAAABIAAAJ2ZGVERQAAABAAAANkZW5VUwAAABIAAAN0cHRC UgAAABgAAAOGcGxQTAAAABIAAAOeZWxHUgAAACIAAAOwc3ZTRQAAABAAAAPSdHJUUgAAABQAAAPiamFK UAAAAA4AAAP2cHRQVAAAABYAAAQEAEwAQwBEACAAdQAgAGIAbwBqAGnO7LfsACAATABDAEQARgBhAHIA ZwBlAC0ATABDAEQATABDAEQAIABXAGEAcgBuAGEAUwB6AO0AbgBlAHMAIABMAEMARABCAGEAcgBlAHYA bgD9ACAATABDAEQATABDAEQALQBmAGEAcgB2AGUAcwBrAOYAcgBtBBoEPgQ7BEwEPgRABD4EMgQ4BDkA IABMAEMARCAPAEwAQwBEACAGRQZEBkgGRgYpAEwAQwBEACAAYwBvAGwAbwByAGkATABDAEQAIABjAG8A bABvAHIASwBsAGUAdQByAGUAbgAtAEwAQwBEIA8ATABDAEQAIAXmBdEF4gXVBeAF2QBWAOQAcgBpAC0A TABDAERfaYJyACAATABDAEQATABDAEQAIABNAOAAdQBGAGEAcgBlAGIAbgDpACAATABDAEQEJgQyBDUE QgQ9BD4EOQAgBBYEGgAtBDQEOARBBD8EOwQ1BDkATABDAEQAIABjAG8AdQBsAGUAdQByAFcAYQByAG4A YQAgAEwAQwBEAEwAQwBEACAAZQBuACAAYwBvAGwAbwByAEwAQwBEACAOKg41AEYAYQByAGIALQBMAEMA RABDAG8AbABvAHIAIABMAEMARABMAEMARAAgAEMAbwBsAG8AcgBpAGQAbwBLAG8AbABvAHIAIABMAEMA RAOIA7MDxwPBA8kDvAO3ACADvwO4A8wDvQO3ACAATABDAEQARgDkAHIAZwAtAEwAQwBEAFIAZQBuAGsA bABpACAATABDAEQwqzDpMPwAIABMAEMARABMAEMARAAgAGEAIABDAG8AcgBlAHMAAHRleHQAAAAAQ29w eXJpZ2h0IEFwcGxlIEluYy4sIDIwMTUAAFhZWiAAAAAAAADzFgABAAAAARbKWFlaIAAAAAAAAHHAAAA5 igAAAWdYWVogAAAAAAAAYSMAALnmAAAT9lhZWiAAAAAAAAAj8gAADJAAAL3QY3VydgAAAAAAAAQAAAAA BQAKAA8AFAAZAB4AIwAoAC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUA mgCfAKMAqACtALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgB PgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0C JgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08D WgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME 4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8G wAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI +wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4AL mAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8O mw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegS BxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V 4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e 6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/Ak HyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p 0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv /jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2 rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE9 4D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVF mkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN 3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxW qVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7Ng BWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp 8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0 cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/ hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqL MIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqX dZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+ak VqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/ 9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbO ts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3Zbe HN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7Zzu KO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+ 3P9t//9wYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKDnZjZ3QAAAAAAAAAAQABAAAAAAAAAAEA AAABAAAAAAAAAAEAAAABAAAAAAAAAAEAAG5kaW4AAAAAAAAANgAAp0AAAFWAAABMwAAAnsAAACWAAAAM wAAAUAAAAFRAAAIzMwACMzMAAjMzAAAAAAAAAABzZjMyAAAAAAABDHIAAAX4///zHQAAB7oAAP1y///7 nf///aQAAAPZAADAcW1tb2QAAAAAAAAGEAAAoA4AAAAAyc58GAAAAAAAAAAAAAAAAAAAAADSJSYnKFok Y2xhc3NuYW1lWCRjbGFzc2VzXxAQTlNCaXRtYXBJbWFnZVJlcKMnKSpaTlNJbWFnZVJlcFhOU09iamVj dNIlJiwtV05TQXJyYXmiLCrSJSYvMF5OU011dGFibGVBcnJheaMvLCrTMjMKNDU2V05TV2hpdGVcTlND b2xvclNwYWNlRDAgMAAQA4AM0iUmODlXTlNDb2xvcqI4KtIlJjs8V05TSW1hZ2WiOypfEA9OU0tleWVk QXJjaGl2ZXLRP0BUcm9vdIABAAAACAAAABEAAAAaAAAAIwAAAC0AAAAyAAAANwAAAEYAAABMAAAAVwAA AF4AAABlAAAAcgAAAHkAAACBAAAAgwAAAIUAAACKAAAAjAAAAI4AAACXAAAAnAAAAKcAAACpAAAAqwAA AK0AAACyAAAAtQAAALcAAAC5AAAAuwAAAL0AAADCAAAA2QAAANsAAADdAAEBUQABAVYAAQFhAAEBagAB AX0AAQGBAAEBjAABAZUAAQGaAAEBogABAaUAAQGqAAEBuQABAb0AAQHEAAEBzAABAdkAAQHeAAEB4AAB AeIAAQHnAAEB7wABAfIAAQH3AAEB/wABAgIAAQIUAAECFwABAhwAAAAAAAAEAQAAAAAAAABBAAAAAAAA AAAAAAAAAAECHg transmission-2.92/macosx/en.lproj/PaxHeaders.4960/GroupRules.xib0000644000000000000000000000013212666747213021530 xustar0030 mtime=1457245835.354999317 30 atime=1457245835.354999317 30 ctime=1457295922.717854121 transmission-2.92/macosx/en.lproj/GroupRules.xib0000644000175000017500000004154612666747213023167 0ustar00mikedldmikedld00000000000000 name comment name comment fFlatFileList.name allTrackersFlat fFlatFileList.name allTrackersFlat transmission-2.92/macosx/en.lproj/PaxHeaders.4960/AddWindow.xib0000644000000000000000000000013212640354044021265 xustar0030 mtime=1451350052.680154383 30 atime=1451350052.680154383 30 ctime=1457295922.717854121 transmission-2.92/macosx/en.lproj/AddWindow.xib0000644000175000017500000007271712640354044022730 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/en.lproj/PaxHeaders.4960/GlobalOptionsPopover.xib0000644000000000000000000000012612640354044023537 xustar0028 mtime=1451350052.6811544 28 atime=1451350052.6811544 30 ctime=1457295922.717854121 transmission-2.92/macosx/en.lproj/GlobalOptionsPopover.xib0000644000175000017500000006365412640354044025177 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/ExpandedPathToIconTransformer.m0000644000000000000000000000013112442116621023230 xustar0030 mtime=1418239377.037464324 30 atime=1418239377.037464324 29 ctime=1457295923.05885992 transmission-2.92/macosx/ExpandedPathToIconTransformer.m0000644000175000017500000000421112442116621024654 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: ExpandedPathToIconTransformer.m 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "ExpandedPathToIconTransformer.h" @implementation ExpandedPathToIconTransformer + (Class) transformedValueClass { return [NSImage class]; } + (BOOL) allowsReverseTransformation { return NO; } - (id) transformedValue: (id) value { if (!value) return nil; NSString * path = [value stringByExpandingTildeInPath]; NSImage * icon; //show a folder icon if the folder doesn't exist if ([[path pathExtension] isEqualToString: @""] && ![[NSFileManager defaultManager] fileExistsAtPath: path]) icon = [[NSWorkspace sharedWorkspace] iconForFileType: NSFileTypeForHFSTypeCode(kGenericFolderIcon)]; else icon = [[NSWorkspace sharedWorkspace] iconForFile: path]; [icon setSize: NSMakeSize(16.0, 16.0)]; return icon; } @endtransmission-2.92/macosx/PaxHeaders.4960/FilePriorityCell.m0000644000000000000000000000013212442116641020550 xustar0030 mtime=1418239393.769751066 30 atime=1418239393.769751066 30 ctime=1457295923.133861195 transmission-2.92/macosx/FilePriorityCell.m0000644000175000017500000001567412442116641022212 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: FilePriorityCell.m 13340 2012-06-10 02:35:58Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "FilePriorityCell.h" #import "FileOutlineView.h" #import "FileListNode.h" #import "NSImageAdditions.h" #import "Torrent.h" #define IMAGE_OVERLAP 1.0 @implementation FilePriorityCell - (id) init { if ((self = [super init])) { [self setTrackingMode: NSSegmentSwitchTrackingSelectAny]; [self setControlSize: NSMiniControlSize]; [self setSegmentCount: 3]; for (NSInteger i = 0; i < [self segmentCount]; i++) { [self setLabel: @"" forSegment: i]; [self setWidth: 9.0f forSegment: i]; //9 is minimum size to get proper look } [self setImage: [NSImage imageNamed: @"PriorityControlLow"] forSegment: 0]; [self setImage: [NSImage imageNamed: @"PriorityControlNormal"] forSegment: 1]; [self setImage: [NSImage imageNamed: @"PriorityControlHigh"] forSegment: 2]; fHoverRow = NO; } return self; } - (id) copyWithZone: (NSZone *) zone { id value = [super copyWithZone: zone]; [value setRepresentedObject: [self representedObject]]; return value; } - (void) setSelected: (BOOL) flag forSegment: (NSInteger) segment { [super setSelected: flag forSegment: segment]; //only for when clicking manually NSInteger priority; switch (segment) { case 0: priority = TR_PRI_LOW; break; case 1: priority = TR_PRI_NORMAL; break; case 2: priority = TR_PRI_HIGH; break; } Torrent * torrent = [(FileListNode *)[self representedObject] torrent]; [torrent setFilePriority: priority forIndexes: [(FileListNode *)[self representedObject] indexes]]; FileOutlineView * controlView = (FileOutlineView *)[self controlView]; [controlView setNeedsDisplay: YES]; } - (void) addTrackingAreasForView: (NSView *) controlView inRect: (NSRect) cellFrame withUserInfo: (NSDictionary *) userInfo mouseLocation: (NSPoint) mouseLocation { NSTrackingAreaOptions options = NSTrackingEnabledDuringMouseDrag | NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways; if (NSMouseInRect(mouseLocation, cellFrame, [controlView isFlipped])) { options |= NSTrackingAssumeInside; [controlView setNeedsDisplayInRect: cellFrame]; } NSTrackingArea * area = [[NSTrackingArea alloc] initWithRect: cellFrame options: options owner: controlView userInfo: userInfo]; [controlView addTrackingArea: area]; [area release]; } - (void) setHovered: (BOOL) hovered { fHoverRow = hovered; } - (void) drawWithFrame: (NSRect) cellFrame inView: (NSView *) controlView { FileListNode * node = [self representedObject]; Torrent * torrent = [node torrent]; NSSet * priorities = [torrent filePrioritiesForIndexes: [node indexes]]; const NSUInteger count = [priorities count]; if (fHoverRow && count > 0) { [super setSelected: [priorities containsObject: [NSNumber numberWithInteger: TR_PRI_LOW]] forSegment: 0]; [super setSelected: [priorities containsObject: [NSNumber numberWithInteger: TR_PRI_NORMAL]] forSegment: 1]; [super setSelected: [priorities containsObject: [NSNumber numberWithInteger: TR_PRI_HIGH]] forSegment: 2]; [super drawWithFrame: cellFrame inView: controlView]; } else { NSMutableArray * images = [NSMutableArray arrayWithCapacity: MAX(count, 1)]; CGFloat totalWidth; if (count == 0) { //if ([self backgroundStyle] != NSBackgroundStyleDark) { NSImage * image = [[NSImage imageNamed: @"PriorityNormalTemplate"] imageWithColor: [NSColor lightGrayColor]]; [images addObject: image]; totalWidth = [image size].width; } } else { NSColor * priorityColor = [self backgroundStyle] == NSBackgroundStyleDark ? [NSColor whiteColor] : [NSColor darkGrayColor]; totalWidth = 0.0; if ([priorities containsObject: [NSNumber numberWithInteger: TR_PRI_LOW]]) { NSImage * image = [[NSImage imageNamed: @"PriorityLowTemplate"] imageWithColor: priorityColor]; [images addObject: image]; totalWidth += [image size].width; } if ([priorities containsObject: [NSNumber numberWithInteger: TR_PRI_NORMAL]]) { NSImage * image = [[NSImage imageNamed: @"PriorityNormalTemplate"] imageWithColor: priorityColor]; [images addObject: image]; totalWidth += [image size].width; } if ([priorities containsObject: [NSNumber numberWithInteger: TR_PRI_HIGH]]) { NSImage * image = [[NSImage imageNamed: @"PriorityHighTemplate"] imageWithColor: priorityColor]; [images addObject: image]; totalWidth += [image size].width; } } if (count > 1) totalWidth -= IMAGE_OVERLAP * (count-1); CGFloat currentWidth = floor(NSMidX(cellFrame) - totalWidth * 0.5); for (NSImage * image in images) { const NSSize imageSize = [image size]; const NSRect imageRect = NSMakeRect(currentWidth, floor(NSMidY(cellFrame) - imageSize.height * 0.5), imageSize.width, imageSize.height); [image drawInRect: imageRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0 respectFlipped: YES hints: nil]; currentWidth += imageSize.width - IMAGE_OVERLAP; } } } @end transmission-2.92/macosx/PaxHeaders.4960/TrackerNode.h0000644000000000000000000000013212442116672017527 xustar0030 mtime=1418239418.291171283 30 atime=1418239418.291171283 30 ctime=1457295923.616869409 transmission-2.92/macosx/TrackerNode.h0000644000175000017500000000374312442116672021163 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: TrackerNode.h 13251 2012-03-13 02:52:11Z livings124 $ * * Copyright (c) 2009-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import @class Torrent; @interface TrackerNode : NSObject { tr_tracker_stat fStat; Torrent * fTorrent; } @property (nonatomic, readonly) Torrent * torrent; - (id) initWithTrackerStat: (tr_tracker_stat *) stat torrent: (Torrent *) torrent; - (BOOL) isEqual: (id) object; - (NSString *) host; - (NSString *) fullAnnounceAddress; - (NSInteger) tier; - (NSUInteger) identifier; - (NSInteger) totalSeeders; - (NSInteger) totalLeechers; - (NSInteger) totalDownloaded; - (NSString *) lastAnnounceStatusString; - (NSString *) nextAnnounceStatusString; - (NSString *) lastScrapeStatusString; @end transmission-2.92/macosx/PaxHeaders.4960/BadgeView.h0000644000000000000000000000013212442116621017155 xustar0030 mtime=1418239377.042464409 30 atime=1418239377.042464409 30 ctime=1457295922.928857709 transmission-2.92/macosx/BadgeView.h0000644000175000017500000000330612442116621020604 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: BadgeView.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2007-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import @interface BadgeView : NSView { tr_session * fLib; NSMutableDictionary * fAttributes; CGFloat fDownloadRate, fUploadRate; BOOL fQuitting; } - (id) initWithLib: (tr_session *) lib; - (BOOL) setRatesWithDownload: (CGFloat) downloadRate upload: (CGFloat) uploadRate; - (void) setQuitting; @end transmission-2.92/macosx/PaxHeaders.4960/VDKQueue0000644000000000000000000000013212442116641016525 xustar0030 mtime=1418239393.773751135 30 atime=1418239393.700749884 30 ctime=1457295922.622852506 transmission-2.92/macosx/VDKQueue/0000755000175000017500000000000012442116641020227 5ustar00mikedldmikedld00000000000000transmission-2.92/macosx/VDKQueue/PaxHeaders.4960/VDKQueue.m0000644000000000000000000000013212442116641020411 xustar0030 mtime=1418239393.773751135 30 atime=1418239393.772751118 30 ctime=1457295922.622852506 transmission-2.92/macosx/VDKQueue/VDKQueue.m0000755000175000017500000003412712442116641022050 0ustar00mikedldmikedld00000000000000// VDKQueue.m // Created by Bryan D K Jones on 28 March 2012 // Copyright 2013 Bryan D K Jones // // Based heavily on UKKQueue, which was created and copyrighted by Uli Kusterer on 21 Dec 2003. // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source // distribution. #import "VDKQueue.h" #import #import #include NSString * VDKQueueRenameNotification = @"VDKQueueFileRenamedNotification"; NSString * VDKQueueWriteNotification = @"VDKQueueFileWrittenToNotification"; NSString * VDKQueueDeleteNotification = @"VDKQueueFileDeletedNotification"; NSString * VDKQueueAttributeChangeNotification = @"VDKQueueFileAttributesChangedNotification"; NSString * VDKQueueSizeIncreaseNotification = @"VDKQueueFileSizeIncreasedNotification"; NSString * VDKQueueLinkCountChangeNotification = @"VDKQueueLinkCountChangedNotification"; NSString * VDKQueueAccessRevocationNotification = @"VDKQueueAccessWasRevokedNotification"; #pragma mark - #pragma mark VDKQueuePathEntry #pragma mark - #pragma ------------------------------------------------------------------------------------------------------------------------------------------------------------ // This is a simple model class used to hold info about each path we watch. @interface VDKQueuePathEntry : NSObject { NSString* _path; int _watchedFD; u_int _subscriptionFlags; } - (id) initWithPath:(NSString*)inPath andSubscriptionFlags:(u_int)flags; @property (atomic, copy) NSString *path; @property (atomic, assign) int watchedFD; @property (atomic, assign) u_int subscriptionFlags; @end @implementation VDKQueuePathEntry @synthesize path = _path, watchedFD = _watchedFD, subscriptionFlags = _subscriptionFlags; - (id) initWithPath:(NSString*)inPath andSubscriptionFlags:(u_int)flags; { self = [super init]; if (self) { _path = [inPath copy]; _watchedFD = open([_path fileSystemRepresentation], O_EVTONLY, 0); if (_watchedFD < 0) { [self autorelease]; return nil; } _subscriptionFlags = flags; } return self; } -(void) dealloc { [_path release]; _path = nil; if (_watchedFD >= 0) close(_watchedFD); _watchedFD = -1; [super dealloc]; } @end #pragma mark - #pragma mark VDKQueue #pragma mark - #pragma ------------------------------------------------------------------------------------------------------------------------------------------------------------ @interface VDKQueue () - (void) watcherThread:(id)sender; @end @implementation VDKQueue @synthesize delegate = _delegate, alwaysPostNotifications = _alwaysPostNotifications; #pragma mark - #pragma mark INIT/DEALLOC - (id) init { self = [super init]; if (self) { _coreQueueFD = kqueue(); if (_coreQueueFD == -1) { [self autorelease]; return nil; } _alwaysPostNotifications = NO; _watchedPathEntries = [[NSMutableDictionary alloc] init]; } return self; } - (void) dealloc { // Shut down the thread that's scanning for kQueue events _keepWatcherThreadRunning = NO; // Do this to close all the open file descriptors for files we're watching [self removeAllPaths]; [_watchedPathEntries release]; _watchedPathEntries = nil; [super dealloc]; } #pragma mark - #pragma mark PRIVATE METHODS - (VDKQueuePathEntry *) addPathToQueue:(NSString *)path notifyingAbout:(u_int)flags { @synchronized(self) { // Are we already watching this path? VDKQueuePathEntry *pathEntry = [_watchedPathEntries objectForKey:path]; if (pathEntry) { // All flags already set? if(([pathEntry subscriptionFlags] & flags) == flags) { return [[pathEntry retain] autorelease]; } flags |= [pathEntry subscriptionFlags]; } struct timespec nullts = { 0, 0 }; struct kevent ev; if (!pathEntry) { pathEntry = [[[VDKQueuePathEntry alloc] initWithPath:path andSubscriptionFlags:flags] autorelease]; } if (pathEntry) { EV_SET(&ev, [pathEntry watchedFD], EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, flags, 0, pathEntry); [pathEntry setSubscriptionFlags:flags]; [_watchedPathEntries setObject:pathEntry forKey:path]; kevent(_coreQueueFD, &ev, 1, NULL, 0, &nullts); // Start the thread that fetches and processes our events if it's not already running. if(!_keepWatcherThreadRunning) { _keepWatcherThreadRunning = YES; [NSThread detachNewThreadSelector:@selector(watcherThread:) toTarget:self withObject:nil]; } } return [[pathEntry retain] autorelease]; } return nil; } // // WARNING: This thread has no active autorelease pool, so if you make changes, you must manually manage // memory without relying on autorelease. Otherwise, you will leak! // - (void) watcherThread:(id)sender { int n; struct kevent ev; struct timespec timeout = { 1, 0 }; // 1 second timeout. Should be longer, but we need this thread to exit when a kqueue is dealloced, so 1 second timeout is quite a while to wait. int theFD = _coreQueueFD; // So we don't have to risk accessing iVars when the thread is terminated. NSMutableArray *notesToPost = [[NSMutableArray alloc] initWithCapacity:5]; #if DEBUG_LOG_THREAD_LIFETIME NSLog(@"watcherThread started."); #endif while(_keepWatcherThreadRunning) { @try { n = kevent(theFD, NULL, 0, &ev, 1, &timeout); if (n > 0) { //NSLog( @"KEVENT returned %d", n ); if (ev.filter == EVFILT_VNODE) { //NSLog( @"KEVENT filter is EVFILT_VNODE" ); if (ev.fflags) { //NSLog( @"KEVENT flags are set" ); // // Note: VDKQueue gets tested by thousands of CodeKit users who each watch several thousand files at once. // I was receiving about 3 EXC_BAD_ACCESS (SIGSEGV) crash reports a month that listed the 'path' objc_msgSend // as the culprit. That suggests the KEVENT is being sent back to us with a udata value that is NOT what we assigned // to the queue, though I don't know why and I don't know why it's intermittent. Regardless, I've added an extra // check here to try to eliminate this (infrequent) problem. In theory, a KEVENT that does not have a VDKQueuePathEntry // object attached as the udata parameter is not an event we registered for, so we should not be "missing" any events. In theory. // id pe = ev.udata; if (pe && [pe respondsToSelector:@selector(path)]) { NSString *fpath = [((VDKQueuePathEntry *)pe).path retain]; // Need to retain so it does not disappear while the block at the bottom is waiting to run on the main thread. Released in that block. if (!fpath) continue; [[NSWorkspace sharedWorkspace] noteFileSystemChanged:fpath]; // Clear any old notifications [notesToPost removeAllObjects]; // Figure out which notifications we need to issue if ((ev.fflags & NOTE_RENAME) == NOTE_RENAME) { [notesToPost addObject:VDKQueueRenameNotification]; } if ((ev.fflags & NOTE_WRITE) == NOTE_WRITE) { [notesToPost addObject:VDKQueueWriteNotification]; } if ((ev.fflags & NOTE_DELETE) == NOTE_DELETE) { [notesToPost addObject:VDKQueueDeleteNotification]; } if ((ev.fflags & NOTE_ATTRIB) == NOTE_ATTRIB) { [notesToPost addObject:VDKQueueAttributeChangeNotification]; } if ((ev.fflags & NOTE_EXTEND) == NOTE_EXTEND) { [notesToPost addObject:VDKQueueSizeIncreaseNotification]; } if ((ev.fflags & NOTE_LINK) == NOTE_LINK) { [notesToPost addObject:VDKQueueLinkCountChangeNotification]; } if ((ev.fflags & NOTE_REVOKE) == NOTE_REVOKE) { [notesToPost addObject:VDKQueueAccessRevocationNotification]; } NSArray *notes = [[NSArray alloc] initWithArray:notesToPost]; // notesToPost will be changed in the next loop iteration, which will likely occur before the block below runs. // Post the notifications (or call the delegate method) on the main thread. dispatch_async(dispatch_get_main_queue(), ^{ for (NSString *note in notes) { [_delegate VDKQueue:self receivedNotification:note forPath:fpath]; if (!_delegate || _alwaysPostNotifications) { NSDictionary *userInfoDict = [[NSDictionary alloc] initWithObjectsAndKeys:fpath, @"path", nil]; [[[NSWorkspace sharedWorkspace] notificationCenter] postNotificationName:note object:self userInfo:userInfoDict]; [userInfoDict release]; } } [fpath release]; [notes release]; }); } } } } } @catch (NSException *localException) { NSLog(@"Error in VDKQueue watcherThread: %@", localException); } } // Close our kqueue's file descriptor if(close(theFD) == -1) { NSLog(@"VDKQueue watcherThread: Couldn't close main kqueue (%d)", errno); } [notesToPost release]; #if DEBUG_LOG_THREAD_LIFETIME NSLog(@"watcherThread finished."); #endif } #pragma mark - #pragma mark PUBLIC METHODS #pragma ----------------------------------------------------------------------------------------------------------------------------------------------------- - (void) addPath:(NSString *)aPath { if (!aPath) return; [aPath retain]; @synchronized(self) { VDKQueuePathEntry *entry = [_watchedPathEntries objectForKey:aPath]; // Only add this path if we don't already have it. if (!entry) { entry = [self addPathToQueue:aPath notifyingAbout:VDKQueueNotifyDefault]; if (!entry) { NSLog(@"VDKQueue tried to add the path %@ to watchedPathEntries, but the VDKQueuePathEntry was nil. \nIt's possible that the host process has hit its max open file descriptors limit.", aPath); } } } [aPath release]; } - (void) addPath:(NSString *)aPath notifyingAbout:(u_int)flags { if (!aPath) return; [aPath retain]; @synchronized(self) { VDKQueuePathEntry *entry = [_watchedPathEntries objectForKey:aPath]; // Only add this path if we don't already have it. if (!entry) { entry = [self addPathToQueue:aPath notifyingAbout:flags]; if (!entry) { NSLog(@"VDKQueue tried to add the path %@ to watchedPathEntries, but the VDKQueuePathEntry was nil. \nIt's possible that the host process has hit its max open file descriptors limit.", aPath); } } } [aPath release]; } - (void) removePath:(NSString *)aPath { if (!aPath) return; [aPath retain]; @synchronized(self) { VDKQueuePathEntry *entry = [_watchedPathEntries objectForKey:aPath]; // Remove it only if we're watching it. if (entry) { [_watchedPathEntries removeObjectForKey:aPath]; } } [aPath release]; } - (void) removeAllPaths { @synchronized(self) { [_watchedPathEntries removeAllObjects]; } } - (NSUInteger) numberOfWatchedPaths { NSUInteger count; @synchronized(self) { count = [_watchedPathEntries count]; } return count; } @end transmission-2.92/macosx/VDKQueue/PaxHeaders.4960/README.md0000644000000000000000000000013212442116641020061 xustar0030 mtime=1418239393.773751135 30 atime=1418239393.773751135 30 ctime=1457295922.622852506 transmission-2.92/macosx/VDKQueue/README.md0000755000175000017500000000557212442116641021522 0ustar00mikedldmikedld00000000000000VDKQueue ======= A modern, faster, better version of UKKQueue. about ----- VDKQueue is an Objective-C wrapper around kernel queues (kQueues). It allows you to watch a file or folder for changes and be notified when they occur. VDKQueue is a modern, streamlined and much faster version of UKKQueue, which was originally written in 2003 by Uli Kusterer. Objective-C has come a long way in the past nine years and UKKQueue was long in the tooth. VDKQueue is better in several ways: -- The number of method calls is vastly reduced. -- Grand Central Dispatch is used in place of Uli's "threadProxy" notifications (much faster) -- Memory footprint is roughly halved, since VDKQueue creates less overhead -- Fewer locks are taken, especially in loops (faster) -- The code is *much* cleaner and simpler! -- There is only one .h and one .m file to include. VDKQueue also fixes long-standing bugs in UKKQueue. For example: OS X limits the number of open file descriptors each process may have to about 3,000. If UKKQueue fails to open a new file descriptor because it has hit this limit, it will crash. VDKQueue will not. performance ----------- Adding 1,945 file paths to a UKKQueue instance took, on average, 80ms. Adding those same files to a VDKQueue instance took, on average, 65ms. VDKQueue processes and pushes out notifications about file changes roughly 50-70% faster than UKKQueue. All tests conducted on a 2008 MacBook Pro 2.5Ghz with 4GB of RAM running OS 10.7.3 using Xcode and Instruments (time profiler). requirements ------------ VDKQueue requires Mac OS X 10.6+ because it uses Grand Central Dispatch. VDKQueue does not support garbage collection. If you use garbage collection, you are lazy. Shape up. VDKQueue does not currently use ARC, although it should be straightforward to convert if you wish. (Don't be the guy that can't manually manage memory, though.) license ------- Created by Bryan D K Jones on 28 March 2012 Copyright 2013 Bryan D K Jones Based heavily on UKKQueue, which was created and copyrighted by Uli Kusterer on 21 Dec 2003. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. transmission-2.92/macosx/VDKQueue/PaxHeaders.4960/VDKQueue.h0000644000000000000000000000013212442116641020404 xustar0030 mtime=1418239393.772751118 30 atime=1418239393.772751118 30 ctime=1457295922.622852506 transmission-2.92/macosx/VDKQueue/VDKQueue.h0000755000175000017500000001745512442116641022050 0ustar00mikedldmikedld00000000000000// VDKQueue.h // Created by Bryan D K Jones on 28 March 2012 // Copyright 2013 Bryan D K Jones // // Based heavily on UKKQueue, which was created and copyrighted by Uli Kusterer on 21 Dec 2003. // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source // distribution. // // BASED ON UKKQUEUE: // // This is an updated, modernized and streamlined version of the excellent UKKQueue class, which was authored by Uli Kusterer. // UKKQueue was written back in 2003 and there have been many, many improvements to Objective-C since then. VDKQueue uses the // core of Uli's original class, but makes it faster and more efficient. Method calls are reduced. Grand Central Dispatch is used in place // of Uli's "threadProxy" objects. The memory footprint is roughly halved, as I don't create the overhead that UKKQueue does. // // VDKQueue is also simplified. The option to use it as a singleton is removed. You simply alloc/init an instance and add paths you want to // watch. Your objects can be alerted to changes either by notifications or by a delegate method (or both). See below. // // It also fixes several bugs. For one, it won't crash if it can't create a file descriptor to a file you ask it to watch. (By default, an OS X process can only // have about 3,000 file descriptors open at once. If you hit that limit, UKKQueue will crash. VDKQueue will not.) // // // DEPENDENCIES: // // VDKQueue requires OS 10.6+ because it relies on Grand Central Dispatch. // // // IMPORTANT NOTE ABOUT ATOMIC OPERATIONS // // There are two ways of saving a file on OS X: Atomic and Non-Atomic. In a non-atomic operation, a file is saved by directly overwriting it with new data. // In an Atomic save, a temporary file is first written to a different location on disk. When that completes successfully, the original file is deleted and the // temporary one is renamed and moved into place where the original file existed. // // This matters a great deal. If you tell VDKQueue to watch file X, then you save file X ATOMICALLY, you'll receive a notification about that event. HOWEVER, you will // NOT receive any additional notifications for file X from then on. This is because the atomic operation has essentially created a new file that replaced the one you // told VDKQueue to watch. (This is not an issue for non-atomic operations.) // // To handle this, any time you receive a change notification from VDKQueue, you should call -removePath: followed by -addPath: on the file's path, even if the path // has not changed. This will ensure that if the event that triggered the notification was an atomic operation, VDKQueue will start watching the "new" file that took // the place of the old one. // // Other frameworks out there try to work around this issue by immediately attempting to re-open the file descriptor to the path. This is not bulletproof and may fail; // it all depends on the timing of disk I/O. Bottom line: you could not rely on it and might miss future changes to the file path you're supposedly watching. That's why // VDKQueue does not take this approach, but favors the "manual" method of "stop-watching-then-rewatch". // #import #include #include // // Logical OR these values into the u_int that you pass in the -addPath:notifyingAbout: method // to specify the types of notifications you're interested in. Pass the default value to receive all of them. // #define VDKQueueNotifyAboutRename NOTE_RENAME // Item was renamed. #define VDKQueueNotifyAboutWrite NOTE_WRITE // Item contents changed (also folder contents changed). #define VDKQueueNotifyAboutDelete NOTE_DELETE // item was removed. #define VDKQueueNotifyAboutAttributeChange NOTE_ATTRIB // Item attributes changed. #define VDKQueueNotifyAboutSizeIncrease NOTE_EXTEND // Item size increased. #define VDKQueueNotifyAboutLinkCountChanged NOTE_LINK // Item's link count changed. #define VDKQueueNotifyAboutAccessRevocation NOTE_REVOKE // Access to item was revoked. #define VDKQueueNotifyDefault (VDKQueueNotifyAboutRename | VDKQueueNotifyAboutWrite \ | VDKQueueNotifyAboutDelete | VDKQueueNotifyAboutAttributeChange \ | VDKQueueNotifyAboutSizeIncrease | VDKQueueNotifyAboutLinkCountChanged \ | VDKQueueNotifyAboutAccessRevocation) // // Notifications that this class sends to the NSWORKSPACE notification center. // Object = the instance of VDKQueue that was watching for changes // userInfo.path = the file path where the change was observed // extern NSString * VDKQueueRenameNotification; extern NSString * VDKQueueWriteNotification; extern NSString * VDKQueueDeleteNotification; extern NSString * VDKQueueAttributeChangeNotification; extern NSString * VDKQueueSizeIncreaseNotification; extern NSString * VDKQueueLinkCountChangeNotification; extern NSString * VDKQueueAccessRevocationNotification; // // Or, instead of subscribing to notifications, you can specify a delegate and implement this method to respond to kQueue events. // Note the required statement! For speed, this class does not check to make sure the delegate implements this method. (When I say "required" I mean it!) // @class VDKQueue; @protocol VDKQueueDelegate @required -(void) VDKQueue:(VDKQueue *)queue receivedNotification:(NSString*)noteName forPath:(NSString*)fpath; @end @interface VDKQueue : NSObject { id _delegate; BOOL _alwaysPostNotifications; // By default, notifications are posted only if there is no delegate set. Set this value to YES to have notes posted even when there is a delegate. @private int _coreQueueFD; // The actual kqueue ID (Unix file descriptor). NSMutableDictionary *_watchedPathEntries; // List of VDKQueuePathEntries. Keys are NSStrings of the path that each VDKQueuePathEntry is for. BOOL _keepWatcherThreadRunning; // Set to NO to cancel the thread that watches _coreQueueFD for kQueue events } // // Note: there is no need to ask whether a path is already being watched. Just add it or remove it and this class // will take action only if appropriate. (Add only if we're not already watching it, remove only if we are.) // // Warning: You must pass full, root-relative paths. Do not pass tilde-abbreviated paths or file URLs. // - (void) addPath:(NSString *)aPath; - (void) addPath:(NSString *)aPath notifyingAbout:(u_int)flags; // See note above for values to pass in "flags" - (void) removePath:(NSString *)aPath; - (void) removeAllPaths; - (NSUInteger) numberOfWatchedPaths; // Returns the number of paths that this VDKQueue instance is actively watching. @property (assign) id delegate; @property (assign) BOOL alwaysPostNotifications; @endtransmission-2.92/macosx/PaxHeaders.4960/StatusBar.xib0000644000000000000000000000013212640354044017566 xustar0030 mtime=1451350052.801156485 30 atime=1451350052.801156485 30 ctime=1457295922.468849887 transmission-2.92/macosx/StatusBar.xib0000644000175000017500000001424512640354044021221 0ustar00mikedldmikedld00000000000000 transmission-2.92/macosx/PaxHeaders.4960/InfoFileViewController.m0000644000000000000000000000013212644245522021726 xustar0030 mtime=1452362578.836700518 30 atime=1452362578.836700518 30 ctime=1457295923.268863491 transmission-2.92/macosx/InfoFileViewController.m0000644000175000017500000001747012644245522023364 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: InfoFileViewController.m 14667 2016-01-08 10:05:19Z mikedld $ * * Copyright (c) 2010-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import "InfoFileViewController.h" #import "FileListNode.h" #import "FileOutlineController.h" #import "FileOutlineView.h" #import "Torrent.h" @interface InfoFileViewController (Private) - (void) setupInfo; - (BOOL) canQuickLookFile: (FileListNode *) item; @end @implementation InfoFileViewController - (id) init { if ((self = [super initWithNibName: @"InfoFileView" bundle: nil])) { [self setTitle: NSLocalizedString(@"Files", "Inspector view -> title")]; } return self; } - (void) awakeFromNib { const CGFloat height = [[NSUserDefaults standardUserDefaults] floatForKey: @"InspectorContentHeightFiles"]; if (height != 0.0) { NSRect viewRect = [[self view] frame]; viewRect.size.height = height; [[self view] setFrame: viewRect]; } [[fFileFilterField cell] setPlaceholderString: NSLocalizedString(@"Filter", "inspector -> file filter")]; //localize and place all and none buttons [fCheckAllButton setTitle: NSLocalizedString(@"All", "inspector -> check all")]; [fUncheckAllButton setTitle: NSLocalizedString(@"None", "inspector -> check all")]; NSRect checkAllFrame = [fCheckAllButton frame]; NSRect uncheckAllFrame = [fUncheckAllButton frame]; const CGFloat oldAllWidth = checkAllFrame.size.width; const CGFloat oldNoneWidth = uncheckAllFrame.size.width; [fCheckAllButton sizeToFit]; [fUncheckAllButton sizeToFit]; const CGFloat newWidth = MAX([fCheckAllButton bounds].size.width, [fUncheckAllButton bounds].size.width); const CGFloat uncheckAllChange = newWidth - oldNoneWidth; uncheckAllFrame.size.width = newWidth; uncheckAllFrame.origin.x -= uncheckAllChange; [fUncheckAllButton setFrame: uncheckAllFrame]; const CGFloat checkAllChange = newWidth - oldAllWidth; checkAllFrame.size.width = newWidth; checkAllFrame.origin.x -= (checkAllChange + uncheckAllChange); [fCheckAllButton setFrame: checkAllFrame]; } - (void) dealloc { [fTorrents release]; [super dealloc]; } - (void) setInfoForTorrents: (NSArray *) torrents { //don't check if it's the same in case the metadata changed [fTorrents release]; fTorrents = [torrents retain]; fSet = NO; } - (void) updateInfo { if (!fSet) [self setupInfo]; if ([fTorrents count] == 1) { [fFileController refresh]; #warning use TorrentFileCheckChange notification as well Torrent * torrent = [fTorrents objectAtIndex: 0]; if ([torrent isFolder]) { const NSInteger filesCheckState = [torrent checkForFiles: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [torrent fileCount])]]; [fCheckAllButton setEnabled: filesCheckState != NSOnState]; //if anything is unchecked [fUncheckAllButton setEnabled: ![torrent allDownloaded]]; //if there are any checked files that aren't finished } } } - (void) saveViewSize { [[NSUserDefaults standardUserDefaults] setFloat: NSHeight([[self view] frame]) forKey: @"InspectorContentHeightFiles"]; } - (void) setFileFilterText: (id) sender { [fFileController setFilterText: [sender stringValue]]; } - (IBAction) checkAll: (id) sender { [fFileController checkAll]; } - (IBAction) uncheckAll: (id) sender { [fFileController uncheckAll]; } - (NSArray *) quickLookURLs { FileOutlineView * fileOutlineView = [fFileController outlineView]; Torrent * torrent = [fTorrents objectAtIndex: 0]; NSIndexSet * indexes = [fileOutlineView selectedRowIndexes]; NSMutableArray * urlArray = [NSMutableArray arrayWithCapacity: [indexes count]]; for (NSUInteger i = [indexes firstIndex]; i != NSNotFound; i = [indexes indexGreaterThanIndex: i]) { FileListNode * item = [fileOutlineView itemAtRow: i]; if ([self canQuickLookFile: item]) [urlArray addObject: [NSURL fileURLWithPath: [torrent fileLocation: item]]]; } return urlArray; } - (BOOL) canQuickLook { if ([fTorrents count] != 1) return NO; Torrent * torrent = [fTorrents objectAtIndex: 0]; if (![torrent isFolder]) return NO; FileOutlineView * fileOutlineView = [fFileController outlineView]; NSIndexSet * indexes = [fileOutlineView selectedRowIndexes]; for (NSUInteger i = [indexes firstIndex]; i != NSNotFound; i = [indexes indexGreaterThanIndex: i]) if ([self canQuickLookFile: [fileOutlineView itemAtRow: i]]) return YES; return NO; } - (NSRect) quickLookSourceFrameForPreviewItem: (id ) item { FileOutlineView * fileOutlineView = [fFileController outlineView]; NSString * fullPath = [(NSURL *)item path]; Torrent * torrent = [fTorrents objectAtIndex: 0]; NSRange visibleRows = [fileOutlineView rowsInRect: [fileOutlineView bounds]]; for (NSUInteger row = visibleRows.location; row < NSMaxRange(visibleRows); row++) { FileListNode * rowItem = [fileOutlineView itemAtRow: row]; if ([[torrent fileLocation: rowItem] isEqualToString: fullPath]) { NSRect frame = [fileOutlineView iconRectForRow: row]; if (!NSIntersectsRect([fileOutlineView visibleRect], frame)) return NSZeroRect; frame.origin = [fileOutlineView convertPoint: frame.origin toView: nil]; frame = [[[self view] window] convertRectToScreen: frame]; frame.origin.y -= frame.size.height; return frame; } } return NSZeroRect; } @end @implementation InfoFileViewController (Private) - (void) setupInfo { [fFileFilterField setStringValue: @""]; if ([fTorrents count] == 1) { Torrent * torrent = [fTorrents objectAtIndex: 0]; [fFileController setTorrent: torrent]; const BOOL isFolder = [torrent isFolder]; [fFileFilterField setEnabled: isFolder]; if (!isFolder) { [fCheckAllButton setEnabled: NO]; [fUncheckAllButton setEnabled: NO]; } } else { [fFileController setTorrent: nil]; [fFileFilterField setEnabled: NO]; [fCheckAllButton setEnabled: NO]; [fUncheckAllButton setEnabled: NO]; } fSet = YES; } - (BOOL) canQuickLookFile: (FileListNode *) item { Torrent * torrent = [fTorrents objectAtIndex: 0]; return ([item isFolder] || [torrent fileProgress: item] >= 1.0) && [torrent fileLocation: item]; } @end transmission-2.92/macosx/PaxHeaders.4960/Badger.h0000644000000000000000000000013212442116650016506 xustar0030 mtime=1418239400.335863589 30 atime=1418239400.335863589 30 ctime=1457295922.916857505 transmission-2.92/macosx/Badger.h0000644000175000017500000000340312442116650020133 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: Badger.h 13162 2012-01-14 17:12:04Z livings124 $ * * Copyright (c) 2006-2012 Transmission authors and contributors * * 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. *****************************************************************************/ #import #import @class Torrent; @interface Badger : NSObject { tr_session * fLib; NSMutableSet * fHashes; } - (id) initWithLib: (tr_session *) lib; - (void) updateBadgeWithDownload: (CGFloat) downloadRate upload: (CGFloat) uploadRate; - (void) addCompletedTorrent: (Torrent *) torrent; - (void) removeTorrent: (Torrent *) torrent; - (void) clearCompleted; - (void) setQuitting; @end transmission-2.92/PaxHeaders.4960/COPYING0000644000000000000000000000013212664476420014724 xustar0030 mtime=1456635152.339502415 30 atime=1456635152.339502415 30 ctime=1457295917.152759487 transmission-2.92/COPYING0000644000175000017500000000130712664476420016352 0ustar00mikedldmikedld00000000000000Copyright 2005-2016. All code is copyrighted by the respective authors. Transmission can be redistributed and/or modified under the terms of the GNU GPLv2 (http://www.gnu.org/licenses/license-list.html#GPLv2), the GNU GPLv3 (http://www.gnu.org/licenses/license-list.html#GNUGPLv3), or any future license endorsed by Mnemosyne LLC. In addition, linking to and/or using OpenSSL is allowed. 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. Some of Transmission's source files have more permissive licenses. Those files may, of course, be used on their own under their own terms. transmission-2.92/PaxHeaders.4960/configure.ac0000644000000000000000000000013212667110721016147 xustar0030 mtime=1457295825.336198393 30 atime=1457295825.336198393 30 ctime=1457295917.107758722 transmission-2.92/configure.ac0000644000175000017500000005547712667110721017616 0ustar00mikedldmikedld00000000000000dnl convention: -TR MAJOR MINOR MAINT STATUS - (each a single char) dnl STATUS: "X" for prerelease beta builds, dnl "Z" for unsupported trunk builds, dnl "0" for stable, supported releases dnl these should be the only two lines you need to change m4_define([user_agent_prefix],[2.92]) m4_define([peer_id_prefix],[-TR2920-]) AC_INIT([transmission],[user_agent_prefix],[http://trac.transmissionbt.com/newticket]) AC_SUBST(USERAGENT_PREFIX,[user_agent_prefix]) AC_SUBST(PEERID_PREFIX,[peer_id_prefix]) m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) AC_CONFIG_MACRO_DIR([m4]) dnl AM_CONFIG_HEADER(config.h) AC_CONFIG_SRCDIR(libtransmission/transmission.h) AM_INIT_AUTOMAKE([1.9 tar-pax no-dist-gzip dist-xz]) LT_INIT LT_LIB_M if test m4_substr(peer_id_prefix,6,1) = "0"; then supported_build=yes CPPFLAGS="$CPPFLAGS -DNDEBUG" else supported_build=no if test "x$GCC" = "xyes" ; then CFLAGS="$CFLAGS -g -O0" CXXFLAGS="$CXXFLAGS -g -O0" fi fi AM_CONDITIONAL(TR_UNSTABLE, test "x$supported_build" = "xno") AM_CONDITIONAL(HAVE_REVISION_FILE, test -f REVISION) ## ## ## MANDATORY for everything ## ## CURL_MINIMUM=7.15.4 AC_SUBST(CURL_MINIMUM) LIBEVENT_MINIMUM=2.0.10 AC_SUBST(LIBEVENT_MINIMUM) ZLIB_MINIMUM=1.2.3 AC_SUBST(ZLIB_MINIMUM) # crypto backends OPENSSL_MINIMUM=0.9.7 AC_SUBST(OPENSSL_MINIMUM) CYASSL_MINIMUM=3.0 AC_SUBST(CYASSL_MINIMUM) POLARSSL_MINIMUM=0x01020000 # 1.2 AC_SUBST(POLARSSL_MINIMUM) ## ## ## MANDATORY for the GTK+ client ## ## GTK_MINIMUM=3.4.0 AC_SUBST(GTK_MINIMUM) GLIB_MINIMUM=2.32.0 AC_SUBST(GLIB_MINIMUM) GIO_MINIMUM=2.26.0 AC_SUBST(GIO_MINIMUM) ## ## ## OPTIONAL for the GTK+ client ## ## # create the tray icon with AppIndicator LIBAPPINDICATOR_MINIMUM=0.4.90 AC_SUBST(LIBAPPINDICATOR_MINIMUM) AC_PROG_CC AC_PROG_CXX AC_C_INLINE if test "x$GCC" = "xyes" ; then CFLAGS="$CFLAGS -std=gnu99 -ggdb3 -Wall -W -Wpointer-arith -Wformat-security -Wundef -Wcast-align -Wstrict-prototypes -Wmissing-declarations -Wmissing-format-attribute -Wredundant-decls -Wnested-externs -Wunused-parameter -Wwrite-strings -Winline -Wfloat-equal" dnl figure out gcc version AC_MSG_CHECKING([gcc version]) GCC_VERSION=`$CC -dumpversion` GCC_MAJOR=`echo $GCC_VERSION | cut -d . -f1` GCC_MINOR=`echo $GCC_VERSION | cut -d . -f2` GCC_VERSION_NUM=`(expr $GCC_MAJOR "*" 100 + $GCC_MINOR) 2>/dev/null` AC_MSG_RESULT($GCC_VERSION) if test $GCC_VERSION_NUM -ge 304; then dnl these were added in 3.4 CFLAGS="$CFLAGS -Wextra -Winit-self" fi if test $GCC_VERSION_NUM -ge 403; then dnl these were added in 4.3 CFLAGS="$CFLAGS -Wvariadic-macros" fi fi AC_HEADER_STDC AC_HEADER_TIME AC_CHECK_HEADERS([stdbool.h xlocale.h]) AC_CHECK_FUNCS([iconv pread pwrite lrintf strlcpy daemon dirname basename canonicalize_file_name strcasecmp localtime_r fallocate64 posix_fallocate memmem strsep strtold syslog valloc getpagesize posix_memalign statvfs htonll ntohll mkdtemp uselocale _configthreadlocale]) AC_PROG_INSTALL AC_PROG_MAKE_SET ACX_PTHREAD if test "x$ac_cv_func_strtold" != "xyes" ; then CPPFLAGS="$CPPFLAGS -Dstrtold=strtod" fi AC_SEARCH_LIBS(cos, [m]) AC_SEARCH_LIBS([socket], [socket net]) AC_SEARCH_LIBS([gethostbyname], [nsl bind]) AC_SEARCH_LIBS([quotacursor_skipidtype], [quota]) PKG_CHECK_MODULES(LIBCURL, [libcurl >= $CURL_MINIMUM]) PKG_CHECK_MODULES(LIBEVENT, [libevent >= $LIBEVENT_MINIMUM]) PKG_CHECK_MODULES(ZLIB, [zlib >= $ZLIB_MINIMUM]) AC_ARG_WITH([crypto], AS_HELP_STRING([--with-crypto=PKG], [Use specified crypto library: auto (default), openssl, cyassl, polarssl]), [want_crypto=$withval], [want_crypto=auto]) AS_IF([test "x$want_crypto" = "xauto" -o "x$want_crypto" = "xopenssl"], [ PKG_CHECK_MODULES(OPENSSL, [openssl >= $OPENSSL_MINIMUM], [want_crypto="openssl"; CRYPTO_PKG="openssl"; CRYPTO_CFLAGS="$OPENSSL_CFLAGS"; CRYPTO_LIBS="$OPENSSL_LIBS"], [AS_IF([test "x$want_crypto" = "xopenssl"], [AC_MSG_ERROR([OpenSSL support requested, but library not found.])] )] ) ]) AS_IF([test "x$want_crypto" = "xauto" -o "x$want_crypto" = "xcyassl"], [ PKG_CHECK_MODULES(WOLFSSL, [wolfssl >= $CYASSL_MINIMUM], [want_crypto="cyassl"; CRYPTO_PKG="cyassl"; CRYPTO_CFLAGS="$WOLFSSL_CFLAGS"; CRYPTO_LIBS="$WOLFSSL_LIBS"], [PKG_CHECK_MODULES(CYASSL, [cyassl >= $CYASSL_MINIMUM], [want_crypto="cyassl"; CRYPTO_PKG="cyassl"; CRYPTO_CFLAGS="$CYASSL_CFLAGS"; CRYPTO_LIBS="$CYASSL_LIBS"], [AS_IF([test "x$want_crypto" = "xcyassl"], [AC_MSG_ERROR([CyaSSL support requested, but library not found.])] )] )] ) ]) AS_IF([test "x$want_crypto" = "xauto" -o "x$want_crypto" = "xpolarssl"], [ AC_CHECK_HEADER([polarssl/version.h], [AC_EGREP_CPP([version_ok], [#include #if defined (POLARSSL_VERSION_NUMBER) && POLARSSL_VERSION_NUMBER >= $POLARSSL_MINIMUM version_ok #endif], [AC_CHECK_LIB([polarssl], [dhm_calc_secret], [want_crypto="polarssl"; CRYPTO_PKG="polarssl"; CRYPTO_CFLAGS=""; CRYPTO_LIBS="-lpolarssl"], [AS_IF([test "x$want_crypto" = "xpolarssl"], [AC_MSG_ERROR([PolarSSL support requested, but library not found.])] )] )], [AS_IF([test "x$want_crypto" = "xpolarssl"], [AC_MSG_ERROR([PolarSSL support requested, but version not suitable.])] )] )], [AS_IF([test "x$want_crypto" = "xpolarssl"], [AC_MSG_ERROR([PolarSSL support requested, but headers not found.])] )] ) ]) # we should have found the library by now AS_IF([test "x$CRYPTO_PKG" = "x"], [ AS_IF([test "x$want_crypto" = "xauto"], [AC_MSG_ERROR([Unable to find any supported crypto library.])], [AC_MSG_ERROR([Requested crypto library "$want_crypto" is not supported.])], ) ]) AM_CONDITIONAL([CRYPTO_USE_OPENSSL],[test "x$CRYPTO_PKG" = "xopenssl"]) AM_CONDITIONAL([CRYPTO_USE_CYASSL],[test "x$CRYPTO_PKG" = "xcyassl"]) AM_CONDITIONAL([CRYPTO_USE_POLARSSL],[test "x$CRYPTO_PKG" = "xpolarssl"]) AC_SUBST(CRYPTO_PKG) AC_SUBST(CRYPTO_CFLAGS) AC_SUBST(CRYPTO_LIBS) AC_SYS_LARGEFILE AC_FUNC_GETMNTENT dnl ---------------------------------------------------------------------------- dnl dnl posix_fadvise dnl can posix_fadvise be used AC_CHECK_DECLS(posix_fadvise, [], [], [ #define _XOPEN_SOURCE 600 #include ]) AC_CHECK_FUNCS([posix_fadvise]) dnl ---------------------------------------------------------------------------- dnl dnl file monitoring for the daemon AC_ARG_WITH([inotify], [AS_HELP_STRING([--with-inotify], [Enable inotify support (default=auto)])], [WANT_INOTIFY=${withval}], [WANT_INOTIFY=auto]) HAVE_INOTIFY=0 AS_IF([test "x$WANT_INOTIFY" != "xno"], [AC_CHECK_HEADER([sys/inotify.h], [AC_CHECK_FUNC([inotify_init], [HAVE_INOTIFY=1])], [AS_IF([test "x$WANT_INOTIFY" = "xyes"], [AC_MSG_ERROR("inotify not found!")])])]) AM_CONDITIONAL([USE_INOTIFY], [test "x$WANT_INOTIFY" != "xno" -a $HAVE_INOTIFY -eq 1]) AC_ARG_WITH([kqueue], [AS_HELP_STRING([--with-kqueue],[Enable kqueue support (default=auto)])], [WANT_KQUEUE=${withval}], [WANT_KQUEUE=auto]) HAVE_KQUEUE=0 AS_IF([test "x$WANT_KQUEUE" != "xno"], [AC_CHECK_HEADER([sys/event.h], [AC_CHECK_FUNC([kqueue], [HAVE_KQUEUE=1])], [AS_IF([test "x$WANT_KQUEUE" = "xyes"], [AC_MSG_ERROR("kqueue not found!")])])]) AM_CONDITIONAL([USE_KQUEUE], [test "x$WANT_KQUEUE" != "xno" -a $HAVE_KQUEUE -eq 1]) AC_CHECK_HEADERS([sys/statvfs.h \ xfs/xfs.h]) dnl ---------------------------------------------------------------------------- dnl dnl file monitoring for the daemon # Check whether to enable systemd startup notification. # This requires libsystemd-daemon. AC_ARG_WITH([systemd-daemon], AS_HELP_STRING([--with-systemd-daemon], [Add support for systemd startup notification (default is autodetected)]), [USE_SYSTEMD_DAEMON=$withval], [USE_SYSTEMD_DAEMON=auto]) AS_IF([test "x$USE_SYSTEMD_DAEMON" != "xno"], [ PKG_CHECK_MODULES([SYSTEMD_DAEMON], [libsystemd-daemon], [AC_DEFINE(USE_SYSTEMD_DAEMON,1,[Use systemd startup notification])], [AS_IF([test "x$USE_SYSTEMD_DAEMON" = "xyes"], [AC_MSG_ERROR([systemd startup notification support requested, but libsystemd-daemon not found.])] )] ) ]) dnl ---------------------------------------------------------------------------- dnl dnl dht DHT_CFLAGS="-I\$(top_srcdir)/third-party/dht" DHT_LIBS="\$(top_builddir)/third-party/dht/libdht.a" DHT_LIBS_QT="\$\${TRANSMISSION_TOP}/third-party/dht/libdht.a" build_bundled_dht="yes" AC_ARG_ENABLE([external-dht], AS_HELP_STRING([--enable-external-dht],[Use system external-dht]), [want_external_dht=${enableval}], [want_external_dht=no]) if test "x$want_external_dht" != "xno" ; then dnl Would be lovely if it had pkgconfig DHT_CFLAGS="" DHT_LIBS="-ldht" DHT_LIBS_QT="-ldht" build_bundled_dht="no" fi AM_CONDITIONAL([BUILD_DHT],[test "x$build_bundled_dht" = "xyes"]) AC_SUBST(DHT_CFLAGS) AC_SUBST(DHT_LIBS) AC_SUBST(DHT_LIBS_QT) dnl ---------------------------------------------------------------------------- dnl dnl libb64 LIBB64_CFLAGS="-I\$(top_srcdir)/third-party/libb64" LIBB64_LIBS="\$(top_builddir)/third-party/libb64/libb64.a" LIBB64_LIBS_QT="\$\${TRANSMISSION_TOP}/third-party/libb64/libb64.a" build_bundled_b64="yes" AC_ARG_ENABLE([external-b64], AS_HELP_STRING([--enable-external-b64],[Use system libb64]), [want_external_b64=${enableval}], [want_external_b64=no]) if test "x$want_external_b64" != "xno" ; then LIBB64_CFLAGS="-DUSE_SYSTEM_B64" LIBB64_LIBS="-lb64" LIBB64_LIBS_QT="-lb64" build_bundled_b64="no" fi AM_CONDITIONAL([BUILD_B64],[test "x$build_bundled_b64" = "xyes"]) AC_SUBST(LIBB64_CFLAGS) AC_SUBST(LIBB64_LIBS) AC_SUBST(LIBB64_LIBS_QT) dnl ---------------------------------------------------------------------------- dnl dnl utp AC_CHECK_LIB([rt], [clock_gettime], [libutp_extra_libs="-lrt"], [libutp_extra_libs=""]) AC_MSG_CHECKING([µTP]) build_utp="no" ac_save_LIBS="$LIBS" LIBS="-lutp" AC_LINK_IFELSE( [AC_LANG_PROGRAM([#include ], [struct UTPFunctionTable func;])], [have_utp="yes"], [have_utp="no"] ) LIBS="$ac_save_LIBS" if test "x$have_utp" = "xyes" -o "x$CXX" != "x"; then want_utp_default="yes" else want_utp_default="no" fi AC_ARG_ENABLE([utp], AS_HELP_STRING([--enable-utp],[build µTP support]), [want_utp=${enableval}], [want_utp=${want_utp_default}]) if test "x$want_utp" = "xyes"; then if test "x$have_utp" = "xyes"; then dnl Would be lovely if it had pkgconfig LIBUTP_CFLAGS="" LIBUTP_LIBS="-lutp $libutp_extra_libs" LIBUTP_LIBS_QT="-lutp $libutp_extra_libs" AC_DEFINE([WITH_UTP],[1]) build_utp="system" elif test "x$CXX" != "x"; then LIBUTP_CFLAGS="-I\$(top_srcdir)/third-party/" LIBUTP_LIBS="\$(top_builddir)/third-party/libutp/libutp.a" LIBUTP_LIBS_QT="\$\${TRANSMISSION_TOP}/third-party/libutp/libutp.a" if test "x$libutp_extra_libs" != "x" ; then LIBUTP_LIBS="$LIBUTP_LIBS $libutp_extra_libs" LIBUTP_LIBS_QT="$LIBUTP_LIBS_QT $libutp_extra_libs" fi AC_DEFINE([WITH_UTP],[1]) build_utp="yes" else AC_MSG_ERROR("Unable to build uTP support -- C++ compiler not found") fi fi AC_SUBST(LIBUTP_CFLAGS) AC_SUBST(LIBUTP_LIBS) AC_SUBST(LIBUTP_LIBS_QT) AM_CONDITIONAL([BUILD_UTP],[test "x$build_utp" = "xyes"]) AC_MSG_RESULT([$build_utp]) dnl dnl look for preinstalled miniupnpc... dnl ac_save_LIBS="$LIBS" LIBS="-lminiupnpc" AC_MSG_CHECKING([system miniupnpc library]) dnl See if ANY version of miniupnpc is installed AC_LINK_IFELSE( [AC_LANG_PROGRAM([#include ], [struct UPNPDev dev;])], [upnp_version="unknown"], [upnp_version="none"] ) dnl Let's hope it's 1.7 or higher, since it provides dnl MINIUPNPC_API_VERSION and we won't have to figure dnl it out on our own if test "x$upnp_version" = "xunknown" ; then AC_RUN_IFELSE( [AC_LANG_PROGRAM( [#include #include ], [#ifdef MINIUPNPC_API_VERSION return EXIT_SUCCESS; #else return EXIT_FAILURE; #endif] )], [upnp_version=">= 1.7"] ) fi dnl Or maybe it's miniupnp 1.6 if test "x$upnp_version" = "xunknown" ; then AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include #include #include #include ]], [[ struct UPNPDev * devlist; struct UPNPUrls urls; struct IGDdatas data; char lanaddr[16]; char portStr[8]; char intPort[8]; char intClient[16]; upnpDiscover( 2000, NULL, NULL, 0, 0, &errno ); UPNP_GetValidIGD( devlist, &urls, &data, lanaddr, sizeof( lanaddr ) ); UPNP_GetSpecificPortMappingEntry( urls.controlURL, data.first.servicetype, portStr, "TCP", intClient, intPort, NULL, NULL, NULL ); ]])],[ AC_DEFINE(MINIUPNPC_API_VERSION, 8, [miniupnpc 1.6 has API version 8]) upnp_version="1.6"]) fi dnl Or maybe it's miniupnp 1.5 if test "x$upnp_version" = "xunknown" ; then AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include #include #include ]], [[ struct UPNPDev * devlist; struct UPNPUrls urls; struct IGDdatas data; char lanaddr[16]; char portStr[8]; char intPort[8]; char intClient[16]; upnpDiscover( 2000, NULL, NULL, 0 ); UPNP_GetValidIGD( devlist, &urls, &data, lanaddr, sizeof( lanaddr ) ); UPNP_GetSpecificPortMappingEntry( urls.controlURL, data.first.servicetype, portStr, "TCP", intClient, intPort ); ]])],[ AC_DEFINE(MINIUPNPC_API_VERSION, 5, [miniupnpc 1.5 has API version 5]) upnp_version="1.5"]) fi # ... and the results of our tests LIBS="$ac_save_LIBS" AC_MSG_RESULT([$upnp_version]) AM_CONDITIONAL([BUILD_MINIUPNP],[test "x$upnp_version" = "xnone"]) if test "x$upnp_version" = "xnone" ; then LIBUPNP_CFLAGS="-I\$(top_srcdir)/third-party/" LIBUPNP_LIBS="\$(top_builddir)/third-party/miniupnp/libminiupnp.a" LIBUPNP_LIBS_QT="\$\${TRANSMISSION_TOP}/third-party/miniupnp/libminiupnp.a" else AC_DEFINE([SYSTEM_MINIUPNP]) LIBUPNP_CFLAGS="" LIBUPNP_LIBS="-lminiupnpc" LIBUPNP_LIBS_QT="-lminiupnpc" fi AC_SUBST(LIBUPNP_CFLAGS) AC_SUBST(LIBUPNP_LIBS) AC_SUBST(LIBUPNP_LIBS_QT) dnl ---------------------------------------------------------------------------- dnl dnl Allow usage of system natpmp library LIBNATPMP_CFLAGS="-I\$(top_srcdir)/third-party/libnatpmp/" LIBNATPMP_LIBS="\$(top_builddir)/third-party/libnatpmp/libnatpmp.a" LIBNATPMP_LIBS_QT="\$\${TRANSMISSION_TOP}/third-party/libnatpmp/libnatpmp.a" build_bundled_natpmp="yes" AC_ARG_ENABLE([external-natpmp], AS_HELP_STRING([--enable-external-natpmp],[Use system external-natpmp]), [want_external_natpmp=${enableval}], [want_external_natpmp=no]) if test "x$want_external_natpmp" != "xno" ; then dnl Would be lovely if it had pkgconfig LIBNATPMP_CFLAGS="" LIBNATPMP_LIBS="-lnatpmp" LIBNATPMP_LIBS_QT="-lnatpmp" build_bundled_natpmp="no" fi AM_CONDITIONAL([BUILD_NATPMP],[test "x$build_bundled_natpmp" = "xyes"]) AC_SUBST(LIBNATPMP_CFLAGS) AC_SUBST(LIBNATPMP_LIBS) AC_SUBST(LIBNATPMP_LIBS_QT) dnl ---------------------------------------------------------------------------- dnl dnl detection for the GTK+ client AC_ARG_ENABLE([nls], [AS_HELP_STRING([--enable-nls],[enable native language support])],, [enable_nls=yes]) PKG_CHECK_EXISTS([gtk+-3.0 >= $GTK_MINIMUM glib-2.0 >= $GLIB_MINIMUM gio-2.0 >= $GIO_MINIMUM, gmodule-2.0 >= $GLIB_MINIMUM gthread-2.0 >= $GLIB_MINIMUM], [have_gtk=yes], [have_gtk=no]) AC_ARG_WITH([gtk], AS_HELP_STRING([--with-gtk],[with Gtk]), [with_gtk=$withval], [with_gtk=$have_gtk]) AM_CONDITIONAL([BUILD_GTK],[test "x$with_gtk" = "xyes"]) use_libappindicator=no if test "x$with_gtk" = "xyes" ; then if test "x$enable_nls" = "xno" ; then AC_MSG_ERROR("The gtk client cannot be built without nls support. Try adding either --enable-nls or --without-gtk" ) fi PKG_CHECK_MODULES([GTK], [gtk+-3.0 >= $GTK_MINIMUM glib-2.0 >= $GLIB_MINIMUM gio-2.0 >= $GIO_MINIMUM, gmodule-2.0 >= $GLIB_MINIMUM gthread-2.0 >= $GLIB_MINIMUM]) PKG_CHECK_MODULES([LIBAPPINDICATOR], [appindicator3-0.1 >= $LIBAPPINDICATOR_MINIMUM], [have_libappindicator=yes], [have_libappindicator=no]) if test "x$have_libappindicator" = "xyes"; then use_libappindicator=yes AC_DEFINE([HAVE_LIBAPPINDICATOR], 1) else LIBAPPINDICATOR_CFLAGS= LIBAPPINDICATOR_LIBS= fi fi dnl This section is only used for internationalization. dnl If you don't need translations and this section gives you trouble -- dnl such as if you're building for a headless system -- dnl it's okay to tear this section out and re-build the configure script. dnl dnl Note to packagers: the bump to intltool 0.40 was made to fix dnl a "make check" failure on some systems. if upgrading to 0.40 is dnl a problem and the old version was working fine for you, dnl it should be safe to re-edit 0.40 back down to 0.23 use_nls=no if test "x$enable_nls" = "xyes" ; then use_nls=yes m4_ifdef([IT_PROG_INTLTOOL], [IT_PROG_INTLTOOL([0.35.0],[no-xml])], [AC_MSG_ERROR("--enable-nls requires intltool to be installed.")]) AC_CHECK_HEADERS([libintl.h]) GETTEXT_PACKAGE=transmission-gtk AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE],["$GETTEXT_PACKAGE"],[Gettext package]) AM_GLIB_GNU_GETTEXT transmissionlocaledir='${prefix}/${DATADIRNAME}/locale' AC_SUBST(transmissionlocaledir) fi AC_SUBST(INTLLIBS) dnl ---------------------------------------------------------------------------- dnl dnl platform-specific stuff. AC_CANONICAL_HOST have_darwin="no" have_msw="no" case $host_os in *mingw32*) have_msw="yes" CXXFLAGS="$CXXFLAGS -mms-bitfields -mwin32 -mwindows" CPPFLAGS="$CPPFLAGS -DWINVER=0x0600 -D_WIN32_WINNT=0x0600 -DWIN32_LEAN_AND_MEAN" # CPPFLAGS="$CPPFLAGS -D__USE_MINGW_ANSI_STDIO=1 -D__STDC_FORMAT_MACROS=1" LIBS="$LIBS -liphlpapi -lshell32 -lws2_32" transmissionlocaledir="locale" if test -z "$host_alias"; then hostaliaswindres= else hostaliaswindres="$host_alias-windres"; fi AC_CHECK_TOOL(WINDRES, windres) ;; *darwin*) have_darwin="yes" ;; esac AC_ARG_ENABLE([lightweight], AS_HELP_STRING([--enable-lightweight],[optimize libtransmission for low-resource systems: smaller cache size, prefer unencrypted peer connections, etc.]), [enable_lightweight=${enableval}], [enable_lightweight="no"]) if test "x$enable_lightweight" = "xyes" ; then AC_DEFINE([TR_LIGHTWEIGHT],[1],[optimize libtransmission for low-resource systems]) fi AC_ARG_ENABLE([cli], [AS_HELP_STRING([--enable-cli],[build command-line client])], [build_cli=${enableval}], [build_cli="no"]) AM_CONDITIONAL([BUILD_CLI],[test "x$build_cli" = "xyes"]) AC_ARG_ENABLE([mac], [AS_HELP_STRING([--enable-mac],[build Mac client])], [build_mac=${enableval}], [build_mac=${have_darwin}]) AM_CONDITIONAL([BUILD_MAC],[test "x$build_mac" = "xyes"]) AC_ARG_ENABLE([daemon], [AS_HELP_STRING([--enable-daemon],[build daemon])], [build_daemon=${enableval}], [build_daemon="yes"]) AM_CONDITIONAL([BUILD_DAEMON],[test "x$build_daemon" = "xyes"]) if test "x$build_mac" = "xyes" ; then AC_DEFINE([BUILD_MAC_CLIENT], 1) # Make sure the proper Mac SDK is installed if test ! -d /Developer/SDKs/MacOSX10.5.sdk; then cat << EOF You need to install the Mac OS X 10.5 SDK in order to build Transmission with --enable-mac: Get your Xcode CD or package Restart the install When it gets to "Installation Type", select "Customize" Select "Mac OS X 10.5 SDK" under "Cross Development" Finish the install. EOF exit 1 fi fi AM_CONDITIONAL(WIN32, test "x$have_msw" = "xyes") dnl ---------------------------------------------------------------------------- dnl dnl Generate the output AC_CONFIG_FILES([Makefile transmission-gtk.spec cli/Makefile daemon/Makefile extras/Makefile libtransmission/Makefile utils/Makefile third-party/Makefile third-party/dht/Makefile third-party/libb64/Makefile third-party/libutp/Makefile third-party/libnatpmp/Makefile third-party/miniupnp/Makefile macosx/Makefile gtk/Makefile gtk/icons/Makefile qt/config.pri web/Makefile web/images/Makefile web/style/Makefile web/style/jqueryui/Makefile web/style/jqueryui/images/Makefile web/style/transmission/Makefile web/style/transmission/images/Makefile web/style/transmission/images/buttons/Makefile web/javascript/Makefile web/javascript/jquery/Makefile po/Makefile.in]) AC_OUTPUT echo " Configuration: Source code location: ${srcdir} Compiler: ${CXX} Build libtransmission: yes * optimized for low-resource systems: ${enable_lightweight} * µTP enabled: ${build_utp} * crypto library: ${CRYPTO_PKG} Build Command-Line client: ${build_cli} Build GTK+ client: ${with_gtk} * libappindicator for an Ubuntu-style tray: ${use_libappindicator} Build Daemon: ${build_daemon} Build Mac client: ${build_mac} " transmission-2.92/PaxHeaders.4960/configure0000644000000000000000000000013212667111005015561 xustar0030 mtime=1457295877.116078717 30 atime=1457295876.322065216 30 ctime=1457295917.049757736 transmission-2.92/configure0000755000175000017500000264111512667111005017223 0ustar00mikedldmikedld00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for transmission 2.92. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: http://trac.transmissionbt.com/newticket about your $0: system, including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='transmission' PACKAGE_TARNAME='transmission' PACKAGE_VERSION='2.92' PACKAGE_STRING='transmission 2.92' PACKAGE_BUGREPORT='http://trac.transmissionbt.com/newticket' PACKAGE_URL='' ac_unique_file="libtransmission/transmission.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS WIN32_FALSE WIN32_TRUE BUILD_DAEMON_FALSE BUILD_DAEMON_TRUE BUILD_MAC_FALSE BUILD_MAC_TRUE BUILD_CLI_FALSE BUILD_CLI_TRUE WINDRES transmissionlocaledir MKINSTALLDIRS POSUB POFILES PO_IN_DATADIR_FALSE PO_IN_DATADIR_TRUE INTLLIBS INSTOBJEXT GMOFILES DATADIRNAME CATOBJEXT CATALOGS GETTEXT_PACKAGE ALL_LINGUAS INTLTOOL_PERL GMSGFMT MSGFMT MSGMERGE XGETTEXT INTLTOOL_POLICY_RULE INTLTOOL_SERVICE_RULE INTLTOOL_THEME_RULE INTLTOOL_SCHEMAS_RULE INTLTOOL_CAVES_RULE INTLTOOL_XML_NOMERGE_RULE INTLTOOL_XML_RULE INTLTOOL_KBD_RULE INTLTOOL_XAM_RULE INTLTOOL_UI_RULE INTLTOOL_SOUNDLIST_RULE INTLTOOL_SHEET_RULE INTLTOOL_SERVER_RULE INTLTOOL_PONG_RULE INTLTOOL_OAF_RULE INTLTOOL_PROP_RULE INTLTOOL_KEYS_RULE INTLTOOL_DIRECTORY_RULE INTLTOOL_DESKTOP_RULE intltool__v_merge_options_0 intltool__v_merge_options_ INTLTOOL_V_MERGE_OPTIONS INTLTOOL__v_MERGE_0 INTLTOOL__v_MERGE_ INTLTOOL_V_MERGE INTLTOOL_EXTRACT INTLTOOL_MERGE INTLTOOL_UPDATE USE_NLS LIBAPPINDICATOR_LIBS LIBAPPINDICATOR_CFLAGS GTK_LIBS GTK_CFLAGS BUILD_GTK_FALSE BUILD_GTK_TRUE LIBNATPMP_LIBS_QT LIBNATPMP_LIBS LIBNATPMP_CFLAGS BUILD_NATPMP_FALSE BUILD_NATPMP_TRUE LIBUPNP_LIBS_QT LIBUPNP_LIBS LIBUPNP_CFLAGS BUILD_MINIUPNP_FALSE BUILD_MINIUPNP_TRUE BUILD_UTP_FALSE BUILD_UTP_TRUE LIBUTP_LIBS_QT LIBUTP_LIBS LIBUTP_CFLAGS LIBB64_LIBS_QT LIBB64_LIBS LIBB64_CFLAGS BUILD_B64_FALSE BUILD_B64_TRUE DHT_LIBS_QT DHT_LIBS DHT_CFLAGS BUILD_DHT_FALSE BUILD_DHT_TRUE SYSTEMD_DAEMON_LIBS SYSTEMD_DAEMON_CFLAGS USE_KQUEUE_FALSE USE_KQUEUE_TRUE USE_INOTIFY_FALSE USE_INOTIFY_TRUE CRYPTO_LIBS CRYPTO_CFLAGS CRYPTO_PKG CRYPTO_USE_POLARSSL_FALSE CRYPTO_USE_POLARSSL_TRUE CRYPTO_USE_CYASSL_FALSE CRYPTO_USE_CYASSL_TRUE CRYPTO_USE_OPENSSL_FALSE CRYPTO_USE_OPENSSL_TRUE CYASSL_LIBS CYASSL_CFLAGS WOLFSSL_LIBS WOLFSSL_CFLAGS OPENSSL_LIBS OPENSSL_CFLAGS ZLIB_LIBS ZLIB_CFLAGS LIBEVENT_LIBS LIBEVENT_CFLAGS LIBCURL_LIBS LIBCURL_CFLAGS PKG_CONFIG PTHREAD_CFLAGS PTHREAD_LIBS PTHREAD_CC acx_pthread_config CXXCPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX LIBAPPINDICATOR_MINIMUM GIO_MINIMUM GLIB_MINIMUM GTK_MINIMUM POLARSSL_MINIMUM CYASSL_MINIMUM OPENSSL_MINIMUM ZLIB_MINIMUM LIBEVENT_MINIMUM CURL_MINIMUM HAVE_REVISION_FILE_FALSE HAVE_REVISION_FILE_TRUE TR_UNSTABLE_FALSE TR_UNSTABLE_TRUE LIBM CPP LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V PEERID_PREFIX USERAGENT_PREFIX target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_shared enable_static with_pic enable_fast_install with_aix_soname enable_dependency_tracking with_gnu_ld with_sysroot enable_libtool_lock with_crypto enable_largefile with_inotify with_kqueue with_systemd_daemon enable_external_dht enable_external_b64 enable_utp enable_external_natpmp enable_nls with_gtk enable_lightweight enable_cli enable_mac enable_daemon ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS LT_SYS_LIBRARY_PATH CPP CXX CXXFLAGS CCC CXXCPP PKG_CONFIG LIBCURL_CFLAGS LIBCURL_LIBS LIBEVENT_CFLAGS LIBEVENT_LIBS ZLIB_CFLAGS ZLIB_LIBS OPENSSL_CFLAGS OPENSSL_LIBS WOLFSSL_CFLAGS WOLFSSL_LIBS CYASSL_CFLAGS CYASSL_LIBS SYSTEMD_DAEMON_CFLAGS SYSTEMD_DAEMON_LIBS GTK_CFLAGS GTK_LIBS LIBAPPINDICATOR_CFLAGS LIBAPPINDICATOR_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures transmission 2.92 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/transmission] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of transmission 2.92:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-libtool-lock avoid locking (might break parallel builds) --disable-largefile omit support for large files --enable-external-dht Use system external-dht --enable-external-b64 Use system libb64 --enable-utp build µTP support --enable-external-natpmp Use system external-natpmp --enable-nls enable native language support --disable-nls do not use Native Language Support --enable-lightweight optimize libtransmission for low-resource systems: smaller cache size, prefer unencrypted peer connections, etc. --enable-cli build command-line client --enable-mac build Mac client --enable-daemon build daemon Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-aix-soname=aix|svr4|both shared library versioning (aka "SONAME") variant to provide on AIX, [default=aix]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-crypto=PKG Use specified crypto library: auto (default), openssl, cyassl, polarssl --with-inotify Enable inotify support (default=auto) --with-kqueue Enable kqueue support (default=auto) --with-systemd-daemon Add support for systemd startup notification (default is autodetected) --with-gtk with Gtk Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory LT_SYS_LIBRARY_PATH User-defined run-time library search path. CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility LIBCURL_CFLAGS C compiler flags for LIBCURL, overriding pkg-config LIBCURL_LIBS linker flags for LIBCURL, overriding pkg-config LIBEVENT_CFLAGS C compiler flags for LIBEVENT, overriding pkg-config LIBEVENT_LIBS linker flags for LIBEVENT, overriding pkg-config ZLIB_CFLAGS C compiler flags for ZLIB, overriding pkg-config ZLIB_LIBS linker flags for ZLIB, overriding pkg-config OPENSSL_CFLAGS C compiler flags for OPENSSL, overriding pkg-config OPENSSL_LIBS linker flags for OPENSSL, overriding pkg-config WOLFSSL_CFLAGS C compiler flags for WOLFSSL, overriding pkg-config WOLFSSL_LIBS linker flags for WOLFSSL, overriding pkg-config CYASSL_CFLAGS C compiler flags for CYASSL, overriding pkg-config CYASSL_LIBS linker flags for CYASSL, overriding pkg-config SYSTEMD_DAEMON_CFLAGS C compiler flags for SYSTEMD_DAEMON, overriding pkg-config SYSTEMD_DAEMON_LIBS linker flags for SYSTEMD_DAEMON, overriding pkg-config GTK_CFLAGS C compiler flags for GTK, overriding pkg-config GTK_LIBS linker flags for GTK, overriding pkg-config LIBAPPINDICATOR_CFLAGS C compiler flags for LIBAPPINDICATOR, overriding pkg-config LIBAPPINDICATOR_LIBS linker flags for LIBAPPINDICATOR, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF transmission configure 2.92 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------------------- ## ## Report this to http://trac.transmissionbt.com/newticket ## ## ------------------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by transmission $as_me 2.92, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu USERAGENT_PREFIX=2.92 PEERID_PREFIX=-TR2920- # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' am__api_version='1.15' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='transmission' VERSION='2.92' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a pax tar archive" >&5 $as_echo_n "checking how to create a pax tar archive... " >&6; } # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_pax-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do { echo "$as_me:$LINENO: $_am_tar --version" >&5 ($_am_tar --version) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && break done am__tar="$_am_tar --format=posix -chf - "'"$$tardir"' am__tar_="$_am_tar --format=posix -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x pax -w "$$tardir"' am__tar_='pax -L -x pax -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H pax -L' am__tar_='find "$tardir" -print | cpio -o -H pax -L' am__untar='cpio -i -H pax -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_pax}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -rf conftest.dir if test -s conftest.tar; then { echo "$as_me:$LINENO: $am__untar &5 ($am__untar &5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 (cat conftest.dir/file) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } grep GrepMe conftest.dir/file >/dev/null 2>&1 && break fi done rm -rf conftest.dir if ${am_cv_prog_tar_pax+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_prog_tar_pax=$_am_tool fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_pax" >&5 $as_echo "$am_cv_prog_tar_pax" >&6; } # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.6' macro_revision='2.4.6' ltmain=$ac_aux_dir/ltmain.sh # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case $ECHO in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n "$lt_cv_sys_max_cmd_len"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test yes != "$GCC"; then reload_cmds=false fi ;; darwin*) if test yes = "$GCC"; then reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 $as_echo "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 $as_echo_n "checking for a working dd... " >&6; } if ${ac_cv_path_lt_DD+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then ac_path_lt_DD_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in dd; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi $ac_path_lt_DD_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_lt_DD"; then : fi else ac_cv_path_lt_DD=$lt_DD fi rm -f conftest.i conftest2.i conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 $as_echo "$ac_cv_path_lt_DD" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 $as_echo_n "checking how to truncate binary pipes... " >&6; } if ${lt_cv_truncate_bin+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 $as_echo "$lt_cv_truncate_bin" >&6; } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[012][,.]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac else pic_mode=default fi # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac else enable_fast_install=yes fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 $as_echo_n "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. if test "${with_aix_soname+set}" = set; then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; *) as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; esac lt_cv_with_aix_soname=$with_aix_soname else if ${lt_cv_with_aix_soname+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 $as_echo "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o func_cc_basename $compiler cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/${ac_tool_prefix}file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC=$CC ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test yes = "$GCC"; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi lt_prog_compiler_pic='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test no = "$hard_links"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' export_dynamic_flag_spec='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='$wl--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs=yes ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) export_dynamic_flag_spec='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test no = "$ld_shlibs"; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct=no hardcode_direct_absolute=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' $wl-bernotok' allow_undefined_flag=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test yes = "$GCC"; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs=yes archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' else archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; osf3*) if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test yes = "$GCC"; then wlarc='$wl' archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='$wl-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='$wl-z,text' allow_undefined_flag='$wl-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='$wl-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([A-Za-z]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi # Handle Gentoo/FreeBSD as it was Linux case $host_vendor in gentoo) version_type=linux ;; *) version_type=freebsd-$objformat ;; esac case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; linux) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' need_lib_prefix=no need_version=no ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test yes = "$hardcode_automatic"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && test no != "$hardcode_minus_L"; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen=shl_load else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen=dlopen else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi fi fi fi fi fi ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report what library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC=$lt_save_CC ac_config_commands="$ac_config_commands libtool" # Only expand once: LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mwvalidcheckl in -lmw" >&5 $as_echo_n "checking for _mwvalidcheckl in -lmw... " >&6; } if ${ac_cv_lib_mw__mwvalidcheckl+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmw $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char _mwvalidcheckl (); int main () { return _mwvalidcheckl (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_mw__mwvalidcheckl=yes else ac_cv_lib_mw__mwvalidcheckl=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mw__mwvalidcheckl" >&5 $as_echo "$ac_cv_lib_mw__mwvalidcheckl" >&6; } if test "x$ac_cv_lib_mw__mwvalidcheckl" = xyes; then : LIBM=-lmw fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes; then : LIBM="$LIBM -lm" fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes; then : LIBM=-lm fi ;; esac if test 0 = "0"; then supported_build=yes CPPFLAGS="$CPPFLAGS -DNDEBUG" else supported_build=no if test "x$GCC" = "xyes" ; then CFLAGS="$CFLAGS -g -O0" CXXFLAGS="$CXXFLAGS -g -O0" fi fi if test "x$supported_build" = "xno"; then TR_UNSTABLE_TRUE= TR_UNSTABLE_FALSE='#' else TR_UNSTABLE_TRUE='#' TR_UNSTABLE_FALSE= fi if test -f REVISION; then HAVE_REVISION_FILE_TRUE= HAVE_REVISION_FILE_FALSE='#' else HAVE_REVISION_FILE_TRUE='#' HAVE_REVISION_FILE_FALSE= fi ## ## ## MANDATORY for everything ## ## CURL_MINIMUM=7.15.4 LIBEVENT_MINIMUM=2.0.10 ZLIB_MINIMUM=1.2.3 # crypto backends OPENSSL_MINIMUM=0.9.7 CYASSL_MINIMUM=3.0 POLARSSL_MINIMUM=0x01020000 # 1.2 ## ## ## MANDATORY for the GTK+ client ## ## GTK_MINIMUM=3.4.0 GLIB_MINIMUM=2.32.0 GIO_MINIMUM=2.26.0 ## ## ## OPTIONAL for the GTK+ client ## ## # create the tray icon with AppIndicator LIBAPPINDICATOR_MINIMUM=0.4.90 ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi func_stripname_cnf () { case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; esac } # func_stripname_cnf if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC func_cc_basename $compiler cc_basename=$func_cc_basename_result if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec_CXX='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. no_undefined_flag_CXX='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' $wl-bernotok' allow_undefined_flag_CXX=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='$wl--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" if test yes != "$lt_cv_apple_cc_single_mod"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi else ld_shlibs_CXX=no fi ;; os2*) hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_minus_L_CXX=yes allow_undefined_flag_CXX=unsupported shrext_cmds=.dll archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_CXX=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='$wl-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='$wl-E' whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then no_undefined_flag_CXX=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='$wl-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='$wl-z,text' allow_undefined_flag_CXX='$wl-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no GCC_CXX=$GXX LD_CXX=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX=$prev$p else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX=$prev$p else postdeps_CXX="${postdeps_CXX} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$predep_objects_CXX"; then predep_objects_CXX=$p else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX=$p else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi lt_prog_compiler_pic_CXX='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_CXX='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test no = "$hard_links"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi # Handle Gentoo/FreeBSD as it was Linux case $host_vendor in gentoo) version_type=linux ;; *) version_type=freebsd-$objformat ;; esac case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; linux) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' need_lib_prefix=no need_version=no ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec_CXX='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test yes = "$hardcode_automatic_CXX"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct_CXX" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && test no != "$hardcode_minus_L_CXX"; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test relink = "$hardcode_action_CXX" || test yes = "$inherit_rpath_CXX"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac if test "x$GCC" = "xyes" ; then CFLAGS="$CFLAGS -std=gnu99 -ggdb3 -Wall -W -Wpointer-arith -Wformat-security -Wundef -Wcast-align -Wstrict-prototypes -Wmissing-declarations -Wmissing-format-attribute -Wredundant-decls -Wnested-externs -Wunused-parameter -Wwrite-strings -Winline -Wfloat-equal" { $as_echo "$as_me:${as_lineno-$LINENO}: checking gcc version" >&5 $as_echo_n "checking gcc version... " >&6; } GCC_VERSION=`$CC -dumpversion` GCC_MAJOR=`echo $GCC_VERSION | cut -d . -f1` GCC_MINOR=`echo $GCC_VERSION | cut -d . -f2` GCC_VERSION_NUM=`(expr $GCC_MAJOR "*" 100 + $GCC_MINOR) 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCC_VERSION" >&5 $as_echo "$GCC_VERSION" >&6; } if test $GCC_VERSION_NUM -ge 304; then CFLAGS="$CFLAGS -Wextra -Winit-self" fi if test $GCC_VERSION_NUM -ge 403; then CFLAGS="$CFLAGS -Wvariadic-macros" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi for ac_header in stdbool.h xlocale.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in iconv pread pwrite lrintf strlcpy daemon dirname basename canonicalize_file_name strcasecmp localtime_r fallocate64 posix_fallocate memmem strsep strtold syslog valloc getpagesize posix_memalign statvfs htonll ntohll mkdtemp uselocale _configthreadlocale do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu acx_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 $as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_join (); int main () { return pthread_join (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : acx_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 $as_echo "$acx_pthread_ok" >&6; } if test x"$acx_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${host_os}" in *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" ;; esac if test x"$acx_pthread_ok" = xno; then for flag in $acx_pthread_flags; do case $flag in none) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 $as_echo_n "checking whether pthreads work without any flags... " >&6; } ;; -*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 $as_echo_n "checking whether pthreads work with $flag... " >&6; } PTHREAD_CFLAGS="$flag" ;; pthread-config) # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_acx_pthread_config+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$acx_pthread_config"; then ac_cv_prog_acx_pthread_config="$acx_pthread_config" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_acx_pthread_config="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no" fi fi acx_pthread_config=$ac_cv_prog_acx_pthread_config if test -n "$acx_pthread_config"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_config" >&5 $as_echo "$acx_pthread_config" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x"$acx_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 $as_echo_n "checking for the pthreads library -l$flag... " >&6; } PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { pthread_t th; pthread_join(th, 0); pthread_attr_init(0); pthread_cleanup_push(0, 0); pthread_create(0,0,0,0); pthread_cleanup_pop(0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : acx_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 $as_echo "$acx_pthread_ok" >&6; } if test "x$acx_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$acx_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 $as_echo_n "checking for joinable pthread attribute... " >&6; } attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int attr=$attr; return attr; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : attr_name=$attr; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 $as_echo "$attr_name" >&6; } if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then cat >>confdefs.h <<_ACEOF #define PTHREAD_CREATE_JOINABLE $attr_name _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 $as_echo_n "checking if more special flags are required for pthreads... " >&6; } flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 $as_echo "${flag}" >&6; } if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with xlc_r or cc_r if test x"$GCC" != xyes; then for ac_prog in xlc_r cc_r do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PTHREAD_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PTHREAD_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 $as_echo "$PTHREAD_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PTHREAD_CC" && break done test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}" else PTHREAD_CC=$CC fi else PTHREAD_CC="$CC" fi # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_pthread_ok" = xyes; then $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h : else acx_pthread_ok=no fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "x$ac_cv_func_strtold" != "xyes" ; then CPPFLAGS="$CPPFLAGS -Dstrtold=strtod" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing cos" >&5 $as_echo_n "checking for library containing cos... " >&6; } if ${ac_cv_search_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF for ac_lib in '' m; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_cos=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_cos+:} false; then : break fi done if ${ac_cv_search_cos+:} false; then : else ac_cv_search_cos=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_cos" >&5 $as_echo "$ac_cv_search_cos" >&6; } ac_res=$ac_cv_search_cos if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 $as_echo_n "checking for library containing socket... " >&6; } if ${ac_cv_search_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF for ac_lib in '' socket net; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_socket=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_socket+:} false; then : break fi done if ${ac_cv_search_socket+:} false; then : else ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 $as_echo "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 $as_echo_n "checking for library containing gethostbyname... " >&6; } if ${ac_cv_search_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF for ac_lib in '' nsl bind; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostbyname+:} false; then : break fi done if ${ac_cv_search_gethostbyname+:} false; then : else ac_cv_search_gethostbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 $as_echo "$ac_cv_search_gethostbyname" >&6; } ac_res=$ac_cv_search_gethostbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing quotacursor_skipidtype" >&5 $as_echo_n "checking for library containing quotacursor_skipidtype... " >&6; } if ${ac_cv_search_quotacursor_skipidtype+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char quotacursor_skipidtype (); int main () { return quotacursor_skipidtype (); ; return 0; } _ACEOF for ac_lib in '' quota; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_quotacursor_skipidtype=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_quotacursor_skipidtype+:} false; then : break fi done if ${ac_cv_search_quotacursor_skipidtype+:} false; then : else ac_cv_search_quotacursor_skipidtype=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_quotacursor_skipidtype" >&5 $as_echo "$ac_cv_search_quotacursor_skipidtype" >&6; } ac_res=$ac_cv_search_quotacursor_skipidtype if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBCURL" >&5 $as_echo_n "checking for LIBCURL... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$LIBCURL_CFLAGS"; then pkg_cv_LIBCURL_CFLAGS="$LIBCURL_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcurl >= \$CURL_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "libcurl >= $CURL_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBCURL_CFLAGS=`$PKG_CONFIG --cflags "libcurl >= $CURL_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$LIBCURL_LIBS"; then pkg_cv_LIBCURL_LIBS="$LIBCURL_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcurl >= \$CURL_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "libcurl >= $CURL_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBCURL_LIBS=`$PKG_CONFIG --libs "libcurl >= $CURL_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBCURL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libcurl >= $CURL_MINIMUM"` else LIBCURL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libcurl >= $CURL_MINIMUM"` fi # Put the nasty error message in config.log where it belongs echo "$LIBCURL_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libcurl >= $CURL_MINIMUM) were not met: $LIBCURL_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBCURL_CFLAGS and LIBCURL_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables LIBCURL_CFLAGS and LIBCURL_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else LIBCURL_CFLAGS=$pkg_cv_LIBCURL_CFLAGS LIBCURL_LIBS=$pkg_cv_LIBCURL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBEVENT" >&5 $as_echo_n "checking for LIBEVENT... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$LIBEVENT_CFLAGS"; then pkg_cv_LIBEVENT_CFLAGS="$LIBEVENT_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libevent >= \$LIBEVENT_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "libevent >= $LIBEVENT_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBEVENT_CFLAGS=`$PKG_CONFIG --cflags "libevent >= $LIBEVENT_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$LIBEVENT_LIBS"; then pkg_cv_LIBEVENT_LIBS="$LIBEVENT_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libevent >= \$LIBEVENT_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "libevent >= $LIBEVENT_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBEVENT_LIBS=`$PKG_CONFIG --libs "libevent >= $LIBEVENT_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBEVENT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libevent >= $LIBEVENT_MINIMUM"` else LIBEVENT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libevent >= $LIBEVENT_MINIMUM"` fi # Put the nasty error message in config.log where it belongs echo "$LIBEVENT_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libevent >= $LIBEVENT_MINIMUM) were not met: $LIBEVENT_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBEVENT_CFLAGS and LIBEVENT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables LIBEVENT_CFLAGS and LIBEVENT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else LIBEVENT_CFLAGS=$pkg_cv_LIBEVENT_CFLAGS LIBEVENT_LIBS=$pkg_cv_LIBEVENT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZLIB" >&5 $as_echo_n "checking for ZLIB... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$ZLIB_CFLAGS"; then pkg_cv_ZLIB_CFLAGS="$ZLIB_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"zlib >= \$ZLIB_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "zlib >= $ZLIB_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ZLIB_CFLAGS=`$PKG_CONFIG --cflags "zlib >= $ZLIB_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$ZLIB_LIBS"; then pkg_cv_ZLIB_LIBS="$ZLIB_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"zlib >= \$ZLIB_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "zlib >= $ZLIB_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ZLIB_LIBS=`$PKG_CONFIG --libs "zlib >= $ZLIB_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then ZLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "zlib >= $ZLIB_MINIMUM"` else ZLIB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "zlib >= $ZLIB_MINIMUM"` fi # Put the nasty error message in config.log where it belongs echo "$ZLIB_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (zlib >= $ZLIB_MINIMUM) were not met: $ZLIB_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables ZLIB_CFLAGS and ZLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables ZLIB_CFLAGS and ZLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else ZLIB_CFLAGS=$pkg_cv_ZLIB_CFLAGS ZLIB_LIBS=$pkg_cv_ZLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi # Check whether --with-crypto was given. if test "${with_crypto+set}" = set; then : withval=$with_crypto; want_crypto=$withval else want_crypto=auto fi if test "x$want_crypto" = "xauto" -o "x$want_crypto" = "xopenssl"; then : pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENSSL" >&5 $as_echo_n "checking for OPENSSL... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$OPENSSL_CFLAGS"; then pkg_cv_OPENSSL_CFLAGS="$OPENSSL_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openssl >= \$OPENSSL_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "openssl >= $OPENSSL_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_OPENSSL_CFLAGS=`$PKG_CONFIG --cflags "openssl >= $OPENSSL_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$OPENSSL_LIBS"; then pkg_cv_OPENSSL_LIBS="$OPENSSL_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openssl >= \$OPENSSL_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "openssl >= $OPENSSL_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_OPENSSL_LIBS=`$PKG_CONFIG --libs "openssl >= $OPENSSL_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then OPENSSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "openssl >= $OPENSSL_MINIMUM"` else OPENSSL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "openssl >= $OPENSSL_MINIMUM"` fi # Put the nasty error message in config.log where it belongs echo "$OPENSSL_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "x$want_crypto" = "xopenssl"; then : as_fn_error $? "OpenSSL support requested, but library not found." "$LINENO" 5 fi elif test $pkg_failed = untried; then if test "x$want_crypto" = "xopenssl"; then : as_fn_error $? "OpenSSL support requested, but library not found." "$LINENO" 5 fi else OPENSSL_CFLAGS=$pkg_cv_OPENSSL_CFLAGS OPENSSL_LIBS=$pkg_cv_OPENSSL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } want_crypto="openssl"; CRYPTO_PKG="openssl"; CRYPTO_CFLAGS="$OPENSSL_CFLAGS"; CRYPTO_LIBS="$OPENSSL_LIBS" fi fi if test "x$want_crypto" = "xauto" -o "x$want_crypto" = "xcyassl"; then : pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for WOLFSSL" >&5 $as_echo_n "checking for WOLFSSL... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$WOLFSSL_CFLAGS"; then pkg_cv_WOLFSSL_CFLAGS="$WOLFSSL_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wolfssl >= \$CYASSL_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "wolfssl >= $CYASSL_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_WOLFSSL_CFLAGS=`$PKG_CONFIG --cflags "wolfssl >= $CYASSL_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$WOLFSSL_LIBS"; then pkg_cv_WOLFSSL_LIBS="$WOLFSSL_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wolfssl >= \$CYASSL_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "wolfssl >= $CYASSL_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_WOLFSSL_LIBS=`$PKG_CONFIG --libs "wolfssl >= $CYASSL_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then WOLFSSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "wolfssl >= $CYASSL_MINIMUM"` else WOLFSSL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "wolfssl >= $CYASSL_MINIMUM"` fi # Put the nasty error message in config.log where it belongs echo "$WOLFSSL_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CYASSL" >&5 $as_echo_n "checking for CYASSL... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$CYASSL_CFLAGS"; then pkg_cv_CYASSL_CFLAGS="$CYASSL_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cyassl >= \$CYASSL_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "cyassl >= $CYASSL_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CYASSL_CFLAGS=`$PKG_CONFIG --cflags "cyassl >= $CYASSL_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$CYASSL_LIBS"; then pkg_cv_CYASSL_LIBS="$CYASSL_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cyassl >= \$CYASSL_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "cyassl >= $CYASSL_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CYASSL_LIBS=`$PKG_CONFIG --libs "cyassl >= $CYASSL_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then CYASSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cyassl >= $CYASSL_MINIMUM"` else CYASSL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cyassl >= $CYASSL_MINIMUM"` fi # Put the nasty error message in config.log where it belongs echo "$CYASSL_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "x$want_crypto" = "xcyassl"; then : as_fn_error $? "CyaSSL support requested, but library not found." "$LINENO" 5 fi elif test $pkg_failed = untried; then if test "x$want_crypto" = "xcyassl"; then : as_fn_error $? "CyaSSL support requested, but library not found." "$LINENO" 5 fi else CYASSL_CFLAGS=$pkg_cv_CYASSL_CFLAGS CYASSL_LIBS=$pkg_cv_CYASSL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } want_crypto="cyassl"; CRYPTO_PKG="cyassl"; CRYPTO_CFLAGS="$CYASSL_CFLAGS"; CRYPTO_LIBS="$CYASSL_LIBS" fi elif test $pkg_failed = untried; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CYASSL" >&5 $as_echo_n "checking for CYASSL... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$CYASSL_CFLAGS"; then pkg_cv_CYASSL_CFLAGS="$CYASSL_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cyassl >= \$CYASSL_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "cyassl >= $CYASSL_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CYASSL_CFLAGS=`$PKG_CONFIG --cflags "cyassl >= $CYASSL_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$CYASSL_LIBS"; then pkg_cv_CYASSL_LIBS="$CYASSL_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cyassl >= \$CYASSL_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "cyassl >= $CYASSL_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CYASSL_LIBS=`$PKG_CONFIG --libs "cyassl >= $CYASSL_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then CYASSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cyassl >= $CYASSL_MINIMUM"` else CYASSL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cyassl >= $CYASSL_MINIMUM"` fi # Put the nasty error message in config.log where it belongs echo "$CYASSL_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "x$want_crypto" = "xcyassl"; then : as_fn_error $? "CyaSSL support requested, but library not found." "$LINENO" 5 fi elif test $pkg_failed = untried; then if test "x$want_crypto" = "xcyassl"; then : as_fn_error $? "CyaSSL support requested, but library not found." "$LINENO" 5 fi else CYASSL_CFLAGS=$pkg_cv_CYASSL_CFLAGS CYASSL_LIBS=$pkg_cv_CYASSL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } want_crypto="cyassl"; CRYPTO_PKG="cyassl"; CRYPTO_CFLAGS="$CYASSL_CFLAGS"; CRYPTO_LIBS="$CYASSL_LIBS" fi else WOLFSSL_CFLAGS=$pkg_cv_WOLFSSL_CFLAGS WOLFSSL_LIBS=$pkg_cv_WOLFSSL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } want_crypto="cyassl"; CRYPTO_PKG="cyassl"; CRYPTO_CFLAGS="$WOLFSSL_CFLAGS"; CRYPTO_LIBS="$WOLFSSL_LIBS" fi fi if test "x$want_crypto" = "xauto" -o "x$want_crypto" = "xpolarssl"; then : ac_fn_c_check_header_mongrel "$LINENO" "polarssl/version.h" "ac_cv_header_polarssl_version_h" "$ac_includes_default" if test "x$ac_cv_header_polarssl_version_h" = xyes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if defined (POLARSSL_VERSION_NUMBER) && POLARSSL_VERSION_NUMBER >= $POLARSSL_MINIMUM version_ok #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "version_ok" >/dev/null 2>&1; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dhm_calc_secret in -lpolarssl" >&5 $as_echo_n "checking for dhm_calc_secret in -lpolarssl... " >&6; } if ${ac_cv_lib_polarssl_dhm_calc_secret+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpolarssl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dhm_calc_secret (); int main () { return dhm_calc_secret (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_polarssl_dhm_calc_secret=yes else ac_cv_lib_polarssl_dhm_calc_secret=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_polarssl_dhm_calc_secret" >&5 $as_echo "$ac_cv_lib_polarssl_dhm_calc_secret" >&6; } if test "x$ac_cv_lib_polarssl_dhm_calc_secret" = xyes; then : want_crypto="polarssl"; CRYPTO_PKG="polarssl"; CRYPTO_CFLAGS=""; CRYPTO_LIBS="-lpolarssl" else if test "x$want_crypto" = "xpolarssl"; then : as_fn_error $? "PolarSSL support requested, but library not found." "$LINENO" 5 fi fi else if test "x$want_crypto" = "xpolarssl"; then : as_fn_error $? "PolarSSL support requested, but version not suitable." "$LINENO" 5 fi fi rm -f conftest* else if test "x$want_crypto" = "xpolarssl"; then : as_fn_error $? "PolarSSL support requested, but headers not found." "$LINENO" 5 fi fi fi # we should have found the library by now if test "x$CRYPTO_PKG" = "x"; then : if test "x$want_crypto" = "xauto"; then : as_fn_error $? "Unable to find any supported crypto library." "$LINENO" 5 elif as_fn_error $? "Requested crypto library \"$want_crypto\" is not supported." "$LINENO" 5; then : fi fi if test "x$CRYPTO_PKG" = "xopenssl"; then CRYPTO_USE_OPENSSL_TRUE= CRYPTO_USE_OPENSSL_FALSE='#' else CRYPTO_USE_OPENSSL_TRUE='#' CRYPTO_USE_OPENSSL_FALSE= fi if test "x$CRYPTO_PKG" = "xcyassl"; then CRYPTO_USE_CYASSL_TRUE= CRYPTO_USE_CYASSL_FALSE='#' else CRYPTO_USE_CYASSL_TRUE='#' CRYPTO_USE_CYASSL_FALSE= fi if test "x$CRYPTO_PKG" = "xpolarssl"; then CRYPTO_USE_POLARSSL_TRUE= CRYPTO_USE_POLARSSL_FALSE='#' else CRYPTO_USE_POLARSSL_TRUE='#' CRYPTO_USE_POLARSSL_FALSE= fi # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi # getmntent is in the standard C library on UNICOS, in -lsun on Irix 4, # -lseq on Dynix/PTX, -lgen on Unixware. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getmntent" >&5 $as_echo_n "checking for library containing getmntent... " >&6; } if ${ac_cv_search_getmntent+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getmntent (); int main () { return getmntent (); ; return 0; } _ACEOF for ac_lib in '' sun seq gen; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_getmntent=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_getmntent+:} false; then : break fi done if ${ac_cv_search_getmntent+:} false; then : else ac_cv_search_getmntent=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getmntent" >&5 $as_echo "$ac_cv_search_getmntent" >&6; } ac_res=$ac_cv_search_getmntent if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ac_cv_func_getmntent=yes $as_echo "#define HAVE_GETMNTENT 1" >>confdefs.h else ac_cv_func_getmntent=no fi ac_fn_c_check_decl "$LINENO" "posix_fadvise" "ac_cv_have_decl_posix_fadvise" " #define _XOPEN_SOURCE 600 #include " if test "x$ac_cv_have_decl_posix_fadvise" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_POSIX_FADVISE $ac_have_decl _ACEOF for ac_func in posix_fadvise do : ac_fn_c_check_func "$LINENO" "posix_fadvise" "ac_cv_func_posix_fadvise" if test "x$ac_cv_func_posix_fadvise" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_POSIX_FADVISE 1 _ACEOF fi done # Check whether --with-inotify was given. if test "${with_inotify+set}" = set; then : withval=$with_inotify; WANT_INOTIFY=${withval} else WANT_INOTIFY=auto fi HAVE_INOTIFY=0 if test "x$WANT_INOTIFY" != "xno"; then : ac_fn_c_check_header_mongrel "$LINENO" "sys/inotify.h" "ac_cv_header_sys_inotify_h" "$ac_includes_default" if test "x$ac_cv_header_sys_inotify_h" = xyes; then : ac_fn_c_check_func "$LINENO" "inotify_init" "ac_cv_func_inotify_init" if test "x$ac_cv_func_inotify_init" = xyes; then : HAVE_INOTIFY=1 fi else if test "x$WANT_INOTIFY" = "xyes"; then : as_fn_error $? "\"inotify not found!\"" "$LINENO" 5 fi fi fi if test "x$WANT_INOTIFY" != "xno" -a $HAVE_INOTIFY -eq 1; then USE_INOTIFY_TRUE= USE_INOTIFY_FALSE='#' else USE_INOTIFY_TRUE='#' USE_INOTIFY_FALSE= fi # Check whether --with-kqueue was given. if test "${with_kqueue+set}" = set; then : withval=$with_kqueue; WANT_KQUEUE=${withval} else WANT_KQUEUE=auto fi HAVE_KQUEUE=0 if test "x$WANT_KQUEUE" != "xno"; then : ac_fn_c_check_header_mongrel "$LINENO" "sys/event.h" "ac_cv_header_sys_event_h" "$ac_includes_default" if test "x$ac_cv_header_sys_event_h" = xyes; then : ac_fn_c_check_func "$LINENO" "kqueue" "ac_cv_func_kqueue" if test "x$ac_cv_func_kqueue" = xyes; then : HAVE_KQUEUE=1 fi else if test "x$WANT_KQUEUE" = "xyes"; then : as_fn_error $? "\"kqueue not found!\"" "$LINENO" 5 fi fi fi if test "x$WANT_KQUEUE" != "xno" -a $HAVE_KQUEUE -eq 1; then USE_KQUEUE_TRUE= USE_KQUEUE_FALSE='#' else USE_KQUEUE_TRUE='#' USE_KQUEUE_FALSE= fi for ac_header in sys/statvfs.h \ xfs/xfs.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Check whether to enable systemd startup notification. # This requires libsystemd-daemon. # Check whether --with-systemd-daemon was given. if test "${with_systemd_daemon+set}" = set; then : withval=$with_systemd_daemon; USE_SYSTEMD_DAEMON=$withval else USE_SYSTEMD_DAEMON=auto fi if test "x$USE_SYSTEMD_DAEMON" != "xno"; then : pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SYSTEMD_DAEMON" >&5 $as_echo_n "checking for SYSTEMD_DAEMON... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$SYSTEMD_DAEMON_CFLAGS"; then pkg_cv_SYSTEMD_DAEMON_CFLAGS="$SYSTEMD_DAEMON_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsystemd-daemon\""; } >&5 ($PKG_CONFIG --exists --print-errors "libsystemd-daemon") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SYSTEMD_DAEMON_CFLAGS=`$PKG_CONFIG --cflags "libsystemd-daemon" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$SYSTEMD_DAEMON_LIBS"; then pkg_cv_SYSTEMD_DAEMON_LIBS="$SYSTEMD_DAEMON_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsystemd-daemon\""; } >&5 ($PKG_CONFIG --exists --print-errors "libsystemd-daemon") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SYSTEMD_DAEMON_LIBS=`$PKG_CONFIG --libs "libsystemd-daemon" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SYSTEMD_DAEMON_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libsystemd-daemon"` else SYSTEMD_DAEMON_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libsystemd-daemon"` fi # Put the nasty error message in config.log where it belongs echo "$SYSTEMD_DAEMON_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "x$USE_SYSTEMD_DAEMON" = "xyes"; then : as_fn_error $? "systemd startup notification support requested, but libsystemd-daemon not found." "$LINENO" 5 fi elif test $pkg_failed = untried; then if test "x$USE_SYSTEMD_DAEMON" = "xyes"; then : as_fn_error $? "systemd startup notification support requested, but libsystemd-daemon not found." "$LINENO" 5 fi else SYSTEMD_DAEMON_CFLAGS=$pkg_cv_SYSTEMD_DAEMON_CFLAGS SYSTEMD_DAEMON_LIBS=$pkg_cv_SYSTEMD_DAEMON_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define USE_SYSTEMD_DAEMON 1" >>confdefs.h fi fi DHT_CFLAGS="-I\$(top_srcdir)/third-party/dht" DHT_LIBS="\$(top_builddir)/third-party/dht/libdht.a" DHT_LIBS_QT="\$\${TRANSMISSION_TOP}/third-party/dht/libdht.a" build_bundled_dht="yes" # Check whether --enable-external-dht was given. if test "${enable_external_dht+set}" = set; then : enableval=$enable_external_dht; want_external_dht=${enableval} else want_external_dht=no fi if test "x$want_external_dht" != "xno" ; then DHT_CFLAGS="" DHT_LIBS="-ldht" DHT_LIBS_QT="-ldht" build_bundled_dht="no" fi if test "x$build_bundled_dht" = "xyes"; then BUILD_DHT_TRUE= BUILD_DHT_FALSE='#' else BUILD_DHT_TRUE='#' BUILD_DHT_FALSE= fi LIBB64_CFLAGS="-I\$(top_srcdir)/third-party/libb64" LIBB64_LIBS="\$(top_builddir)/third-party/libb64/libb64.a" LIBB64_LIBS_QT="\$\${TRANSMISSION_TOP}/third-party/libb64/libb64.a" build_bundled_b64="yes" # Check whether --enable-external-b64 was given. if test "${enable_external_b64+set}" = set; then : enableval=$enable_external_b64; want_external_b64=${enableval} else want_external_b64=no fi if test "x$want_external_b64" != "xno" ; then LIBB64_CFLAGS="-DUSE_SYSTEM_B64" LIBB64_LIBS="-lb64" LIBB64_LIBS_QT="-lb64" build_bundled_b64="no" fi if test "x$build_bundled_b64" = "xyes"; then BUILD_B64_TRUE= BUILD_B64_FALSE='#' else BUILD_B64_TRUE='#' BUILD_B64_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5 $as_echo_n "checking for clock_gettime in -lrt... " >&6; } if ${ac_cv_lib_rt_clock_gettime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char clock_gettime (); int main () { return clock_gettime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_rt_clock_gettime=yes else ac_cv_lib_rt_clock_gettime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5 $as_echo "$ac_cv_lib_rt_clock_gettime" >&6; } if test "x$ac_cv_lib_rt_clock_gettime" = xyes; then : libutp_extra_libs="-lrt" else libutp_extra_libs="" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking µTP" >&5 $as_echo_n "checking µTP... " >&6; } build_utp="no" ac_save_LIBS="$LIBS" LIBS="-lutp" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct UTPFunctionTable func; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : have_utp="yes" else have_utp="no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" if test "x$have_utp" = "xyes" -o "x$CXX" != "x"; then want_utp_default="yes" else want_utp_default="no" fi # Check whether --enable-utp was given. if test "${enable_utp+set}" = set; then : enableval=$enable_utp; want_utp=${enableval} else want_utp=${want_utp_default} fi if test "x$want_utp" = "xyes"; then if test "x$have_utp" = "xyes"; then LIBUTP_CFLAGS="" LIBUTP_LIBS="-lutp $libutp_extra_libs" LIBUTP_LIBS_QT="-lutp $libutp_extra_libs" $as_echo "#define WITH_UTP 1" >>confdefs.h build_utp="system" elif test "x$CXX" != "x"; then LIBUTP_CFLAGS="-I\$(top_srcdir)/third-party/" LIBUTP_LIBS="\$(top_builddir)/third-party/libutp/libutp.a" LIBUTP_LIBS_QT="\$\${TRANSMISSION_TOP}/third-party/libutp/libutp.a" if test "x$libutp_extra_libs" != "x" ; then LIBUTP_LIBS="$LIBUTP_LIBS $libutp_extra_libs" LIBUTP_LIBS_QT="$LIBUTP_LIBS_QT $libutp_extra_libs" fi $as_echo "#define WITH_UTP 1" >>confdefs.h build_utp="yes" else as_fn_error $? "\"Unable to build uTP support -- C++ compiler not found\"" "$LINENO" 5 fi fi if test "x$build_utp" = "xyes"; then BUILD_UTP_TRUE= BUILD_UTP_FALSE='#' else BUILD_UTP_TRUE='#' BUILD_UTP_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $build_utp" >&5 $as_echo "$build_utp" >&6; } ac_save_LIBS="$LIBS" LIBS="-lminiupnpc" { $as_echo "$as_me:${as_lineno-$LINENO}: checking system miniupnpc library" >&5 $as_echo_n "checking system miniupnpc library... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct UPNPDev dev; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : upnp_version="unknown" else upnp_version="none" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "x$upnp_version" = "xunknown" ; then if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #ifdef MINIUPNPC_API_VERSION return EXIT_SUCCESS; #else return EXIT_FAILURE; #endif ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : upnp_version=">= 1.7" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi if test "x$upnp_version" = "xunknown" ; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { struct UPNPDev * devlist; struct UPNPUrls urls; struct IGDdatas data; char lanaddr[16]; char portStr[8]; char intPort[8]; char intClient[16]; upnpDiscover( 2000, NULL, NULL, 0, 0, &errno ); UPNP_GetValidIGD( devlist, &urls, &data, lanaddr, sizeof( lanaddr ) ); UPNP_GetSpecificPortMappingEntry( urls.controlURL, data.first.servicetype, portStr, "TCP", intClient, intPort, NULL, NULL, NULL ); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : $as_echo "#define MINIUPNPC_API_VERSION 8" >>confdefs.h upnp_version="1.6" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi if test "x$upnp_version" = "xunknown" ; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { struct UPNPDev * devlist; struct UPNPUrls urls; struct IGDdatas data; char lanaddr[16]; char portStr[8]; char intPort[8]; char intClient[16]; upnpDiscover( 2000, NULL, NULL, 0 ); UPNP_GetValidIGD( devlist, &urls, &data, lanaddr, sizeof( lanaddr ) ); UPNP_GetSpecificPortMappingEntry( urls.controlURL, data.first.servicetype, portStr, "TCP", intClient, intPort ); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : $as_echo "#define MINIUPNPC_API_VERSION 5" >>confdefs.h upnp_version="1.5" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # ... and the results of our tests LIBS="$ac_save_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $upnp_version" >&5 $as_echo "$upnp_version" >&6; } if test "x$upnp_version" = "xnone"; then BUILD_MINIUPNP_TRUE= BUILD_MINIUPNP_FALSE='#' else BUILD_MINIUPNP_TRUE='#' BUILD_MINIUPNP_FALSE= fi if test "x$upnp_version" = "xnone" ; then LIBUPNP_CFLAGS="-I\$(top_srcdir)/third-party/" LIBUPNP_LIBS="\$(top_builddir)/third-party/miniupnp/libminiupnp.a" LIBUPNP_LIBS_QT="\$\${TRANSMISSION_TOP}/third-party/miniupnp/libminiupnp.a" else $as_echo "#define SYSTEM_MINIUPNP 1" >>confdefs.h LIBUPNP_CFLAGS="" LIBUPNP_LIBS="-lminiupnpc" LIBUPNP_LIBS_QT="-lminiupnpc" fi LIBNATPMP_CFLAGS="-I\$(top_srcdir)/third-party/libnatpmp/" LIBNATPMP_LIBS="\$(top_builddir)/third-party/libnatpmp/libnatpmp.a" LIBNATPMP_LIBS_QT="\$\${TRANSMISSION_TOP}/third-party/libnatpmp/libnatpmp.a" build_bundled_natpmp="yes" # Check whether --enable-external-natpmp was given. if test "${enable_external_natpmp+set}" = set; then : enableval=$enable_external_natpmp; want_external_natpmp=${enableval} else want_external_natpmp=no fi if test "x$want_external_natpmp" != "xno" ; then LIBNATPMP_CFLAGS="" LIBNATPMP_LIBS="-lnatpmp" LIBNATPMP_LIBS_QT="-lnatpmp" build_bundled_natpmp="no" fi if test "x$build_bundled_natpmp" = "xyes"; then BUILD_NATPMP_TRUE= BUILD_NATPMP_FALSE='#' else BUILD_NATPMP_TRUE='#' BUILD_NATPMP_FALSE= fi # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; else enable_nls=yes fi if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= \$GTK_MINIMUM glib-2.0 >= \$GLIB_MINIMUM gio-2.0 >= \$GIO_MINIMUM, gmodule-2.0 >= \$GLIB_MINIMUM gthread-2.0 >= \$GLIB_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= $GTK_MINIMUM glib-2.0 >= $GLIB_MINIMUM gio-2.0 >= $GIO_MINIMUM, gmodule-2.0 >= $GLIB_MINIMUM gthread-2.0 >= $GLIB_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then have_gtk=yes else have_gtk=no fi # Check whether --with-gtk was given. if test "${with_gtk+set}" = set; then : withval=$with_gtk; with_gtk=$withval else with_gtk=$have_gtk fi if test "x$with_gtk" = "xyes"; then BUILD_GTK_TRUE= BUILD_GTK_FALSE='#' else BUILD_GTK_TRUE='#' BUILD_GTK_FALSE= fi use_libappindicator=no if test "x$with_gtk" = "xyes" ; then if test "x$enable_nls" = "xno" ; then as_fn_error $? "\"The gtk client cannot be built without nls support. Try adding either --enable-nls or --without-gtk\" " "$LINENO" 5 fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 $as_echo_n "checking for GTK... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GTK_CFLAGS"; then pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= \$GTK_MINIMUM glib-2.0 >= \$GLIB_MINIMUM gio-2.0 >= \$GIO_MINIMUM, gmodule-2.0 >= \$GLIB_MINIMUM gthread-2.0 >= \$GLIB_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= $GTK_MINIMUM glib-2.0 >= $GLIB_MINIMUM gio-2.0 >= $GIO_MINIMUM, gmodule-2.0 >= $GLIB_MINIMUM gthread-2.0 >= $GLIB_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-3.0 >= $GTK_MINIMUM glib-2.0 >= $GLIB_MINIMUM gio-2.0 >= $GIO_MINIMUM, gmodule-2.0 >= $GLIB_MINIMUM gthread-2.0 >= $GLIB_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GTK_LIBS"; then pkg_cv_GTK_LIBS="$GTK_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= \$GTK_MINIMUM glib-2.0 >= \$GLIB_MINIMUM gio-2.0 >= \$GIO_MINIMUM, gmodule-2.0 >= \$GLIB_MINIMUM gthread-2.0 >= \$GLIB_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= $GTK_MINIMUM glib-2.0 >= $GLIB_MINIMUM gio-2.0 >= $GIO_MINIMUM, gmodule-2.0 >= $GLIB_MINIMUM gthread-2.0 >= $GLIB_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-3.0 >= $GTK_MINIMUM glib-2.0 >= $GLIB_MINIMUM gio-2.0 >= $GIO_MINIMUM, gmodule-2.0 >= $GLIB_MINIMUM gthread-2.0 >= $GLIB_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-3.0 >= $GTK_MINIMUM glib-2.0 >= $GLIB_MINIMUM gio-2.0 >= $GIO_MINIMUM, gmodule-2.0 >= $GLIB_MINIMUM gthread-2.0 >= $GLIB_MINIMUM"` else GTK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-3.0 >= $GTK_MINIMUM glib-2.0 >= $GLIB_MINIMUM gio-2.0 >= $GIO_MINIMUM, gmodule-2.0 >= $GLIB_MINIMUM gthread-2.0 >= $GLIB_MINIMUM"` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gtk+-3.0 >= $GTK_MINIMUM glib-2.0 >= $GLIB_MINIMUM gio-2.0 >= $GIO_MINIMUM, gmodule-2.0 >= $GLIB_MINIMUM gthread-2.0 >= $GLIB_MINIMUM) were not met: $GTK_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTK_CFLAGS and GTK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTK_CFLAGS and GTK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTK_CFLAGS=$pkg_cv_GTK_CFLAGS GTK_LIBS=$pkg_cv_GTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBAPPINDICATOR" >&5 $as_echo_n "checking for LIBAPPINDICATOR... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$LIBAPPINDICATOR_CFLAGS"; then pkg_cv_LIBAPPINDICATOR_CFLAGS="$LIBAPPINDICATOR_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"appindicator3-0.1 >= \$LIBAPPINDICATOR_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "appindicator3-0.1 >= $LIBAPPINDICATOR_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBAPPINDICATOR_CFLAGS=`$PKG_CONFIG --cflags "appindicator3-0.1 >= $LIBAPPINDICATOR_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$LIBAPPINDICATOR_LIBS"; then pkg_cv_LIBAPPINDICATOR_LIBS="$LIBAPPINDICATOR_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"appindicator3-0.1 >= \$LIBAPPINDICATOR_MINIMUM\""; } >&5 ($PKG_CONFIG --exists --print-errors "appindicator3-0.1 >= $LIBAPPINDICATOR_MINIMUM") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBAPPINDICATOR_LIBS=`$PKG_CONFIG --libs "appindicator3-0.1 >= $LIBAPPINDICATOR_MINIMUM" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBAPPINDICATOR_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "appindicator3-0.1 >= $LIBAPPINDICATOR_MINIMUM"` else LIBAPPINDICATOR_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "appindicator3-0.1 >= $LIBAPPINDICATOR_MINIMUM"` fi # Put the nasty error message in config.log where it belongs echo "$LIBAPPINDICATOR_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_libappindicator=no elif test $pkg_failed = untried; then have_libappindicator=no else LIBAPPINDICATOR_CFLAGS=$pkg_cv_LIBAPPINDICATOR_CFLAGS LIBAPPINDICATOR_LIBS=$pkg_cv_LIBAPPINDICATOR_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_libappindicator=yes fi if test "x$have_libappindicator" = "xyes"; then use_libappindicator=yes $as_echo "#define HAVE_LIBAPPINDICATOR 1" >>confdefs.h else LIBAPPINDICATOR_CFLAGS= LIBAPPINDICATOR_LIBS= fi fi use_nls=no if test "x$enable_nls" = "xyes" ; then use_nls=yes { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } case "$am__api_version" in 1.01234) as_fn_error $? "Automake 1.5 or newer is required to use intltool" "$LINENO" 5 ;; *) ;; esac INTLTOOL_REQUIRED_VERSION_AS_INT=`echo 0.35.0 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` if test -n "0.35.0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intltool >= 0.35.0" >&5 $as_echo_n "checking for intltool >= 0.35.0... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5 $as_echo "$INTLTOOL_APPLIED_VERSION found" >&6; } test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || as_fn_error $? "Your intltool is too old. You need intltool 0.35.0 or later." "$LINENO" 5 fi # Extract the first word of "intltool-update", so it can be a program name with args. set dummy intltool-update; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_UPDATE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_UPDATE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_UPDATE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE if test -n "$INTLTOOL_UPDATE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5 $as_echo "$INTLTOOL_UPDATE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-merge", so it can be a program name with args. set dummy intltool-merge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_MERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_MERGE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_MERGE="$INTLTOOL_MERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_MERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE if test -n "$INTLTOOL_MERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5 $as_echo "$INTLTOOL_MERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-extract", so it can be a program name with args. set dummy intltool-extract; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_EXTRACT+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_EXTRACT in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_EXTRACT="$INTLTOOL_EXTRACT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_EXTRACT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT if test -n "$INTLTOOL_EXTRACT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5 $as_echo "$INTLTOOL_EXTRACT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then as_fn_error $? "The intltool scripts were not found. Please install intltool." "$LINENO" 5 fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' INTLTOOL__v_MERGE_0='@echo " ITMRG " $@;' INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' intltool__v_merge_options_0='-q' INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< $@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< $@' else INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.$$RANDOM && mkdir $$_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u $$_it_tmp_dir $< $@ && rmdir $$_it_tmp_dir' fi INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' # Check the gettext tools to make sure they are GNU # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case $XGETTEXT in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XGETTEXT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi XGETTEXT=$ac_cv_path_XGETTEXT if test -n "$XGETTEXT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGMERGE in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MSGMERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGMERGE=$ac_cv_path_MSGMERGE if test -n "$MSGMERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGFMT=$ac_cv_path_MSGFMT if test -n "$MSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_PERL in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_PERL="$INTLTOOL_PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL if test -n "$INTLTOOL_PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_PERL" >&5 $as_echo "$INTLTOOL_PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_PERL"; then as_fn_error $? "perl not found" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl >= 5.8.1" >&5 $as_echo_n "checking for perl >= 5.8.1... " >&6; } $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then as_fn_error $? "perl 5.8.1 is required for intltool" "$LINENO" 5 else IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $IT_PERL_VERSION" >&5 $as_echo "$IT_PERL_VERSION" >&6; } fi if test "xno-xml" != "xno-xml"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML::Parser" >&5 $as_echo_n "checking for XML::Parser... " >&6; } if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } else as_fn_error $? "XML::Parser perl module is required for intltool" "$LINENO" 5 fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile for ac_header in libintl.h do : ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" if test "x$ac_cv_header_libintl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBINTL_H 1 _ACEOF fi done GETTEXT_PACKAGE=transmission-gtk cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" _ACEOF for ac_header in locale.h do : ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" if test "x$ac_cv_header_locale_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LOCALE_H 1 _ACEOF fi done if test $ac_cv_header_locale_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 $as_echo_n "checking for LC_MESSAGES... " >&6; } if ${am_cv_val_LC_MESSAGES+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return LC_MESSAGES ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_val_LC_MESSAGES=yes else am_cv_val_LC_MESSAGES=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5 $as_echo "$am_cv_val_LC_MESSAGES" >&6; } if test $am_cv_val_LC_MESSAGES = yes; then $as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h fi fi USE_NLS=yes gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" if test "x$ac_cv_header_libintl_h" = xyes; then : gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in libc" >&5 $as_echo_n "checking for ngettext in libc... " >&6; } if ${gt_cv_func_ngettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !ngettext ("","", 1) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_ngettext_libc=yes else gt_cv_func_ngettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_ngettext_libc" >&5 $as_echo "$gt_cv_func_ngettext_libc" >&6; } if test "$gt_cv_func_ngettext_libc" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in libc" >&5 $as_echo_n "checking for dgettext in libc... " >&6; } if ${gt_cv_func_dgettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !dgettext ("","") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_dgettext_libc=yes else gt_cv_func_dgettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_dgettext_libc" >&5 $as_echo "$gt_cv_func_dgettext_libc" >&6; } fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bindtextdomain in -lintl" >&5 $as_echo_n "checking for bindtextdomain in -lintl... " >&6; } if ${ac_cv_lib_intl_bindtextdomain+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bindtextdomain (); int main () { return bindtextdomain (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_bindtextdomain=yes else ac_cv_lib_intl_bindtextdomain=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_bindtextdomain" >&5 $as_echo "$ac_cv_lib_intl_bindtextdomain" >&6; } if test "x$ac_cv_lib_intl_bindtextdomain" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if ${ac_cv_lib_intl_ngettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in -lintl" >&5 $as_echo_n "checking for dgettext in -lintl... " >&6; } if ${ac_cv_lib_intl_dgettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dgettext (); int main () { return dgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dgettext=yes else ac_cv_lib_intl_dgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dgettext" >&5 $as_echo "$ac_cv_lib_intl_dgettext" >&6; } if test "x$ac_cv_lib_intl_dgettext" = xyes; then : gt_cv_func_dgettext_libintl=yes fi fi fi if test "$gt_cv_func_dgettext_libintl" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext" >&5 $as_echo_n "checking if -liconv is needed to use gettext... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if ${ac_cv_lib_intl_ngettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dcgettext in -lintl" >&5 $as_echo_n "checking for dcgettext in -lintl... " >&6; } if ${ac_cv_lib_intl_dcgettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dcgettext (); int main () { return dcgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dcgettext=yes else ac_cv_lib_intl_dcgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dcgettext" >&5 $as_echo "$ac_cv_lib_intl_dcgettext" >&6; } if test "x$ac_cv_lib_intl_dcgettext" = xyes; then : gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv else : fi else : fi fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in /*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then ac_cv_path_MSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" for ac_func in dcgettext do : ac_fn_c_check_func "$LINENO" "dcgettext" "ac_cv_func_dcgettext" if test "x$ac_cv_func_dcgettext" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DCGETTEXT 1 _ACEOF fi done # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : CATOBJEXT=.gmo DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : CATOBJEXT=.gmo DATADIRNAME=share else CATOBJEXT=.mo DATADIRNAME=lib fi ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi fi if test "$gt_cv_have_gettext" = "yes" ; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 $as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po ac_config_commands="$ac_config_commands default-1" for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for catalogs to be installed" >&5 $as_echo_n "checking for catalogs to be installed... " >&6; } NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINGUAS" >&5 $as_echo "$LINGUAS" >&6; } fi if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES transmissionlocaledir='${prefix}/${DATADIRNAME}/locale' fi have_darwin="no" have_msw="no" case $host_os in *mingw32*) have_msw="yes" CXXFLAGS="$CXXFLAGS -mms-bitfields -mwin32 -mwindows" CPPFLAGS="$CPPFLAGS -DWINVER=0x0600 -D_WIN32_WINNT=0x0600 -DWIN32_LEAN_AND_MEAN" # CPPFLAGS="$CPPFLAGS -D__USE_MINGW_ANSI_STDIO=1 -D__STDC_FORMAT_MACROS=1" LIBS="$LIBS -liphlpapi -lshell32 -lws2_32" transmissionlocaledir="locale" if test -z "$host_alias"; then hostaliaswindres= else hostaliaswindres="$host_alias-windres"; fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_WINDRES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$WINDRES"; then ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_WINDRES="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi WINDRES=$ac_cv_prog_WINDRES if test -n "$WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINDRES" >&5 $as_echo "$WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_WINDRES"; then ac_ct_WINDRES=$WINDRES # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_WINDRES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_WINDRES"; then ac_cv_prog_ac_ct_WINDRES="$ac_ct_WINDRES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_WINDRES="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_WINDRES=$ac_cv_prog_ac_ct_WINDRES if test -n "$ac_ct_WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_WINDRES" >&5 $as_echo "$ac_ct_WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_WINDRES" = x; then WINDRES="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac WINDRES=$ac_ct_WINDRES fi else WINDRES="$ac_cv_prog_WINDRES" fi ;; *darwin*) have_darwin="yes" ;; esac # Check whether --enable-lightweight was given. if test "${enable_lightweight+set}" = set; then : enableval=$enable_lightweight; enable_lightweight=${enableval} else enable_lightweight="no" fi if test "x$enable_lightweight" = "xyes" ; then $as_echo "#define TR_LIGHTWEIGHT 1" >>confdefs.h fi # Check whether --enable-cli was given. if test "${enable_cli+set}" = set; then : enableval=$enable_cli; build_cli=${enableval} else build_cli="no" fi if test "x$build_cli" = "xyes"; then BUILD_CLI_TRUE= BUILD_CLI_FALSE='#' else BUILD_CLI_TRUE='#' BUILD_CLI_FALSE= fi # Check whether --enable-mac was given. if test "${enable_mac+set}" = set; then : enableval=$enable_mac; build_mac=${enableval} else build_mac=${have_darwin} fi if test "x$build_mac" = "xyes"; then BUILD_MAC_TRUE= BUILD_MAC_FALSE='#' else BUILD_MAC_TRUE='#' BUILD_MAC_FALSE= fi # Check whether --enable-daemon was given. if test "${enable_daemon+set}" = set; then : enableval=$enable_daemon; build_daemon=${enableval} else build_daemon="yes" fi if test "x$build_daemon" = "xyes"; then BUILD_DAEMON_TRUE= BUILD_DAEMON_FALSE='#' else BUILD_DAEMON_TRUE='#' BUILD_DAEMON_FALSE= fi if test "x$build_mac" = "xyes" ; then $as_echo "#define BUILD_MAC_CLIENT 1" >>confdefs.h # Make sure the proper Mac SDK is installed if test ! -d /Developer/SDKs/MacOSX10.5.sdk; then cat << EOF You need to install the Mac OS X 10.5 SDK in order to build Transmission with --enable-mac: Get your Xcode CD or package Restart the install When it gets to "Installation Type", select "Customize" Select "Mac OS X 10.5 SDK" under "Cross Development" Finish the install. EOF exit 1 fi fi if test "x$have_msw" = "xyes"; then WIN32_TRUE= WIN32_FALSE='#' else WIN32_TRUE='#' WIN32_FALSE= fi ac_config_files="$ac_config_files Makefile transmission-gtk.spec cli/Makefile daemon/Makefile extras/Makefile libtransmission/Makefile utils/Makefile third-party/Makefile third-party/dht/Makefile third-party/libb64/Makefile third-party/libutp/Makefile third-party/libnatpmp/Makefile third-party/miniupnp/Makefile macosx/Makefile gtk/Makefile gtk/icons/Makefile qt/config.pri web/Makefile web/images/Makefile web/style/Makefile web/style/jqueryui/Makefile web/style/jqueryui/images/Makefile web/style/transmission/Makefile web/style/transmission/images/Makefile web/style/transmission/images/buttons/Makefile web/javascript/Makefile web/javascript/jquery/Makefile po/Makefile.in" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${TR_UNSTABLE_TRUE}" && test -z "${TR_UNSTABLE_FALSE}"; then as_fn_error $? "conditional \"TR_UNSTABLE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_REVISION_FILE_TRUE}" && test -z "${HAVE_REVISION_FILE_FALSE}"; then as_fn_error $? "conditional \"HAVE_REVISION_FILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CRYPTO_USE_OPENSSL_TRUE}" && test -z "${CRYPTO_USE_OPENSSL_FALSE}"; then as_fn_error $? "conditional \"CRYPTO_USE_OPENSSL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CRYPTO_USE_CYASSL_TRUE}" && test -z "${CRYPTO_USE_CYASSL_FALSE}"; then as_fn_error $? "conditional \"CRYPTO_USE_CYASSL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CRYPTO_USE_POLARSSL_TRUE}" && test -z "${CRYPTO_USE_POLARSSL_FALSE}"; then as_fn_error $? "conditional \"CRYPTO_USE_POLARSSL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_INOTIFY_TRUE}" && test -z "${USE_INOTIFY_FALSE}"; then as_fn_error $? "conditional \"USE_INOTIFY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_KQUEUE_TRUE}" && test -z "${USE_KQUEUE_FALSE}"; then as_fn_error $? "conditional \"USE_KQUEUE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_DHT_TRUE}" && test -z "${BUILD_DHT_FALSE}"; then as_fn_error $? "conditional \"BUILD_DHT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_B64_TRUE}" && test -z "${BUILD_B64_FALSE}"; then as_fn_error $? "conditional \"BUILD_B64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_UTP_TRUE}" && test -z "${BUILD_UTP_FALSE}"; then as_fn_error $? "conditional \"BUILD_UTP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_MINIUPNP_TRUE}" && test -z "${BUILD_MINIUPNP_FALSE}"; then as_fn_error $? "conditional \"BUILD_MINIUPNP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_NATPMP_TRUE}" && test -z "${BUILD_NATPMP_FALSE}"; then as_fn_error $? "conditional \"BUILD_NATPMP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_GTK_TRUE}" && test -z "${BUILD_GTK_FALSE}"; then as_fn_error $? "conditional \"BUILD_GTK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi ac_config_commands="$ac_config_commands po/stamp-it" if test -z "${BUILD_CLI_TRUE}" && test -z "${BUILD_CLI_FALSE}"; then as_fn_error $? "conditional \"BUILD_CLI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_MAC_TRUE}" && test -z "${BUILD_MAC_FALSE}"; then as_fn_error $? "conditional \"BUILD_MAC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_DAEMON_TRUE}" && test -z "${BUILD_DAEMON_FALSE}"; then as_fn_error $? "conditional \"BUILD_DAEMON\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WIN32_TRUE}" && test -z "${WIN32_FALSE}"; then as_fn_error $? "conditional \"WIN32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by transmission $as_me 2.92, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ transmission config.status 2.92 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "transmission-gtk.spec") CONFIG_FILES="$CONFIG_FILES transmission-gtk.spec" ;; "cli/Makefile") CONFIG_FILES="$CONFIG_FILES cli/Makefile" ;; "daemon/Makefile") CONFIG_FILES="$CONFIG_FILES daemon/Makefile" ;; "extras/Makefile") CONFIG_FILES="$CONFIG_FILES extras/Makefile" ;; "libtransmission/Makefile") CONFIG_FILES="$CONFIG_FILES libtransmission/Makefile" ;; "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;; "third-party/Makefile") CONFIG_FILES="$CONFIG_FILES third-party/Makefile" ;; "third-party/dht/Makefile") CONFIG_FILES="$CONFIG_FILES third-party/dht/Makefile" ;; "third-party/libb64/Makefile") CONFIG_FILES="$CONFIG_FILES third-party/libb64/Makefile" ;; "third-party/libutp/Makefile") CONFIG_FILES="$CONFIG_FILES third-party/libutp/Makefile" ;; "third-party/libnatpmp/Makefile") CONFIG_FILES="$CONFIG_FILES third-party/libnatpmp/Makefile" ;; "third-party/miniupnp/Makefile") CONFIG_FILES="$CONFIG_FILES third-party/miniupnp/Makefile" ;; "macosx/Makefile") CONFIG_FILES="$CONFIG_FILES macosx/Makefile" ;; "gtk/Makefile") CONFIG_FILES="$CONFIG_FILES gtk/Makefile" ;; "gtk/icons/Makefile") CONFIG_FILES="$CONFIG_FILES gtk/icons/Makefile" ;; "qt/config.pri") CONFIG_FILES="$CONFIG_FILES qt/config.pri" ;; "web/Makefile") CONFIG_FILES="$CONFIG_FILES web/Makefile" ;; "web/images/Makefile") CONFIG_FILES="$CONFIG_FILES web/images/Makefile" ;; "web/style/Makefile") CONFIG_FILES="$CONFIG_FILES web/style/Makefile" ;; "web/style/jqueryui/Makefile") CONFIG_FILES="$CONFIG_FILES web/style/jqueryui/Makefile" ;; "web/style/jqueryui/images/Makefile") CONFIG_FILES="$CONFIG_FILES web/style/jqueryui/images/Makefile" ;; "web/style/transmission/Makefile") CONFIG_FILES="$CONFIG_FILES web/style/transmission/Makefile" ;; "web/style/transmission/images/Makefile") CONFIG_FILES="$CONFIG_FILES web/style/transmission/images/Makefile" ;; "web/style/transmission/images/buttons/Makefile") CONFIG_FILES="$CONFIG_FILES web/style/transmission/images/buttons/Makefile" ;; "web/javascript/Makefile") CONFIG_FILES="$CONFIG_FILES web/javascript/Makefile" ;; "web/javascript/jquery/Makefile") CONFIG_FILES="$CONFIG_FILES web/javascript/jquery/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 2014 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # The names of the tagged configurations supported by this script. available_tags='CXX ' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac ;; "po/stamp-it":C) if ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" > /dev/null ; then as_fn_error $? "po/Makefile.in.in was not created by intltoolize." "$LINENO" 5 fi rm -f "po/stamp-it" "po/stamp-it.tmp" "po/POTFILES" "po/Makefile.tmp" >"po/stamp-it.tmp" sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/po/POTFILES.in" | sed '$!s/$/ \\/' >"po/POTFILES" sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r po/POTFILES } ' "po/Makefile.in" >"po/Makefile" rm -f "po/Makefile.tmp" mv "po/stamp-it.tmp" "po/stamp-it" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo " Configuration: Source code location: ${srcdir} Compiler: ${CXX} Build libtransmission: yes * optimized for low-resource systems: ${enable_lightweight} * µTP enabled: ${build_utp} * crypto library: ${CRYPTO_PKG} Build Command-Line client: ${build_cli} Build GTK+ client: ${with_gtk} * libappindicator for an Ubuntu-style tray: ${use_libappindicator} Build Daemon: ${build_daemon} Build Mac client: ${build_mac} " transmission-2.92/PaxHeaders.4960/NEWS0000644000000000000000000000013112667110721014357 xustar0030 mtime=1457295825.340198461 29 atime=1457295825.33719841 30 ctime=1457295917.168759759 transmission-2.92/NEWS0000644000175000017500000025432612667110721016021 0ustar00mikedldmikedld00000000000000=== Transmission 2.92 (2016/03/06) === [http://trac.transmissionbt.com/query?milestone=2.92&group=component&order=severity All tickets closed by this release] ==== Mac Client ==== * Build OSX.KeRanger.A ransomware removal into the app === Transmission 2.91 (2016/03/06) === [http://trac.transmissionbt.com/query?milestone=2.91&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix Makefile.am to include Windows patches into source archive * Fix miniupnpc script to handle spaces and other special chars in paths ==== Mac Client ==== * Prevent crash during group rules removal in some cases * Fix failure to remove seeding completion notifications from notification center * Show main window and scroll to torrent on notification click * Fix issue on Yosemite where peers view didn't occupy all the available space when web seed view was hidden ==== Qt Client ==== * Fix existing running instance detection and torrents delegation when using DBus ==== Daemon ==== * Fix building on Windows x86 * Add `--blocklist-update` argument description to transmission-remote man page * Use `-rad` as short form of `--remove-and-delete` option in transmission-remote === Transmission 2.90 (2016/02/28) === [http://trac.transmissionbt.com/query?milestone=2.90&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix renaming torrent files with common prefix * Fix some more thread safety bugs in the tr_list datatype * Fix infinite loop when removing torrent data * Add support for CyaSSL/WolfSSL and PolarSSL cryptographic backends; bump OpenSSL minimum to v0.9.7 * Initial CMake build system support * Many improvements to support Windows builds with MSVS and MinGW; drop XP/2003 support, only Vista and up now * Allow building against system UTP and DHT libraries * Fix several memory leaks and buffer overflows * Support miniupnpc API v14 * Fix "prefetch-enabled" value type in settings.json (boolean instead of integer) * Fix some issues discovered by static analysis (cppcheck, coverity) * Fix invalid JSON encoding for non-printable characters * Fix multi-threaded locale use when encoding/decoding JSON data * Fix encrypted communication with libevent 2.1+ * Prevent completed pieces modification by webseeds * Require absolute paths in RPC requests * Fix and unify torrent origin display in GTK+, Qt and web clients * Fix crash on session shutdown (evdns_getaddrinfo_cancel) * Retry if RPC server fails to bind to specified address * Improve error checking on metadata retrieval * Improve UTF-8 validity checking (merge changes from LLVM) * Don't build transmission-cli by default (it's long deprecated) ==== Mac Client ==== * UI fixes for OS X 10.9+ * Trim potential URIs from clipboard * Allow downloading files from http servers (not https) on OS X 10.11+ * Change Sparkle Update URL to use HTTPS instead of HTTP (addresses Sparkle vulnerability) * Fix global options popover layout * Fix building with Xcode 7+ * Drop OS X 10.6 support ==== GTK+ Client ==== * Fix overshoot and undershoot indicators display with GTK+ 3.16+ in main window * Don't require DISPLAY if started with `--version` argument ==== Qt Client ==== * Improve performance in Torrent Properties dialog for torrents with lots of files * Prevent entering file renaming mode with mouse double-click * Add context menu on files tab of Torrent Properties dialog resembling that of Mac client * Remove torrent file from watch directory even if "show options dialog" is not set * Use theme-provided icons in system tray and About dialog * Fix initial watch directory scan * Improve filter bar look and feel; lots of other small visual fixes; RTL layout fixes * Show message to the user when duplicate torrent is being added * Improve magnets handling in main window * Display notifications via tray icon if D-Bus is not available * Show notice on top of filtered torrents list; clear whole filter on notice double-click * Add proper compiler flags to indicate C++11 use * Fix translation files loading * Add Chinese (China), German, Indonesian, Italian (Italy), Korean, Polish (Poland), Ukrainian translations; update existing translations ==== Daemon ==== * Run as service on Windows when in background mode * Rework directory watching, add support for native mechanisms on BSD/Darwin (kqueue) and Windows (ReadDirectoryChanges) * Don't make assumptions of remote path validity in transmission-remote ==== Web Client ==== * Content Security Policy enhancements * Enable "resume now" for queued torrents * Mark appropriate fields in preferences dialog as HTML5 number fields * Update to jQuery 1.11.2, jQueryUI 1.11.4; use jQueryUI menus instead of custom ones === Transmission 2.84 (2014/07/01) === [http://trac.transmissionbt.com/query?milestone=2.84&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix peer communication vulnerability (no known exploits) reported by Ben Hawkes === Transmission 2.83 (2014/05/18) === [http://trac.transmissionbt.com/query?milestone=2.83&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Licensing change: the GNU GPLv2 code can now be used under GNU GPL v2 or v3 * Fix network hanging issues that could occur when both UTP and DHT were enabled * Fix 2.82 file descriptor leak when importing a blocklist * Disallow torrents that contain "/../" in the path * Fix 2.82 bug that didn't retain peers between sessions * Fix potential dangling memory error in UDP tracker DNS lookups * Remember a torrent's "queued" state between Transmission sessions * Updated third party libraries: DHT updated to v0.22; miniupnpc updated to v1.9 * Autoconf script fixes: better detection of ccache, minupnpc * Fix the X-Transmission-Session-Id header to be valid with the SPDY protocol * Fix thread safety bugs in the tr_list datatype * When determining free disk space on NetBSD>=6, support its Quota feature * Windows portability improvements ==== Mac Client ==== * Share option in File menu and context menu * Show all torrents when the filter bar is hidden * Show zero-byte files correctly * Coalesce multiple Speed Limit Auto Enabled/Disabled notifications * Turkish localization * Removed Brazilian Portuguese localization because of lack of localizer (European Portuguese localization remains) ==== GTK+ Client ==== * Fix threading issue on shutdown ==== Qt Client ==== * Fix toggle-downloading-by-pressing-spacebar in the file list * Fix "Open URL" crash from dangling pointer * Support launching downloaded files from inside Transmission * On Windows, use native Windows icons * Improved network status info and tooltip in the status bar * Fix "Open Torrent" dialog crash in Qt 5.2 ==== Daemon ==== * On systemd systems, fix config reloading via 'systemctl reload' * Use libevent's event loop * Fix discrepancy in curl SSL setup between tr-daemon and tr-remote * Fix broken OS X build ==== Web Client ==== * Support file renaming in the web client * Fix incorrect torrent state being displayed for magnet links * Make URLs in the torrent's comment field clickable (and sanitize them to prevent cross-scripting) === Transmission 2.82 (2013/08/08) === [http://trac.transmissionbt.com/query?milestone=2.82&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix webseed crash * Fix crash when adding UDP trackers whose host's canonical name couldn't be found * Fix crash when sending handshakes to some peers immediately after adding a magnet link * Fix crash when parsing incoming encrypted handshakes when the user is removing the related torrent * Add safeguard to prevent zombie processes after running a script when a torrent finishes downloading * Fix "bad file descriptor" error * Queued torrents no longer show up as paused after exiting & restarting * Fix 2.81 compilation error on OpenBSD * Don't misidentify Tixati as BitTornado ==== Mac Client ==== * Fix bug that had slow download speeds until editing preferences ==== GTK+ Client ==== * Fix crash that occurred in some cases after using Torrent > Set Location * Fix crash where on_app_exit() got called twice in a row * Fix 2.81 compilation error on older versions of glib * Can now open folders that have a '#' in their names * Silence gobject warning when updating a blocklist from URL ==== Qt Client ==== * Qt 5 support ==== Web Client ==== * Fix syntax error in index.html's meta name="viewport" * Fix file uploading issue in Internet Explorer 11 === Transmission 2.81 (2013/07/17) === [http://trac.transmissionbt.com/query?milestone=2.81&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix 2.80 bug that showed the incorrect status for some peers * Better handling of announce errors returned by some trackers * Fix compilation error on Solaris ==== Mac Client ==== * Fix 2.80 crash when removing a torrent when its seed ratio or idle limit is reached * Fix crash when pausing some torrents * Fix 2.80 icon display on Mavericks ==== GTK+ Client ==== * Fix minor memory leaks * Remove OnlyShowIn= from the .desktop file ==== Qt Client ==== * Remove OnlyShowIn= from the .desktop file ==== Daemon ==== * Change the systemd script to start Transmission after the network's initialized ==== Web Client ==== * Slightly better compression of png files === Transmission 2.80 (2013/06/25) === [http://trac.transmissionbt.com/query?milestone=2.80&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Support renaming a transfer's files and folders * Remove the most frequent thread locks in libtransmission (ie, fewer beachballs) * Show the free disk space available when adding torrent * Faster reading and parsing of local data files * Better use of the OS's filesystem cache * Lengthen the prefetch cache for data sent to peers * Other small speedups * Replace the previous JSON parser with jsonsl to resolve DFSG licensing issue * Fix fails-to-build when compiling with -Werror=format-security * Improved unit tests in libtransmission * Tarballs are now released only in .xz format ==== Mac Client ==== * Use VDKQueue for watching for torrent files ==== GTK+ Client ==== * Simplify the tracker filter pulldown's interface (now matches the Qt client) * Synced preferences text & shortcuts * Remove deprecated calls to gdk_threads_enter() * Silence a handful of console warnings ==== Qt Client ==== * More efficient updates when receiving information from the server * Add an option to play a sound when a torrent finishes downloading * Add an option to start up iconified into the notification area * Fix an issue with the tray icon preventing hibernation/logout * Other CPU speedups * Open the correct folder when clicking on single-file torrents * Synced preferences text & shortcuts * Fix non Latin-1 unit strings ==== Daemon ==== * Add support for specifying recently-active torrents in transmission-remote ==== Web Client ==== * Extend the cookie lifespan so that settings like sort order don't get lost ==== Utils ==== * Support user-defined piece sizes in transmission-create === Transmission 2.77 (2013/02/18) === [http://trac.transmissionbt.com/query?milestone=2.77&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix 2.75 regression that broke JSON parsing of real numbers in locales that don't use '.' as a decimal separator * Don't invalidate the OS's file cache when closing files * Fix overflow error when setting speed limits above ~8589 kB/s * Generated magnet links didn't include webseeds * Fix minor memory leaks when using webseeds ==== GTK+ Client ==== * Minor pluralization fixes in the UI * Fix folder mis-selection issue in the Preferences dialog * Fix GTK+ console warnings on shutdown ==== Qt Client ==== * Fix non Latin-1 symbol issue when showing file transfer speeds * Fix issue when creating new torrents with multiple trackers * Fix lost text selection in the properties dialog's 'comment' field ==== Daemon ==== * Fix documentation errors in the spec and manpages ==== Web Client ==== * Fix minor DOM leak ==== CLI ==== * Fix transmission-cli failure when the download directory doesn't exist === Transmission 2.76 (2013/01/08) === [http://trac.transmissionbt.com/query?milestone=2.76&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Better error logging when user-provided scripts can't be executed * The "Time Remaining" property wasn't set for torrents with webseeds but no peers * Fix rare error that created a directory name "$HOME" ==== GTK+ Client ==== * Fix sort-by-age regression introduced in 2.74 * The "Edit Trackers" window didn't resize properly due to a 2.70 regression * Raise the main window when presenting it from an App Indicator ==== Qt Client ==== * Add magnet link support to transmission-qt.desktop * Fix notification area bug that inhibited logouts & desktop hibernation * Use the "video" icon when the torrent is an mkv or mp4 file * Toggling the "Append '.part' to incomplete files' names" had no effect * Fix display of the torrent name in the Torrent Options dialog * Fix cursor point bug in the filterbar's entry field * Fix crash when adding a magnet link when Transmission was only visible in the system tray * Fix free-memory-read error on shutdown ==== Daemon ==== * Better watchdir support * Documentation fixes in transmission-remote's manpage ==== Web Client ==== * Fix indentation of the torrent list and toolbar buttons on mobile devices ==== CLI ==== * If the Download directory doesn't exist, try to create it instead of exiting === Transmission 2.75 (2012/12/13) === [http://trac.transmissionbt.com/query?milestone=2.75&group=component&order=severity All tickets closed by this release] ==== Mac ==== * Fix crash on non-English localizations === Transmission 2.74 (2012/12/10) === [http://trac.transmissionbt.com/query?milestone=2.74&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix a bug that prevented IPv6 addresses from being saved in dht.dat * Better handling of magnet links that contain 'tr.x=' parameters * Add filtering of addresses used for uTP peer connections * Fix detection of whether or not a peer supports uTP connections ==== Mac ==== * Auto-grouping won't apply until torrents are demagnetized * Tweak the inspector's and add window's file lists to avoid auto-hiding scrollbars overlapping the priority controls * Fix potential crash when downloading and seeding complete at the same time * Fix bug where stopped torrents might start when waking the computer from sleep ==== Web Client ==== * Fix a multi-file selection bug * Fix bug where the upload and download arrows and rates would not appear for downloading torrents * Fix bug when displaying the tracker list === Transmission 2.73 (2012/10/08) === [http://trac.transmissionbt.com/query?milestone=2.73&group=component&order=severity All tickets closed by this release] ==== Mac ==== * Fix crash on non-English localizations === Transmission 2.72 (2012/10/16) === [http://trac.transmissionbt.com/query?milestone=2.72&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix crash when adding magnet links with malformed webseeds * Fix handling of magnet links' webseed URLs that contain whitespace * Fix remaining time estimates of magnet links that have webseeds * Show the webseed count in the torrent list when downloading from webseeds ==== Mac ==== * When possible allow automatic switching to the integrated GPU on dual-GPU machines * Include seeding-complete transfers in the badged count on the Dock icon ==== GTK+ ==== * When adding torrents by URL from the clipboard, handle whitespace in the link ==== Qt ==== * Fix dialog memory leaks ==== Web Client ==== * Minor interface fixes === Transmission 2.71 (2012/09/26) === [http://trac.transmissionbt.com/query?milestone=2.71&group=component&order=severity All tickets closed by this release] ==== Mac ==== * Fix 2.70 crasher on 10.6 Snow Leopard === Transmission 2.70 (2012/09/25) === [http://trac.transmissionbt.com/query?milestone=2.70&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Improved speed with the µTP protocol * Fix bug that caused some incoming encrypted peer connections to fail * Fix bugs with the speed limit scheduler * Fix crasher with magnet links ==== Mac ==== * Notification Center support on Mountain Lion * Torrent files can be previewed with Quick Look in the Finder * Add an option to remove transfers when seeding completes * Fix displaying the Web Client with Bonjour * Fix bugs with Time Machine exclusions * Other minor interface tweaks and bug fixes * Removed Simplified Chinese localization because of lack of localizer ==== GTK+ ==== * Require GTK+ 3.4 ==== Qt ==== * Control speed limit from the icon tray * Improved behavior when clicking on torrents in the torrent list * Fix bug where torrent files were not deleted * Fix bug with unicode characters in the default location ==== Web Client ==== * The file inspector tab displays files nested under directories * Improved scrolling on iPad * Fix incorrectly rendered characters * Fix bug involving attempts to post notifications without permission === Transmission 2.61 (2012/07/23) === [http://trac.transmissionbt.com/query?milestone=2.61&group=component&order=severity All tickets closed by this release] ==== Mac ==== * Fix crash when creating a torrent file on Lion or newer ==== GTK+ ==== * Support startup notification * Require GTK+ 3 ==== Qt ==== * Fix bug when opening the web client via the Preferences dialog * Better opening of magnet links * The Torrent File list now handles very long lists faster * Fix i18n problem introduced in 2.60 ==== Web Client ==== * Close potential cross-scripting vulnerability from malicious torrent files ==== Utils ==== * Add magnet link generation to the transmission-show command line tool === Transmission 2.60 (2012/07/05) === [http://trac.transmissionbt.com/query?milestone=2.60&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix issues when adding magnet links * Improved scraping behavior for certain trackers * Fix bug where cleared statistics might not save * Updated versions of miniupnpc and libuTP * Fixed compilation issues with Solaris and FreeBSD * Other minor fixes ==== Mac ==== * Ready for Gatekeeper on Mountain Lion * Retina graphics * Add a filter and select all/deselect all buttons to the add window * Support Lion's window restoration for several windows ==== Qt ==== * Add Basque translation ==== Web Client ==== * Notification of downloading and seeding completion (requires browser support of notifications) * Re-add select all and deselect all buttons to the file inspector tab === Transmission 2.52 (2012/05/19) === [http://trac.transmissionbt.com/query?milestone=2.52&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix bug with zero termination of multiscrape strings * Update the bundled libnatpmp and miniupnp port forwarding libraries ==== Mac ==== * Add select all and deselect all buttons to the file inspector tab * Minor interface tweaks and bug fixes * Danish localization ==== GTK+ ==== * Fix minor bug in Ubuntu app indicator support === Transmission 2.51 (2012/04/08) === [http://trac.transmissionbt.com/query?milestone=2.51&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Update the bundled libnatpmp and miniupnp port forwarding libraries * Add environment variable options to have libcurl verify SSL certs * Support user-specified CXX environment variables during compile time ==== Mac ==== * Raise the allowed limits for many configuration options * Fix regression that ignored user-specified TRANSMISSION_HOME environment ==== GTK+ ==== * Fix crash when adding torrents on systems without G_USER_DIRECTORY_DOWNLOAD * Honor the notification sound setting * Add a tooltip to files in the torrents' file list * Fix broken handling of the Cancel button in the "Open URL" dialog * Improve support for Gnome Shell and Unity * Catch SIGTERM instead of SIGKILL ==== Qt ==== * Progress bar colors are now similar to the Mac and Web clients' * Improve the "Open Folder" behavior ==== Web Client ==== * Fix global seed ratio progress bars * Fix sometimes-incorrect ratio being displayed in the inspector * If multiple torrents are selected, show the aggregate info in the inspector * Upgrade to jQuery 1.7.2 ==== Daemon ==== * Show magnet link information in transmission-remote -i === Transmission 2.50 (2012/02/14) === [http://trac.transmissionbt.com/query?milestone=2.50&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix crash when adding some magnet links * Improved support for downloading webseeds with large files * Gracefully handle incorrectly-compressed data from webseed downloads * Fairer bandwidth distribution across connected peers * Use less CPU when calculating undownloaded portions of large torrents * Use the Selection Algorithm, rather than sorting, to select peer candidates * Use base-10 units when displaying bandwidth speed and disk space * If the OS has its own copy of natpmp, prefer it over our bundled version * Fix Fails-To-Build error on Solaris 10 from use of mkdtemp() * Fix Fails-To-Build error on FreeBSD from use of alloca() * Fix Fails-To-Build error when building without a C++ compiler for libuTP ==== Mac ==== * Requires Mac OS X 10.6 Snow Leopard or newer * Animated rows in the main window (Lion only) * Quarantine downloaded files (to protect against malware) * The inspector no longer floats above other windows (by popular demand) * Mist notifications: basic notification support for users without Growl * Support pasting a torrent file URL into the main window (Lion only) * Minor interface tweaks and bug fixes ==== GTK+ ==== * Fix regression that broke the "--minimized" command-line argument * Instead of notify-send, use the org.freedesktop.Notifications DBus API * Fix a handful of small memory leaks ==== Qt ==== * Fix FTB when building without libuTP support on Debian ==== Web Client ==== * Filtering by state and tracker * Sorting by size * Larger, easier-to-press toolbar buttons * Fix the torrent size and time remaining in the inspector's details tab * Bundle jQuery and the stylesheets to avoid third-party CDNs * Upgrade to jQuery 1.7.1 * Fix runtime errors in IE 8, IE 9, and Opera * Revise CSS stylesheets to use SASS * Minor interface tweaks ==== Daemon ==== * Fix corrupted status string in transmission-remote === Transmission 2.42 (2011/10/19) === [http://trac.transmissionbt.com/query?milestone=2.42&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix error connecting to UDP trackers from big-endian computers * Fix RPC error when editing UDP trackers * Fix build failure when a C++ compiler is not installed ==== Mac ==== * Fix a potential crash on 10.5 Leopard * Fix bugs with the tracker and file inspector tables ==== GTK+ ==== * Support GTK+ 3.2 * Fix crasher on systems not running DBus ==== Qt ==== * Updated Lithuanian translation ==== Web Client ==== * Fix bug which broke Opera support === Transmission 2.41 (2011/10/08) === [http://trac.transmissionbt.com/query?milestone=2.41&group=component&order=severity All tickets closed by this release] ==== Mac ==== * Fix crasher on 10.5 Leopard === Transmission 2.40 (2011/10/08) === [http://trac.transmissionbt.com/query?milestone=2.40&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Torrent queuing * Improved webseed support * Fix crash when removing a magnetized transfer * Fix adding transfers over RPC when a subfolder does not exist * Other minor fixes ==== Mac ==== * Lion: Use popovers for the global and per-torrent action menus * Lion: Animations in the inspector's file list and the message window * Support sorting transfers by size * No longer keep track of recently opened torrent files * Apply group locations when adding transfers through the web client/RPC * Minor interface tweaks and behavior adjustments ==== GTK+ ==== * Add GTK+ 3 support * Make popup notification and system sounds system-configurable * Add a settings option to hard-delete files instead of using the recycle bin * Raise the minimum library requirements for GTK+ to 2.22 and glib to 2.28 ==== Qt ==== * Add popup notification for finished torrents * Fix non-UTF-8 display issue in the "New Torrent" dialog ==== Daemon ==== * SSL support in transmission-remote ==== Web Client ==== * Speed improvements * Add filtering by tracker * Allow preference changes on mobile devices * Allow compact view on mobile devices * Stop ratio functionality * Compact view interface improvements ==== Utils ==== * Fix transmission-edit bug when adding a tracker to a single-tracker torrent * Fix transmission-create bug when specifying a directory with a leading "./" === Transmission 2.33 (2011/07/20) === [http://trac.transmissionbt.com/query?milestone=2.33&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Improved webseed support * Better support for moving and deleting files * Fix "Too many open files" bug * Apply blocklists towards DHT communication * Fix displayed availability ==== Mac ==== * Minor Lion interface tweaks ==== GTK+ ==== * Remove deprecated GConf2 dependency ==== Qt ==== * Fix high CPU issues * Fix wrong torrent count on tracker filterbar * Update Spanish translation === Transmission 2.32 (2011/06/28) === [http://trac.transmissionbt.com/query?milestone=2.32&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix error caused by some "open-file-limit" configuration settings * Fix 2.30 problem seeding to some peers * Fix bug converting torrent file text contents to UTF-8 * Better µTP support on systems running uClibc * Other small bug fixes ==== Mac ==== * Improved tabbing behavior * Lion compatibility * Minor interface tweaks and stability fixes ==== GTK+ ==== * Fix 2.30 error opening torrents from a web browser * Remove GNOME desktop proxy support ==== Web Client ==== * Fix bug when adding torrents * Add torrents by info hash in the add dialog * Sorting by ratio * Allow drag-and-drop to add links === Transmission 2.31 (2011/05/17) === [http://trac.transmissionbt.com/query?milestone=2.31&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * This release fixes a 2.30 packaging error === Transmission 2.30 (2011/05/16) === [http://trac.transmissionbt.com/query?milestone=2.30&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * µTP support * UDP tracker support * Multiscrape support * Download scarcest pieces first * The "lazy bitfield" feature has been superseded by the "Fast Extension" BEP6 * Scripts are passed the environment ==== Mac ==== * An Intel Mac is now required * Ability to remove all completed (finished seeding) transfers * The Web Interface is published over Wide-Area Bonjour * Enhanced grouping rules * Interface tweaks ==== GTK+ ==== * Added 256 x 256 icon by Andreas Nilsson * Register as a magnet link handler in the .desktop file ==== Web Client ==== * Peer and Network preferences === Transmission 2.22 (2011/03/04) === [http://trac.transmissionbt.com/query?milestone=2.22&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Faster endgame * Fix bug where leechers might be disconnected while seeding in some situations * Fix 2.20 bug that sometimes showed inaccurate upload/download speeds * Support for unsorted blocklists * Fix IPv6 DHT * Re-add support to automatically close idle peers * Fix bug where the resume file did not save the time checked for the last piece ==== Mac ==== * Fixes for Dutch, German, and Russian localizations ==== GTK+ ==== * Fix setting individual idle seeding time ==== Qt ==== * Fix loading localizations on Linux ==== CLI ==== * Fix bandwidth display issue === Transmission 2.21 (2011/02/08) === [http://trac.transmissionbt.com/query?milestone=2.21&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix compile error in the 2.20 tarball ==== GTK+ ==== * Several updated translations ==== Qt ==== * Updated Spanish translation === Transmission 2.20 (2011/02/06) === [http://trac.transmissionbt.com/query?milestone=2.20&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Remember downloaded files when a drive is unplugged * File re-verification is no longer needed in some situations * Fix "Too many open files" error * Show the total downloading and seeding time per torrent * Fix webseeds * Better support for IPv6-only trackers * Add the ability to shutdown Transmission sessions via RPC * NAT-PMP and UPnP now also map the UDP port * Update the DHT code to dht-0.18 * Faster parsing of bencoded data * Improve support for running scripts when a torrent finishes downloading * Fix reannounce interval when trackers return a 404 error * Fix checksum error on platforms running uClibc 0.9.27 or older * Fix memmem() errors on Solaris ==== Mac ==== * Fix issues in the German and Spanish localizations * Interface tweaks * Support ZIP and other compression formats in the blocklist downloader ==== GTK+ ==== * Add "Add" and "Remove" buttons to the tracker list * Add filesize column to the files list * Several minor bug fixes and interface improvements ==== Qt ==== * Accept info_hash values in the "Add url..." dialog ==== Daemon ==== * Add "reannounce to tracker" option to transmission-remote * transmission-remote can now read auth info from environment variables * Fix configuration file bug with transmission-daemon running on Macs ==== Web Client ==== * Right-clicking a torrent now works with Firefox / Firegestures / Ubuntu ==== Utils ==== * Fix error when replacing substrings in tracker announce URLs * Webseeds are now displayed in transmission-show === Transmission 2.13 (2010/12/09) === [http://trac.transmissionbt.com/query?milestone=2.13&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix "No Announce Scheduled" tracker error * Fix build error on Solaris 10 * Fix RPC documentation errors * Fix minor packaging errors ==== Mac ==== * Add option to run a script when torrents finish downloading * Simplify editing the blocklist URL in the preferences window ==== GTK+ ==== * Unblur the statusbar icons * Fix truncation error in the Torrent Properties dialog ==== Qt ==== * Fix crash when opening the Torrent Properties dialog on magnet links * Fix "undo" error when making changes in the Torrent Properties dialog * Add Brazilian Portuguese Translation * Add Spanish (LAC) Translation === Transmission 2.12 (2010/11/14) === [http://trac.transmissionbt.com/query?milestone=2.12&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Make the blocklist URL user-configurable * Several minor bug fixes and CPU speed improvements * Use slightly less bandwidth in DHT messages * Fix 2.10 build issue on uClibc systems ==== Mac ==== * Sort the file list alphabetically * Ensure the proper extension is used when saving the torrent file * Allow the Quick Look command when the inspector window has focus ==== GTK+ ==== * Fix 2.11 crash when opening the Properties dialog on a magnet link torrent * Fix 2.00 regression which failed to inhibit hibernation on laptops ==== Qt ==== * Fix 2.10 build issue on Ubuntu ==== CLI ==== * Fix 2.10 crash ==== Web Client ==== * Upgrade to jQuery 1.4.3 * Fix 2.11 regression when using the web client on IE7 or IE8 === Transmission 2.11 (2010/10/16) === [http://trac.transmissionbt.com/query?milestone=2.11&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix a 2.10 crash * Fix minor build issues on various platforms, particularly embedded systems * Fix issue when saving bencoded files on small hardware running uClibc * Fix minor rounding issue when displaying percentages * Fix the optimistic unchoke interval ==== Mac ==== * Swipe to change inspector tab ==== GTK+ ==== * Fix drag-and-dropping a magnet link * Fix hiding dialogs when hiding Transmission in the notification area ==== Qt ==== * Fix crash in the file tree ==== Daemon ==== * Fix missing status message when using "transmission-remote --add" ==== Web Client ==== * Add Transmission website links to the action menu === Transmission 2.10 (2010/10/07) === [http://trac.transmissionbt.com/query?milestone=2.10&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Support for automatically stopping idle seeding torrents * Small memory cache to reduce disk IO * gzip compression support added to the RPC server * Add support for a cookies.txt file * Minor CPU optimizations ==== Mac ==== * Display file sizes and speeds in base 10 on Snow Leopard ==== GTK+ ==== * Files and folders can be opened by clicking on them in the files list * Update the interface when session changes are made via RPC * Fix the Details dialog to fit on a netbook screen ==== Qt ==== * Tracker announce list editing * New filterbar * Improved display for showing a torrent's tracker announces * Better DBUS integration * Support adding torrents via drag-and-drop * Add Desktop Notification for added/complete torrents * Other minor improvements ==== Web Client ==== * Peer list added to the inspector * Compact view mode * Support filtering by active and finished * Support sorting by size ==== Daemon ==== * Allow the .pidfile location to be set in settings.json ==== Utils ==== * New command-line utility "transmission-edit" for editing torrent files * New command-line utility "transmission-show" for viewing torrent files * New command-line utility "transmission-create" for creating torrent files === Transmission 2.04 (2010/08/06) === [http://trac.transmissionbt.com/query?milestone=2.04&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Improved shutdown time in some situations * Fix display bug in tr_truncd() ==== Mac ==== * Fix bug that caused Local Peer Discovery to always be disabled on startup ==== GTK+ ==== * Fix inaccurate "active torrent" counts in the filterbar * Fix display bug with magnet link names ==== Qt ==== * Fix crash when accessing a password-protected remote session ==== Web Client ==== * Fix bad redirect === Transmission 2.03 (2010/07/21) === [http://trac.transmissionbt.com/query?milestone=2.03&group=component&order=severity All tickets closed by this release] ==== Mac ==== * Fix 2.02 bug where new transfers could not be added and the inspector would not appear === Transmission 2.02 (2010/07/19) === [http://trac.transmissionbt.com/query?milestone=2.02&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix NAT-PMP port forwarding issue on some systems * Fix filename errors for torrents whose files are encoded in ISO-8859-1 * Fix rare crash on shutdown * Fix the RPC server's redirect URL to allow HTTPS proxies like stunnel * Replace less-portable calls with posix nanosleep() ==== Mac ==== * Use F_NOCACHE to keep "inactive memory" in check ==== GTK+ ==== * Fix crash when opening the Properties dialog on a magnet link without metainfo * Fix crash when removing multiple torrents at once * Allow individual torrents' download speed limits to be set to zero * Fix translation error with some error messages ==== Qt ==== * Fix CPU spike when opening the Properties dialog * Fix compilation issue with Qt < 4.5 === Transmission 2.01 (2010/06/26) === [http://trac.transmissionbt.com/query?milestone=2.01&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Better tracker announce management when completed torrents are moved from the incomplete directory * Speed up moving local data from one disk to another * Better parsing of nonstandard magnet links ==== Mac ==== * If the seed ratio is already met when download completes, still perform the Growl notification and download-complete sound * Fix the Help buttons in the preferences window ==== GTK+ ==== * Faster torrent file parsing * Fix the magnet link options dialog does not respect setting * Add an error popup if "Add URL" fails ==== Qt ==== * Fix crash after getting magnet torrent metadata * Fix torrent ratio goals * Fix "add torrent" dialog bug on KDE desktops that popped up previous torrents * Fix 2.00 bug that prevented multiple instances from being run * Fix remote mode bug that kept the torrent list from being shown * Support encryption settings in the preferences dialog * Use flagStr in the status field of the peer list * Request a full refresh when changing the session source * Fix the torrent list jumping to the top when a torrent is removed ==== Web Client ==== * Fix display bug caused by removal of a torrent hidden by the current filter === Transmission 2.00 (2010/06/15) === [http://trac.transmissionbt.com/query?milestone=2.00&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * "Local Peer Discovery" for finding peers on the local network * Optimize download requests for the bandwidth available * Smarter heuristics when deciding the order to connect to peers * Faster verification of local data * Faster startup * Support more blocklist file formats * Use IEC standard units (KiB, MiB, GiB) instead of (KB, MB, GB) * Better handling of 404 tracker errors ==== Mac ==== * Compact View replaces Minimal View, taking up considerably less space * Show an Add Transfer window when adding magnet links * "Resume All" now ignores finished transfers * Allow trackers to be pasted into the Create Window * European Portuguese localization * Removed Traditional Chinese localization because of lack of localizer ==== GTK+ ==== * New filterbar to filter by tracker, private/public, etc. * Compact View replaces Minimal View, taking up considerably less space * Show the Torrent Options dialog when adding magnet links * "Set Location" now supports moving multiple torrents at once * The Properties window now fits on low resolution screens * Add favicon support to the Properties dialog's Tracker tab ==== Qt ==== * Show the Torrent Options dialog when adding magnet links * Show all active trackers in the tracker display list * Show file sizes in the file tree * Added a confirm dialog when removing torrents * Properties and torrent options no longer jump around while editing * Allow setting locations for remote sessions * Miscellaneous UI fixes ==== Daemon ==== * Let users specify a script to be invoked when a torrent finishes downloading * Better support for adding per-torrent settings when adding a new torrent * Optional pidfile support * Option to start torrents paused * Option to delete torrent files from watch directory ==== Web Client ==== * The context menu now works when multiple rows are selected * Show ETA for seeding torrents that have a seed ratio set === Transmission 1.93 (2010/05/01) === [http://trac.transmissionbt.com/query?milestone=1.93&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix rare crash when some peers disconnected unexpectedly * Fix bug which didn't parse scheduled speed limit dates correctly * Fix bug that broke magnet links whose names contained slashes * Fix crash when updating the blocklist when the disk is full * Fix slow file preallocation on Unix systems not using ext3/ext4 * Fix regression which broke the "bind-address-ipv4" configuration setting * For better security, Web client connections are disabled by default * Update to miniupnpc-1.4 * Transmission builds out-of-the-box with Curl 7.15.5. (Hello CentOS!) ==== GTK+ ==== * Use the size for the system tray icon ==== Qt ==== * Fix bug that crashed when removing more than one torrent at once * Fix bug when parsing the remote password from the command line * Add support for the "incomplete directory" in the preferences dialog * Don't show "time remaining" for paused torrents ==== Daemon ==== * Fix bug parsing RPC requests when setting which files to not download * Fix possible crash when using inotify for the daemon's watchdir * Fix bugs in the configure script * Fix bug updating the blocklist over RPC ==== Web Client ==== * Fix bug that broke the "reverse sort order" menu checkbox === Transmission 1.92 (2010/03/14) === [http://trac.transmissionbt.com/query?milestone=1.92&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix possible data corruption issue caused by data sent by bad peers during endgame * Fix potential buffer overflow when adding maliciously-crafted magnet links * Fix announces to IPv6 trackers * Fix DNS problems on some platforms, including Debian * Fix issues with the incomplete directory functionality * Fix port forwarding error on some routers by updating libnatpmp and miniupnp ==== Mac ==== * Fix bug where setting low priority in the add window resulted in high priority ==== GTK+ ==== * Fix directory selection error in GTK+ 2.19 * Small GUI improvements: HIG correctness, remove deprecated GTK+ calls, etc. ==== Daemon ==== * Fix 1.91 build error on Mac and FreeBSD * Standardize the daemon's watchdir feature to behave like the other clients' ==== Web Client ==== * Statistics dialog * Fix error in "trash data & remove from list" that didn't trash all data * Fix display of ratios and time * Update to jQuery 1.4.2 === Transmission 1.91 (2010/02/21) === [http://trac.transmissionbt.com/query?milestone=1.91&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix 1.90 crash-on-startup bug that affected some users * Fix 1.90 bug that caused the "turtle mode" state to be forgotten between sessions * Fix 1.83 crash when adding a torrent by URL from an ftp source via the web client * For the BitTorrent spec's "downloaded=X" passage, use the de facto standard ==== Mac ==== * Fix 1.90 bug when removing trackers === Transmission 1.90 (2010/02/16) === [http://trac.transmissionbt.com/query?milestone=1.90&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Add an option to disable the .part suffix for incomplete files * Add priority selector to GUI clients' add torrent windows * Fix 1.81 bug that broke HTTP requests to sites that gave HTTP 301 redirects * Fix 1.8x bug in announcing "finished downloading" and "stopping" at the same time * Fix 1.8x bug in announcing partial seeds * Try harder to make announces finish, even if the tracker responds slowly * Fix bug that didn't honor download speed limits of 0 * Use fallocate64() for fast file preallocation on systems that support it * Magnet link improvements * Don't let "Disk is full" errors cause loss of configuration files * Faster parsing of bencoded data, such as torrent files ==== Mac ==== * Display information for all selected transfers in the inspector's tracker and peer tabs * Add a filter to the message log * Fix potential crash when updating the blocklist * Fix bug that caused the speed limit scheduler to not be applied after sleep * Remove excessive file selection for the per-torrent action menu * Smaller interface tweaks ==== GTK+ ==== * Give more helpful error messages if "Set Location" or "Add Magnet Link" fail * Add optional support for libappindicator * Minor build fixes ==== Daemon ==== * Add transmission-remote support for port testing and blocklist updating * Add transmission-daemon support for incomplete-dir, dht, and seedratio * If settings.json is corrupt, give an error telling where the problem is * Add option to specify where log messages should be written ==== Web Client ==== * Add a tracker tab to the inspector * Fix 1.8x display error when showing magnet link information ==== Qt ==== * Fix bug that prevented torrents from being added via web browsers === Transmission 1.83 (2010/01/28) === [http://trac.transmissionbt.com/query?milestone=1.83&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix 1.80 announce error that caused uploads and downloads to periodically freeze * Fix 1.80 announce timeout error that caused "no response from tracker" message * Fix 1.80 "file not found" error message that stopped some torrents * Fix 1.82 crash when adding new torrents via their ftp URL * Fix 1.80 crash when receiving invalid request messages from peers * Fix 1.82 error when updating the blocklist === Transmission 1.82 (2010/01/23) === [http://trac.transmissionbt.com/query?milestone=1.82&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * The 1.81 announce's "Host" HTTP header didn't contain the host's port number === Transmission 1.81 (2010/01/22) === [http://trac.transmissionbt.com/query?milestone=1.81&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix 1.80 bug that misparsed some magnet links * Fix 1.80 bug that caused startup to be very sluggish for some people ==== Mac ==== * Fix dragging URLs onto the dock icon * Fix auto-grouping by file name === Transmission 1.80 (2010/01/20) === [http://trac.transmissionbt.com/query?milestone=1.80&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Add support for magnet links * Add support for trackerless torrents * Add optional "incomplete directory" where partial downloads are stored * Add .part to incomplete files' filenames * Find more peers by announcing to each tier in a torrent's tracker list, rather than only one * Fix vulnerability from maliciously-crafted torrent files that could overwrite other files * Improved IPv6 support * Improved PEX sharing with other peers * Faster management of large peer lists * DHT improvements to bootstrapping and IPv6 * Newly-added torrents without local data don't wait in the "Verify Local Data" queue anymore * Add an OS hint to not cache local data during torrent verification * Use less CPU when making encrypted handshakes to peers * Better filtering of bad IP addresses * Fix bug that gave "too many open files" error messages * Fix bug that could crash Transmission on shutdown * Fix bug that could unpause or repause a torrent on startup * When uploading, improve disk IO performance by prefetching the data in batches * Portability fixes for embedded systems * Other small bug fixes and improvements ==== Mac ==== * Redesigned trackers inspector tab with favicons and copy-paste functionality (paste lists of multiple trackers) * Message log stores all messages and does real filtering * Quick Look restored on Snow Leopard * Moving data and incomplete folder are now handled by libtransmission * Improved reveal in Finder functionality on Snow Leopard * Various smaller behavior and interface tweaks * German and Simplified Chinese localizations * Removed Turkish localization because of lack of localizer ==== GTK+ ==== * Support org.gnome.SessionManager interface for inhibiting hibernation * Added support for adding torrents by URL or magnet link * Add optional "download complete" sound using the XDG sound naming spec * When creating a torrent, make it easier to auto-add that new torrent * New statusbar "Ratio" icon submitted by jimmac * Fix minor memory leaks * GNOME HIG improvements ==== Daemon ==== * When running as a daemon, send log messages to syslog * Reload settings.json when receiving SIGHUP * transmission-remote now allows per-torrent speed limits to be set ==== Web Client ==== * Add speed limit "turtle mode" support * Double-clicking a torrent opens/closes the torrent inspector * Add "Start When Added" checkbox when adding torrents * Add Select All / Deselect All buttons to the file inspector * Add version information to the preferences dialog * Ensure the context menu goes away when clicking on torrents * Fix bug that obscured part of the context menu === Transmission 1.77 (2010/01/04) === [http://trac.transmissionbt.com/query?milestone=1.77&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Protect against potential data loss by maliciously-crafted torrent files * Fix minor build issues and packaging issues on various platforms * Fix 1.7x error that could unpause or repause a torrent on startup * Minor CPU speedups ==== GTK+ ==== * Fix crash on shutdown * Fix GIcon memory leak === Transmission 1.76 (2009/10/24) === [http://trac.transmissionbt.com/query?milestone=1.76&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix potential data loss when moving torrents to where they already are * Fix minor protocol error that didn't send a port message to some peers * Fix minor manpage errors ==== Mac ==== * Fix a potential crasher on Snow Leopard * When creating a multi-tracker torrent, give each tracker its own tier * Fix display glitch when changing sort to "Queue Order" ==== Daemon ==== * Fix potential data loss when using "transmission-remote --find" * Fix ratio-limit bug on some uClibc systems * Fix invalid JSON "nan" error on optware ==== GTK+ ==== * Fix crash in the Preferences dialog when testing to see if the port is open * Fix crash on exit when a torrent's Properties dialog is open * Fix tracker address display error in the torrent Properties dialog * Fix tray menu's main window status when Transmission is started minimized * Fix broken SIGINT (ctrl-c) handling * Fix 1.61 build failure on systems with new versions of glib but older versions of gtk ==== Qt ==== * Fix crash when removing expired torrents from the display * Fix client from closing, rather than closing to the system tray, when clicking X * Cannot open a torrent in KDE4 with right-clicking === Transmission 1.75 (2009/09/13) === [http://trac.transmissionbt.com/query?milestone=1.75&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Don't wait so long on unresponsive trackers if there are other trackers to try * Adding corrupt/invalid torrents could crash Transmission * Fix 1.74 bug that caused a high CPU load on startup * Fix 1.74 bug that stopped multitracker if a single tracker sent an error message * Fix bug in converting other charsets to UTF-8 * Handle HTTP redirects more gracefully * Faster verification of local data for torrents with small piece size * Fix 1.74 build error when compiling without DHT ==== Mac ==== * Fix libcurl build issue that caused tracker connectivity problems on Snow Leopard * Fix error when creating a torrent file while still changing the announce address ==== GTK+ ==== * Fix "sort by time remaining" * Fix the turtle toggle button on old versions of GTK+ * Fix startup error if another copy of the Transmission GTK client is running * Fix clang build issue === Transmission 1.74 (2009/08/24) === [http://trac.transmissionbt.com/query?milestone=1.74&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Better data recovery in the case of an OS or Transmission crash * If a data file is moved, stop the torrent instead of redownloading it * Fix bug that didn't list some peers in the resume file and in PEX * More helpful torrent error messages * DHT now honors the bind-address-ipv4 configuration option * Fix Debian build error with miniupnpc * Fix Cygwin build error with strtold * Update to a newer snapshot of miniupnpc ==== Mac ==== * 64-bit compatibility * Queuing system will not exclude transfers with tracker warnings * Links to original torrent files are no longer maintained * Fix bug where changing the global per-torrent peer connection limit did not affect the current session * Fix bug where changing settings through RPC would result in wrong values being saved for three fields ==== GTK+ ==== * Fix crash that occurred when adding torrents on some desktops * Synchronize the statusbar's and torrent list's speeds * Fix the Properties dialog's "Origin" field for multiple torrents ==== Qt ==== * New Russian Translation * If Transmission was minimized, clicking on it the icon tray didn't raise it ==== Daemon ==== * Speed Limit mode support added to transmission-remote * Add a "session stats" readout to transmission-remote ==== Web Client ==== * Progress bar shows seeding progress * Fix bug that displayed "%nan" when verifying a torrent * "Pause All" only appeared to pause torrents with peers until refresh === Transmission 1.73 (2009/07/18) === [http://trac.transmissionbt.com/query?milestone=1.73&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix bug where user-configured peer limits could be exceeded * Use less memory in some high-peer situations * Better estimation of time left to download * Support supportcrypto and requirecrypto flags in http tracker announces * Update to newer snapshots of libnatpmp and miniupnpc * Make DHT a compile-time option ==== GTK+ ==== * Use GDK-safe versions of g_idle_add() and g_timeout_add*() * Save some space in GTK+ >= 2.16.0 by not building SexyIconEntry ==== Qt ==== * Fix bug that crashed Qt client when setting alternative up/down speeds ==== Daemon ==== * Add umask support ==== Web Client ==== * Inspector and Add Torrent buttons for iPhone/iPod Touch * Add location field to inspector ==== CLI ==== * Some torrent files created with transmission-cli were invalid === Transmission 1.72 (2009/06/16) === [http://trac.transmissionbt.com/query?milestone=1.72&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix 1.70 crash with assertion "tv->tv_usec >= 0" * Fix 1.70 crash with assertion "tr_peerIoSupportsFEXT( msgs->peer->io )" * Better DHT announce management * Fix error in reporting webseed counts via RPC * Better file preallocation on embedded systems ==== Mac ==== * Fix problem where a small set of users could not add torrents ==== GTK+ ==== * Fix 1.70 crash when setting options in the Properties dialog * Fix a rare crash in desktop notifications * Can now sort the file list by priority, download, and completeness * Adding a torrent from a browser sometimes didn't work * Various usability improvements ==== Daemon ==== * Remote didn't always send the right Encoding header in requests === Transmission 1.71 (2009/06/07) === [http://trac.transmissionbt.com/query?milestone=1.71&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix 1.70 bug that caused high CPU use in high-peer swarms * Fix 1.70 build problems with DHT and libevent ==== Daemon ==== * Fix watchdir issue on OSes that don't have inotify ==== GTK+ ==== * Fix 1.70 intltool build problem * Fix crash when the OS's stock mime-type icons are misconfigured * Handle very long torrent file lists faster ==== Web Client ==== * Fix 1.70 bug where some torrents appeared to be duplicates === Transmission 1.70 (2009/06/04) === [http://trac.transmissionbt.com/query?milestone=1.70&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Distributed hash table (DHT) support for public torrents * Add option for moving and finding a torrent's data on the disk * JSON RPC messages can be ~85% shorter, saving bandwidth and CPU * When available, use the system's copy of libevent instead of building one * Automatically pause torrents when verifying * Fix small bugs and memory leaks ==== Mac ==== * Holding down the option key on launch will pause all transfers ==== Web Client ==== * Big speed improvements, especially with large torrents * Fix 1.61 bug that broke adding torrents via the web client * Add the ability to upload multiple torrents at once * Torrents added by URL were always paused, regardless of preferences * Comments and announce addresses were cut off in the inspector * The "data remaining" field wasn't updated when the number reached 0 * Smaller design adjustments ==== GTK+ ==== * Make it clearer that the status bar's ratio mode button is a button * Torrent comment box did not scroll, so long comments were partially hidden ==== Qt ==== * Initial torrent list was sometimes incorrect * Add-torrent-and-delete-source deleted the source even if there was an error * Prefs dialog didn't show or modify "Stop seeding torrents at ratio" === Transmission 1.54 (2009/06/04) === ==== All Platforms ==== * Fix small bugs and memory leaks ==== Web Client ==== * Fix 1.53 bug that broke adding torrents via the web client * Torrents added by URL were always paused, regardless of preferences * Comments and announce addresses were cut off in the inspector * The "data remaining" field wasn't updated when the number reached 0 * Smaller design adjustments ==== GTK+ ==== * Fix intltool build error * Make it clearer that the status bar's ratio mode button is a button * Torrent comment box did not scroll, so long comments were partially hidden === Transmission 1.61 (2009/05/11) === [http://trac.transmissionbt.com/query?milestone=1.61&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Close potential CSRF security hole for Web Client users * Fix locale error in the JSON parser ==== Qt ==== * Various small bug fixes to the beta Qt client ==== Web Client ==== * Fix 1.60 error when serving Web Client files on some embedded platforms * Add response header to allow clients to cache static files ==== Daemon ==== * transmission-remote was unable to select torrents by their SHA1 hash === Transmission 1.53 (2009/05/11) === ==== All Platforms ==== * Close potential CSRF security hole for Web Client users * Fix locale error in the JSON parser === Transmission 1.60 (2009/05/04) === [http://trac.transmissionbt.com/query?milestone=1.60&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Seed ratio limiting * Transfer prioritization * Option to specify if transfers are included in the global bandwidth limits * Random port, with optional randomization on startup * Improvements to UPnP port forwarding * Support for file preallocation on XFS filesystems ==== Mac ==== * Requires Mac OS X 10.5 Leopard or newer * Groups (moved to preferences) can be auto-assigned to transfers when adding based on multiple criteria * Groups can have a default location when adding transfers * The speed limit scheduler can now be applied to only specific days * Bonjour support for the web interface * File filter field in the inspector * Option to include beta releases when auto-updating (using modified Sparkle 1.5) * Portuguese localization ==== Qt ==== * New beta Qt client! ==== GTK+ ==== * Speed Limit: Second set of bandwidth limits that can be toggled or scheduled * Properties dialog now lets you edit/view multiple torrents at once * Allow sorting of the torrent list by size and by ETA * Show the file icon in the list ==== Daemon ==== * Watch folder for auto-adding torrents * Many new features in the RPC/JSON interface * Allow users to specify a specific address when listening for peers ==== Web Client ==== * File selection and prioritization * Add option to verify local data * Fix "Remove Data" bug === Transmission 1.52 (2009/04/12) === [http://trac.transmissionbt.com/query?milestone=1.52&group=component&order=severity All tickets closed by this release] ==== Mac ==== * Improve interface responsiveness when downloading ==== GTK+ and Daemon ==== * Always honor the XDG setting for the download directory ==== GTK+ ==== * Fix formatting error when showing speeds measured in MB/s * Fix bug that caused some scheduled speed limit time settings to be lost * Use the new blocklist URL when updating the blocklist ==== Web Client ==== * On the server, better filtering of bad URLs * On the server, faster json serialization * Fix minor web client 301 redirect error * Better Internet Explorer support === Transmission 1.51 (2009/02/26) === [http://trac.transmissionbt.com/query?milestone=1.51&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix configure script issues with non-gcc compilers and user-defined CFLAGS environment variables * Decrease CPU usage in some situations * Close a rare race condition on startup * More efficient use of libcurl when curl 7.18.0 or newer is present ==== GTK+ ==== * Play nicely with Ubuntu's new notification server * Add Pause All and Resume All buttons ==== Web Client ==== * Support for Internet Explorer * Layout fixes when viewed on an iPhone/iPod touch === Transmission 1.50 (2009/02/13) === [http://trac.transmissionbt.com/query?milestone=1.50&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * IPv6 support for peers, and for trackers with explicit IPv6 addresses * Improved connectivity for encrypted peers * Fix 1.42 error that made tracker announces slower over time * Fix a Mac-centric peer connection bug from 1.41 * Use less CPU cycles when managing very fast peers * Better handling of non-UTF-8 torrent files * When removing local data, only remove data from the torrent * Close potential DoS vulnerability in 1.41 * Many other bug fixes ==== GTK+ ==== * Various usability improvements * Better Gnome HIG compliance in the statusbar, properties dialog, and more ==== Daemon ==== * Lots of new options added to transmission-remote * Fix 1.42 whitelist bug * Make i18n support optional for cli and daemon clients ==== CLI ==== * Support session.json settings, just as the Daemon and GTK+ clients do ==== Web Client ==== * Torrents can now be added by URL * Add the ability to "remove local data" from the web client === Transmission 1.42 (2008/12/24) === [http://trac.transmissionbt.com/query?milestone=1.42&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix 1.41 lockup issue === Transmission 1.41 (2008/12/23) === [http://trac.transmissionbt.com/query?milestone=1.41&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Better peer management in large swarms * Support BitTorrent Enhancement Proposal (BEP) #21 "Extension for Partial Seeds" * Partial support for BEP #6 "Fast Extension" (reject, have all/none) * Honor the peer's BEP #10 reqq key, when available * Fix 1.40 "Got HTTP Status Code: 0" error message * Fix 1.40 "lazy bitfield" error * Fix 1.40 "jumpy upload speed" bug * Fix handshake peer_id error * Corrrectly handle Windows-style newlines in Bluetack blocklists * More accurate bandwidth measurement * File selection & priority was reset when editing a torrent's tracker list * Fix autoconf/automake build warnings ==== GTK+ ==== * In the Details dialog's peer tabs, rows were sometimes duplicated * Minor bug fixes, usability changes, and locale improvements * Three new translations: Afrikaans, Asturian, Bosnian * Sixteen updated translations ==== Daemon ==== * Fix 1.40 bug in handling IP whitelist * Minor bug fixes and output cleanup * Windows portability ==== CLI ==== * Fix minor free-memory-read bug === Transmission 1.40 (2008/11/09) === [http://trac.transmissionbt.com/query?milestone=1.40&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Tracker communication uses fewer resources * More accurate bandwidth limits * Reduce disk fragmentation by preallocating files * Stability, security, and performance improvements to the RPC/Web UI server * Support compression when serving Web UI and RPC responses * Simplify the RPC whitelist * Fix bug that prevented handshakes with encrypted BitComet peers * Fix 1.3x bug that could re-download some data unnecessarily * Lazy bitfields ==== Mac ==== * Option to automatically update the blocklist weekly * In the file inspector tab, show progress and size for folders * Scrollbars correctly appear when the main window auto-resizes * Sparkle updated to 1.5b6 ==== GTK+ ==== * Option to automatically update the blocklist weekly * Added off-hour bandwidth scheduling * Simplify file/priority selection in the details dialog * Fix a couple of crashes * 5 new translations: Australian, Basque, Kurdish, Kurdish (Sorani), Malay * 43 updated translations ==== Web Client ==== * The Web Client is now out of beta * Minor display fixes * On iPhone/iPod touch, launching from the home screen hides the address bar ==== Daemon ==== * Added the ability to get detailed peer information on torrents * Fix bug that didn't handle --config-dir and TRANSMISSION_HOME correctly * Windows portability === Transmission 1.34 (2008/09/16) === [http://trac.transmissionbt.com/query?milestone=1.34&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Don't reconnect too frequently to the same peer * Webseed bug fix * Fix bug that caused some transfers to not be scraped * Fix BSD build issues * Handle OpenTracker's `downloaded' key in announce responses ==== Mac ==== * Fix memory leak when updating blocklist * Connect to the web interface when the application's path contains a space ==== GTK+ ==== * Minor display fixes * 15 updated translations + 1 new language ==== Daemon ==== * Minor display fixes ==== Web Client ==== * Minor display fixes ==== CLI ==== * Fix crash when creating a torrent file === Transmission 1.33 (2008/08/30) === [http://trac.transmissionbt.com/query?milestone=1.33&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix crash from malicious torrent files with a piece size of zero * When creating new torrent files, change behavior that caused "Multi tracker torrents are not allowed" warning on one tracker * Fix Unicode handling in the JSON parser/generator * Fix memory error when reading KTorrent's PEX messages * Fix small memory leaks ==== Mac ==== * Rephrase "data not fully available" to "remaining time unknown" * Fix bug where torrent file creation would fail because an extra blank tracker address was inserted ==== Daemon ==== * Fix crash when adding nonexistent torrents via transmission-remote ==== GTK+ ==== * Fix crash from malicious torrent files with large creator fields * Fix error where some torrents opened via a web browser didn't appear === Transmission 1.32 (2008/08/08) === [http://trac.transmissionbt.com/query?milestone=1.32&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix bug introduced in 1.30 that caused poor tracker communication * Creating torrent files for files >= 2 GB will result in 2 MB pieces ==== Mac ==== * Fix bug where the proxy type was changed from SOCKS5 to SOCKS4 on launch === Transmission 1.31 (2008/08/06) === [http://trac.transmissionbt.com/query?milestone=1.31&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix a crash caused by certain torrent files === Transmission 1.30 (2008/08/05) === [http://trac.transmissionbt.com/query?milestone=1.30&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * The "Clutch" web interface is now bundled with Transmission (as a beta) * Ability to add and remove tracker addresses * Ability to create torrent files with multiple tracker addresses * Added support for HTTP/FTP Seeding (GetRight style) * Added proxy support for communicating with trackers * Allow torrent creation with no tracker address (required by some trackers) * New JSON-RPC protocol for clients to interact with the backend ==== Daemon ==== * transmission-daemon and transmission-remote were rewritten from scratch * remote and daemon now support per-file priority & download flag settings ==== Mac ==== * Quick Look integration in the main window and inspector's file tab * Transfers can be dragged to different groups * Option to only show the add window when manually adding transfers * Status strings are toggled from the action button (they are no longer clickable) * Colors in pieces bar and pieces box more accurately reflect their corresponding values * The port checker now uses our own portcheck.transmissionbt.com * Turkish localization ==== GTK+ ==== * Add options to inhibit hibernation and to toggle the tray icon * Lots of small bug fixes and usability improvements * Dozens of updated translations === Transmission 1.22 (2008/06/13) === [http://trac.transmissionbt.com/query?milestone=1.22&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix two separate BitTorrent unchoke bugs that could affect performance * Transmission now builds correctly on Sun Studio * Minor man page fixes ==== Mac ==== * Fix bug where "Program Started" in the Statistics window would sometimes display as 0 ==== GTK+ ==== * Fix crash when quitting while the stats window is still up * Added Latvian, Malayalam, Serbian, and Telugu translations * Updated Czech, Spanish, Romanian, Russian, Dutch, Polish, Italian, Portuguese, Catalan, Danish, German, Swedish, Traditional Chinese, Finnish, and Chinese (simplified) translations ==== CLI ==== * Fix scraping torrents with the -s command-line argument === Transmission 1.21 (2008/05/21) === [http://trac.transmissionbt.com/query?milestone=1.21&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Fix rare crash-on-startup bug * Handle corrupt announce URLs in torrent files more gracefully * Fix minor memory leak when closing torrents ==== Mac ==== * Fix visual glitch with the pieces bar * Italian localization included ==== GTK+ ==== * Updated Catalan, Danish, German, Spanish, Finnish, Hebrew, Italian, Dutch, Polish, Romanian, Thai, Turkish, and Traditional Chinese translations === Transmission 1.20 (2008/05/09) === [http://trac.transmissionbt.com/query?milestone=1.20&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Support https tracker connections * IP blocking using the Bluetack Level1 blocklist * Better support of multitracker torrents * Faster UPnP port mapping on startup * Ability to reset global statistics * Various bug fixes ==== Mac ==== * Display of decimal numbers matches system international settings * Updated Dock badge images ==== GTK+ ==== * Inhibit hibernation when downloading * Use XDG basedir spec for configuration files * Various bug fixes and usability improvements * Vastly improved translations thanks to the Ubuntu translation team === Transmission 1.11 (2008/04/04) === [http://trac.transmissionbt.com/query?milestone=1.11&group=component&order=severity All tickets closed by this release] ==== Mac ==== * Fix scrape address visual glitch with the tracker inspector tab * Only make the progress status string clickable on multi-file torrents * Traditional Chinese localization, updated Russian localization ==== GTK+ ==== * Fix a couple of minor display issues === Transmission 1.10 (2008/03/28) === [http://trac.transmissionbt.com/query?milestone=1.10&group=component&order=severity All tickets closed by this release] ==== All Platforms ==== * Stop torrents when downloading and the disk becomes full * Removing a torrent also removes it from the cache * Smaller memory footprint per-torrent and per-peer * Various backend bug fixes & improvements ==== Mac ==== * Window when adding torrents to select files and other settings * Leopard: Collapsable group dividers * Use the file icon as the per-torrent action button * Tracker tab in the inspector * Message log specifies the torrent/activity the message relates to * Updated images in the inspector * Optional display of remaining time while seeding in Minimal View * Improved accuracy for displaying the remaining disk space warning ==== GTK+ ==== * Window for selecting files & priorities when opening torrents * Display a system tray popup when a torrent finishes downloading * Watch folder for auto-adding torrents * Improved preferences dialog and message log window * Tracker tab in the Details window * Dozens of usability, Gnome HIG, and i18n improvements * Support KDE button ordering * Option to delete a torrent and its downloaded files ==== Daemon ==== * Ability to force a "Verify Local Data" for a torrent === Transmission 1.06 (2008/02/26) === ==== All Platforms ==== * Improvements and bug fixes to "Verify Local Data" * Use less CPU * Fix support for multitracker torrents * Updated UPnP code to miniupnpc-1.0 * Fix two shutdown memory errors ==== GTK+ ==== * Fix small memory leak * GUI error when verifying local data ==== CLI ==== * Torrent creation error on non-absolute pathnames === Transmission 1.05 (2008/02/08) === ==== All Platforms ==== * Fix 1.04 crash when parsing bencoded data * Packaging improvements ==== Mac ==== * Fix bug remembering reordered groups ==== GTK+ ==== * Fix glitch that occurred when specifying which files to download * Fix "Sort by Progress" * Various interface and HIG improvements * Updated Swedish, Italian translations ==== Daemon ==== * Fix "transmission-remote -x" * Fix PEX enable/disable bug === Transmission 1.04 (2008/01/31) === ==== All Platforms ==== * Fix (potential) remote crash bug with extension protocol * Fix bug when verifying a torrent and pressing `pause' === Transmission 1.03 (2008/01/29) === ==== All Platforms ==== * Fix bug setting maximum peer limits * Fix overflow issue with very large torrents * Fix LTEP handshake bug * Fix handshake bug with mainline BitTorrent * Fix bug when talking to lighttpd-based trackers ==== GTK+ ==== * Various packaging, HiG, and interface improvements === Transmission 1.02 (2008/01/22) === ==== All Platforms ==== * Fix 1.00 bug that choked some models of routers * Fix 1.00 crash in peer handshake * Fix 1.00 bug that sometimes froze the app for a long time * Minor improvements to the command-line client ==== GTK+ ==== * Fix crash when removing a torrent while its details window is open * Better compliance with the Gnome interface guidelines * I18N fixes * Updated Dutch translation * Various other interface additions and improvements === Transmission 1.01 (2008/01/11) === ==== All Platforms ==== * Fix 1.00 freezing issue * Fix 1.00 assertion failure * Improve initial connection speed * Added connection throttle to avoid router overload * Improve reconnection to peers with imperfect network connections * Fix crashes on architectures that require strict alignment ==== Mac ==== * Leopard: Double-click icon to reveal in Finder, progress string to toggle selected and total, and anywhere else to toggle the inspector * Leopard: Better behavior with Time Machine * Fix bugs with Clutch support ==== GTK+ ==== * New Brazilian Portuguese, Chinese, Dutch, and Turkish translations * Fix 1.00 desktop internationalization error === Transmission 1.00 (2008/01/04) === ==== All Platforms ==== * Port forwarding now performed by MiniUPnP and libnatpmp * Ability to set global and per-torrent number of connections * Option to prefer not using encryption * Fix tracker connection error * PEX is now configured globally * Updated icon ==== Mac ==== * Redesigned Leopard-like look * Group labeling, filtering, and sorting * Statistics window * Pieces Bar (return of Advanced Bar) * Display "not available" overlay on the regular bar * Display remaining time for seeding transfers * Sort by total activity * Connectable from the Clutch web interface * Leopard: Time Machine will ignore incomplete downloads * Leopard: Fix bug where text fields would reject localized decimal values * Leopard: Fix bug where bandwidth rates chosen from the action menu would not apply the first time ==== GTK+ ==== * Redesigned main window interface * Minimal Mode for showing more torrents in less desktop space * Torrent filtering * Port forwarding tester in Preferences * Statistics window * Sort by total activity, progress, state, and tracker * Various other interface additions and improvements ==== CLI ==== * Restore `scrape' feature === Transmission 0.96 (2007/12/10) === ==== All Platforms ==== * Fix 0.95 data corruption error * Fix 0.95 bug that broke UPnP ==== Mac ==== * Fix bug where dragging non-torrent files over the main window could result in excessive memory usage === Transmission 0.95 (2007/12/04) === ==== All Platforms ==== * Fix router errors caused by sending too many tracker requests at once * Fix bug that let speed-limited torrents upload too quickly * Faster average upload speeds * Faster connection to peers after starting a torrent * Fix memory corruption error * Disable SWIFT for ratio-based trackers ==== Mac ==== * Leopard: Fix for NAT-PMP port mapping ==== GTK+ ==== * Fix Nokia 770 crash === Transmission 0.94 (2007/11/25) === ==== All Platforms ==== * Faster average download speeds * Automatically ban peers that send us too many corrupt pieces * Fix a crash that occurred if a peer sent us an incomplete message * Fix portmapping crash * Fix bug that left files open after their torrents were stopped * Fix 0.93 file permissions bug * Fix tracker redirect error * Fix LTEP PEX bug === Transmission 0.93 (2007/11/12) === ==== All Platforms ==== * Fix "router death" bug that impaired internet connectivity * Fix bug that could cause good peer connections to be lost * Tweak request queue code to improve download speeds * Better handling of very large files on 32bit systems * Consume less battery power on laptops * Fix minor IPC parsing error === Transmission 0.92 (2007/11/05) === ==== All Platforms ==== * Fix 0.90 data corruption bugs * Fix 0.90 possible delay when quitting * Fix 0.90 small memory leaks ==== Mac ==== * Leopard: Fix bug with typing values in Inspector->Options * Leopard: Fix bug with toggling Minimal View ==== GTK+ ==== * Better support for large files on some Linux systems * Fix localization error in torrent inspector's dates === Transmission 0.91 (2007/10/28) === ==== All Platforms ==== * Fix 0.90 speed limits * Fix 0.90 problems announcing to some trackers * Fix 0.90 socket connection leak * Fix 0.90 IPC crash * Fix 0.90 cache bug that could cause "verify local files" to fail * Fix 0.90 build errors on OpenBSD and on older C compilers ==== Mac ==== * Fix a crash caused by custom sound files * Add Dutch localization, re-add Russian localization, fix Korean localization ==== GTK+ ==== * Fix 0.90 packaging errors * Fix 0.90 crash-on-start with assertion failure: "destination != (void*)0" === Transmission 0.90 (2007/10/23) === ==== All Platforms ==== * Encryption support, with option to ignore unencrypted peers * Only report downloaded, verified good pieces in tracker `download' field * Improved compliance with BitTorrent spec * MSE Tracker Extension support * Significant rewrite of the libtransmission back-end ==== Mac ==== * Per-torrent action menu * Redesigned inspector with additional statistics and ability to be resized vertically in Peers and Files tabs * Redesigned message log * Optimizations to decrease memory usage * Sort and filter by tracker * Icon enhanced to support size of 512 x 512 * Various smaller interface additions and improvements ==== GTK+ ==== * Various interface improvements * Better compliance with the Gnome interface guidelines === Transmission 0.82 (2007/09/09) === ==== All Platforms ==== * Fixed bug that could limit transfer speeds * Fixed bug that corrupted torrents > 4 GB * Fixed bug that could allow bad peers to send too many pieces * For peers supporting both Azureus' and LibTorrent's extensions, allow negotiation to decide which to use * Other minor fixes === Transmission 0.81 (2007/08/22) === ==== All Platforms ==== * Fix 0.80 assertion crashes * Fix a bug that miscounted how many peers Transmission wants connected * Clarify misleading error messages * Fix memory leaks ==== Mac ==== * Multiple fixes to creating torrents and adding new torrents * Updated Russian and Spanish translations ==== GTK+ ==== * Updated Dutch, Portuguese, French, and Slovakian translations ==== CLI ==== * Better support for cli-driven torrent creation * Fix a bug that misparsed command-line arguments === Transmission 0.80 (2007/08/07) === ==== All Platforms ==== * Ability to selectively download and prioritize files * Torrent file creation * Speed and CPU load improvements * Fix to UPnP * Rechecking torrents is now done one-at-a-time to avoid heavy disk load * Better rechecking of torrents that have many files * Many miscellaneous improvements and bug fixes * Partial licensing change -- see the LICENSE file for details ==== Mac ==== * Overlay when dragging torrent files, URLs, and data files onto window * Ability to set an amount of time to consider a transfer stalled * More progress bar colors * Various smaller interface improvements * Italian, Korean, and Russian translations ==== GTK+ ==== * Added Torrent Inspector dialog * Added Update Tracker button * Various smaller interface improvements === Transmission 0.72 (2007/04/30) === * Reset download/upload amounts when sending "started" * Fix rare XML parsing bug === Transmission 0.71 (2007/04/23) === ==== All Platforms ==== * Send port info when sending requests * Calculate ratio differently when seeding without ever downloading * Add additional error messages and debug info * Improved UPnP support ==== Mac ==== * Fix error when using default incomplete folder * Disable the stop ratio once it is reached (while seeding) * Small interface adjustments === Transmission 0.70 (2007/04/18) === ==== All Platforms ==== * New icon * Automatic port mapping (NAT-PMP and UPnP IGD) * Peer exchange (PEX) compatible with Azureus and uTorrent * Multitracker support * Better handling of tracker announce interval * Fixes bug where absurdly huge upload/download totals could be sent * Automatic tracker scraping * Cache connected peers * Many miscellaneous bug fixes and small improvements ==== Mac ==== * Requires 10.4 Tiger or newer * Download and seeding queues that can be user-ordered * Speed Limit: Second set of bandwidth limits that can be toggled or scheduled * Individual torrent bandwidth limits * Separate complete and incomplete download folders * Filter and search bar * Expanded Inspector with many additional views and stats * Fragment status view in Inspector shows downloaded or availability * Watch folder to auto add torrent files * Auto resizing of the main window * Minimal view to take up less space * Seeding bar shows progress in finishing seeding * Sounds when downloading and seeding complete * Warnings for directory unavailable and not enough space * Message log window * New toolbar icons * Built-in help files * French, Spanish, German, and Greek translations ==== GTK+ ==== * New Spanish, Polish, Russian, Bulgarian, Romanian, Swedish, and Finnish translations * Message window * Better window manager integration * Add file view to properties dialog === Transmission 0.6.1 (2006/06/25) === ==== Mac ==== * Fixes a bug in the updater that could cause repeated hits to the appcast ==== GTK+ ==== * Fixes drag-and-drop * Adds Italian and French translations === Transmission 0.6 (2006/06/21) === ==== All Platforms ==== * Ability to limit download rate * Automatic banning of peers who send bad data * Can keep a copy of the torrent file so the original can be deleted * Many bug fixes ==== Mac ==== * Reworked interface * Rate limits can be changed directly from the main window * Ability to automatically stop seeding at a given ratio * Allows sorting of the transfers list * Extended Info Inspector * Automatic updating with Sparkle ==== GTK+ ==== * Add torrents via command line. If Transmission is already running, add them to running copy * Improved long filename handling === Transmission 0.5 (2006/02/11) === ==== All Platforms ==== * Only uses one port for all torrents * Rewritten choking algorithm * Remembers download and upload sizes from one launch to another ==== Mac ==== * Dock badging * Shows the file icon in the list * Shows ratio once download is completed * Automatic check for update * Fixes a display bug on Intel Macs ==== GTK+ ==== * New GTK+ interface ==== BeOS ==== * New BeOS interface === Transmission 0.4 (2005/11/18) === ==== All Platforms ==== * Uses less CPU downloading torrents with many pieces * The UI could freeze when the hard drive was having a hard time - fixed * Fixes for difficult trackers, which require a 'key' parameter or a User Agent field ==== Mac ==== * Cleaner look, unified toolbar * Added a document icon for torrent files * Added a Pause/Resume button for each torrent, and a "Reveal in Finder" button * Added a contextual menu * Sometimes torrents kept "Stopping..." forever - fixed * Several minor improvements or fixes: allows column reordering, fixed resizing on Panther, remember the position of the window, fixed display of Unicode filenames, added menubar items and keyboard shortcuts, made the simple progress bar switch to green when seeding === Transmission 0.3 (2005/10/19) === ==== All Platforms ==== * Fixed "Sometimes sends incorrect messages and looses peers" * Fixed "Crashes with many torrents or torrents with many files" * Enhancements in the "End game" mode * Is nicer to the trackers * Asks for the rarest pieces first ==== Mac ==== * Universal binary for PPC and x86 * Fixed "Progress increases every time I pause then resume" * Fixed "Sometimes crashes at exit" * Cleaner icon * Show all sizes in human readable form * Keep downloading in the background when the window is closed * Miscellaneous bug fixes and internal enhancements === Transmission 0.2 (2005/09/22) === ==== All Platforms ==== * Bug fixes ==== Mac ==== * Users can now choose where the downloads are sent === Transmission 0.1 (2005/09/15) === * First version transmission-2.92/PaxHeaders.4960/depcomp0000644000000000000000000000013212667111011015224 xustar0030 mtime=1457295881.116146729 30 atime=1457295881.116146729 30 ctime=1457295918.068775064 transmission-2.92/depcomp0000755000175000017500000005601612667111011016664 0ustar00mikedldmikedld00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2014 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: transmission-2.92/PaxHeaders.4960/Makefile.am0000644000000000000000000000013212664506752015727 xustar0030 mtime=1456639466.194680033 30 atime=1429902515.006430629 30 ctime=1457295917.044757651 transmission-2.92/Makefile.am0000644000175000017500000000256212664506752017361 0ustar00mikedldmikedld00000000000000ACLOCAL_AMFLAGS = -I m4 if BUILD_CLI CLI_DIR = cli endif if BUILD_DAEMON if !WIN32 DAEMON_DIR = daemon endif endif if BUILD_GTK GTK_DIR = gtk po endif if BUILD_MAC MAC_DIR = macosx endif SUBDIRS = \ extras \ third-party \ libtransmission \ utils \ $(DAEMON_DIR) \ $(CLI_DIR) \ $(GTK_DIR) \ $(MAC_DIR) \ web EXTRA_DIST = \ qt \ NEWS \ AUTHORS \ COPYING \ README \ autogen.sh \ update-version-h.sh \ Transmission.xcodeproj/project.pbxproj EXTRA_DIST += \ CMakeLists.txt \ cmake \ cli/CMakeLists.txt \ daemon/CMakeLists.txt \ gtk/CMakeLists.txt \ libtransmission/CMakeLists.txt \ libtransmission/version.h.in \ po/CMakeLists.txt \ qt/CMakeLists.txt \ third-party/b64-01-newline.patch \ third-party/b64-02-unsigned-char.patch \ third-party/b64.cmake \ third-party/dht.cmake \ third-party/event2.cmake \ third-party/event2-01-win32.patch \ third-party/event2-02-win32.patch \ third-party/natpmp.cmake \ third-party/utp-01-ticket-5002.patch \ third-party/utp-02-win32.patch \ third-party/utp-03-msvc14.patch \ third-party/utp.cmake \ third-party/utp_config.h \ utils/CMakeLists.txt if HAVE_REVISION_FILE EXTRA_DIST += REVISION endif dist-hook: find "$(distdir)/qt" "$(distdir)/cmake" -name .svn -exec rm -rf '{}' '+' -prune DISTCLEANFILES = \ intltool-extract \ intltool-merge \ intltool-update transmission-2.92/PaxHeaders.4960/transmission-gtk.spec.in0000644000000000000000000000013212442116706020456 xustar0030 mtime=1418239430.820385989 30 atime=1418239430.820385989 30 ctime=1457295917.128759079 transmission-2.92/transmission-gtk.spec.in0000644000175000017500000000334112442116706022104 0ustar00mikedldmikedld00000000000000%define name transmission %define version @VERSION@ %define release 1 Summary: Transmission BitTorrent Client Name: %{name} Version: %{version} Release: %{release} License: MIT Group: Applications/Internet URL: http://www.transmissionbt.com/ Epoch: 1 Source0: %{name}-%{version}.tar.bz2 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot # MANDATORY for libtransmission BuildRequires: curl-devel >= @CURL_MINIMUM@ BuildRequires: libevent-devel >= @LIBEVENT_MINIMUM@ BuildRequires: openssl-devel >= @OPENSSL_MINIMUM@ Requires: curl >= @CURL_MINIMUM@ Requires: libevent >= @LIBEVENT_MINIMUM@ Requires: openssl >= @OPENSSL_MINIMUM@ # MANDATORY for the gtk+ client BuildRequires: glib2-devel >= @GLIB_MINIMUM@ BuildRequires: gtk2-devel >= @GTK_MINIMUM@ Requires: glib2 >= @GLIB_MINIMUM@ Requires: gtk2 >= @GTK_MINIMUM@ Provides: %{name} %description A fast and easy BitTorrent client %prep %setup -q %build %configure --program-prefix="" make CFLAGS="$RPM_OPT_FLAGS" %install rm -rf $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install %find_lang %{name}-gtk %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc AUTHORS NEWS README %attr(755,root,root) %{_bindir}/%{name}* %{_datadir}/applications/%{name}-gtk.desktop %{_datadir}/pixmaps/* %{_datadir}/icons/* %{_datadir}/%{name}/web/* %{_datadir}/man/man1/%{name}* %{_datadir}/locale/* %changelog * Wed Jan 13 2010 Jordan Lee - made the GConf dependency explicit - annotated the Depends section to show which libraries are optional * Thu Mar 5 2009 Gijs - fixed %files section - added Source0 * Wed Jul 18 2006 Jordan Lee - first draft at a spec file, cribbed from Pan's spec file transmission-2.92/PaxHeaders.4960/gtk0000644000000000000000000000013212667111061014367 xustar0030 mtime=1457295921.207828443 30 atime=1457295917.037757532 30 ctime=1457295921.207828443 transmission-2.92/gtk/0000755000175000017500000000000012667111061016071 5ustar00mikedldmikedld00000000000000transmission-2.92/gtk/PaxHeaders.4960/torrent-cell-renderer.h0000644000000000000000000000007312617356116021046 xustar0029 atime=1456201459.06321974 30 ctime=1457295920.977824532 transmission-2.92/gtk/torrent-cell-renderer.h0000644000175000017500000000206012617356116022465 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: torrent-cell-renderer.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef GTR_TORRENT_CELL_RENDERER_H #define GTR_TORRENT_CELL_RENDERER_H #include #define TORRENT_CELL_RENDERER_TYPE (torrent_cell_renderer_get_type ()) #define TORRENT_CELL_RENDERER(o) \ (G_TYPE_CHECK_INSTANCE_CAST ((o), \ TORRENT_CELL_RENDERER_TYPE, \ TorrentCellRenderer)) typedef struct TorrentCellRenderer TorrentCellRenderer; typedef struct TorrentCellRendererClass TorrentCellRendererClass; struct TorrentCellRenderer { GtkCellRenderer parent; /*< private >*/ struct TorrentCellRendererPrivate * priv; }; struct TorrentCellRendererClass { GtkCellRendererClass parent; }; GType torrent_cell_renderer_get_type (void) G_GNUC_CONST; GtkCellRenderer * torrent_cell_renderer_new (void); #endif /* GTR_TORRENT_CELL_RENDERER_H */ transmission-2.92/gtk/PaxHeaders.4960/hig.c0000644000000000000000000000007412617356116015373 xustar0030 atime=1456201459.056219621 30 ctime=1457295921.068826079 transmission-2.92/gtk/hig.c0000644000175000017500000001153212617356116017015 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: hig.c 14241 2014-01-21 03:10:30Z jordan $ */ #include #include "hig.h" GtkWidget* hig_workarea_create (void) { GtkWidget * grid = gtk_grid_new (); gtk_container_set_border_width (GTK_CONTAINER (grid), GUI_PAD_BIG); gtk_grid_set_row_spacing (GTK_GRID (grid), GUI_PAD); gtk_grid_set_column_spacing (GTK_GRID (grid), GUI_PAD_BIG); return grid; } void hig_workarea_add_section_divider (GtkWidget * t, guint * row) { GtkWidget * w = gtk_alignment_new (0.0f, 0.0f, 0.0f, 0.0f); gtk_widget_set_size_request (w, 0u, 6u); gtk_grid_attach (GTK_GRID (t), w, 0, *row, 2, 1); ++ * row; } void hig_workarea_add_section_title_widget (GtkWidget * t, guint * row, GtkWidget * w) { gtk_widget_set_hexpand (w, TRUE); gtk_grid_attach (GTK_GRID (t), w, 0, *row, 2, 1); ++ * row; } void hig_workarea_add_section_title (GtkWidget * t, guint * row, const char * section_title) { char buf[512]; GtkWidget * l; g_snprintf (buf, sizeof (buf), "%s", section_title); l = gtk_label_new (buf); gtk_misc_set_alignment (GTK_MISC (l), 0.0f, 0.5f); gtk_label_set_use_markup (GTK_LABEL (l), TRUE); hig_workarea_add_section_title_widget (t, row, l); } void hig_workarea_add_wide_control (GtkWidget * t, guint * row, GtkWidget * w) { gtk_widget_set_hexpand (w, TRUE); gtk_widget_set_margin_left (w, 18); gtk_grid_attach (GTK_GRID (t), w, 0, *row, 2, 1); ++ * row; } void hig_workarea_add_wide_tall_control (GtkWidget * t, guint * row, GtkWidget * w) { gtk_widget_set_hexpand (w, TRUE); gtk_widget_set_vexpand (w, TRUE); hig_workarea_add_wide_control (t, row, w); } GtkWidget * hig_workarea_add_wide_checkbutton (GtkWidget * t, guint * row, const char * mnemonic_string, gboolean is_active) { GtkWidget * w = gtk_check_button_new_with_mnemonic (mnemonic_string); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), is_active); hig_workarea_add_wide_control (t, row, w); return w; } void hig_workarea_add_label_w (GtkWidget * t, guint row, GtkWidget * w) { gtk_widget_set_margin_left (w, 18); if (GTK_IS_MISC (w)) gtk_misc_set_alignment (GTK_MISC (w), 0.0f, 0.5f); if (GTK_IS_LABEL (w)) gtk_label_set_use_markup (GTK_LABEL (w), TRUE); gtk_grid_attach (GTK_GRID (t), w, 0, row, 1, 1); } static void hig_workarea_add_tall_control (GtkWidget * t, guint row, GtkWidget * control) { if (GTK_IS_MISC (control)) gtk_misc_set_alignment (GTK_MISC (control), 0.0f, 0.5f); g_object_set (control, "expand", TRUE, NULL); gtk_grid_attach (GTK_GRID (t), control, 1, row, 1, 1); } static void hig_workarea_add_control (GtkWidget * t, guint row, GtkWidget * control) { if (GTK_IS_MISC (control)) gtk_misc_set_alignment (GTK_MISC (control), 0.0f, 0.5f); gtk_widget_set_hexpand (control, TRUE); gtk_grid_attach (GTK_GRID (t), control, 1, row, 1, 1); } void hig_workarea_add_row_w (GtkWidget * t, guint * row, GtkWidget * label, GtkWidget * control, GtkWidget * mnemonic) { hig_workarea_add_label_w (t, *row, label); hig_workarea_add_control (t, *row, control); if (GTK_IS_LABEL (label)) gtk_label_set_mnemonic_widget (GTK_LABEL (label), mnemonic ? mnemonic : control); ++ * row; } GtkWidget* hig_workarea_add_row (GtkWidget * t, guint * row, const char * mnemonic_string, GtkWidget * control, GtkWidget * mnemonic) { GtkWidget * l = gtk_label_new_with_mnemonic (mnemonic_string); hig_workarea_add_row_w (t, row, l, control, mnemonic); return l; } GtkWidget* hig_workarea_add_tall_row (GtkWidget * table, guint * row, const char * mnemonic_string, GtkWidget * control, GtkWidget * mnemonic) { GtkWidget * l = gtk_label_new_with_mnemonic (mnemonic_string); GtkWidget * h = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); GtkWidget * v = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_box_pack_start (GTK_BOX (h), l, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (v), h, FALSE, FALSE, GUI_PAD_SMALL); hig_workarea_add_label_w (table, *row, v); hig_workarea_add_tall_control (table, *row, control); if (GTK_IS_LABEL (l)) gtk_label_set_mnemonic_widget (GTK_LABEL (l), mnemonic ? mnemonic : control); ++ * row; return l; } transmission-2.92/gtk/PaxHeaders.4960/tr-core.c0000644000000000000000000000007312637217217016176 xustar0029 atime=1456201459.06321974 30 ctime=1457295921.131827151 transmission-2.92/gtk/tr-core.c0000644000175000017500000014660512637217217017633 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: tr-core.c 14587 2015-10-23 04:09:40Z mikedld $ * * Copyright (c) Transmission authors and contributors * * 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. *****************************************************************************/ #include /* pow () */ #include /* strlen */ #include #include #include #include #include #include #include #include /* tr_free */ #include #include "actions.h" #include "conf.h" #include "notify.h" #include "tr-core.h" #include "tr-prefs.h" #include "util.h" /*** **** ***/ enum { ADD_ERROR_SIGNAL, ADD_PROMPT_SIGNAL, BLOCKLIST_SIGNAL, BUSY_SIGNAL, PORT_SIGNAL, PREFS_SIGNAL, LAST_SIGNAL }; static guint signals[LAST_SIGNAL] = { 0 }; static void core_maybe_inhibit_hibernation (TrCore * core); struct TrCorePrivate { GFileMonitor * monitor; gulong monitor_tag; GFile * monitor_dir; GSList * monitor_files; gulong monitor_idle_tag; gboolean adding_from_watch_dir; gboolean inhibit_allowed; gboolean have_inhibit_cookie; gboolean dbus_error; guint inhibit_cookie; gint busy_count; GtkTreeModel * raw_model; GtkTreeModel * sorted_model; tr_session * session; GStringChunk * string_chunk; }; static int core_is_disposed (const TrCore * core) { return !core || !core->priv->sorted_model; } G_DEFINE_TYPE (TrCore, tr_core, G_TYPE_OBJECT) static void core_dispose (GObject * o) { TrCore * core = TR_CORE (o); if (core->priv->sorted_model != NULL) { g_object_unref (core->priv->sorted_model); core->priv->sorted_model = NULL; core->priv->raw_model = NULL; } G_OBJECT_CLASS (tr_core_parent_class)->dispose (o); } static void core_finalize (GObject * o) { TrCore * core = TR_CORE (o); g_string_chunk_free (core->priv->string_chunk); G_OBJECT_CLASS (tr_core_parent_class)->finalize (o); } static void tr_core_class_init (TrCoreClass * core_class) { GObjectClass * gobject_class; GType core_type = G_TYPE_FROM_CLASS (core_class); g_type_class_add_private (core_class, sizeof (struct TrCorePrivate)); gobject_class = G_OBJECT_CLASS (core_class); gobject_class->dispose = core_dispose; gobject_class->finalize = core_finalize; signals[ADD_ERROR_SIGNAL] = g_signal_new ("add-error", core_type, G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (TrCoreClass, add_error), NULL, NULL, g_cclosure_marshal_VOID__UINT_POINTER, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_POINTER); signals[ADD_PROMPT_SIGNAL] = g_signal_new ("add-prompt", core_type, G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (TrCoreClass, add_prompt), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); signals[BUSY_SIGNAL] = g_signal_new ("busy", core_type, G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (TrCoreClass, busy), NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); signals[BLOCKLIST_SIGNAL] = g_signal_new ("blocklist-updated", core_type, G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (TrCoreClass, blocklist_updated), NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); signals[PORT_SIGNAL] = g_signal_new ("port-tested", core_type, G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (TrCoreClass, port_tested), NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); signals[PREFS_SIGNAL] = g_signal_new ("prefs-changed", core_type, G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (TrCoreClass, prefs_changed), NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); } static void tr_core_init (TrCore * core) { GtkListStore * store; struct TrCorePrivate * p; /* column types for the model used to store torrent information */ /* keep this in sync with the enum near the bottom of tr_core.h */ GType types[] = { G_TYPE_POINTER, /* collated name */ G_TYPE_POINTER, /* tr_torrent* */ G_TYPE_INT, /* torrent id */ G_TYPE_DOUBLE, /* tr_stat.pieceUploadSpeed_KBps */ G_TYPE_DOUBLE, /* tr_stat.pieceDownloadSpeed_KBps */ G_TYPE_INT, /* tr_stat.peersGettingFromUs */ G_TYPE_INT, /* tr_stat.peersSendingToUs + webseedsSendingToUs */ G_TYPE_DOUBLE, /* tr_stat.recheckProgress */ G_TYPE_BOOLEAN, /* filter.c:ACTIVITY_FILTER_ACTIVE */ G_TYPE_INT, /* tr_stat.activity */ G_TYPE_UCHAR, /* tr_stat.finished */ G_TYPE_CHAR, /* tr_priority_t */ G_TYPE_INT, /* tr_stat.queuePosition */ G_TYPE_UINT, /* build_torrent_trackers_hash () */ G_TYPE_INT, /* MC_ERROR */ G_TYPE_INT }; /* MC_ACTIVE_PEER_COUNT */ p = core->priv = G_TYPE_INSTANCE_GET_PRIVATE (core, TR_CORE_TYPE, struct TrCorePrivate); /* create the model used to store torrent data */ g_assert (G_N_ELEMENTS (types) == MC_ROW_COUNT); store = gtk_list_store_newv (MC_ROW_COUNT, types); p->raw_model = GTK_TREE_MODEL (store); p->sorted_model = gtk_tree_model_sort_new_with_model (p->raw_model); p->string_chunk = g_string_chunk_new (2048); g_object_unref (p->raw_model); } /*** **** EMIT SIGNALS ***/ static inline void core_emit_blocklist_udpated (TrCore * core, int ruleCount) { g_signal_emit (core, signals[BLOCKLIST_SIGNAL], 0, ruleCount); } static inline void core_emit_port_tested (TrCore * core, gboolean is_open) { g_signal_emit (core, signals[PORT_SIGNAL], 0, is_open); } static inline void core_emit_err (TrCore * core, enum tr_core_err type, const char * msg) { g_signal_emit (core, signals[ADD_ERROR_SIGNAL], 0, type, msg); } static inline void core_emit_busy (TrCore * core, gboolean is_busy) { g_signal_emit (core, signals[BUSY_SIGNAL], 0, is_busy); } void gtr_core_pref_changed (TrCore * core, const tr_quark key) { g_signal_emit (core, signals[PREFS_SIGNAL], 0, key); } /*** **** ***/ static GtkTreeModel * core_raw_model (TrCore * core) { return core_is_disposed (core) ? NULL : core->priv->raw_model; } GtkTreeModel * gtr_core_model (TrCore * core) { return core_is_disposed (core) ? NULL : core->priv->sorted_model; } tr_session * gtr_core_session (TrCore * core) { return core_is_disposed (core) ? NULL : core->priv->session; } /*** **** BUSY ***/ static bool core_is_busy (TrCore * core) { return core->priv->busy_count > 0; } static void core_add_to_busy (TrCore * core, int addMe) { const bool wasBusy = core_is_busy (core); core->priv->busy_count += addMe; if (wasBusy != core_is_busy (core)) core_emit_busy (core, core_is_busy (core)); } static void core_inc_busy (TrCore * core) { core_add_to_busy (core, 1); } static void core_dec_busy (TrCore * core) { core_add_to_busy (core, -1); } /*** **** **** SORTING THE MODEL **** ***/ static gboolean is_valid_eta (int t) { return (t != TR_ETA_NOT_AVAIL) && (t != TR_ETA_UNKNOWN); } static int compare_eta (int a, int b) { int ret; const gboolean a_valid = is_valid_eta (a); const gboolean b_valid = is_valid_eta (b); if (!a_valid && !b_valid) ret = 0; else if (!a_valid) ret = -1; else if (!b_valid) ret = 1; else ret = a < b ? 1 : -1; return ret; } static int compare_double (double a, double b) { int ret; if (a < b) ret = -1; else if (a > b) ret = 1; else ret = 0; return ret; } static int compare_uint64 (uint64_t a, uint64_t b) { int ret; if (a < b) ret = -1; else if (a > b) ret = 1; else ret = 0; return ret; } static int compare_int (int a, int b) { int ret; if (a < b) ret = -1; else if (a > b) ret = 1; else ret = 0; return ret; } static int compare_ratio (double a, double b) { int ret; if ((int)a == TR_RATIO_INF && (int)b == TR_RATIO_INF) ret = 0; else if ((int)a == TR_RATIO_INF) ret = 1; else if ((int)b == TR_RATIO_INF) ret = -1; else ret = compare_double (a, b); return ret; } static int compare_time (time_t a, time_t b) { int ret; if (a < b) ret = -1; else if (a > b) ret = 1; else ret = 0; return ret; } static int compare_by_name (GtkTreeModel * m, GtkTreeIter * a, GtkTreeIter * b, gpointer user_data UNUSED) { const char *ca, *cb; gtk_tree_model_get (m, a, MC_NAME_COLLATED, &ca, -1); gtk_tree_model_get (m, b, MC_NAME_COLLATED, &cb, -1); return g_strcmp0 (ca, cb); } static int compare_by_queue (GtkTreeModel * m, GtkTreeIter * a, GtkTreeIter * b, gpointer user_data UNUSED) { tr_torrent *ta, *tb; const tr_stat *sa, *sb; gtk_tree_model_get (m, a, MC_TORRENT, &ta, -1); sa = tr_torrentStatCached (ta); gtk_tree_model_get (m, b, MC_TORRENT, &tb, -1); sb = tr_torrentStatCached (tb); return sb->queuePosition - sa->queuePosition; } static int compare_by_ratio (GtkTreeModel* m, GtkTreeIter * a, GtkTreeIter * b, gpointer user_data) { int ret = 0; tr_torrent *ta, *tb; const tr_stat *sa, *sb; gtk_tree_model_get (m, a, MC_TORRENT, &ta, -1); sa = tr_torrentStatCached (ta); gtk_tree_model_get (m, b, MC_TORRENT, &tb, -1); sb = tr_torrentStatCached (tb); if (!ret) ret = compare_ratio (sa->ratio, sb->ratio); if (!ret) ret = compare_by_queue (m, a, b, user_data); return ret; } static int compare_by_activity (GtkTreeModel * m, GtkTreeIter * a, GtkTreeIter * b, gpointer user_data) { int ret = 0; tr_torrent *ta, *tb; double aUp, aDown, bUp, bDown; gtk_tree_model_get (m, a, MC_SPEED_UP, &aUp, MC_SPEED_DOWN, &aDown, MC_TORRENT, &ta, -1); gtk_tree_model_get (m, b, MC_SPEED_UP, &bUp, MC_SPEED_DOWN, &bDown, MC_TORRENT, &tb, -1); ret = compare_double (aUp+aDown, bUp+bDown); if (!ret) { const tr_stat * const sa = tr_torrentStatCached (ta); const tr_stat * const sb = tr_torrentStatCached (tb); ret = compare_uint64 (sa->peersSendingToUs + sa->peersGettingFromUs, sb->peersSendingToUs + sb->peersGettingFromUs); } if (!ret) ret = compare_by_queue (m, a, b, user_data); return ret; } static int compare_by_age (GtkTreeModel * m, GtkTreeIter * a, GtkTreeIter * b, gpointer u) { int ret = 0; tr_torrent *ta, *tb; gtk_tree_model_get (m, a, MC_TORRENT, &ta, -1); gtk_tree_model_get (m, b, MC_TORRENT, &tb, -1); if (!ret) ret = compare_time (tr_torrentStatCached (ta)->addedDate, tr_torrentStatCached (tb)->addedDate); if (!ret) ret = compare_by_name (m, a, b, u); return ret; } static int compare_by_size (GtkTreeModel * m, GtkTreeIter * a, GtkTreeIter * b, gpointer u) { int ret = 0; tr_torrent *t; const tr_info *ia, *ib; gtk_tree_model_get (m, a, MC_TORRENT, &t, -1); ia = tr_torrentInfo (t); gtk_tree_model_get (m, b, MC_TORRENT, &t, -1); ib = tr_torrentInfo (t); if (!ret) ret = compare_uint64 (ia->totalSize, ib->totalSize); if (!ret) ret = compare_by_name (m, a, b, u); return ret; } static int compare_by_progress (GtkTreeModel * m, GtkTreeIter * a, GtkTreeIter * b, gpointer u) { int ret = 0; tr_torrent * t; const tr_stat *sa, *sb; gtk_tree_model_get (m, a, MC_TORRENT, &t, -1); sa = tr_torrentStatCached (t); gtk_tree_model_get (m, b, MC_TORRENT, &t, -1); sb = tr_torrentStatCached (t); if (!ret) ret = compare_double (sa->percentComplete, sb->percentComplete); if (!ret) ret = compare_double (sa->seedRatioPercentDone, sb->seedRatioPercentDone); if (!ret) ret = compare_by_ratio (m, a, b, u); return ret; } static int compare_by_eta (GtkTreeModel * m, GtkTreeIter * a, GtkTreeIter * b, gpointer u) { int ret = 0; tr_torrent *ta, *tb; gtk_tree_model_get (m, a, MC_TORRENT, &ta, -1); gtk_tree_model_get (m, b, MC_TORRENT, &tb, -1); if (!ret) ret = compare_eta (tr_torrentStatCached (ta)->eta, tr_torrentStatCached (tb)->eta); if (!ret) ret = compare_by_name (m, a, b, u); return ret; } static int compare_by_state (GtkTreeModel * m, GtkTreeIter * a, GtkTreeIter * b, gpointer u) { int ret = 0; int sa, sb; tr_torrent *ta, *tb; gtk_tree_model_get (m, a, MC_ACTIVITY, &sa, MC_TORRENT, &ta, -1); gtk_tree_model_get (m, b, MC_ACTIVITY, &sb, MC_TORRENT, &tb, -1); if (!ret) ret = compare_int (sa, sb); if (!ret) ret = compare_by_queue (m, a, b, u); return ret; } static void core_set_sort_mode (TrCore * core, const char * mode, gboolean is_reversed) { const int col = MC_TORRENT; GtkTreeIterCompareFunc sort_func; GtkSortType type = is_reversed ? GTK_SORT_ASCENDING : GTK_SORT_DESCENDING; GtkTreeSortable * sortable = GTK_TREE_SORTABLE (gtr_core_model (core)); if (!g_strcmp0 (mode, "sort-by-activity")) sort_func = compare_by_activity; else if (!g_strcmp0 (mode, "sort-by-age")) sort_func = compare_by_age; else if (!g_strcmp0 (mode, "sort-by-progress")) sort_func = compare_by_progress; else if (!g_strcmp0 (mode, "sort-by-queue")) sort_func = compare_by_queue; else if (!g_strcmp0 (mode, "sort-by-time-left")) sort_func = compare_by_eta; else if (!g_strcmp0 (mode, "sort-by-ratio")) sort_func = compare_by_ratio; else if (!g_strcmp0 (mode, "sort-by-state")) sort_func = compare_by_state; else if (!g_strcmp0 (mode, "sort-by-size")) sort_func = compare_by_size; else { sort_func = compare_by_name; type = is_reversed ? GTK_SORT_DESCENDING : GTK_SORT_ASCENDING; } gtk_tree_sortable_set_sort_func (sortable, col, sort_func, NULL, NULL); gtk_tree_sortable_set_sort_column_id (sortable, col, type); } /*** **** **** WATCHDIR **** ***/ static time_t get_file_mtime (GFile * file) { GFileInfo * info; time_t mtime = 0; info = g_file_query_info (file, G_FILE_ATTRIBUTE_TIME_MODIFIED, 0, NULL, NULL); if (info != NULL) { mtime = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED); g_object_unref (G_OBJECT (info)); } return mtime; } static void rename_torrent_and_unref_file (GFile * file) { GFileInfo * info; info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME, 0, NULL, NULL); if (info != NULL) { GError * error = NULL; const char * old_name; char * new_name; GFile * new_file; old_name = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME); new_name = g_strdup_printf ("%s.added", old_name); new_file = g_file_set_display_name (file, new_name, NULL, &error); if (error != NULL) { g_message ("Unable to rename \"%s\" as \"%s\": %s", old_name, new_name, error->message); g_error_free (error); } if (new_file != NULL) g_object_unref (G_OBJECT (new_file)); g_free (new_name); g_object_unref (G_OBJECT(info)); } g_object_unref (G_OBJECT(file)); } static gboolean core_watchdir_idle (gpointer gcore) { GSList * l; GSList * changing = NULL; GSList * unchanging = NULL; TrCore * core = TR_CORE (gcore); const time_t now = tr_time (); struct TrCorePrivate * p = core->priv; /* separate the files into two lists: changing and unchanging */ for (l=p->monitor_files; l!=NULL; l=l->next) { GFile * file = l->data; const time_t mtime = get_file_mtime (file); if (mtime + 2 >= now) changing = g_slist_prepend (changing, file); else unchanging = g_slist_prepend (unchanging, file); } /* add the files that have stopped changing */ if (unchanging != NULL) { const gboolean do_start = gtr_pref_flag_get (TR_KEY_start_added_torrents); const gboolean do_prompt = gtr_pref_flag_get (TR_KEY_show_options_window); core->priv->adding_from_watch_dir = TRUE; gtr_core_add_files (core, unchanging, do_start, do_prompt, TRUE); g_slist_foreach (unchanging, (GFunc)rename_torrent_and_unref_file, NULL); g_slist_free (unchanging); core->priv->adding_from_watch_dir = FALSE; } /* keep monitoring the ones that are still changing */ g_slist_free (p->monitor_files); p->monitor_files = changing; /* if monitor_files is nonempty, keep checking every second */ if (core->priv->monitor_files) return G_SOURCE_CONTINUE; core->priv->monitor_idle_tag = 0; return G_SOURCE_REMOVE; } /* If this file is a torrent, add it to our list */ static void core_watchdir_monitor_file (TrCore * core, GFile * file) { char * filename = g_file_get_path (file); const gboolean is_torrent = g_str_has_suffix (filename, ".torrent"); if (is_torrent) { GSList * l; struct TrCorePrivate * p = core->priv; /* if we're not already watching this file, start watching it now */ for (l=p->monitor_files; l!=NULL; l=l->next) if (g_file_equal (file, l->data)) break; if (l == NULL) { g_object_ref (file); p->monitor_files = g_slist_prepend (p->monitor_files, file); if (p->monitor_idle_tag == 0) p->monitor_idle_tag = gdk_threads_add_timeout_seconds (1, core_watchdir_idle, core); } } g_free (filename); } /* GFileMonitor noticed a file was created */ static void on_file_changed_in_watchdir (GFileMonitor * monitor UNUSED, GFile * file, GFile * other_type UNUSED, GFileMonitorEvent event_type, gpointer core) { if (event_type == G_FILE_MONITOR_EVENT_CREATED) core_watchdir_monitor_file (core, file); } /* walk through the pre-existing files in the watchdir */ static void core_watchdir_scan (TrCore * core) { const char * dirname = gtr_pref_string_get (TR_KEY_watch_dir); GDir * dir = g_dir_open (dirname, 0, NULL); if (dir != NULL) { const char * name; while ((name = g_dir_read_name (dir))) { char * filename = g_build_filename (dirname, name, NULL); GFile * file = g_file_new_for_path (filename); core_watchdir_monitor_file (core, file); g_object_unref (file); g_free (filename); } g_dir_close (dir); } } static void core_watchdir_update (TrCore * core) { const gboolean is_enabled = gtr_pref_flag_get (TR_KEY_watch_dir_enabled); GFile * dir = g_file_new_for_path (gtr_pref_string_get (TR_KEY_watch_dir)); struct TrCorePrivate * p = core->priv; if (p->monitor && (!is_enabled || !g_file_equal (dir, p->monitor_dir))) { g_signal_handler_disconnect (p->monitor, p->monitor_tag); g_file_monitor_cancel (p->monitor); g_object_unref (p->monitor); g_object_unref (p->monitor_dir); p->monitor_dir = NULL; p->monitor = NULL; p->monitor_tag = 0; } if (is_enabled && !p->monitor) { GFileMonitor * m = g_file_monitor_directory (dir, 0, NULL, NULL); core_watchdir_scan (core); g_object_ref (dir); p->monitor = m; p->monitor_dir = dir; p->monitor_tag = g_signal_connect (m, "changed", G_CALLBACK (on_file_changed_in_watchdir), core); } g_object_unref (dir); } /*** **** ***/ static void on_pref_changed (TrCore * core, const tr_quark key, gpointer data UNUSED) { switch (key) { case TR_KEY_sort_mode: case TR_KEY_sort_reversed: { const char * mode = gtr_pref_string_get (TR_KEY_sort_mode); const gboolean is_reversed = gtr_pref_flag_get (TR_KEY_sort_reversed); core_set_sort_mode (core, mode, is_reversed); break; } case TR_KEY_peer_limit_global: tr_sessionSetPeerLimit (gtr_core_session (core), gtr_pref_int_get (key)); break; case TR_KEY_peer_limit_per_torrent: tr_sessionSetPeerLimitPerTorrent (gtr_core_session (core), gtr_pref_int_get (key)); break; case TR_KEY_inhibit_desktop_hibernation: core_maybe_inhibit_hibernation (core); break; case TR_KEY_watch_dir: case TR_KEY_watch_dir_enabled: core_watchdir_update (core); break; default: break; } } /** *** **/ TrCore * gtr_core_new (tr_session * session) { TrCore * core = TR_CORE (g_object_new (TR_CORE_TYPE, NULL)); core->priv->session = session; /* init from prefs & listen to pref changes */ on_pref_changed (core, TR_KEY_sort_mode, NULL); on_pref_changed (core, TR_KEY_sort_reversed, NULL); on_pref_changed (core, TR_KEY_watch_dir_enabled, NULL); on_pref_changed (core, TR_KEY_peer_limit_global, NULL); on_pref_changed (core, TR_KEY_inhibit_desktop_hibernation, NULL); g_signal_connect (core, "prefs-changed", G_CALLBACK (on_pref_changed), NULL); return core; } tr_session * gtr_core_close (TrCore * core) { tr_session * session = gtr_core_session (core); if (session) { core->priv->session = NULL; gtr_pref_save (session); } return session; } /*** **** COMPLETENESS CALLBACK ***/ struct notify_callback_data { TrCore * core; int torrent_id; }; static gboolean on_torrent_completeness_changed_idle (gpointer gdata) { struct notify_callback_data * data = gdata; gtr_notify_torrent_completed (data->core, data->torrent_id); g_object_unref (G_OBJECT (data->core)); g_free (data); return G_SOURCE_REMOVE; } /* this is called in the libtransmission thread, *NOT* the GTK+ thread, so delegate to the GTK+ thread before calling notify's dbus code... */ static void on_torrent_completeness_changed (tr_torrent * tor, tr_completeness completeness, bool was_running, void * gcore) { if (was_running && (completeness != TR_LEECH) && (tr_torrentStat (tor)->sizeWhenDone != 0)) { struct notify_callback_data * data = g_new (struct notify_callback_data, 1); data->core = gcore; data->torrent_id = tr_torrentId (tor); g_object_ref (G_OBJECT (data->core)); gdk_threads_add_idle (on_torrent_completeness_changed_idle, data); } } /*** **** METADATA CALLBACK ***/ static const char* get_collated_name (TrCore * core, const tr_torrent * tor) { char buf[2048]; const char * name = tr_torrentName (tor); char * down = g_utf8_strdown (name ? name : "", -1); const tr_info * inf = tr_torrentInfo (tor); g_snprintf (buf, sizeof (buf), "%s\t%s", down, inf->hashString); g_free (down); return g_string_chunk_insert_const (core->priv->string_chunk, buf); } struct metadata_callback_data { TrCore * core; int torrent_id; }; static gboolean find_row_from_torrent_id (GtkTreeModel * model, int id, GtkTreeIter * setme) { GtkTreeIter iter; gboolean match = FALSE; if (gtk_tree_model_iter_children (model, &iter, NULL)) do { int row_id; gtk_tree_model_get (model, &iter, MC_TORRENT_ID, &row_id, -1); match = id == row_id; } while (!match && gtk_tree_model_iter_next (model, &iter)); if (match) *setme = iter; return match; } static gboolean on_torrent_metadata_changed_idle (gpointer gdata) { struct notify_callback_data * data = gdata; tr_session * session = gtr_core_session (data->core); tr_torrent * tor = tr_torrentFindFromId (session, data->torrent_id); /* update the torrent's collated name */ if (tor != NULL) { GtkTreeIter iter; GtkTreeModel * model = core_raw_model (data->core); if (find_row_from_torrent_id (model, data->torrent_id, &iter)) { const char * collated = get_collated_name (data->core, tor); GtkListStore * store = GTK_LIST_STORE (model); gtk_list_store_set (store, &iter, MC_NAME_COLLATED, collated, -1); } } /* cleanup */ g_object_unref (G_OBJECT (data->core)); g_free (data); return G_SOURCE_REMOVE; } /* this is called in the libtransmission thread, *NOT* the GTK+ thread, so delegate to the GTK+ thread before changing our list store... */ static void on_torrent_metadata_changed (tr_torrent * tor, void * gcore) { struct notify_callback_data * data = g_new (struct notify_callback_data, 1); data->core = gcore; data->torrent_id = tr_torrentId (tor); g_object_ref (G_OBJECT (data->core)); gdk_threads_add_idle (on_torrent_metadata_changed_idle, data); } /*** **** **** ADDING TORRENTS **** ***/ static unsigned int build_torrent_trackers_hash (tr_torrent * tor) { unsigned int i; const char * pch; uint64_t hash = 0; const tr_info * const inf = tr_torrentInfo (tor); for (i=0; itrackerCount; ++i) for (pch=inf->trackers[i].announce; *pch; ++pch) hash = (hash<<4) ^ (hash>>28) ^ *pch; return hash; } static gboolean is_torrent_active (const tr_stat * st) { return (st->peersSendingToUs > 0) || (st->peersGettingFromUs > 0) || (st->activity == TR_STATUS_CHECK); } void gtr_core_add_torrent (TrCore * core, tr_torrent * tor, gboolean do_notify) { if (tor != NULL) { GtkTreeIter unused; const tr_stat * st = tr_torrentStat (tor); const char * collated = get_collated_name (core, tor); const unsigned int trackers_hash = build_torrent_trackers_hash (tor); GtkListStore * store = GTK_LIST_STORE (core_raw_model (core)); gtk_list_store_insert_with_values (store, &unused, 0, MC_NAME_COLLATED, collated, MC_TORRENT, tor, MC_TORRENT_ID, tr_torrentId (tor), MC_SPEED_UP, st->pieceUploadSpeed_KBps, MC_SPEED_DOWN, st->pieceDownloadSpeed_KBps, MC_ACTIVE_PEERS_UP, st->peersGettingFromUs, MC_ACTIVE_PEERS_DOWN, st->peersSendingToUs + st->webseedsSendingToUs, MC_RECHECK_PROGRESS, st->recheckProgress, MC_ACTIVE, is_torrent_active (st), MC_ACTIVITY, st->activity, MC_FINISHED, st->finished, MC_PRIORITY, tr_torrentGetPriority (tor), MC_QUEUE_POSITION, st->queuePosition, MC_TRACKERS, trackers_hash, -1); if (do_notify) gtr_notify_torrent_added (tr_torrentName (tor)); tr_torrentSetMetadataCallback (tor, on_torrent_metadata_changed, core); tr_torrentSetCompletenessCallback (tor, on_torrent_completeness_changed, core); } } static tr_torrent * core_create_new_torrent (TrCore * core, tr_ctor * ctor) { tr_torrent * tor; bool do_trash = false; tr_session * session = gtr_core_session (core); /* let the gtk client handle the removal, since libT * doesn't have any concept of the glib trash API */ tr_ctorGetDeleteSource (ctor, &do_trash); tr_ctorSetDeleteSource (ctor, FALSE); tor = tr_torrentNew (ctor, NULL, NULL); if (tor && do_trash) { const char * config = tr_sessionGetConfigDir (session); const char * source = tr_ctorGetSourceFile (ctor); if (source != NULL) { /* #1294: don't delete the .torrent file if it's our internal copy */ const int is_internal = (strstr (source, config) == source); if (!is_internal) gtr_file_trash_or_remove (source, NULL); } } return tor; } static int core_add_ctor (TrCore * core, tr_ctor * ctor, gboolean do_prompt, gboolean do_notify) { tr_info inf; int err = tr_torrentParse (ctor, &inf); switch (err) { case TR_PARSE_ERR: break; case TR_PARSE_DUPLICATE: /* don't complain about .torrent files in the watch directory * that have already been added... that gets annoying and we * don't want to be nagging users to clean up their watch dirs */ if (!tr_ctorGetSourceFile (ctor) || !core->priv->adding_from_watch_dir) core_emit_err (core, err, inf.name); tr_metainfoFree (&inf); tr_ctorFree (ctor); break; default: if (do_prompt) { g_signal_emit (core, signals[ADD_PROMPT_SIGNAL], 0, ctor); } else { gtr_core_add_torrent (core, core_create_new_torrent (core, ctor), do_notify); tr_ctorFree (ctor); } tr_metainfoFree (&inf); break; } return err; } static void core_apply_defaults (tr_ctor * ctor) { if (!tr_ctorGetPaused (ctor, TR_FORCE, NULL)) tr_ctorSetPaused (ctor, TR_FORCE, !gtr_pref_flag_get (TR_KEY_start_added_torrents)); if (!tr_ctorGetDeleteSource (ctor, NULL)) tr_ctorSetDeleteSource (ctor, gtr_pref_flag_get (TR_KEY_trash_original_torrent_files)); if (!tr_ctorGetPeerLimit (ctor, TR_FORCE, NULL)) tr_ctorSetPeerLimit (ctor, TR_FORCE, gtr_pref_int_get (TR_KEY_peer_limit_per_torrent)); if (!tr_ctorGetDownloadDir (ctor, TR_FORCE, NULL)) tr_ctorSetDownloadDir (ctor, TR_FORCE, gtr_pref_string_get (TR_KEY_download_dir)); } void gtr_core_add_ctor (TrCore * core, tr_ctor * ctor) { const gboolean do_notify = FALSE; const gboolean do_prompt = gtr_pref_flag_get (TR_KEY_show_options_window); core_apply_defaults (ctor); core_add_ctor (core, ctor, do_prompt, do_notify); } /*** **** ***/ struct add_from_url_data { TrCore * core; tr_ctor * ctor; bool do_prompt; bool do_notify; }; static void add_file_async_callback (GObject * file, GAsyncResult * result, gpointer gdata) { gsize length; char * contents; GError * error = NULL; struct add_from_url_data * data = gdata; if (!g_file_load_contents_finish (G_FILE (file), result, &contents, &length, NULL, &error)) { g_message (_("Couldn't read \"%s\": %s"), g_file_get_parse_name (G_FILE (file)), error->message); g_error_free (error); } else if (!tr_ctorSetMetainfo (data->ctor, (const uint8_t*)contents, length)) { core_add_ctor (data->core, data->ctor, data->do_prompt, data->do_notify); } else { tr_ctorFree (data->ctor); } core_dec_busy (data->core); g_free (data); } static bool add_file (TrCore * core, GFile * file, gboolean do_start, gboolean do_prompt, gboolean do_notify) { bool handled = false; tr_session * session = gtr_core_session (core); if (session != NULL) { tr_ctor * ctor; bool tried = false; bool loaded = false; ctor = tr_ctorNew (session); core_apply_defaults (ctor); tr_ctorSetPaused (ctor, TR_FORCE, !do_start); /* local files... */ if (!tried) { char * str = g_file_get_path (file); if ((tried = g_file_test (str, G_FILE_TEST_EXISTS))) loaded = !tr_ctorSetMetainfoFromFile (ctor, str); g_free (str); } /* magnet links... */ if (!tried && g_file_has_uri_scheme (file, "magnet")) { /* GFile mangles the original string with /// so we have to un-mangle */ char * str = g_file_get_parse_name (file); char * magnet = g_strdup_printf ("magnet:%s", strchr (str, '?')); tried = true; loaded = !tr_ctorSetMetainfoFromMagnetLink (ctor, magnet); g_free (magnet); g_free (str); } /* hashcodes that we can turn into magnet links... */ if (!tried) { char * str = g_file_get_basename (file); if (gtr_is_hex_hashcode (str)) { char * magnet = g_strdup_printf ("magnet:?xt=urn:btih:%s", str); tried = true; loaded = !tr_ctorSetMetainfoFromMagnetLink (ctor, magnet); g_free (magnet); } g_free (str); } /* if we were able to load the metainfo, add the torrent */ if (loaded) { handled = true; core_add_ctor (core, ctor, do_prompt, do_notify); } else if (g_file_has_uri_scheme (file, "http") || g_file_has_uri_scheme (file, "https") || g_file_has_uri_scheme (file, "ftp")) { struct add_from_url_data * data; data = g_new0 (struct add_from_url_data, 1); data->core = core; data->ctor = ctor; data->do_prompt = do_prompt; data->do_notify = do_notify; handled = true; core_inc_busy (core); g_file_load_contents_async (file, NULL, add_file_async_callback, data); } else { tr_ctorFree (ctor); g_message (_("Skipping unknown torrent \"%s\""), g_file_get_parse_name (file)); } } return handled; } bool gtr_core_add_from_url (TrCore * core, const char * uri) { bool handled; const bool do_start = gtr_pref_flag_get (TR_KEY_start_added_torrents); const bool do_prompt = gtr_pref_flag_get (TR_KEY_show_options_window); const bool do_notify = false; GFile * file = g_file_new_for_uri (uri); handled = add_file (core, file, do_start, do_prompt, do_notify); g_object_unref (file); gtr_core_torrents_added (core); return handled; } void gtr_core_add_files (TrCore * core, GSList * files, gboolean do_start, gboolean do_prompt, gboolean do_notify) { GSList * l; for (l=files; l!=NULL; l=l->next) add_file (core, l->data, do_start, do_prompt, do_notify); gtr_core_torrents_added (core); } void gtr_core_torrents_added (TrCore * self) { gtr_core_update (self); core_emit_err (self, TR_CORE_ERR_NO_MORE_TORRENTS, NULL); } void gtr_core_remove_torrent (TrCore * core, int id, gboolean delete_local_data) { tr_torrent * tor = gtr_core_find_torrent (core, id); if (tor != NULL) { /* remove from the gui */ GtkTreeIter iter; GtkTreeModel * model = core_raw_model (core); if (find_row_from_torrent_id (model, id, &iter)) gtk_list_store_remove (GTK_LIST_STORE (model), &iter); /* remove the torrent */ tr_torrentRemove (tor, delete_local_data, gtr_file_trash_or_remove); } } void gtr_core_load (TrCore * self, gboolean forcePaused) { int i; tr_ctor * ctor; tr_torrent ** torrents; int count = 0; ctor = tr_ctorNew (gtr_core_session (self)); if (forcePaused) tr_ctorSetPaused (ctor, TR_FORCE, TRUE); tr_ctorSetPeerLimit (ctor, TR_FALLBACK, gtr_pref_int_get (TR_KEY_peer_limit_per_torrent)); torrents = tr_sessionLoadTorrents (gtr_core_session (self), ctor, &count); for (i=0; i ib) ret = 1; else ret = 0; return ret; } static void update_foreach (GtkTreeModel * model, GtkTreeIter * iter) { int oldActivity, newActivity; int oldActivePeerCount, newActivePeerCount; int oldError, newError; bool oldFinished, newFinished; int oldQueuePosition, newQueuePosition; int oldDownloadPeerCount, newDownloadPeerCount; int oldUploadPeerCount, newUploadPeerCount; tr_priority_t oldPriority, newPriority; unsigned int oldTrackers, newTrackers; double oldUpSpeed, newUpSpeed; double oldDownSpeed, newDownSpeed; double oldRecheckProgress, newRecheckProgress; gboolean oldActive, newActive; const tr_stat * st; tr_torrent * tor; /* get the old states */ gtk_tree_model_get (model, iter, MC_TORRENT, &tor, MC_ACTIVE, &oldActive, MC_ACTIVE_PEER_COUNT, &oldActivePeerCount, MC_ACTIVE_PEERS_UP, &oldUploadPeerCount, MC_ACTIVE_PEERS_DOWN, &oldDownloadPeerCount, MC_ERROR, &oldError, MC_ACTIVITY, &oldActivity, MC_FINISHED, &oldFinished, MC_PRIORITY, &oldPriority, MC_QUEUE_POSITION, &oldQueuePosition, MC_TRACKERS, &oldTrackers, MC_SPEED_UP, &oldUpSpeed, MC_RECHECK_PROGRESS, &oldRecheckProgress, MC_SPEED_DOWN, &oldDownSpeed, -1); /* get the new states */ st = tr_torrentStat (tor); newActive = is_torrent_active (st); newActivity = st->activity; newFinished = st->finished; newPriority = tr_torrentGetPriority (tor); newQueuePosition = st->queuePosition; newTrackers = build_torrent_trackers_hash (tor); newUpSpeed = st->pieceUploadSpeed_KBps; newDownSpeed = st->pieceDownloadSpeed_KBps; newRecheckProgress = st->recheckProgress; newActivePeerCount = st->peersSendingToUs + st->peersGettingFromUs + st->webseedsSendingToUs; newDownloadPeerCount = st->peersSendingToUs; newUploadPeerCount = st->peersGettingFromUs + st->webseedsSendingToUs; newError = st->error; /* updating the model triggers off resort/refresh, so don't do it unless something's actually changed... */ if ((newActive != oldActive) || (newActivity != oldActivity) || (newFinished != oldFinished) || (newPriority != oldPriority) || (newQueuePosition != oldQueuePosition) || (newError != oldError) || (newActivePeerCount != oldActivePeerCount) || (newDownloadPeerCount != oldDownloadPeerCount) || (newUploadPeerCount != oldUploadPeerCount) || (newTrackers != oldTrackers) || gtr_compare_double (newUpSpeed, oldUpSpeed, 2) || gtr_compare_double (newDownSpeed, oldDownSpeed, 2) || gtr_compare_double (newRecheckProgress, oldRecheckProgress, 2)) { gtk_list_store_set (GTK_LIST_STORE (model), iter, MC_ACTIVE, newActive, MC_ACTIVE_PEER_COUNT, newActivePeerCount, MC_ACTIVE_PEERS_UP, newUploadPeerCount, MC_ACTIVE_PEERS_DOWN, newDownloadPeerCount, MC_ERROR, newError, MC_ACTIVITY, newActivity, MC_FINISHED, newFinished, MC_PRIORITY, newPriority, MC_QUEUE_POSITION, newQueuePosition, MC_TRACKERS, newTrackers, MC_SPEED_UP, newUpSpeed, MC_SPEED_DOWN, newDownSpeed, MC_RECHECK_PROGRESS, newRecheckProgress, -1); } } void gtr_core_update (TrCore * core) { GtkTreeIter iter; GtkTreeModel * model; /* update the model */ model = core_raw_model (core); if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) do update_foreach (model, &iter); while (gtk_tree_model_iter_next (model, &iter)); /* update hibernation */ core_maybe_inhibit_hibernation (core); } /** *** Hibernate **/ #define SESSION_MANAGER_SERVICE_NAME "org.gnome.SessionManager" #define SESSION_MANAGER_INTERFACE "org.gnome.SessionManager" #define SESSION_MANAGER_OBJECT_PATH "/org/gnome/SessionManager" static gboolean gtr_inhibit_hibernation (guint * cookie) { gboolean success; GVariant * response; GDBusConnection * connection; GError * err = NULL; const char * application = "Transmission BitTorrent Client"; const char * reason = "BitTorrent Activity"; const int toplevel_xid = 0; const int flags = 4; /* Inhibit suspending the session or computer */ connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &err); response = g_dbus_connection_call_sync (connection, SESSION_MANAGER_SERVICE_NAME, SESSION_MANAGER_OBJECT_PATH, SESSION_MANAGER_INTERFACE, "Inhibit", g_variant_new ("(susu)", application, toplevel_xid, reason, flags), NULL, G_DBUS_CALL_FLAGS_NONE, 1000, NULL, &err); if (response != NULL) *cookie = g_variant_get_uint32 (g_variant_get_child_value (response, 0)); success = (response != NULL) && (err == NULL); /* logging */ if (success) { tr_logAddInfo ("%s", _("Inhibiting desktop hibernation")); } else { tr_logAddError (_("Couldn't inhibit desktop hibernation: %s"), err->message); g_error_free (err); } /* cleanup */ if (response != NULL) g_variant_unref (response); if (connection != NULL) g_object_unref (connection); return success; } static void gtr_uninhibit_hibernation (guint inhibit_cookie) { GVariant * response; GDBusConnection * connection; GError * err = NULL; connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &err); response = g_dbus_connection_call_sync (connection, SESSION_MANAGER_SERVICE_NAME, SESSION_MANAGER_OBJECT_PATH, SESSION_MANAGER_INTERFACE, "Uninhibit", g_variant_new ("(u)", inhibit_cookie), NULL, G_DBUS_CALL_FLAGS_NONE, 1000, NULL, &err); /* logging */ if (err == NULL) { tr_logAddInfo ("%s", _("Allowing desktop hibernation")); } else { g_warning ("Couldn't uninhibit desktop hibernation: %s.", err->message); g_error_free (err); } /* cleanup */ g_variant_unref (response); g_object_unref (connection); } static void gtr_core_set_hibernation_allowed (TrCore * core, gboolean allowed) { g_return_if_fail (core); g_return_if_fail (core->priv); core->priv->inhibit_allowed = allowed != 0; if (allowed && core->priv->have_inhibit_cookie) { gtr_uninhibit_hibernation (core->priv->inhibit_cookie); core->priv->have_inhibit_cookie = FALSE; } if (!allowed && !core->priv->have_inhibit_cookie && !core->priv->dbus_error) { if (gtr_inhibit_hibernation (&core->priv->inhibit_cookie)) core->priv->have_inhibit_cookie = TRUE; else core->priv->dbus_error = TRUE; } } static void core_maybe_inhibit_hibernation (TrCore * core) { /* hibernation is allowed if EITHER * (a) the "inhibit" pref is turned off OR * (b) there aren't any active torrents */ const gboolean hibernation_allowed = !gtr_pref_flag_get (TR_KEY_inhibit_desktop_hibernation) || !gtr_core_get_active_torrent_count (core); gtr_core_set_hibernation_allowed (core, hibernation_allowed); } /** *** Prefs **/ static void core_commit_prefs_change (TrCore * core, const tr_quark key) { gtr_core_pref_changed (core, key); gtr_pref_save (gtr_core_session (core)); } void gtr_core_set_pref (TrCore * self, const tr_quark key, const char * newval) { if (g_strcmp0 (newval, gtr_pref_string_get (key))) { gtr_pref_string_set (key, newval); core_commit_prefs_change (self, key); } } void gtr_core_set_pref_bool (TrCore * self, const tr_quark key, gboolean newval) { if (newval != gtr_pref_flag_get (key)) { gtr_pref_flag_set (key, newval); core_commit_prefs_change (self, key); } } void gtr_core_set_pref_int (TrCore * self, const tr_quark key, int newval) { if (newval != gtr_pref_int_get (key)) { gtr_pref_int_set (key, newval); core_commit_prefs_change (self, key); } } void gtr_core_set_pref_double (TrCore * self, const tr_quark key, double newval) { if (gtr_compare_double (newval, gtr_pref_double_get (key), 4)) { gtr_pref_double_set (key, newval); core_commit_prefs_change (self, key); } } /*** **** **** RPC Interface **** ***/ /* #define DEBUG_RPC */ static int nextTag = 1; typedef void (server_response_func)(TrCore * core, tr_variant * response, gpointer user_data); struct pending_request_data { TrCore * core; server_response_func * response_func; gpointer response_func_user_data; }; static GHashTable * pendingRequests = NULL; static gboolean core_read_rpc_response_idle (void * vresponse) { int64_t intVal; tr_variant * response = vresponse; if (tr_variantDictFindInt (response, TR_KEY_tag, &intVal)) { const int tag = (int)intVal; struct pending_request_data * data = g_hash_table_lookup (pendingRequests, &tag); if (data) { if (data->response_func) (*data->response_func)(data->core, response, data->response_func_user_data); g_hash_table_remove (pendingRequests, &tag); } } tr_variantFree (response); tr_free (response); return G_SOURCE_REMOVE; } static void core_read_rpc_response (tr_session * session UNUSED, tr_variant * response, void * unused UNUSED) { tr_variant * response_copy = tr_new (tr_variant, 1); *response_copy = *response; tr_variantInitBool (response, false); gdk_threads_add_idle (core_read_rpc_response_idle, response_copy); } static void core_send_rpc_request (TrCore * core, const tr_variant * request, int tag, server_response_func * response_func, void * response_func_user_data) { tr_session * session = gtr_core_session (core); if (pendingRequests == NULL) { pendingRequests = g_hash_table_new_full (g_int_hash, g_int_equal, g_free, g_free); } if (session == NULL) { g_error ("GTK+ client doesn't support connections to remote servers yet."); } else { /* remember this request */ struct pending_request_data * data; data = g_new0 (struct pending_request_data, 1); data->core = core; data->response_func = response_func; data->response_func_user_data = response_func_user_data; g_hash_table_insert (pendingRequests, g_memdup (&tag, sizeof (int)), data); /* make the request */ #ifdef DEBUG_RPC { struct evbuffer * buf = tr_variantToBuf (request, TR_VARIANT_FMT_JSON_LEAN); const size_t buf_len = evbuffer_get_length (buf); g_message ("request: [%*.*s]", (int) buf_len, (int) buf_len, evbuffer_pullup (buf, -1)); evbuffer_free (buf); } #endif tr_rpc_request_exec_json (session, request, core_read_rpc_response, GINT_TO_POINTER (tag)); } } /*** **** Sending a test-port request via RPC ***/ static void on_port_test_response (TrCore * core, tr_variant * response, gpointer u UNUSED) { tr_variant * args; bool is_open; if (!tr_variantDictFindDict (response, TR_KEY_arguments, &args) || !tr_variantDictFindBool (args, TR_KEY_port_is_open, &is_open)) is_open = false; core_emit_port_tested (core, is_open); } void gtr_core_port_test (TrCore * core) { const int tag = nextTag++; tr_variant request; tr_variantInitDict (&request, 2); tr_variantDictAddStr (&request, TR_KEY_method, "port-test"); tr_variantDictAddInt (&request, TR_KEY_tag, tag); core_send_rpc_request (core, &request, tag, on_port_test_response, NULL); tr_variantFree (&request); } /*** **** Updating a blocklist via RPC ***/ static void on_blocklist_response (TrCore * core, tr_variant * response, gpointer data UNUSED) { tr_variant * args; int64_t ruleCount; if (!tr_variantDictFindDict (response, TR_KEY_arguments, &args) || !tr_variantDictFindInt (args, TR_KEY_blocklist_size, &ruleCount)) ruleCount = -1; if (ruleCount > 0) gtr_pref_int_set (TR_KEY_blocklist_date, tr_time ()); core_emit_blocklist_udpated (core, ruleCount); } void gtr_core_blocklist_update (TrCore * core) { const int tag = nextTag++; tr_variant request; tr_variantInitDict (&request, 2); tr_variantDictAddStr (&request, TR_KEY_method, "blocklist-update"); tr_variantDictAddInt (&request, TR_KEY_tag, tag); core_send_rpc_request (core, &request, tag, on_blocklist_response, NULL); tr_variantFree (&request); } /*** **** ***/ void gtr_core_exec (TrCore * core, const tr_variant * top) { const int tag = nextTag++; core_send_rpc_request (core, top, tag, NULL, NULL); } /*** **** ***/ size_t gtr_core_get_torrent_count (TrCore * core) { return gtk_tree_model_iter_n_children (core_raw_model (core), NULL); } size_t gtr_core_get_active_torrent_count (TrCore * core) { GtkTreeIter iter; size_t activeCount = 0; GtkTreeModel * model = core_raw_model (core); if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) do { int activity; gtk_tree_model_get (model, &iter, MC_ACTIVITY, &activity, -1); if (activity != TR_STATUS_STOPPED) ++activeCount; } while (gtk_tree_model_iter_next (model, &iter)); return activeCount; } tr_torrent * gtr_core_find_torrent (TrCore * core, int id) { tr_session * session; tr_torrent * tor = NULL; if ((session = gtr_core_session (core))) tor = tr_torrentFindFromId (session, id); return tor; } void gtr_core_open_folder (TrCore * core, int torrent_id) { const tr_torrent * tor = gtr_core_find_torrent (core, torrent_id); if (tor != NULL) { const gboolean single = tr_torrentInfo (tor)->fileCount == 1; const char * currentDir = tr_torrentGetCurrentDir (tor); if (single) { gtr_open_file (currentDir); } else { char * path = g_build_filename (currentDir, tr_torrentName (tor), NULL); gtr_open_file (path); g_free (path); } } } transmission-2.92/gtk/PaxHeaders.4960/transmission.gresource.xml0000644000000000000000000000013212663770147021730 xustar0030 mtime=1456468071.168840996 30 atime=1456468071.168840996 30 ctime=1457295921.177827933 transmission-2.92/gtk/transmission.gresource.xml0000644000175000017500000000103112663770147023350 0ustar00mikedldmikedld00000000000000 icons/hicolor_apps_24x24_transmission.png icons/hicolor_apps_48x48_transmission.png icons/lock.png icons/ratio.png icons/turtle-blue.png icons/turtle-grey.png icons/utilities.png transmission-ui.xml transmission-2.92/gtk/PaxHeaders.4960/stats.c0000644000000000000000000000007412617356116015762 xustar0030 atime=1456201459.062219723 30 ctime=1457295921.113826845 transmission-2.92/gtk/stats.c0000644000175000017500000001475312617356116017414 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: stats.c 14241 2014-01-21 03:10:30Z jordan $ */ #include #include #include "hig.h" #include "stats.h" #include "tr-core.h" #include "tr-prefs.h" #include "util.h" enum { TR_RESPONSE_RESET = 1 }; struct stat_ui { GtkLabel * one_up_lb; GtkLabel * one_down_lb; GtkLabel * one_ratio_lb; GtkLabel * one_time_lb; GtkLabel * all_up_lb; GtkLabel * all_down_lb; GtkLabel * all_ratio_lb; GtkLabel * all_time_lb; GtkLabel * all_sessions_lb; TrCore * core; }; static void setLabel (GtkLabel * l, const char * str) { gtr_label_set_text (l, str); } static void setLabelFromRatio (GtkLabel * l, double d) { char buf[128]; tr_strlratio (buf, d, sizeof (buf)); setLabel (l, buf); } static gboolean updateStats (gpointer gdata) { char buf[128]; const char * fmt; tr_session_stats one, all; const size_t buflen = sizeof (buf); struct stat_ui * ui = gdata; tr_sessionGetStats (gtr_core_session (ui->core), &one); tr_sessionGetCumulativeStats (gtr_core_session (ui->core), &all); setLabel (ui->one_up_lb, tr_strlsize (buf, one.uploadedBytes, buflen)); setLabel (ui->one_down_lb, tr_strlsize (buf, one.downloadedBytes, buflen)); setLabel (ui->one_time_lb, tr_strltime (buf, one.secondsActive, buflen)); setLabelFromRatio (ui->one_ratio_lb, one.ratio); fmt = ngettext ("Started %'d time", "Started %'d times", (int)all.sessionCount); g_snprintf (buf, buflen, fmt, (int)all.sessionCount); setLabel (ui->all_sessions_lb, buf); setLabel (ui->all_up_lb, tr_strlsize (buf, all.uploadedBytes, buflen)); setLabel (ui->all_down_lb, tr_strlsize (buf, all.downloadedBytes, buflen)); setLabel (ui->all_time_lb, tr_strltime (buf, all.secondsActive, buflen)); setLabelFromRatio (ui->all_ratio_lb, all.ratio); return G_SOURCE_CONTINUE; } static void dialogDestroyed (gpointer p, GObject * dialog UNUSED) { g_source_remove (GPOINTER_TO_UINT (p)); } static void dialogResponse (GtkDialog * dialog, gint response, gpointer gdata) { struct stat_ui * ui = gdata; if (response == TR_RESPONSE_RESET) { const char * primary = _("Reset your statistics?"); const char * secondary = _("These statistics are for your information only. " "Resetting them doesn't affect the statistics logged by your BitTorrent trackers."); const int flags = GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL; GtkWidget * w = gtk_message_dialog_new (GTK_WINDOW (dialog), flags, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, "%s", primary); gtk_dialog_add_buttons (GTK_DIALOG (w), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, _("_Reset"), TR_RESPONSE_RESET, NULL); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), "%s", secondary); if (gtk_dialog_run (GTK_DIALOG (w)) == TR_RESPONSE_RESET) { tr_sessionClearStats (gtr_core_session (ui->core)); updateStats (ui); } gtk_widget_destroy (w); } if (response == GTK_RESPONSE_CLOSE) gtk_widget_destroy (GTK_WIDGET (dialog)); } GtkWidget* gtr_stats_dialog_new (GtkWindow * parent, TrCore * core) { guint i; GtkWidget * d; GtkWidget * t; GtkWidget * l; guint row = 0; struct stat_ui * ui = g_new0 (struct stat_ui, 1); d = gtk_dialog_new_with_buttons (_("Statistics"), parent, GTK_DIALOG_DESTROY_WITH_PARENT, _("_Reset"), TR_RESPONSE_RESET, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_CLOSE); gtk_dialog_set_alternative_button_order (GTK_DIALOG (d), GTK_RESPONSE_CLOSE, TR_RESPONSE_RESET, -1); t = hig_workarea_create (); ui->core = core; hig_workarea_add_section_title (t, &row, _("Current Session")); l = gtk_label_new (NULL); ui->one_up_lb = GTK_LABEL (l); gtk_label_set_single_line_mode (ui->one_up_lb, TRUE); hig_workarea_add_row (t, &row, _("Uploaded:"), l, NULL); l = gtk_label_new (NULL); ui->one_down_lb = GTK_LABEL (l); gtk_label_set_single_line_mode (ui->one_down_lb, TRUE); hig_workarea_add_row (t, &row, _("Downloaded:"), l, NULL); l = gtk_label_new (NULL); ui->one_ratio_lb = GTK_LABEL (l); gtk_label_set_single_line_mode (ui->one_ratio_lb, TRUE); hig_workarea_add_row (t, &row, _("Ratio:"), l, NULL); l = gtk_label_new (NULL); ui->one_time_lb = GTK_LABEL (l); gtk_label_set_single_line_mode (ui->one_time_lb, TRUE); hig_workarea_add_row (t, &row, _("Duration:"), l, NULL); hig_workarea_add_section_divider (t, &row); hig_workarea_add_section_title (t, &row, _("Total")); l = gtk_label_new (_("Started %'d time")); ui->all_sessions_lb = GTK_LABEL (l); gtk_label_set_single_line_mode (ui->all_sessions_lb, TRUE); hig_workarea_add_label_w (t, row++, l); l = gtk_label_new (NULL); ui->all_up_lb = GTK_LABEL (l); gtk_label_set_single_line_mode (ui->all_up_lb, TRUE); hig_workarea_add_row (t, &row, _("Uploaded:"), l, NULL); l = gtk_label_new (NULL); ui->all_down_lb = GTK_LABEL (l); gtk_label_set_single_line_mode (ui->all_down_lb, TRUE); hig_workarea_add_row (t, &row, _("Downloaded:"), l, NULL); l = gtk_label_new (NULL); ui->all_ratio_lb = GTK_LABEL (l); gtk_label_set_single_line_mode (ui->all_ratio_lb, TRUE); hig_workarea_add_row (t, &row, _("Ratio:"), l, NULL); l = gtk_label_new (NULL); ui->all_time_lb = GTK_LABEL (l); gtk_label_set_single_line_mode (ui->all_time_lb, TRUE); hig_workarea_add_row (t, &row, _("Duration:"), l, NULL); gtr_dialog_set_content (GTK_DIALOG (d), t); updateStats (ui); g_object_set_data_full (G_OBJECT (d), "data", ui, g_free); g_signal_connect (d, "response", G_CALLBACK (dialogResponse), ui); i = gdk_threads_add_timeout_seconds (SECONDARY_WINDOW_REFRESH_INTERVAL_SECONDS, updateStats, ui); g_object_weak_ref (G_OBJECT (d), dialogDestroyed, GUINT_TO_POINTER (i)); return d; } transmission-2.92/gtk/PaxHeaders.4960/actions.h0000644000000000000000000000007412617356116016271 xustar0030 atime=1456201459.051219536 30 ctime=1457295920.888823018 transmission-2.92/gtk/actions.h0000644000175000017500000000210112617356116017703 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: actions.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef GTR_ACTIONS_H #define GTR_ACTIONS_H #include #include "tr-core.h" #define WINDOW_ICON "transmission-main-window-icon" #define TRAY_ICON "transmission-tray-icon" #define NOTIFICATION_ICON "transmission-notification-icon" void gtr_actions_init (GtkUIManager * ui_manager, gpointer callback_user_data); void gtr_actions_set_core (TrCore * core); void gtr_actions_handler (const char * action_name, gpointer user_data); void gtr_action_activate (const char * action_name); void gtr_action_set_sensitive (const char * action_name, gboolean is_sensitive); void gtr_action_set_toggled (const char * action_name, gboolean is_toggled); void gtr_action_set_important (const char * action_name, gboolean is_important); GtkWidget* gtr_action_get_widget (const char * path); #endif transmission-2.92/gtk/PaxHeaders.4960/transmission.png0000644000000000000000000000007412617356116017717 xustar0030 atime=1456201459.068219825 30 ctime=1457295921.183828035 transmission-2.92/gtk/transmission.png0000644000175000017500000000516212617356116021343 0ustar00mikedldmikedld00000000000000‰PNG  IHDR00Wù‡ 9IDATxíYëoÕÿ™Ù÷û~ÄvüJŒcœIœ PÅ+ˆ–~©µZUU©ªJ@ħªRªÒ”ª*ñ´¦¨ªú¥Djih‹ MÝ⤠!±±ƒ“ `{ßïÙ™Û3GŒŠ×»k»Fuú“F;×;sîýó;çÜ»&¥>Ïа¹ø?Ÿ1žþ¹o@³Ÿ§ @EýäÈSϼ€ÏkÊ—ˆø¢ìpƒlU€¾Ò¡øìQìÞ¿--Q ”B6—Ãä;'àÿá@¦‰Z`ÀGœ3I 8ö}¥þ´a¿ z6ÜßÿÔØwúZúûÉCÔ0l€‰°?òU˜f®m"‚ÇãÅo~=/¥ 4˜³ ÀT ™Ë—ÕûÇ“33¿|B©omHBðÌ¡Ûo7hrÕ‰ À²šX3@G€H8ŠjÕ¬ùÊ€fÛÀ ¬ \®áb ]Gx`€ú ¾6;ûµWˆžþ¶Réä€a¥RÈŸ>Õ`9 ”Ï*ªVuy¨5‚‚BåcW*hŠsçìí…îñØf¹°!öÌÌŒVÅPM§&’³%Y Yå4ÒäÕy4ôP¾Ë—Q©Tô PÙ„4à•³ÓÓFüþÂhR{•!æ`U-X5,M‡r’œmT´º„¼ pô,ä§§ó¤ÔžT*±!ßUꉉ~ŸÌå à&$ÀÀn@ÀgÙÖ é¶!IýQ&S¡lVÕY¼F€É×,_§-à·ßSjâ3élèwœKð2Q¸Rç]sdÄG]f éµ2 ðxJåûî»IõÕQƒ `=£TöÒÈ8*uËÈÑ£Gý!Pݰ8" JÙãã™§'&R×j'«–€%:qq¨ÖF@øœ¨/¡M ðàÃhÕ4·%j«€ˆ°wï½Û¶S§§Î?ôÈaµŠÏ÷_/½ú«×J‰ÀC>Ÿï¥ÞÞÞP$•®…DU:±¹BV¤iÛ¹3R› Ÿ6«P*£ó—.ÍçòG؉CL"ÿ_`Ï?7¸}0äñzP(äaÛ6VC<k(!e+äs9ØÊnꀀßÑÑÑÐùóç)›É> àÇë&ÀÌã§3!™JJJ§ÒÈdÒ0ÍjÃÉÇÇ÷¶ìš·lKlÌÎÎòû&ê!#Ä;J"Ñ××<{æì‘õp±= ”¸zÀÈd2p"qèÞ{ éê¡T,!™H£l[áÖƒä¬PYt*ÂɓР]œÑÖÖæ|Ù™­,£Äz AA¶Â™t‡ú âñazfMÒD¾Óu/úúPðL½{aŽK~¿¿X(†¼³n!@ "IÊÞÞž¦‰œJf°2¹¬,®º»»0yòŸLT—q(Ò™ÀŽu`ö7C!C#MB †V­BóóóˆE#r|L¥ÓË* ‘ŽB±ˆd:‡fhmkE±T„¡ C6°¸¸8 Æz Œ2{Çó’¬[ ©@¹…P-[䇗®@èE:“ÅÒRrùDº…| /¢$:Pb¤œ±Æ9·{݈h[ @.ï”D ±xL¼²|Ù õ*…\Ÿ/H¾$jø¼~ŽL,‡fŽÛ–X‹T*¥4D"Q4²Ò9yÚ¼^/Œ’«j¢£½†áq'¬™S!—ÍÁçs¼\àd°”îÁ^$˜Ë祙YU›Ÿõ6tD;W³RFND"°-«g½?lõú|~Óñ”n°”ÖÖV¹ç(ˆ¸2É¥2ÉD"a‘D ™ÂâRBˆ$þÁ3™<×ú ä‡nˆ ±'Å_]ÝݨTL)[ìHço6;uëz$4Èú7‰(`躄³­µM&ráz×EŠ©“&2™»ø!?ßî*Y’qîÃy¤³Y®í1&™C¿!î^!"¥ÐÑÑsïƒ37ƒ1‰Ä0€+k%°“Ö @ÊY¹XBÛ'Ô2¹w ö¶R–„ôô™3¢s©ZJˆJ£ Pv•å–]æ U#É®Î.‹e™›Äbqƒ ìp|Mˆh(m ð 4]—Äc¯¸“ºS \/¦3)Þ¸sD¤@uìUŽd:‘- oS\‚°•œÕ࢓ d³±£È! °CÆÖ,!ÖÜX4ûœ@ðûür¹D‹w¸ÕDN_&k6ÏIZ)•Ѱ+Ò e®ó]=îû«‹ i 6 å×= !°ˆ£qÓš °ááHXv”N2ÅâqW>PJ&Ä›9ŽÉÉ“Ò#H~:4DíÎ{ÍL¥¤,ÿìç?{N¥Û½{7ï>¯BnlÛ·´±ŒJ¼xåHŒk&ÀlûxKËŠL€õßÑæzËý{öìÁÐÐŽ{W®\Áßÿñ.G €2n†R©„÷/LctxˆßßH¥ù”[»{‘Ëe¡¡%uœÙÉ•HçMÕ”?ä¬x½>ñ~‰%ѹ¥õeÇ?Èã=~\˜™Å{ç.4<7laG|aÿAtuuá®;ïB+×ûFèéÙŠ©©)p–èƒÁ2KtÀ«E`{´¥¥DDaÝÐQqJh{šaôúëy‡9€7Þø#úz{ðÖÛ'¥¸ˆ„C¸eßtmiÇwÜ…mÛ·c5tvu£ðöÛ²µ†´Æ[-&°c-c,<–ŒTr±,=`5°‡pÿý_ÆÅ¹9NÀffçðîÔYìÁuƒØ7¾7ß|³ÈoUH)Ý‚L6#k Ehïh÷Í_šplÕp×õ*¥d²Jµâϵb`Û6|ý±Çðç7ßÄ@_¯Ãm·Ý.׃@0(•MÐÞÞîã긫éV‚ˆ4~a,‹û$†nå[oýårk…×ãÅÝw߃Çÿ&ºwÝ‹wœ÷·'¸÷l‘5@ÎÚ­pJ)1êF€»víjá¤Ùãþá°Æ 6väÈÓøP°¡IMWÄ— ;†rr„\ql$yÕ½'Ylíâù;Yüøø>YûUJ¹eÛCC·Üâ4¨¬b,#066æ!Ÿ¯G)»Ï™˜[7\ã»vÝÈDF¥aAˆä„²ì^àÞÊwp;­–kï]ôÉØ-ÛKKKB©xVµ‹ú¼½{÷î½À\F€Ðó–gö§'“BÃÃ#CØ pÏà²|VÙýƒÇVmW#‘j ¸áÓøB&ÆÕ¯:cùÜdHFyU«xÜì<`WÌ œFv­@ä¶ÖYµN-,.(ÞŠö6ñr°—¢[ÙvÝ*äóùTÁ¶->9½~qîâ­Þôlí‘°m2T*eLOO;k™2I+Õ%°°°`{ÃáÄB2=éõx^<ó¯3ßáx¤lļ‘Óùsn)‘zYS*Ñ–ÍZ+þSO §ÆÆ £›%®¼>o›9“˜ËNm'íbñÊ©S§ nø7nôØóu‡ƒIEND®B`‚transmission-2.92/gtk/PaxHeaders.4960/tr-prefs.h0000644000000000000000000000007412617356116016373 xustar0030 atime=1456201459.065219774 30 ctime=1457295920.999824906 transmission-2.92/gtk/tr-prefs.h0000644000175000017500000000540612617356116020020 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: tr-prefs.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef GTR_PREFS_H #define GTR_PREFS_H #include GtkWidget * gtr_prefs_dialog_new (GtkWindow * parent, GObject * core); /* if you add a key here, you /must/ add its * default in tr_prefs_init_defaults (void) */ #define PREF_KEY_BLOCKLIST_UPDATES_ENABLED "blocklist-updates-enabled" #define PREF_KEY_COMPACT_VIEW "compact-view" #define PREF_KEY_DIR_WATCH_ENABLED "watch-dir-enabled" #define PREF_KEY_DIR_WATCH "watch-dir" #define PREF_KEY_FILTERBAR "show-filterbar" #define PREF_KEY_INHIBIT_HIBERNATION "inhibit-desktop-hibernation" #define PREF_KEY_MAIN_WINDOW_HEIGHT "main-window-height" #define PREF_KEY_MAIN_WINDOW_IS_MAXIMIZED "main-window-is-maximized" #define PREF_KEY_MAIN_WINDOW_WIDTH "main-window-width" #define PREF_KEY_MAIN_WINDOW_X "main-window-x" #define PREF_KEY_MAIN_WINDOW_Y "main-window-y" #define PREF_KEY_OPEN_DIALOG_FOLDER "open-dialog-dir" #define PREF_KEY_OPTIONS_PROMPT "show-options-window" #define PREF_KEY_SHOW_BACKUP_TRACKERS "show-backup-trackers" #define PREF_KEY_SHOW_MORE_PEER_INFO "show-extra-peer-details" #define PREF_KEY_SHOW_MORE_TRACKER_INFO "show-tracker-scrapes" #define PREF_KEY_SHOW_TRAY_ICON "show-notification-area-icon" #define PREF_KEY_SORT_MODE "sort-mode" #define PREF_KEY_SORT_REVERSED "sort-reversed" #define PREF_KEY_STATUSBAR "show-statusbar" #define PREF_KEY_STATUSBAR_STATS "statusbar-stats" #define PREF_KEY_TOOLBAR "show-toolbar" #define PREF_KEY_TORRENT_ADDED_NOTIFICATION_ENABLED "torrent-added-notification-enabled" #define PREF_KEY_TORRENT_COMPLETE_NOTIFICATION_ENABLED "torrent-complete-notification-enabled" #define PREF_KEY_TORRENT_COMPLETE_SOUND_COMMAND "torrent-complete-sound-command" #define PREF_KEY_TORRENT_COMPLETE_SOUND_ENABLED "torrent-complete-sound-enabled" #define PREF_KEY_TRASH_CAN_ENABLED "trash-can-enabled" #define PREF_KEY_USER_HAS_GIVEN_INFORMED_CONSENT "user-has-given-informed-consent" enum { MAIN_WINDOW_REFRESH_INTERVAL_SECONDS = 2, SECONDARY_WINDOW_REFRESH_INTERVAL_SECONDS = 2 }; #endif /* GTR_PREFS_H */ transmission-2.92/gtk/PaxHeaders.4960/tr-icon.h0000644000000000000000000000007412617356116016204 xustar0030 atime=1456201459.064219757 30 ctime=1457295920.995824838 transmission-2.92/gtk/tr-icon.h0000644000175000017500000000063412617356116017627 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: tr-icon.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef GTR_ICON_H #define GTR_ICON_H #include #include "tr-core.h" gpointer gtr_icon_new (TrCore * core); void gtr_icon_refresh (gpointer); #endif /* GTR_ICON_H */ transmission-2.92/gtk/PaxHeaders.4960/transmission-gtk.desktop.in0000644000000000000000000000007412617356116021774 xustar0030 atime=1456201459.067219808 30 ctime=1457295921.166827746 transmission-2.92/gtk/transmission-gtk.desktop.in0000644000175000017500000000124412617356116023415 0ustar00mikedldmikedld00000000000000[Desktop Entry] _Name=Transmission _GenericName=BitTorrent Client _X-GNOME-FullName=Transmission BitTorrent Client _Comment=Download and share files over BitTorrent Exec=transmission-gtk %U Icon=transmission Terminal=false TryExec=transmission-gtk Type=Application StartupNotify=true MimeType=application/x-bittorrent;x-scheme-handler/magnet; Categories=Network;FileTransfer;P2P;GTK; X-Ubuntu-Gettext-Domain=transmission X-AppInstall-Keywords=torrent Actions=Pause;Minimize; [Desktop Action Pause] _Name=Start Transmission with All Torrents Paused Exec=transmission-gtk --paused [Desktop Action Minimize] _Name=Start Transmission Minimized Exec=transmission-gtk --minimized transmission-2.92/gtk/PaxHeaders.4960/open-dialog.h0000644000000000000000000000007312617356116017026 xustar0030 atime=1456201459.061219706 29 ctime=1457295920.96182426 transmission-2.92/gtk/open-dialog.h0000644000175000017500000000123312617356116020446 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: open-dialog.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef GTR_OPEN_DIALOG_H #define GTR_OPEN_DIALOG_H #include #include "tr-core.h" GtkWidget* gtr_torrent_open_from_url_dialog_new (GtkWindow * parent, TrCore * core); GtkWidget* gtr_torrent_open_from_file_dialog_new (GtkWindow * parent, TrCore * core); /* This dialog assumes ownership of the ctor */ GtkWidget* gtr_torrent_options_dialog_new (GtkWindow * parent, TrCore * core, tr_ctor * ctor); #endif /* GTR_ADD_DIALOG */ transmission-2.92/gtk/PaxHeaders.4960/transmission-gtk.10000644000000000000000000000007412617356116020056 xustar0030 atime=1456201459.066219791 30 ctime=1457295921.016825195 transmission-2.92/gtk/transmission-gtk.10000644000175000017500000000574212617356116021506 0ustar00mikedldmikedld00000000000000.\" $Id: transmission-gtk.1 11626 2011-01-03 05:58:58Z jordan $ .\" .\" Copyright (c) 2007 Joshua Elsasser .\" .\" 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. .Dd May 20, 2008 .Dt TRANSMISSION-GTK 1 .Os .Sh NAME .Nm transmission-gtk .Nd a bittorrent client .Sh SYNOPSIS .Nm transmission-gtk .Fl ? .Nm .Op Fl pqm .Op Ar torrent-file ... .Sh DESCRIPTION .Nm is a fast and easy BitTorrent client. .Pp BitTorrent is a peer-to-peer file transfer protocol which uses a metainfo file (usually with the .torrent file extension) and a central tracker to distribute file data amongst a group of peers. For more information on the BitTorrent protocol see http://www.bittorrent.org/ .Sh OPTIONS .Bl -tag -width Ds .It Fl ? Fl -help Show help options .It Fl p Fl -paused Start with all torrents paused .It Fl m Fl -minimized Start minimized in notification area .It Fl g, Fl -config-dir Ar directory Where to look for configuration files. This can be used to swap between using the cli, daemon, gtk, and qt clients. See http://trac.transmissionbt.com/wiki/ConfigFiles for more information. .El .Pp Multiple .torrent files may be added at startup by appending them on the command line. If .Nm is already running, the torrents will be added to the running instance. .Sh ENVIRONMENT .Bl -tag -width Fl .It Ev TRANSMISSION_HOME Sets the default config-dir. .It Ev http_proxy libcurl uses this environment variable when performing tracker announces. If set, this overrides the GNOME proxy preferences. .El .Sh FILES .Bl -tag -width Ds -compact .It ~/.config/transmission The config-dir used when neither .Op Ev TRANSMISSION_HOME nor .Op Fl g is specified. .El .Sh AUTHORS .An -nosplit .Nm was written by .An Jordan Lee , .An Josh Elsasser , .An Eric Petit , and .An Mitchell Livingston . .Sh SEE ALSO .Xr transmission-create 1 , .Xr transmission-daemon 1 , .Xr transmission-edit 1 , .Xr transmission-gtk 1 , .Xr transmission-qt 1 , .Xr transmission-remote 1 , .Xr transmission-show 1 .Pp http://www.transmissionbt.com/ transmission-2.92/gtk/PaxHeaders.4960/tr-icon.c0000644000000000000000000000007412617356116016177 xustar0030 atime=1456201459.064219757 30 ctime=1457295921.136827236 transmission-2.92/gtk/tr-icon.c0000644000175000017500000001036512617356116017624 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: tr-icon.c 14241 2014-01-21 03:10:30Z jordan $ */ #include #include #ifdef HAVE_LIBAPPINDICATOR #include #endif #include #include #include "actions.h" #include "tr-icon.h" #include "util.h" static TR_DEFINE_QUARK (tr_core, core) #define ICON_NAME "transmission" #ifdef HAVE_LIBAPPINDICATOR void gtr_icon_refresh (gpointer vindicator UNUSED) { } #else static void activated (GtkStatusIcon * self UNUSED, gpointer user_data UNUSED) { gtr_action_activate ("toggle-main-window"); } static void popup (GtkStatusIcon * self, guint button, guint when, gpointer data UNUSED) { GtkWidget * w = gtr_action_get_widget ("/icon-popup"); gtk_menu_popup (GTK_MENU (w), NULL, NULL, gtk_status_icon_position_menu, self, button, when); } void gtr_icon_refresh (gpointer vicon) { double KBps; double limit; char up[64]; char upLimit[64]; char down[64]; char downLimit[64]; char tip[1024]; const char * idle = _("Idle"); GtkStatusIcon * icon = GTK_STATUS_ICON (vicon); tr_session * session = gtr_core_session (g_object_get_qdata (G_OBJECT (icon), core_quark ())); /* up */ KBps = tr_sessionGetRawSpeed_KBps (session, TR_UP); if (KBps < 0.001) g_strlcpy (up, idle, sizeof (up)); else tr_formatter_speed_KBps (up, KBps, sizeof (up)); /* up limit */ *upLimit = '\0'; if (tr_sessionGetActiveSpeedLimit_KBps (session, TR_UP, &limit)) { char buf[64]; tr_formatter_speed_KBps (buf, limit, sizeof (buf)); g_snprintf (upLimit, sizeof (upLimit), _(" (Limit: %s)"), buf); } /* down */ KBps = tr_sessionGetRawSpeed_KBps (session, TR_DOWN); if (KBps < 0.001) g_strlcpy (down, idle, sizeof (down)); else tr_formatter_speed_KBps (down, KBps, sizeof (down)); /* down limit */ *downLimit = '\0'; if (tr_sessionGetActiveSpeedLimit_KBps (session, TR_DOWN, &limit)) { char buf[64]; tr_formatter_speed_KBps (buf, limit, sizeof (buf)); g_snprintf (downLimit, sizeof (downLimit), _(" (Limit: %s)"), buf); } /* %1$s: current upload speed * %2$s: current upload limit, if any * %3$s: current download speed * %4$s: current download limit, if any */ g_snprintf (tip, sizeof (tip), _("Transmission\nUp: %1$s %2$s\nDown: %3$s %4$s"), up, upLimit, down, downLimit); gtk_status_icon_set_tooltip_text (GTK_STATUS_ICON (icon), tip); } #endif static const char * getIconName (void) { const char * icon_name; GtkIconTheme * theme = gtk_icon_theme_get_default (); /* if the tray's icon is a 48x48 file, use it; * otherwise, use the fallback builtin icon */ if (!gtk_icon_theme_has_icon (theme, TRAY_ICON)) { icon_name = ICON_NAME; } else { GtkIconInfo * icon_info = gtk_icon_theme_lookup_icon (theme, TRAY_ICON, 48, GTK_ICON_LOOKUP_USE_BUILTIN); const gboolean icon_is_builtin = gtk_icon_info_get_filename (icon_info) == NULL; #if GTK_CHECK_VERSION(3,8,0) g_object_unref (icon_info); #else gtk_icon_info_free (icon_info); #endif icon_name = icon_is_builtin ? ICON_NAME : TRAY_ICON; } return icon_name; } gpointer gtr_icon_new (TrCore * core) { #ifdef HAVE_LIBAPPINDICATOR GtkWidget * w; const char * icon_name = getIconName (); AppIndicator * indicator = app_indicator_new (ICON_NAME, icon_name, APP_INDICATOR_CATEGORY_SYSTEM_SERVICES); app_indicator_set_status (indicator, APP_INDICATOR_STATUS_ACTIVE); w = gtr_action_get_widget ("/icon-popup"); app_indicator_set_menu (indicator, GTK_MENU (w)); app_indicator_set_title (indicator, g_get_application_name ()); g_object_set_qdata (G_OBJECT (indicator), core_quark (), core); return indicator; #else const char * icon_name = getIconName (); GtkStatusIcon * icon = gtk_status_icon_new_from_icon_name (icon_name); g_signal_connect (icon, "activate", G_CALLBACK (activated), NULL); g_signal_connect (icon, "popup-menu", G_CALLBACK (popup), NULL); g_object_set_qdata (G_OBJECT (icon), core_quark (), core); return icon; #endif } transmission-2.92/gtk/PaxHeaders.4960/open-dialog.c0000644000000000000000000000007412643535255017024 xustar0030 atime=1456201459.060219689 30 ctime=1457295921.103826675 transmission-2.92/gtk/open-dialog.c0000644000175000017500000003760212643535255020454 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2010-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: open-dialog.c 14666 2016-01-07 19:20:14Z mikedld $ */ #include #include #include #include #include /* tr_sys_path_is_same () */ #include "conf.h" #include "file-list.h" #include "hig.h" #include "open-dialog.h" #include "tr-prefs.h" #include "util.h" /* gtr_priority_combo_get_value () */ /**** ***** ****/ #define N_RECENT 4 static GSList* get_recent_destinations (void) { int i; GSList * list = NULL; for (i=0; inext) l->data = g_strdup (l->data); /* save the first N_RECENT directories */ for (l=list, i=0; l && (inext) { char key[64]; g_snprintf (key, sizeof (key), "recent-download-dir-%d", i + 1); gtr_pref_string_set (tr_quark_new(key, TR_BAD_SIZE), l->data); } gtr_pref_save (gtr_core_session (core)); /* cleanup */ g_slist_foreach (list, (GFunc)g_free, NULL); g_slist_free (list); } /**** ***** ****/ struct OpenData { TrCore * core; GtkWidget * file_list; GtkWidget * run_check; GtkWidget * trash_check; GtkWidget * priority_combo; GtkWidget * freespace_label; char * filename; char * downloadDir; tr_torrent * tor; tr_ctor * ctor; }; static void removeOldTorrent (struct OpenData * o) { if (o->tor) { gtr_file_list_clear (o->file_list); tr_torrentRemove (o->tor, FALSE, NULL); o->tor = NULL; } } static void addResponseCB (GtkDialog * dialog, gint response, gpointer gdata) { struct OpenData * o = gdata; if (o->tor) { if (response != GTK_RESPONSE_ACCEPT) { removeOldTorrent (o); } else { tr_torrentSetPriority (o->tor, gtr_priority_combo_get_value (GTK_COMBO_BOX (o->priority_combo))); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (o->run_check))) tr_torrentStart (o->tor); gtr_core_add_torrent (o->core, o->tor, FALSE); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (o->trash_check))) gtr_file_trash_or_remove (o->filename, NULL); save_recent_destination (o->core, o->downloadDir); } } tr_ctorFree (o->ctor); g_free (o->filename); g_free (o->downloadDir); g_free (o); gtk_widget_destroy (GTK_WIDGET (dialog)); } static void updateTorrent (struct OpenData * o) { const gboolean isLocalFile = tr_ctorGetSourceFile (o->ctor) != NULL; gtk_widget_set_sensitive (o->trash_check, isLocalFile); if (!o->tor) { gtr_file_list_clear (o->file_list); gtk_widget_set_sensitive (o->file_list, FALSE); } else { tr_torrentSetDownloadDir (o->tor, o->downloadDir); gtk_widget_set_sensitive (o->file_list, tr_torrentHasMetadata (o->tor)); gtr_file_list_set_torrent (o->file_list, tr_torrentId (o->tor)); tr_torrentVerify (o->tor, NULL, NULL); } } /** * When the source .torrent file is deleted * (such as, if it was a temp file that a web browser passed to us), * gtk invokes this callback and `filename' will be NULL. * The `filename' tests here are to prevent us from losing the current * metadata when that happens. */ static void sourceChanged (GtkFileChooserButton * b, gpointer gdata) { struct OpenData * o = gdata; char * filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (b)); /* maybe instantiate a torrent */ if (filename || !o->tor) { int err = 0; int new_file = 0; int duplicate_id = 0; tr_torrent * torrent; if (filename && (!o->filename || !tr_sys_path_is_same (filename, o->filename, NULL))) { g_free (o->filename); o->filename = g_strdup (filename); tr_ctorSetMetainfoFromFile (o->ctor, o->filename); new_file = 1; } tr_ctorSetDownloadDir (o->ctor, TR_FORCE, o->downloadDir); tr_ctorSetPaused (o->ctor, TR_FORCE, TRUE); tr_ctorSetDeleteSource (o->ctor, FALSE); if ((torrent = tr_torrentNew (o->ctor, &err, &duplicate_id))) { removeOldTorrent (o); o->tor = torrent; } else if (new_file) { tr_torrent * tor; if (duplicate_id) tor = gtr_core_find_torrent (o->core, duplicate_id); else tor = NULL; gtr_add_torrent_error_dialog (GTK_WIDGET (b), err, tor, o->filename); } updateTorrent (o); } g_free (filename); } static void downloadDirChanged (GtkFileChooserButton * b, gpointer gdata) { struct OpenData * data = gdata; char * fname = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (b)); if (fname && (!data->downloadDir || !tr_sys_path_is_same (fname, data->downloadDir, NULL))) { g_free (data->downloadDir); data->downloadDir = g_strdup (fname); updateTorrent (data); gtr_freespace_label_set_dir (data->freespace_label, data->downloadDir); } g_free (fname); } static void addTorrentFilters (GtkFileChooser * chooser) { GtkFileFilter * filter; filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Torrent files")); gtk_file_filter_add_pattern (filter, "*.torrent"); gtk_file_chooser_add_filter (chooser, filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("All files")); gtk_file_filter_add_pattern (filter, "*"); gtk_file_chooser_add_filter (chooser, filter); } /**** ***** ****/ GtkWidget* gtr_torrent_options_dialog_new (GtkWindow * parent, TrCore * core, tr_ctor * ctor) { const char * str; GtkWidget * w; GtkWidget * d; GtkGrid * grid; int row; GtkWidget * l; GtkWidget * source_chooser; struct OpenData * data; bool flag; GSList * list; GSList * walk; /* make the dialog */ d = gtk_dialog_new_with_buttons (_("Torrent Options"), parent, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_ACCEPT); gtk_dialog_set_alternative_button_order (GTK_DIALOG (d), GTK_RESPONSE_ACCEPT, GTK_RESPONSE_CANCEL, -1); if (!tr_ctorGetDownloadDir (ctor, TR_FORCE, &str)) g_assert_not_reached (); g_assert (str); data = g_new0 (struct OpenData, 1); data->core = core; data->ctor = ctor; data->filename = g_strdup (tr_ctorGetSourceFile (ctor)); data->downloadDir = g_strdup (str); data->file_list = gtr_file_list_new (core, 0); str = _("Mo_ve .torrent file to the trash"); data->trash_check = gtk_check_button_new_with_mnemonic (str); str = _("_Start when added"); data->run_check = gtk_check_button_new_with_mnemonic (str); w = data->priority_combo = gtr_priority_combo_new (); gtr_priority_combo_set_value (GTK_COMBO_BOX (w), TR_PRI_NORMAL); g_signal_connect (G_OBJECT (d), "response", G_CALLBACK (addResponseCB), data); row = 0; grid = GTK_GRID (gtk_grid_new ()); gtk_container_set_border_width (GTK_CONTAINER (grid), GUI_PAD_BIG); gtk_grid_set_row_spacing (grid, GUI_PAD); gtk_grid_set_column_spacing (grid, GUI_PAD_BIG); /* "torrent file" row */ l = gtk_label_new_with_mnemonic (_("_Torrent file:")); gtk_misc_set_alignment (GTK_MISC (l), 0.0f, 0.5f); gtk_grid_attach (grid, l, 0, row, 1, 1); w = gtk_file_chooser_button_new (_("Select Source File"), GTK_FILE_CHOOSER_ACTION_OPEN); source_chooser = w; gtk_widget_set_hexpand (w, TRUE); gtk_grid_attach_next_to (grid, w, l, GTK_POS_RIGHT, 1, 1); gtk_label_set_mnemonic_widget (GTK_LABEL (l), w); addTorrentFilters (GTK_FILE_CHOOSER (w)); g_signal_connect (w, "selection-changed", G_CALLBACK (sourceChanged), data); /* "destination folder" row */ row++; l = gtk_label_new_with_mnemonic (_("_Destination folder:")); gtk_misc_set_alignment (GTK_MISC (l), 0.0f, 0.5f); gtk_grid_attach (grid, l, 0, row, 1, 1); w = gtk_file_chooser_button_new (_("Select Destination Folder"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); if (!gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (w), data->downloadDir)) g_warning ("couldn't select '%s'", data->downloadDir); list = get_recent_destinations (); for (walk = list; walk; walk = walk->next) gtk_file_chooser_add_shortcut_folder (GTK_FILE_CHOOSER (w), walk->data, NULL); g_slist_free (list); gtk_grid_attach_next_to (grid, w, l, GTK_POS_RIGHT, 1, 1); gtk_label_set_mnemonic_widget (GTK_LABEL (l), w); g_signal_connect (w, "selection-changed", G_CALLBACK (downloadDirChanged), data); row++; l = data->freespace_label = gtr_freespace_label_new (core, data->downloadDir); gtk_widget_set_margin_bottom (l, GUI_PAD_BIG); gtk_misc_set_alignment (GTK_MISC (l), 1.0f, 0.5f); gtk_grid_attach (grid, l, 0, row, 2, 1); /* file list row */ row++; w = data->file_list; gtk_widget_set_vexpand (w, TRUE); gtk_widget_set_size_request (w, 466u, 300u); gtk_grid_attach (grid, w, 0, row, 2, 1); /* torrent priority row */ row++; l = gtk_label_new_with_mnemonic (_("Torrent _priority:")); gtk_misc_set_alignment (GTK_MISC (l), 0.0f, 0.5f); gtk_grid_attach (grid, l, 0, row, 1, 1); w = data->priority_combo; gtk_label_set_mnemonic_widget (GTK_LABEL (l), w); gtk_grid_attach_next_to (grid, w, l, GTK_POS_RIGHT, 1, 1); /* torrent priority row */ row++; w = data->run_check; if (!tr_ctorGetPaused (ctor, TR_FORCE, &flag)) g_assert_not_reached (); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), !flag); gtk_grid_attach (grid, w, 0, row, 2, 1); /* "trash .torrent file" row */ row++; w = data->trash_check; if (!tr_ctorGetDeleteSource (ctor, &flag)) g_assert_not_reached (); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), flag); gtk_grid_attach (grid, w, 0, row, 2, 1); /* trigger sourceChanged, either directly or indirectly, * so that it creates the tor/gtor objects */ w = source_chooser; if (data->filename) gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (w), data->filename); else sourceChanged (GTK_FILE_CHOOSER_BUTTON (w), data); gtr_dialog_set_content (GTK_DIALOG (d), GTK_WIDGET (grid)); w = gtk_dialog_get_widget_for_response (GTK_DIALOG (d), GTK_RESPONSE_ACCEPT); gtk_widget_grab_focus (w); return d; } /**** ***** ****/ static void onOpenDialogResponse (GtkDialog * dialog, int response, gpointer core) { char * folder; /* remember this folder the next time we use this dialog */ folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog)); gtr_pref_string_set (TR_KEY_open_dialog_dir, folder); g_free (folder); if (response == GTK_RESPONSE_ACCEPT) { GtkFileChooser * chooser = GTK_FILE_CHOOSER (dialog); GtkWidget * w = gtk_file_chooser_get_extra_widget (chooser); GtkToggleButton * tb = GTK_TOGGLE_BUTTON (w); const gboolean do_start = gtr_pref_flag_get (TR_KEY_start_added_torrents); const gboolean do_prompt = gtk_toggle_button_get_active (tb); const gboolean do_notify = FALSE; GSList * files = gtk_file_chooser_get_files (chooser); gtr_core_add_files (core, files, do_start, do_prompt, do_notify); g_slist_foreach (files, (GFunc)g_object_unref, NULL); g_slist_free (files); } gtk_widget_destroy (GTK_WIDGET (dialog)); } GtkWidget* gtr_torrent_open_from_file_dialog_new (GtkWindow * parent, TrCore * core) { GtkWidget * w; GtkWidget * c; const char * folder; w = gtk_file_chooser_dialog_new (_("Open a Torrent"), parent, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_alternative_button_order (GTK_DIALOG (w), GTK_RESPONSE_ACCEPT, GTK_RESPONSE_CANCEL, -1); gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (w), TRUE); addTorrentFilters (GTK_FILE_CHOOSER (w)); g_signal_connect (w, "response", G_CALLBACK (onOpenDialogResponse), core); if ((folder = gtr_pref_string_get (TR_KEY_open_dialog_dir))) gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (w), folder); c = gtk_check_button_new_with_mnemonic (_("Show _options dialog")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (c), gtr_pref_flag_get (TR_KEY_show_options_window)); gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (w), c); gtk_widget_show (c); return w; } /*** **** ***/ static void onOpenURLResponse (GtkDialog * dialog, int response, gpointer user_data) { bool handled = false; if (response == GTK_RESPONSE_ACCEPT) { GtkWidget * e = GTK_WIDGET (g_object_get_data (G_OBJECT (dialog), "url-entry")); char * url = g_strdup (gtk_entry_get_text (GTK_ENTRY (e))); g_strstrip (url); if (url) { handled = gtr_core_add_from_url (user_data, url); if (!handled) gtr_unrecognized_url_dialog (GTK_WIDGET (dialog), url); g_free (url); } } else if (response == GTK_RESPONSE_CANCEL) { handled = TRUE; } if (handled) gtk_widget_destroy (GTK_WIDGET (dialog)); } GtkWidget* gtr_torrent_open_from_url_dialog_new (GtkWindow * parent, TrCore * core) { guint row; GtkWidget * e; GtkWidget * t; GtkWidget * w; w = gtk_dialog_new_with_buttons (_("Open URL"), parent, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_alternative_button_order (GTK_DIALOG (w), GTK_RESPONSE_ACCEPT, GTK_RESPONSE_CANCEL, -1); g_signal_connect (w, "response", G_CALLBACK (onOpenURLResponse), core); row = 0; t = hig_workarea_create (); hig_workarea_add_section_title (t, &row, _("Open torrent from URL")); e = gtk_entry_new (); gtk_widget_set_size_request (e, 400, -1); gtr_paste_clipboard_url_into_entry (e); g_object_set_data (G_OBJECT (w), "url-entry", e); hig_workarea_add_row (t, &row, _("_URL"), e, NULL); gtr_dialog_set_content (GTK_DIALOG (w), t); if (gtk_entry_get_text_length (GTK_ENTRY (e)) == 0) gtk_widget_grab_focus (e); else gtk_widget_grab_focus (gtk_dialog_get_widget_for_response (GTK_DIALOG (w), GTK_RESPONSE_ACCEPT)); return w; } transmission-2.92/gtk/PaxHeaders.4960/file-list.h0000644000000000000000000000007412617356116016521 xustar0030 atime=1456201459.055219604 30 ctime=1457295920.919823546 transmission-2.92/gtk/file-list.h0000644000175000017500000000101512617356116020136 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: file-list.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef GTK_TORRENT_FILE_LIST_H #define GTK_TORRENT_FILE_LIST_H #include #include "tr-core.h" GtkWidget * gtr_file_list_new (TrCore *, int torrent_id); void gtr_file_list_clear (GtkWidget *); void gtr_file_list_set_torrent (GtkWidget *, int torrent_id); #endif transmission-2.92/gtk/PaxHeaders.4960/icons0000644000000000000000000000013212667111061015502 xustar0030 mtime=1457295921.449832558 30 atime=1457295921.207828443 30 ctime=1457295921.449832558 transmission-2.92/gtk/icons/0000755000175000017500000000000012667111061017204 5ustar00mikedldmikedld00000000000000transmission-2.92/gtk/icons/PaxHeaders.4960/hicolor_apps_16x16_transmission.svg0000644000000000000000000000007412617356116024454 xustar0030 atime=1456201459.070219859 30 ctime=1457295921.432832269 transmission-2.92/gtk/icons/hicolor_apps_16x16_transmission.svg0000644000175000017500000003325012617356116026077 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/gtk/icons/PaxHeaders.4960/hicolor_apps_16x16_transmission.png0000644000000000000000000000007312617356116024440 xustar0030 atime=1456201459.070219859 29 ctime=1457295921.36583113 transmission-2.92/gtk/icons/hicolor_apps_16x16_transmission.png0000644000175000017500000000132612617356116026063 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿaIDATx•íK“aƯ¹=o››†šþ ±ÆŒþQ‚”27Åo¾ê€…ï´ ƒF„ÎI$®¥PR@Do€®A²p/>ϳÝû (}kðÛ9Üç¾®û\`8{Ø jö16S£Œì‡ŠœÍP¥»Ÿï—@þݶ޷µ‰ÝHDü!¾²pw÷·Èf·¹_ïéáYžøÒÙ)H·|ˆ³ >Íb™HårYñãç7îã<³HÌz¸Ž^gƒsÄ»À"ìIBŠÞn¦Årê 9›%èîWê» `æd¦$]»yC¼|õB<|ô@Èþð<hAßÀ@ìjȼêǹv=r`àþßyo8d†bèî½¼?=}[ŒˆÕÕ”H§×E&“»ºD2µ"ææeO³U‘L&E"‘2¿%zH[c™–jx<ÈårðûýŸ˜D0Äv6‡ÌÆ&>l}ä¾½½ñx@¿²Û0 7LÒº,ˆ¦*¨Tª¨©q :<„7é4Ìý}¬¤ž ±±ÑhzL× (Š©uY¶ U!ƒj…L*hm=ŠŽŽNìKlàÖ5P,455¡P(@7tÔzj!µ´EÕP%16in>‰µµ×è …ø|qñ)¼^/­lBÞ7hƒºúÜs·Û`áÎÎZZZxàt:ñda+ÁgÊ’Ïç)¿ú:ßQ¯Ï—ˉ¹ûsrÈݲ†NÐÊÕª@±XD±TBCCmä;Œ`C×4„ÃýüqTEåz„ÊÕ¶-Ž!) à ªÕŠ¹´¼¤ú|^ÿÙä^¢×Êå2ÕòA-AÓ4þ˜º®Aj8!v&4Oûâ?iÿžA¬bñ¥[IEND®B`‚transmission-2.92/gtk/icons/PaxHeaders.4960/turtle-grey.png0000644000000000000000000000007412662752033020562 xustar0030 atime=1456201459.074219927 30 ctime=1457295921.422832099 transmission-2.92/gtk/icons/turtle-grey.png0000644000175000017500000000055112662752033022203 0ustar00mikedldmikedld00000000000000‰PNG  IHDR/Ä<ðsBIT|dˆ IDAT8Ý“?K†PÆ÷úß«÷ŠNîn~„¦°]‚—Þ©Á©-pð«HŸ!‚–Fiwjë;(z Q³!z!賜{xøñ<\ á”"'uûCY–ÏTU½¡”Æ{ï’$­ˆ¸;”ÒØ²¬Î9rÎÑq4 £ÚÞm=v E‰…OŒ±˜1¶mc cGÛ¶+]×B4M³Zo[¦” Ïó^5M㊢!d¦Çú¾‡a€”Rð}ÿ¡mÛ‹9¢-ëºw–eqMÓf³e&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gtk/icons ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx-pthread.m4 \ $(top_srcdir)/m4/glib-gettext.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(noinst_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTO_CFLAGS = @CRYPTO_CFLAGS@ CRYPTO_LIBS = @CRYPTO_LIBS@ CRYPTO_PKG = @CRYPTO_PKG@ CURL_MINIMUM = @CURL_MINIMUM@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYASSL_CFLAGS = @CYASSL_CFLAGS@ CYASSL_LIBS = @CYASSL_LIBS@ CYASSL_MINIMUM = @CYASSL_MINIMUM@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DHT_CFLAGS = @DHT_CFLAGS@ DHT_LIBS = @DHT_LIBS@ DHT_LIBS_QT = @DHT_LIBS_QT@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_MINIMUM = @GIO_MINIMUM@ GLIB_MINIMUM = @GLIB_MINIMUM@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MINIMUM = @GTK_MINIMUM@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAPPINDICATOR_CFLAGS = @LIBAPPINDICATOR_CFLAGS@ LIBAPPINDICATOR_LIBS = @LIBAPPINDICATOR_LIBS@ LIBAPPINDICATOR_MINIMUM = @LIBAPPINDICATOR_MINIMUM@ LIBB64_CFLAGS = @LIBB64_CFLAGS@ LIBB64_LIBS = @LIBB64_LIBS@ LIBB64_LIBS_QT = @LIBB64_LIBS_QT@ LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ LIBEVENT_CFLAGS = @LIBEVENT_CFLAGS@ LIBEVENT_LIBS = @LIBEVENT_LIBS@ LIBEVENT_MINIMUM = @LIBEVENT_MINIMUM@ LIBM = @LIBM@ LIBNATPMP_CFLAGS = @LIBNATPMP_CFLAGS@ LIBNATPMP_LIBS = @LIBNATPMP_LIBS@ LIBNATPMP_LIBS_QT = @LIBNATPMP_LIBS_QT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LIBUPNP_LIBS_QT = @LIBUPNP_LIBS_QT@ LIBUTP_CFLAGS = @LIBUTP_CFLAGS@ LIBUTP_LIBS = @LIBUTP_LIBS@ LIBUTP_LIBS_QT = @LIBUTP_LIBS_QT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENSSL_CFLAGS = @OPENSSL_CFLAGS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OPENSSL_MINIMUM = @OPENSSL_MINIMUM@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PEERID_PREFIX = @PEERID_PREFIX@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POLARSSL_MINIMUM = @POLARSSL_MINIMUM@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SYSTEMD_DAEMON_CFLAGS = @SYSTEMD_DAEMON_CFLAGS@ SYSTEMD_DAEMON_LIBS = @SYSTEMD_DAEMON_LIBS@ USERAGENT_PREFIX = @USERAGENT_PREFIX@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ WOLFSSL_CFLAGS = @WOLFSSL_CFLAGS@ WOLFSSL_LIBS = @WOLFSSL_LIBS@ XGETTEXT = @XGETTEXT@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ ZLIB_MINIMUM = @ZLIB_MINIMUM@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ transmissionlocaledir = @transmissionlocaledir@ NULL = public_icons_themes = \ hicolor \ $(NULL) public_icons = \ hicolor_apps_16x16_transmission.png \ hicolor_apps_22x22_transmission.png \ hicolor_apps_24x24_transmission.png \ hicolor_apps_32x32_transmission.png \ hicolor_apps_48x48_transmission.png \ hicolor_apps_256x256_transmission.png \ hicolor_apps_scalable_transmission.svg \ $(NULL) private_icons = \ $(NULL) noinst_DATA = \ lock.png \ ratio.png \ turtle-blue.png \ turtle-grey.png \ utilities.png \ hicolor_apps_16x16_transmission.svg \ hicolor_apps_22x22_transmission.svg \ hicolor_apps_32x32_transmission.svg \ transmission.svg \ $(NULL) EXTRA_DIST = \ $(public_icons) \ $(private_icons) \ $(noinst_DATA) \ $(NULL) ############################################################################### gtk_update_icon_cache = gtk-update-icon-cache -f -t all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gtk/icons/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gtk/icons/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-data-local install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-local .PRECIOUS: Makefile update-icon-cache: @-if test -z "$(DESTDIR)"; then \ echo "Updating Gtk icon cache."; \ for theme in $(public_icons_themes); do \ $(gtk_update_icon_cache) $(datadir)/icons/$$theme; \ done; \ else \ echo "*** Icon cache not updated. After (un)install, run this:"; \ for theme in $(public_icons_themes); do \ echo "*** $(gtk_update_icon_cache) $(datadir)/icons/$$theme"; \ done; \ fi install-icons: for icon in $(public_icons); do \ THEME=`echo $$icon | cut -d_ -f1`; \ CONTEXT=`echo $$icon | cut -d_ -f2`; \ SIZE=`echo $$icon | cut -d_ -f3`; \ ICONFILE=`echo $$icon | cut -d_ -f4`; \ mkdir -p $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT; \ $(INSTALL_DATA) $(srcdir)/$$icon $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \ done; \ for icon in $(private_icons); do \ THEME=`echo $$icon | cut -d_ -f1`; \ CONTEXT=`echo $$icon | cut -d_ -f2`; \ SIZE=`echo $$icon | cut -d_ -f3`; \ ICONFILE=`echo $$icon | cut -d_ -f4`; \ mkdir -p $(DESTDIR)$(pkgdatadir)/icons/$$THEME/$$SIZE/$$CONTEXT; \ $(INSTALL_DATA) $(srcdir)/$$icon $(DESTDIR)$(pkgdatadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \ done uninstall-icons: -for icon in $(public_icons); do \ THEME=`echo $$icon | cut -d_ -f1`; \ CONTEXT=`echo $$icon | cut -d_ -f2`; \ SIZE=`echo $$icon | cut -d_ -f3`; \ ICONFILE=`echo $$icon | cut -d_ -f4`; \ rm -f $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \ done; \ for icon in $(private_icons); do \ THEME=`echo $$icon | cut -d_ -f1`; \ CONTEXT=`echo $$icon | cut -d_ -f2`; \ SIZE=`echo $$icon | cut -d_ -f3`; \ ICONFILE=`echo $$icon | cut -d_ -f4`; \ rm -f $(DESTDIR)$(pkgdatadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \ done install-data-local: install-icons update-icon-cache uninstall-local: uninstall-icons update-icon-cache # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: transmission-2.92/gtk/icons/PaxHeaders.4960/hicolor_apps_48x48_transmission.png0000644000000000000000000000007412617356116024453 xustar0030 atime=1456201459.072219893 30 ctime=1457295921.387831504 transmission-2.92/gtk/icons/hicolor_apps_48x48_transmission.png0000644000175000017500000000572612617356116026105 0ustar00mikedldmikedld00000000000000‰PNG  IHDR00Wù‡ IDATx^íXilå~fvÖ»ë]Ûñ}ÆIL|$ØI›Ò! mQB!¢EB**­ú3=¨ jùSHhJh‚Z©´B´€ú£ýA¸Ò$ji;8Á!vâ8>÷ðúZ{wg¾>zµí®wm§ Šúj}ß|óÍ7ïyÌâÿ”†_ýúù}»_x6öüž_ªdpmê…½Ï=EàfbÞ[ûqÙ¨t<çv«ÝÏÿB}xâˆúWûqâ„ࣶãêÝ£“{OËÞ™8øyöñƒd‰×w˜óÜtˆ¿Wu}ü½¥KÕ™GQ>ªº{lþÉõß¼´WŽ…U  ü‚`(ÀµQ±Ä;Û·g|–gÊÙïTW[‡5m‚ýŒÀ\ÐfC0”¦=qÿ’%ÞÕ«V¡nÃTq,mi™Â††(þ,“°–iBƒ ëë3>[µzµœ½¦¥Eûê¢E¹~Œ¹in ¸9ñ+­­êS@uFV+,T/ïQE£Q599™®‰þêpÌv†¼£kíZuˆ˜ º0®qešV/5;ÔØˆŸWtQ«]ñx z M×Å n·;N§$ôÎ|NκÂg®ååaxùr\㚦ÌCav*°¬ÃgOŸþNy}½ÇÝР¹¼^a š†dšäõ¸CG4Åôô4’Éãö@Æ‘KFSH)D#LONbddļxqJvc>tpžx ØÄñâØ`h?KÇsyy±—îS#áºÚÓ‚±q bõÏô,Ïíç¹Ïë ÌœÜDìÙ³§âÐáý‘¾þ^Õq¶=ƒC"› }œ“›,ÓS&B#¡Œáó 7™LËTáðÂ#©åÚCÓD(ƒ1Á`ð‹!€e)øƒŒ„Ã)ðü_Lq™Èd$¡PŸ˜j;ýMMa4lT92“«––fLMM!"‘ˆŒmmí Ù)MÒ”~\YÚnsú¶sçÎÙ7hÖ·\÷V×jž\¯5ŒŽ­LË‚Rµ.€®é¨©­’=Ùh``ÍVlBöÁÁÊžÇâ¦)……Ð݆ýþc°ô­¢ÿµ†‡‡²Š’Wׯ»C øýäËÏŸ?/É—"¤:WÕTȽltìèñ4IÜÀåÊAÍÂ,Z¼UÕ5ˆÇÍ»‚##OHK6 JÏnÑÒÒÒeÛ[R\ ÿð®÷]G#û¡{îÙ$î¢Tê³Ô‚¡!ÌFO>ùy6‰äœ¾¾>¼õö›ÈÏÏG.QRZÖ;ç@Cv”n®)).ANN ɱ±1üð?‚Ïç—I }v,d¢X,‡a ººéTSSƒéè4NŸnƒ‚BiI).]º´áÏo¼¥Ù™Ô¹Y 3ÖVÓœº|5(¾¸J,PYY‰ªª*{$PQQpxTüšf ÌH%%%Ñ|{³Äø+,*]±në[+Á•M£á¬µuK–°³œ’³¡¾A¬Aˆ–£+==È>_^Fp­·Ù¨¶¶VFú¿¸UAA\š±Qø¼Atú¢×á0šëë1>1Ó´ÐØÔ$ŒfCÏ5ay>_Fp¹» ÙÈår‰UcѦ§¦ƒephƉd£ÍWp¬X±|Enn®›AŒ8}W׺ºº¬ÌKöCÓfw¡®Ïº0 É;è†TÚ…©â{õõ7*€¬{|y«*ÊËY”¦¡alaMmV®ö\…+ljQֈѱñ„¹&J&#ÍâF‹K¥„Gs•0œF k„ç†-ãt¶ÖÕ-Å8Û`ÓŠ‹,(VAÓ¤ø¤ÐÕÕ §a`h8€žžë6®^íµç¼á3Õ†™Í †SY(/+‡×ëÃtd PR[<­­-+„× BY0œ9Îæ††F‚ºPœY¡–T^±† 2 Â\¸pžÁÅà°9—.¥WcÞ‹cÈ …é¡5kä¼40pJ)±ZqqüCþ þAÄçe¯×ë¦6›–Þ¶”¥¿_´NÍ$^b L3míí´€fܹópöìù|rñSXÜç `ÝÝÝY]‘–Id-ÆYwJKÊ`¸œk8æcqŸæææåF/ß%½¼$O“ÑdÍËvB¬rîÜ9¬\ÙŒÛêfë…äC°ÿ:>¹pA2µ,Já¹b!Îå•ÒoÅhѪªjP™­ÙYÏœB}­Å%۵]TX$sBºMº8MÓ‰LÑÌÃ0¨ÁþAô÷eFÀ¢†]´ÆEÑ6ýT”C…ØV(gòÈ¡«Aó2Ð*µMMMå™â@Ïd—Ûõ¥òÒrqŸ¸iQ€8xí.º®áÀ(b\6a QT\È5àñ枌È%òó Ä,RÂxKK Ž9bÿwD°ªW¤E<¹¹b%Ö­²¦rƒÍïÐbF û 3¯[V\§l“sÄã'Oþ›7o&ã”3g‡˜&ýÃìð1‰ ˆÖ器»w/:::°mÛ¶”(+-“Zࢵ”²À¦·k]¦8ÐÓ˜×Y¼ÜÌ@ô=DÙ\†ƒš.FÙ‚”••âÍ7ÿ„}û^D÷åËèd CRtFÂÈí§Náîw¡³³»ví²•“€-…=TÜ´¦f!×rVpÎåBzSsÓ2)ÇŽ¤{dACa¶o߆ö¶“ذn.œ9ƒ¡Á!v–1ÃL­Ÿò;¢„.wôè‡xå•ÃTJ¡S„>-o P]½Pz"Æê–ÔqÍhàšKGaA~kA~¢Ì\ÐÄs}šŒ½Œ?¼ö{Œ3sõ^éB˜ã5ö>ã¡ Ø÷ß{Ë–-KJ¿VdMB¦¥½ŽD&…‡|žMúÖ¯_»íFY\Èp¹Ü+ËÊK™Âbb^KAL;_Ú¸ñ+ho?‰‡|ýl/¾ÿ½ïâãÛqÿý_OhÛJ‚™ RÕ- æv¹Å‹ ‹QPèÛ d©:AWs6WSzpÁˬrælˆ$+¤¸Œ‰AÜá™g~ާžþ©d&jIõAãbŠPÉ.dÐ÷$Z?<úwmËæÍFUuU”mµ&m¯îÐØ>€%Þª”/æµâq‹K?£â¢±¸ŠrTÊRÊ„²ÀÑRàŒs(ðRqŒ›&(¼ŠLr›e)é‡LSqM±úóŸOºpá¼–NÏ-˜¦uƲ¬Ëë)4·Ä*ü~ßÌ˯t•n)¯Àí[·ÅÈèÈ?¶-°{ÏîMª*šMÿŒÁÓ™LænøÊ‹RP%ÙØØè濤fPþðêêêÚLD¸wï.fÓ3ðûÊ×»®ü8‘phý¢±H@’¤öH¤IÓNÌ ŸÖþ¸õ;~[ÀÐðvêä癩ÉI½õéV'Ú£±ÈÆCzfWë5" ˆ³º¦÷(Š2úÚë¯n×5 ÇO|2›×óûT§š$P»b~ìûK;Bˆõ~*Ú(èÍÑî¡á¯ÄÀgŸÚ;›£ÝÅ image/svg+xml transmission-2.92/gtk/icons/PaxHeaders.4960/hicolor_apps_22x22_transmission.png0000644000000000000000000000007412617356116024433 xustar0030 atime=1456201459.070219859 30 ctime=1457295921.371831232 transmission-2.92/gtk/icons/hicolor_apps_22x22_transmission.png0000644000175000017500000000224312617356116026054 0ustar00mikedldmikedld00000000000000‰PNG  IHDRÄ´l;jIDATxÚ¥”_lKQÇ¿÷_o«k·µ5­µÂ6&62A‚„ˆHH¼H¼ ^x A  *ltã$"ˆa³Íbm{×{×^¿s²6¼p¶Oî·§ç~z~¿{r1kÖ¬ {ÙûEñë!›-žf§Õª>qØ OrX^¯ªÝÙkö §=À´lWñà}óðáf¤ª*ÃÛE‹Ìc'š‰D·©iqžïΟßgMcQ‘yhú«xÐv0Ïgqœ¨9´ÏL¥R žwþ²æAÕ>ø«˜Ê™L šéj¤ÙJlßµÝüðñÙúâ¹Éò '{ mèÉn`ÜßÄæ-šW°`Áoš [6š÷Þ3¯„.š,³¹,\rˆÈÎ|ûBg^NX1¤Ï¢„pšx\CôGß:Á²(#œFÌotO›Óé¬ÌvÉ™ Ëù0…#£F–©”Å¡: çd2‰žžžú ÑÏÞ ­“‰?¾—´·¿< 8íËì8éš™““£²›ê QW[‡zÊ1Ú¥ „Èó•«!OqúÔ<|ø !+rQ8.ýM¬Ú¬î|7ûuô/èK—.ãòå+¨Z²”Ê#?/Þx®Z¼.\DMM U”@ŒæœÎ\乓[,ÊHOÿþÐ4 “&MBAAòHÖÚÚŠÎÎïøòµѨÆ2ŸSÀ T”—#‰Âí·ÍÚo|q(²Š²<¬€ÄŠEF9-¶Ûí Öàqc#:»ºpóÎ]ܧ²Y~ÖÔ„ô9jDEF>U+ÉÒhr‰±ÇãqI‚4ØíqÓÎe^²aèüa½jo§Ï^4?Ž–Ö6žÛZZ J’©|^œ‰]Di8GFì øÆ¨ªUIè:tÃ@wwsæÌµ†ä^¿}‹öW¯‚>AëÒ…¸ìÂBÒY´ËA$\Úš4 Ûdbšd23×ÍDÌ8’¥.‡Ãùÿ{/üohE¢eYM!D«^¯?èv»¥”ïúýþ§•‰–e5=Ï;ñ}_-àû¾ò<ïIJ¬fÞ_Ê Bˆ–ëºAÚ¶½gÛö^‡®ën!Z+8Ž#¥”J± ì;Bˆ])¥rGæýÆŠ¼oýËðçµwõÍ×ÛÕÏ÷«z¡ù|˜ðrøøl*P~³]={{LÔ="^‘Ì®I¦ƒìŒ0=åý«ç¼Ø®Q~„J»7'ì_}ýF2¾"ž\ß HÆCâéMëÐîÍ*Ez£f’Î.På^lê¡Qª„·G¤wÆÌgã81¾š ð{Æ¥%¶{s6OOY;ë@’F?I¢T§0üq¼h@a@£f¢k*÷BJé•Ì”Iœ(R­LÖ 8@P[×1rO,Nárô%o_º…uàaÆŠ¿ÿÉBŒ—Lp«¨U10ɘ_ÑÀ–o0/)IEND®B`‚transmission-2.92/gtk/icons/PaxHeaders.4960/hicolor_apps_32x32_transmission.svg0000644000000000000000000000007412617356116024450 xustar0030 atime=1456201459.071219876 30 ctime=1457295921.443832456 transmission-2.92/gtk/icons/hicolor_apps_32x32_transmission.svg0000644000175000017500000004221512617356116026074 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/gtk/icons/PaxHeaders.4960/turtle-blue.png0000644000000000000000000000007412662752033020543 xustar0030 atime=1456201459.074219927 30 ctime=1457295921.416831997 transmission-2.92/gtk/icons/turtle-blue.png0000644000175000017500000000053512662752033022166 0ustar00mikedldmikedld00000000000000‰PNG  IHDR/Ä<ðsBIT|dˆIDAT8Í“±jÂP†¿ãAAHÔÁ×Èd¨S ]º¹Jõ\û î:8Á7èRÁ‚ˆYœ:gêÖÝM ÷vˆb¬-µ%…þã9ç~—ó]®cÈ2¹Li´¾ð}.Eð´f¾Zñò±/"¤µÉW}϶)…` Ä1AÒù1Ð÷ñJ%æ–…£ˆ€ÖǰÙ,t Ú¶Í(Ž –ËÃ%'Àz·\æ5ŸÇ±,Èí,“@·Û,JA¥ÂÓdÂõþü‰C×e\(àØö¶1P«5›<¶ZD»r”žùlå«Á€Û0ä^両5T«<÷ûÜog;ìvy(¹éõ§ëÃ!³íõš`:M¼ýÊ¿Íÿÿ)™ßÜYf–|¿Q­IEND®B`‚transmission-2.92/gtk/icons/PaxHeaders.4960/hicolor_apps_256x256_transmission.png0000644000000000000000000000007412617356116024615 xustar0030 atime=1456201459.071219876 30 ctime=1457295921.393831606 transmission-2.92/gtk/icons/hicolor_apps_256x256_transmission.png0000644000175000017500000006515612617356116026252 0ustar00mikedldmikedld00000000000000‰PNG  IHDR\r¨fj5IDATxìØ± AEÑQ¬Ã&&5‘°`S ¨¢ˆZéXÆ‚ÿ<8 7ø- ÅŸ?@Xµ²3³e«;3KRà°HÒÌÌ  `ž €}ÓׇÓ~<Þ—ñúÞgñüÜÆùzÓn;ù“{ÖbÙQEWÕ9ç¾ú¾z¦'ŽL2éIÒy d4 "DÑK@@#êW@PgÕ/ˆ?B¿üòGAâœI„ü F j”ˆÉL™Ñt¦ßwºï©*÷âì¢Ë‹€ äŽíÙ°X{ïªâö9sתšº' ·u41 üúú½ØØØÀƃ‹?ûüùóX]½Ã¡‰M,4ʲ´)ËÖ[eÙŒÊò̬,ß%8?-ËG_yí°?Âx´ŒÑp¼ŒG5®ÿñê{®—å“òw½ß—å»MYnÎÉß¼V•åé­²î”eWž£ç2¸í£‰ÿi46Oƒ`E°6înY{6—žú™pnLßÖõ!Œ¤7²KɲsáG‚íp}k ívKÝl¶Myïá*ÁW¿µa VË:‚L`¡ÎžfzåʡО¶ ì ï8cv„™ïIo¿¶½¿¶ üùïÀõM`se29@Ü;ôãÀà,°2T/Y{_x¨ <öak0ÆäQšFa@ŽÙ´–ÑVßo€,ŠÕZ‹(â\YÙ«keJ¶ÊÆÚcñ+¬öLÂ6ŠA0 …sØ•~»ÕA·³„<_”xT³ í¢…¡Ñ™¢ÀеXÒg†÷µ˜É‰°½ö½ÖˆµÎa0wì+;í º²îÂ’÷Nq¾µðºæƒzº˜¿=ƒØ^}Ûû_¼&õp2yM4ðo>ÿ4ðÀYö¾å>&Bÿ¸Q¸™ =Kê<ö˜ sGduìÅq²!dÅͰ̣!èH‰)aŠàÀ9øÃCüm6C‘·Ðñeº~gZí6†ã1–{=¬JÞç;Г Å Ý9¡ â¯k0' ©Ô2t¾ ÉÈ3™ãéWÔcš{æ@[êÇ``Í<̱+WþºkÌ·¼ÿùUàåç7å¶; ‰ÆDôÙç€Gï±ö³"ø/[ ¨…l ˆ– 9S.L[ÈYç9K¦ˆÉ*næQü ë8XSì*ü8F°ö*á÷÷öÐÞÚ‚÷DÅá…DsÖé sÇXZ^Fi â@‘Þ$S˜<^Uäz­ìë˜#+8æ•ÝÑkyöŠ9M@Ç«ªóŠÚ 9̸Ž,¨ïïj‡pqlÌÅ{êÓ›o½ðÂwïýO~¼Þ˜Áÿ¡ðvúCÖ~õIk¿–cŠ4 ½­'Ež×c*ì¼ÕÅJΊ–h·kæ….¹¡¹FÂHLcˆžÁÞüŽîõK]ÉîߺyëÙ($šÀ‚â8yî\„ßZ[CwÖ"|/ì1'$wdš€ ÒùN1£aßò4‚#eâ(„»ï áÙ;yöÀ7^|ñÛßsî‡b3 ‰ü¤ïø_ʲO³ö¹ÜÚa›Âçå/³]h!âí¨ÐyÄ%g*r²¦Ð‰ùœG‘+(ìDôÉ @Ù˜Q]Ǭ;¦©*ä øÍö¶îÀ4» ‹@[Öï#_^F¶²‚BÌ€ïÏÆgKCŸ+ë0·ó³V3 à™ÿ³ b„þ˜kHç8YÇz&9a&ë‰#ç(~L½Ç!qïYïðc¾ñjY~~s2y¹1€ß,ŠçFÀ3{—Vy¢CÑ (øo×…m§ƒ\`†"Ovzæ†LH ØSÁ3b'@°ž}""U$Æ9~±ë»‡½=ðó{2Îåœû‡næ°¦>ýôz dbëäƒÏ<é3!2ÅŸYÍ Fr@4…(~áˆ0‰a2w‚êÖ-8š€Ì;’õ‡ÎáÀ{ï OÇŒùåëeùôµÉäGœÀè¿ôÒý£,{†»ûXD´,Âí º*úB8ëõjÁ+†L‘+(êTð主§âE¯@™‘€÷HEA6*h­ëULA €óýB €ÂÈ8{úØ›?å°Ö0jp }Öš“;­Í€L#H9ž tç"v!F@1'uGPÉ\šÂ-ᩬ٭*Üä¯+Þãœ1ß¾,úÈd2m àûŸúÄSçF++[²ƒDì§§]AÁÝ‹"—Ü*ÿKѧbgEÎ<=ò&ÿße/Îaç‘ãܺŸîˆš³ï«Š;]ü2K>ÃZï)(¿ ‚žN(6'ð<ð’{$&Àš1ÿ®ñÙYGŽ‘®ƒäüwMBŒ;ƒÕÓA& ‡Ä2¹8AKÐä4™{Xßœzï}ëŸÄêêåƒ76øË—/ÛK_¿´þȃ}æ‹—¾ð•ýݽ3¯Tů~Þ`€Ápˆž¿-à‘ÕPüÉÌù–< AA –¨ªZ#€c#PæZSÑ«ð䊞p®î)œÔ±ü¢ò€ƒ}ý"„wú ŸgÀÏwáý}ø¸V Ü]ù>CžGÁë;HÞ‰€ÌP>6IáÀD:9éÏ›ä?Ø»ÖÉŽêüÕ}tÏÌÎŒ_û0°‹±cl³ƒB‡qD2HQHB„Bþ!Œ’QE Ž,EäO(‰P‰<,„D@œMÌ3ƒq¼¯½¶÷1»óèî{oUÜ{tö¨TšNkĺ{fSŸõ¹êöíÛÓ}÷ž¯N:UE¡Pä94y*Ï9^CÝ¿£ˆºx*®ëN­¯³|Μc‘ø™ß|ûgÞø–;qúôÙÿ{C ÀÇ,Â*ÈñušoÀï7y΂Î9-Q–*ìD„¢­ªâû k±ÿÜxãÍ8tpøs7¾úÆ/\ÿê›N}ýáëÓ?|ú{IvAËÿÉ¿þä'ï¼óëÚk¯E¿×ã¾²­Ùmd·Ð~&?(u­$·îaÿ60z9Vêq–1MXo¹e뉀Ö5~éð°V3¢ÙØàþk–±ЖÙ,†™YV€œãïã67ÑO’@$‚z䳯‰€–Üú ƒ{^ÏÇ*áçeânAÒŒ‹®,ኂÀì²,¯¾òjû½Ç¾½^¶g~ñ»_í?üó?úè%ØÁø£{ï=ð¦[ny÷ýû1?7/φ…'/cê¶iPW û +D”ãRŽ¡;?ÌQ©­\Üâ CD]-ÁYË™pMÀêú±M£Y‚3˜  Y}Ü¢J~B3Àjk5÷AïÓ„{0Î )ãaCmñ¥d± [~€ßüóàîXÉp€r0ÜÀúÆ: ^^\ ¯º>ûá?ºûqàדì`Uu{c›|0€]ÅÌ ©¬¯¯a¸¹‰¹Á#" IÚnØÚs‹#“P`ŒºzhàQ=výA‹7öáZ³pDÀwÆßñb -MÐ ár†A@6¤ÍMÔl¿Ï÷+±ÿûÇ߃¸ÅE I}MºkˆÄÁ @L8ÁZî²0»:§u0†Ì"Gc›·ag# À™3«ù… kXë‚RN‚tŒF5ªÑà ú(³Lóú ˆƒu¡qÇnþÿ]ßÅ &°GÆà[r"KËf8ä—D´˜3'FÔgÛUÃ!{UÙv~säÄõÐØõõ¸Í=“ŽLp/e$F½Î è iàdRRQä-KýþÎ9ÎØX˜$;à †CþGγ\ûȽ²€!ð:ê@Sˆ…Æ èñøþ¾ÖÇz,*±[:)Ц©À®3.ç¸ëb [æ¬@α(U·QY³'al ô†"Ï Ž0âã 0T(d¢Q'®:ó°,ûX˜_€€à‚[ð`‡# À`00kë°Ö ñH”܃®KP55 k¹¥ªAÀu.ÆÎØÂXͤ׀qÃ[[‹@ˆñ‚Î…g÷´’®‹q™¡Àð ä@÷ýŠ… ‹šÉŒ©‡—ñ¹ø˜‹ð8> BǺ¥ëp9ªFØØÜÐÏòÎc½=^_[O°Ó±¾>0§_<§žú1æ!À Ï¿€óçWÑsŽ©Ð\ìB÷xƒÕ26Þí9&¯ €ú⤠¢Ø1Ï„ÀZTY†Rïéd„FîÄ÷)¶yM$:zo›@ž}ö$¾ÿØ÷ÃkÙøWW/$ØáèÜ4söÜ9;zE™C€sgÏam}{ý‡¶ò0˜Ð8'aûï™ü¹ÎëC*ßÙ£sNžú(ýKz®Qµ"ªÌöŒ?þüm½?:¿ÏÕ{ë8)O?ÿ<ž|òGPÀ ª*¬o®#K°³ÑT6kê’L¹œí«ì•€É ‹ItŒV¢í¶Z° a™,J66g¥¦Y òßgº(Æ ˜ÌOøùS€zò<¨äE^¯yµ잫~‘§Uw2œéÔz°9Ï™—‘Éšƒ @téŒeCt©¨æ‡'Nž ½óº8‡Ó{y‰~#0†/Ý¿™ ˜ÉПŒr`4a°1`ÑÛáH€“ˆîêêjD¿ßc5ßÜØ@ÝXuõ„ s‰Z“— ·RÄ€® 0‹T`ç¹  ÉU.0&ÃÜ X6øÕs«¨ëUU³û?U°Öý$;D´n-+5 Ày^>« ⬡ËxyÔ¢ÐÎXUT° @K7`·ß5\WQÝÅà‚.À©S§@‹‹šT–<0XÇÎFêôyhs8Z›[XÀË^~m·s ––Q”~X•nR¿»ç  ºâÓ¤µ–Ù°G ´¾›ï-ŒA¿ßÇ•W^—¿âeØß>C£ª†õî’ìp,//ëjô‡=ñC_Y‹ƒ¯<ˆ×~ ßz ®Þ{MÐRíNêƒê,\GÏåLhmOØí÷”évÛ®½þ·â¦Ÿ~5®Ù{5žk‡;yÂ{ÿçIv®^ZúøÙÕó¿ôð‘o¾øõ‡Á‰“ÏÁ GÙë]6kc\K;#6娸»».Þ\Õ¨ÆOü>ô5<öƒ=@õð¶}ËËO%Ø%Ø·´ôo«ÏŸ:tüè‰_ýÚ׎|þ_¿ôàæÿ=¿» ?ô40+r ¿ËEµ‰îïù¾øÏ_:ö­o~÷ÞÏœ9|åÂüJëYžÃîBZìàÁƒ5€û„ÀéÓrÆüEKͬ+â v¶«æ˜§±ŠL9X½O·þ ƒc¶Îd˜<ü(¥P>ùäí >‚²Àå…´*ðÉâµ1(ezhÖÒ„SH¥ ¢€’Î}O~Р±5<V s¶Ï×àz@2F¿r•d2r—¦iF¸üàd¯wß~ïÉ•¥©ò¹<åEðžIÑ\ôh"ÊØœu}ÏK,ìÁX Îpn&à¼C]Õ øû¼Ä€™4¿¢elðÈ2NçÖctpbü£¦Á€[O¶2æÇß úÁJ€Ëßüæç/9rwžeÍŠ‚g­5-{ a.4"¦e<§œÆ¼ñ(ÆŠÁ¸sDƒBzÏßÛÙ¦>öäfâÔM E%|<Ùš'u|~K×R¿N-3YÜE‡(eBUMÄ cCc0PÅË'zïå»CPê ºãŽ?{ò;ßy຦ùÛ¹<¿­ >ËŽyŽÒ]($1£}#6“¦¤Ž€ø½ãf°éßq-sYèÒÊbD4hš¦ed9¯¸›…nŒÊk,Œ5py=¬c²ORÆ[§Q°¯B° ±î0숸´2‚·%×¥t-7Ï=Nô{7¯¬<ËioÀ¥7¼á¿?{ÿýoú…¥¥·^åýo÷ùå’7ñd`-qàsÙÅRZ..;ÈCÏD\òm CK/ÆçPÖ5Šª‚³NrÓ ÞÏ"`¹ `ÊÅâ"ʹ9N¹ž“ûþv ê˜|BAÔß/ÂÆ.îe ñÀà%S‘\7m:Ê9¾ŽÈ‰>}ʹOXYùæÍ¸Ü‘@ѺyÀ}ƒ–9²÷@U½åJ¢öysže,]™bÉë²Ý73†LʰC6fU nåccˆV»µ€Acn…M†Ù”ÉzüT@YrÙ‡†oÐäU†™Ò‡ôžéºRŒWŽÁÆÔmð^{w,À/œóþož޼~eeóf/3ÄõwÜqÀçê–_¿ÿþ«~ª,o^n_~¥4æÎ<Ëru¿…ÖA’iB×X^cŒq™M$âld-*ï$èyÌ&è,¼_-ßkàï•ÇF/uŠºK^êÑsÉF»•¡óy+‹Š„¢ÖÆÈ˜/ ŒùòYç¾½pìèq|üÃ÷ ®e¥`1R&7 ƒ9øÊhщy: À^C2ÿi# @B]ª«ZÖ¬QU#TÝqݲ±"Ò-`z6Œ½)"O`‚7 Þ…K‰@iMÀY!y oÎ9UlØyQ Ï3dY®C€Šx½=Oˆ…€œ º[®Ö“g9 2ˆ L ÉH¨*Àq+O`¨F˜¨ZÖ5{°M£‹‡º`AÏ%EÁB.Cò{Æx:Š0m$$HèË2â†àéâ&5Çj.kðkÖ²PxÈBœ€À0õ?]ŸPÎ Bq00üY©0e$HèQψ»hKm­ÇØøØŽNw†Æ€ÐøÙÐ5{0“ÒdšZÌ„_Ï Ö  !Ë ò¼>˜Øc!à:S»L(ŒfnÁ0Ÿ€3hÿ’$ôz=c²eQ (/Š@¦ãúœ À-¿GX„` Ï¥ µk™ Ì IxÃ^‰²ìX ‰ t«± h{žI²©)0a‹*"8 I¦ cP°ñ÷P%׋¢@–gá~ƒ-½Š€³.HR`Š7A[ü„ fV@B€ Èd'ã‹^@Á" ûcÔÕ—e¼$XÈ¥Š€Æ(­ˆ¨èL–Á#%%H˜:*TðÎi´>ç]‹ ”EÇ’… ÏUB@'þ„yý:‘ˆÂ BˆðЄÿKH0]˜ÚPg´áÔ_#;çEBÈ"ÀBH‚Ä e˜ @H (dÐ &%$H¨Ð46píÅ…7™AQt,yà d"Ø"÷ŸK Åúå?Ä`û§dþ3A€” Ìëñ¸´Mg-0ˆ$Q‡ Ÿ»‹ÀŹ-‰¦³ÑÇ^€2†1-åú ! @‚wNWæm4óÏBºÐŒ½œ…@É]‚¬w :ŠñG ‹0¾W=€„$ Ó»ý0œ,Ó‚-¬® Þœ´Ã­¿ˆ€zñ¬Á8ß? r©þÿŒR’$T2'ƒ§x€$ütt²Ä02‚,cª(·úà2žÌ€H0uTb•yn` ‚¡=6þH4õWÓzÅ#PO€)Â-Ä€Ëü!ÎI’x¢-‡õœçEB•"º<¡¨˜Ìp©³þ"DAœ ’$L6ËmúaeÅ`¡×‰@ñ&"Ðà` ŒA Ç, ˆtHO 4ÒÔ_!¬ V öâÚC ^E äâ„„´&à®Äòòò ý_óžn"Ð!ƒü *Ëò sÞ{Ž®ƒÀ(ŠB÷Úkš†]pH¿ºÈ 5Œº©Õ=60<]·CS7aæâôól$Ïìë`eC ôgo“ö0Æ]7Á0sž³Œ@.ø1³ÿ´‹/¯máHw↯ÿìW.}ÖdeQêõÖÚ`±‘Œç*ðçÜj\–z ßW¬Ì3®³ YÎMÐ{k%)Jн®ŸY7õ:Ïø–ü‰¼(Ÿ±Î?Z ª/¯­­Õˆ‘³²²‚Ë×]w]Y×õ[Ë2{sô62Ô7dÔ¥•‡lÈU ‚¹<À]½á%¶¼œã8†Z…ñËМ Jf@"&<l¹z µ€ˆ[h¾fssƒ âýï?ן9y‚ÏÅPƒÖÒ Wþ‰7 Ñ­ÃdñÐpÐúüü<ñЃauõöíÛ×­QþLþM 5þR—³"ªlÿYÞ^Ç÷\îAÀSzNaÀºEšvkd}„,¼N…°×/UXmÝœõŽ>oûûÕWÁå$û÷_óž…=‹Ëób¯LÕ|VyàÀýi°ñó8 ØÈ¹%²“×ÙÕ»cÛØîœ>Üe¯§Fc­ƒ1, šŒC†@N–Ö6€Wö#gCÑ]~Ùé 6Ì çÏãä³'ñÜÕ À:N<3F&D ¸ BýÞã8?× À<Ø `ðªW½’¿;ˆ[wxG`M4Ä“2®|ÿ¼‡hЧ³.ð™¤.ó½kX<¡âDÚƒEštK4A‡F›&ð J½GuU…‚ë÷­®®~ Œ$—‘áïß“—Ù_.îY|_k°š1GDêæv­{f ×ëºæÖՈ˽°g¡;§Ûp5mÙðõlüÁƒ¤.¯ôÍ!k †ÆŸÉB84ôçÕE€Œ\1ÌÖèã®»>ˆNNßZ&A\1NæææY¾ò•¯ÀYC‡Î(ä‹õ3õœÞs î°ˆ§Ñî‹ó>òBôûëð¦Q›ŸC¯,X¨=ñjÉú¹íkÚ­ªêZ»Ú!Bm]=lþÁÿ²w&Pv–e‚~ï÷­vÈÊ–°I:‡T%$!h+:¨D”MÅF›»iÇvlÜzPeUÁ¡UÑnPTP”nÑAlGQpO„€B BªRû– ™ï9ßë{îüçzsoòߪ¿âýê¼çû—[wù¿ïÝ·ÁCi€DÏÏZ(u~«£½óØt*wòº¸˜;L’Æm¼ŽÉ¦ 4„–­¶mÛ3òØc™XËë4ÖEù:{?â0¹ä’KdtlTþð‡h€4@L5Éår’Íæå^GúÙ#<Ã8õM”l6++V!]Ý]’Τ$¥Rkq75¢Âþ0夤ɉÉ;·oßq¦{Ù–pT*m{¹íØ\6ë|Ú‰âÒ<÷F´@8?¼:“Îzõo~³YÄêèèpj… ëvuuI{{»ýo5$®~ÝÆ~ÿŸUåáG~æŠûK˜¸V%4¸ú÷„£3N<ñDžÍ¼zCX»ááaž‹ Ê3Ï<#<òs~‹,[¶LŽ9æHI¦Súûª¨Ž0p™¤©L6óŠîƒ;/ž¸¡EðÈçÓë³ùÂYÅbÐQö üæ*šIÅÅo yjÛ6yð1tÉš5kä”SNañJ©!$Ó¬™açO>ù¤Ûà…9÷ö *ÿ—ioô„×<§1}}}ròÉ'Ë<ãîHF´Nß±c‡<ôÐCò“ŸüDüqyê©§díº>G¸Û”1øº ¤>¶{ƒ‘˼ÏûÜúÞì~ßH‹,БH¥¯,ŠX™áêFC‘ö\^M B> ÎoÙü;ùío+Ç{¬œ}öÙ²víZééé‘R©d.¸f ¸×MLàv5íøŽçßg5…÷PC[íÁwÔ¬Ã|!D›Ø\åÊ•aºÿþûåî»ï–ÿßû¥·o,Z|0Üß2*½‹4aèÔäTO6Ÿ¾|r|ú}-°ð‘M'“Ï/òéŒc{·S ¸Vw†ó ˯~õ+ã_pÁrüñǃøaNÏf‰|sã½ Ë÷—„x—r3Måµ÷Þ_]ºªzÀ±~V̆}?¤´ÎÎNb=¾hÑ"¹ýöÛåᇑӖyûîAÜÖï ðÏQmˆ8/‘X€ƒ°Ú¹Ÿ2èþ‚ÅY@Z!Ç‚yÜ0«üæÍ›åÈ#”‹.ºHz{{1tÕ™Ãçs=ƒøî€ $µGXpXŠˆ¹x¨ú<$ÎU ÕmãÆÂ¸á†äñ­Oà¶TOÏ]¡‚îïC¢I°‚ÁñŽA”œ1p¬ ¼ÀF*“8N$’èöˆ÷ ?‹ çTöHåÇJì Gýò’—¼ÄŒŽ‘B¡v“Ù¾¾ïPý=ëSü. 6Êfs²hÕuŽø±'ö¼Ê岬Zµ [Žs™þAí Ë}Èd³V7qvfw"Ï-Y,fOhå,¼RŸà„7ßuðÄÃ×8ù'''¥X,ʦM›°øÛƉ~Ž„˜X}?€ ¢lÄÏV ? #?ÿh’Àdß)îD€u]·nú=ßC l™ …à+fžªb¤6µÀ¤¹ž˜Ï0ö± ˆónQ}þû¬G~€sîaT#`ȹùz@šH:¿s%ªÁΫé¬d3•á‘ŠÜ 6ï' Yû„“ }§xÖ™€%¾çäÔ” ÒTÐhD"E|NC._À8|r‹,¬(\N&ÓÇà@#¥|ŽÿÙäâ‚XPsÇ×e3é¿Èi¸–®`õ‡úÊ GäxxxD–/‡dƳHEýÆÁÊ|›>ˆß¿½_ô‹z5.¤ˆS€û+!`Ne¸ð:ë(¬ó>ŸéËI؆Í‹ WB`‚Hz“¨ê&áÊ ÎÔ)ž¿‡g^þÞ¾·ºEÈøÖ·¾•‚”3æ äaCbä±ä6.1Dâ˜L2"ÿ–.]7 ù”ùùùC|Ü–ûŸ7ÈåïøoV”ÿ@•«§€´½—˜×y ÀÿØÜ xäU÷/·|^Þûß? #££'!ä(×ÃÀãf>ÏÂ0ëÀ*†´PPŽØyÖüȿҊ÷¿KÎ<ç<¹õË·ù~~â«ö2+¢™tSÙ1W%Î*%+Z?hã¾ÿø9÷õo[ný"ï!ˆ¥ZB€ €ØOŠ"ÞN俯¦{ûP6Çs<‰kñ$-^˜„Óÿׂ'{P f°ö+÷JK¾P° agÓ"²Aö“ßT× ß),òÿæ·›å¿z‹üÓ?$ĺÛ÷ ,7r¸ã/Ýx@Ô@ò´$A|ƒ 3×+ИJ€ù<Ü+€,»Ï|î_äü ß$?úñý VjÖœï_)ö[y5µ-èmDé4 o"ÐRÀ† –RÑÇq6n.[õ[ìØ8'+¤’îîn|Ũ a n"5ב+?t•Cþ‹åW¿þu5¥Ö÷ö÷)ÆI à73û‡4€”‡dŠ{úZæ½ âS žéï—+Þ÷~¹üÞÉq¥}`ÞÕT=>=5Å÷PuEë ¨JÀàY”Ê%žÕ¡'tÒò?'",Pî䊹 Å<ˆ®2f ±Øˆžãˆxv}ttÄéÿKÕ˜!½èyóìa®ÏuÄüW½ö¹ó›ß¬ÉÇF®4`Ì€¾§YíÑõ+‡¦Ý±ƒTπεÀ·G©ñÝxðgòú7½Y>ñÉOñ=«©À\{ðóá—ϯðxf¡{‰àJöAV©MÜüs!ÁCþ8ë÷:JUa‡ûkĺ½UõÁÈà¤W`&¤÷zÞ°] 6„ßà§>(g¿î¹þc—q÷½j-Ý¥qI€÷3¿=ç*YpçT `漑x³0× þ—oÿŠœíì÷üï{‘æÓ>`1!¤uŒŒbôc•ý^Q7  õ ñ"ù`²dâGZ*@B!2é”3–ÐAt®È‚úVß×¢Ùˆ#Ã#f¬Îý£W ˆ¿}û³òŽw]!o½ômòØÖ­õVÇhï$WnüÔ§ñïK#C¿n@sÇ%5±Å€©¸=˜½ÁædU!º$ÂåCÏÙÿ÷{îqjÁrû_ùçÒ[`W Õ†ÔĦ,©âœù Q(…H¡&;z:6Pˆ‡ÐR Wh[‡/·X(øy«Q/p-.iqáÜ“þþ~Ío·jA¯«Dôêçõ¹ Ãn¾ÇŸø½üõeosÁ<ï”mO?½Ÿ-Â!¢«èŸt„Z~qÍCu‘>  6TF Éê‘€ZÏtŸÇÄĤÜpã?Ëý•<ôÈÏç,šP=p~¾C%a0‚³@˜uO³ì©RQr™Ì‰- žÆ? ȦÓëˆÿ' Ðwxdžž™ö¥·½ó•ÀtØþþí²dÉ‚@¸VûGbÐ9¯sƽלw>~rÙ¯¡' ãîÊé“zn.A òZed_‚Y= ÉÚX$àþcÂ\y³¿w.Ãw½÷}2¸s(M9à=É äsðT¦3Ø/N²òU‡a*•ÊØˆÔ"Ð’! ™Îdו'‡Z#¹ÆPr²¼¬)EÆg™T0¸s ˆÄ.p×7ï–Wœy–Üüù/xÛDC €T–̨J`ç@ºx0ÕÁ®Uý ?QÖúÁ䂈Þ(7ýëÍ0 ®…gÒi¢JQ…NpÉD™òÇ@ hÙç×uû%³º»» ½ñÎ!ø$~j[*¸<\…ÎÍ‘ȈŽU€Ú®Â_þú×Î~‘¼ûýÿ$ƒƒÝÐb¦p)ÏÂóÌIŽ“f´sÀüù+pμ7àuF ¢e„¬Dò¼ /”ï:Ibx‹ã˜kp|ƒtI}M-&Z‰;°tćגbèþ;üðÃË9 ïhïÀr-S“Ó>ùGëÿcàCtU•€{ )iÀDI­è¸?!»„îžÿ†7Ê#?ÿ…D<¬eÙsnÃRØÒŠƒz°Ößfä0Noƒv¬ç¼®ŽHÀæò ʯºFþÎÙIp‹6+$µ ‰È?ã"CżB@”w%ïš%®û„ƒÂÆ?Z@î? (” k‹Etµ"Ö[ãkÇsFÜ‚¾°gÂqþ)®›NŽ8¾dI¥ðÇæ™Öéܪrα„ÎFÝú˜œ´iP© ìoÏCº}ü¸sßú[c¼ØjóåMÚ\ÓßÅkûëþXïé1àÎþTuâÊïaó¾+Þ…jÀ÷¨§´9£îûÛŸ}d%b/RC ž€q\ä‹`ñgíu­@xƒP&¦&P‰„Q`üTÈþ´§EæÑý8æß§†jü£÷›¯œñÆCÆÑÑQâÿAH=ŒªD@& k{ûÌî £ò¼á2àaãâ§?s“L€üü&«ÓŸ¬x<úy¶CÁ9©z¼'tâPT”!WèëíåY«dµgJž×$K؈(gMMù9؉”žs¨HÉ·¤ÜÖ†GÀ»=ßgW¡žGRmˆ¤ µÅ½i@‰‚ææ 0@űYù+;ÖsÀU±ºj tã-ÒÂõÀ¶@µ`ÖuűîÐÔР1¼,H‰äNà.v†æe®ßÀ²– &À¹tJŽ¢U.µ!¢ì …ÿLî¦õÇfÆÀ  Rƒ"c;@ø\¢v64ëà÷pUË€ëg†÷¤I(çNVÌI5êqeJ±Þ$@=xT¸]’TóC‚qï‘:2<Š„G܃G~mϾá¹2C$KÅ¢äsYik+nˆ‘ e\ºtÑñŽÛíp|' ÏZbhŸýË–ã„öQšT•ûW?÷» ž÷઒ç|¶£vÚõR´8`†?››+€gUج™—ÑO›œ¢A1–R@E4_„窋Æïµ†¨dfrùõ!ÐrΡ0D{ na Å2:(”\å_­&œª3NôÂP­g5ˆBU t?²¬Â*ˆ¾¿;ìú«pÏ÷*çàÿ­¹môz-à5ö ¥µšÖ'¡ÙÅAÆÇ&$™IYpêŒW ü`F@j,–È4ÕÔàxÄ´lŽƒ÷•Ûˈhf“eA~ÍXÓ¤ <ÈAûogç¾ãKŒ„T€*ç׿þ×Çýª6~ƒß°Ìá׿Ÿ½—T¨æÔc›¹^;(ääõ Mû$45'€p`ÿ×(@Ñ0g¼iìùÔ žäóœ= REça´là¬Ï½í’/´Cì.ŒdÞ%åc,"«§ðÎ808€(==Ý„áþªÛôõdª‰"²ra…¨Ï6®œEg… Rêÿy/+°Òôb©Ñç¨'` ±ßgŠ*ö3ð00(SE˜AD`&›N.[¶xílŠÐÅñ÷d²™å9DF À­ƒÌ|ôî;¼uparj’õ•ÁB0²¹öÊ™é# ÑØؔ¡¶·©.¦›˜¯Ç ±9Ál`*Çõªb€'sÐ-r€Oœ^ׄ˜•&Q üž¢‘(Lƒ‚³Ùlnƒ¹¡@) X(@m}ù\Á¹tz؈äpCÑ ¯àXxxñ”†ÿr²sÈô«l[ˆÀU]ÜN¬P‹[Û}{}Åõêïa¯¯¨¯«·ˆÄÕü–h‘zpš+Pk æ @:€8ÐF5³­ÜF³<0í©”ÈåòkX¶¶2!±”Ѩ¯ ¼…_¼Ñû¢Ñk#Ãòê¸ã*‹€„%йÖØù¾ qQªœóù:7±sf ¨t[z\O0¾O­6à5 ¢‚=7‚&8Íy—ä(… ìÔ'_¨…cˆ,ÉA, Œ…ßÈëÛÚÛQÖ:u åú 욟ˆÀ– 2¹ìÚöŽvÁ:Kh/¢¿Ç_ÏMX¼Y‹`0ìP¢Š`DcÜ?®B n¸¬¸½ËÙ;0\‘Ü4U'П+ìý™§gLïO§“ JC¢DsTv̹ڃˆ®Ä}¬"¶¤ˆ‚ØC¥Å‹{ŽkÙæQ r™Üš®®n2ýdbrÂ!û.ëõ5WÎþAk¿SÊ©K°Ô0ÎEjˆªÚLKz•XuŸP{Â\þôýj×§§&‡Ñ‰ù|8d3[¤5˜'`|‚øÑP÷gX=‹õõ%æ‘f¥P,H>Ÿ“\¡tÀÆ Áè:½æD²În§ÃQÙ–¶ÏlJa‚è,à$^‘EE¾ÏÂùé ¨…t5âÙíLÏ›B"<$Qß›Ò YlH¦ö¦xva¨þÚiæˆªË pÜl/ÀÞ`Æc]gBɽ{U×ÂÀÀÎ1î˜ †ãb¡H8ùÆjñ-м P €|[éø ·g¼×rþÕ­ã]V =GÏ>;@€ Å ½>"îßüb8>a…+§g”cOMÎ LOðlQ?x´xÂqó:ïƒ'À—‡åw`+2¢žÑjÒ˜MMLB,a"‚Úé\˃ςx½Ù&'EØ|"€…oŸDŸƒ :O[Uò!|”ã6̘Z éÜ@5ËüEOw Âà ‰þ㸂Â'P À%¤8•óì´:€µãø· Ô°Dæ@ôÖ+D=‚Œ† &ŸÁ94ÙK\:b¡ (4XhÒú58©ÆgjÙpÑg¯Dh0KñYÜóØŠœäuŒÓÁòÝ=.Ÿ?Ÿ“gwôƒ pxô~M€ô5þ´:€ê`á+ýñŠpõûçÃçÊÝ9‰´Ú\)«ôÈÈV¦Õ5ØôTZÕ‡‘ˆ¥Ÿ˜ùñ Ôƒt5Ÿa3çz ÷ßÿcÉgóB‘€üVõX”0à Ä B=‰r©(ÙL&l< „1Ísÿr}´nîêì´¦ ¿qÇ„ H¤±ÜÔêD¼Cä#B°qNW!œ—MKT¶dÊs¬¹øc0)Çw X&*@d¢~ôvƒº%-‰î‘_×RTM@š„ØŒŽâu"1#¢&µls*àÿo+—5¶î£0dÿynh î+DUE@°úâÀmÐN  ²jC^@²)—Û@>bÐW­¸GÁZŠ¥Sú+H©\FFµšwQmfà>ÁNäYIû­Ü×ì>—„}$É ì F@²­«m®ƒZ6g]ÛÙÙ ò:0!À&Â'àŒˆrج00::†øOௌªÄ—ž×0FSmÈ$ôð§¶=%O<ñ¸<úèïd˖Ͳyóoç¶lÞ,¿{t‹<þøãòÔSOšû¬ÒÅn{¨ ‰;yhhR’ ß-ŸËá àX3Mw;Isƒ ”ÛʾPh*{À%qnâ¸^ÁéýÇtõøšnèÁ•5éàŽˆ«ˆq,šFÊ#òã T=‚TÞù !žU€ˆ$³pl}þ“M>‡Ï$ÄÁSSˆšE,')`xçI;pÿÀ×@Ä hITØšˆ€ùœ;ƒRq–\öÖê|6›ìq 46>ªºÿoÙ×6¥åÌIôµ`ß«þr½±°®ïc6Ô˜8 °KN^jƼï£úš„ >ö;2!ù\3‰ †"#ðîA¤ƒb¹ñ]«8sÀ$q.V(ø b©`i¸=žÊ¶fP®©¹Xvñ, ã\d®Âìp ²¾5@w¥Ê’`±kAvK B÷ÇÀŒ¤Ã“G%Ð~оd8R€û½H]N £cÐòå‹ç*1¨eÈds}p¿b±„þ LÒYJ€§áDÚ17Qœe¦  xûÇÏq#*A¸w$Õ†tìR €èµ€©VR¬qÿ/çÕæf#؈àìtH& QŸÏ5ƒ``ôd½!–öáÙ«Ph*Î6€L:Õ‡îI…Öi-þA;«™Y ”¨h†‘Îäl¡ŸÞö´Û°nÑJÚ$Rÿ<çU;°ûÕ Pa]T*Ϫ[Ð  TD)°ÔÛü£ž×q¬À3D’‹:ÎÀ<¼7cÙlÊý.ˆÈ¿G¥„´¹•§¦|Õ©R±L<€drÙpÇ YȪ@Wäwˆß•ÊdëìèÄ….¦ÑqXggŒ]b°Ñ~€šá5íb½(ª­À%rÿ¼"iEQͤÍác=7Ü×Þôzˆ A@x°ÂÇF†G4Tv·uóe°»è €hÌásfi­r®|}¥tuœµ '/`xhˆ,K¿Ž¬MÐ^Ž´gŽ5:p7ª˜8s´c*]’M771¨%(8ÐK€OgWú˜ LÀɈ3Üd“à£VNmý‡\Ý·£Ž:šÍUÓgܸºqŽ©jô ÇwÞu§ îàW™y“øŽ­ý¶"¸ «Ó'*a0á{v@ >hRT)TñÄ¿!D‘ {~_ùÚm(ÇÕï­ßÙGÖ\3BZ{äÅö,Üцu'Ê¡‡µqÀ£D–(I‰Ùµ[P†bѤú}ðƸ}Ø-]ݨK±|ûöí[;@*†ÀÈä2kp}ÑÏÅC˜˜ÇPã7b€K'mz¹oæï Œàyláë)ñ" 5U€¿|Á©rË>ç2Ǧ 9”#¢C2{¿²rÊ A71N¨ìý/Ú ’f't¨ûŒŒ Û{Çh¸ï7KFJiùïºÛ@Kjù™ßÕè@Ü>~uŸvèá¶v†C„Ͱ}{?R„K2)¯û³À>÷Á×™ä Ƕ·uP$T2ù v€Ç›Ó8´ €²½èÿ®¿±ñq_#ßÂ3Æ[àüÏi‹ppuxxÄbÍHåu ¹øÍí6k¯uË€€@½Èdô„à8܇ßÍb†ˆ˜´µµÇT¢òªLØÀEáŽ=œóš×ËÆõ›8kZH1¿£´˜¬38cÄž áÒuñq>ÇÄw ¢+u.¬D?Z6§×÷uuu •€'<£¡›*ªUôª›–Ý\×ÒàäÐscÉ’Å OSóûsOþOÏ—7¾þÍŽð˜Î‚@ÁYšCÑ×ë`fŒ9kõï¶l‰줢.Àýnan,HigåáGË›ßøVÇeÛ›™mh* btdD'ÌÚÍücAAHqYug¼€¢´Î¶ô§ƒ-MÐeŽJ÷t8K~&—’‘1 ¢H–óç·Ù4z‘s|ÿ@F#qüº !JpÇ·^|©¬8ì(Ä_vZ™CBà9Œuö1ŒëÌ´©–ƒ  F#Lb1fÓŸ¸V'òïÞ#¯>ãyá_¾8\Á¸i³EÏ÷ªR™ƒÙ™]Œú†›ßŠ1ïG!‡JÊžÌ>Ïr+8ú`-dûrù<::¿¯¸k·×³©æ*¾H&Ü~vb!Y¸ÁA·¸‹ólÑCH}Õ_5„ú¢—È/5…<*陟ìÕÌ4–©M) 33ñôê˜Añ…aÈ_/ïgý–,>D.¹ømÄkc®²Ù+Ä5Àù C"CˆšƒÆçÏëP*µXÈ,1(>Á,—O:BqbPK0È¥s½ø¾‹…<…T‡ ³x@ ˆ‚eˆØy婢¦§ò‚Ì=®nÁE^,m]ÎÏ !à†¾Ê ëJ‹¡l··øƒìFœ ô+Àó„Ø~·Ÿzuú^~ÚòÊ—a†Â¹Ì„«ƒüxwòXaóÔÀ|´Rˆo=a0Žp™Î¦ˆÄ T,K€å³}„c˜!‹ðÓt…1fÚ×qWæêã@ß l§lX¿^ €UGDE>ª» 9æ}OéËdÛÓÛä–[n–Ƕ>ª†=±Ù†¦5ëÌ{XçšÉ‰iÊXËÀމÃÀNhõ7ï¼[$0ʾ/çn²ãð€³¾äÅ/•Wq¦y?æºÁHØ8¸cBŒ qƾÄ÷Ô&3Óöz˜ŽÊ*H[{ªYõÄ V $Ã`©l:}<•€)„I­6 ÎSwŸC1Ù:w¡ˆ"%õFGG­X=£f7 ãüu» 9Öñœ,uIÿëÛß!wÿÛ¿É-Ÿ¿=²ñ‡Cp ‘€1DÏmß±CG~„\véÛÄ•xñtoF_mˆý¤øÀƒ?áõzÒrG H;Ücó¹,3e©(NJmBbPKœnv”£´Er¶Y¤i-Ê€†ÎÏ¢¨TŽXjH755C¥Dk(»Þ«=šÜ ÈŠ“ü—ÓO—뮹NV®XHùç¨1Žã¿J>ü¡«äÐC­DÜù,,Š£ð6€À{eÐû}ÃÔj Ç𤯡2³ª” ÏeK===«Z6€ˆK€9¤ï¥ÈG©T†ïhBÜ?ˆÕßúãù›T#4˜ÍF'`+ýŒ¸ÖèhVëp› $8ïÜóL—ÖxÀ£ÒXˆ1öª_-çŸ÷:kÍ“¬A¾¯e"‘tæC€“¸ü°X`öìì?º)Üʨ¨™Ô‚O JÅ®`&µñ¿T*HÂ?toñ§•7¨Ö‹mþžo 184äõ`ü¼,tt¢eíb=¯BÌðúîYg½FÖ­['×\w­lݺU&µìö0@‹áùË^!]tM5ö'Ç¿iv¾+}IN0 îqLÂÙž$Ÿ­MfÜ9mf÷ѧR,”p²Ï0~r!'±+–É­%ú¯­Üî7Ò¬arÒ7mTlJgR¶9Òü|;à´æh|ÔÎï¢ ïuÄ+äcù¸¼Æ5ŽÀoëîê–}ðÃréß\*¹l."Q?ú*C*¸¾ã©…4‰¤É¡rêý¼¤Òiß î¯Û”ýIÃ\¾°q¡'1+–KgÒÏ£“¶ÇÚ@ ¥ ö1¤¤F3,ìèˆnLÿ—¹t@‚¹ð ÊG¯¿Þùו¶àáÔž*7}æ&YÛ·Vq-¢®@óàe!&c³fiâ Äód¥Ø! wìöö²øFµ¹¥NrˆªcPKHçÓ«Ü¢¤¡ÊˆŽDj¡Ÿ±XšÄ¡bœ`ñ7ÿ-QmdtÌb¢ÍlÆ{{ìqòÏ7~R^ùŠWâÝÀú À‘øM±ýŽÔ]¸òÊÈW¼ÛM4;ÍŸìØ±ÏÜJÊ!½`@ ÇH¤SfŽe)BœI.èŽA©¸”²Él_©\äáZÈ®"¿‰™3ؼ+Ð 8°PD ² ¼6‚•«p¯©Å Õe—]&'t’\ùÁHÿ3Zÿ Þƒçÿüç¿@þñ]ÿ(]]û¤³ëhN-À:\¨Œ?üá-•›ÑO›Î²|ZkB|} ÷:Î9.·ãÌ`¸}ÿ‘¿å ðÇpö9où‡Ã'5+ B`$ Òsþ‹900ÀÂ9ÃNW#€ywV†÷õõÉ-ÿz³œöŸOã·Å ù‚¼çŠ÷ÈG®ûz¬kÖr"1j 9\~T_¢F ¢¾÷Ô$=÷§öÌG›Õ°çö/1¨e0ÜCî#þ?É‚ä&þó°ÕºŒ¡F+¸$X(Ëùß±ctkp’ØÚŒÀ@ÄÞýî+䪫®ÆÝË\Õí·}EÎpþýx‹úµg˜ ê&LdppHJ…’g{(É>kBS^%àuü~î±NT"v`A'q1:jÜîŒ*+Ð'ó9O¸S,ª6™D"Ðl-ÿlÁY€¾@:zи]…º“`:åä“åË_ºÍyAlŒ|¬ÃÛÿþíò™OßijF¬Û„Õž8>î@ʃQí—¬Ö=´8/X ñ]¨¥‘(X›t{wÝ~&µ$€\.½Æé ¬ÿañÇçª-¿ÉÓÖÂI8?©©XÒ0ŒY€æ¶‘n@ï½PX%@¸úê«íJ)–J„áÎ<ïyÇÉm·Ý.\pA¨ÂoQ¿FRÕܹÓâ1P´h e¶Ïf*r2é´ôÔCT ’Ä‚M âÒ •Ê_¶X.ûøk(HataàŽµ»K.Ë"yÿ¬™ #MMò „ÏýŒ4púé§ÉW¾r»l:ñD¬îs |‡K.¹D¾ô¥/ÊÊ•+«-}5¹u\gÍ  ’´Egj‘$Lµ1–}ª iÔ¢„(ûré…Ü~t jIs&—YÛî8^1Ÿ§ ‹ÖÍ NˆŸV}O§ÒS|ÃÝÔb¨4WÀœ¶ƒäÒŒo¼ñFyϻߋ>:'"? <·}ùv‚zpUo”zÑò4ßèïßn…\5ü×R d`MCx ÷ BÝžÅ؇Gm?\-€ÛԽр퀻yøpzQŒ㾕§æxÈYq¹N.>õÝæhDTm¨.»€y?^ûÚ³äë_ÿ†¸¦ùøœ /¼Pîºë²zõ_4Ú>=:m¾½À±âC„ûmŸá Ô}f*‰C öc» .¹Ñ@bP‹„€–8¿êâƒî‘R¹$õyðøÂQ¬]5”—sѦ»[Ô«w†œB;mqç‡4ÕUhÒÀ²eË][äÞùN’¢"Õõ;d¸õÖ[]PψÇûØ>…à´F! šÏ’î«5 6³JÂj0ôêgà“¹pQ··•) ‡´° ƒ‚y.élº· %Àÿyð$ùü%/nj‰­lOÅµÑ ý?kWaeƒÒ‹Þô&¹ëÎ;eÕªU‘pþ³Î:K¾óíoˆ ù̽öJ¬£wbÜ]ƒˆò–AºsçÙ–H ¢ Ù´JPB<òàðF‹eÇ|ˆÈ…ã-ÀÞ²ÿ˜³él/¢T¹­:xΟåð<ü¬ÓL$<ò‹¿Îâ@ä h”ú Bˆ÷Š„ˆêGu”|íŽ;äoßö·<Ð}ÊÙ'ŠïsŸýœ\Ýõp¹?£P/÷—ðy¬]ƒZ%Ø÷ èï7±Ÿ¡ƒ*Uö÷íÿ ÅzùñéÏŽ ‡‹»kkJ1ÜD2¯@u9¦\µuŽÁh KpC®ÂªH€8^~ùßÉ7¾ñ Yyä‘ ‰ü§vº|ï{÷É‹_|*ϽidžìÑ.ägžy†rž©µN€!¿Í[ÐÑÑålOÝìÝ¥NX¶Ðƒ‚” r¹üñ”GŸÕ"sñ ùìgo"¢-"eAسålÛö41%Þ`ðÃà÷‚xnÂ=ñÈOxp¡¤X*²ÿ64˜Ô’œñd…{pm%‡ì9ŸÄãE{µÖüŒOʰ:úÔk'[:îCƒCèf®ÂëÁÌ×ѬjCádlæ÷¿ÿýrç_§þ^U]ÿ”SN‘üàÿÈ«_}–!g•ïÓ€×"»Àü…[0@Â7hõÞàGì?i4è’i–ý†û5”¨@þgÁu b`ìËó¤‘Rw«ˆýZ›Œ JX3P÷ ­¤öàà Z6Y_ù…A$¤«Ž„ÀÆåûßÿ>‘{†øHH×^{ÜqÇWÙð&òGPø¤‰®ÂæÛ ØOØð,ŽŽ¨qÏÂÌ)LË1ÒS„g©¶€€tõtáÁ:±ÁÄ – Iez©²J0Á?èñøW¡¼>ôRìáþË}mÂ@UŠùhfµ!Ö¨„MüÑ~D¾úÕ¯ÊK_úR¸>eºš¸´ÐTšNR”ùÚÞ¿£DU€sÓ÷=a(rLB¯¬}–:R,Ž‘ƒZ€*@}¸`ò¹K€¥ÓÉ^¨.¢"X ^ìJˆ§Âšp¡Ö§+ò¸8¿÷ yòÉ'e|||¡ØèáÍ•FâoÀï?44#Áˆk™ý§ (åËÌÞ ¨žÚò½ÒV€4ÚÝÓƒç`m}‰A­HÀ ÎöQŒ`uždcàjõ”·P°B Ô ô‡aà:sGg›üò—¿”‰‰ –] a$Ü?¥ò=£wFïdìtµî¿ÿ~9ÿuçÉÄä$÷@xìQèýã!ݨ^-…Ó›­• G³Ñžn®Ѩ‘Ô²8×] @ÅB -f5Ùÿ¡ÂPd^®í›ká´[U‚¾µ½rïwï•Í›· ÆI F\« éyƒvT”h¥‘滑8~øa>SY~_$pëÁlP Þð¬¨H¬ìUÔUþ‰JTt†¡-¤Ä `¾Ò”œÿôȃ\U*…S.Ó™4Ç2«¡Á*úa0•@©õºõ½r— …ݲe ‰ñWšWm(@bà*ln1̆*R¿øÅ/ä~*§žú"ÒÏmŸ9æd^'8<ûL;RQsڼ㭂X -SA»1â6îù[€í×ä ùËiBÛf³0äZÓ†:¡x—gäóോRa+¤§»GNØÐ+ßþÎ=rß}ß•§Ÿ~iÀ8Úoh.'žÅžAQ€ö~0ˆ'žxB¾óïÈÀÀ9÷¼s5½\6áwŸ(“IšJp Éý@"@€ hD`ü‚RóỦIkðŸÂ類jt!íR 3 ß‘%`áÄÂ/‘¦&ÈÓö‹’p7³ùœQè+Ãrë¿ kûÖãDÁutS,˜Á÷­qî ¤ÕÏýA}çágbçöúf~¦ž×ó›Aâºg8=R$ q;Ñïÿ{g4“õë×cc¢€µ›O¦°úç!_x´ M]"Í FgŽ%«ÄÇŒPÈ“´Ü1 ­q—Ró%ÔÖÞÆÃæAr•‡há¼,”Gþ Ô¬ÁÙ ö ª Däæ|‹pŒ€’ 5SVõÿØ;—IŽ* Gf]zÜVÌXØÈ^!, 7<‚wÁ£°ã]Ì ™½€1 ðÚH0,½`òUb¦«z¦«:“øôǧ¥š™Ý0hÜ­TgWTDžŒˆóŸsþ¸½S.ËßþþWV –‹ÝådNL|ǼƒÎºÍ ½ˆÎcšãÅ2Ç--y _ägÿ|ÊTÝÁ™Òðâ|‹·¬#{%íL»Xç(]?>ìüçjPò˜æ³ M>i‹È מ÷b /#Nçç?)*²Êßoúaû¼ãLû®âæóŒÝþ9Lc!„ t`ƒÊÆ øÇÂðÍ/3ˆ„#WߣÍ|–Êͳz×å‚`ä@Ò(ò¼Qpò5e˜™¦LghÖ¸pK (^B¨K6)I îsà°‘2’ÞÈ$]ÍÑza7dåv!“ž¸wo²‘Ï:dÕ P(ÙöŠ2!ZÉÛj§ßίWpˆ­ÈÖö PË™±‰òÍ%JRéanrÓVPeWëö©VÖ‘¶ßç¼GÛ—¹ô*Ó~·ë|å.O´Ë—9ÒQ:”ŸˆåmC9$ÞYE®y1 †˜+¼I¾Zó=*®ûŸªŒg¸÷ÁbÒø¾ž‰ÀPß÷ è}ºq¨ÀÅ*Kˆ@äþiݧâ·ß€·Ïüöödûö½{÷h,WV9ƒ¬µsÆfý¯RñXºÕ¦qcOÆpñyÇÅ9xŠ—HäY-t ¼5£Ä~UŽMé(/“Žy@‰Ç~G"NÉ.ÅK:©“D“X°£:5FJä@ù£ä‘Јõ²â°’™E>:›µ~¤Ê€U›&d0B¦®yþ@6å'm 0Dñ¨?‡¿—|”6ÀºQb”(õθHÚÌ=áÛJOgæ8t€Co ^'1£üû*#ŸÈHÊ ÖŽõG¡kž;¾ëŒò£”I>Ùñ>Hc©8` é”Óöú RœGáÀûË=ßm“Ñ 8£jOá ¨_FÞxó ¼ÿ‹ƒÖÏ!þ_¸ÿÔå꜆`öß+§¢uÜ8V^ùSAB`ÀÒ¤Ñ)¡¬:®k 0ºW£\Á\C<‰4pÍ)W"`à~µîj±^ü†xœæÙCI×…ïÓq/÷ÙFŠ4ÝP¶“¦L@Åm¾±†º¹¤lP¢XÐËÇÙ5ßQù·t6dŽEú[ï/ ß|‚E.CÉiEY<§¤³£Xãz­ë÷y¾ŠÀ•!ØýÅi  këm*HÒé>£\óÑžx+ZkÞÙ-·Û]ò>õ’8p™³­û±$ Ù\ñãá˜á!»Þ÷|N_qØ×<Ô1åpª´u œ¸Ä\o‘çõ§3Ó4åÐË但[B‚Û¹ö|û­·Å…A_¿ÐüÒ»ï¾û<À­ÅÃF¯k…ÿúüüÇ¿úù/~V~TwŪH¬%QÁT¾!Š'W` wq±C¹_ìHçÍç3!g ¦ ‰tîæÒŽ”……åó€S·D–ÎÞÇéä/ ÂÝ{OÕá9¤9ÚƒuÇká²×ò¸/áç=€á™”„ .â½øKd%‹‚-°þ`¹0è sÞAÁ‰‘uiÈ¥…JH@ƒÅe,*Ý©JDž+<£Y¹‚kcû~^A‹‹\[=¹#Q€¡Ÿz` ߬8€%'N0´mÌ(ÀÍ%Oà ²­9ïÖo2Áë$ùˆ’çx4”I`à¢`sÁJÒ‘ñt$øÈC ×ôx7E¹Œµq­Q:¾k¸’X/"ÀgpM~Ô3÷È lÔµr ¦užN€!@㲨È(ß§ žOÝ‘‡Ð@`€T€üD¾û¨t=¨õÀ€GØ–eÞíwôåó Vþ ™Ý)ø¬…}W†&ÎÿÇ8†BWàñ$Ò /^}ÑÏŸŒ·«"cÑ–¥0Í$_rºÛnæ » c™Øm(¨^ojá7kb‘å*ÃlAŽ'1®(@Þ”çF¤’ˆ°æ³{$&¤ss/£žÎò‘2Óò+yF™ÈîÁÈ„9–mdç…/(s”ÜNŸýòN/ñBAÚ¡äŒRhYÉùŠk_AK%&- —›|ë_òÉì‡k¹ž§GVÀ "WIðÆôzv= Q…ßGv}îHê{2Öö(0ð7À@h`@nú ό첣X€~¡GcÜï;Ûsñ¹«5@·°ÿÔ=÷Wñ$)ï΋¾Gàú9n6ÊTv{TÁN´S÷£4ì2$ˆ%||0„±v˜ÐF–ôÛKúDÒŠ$b¦g`j…+—ütj‡Øè4á "ƒÖ‰4râIàèN’~`ÐíïdÌ× äõ{†%Üݱ¬[\êþôÆý 2  ëIfÎ yŠàeÏógGRwÔABšFÙfÜVJäеõàĽV|ÆÑ¸È!ΆÙÑ µÆÂSÚEæ -\˜Uü ë5²7£Î°î¢ä»žÏ¨Àÿ*¥Ä‚Ï…bHÀ;Q¤ÙS[¿Èž‹Ë=äðá%Wàü•tÕyû¢o2þ/v®}¸ª5ì¤É»……_†Oã T.‡¹<Úk¨’p2ËU†IãsÙq8ž+X¬AHGyì§ÙÌ„ÿ t Q”p¥ã âQÈgî8\é„%C-”À`‰e›b‘»`,’¦«žþÈø;€nu›»€õŒÒ]뇩Õ'|Xê„%±È-ßÑeŠ2 »‹n»ÞePçž·‡„vYþ ×? Ù¸‚ÔÄÇHaíQp‡á!#”×…¶%!íAx¦'į£)á v†’Ë!£ØÈ/W@YK®€Ï9¬æ°0|ƒ×ËÊX«Ãõa¨ÃOZ–Oe¿39çºwýûvrϼZ‚.ñ¥ŠŒ+¾öÄ×'ä‰ò7@ǹ>0žßsk¹ID.˜v†Û'ÜC·š ùP$îÃø÷\À08D×m|z’ï…+P9¬­®ÊŒ P?lZa!0ÊTÅjJ"O€•¦,üç"æWqw5 «kœ“.ŸȤ>ȇËpïªÈºÖ`–µCŽ›QFK1Iž’IEÈ!)é~È0°N_ô¶xÏ.$H=$$˜ G†%È,0ü×ÀѤx´}ˆbö³´}[H@½êÈÀÖþþ"‡ãó¶þ„Ìùâó/pfQ’&™·[×ÿ£Ï†›`¸m•!nºÀ€Ë(0 žI`XßΨ¨÷.<²<âjÒ$£¼·pžI/hÈ(Gw–ý¶Yx”Y>€«ç °†x³\ÁvË,¾ÆDáW'p4 Ųò#0L×<®LØÂꆼãUÊL]3Ü'0¤LC Òâ…tSŽ{®à #õÐMö‘+HÛó½ëx ‰Ç¥Aøu\Áì5#0tI{pÜ€#)yV¸¾W g–éÝ3‡8 .<ÖƒVÖ|Oëÿì…A/C°¨ŒýëŸ4ì°*S󜘰Ÿó>ŠçhXk‡Ä=`‹¢¨YȃŠ0` U~<aoH ‚3ŒjH€Ç0YŽáNÞ)À°“èä’ÀË”ÝÝ…ÞrHúÑîÔ“Šœ„Á<)Oä ç=Ȳ Y„xÜQŽóË„°üÝ܇€¡óM —9›âþýjþÓŠr$íï*ÿâ*/«°±X³ÿÁ‡ðoÝÚû;å{ßý~ýûfmÌÄâ·„2±O†§s¤én¯ä F¹’3z®àÊ)Å(Ÿ'ã¹`M†„(în·­yñÀ$íx¥ÙqÛ„S{·Ñ )'Ý„£ë£á²;÷>n·´)3é̸T®À1ÛáQ’ž'ØèVFà:(+À€‚Ç·ç ZþŒ³ë1L¬ü“+ JóÉk È¿ä ³(r7Ê€áMÇô{®ù{®` ³u\ïÅ=ßé3z ‚di!Aêæº\<ºh²çø/¿ü²|ò—OÊîÿ¾|ôÇûå³Ï?CÖº¿À×ä» ^ÈÑ€õsæœl%à6•+pHåë÷îÕ}ÕÞ,oT0ð$àýåŽÎ]­i¬¶n?ýËítYÐ\Òìob{sî[?sðÕÓ3î»p<×U9·ìën\ÊÕØç#eBm"å¥-ã2¾Æç²Ètb@!2ºBm½ÊRR-µ– Ú:¶VÿÀÄ“×\¸30¼èX{æí#Ç0•ízë6çûÈx3 §’dú-:òÀU:<<šÎ/¶^ñLÈ [×wá[XÖzÏ@æb¯qsÎ@2B’È@h7Dê÷x2\Qf½Ô'ô”Gk|^¨¸‘Š1@6fpÈˇ…D\µs_óÕ×_•yfrX7t<²Ótº¡ |`o ¹'W"§Ã~XvËç}€K~™ðhÇ…~ý‡½3룈¢ðém&&Hl‘ñÎ €Ÿ BüH YAȱo±“xì;±ÝÅÑÕ‘ru5ÕËfÏt>UÕíZ¦kj›êºÕUF1Ú<ƒ@fÄ™ÇÚ“5üøÓøîÛïñõ—_AÚ`Ck¤ªèCÏmõXOnÊ´ÿ\¶Éi{“Yœq25ȶ0A6î  Éü™&KÐv^;Ü_‹r¸øDéOê‡ü$KAÂ!Ÿ§Âû°ºÓP8¸|t]äâDbùXã÷¶:F¤VsQ¡ª ëôÔpu&Q‡+?ö_¶åIJ c~“SÕ+©lÒ”´:¦ïÈ8v¢°,ªÝؾRй~ PŠüÞXoúðáþ%ø+«+jpylïÜšžÓ&¥¡©¹l$奠[²JÓjÚ¤®)«jÔ•Ôy+³Iƒ¦©E“ÁÂYН4ˆÒµü”W¥=åæ/õ½Þ¯{н9¿d´»ñ¥€¿n’p ˆiÑVz2rËïâ ÅEÄ…qß¾Óõi…<áÂ+.?±J&[—•®“¹û i™¶`{{»ë4ê† Þç¿õvÆéÿ°£lZýëÍ_ðÇÛ¸¾xg¬Ý°=ÖœÎqF° é7¬a£0;S¹-m?âË­ÞÜWrhöðV¦ë¼›F2å¡;q#lëG-G:/—Lñ tZ?ê¶n4„Å]Z’IGrŒF]ŒûžŒ€d1â(e¡<23! ¹±œdÌ­ÑZ#´ür{[£½ìN¥àä´OeKfß&Øm2­MXµ§VZ×ÈWßëØøe+òüü¨É‚Üy£•úÇk«œ ,ëPŠc[d҂̸sã.\¦Æþ?ÊÌ3V&ùÄá&—É?UÙÅü&j„ž(»°0 Ñ¬Ðpàf(*Q8à׿a°R~WÜÑr½éÍ,›†\‰{ÄìÏ2? ¥ûïi\vÓ›Þĵšf¼Í¼=,‚»*šF…óÛ/§éMo|ýÕò‹Ÿ4ï«N@=m=2H)|öîUHÝê-¹„¦7ý¨¯š¦©5…Úýˆ¿˜×#Á*Î+îR³M'ê`hþ²˜Þô^ ß ;î|<Oʸ@>o¯Kb“Úb¦åu¨c•ªÊžÇûÂ$²ÏLϤœ“wk CŸé–¯¾R´y4Iq(=Ð’þÝ€*ˆSr”RZe™XPxνÓ:Ʀ`»NaZ?hÏå£(§S/ôH0lòªÐJm™:Øc½fý>°îNMš§ 9»oÈKò¸mÛ¾›X_ßÀþh§z;+ ÔíÀ3·ÑÔÙž¦i. ¥Ù¾G¤>cóï©#güMšˆ+oq–ïQwä_½HĦû£ÑÖÿÙÀöÖ¶)°QöÀ3òJõ¾õmb^fÉqJ^“ÙI)ýÆB:ÜcÁ­»ö)í% ƒO5ýœŸ&µJ`û@.áo]– N„(ƒúZѯýú-Qì:;Ÿùûš†Þ²t0¡Ïzê©tà,H^û­½7vASß Š.'½Wk௵«à»t8ðÖ+>‹à»~S¿õà% ïh_íeYô)cÌA’eY‡Õw;u@ èÿëv:B€ @€LÅ*î¼¶)k IEND®B`‚transmission-2.92/gtk/icons/PaxHeaders.4960/hicolor_apps_32x32_transmission.png0000644000000000000000000000007412617356116024435 xustar0030 atime=1456201459.071219876 30 ctime=1457295921.381831402 transmission-2.92/gtk/icons/hicolor_apps_32x32_transmission.png0000644000175000017500000000353512617356116026063 0ustar00mikedldmikedld00000000000000‰PNG  IHDR szzô$IDATxÚµVçï‹Q~ÞUê‡R´ZP›{„Ø{#_b~ "˜1¿˜±glµgµ Ý×9'm½(Aâüòüîí}ï=çyÏyÎmѽ{÷¿Æ’å‹ü‹—.TzðÚ¿ø*¸¸0¯¬.¬>¯TK xïÁmå{tWpïámY›Ï{tà³ìƒ}±Ï?&°ؼÕfû|gÒ$õtútõbæÌÿ˜§ïzëÖêb… ê¬Å¢Îy†”@úü‰ÁsYÛ è÷òYñq½M)Éßd`ˆҥ¿nÕJëÒEêÕ+ݺI°Pø£zôäzøØ§Âá¬mlß^¿WβöÅ>ÿJ„t`)‰çʯDøôÙuöüiuæÜ)õìùÓ_Š0ëcéïDø×à`—®\P{öïT»÷íP—¯^ÿâË€´W¯^"ð&À ù+ü£ýL B… %‹ÊØÖ|U$臯^ üb²¨lÉó4Î@Ó8 z+*]j¯£‚£Ÿ«’£™tét©T ©Lš>§PÖ^=£ÏdùyìKF“F£ 9S*ƒx,Ž'OŸ öùËäP(ºþ—ìv{yh™`ϽáóÝÅåËW@}þÍ!aÄÈ¡(dÛ¶î”9³Z­pUv¢NÝ:(V¬nÞ¼y>ü1Úú—%H!Ö¼L™2(UÊ¿?§Ó‰Y³fcÞ¼ù˜;wž`äÈÑø• >œ÷ä1~üx|ùC0DùòônšÖ„|‡ÎLЙJkÍÝnL&“¤tôè1ðzkÒ<ÃYøÉY<ž@QQô‡QÜZ7†ÎäÌù çP¼xqØl¶b‘ЧæNÌ€C‹Zµj"‹!­Ò¨W¯>e£äQðôÙsH¹ÊÚ¿Û3zf6›¿CíÚµeL$âp8PZºí/K  Z4¨ßÁ·¸œ.”-[‹…Ùó(¸{ïØÊRP=Ø|¾ûøÑ\®ÊtÞ‚p( we74 ]A%%ÀY†‚Æã1Ô®S[< òÑOŸ¢Ô&S™<"ÑOxüè1u„z3R'y<| …P™Z›‚´D¦U¥JDĉ·†WZP¬ &ÂÁmI©~‰·îàæíÛܺM¥yPøŸaÅóتU«Ne ]© ,Å-ÒOÍŸг–O¼zý и%Ë‘€RäP óÛwî ¥óé‹W8xè0:Áá#xB¤¬–âxþâ…>kB¦bÅJ¢ŸÏ”9.+ɹýO] i†·G$I”³Û%p‰%ùMòŠ658ËÙ…¤Þ”Rxÿæ5¿¹ˆ-kœ5Ñ™tS¥ŠN¼~ýŠu°éhBL©eÎB3jÌ^ìØ±]î‚—/_J=[¶n«­ ˜¼yçN„L5°páBôèу»@2¡›ôpíÚ•Öß• XQ±êt¸À‚J ©šœÈ]Э[Wœ?Ž/ÊF |ø¢7xƒ7oÞ~‡'OžáÝûÒ²K–,á[ƒ Ê—ÃIYД:¡2_ñõéb*ÊgÀ˜Ak¾é× ŠÓ抔&Q`+V¬X†Q£FbÊÔi¸zå**Ãb´—‰¾}óï‚ :„Þz}¡9¸¤-ŸúªUªâÖí[”EëÁðîÃ[¾K4›;å)å ª¡Y®ÍBÖ¬YSœ=sãÇÅûwðâéSøÈi•Ê.œ8~ «V­"‘•É 7É#gQˆ¸ÝU¨½ãT é ±ÒÚç2Àm×ÜE©Ñ Ì$¢·oƒ¨Q½Ì ,7ŠæÌ™`Á‚…3f4ºtéÂo,÷ Ñœ]4*“–bfX©$^¯wïÞ‘û@ž6(4iÒÄRF“‘HT¾ß£Ñ¨þÁt¤øƒâpÙ:¿‡þòk m”Dƒ QÞ^¡PËV, íܾ«,gÀLl¬Ôt&Åé¬%­O$ˆÇ 4f{\RjáQ k‹nNZÉ­q¶¹Õ™¤•+À™ãÇNÛ¶i³ÙhÕ¨™Œ&Ô*ôk™L )•$4WTgz¤q»~«(®³¢oKB˜Ö•â3ú—]¤ÕÇïÍ~¿¿T6ûfþWšJt9+›Ýõû a)ièósyþÃ\Fý\4óåËþveÈ ”+W±/ Яê$•Àab o/Sÿ¶.f®N©#9F. z4"4+4Ð(AÁ–Ý!@‹çÊ']‘¤îðû}‚Wr÷•úr`‡Ží/öíßçÃÐáƒÕÿÇàXôƒ9v®,;ÁK¨óŸáåXÙ˜ÚWP­&ÿŠö9IEND®B`‚transmission-2.92/gtk/icons/PaxHeaders.4960/hicolor_apps_24x24_transmission.png0000644000000000000000000000007412617356116024437 xustar0030 atime=1456201459.071219876 30 ctime=1457295921.377831334 transmission-2.92/gtk/icons/hicolor_apps_24x24_transmission.png0000644000175000017500000000231212617356116026055 0ustar00mikedldmikedld00000000000000‰PNG  IHDRàw=ø‘IDATxÚ¥•KlLQÇÿsï;ÓyõÎKE«˜éKÛ©Ñ¡Rˆ­%bA"±ÃBDH$„X@E%€H_ô‘) 5:Õ™13÷ß=L3:„p’_ÎwÏãûŸï;ßÉÅܹsÉÀt0ÿ úÚßùÉØ ÌÚ tïRi¶'`§N7pt{  f®Ù¼¥~òöï^”—³ÈŠƒt.]ÊŽ=ĉ‹Çãܾ»páOkùýl?ðìtŠŽ€5fpŒØ{pÓ4©ªÊíCÖ'vÿ¥ÀlJS‘J³™Ø¶}+{ÿ¡‡µ¿meº½P3×оN˜úG4«JKíëƒA%͆MÙÃÇØ¥+L·ùxšŠ ÛïüÒìŠ}C±µ½ VF^•úÃi¢Ñ(úû¿àSoºÍÇÓT–õÑž§6—­ Cš”ù!‚Ã@)/+)·˜Ì2Ô”Š”šD<þÑ4UC*•âvIQ Ì–4¦ ápx\ggÇIe¿øò¥oöðÃ,……#q¢¡|\”Œ˜6£Œ1AÓ¥ËP“IȲ@¦ÔÖ" •†Bmþüüüö_ ˜srjœN'¥"%׆ •W¯ßÄÓçO¡Ð\2•$/Z‚úY3ñáÃ{ìÞ³±X ›.OîT¿0ÊÆJ¯w¢´xríø|>ž’®î.„ß9ñx‚÷]P…S]=žÕOÎ]Èé¶LÑÁ´§¦¦&³$I%^¯’$¢:X «ÕÊyñìŸ#¸sï>=yÆíW¯^"Ý•ˆ‚Š^ß[E¾„,r¤‚4ÆãöÀd’QPQÉ6¡µµyyyxó¦Í-mÜnmiÙlŠÖŽ„#×g®‚d,`Ë(**ª’M²œ¤‹K$èë‹`úŒ°Úløó o&§„nSAôS ýX¼d ¥Özåp{=ŒÒ°ââb_–€l6WÛlv„ûÂe™ý8wö4–/[†$ &HÄãvsâ±(߸fÍjœolÄØ²2X-V0ɵç¡8&g]2)¼4U…Ëåâåh _·n-êëgaUMäs ± œ={uuu‘¯¥4ñJÊ>ÍÍ­5™ð D©$¿`íg°äX%'Tïœ`pnÞ¼†Òâ"øGâÖí(/‹ÞÞ^â#è‘Áb± ¥¦àム‰äSÎŒÀN¯¸Èï÷#@'•eûÑ6Af›76?mãùs|.cž§µz| ŒF‚A(à > ¨š¦8Ü>ŸV¨’ ~ÙøÞ'©Oè› ²ÞËFý›l#¤ÁÞ¨õôô*cÊPYU5\¼xRÒ/觤ˆ~ ò>Qüyn``€?4ª@Á’cùâ>ª¢D"Ùõº¹ v»ú[ðx¼¯·‡ýÀËçÝ:.7\N_=íïºõˆCH7þS GŒZ¨©yœ8I#Ø?¢é> G¯Ô}¦8éHƵô2ë%“iÎ?A{u?| Y4jBøO ™>¿Å€|ïxCYIEND®B`‚transmission-2.92/gtk/icons/PaxHeaders.4960/hicolor_apps_22x22_transmission.svg0000644000000000000000000000007412617356116024446 xustar0030 atime=1456201459.070219859 30 ctime=1457295921.438832371 transmission-2.92/gtk/icons/hicolor_apps_22x22_transmission.svg0000644000175000017500000003635712617356116026104 0ustar00mikedldmikedld00000000000000 image/svg+xml transmission-2.92/gtk/icons/PaxHeaders.4960/Makefile.am0000644000000000000000000000007312662752705017632 xustar0030 atime=1456201459.069219842 29 ctime=1457295921.35583096 transmission-2.92/gtk/icons/Makefile.am0000644000175000017500000000521012662752705021251 0ustar00mikedldmikedld00000000000000NULL = public_icons_themes = \ hicolor \ $(NULL) public_icons = \ hicolor_apps_16x16_transmission.png \ hicolor_apps_22x22_transmission.png \ hicolor_apps_24x24_transmission.png \ hicolor_apps_32x32_transmission.png \ hicolor_apps_48x48_transmission.png \ hicolor_apps_256x256_transmission.png \ hicolor_apps_scalable_transmission.svg \ $(NULL) private_icons = \ $(NULL) noinst_DATA = \ lock.png \ ratio.png \ turtle-blue.png \ turtle-grey.png \ utilities.png \ hicolor_apps_16x16_transmission.svg \ hicolor_apps_22x22_transmission.svg \ hicolor_apps_32x32_transmission.svg \ transmission.svg \ $(NULL) EXTRA_DIST = \ $(public_icons) \ $(private_icons) \ $(noinst_DATA) \ $(NULL) ############################################################################### gtk_update_icon_cache = gtk-update-icon-cache -f -t update-icon-cache: @-if test -z "$(DESTDIR)"; then \ echo "Updating Gtk icon cache."; \ for theme in $(public_icons_themes); do \ $(gtk_update_icon_cache) $(datadir)/icons/$$theme; \ done; \ else \ echo "*** Icon cache not updated. After (un)install, run this:"; \ for theme in $(public_icons_themes); do \ echo "*** $(gtk_update_icon_cache) $(datadir)/icons/$$theme"; \ done; \ fi install-icons: for icon in $(public_icons); do \ THEME=`echo $$icon | cut -d_ -f1`; \ CONTEXT=`echo $$icon | cut -d_ -f2`; \ SIZE=`echo $$icon | cut -d_ -f3`; \ ICONFILE=`echo $$icon | cut -d_ -f4`; \ mkdir -p $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT; \ $(INSTALL_DATA) $(srcdir)/$$icon $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \ done; \ for icon in $(private_icons); do \ THEME=`echo $$icon | cut -d_ -f1`; \ CONTEXT=`echo $$icon | cut -d_ -f2`; \ SIZE=`echo $$icon | cut -d_ -f3`; \ ICONFILE=`echo $$icon | cut -d_ -f4`; \ mkdir -p $(DESTDIR)$(pkgdatadir)/icons/$$THEME/$$SIZE/$$CONTEXT; \ $(INSTALL_DATA) $(srcdir)/$$icon $(DESTDIR)$(pkgdatadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \ done uninstall-icons: -for icon in $(public_icons); do \ THEME=`echo $$icon | cut -d_ -f1`; \ CONTEXT=`echo $$icon | cut -d_ -f2`; \ SIZE=`echo $$icon | cut -d_ -f3`; \ ICONFILE=`echo $$icon | cut -d_ -f4`; \ rm -f $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \ done; \ for icon in $(private_icons); do \ THEME=`echo $$icon | cut -d_ -f1`; \ CONTEXT=`echo $$icon | cut -d_ -f2`; \ SIZE=`echo $$icon | cut -d_ -f3`; \ ICONFILE=`echo $$icon | cut -d_ -f4`; \ rm -f $(DESTDIR)$(pkgdatadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \ done install-data-local: install-icons update-icon-cache uninstall-local: uninstall-icons update-icon-cache transmission-2.92/gtk/icons/PaxHeaders.4960/ratio.png0000644000000000000000000000007412662752033017415 xustar0030 atime=1456201459.072219893 30 ctime=1457295921.410831895 transmission-2.92/gtk/icons/ratio.png0000644000175000017500000000153712662752033021043 0ustar00mikedldmikedld00000000000000‰PNG  IHDRóÿasBIT|dˆIDAT8]SMoTe=ïǽw¾Úù¬3-) $„AJkgçǪ‹jŒ‹Îþ€º2þŒLº³B]ŠRMJL ‰VípYH–´Ì´’N;÷¾ï{ß´ð$Oò,žsžç9É!ø–~YºÈ)ùˆP2c®e¼e½ë”ùfzú½æËóä¨YXXð3ƒÁuFÈ•b¡pÏ#”PA€\6‡ÄH»¶öÔÚÜìíËO†ê ,//óçû;¿–‹¥‰J¹êoooc·Ó¤Ô§ê(‹¯Š‡‰to5 C ÝÙ¼–Ï&*¥ªßl6±¾þ/¤’ðÜãB`åÏH)q~ìbªV·D]2÷íÜëi?õ×ĥɕ•ßÇ18ç`ŒR 0Æfff`E:Á½Ø;ÐñÔiýÙ‰c£¹§O×Ñét ¥„q#Š"DQ!RAë´ÖH”Âù œÐŸr-õƒù"yþ!c „€R B^xìœÃT} ÖXgËÕj*¥>佸Wõ=ívÖZPJ_!U†pybÃÃ#0VÃc ²yÄ"®ñD)Eâ8†µ¶¿}lì,¦êuäóy8gaLc Ì¡€±JJPmM»³ÛçùýŸGŽàíwßA&›A¢“ÃÒÐZC B ºÝ=hm[TDb±Ýn¹R©ˆ£KÆÇ/AëI¢$êQ'ÐZà Î<¬=yb¥ŒïP|†ÍýB¡Î9z½ó‡Ä¤/¤um¥Ë÷ïwºâ öàÁ{oNNÖ¬s—‡†^c[[[8uú²¹ ¬³°ÖºO)C6“ÃO÷–¢Í͹¯¾üú;££Ç6FN3ƪår…=ßÝÅ™³gúaŒ!ðS „áîâb†¶ží\ ÃÐ1ÃÐ Firewall image/svg+xml Lapo Calamandrei Firewall image/svg+xml transmission-2.92/gtk/PaxHeaders.4960/icons.h0000644000000000000000000000007412617356116015744 xustar0030 atime=1456201459.057219638 30 ctime=1457295920.937823852 transmission-2.92/gtk/icons.h0000644000175000017500000000112112617356116017357 0ustar00mikedldmikedld00000000000000/* * icons.[ch] written by Paolo Bacchilega, who writes: * "There is no problem for me, you can license * my code under whatever licence you wish :)" * * $Id: icons.h 13625 2012-12-05 17:29:46Z jordan $ */ #ifndef GTR_ICONS_H #define GTR_ICONS_H #define DIRECTORY_MIME_TYPE "folder" #define UNKNOWN_MIME_TYPE "unknown" const char * gtr_get_mime_type_from_filename (const char *file); GdkPixbuf * gtr_get_mime_type_icon (const char * mime_type, GtkIconSize icon_size, GtkWidget * for_widget); #endif transmission-2.92/gtk/PaxHeaders.4960/Makefile.in0000644000000000000000000000013212667111007016511 xustar0030 mtime=1457295879.488119047 30 atime=1457295879.488119047 30 ctime=1457295921.022825297 transmission-2.92/gtk/Makefile.in0000644000175000017500000011105412667111007020140 0ustar00mikedldmikedld00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = transmission-gtk$(EXEEXT) @WIN32_TRUE@am__append_1 = transmission.res @WIN32_TRUE@am__append_2 = transmission.res @WIN32_TRUE@am__append_3 = transmission.res subdir = gtk ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx-pthread.m4 \ $(top_srcdir)/m4/glib-gettext.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(Productivitydir)" "$(DESTDIR)$(icondir)" PROGRAMS = $(bin_PROGRAMS) am_transmission_gtk_OBJECTS = actions.$(OBJEXT) conf.$(OBJEXT) \ details.$(OBJEXT) dialogs.$(OBJEXT) favicon.$(OBJEXT) \ file-list.$(OBJEXT) filter.$(OBJEXT) hig.$(OBJEXT) \ icons.$(OBJEXT) main.$(OBJEXT) makemeta-ui.$(OBJEXT) \ msgwin.$(OBJEXT) notify.$(OBJEXT) open-dialog.$(OBJEXT) \ relocate.$(OBJEXT) stats.$(OBJEXT) \ torrent-cell-renderer.$(OBJEXT) \ transmission-resources.$(OBJEXT) tr-core.$(OBJEXT) \ tr-icon.$(OBJEXT) tr-prefs.$(OBJEXT) tr-window.$(OBJEXT) \ util.$(OBJEXT) transmission_gtk_OBJECTS = $(am_transmission_gtk_OBJECTS) am__DEPENDENCIES_1 = transmission_gtk_DEPENDENCIES = \ $(top_builddir)/libtransmission/libtransmission.a \ $(am__DEPENDENCIES_1) $(am__append_3) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = transmission_gtk_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(transmission_gtk_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(transmission_gtk_SOURCES) DIST_SOURCES = $(transmission_gtk_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(dist_man_MANS) DATA = $(Productivity_DATA) $(icon_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTO_CFLAGS = @CRYPTO_CFLAGS@ CRYPTO_LIBS = @CRYPTO_LIBS@ CRYPTO_PKG = @CRYPTO_PKG@ CURL_MINIMUM = @CURL_MINIMUM@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYASSL_CFLAGS = @CYASSL_CFLAGS@ CYASSL_LIBS = @CYASSL_LIBS@ CYASSL_MINIMUM = @CYASSL_MINIMUM@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DHT_CFLAGS = @DHT_CFLAGS@ DHT_LIBS = @DHT_LIBS@ DHT_LIBS_QT = @DHT_LIBS_QT@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIO_MINIMUM = @GIO_MINIMUM@ GLIB_MINIMUM = @GLIB_MINIMUM@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MINIMUM = @GTK_MINIMUM@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAPPINDICATOR_CFLAGS = @LIBAPPINDICATOR_CFLAGS@ LIBAPPINDICATOR_LIBS = @LIBAPPINDICATOR_LIBS@ LIBAPPINDICATOR_MINIMUM = @LIBAPPINDICATOR_MINIMUM@ LIBB64_CFLAGS = @LIBB64_CFLAGS@ LIBB64_LIBS = @LIBB64_LIBS@ LIBB64_LIBS_QT = @LIBB64_LIBS_QT@ LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ LIBCURL_LIBS = @LIBCURL_LIBS@ LIBEVENT_CFLAGS = @LIBEVENT_CFLAGS@ LIBEVENT_LIBS = @LIBEVENT_LIBS@ LIBEVENT_MINIMUM = @LIBEVENT_MINIMUM@ LIBM = @LIBM@ LIBNATPMP_CFLAGS = @LIBNATPMP_CFLAGS@ LIBNATPMP_LIBS = @LIBNATPMP_LIBS@ LIBNATPMP_LIBS_QT = @LIBNATPMP_LIBS_QT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LIBUPNP_LIBS_QT = @LIBUPNP_LIBS_QT@ LIBUTP_CFLAGS = @LIBUTP_CFLAGS@ LIBUTP_LIBS = @LIBUTP_LIBS@ LIBUTP_LIBS_QT = @LIBUTP_LIBS_QT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENSSL_CFLAGS = @OPENSSL_CFLAGS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OPENSSL_MINIMUM = @OPENSSL_MINIMUM@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PEERID_PREFIX = @PEERID_PREFIX@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POLARSSL_MINIMUM = @POLARSSL_MINIMUM@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SYSTEMD_DAEMON_CFLAGS = @SYSTEMD_DAEMON_CFLAGS@ SYSTEMD_DAEMON_LIBS = @SYSTEMD_DAEMON_LIBS@ USERAGENT_PREFIX = @USERAGENT_PREFIX@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ WOLFSSL_CFLAGS = @WOLFSSL_CFLAGS@ WOLFSSL_LIBS = @WOLFSSL_LIBS@ XGETTEXT = @XGETTEXT@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ ZLIB_MINIMUM = @ZLIB_MINIMUM@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ transmissionlocaledir = @transmissionlocaledir@ BUILT_SOURCES = transmission-resources.c transmission-resources.h \ $(am__append_1) CLEANFILES = transmission-resources.c transmission-resources.h \ $(am__append_2) SUBDIRS = icons #FIXME: migrate from GtkUIManager to GtkBuilder in 2.90 #GTK_EXTRA_CPPFLAGS=-DG_DISABLE_DEPRECATED -DGDK_PIXBUF_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DPANGO_DISABLE_DEPRECATED @TR_UNSTABLE_TRUE@GTK_EXTRA_CPPFLAGS = -DG_DISABLE_DEPRECATED -DGDK_PIXBUF_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DPANGO_DISABLE_DEPRECATED # these should go in GTK_EXTRA_CPPFLAGS at some point, but not yet because it breaks libnotify's headers # -DG_DISABLE_SINGLE_INCLUDES -DGTK_DISABLE_SINGLE_INCLUDES AM_CPPFLAGS = \ -I$(top_srcdir) \ -DTRANSMISSIONLOCALEDIR=\""$(transmissionlocaledir)"\" \ $(GTK_EXTRA_CPPFLAGS) AM_CFLAGS = \ @LIBAPPINDICATOR_CFLAGS@ \ @LIBEVENT_CFLAGS@ \ @GTK_CFLAGS@ \ @LIBCURL_CFLAGS@ \ @ZLIB_CFLAGS@ \ @PTHREAD_CFLAGS@ noinst_HEADERS = \ actions.h \ conf.h \ details.h \ dialogs.h \ favicon.h \ file-list.h \ filter.h \ hig.h \ icons.h \ makemeta-ui.h \ msgwin.h \ notify.h \ open-dialog.h \ relocate.h \ stats.h \ torrent-cell-renderer.h \ transmission-resources.h \ tr-core.h \ tr-icon.h \ tr-prefs.h \ tr-window.h \ util.h transmission_gtk_SOURCES = \ actions.c \ conf.c \ details.c \ dialogs.c \ favicon.c \ file-list.c \ filter.c \ hig.c \ icons.c \ main.c \ makemeta-ui.c \ msgwin.c \ notify.c \ open-dialog.c \ relocate.c \ stats.c \ torrent-cell-renderer.c \ transmission-resources.c \ tr-core.c \ tr-icon.c \ tr-prefs.c \ tr-window.c \ util.c dist_man_MANS = transmission-gtk.1 transmission_gtk_LDADD = \ $(top_builddir)/libtransmission/libtransmission.a \ @LIBUPNP_LIBS@ @LIBNATPMP_LIBS@ @DHT_LIBS@ @LIBB64_LIBS@ \ @LIBUTP_LIBS@ @GTK_LIBS@ @LIBAPPINDICATOR_LIBS@ \ @LIBEVENT_LIBS@ @LIBCURL_LIBS@ @CRYPTO_LIBS@ @ZLIB_LIBS@ \ @PTHREAD_LIBS@ ${LIBM} $(am__append_3) DESKTOP_IN_FILES = transmission-gtk.desktop.in DESKTOP_FILES = $(DESKTOP_IN_FILES:.desktop.in=.desktop) Productivitydir = $(datadir)/applications Productivity_DATA = $(DESKTOP_FILES) icon_DATA = transmission.png icondir = $(datadir)/pixmaps UI_FILES = transmission-ui.xml EXTRA_DIST = \ $(DESKTOP_IN_FILES) \ $(UI_FILES) \ transmission.gresource.xml \ transmission.png DISTCLEANFILES = \ transmission-gtk.desktop @WIN32_TRUE@transmission_gtk_LDFLAGS = -mwindows all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gtk/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gtk/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list transmission-gtk$(EXEEXT): $(transmission_gtk_OBJECTS) $(transmission_gtk_DEPENDENCIES) $(EXTRA_transmission_gtk_DEPENDENCIES) @rm -f transmission-gtk$(EXEEXT) $(AM_V_CCLD)$(transmission_gtk_LINK) $(transmission_gtk_OBJECTS) $(transmission_gtk_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/actions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/details.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dialogs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/favicon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file-list.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icons.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/makemeta-ui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msgwin.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/notify.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/open-dialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relocate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stats.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/torrent-cell-renderer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tr-core.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tr-icon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tr-prefs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tr-window.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transmission-resources.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-ProductivityDATA: $(Productivity_DATA) @$(NORMAL_INSTALL) @list='$(Productivity_DATA)'; test -n "$(Productivitydir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(Productivitydir)'"; \ $(MKDIR_P) "$(DESTDIR)$(Productivitydir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(Productivitydir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(Productivitydir)" || exit $$?; \ done uninstall-ProductivityDATA: @$(NORMAL_UNINSTALL) @list='$(Productivity_DATA)'; test -n "$(Productivitydir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(Productivitydir)'; $(am__uninstall_files_from_dir) install-iconDATA: $(icon_DATA) @$(NORMAL_INSTALL) @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(icondir)'"; \ $(MKDIR_P) "$(DESTDIR)$(icondir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ done uninstall-iconDATA: @$(NORMAL_UNINSTALL) @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icondir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(Productivitydir)" "$(DESTDIR)$(icondir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-ProductivityDATA install-iconDATA install-man install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-ProductivityDATA uninstall-binPROGRAMS \ uninstall-iconDATA uninstall-man uninstall-man: uninstall-man1 .MAKE: $(am__recursive_targets) all check install install-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-binPROGRAMS clean-generic clean-libtool \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install \ install-ProductivityDATA install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-iconDATA install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-ProductivityDATA uninstall-am \ uninstall-binPROGRAMS uninstall-iconDATA uninstall-man \ uninstall-man1 .PRECIOUS: Makefile @INTLTOOL_DESKTOP_RULE@ transmission-resources.c: transmission.gresource.xml $(UI_FILES) $(AM_V_GEN)glib-compile-resources --target=$@ --sourcedir=$(srcdir) \ --generate-source --c-name transmission $< transmission-resources.h: transmission.gresource.xml $(UI_FILES) $(AM_V_GEN)glib-compile-resources --target=$@ --sourcedir=$(srcdir) \ --generate-header --c-name transmission $< @WIN32_TRUE@transmission.res: transmission.rc @WIN32_TRUE@ $(WINDRES) -J rc -i transmission.rc -O coff -o transmission.res # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: transmission-2.92/gtk/PaxHeaders.4960/file-list.c0000644000000000000000000000007412617356116016514 xustar0030 atime=1456201459.055219604 30 ctime=1457295921.056825875 transmission-2.92/gtk/file-list.c0000644000175000017500000010015512617356116020136 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: file-list.c 14241 2014-01-21 03:10:30Z jordan $ */ #include /* INT_MAX */ #include #include #include #include #include #include #include #include "file-list.h" #include "hig.h" #include "icons.h" #include "tr-prefs.h" #include "util.h" #define TR_DOWNLOAD_KEY "tr-download-key" #define TR_COLUMN_ID_KEY "tr-model-column-id-key" #define TR_PRIORITY_KEY "tr-priority-key" enum { /* these two fields could be any number at all so long as they're not * TR_PRI_LOW, TR_PRI_NORMAL, TR_PRI_HIGH, TRUE, or FALSE */ NOT_SET = 1000, MIXED = 1001 }; enum { FC_ICON, FC_LABEL, FC_LABEL_ESC, FC_PROG, FC_INDEX, FC_SIZE, FC_SIZE_STR, FC_HAVE, FC_PRIORITY, FC_ENABLED, N_FILE_COLS }; typedef struct { TrCore * core; GtkWidget * top; GtkWidget * view; GtkTreeModel * model; /* same object as store, but recast */ GtkTreeStore * store; /* same object as model, but recast */ int torrentId; guint timeout_tag; } FileData; static void clearData (FileData * data) { data->torrentId = -1; if (data->timeout_tag) { g_source_remove (data->timeout_tag); data->timeout_tag = 0; } } static void freeData (gpointer data) { clearData (data); g_free (data); } /*** **** ***/ struct RefreshData { int sort_column_id; gboolean resort_needed; tr_file_stat * refresh_file_stat; tr_torrent * tor; FileData * file_data; }; static gboolean refreshFilesForeach (GtkTreeModel * model, GtkTreePath * path UNUSED, GtkTreeIter * iter, gpointer gdata) { struct RefreshData * refresh_data = gdata; FileData * data = refresh_data->file_data; unsigned int index; uint64_t size; uint64_t old_have; int old_prog; int old_priority; int old_enabled; const gboolean is_file = !gtk_tree_model_iter_has_child (model, iter); gtk_tree_model_get (model, iter, FC_ENABLED, &old_enabled, FC_PRIORITY, &old_priority, FC_INDEX, &index, FC_HAVE, &old_have, FC_SIZE, &size, FC_PROG, &old_prog, -1); if (is_file) { tr_torrent * tor = refresh_data->tor; const tr_info * inf = tr_torrentInfo (tor); const int enabled = !inf->files[index].dnd; const int priority = inf->files[index].priority; const uint64_t have = refresh_data->refresh_file_stat[index].bytesCompleted; const int prog = size ? (int)((100.0*have)/size) : 1; if ((priority!=old_priority) || (enabled!=old_enabled) || (have!=old_have) || (prog!=old_prog)) { /* Changing a value in the sort column can trigger a resort * which breaks this foreach () call. (See #3529) * As a workaround: if that's about to happen, temporarily disable * sorting until we finish walking the tree. */ if (!refresh_data->resort_needed) { if ((refresh_data->resort_needed = ((refresh_data->sort_column_id==FC_PRIORITY) && (priority!=old_priority)) || ((refresh_data->sort_column_id==FC_ENABLED) && (enabled!=old_enabled)))) { refresh_data->resort_needed = TRUE; gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (data->model), GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_ASCENDING); } } gtk_tree_store_set (data->store, iter, FC_PRIORITY, priority, FC_ENABLED, enabled, FC_HAVE, have, FC_PROG, prog, -1); } } else { GtkTreeIter child; uint64_t sub_size = 0; uint64_t have = 0; int prog; int enabled = NOT_SET; int priority = NOT_SET; /* since gtk_tree_model_foreach () is depth-first, we can * get the `sub' info by walking the immediate children */ if (gtk_tree_model_iter_children (model, &child, iter)) do { int child_enabled; int child_priority; int64_t child_have, child_size; gtk_tree_model_get (model, &child, FC_SIZE, &child_size, FC_HAVE, &child_have, FC_PRIORITY, &child_priority, FC_ENABLED, &child_enabled, -1); if ((child_enabled != FALSE) && (child_enabled != NOT_SET)) { sub_size += child_size; have += child_have; } if (enabled == NOT_SET) enabled = child_enabled; else if (enabled != child_enabled) enabled = MIXED; if (priority == NOT_SET) priority = child_priority; else if (priority != child_priority) priority = MIXED; } while (gtk_tree_model_iter_next (model, &child)); prog = sub_size ? (int)((100.0*have)/sub_size) : 1; if ((size!=sub_size) || (have!=old_have) || (priority!=old_priority) || (enabled!=old_enabled) || (prog!=old_prog)) { char size_str[64]; tr_strlsize (size_str, sub_size, sizeof size_str); gtk_tree_store_set (data->store, iter, FC_SIZE, sub_size, FC_SIZE_STR, size_str, FC_HAVE, have, FC_PRIORITY, priority, FC_ENABLED, enabled, FC_PROG, prog, -1); } } return FALSE; /* keep walking */ } static void gtr_tree_model_foreach_postorder_subtree (GtkTreeModel * model, GtkTreeIter * parent, GtkTreeModelForeachFunc func, gpointer data) { GtkTreeIter child; if (gtk_tree_model_iter_children (model, &child, parent)) do gtr_tree_model_foreach_postorder_subtree (model, &child, func, data); while (gtk_tree_model_iter_next (model, &child)); if (parent) func (model, NULL, parent, data); } static void gtr_tree_model_foreach_postorder (GtkTreeModel * model, GtkTreeModelForeachFunc func, gpointer data) { GtkTreeIter iter; if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) do gtr_tree_model_foreach_postorder_subtree (model, &iter, func, data); while (gtk_tree_model_iter_next (model, &iter)); } static void refresh (FileData * data) { tr_torrent * tor = gtr_core_find_torrent (data->core, data->torrentId); if (tor == NULL) { gtr_file_list_clear (data->top); } else { GtkSortType order; int sort_column_id; tr_file_index_t fileCount; struct RefreshData refresh_data; GtkTreeSortable * sortable = GTK_TREE_SORTABLE (data->model); gtk_tree_sortable_get_sort_column_id (sortable, &sort_column_id, &order); refresh_data.sort_column_id = sort_column_id; refresh_data.resort_needed = FALSE; refresh_data.refresh_file_stat = tr_torrentFiles (tor, &fileCount); refresh_data.tor = tor; refresh_data.file_data = data; gtr_tree_model_foreach_postorder (data->model, refreshFilesForeach, &refresh_data); if (refresh_data.resort_needed) gtk_tree_sortable_set_sort_column_id (sortable, sort_column_id, order); tr_torrentFilesFree (refresh_data.refresh_file_stat, fileCount); } } static gboolean refreshModel (gpointer file_data) { refresh (file_data); return G_SOURCE_CONTINUE; } /*** **** ***/ struct ActiveData { GtkTreeSelection * sel; GArray * array; }; static gboolean getSelectedFilesForeach (GtkTreeModel * model, GtkTreePath * path UNUSED, GtkTreeIter * iter, gpointer gdata) { const gboolean is_file = !gtk_tree_model_iter_has_child (model, iter); if (is_file) { struct ActiveData * data = gdata; /* active means: if it's selected or any ancestor is selected */ gboolean is_active = gtk_tree_selection_iter_is_selected (data->sel, iter); if (!is_active) { GtkTreeIter walk = *iter; GtkTreeIter parent; while (!is_active && gtk_tree_model_iter_parent (model, &parent, &walk)) { is_active = gtk_tree_selection_iter_is_selected (data->sel, &parent); walk = parent; } } if (is_active) { unsigned int i; gtk_tree_model_get (model, iter, FC_INDEX, &i, -1); g_array_append_val (data->array, i); } } return FALSE; /* keep walking */ } static GArray* getSelectedFilesAndDescendants (GtkTreeView * view) { struct ActiveData data; data.sel = gtk_tree_view_get_selection (view); data.array = g_array_new (FALSE, FALSE, sizeof (tr_file_index_t)); gtk_tree_model_foreach (gtk_tree_view_get_model (view), getSelectedFilesForeach, &data); return data.array; } struct SubtreeForeachData { GArray * array; GtkTreePath * path; }; static gboolean getSubtreeForeach (GtkTreeModel * model, GtkTreePath * path, GtkTreeIter * iter, gpointer gdata) { const gboolean is_file = !gtk_tree_model_iter_has_child (model, iter); if (is_file) { struct SubtreeForeachData * data = gdata; if (!gtk_tree_path_compare (path, data->path) || gtk_tree_path_is_descendant (path, data->path)) { unsigned int i; gtk_tree_model_get (model, iter, FC_INDEX, &i, -1); g_array_append_val (data->array, i); } } return FALSE; /* keep walking */ } static void getSubtree (GtkTreeView * view, GtkTreePath * path, GArray * indices) { struct SubtreeForeachData tmp; tmp.array = indices; tmp.path = path; gtk_tree_model_foreach (gtk_tree_view_get_model (view), getSubtreeForeach, &tmp); } /* if `path' is a selected row, all selected rows are returned. * otherwise, only the row indicated by `path' is returned. * this is for toggling all the selected rows' states in a batch. */ static GArray* getActiveFilesForPath (GtkTreeView * view, GtkTreePath * path) { GArray * indices; GtkTreeSelection * sel = gtk_tree_view_get_selection (view); if (gtk_tree_selection_path_is_selected (sel, path)) { /* clicked in a selected row... use the current selection */ indices = getSelectedFilesAndDescendants (view); } else { /* clicked OUTSIDE of the selected row... just use the clicked row */ indices = g_array_new (FALSE, FALSE, sizeof (tr_file_index_t)); getSubtree (view, path, indices); } return indices; } /*** **** ***/ void gtr_file_list_clear (GtkWidget * w) { gtr_file_list_set_torrent (w, -1); } struct build_data { GtkWidget * w; tr_torrent * tor; GtkTreeIter * iter; GtkTreeStore * store; }; struct row_struct { uint64_t length; char * name; int index; }; static void buildTree (GNode * node, gpointer gdata) { char size_str[64]; GtkTreeIter child_iter; struct build_data * build = gdata; struct row_struct *child_data = node->data; const gboolean isLeaf = node->children == NULL; const char * mime_type = isLeaf ? gtr_get_mime_type_from_filename (child_data->name) : DIRECTORY_MIME_TYPE; GdkPixbuf * icon = gtr_get_mime_type_icon (mime_type, GTK_ICON_SIZE_MENU, build->w); const tr_info * inf = tr_torrentInfo (build->tor); const int priority = isLeaf ? inf->files[ child_data->index ].priority : 0; const gboolean enabled = isLeaf ? !inf->files[ child_data->index ].dnd : TRUE; char * name_esc = g_markup_escape_text (child_data->name, -1); tr_strlsize (size_str, child_data->length, sizeof size_str); gtk_tree_store_insert_with_values (build->store, &child_iter, build->iter, INT_MAX, FC_INDEX, child_data->index, FC_LABEL, child_data->name, FC_LABEL_ESC, name_esc, FC_SIZE, child_data->length, FC_SIZE_STR, size_str, FC_ICON, icon, FC_PRIORITY, priority, FC_ENABLED, enabled, -1); if (!isLeaf) { struct build_data b = *build; b.iter = &child_iter; g_node_children_foreach (node, G_TRAVERSE_ALL, buildTree, &b); } g_free (name_esc); g_object_unref (icon); /* we're done with this node */ g_free (child_data->name); g_free (child_data); } static GNode* find_child (GNode* parent, const char * name) { GNode * child = parent->children; while (child) { const struct row_struct * child_data = child->data; if ((*child_data->name == *name) && !g_strcmp0 (child_data->name, name)) break; child = child->next; } return child; } void gtr_file_list_set_torrent (GtkWidget * w, int torrentId) { GtkTreeStore * store; FileData * data = g_object_get_data (G_OBJECT (w), "file-data"); /* unset the old fields */ clearData (data); /* instantiate the model */ store = gtk_tree_store_new (N_FILE_COLS, GDK_TYPE_PIXBUF, /* icon */ G_TYPE_STRING, /* label */ G_TYPE_STRING, /* label esc */ G_TYPE_INT, /* prog [0..100] */ G_TYPE_UINT, /* index */ G_TYPE_UINT64, /* size */ G_TYPE_STRING, /* size str */ G_TYPE_UINT64, /* have */ G_TYPE_INT, /* priority */ G_TYPE_INT); /* dl enabled */ data->store = store; data->model = GTK_TREE_MODEL (store); data->torrentId = torrentId; /* populate the model */ if (torrentId > 0) { tr_torrent * tor = gtr_core_find_torrent (data->core, torrentId); if (tor != NULL) { tr_file_index_t i; const tr_info * inf = tr_torrentInfo (tor); struct row_struct * root_data; GNode * root; struct build_data build; /* build a GNode tree of the files */ root_data = g_new0 (struct row_struct, 1); root_data->name = g_strdup (tr_torrentName (tor)); root_data->index = -1; root_data->length = 0; root = g_node_new (root_data); for (i=0; ifileCount; ++i) { int j; GNode * parent = root; const tr_file * file = &inf->files[i]; char ** tokens = g_strsplit (file->name, G_DIR_SEPARATOR_S, 0); for (j=0; tokens[j]; ++j) { const gboolean isLeaf = tokens[j+1] == NULL; const char * name = tokens[j]; GNode * node = find_child (parent, name); if (node == NULL) { struct row_struct * row = g_new (struct row_struct, 1); row->name = g_strdup (name); row->index = isLeaf ? (int)i : -1; row->length = isLeaf ? file->length : 0; node = g_node_new (row); g_node_append (parent, node); } parent = node; } g_strfreev (tokens); } /* now, add them to the model */ build.w = w; build.tor = tor; build.store = data->store; build.iter = NULL; g_node_children_foreach (root, G_TRAVERSE_ALL, buildTree, &build); /* cleanup */ g_node_destroy (root); g_free (root_data->name); g_free (root_data); } refresh (data); data->timeout_tag = gdk_threads_add_timeout_seconds (SECONDARY_WINDOW_REFRESH_INTERVAL_SECONDS, refreshModel, data); } gtk_tree_view_set_model (GTK_TREE_VIEW (data->view), data->model); gtk_tree_view_expand_all (GTK_TREE_VIEW (data->view)); g_object_unref (data->model); } /*** **** ***/ static void renderDownload (GtkTreeViewColumn * column UNUSED, GtkCellRenderer * renderer, GtkTreeModel * model, GtkTreeIter * iter, gpointer data UNUSED) { gboolean enabled; gtk_tree_model_get (model, iter, FC_ENABLED, &enabled, -1); g_object_set (renderer, "inconsistent", (enabled==MIXED), "active", (enabled==TRUE), NULL); } static void renderPriority (GtkTreeViewColumn * column UNUSED, GtkCellRenderer * renderer, GtkTreeModel * model, GtkTreeIter * iter, gpointer data UNUSED) { int priority; const char * text; gtk_tree_model_get (model, iter, FC_PRIORITY, &priority, -1); switch (priority) { case TR_PRI_HIGH: text = _("High"); break; case TR_PRI_NORMAL: text = _("Normal"); break; case TR_PRI_LOW: text = _("Low"); break; default: text = _("Mixed"); break; } g_object_set (renderer, "text", text, NULL); } /* build a filename from tr_torrentGetCurrentDir () + the model's FC_LABELs */ static char* buildFilename (tr_torrent * tor, GtkTreeModel * model, GtkTreePath * path, GtkTreeIter * iter) { char * ret; GtkTreeIter child; GtkTreeIter parent = *iter; int n = gtk_tree_path_get_depth (path); char ** tokens = g_new0 (char*, n + 2); tokens[0] = g_strdup (tr_torrentGetCurrentDir (tor)); do { child = parent; gtk_tree_model_get (model, &child, FC_LABEL, &tokens[n--], -1); } while (gtk_tree_model_iter_parent (model, &parent, &child)); ret = g_build_filenamev (tokens); g_strfreev (tokens); return ret; } static gboolean onRowActivated (GtkTreeView * view, GtkTreePath * path, GtkTreeViewColumn * col UNUSED, gpointer gdata) { gboolean handled = FALSE; FileData * data = gdata; tr_torrent * tor = gtr_core_find_torrent (data->core, data->torrentId); if (tor != NULL) { GtkTreeIter iter; GtkTreeModel * model = gtk_tree_view_get_model (view); if (gtk_tree_model_get_iter (model, &iter, path)) { int prog; char * filename = buildFilename (tor, model, path, &iter); gtk_tree_model_get (model, &iter, FC_PROG, &prog, -1); /* if the file's not done, walk up the directory tree until we find * an ancestor that exists, and open that instead */ if (filename && (prog<100 || !g_file_test (filename, G_FILE_TEST_EXISTS))) do { char * tmp = g_path_get_dirname (filename); g_free (filename); filename = tmp; } while (filename && *filename && !g_file_test (filename, G_FILE_TEST_EXISTS)); if ((handled = filename && *filename)) gtr_open_file (filename); } } return handled; } static gboolean onViewPathToggled (GtkTreeView * view, GtkTreeViewColumn * col, GtkTreePath * path, FileData * data) { int cid; tr_torrent * tor; gboolean handled = FALSE; if (!col || !path) return FALSE; cid = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (col), TR_COLUMN_ID_KEY)); tor = gtr_core_find_torrent (data->core, data->torrentId); if ((tor != NULL) && ((cid == FC_PRIORITY) || (cid == FC_ENABLED))) { GtkTreeIter iter; GArray * indices = getActiveFilesForPath (view, path); GtkTreeModel * model = data->model; gtk_tree_model_get_iter (model, &iter, path); if (cid == FC_PRIORITY) { int priority; gtk_tree_model_get (model, &iter, FC_PRIORITY, &priority, -1); switch (priority) { case TR_PRI_NORMAL: priority = TR_PRI_HIGH; break; case TR_PRI_HIGH: priority = TR_PRI_LOW; break; default: priority = TR_PRI_NORMAL; break; } tr_torrentSetFilePriorities (tor, (tr_file_index_t *) indices->data, (tr_file_index_t) indices->len, priority); } else { int enabled; gtk_tree_model_get (model, &iter, FC_ENABLED, &enabled, -1); enabled = !enabled; tr_torrentSetFileDLs (tor, (tr_file_index_t *) indices->data, (tr_file_index_t) indices->len, enabled); } refresh (data); g_array_free (indices, TRUE); handled = TRUE; } return handled; } /** * @note 'col' and 'path' are assumed not to be NULL. */ static gboolean getAndSelectEventPath (GtkTreeView * treeview, GdkEventButton * event, GtkTreeViewColumn ** col, GtkTreePath ** path) { GtkTreeSelection * sel; if (gtk_tree_view_get_path_at_pos (treeview, event->x, event->y, path, col, NULL, NULL)) { sel = gtk_tree_view_get_selection (treeview); if (!gtk_tree_selection_path_is_selected (sel, *path)) { gtk_tree_selection_unselect_all (sel); gtk_tree_selection_select_path (sel, *path); } return TRUE; } return FALSE; } static gboolean onViewButtonPressed (GtkWidget * w, GdkEventButton * event, gpointer gdata) { GtkTreeViewColumn * col; GtkTreePath * path = NULL; gboolean handled = FALSE; GtkTreeView * treeview = GTK_TREE_VIEW (w); FileData * data = gdata; if ((event->type == GDK_BUTTON_PRESS) && (event->button == 1) && ! (event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) && getAndSelectEventPath (treeview, event, &col, &path)) { handled = onViewPathToggled (treeview, col, path, data); if (path != NULL) gtk_tree_path_free (path); } return handled; } struct rename_data { int error; char * newname; char * path_string; FileData * file_data; }; static int on_rename_done_idle (struct rename_data * data) { if (data->error == 0) { GtkTreeIter iter; if (gtk_tree_model_get_iter_from_string (data->file_data->model, &iter, data->path_string)) gtk_tree_store_set (data->file_data->store, &iter, FC_LABEL, data->newname, -1); } else { GtkWidget * w = gtk_message_dialog_new ( GTK_WINDOW (gtk_widget_get_toplevel(data->file_data->top)), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Unable to rename file as \"%s\": %s"), data->newname, tr_strerror(data->error)); gtk_message_dialog_format_secondary_text ( GTK_MESSAGE_DIALOG (w), "%s", _("Please correct the errors and try again.")); gtk_dialog_run (GTK_DIALOG (w)); gtk_widget_destroy (w); } /* cleanup */ g_free (data->path_string); g_free (data->newname); g_free (data); return G_SOURCE_REMOVE; } static void on_rename_done (tr_torrent * tor G_GNUC_UNUSED, const char * oldpath G_GNUC_UNUSED, const char * newname G_GNUC_UNUSED, int error, struct rename_data * rename_data) { rename_data->error = error; gdk_threads_add_idle ((GSourceFunc)on_rename_done_idle, rename_data); } static void cell_edited_callback (GtkCellRendererText * cell G_GNUC_UNUSED, gchar * path_string, gchar * newname, FileData * data) { tr_torrent * tor; GString * oldpath; GtkTreeIter iter; struct rename_data * rename_data; tor = gtr_core_find_torrent (data->core, data->torrentId); if (tor == NULL) return; if (!gtk_tree_model_get_iter_from_string (data->model, &iter, path_string)) return; /* build oldpath */ oldpath = g_string_new (NULL); for (;;) { char * token = NULL; GtkTreeIter child; gtk_tree_model_get (data->model, &iter, FC_LABEL, &token, -1); g_string_prepend (oldpath, token); g_free (token); child = iter; if (!gtk_tree_model_iter_parent (data->model, &iter, &child)) break; g_string_prepend_c (oldpath, G_DIR_SEPARATOR); } /* do the renaming */ rename_data = g_new0 (struct rename_data, 1); rename_data->newname = g_strdup (newname); rename_data->file_data = data; rename_data->path_string = g_strdup (path_string); tr_torrentRenamePath (tor, oldpath->str, newname, (tr_torrent_rename_done_func)on_rename_done, rename_data); /* cleanup */ g_string_free (oldpath, TRUE); } GtkWidget * gtr_file_list_new (TrCore * core, int torrentId) { int size; int width; GtkWidget * ret; GtkWidget * view; GtkWidget * scroll; GtkCellRenderer * rend; GtkTreeSelection * sel; GtkTreeViewColumn * col; GtkTreeView * tree_view; const char * title; PangoLayout * pango_layout; PangoContext * pango_context; PangoFontDescription * pango_font_description; FileData * data = g_new0 (FileData, 1); data->core = core; /* create the view */ view = gtk_tree_view_new (); tree_view = GTK_TREE_VIEW (view); gtk_tree_view_set_rules_hint (tree_view, TRUE); gtk_container_set_border_width (GTK_CONTAINER (view), GUI_PAD_BIG); g_signal_connect (view, "button-press-event", G_CALLBACK (onViewButtonPressed), data); g_signal_connect (view, "row_activated", G_CALLBACK (onRowActivated), data); g_signal_connect (view, "button-release-event", G_CALLBACK (on_tree_view_button_released), NULL); pango_context = gtk_widget_create_pango_context (view); pango_font_description = pango_font_description_copy (pango_context_get_font_description (pango_context)); size = pango_font_description_get_size (pango_font_description); pango_font_description_set_size (pango_font_description, size * 0.8); g_object_unref (G_OBJECT (pango_context)); /* set up view */ sel = gtk_tree_view_get_selection (tree_view); gtk_tree_selection_set_mode (sel, GTK_SELECTION_MULTIPLE); gtk_tree_view_expand_all (tree_view); gtk_tree_view_set_search_column (tree_view, FC_LABEL); /* add file column */ col = GTK_TREE_VIEW_COLUMN (g_object_new (GTK_TYPE_TREE_VIEW_COLUMN, "expand", TRUE, "title", _("Name"), NULL)); gtk_tree_view_column_set_resizable (col, TRUE); rend = gtk_cell_renderer_pixbuf_new (); gtk_tree_view_column_pack_start (col, rend, FALSE); gtk_tree_view_column_add_attribute (col, rend, "pixbuf", FC_ICON); /* add text renderer */ rend = gtk_cell_renderer_text_new (); g_object_set (rend, "editable", TRUE, NULL); g_object_set (rend, "ellipsize", PANGO_ELLIPSIZE_END, "font-desc", pango_font_description, NULL); g_signal_connect (rend, "edited", (GCallback)cell_edited_callback, data); gtk_tree_view_column_pack_start (col, rend, TRUE); gtk_tree_view_column_set_attributes (col, rend, "text", FC_LABEL, NULL); gtk_tree_view_column_set_sort_column_id (col, FC_LABEL); gtk_tree_view_append_column (tree_view, col); /* add "size" column */ title = _("Size"); rend = gtk_cell_renderer_text_new (); g_object_set (rend, "alignment", PANGO_ALIGN_RIGHT, "font-desc", pango_font_description, "xpad", GUI_PAD, "xalign", 1.0f, "yalign", 0.5f, NULL); col = gtk_tree_view_column_new_with_attributes (title, rend, NULL); gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_GROW_ONLY); gtk_tree_view_column_set_sort_column_id (col, FC_SIZE); gtk_tree_view_column_set_attributes (col, rend, "text", FC_SIZE_STR, NULL); gtk_tree_view_append_column (tree_view, col); /* add "progress" column */ title = _("Have"); pango_layout = gtk_widget_create_pango_layout (view, title); pango_layout_get_pixel_size (pango_layout, &width, NULL); width += 30; /* room for the sort indicator */ g_object_unref (G_OBJECT (pango_layout)); rend = gtk_cell_renderer_progress_new (); col = gtk_tree_view_column_new_with_attributes (title, rend, "value", FC_PROG, NULL); gtk_tree_view_column_set_fixed_width (col, width); gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_sort_column_id (col, FC_PROG); gtk_tree_view_append_column (tree_view, col); /* add "enabled" column */ title = _("Download"); pango_layout = gtk_widget_create_pango_layout (view, title); pango_layout_get_pixel_size (pango_layout, &width, NULL); width += 30; /* room for the sort indicator */ g_object_unref (G_OBJECT (pango_layout)); rend = gtk_cell_renderer_toggle_new (); col = gtk_tree_view_column_new_with_attributes (title, rend, NULL); g_object_set_data (G_OBJECT (col), TR_COLUMN_ID_KEY, GINT_TO_POINTER (FC_ENABLED)); gtk_tree_view_column_set_fixed_width (col, width); gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_cell_data_func (col, rend, renderDownload, NULL, NULL); gtk_tree_view_column_set_sort_column_id (col, FC_ENABLED); gtk_tree_view_append_column (tree_view, col); /* add priority column */ title = _("Priority"); pango_layout = gtk_widget_create_pango_layout (view, title); pango_layout_get_pixel_size (pango_layout, &width, NULL); width += 30; /* room for the sort indicator */ g_object_unref (G_OBJECT (pango_layout)); rend = gtk_cell_renderer_text_new (); g_object_set (rend, "xalign", (gfloat)0.5, "yalign", (gfloat)0.5, NULL); col = gtk_tree_view_column_new_with_attributes (title, rend, NULL); g_object_set_data (G_OBJECT (col), TR_COLUMN_ID_KEY, GINT_TO_POINTER (FC_PRIORITY)); gtk_tree_view_column_set_fixed_width (col, width); gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_sort_column_id (col, FC_PRIORITY); gtk_tree_view_column_set_cell_data_func (col, rend, renderPriority, NULL, NULL); gtk_tree_view_append_column (tree_view, col); /* add tooltip to tree */ gtk_tree_view_set_tooltip_column (tree_view, FC_LABEL_ESC); /* create the scrolled window and stick the view in it */ scroll = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER (scroll), view); gtk_widget_set_size_request (scroll, -1, 200); ret = scroll; data->view = view; data->top = scroll; g_object_set_data_full (G_OBJECT (ret), "file-data", data, freeData); gtr_file_list_set_torrent (ret, torrentId); pango_font_description_free (pango_font_description); return ret; } transmission-2.92/gtk/PaxHeaders.4960/actions.c0000644000000000000000000000013212663770154016262 xustar0030 mtime=1456468076.229929799 30 atime=1456468076.228929781 30 ctime=1457295921.030825433 transmission-2.92/gtk/actions.c0000644000175000017500000003004012663770154017704 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: actions.c 14681 2016-02-23 04:34:57Z mikedld $ */ #include #include #include #include #include "actions.h" #include "conf.h" #include "tr-core.h" #include "tr-prefs.h" #define UNUSED G_GNUC_UNUSED static TrCore * myCore = NULL; static GtkActionGroup * myGroup = NULL; static void action_cb (GtkAction * a, gpointer user_data) { gtr_actions_handler (gtk_action_get_name (a), user_data); } static GtkRadioActionEntry sort_radio_entries[] = { { "sort-by-activity", NULL, N_("Sort by _Activity"), NULL, NULL, 0 }, { "sort-by-name", NULL, N_("Sort by _Name"), NULL, NULL, 1 }, { "sort-by-progress", NULL, N_("Sort by _Progress"), NULL, NULL, 2 }, { "sort-by-queue", NULL, N_("Sort by _Queue"), NULL, NULL, 3 }, { "sort-by-ratio", NULL, N_("Sort by Rati_o"), NULL, NULL, 4 }, { "sort-by-state", NULL, N_("Sort by Stat_e"), NULL, NULL, 5 }, { "sort-by-age", NULL, N_("Sort by A_ge"), NULL, NULL, 6 }, { "sort-by-time-left", NULL, N_("Sort by Time _Left"), NULL, NULL, 7 }, { "sort-by-size", NULL, N_("Sort by Si_ze"), NULL, NULL, 8 } }; static void sort_changed_cb (GtkAction * action UNUSED, GtkRadioAction * current, gpointer user_data UNUSED) { const tr_quark key = TR_KEY_sort_mode; const int i = gtk_radio_action_get_current_value (current); const char * val = sort_radio_entries[i].name; gtr_core_set_pref (myCore, key, val); } static GtkToggleActionEntry show_toggle_entries[] = { { "toggle-main-window", NULL, N_("_Show Transmission"), NULL, NULL, G_CALLBACK (action_cb), TRUE }, { "toggle-message-log", NULL, N_("Message _Log"), NULL, NULL, G_CALLBACK (action_cb), FALSE } }; static void toggle_pref_cb (GtkToggleAction * action, gpointer user_data UNUSED) { const char * key = gtk_action_get_name (GTK_ACTION (action)); const gboolean val = gtk_toggle_action_get_active (action); gtr_core_set_pref_bool (myCore, tr_quark_new(key, TR_BAD_SIZE), val); } static GtkToggleActionEntry pref_toggle_entries[] = { { "alt-speed-enabled", NULL, N_("Enable Alternative Speed _Limits"), NULL, NULL, G_CALLBACK (toggle_pref_cb), FALSE }, { "compact-view", NULL, N_("_Compact View"), "C", NULL, G_CALLBACK (toggle_pref_cb), FALSE }, { "sort-reversed", NULL, N_("Re_verse Sort Order"), NULL, NULL, G_CALLBACK (toggle_pref_cb), FALSE }, { "show-filterbar", NULL, N_("_Filterbar"), NULL, NULL, G_CALLBACK (toggle_pref_cb), FALSE }, { "show-statusbar", NULL, N_("_Statusbar"), NULL, NULL, G_CALLBACK (toggle_pref_cb), FALSE }, { "show-toolbar", NULL, N_("_Toolbar"), NULL, NULL, G_CALLBACK (toggle_pref_cb), FALSE } }; static GtkActionEntry entries[] = { { "file-menu", NULL, N_("_File"), NULL, NULL, NULL }, { "torrent-menu", NULL, N_("_Torrent"), NULL, NULL, NULL }, { "view-menu", NULL, N_("_View"), NULL, NULL, NULL }, { "sort-menu", NULL, N_("_Sort Torrents By"), NULL, NULL, NULL }, { "queue-menu", NULL, N_("_Queue"), NULL, NULL, NULL }, { "edit-menu", NULL, N_("_Edit"), NULL, NULL, NULL }, { "help-menu", NULL, N_("_Help"), NULL, NULL, NULL }, { "copy-magnet-link-to-clipboard", GTK_STOCK_COPY, N_("Copy _Magnet Link to Clipboard"), "", NULL, G_CALLBACK (action_cb) }, { "open-torrent-from-url", GTK_STOCK_OPEN, N_("Open _URL…"), "U", N_("Open URL…"), G_CALLBACK (action_cb) }, { "open-torrent-toolbar", GTK_STOCK_OPEN, NULL, NULL, N_("Open a torrent"), G_CALLBACK (action_cb) }, { "open-torrent-menu", GTK_STOCK_OPEN, NULL, NULL, N_("Open a torrent"), G_CALLBACK (action_cb) }, { "torrent-start", GTK_STOCK_MEDIA_PLAY, N_("_Start"), "S", N_("Start torrent"), G_CALLBACK (action_cb) }, { "torrent-start-now", GTK_STOCK_MEDIA_PLAY, N_("Start _Now"), "S", N_("Start torrent now"), G_CALLBACK (action_cb) }, { "show-stats", NULL, N_("_Statistics"), NULL, NULL, G_CALLBACK (action_cb) }, { "donate", NULL, N_("_Donate"), NULL, NULL, G_CALLBACK (action_cb) }, { "torrent-verify", NULL, N_("_Verify Local Data"), "V", NULL, G_CALLBACK (action_cb) }, { "torrent-stop", GTK_STOCK_MEDIA_PAUSE, N_("_Pause"), "P", N_("Pause torrent"), G_CALLBACK (action_cb) }, { "pause-all-torrents", GTK_STOCK_MEDIA_PAUSE, N_("_Pause All"), NULL, N_("Pause all torrents"), G_CALLBACK (action_cb) }, { "start-all-torrents", GTK_STOCK_MEDIA_PLAY, N_("_Start All"), NULL, N_("Start all torrents"), G_CALLBACK (action_cb) }, { "relocate-torrent", NULL, N_("Set _Location…"), NULL, NULL, G_CALLBACK (action_cb) }, { "remove-torrent", GTK_STOCK_REMOVE, NULL, "Delete", N_("Remove torrent"), G_CALLBACK (action_cb) }, { "delete-torrent", GTK_STOCK_DELETE, N_("_Delete Files and Remove"), "Delete", NULL, G_CALLBACK (action_cb) }, { "new-torrent", GTK_STOCK_NEW, N_("_New…"), NULL, N_("Create a torrent"), G_CALLBACK (action_cb) }, { "quit", GTK_STOCK_QUIT, N_("_Quit"), NULL, NULL, G_CALLBACK (action_cb) }, { "select-all", GTK_STOCK_SELECT_ALL, N_("Select _All"), "A", NULL, G_CALLBACK (action_cb) }, { "deselect-all", NULL, N_("Dese_lect All"), "A", NULL, G_CALLBACK (action_cb) }, { "edit-preferences", GTK_STOCK_PREFERENCES, NULL, NULL, NULL, G_CALLBACK (action_cb) }, { "show-torrent-properties", GTK_STOCK_PROPERTIES, NULL, "Return", N_("Torrent properties"), G_CALLBACK (action_cb) }, { "open-torrent-folder", GTK_STOCK_OPEN, N_("Open Fold_er"), "E", NULL, G_CALLBACK (action_cb) }, { "show-about-dialog", GTK_STOCK_ABOUT, NULL, NULL, NULL, G_CALLBACK (action_cb) }, { "help", GTK_STOCK_HELP, N_("_Contents"), "F1", NULL, G_CALLBACK (action_cb) }, { "torrent-reannounce", GTK_STOCK_NETWORK, N_("Ask Tracker for _More Peers"), NULL, NULL, G_CALLBACK (action_cb) }, { "queue-move-top", GTK_STOCK_GOTO_TOP, N_("Move to _Top"), NULL, NULL, G_CALLBACK (action_cb) }, { "queue-move-up", GTK_STOCK_GO_UP, N_("Move _Up"), NULL, NULL, G_CALLBACK (action_cb) }, { "queue-move-down", GTK_STOCK_GO_DOWN, N_("Move _Down"), NULL, NULL, G_CALLBACK (action_cb) }, { "queue-move-bottom", GTK_STOCK_GOTO_BOTTOM, N_("Move to _Bottom"), NULL, NULL, G_CALLBACK (action_cb) }, { "present-main-window", NULL, N_("Present Main Window"), NULL, NULL, G_CALLBACK (action_cb) } }; typedef struct { const char * filename; const char * name; } BuiltinIconInfo; static const BuiltinIconInfo my_fallback_icons[] = { { "logo-48", WINDOW_ICON }, { "logo-24", TRAY_ICON }, { "logo-48", NOTIFICATION_ICON }, { "lock", "transmission-lock" }, { "utilities", "utilities" }, { "turtle-blue", "alt-speed-on" }, { "turtle-grey", "alt-speed-off" }, { "ratio", "ratio" } }; static void register_my_icons (void) { int i; const int n = G_N_ELEMENTS (my_fallback_icons); GtkIconTheme * theme = gtk_icon_theme_get_default (); GtkIconFactory * factory = gtk_icon_factory_new (); gtk_icon_factory_add_default (factory); for (i=0; inext) { GtkActionGroup * action_group = GTK_ACTION_GROUP (l->data); GList * ait, *actions = gtk_action_group_list_actions ( action_group); for (ait = actions; ait != NULL; ait = ait->next) { GtkAction * action = GTK_ACTION (ait->data); const char * name = gtk_action_get_name (action); g_hash_table_insert (key_to_action, g_strdup (name), action); } g_list_free (actions); } } static GtkAction* get_action (const char* name) { ensure_action_map_loaded (myUIManager); return (GtkAction*) g_hash_table_lookup (key_to_action, name); } void gtr_action_activate (const char * name) { GtkAction * action = get_action (name); g_assert (action != NULL); gtk_action_activate (action); } void gtr_action_set_sensitive (const char * name, gboolean b) { GtkAction * action = get_action (name); g_assert (action != NULL); g_object_set (action, "sensitive", b, NULL); } void gtr_action_set_important (const char * name, gboolean b) { GtkAction * action = get_action (name); g_assert (action != NULL); g_object_set (action, "is-important", b, NULL); } void gtr_action_set_toggled (const char * name, gboolean b) { GtkAction * action = get_action (name); gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), b); } GtkWidget* gtr_action_get_widget (const char * path) { return gtk_ui_manager_get_widget (myUIManager, path); } transmission-2.92/gtk/PaxHeaders.4960/makemeta-ui.h0000644000000000000000000000007412617356116017030 xustar0030 atime=1456201459.058219655 30 ctime=1457295920.942823937 transmission-2.92/gtk/makemeta-ui.h0000644000175000017500000000066312617356116020455 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: makemeta-ui.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef GTR_TORRENT_CREATION_DIALOG_H #define GTR_TORRENT_CREATION_DIALOG_H #include #include "tr-core.h" GtkWidget* gtr_torrent_creation_dialog_new (GtkWindow * parent, TrCore * core); #endif transmission-2.92/gtk/PaxHeaders.4960/relocate.c0000644000000000000000000000007412617356116016422 xustar0030 atime=1456201459.061219706 30 ctime=1457295921.107826743 transmission-2.92/gtk/relocate.c0000644000175000017500000001412712617356116020047 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: relocate.c 14241 2014-01-21 03:10:30Z jordan $ */ #include #include #include #include "conf.h" /* gtr_pref_string_get */ #include "hig.h" #include "relocate.h" #include "util.h" #define DATA_KEY "gtr-relocate-data" static char * previousLocation = NULL; struct relocate_dialog_data { int done; bool do_move; guint timer; TrCore * core; GSList * torrent_ids; GtkWidget * message_dialog; GtkWidget * chooser_dialog; }; static void data_free (gpointer gdata) { struct relocate_dialog_data * data = gdata; g_source_remove (data->timer); g_slist_free (data->torrent_ids); g_free (data); } /*** **** ***/ static void startMovingNextTorrent (struct relocate_dialog_data * data) { char * str; const int id = GPOINTER_TO_INT (data->torrent_ids->data); tr_torrent * tor = gtr_core_find_torrent (data->core, id); if (tor != NULL) tr_torrentSetLocation (tor, previousLocation, data->do_move, NULL, &data->done); data->torrent_ids = g_slist_delete_link (data->torrent_ids, data->torrent_ids); str = g_strdup_printf (_("Moving \"%s\""), tr_torrentName (tor)); gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (data->message_dialog), str); g_free (str); } /* every once in awhile, check to see if the move is done. * if so, delete the dialog */ static gboolean onTimer (gpointer gdata) { struct relocate_dialog_data * data = gdata; const int done = data->done; if (done == TR_LOC_ERROR) { const int flags = GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT; GtkWidget * w = gtk_message_dialog_new (GTK_WINDOW (data->message_dialog), flags, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", _("Couldn't move torrent")); gtk_dialog_run (GTK_DIALOG (w)); gtk_widget_destroy (GTK_WIDGET (data->message_dialog)); } else if (done == TR_LOC_DONE) { if (data->torrent_ids != NULL) startMovingNextTorrent (data); else gtk_widget_destroy (GTK_WIDGET (data->chooser_dialog)); } return G_SOURCE_CONTINUE; } static void onResponse (GtkDialog * dialog, int response, gpointer unused UNUSED) { if (response == GTK_RESPONSE_APPLY) { GtkWidget * w; GObject * d = G_OBJECT (dialog); struct relocate_dialog_data * data = g_object_get_data (d, DATA_KEY); GtkFileChooser * chooser = g_object_get_data (d, "chooser"); GtkToggleButton * move_tb = g_object_get_data (d, "move_rb"); char * location = gtk_file_chooser_get_filename (chooser); data->do_move = gtk_toggle_button_get_active (move_tb); /* pop up a dialog saying that the work is in progress */ w = gtk_message_dialog_new (GTK_WINDOW (dialog), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, NULL); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), _("This may take a moment…")); gtk_dialog_set_response_sensitive (GTK_DIALOG (w), GTK_RESPONSE_CLOSE, FALSE); gtk_widget_show (w); /* remember this location so that it can be the default next time */ g_free (previousLocation); previousLocation = location; /* start the move and periodically check its status */ data->message_dialog = w; data->done = TR_LOC_DONE; data->timer = gdk_threads_add_timeout_seconds (1, onTimer, data); onTimer (data); } else { gtk_widget_destroy (GTK_WIDGET (dialog)); } } GtkWidget* gtr_relocate_dialog_new (GtkWindow * parent, TrCore * core, GSList * torrent_ids) { guint row; GtkWidget * w; GtkWidget * d; GtkWidget * t; struct relocate_dialog_data * data; d = gtk_dialog_new_with_buttons (_("Set Torrent Location"), parent, GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, NULL); gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_CANCEL); gtk_dialog_set_alternative_button_order (GTK_DIALOG (d), GTK_RESPONSE_APPLY, GTK_RESPONSE_CANCEL, -1); g_signal_connect (d, "response", G_CALLBACK (onResponse), NULL); row = 0; t = hig_workarea_create (); hig_workarea_add_section_title (t, &row, _("Location")); if (previousLocation == NULL) previousLocation = g_strdup (gtr_pref_string_get (TR_KEY_download_dir)); w = gtk_file_chooser_button_new (_("Set Torrent Location"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (w), previousLocation); g_object_set_data (G_OBJECT (d), "chooser", w); hig_workarea_add_row (t, &row, _("Torrent _location:"), w, NULL); w = gtk_radio_button_new_with_mnemonic (NULL, _("_Move from the current folder")); g_object_set_data (G_OBJECT (d), "move_rb", w); hig_workarea_add_wide_control (t, &row, w); w = gtk_radio_button_new_with_mnemonic_from_widget (GTK_RADIO_BUTTON (w), _("Local data is _already there")); hig_workarea_add_wide_control (t, &row, w); gtr_dialog_set_content (GTK_DIALOG (d), t); data = g_new0 (struct relocate_dialog_data, 1); data->core = core; data->torrent_ids = torrent_ids; data->chooser_dialog = d; g_object_set_data_full (G_OBJECT (d), DATA_KEY, data, data_free); return d; } transmission-2.92/gtk/PaxHeaders.4960/conf.c0000644000000000000000000000007412617356116015551 xustar0030 atime=1456201459.051219536 30 ctime=1457295921.035825518 transmission-2.92/gtk/conf.c0000644000175000017500000001344512617356116017200 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: conf.c 14526 2015-05-09 11:56:35Z mikedld $ * * Copyright (c) Transmission authors and contributors * * 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. *****************************************************************************/ #include #include #include /* strtol () */ #include #include #include #include #include #include #include #include "conf.h" #include "tr-prefs.h" #include "util.h" #define MY_CONFIG_NAME "transmission" #define MY_READABLE_NAME "transmission-gtk" static char * gl_confdir = NULL; void gtr_pref_init (const char * config_dir) { gl_confdir = g_strdup (config_dir); } /*** **** **** Preferences **** ***/ /** * This is where we initialize the preferences file with the default values. * If you add a new preferences key, you /must/ add a default value here. */ static void tr_prefs_init_defaults (tr_variant * d) { const char * dir; dir = g_get_user_special_dir (G_USER_DIRECTORY_DOWNLOAD); if (dir == NULL) dir = g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP); if (dir == NULL) dir = tr_getDefaultDownloadDir (); tr_variantDictReserve (d, 29); tr_variantDictAddStr (d, TR_KEY_watch_dir, dir); tr_variantDictAddBool (d, TR_KEY_watch_dir_enabled, FALSE); tr_variantDictAddBool (d, TR_KEY_user_has_given_informed_consent, FALSE); tr_variantDictAddBool (d, TR_KEY_inhibit_desktop_hibernation, FALSE); tr_variantDictAddBool (d, TR_KEY_blocklist_updates_enabled, TRUE); tr_variantDictAddStr (d, TR_KEY_open_dialog_dir, g_get_home_dir ()); tr_variantDictAddBool (d, TR_KEY_show_toolbar, TRUE); tr_variantDictAddBool (d, TR_KEY_show_filterbar, TRUE); tr_variantDictAddBool (d, TR_KEY_show_statusbar, TRUE); tr_variantDictAddBool (d, TR_KEY_trash_can_enabled, TRUE); tr_variantDictAddBool (d, TR_KEY_show_notification_area_icon, FALSE); tr_variantDictAddBool (d, TR_KEY_show_tracker_scrapes, FALSE); tr_variantDictAddBool (d, TR_KEY_show_extra_peer_details, FALSE); tr_variantDictAddBool (d, TR_KEY_show_backup_trackers, FALSE); tr_variantDictAddStr (d, TR_KEY_statusbar_stats, "total-ratio"); tr_variantDictAddBool (d, TR_KEY_torrent_added_notification_enabled, true); tr_variantDictAddBool (d, TR_KEY_torrent_complete_notification_enabled, true); tr_variantDictAddStr (d, TR_KEY_torrent_complete_sound_command, "canberra-gtk-play -i complete-download -d 'transmission torrent downloaded'"); tr_variantDictAddBool (d, TR_KEY_torrent_complete_sound_enabled, true); tr_variantDictAddBool (d, TR_KEY_show_options_window, TRUE); tr_variantDictAddBool (d, TR_KEY_main_window_is_maximized, FALSE); tr_variantDictAddInt (d, TR_KEY_main_window_height, 500); tr_variantDictAddInt (d, TR_KEY_main_window_width, 300); tr_variantDictAddInt (d, TR_KEY_main_window_x, 50); tr_variantDictAddInt (d, TR_KEY_main_window_y, 50); tr_variantDictAddStr (d, TR_KEY_download_dir, dir); tr_variantDictAddStr (d, TR_KEY_sort_mode, "sort-by-name"); tr_variantDictAddBool (d, TR_KEY_sort_reversed, FALSE); tr_variantDictAddBool (d, TR_KEY_compact_view, FALSE); } static tr_variant* getPrefs (void) { static tr_variant settings; static gboolean loaded = FALSE; if (!loaded) { tr_variantInitDict (&settings, 0); tr_prefs_init_defaults (&settings); tr_sessionLoadSettings (&settings, gl_confdir, MY_CONFIG_NAME); loaded = TRUE; } return &settings; } /*** **** ***/ tr_variant* gtr_pref_get_all (void) { return getPrefs (); } int64_t gtr_pref_int_get (const tr_quark key) { int64_t i; return tr_variantDictFindInt (getPrefs (), key, &i) ? i : 0; } void gtr_pref_int_set (const tr_quark key, int64_t value) { tr_variantDictAddInt (getPrefs (), key, value); } double gtr_pref_double_get (const tr_quark key) { double d; return tr_variantDictFindReal (getPrefs (), key, &d) ? d : 0.0; } void gtr_pref_double_set (const tr_quark key, double value) { tr_variantDictAddReal (getPrefs (), key, value); } /*** **** ***/ gboolean gtr_pref_flag_get (const tr_quark key) { bool boolVal; return tr_variantDictFindBool (getPrefs (), key, &boolVal) ? boolVal : false; } void gtr_pref_flag_set (const tr_quark key, gboolean value) { tr_variantDictAddBool (getPrefs (), key, value); } /*** **** ***/ const char* gtr_pref_string_get (const tr_quark key) { const char * str; return tr_variantDictFindStr (getPrefs (), key, &str, NULL) ? str : NULL; } void gtr_pref_string_set (const tr_quark key, const char * value) { tr_variantDictAddStr (getPrefs (), key, value); } /*** **** ***/ void gtr_pref_save (tr_session * session) { tr_sessionSaveSettings (session, gl_confdir, getPrefs ()); } transmission-2.92/gtk/PaxHeaders.4960/util.c0000644000000000000000000000007412617356116015601 xustar0030 atime=1456201459.068219825 30 ctime=1457295921.160827644 transmission-2.92/gtk/util.c0000644000175000017500000004531212617356116017226 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: util.c 14587 2015-10-23 04:09:40Z mikedld $ */ #include /* isxdigit () */ #include #include /* INT_MAX */ #include #include /* strchr (), strrchr (), strlen (), strstr () */ #include #include #include /* g_file_trash () */ #include /* TR_RATIO_NA, TR_RATIO_INF */ #include #include /* tr_strratio () */ #include /* tr_webResponseStr () */ #include /* SHORT_VERSION_STRING */ #include "conf.h" #include "hig.h" #include "tr-core.h" #include "tr-prefs.h" #include "util.h" /*** **** UNITS ***/ const int mem_K = 1024; const char * mem_K_str = N_("KiB"); const char * mem_M_str = N_("MiB"); const char * mem_G_str = N_("GiB"); const char * mem_T_str = N_("TiB"); const int disk_K = 1000; const char * disk_K_str = N_("kB"); const char * disk_M_str = N_("MB"); const char * disk_G_str = N_("GB"); const char * disk_T_str = N_("TB"); const int speed_K = 1000; const char * speed_K_str = N_("kB/s"); const char * speed_M_str = N_("MB/s"); const char * speed_G_str = N_("GB/s"); const char * speed_T_str = N_("TB/s"); /*** **** ***/ const char* gtr_get_unicode_string (int i) { switch (i) { case GTR_UNICODE_UP: return "\xE2\x96\xB4"; case GTR_UNICODE_DOWN: return "\xE2\x96\xBE"; case GTR_UNICODE_INF: return "\xE2\x88\x9E"; case GTR_UNICODE_BULLET: return "\xE2\x88\x99"; default: return "err"; } } char* tr_strlratio (char * buf, double ratio, size_t buflen) { return tr_strratio (buf, buflen, ratio, gtr_get_unicode_string (GTR_UNICODE_INF)); } char* tr_strlpercent (char * buf, double x, size_t buflen) { return tr_strpercent (buf, x, buflen); } char* tr_strlsize (char * buf, guint64 bytes, size_t buflen) { if (!bytes) g_strlcpy (buf, Q_("None"), buflen); else tr_formatter_size_B (buf, bytes, buflen); return buf; } char* tr_strltime (char * buf, int seconds, size_t buflen) { int days, hours, minutes; char d[128], h[128], m[128], s[128]; if (seconds < 0) seconds = 0; days = seconds / 86400; hours = (seconds % 86400) / 3600; minutes = (seconds % 3600) / 60; seconds = (seconds % 3600) % 60; g_snprintf (d, sizeof (d), ngettext ("%'d day", "%'d days", days), days); g_snprintf (h, sizeof (h), ngettext ("%'d hour", "%'d hours", hours), hours); g_snprintf (m, sizeof (m), ngettext ("%'d minute", "%'d minutes", minutes), minutes); g_snprintf (s, sizeof (s), ngettext ("%'d second", "%'d seconds", seconds), seconds); if (days) { if (days >= 4 || !hours) g_strlcpy (buf, d, buflen); else g_snprintf (buf, buflen, "%s, %s", d, h); } else if (hours) { if (hours >= 4 || !minutes) g_strlcpy (buf, h, buflen); else g_snprintf (buf, buflen, "%s, %s", h, m); } else if (minutes) { if (minutes >= 4 || !seconds) g_strlcpy (buf, m, buflen); else g_snprintf (buf, buflen, "%s, %s", m, s); } else { g_strlcpy (buf, s, buflen); } return buf; } /* pattern-matching text; ie, legaltorrents.com */ void gtr_get_host_from_url (char * buf, size_t buflen, const char * url) { char host[1024]; const char * pch; if ((pch = strstr (url, "://"))) { const size_t hostlen = strcspn (pch+3, ":/"); const size_t copylen = MIN (hostlen, sizeof (host)-1); memcpy (host, pch+3, copylen); host[copylen] = '\0'; } else { *host = '\0'; } if (tr_addressIsIP (host)) { g_strlcpy (buf, url, buflen); } else { const char * first_dot = strchr (host, '.'); const char * last_dot = strrchr (host, '.'); if ((first_dot) && (last_dot) && (first_dot != last_dot)) g_strlcpy (buf, first_dot + 1, buflen); else g_strlcpy (buf, host, buflen); } } static gboolean gtr_is_supported_url (const char * str) { return ((str != NULL) && (g_str_has_prefix (str, "ftp://") || g_str_has_prefix (str, "http://") || g_str_has_prefix (str, "https://"))); } gboolean gtr_is_magnet_link (const char * str) { return (str != NULL) && (g_str_has_prefix (str, "magnet:?")); } gboolean gtr_is_hex_hashcode (const char * str) { int i; if (!str || (strlen (str) != 40)) return FALSE; for (i=0; i<40; ++i) if (!isxdigit (str[i])) return FALSE; return TRUE; } static GtkWindow * getWindow (GtkWidget * w) { if (w == NULL) return NULL; if (GTK_IS_WINDOW (w)) return GTK_WINDOW (w); return GTK_WINDOW (gtk_widget_get_ancestor (w, GTK_TYPE_WINDOW)); } void gtr_add_torrent_error_dialog (GtkWidget * child, int err, tr_torrent * duplicate_torrent, const char * filename) { char * secondary; GtkWidget * w; GtkWindow * win = getWindow (child); if (err == TR_PARSE_ERR) secondary = g_strdup_printf (_("The torrent file \"%s\" contains invalid data."), filename); else if (err == TR_PARSE_DUPLICATE) secondary = g_strdup_printf (_("The torrent file \"%s\" is already in use by \"%s.\""), filename, tr_torrentName (duplicate_torrent)); else secondary = g_strdup_printf (_("The torrent file \"%s\" encountered an unknown error."), filename); w = gtk_message_dialog_new (win, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", _("Error opening torrent")); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), "%s", secondary); g_signal_connect_swapped (w, "response", G_CALLBACK (gtk_widget_destroy), w); gtk_widget_show_all (w); g_free (secondary); } typedef void (PopupFunc)(GtkWidget*, GdkEventButton*); /* pop up the context menu if a user right-clicks. if the row they right-click on isn't selected, select it. */ gboolean on_tree_view_button_pressed (GtkWidget * view, GdkEventButton * event, gpointer func) { GtkTreeView * tv = GTK_TREE_VIEW (view); if (event->type == GDK_BUTTON_PRESS && event->button == 3) { GtkTreePath * path; GtkTreeSelection * selection = gtk_tree_view_get_selection (tv); if (gtk_tree_view_get_path_at_pos (tv, (gint) event->x, (gint) event->y, &path, NULL, NULL, NULL)) { if (!gtk_tree_selection_path_is_selected (selection, path)) { gtk_tree_selection_unselect_all (selection); gtk_tree_selection_select_path (selection, path); } gtk_tree_path_free (path); } if (func != NULL) ((PopupFunc*)func)(view, event); return TRUE; } return FALSE; } /* if the user clicked in an empty area of the list, * clear all the selections. */ gboolean on_tree_view_button_released (GtkWidget * view, GdkEventButton * event, gpointer unused UNUSED) { GtkTreeView * tv = GTK_TREE_VIEW (view); if (!gtk_tree_view_get_path_at_pos (tv, (gint) event->x, (gint) event->y, NULL, NULL, NULL, NULL)) { GtkTreeSelection * selection = gtk_tree_view_get_selection (tv); gtk_tree_selection_unselect_all (selection); } return FALSE; } bool gtr_file_trash_or_remove (const char * filename, tr_error ** error) { GFile * file; gboolean trashed = FALSE; bool result = true; g_return_val_if_fail (filename && *filename, false); file = g_file_new_for_path (filename); if (gtr_pref_flag_get (TR_KEY_trash_can_enabled)) { GError * err = NULL; trashed = g_file_trash (file, NULL, &err); if (err) { g_message ("Unable to trash file \"%s\": %s", filename, err->message); tr_error_set_literal (error, err->code, err->message); g_clear_error (&err); } } if (!trashed) { GError * err = NULL; g_file_delete (file, NULL, &err); if (err) { g_message ("Unable to delete file \"%s\": %s", filename, err->message); tr_error_clear (error); tr_error_set_literal (error, err->code, err->message); g_clear_error (&err); result = false; } } g_object_unref (G_OBJECT (file)); return result; } const char* gtr_get_help_uri (void) { static char * uri = NULL; if (!uri) { const char * fmt = "http://www.transmissionbt.com/help/gtk/%d.%dx"; uri = g_strdup_printf (fmt, MAJOR_VERSION, MINOR_VERSION / 10); } return uri; } void gtr_open_file (const char * path) { GFile * file = g_file_new_for_path (path); gchar * uri = g_file_get_uri (file); gtr_open_uri (uri); g_free (uri); g_object_unref (file); } void gtr_open_uri (const char * uri) { if (uri) { gboolean opened = FALSE; if (!opened) opened = gtk_show_uri (NULL, uri, GDK_CURRENT_TIME, NULL); if (!opened) opened = g_app_info_launch_default_for_uri (uri, NULL, NULL); if (!opened) { char * argv[] = { (char*)"xdg-open", (char*)uri, NULL }; opened = g_spawn_async (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL); } if (!opened) g_message ("Unable to open \"%s\"", uri); } } /*** **** ***/ void gtr_combo_box_set_active_enum (GtkComboBox * combo_box, int value) { int i; int currentValue; const int column = 0; GtkTreeIter iter; GtkTreeModel * model = gtk_combo_box_get_model (combo_box); /* do the value and current value match? */ if (gtk_combo_box_get_active_iter (combo_box, &iter)) { gtk_tree_model_get (model, &iter, column, ¤tValue, -1); if (currentValue == value) return; } /* find the one to select */ i = 0; while ((gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))) { gtk_tree_model_get (model, &iter, column, ¤tValue, -1); if (currentValue == value) { gtk_combo_box_set_active_iter (combo_box, &iter); return; } } } GtkWidget * gtr_combo_box_new_enum (const char * text_1, ...) { GtkWidget * w; GtkCellRenderer * r; GtkListStore * store; const char * text; store = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING); text = text_1; if (text != NULL) { va_list vl; va_start (vl, text_1); do { const int val = va_arg (vl, int); gtk_list_store_insert_with_values (store, NULL, INT_MAX, 0, val, 1, text, -1); text = va_arg (vl, const char *); } while (text != NULL); va_end (vl); } w = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store)); r = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (w), r, TRUE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (w), r, "text", 1, NULL); /* cleanup */ g_object_unref (store); return w; } int gtr_combo_box_get_active_enum (GtkComboBox * combo_box) { int value = 0; GtkTreeIter iter; if (gtk_combo_box_get_active_iter (combo_box, &iter)) gtk_tree_model_get (gtk_combo_box_get_model (combo_box), &iter, 0, &value, -1); return value; } GtkWidget * gtr_priority_combo_new (void) { return gtr_combo_box_new_enum (_("High"), TR_PRI_HIGH, _("Normal"), TR_PRI_NORMAL, _("Low"), TR_PRI_LOW, NULL); } /*** **** ***/ #define GTR_CHILD_HIDDEN "gtr-child-hidden" void gtr_widget_set_visible (GtkWidget * w, gboolean b) { /* toggle the transient children, too */ if (GTK_IS_WINDOW (w)) { GList * l; GList * windows = gtk_window_list_toplevels (); GtkWindow * window = GTK_WINDOW (w); for (l=windows; l!=NULL; l=l->next) { if (!GTK_IS_WINDOW (l->data)) continue; if (gtk_window_get_transient_for (GTK_WINDOW (l->data)) != window) continue; if (gtk_widget_get_visible (GTK_WIDGET (l->data)) == b) continue; if (b && g_object_get_data (G_OBJECT (l->data), GTR_CHILD_HIDDEN) != NULL) { g_object_steal_data (G_OBJECT (l->data), GTR_CHILD_HIDDEN); gtr_widget_set_visible (GTK_WIDGET (l->data), TRUE); } else if (!b) { g_object_set_data (G_OBJECT (l->data), GTR_CHILD_HIDDEN, GINT_TO_POINTER (1)); gtr_widget_set_visible (GTK_WIDGET (l->data), FALSE); } } g_list_free (windows); } gtk_widget_set_visible (w, b); } void gtr_dialog_set_content (GtkDialog * dialog, GtkWidget * content) { GtkWidget * vbox = gtk_dialog_get_content_area (dialog); gtk_box_pack_start (GTK_BOX (vbox), content, TRUE, TRUE, 0); gtk_widget_show_all (content); } /*** **** ***/ void gtr_http_failure_dialog (GtkWidget * parent, const char * url, long response_code) { GtkWindow * window = getWindow (parent); GtkWidget * w = gtk_message_dialog_new (window, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Error opening \"%s\""), url); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), _("Server returned \"%1$ld %2$s\""), response_code, tr_webGetResponseStr (response_code)); g_signal_connect_swapped (w, "response", G_CALLBACK (gtk_widget_destroy), w); gtk_widget_show (w); } void gtr_unrecognized_url_dialog (GtkWidget * parent, const char * url) { const char * xt = "xt=urn:btih"; GtkWindow * window = getWindow (parent); GString * gstr = g_string_new (NULL); GtkWidget * w = gtk_message_dialog_new (window, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", _("Unrecognized URL")); g_string_append_printf (gstr, _("Transmission doesn't know how to use \"%s\""), url); if (gtr_is_magnet_link (url) && (strstr (url, xt) == NULL)) { g_string_append_printf (gstr, "\n \n"); g_string_append_printf (gstr, _("This magnet link appears to be intended for something other than BitTorrent. BitTorrent magnet links have a section containing \"%s\"."), xt); } gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), "%s", gstr->str); g_signal_connect_swapped (w, "response", G_CALLBACK (gtk_widget_destroy), w); gtk_widget_show (w); g_string_free (gstr, TRUE); } /*** **** ***/ void gtr_paste_clipboard_url_into_entry (GtkWidget * e) { size_t i; char * text[] = { g_strstrip (gtk_clipboard_wait_for_text (gtk_clipboard_get (GDK_SELECTION_PRIMARY))), g_strstrip (gtk_clipboard_wait_for_text (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD))) }; for (i=0; icore != NULL) g_object_weak_unref (G_OBJECT(data->core), on_freespace_label_core_destroyed, data); if (data->label != NULL) g_object_weak_ref (G_OBJECT(data->label), on_freespace_label_destroyed, data); g_source_remove (data->timer_id); g_free (data->dir); g_free (data); } static TR_DEFINE_QUARK (freespace_label_data, freespace_label_data) static void on_freespace_label_core_destroyed (gpointer gdata, GObject * dead_core G_GNUC_UNUSED) { struct freespace_label_data * data = gdata; data->core = NULL; freespace_label_data_free (data); } static void on_freespace_label_destroyed (gpointer gdata, GObject * dead_label G_GNUC_UNUSED) { struct freespace_label_data * data = gdata; data->label = NULL; freespace_label_data_free (data); } static gboolean on_freespace_timer (gpointer gdata) { char text[128]; char markup[128]; int64_t bytes; tr_session * session; struct freespace_label_data * data = gdata; session = gtr_core_session (data->core); bytes = tr_sessionGetDirFreeSpace (session, data->dir); if (bytes < 0) { g_snprintf (text, sizeof(text), _("Error")); } else { char size[128]; tr_strlsize (size, bytes, sizeof(size)); g_snprintf (text, sizeof(text), _("%s free"), size); } g_snprintf (markup, sizeof(markup), "%s", text); gtk_label_set_markup (data->label, markup); return G_SOURCE_CONTINUE; } GtkWidget * gtr_freespace_label_new (struct _TrCore * core, const char * dir) { struct freespace_label_data * data; data = g_new0 (struct freespace_label_data, 1); data->timer_id = g_timeout_add_seconds (3, on_freespace_timer, data); data->core = core; data->label = GTK_LABEL (gtk_label_new (NULL)); data->dir = g_strdup (dir); /* when either the core or the label is destroyed, stop updating */ g_object_weak_ref (G_OBJECT(core), on_freespace_label_core_destroyed, data); g_object_weak_ref (G_OBJECT(data->label), on_freespace_label_destroyed, data); g_object_set_qdata (G_OBJECT(data->label), freespace_label_data_quark (), data); on_freespace_timer (data); return GTK_WIDGET (data->label); } void gtr_freespace_label_set_dir (GtkWidget * label, const char * dir) { struct freespace_label_data * data; data = g_object_get_qdata (G_OBJECT(label), freespace_label_data_quark ()); tr_free (data->dir); data->dir = g_strdup (dir); on_freespace_timer (data); } transmission-2.92/gtk/PaxHeaders.4960/favicon.h0000644000000000000000000000007412617356116016256 xustar0030 atime=1456201459.055219604 30 ctime=1457295920.914823461 transmission-2.92/gtk/favicon.h0000644000175000017500000000143312617356116017677 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: favicon.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef GTR_FAVICON_CACHE_H #define GTR_FAVICON_CACHE_H #include #include void gtr_get_favicon (tr_session * session, const char * host, GFunc pixbuf_ready_func, gpointer pixbuf_ready_func_data); void gtr_get_favicon_from_url (tr_session * session, const char * url, GFunc pixbuf_ready_func, gpointer pixbuf_ready_func_data); #endif transmission-2.92/gtk/PaxHeaders.4960/CMakeLists.txt0000644000000000000000000000007412662756142017223 xustar0030 atime=1456201459.045219434 30 ctime=1457295917.343762735 transmission-2.92/gtk/CMakeLists.txt0000644000175000017500000001211512662756142020643 0ustar00mikedldmikedld00000000000000project(trgtk) if(WITH_LIBAPPINDICATOR) add_definitions(-DHAVE_LIBAPPINDICATOR) endif() execute_process( COMMAND ${PKG_CONFIG_EXECUTABLE} gio-2.0 --variable glib_compile_resources OUTPUT_VARIABLE GLIB_COMPILE_RESOURCES_EXECUTABLE OUTPUT_STRIP_TRAILING_WHITESPACE ) if(NOT GLIB_COMPILE_RESOURCES_EXECUTABLE) message(SEND_ERROR "Unable to find glib-compile-resources executable") endif() add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/transmission-resources.c ${CMAKE_CURRENT_BINARY_DIR}/transmission-resources.h COMMAND ${GLIB_COMPILE_RESOURCES_EXECUTABLE} --target=${CMAKE_CURRENT_BINARY_DIR}/transmission-resources.c --sourcedir=${CMAKE_CURRENT_SOURCE_DIR} --generate-source --c-name transmission transmission.gresource.xml COMMAND ${GLIB_COMPILE_RESOURCES_EXECUTABLE} --target=${CMAKE_CURRENT_BINARY_DIR}/transmission-resources.h --sourcedir=${CMAKE_CURRENT_SOURCE_DIR} --generate-header --c-name transmission transmission.gresource.xml DEPENDS icons/hicolor_apps_24x24_transmission.png icons/hicolor_apps_48x48_transmission.png icons/lock.png icons/ratio.png icons/turtle-blue.png icons/turtle-grey.png icons/utilities.png transmission.gresource.xml transmission-ui.xml WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) if(ENABLE_NLS) find_program(INTLTOOL_MERGE_EXECUTABLE intltool-merge REQUIRED) set(${PROJECT_NAME}_DESKTOP_FILE "${PROJECT_BINARY_DIR}/${TR_NAME}-gtk.desktop") add_custom_command( OUTPUT ${${PROJECT_NAME}_DESKTOP_FILE} COMMAND ${INTLTOOL_MERGE_EXECUTABLE} --desktop-style --utf8 ${CMAKE_SOURCE_DIR}/po ${PROJECT_SOURCE_DIR}/transmission-gtk.desktop.in ${${PROJECT_NAME}_DESKTOP_FILE} DEPENDS ${PROJECT_SOURCE_DIR}/transmission-gtk.desktop.in VERBATIM ) endif() set(${PROJECT_NAME}_SOURCES actions.c conf.c details.c dialogs.c favicon.c file-list.c filter.c hig.c icons.c main.c makemeta-ui.c msgwin.c notify.c open-dialog.c relocate.c stats.c torrent-cell-renderer.c tr-core.c tr-icon.c tr-prefs.c tr-window.c util.c ${CMAKE_CURRENT_BINARY_DIR}/transmission-resources.c ) set(${PROJECT_NAME}_HEADERS actions.h conf.h details.h dialogs.h favicon.h file-list.h filter.h hig.h icons.h makemeta-ui.h msgwin.h notify.h open-dialog.h relocate.h stats.h torrent-cell-renderer.h tr-core.h tr-icon.h tr-prefs.h tr-window.h util.h ${CMAKE_CURRENT_BINARY_DIR}/transmission-resources.h ) include_directories( ${CMAKE_SOURCE_DIR} ${PROJECT_BINARY_DIR} ${LIBAPPINDICATOR_INCLUDE_DIRS} ${GTK_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} ${EVENT2_INCLUDE_DIRS} ) link_directories( ${GTK_LIBRARY_DIRS} ) add_definitions( "-DTRANSMISSIONLOCALEDIR=\"${CMAKE_INSTALL_FULL_LOCALEDIR}\"" "-DGETTEXT_PACKAGE=\"${TR_NAME}-gtk\"" -DG_DISABLE_DEPRECATED -DGDK_PIXBUF_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED # FIXME: migrate from GtkUIManager to GtkBuilder in 2.90 # -DGTK_DISABLE_DEPRECATED -DPANGO_DISABLE_DEPRECATED # FIXME: these break libnotify's headers # -DG_DISABLE_SINGLE_INCLUDES # -DGTK_DISABLE_SINGLE_INCLUDES ${GTK_CFLAGS_OTHER} ) tr_win32_app_info(${PROJECT_NAME}_WIN32_RC_FILE "Transmission GTK+ Client" "${TR_NAME}-gtk" "${TR_NAME}-gtk.exe" "${TR_NAME}.ico") add_executable(${TR_NAME}-gtk WIN32 ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_HEADERS} ${${PROJECT_NAME}_DESKTOP_FILE} ${${PROJECT_NAME}_WIN32_RC_FILE} ) target_link_libraries(${TR_NAME}-gtk ${TR_NAME} ${LIBAPPINDICATOR_LIBRARIES} ${GTK_LIBRARIES} ${CURL_LIBRARIES} ${EVENT2_LIBRARIES} ) if(MSVC) tr_append_target_property(${TR_NAME}-gtk LINK_FLAGS "/ENTRY:mainCRTStartup") endif() install(TARGETS ${TR_NAME}-gtk DESTINATION ${CMAKE_INSTALL_BINDIR}) set(${PROJECT_NAME}_PUBLIC_ICONS hicolor_apps_16x16_transmission.png hicolor_apps_22x22_transmission.png hicolor_apps_24x24_transmission.png hicolor_apps_32x32_transmission.png hicolor_apps_48x48_transmission.png hicolor_apps_256x256_transmission.png hicolor_apps_scalable_transmission.svg ) set(ICON_NAME_REGEX "^([^_]+)_([^_]+)_([^_]+)_(.+)$") foreach(ICON ${${PROJECT_NAME}_PUBLIC_ICONS}) string(REGEX REPLACE ${ICON_NAME_REGEX} "\\1/\\3/\\2" ICON_DIR ${ICON}) string(REGEX REPLACE ${ICON_NAME_REGEX} "\\4" ICON_NAME ${ICON}) install(FILES icons/${ICON} DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/${ICON_DIR}/ RENAME ${ICON_NAME}) endforeach() if(INSTALL_DOC) install(FILES ${TR_NAME}-gtk.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) endif() if(ENABLE_NLS) install(FILES ${${PROJECT_NAME}_DESKTOP_FILE} DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) else() install(FILES transmission-gtk.desktop.in DESTINATION ${CMAKE_INSTALL_DATADIR}/applications RENAME ${TR_NAME}-gtk.desktop) endif() transmission-2.92/gtk/PaxHeaders.4960/stats.h0000644000000000000000000000007312617356116015766 xustar0030 atime=1456201459.062219723 29 ctime=1457295920.97182443 transmission-2.92/gtk/stats.h0000644000175000017500000000064512617356116017414 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: stats.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef GTR_STATS_DIALOG_H #define GTR_STATS_DIALOG_H #include #include "tr-core.h" GtkWidget* gtr_stats_dialog_new (GtkWindow * parent, TrCore * core); #endif /* GTR_STATS_DIALOG_H */ transmission-2.92/gtk/PaxHeaders.4960/relocate.h0000644000000000000000000000007412617356116016427 xustar0030 atime=1456201459.061219706 30 ctime=1457295920.965824328 transmission-2.92/gtk/relocate.h0000644000175000017500000000076012617356116020052 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2009-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: relocate.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef GTR_RELOCATE_H #define GTR_RELOCATE_H #include #include "tr-core.h" GtkWidget * gtr_relocate_dialog_new (GtkWindow * parent, TrCore * core, GSList * torrentIds); #endif transmission-2.92/gtk/PaxHeaders.4960/filter.h0000644000000000000000000000007412617356116016116 xustar0030 atime=1456201459.056219621 30 ctime=1457295920.925823648 transmission-2.92/gtk/filter.h0000644000175000017500000000101312617356116017531 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: filter.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef GTR_FILTER_H #define GTR_FILTER_H #include #include GtkWidget * gtr_filter_bar_new (tr_session * session, GtkTreeModel * torrent_model, GtkTreeModel ** filter_model); #endif transmission-2.92/gtk/PaxHeaders.4960/tr-prefs.c0000644000000000000000000000007412640345571016365 xustar0030 atime=1456201459.065219774 30 ctime=1457295926.036910562 transmission-2.92/gtk/tr-prefs.c0000644000175000017500000013222412640345571020011 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: tr-prefs.c 14639 2015-12-28 23:52:26Z mikedld $ */ #include /* isspace */ #include /* USHRT_MAX, INT_MAX */ #include #include #include #include #include #include #include "conf.h" #include "hig.h" #include "tr-core.h" #include "tr-prefs.h" #include "util.h" /** *** **/ struct prefs_dialog_data { TrCore * core; gulong core_prefs_tag; GtkWidget * freespace_label; GtkWidget * port_label; GtkWidget * port_button; GtkWidget * port_spin; }; /** *** **/ #define PREF_KEY "pref-key" static void response_cb (GtkDialog * dialog, int response, gpointer unused UNUSED) { if (response == GTK_RESPONSE_HELP) { char * uri = g_strconcat (gtr_get_help_uri (), "/html/preferences.html", NULL); gtr_open_uri (uri); g_free (uri); } if (response == GTK_RESPONSE_CLOSE) gtk_widget_destroy (GTK_WIDGET (dialog)); } static void toggled_cb (GtkToggleButton * w, gpointer core) { const tr_quark key = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), PREF_KEY)); const gboolean flag = gtk_toggle_button_get_active (w); gtr_core_set_pref_bool (TR_CORE (core), key, flag); } static GtkWidget* new_check_button (const char * mnemonic, const tr_quark key, gpointer core) { GtkWidget * w = gtk_check_button_new_with_mnemonic (mnemonic); g_object_set_data (G_OBJECT(w), PREF_KEY, GINT_TO_POINTER(key)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), gtr_pref_flag_get (key)); g_signal_connect (w, "toggled", G_CALLBACK (toggled_cb), core); return w; } #define IDLE_DATA "idle-data" struct spin_idle_data { gpointer core; GTimer * last_change; gboolean isDouble; }; static void spin_idle_data_free (gpointer gdata) { struct spin_idle_data * data = gdata; g_timer_destroy (data->last_change); g_free (data); } static gboolean spun_cb_idle (gpointer spin) { gboolean keep_waiting = TRUE; GObject * o = G_OBJECT (spin); struct spin_idle_data * data = g_object_get_data (o, IDLE_DATA); /* has the user stopped making changes? */ if (g_timer_elapsed (data->last_change, NULL) > 0.33f) { /* update the core */ const tr_quark key = GPOINTER_TO_INT (g_object_get_data (o, PREF_KEY)); if (data->isDouble) { const double value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin)); gtr_core_set_pref_double (TR_CORE (data->core), key, value); } else { const int value = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin)); gtr_core_set_pref_int (TR_CORE (data->core), key, value); } /* cleanup */ g_object_set_data (o, IDLE_DATA, NULL); keep_waiting = FALSE; g_object_unref (G_OBJECT (o)); } return keep_waiting; } static void spun_cb (GtkSpinButton * w, gpointer core, gboolean isDouble) { /* user may be spinning through many values, so let's hold off for a moment to keep from flooding the core with changes */ GObject * o = G_OBJECT (w); struct spin_idle_data * data = g_object_get_data (o, IDLE_DATA); if (data == NULL) { data = g_new (struct spin_idle_data, 1); data->core = core; data->last_change = g_timer_new (); data->isDouble = isDouble; g_object_set_data_full (o, IDLE_DATA, data, spin_idle_data_free); g_object_ref (G_OBJECT (o)); gdk_threads_add_timeout_seconds (1, spun_cb_idle, w); } g_timer_start (data->last_change); } static void spun_cb_int (GtkSpinButton * w, gpointer core) { spun_cb (w, core, FALSE); } static void spun_cb_double (GtkSpinButton * w, gpointer core) { spun_cb (w, core, TRUE); } static GtkWidget* new_spin_button (const tr_quark key, gpointer core, int low, int high, int step) { GtkWidget * w = gtk_spin_button_new_with_range (low, high, step); g_object_set_data (G_OBJECT(w), PREF_KEY, GINT_TO_POINTER(key)); gtk_spin_button_set_digits (GTK_SPIN_BUTTON (w), 0); gtk_spin_button_set_value (GTK_SPIN_BUTTON (w), gtr_pref_int_get (key)); g_signal_connect (w, "value-changed", G_CALLBACK (spun_cb_int), core); return w; } static GtkWidget* new_spin_button_double (const tr_quark key, gpointer core, double low, double high, double step) { GtkWidget * w = gtk_spin_button_new_with_range (low, high, step); g_object_set_data (G_OBJECT(w), PREF_KEY, GINT_TO_POINTER(key)); gtk_spin_button_set_digits (GTK_SPIN_BUTTON (w), 2); gtk_spin_button_set_value (GTK_SPIN_BUTTON (w), gtr_pref_double_get (key)); g_signal_connect (w, "value-changed", G_CALLBACK (spun_cb_double), core); return w; } static void entry_changed_cb (GtkEntry * w, gpointer core) { const tr_quark key = GPOINTER_TO_INT (g_object_get_data (G_OBJECT(w), PREF_KEY)); const char * value = gtk_entry_get_text (w); gtr_core_set_pref (TR_CORE(core), key, value); } static GtkWidget* new_entry (const tr_quark key, gpointer core) { GtkWidget * w = gtk_entry_new (); const char * value = gtr_pref_string_get (key); if (value) gtk_entry_set_text (GTK_ENTRY (w), value); g_object_set_data (G_OBJECT (w), PREF_KEY, GINT_TO_POINTER(key)); g_signal_connect (w, "changed", G_CALLBACK (entry_changed_cb), core); return w; } static void chosen_cb (GtkFileChooser * w, gpointer core) { const tr_quark key = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), PREF_KEY)); char * value = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (w)); gtr_core_set_pref (TR_CORE (core), key, value); g_free (value); } static GtkWidget* new_path_chooser_button (const tr_quark key, gpointer core) { GtkWidget * w = gtk_file_chooser_button_new (NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); const char * path = gtr_pref_string_get (key); g_object_set_data (G_OBJECT (w), PREF_KEY, GINT_TO_POINTER(key)); if (path != NULL) gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (w), path); g_signal_connect (w, "selection-changed", G_CALLBACK (chosen_cb), core); return w; } static GtkWidget* new_file_chooser_button (const tr_quark key, gpointer core) { GtkWidget * w = gtk_file_chooser_button_new (NULL, GTK_FILE_CHOOSER_ACTION_OPEN); const char * path = gtr_pref_string_get (key); g_object_set_data (G_OBJECT(w), PREF_KEY, GINT_TO_POINTER(key)); if (path != NULL) gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (w), path); g_signal_connect (w, "selection-changed", G_CALLBACK (chosen_cb), core); return w; } static void target_cb (GtkWidget * tb, gpointer target) { const gboolean b = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (tb)); gtk_widget_set_sensitive (GTK_WIDGET (target), b); } /**** ***** Download Tab ****/ static GtkWidget* downloadingPage (GObject * core, struct prefs_dialog_data * data) { GtkWidget * t; GtkWidget * w; GtkWidget * l; const char * s; guint row = 0; t = hig_workarea_create (); hig_workarea_add_section_title (t, &row, C_("Gerund", "Adding")); s = _("Automatically add .torrent files _from:"); l = new_check_button (s, TR_KEY_watch_dir_enabled, core); w = new_path_chooser_button (TR_KEY_watch_dir, core); gtk_widget_set_sensitive (GTK_WIDGET (w), gtr_pref_flag_get (TR_KEY_watch_dir_enabled)); g_signal_connect (l, "toggled", G_CALLBACK (target_cb), w); hig_workarea_add_row_w (t, &row, l, w, NULL); s = _("Show the Torrent Options _dialog"); w = new_check_button (s, TR_KEY_show_options_window, core); hig_workarea_add_wide_control (t, &row, w); s = _("_Start added torrents"); w = new_check_button (s, TR_KEY_start_added_torrents, core); hig_workarea_add_wide_control (t, &row, w); s = _("Mo_ve .torrent file to the trash"); w = new_check_button (s, TR_KEY_trash_original_torrent_files, core); hig_workarea_add_wide_control (t, &row, w); w = new_path_chooser_button (TR_KEY_download_dir, core); hig_workarea_add_row (t, &row, _("Save to _Location:"), w, NULL); l = data->freespace_label = gtr_freespace_label_new (TR_CORE(core), NULL); gtk_misc_set_alignment (GTK_MISC (l), 1.0f, 0.5f); hig_workarea_add_wide_control (t, &row, l); hig_workarea_add_section_divider (t, &row); hig_workarea_add_section_title (t, &row, _("Download Queue")); s = _("Ma_ximum active downloads:"); w = new_spin_button (TR_KEY_download_queue_size, core, 0, INT_MAX, 1); hig_workarea_add_row (t, &row, s, w, NULL); s = _("Downloads sharing data in the last _N minutes are active:"); w = new_spin_button (TR_KEY_queue_stalled_minutes, core, 1, INT_MAX, 15); hig_workarea_add_row (t, &row, s, w, NULL); hig_workarea_add_section_divider (t, &row); hig_workarea_add_section_title (t, &row, _("Incomplete")); s = _("Append \"._part\" to incomplete files' names"); w = new_check_button (s, TR_KEY_rename_partial_files, core); hig_workarea_add_wide_control (t, &row, w); s = _("Keep _incomplete torrents in:"); l = new_check_button (s, TR_KEY_incomplete_dir_enabled, core); w = new_path_chooser_button (TR_KEY_incomplete_dir, core); gtk_widget_set_sensitive (GTK_WIDGET (w), gtr_pref_flag_get (TR_KEY_incomplete_dir_enabled)); g_signal_connect (l, "toggled", G_CALLBACK (target_cb), w); hig_workarea_add_row_w (t, &row, l, w, NULL); s = _("Call scrip_t when torrent is completed:"); l = new_check_button (s, TR_KEY_script_torrent_done_enabled, core); w = new_file_chooser_button (TR_KEY_script_torrent_done_filename, core); gtk_widget_set_sensitive (GTK_WIDGET (w), gtr_pref_flag_get (TR_KEY_script_torrent_done_enabled)); g_signal_connect (l, "toggled", G_CALLBACK (target_cb), w); hig_workarea_add_row_w (t, &row, l, w, NULL); return t; } /**** ***** Torrent Tab ****/ static GtkWidget* seedingPage (GObject * core) { GtkWidget * t; GtkWidget * w; GtkWidget * w2; const char * s; guint row = 0; t = hig_workarea_create (); hig_workarea_add_section_title (t, &row, _("Limits")); s = _("Stop seeding at _ratio:"); w = new_check_button (s, TR_KEY_ratio_limit_enabled, core); w2 = new_spin_button_double (TR_KEY_ratio_limit, core, 0, 1000, .05); gtk_widget_set_sensitive (GTK_WIDGET (w2), gtr_pref_flag_get (TR_KEY_ratio_limit_enabled)); g_signal_connect (w, "toggled", G_CALLBACK (target_cb), w2); hig_workarea_add_row_w (t, &row, w, w2, NULL); s = _("Stop seeding if idle for _N minutes:"); w = new_check_button (s, TR_KEY_idle_seeding_limit_enabled, core); w2 = new_spin_button (TR_KEY_idle_seeding_limit, core, 1, 9999, 5); gtk_widget_set_sensitive (GTK_WIDGET (w2), gtr_pref_flag_get (TR_KEY_idle_seeding_limit_enabled)); g_signal_connect (w, "toggled", G_CALLBACK (target_cb), w2); hig_workarea_add_row_w (t, &row, w, w2, NULL); return t; } /**** ***** Desktop Tab ****/ static GtkWidget* desktopPage (GObject * core) { GtkWidget * t; GtkWidget * w; const char * s; guint row = 0; t = hig_workarea_create (); hig_workarea_add_section_title (t, &row, _("Desktop")); s = _("_Inhibit hibernation when torrents are active"); w = new_check_button (s, TR_KEY_inhibit_desktop_hibernation, core); hig_workarea_add_wide_control (t, &row, w); s = _("Show Transmission icon in the _notification area"); w = new_check_button (s, TR_KEY_show_notification_area_icon, core); hig_workarea_add_wide_control (t, &row, w); hig_workarea_add_section_divider (t, &row); hig_workarea_add_section_title (t, &row, _("Notification")); s = _("Show a notification when torrents are a_dded"); w = new_check_button (s, TR_KEY_torrent_added_notification_enabled, core); hig_workarea_add_wide_control (t, &row, w); s = _("Show a notification when torrents _finish"); w = new_check_button (s, TR_KEY_torrent_complete_notification_enabled, core); hig_workarea_add_wide_control (t, &row, w); s = _("Play a _sound when torrents finish"); w = new_check_button (s, TR_KEY_torrent_complete_sound_enabled, core); hig_workarea_add_wide_control (t, &row, w); return t; } /**** ***** Peer Tab ****/ struct blocklist_data { gulong updateBlocklistTag; GtkWidget * updateBlocklistButton; GtkWidget * updateBlocklistDialog; GtkWidget * label; GtkWidget * check; TrCore * core; }; static void updateBlocklistText (GtkWidget * w, TrCore * core) { char buf1[512]; char buf2[512]; const int n = tr_blocklistGetRuleCount (gtr_core_session (core)); g_snprintf (buf1, sizeof (buf1), ngettext ("Blocklist contains %'d rule", "Blocklist contains %'d rules", n), n); g_snprintf (buf2, sizeof (buf2), "%s", buf1); gtk_label_set_markup (GTK_LABEL (w), buf2); } /* prefs dialog is being destroyed, so stop listening to blocklist updates */ static void privacyPageDestroyed (gpointer gdata, GObject * dead UNUSED) { struct blocklist_data * data = gdata; if (data->updateBlocklistTag > 0) g_signal_handler_disconnect (data->core, data->updateBlocklistTag); g_free (data); } /* user hit "close" in the blocklist-update dialog */ static void onBlocklistUpdateResponse (GtkDialog * dialog, gint response UNUSED, gpointer gdata) { struct blocklist_data * data = gdata; gtk_widget_destroy (GTK_WIDGET (dialog)); gtk_widget_set_sensitive (data->updateBlocklistButton, TRUE); data->updateBlocklistDialog = NULL; g_signal_handler_disconnect (data->core, data->updateBlocklistTag); data->updateBlocklistTag = 0; } /* core says the blocklist was updated */ static void onBlocklistUpdated (TrCore * core, int n, gpointer gdata) { const bool success = n >= 0; const int count = n >=0 ? n : tr_blocklistGetRuleCount (gtr_core_session (core)); const char * s = ngettext ("Blocklist has %'d rule.", "Blocklist has %'d rules.", count); struct blocklist_data * data = gdata; GtkMessageDialog * d = GTK_MESSAGE_DIALOG (data->updateBlocklistDialog); gtk_widget_set_sensitive (data->updateBlocklistButton, TRUE); gtk_message_dialog_set_markup (d, success ? _("Update succeeded!") : _("Unable to update.")); gtk_message_dialog_format_secondary_text (d, s, count); updateBlocklistText (data->label, core); } /* user pushed a button to update the blocklist */ static void onBlocklistUpdate (GtkButton * w, gpointer gdata) { GtkWidget * d; struct blocklist_data * data = gdata; d = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (w))), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "%s", _("Update Blocklist")); gtk_widget_set_sensitive (data->updateBlocklistButton, FALSE); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (d), "%s", _("Getting new blocklist…")); data->updateBlocklistDialog = d; g_signal_connect (d, "response", G_CALLBACK (onBlocklistUpdateResponse), data); gtk_widget_show (d); gtr_core_blocklist_update (data->core); data->updateBlocklistTag = g_signal_connect (data->core, "blocklist-updated", G_CALLBACK (onBlocklistUpdated), data); } static void on_blocklist_url_changed (GtkEditable * e, gpointer gbutton) { gchar * url = gtk_editable_get_chars (e, 0, -1); const gboolean is_url_valid = tr_urlParse (url, TR_BAD_SIZE, NULL, NULL, NULL, NULL); gtk_widget_set_sensitive (GTK_WIDGET (gbutton), is_url_valid); g_free (url); } static void onIntComboChanged (GtkComboBox * combo_box, gpointer core) { const int val = gtr_combo_box_get_active_enum (combo_box); const tr_quark key = GPOINTER_TO_INT (g_object_get_data (G_OBJECT(combo_box), PREF_KEY)); gtr_core_set_pref_int (TR_CORE (core), key, val); } static GtkWidget* new_encryption_combo (GObject * core, const tr_quark key) { GtkWidget * w = gtr_combo_box_new_enum (_("Allow encryption"), TR_CLEAR_PREFERRED, _("Prefer encryption"), TR_ENCRYPTION_PREFERRED, _("Require encryption"), TR_ENCRYPTION_REQUIRED, NULL); gtr_combo_box_set_active_enum (GTK_COMBO_BOX (w), gtr_pref_int_get (key)); g_object_set_data (G_OBJECT (w), PREF_KEY, GINT_TO_POINTER(key)); g_signal_connect (w, "changed", G_CALLBACK (onIntComboChanged), core); return w; } static GtkWidget* privacyPage (GObject * core) { const char * s; GtkWidget * t; GtkWidget * w; GtkWidget * b; GtkWidget * h; GtkWidget * e; struct blocklist_data * data; guint row = 0; data = g_new0 (struct blocklist_data, 1); data->core = TR_CORE (core); t = hig_workarea_create (); hig_workarea_add_section_title (t, &row, _("Privacy")); s = _("_Encryption mode:"); w = new_encryption_combo (core, TR_KEY_encryption); hig_workarea_add_row (t, &row, s, w, NULL); hig_workarea_add_section_divider (t, &row); hig_workarea_add_section_title (t, &row, _("Blocklist")); b = new_check_button (_("Enable _blocklist:"), TR_KEY_blocklist_enabled, core); e = new_entry (TR_KEY_blocklist_url, core); gtk_widget_set_size_request (e, 300, -1); hig_workarea_add_row_w (t, &row, b, e, NULL); data->check = b; g_signal_connect (b, "toggled", G_CALLBACK (target_cb), e); target_cb (b, e); w = gtk_label_new (""); gtk_misc_set_alignment (GTK_MISC (w), 0.0f, 0.5f); updateBlocklistText (w, TR_CORE (core)); data->label = w; h = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, GUI_PAD_BIG); gtk_box_pack_start (GTK_BOX (h), w, TRUE, TRUE, 0); b = data->updateBlocklistButton = gtk_button_new_with_mnemonic (_("_Update")); g_object_set_data (G_OBJECT (b), "session", gtr_core_session (TR_CORE (core))); g_signal_connect (b, "clicked", G_CALLBACK (onBlocklistUpdate), data); g_signal_connect (data->check, "toggled", G_CALLBACK (target_cb), b); target_cb (data->check, b); gtk_box_pack_start (GTK_BOX (h), b, FALSE, FALSE, 0); g_signal_connect (data->check, "toggled", G_CALLBACK (target_cb), w); target_cb (data->check, w); hig_workarea_add_wide_control (t, &row, h); g_signal_connect (e, "changed", G_CALLBACK (on_blocklist_url_changed), data->updateBlocklistButton); on_blocklist_url_changed (GTK_EDITABLE (e), data->updateBlocklistButton); s = _("Enable _automatic updates"); w = new_check_button (s, TR_KEY_blocklist_updates_enabled, core); hig_workarea_add_wide_control (t, &row, w); g_signal_connect (data->check, "toggled", G_CALLBACK (target_cb), w); target_cb (data->check, w); g_object_weak_ref (G_OBJECT (t), privacyPageDestroyed, data); return t; } /**** ***** Remote Tab ****/ enum { COL_ADDRESS, N_COLS }; static GtkTreeModel* whitelist_tree_model_new (const char * whitelist) { int i; char ** rules; GtkListStore * store = gtk_list_store_new (N_COLS, G_TYPE_STRING, G_TYPE_STRING); rules = g_strsplit (whitelist, ",", 0); for (i = 0; rules && rules[i]; ++i) { GtkTreeIter iter; const char * s = rules[i]; while (isspace (*s)) ++s; gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, COL_ADDRESS, s, -1); } g_strfreev (rules); return GTK_TREE_MODEL (store); } struct remote_page { TrCore * core; GtkTreeView * view; GtkListStore * store; GtkWidget * remove_button; GSList * widgets; GSList * auth_widgets; GSList * whitelist_widgets; GtkToggleButton * rpc_tb; GtkToggleButton * auth_tb; GtkToggleButton * whitelist_tb; }; static void refreshWhitelist (struct remote_page * page) { GtkTreeIter iter; GString * gstr = g_string_new (NULL); GtkTreeModel * model = GTK_TREE_MODEL (page->store); if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) do { char * address; gtk_tree_model_get (model, &iter, COL_ADDRESS, &address, -1); g_string_append (gstr, address); g_string_append (gstr, ","); g_free (address); } while (gtk_tree_model_iter_next (model, &iter)); g_string_truncate (gstr, gstr->len - 1); /* remove the trailing comma */ gtr_core_set_pref (page->core, TR_KEY_rpc_whitelist, gstr->str); g_string_free (gstr, TRUE); } static void onAddressEdited (GtkCellRendererText * r UNUSED, gchar * path_string, gchar * address, gpointer gpage) { GtkTreeIter iter; struct remote_page * page = gpage; GtkTreeModel * model = GTK_TREE_MODEL (page->store); GtkTreePath * path = gtk_tree_path_new_from_string (path_string); if (gtk_tree_model_get_iter (model, &iter, path)) gtk_list_store_set (page->store, &iter, COL_ADDRESS, address, -1); gtk_tree_path_free (path); refreshWhitelist (page); } static void onAddWhitelistClicked (GtkButton * b UNUSED, gpointer gpage) { GtkTreeIter iter; GtkTreePath * path; struct remote_page * page = gpage; gtk_list_store_append (page->store, &iter); gtk_list_store_set (page->store, &iter, COL_ADDRESS, "0.0.0.0", -1); path = gtk_tree_model_get_path (GTK_TREE_MODEL (page->store), &iter); gtk_tree_view_set_cursor ( page->view, path, gtk_tree_view_get_column (page->view, COL_ADDRESS), TRUE); gtk_tree_path_free (path); } static void onRemoveWhitelistClicked (GtkButton * b UNUSED, gpointer gpage) { struct remote_page * page = gpage; GtkTreeSelection * sel = gtk_tree_view_get_selection (page->view); GtkTreeIter iter; if (gtk_tree_selection_get_selected (sel, NULL, &iter)) { gtk_list_store_remove (page->store, &iter); refreshWhitelist (page); } } static void refreshRPCSensitivity (struct remote_page * page) { GSList * l; const int rpc_active = gtk_toggle_button_get_active ( page->rpc_tb); const int auth_active = gtk_toggle_button_get_active ( page->auth_tb); const int whitelist_active = gtk_toggle_button_get_active ( page->whitelist_tb); GtkTreeSelection * sel = gtk_tree_view_get_selection (page->view); const int have_addr = gtk_tree_selection_get_selected (sel, NULL, NULL); const int n_rules = gtk_tree_model_iter_n_children ( GTK_TREE_MODEL (page->store), NULL); for (l = page->widgets; l != NULL; l = l->next) gtk_widget_set_sensitive (GTK_WIDGET (l->data), rpc_active); for (l = page->auth_widgets; l != NULL; l = l->next) gtk_widget_set_sensitive (GTK_WIDGET ( l->data), rpc_active && auth_active); for (l = page->whitelist_widgets; l != NULL; l = l->next) gtk_widget_set_sensitive (GTK_WIDGET (l->data), rpc_active && whitelist_active); gtk_widget_set_sensitive (page->remove_button, rpc_active && have_addr && n_rules > 1); } static void onRPCToggled (GtkToggleButton * tb UNUSED, gpointer page) { refreshRPCSensitivity (page); } static void onWhitelistSelectionChanged (GtkTreeSelection * sel UNUSED, gpointer page) { refreshRPCSensitivity (page); } static void onLaunchClutchCB (GtkButton * w UNUSED, gpointer data UNUSED) { char * uri; const int port = gtr_pref_int_get (TR_KEY_rpc_port); uri = g_strdup_printf ("http://localhost:%d/", port); gtr_open_uri (uri); g_free (uri); } static void remotePageFree (gpointer gpage) { struct remote_page * page = gpage; g_slist_free (page->widgets); g_slist_free (page->auth_widgets); g_slist_free (page->whitelist_widgets); g_free (page); } static GtkWidget* remotePage (GObject * core) { GtkWidget * t; GtkWidget * w; GtkWidget * h; const char * s; guint row = 0; struct remote_page * page = g_new0 (struct remote_page, 1); page->core = TR_CORE (core); t = hig_workarea_create (); g_object_set_data_full (G_OBJECT (t), "page", page, remotePageFree); hig_workarea_add_section_title (t, &row, _("Remote Control")); /* "enabled" checkbutton */ s = _("Allow _remote access"); w = new_check_button (s, TR_KEY_rpc_enabled, core); page->rpc_tb = GTK_TOGGLE_BUTTON (w); g_signal_connect (w, "clicked", G_CALLBACK (onRPCToggled), page); h = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, GUI_PAD_BIG); gtk_box_pack_start (GTK_BOX (h), w, TRUE, TRUE, 0); w = gtk_button_new_with_mnemonic (_("_Open web client")); page->widgets = g_slist_prepend (page->widgets, w); g_signal_connect (w, "clicked", G_CALLBACK (onLaunchClutchCB), NULL); gtk_box_pack_start (GTK_BOX (h), w, FALSE, FALSE, 0); hig_workarea_add_wide_control (t, &row, h); /* port */ w = new_spin_button (TR_KEY_rpc_port, core, 0, USHRT_MAX, 1); page->widgets = g_slist_prepend (page->widgets, w); w = hig_workarea_add_row (t, &row, _("HTTP _port:"), w, NULL); page->widgets = g_slist_prepend (page->widgets, w); /* require authentication */ s = _("Use _authentication"); w = new_check_button (s, TR_KEY_rpc_authentication_required, core); hig_workarea_add_wide_control (t, &row, w); page->auth_tb = GTK_TOGGLE_BUTTON (w); page->widgets = g_slist_prepend (page->widgets, w); g_signal_connect (w, "clicked", G_CALLBACK (onRPCToggled), page); /* username */ s = _("_Username:"); w = new_entry (TR_KEY_rpc_username, core); page->auth_widgets = g_slist_prepend (page->auth_widgets, w); w = hig_workarea_add_row (t, &row, s, w, NULL); page->auth_widgets = g_slist_prepend (page->auth_widgets, w); /* password */ s = _("Pass_word:"); w = new_entry (TR_KEY_rpc_password, core); gtk_entry_set_visibility (GTK_ENTRY (w), FALSE); page->auth_widgets = g_slist_prepend (page->auth_widgets, w); w = hig_workarea_add_row (t, &row, s, w, NULL); page->auth_widgets = g_slist_prepend (page->auth_widgets, w); /* require authentication */ s = _("Only allow these IP a_ddresses:"); w = new_check_button (s, TR_KEY_rpc_whitelist_enabled, core); hig_workarea_add_wide_control (t, &row, w); page->whitelist_tb = GTK_TOGGLE_BUTTON (w); page->widgets = g_slist_prepend (page->widgets, w); g_signal_connect (w, "clicked", G_CALLBACK (onRPCToggled), page); /* access control list */ { const char * val = gtr_pref_string_get (TR_KEY_rpc_whitelist); GtkTreeModel * m = whitelist_tree_model_new (val); GtkTreeViewColumn * c; GtkCellRenderer * r; GtkTreeSelection * sel; GtkTreeView * v; GtkWidget * w; GtkWidget * h; page->store = GTK_LIST_STORE (m); w = gtk_tree_view_new_with_model (m); g_signal_connect (w, "button-release-event", G_CALLBACK (on_tree_view_button_released), NULL); page->whitelist_widgets = g_slist_prepend (page->whitelist_widgets, w); v = page->view = GTK_TREE_VIEW (w); gtk_widget_set_tooltip_text (w, _("IP addresses may use wildcards, such as 192.168.*.*")); sel = gtk_tree_view_get_selection (v); g_signal_connect (sel, "changed", G_CALLBACK (onWhitelistSelectionChanged), page); g_object_unref (G_OBJECT (m)); gtk_tree_view_set_headers_visible (v, TRUE); w = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (w), GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER (w), GTK_WIDGET (v)); /* ip address column */ r = gtk_cell_renderer_text_new (); g_signal_connect (r, "edited", G_CALLBACK (onAddressEdited), page); g_object_set (G_OBJECT (r), "editable", TRUE, NULL); c = gtk_tree_view_column_new_with_attributes (NULL, r, "text", COL_ADDRESS, NULL); gtk_tree_view_column_set_expand (c, TRUE); gtk_tree_view_append_column (v, c); gtk_tree_view_set_headers_visible (v, FALSE); s = _("Addresses:"); w = hig_workarea_add_row (t, &row, s, w, NULL); gtk_misc_set_alignment (GTK_MISC (w), 0.0f, 0.0f); gtk_misc_set_padding (GTK_MISC (w), 0, GUI_PAD); page->whitelist_widgets = g_slist_prepend (page->whitelist_widgets, w); h = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, GUI_PAD); w = gtk_button_new_from_stock (GTK_STOCK_REMOVE); g_signal_connect (w, "clicked", G_CALLBACK ( onRemoveWhitelistClicked), page); page->remove_button = w; onWhitelistSelectionChanged (sel, page); gtk_box_pack_start (GTK_BOX (h), w, TRUE, TRUE, 0); w = gtk_button_new_from_stock (GTK_STOCK_ADD); page->whitelist_widgets = g_slist_prepend (page->whitelist_widgets, w); g_signal_connect (w, "clicked", G_CALLBACK (onAddWhitelistClicked), page); gtk_box_pack_start (GTK_BOX (h), w, TRUE, TRUE, 0); w = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start (GTK_BOX (w), gtk_alignment_new (0, 0, 0, 0), TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (w), h, FALSE, FALSE, 0); hig_workarea_add_wide_control (t, &row, w); } refreshRPCSensitivity (page); return t; } /**** ***** Bandwidth Tab ****/ struct BandwidthPage { TrCore * core; GSList * sched_widgets; }; static void refreshSchedSensitivity (struct BandwidthPage * p) { GSList * l; const gboolean sched_enabled = gtr_pref_flag_get (TR_KEY_alt_speed_time_enabled); for (l=p->sched_widgets; l!=NULL; l=l->next) gtk_widget_set_sensitive (GTK_WIDGET (l->data), sched_enabled); } static void onSchedToggled (GtkToggleButton * tb UNUSED, gpointer user_data) { refreshSchedSensitivity (user_data); } static void onTimeComboChanged (GtkComboBox * w, gpointer core) { GtkTreeIter iter; if (gtk_combo_box_get_active_iter (w, &iter)) { int val = 0; const tr_quark key = GPOINTER_TO_INT (g_object_get_data (G_OBJECT(w), PREF_KEY)); gtk_tree_model_get (gtk_combo_box_get_model(w), &iter, 0, &val, -1); gtr_core_set_pref_int (TR_CORE(core), key, val); } } static GtkWidget* new_time_combo (GObject * core, const tr_quark key) { int val; int i; GtkWidget * w; GtkCellRenderer * r; GtkListStore * store; /* build a store at 15 minute intervals */ store = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING); for (i=0; i<60*24; i+=15) { char buf[128]; GtkTreeIter iter; g_snprintf (buf, sizeof (buf), "%02d:%02d", i / 60, i % 60); gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, i, 1, buf, -1); } /* build the widget */ w = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store)); gtk_combo_box_set_wrap_width (GTK_COMBO_BOX (w), 4); r = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (w), r, TRUE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (w), r, "text", 1, NULL); g_object_set_data (G_OBJECT(w), PREF_KEY, GINT_TO_POINTER(key)); val = gtr_pref_int_get (key); gtk_combo_box_set_active (GTK_COMBO_BOX (w), val / (15)); g_signal_connect (w, "changed", G_CALLBACK (onTimeComboChanged), core); /* cleanup */ g_object_unref (G_OBJECT (store)); return w; } static GtkWidget* new_week_combo (GObject * core, const tr_quark key) { GtkWidget * w = gtr_combo_box_new_enum (_("Every Day"), TR_SCHED_ALL, _("Weekdays"), TR_SCHED_WEEKDAY, _("Weekends"), TR_SCHED_WEEKEND, _("Sunday"), TR_SCHED_SUN, _("Monday"), TR_SCHED_MON, _("Tuesday"), TR_SCHED_TUES, _("Wednesday"), TR_SCHED_WED, _("Thursday"), TR_SCHED_THURS, _("Friday"), TR_SCHED_FRI, _("Saturday"), TR_SCHED_SAT, NULL); gtr_combo_box_set_active_enum (GTK_COMBO_BOX (w), gtr_pref_int_get (key)); g_object_set_data (G_OBJECT(w), PREF_KEY, GINT_TO_POINTER(key)); g_signal_connect (w, "changed", G_CALLBACK (onIntComboChanged), core); return w; } static void speedPageFree (gpointer gpage) { struct BandwidthPage * page = gpage; g_slist_free (page->sched_widgets); g_free (page); } static GtkWidget* speedPage (GObject * core) { const char * s; GtkWidget * t; GtkWidget * l; GtkWidget * w, * w2, * h; char buf[512]; guint row = 0; struct BandwidthPage * page = tr_new0 (struct BandwidthPage, 1); page->core = TR_CORE (core); t = hig_workarea_create (); hig_workarea_add_section_title (t, &row, _("Speed Limits")); g_snprintf (buf, sizeof (buf), _("_Upload (%s):"), _ (speed_K_str)); w = new_check_button (buf, TR_KEY_speed_limit_up_enabled, core); w2 = new_spin_button (TR_KEY_speed_limit_up, core, 0, INT_MAX, 5); gtk_widget_set_sensitive (GTK_WIDGET (w2), gtr_pref_flag_get (TR_KEY_speed_limit_up_enabled)); g_signal_connect (w, "toggled", G_CALLBACK (target_cb), w2); hig_workarea_add_row_w (t, &row, w, w2, NULL); g_snprintf (buf, sizeof (buf), _("_Download (%s):"), _ (speed_K_str)); w = new_check_button (buf, TR_KEY_speed_limit_down_enabled, core); w2 = new_spin_button (TR_KEY_speed_limit_down, core, 0, INT_MAX, 5); gtk_widget_set_sensitive (GTK_WIDGET (w2), gtr_pref_flag_get (TR_KEY_speed_limit_down_enabled)); g_signal_connect (w, "toggled", G_CALLBACK (target_cb), w2); hig_workarea_add_row_w (t, &row, w, w2, NULL); hig_workarea_add_section_divider (t, &row); h = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, GUI_PAD); g_snprintf (buf, sizeof (buf), "%s", _("Alternative Speed Limits")); w = gtk_label_new (buf); gtk_misc_set_alignment (GTK_MISC (w), 0.0f, 0.5f); gtk_label_set_use_markup (GTK_LABEL (w), TRUE); gtk_box_pack_start (GTK_BOX (h), w, FALSE, FALSE, 0); w = gtk_image_new_from_stock ("alt-speed-on", -1); gtk_box_pack_start (GTK_BOX (h), w, FALSE, FALSE, 0); hig_workarea_add_section_title_widget (t, &row, h); s = _("Override normal speed limits manually or at scheduled times"); g_snprintf (buf, sizeof (buf), "%s", s); w = gtk_label_new (buf); gtk_label_set_use_markup (GTK_LABEL (w), TRUE); gtk_misc_set_alignment (GTK_MISC (w), 0.0f, 0.5f); hig_workarea_add_wide_control (t, &row, w); g_snprintf (buf, sizeof (buf), _("U_pload (%s):"), _ (speed_K_str)); w = new_spin_button (TR_KEY_alt_speed_up, core, 0, INT_MAX, 5); hig_workarea_add_row (t, &row, buf, w, NULL); g_snprintf (buf, sizeof (buf), _("Do_wnload (%s):"), _ (speed_K_str)); w = new_spin_button (TR_KEY_alt_speed_down, core, 0, INT_MAX, 5); hig_workarea_add_row (t, &row, buf, w, NULL); s = _("_Scheduled times:"); h = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); w2 = new_time_combo (core, TR_KEY_alt_speed_time_begin); page->sched_widgets = g_slist_prepend (page->sched_widgets, w2); gtk_box_pack_start (GTK_BOX (h), w2, TRUE, TRUE, 0); w2 = l = gtk_label_new_with_mnemonic (_(" _to ")); page->sched_widgets = g_slist_prepend (page->sched_widgets, w2); gtk_box_pack_start (GTK_BOX (h), w2, FALSE, FALSE, 0); w2 = new_time_combo (core, TR_KEY_alt_speed_time_end); gtk_label_set_mnemonic_widget (GTK_LABEL (l), w2); page->sched_widgets = g_slist_prepend (page->sched_widgets, w2); gtk_box_pack_start (GTK_BOX (h), w2, TRUE, TRUE, 0); w = new_check_button (s, TR_KEY_alt_speed_time_enabled, core); g_signal_connect (w, "toggled", G_CALLBACK (onSchedToggled), page); hig_workarea_add_row_w (t, &row, w, h, NULL); s = _("_On days:"); w = new_week_combo (core, TR_KEY_alt_speed_time_day); page->sched_widgets = g_slist_prepend (page->sched_widgets, w); w = hig_workarea_add_row (t, &row, s, w, NULL); page->sched_widgets = g_slist_prepend (page->sched_widgets, w); g_object_set_data_full (G_OBJECT (t), "page", page, speedPageFree); refreshSchedSensitivity (page); return t; } /**** ***** Network Tab ****/ struct network_page_data { TrCore * core; GtkWidget * portLabel; GtkWidget * portButton; GtkWidget * portSpin; gulong portTag; gulong prefsTag; }; static void onCorePrefsChanged (TrCore * core UNUSED, const tr_quark key, gpointer gdata) { if (key == TR_KEY_peer_port) { struct network_page_data * data = gdata; gtr_label_set_text (GTK_LABEL (data->portLabel), _("Status unknown")); gtk_widget_set_sensitive (data->portButton, TRUE); gtk_widget_set_sensitive (data->portSpin, TRUE); } } static void networkPageDestroyed (gpointer gdata, GObject * dead UNUSED) { struct network_page_data * data = gdata; if (data->prefsTag > 0) g_signal_handler_disconnect (data->core, data->prefsTag); if (data->portTag > 0) g_signal_handler_disconnect (data->core, data->portTag); g_free (data); } static void onPortTested (TrCore * core UNUSED, gboolean isOpen, gpointer vdata) { struct network_page_data * data = vdata; const char * markup = isOpen ? _("Port is open") : _("Port is closed"); //gdk_threads_enter (); gtk_label_set_markup (GTK_LABEL (data->portLabel), markup); gtk_widget_set_sensitive (data->portButton, TRUE); gtk_widget_set_sensitive (data->portSpin, TRUE); //gdk_threads_leave (); } static void onPortTest (GtkButton * button UNUSED, gpointer vdata) { struct network_page_data * data = vdata; gtk_widget_set_sensitive (data->portButton, FALSE); gtk_widget_set_sensitive (data->portSpin, FALSE); gtk_label_set_markup (GTK_LABEL (data->portLabel), _("Testing TCP port…")); if (!data->portTag) data->portTag = g_signal_connect (data->core, "port-tested", G_CALLBACK (onPortTested), data); gtr_core_port_test (data->core); } static GtkWidget* networkPage (GObject * core) { GtkWidget * t; GtkWidget * w; GtkWidget * h; GtkWidget * l; const char * s; struct network_page_data * data; guint row = 0; /* register to stop listening to core prefs changes when the page is destroyed */ data = g_new0 (struct network_page_data, 1); data->core = TR_CORE (core); /* build the page */ t = hig_workarea_create (); hig_workarea_add_section_title (t, &row, _("Listening Port")); s = _("_Port used for incoming connections:"); w = data->portSpin = new_spin_button (TR_KEY_peer_port, core, 1, USHRT_MAX, 1); hig_workarea_add_row (t, &row, s, w, NULL); h = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, GUI_PAD_BIG); l = data->portLabel = gtk_label_new (_("Status unknown")); gtk_misc_set_alignment (GTK_MISC (l), 0.0f, 0.5f); gtk_box_pack_start (GTK_BOX (h), l, TRUE, TRUE, 0); w = data->portButton = gtk_button_new_with_mnemonic (_("Te_st Port")); gtk_box_pack_end (GTK_BOX (h), w, FALSE, FALSE, 0); g_signal_connect (w, "clicked", G_CALLBACK (onPortTest), data); hig_workarea_add_row (t, &row, NULL, h, NULL); data->prefsTag = g_signal_connect (TR_CORE (core), "prefs-changed", G_CALLBACK (onCorePrefsChanged), data); g_object_weak_ref (G_OBJECT (t), networkPageDestroyed, data); s = _("Pick a _random port every time Transmission is started"); w = new_check_button (s, TR_KEY_peer_port_random_on_start, core); hig_workarea_add_wide_control (t, &row, w); s = _("Use UPnP or NAT-PMP port _forwarding from my router"); w = new_check_button (s, TR_KEY_port_forwarding_enabled, core); hig_workarea_add_wide_control (t, &row, w); hig_workarea_add_section_divider (t, &row); hig_workarea_add_section_title (t, &row, _("Peer Limits")); w = new_spin_button (TR_KEY_peer_limit_per_torrent, core, 1, FD_SETSIZE, 5); hig_workarea_add_row (t, &row, _("Maximum peers per _torrent:"), w, NULL); w = new_spin_button (TR_KEY_peer_limit_global, core, 1, FD_SETSIZE, 5); hig_workarea_add_row (t, &row, _("Maximum peers _overall:"), w, NULL); hig_workarea_add_section_divider (t, &row); hig_workarea_add_section_title (t, &row, _("Options")); #ifdef WITH_UTP s = _("Enable _uTP for peer communication"); w = new_check_button (s, TR_KEY_utp_enabled, core); s = _("uTP is a tool for reducing network congestion."); gtk_widget_set_tooltip_text (w, s); hig_workarea_add_wide_control (t, &row, w); #endif s = _("Use PE_X to find more peers"); w = new_check_button (s, TR_KEY_pex_enabled, core); s = _("PEX is a tool for exchanging peer lists with the peers you're connected to."); gtk_widget_set_tooltip_text (w, s); hig_workarea_add_wide_control (t, &row, w); s = _("Use _DHT to find more peers"); w = new_check_button (s, TR_KEY_dht_enabled, core); s = _("DHT is a tool for finding peers without a tracker."); gtk_widget_set_tooltip_text (w, s); hig_workarea_add_wide_control (t, &row, w); s = _("Use _Local Peer Discovery to find more peers"); w = new_check_button (s, TR_KEY_lpd_enabled, core); s = _("LPD is a tool for finding peers on your local network."); gtk_widget_set_tooltip_text (w, s); hig_workarea_add_wide_control (t, &row, w); return t; } /**** ***** ****/ static void on_prefs_dialog_destroyed (gpointer gdata, GObject * dead_dialog G_GNUC_UNUSED) { struct prefs_dialog_data * data = gdata; if (data->core_prefs_tag > 0) g_signal_handler_disconnect (data->core, data->core_prefs_tag); g_free (data); } static void on_core_prefs_changed (TrCore * core, const tr_quark key, gpointer gdata) { struct prefs_dialog_data * data = gdata; #if 0 if (key == TR_KEY_peer_port) { gtr_label_set_text (GTK_LABEL (data->port_label), _("Status unknown")); gtk_widget_set_sensitive (data->port_button, TRUE); gtk_widget_set_sensitive (data->port_spin, TRUE); } #endif if (key == TR_KEY_download_dir) { const char * downloadDir = tr_sessionGetDownloadDir (gtr_core_session (core)); gtr_freespace_label_set_dir (data->freespace_label, downloadDir); } } GtkWidget * gtr_prefs_dialog_new (GtkWindow * parent, GObject * core) { size_t i; GtkWidget * d; GtkWidget * n; struct prefs_dialog_data * data; const tr_quark prefs_quarks[] = { TR_KEY_peer_port, TR_KEY_download_dir }; data = g_new0 (struct prefs_dialog_data, 1); data->core = TR_CORE (core); data->core_prefs_tag = g_signal_connect (TR_CORE (core), "prefs-changed", G_CALLBACK (on_core_prefs_changed), data); d = gtk_dialog_new_with_buttons (_("Transmission Preferences"), parent, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_HELP, GTK_RESPONSE_HELP, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); g_object_weak_ref (G_OBJECT(d), on_prefs_dialog_destroyed, data); gtk_window_set_role (GTK_WINDOW (d), "transmission-preferences-dialog"); gtk_container_set_border_width (GTK_CONTAINER (d), GUI_PAD); n = gtk_notebook_new (); gtk_container_set_border_width (GTK_CONTAINER (n), GUI_PAD); gtk_notebook_append_page (GTK_NOTEBOOK (n), speedPage (core), gtk_label_new (_("Speed"))); gtk_notebook_append_page (GTK_NOTEBOOK (n), downloadingPage (core, data), gtk_label_new (C_("Gerund", "Downloading"))); gtk_notebook_append_page (GTK_NOTEBOOK (n), seedingPage (core), gtk_label_new (C_("Gerund", "Seeding"))); gtk_notebook_append_page (GTK_NOTEBOOK (n), privacyPage (core), gtk_label_new (_("Privacy"))); gtk_notebook_append_page (GTK_NOTEBOOK (n), networkPage (core), gtk_label_new (_("Network"))); gtk_notebook_append_page (GTK_NOTEBOOK (n), desktopPage (core), gtk_label_new (_("Desktop"))); gtk_notebook_append_page (GTK_NOTEBOOK (n), remotePage (core), gtk_label_new (_("Remote"))); /* init from prefs keys */ for (i=0; i #include #include "conf.h" #include "notify.h" #include "tr-prefs.h" #include "util.h" #define NOTIFICATIONS_DBUS_NAME "org.freedesktop.Notifications" #define NOTIFICATIONS_DBUS_CORE_OBJECT "/org/freedesktop/Notifications" #define NOTIFICATIONS_DBUS_CORE_INTERFACE "org.freedesktop.Notifications" static GDBusProxy *proxy = NULL; static GHashTable *active_notifications = NULL; static gboolean server_supports_actions = FALSE; typedef struct _TrNotification { guint id; TrCore * core; int torrent_id; } TrNotification; static void tr_notification_free (gpointer data) { TrNotification * n = data; if (n->core) g_object_unref (G_OBJECT (n->core)); g_free (n); } static void get_capabilities_callback (GObject * source, GAsyncResult * res, gpointer user_data UNUSED) { int i; char ** caps; GVariant * result; result = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), res, NULL); if (!result || !g_variant_is_of_type (result, G_VARIANT_TYPE ("(as)"))) { if (result) g_variant_unref (result); return; } g_variant_get (result, "(^a&s)", &caps); for (i=0; caps[i]; i++) { if (g_strcmp0 (caps[i], "actions") == 0) { server_supports_actions = TRUE; break; } } g_free (caps); g_variant_unref (result); } static void g_signal_callback (GDBusProxy * proxy UNUSED, char * sender_name UNUSED, char * signal_name, GVariant * params, gpointer user_data UNUSED) { guint id; TrNotification * n; g_return_if_fail (g_variant_is_of_type (params, G_VARIANT_TYPE ("(u*)"))); g_variant_get (params, "(u*)", &id, NULL); n = g_hash_table_lookup (active_notifications, GINT_TO_POINTER ((int *) &id)); if (n == NULL) return; if (g_strcmp0 (signal_name, "NotificationClosed") == 0) { g_hash_table_remove (active_notifications, GINT_TO_POINTER ((int *) &n->id)); } else if (g_strcmp0 (signal_name, "ActionInvoked") == 0 && g_variant_is_of_type (params, G_VARIANT_TYPE ("(us)"))) { char * action; tr_torrent * tor; tor = gtr_core_find_torrent (n->core, n->torrent_id); if (tor == NULL) return; g_variant_get (params, "(u&s)", NULL, &action); if (g_strcmp0 (action, "folder") == 0) { gtr_core_open_folder (n->core, n->torrent_id); } else if (g_strcmp0 (action, "file") == 0) { const tr_info * inf = tr_torrentInfo (tor); const char * dir = tr_torrentGetDownloadDir (tor); char * path = g_build_filename (dir, inf->files[0].name, NULL); gtr_open_file (path); g_free (path); } } } static void dbus_proxy_ready_callback (GObject * source UNUSED, GAsyncResult * res, gpointer user_data UNUSED) { proxy = g_dbus_proxy_new_for_bus_finish (res, NULL); if (proxy == NULL) { g_warning ("Failed to create proxy for %s", NOTIFICATIONS_DBUS_NAME); return; } g_signal_connect (proxy, "g-signal", G_CALLBACK (g_signal_callback), NULL); g_dbus_proxy_call (proxy, "GetCapabilities", g_variant_new ("()"), G_DBUS_CALL_FLAGS_NONE, -1, NULL, get_capabilities_callback, NULL); } void gtr_notify_init (void) { active_notifications = g_hash_table_new_full (g_int_hash, g_int_equal, NULL, tr_notification_free); g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, NULL, NOTIFICATIONS_DBUS_NAME, NOTIFICATIONS_DBUS_CORE_OBJECT, NOTIFICATIONS_DBUS_CORE_INTERFACE, NULL, dbus_proxy_ready_callback, NULL); } static void notify_callback (GObject * source, GAsyncResult * res, gpointer user_data) { GVariant * result; TrNotification * n = user_data; result = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), res, NULL); if (!result || !g_variant_is_of_type (result, G_VARIANT_TYPE ("(u)"))) { if (result) g_variant_unref (result); tr_notification_free (n); return; } g_variant_get (result, "(u)", &n->id); g_hash_table_insert (active_notifications, GINT_TO_POINTER ((int *)&n->id), n); g_variant_unref (result); } void gtr_notify_torrent_completed (TrCore * core, int torrent_id) { GVariantBuilder actions_builder; TrNotification * n; tr_torrent * tor; const char * cmd = gtr_pref_string_get (TR_KEY_torrent_complete_sound_command); if (gtr_pref_flag_get (TR_KEY_torrent_complete_sound_enabled)) g_spawn_command_line_async (cmd, NULL); if (!gtr_pref_flag_get (TR_KEY_torrent_complete_notification_enabled)) return; g_return_if_fail (G_IS_DBUS_PROXY (proxy)); tor = gtr_core_find_torrent (core, torrent_id); n = g_new0 (TrNotification, 1); n->core = g_object_ref (G_OBJECT (core)); n->torrent_id = torrent_id; g_variant_builder_init (&actions_builder, G_VARIANT_TYPE ("as")); if (server_supports_actions) { const tr_info * inf = tr_torrentInfo (tor); if (inf->fileCount == 1) { g_variant_builder_add (&actions_builder, "s", "file"); g_variant_builder_add (&actions_builder, "s", _("Open File")); } else { g_variant_builder_add (&actions_builder, "s", "folder"); g_variant_builder_add (&actions_builder, "s", _("Open Folder")); } } g_dbus_proxy_call (proxy, "Notify", g_variant_new ("(susssasa{sv}i)", "Transmission", n->id, "transmission", _("Torrent Complete"), tr_torrentName (tor), &actions_builder, NULL, -1), G_DBUS_CALL_FLAGS_NONE, -1, NULL, notify_callback, n); } void gtr_notify_torrent_added (const char * name) { TrNotification * n; g_return_if_fail (G_IS_DBUS_PROXY (proxy)); if (!gtr_pref_flag_get (TR_KEY_torrent_added_notification_enabled)) return; n = g_new0 (TrNotification, 1); g_dbus_proxy_call (proxy, "Notify", g_variant_new ("(susssasa{sv}i)", "Transmission", 0, "transmission", _("Torrent Added"), name, NULL, NULL, -1), G_DBUS_CALL_FLAGS_NONE, -1, NULL, notify_callback, n); } transmission-2.92/gtk/PaxHeaders.4960/makemeta-ui.c0000644000000000000000000000007412617356116017023 xustar0030 atime=1456201459.058219655 30 ctime=1457295921.085826368 transmission-2.92/gtk/makemeta-ui.c0000644000175000017500000004131212617356116020444 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: makemeta-ui.c 14241 2014-01-21 03:10:30Z jordan $ */ #include #include #include #include #include /* tr_formatter_mem_B () */ #include "hig.h" #include "makemeta-ui.h" #include "tr-core.h" #include "tr-prefs.h" #include "util.h" #define FILE_CHOSEN_KEY "file-is-chosen" typedef struct { char * target; guint progress_tag; GtkWidget * file_radio; GtkWidget * file_chooser; GtkWidget * folder_radio; GtkWidget * folder_chooser; GtkWidget * pieces_lb; GtkWidget * destination_chooser; GtkWidget * comment_check; GtkWidget * comment_entry; GtkWidget * private_check; GtkWidget * progress_label; GtkWidget * progress_bar; GtkWidget * progress_dialog; GtkWidget * dialog; GtkTextBuffer * announce_text_buffer; TrCore * core; tr_metainfo_builder * builder; } MakeMetaUI; static void freeMetaUI (gpointer p) { MakeMetaUI * ui = p; tr_metaInfoBuilderFree (ui->builder); g_free (ui->target); memset (ui, ~0, sizeof (MakeMetaUI)); g_free (ui); } static gboolean onProgressDialogRefresh (gpointer data) { char * str = NULL; MakeMetaUI * ui = data; const tr_metainfo_builder * b = ui->builder; GtkDialog * d = GTK_DIALOG (ui->progress_dialog); GtkProgressBar * p = GTK_PROGRESS_BAR (ui->progress_bar); const double fraction = b->pieceCount ? ((double)b->pieceIndex / b->pieceCount) : 0; char * base = g_path_get_basename (b->top); /* progress label */ if (!b->isDone) str = g_strdup_printf (_("Creating \"%s\""), base); else if (b->result == TR_MAKEMETA_OK) str = g_strdup_printf (_("Created \"%s\"!"), base); else if (b->result == TR_MAKEMETA_URL) str = g_strdup_printf (_("Error: invalid announce URL \"%s\""), b->errfile); else if (b->result == TR_MAKEMETA_CANCELLED) str = g_strdup_printf (_("Cancelled")); else if (b->result == TR_MAKEMETA_IO_READ) str = g_strdup_printf (_("Error reading \"%s\": %s"), b->errfile, g_strerror (b->my_errno)); else if (b->result == TR_MAKEMETA_IO_WRITE) str = g_strdup_printf (_("Error writing \"%s\": %s"), b->errfile, g_strerror (b->my_errno)); else g_assert_not_reached (); if (str != NULL) { gtr_label_set_text (GTK_LABEL (ui->progress_label), str); g_free (str); } /* progress bar */ if (!b->pieceIndex) { str = g_strdup (""); } else { char sizebuf[128]; tr_strlsize (sizebuf, (uint64_t)b->pieceIndex * (uint64_t)b->pieceSize, sizeof (sizebuf)); /* how much data we've scanned through to generate checksums */ str = g_strdup_printf (_("Scanned %s"), sizebuf); } gtk_progress_bar_set_fraction (p, fraction); gtk_progress_bar_set_text (p, str); g_free (str); /* buttons */ gtk_dialog_set_response_sensitive (d, GTK_RESPONSE_CANCEL, !b->isDone); gtk_dialog_set_response_sensitive (d, GTK_RESPONSE_CLOSE, b->isDone); gtk_dialog_set_response_sensitive (d, GTK_RESPONSE_ACCEPT, b->isDone && !b->result); g_free (base); return G_SOURCE_CONTINUE; } static void onProgressDialogDestroyed (gpointer data, GObject * dead UNUSED) { MakeMetaUI * ui = data; g_source_remove (ui->progress_tag); } static void addTorrent (MakeMetaUI * ui) { char * path; const tr_metainfo_builder * b = ui->builder; tr_ctor * ctor = tr_ctorNew (gtr_core_session (ui->core)); tr_ctorSetMetainfoFromFile (ctor, ui->target); path = g_path_get_dirname (b->top); tr_ctorSetDownloadDir (ctor, TR_FORCE, path); g_free (path); gtr_core_add_ctor (ui->core, ctor); } static void onProgressDialogResponse (GtkDialog * d, int response, gpointer data) { MakeMetaUI * ui = data; switch (response) { case GTK_RESPONSE_CANCEL: ui->builder->abortFlag = TRUE; gtk_widget_destroy (GTK_WIDGET (d)); break; case GTK_RESPONSE_ACCEPT: addTorrent (ui); /* fall-through */ case GTK_RESPONSE_CLOSE: gtk_widget_destroy (ui->builder->result ? GTK_WIDGET (d) : ui->dialog); break; default: g_assert (0 && "unhandled response"); } } static void makeProgressDialog (GtkWidget * parent, MakeMetaUI * ui) { GtkWidget *d, *l, *w, *v, *fr; d = gtk_dialog_new_with_buttons (_("New Torrent"), GTK_WINDOW (parent), GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT, NULL); ui->progress_dialog = d; g_signal_connect (d, "response", G_CALLBACK (onProgressDialogResponse), ui); fr = gtk_frame_new (NULL); gtk_container_set_border_width (GTK_CONTAINER (fr), GUI_PAD_BIG); gtk_frame_set_shadow_type (GTK_FRAME (fr), GTK_SHADOW_NONE); v = gtk_box_new (GTK_ORIENTATION_VERTICAL, GUI_PAD); gtk_container_add (GTK_CONTAINER (fr), v); l = gtk_label_new (_("Creating torrent…")); gtk_misc_set_alignment (GTK_MISC (l), 0.0, 0.5); gtk_label_set_justify (GTK_LABEL (l), GTK_JUSTIFY_LEFT); ui->progress_label = l; gtk_box_pack_start (GTK_BOX (v), l, FALSE, FALSE, 0); w = gtk_progress_bar_new (); ui->progress_bar = w; gtk_box_pack_start (GTK_BOX (v), w, FALSE, FALSE, 0); ui->progress_tag = gdk_threads_add_timeout_seconds (SECONDARY_WINDOW_REFRESH_INTERVAL_SECONDS, onProgressDialogRefresh, ui); g_object_weak_ref (G_OBJECT (d), onProgressDialogDestroyed, ui); onProgressDialogRefresh (ui); gtr_dialog_set_content (GTK_DIALOG (d), fr); gtk_widget_show (d); } static void onResponse (GtkDialog* d, int response, gpointer user_data) { MakeMetaUI * ui = user_data; if (response == GTK_RESPONSE_ACCEPT) { if (ui->builder != NULL) { int i; int n; int tier; GtkTextIter start, end; char * dir; char * base; char * tracker_text; char ** tracker_strings; GtkEntry * c_entry = GTK_ENTRY (ui->comment_entry); GtkToggleButton * p_check = GTK_TOGGLE_BUTTON (ui->private_check); GtkToggleButton * c_check = GTK_TOGGLE_BUTTON (ui->comment_check); const char * comment = gtk_entry_get_text (c_entry); const gboolean isPrivate = gtk_toggle_button_get_active (p_check); const gboolean useComment = gtk_toggle_button_get_active (c_check); tr_tracker_info * trackers; /* destination file */ dir = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ui->destination_chooser)); base = g_path_get_basename (ui->builder->top); g_free (ui->target); ui->target = g_strdup_printf ("%s/%s.torrent", dir, base); /* build the array of trackers */ gtk_text_buffer_get_bounds (ui->announce_text_buffer, &start, &end); tracker_text = gtk_text_buffer_get_text (ui->announce_text_buffer, &start, &end, FALSE); tracker_strings = g_strsplit (tracker_text, "\n", 0); for (i=0; tracker_strings[i];) ++i; trackers = g_new0 (tr_tracker_info, i); for (i=n=tier=0; tracker_strings[i]; ++i) { const char * str = tracker_strings[i]; if (!*str) { ++tier; } else { trackers[n].tier = tier; trackers[n].announce = tracker_strings[i]; ++n; } } /* build the .torrent */ makeProgressDialog (GTK_WIDGET (d), ui); tr_makeMetaInfo (ui->builder, ui->target, trackers, n, useComment ? comment : NULL, isPrivate); /* cleanup */ g_free (trackers); g_strfreev (tracker_strings); g_free (tracker_text); g_free (base); g_free (dir); } } else if (response == GTK_RESPONSE_CLOSE) { gtk_widget_destroy (GTK_WIDGET (d)); } } /*** **** ***/ static void onSourceToggled (GtkToggleButton * tb, gpointer user_data) { gtk_widget_set_sensitive (GTK_WIDGET (user_data), gtk_toggle_button_get_active (tb)); } static void updatePiecesLabel (MakeMetaUI * ui) { const tr_metainfo_builder * builder = ui->builder; const char * filename = builder ? builder->top : NULL; GString * gstr = g_string_new (NULL); g_string_append (gstr, ""); if (!filename) { g_string_append (gstr, _("No source selected")); } else { char buf[128]; tr_strlsize (buf, builder->totalSize, sizeof (buf)); g_string_append_printf (gstr, ngettext ("%1$s; %2$'d File", "%1$s; %2$'d Files", builder->fileCount), buf, builder->fileCount); g_string_append (gstr, "; "); tr_formatter_mem_B (buf, builder->pieceSize, sizeof (buf)); g_string_append_printf (gstr, ngettext ("%1$'d Piece @ %2$s", "%1$'d Pieces @ %2$s", builder->pieceCount), builder->pieceCount, buf); } g_string_append (gstr, ""); gtk_label_set_markup (GTK_LABEL (ui->pieces_lb), gstr->str); g_string_free (gstr, TRUE); } static void setFilename (MakeMetaUI * ui, const char * filename) { if (ui->builder != NULL) { tr_metaInfoBuilderFree (ui->builder); ui->builder = NULL; } if (filename) ui->builder = tr_metaInfoBuilderCreate (filename); updatePiecesLabel (ui); } static void onChooserChosen (GtkFileChooser * chooser, gpointer user_data) { char * filename; MakeMetaUI * ui = user_data; g_object_set_data (G_OBJECT (chooser), FILE_CHOSEN_KEY, GINT_TO_POINTER (TRUE)); filename = gtk_file_chooser_get_filename (chooser); setFilename (ui, filename); g_free (filename); } static void onSourceToggled2 (GtkToggleButton * tb, GtkWidget * chooser, MakeMetaUI * ui) { if (gtk_toggle_button_get_active (tb)) { if (g_object_get_data (G_OBJECT (chooser), FILE_CHOSEN_KEY) != NULL) onChooserChosen (GTK_FILE_CHOOSER (chooser), ui); else setFilename (ui, NULL); } } static void onFolderToggled (GtkToggleButton * tb, gpointer data) { MakeMetaUI * ui = data; onSourceToggled2 (tb, ui->folder_chooser, ui); } static void onFileToggled (GtkToggleButton * tb, gpointer data) { MakeMetaUI * ui = data; onSourceToggled2 (tb, ui->file_chooser, ui); } static const char * getDefaultSavePath (void) { return g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP); } static void on_drag_data_received (GtkWidget * widget UNUSED, GdkDragContext * drag_context, gint x UNUSED, gint y UNUSED, GtkSelectionData * selection_data, guint info UNUSED, guint time_, gpointer user_data) { gboolean success = FALSE; MakeMetaUI * ui = user_data; char ** uris = gtk_selection_data_get_uris (selection_data); if (uris && uris[0]) { const char * uri = uris[ 0 ]; gchar * filename = g_filename_from_uri (uri, NULL, NULL); if (g_file_test (filename, G_FILE_TEST_IS_DIR)) { /* a directory was dragged onto the dialog... */ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ui->folder_radio), TRUE); gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (ui->folder_chooser), filename); success = TRUE; } else if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) { /* a file was dragged on to the dialog... */ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ui->file_radio), TRUE); gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (ui->file_chooser), filename); success = TRUE; } g_free (filename); } g_strfreev (uris); gtk_drag_finish (drag_context, success, FALSE, time_); } GtkWidget* gtr_torrent_creation_dialog_new (GtkWindow * parent, TrCore * core) { const char * str; GtkWidget * d, *t, *w, *l, *fr, *sw, *v; GSList * slist; guint row = 0; MakeMetaUI * ui = g_new0 (MakeMetaUI, 1); ui->core = core; d = gtk_dialog_new_with_buttons (_("New Torrent"), parent, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, GTK_STOCK_NEW, GTK_RESPONSE_ACCEPT, NULL); ui->dialog = d; g_signal_connect (d, "response", G_CALLBACK (onResponse), ui); g_object_set_data_full (G_OBJECT (d), "ui", ui, freeMetaUI); t = hig_workarea_create (); hig_workarea_add_section_title (t, &row, _("Files")); str = _("Sa_ve to:"); w = gtk_file_chooser_button_new (NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (w), getDefaultSavePath ()); ui->destination_chooser = w; hig_workarea_add_row (t, &row, str, w, NULL); l = gtk_radio_button_new_with_mnemonic (NULL, _("Source F_older:")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (l), FALSE); w = gtk_file_chooser_button_new (NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); g_signal_connect (l, "toggled", G_CALLBACK (onFolderToggled), ui); g_signal_connect (l, "toggled", G_CALLBACK (onSourceToggled), w); g_signal_connect (w, "selection-changed", G_CALLBACK (onChooserChosen), ui); ui->folder_radio = l; ui->folder_chooser = w; gtk_widget_set_sensitive (GTK_WIDGET (w), FALSE); hig_workarea_add_row_w (t, &row, l, w, NULL); slist = gtk_radio_button_get_group (GTK_RADIO_BUTTON (l)), l = gtk_radio_button_new_with_mnemonic (slist, _("Source _File:")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (l), TRUE); w = gtk_file_chooser_button_new (NULL, GTK_FILE_CHOOSER_ACTION_OPEN); g_signal_connect (l, "toggled", G_CALLBACK (onFileToggled), ui); g_signal_connect (l, "toggled", G_CALLBACK (onSourceToggled), w); g_signal_connect (w, "selection-changed", G_CALLBACK (onChooserChosen), ui); ui->file_radio = l; ui->file_chooser = w; hig_workarea_add_row_w (t, &row, l, w, NULL); w = gtk_label_new (NULL); ui->pieces_lb = w; gtk_label_set_markup (GTK_LABEL (w), _("No source selected")); hig_workarea_add_row (t, &row, NULL, w, NULL); hig_workarea_add_section_divider (t, &row); hig_workarea_add_section_title (t, &row, _("Properties")); str = _("_Trackers:"); v = gtk_box_new (GTK_ORIENTATION_VERTICAL, GUI_PAD_SMALL); ui->announce_text_buffer = gtk_text_buffer_new (NULL); w = gtk_text_view_new_with_buffer (ui->announce_text_buffer); gtk_widget_set_size_request (w, -1, 80); sw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (sw), w); fr = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (fr), GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER (fr), sw); gtk_box_pack_start (GTK_BOX (v), fr, TRUE, TRUE, 0); l = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (l), _("To add a backup URL, add it on the line after the primary URL.\n" "To add another primary URL, add it after a blank line.")); gtk_label_set_justify (GTK_LABEL (l), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (l), 0.0, 0.5); gtk_box_pack_start (GTK_BOX (v), l, FALSE, FALSE, 0); hig_workarea_add_tall_row (t, &row, str, v, NULL); l = gtk_check_button_new_with_mnemonic (_("Co_mment:")); ui->comment_check = l; gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (l), FALSE); w = gtk_entry_new (); ui->comment_entry = w; gtk_widget_set_sensitive (GTK_WIDGET (w), FALSE); g_signal_connect (l, "toggled", G_CALLBACK (onSourceToggled), w); hig_workarea_add_row_w (t, &row, l, w, NULL); w = hig_workarea_add_wide_checkbutton (t, &row, _("_Private torrent"), FALSE); ui->private_check = w; gtr_dialog_set_content (GTK_DIALOG (d), t); gtk_drag_dest_set (d, GTK_DEST_DEFAULT_ALL, NULL, 0, GDK_ACTION_COPY); gtk_drag_dest_add_uri_targets (d); g_signal_connect (d, "drag-data-received", G_CALLBACK (on_drag_data_received), ui); return d; } transmission-2.92/gtk/PaxHeaders.4960/msgwin.c0000644000000000000000000000007312617356116016127 xustar0030 atime=1456201459.059219672 29 ctime=1457295921.09182647 transmission-2.92/gtk/msgwin.c0000644000175000017500000004111712617356116017554 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: msgwin.c 14241 2014-01-21 03:10:30Z jordan $ */ #include #include #include #include #include #include #include #include "conf.h" #include "hig.h" #include "msgwin.h" #include "tr-core.h" #include "tr-prefs.h" #include "util.h" enum { COL_SEQUENCE, COL_NAME, COL_MESSAGE, COL_TR_MSG, N_COLUMNS }; struct MsgData { TrCore * core; GtkTreeView * view; GtkListStore * store; GtkTreeModel * filter; GtkTreeModel * sort; tr_log_level maxLevel; gboolean isPaused; guint refresh_tag; }; static struct tr_log_message * myTail = NULL; static struct tr_log_message * myHead = NULL; /**** ***** ****/ /* is the user looking at the latest messages? */ static gboolean is_pinned_to_new (struct MsgData * data) { gboolean pinned_to_new = FALSE; if (data->view == NULL) { pinned_to_new = TRUE; } else { GtkTreePath * last_visible; if (gtk_tree_view_get_visible_range (data->view, NULL, &last_visible)) { GtkTreeIter iter; const int row_count = gtk_tree_model_iter_n_children (data->sort, NULL); if (gtk_tree_model_iter_nth_child (data->sort, &iter, NULL, row_count-1)) { GtkTreePath * last_row = gtk_tree_model_get_path (data->sort, &iter); pinned_to_new = !gtk_tree_path_compare (last_visible, last_row); gtk_tree_path_free (last_row); } gtk_tree_path_free (last_visible); } } return pinned_to_new; } static void scroll_to_bottom (struct MsgData * data) { if (data->sort != NULL) { GtkTreeIter iter; const int row_count = gtk_tree_model_iter_n_children (data->sort, NULL); if (gtk_tree_model_iter_nth_child (data->sort, &iter, NULL, row_count-1)) { GtkTreePath * last_row = gtk_tree_model_get_path (data->sort, &iter); gtk_tree_view_scroll_to_cell (data->view, last_row, NULL, TRUE, 1, 0); gtk_tree_path_free (last_row); } } } /**** ***** ****/ static void level_combo_changed_cb (GtkComboBox * combo_box, gpointer gdata) { struct MsgData * data = gdata; const int level = gtr_combo_box_get_active_enum (combo_box); const gboolean pinned_to_new = is_pinned_to_new (data); tr_logSetLevel (level); gtr_core_set_pref_int (data->core, TR_KEY_message_level, level); data->maxLevel = level; gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (data->filter)); if (pinned_to_new) scroll_to_bottom (data); } /* similar to asctime, but is utf8-clean */ static char* gtr_localtime (time_t time) { char buf[256], *eoln; const struct tm tm = *localtime (&time); g_strlcpy (buf, asctime (&tm), sizeof (buf)); if ((eoln = strchr (buf, '\n'))) *eoln = '\0'; return g_locale_to_utf8 (buf, -1, NULL, NULL, NULL); } static void doSave (GtkWindow * parent, struct MsgData * data, const char * filename) { FILE * fp = fopen (filename, "w+"); if (!fp) { GtkWidget * w = gtk_message_dialog_new (parent, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Couldn't save \"%s\""), filename); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), "%s", g_strerror (errno)); g_signal_connect_swapped (w, "response", G_CALLBACK (gtk_widget_destroy), w); gtk_widget_show (w); } else { GtkTreeIter iter; GtkTreeModel * model = GTK_TREE_MODEL (data->sort); if (gtk_tree_model_iter_children (model, &iter, NULL)) do { char * date; const char * levelStr; const struct tr_log_message * node; gtk_tree_model_get (model, &iter, COL_TR_MSG, &node, -1); date = gtr_localtime (node->when); switch (node->level) { case TR_LOG_DEBUG: levelStr = "debug"; break; case TR_LOG_ERROR: levelStr = "error"; break; default: levelStr = " "; break; } fprintf (fp, "%s\t%s\t%s\t%s\n", date, levelStr, (node->name ? node->name : ""), (node->message ? node->message : "")); g_free (date); } while (gtk_tree_model_iter_next (model, &iter)); fclose (fp); } } static void onSaveDialogResponse (GtkWidget * d, int response, gpointer data) { if (response == GTK_RESPONSE_ACCEPT) { char * file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (d)); doSave (GTK_WINDOW (d), data, file); g_free (file); } gtk_widget_destroy (d); } static void onSaveRequest (GtkWidget * w, gpointer data) { GtkWindow * window = GTK_WINDOW (gtk_widget_get_toplevel (w)); GtkWidget * d = gtk_file_chooser_dialog_new (_("Save Log"), window, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_alternative_button_order (GTK_DIALOG (d), GTK_RESPONSE_ACCEPT, GTK_RESPONSE_CANCEL, -1); g_signal_connect (d, "response", G_CALLBACK (onSaveDialogResponse), data); gtk_widget_show (d); } static void onClearRequest (GtkWidget * w UNUSED, gpointer gdata) { struct MsgData * data = gdata; gtk_list_store_clear (data->store); tr_logFreeQueue (myHead); myHead = myTail = NULL; } static void onPauseToggled (GtkToggleToolButton * w, gpointer gdata) { struct MsgData * data = gdata; data->isPaused = gtk_toggle_tool_button_get_active (w); } static const char* getForegroundColor (int msgLevel) { switch (msgLevel) { case TR_LOG_DEBUG: return "forestgreen"; case TR_LOG_INFO: return "black"; case TR_LOG_ERROR: return "red"; default: g_assert_not_reached (); return "black"; } } static void renderText (GtkTreeViewColumn * column UNUSED, GtkCellRenderer * renderer, GtkTreeModel * tree_model, GtkTreeIter * iter, gpointer gcol) { const int col = GPOINTER_TO_INT (gcol); char * str = NULL; const struct tr_log_message * node; gtk_tree_model_get (tree_model, iter, col, &str, COL_TR_MSG, &node, -1); g_object_set (renderer, "text", str, "foreground", getForegroundColor (node->level), "ellipsize", PANGO_ELLIPSIZE_END, NULL); } static void renderTime (GtkTreeViewColumn * column UNUSED, GtkCellRenderer * renderer, GtkTreeModel * tree_model, GtkTreeIter * iter, gpointer data UNUSED) { struct tm tm; char buf[16]; const struct tr_log_message * node; gtk_tree_model_get (tree_model, iter, COL_TR_MSG, &node, -1); tm = *localtime (&node->when); g_snprintf (buf, sizeof (buf), "%02d:%02d:%02d", tm.tm_hour, tm.tm_min, tm.tm_sec); g_object_set (renderer, "text", buf, "foreground", getForegroundColor (node->level), NULL); } static void appendColumn (GtkTreeView * view, int col) { GtkCellRenderer * r; GtkTreeViewColumn * c; const char * title = NULL; switch (col) { case COL_SEQUENCE: title = _("Time"); break; /* noun. column title for a list */ case COL_NAME: title = _("Name"); break; /* noun. column title for a list */ case COL_MESSAGE: title = _("Message"); break; default: g_assert_not_reached (); } switch (col) { case COL_NAME: r = gtk_cell_renderer_text_new (); c = gtk_tree_view_column_new_with_attributes (title, r, NULL); gtk_tree_view_column_set_cell_data_func (c, r, renderText, GINT_TO_POINTER (col), NULL); gtk_tree_view_column_set_sizing (c, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_fixed_width (c, 200); gtk_tree_view_column_set_resizable (c, TRUE); break; case COL_MESSAGE: r = gtk_cell_renderer_text_new (); c = gtk_tree_view_column_new_with_attributes (title, r, NULL); gtk_tree_view_column_set_cell_data_func (c, r, renderText, GINT_TO_POINTER (col), NULL); gtk_tree_view_column_set_sizing (c, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_fixed_width (c, 500); gtk_tree_view_column_set_resizable (c, TRUE); break; case COL_SEQUENCE: r = gtk_cell_renderer_text_new (); c = gtk_tree_view_column_new_with_attributes (title, r, NULL); gtk_tree_view_column_set_cell_data_func (c, r, renderTime, NULL, NULL); gtk_tree_view_column_set_resizable (c, TRUE); break; default: g_assert_not_reached (); break; } gtk_tree_view_append_column (view, c); } static gboolean isRowVisible (GtkTreeModel * model, GtkTreeIter * iter, gpointer gdata) { const struct tr_log_message * node; const struct MsgData * data = gdata; gtk_tree_model_get (model, iter, COL_TR_MSG, &node, -1); return node->level <= data->maxLevel; } static void onWindowDestroyed (gpointer gdata, GObject * deadWindow UNUSED) { struct MsgData * data = gdata; g_source_remove (data->refresh_tag); g_free (data); } static tr_log_message * addMessages (GtkListStore * store, struct tr_log_message * head) { tr_log_message * i; static unsigned int sequence = 0; const char * default_name = g_get_application_name (); for (i=head; i && i->next; i=i->next) { const char * name = i->name ? i->name : default_name; gtk_list_store_insert_with_values (store, NULL, 0, COL_TR_MSG, i, COL_NAME, name, COL_MESSAGE, i->message, COL_SEQUENCE, ++sequence, -1); /* if it's an error message, dump it to the terminal too */ if (i->level == TR_LOG_ERROR) { GString * gstr = g_string_sized_new (512); g_string_append_printf (gstr, "%s:%d %s", i->file, i->line, i->message); if (i->name != NULL) g_string_append_printf (gstr, " (%s)", i->name); g_warning ("%s", gstr->str); g_string_free (gstr, TRUE); } } return i; /* tail */ } static gboolean onRefresh (gpointer gdata) { struct MsgData * data = gdata; const gboolean pinned_to_new = is_pinned_to_new (data); if (!data->isPaused) { tr_log_message * msgs = tr_logGetQueue (); if (msgs) { /* add the new messages and append them to the end of * our persistent list */ tr_log_message * tail = addMessages (data->store, msgs); if (myTail) myTail->next = msgs; else myHead = msgs; myTail = tail; } if (pinned_to_new) scroll_to_bottom (data); } return G_SOURCE_CONTINUE; } static GtkWidget* debug_level_combo_new (void) { GtkWidget * w = gtr_combo_box_new_enum (_("Error"), TR_LOG_ERROR, _("Information"), TR_LOG_INFO, _("Debug"), TR_LOG_DEBUG, NULL); gtr_combo_box_set_active_enum (GTK_COMBO_BOX (w), gtr_pref_int_get (TR_KEY_message_level)); return w; } /** *** Public Functions **/ GtkWidget * gtr_message_log_window_new (GtkWindow * parent, TrCore * core) { GtkWidget * win; GtkWidget * vbox; GtkWidget * toolbar; GtkWidget * w; GtkWidget * view; GtkToolItem * item; struct MsgData * data; data = g_new0 (struct MsgData, 1); data->core = core; win = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_transient_for (GTK_WINDOW (win), parent); gtk_window_set_title (GTK_WINDOW (win), _("Message Log")); gtk_window_set_default_size (GTK_WINDOW (win), 560, 350); gtk_window_set_role (GTK_WINDOW (win), "message-log"); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); /** *** toolbar **/ toolbar = gtk_toolbar_new (); gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH_HORIZ); gtk_style_context_add_class (gtk_widget_get_style_context (toolbar), GTK_STYLE_CLASS_PRIMARY_TOOLBAR); item = gtk_tool_button_new_from_stock (GTK_STOCK_SAVE_AS); g_object_set (G_OBJECT (item), "is-important", TRUE, NULL); g_signal_connect (item, "clicked", G_CALLBACK (onSaveRequest), data); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1); item = gtk_tool_button_new_from_stock (GTK_STOCK_CLEAR); g_object_set (G_OBJECT (item), "is-important", TRUE, NULL); g_signal_connect (item, "clicked", G_CALLBACK (onClearRequest), data); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1); item = gtk_separator_tool_item_new (); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1); item = gtk_toggle_tool_button_new_from_stock (GTK_STOCK_MEDIA_PAUSE); g_object_set (G_OBJECT (item), "is-important", TRUE, NULL); g_signal_connect (item, "toggled", G_CALLBACK (onPauseToggled), data); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1); item = gtk_separator_tool_item_new (); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1); w = gtk_label_new (_("Level")); gtk_misc_set_padding (GTK_MISC (w), GUI_PAD, 0); item = gtk_tool_item_new (); gtk_container_add (GTK_CONTAINER (item), w); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1); w = debug_level_combo_new (); g_signal_connect (w, "changed", G_CALLBACK (level_combo_changed_cb), data); item = gtk_tool_item_new (); gtk_container_add (GTK_CONTAINER (item), w); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1); gtk_box_pack_start (GTK_BOX (vbox), toolbar, FALSE, FALSE, 0); /** *** messages **/ data->store = gtk_list_store_new (N_COLUMNS, G_TYPE_UINT, /* sequence */ G_TYPE_POINTER, /* category */ G_TYPE_POINTER, /* message */ G_TYPE_POINTER); /* struct tr_log_message */ addMessages (data->store, myHead); onRefresh (data); /* much faster to populate *before* it has listeners */ data->filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (data->store), NULL); data->sort = gtk_tree_model_sort_new_with_model (data->filter); g_object_unref (data->filter); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (data->sort), COL_SEQUENCE, GTK_SORT_ASCENDING); data->maxLevel = gtr_pref_int_get (TR_KEY_message_level); gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (data->filter), isRowVisible, data, NULL); view = gtk_tree_view_new_with_model (data->sort); g_object_unref (data->sort); g_signal_connect (view, "button-release-event", G_CALLBACK (on_tree_view_button_released), NULL); data->view = GTK_TREE_VIEW (view); gtk_tree_view_set_rules_hint (data->view, TRUE); appendColumn (data->view, COL_SEQUENCE); appendColumn (data->view, COL_NAME); appendColumn (data->view, COL_MESSAGE); w = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (w), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (w), GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER (w), view); gtk_box_pack_start (GTK_BOX (vbox), w, TRUE, TRUE, 0); gtk_container_add (GTK_CONTAINER (win), vbox); data->refresh_tag = gdk_threads_add_timeout_seconds (SECONDARY_WINDOW_REFRESH_INTERVAL_SECONDS, onRefresh, data); g_object_weak_ref (G_OBJECT (win), onWindowDestroyed, data); scroll_to_bottom (data); gtk_widget_show_all (win); return win; } transmission-2.92/gtk/PaxHeaders.4960/tr-core.h0000644000000000000000000000013212663770154016202 xustar0030 mtime=1456468076.207929413 30 atime=1456468076.207929413 30 ctime=1457295920.988824719 transmission-2.92/gtk/tr-core.h0000644000175000017500000001350412663770154017632 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: tr-core.h 14681 2016-02-23 04:34:57Z mikedld $ * * Copyright (c) Transmission authors and contributors * * 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. *****************************************************************************/ #ifndef GTR_CORE_H #define GTR_CORE_H #include #include #include G_BEGIN_DECLS #define TR_CORE_TYPE (tr_core_get_type ()) #define TR_CORE(o)(G_TYPE_CHECK_INSTANCE_CAST ((o), TR_CORE_TYPE, TrCore)) #define TR_RESOURCE_PATH "/com/transmissionbt/transmission/" typedef struct _TrCore { GObject parent; /*< private >*/ struct TrCorePrivate * priv; } TrCore; enum tr_core_err { TR_CORE_ERR_ADD_TORRENT_ERR = TR_PARSE_ERR, TR_CORE_ERR_ADD_TORRENT_DUP = TR_PARSE_DUPLICATE, TR_CORE_ERR_NO_MORE_TORRENTS = 1000 /* finished adding a batch */ }; typedef struct _TrCoreClass { GObjectClass parent_class; void (* add_error) (TrCore*, enum tr_core_err, const char * name); void (* add_prompt) (TrCore*, gpointer ctor); void (* blocklist_updated)(TrCore*, int ruleCount); void (* busy) (TrCore*, gboolean is_busy); void (* prefs_changed) (TrCore*, const tr_quark key); void (* port_tested) (TrCore*, gboolean is_open); void (* quit) (TrCore*); } TrCoreClass; GType tr_core_get_type (void) G_GNUC_CONST; TrCore * gtr_core_new (tr_session *); tr_session * gtr_core_close (TrCore*); /* Return the model used without incrementing the reference count */ GtkTreeModel * gtr_core_model (TrCore * self); void gtr_core_clear (TrCore * self); tr_session * gtr_core_session (TrCore * self); size_t gtr_core_get_active_torrent_count (TrCore * self); size_t gtr_core_get_torrent_count (TrCore * self); tr_torrent * gtr_core_find_torrent (TrCore * core, int id); void gtr_core_pref_changed (TrCore * core, const tr_quark key); /****** ******* ******/ /** * Load saved state and return number of torrents added. * May trigger one or more "error" signals with TR_CORE_ERR_ADD_TORRENT */ void gtr_core_load (TrCore * self, gboolean forcepaused); /** * Add a list of torrents. * This function assumes ownership of torrentFiles * * May pop up dialogs for each torrent if that preference is enabled. * May trigger one or more "error" signals with TR_CORE_ERR_ADD_TORRENT */ void gtr_core_add_files (TrCore * core, GSList * files, gboolean do_start, gboolean do_prompt, gboolean do_notify); /** @brief Add a torrent from a URL */ bool gtr_core_add_from_url (TrCore * core, const char * url); /** @brief Add a torrent. @param ctor this function assumes ownership of the ctor */ void gtr_core_add_ctor (TrCore * core, tr_ctor * ctor); /** Add a torrent. */ void gtr_core_add_torrent (TrCore*, tr_torrent*, gboolean do_notify); /** * Notifies listeners that torrents have been added. * This should be called after one or more tr_core_add* () calls. */ void gtr_core_torrents_added (TrCore * self); /****** ******* ******/ /* remove a torrent */ void gtr_core_remove_torrent (TrCore * self, int id, gboolean delete_files); /* update the model with current torrent status */ void gtr_core_update (TrCore * self); /** *** Set a preference value, save the prefs file, and emit the "prefs-changed" signal **/ void gtr_core_set_pref (TrCore * self, const tr_quark key, const char * val); void gtr_core_set_pref_bool (TrCore * self, const tr_quark key, gboolean val); void gtr_core_set_pref_int (TrCore * self, const tr_quark key, int val); void gtr_core_set_pref_double (TrCore * self, const tr_quark key, double val); /** *** **/ void gtr_core_port_test (TrCore * core); void gtr_core_blocklist_update (TrCore * core); void gtr_core_exec (TrCore * core, const tr_variant * benc); void gtr_core_open_folder (TrCore * core, int torrent_id); /** *** **/ /* column names for the model used to store torrent information */ /* keep this in sync with the type array in tr_core_init () in tr_core.c */ enum { MC_NAME_COLLATED, MC_TORRENT, MC_TORRENT_ID, MC_SPEED_UP, MC_SPEED_DOWN, MC_ACTIVE_PEERS_UP, MC_ACTIVE_PEERS_DOWN, MC_RECHECK_PROGRESS, MC_ACTIVE, MC_ACTIVITY, MC_FINISHED, MC_PRIORITY, MC_QUEUE_POSITION, MC_TRACKERS, /* tr_stat.error * Tracked because ACTIVITY_FILTER_ERROR needs the row-changed events */ MC_ERROR, /* tr_stat.{ peersSendingToUs + peersGettingFromUs + webseedsSendingToUs } * Tracked because ACTIVITY_FILTER_ACTIVE needs the row-changed events */ MC_ACTIVE_PEER_COUNT, MC_ROW_COUNT }; G_END_DECLS #endif /* GTR_CORE_H */ transmission-2.92/gtk/PaxHeaders.4960/details.c0000644000000000000000000000007312640000103016222 xustar0029 atime=1456201459.05321957 30 ctime=1457295921.039825586 transmission-2.92/gtk/details.c0000644000175000017500000026072412640000103017656 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: details.c 14552 2015-07-13 00:32:48Z mikedld $ */ #include /* INT_MAX */ #include #include /* sscanf () */ #include /* abort () */ #include #include #include #include /* tr_free */ #include "actions.h" #include "conf.h" #include "details.h" #include "favicon.h" /* gtr_get_favicon () */ #include "file-list.h" #include "hig.h" #include "tr-prefs.h" #include "util.h" static GQuark ARG_KEY = 0; static GQuark DETAILS_KEY = 0; static GQuark TORRENT_ID_KEY = 0; static GQuark TEXT_BUFFER_KEY = 0; static GQuark URL_ENTRY_KEY = 0; struct DetailsImpl { GtkWidget * dialog; GtkWidget * honor_limits_check; GtkWidget * up_limited_check; GtkWidget * up_limit_sping; GtkWidget * down_limited_check; GtkWidget * down_limit_spin; GtkWidget * bandwidth_combo; GtkWidget * ratio_combo; GtkWidget * ratio_spin; GtkWidget * idle_combo; GtkWidget * idle_spin; GtkWidget * max_peers_spin; gulong honor_limits_check_tag; gulong up_limited_check_tag; gulong down_limited_check_tag; gulong down_limit_spin_tag; gulong up_limit_spin_tag; gulong bandwidth_combo_tag; gulong ratio_combo_tag; gulong ratio_spin_tag; gulong idle_combo_tag; gulong idle_spin_tag; gulong max_peers_spin_tag; GtkWidget * size_lb; GtkWidget * state_lb; GtkWidget * have_lb; GtkWidget * dl_lb; GtkWidget * ul_lb; GtkWidget * error_lb; GtkWidget * date_started_lb; GtkWidget * eta_lb; GtkWidget * last_activity_lb; GtkWidget * hash_lb; GtkWidget * privacy_lb; GtkWidget * origin_lb; GtkWidget * destination_lb; GtkTextBuffer * comment_buffer; GHashTable * peer_hash; GHashTable * webseed_hash; GtkListStore * peer_store; GtkListStore * webseed_store; GtkWidget * webseed_view; GtkWidget * peer_view; GtkWidget * more_peer_details_check; GtkListStore * tracker_store; GHashTable * tracker_hash; GtkTreeModel * trackers_filtered; GtkWidget * add_tracker_button; GtkWidget * edit_trackers_button; GtkWidget * remove_tracker_button; GtkWidget * tracker_view; GtkWidget * scrape_check; GtkWidget * all_check; GtkWidget * file_list; GtkWidget * file_label; GSList * ids; TrCore * core; guint periodic_refresh_tag; GString * gstr; }; static tr_torrent** getTorrents (struct DetailsImpl * d, int * setmeCount) { GSList * l; int torrentCount = 0; const int n = g_slist_length (d->ids); tr_torrent ** torrents = g_new (tr_torrent*, n); for (l=d->ids; l!=NULL; l=l->next) if ((torrents[torrentCount] = gtr_core_find_torrent (d->core, GPOINTER_TO_INT (l->data)))) ++torrentCount; *setmeCount = torrentCount; return torrents; } /**** ***** ***** OPTIONS TAB ***** ****/ static void set_togglebutton_if_different (GtkWidget * w, gulong tag, gboolean value) { GtkToggleButton * toggle = GTK_TOGGLE_BUTTON (w); const gboolean currentValue = gtk_toggle_button_get_active (toggle); if (currentValue != value) { g_signal_handler_block (toggle, tag); gtk_toggle_button_set_active (toggle, value); g_signal_handler_unblock (toggle, tag); } } static void set_int_spin_if_different (GtkWidget * w, gulong tag, int value) { GtkSpinButton * spin = GTK_SPIN_BUTTON (w); const int currentValue = gtk_spin_button_get_value_as_int (spin); if (currentValue != value) { g_signal_handler_block (spin, tag); gtk_spin_button_set_value (spin, value); g_signal_handler_unblock (spin, tag); } } static void set_double_spin_if_different (GtkWidget * w, gulong tag, double value) { GtkSpinButton * spin = GTK_SPIN_BUTTON (w); const double currentValue = gtk_spin_button_get_value (spin); if (((int)(currentValue*100) != (int)(value*100))) { g_signal_handler_block (spin, tag); gtk_spin_button_set_value (spin, value); g_signal_handler_unblock (spin, tag); } } static void unset_combo (GtkWidget * w, gulong tag) { GtkComboBox * combobox = GTK_COMBO_BOX (w); g_signal_handler_block (combobox, tag); gtk_combo_box_set_active (combobox, -1); g_signal_handler_unblock (combobox, tag); } static void refreshOptions (struct DetailsImpl * di, tr_torrent ** torrents, int n) { /*** **** Options Page ***/ /* honor_limits_check */ if (n) { int i; const bool baseline = tr_torrentUsesSessionLimits (torrents[0]); for (i=1; ihonor_limits_check, di->honor_limits_check_tag, baseline); } /* down_limited_check */ if (n) { int i; const bool baseline = tr_torrentUsesSpeedLimit (torrents[0], TR_DOWN); for (i=1; idown_limited_check, di->down_limited_check_tag, baseline); } /* down_limit_spin */ if (n) { int i; const unsigned int baseline = tr_torrentGetSpeedLimit_KBps (torrents[0], TR_DOWN); for (i=1; idown_limit_spin, di->down_limit_spin_tag, baseline); } /* up_limited_check */ if (n) { int i; const bool baseline = tr_torrentUsesSpeedLimit (torrents[0], TR_UP); for (i=1; iup_limited_check, di->up_limited_check_tag, baseline); } /* up_limit_sping */ if (n) { int i; const unsigned int baseline = tr_torrentGetSpeedLimit_KBps (torrents[0], TR_UP); for (i=1; iup_limit_sping, di->up_limit_spin_tag, baseline); } /* bandwidth_combo */ if (n) { int i; const int baseline = tr_torrentGetPriority (torrents[0]); for (i=1; ibandwidth_combo; g_signal_handler_block (w, di->bandwidth_combo_tag); gtr_priority_combo_set_value (GTK_COMBO_BOX (w), baseline); g_signal_handler_unblock (w, di->bandwidth_combo_tag); } else { unset_combo (di->bandwidth_combo, di->bandwidth_combo_tag); } } /* ratio_combo */ if (n) { int i; const int baseline = tr_torrentGetRatioMode (torrents[0]); for (i=1; iratio_combo; g_signal_handler_block (w, di->ratio_combo_tag); gtr_combo_box_set_active_enum (GTK_COMBO_BOX (w), baseline); gtr_widget_set_visible (di->ratio_spin, baseline == TR_RATIOLIMIT_SINGLE); g_signal_handler_unblock (w, di->ratio_combo_tag); } } /* ratio_spin */ if (n) { const double baseline = tr_torrentGetRatioLimit (torrents[0]); set_double_spin_if_different (di->ratio_spin, di->ratio_spin_tag, baseline); } /* idle_combo */ if (n) { int i; const int baseline = tr_torrentGetIdleMode (torrents[0]); for (i=1; iidle_combo; g_signal_handler_block (w, di->idle_combo_tag); gtr_combo_box_set_active_enum (GTK_COMBO_BOX (w), baseline); gtr_widget_set_visible (di->idle_spin, baseline == TR_IDLELIMIT_SINGLE); g_signal_handler_unblock (w, di->idle_combo_tag); } } /* idle_spin */ if (n) { const int baseline = tr_torrentGetIdleLimit (torrents[0]); set_int_spin_if_different (di->idle_spin, di->idle_spin_tag, baseline); } /* max_peers_spin */ if (n) { const int baseline = tr_torrentGetPeerLimit (torrents[0]); set_int_spin_if_different (di->max_peers_spin, di->max_peers_spin_tag, baseline); } } static void torrent_set_bool (struct DetailsImpl * di, const tr_quark key, gboolean value) { GSList *l; tr_variant top, *args, *ids; tr_variantInitDict (&top, 2); tr_variantDictAddStr (&top, TR_KEY_method, "torrent-set"); args = tr_variantDictAddDict (&top, TR_KEY_arguments, 2); tr_variantDictAddBool (args, key, value); ids = tr_variantDictAddList (args, TR_KEY_ids, g_slist_length (di->ids)); for (l=di->ids; l; l=l->next) tr_variantListAddInt (ids, GPOINTER_TO_INT (l->data)); gtr_core_exec (di->core, &top); tr_variantFree (&top); } static void torrent_set_int (struct DetailsImpl * di, const tr_quark key, int value) { GSList *l; tr_variant top, *args, *ids; tr_variantInitDict (&top, 2); tr_variantDictAddStr (&top, TR_KEY_method, "torrent-set"); args = tr_variantDictAddDict (&top, TR_KEY_arguments, 2); tr_variantDictAddInt (args, key, value); ids = tr_variantDictAddList (args, TR_KEY_ids, g_slist_length (di->ids)); for (l=di->ids; l; l=l->next) tr_variantListAddInt (ids, GPOINTER_TO_INT (l->data)); gtr_core_exec (di->core, &top); tr_variantFree (&top); } static void torrent_set_real (struct DetailsImpl * di, const tr_quark key, double value) { GSList *l; tr_variant top, *args, *ids; tr_variantInitDict (&top, 2); tr_variantDictAddStr (&top, TR_KEY_method, "torrent-set"); args = tr_variantDictAddDict (&top, TR_KEY_arguments, 2); tr_variantDictAddReal (args, key, value); ids = tr_variantDictAddList (args, TR_KEY_ids, g_slist_length (di->ids)); for (l=di->ids; l; l=l->next) tr_variantListAddInt (ids, GPOINTER_TO_INT (l->data)); gtr_core_exec (di->core, &top); tr_variantFree (&top); } static void up_speed_toggled_cb (GtkToggleButton * tb, gpointer d) { torrent_set_bool (d, TR_KEY_uploadLimited, gtk_toggle_button_get_active (tb)); } static void down_speed_toggled_cb (GtkToggleButton *tb, gpointer d) { torrent_set_bool (d, TR_KEY_downloadLimited, gtk_toggle_button_get_active (tb)); } static void global_speed_toggled_cb (GtkToggleButton * tb, gpointer d) { torrent_set_bool (d, TR_KEY_honorsSessionLimits, gtk_toggle_button_get_active (tb)); } static void up_speed_spun_cb (GtkSpinButton * s, struct DetailsImpl * di) { torrent_set_int (di, TR_KEY_uploadLimit, gtk_spin_button_get_value_as_int (s)); } static void down_speed_spun_cb (GtkSpinButton * s, struct DetailsImpl * di) { torrent_set_int (di, TR_KEY_downloadLimit, gtk_spin_button_get_value_as_int (s)); } static void idle_spun_cb (GtkSpinButton * s, struct DetailsImpl * di) { torrent_set_int (di, TR_KEY_seedIdleLimit, gtk_spin_button_get_value_as_int (s)); } static void ratio_spun_cb (GtkSpinButton * s, struct DetailsImpl * di) { torrent_set_real (di, TR_KEY_seedRatioLimit, gtk_spin_button_get_value (s)); } static void max_peers_spun_cb (GtkSpinButton * s, struct DetailsImpl * di) { torrent_set_int (di, TR_KEY_peer_limit, gtk_spin_button_get_value (s)); } static void onPriorityChanged (GtkComboBox * combo_box, struct DetailsImpl * di) { const tr_priority_t priority = gtr_priority_combo_get_value (combo_box); torrent_set_int (di, TR_KEY_bandwidthPriority, priority); } static GtkWidget* new_priority_combo (struct DetailsImpl * di) { GtkWidget * w = gtr_priority_combo_new (); di->bandwidth_combo_tag = g_signal_connect (w, "changed", G_CALLBACK (onPriorityChanged), di); return w; } static void refresh (struct DetailsImpl * di); static void onComboEnumChanged (GtkComboBox * combo_box, struct DetailsImpl * di) { const tr_quark key = GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (combo_box), ARG_KEY)); torrent_set_int (di, key, gtr_combo_box_get_active_enum (combo_box)); refresh (di); } static GtkWidget* ratio_combo_new (void) { GtkWidget * w = gtr_combo_box_new_enum ( _("Use global settings"), TR_RATIOLIMIT_GLOBAL, _("Seed regardless of ratio"), TR_RATIOLIMIT_UNLIMITED, _("Stop seeding at ratio:"), TR_RATIOLIMIT_SINGLE, NULL); g_object_set_qdata (G_OBJECT (w), ARG_KEY, GINT_TO_POINTER(TR_KEY_seedRatioMode)); return w; } static GtkWidget* idle_combo_new (void) { GtkWidget * w = gtr_combo_box_new_enum ( _("Use global settings"), TR_IDLELIMIT_GLOBAL, _("Seed regardless of activity"), TR_IDLELIMIT_UNLIMITED, _("Stop seeding if idle for N minutes:"), TR_IDLELIMIT_SINGLE, NULL); g_object_set_qdata (G_OBJECT (w), ARG_KEY, GINT_TO_POINTER(TR_KEY_seedIdleMode)); return w; } static GtkWidget* options_page_new (struct DetailsImpl * d) { guint row; gulong tag; char buf[128]; GtkWidget *t, *w, *tb, *h; row = 0; t = hig_workarea_create (); hig_workarea_add_section_title (t, &row, _("Speed")); tb = hig_workarea_add_wide_checkbutton (t, &row, _("Honor global _limits"), 0); d->honor_limits_check = tb; tag = g_signal_connect (tb, "toggled", G_CALLBACK (global_speed_toggled_cb), d); d->honor_limits_check_tag = tag; g_snprintf (buf, sizeof (buf), _("Limit _download speed (%s):"), _ (speed_K_str)); tb = gtk_check_button_new_with_mnemonic (buf); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tb), FALSE); d->down_limited_check = tb; tag = g_signal_connect (tb, "toggled", G_CALLBACK (down_speed_toggled_cb), d); d->down_limited_check_tag = tag; w = gtk_spin_button_new_with_range (0, INT_MAX, 5); tag = g_signal_connect (w, "value-changed", G_CALLBACK (down_speed_spun_cb), d); d->down_limit_spin_tag = tag; hig_workarea_add_row_w (t, &row, tb, w, NULL); d->down_limit_spin = w; g_snprintf (buf, sizeof (buf), _("Limit _upload speed (%s):"), _ (speed_K_str)); tb = gtk_check_button_new_with_mnemonic (buf); d->up_limited_check = tb; tag = g_signal_connect (tb, "toggled", G_CALLBACK (up_speed_toggled_cb), d); d->up_limited_check_tag = tag; w = gtk_spin_button_new_with_range (0, INT_MAX, 5); tag = g_signal_connect (w, "value-changed", G_CALLBACK (up_speed_spun_cb), d); d->up_limit_spin_tag = tag; hig_workarea_add_row_w (t, &row, tb, w, NULL); d->up_limit_sping = w; w = new_priority_combo (d); hig_workarea_add_row (t, &row, _("Torrent _priority:"), w, NULL); d->bandwidth_combo = w; hig_workarea_add_section_divider (t, &row); hig_workarea_add_section_title (t, &row, _("Seeding Limits")); h = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, GUI_PAD); w = d->ratio_combo = ratio_combo_new (); d->ratio_combo_tag = g_signal_connect (w, "changed", G_CALLBACK (onComboEnumChanged), d); gtk_box_pack_start (GTK_BOX (h), w, TRUE, TRUE, 0); w = d->ratio_spin = gtk_spin_button_new_with_range (0, 1000, .05); gtk_entry_set_width_chars (GTK_ENTRY (w), 7); d->ratio_spin_tag = g_signal_connect (w, "value-changed", G_CALLBACK (ratio_spun_cb), d); gtk_box_pack_start (GTK_BOX (h), w, FALSE, FALSE, 0); hig_workarea_add_row (t, &row, _("_Ratio:"), h, NULL); h = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, GUI_PAD); w = d->idle_combo = idle_combo_new (); d->idle_combo_tag = g_signal_connect (w, "changed", G_CALLBACK (onComboEnumChanged), d); gtk_box_pack_start (GTK_BOX (h), w, TRUE, TRUE, 0); w = d->idle_spin = gtk_spin_button_new_with_range (1, INT_MAX, 5); d->idle_spin_tag = g_signal_connect (w, "value-changed", G_CALLBACK (idle_spun_cb), d); gtk_box_pack_start (GTK_BOX (h), w, FALSE, FALSE, 0); hig_workarea_add_row (t, &row, _("_Idle:"), h, NULL); hig_workarea_add_section_divider (t, &row); hig_workarea_add_section_title (t, &row, _("Peer Connections")); w = gtk_spin_button_new_with_range (1, 3000, 5); hig_workarea_add_row (t, &row, _("_Maximum peers:"), w, w); tag = g_signal_connect (w, "value-changed", G_CALLBACK (max_peers_spun_cb), d); d->max_peers_spin = w; d->max_peers_spin_tag = tag; return t; } /**** ***** ***** INFO TAB ***** ****/ static const char * activityString (int activity, bool finished) { switch (activity) { case TR_STATUS_CHECK_WAIT: return _("Queued for verification"); case TR_STATUS_CHECK: return _("Verifying local data"); case TR_STATUS_DOWNLOAD_WAIT: return _("Queued for download"); case TR_STATUS_DOWNLOAD: return C_("Verb", "Downloading"); case TR_STATUS_SEED_WAIT: return _("Queued for seeding"); case TR_STATUS_SEED: return C_("Verb", "Seeding"); case TR_STATUS_STOPPED: return finished ? _("Finished") : _("Paused"); } return ""; } /* Only call gtk_text_buffer_set_text () if the new text differs from the old. * This way if the user has text selected, refreshing won't deselect it */ static void gtr_text_buffer_set_text (GtkTextBuffer * b, const char * str) { char * old_str; GtkTextIter start, end; if (str == NULL) str = ""; gtk_text_buffer_get_bounds (b, &start, &end); old_str = gtk_text_buffer_get_text (b, &start, &end, FALSE); if ((old_str == NULL) || g_strcmp0 (old_str, str)) gtk_text_buffer_set_text (b, str, -1); g_free (old_str); } static char* get_short_date_string (time_t t) { char buf[64]; struct tm tm; if (!t) return g_strdup (_("N/A")); tr_localtime_r (&t, &tm); strftime (buf, sizeof (buf), "%d %b %Y", &tm); return g_locale_to_utf8 (buf, -1, NULL, NULL, NULL); }; static void refreshInfo (struct DetailsImpl * di, tr_torrent ** torrents, int n) { int i; const char * str; const char * mixed = _("Mixed"); const char * no_torrent = _("No Torrents Selected"); const char * stateString; char buf[512]; uint64_t sizeWhenDone = 0; const tr_stat ** stats = g_new (const tr_stat*, n); const tr_info ** infos = g_new (const tr_info*, n); for (i=0; iisPrivate; for (i=1; iisPrivate) break; if (i!=n) str = mixed; else if (baseline) str = _("Private to this tracker -- DHT and PEX disabled"); else str = _("Public torrent"); } gtr_label_set_text (GTK_LABEL (di->privacy_lb), str); /* origin_lb */ if (n<=0) { str = no_torrent; } else { const char * creator = infos[0]->creator ? infos[0]->creator : ""; const time_t date = infos[0]->dateCreated; char * datestr = get_short_date_string (date); gboolean mixed_creator = FALSE; gboolean mixed_date = FALSE; for (i=1; icreator ? infos[i]->creator : ""); mixed_date |= (date != infos[i]->dateCreated); } const gboolean empty_creator = !*creator; const gboolean empty_date = date == 0; if (mixed_date || mixed_creator) { str = mixed; } else if (empty_date && empty_creator) { str = _("N/A"); } else { if (empty_date && !empty_creator) g_snprintf (buf, sizeof (buf), _("Created by %1$s"), creator); else if (empty_creator && !empty_date) g_snprintf (buf, sizeof (buf), _("Created on %1$s"), datestr); else g_snprintf (buf, sizeof (buf), _("Created by %1$s on %2$s"), creator, datestr); str = buf; } g_free (datestr); } gtr_label_set_text (GTK_LABEL (di->origin_lb), str); /* comment_buffer */ if (n<=0) { str = ""; } else { const char * baseline = infos[0]->comment ? infos[0]->comment : ""; for (i=1; icomment ? infos[i]->comment : "")) break; if (i==n) str = baseline; else str = mixed; } gtr_text_buffer_set_text (di->comment_buffer, str); /* destination_lb */ if (n<=0) { str = no_torrent; } else { const char * baseline = tr_torrentGetDownloadDir (torrents[0]); for (i=1; idestination_lb), str); /* state_lb */ if (n<=0) { str = no_torrent; } else { const tr_torrent_activity activity = stats[0]->activity; bool allFinished = stats[0]->finished; for (i=1; iactivity) break; if (!stats[i]->finished) allFinished = FALSE; } str = istate_lb), str); /* date started */ if (n<=0) { str = no_torrent; } else { const time_t baseline = stats[0]->startDate; for (i=1; istartDate) break; if (i != n) str = mixed; else if ((baseline<=0) || (stats[0]->activity == TR_STATUS_STOPPED)) str = stateString; else str = tr_strltime (buf, time (NULL)-baseline, sizeof (buf)); } gtr_label_set_text (GTK_LABEL (di->date_started_lb), str); /* eta */ if (n<=0) { str = no_torrent; } else { const int baseline = stats[0]->eta; for (i=1; ieta) break; if (i!=n) str = mixed; else if (baseline < 0) str = _("Unknown"); else str = tr_strltime (buf, baseline, sizeof (buf)); } gtr_label_set_text (GTK_LABEL (di->eta_lb), str); /* size_lb */ { char sizebuf[128]; uint64_t size = 0; int pieces = 0; int32_t pieceSize = 0; for (i=0; itotalSize; pieces += infos[i]->pieceCount; if (!pieceSize) pieceSize = infos[i]->pieceSize; else if (pieceSize != (int)infos[i]->pieceSize) pieceSize = -1; } tr_strlsize (sizebuf, size, sizeof (sizebuf)); if (!size) str = ""; else if (pieceSize >= 0) { char piecebuf[128]; tr_formatter_mem_B (piecebuf, pieceSize, sizeof (piecebuf)); g_snprintf (buf, sizeof (buf), ngettext ("%1$s (%2$'d piece @ %3$s)", "%1$s (%2$'d pieces @ %3$s)", pieces), sizebuf, pieces, piecebuf); str = buf; } else { g_snprintf (buf, sizeof (buf), ngettext ("%1$s (%2$'d piece)", "%1$s (%2$'d pieces)", pieces), sizebuf, pieces); str = buf; } gtr_label_set_text (GTK_LABEL (di->size_lb), str); } /* have_lb */ if (n <= 0) { str = no_torrent; } else { uint64_t leftUntilDone = 0; uint64_t haveUnchecked = 0; uint64_t haveValid = 0; uint64_t available = 0; for (i=0; ihaveUnchecked; haveValid += st->haveValid; sizeWhenDone += st->sizeWhenDone; leftUntilDone += st->leftUntilDone; available += st->sizeWhenDone - st->leftUntilDone + st->desiredAvailable; } { char buf2[32], unver[64], total[64], avail[32]; const double d = sizeWhenDone ? (100.0 * available) / sizeWhenDone : 0; const double ratio = 100.0 * (sizeWhenDone ? (haveValid + haveUnchecked) / (double)sizeWhenDone : 1); tr_strlpercent (avail, d, sizeof (avail)); tr_strlpercent (buf2, ratio, sizeof (buf2)); tr_strlsize (total, haveUnchecked + haveValid, sizeof (total)); tr_strlsize (unver, haveUnchecked, sizeof (unver)); if (!haveUnchecked && !leftUntilDone) g_snprintf (buf, sizeof (buf), _("%1$s (%2$s%%)"), total, buf2); else if (!haveUnchecked) g_snprintf (buf, sizeof (buf), _("%1$s (%2$s%% of %3$s%% Available)"), total, buf2, avail); else g_snprintf (buf, sizeof (buf), _("%1$s (%2$s%% of %3$s%% Available); %4$s Unverified"), total, buf2, avail, unver); str = buf; } } gtr_label_set_text (GTK_LABEL (di->have_lb), str); /* dl_lb */ if (n <= 0) { str = no_torrent; } else { char dbuf[64], fbuf[64]; uint64_t d=0, f=0; for (i=0; idownloadedEver; f += stats[i]->corruptEver; } tr_strlsize (dbuf, d, sizeof (dbuf)); tr_strlsize (fbuf, f, sizeof (fbuf)); if (f) g_snprintf (buf, sizeof (buf), _("%1$s (+%2$s corrupt)"), dbuf, fbuf); else tr_strlcpy (buf, dbuf, sizeof (buf)); str = buf; } gtr_label_set_text (GTK_LABEL (di->dl_lb), str); /* ul_lb */ if (n <= 0) { str = no_torrent; } else { char upstr[64]; char ratiostr[64]; uint64_t up = 0; uint64_t down = 0; for (i=0; iuploadedEver; down += stats[i]->downloadedEver; } tr_strlsize (upstr, up, sizeof (upstr)); tr_strlratio (ratiostr, tr_getRatio (up, down), sizeof (ratiostr)); g_snprintf (buf, sizeof (buf), _("%s (Ratio: %s)"), upstr, ratiostr); str = buf; } gtr_label_set_text (GTK_LABEL (di->ul_lb), str); /* hash_lb */ if (n <= 0) str = no_torrent; else if (n==1) str = infos[0]->hashString; else str = mixed; gtr_label_set_text (GTK_LABEL (di->hash_lb), str); /* error */ if (n <= 0) { str = no_torrent; } else { const char * baseline = stats[0]->errorString; for (i=1; ierrorString)) break; if (i==n) str = baseline; else str = mixed; } if (!str || !*str) str = _("No errors"); gtr_label_set_text (GTK_LABEL (di->error_lb), str); /* activity date */ if (n <= 0) { str = no_torrent; } else { time_t latest = 0; for (i=0; iactivityDate) latest = stats[i]->activityDate; if (latest <= 0) { str = _("Never"); } else { const int period = time (NULL) - latest; if (period < 5) { tr_strlcpy (buf, _("Active now"), sizeof (buf)); } else { char tbuf[128]; tr_strltime (tbuf, period, sizeof (tbuf)); g_snprintf (buf, sizeof (buf), _("%1$s ago"), tbuf); } str = buf; } } gtr_label_set_text (GTK_LABEL (di->last_activity_lb), str); g_free (stats); g_free (infos); } static GtkWidget* info_page_new (struct DetailsImpl * di) { guint row = 0; GtkTextBuffer * b; GtkWidget *l, *w, *fr, *sw; GtkWidget *t = hig_workarea_create (); hig_workarea_add_section_title (t, &row, _("Activity")); /* size */ l = di->size_lb = gtk_label_new (NULL); gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); hig_workarea_add_row (t, &row, _("Torrent size:"), l, NULL); /* have */ l = di->have_lb = gtk_label_new (NULL); gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); hig_workarea_add_row (t, &row, _("Have:"), l, NULL); /* uploaded */ l = di->ul_lb = gtk_label_new (NULL); gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); hig_workarea_add_row (t, &row, _("Uploaded:"), l, NULL); /* downloaded */ l = di->dl_lb = gtk_label_new (NULL); gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); hig_workarea_add_row (t, &row, _("Downloaded:"), l, NULL); /* state */ l = di->state_lb = gtk_label_new (NULL); gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); hig_workarea_add_row (t, &row, _("State:"), l, NULL); /* running for */ l = di->date_started_lb = gtk_label_new (NULL); gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); hig_workarea_add_row (t, &row, _("Running time:"), l, NULL); /* eta */ l = di->eta_lb = gtk_label_new (NULL); gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); hig_workarea_add_row (t, &row, _("Remaining time:"), l, NULL); /* last activity */ l = di->last_activity_lb = gtk_label_new (NULL); gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); hig_workarea_add_row (t, &row, _("Last activity:"), l, NULL); /* error */ l = g_object_new (GTK_TYPE_LABEL, "selectable", TRUE, "ellipsize", PANGO_ELLIPSIZE_END, NULL); hig_workarea_add_row (t, &row, _("Error:"), l, NULL); di->error_lb = l; hig_workarea_add_section_divider (t, &row); hig_workarea_add_section_title (t, &row, _("Details")); /* destination */ l = g_object_new (GTK_TYPE_LABEL, "selectable", TRUE, "ellipsize", PANGO_ELLIPSIZE_END, NULL); hig_workarea_add_row (t, &row, _("Location:"), l, NULL); di->destination_lb = l; /* hash */ l = g_object_new (GTK_TYPE_LABEL, "selectable", TRUE, "ellipsize", PANGO_ELLIPSIZE_END, NULL); hig_workarea_add_row (t, &row, _("Hash:"), l, NULL); di->hash_lb = l; /* privacy */ l = gtk_label_new (NULL); gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); hig_workarea_add_row (t, &row, _("Privacy:"), l, NULL); di->privacy_lb = l; /* origins */ l = g_object_new (GTK_TYPE_LABEL, "selectable", TRUE, "ellipsize", PANGO_ELLIPSIZE_END, NULL); hig_workarea_add_row (t, &row, _("Origin:"), l, NULL); di->origin_lb = l; /* comment */ b = di->comment_buffer = gtk_text_buffer_new (NULL); w = gtk_text_view_new_with_buffer (b); gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (w), GTK_WRAP_WORD); gtk_text_view_set_editable (GTK_TEXT_VIEW (w), FALSE); sw = gtk_scrolled_window_new (NULL, NULL); gtk_widget_set_size_request (sw, 350, 36); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (sw), w); fr = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (fr), GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER (fr), sw); w = hig_workarea_add_tall_row (t, &row, _("Comment:"), fr, NULL); gtk_misc_set_alignment (GTK_MISC (w), 0.0f, 0.0f); hig_workarea_add_section_divider (t, &row); return t; } /**** ***** ***** PEERS TAB ***** ****/ enum { WEBSEED_COL_KEY, WEBSEED_COL_WAS_UPDATED, WEBSEED_COL_URL, WEBSEED_COL_DOWNLOAD_RATE_DOUBLE, WEBSEED_COL_DOWNLOAD_RATE_STRING, N_WEBSEED_COLS }; static const char* getWebseedColumnNames (int column) { switch (column) { case WEBSEED_COL_URL: return _("Web Seeds"); case WEBSEED_COL_DOWNLOAD_RATE_DOUBLE: case WEBSEED_COL_DOWNLOAD_RATE_STRING: return _("Down"); default: return ""; } } static GtkListStore* webseed_model_new (void) { return gtk_list_store_new (N_WEBSEED_COLS, G_TYPE_STRING, /* key */ G_TYPE_BOOLEAN, /* was-updated */ G_TYPE_STRING, /* url */ G_TYPE_DOUBLE, /* download rate double */ G_TYPE_STRING); /* download rate string */ } enum { PEER_COL_KEY, PEER_COL_WAS_UPDATED, PEER_COL_ADDRESS, PEER_COL_ADDRESS_COLLATED, PEER_COL_DOWNLOAD_RATE_DOUBLE, PEER_COL_DOWNLOAD_RATE_STRING, PEER_COL_UPLOAD_RATE_DOUBLE, PEER_COL_UPLOAD_RATE_STRING, PEER_COL_CLIENT, PEER_COL_PROGRESS, PEER_COL_UPLOAD_REQUEST_COUNT_INT, PEER_COL_UPLOAD_REQUEST_COUNT_STRING, PEER_COL_DOWNLOAD_REQUEST_COUNT_INT, PEER_COL_DOWNLOAD_REQUEST_COUNT_STRING, PEER_COL_BLOCKS_DOWNLOADED_COUNT_INT, PEER_COL_BLOCKS_DOWNLOADED_COUNT_STRING, PEER_COL_BLOCKS_UPLOADED_COUNT_INT, PEER_COL_BLOCKS_UPLOADED_COUNT_STRING, PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_INT, PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_STRING, PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_INT, PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_STRING, PEER_COL_ENCRYPTION_STOCK_ID, PEER_COL_FLAGS, PEER_COL_TORRENT_NAME, N_PEER_COLS }; static const char* getPeerColumnName (int column) { switch (column) { case PEER_COL_ADDRESS: return _("Address"); case PEER_COL_DOWNLOAD_RATE_STRING: case PEER_COL_DOWNLOAD_RATE_DOUBLE: return _("Down"); case PEER_COL_UPLOAD_RATE_STRING: case PEER_COL_UPLOAD_RATE_DOUBLE: return _("Up"); case PEER_COL_CLIENT: return _("Client"); case PEER_COL_PROGRESS: return _("%"); case PEER_COL_UPLOAD_REQUEST_COUNT_INT: case PEER_COL_UPLOAD_REQUEST_COUNT_STRING: return _("Up Reqs"); case PEER_COL_DOWNLOAD_REQUEST_COUNT_INT: case PEER_COL_DOWNLOAD_REQUEST_COUNT_STRING: return _("Dn Reqs"); case PEER_COL_BLOCKS_DOWNLOADED_COUNT_INT: case PEER_COL_BLOCKS_DOWNLOADED_COUNT_STRING: return _("Dn Blocks"); case PEER_COL_BLOCKS_UPLOADED_COUNT_INT: case PEER_COL_BLOCKS_UPLOADED_COUNT_STRING: return _("Up Blocks"); case PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_INT: case PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_STRING: return _("We Cancelled"); case PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_INT: case PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_STRING: return _("They Cancelled"); case PEER_COL_FLAGS: return _("Flags"); default: return ""; } } static GtkListStore* peer_store_new (void) { return gtk_list_store_new (N_PEER_COLS, G_TYPE_STRING, /* key */ G_TYPE_BOOLEAN, /* was-updated */ G_TYPE_STRING, /* address */ G_TYPE_STRING, /* collated address */ G_TYPE_DOUBLE, /* download speed int */ G_TYPE_STRING, /* download speed string */ G_TYPE_DOUBLE, /* upload speed int */ G_TYPE_STRING, /* upload speed string */ G_TYPE_STRING, /* client */ G_TYPE_INT, /* progress [0..100] */ G_TYPE_INT, /* upload request count int */ G_TYPE_STRING, /* upload request count string */ G_TYPE_INT, /* download request count int */ G_TYPE_STRING, /* download request count string */ G_TYPE_INT, /* # blocks downloaded int */ G_TYPE_STRING, /* # blocks downloaded string */ G_TYPE_INT, /* # blocks uploaded int */ G_TYPE_STRING, /* # blocks uploaded string */ G_TYPE_INT, /* # blocks cancelled by client int */ G_TYPE_STRING, /* # blocks cancelled by client string */ G_TYPE_INT, /* # blocks cancelled by peer int */ G_TYPE_STRING, /* # blocks cancelled by peer string */ G_TYPE_STRING, /* encryption stock id */ G_TYPE_STRING, /* flagString */ G_TYPE_STRING); /* torrent name */ } static void initPeerRow (GtkListStore * store, GtkTreeIter * iter, const char * key, const char * torrentName, const tr_peer_stat * peer) { int q[4]; char collated_name[128]; const char * client = peer->client; if (!client || !g_strcmp0 (client, "Unknown Client")) client = ""; if (sscanf (peer->addr, "%d.%d.%d.%d", q, q+1, q+2, q+3) != 4) g_strlcpy (collated_name, peer->addr, sizeof (collated_name)); else g_snprintf (collated_name, sizeof (collated_name), "%03d.%03d.%03d.%03d", q[0], q[1], q[2], q[3]); gtk_list_store_set (store, iter, PEER_COL_ADDRESS, peer->addr, PEER_COL_ADDRESS_COLLATED, collated_name, PEER_COL_CLIENT, client, PEER_COL_ENCRYPTION_STOCK_ID, peer->isEncrypted ? "transmission-lock" : NULL, PEER_COL_KEY, key, PEER_COL_TORRENT_NAME, torrentName, -1); } static void refreshPeerRow (GtkListStore * store, GtkTreeIter * iter, const tr_peer_stat * peer) { char up_speed[64] = { '\0' }; char down_speed[64] = { '\0' }; char up_count[64] = { '\0' }; char down_count[64] = { '\0' }; char blocks_to_peer[64] = { '\0' }; char blocks_to_client[64] = { '\0' }; char cancelled_by_peer[64] = { '\0' }; char cancelled_by_client[64] = { '\0' }; if (peer->rateToPeer_KBps > 0.01) tr_formatter_speed_KBps (up_speed, peer->rateToPeer_KBps, sizeof (up_speed)); if (peer->rateToClient_KBps > 0) tr_formatter_speed_KBps (down_speed, peer->rateToClient_KBps, sizeof (down_speed)); if (peer->pendingReqsToPeer > 0) g_snprintf (down_count, sizeof (down_count), "%d", peer->pendingReqsToPeer); if (peer->pendingReqsToClient > 0) g_snprintf (up_count, sizeof (down_count), "%d", peer->pendingReqsToClient); if (peer->blocksToPeer > 0) g_snprintf (blocks_to_peer, sizeof (blocks_to_peer), "%"PRIu32, peer->blocksToPeer); if (peer->blocksToClient > 0) g_snprintf (blocks_to_client, sizeof (blocks_to_client), "%"PRIu32, peer->blocksToClient); if (peer->cancelsToPeer > 0) g_snprintf (cancelled_by_client, sizeof (cancelled_by_client), "%"PRIu32, peer->cancelsToPeer); if (peer->cancelsToClient > 0) g_snprintf (cancelled_by_peer, sizeof (cancelled_by_peer), "%"PRIu32, peer->cancelsToClient); gtk_list_store_set (store, iter, PEER_COL_PROGRESS, (int)(100.0 * peer->progress), PEER_COL_UPLOAD_REQUEST_COUNT_INT, peer->pendingReqsToClient, PEER_COL_UPLOAD_REQUEST_COUNT_STRING, up_count, PEER_COL_DOWNLOAD_REQUEST_COUNT_INT, peer->pendingReqsToPeer, PEER_COL_DOWNLOAD_REQUEST_COUNT_STRING, down_count, PEER_COL_DOWNLOAD_RATE_DOUBLE, peer->rateToClient_KBps, PEER_COL_DOWNLOAD_RATE_STRING, down_speed, PEER_COL_UPLOAD_RATE_DOUBLE, peer->rateToPeer_KBps, PEER_COL_UPLOAD_RATE_STRING, up_speed, PEER_COL_FLAGS, peer->flagStr, PEER_COL_WAS_UPDATED, TRUE, PEER_COL_BLOCKS_DOWNLOADED_COUNT_INT, (int)peer->blocksToClient, PEER_COL_BLOCKS_DOWNLOADED_COUNT_STRING, blocks_to_client, PEER_COL_BLOCKS_UPLOADED_COUNT_INT, (int)peer->blocksToPeer, PEER_COL_BLOCKS_UPLOADED_COUNT_STRING, blocks_to_peer, PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_INT, (int)peer->cancelsToPeer, PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_STRING, cancelled_by_client, PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_INT, (int)peer->cancelsToClient, PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_STRING, cancelled_by_peer, -1); } static void refreshPeerList (struct DetailsImpl * di, tr_torrent ** torrents, int n) { int i; int * peerCount; GtkTreeIter iter; GtkTreeModel * model; GHashTable * hash = di->peer_hash; GtkListStore * store = di->peer_store; struct tr_peer_stat ** peers; /* step 1: get all the peers */ peers = g_new (struct tr_peer_stat*, n); peerCount = g_new (int, n); for (i=0; iaddr); if (g_hash_table_lookup (hash, key) == NULL) { GtkTreePath * p; gtk_list_store_append (store, &iter); initPeerRow (store, &iter, key, tr_torrentName (tor), s); p = gtk_tree_model_get_path (model, &iter); g_hash_table_insert (hash, g_strdup (key), gtk_tree_row_reference_new (model, p)); gtk_tree_path_free (p); } } } /* step 4: update the peers */ for (i=0; iaddr); ref = g_hash_table_lookup (hash, key); p = gtk_tree_row_reference_get_path (ref); gtk_tree_model_get_iter (model, &iter, p); refreshPeerRow (store, &iter, s); gtk_tree_path_free (p); } } /* step 5: remove peers that have disappeared */ model = GTK_TREE_MODEL (store); if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) { gboolean more = TRUE; while (more) { gboolean b; gtk_tree_model_get (model, &iter, PEER_COL_WAS_UPDATED, &b, -1); if (b) { more = gtk_tree_model_iter_next (model, &iter); } else { char * key; gtk_tree_model_get (model, &iter, PEER_COL_KEY, &key, -1); g_hash_table_remove (hash, key); more = gtk_list_store_remove (store, &iter); g_free (key); } } } /* step 6: cleanup */ for (i=0; iwebseed_hash; GtkListStore * store = di->webseed_store; GtkTreeModel * model = GTK_TREE_MODEL (store); /* step 1: mark all webseeds as not-updated */ if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) do gtk_list_store_set (store, &iter, WEBSEED_COL_WAS_UPDATED, FALSE, -1); while (gtk_tree_model_iter_next (model, &iter)); /* step 2: add any new webseeds */ for (i=0; iwebseedCount; for (j=0; jwebseedCount; ++j) { char key[256]; const char * url = inf->webseeds[j]; g_snprintf (key, sizeof (key), "%d.%s", tr_torrentId (tor), url); if (g_hash_table_lookup (hash, key) == NULL) { GtkTreePath * p; gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, WEBSEED_COL_URL, url, WEBSEED_COL_KEY, key, -1); p = gtk_tree_model_get_path (model, &iter); g_hash_table_insert (hash, g_strdup (key), gtk_tree_row_reference_new (model, p)); gtk_tree_path_free (p); } } } /* step 3: update the webseeds */ for (i=0; iwebseedCount; ++j) { char buf[128]; char key[256]; GtkTreePath * p; GtkTreeRowReference * ref; const char * url = inf->webseeds[j]; g_snprintf (key, sizeof (key), "%d.%s", tr_torrentId (tor), url); ref = g_hash_table_lookup (hash, key); p = gtk_tree_row_reference_get_path (ref); gtk_tree_model_get_iter (model, &iter, p); if (speeds_KBps[j] > 0) tr_formatter_speed_KBps (buf, speeds_KBps[j], sizeof (buf)); else *buf = '\0'; gtk_list_store_set (store, &iter, WEBSEED_COL_DOWNLOAD_RATE_DOUBLE, speeds_KBps[j], WEBSEED_COL_DOWNLOAD_RATE_STRING, buf, WEBSEED_COL_WAS_UPDATED, TRUE, -1); gtk_tree_path_free (p); } tr_free (speeds_KBps); } /* step 4: remove webseeds that have disappeared */ if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) { gboolean more = TRUE; while (more) { gboolean b; gtk_tree_model_get (model, &iter, WEBSEED_COL_WAS_UPDATED, &b, -1); if (b) { more = gtk_tree_model_iter_next (model, &iter); } else { char * key; gtk_tree_model_get (model, &iter, WEBSEED_COL_KEY, &key, -1); if (key != NULL) g_hash_table_remove (hash, key); more = gtk_list_store_remove (store, &iter); g_free (key); } } } /* most of the time there are no webseeds... don't waste space showing an empty list */ gtk_widget_set_visible (di->webseed_view, total > 0); } static void refreshPeers (struct DetailsImpl * di, tr_torrent ** torrents, int n) { refreshPeerList (di, torrents, n); refreshWebseedList (di, torrents, n); } static gboolean onPeerViewQueryTooltip (GtkWidget * widget, gint x, gint y, gboolean keyboard_tip, GtkTooltip * tooltip, gpointer gdi) { GtkTreeIter iter; GtkTreeModel * model; gboolean show_tip = FALSE; if (gtk_tree_view_get_tooltip_context (GTK_TREE_VIEW (widget), &x, &y, keyboard_tip, &model, NULL, &iter)) { const char * pch; char * name = NULL; char * addr = NULL; char * markup = NULL; char * flagstr = NULL; struct DetailsImpl * di = gdi; GString * gstr = di->gstr; gtk_tree_model_get (model, &iter, PEER_COL_TORRENT_NAME, &name, PEER_COL_ADDRESS, &addr, PEER_COL_FLAGS, &flagstr, -1); g_string_truncate (gstr, 0); markup = g_markup_escape_text (name, -1); g_string_append_printf (gstr, "%s\n%s\n \n", markup, addr); g_free (markup); for (pch=flagstr; pch && *pch; ++pch) { const char * s = NULL; switch (*pch) { case 'O': s = _("Optimistic unchoke"); break; case 'D': s = _("Downloading from this peer"); break; case 'd': s = _("We would download from this peer if they would let us"); break; case 'U': s = _("Uploading to peer"); break; case 'u': s = _("We would upload to this peer if they asked"); break; case 'K': s = _("Peer has unchoked us, but we're not interested"); break; case '?': s = _("We unchoked this peer, but they're not interested"); break; case 'E': s = _("Encrypted connection"); break; case 'X': s = _("Peer was found through Peer Exchange (PEX)"); break; case 'H': s = _("Peer was found through DHT"); break; case 'I': s = _("Peer is an incoming connection"); break; case 'T': s = _("Peer is connected over µTP"); break; } if (s) g_string_append_printf (gstr, "%c: %s\n", *pch, s); } if (gstr->len) /* remove the last linefeed */ g_string_set_size (gstr, gstr->len - 1); gtk_tooltip_set_markup (tooltip, gstr->str); g_free (flagstr); g_free (addr); g_free (name); show_tip = TRUE; } return show_tip; } static void setPeerViewColumns (GtkTreeView * peer_view) { int i; int n; int view_columns[32]; GtkCellRenderer * r; GtkTreeViewColumn * c; const bool more = gtr_pref_flag_get (TR_KEY_show_extra_peer_details); n = 0; view_columns[n++] = PEER_COL_ENCRYPTION_STOCK_ID; view_columns[n++] = PEER_COL_UPLOAD_RATE_STRING; if (more) view_columns[n++] = PEER_COL_UPLOAD_REQUEST_COUNT_STRING; view_columns[n++] = PEER_COL_DOWNLOAD_RATE_STRING; if (more) view_columns[n++] = PEER_COL_DOWNLOAD_REQUEST_COUNT_STRING; if (more) view_columns[n++] = PEER_COL_BLOCKS_DOWNLOADED_COUNT_STRING; if (more) view_columns[n++] = PEER_COL_BLOCKS_UPLOADED_COUNT_STRING; if (more) view_columns[n++] = PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_STRING; if (more) view_columns[n++] = PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_STRING; view_columns[n++] = PEER_COL_PROGRESS; view_columns[n++] = PEER_COL_FLAGS; view_columns[n++] = PEER_COL_ADDRESS; view_columns[n++] = PEER_COL_CLIENT; /* remove any existing columns */ while ((c = gtk_tree_view_get_column (peer_view, 0))) gtk_tree_view_remove_column (peer_view, c); for (i=0; icore, key, value); setPeerViewColumns (GTK_TREE_VIEW (di->peer_view)); } static GtkWidget* peer_page_new (struct DetailsImpl * di) { gboolean b; const char * str; GtkListStore *store; GtkWidget *v, *w, *ret, *sw, *vbox; GtkWidget *webtree = NULL; GtkTreeModel * m; GtkTreeViewColumn * c; GtkCellRenderer * r; /* webseeds */ store = di->webseed_store = webseed_model_new (); v = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); g_signal_connect (v, "button-release-event", G_CALLBACK (on_tree_view_button_released), NULL); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (v), TRUE); g_object_unref (store); str = getWebseedColumnNames (WEBSEED_COL_URL); r = gtk_cell_renderer_text_new (); g_object_set (G_OBJECT (r), "ellipsize", PANGO_ELLIPSIZE_END, NULL); c = gtk_tree_view_column_new_with_attributes (str, r, "text", WEBSEED_COL_URL, NULL); g_object_set (G_OBJECT (c), "expand", TRUE, NULL); gtk_tree_view_column_set_sort_column_id (c, WEBSEED_COL_URL); gtk_tree_view_append_column (GTK_TREE_VIEW (v), c); str = getWebseedColumnNames (WEBSEED_COL_DOWNLOAD_RATE_STRING); r = gtk_cell_renderer_text_new (); c = gtk_tree_view_column_new_with_attributes (str, r, "text", WEBSEED_COL_DOWNLOAD_RATE_STRING, NULL); gtk_tree_view_column_set_sort_column_id (c, WEBSEED_COL_DOWNLOAD_RATE_DOUBLE); gtk_tree_view_append_column (GTK_TREE_VIEW (v), c); w = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (w), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (w), GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER (w), v); webtree = w; di->webseed_view = w; /* peers */ store = di->peer_store = peer_store_new (); m = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store)); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (m), PEER_COL_PROGRESS, GTK_SORT_DESCENDING); v = GTK_WIDGET (g_object_new (GTK_TYPE_TREE_VIEW, "model", m, "rules-hint", TRUE, "has-tooltip", TRUE, NULL)); di->peer_view = v; g_signal_connect (v, "query-tooltip", G_CALLBACK (onPeerViewQueryTooltip), di); g_object_unref (store); g_signal_connect (v, "button-release-event", G_CALLBACK (on_tree_view_button_released), NULL); setPeerViewColumns (GTK_TREE_VIEW (v)); w = sw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (w), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (w), GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER (w), v); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, GUI_PAD); gtk_container_set_border_width (GTK_CONTAINER (vbox), GUI_PAD_BIG); v = gtk_paned_new (GTK_ORIENTATION_VERTICAL); gtk_paned_pack1 (GTK_PANED (v), webtree, FALSE, TRUE); gtk_paned_pack2 (GTK_PANED (v), sw, TRUE, TRUE); gtk_box_pack_start (GTK_BOX (vbox), v, TRUE, TRUE, 0); w = gtk_check_button_new_with_mnemonic (_("Show _more details")); di->more_peer_details_check = w; b = gtr_pref_flag_get (TR_KEY_show_extra_peer_details); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), b); g_signal_connect (w, "toggled", G_CALLBACK (onMorePeerInfoToggled), di); gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); /* ip-to-GtkTreeRowReference */ di->peer_hash = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)gtk_tree_row_reference_free); /* url-to-GtkTreeRowReference */ di->webseed_hash = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)gtk_tree_row_reference_free); ret = vbox; return ret; } /**** ***** ***** TRACKER ***** ****/ /* if it's been longer than a minute, don't bother showing the seconds */ static void tr_strltime_rounded (char * buf, time_t t, size_t buflen) { if (t > 60) t -= (t % 60); tr_strltime (buf, t, buflen); } static void buildTrackerSummary (GString * gstr, const char * key, const tr_tracker_stat * st, gboolean showScrape) { char * str; char timebuf[256]; const time_t now = time (NULL); const char * err_markup_begin = ""; const char * err_markup_end = ""; const char * timeout_markup_begin = ""; const char * timeout_markup_end = ""; const char * success_markup_begin = ""; const char * success_markup_end = ""; /* hostname */ { g_string_append (gstr, st->isBackup ? "" : ""); if (key) str = g_markup_printf_escaped ("%s - %s", st->host, key); else str = g_markup_printf_escaped ("%s", st->host); g_string_append (gstr, str); g_free (str); g_string_append (gstr, st->isBackup ? "" : ""); } if (!st->isBackup) { if (st->hasAnnounced && st->announceState != TR_TRACKER_INACTIVE) { g_string_append_c (gstr, '\n'); tr_strltime_rounded (timebuf, now - st->lastAnnounceTime, sizeof (timebuf)); if (st->lastAnnounceSucceeded) g_string_append_printf (gstr, _("Got a list of %1$s%2$'d peers%3$s %4$s ago"), success_markup_begin, st->lastAnnouncePeerCount, success_markup_end, timebuf); else if (st->lastAnnounceTimedOut) g_string_append_printf (gstr, _("Peer list request %1$stimed out%2$s %3$s ago; will retry"), timeout_markup_begin, timeout_markup_end, timebuf); else g_string_append_printf (gstr, _("Got an error %1$s\"%2$s\"%3$s %4$s ago"), err_markup_begin, st->lastAnnounceResult, err_markup_end, timebuf); } switch (st->announceState) { case TR_TRACKER_INACTIVE: g_string_append_c (gstr, '\n'); g_string_append (gstr, _("No updates scheduled")); break; case TR_TRACKER_WAITING: tr_strltime_rounded (timebuf, st->nextAnnounceTime - now, sizeof (timebuf)); g_string_append_c (gstr, '\n'); g_string_append_printf (gstr, _("Asking for more peers in %s"), timebuf); break; case TR_TRACKER_QUEUED: g_string_append_c (gstr, '\n'); g_string_append (gstr, _("Queued to ask for more peers")); break; case TR_TRACKER_ACTIVE: tr_strltime_rounded (timebuf, now - st->lastAnnounceStartTime, sizeof (timebuf)); g_string_append_c (gstr, '\n'); g_string_append_printf (gstr, _("Asking for more peers now… %s"), timebuf); break; } if (showScrape) { if (st->hasScraped) { g_string_append_c (gstr, '\n'); tr_strltime_rounded (timebuf, now - st->lastScrapeTime, sizeof (timebuf)); if (st->lastScrapeSucceeded) g_string_append_printf (gstr, _("Tracker had %s%'d seeders and %'d leechers%s %s ago"), success_markup_begin, st->seederCount, st->leecherCount, success_markup_end, timebuf); else g_string_append_printf (gstr, _("Got a scrape error \"%s%s%s\" %s ago"), err_markup_begin, st->lastScrapeResult, err_markup_end, timebuf); } switch (st->scrapeState) { case TR_TRACKER_INACTIVE: break; case TR_TRACKER_WAITING: g_string_append_c (gstr, '\n'); tr_strltime_rounded (timebuf, st->nextScrapeTime - now, sizeof (timebuf)); g_string_append_printf (gstr, _("Asking for peer counts in %s"), timebuf); break; case TR_TRACKER_QUEUED: g_string_append_c (gstr, '\n'); g_string_append (gstr, _("Queued to ask for peer counts")); break; case TR_TRACKER_ACTIVE: g_string_append_c (gstr, '\n'); tr_strltime_rounded (timebuf, now - st->lastScrapeStartTime, sizeof (timebuf)); g_string_append_printf (gstr, _("Asking for peer counts now… %s"), timebuf); break; } } } } enum { TRACKER_COL_TORRENT_ID, TRACKER_COL_TEXT, TRACKER_COL_IS_BACKUP, TRACKER_COL_TRACKER_ID, TRACKER_COL_FAVICON, TRACKER_COL_WAS_UPDATED, TRACKER_COL_KEY, TRACKER_N_COLS }; static gboolean trackerVisibleFunc (GtkTreeModel * model, GtkTreeIter * iter, gpointer data) { gboolean isBackup; struct DetailsImpl * di = data; /* show all */ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (di->all_check))) return TRUE; /* don't show the backups... */ gtk_tree_model_get (model, iter, TRACKER_COL_IS_BACKUP, &isBackup, -1); return !isBackup; } static int tracker_list_get_current_torrent_id (struct DetailsImpl * di) { int torrent_id = -1; /* if there's only one torrent in the dialog, always use it */ if (torrent_id < 0) if (g_slist_length (di->ids) == 1) torrent_id = GPOINTER_TO_INT (di->ids->data); /* otherwise, use the selected tracker's torrent */ if (torrent_id < 0) { GtkTreeIter iter; GtkTreeModel * model; GtkTreeSelection * sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (di->tracker_view)); if (gtk_tree_selection_get_selected (sel, &model, &iter)) gtk_tree_model_get (model, &iter, TRACKER_COL_TORRENT_ID, &torrent_id, -1); } return torrent_id; } static tr_torrent* tracker_list_get_current_torrent (struct DetailsImpl * di) { const int torrent_id = tracker_list_get_current_torrent_id (di); return gtr_core_find_torrent (di->core, torrent_id); } static void favicon_ready_cb (gpointer pixbuf, gpointer vreference) { GtkTreeIter iter; GtkTreeRowReference * reference = vreference; if (pixbuf != NULL) { GtkTreePath * path = gtk_tree_row_reference_get_path (reference); GtkTreeModel * model = gtk_tree_row_reference_get_model (reference); if (gtk_tree_model_get_iter (model, &iter, path)) gtk_list_store_set (GTK_LIST_STORE (model), &iter, TRACKER_COL_FAVICON, pixbuf, -1); gtk_tree_path_free (path); g_object_unref (pixbuf); } gtk_tree_row_reference_free (reference); } static void refreshTracker (struct DetailsImpl * di, tr_torrent ** torrents, int n) { int i; int * statCount; tr_tracker_stat ** stats; GtkTreeIter iter; GtkTreeModel * model; GString * gstr = di->gstr; /* buffer for temporary strings */ GHashTable * hash = di->tracker_hash; GtkListStore * store = di->tracker_store; tr_session * session = gtr_core_session (di->core); const gboolean showScrape = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (di->scrape_check)); /* step 1: get all the trackers */ statCount = g_new0 (int, n); stats = g_new0 (tr_tracker_stat *, n); for (i=0; itier, st->announce); if (g_hash_table_lookup (hash, gstr->str) == NULL) { GtkTreePath * p; GtkTreeIter iter; GtkTreeRowReference * ref; gtk_list_store_insert_with_values (store, &iter, -1, TRACKER_COL_TORRENT_ID, torrent_id, TRACKER_COL_TRACKER_ID, st->id, TRACKER_COL_KEY, gstr->str, -1); p = gtk_tree_model_get_path (model, &iter); ref = gtk_tree_row_reference_new (model, p); g_hash_table_insert (hash, g_strdup (gstr->str), ref); ref = gtk_tree_row_reference_new (model, p); gtr_get_favicon_from_url (session, st->announce, favicon_ready_cb, ref); gtk_tree_path_free (p); } } } /* step 4: update the peers */ for (i=0; i1 ? tr_torrentName (tor) : NULL; for (j=0; jtier, st->announce); ref = g_hash_table_lookup (hash, gstr->str); p = gtk_tree_row_reference_get_path (ref); gtk_tree_model_get_iter (model, &iter, p); /* update the row */ g_string_truncate (gstr, 0); buildTrackerSummary (gstr, summary_name, st, showScrape); gtk_list_store_set (store, &iter, TRACKER_COL_TEXT, gstr->str, TRACKER_COL_IS_BACKUP, st->isBackup, TRACKER_COL_TRACKER_ID, st->id, TRACKER_COL_WAS_UPDATED, TRUE, -1); /* cleanup */ gtk_tree_path_free (p); } } /* step 5: remove trackers that have disappeared */ if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) { gboolean more = TRUE; while (more) { gboolean b; gtk_tree_model_get (model, &iter, TRACKER_COL_WAS_UPDATED, &b, -1); if (b) { more = gtk_tree_model_iter_next (model, &iter); } else { char * key; gtk_tree_model_get (model, &iter, TRACKER_COL_KEY, &key, -1); g_hash_table_remove (hash, key); more = gtk_list_store_remove (store, &iter); g_free (key); } } } gtk_widget_set_sensitive (di->edit_trackers_button, tracker_list_get_current_torrent_id (di) >= 0); /* cleanup */ for (i=0; icore, key, value); refresh (di); } static void onBackupToggled (GtkToggleButton * button, struct DetailsImpl * di) { const tr_quark key = TR_KEY_show_backup_trackers; const gboolean value = gtk_toggle_button_get_active (button); gtr_core_set_pref_bool (di->core, key, value); refresh (di); } static void on_edit_trackers_response (GtkDialog * dialog, int response, gpointer data) { gboolean do_destroy = TRUE; struct DetailsImpl * di = data; if (response == GTK_RESPONSE_ACCEPT) { int i, n; int tier; GtkTextIter start, end; const int torrent_id = GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (dialog), TORRENT_ID_KEY)); GtkTextBuffer * text_buffer = g_object_get_qdata (G_OBJECT (dialog), TEXT_BUFFER_KEY); tr_torrent * tor = gtr_core_find_torrent (di->core, torrent_id); if (tor != NULL) { tr_tracker_info * trackers; char ** tracker_strings; char * tracker_text; /* build the array of trackers */ gtk_text_buffer_get_bounds (text_buffer, &start, &end); tracker_text = gtk_text_buffer_get_text (text_buffer, &start, &end, FALSE); tracker_strings = g_strsplit (tracker_text, "\n", 0); for (i=0; tracker_strings[i];) ++i; trackers = g_new0 (tr_tracker_info, i); for (i=n=tier=0; tracker_strings[i]; ++i) { const char * str = tracker_strings[i]; if (!*str) { ++tier; } else { trackers[n].tier = tier; trackers[n].announce = tracker_strings[i]; ++n; } } /* update the torrent */ if (tr_torrentSetAnnounceList (tor, trackers, n)) { refresh (di); } else { GtkWidget * w; const char * text = _("List contains invalid URLs"); w = gtk_message_dialog_new (GTK_WINDOW (dialog), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", text); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), "%s", _("Please correct the errors and try again.")); gtk_dialog_run (GTK_DIALOG (w)); gtk_widget_destroy (w); do_destroy = FALSE; } /* cleanup */ g_free (trackers); g_strfreev (tracker_strings); g_free (tracker_text); } } if (do_destroy) gtk_widget_destroy (GTK_WIDGET (dialog)); } static void get_editable_tracker_list (GString * gstr, const tr_torrent * tor) { unsigned int i; int tier = 0; const tr_info * inf = tr_torrentInfo (tor); for (i=0; itrackerCount; ++i) { const tr_tracker_info * t = &inf->trackers[i]; if (tier != t->tier) { tier = t->tier; g_string_append_c (gstr, '\n'); } g_string_append_printf (gstr, "%s\n", t->announce); } if (gstr->len > 0) g_string_truncate (gstr, gstr->len-1); } static void on_edit_trackers (GtkButton * button, gpointer data) { struct DetailsImpl * di = data; tr_torrent * tor = tracker_list_get_current_torrent (di); if (tor != NULL) { guint row; GtkWidget *w, *d, *fr, *t, *l, *sw; GtkWindow * win = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))); GString * gstr = di->gstr; /* buffer for temporary strings */ const int torrent_id = tr_torrentId (tor); g_string_truncate (gstr, 0); g_string_append_printf (gstr, _("%s - Edit Trackers"), tr_torrentName (tor)); d = gtk_dialog_new_with_buttons (gstr->str, win, GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); g_signal_connect (d, "response", G_CALLBACK (on_edit_trackers_response), data); row = 0; t = hig_workarea_create (); hig_workarea_add_section_title (t, &row, _("Tracker Announce URLs")); l = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (l), _("To add a backup URL, add it on the line after the primary URL.\n" "To add another primary URL, add it after a blank line.")); gtk_label_set_justify (GTK_LABEL (l), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (l), 0.0, 0.5); hig_workarea_add_wide_control (t, &row, l); w = gtk_text_view_new (); g_string_truncate (gstr, 0); get_editable_tracker_list (gstr, tor); gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (w)), gstr->str, -1); fr = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (fr), GTK_SHADOW_IN); sw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (sw), w); gtk_container_add (GTK_CONTAINER (fr), sw); gtk_widget_set_size_request (fr, 500u, 166u); hig_workarea_add_wide_tall_control (t, &row, fr); gtr_dialog_set_content (GTK_DIALOG (d), t); g_object_set_qdata (G_OBJECT (d), TORRENT_ID_KEY, GINT_TO_POINTER (torrent_id)); g_object_set_qdata (G_OBJECT (d), TEXT_BUFFER_KEY, gtk_text_view_get_buffer (GTK_TEXT_VIEW (w))); gtk_widget_show (d); } } static void on_tracker_list_selection_changed (GtkTreeSelection * sel, gpointer gdi) { struct DetailsImpl * di = gdi; const int n = gtk_tree_selection_count_selected_rows (sel); tr_torrent * tor = tracker_list_get_current_torrent (di); gtk_widget_set_sensitive (di->remove_tracker_button, n>0); gtk_widget_set_sensitive (di->add_tracker_button, tor!=NULL); gtk_widget_set_sensitive (di->edit_trackers_button, tor!=NULL); } static void on_add_tracker_response (GtkDialog * dialog, int response, gpointer gdi) { gboolean destroy = TRUE; if (response == GTK_RESPONSE_ACCEPT) { struct DetailsImpl * di = gdi; GtkWidget * e = GTK_WIDGET (g_object_get_qdata (G_OBJECT (dialog), URL_ENTRY_KEY)); const int torrent_id = GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (dialog), TORRENT_ID_KEY)); char * url = g_strdup (gtk_entry_get_text (GTK_ENTRY (e))); g_strstrip (url); if (url && *url) { if (tr_urlIsValidTracker (url)) { tr_variant top, * args, * trackers; tr_variantInitDict (&top, 2); tr_variantDictAddStr (&top, TR_KEY_method, "torrent-set"); args = tr_variantDictAddDict (&top, TR_KEY_arguments, 2); tr_variantDictAddInt (args, TR_KEY_id, torrent_id); trackers = tr_variantDictAddList (args, TR_KEY_trackerAdd, 1); tr_variantListAddStr (trackers, url); gtr_core_exec (di->core, &top); refresh (di); tr_variantFree (&top); } else { gtr_unrecognized_url_dialog (GTK_WIDGET (dialog), url); destroy = FALSE; } } g_free (url); } if (destroy) gtk_widget_destroy (GTK_WIDGET (dialog)); } static void on_tracker_list_add_button_clicked (GtkButton * button UNUSED, gpointer gdi) { struct DetailsImpl * di = gdi; tr_torrent * tor = tracker_list_get_current_torrent (di); if (tor != NULL) { guint row; GtkWidget * e; GtkWidget * t; GtkWidget * w; GString * gstr = di->gstr; /* buffer for temporary strings */ g_string_truncate (gstr, 0); g_string_append_printf (gstr, _("%s - Add Tracker"), tr_torrentName (tor)); w = gtk_dialog_new_with_buttons (gstr->str, GTK_WINDOW (di->dialog), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_alternative_button_order (GTK_DIALOG (w), GTK_RESPONSE_ACCEPT, GTK_RESPONSE_CANCEL, -1); g_signal_connect (w, "response", G_CALLBACK (on_add_tracker_response), gdi); row = 0; t = hig_workarea_create (); hig_workarea_add_section_title (t, &row, _("Tracker")); e = gtk_entry_new (); gtk_widget_set_size_request (e, 400, -1); gtr_paste_clipboard_url_into_entry (e); g_object_set_qdata (G_OBJECT (w), URL_ENTRY_KEY, e); g_object_set_qdata (G_OBJECT (w), TORRENT_ID_KEY, GINT_TO_POINTER (tr_torrentId (tor))); hig_workarea_add_row (t, &row, _("_Announce URL:"), e, NULL); gtr_dialog_set_content (GTK_DIALOG (w), t); gtk_widget_show_all (w); } } static void on_tracker_list_remove_button_clicked (GtkButton * button UNUSED, gpointer gdi) { GtkTreeIter iter; GtkTreeModel * model; struct DetailsImpl * di = gdi; GtkTreeView * v = GTK_TREE_VIEW (di->tracker_view); GtkTreeSelection * sel = gtk_tree_view_get_selection (v); if (gtk_tree_selection_get_selected (sel, &model, &iter)) { int torrent_id; int tracker_id; tr_variant top, * args, * trackers; gtk_tree_model_get (model, &iter, TRACKER_COL_TRACKER_ID, &tracker_id, TRACKER_COL_TORRENT_ID, &torrent_id, -1); tr_variantInitDict (&top, 2); tr_variantDictAddStr (&top, TR_KEY_method, "torrent-set"); args = tr_variantDictAddDict (&top, TR_KEY_arguments, 2); tr_variantDictAddInt (args, TR_KEY_id, torrent_id); trackers = tr_variantDictAddList (args, TR_KEY_trackerRemove, 1); tr_variantListAddInt (trackers, tracker_id); gtr_core_exec (di->core, &top); refresh (di); tr_variantFree (&top); } } static GtkWidget* tracker_page_new (struct DetailsImpl * di) { gboolean b; GtkCellRenderer * r; GtkTreeViewColumn * c; GtkTreeSelection * sel; GtkWidget *vbox, *sw, *w, *v, *hbox; const int pad = (GUI_PAD + GUI_PAD_BIG) / 2; vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, GUI_PAD); gtk_container_set_border_width (GTK_CONTAINER (vbox), GUI_PAD_BIG); di->tracker_store = gtk_list_store_new (TRACKER_N_COLS, G_TYPE_INT, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_BOOLEAN, G_TYPE_STRING); di->tracker_hash = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)gtk_tree_row_reference_free); di->trackers_filtered = gtk_tree_model_filter_new (GTK_TREE_MODEL (di->tracker_store), NULL); gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (di->trackers_filtered), trackerVisibleFunc, di, NULL); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, GUI_PAD_BIG); v = di->tracker_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (di->trackers_filtered)); g_object_unref (di->trackers_filtered); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (v), FALSE); g_signal_connect (v, "button-press-event", G_CALLBACK (on_tree_view_button_pressed), NULL); g_signal_connect (v, "button-release-event", G_CALLBACK (on_tree_view_button_released), NULL); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (v), TRUE); sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (v)); g_signal_connect (sel, "changed", G_CALLBACK (on_tracker_list_selection_changed), di); c = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (c, _("Trackers")); gtk_tree_view_append_column (GTK_TREE_VIEW (v), c); r = gtk_cell_renderer_pixbuf_new (); g_object_set (r, "width", 20 + (GUI_PAD_SMALL*2), "xpad", GUI_PAD_SMALL, "ypad", pad, "yalign", 0.0f, NULL); gtk_tree_view_column_pack_start (c, r, FALSE); gtk_tree_view_column_add_attribute (c, r, "pixbuf", TRACKER_COL_FAVICON); r = gtk_cell_renderer_text_new (); g_object_set (G_OBJECT (r), "ellipsize", PANGO_ELLIPSIZE_END, "xpad", GUI_PAD_SMALL, "ypad", pad, NULL); gtk_tree_view_column_pack_start (c, r, TRUE); gtk_tree_view_column_add_attribute (c, r, "markup", TRACKER_COL_TEXT); sw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (sw), v); w = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (w), GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER (w), sw); gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0); v = gtk_box_new (GTK_ORIENTATION_VERTICAL, GUI_PAD); w = gtk_button_new_with_mnemonic (_("_Add")); di->add_tracker_button = w; g_signal_connect (w, "clicked", G_CALLBACK (on_tracker_list_add_button_clicked), di); gtk_box_pack_start (GTK_BOX (v), w, FALSE, FALSE, 0); w = gtk_button_new_with_mnemonic (_("_Edit")); gtk_button_set_image (GTK_BUTTON (w), gtk_image_new_from_stock (GTK_STOCK_EDIT, GTK_ICON_SIZE_BUTTON)); g_signal_connect (w, "clicked", G_CALLBACK (on_edit_trackers), di); di->edit_trackers_button = w; gtk_box_pack_start (GTK_BOX (v), w, FALSE, FALSE, 0); w = gtk_button_new_with_mnemonic (_("_Remove")); di->remove_tracker_button = w; g_signal_connect (w, "clicked", G_CALLBACK (on_tracker_list_remove_button_clicked), di); gtk_box_pack_start (GTK_BOX (v), w, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), v, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); w = gtk_check_button_new_with_mnemonic (_("Show _more details")); di->scrape_check = w; b = gtr_pref_flag_get (TR_KEY_show_tracker_scrapes); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), b); g_signal_connect (w, "toggled", G_CALLBACK (onScrapeToggled), di); gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); w = gtk_check_button_new_with_mnemonic (_("Show _backup trackers")); di->all_check = w; b = gtr_pref_flag_get (TR_KEY_show_backup_trackers); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), b); g_signal_connect (w, "toggled", G_CALLBACK (onBackupToggled), di); gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); return vbox; } /**** ***** DIALOG ****/ static void refresh (struct DetailsImpl * di) { int n; tr_torrent ** torrents = getTorrents (di, &n); refreshInfo (di, torrents, n); refreshPeers (di, torrents, n); refreshTracker (di, torrents, n); refreshOptions (di, torrents, n); if (n == 0) gtk_dialog_response (GTK_DIALOG (di->dialog), GTK_RESPONSE_CLOSE); g_free (torrents); } static gboolean periodic_refresh (gpointer data) { refresh (data); return G_SOURCE_CONTINUE; } static void details_free (gpointer gdata) { struct DetailsImpl * data = gdata; g_source_remove (data->periodic_refresh_tag); g_hash_table_destroy (data->tracker_hash); g_hash_table_destroy (data->webseed_hash); g_hash_table_destroy (data->peer_hash); g_string_free (data->gstr, TRUE); g_slist_free (data->ids); g_free (data); } GtkWidget* gtr_torrent_details_dialog_new (GtkWindow * parent, TrCore * core) { GtkWidget *d, *n, *v, *w, *l; struct DetailsImpl * di = g_new0 (struct DetailsImpl, 1); /* one-time setup */ if (ARG_KEY == 0) { ARG_KEY = g_quark_from_static_string ("tr-arg-key"); DETAILS_KEY = g_quark_from_static_string ("tr-details-data-key"); TORRENT_ID_KEY = g_quark_from_static_string ("tr-torrent-id-key"); TEXT_BUFFER_KEY = g_quark_from_static_string ("tr-text-buffer-key"); URL_ENTRY_KEY = g_quark_from_static_string ("tr-url-entry-key"); } /* create the dialog */ di->core = core; di->gstr = g_string_new (NULL); d = gtk_dialog_new_with_buttons (NULL, parent, 0, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); di->dialog = d; gtk_window_set_role (GTK_WINDOW (d), "tr-info"); g_signal_connect_swapped (d, "response", G_CALLBACK (gtk_widget_destroy), d); gtk_container_set_border_width (GTK_CONTAINER (d), GUI_PAD); g_object_set_qdata_full (G_OBJECT (d), DETAILS_KEY, di, details_free); n = gtk_notebook_new (); gtk_container_set_border_width (GTK_CONTAINER (n), GUI_PAD); w = info_page_new (di); l = gtk_label_new (_("Information")); gtk_notebook_append_page (GTK_NOTEBOOK (n), w, l); w = peer_page_new (di); l = gtk_label_new (_("Peers")); gtk_notebook_append_page (GTK_NOTEBOOK (n), w, l); w = tracker_page_new (di); l = gtk_label_new (_("Trackers")); gtk_notebook_append_page (GTK_NOTEBOOK (n), w, l); v = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); di->file_list = gtr_file_list_new (core, 0); di->file_label = gtk_label_new (_("File listing not available for combined torrent properties")); gtk_box_pack_start (GTK_BOX (v), di->file_list, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (v), di->file_label, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (v), GUI_PAD_BIG); l = gtk_label_new (_("Files")); gtk_notebook_append_page (GTK_NOTEBOOK (n), v, l); w = options_page_new (di); l = gtk_label_new (_("Options")); gtk_notebook_append_page (GTK_NOTEBOOK (n), w, l); gtr_dialog_set_content (GTK_DIALOG (d), n); di->periodic_refresh_tag = gdk_threads_add_timeout_seconds (SECONDARY_WINDOW_REFRESH_INTERVAL_SECONDS, periodic_refresh, di); return d; } void gtr_torrent_details_dialog_set_torrents (GtkWidget * w, GSList * ids) { char title[256]; const int len = g_slist_length (ids); struct DetailsImpl * di = g_object_get_qdata (G_OBJECT (w), DETAILS_KEY); g_slist_free (di->ids); di->ids = g_slist_copy (ids); if (len == 1) { const int id = GPOINTER_TO_INT (ids->data); tr_torrent * tor = gtr_core_find_torrent (di->core, id); const tr_info * inf = tr_torrentInfo (tor); g_snprintf (title, sizeof (title), _("%s Properties"), inf->name); gtr_file_list_set_torrent (di->file_list, id); gtk_widget_show (di->file_list); gtk_widget_hide (di->file_label); } else { gtr_file_list_clear (di->file_list); gtk_widget_hide (di->file_list); gtk_widget_show (di->file_label); g_snprintf (title, sizeof (title), _("%'d Torrent Properties"), len); } gtk_window_set_title (GTK_WINDOW (w), title); refresh (di); } transmission-2.92/gtk/PaxHeaders.4960/details.h0000644000000000000000000000007312617356116016255 xustar0029 atime=1456201459.05321957 30 ctime=1457295920.903823274 transmission-2.92/gtk/details.h0000644000175000017500000000123512617356116017677 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: details.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef GTR_TORRENT_DETAILS_H #define GTR_TORRENT_DETAILS_H #include #include "tr-core.h" GtkWidget* gtr_torrent_details_dialog_new (GtkWindow * parent, TrCore * core); void gtr_torrent_details_dialog_set_torrents (GtkWidget * details_dialog, GSList * torrent_ids); #endif /* GTR_TORRENT_DETAILS_H */ transmission-2.92/gtk/PaxHeaders.4960/tr-window.c0000644000000000000000000000007312617356116016555 xustar0030 atime=1456201459.066219791 29 ctime=1457295921.14882744 transmission-2.92/gtk/tr-window.c0000644000175000017500000007442112617356116020206 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: tr-window.c 14519 2015-05-03 10:30:35Z mikedld $ * * Copyright (c) Transmission authors and contributors * * 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. *****************************************************************************/ #include /* strlen() */ #include #include #include #include /* tr_formatter_speed_KBps () */ #include "actions.h" #include "conf.h" #include "filter.h" #include "hig.h" #include "torrent-cell-renderer.h" #include "tr-prefs.h" #include "tr-window.h" #include "util.h" typedef struct { GtkWidget * speedlimit_on_item[2]; GtkWidget * speedlimit_off_item[2]; GtkWidget * ratio_on_item; GtkWidget * ratio_off_item; GtkWidget * scroll; GtkWidget * view; GtkWidget * toolbar; GtkWidget * filter; GtkWidget * status; GtkWidget * status_menu; GtkLabel * ul_lb; GtkLabel * dl_lb; GtkLabel * stats_lb; GtkWidget * alt_speed_image; GtkWidget * alt_speed_button; GtkWidget * options_menu; GtkTreeSelection * selection; GtkCellRenderer * renderer; GtkTreeViewColumn * column; GtkTreeModel * filter_model; TrCore * core; gulong pref_handler_id; } PrivateData; static TR_DEFINE_QUARK (private_data, private_data) static PrivateData* get_private_data (GtkWindow * w) { return g_object_get_qdata (G_OBJECT (w), private_data_quark ()); } /*** **** ***/ static void on_popup_menu (GtkWidget * self UNUSED, GdkEventButton * event) { GtkWidget * menu = gtr_action_get_widget ("/main-window-popup"); gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, (event ? event->button : 0), (event ? event->time : 0)); } static void view_row_activated (GtkTreeView * tree_view UNUSED, GtkTreePath * path UNUSED, GtkTreeViewColumn * column UNUSED, gpointer user_data UNUSED) { gtr_action_activate ("show-torrent-properties"); } static gboolean tree_view_search_equal_func (GtkTreeModel * model, gint column UNUSED, const gchar * key, GtkTreeIter * iter, gpointer search_data UNUSED) { gboolean match; char * lower; const char * name = NULL; lower = g_strstrip (g_utf8_strdown (key, -1)); gtk_tree_model_get (model, iter, MC_NAME_COLLATED, &name, -1); match = strstr (name, lower) != NULL; g_free (lower); return !match; } static GtkWidget* makeview (PrivateData * p) { GtkWidget * view; GtkTreeViewColumn * col; GtkTreeSelection * sel; GtkCellRenderer * r; GtkTreeView * tree_view; view = gtk_tree_view_new (); tree_view = GTK_TREE_VIEW (view); gtk_tree_view_set_search_column (tree_view, MC_NAME_COLLATED); gtk_tree_view_set_search_equal_func (tree_view, tree_view_search_equal_func, NULL, NULL); gtk_tree_view_set_headers_visible (tree_view, FALSE); gtk_tree_view_set_fixed_height_mode (tree_view, TRUE); p->selection = gtk_tree_view_get_selection (tree_view); p->column = col = GTK_TREE_VIEW_COLUMN (g_object_new (GTK_TYPE_TREE_VIEW_COLUMN, "title", _("Torrent"), "resizable", TRUE, "sizing", GTK_TREE_VIEW_COLUMN_FIXED, NULL)); p->renderer = r = torrent_cell_renderer_new (); gtk_tree_view_column_pack_start (col, r, FALSE); gtk_tree_view_column_add_attribute (col, r, "torrent", MC_TORRENT); gtk_tree_view_column_add_attribute (col, r, "piece-upload-speed", MC_SPEED_UP); gtk_tree_view_column_add_attribute (col, r, "piece-download-speed", MC_SPEED_DOWN); gtk_tree_view_append_column (tree_view, col); g_object_set (r, "xpad", GUI_PAD_SMALL, "ypad", GUI_PAD_SMALL, NULL); gtk_tree_view_set_rules_hint (tree_view, TRUE); sel = gtk_tree_view_get_selection (tree_view); gtk_tree_selection_set_mode (GTK_TREE_SELECTION (sel), GTK_SELECTION_MULTIPLE); g_signal_connect (view, "popup-menu", G_CALLBACK (on_popup_menu), NULL); g_signal_connect (view, "button-press-event", G_CALLBACK (on_tree_view_button_pressed), (void *) on_popup_menu); g_signal_connect (view, "button-release-event", G_CALLBACK (on_tree_view_button_released), NULL); g_signal_connect (view, "row-activated", G_CALLBACK (view_row_activated), NULL); gtk_tree_view_set_model (tree_view, p->filter_model); g_object_unref (p->filter_model); return view; } static void syncAltSpeedButton (PrivateData * p); static void prefsChanged (TrCore * core UNUSED, const tr_quark key, gpointer wind) { gboolean isEnabled; PrivateData * p = get_private_data (GTK_WINDOW (wind)); switch (key) { case TR_KEY_compact_view: g_object_set (p->renderer, "compact", gtr_pref_flag_get (key), NULL); /* since the cell size has changed, we need gtktreeview to revalidate * its fixed-height mode values. Unfortunately there's not an API call * for that, but it *does* revalidate when it thinks the style's been tweaked */ g_signal_emit_by_name (p->view, "style-updated", NULL, NULL); break; case TR_KEY_show_statusbar: isEnabled = gtr_pref_flag_get (key); g_object_set (p->status, "visible", isEnabled, NULL); break; case TR_KEY_show_filterbar: isEnabled = gtr_pref_flag_get (key); g_object_set (p->filter, "visible", isEnabled, NULL); break; case TR_KEY_show_toolbar: isEnabled = gtr_pref_flag_get (key); g_object_set (p->toolbar, "visible", isEnabled, NULL); break; case TR_KEY_statusbar_stats: gtr_window_refresh (wind); break; case TR_KEY_alt_speed_enabled: case TR_KEY_alt_speed_up: case TR_KEY_alt_speed_down: syncAltSpeedButton (p); break; default: break; } } static void privateFree (gpointer vprivate) { PrivateData * p = vprivate; g_signal_handler_disconnect (p->core, p->pref_handler_id); g_free (p); } static void onYinYangReleased (GtkWidget * w UNUSED, gpointer vprivate) { PrivateData * p = vprivate; gtk_menu_popup (GTK_MENU (p->status_menu), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time ()); } #define STATS_MODE "stats-mode" static struct { const char * val, *i18n; } stats_modes[] = { { "total-ratio", N_("Total Ratio") }, { "session-ratio", N_("Session Ratio") }, { "total-transfer", N_("Total Transfer") }, { "session-transfer", N_("Session Transfer") } }; static void status_menu_toggled_cb (GtkCheckMenuItem * menu_item, gpointer vprivate) { if (gtk_check_menu_item_get_active (menu_item)) { PrivateData * p = vprivate; const char * val = g_object_get_data (G_OBJECT (menu_item), STATS_MODE); gtr_core_set_pref (p->core, TR_KEY_statusbar_stats, val); } } static void syncAltSpeedButton (PrivateData * p) { char u[32]; char d[32]; char * str; const char * fmt; const gboolean b = gtr_pref_flag_get (TR_KEY_alt_speed_enabled); const char * stock = b ? "alt-speed-on" : "alt-speed-off"; GtkWidget * w = p->alt_speed_button; tr_formatter_speed_KBps (u, gtr_pref_int_get (TR_KEY_alt_speed_up), sizeof (u)); tr_formatter_speed_KBps (d, gtr_pref_int_get (TR_KEY_alt_speed_down), sizeof (d)); fmt = b ? _("Click to disable Alternative Speed Limits\n (%1$s down, %2$s up)") : _("Click to enable Alternative Speed Limits\n (%1$s down, %2$s up)"); str = g_strdup_printf (fmt, d, u); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), b); gtk_image_set_from_stock (GTK_IMAGE (p->alt_speed_image), stock, -1); gtk_button_set_alignment (GTK_BUTTON (w), 0.5, 0.5); gtk_widget_set_tooltip_text (w, str); g_free (str); } static void alt_speed_toggled_cb (GtkToggleButton * button, gpointer vprivate) { PrivateData * p = vprivate; const gboolean b = gtk_toggle_button_get_active (button); gtr_core_set_pref_bool (p->core, TR_KEY_alt_speed_enabled, b); } /*** **** FILTER ***/ static void findMaxAnnounceTime (GtkTreeModel * model, GtkTreePath * path UNUSED, GtkTreeIter * iter, gpointer gmaxTime) { tr_torrent * tor; const tr_stat * torStat; time_t * maxTime = gmaxTime; gtk_tree_model_get (model, iter, MC_TORRENT, &tor, -1); torStat = tr_torrentStatCached (tor); *maxTime = MAX (*maxTime, torStat->manualAnnounceTime); } static gboolean onAskTrackerQueryTooltip (GtkWidget * widget UNUSED, gint x UNUSED, gint y UNUSED, gboolean keyboard_tip UNUSED, GtkTooltip * tooltip, gpointer gdata) { gboolean handled; time_t maxTime = 0; PrivateData * p = gdata; const time_t now = time (NULL); gtk_tree_selection_selected_foreach (p->selection, findMaxAnnounceTime, &maxTime); if (maxTime <= now) { handled = FALSE; } else { char buf[512]; char timebuf[64]; const int seconds = maxTime - now; tr_strltime (timebuf, seconds, sizeof (timebuf)); g_snprintf (buf, sizeof (buf), _("Tracker will allow requests in %s"), timebuf); gtk_tooltip_set_text (tooltip, buf); handled = TRUE; } return handled; } static gboolean onAltSpeedToggledIdle (gpointer vp) { PrivateData * p = vp; gboolean b = tr_sessionUsesAltSpeed (gtr_core_session (p->core)); gtr_core_set_pref_bool (p->core, TR_KEY_alt_speed_enabled, b); return G_SOURCE_REMOVE; } static void onAltSpeedToggled (tr_session * s UNUSED, bool isEnabled UNUSED, bool byUser UNUSED, void * p) { gdk_threads_add_idle (onAltSpeedToggledIdle, p); } /*** **** Speed limit menu ***/ #define DIRECTION_KEY "direction-key" #define ENABLED_KEY "enabled-key" #define SPEED_KEY "speed-key" static void onSpeedToggled (GtkCheckMenuItem * check, gpointer vp) { PrivateData * p = vp; GObject * o = G_OBJECT (check); gboolean isEnabled = g_object_get_data (o, ENABLED_KEY) != 0; tr_direction dir = GPOINTER_TO_INT (g_object_get_data (o, DIRECTION_KEY)); const tr_quark key = dir == TR_UP ? TR_KEY_speed_limit_up_enabled : TR_KEY_speed_limit_down_enabled; if (gtk_check_menu_item_get_active (check)) gtr_core_set_pref_bool (p->core, key, isEnabled); } static void onSpeedSet (GtkCheckMenuItem * check, gpointer vp) { tr_quark key; PrivateData * p = vp; GObject * o = G_OBJECT (check); const int KBps = GPOINTER_TO_INT (g_object_get_data (o, SPEED_KEY)); tr_direction dir = GPOINTER_TO_INT (g_object_get_data (o, DIRECTION_KEY)); key = dir==TR_UP ? TR_KEY_speed_limit_up : TR_KEY_speed_limit_down; gtr_core_set_pref_int (p->core, key, KBps); key = dir==TR_UP ? TR_KEY_speed_limit_up_enabled : TR_KEY_speed_limit_down_enabled; gtr_core_set_pref_bool (p->core, key, TRUE); } static GtkWidget* createSpeedMenu (PrivateData * p, tr_direction dir) { int i, n; GObject * o; GtkWidget * w; GtkWidget * m; GtkMenuShell * menu_shell; const int speeds_KBps[] = { 5, 10, 20, 30, 40, 50, 75, 100, 150, 200, 250, 500, 750 }; m = gtk_menu_new (); menu_shell = GTK_MENU_SHELL (m); w = gtk_radio_menu_item_new_with_label (NULL, _("Unlimited")); o = G_OBJECT (w); p->speedlimit_off_item[dir] = w; g_object_set_data (o, DIRECTION_KEY, GINT_TO_POINTER (dir)); g_object_set_data (o, ENABLED_KEY, GINT_TO_POINTER (FALSE)); g_signal_connect (w, "toggled", G_CALLBACK (onSpeedToggled), p); gtk_menu_shell_append (menu_shell, w); w = gtk_radio_menu_item_new_with_label_from_widget (GTK_RADIO_MENU_ITEM (w), ""); o = G_OBJECT (w); p->speedlimit_on_item[dir] = w; g_object_set_data (o, DIRECTION_KEY, GINT_TO_POINTER (dir)); g_object_set_data (o, ENABLED_KEY, GINT_TO_POINTER (TRUE)); g_signal_connect (w, "toggled", G_CALLBACK (onSpeedToggled), p); gtk_menu_shell_append (menu_shell, w); w = gtk_separator_menu_item_new (); gtk_menu_shell_append (menu_shell, w); for (i=0, n=G_N_ELEMENTS (speeds_KBps); icore, TR_KEY_ratio_limit_enabled, f); } } static void onRatioSet (GtkCheckMenuItem * check, gpointer vp) { PrivateData * p = vp; int i = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (check), RATIO_KEY)); const double ratio = stockRatios[i]; gtr_core_set_pref_double (p->core, TR_KEY_ratio_limit, ratio); gtr_core_set_pref_bool (p->core, TR_KEY_ratio_limit_enabled, TRUE); } static GtkWidget* createRatioMenu (PrivateData * p) { int i, n; GtkWidget *m, *w; GtkMenuShell * menu_shell; m = gtk_menu_new (); menu_shell = GTK_MENU_SHELL (m); w = gtk_radio_menu_item_new_with_label (NULL, _("Seed Forever")); p->ratio_off_item = w; g_object_set_data (G_OBJECT (w), ENABLED_KEY, GINT_TO_POINTER (FALSE)); g_signal_connect (w, "toggled", G_CALLBACK (onRatioToggled), p); gtk_menu_shell_append (menu_shell, w); w = gtk_radio_menu_item_new_with_label_from_widget (GTK_RADIO_MENU_ITEM (w), ""); p->ratio_on_item = w; g_object_set_data (G_OBJECT (w), ENABLED_KEY, GINT_TO_POINTER (TRUE)); g_signal_connect (w, "toggled", G_CALLBACK (onRatioToggled), p); gtk_menu_shell_append (menu_shell, w); w = gtk_separator_menu_item_new (); gtk_menu_shell_append (menu_shell, w); for (i=0, n=G_N_ELEMENTS (stockRatios); ispeedlimit_on_item[TR_DOWN]; tr_formatter_speed_KBps (buf1, gtr_pref_int_get (TR_KEY_speed_limit_down), sizeof (buf1)); gtr_label_set_text (GTK_LABEL (gtk_bin_get_child (GTK_BIN (w))), buf1); b = gtr_pref_flag_get (TR_KEY_speed_limit_down_enabled); w = b ? p->speedlimit_on_item[TR_DOWN] : p->speedlimit_off_item[TR_DOWN]; gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), TRUE); w = p->speedlimit_on_item[TR_UP]; tr_formatter_speed_KBps (buf1, gtr_pref_int_get (TR_KEY_speed_limit_up), sizeof (buf1)); gtr_label_set_text (GTK_LABEL (gtk_bin_get_child (GTK_BIN (w))), buf1); b = gtr_pref_flag_get (TR_KEY_speed_limit_up_enabled); w = b ? p->speedlimit_on_item[TR_UP] : p->speedlimit_off_item[TR_UP]; gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), TRUE); tr_strlratio (buf1, gtr_pref_double_get (TR_KEY_ratio_limit), sizeof (buf1)); g_snprintf (buf2, sizeof (buf2), _("Stop at Ratio (%s)"), buf1); gtr_label_set_text (GTK_LABEL (gtk_bin_get_child (GTK_BIN (p->ratio_on_item))), buf2); b = gtr_pref_flag_get (TR_KEY_ratio_limit_enabled); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (b ? p->ratio_on_item : p->ratio_off_item), TRUE); gtk_menu_popup (GTK_MENU (p->options_menu), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time ()); } /*** **** PUBLIC ***/ GtkWidget * gtr_window_new (GtkApplication * app, GtkUIManager * ui_mgr, TrCore * core) { int i, n; const char * pch, * style; PrivateData * p; GtkWidget * sibling = NULL; GtkWidget * ul_lb, * dl_lb; GtkWidget * mainmenu, *toolbar, *filter, *list, *status; GtkWidget * vbox, *w, *self, *menu; GtkWidget * grid_w; GtkWindow * win; GtkCssProvider * css_provider; GSList * l; GtkGrid * grid; p = g_new0 (PrivateData, 1); /* make the window */ self = gtk_application_window_new (app); g_object_set_qdata_full (G_OBJECT (self), private_data_quark (), p, privateFree); win = GTK_WINDOW (self); gtk_window_set_title (win, g_get_application_name ()); gtk_window_set_role (win, "tr-main"); gtk_window_set_default_size (win, gtr_pref_int_get (TR_KEY_main_window_width), gtr_pref_int_get (TR_KEY_main_window_height)); gtk_window_move (win, gtr_pref_int_get (TR_KEY_main_window_x), gtr_pref_int_get (TR_KEY_main_window_y)); if (gtr_pref_flag_get (TR_KEY_main_window_is_maximized)) gtk_window_maximize (win); gtk_window_add_accel_group (win, gtk_ui_manager_get_accel_group (ui_mgr)); /* Add style provider to the window. */ /* Please move it to separate .css file if you’re adding more styles here. */ style = ".tr-workarea.frame {border-left-width: 0; border-right-width: 0; border-radius: 0;}"; css_provider = gtk_css_provider_new (); gtk_css_provider_load_from_data (css_provider, style, strlen (style), NULL); gtk_style_context_add_provider_for_screen(gdk_screen_get_default (), GTK_STYLE_PROVIDER (css_provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); /* window's main container */ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (self), vbox); /* main menu */ mainmenu = gtr_action_get_widget ("/main-window-menu"); w = gtr_action_get_widget ("/main-window-menu/torrent-menu/torrent-reannounce"); g_signal_connect (w, "query-tooltip", G_CALLBACK (onAskTrackerQueryTooltip), p); /* toolbar */ toolbar = p->toolbar = gtr_action_get_widget ("/main-window-toolbar"); gtk_style_context_add_class (gtk_widget_get_style_context (toolbar), GTK_STYLE_CLASS_PRIMARY_TOOLBAR); gtr_action_set_important ("open-torrent-toolbar", TRUE); gtr_action_set_important ("show-torrent-properties", TRUE); /* filter */ w = filter = p->filter = gtr_filter_bar_new (gtr_core_session (core), gtr_core_model (core), &p->filter_model); gtk_container_set_border_width (GTK_CONTAINER (w), GUI_PAD_SMALL); /* status menu */ menu = p->status_menu = gtk_menu_new (); l = NULL; pch = gtr_pref_string_get (TR_KEY_statusbar_stats); for (i=0, n=G_N_ELEMENTS (stats_modes); istatus = gtk_grid_new (); grid = GTK_GRID (grid_w); gtk_container_set_border_width (GTK_CONTAINER (grid), GUI_PAD_SMALL); /* gear */ w = gtk_button_new (); gtk_container_add (GTK_CONTAINER (w), gtk_image_new_from_stock ("utilities", -1)); gtk_widget_set_tooltip_text (w, _("Options")); gtk_grid_attach_next_to (grid, w, sibling, GTK_POS_RIGHT, 1, 1); gtk_button_set_relief (GTK_BUTTON (w), GTK_RELIEF_NONE); p->options_menu = createOptionsMenu (p); g_signal_connect (w, "clicked", G_CALLBACK (onOptionsClicked), p); sibling = w; /* turtle */ p->alt_speed_image = gtk_image_new (); w = p->alt_speed_button = gtk_toggle_button_new (); gtk_button_set_image (GTK_BUTTON (w), p->alt_speed_image); gtk_button_set_relief (GTK_BUTTON (w), GTK_RELIEF_NONE); g_signal_connect (w, "toggled", G_CALLBACK (alt_speed_toggled_cb), p); gtk_grid_attach_next_to (grid, w, sibling, GTK_POS_RIGHT, 1, 1); sibling = w; /* spacer */ w = gtk_alignment_new (0.0f, 0.0f, 0.0f, 0.0f); gtk_widget_set_hexpand (w, TRUE); gtk_grid_attach_next_to (grid, w, sibling, GTK_POS_RIGHT, 1, 1); sibling = w; /* download */ w = dl_lb = gtk_label_new (NULL); p->dl_lb = GTK_LABEL (w); gtk_label_set_single_line_mode (p->dl_lb, TRUE); gtk_grid_attach_next_to (grid, w, sibling, GTK_POS_RIGHT, 1, 1); sibling = w; /* upload */ w = ul_lb = gtk_label_new (NULL); g_object_set (G_OBJECT(w), "margin-left", GUI_PAD, NULL); p->ul_lb = GTK_LABEL (w); gtk_label_set_single_line_mode (p->ul_lb, TRUE); gtk_grid_attach_next_to (grid, w, sibling, GTK_POS_RIGHT, 1, 1); sibling = w; /* ratio */ w = gtk_label_new (NULL); g_object_set (G_OBJECT(w), "margin-left", GUI_PAD_BIG, NULL); p->stats_lb = GTK_LABEL (w); gtk_label_set_single_line_mode (p->stats_lb, TRUE); gtk_grid_attach_next_to (grid, w, sibling, GTK_POS_RIGHT, 1, 1); sibling = w; w = gtk_button_new (); gtk_widget_set_tooltip_text (w, _("Statistics")); gtk_container_add (GTK_CONTAINER (w), gtk_image_new_from_stock ("ratio", -1)); gtk_button_set_relief (GTK_BUTTON (w), GTK_RELIEF_NONE); g_signal_connect (w, "clicked", G_CALLBACK (onYinYangReleased), p); gtk_grid_attach_next_to (grid, w, sibling, GTK_POS_RIGHT, 1, 1); sibling = w; /* workarea */ p->view = makeview (p); w = list = p->scroll = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (w), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (w), GTK_SHADOW_OUT); gtk_style_context_add_class (gtk_widget_get_style_context (w), "tr-workarea"); gtk_container_add (GTK_CONTAINER (w), p->view); /* lay out the widgets */ gtk_box_pack_start (GTK_BOX (vbox), mainmenu, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), toolbar, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), filter, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), list, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox), status, FALSE, FALSE, 0); { /* this is to determine the maximum width/height for the label */ int w=0, h=0; PangoLayout * pango_layout; pango_layout = gtk_widget_create_pango_layout (ul_lb, "999.99 kB/s"); pango_layout_get_pixel_size (pango_layout, &w, &h); gtk_widget_set_size_request (ul_lb, w, h); gtk_widget_set_size_request (dl_lb, w, h); gtk_misc_set_alignment (GTK_MISC (ul_lb), 1.0, 0.5); gtk_misc_set_alignment (GTK_MISC (dl_lb), 1.0, 0.5); g_object_unref (G_OBJECT (pango_layout)); } /* show all but the window */ gtk_widget_show_all (vbox); /* listen for prefs changes that affect the window */ p->core = core; prefsChanged (core, TR_KEY_compact_view, self); prefsChanged (core, TR_KEY_show_filterbar, self); prefsChanged (core, TR_KEY_show_statusbar, self); prefsChanged (core, TR_KEY_statusbar_stats, self); prefsChanged (core, TR_KEY_show_toolbar, self); prefsChanged (core, TR_KEY_alt_speed_enabled, self); p->pref_handler_id = g_signal_connect (core, "prefs-changed", G_CALLBACK (prefsChanged), self); tr_sessionSetAltSpeedFunc (gtr_core_session (core), onAltSpeedToggled, p); gtr_window_refresh (GTK_WINDOW(self)); return self; } static void updateStats (PrivateData * p) { const char * pch; char up[32]; char down[32]; char ratio[32]; char buf[512]; struct tr_session_stats stats; tr_session * session = gtr_core_session (p->core); /* update the stats */ pch = gtr_pref_string_get (TR_KEY_statusbar_stats); if (!g_strcmp0 (pch, "session-ratio")) { tr_sessionGetStats (session, &stats); tr_strlratio (ratio, stats.ratio, sizeof (ratio)); g_snprintf (buf, sizeof (buf), _("Ratio: %s"), ratio); } else if (!g_strcmp0 (pch, "session-transfer")) { tr_sessionGetStats (session, &stats); tr_strlsize (up, stats.uploadedBytes, sizeof (up)); tr_strlsize (down, stats.downloadedBytes, sizeof (down)); /* Translators: "size|" is here for disambiguation. Please remove it from your translation. %1$s is the size of the data we've downloaded %2$s is the size of the data we've uploaded */ g_snprintf (buf, sizeof (buf), Q_("Down: %1$s, Up: %2$s"), down, up); } else if (!g_strcmp0 (pch, "total-transfer")) { tr_sessionGetCumulativeStats (session, &stats); tr_strlsize (up, stats.uploadedBytes, sizeof (up)); tr_strlsize (down, stats.downloadedBytes, sizeof (down)); /* Translators: "size|" is here for disambiguation. Please remove it from your translation. %1$s is the size of the data we've downloaded %2$s is the size of the data we've uploaded */ g_snprintf (buf, sizeof (buf), Q_( "size|Down: %1$s, Up: %2$s"), down, up); } else /* default is total-ratio */ { tr_sessionGetCumulativeStats (session, &stats); tr_strlratio (ratio, stats.ratio, sizeof (ratio)); g_snprintf (buf, sizeof (buf), _("Ratio: %s"), ratio); } gtr_label_set_text (p->stats_lb, buf); } static void updateSpeeds (PrivateData * p) { tr_session * session = gtr_core_session (p->core); if (session != NULL) { char text_str[256]; char speed_str[128]; double upSpeed = 0; double downSpeed = 0; int upCount = 0; int downCount = 0; GtkTreeIter iter; GtkTreeModel * model = gtr_core_model (p->core); if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) do { int uc, dc; double us, ds; gtk_tree_model_get (model, &iter, MC_SPEED_UP, &us, MC_SPEED_DOWN, &ds, MC_ACTIVE_PEERS_UP, &uc, MC_ACTIVE_PEERS_DOWN, &dc, -1); upSpeed += us; upCount += uc; downSpeed += ds; downCount += dc; } while (gtk_tree_model_iter_next (model, &iter)); tr_formatter_speed_KBps (speed_str, downSpeed, sizeof (speed_str)); g_snprintf (text_str, sizeof(text_str), "%s %s", speed_str, gtr_get_unicode_string (GTR_UNICODE_DOWN)); gtr_label_set_text (p->dl_lb, text_str); gtk_widget_set_visible (GTK_WIDGET (p->dl_lb), (downCount>0)); tr_formatter_speed_KBps (speed_str, upSpeed, sizeof (speed_str)); g_snprintf (text_str, sizeof(text_str), "%s %s", speed_str, gtr_get_unicode_string (GTR_UNICODE_UP)); gtr_label_set_text (p->ul_lb, text_str); gtk_widget_set_visible (GTK_WIDGET (p->ul_lb), ((downCount>0) || (upCount>0))); } } void gtr_window_refresh (GtkWindow * self) { PrivateData * p = get_private_data (self); if (p && p->core && gtr_core_session (p->core)) { updateSpeeds (p); updateStats (p); } } GtkTreeSelection* gtr_window_get_selection (GtkWindow * w) { return get_private_data (w)->selection; } void gtr_window_set_busy (GtkWindow * win, gboolean isBusy) { GtkWidget * w = GTK_WIDGET (win); if (w && gtk_widget_get_realized (w)) { GdkDisplay * display = gtk_widget_get_display (w); GdkCursor * cursor = isBusy ? gdk_cursor_new_for_display (display, GDK_WATCH) : NULL; gdk_window_set_cursor (gtk_widget_get_window (w), cursor); gdk_display_flush (display); g_clear_object (&cursor); } } transmission-2.92/gtk/PaxHeaders.4960/main.c0000644000000000000000000000013212664476420015546 xustar0030 mtime=1456635152.021496953 30 atime=1456635152.021496953 30 ctime=1457295921.079826266 transmission-2.92/gtk/main.c0000644000175000017500000014410612664476420017201 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: main.c 14689 2016-02-27 23:18:02Z mikedld $ * * Copyright (c) Transmission authors and contributors * * 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. *****************************************************************************/ #include #include #include #include #include /* exit () */ #include #include #include #include #include #include #include #include #include #include "actions.h" #include "conf.h" #include "details.h" #include "dialogs.h" #include "hig.h" #include "makemeta-ui.h" #include "msgwin.h" #include "notify.h" #include "open-dialog.h" #include "relocate.h" #include "stats.h" #include "tr-core.h" #include "tr-icon.h" #include "tr-prefs.h" #include "tr-window.h" #include "util.h" #define MY_CONFIG_NAME "transmission" #define MY_READABLE_NAME "transmission-gtk" #define SHOW_LICENSE static const char * LICENSE = "Copyright 2005-2016. All code is copyrighted by the respective authors.\n" "\n" "Transmission can be redistributed and/or modified under the terms of the " "GNU GPL versions 2 or 3 or by any future license endorsed by Mnemosyne LLC.\n" "\n" "In addition, linking to and/or using OpenSSL is allowed.\n" "\n" "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.\n" "\n" "Some of Transmission's source files have more permissive licenses. " "Those files may, of course, be used on their own under their own terms.\n"; struct cbdata { char * config_dir; gboolean start_paused; gboolean is_iconified; gboolean is_closing; guint activation_count; guint timer; guint update_model_soon_tag; guint refresh_actions_tag; gpointer icon; GtkWindow * wind; TrCore * core; GtkWidget * msgwin; GtkWidget * prefs; GSList * error_list; GSList * duplicates_list; GSList * details; GtkTreeSelection * sel; }; static void gtr_window_present (GtkWindow * window) { gtk_window_present_with_time (window, gtk_get_current_event_time ()); } /*** **** **** DETAILS DIALOGS MANAGEMENT **** ***/ static int compare_integers (gconstpointer a, gconstpointer b) { return GPOINTER_TO_INT (a) - GPOINTER_TO_INT (b); } static char* get_details_dialog_key (GSList * id_list) { GSList * l; GSList * tmp = g_slist_sort (g_slist_copy (id_list), compare_integers); GString * gstr = g_string_new (NULL); for (l=tmp; l!=NULL; l=l->next) g_string_append_printf (gstr, "%d ", GPOINTER_TO_INT (l->data)); g_slist_free (tmp); return g_string_free (gstr, FALSE); } static void get_selected_torrent_ids_foreach (GtkTreeModel * model, GtkTreePath * p UNUSED, GtkTreeIter * iter, gpointer gdata) { int id; GSList ** ids = gdata; gtk_tree_model_get (model, iter, MC_TORRENT_ID, &id, -1); *ids = g_slist_append (*ids, GINT_TO_POINTER (id)); } static GSList* get_selected_torrent_ids (struct cbdata * data) { GSList * ids = NULL; gtk_tree_selection_selected_foreach (data->sel, get_selected_torrent_ids_foreach, &ids); return ids; } static void on_details_dialog_closed (gpointer gdata, GObject * dead) { struct cbdata * data = gdata; data->details = g_slist_remove (data->details, dead); } static void show_details_dialog_for_selected_torrents (struct cbdata * data) { GtkWidget * dialog = NULL; GSList * l; GSList * ids = get_selected_torrent_ids (data); char * key = get_details_dialog_key (ids); for (l=data->details; dialog==NULL && l!=NULL; l=l->next) if (!g_strcmp0 (key, g_object_get_data (l->data, "key"))) dialog = l->data; if (dialog == NULL) { dialog = gtr_torrent_details_dialog_new (GTK_WINDOW (data->wind), data->core); gtr_torrent_details_dialog_set_torrents (dialog, ids); g_object_set_data_full (G_OBJECT (dialog), "key", g_strdup (key), g_free); g_object_weak_ref (G_OBJECT (dialog), on_details_dialog_closed, data); data->details = g_slist_append (data->details, dialog); gtk_widget_show (dialog); } gtr_window_present (GTK_WINDOW (dialog)); g_free (key); g_slist_free (ids); } /**** ***** ***** ON SELECTION CHANGED ***** ****/ struct counts_data { int total_count; int queued_count; int stopped_count; }; static void get_selected_torrent_counts_foreach (GtkTreeModel * model, GtkTreePath * path UNUSED, GtkTreeIter * iter, gpointer user_data) { int activity = 0; struct counts_data * counts = user_data; ++counts->total_count; gtk_tree_model_get (model, iter, MC_ACTIVITY, &activity, -1); if ((activity == TR_STATUS_DOWNLOAD_WAIT) || (activity == TR_STATUS_SEED_WAIT)) ++counts->queued_count; if (activity == TR_STATUS_STOPPED) ++counts->stopped_count; } static void get_selected_torrent_counts (struct cbdata * data, struct counts_data * counts) { counts->total_count = 0; counts->queued_count = 0; counts->stopped_count = 0; gtk_tree_selection_selected_foreach (data->sel, get_selected_torrent_counts_foreach, counts); } static void count_updatable_foreach (GtkTreeModel * model, GtkTreePath * path UNUSED, GtkTreeIter * iter, gpointer accumulated_status) { tr_torrent * tor; gtk_tree_model_get (model, iter, MC_TORRENT, &tor, -1); *(int*)accumulated_status |= tr_torrentCanManualUpdate (tor); } static gboolean refresh_actions (gpointer gdata) { struct cbdata * data = gdata; if (!data->is_closing) { int canUpdate; struct counts_data sel_counts; const size_t total = gtr_core_get_torrent_count (data->core); const size_t active = gtr_core_get_active_torrent_count (data->core); const int torrent_count = gtk_tree_model_iter_n_children (gtr_core_model (data->core), NULL); bool has_selection; get_selected_torrent_counts (data, &sel_counts); has_selection = sel_counts.total_count > 0; gtr_action_set_sensitive ("select-all", torrent_count != 0); gtr_action_set_sensitive ("deselect-all", torrent_count != 0); gtr_action_set_sensitive ("pause-all-torrents", active != 0); gtr_action_set_sensitive ("start-all-torrents", active != total); gtr_action_set_sensitive ("torrent-stop", (sel_counts.stopped_count < sel_counts.total_count)); gtr_action_set_sensitive ("torrent-start", (sel_counts.stopped_count) > 0); gtr_action_set_sensitive ("torrent-start-now", (sel_counts.stopped_count + sel_counts.queued_count) > 0); gtr_action_set_sensitive ("torrent-verify", has_selection); gtr_action_set_sensitive ("remove-torrent", has_selection); gtr_action_set_sensitive ("delete-torrent", has_selection); gtr_action_set_sensitive ("relocate-torrent", has_selection); gtr_action_set_sensitive ("queue-move-top", has_selection); gtr_action_set_sensitive ("queue-move-up", has_selection); gtr_action_set_sensitive ("queue-move-down", has_selection); gtr_action_set_sensitive ("queue-move-bottom", has_selection); gtr_action_set_sensitive ("show-torrent-properties", has_selection); gtr_action_set_sensitive ("open-torrent-folder", sel_counts.total_count == 1); gtr_action_set_sensitive ("copy-magnet-link-to-clipboard", sel_counts.total_count == 1); canUpdate = 0; gtk_tree_selection_selected_foreach (data->sel, count_updatable_foreach, &canUpdate); gtr_action_set_sensitive ("torrent-reannounce", canUpdate != 0); } data->refresh_actions_tag = 0; return G_SOURCE_REMOVE; } static void refresh_actions_soon (gpointer gdata) { struct cbdata * data = gdata; if (!data->is_closing && !data->refresh_actions_tag) data->refresh_actions_tag = gdk_threads_add_idle (refresh_actions, data); } static void on_selection_changed (GtkTreeSelection * s UNUSED, gpointer gdata) { refresh_actions_soon (gdata); } /*** **** ***/ static gboolean has_magnet_link_handler (void) { GAppInfo * app_info = g_app_info_get_default_for_uri_scheme ("magnet"); const gboolean has_handler = app_info != NULL; g_clear_object (&app_info); return has_handler; } static void register_magnet_link_handler (void) { GError * error; GAppInfo * app; const char * const content_type = "x-scheme-handler/magnet"; error = NULL; app = g_app_info_create_from_commandline ("transmission-gtk", "transmission-gtk", G_APP_INFO_CREATE_SUPPORTS_URIS, &error); g_app_info_set_as_default_for_type (app, content_type, &error); if (error != NULL) { g_warning (_("Error registering Transmission as a %s handler: %s"), content_type, error->message); g_error_free (error); } g_clear_object (&app); } static void ensure_magnet_handler_exists (void) { if (!has_magnet_link_handler ()) register_magnet_link_handler (); } static void on_main_window_size_allocated (GtkWidget * gtk_window, GtkAllocation * alloc UNUSED, gpointer gdata UNUSED) { GdkWindow * gdk_window = gtk_widget_get_window (gtk_window); const gboolean isMaximized = (gdk_window != NULL) && (gdk_window_get_state (gdk_window) & GDK_WINDOW_STATE_MAXIMIZED); gtr_pref_int_set (TR_KEY_main_window_is_maximized, isMaximized); if (!isMaximized) { int x, y, w, h; gtk_window_get_position (GTK_WINDOW (gtk_window), &x, &y); gtk_window_get_size (GTK_WINDOW (gtk_window), &w, &h); gtr_pref_int_set (TR_KEY_main_window_x, x); gtr_pref_int_set (TR_KEY_main_window_y, y); gtr_pref_int_set (TR_KEY_main_window_width, w); gtr_pref_int_set (TR_KEY_main_window_height, h); } } /*** **** listen to changes that come from RPC ***/ struct on_rpc_changed_struct { TrCore * core; tr_rpc_callback_type type; int torrent_id; }; static gboolean on_rpc_changed_idle (gpointer gdata) { tr_torrent * tor; struct on_rpc_changed_struct * data = gdata; switch (data->type) { case TR_RPC_SESSION_CLOSE: gtr_action_activate ("quit"); break; case TR_RPC_TORRENT_ADDED: if ((tor = gtr_core_find_torrent (data->core, data->torrent_id))) gtr_core_add_torrent (data->core, tor, true); break; case TR_RPC_TORRENT_REMOVING: gtr_core_remove_torrent (data->core, data->torrent_id, false); break; case TR_RPC_TORRENT_TRASHING: gtr_core_remove_torrent (data->core, data->torrent_id, true); break; case TR_RPC_SESSION_CHANGED: { int i; tr_variant tmp; tr_variant * newval; tr_variant * oldvals = gtr_pref_get_all (); tr_quark key; GSList * l; GSList * changed_keys = NULL; tr_session * session = gtr_core_session (data->core); tr_variantInitDict (&tmp, 100); tr_sessionGetSettings (session, &tmp); for (i=0; tr_variantDictChild (&tmp, i, &key, &newval); ++i) { bool changed; tr_variant * oldval = tr_variantDictFind (oldvals, key); if (!oldval) { changed = true; } else { char * a = tr_variantToStr (oldval, TR_VARIANT_FMT_BENC, NULL); char * b = tr_variantToStr (newval, TR_VARIANT_FMT_BENC, NULL); changed = g_strcmp0 (a, b) != 0; tr_free (b); tr_free (a); } if (changed) changed_keys = g_slist_append (changed_keys, GINT_TO_POINTER(key)); } tr_sessionGetSettings (session, oldvals); for (l=changed_keys; l!=NULL; l=l->next) gtr_core_pref_changed (data->core, GPOINTER_TO_INT(l->data)); g_slist_free (changed_keys); tr_variantFree (&tmp); break; } case TR_RPC_TORRENT_CHANGED: case TR_RPC_TORRENT_MOVED: case TR_RPC_TORRENT_STARTED: case TR_RPC_TORRENT_STOPPED: case TR_RPC_SESSION_QUEUE_POSITIONS_CHANGED: /* nothing interesting to do here */ break; } g_free (data); return G_SOURCE_REMOVE; } static tr_rpc_callback_status on_rpc_changed (tr_session * session G_GNUC_UNUSED, tr_rpc_callback_type type, struct tr_torrent * tor, void * gdata) { struct cbdata * cbdata = gdata; struct on_rpc_changed_struct * data; data = g_new (struct on_rpc_changed_struct, 1); data->core = cbdata->core; data->type = type; data->torrent_id = tr_torrentId (tor); gdk_threads_add_idle (on_rpc_changed_idle, data); return TR_RPC_NOREMOVE; } /*** **** signal handling ***/ static sig_atomic_t global_sigcount = 0; static struct cbdata * sighandler_cbdata = NULL; static void signal_handler (int sig) { if (++global_sigcount > 1) { signal (sig, SIG_DFL); raise (sig); } else if ((sig == SIGINT) || (sig == SIGTERM)) { g_message (_("Got signal %d; trying to shut down cleanly. Do it again if it gets stuck."), sig); gtr_actions_handler ("quit", sighandler_cbdata); } } /**** ***** ***** ****/ static void app_setup (GtkWindow * wind, struct cbdata * cbdata); static void on_startup (GApplication * application, gpointer user_data) { GError * error; const char * str; GtkWindow * win; GtkUIManager * ui_manager; tr_session * session; struct cbdata * cbdata = user_data; signal (SIGINT, signal_handler); signal (SIGTERM, signal_handler); sighandler_cbdata = cbdata; /* ensure the directories are created */ if ((str = gtr_pref_string_get (TR_KEY_download_dir))) g_mkdir_with_parents (str, 0777); if ((str = gtr_pref_string_get (TR_KEY_incomplete_dir))) g_mkdir_with_parents (str, 0777); /* initialize the libtransmission session */ session = tr_sessionInit (cbdata->config_dir, TRUE, gtr_pref_get_all ()); gtr_pref_flag_set (TR_KEY_alt_speed_enabled, tr_sessionUsesAltSpeed (session)); gtr_pref_int_set (TR_KEY_peer_port, tr_sessionGetPeerPort (session)); cbdata->core = gtr_core_new (session); /* init the ui manager */ error = NULL; ui_manager = gtk_ui_manager_new (); gtr_actions_init (ui_manager, cbdata); gtk_ui_manager_add_ui_from_resource (ui_manager, TR_RESOURCE_PATH "transmission-ui.xml", &error); g_assert_no_error (error); gtk_ui_manager_ensure_update (ui_manager); /* create main window now to be a parent to any error dialogs */ win = GTK_WINDOW (gtr_window_new (GTK_APPLICATION (application), ui_manager, cbdata->core)); g_signal_connect (win, "size-allocate", G_CALLBACK (on_main_window_size_allocated), cbdata); g_application_hold (application); g_object_weak_ref (G_OBJECT (win), (GWeakNotify)g_application_release, application); app_setup (win, cbdata); tr_sessionSetRPCCallback (session, on_rpc_changed, cbdata); /* check & see if it's time to update the blocklist */ if (gtr_pref_flag_get (TR_KEY_blocklist_enabled)) { if (gtr_pref_flag_get (TR_KEY_blocklist_updates_enabled)) { const int64_t last_time = gtr_pref_int_get (TR_KEY_blocklist_date); const int SECONDS_IN_A_WEEK = 7 * 24 * 60 * 60; const time_t now = time (NULL); if (last_time + SECONDS_IN_A_WEEK < now) gtr_core_blocklist_update (cbdata->core); } } /* if there's no magnet link handler registered, register us */ ensure_magnet_handler_exists (); } static void on_activate (GApplication * app UNUSED, struct cbdata * cbdata) { cbdata->activation_count++; /* GApplication emits an 'activate' signal when bootstrapping the primary. * Ordinarily we handle that by presenting the main window, but if the user * user started Transmission minimized, ignore that initial signal... */ if (cbdata->is_iconified && (cbdata->activation_count == 1)) return; gtr_action_activate ("present-main-window"); } static void open_files (GSList * files, gpointer gdata) { struct cbdata * cbdata = gdata; const gboolean do_start = gtr_pref_flag_get (TR_KEY_start_added_torrents) && !cbdata->start_paused; const gboolean do_prompt = gtr_pref_flag_get (TR_KEY_show_options_window); const gboolean do_notify = TRUE; gtr_core_add_files (cbdata->core, files, do_start, do_prompt, do_notify); } static void on_open (GApplication * application UNUSED, GFile ** f, gint file_count, gchar * hint UNUSED, gpointer gdata) { int i; GSList * files = NULL; for (i=0; imessage, argv[0]); g_error_free (error); g_option_context_free (option_context); return 1; } g_option_context_free (option_context); /* handle the trivial "version" option */ if (show_version) { fprintf (stderr, "%s %s\n", MY_READABLE_NAME, LONG_VERSION_STRING); return 0; } gtk_window_set_default_icon_name (MY_CONFIG_NAME); /* init the unit formatters */ tr_formatter_mem_init (mem_K, _ (mem_K_str), _ (mem_M_str), _ (mem_G_str), _ (mem_T_str)); tr_formatter_size_init (disk_K, _ (disk_K_str), _ (disk_M_str), _ (disk_G_str), _ (disk_T_str)); tr_formatter_speed_init (speed_K, _ (speed_K_str), _ (speed_M_str), _ (speed_G_str), _ (speed_T_str)); /* set up the config dir */ gtr_pref_init (cbdata.config_dir); g_mkdir_with_parents (cbdata.config_dir, 0755); /* init notifications */ gtr_notify_init (); /* init the application for the specified config dir */ stat (cbdata.config_dir, &sb); application_id = g_strdup_printf ("com.transmissionbt.transmission_%lu_%lu", (unsigned long)sb.st_dev, (unsigned long)sb.st_ino); app = gtk_application_new (application_id, G_APPLICATION_HANDLES_OPEN); g_signal_connect (app, "open", G_CALLBACK (on_open), &cbdata); g_signal_connect (app, "startup", G_CALLBACK (on_startup), &cbdata); g_signal_connect (app, "activate", G_CALLBACK (on_activate), &cbdata); ret = g_application_run (G_APPLICATION (app), argc, argv); g_object_unref (app); g_free (application_id); return ret; } static void on_core_busy (TrCore * core UNUSED, gboolean busy, struct cbdata * c) { gtr_window_set_busy (c->wind, busy); } static void on_core_error (TrCore *, guint, const char *, struct cbdata *); static void on_add_torrent (TrCore *, tr_ctor *, gpointer); static void on_prefs_changed (TrCore * core, const tr_quark key, gpointer); static void main_window_setup (struct cbdata * cbdata, GtkWindow * wind); static gboolean update_model_loop (gpointer gdata); static gboolean update_model_once (gpointer gdata); static void app_setup (GtkWindow * wind, struct cbdata * cbdata) { if (cbdata->is_iconified) gtr_pref_flag_set (TR_KEY_show_notification_area_icon, TRUE); gtr_actions_set_core (cbdata->core); /* set up core handlers */ g_signal_connect (cbdata->core, "busy", G_CALLBACK (on_core_busy), cbdata); g_signal_connect (cbdata->core, "add-error", G_CALLBACK (on_core_error), cbdata); g_signal_connect (cbdata->core, "add-prompt", G_CALLBACK (on_add_torrent), cbdata); g_signal_connect (cbdata->core, "prefs-changed", G_CALLBACK (on_prefs_changed), cbdata); /* add torrents from command-line and saved state */ gtr_core_load (cbdata->core, cbdata->start_paused); gtr_core_torrents_added (cbdata->core); /* set up main window */ main_window_setup (cbdata, wind); /* set up the icon */ on_prefs_changed (cbdata->core, TR_KEY_show_notification_area_icon, cbdata); /* start model update timer */ cbdata->timer = gdk_threads_add_timeout_seconds (MAIN_WINDOW_REFRESH_INTERVAL_SECONDS, update_model_loop, cbdata); update_model_once (cbdata); /* either show the window or iconify it */ if (!cbdata->is_iconified) { gtk_widget_show (GTK_WIDGET (wind)); } else { gtk_window_set_skip_taskbar_hint (cbdata->wind, cbdata->icon != NULL); cbdata->is_iconified = FALSE; // ensure that the next toggle iconifies gtr_action_set_toggled ("toggle-main-window", FALSE); } if (!gtr_pref_flag_get (TR_KEY_user_has_given_informed_consent)) { GtkWidget * w = gtk_message_dialog_new (GTK_WINDOW (wind), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_OTHER, GTK_BUTTONS_NONE, "%s", _("Transmission is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility.")); gtk_dialog_add_button (GTK_DIALOG (w), GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT); gtk_dialog_add_button (GTK_DIALOG (w), _("I _Agree"), GTK_RESPONSE_ACCEPT); gtk_dialog_set_default_response (GTK_DIALOG (w), GTK_RESPONSE_ACCEPT); switch (gtk_dialog_run (GTK_DIALOG (w))) { case GTK_RESPONSE_ACCEPT: /* only show it once */ gtr_pref_flag_set (TR_KEY_user_has_given_informed_consent, TRUE); gtk_widget_destroy (w); break; default: exit (0); } } } static void presentMainWindow (struct cbdata * cbdata) { GtkWindow * window = cbdata->wind; if (cbdata->is_iconified) { cbdata->is_iconified = false; gtk_window_set_skip_taskbar_hint (window, FALSE); } if (!gtk_widget_get_visible (GTK_WIDGET (window))) { gtk_window_resize (window, gtr_pref_int_get (TR_KEY_main_window_width), gtr_pref_int_get (TR_KEY_main_window_height)); gtk_window_move (window, gtr_pref_int_get (TR_KEY_main_window_x), gtr_pref_int_get (TR_KEY_main_window_y)); gtr_widget_set_visible (GTK_WIDGET (window), TRUE); } gtr_window_present (window); gdk_window_raise (gtk_widget_get_window (GTK_WIDGET(window))); } static void hideMainWindow (struct cbdata * cbdata) { GtkWindow * window = cbdata->wind; gtk_window_set_skip_taskbar_hint (window, TRUE); gtr_widget_set_visible (GTK_WIDGET (window), FALSE); cbdata->is_iconified = true; } static void toggleMainWindow (struct cbdata * cbdata) { if (cbdata->is_iconified) presentMainWindow (cbdata); else hideMainWindow (cbdata); } static void on_app_exit (gpointer vdata); static gboolean winclose (GtkWidget * w UNUSED, GdkEvent * event UNUSED, gpointer gdata) { struct cbdata * cbdata = gdata; if (cbdata->icon != NULL) gtr_action_activate ("toggle-main-window"); else on_app_exit (cbdata); return TRUE; /* don't propagate event further */ } static void rowChangedCB (GtkTreeModel * model UNUSED, GtkTreePath * path, GtkTreeIter * iter UNUSED, gpointer gdata) { struct cbdata * data = gdata; if (gtk_tree_selection_path_is_selected (data->sel, path)) refresh_actions_soon (data); } static void on_drag_data_received (GtkWidget * widget UNUSED, GdkDragContext * drag_context, gint x UNUSED, gint y UNUSED, GtkSelectionData * selection_data, guint info UNUSED, guint time_, gpointer gdata) { guint i; char ** uris = gtk_selection_data_get_uris (selection_data); const guint file_count = g_strv_length (uris); GSList * files = NULL; for (i=0; iwind); cbdata->wind = wind; cbdata->sel = sel = GTK_TREE_SELECTION (gtr_window_get_selection (cbdata->wind)); g_signal_connect (sel, "changed", G_CALLBACK (on_selection_changed), cbdata); on_selection_changed (sel, cbdata); model = gtr_core_model (cbdata->core); g_signal_connect (model, "row-changed", G_CALLBACK (rowChangedCB), cbdata); g_signal_connect (wind, "delete-event", G_CALLBACK (winclose), cbdata); refresh_actions (cbdata); /* register to handle URIs that get dragged onto our main window */ w = GTK_WIDGET (wind); gtk_drag_dest_set (w, GTK_DEST_DEFAULT_ALL, NULL, 0, GDK_ACTION_COPY); gtk_drag_dest_add_uri_targets (w); g_signal_connect (w, "drag-data-received", G_CALLBACK (on_drag_data_received), cbdata); } static gboolean on_session_closed (gpointer gdata) { GSList * tmp; struct cbdata * cbdata = gdata; tmp = g_slist_copy (cbdata->details); g_slist_foreach (tmp, (GFunc)gtk_widget_destroy, NULL); g_slist_free (tmp); if (cbdata->prefs) gtk_widget_destroy (GTK_WIDGET (cbdata->prefs)); if (cbdata->wind) gtk_widget_destroy (GTK_WIDGET (cbdata->wind)); g_object_unref (cbdata->core); if (cbdata->icon) g_object_unref (cbdata->icon); g_slist_foreach (cbdata->error_list, (GFunc)g_free, NULL); g_slist_free (cbdata->error_list); g_slist_foreach (cbdata->duplicates_list, (GFunc)g_free, NULL); g_slist_free (cbdata->duplicates_list); return G_SOURCE_REMOVE; } struct session_close_struct { tr_session * session; struct cbdata * cbdata; }; /* since tr_sessionClose () is a blocking function, * delegate its call to another thread here... when it's done, * punt the GUI teardown back to the GTK+ thread */ static gpointer session_close_threadfunc (gpointer gdata) { struct session_close_struct * data = gdata; tr_sessionClose (data->session); gdk_threads_add_idle (on_session_closed, data->cbdata); g_free (data); return NULL; } static void exit_now_cb (GtkWidget *w UNUSED, gpointer data UNUSED) { exit (0); } static void on_app_exit (gpointer vdata) { GtkWidget *r, *p, *b, *w, *c; struct cbdata * cbdata = vdata; struct session_close_struct * session_close_data; if (cbdata->is_closing) return; cbdata->is_closing = true; /* stop the update timer */ if (cbdata->timer) { g_source_remove (cbdata->timer); cbdata->timer = 0; } /* stop the refresh-actions timer */ if (cbdata->refresh_actions_tag) { g_source_remove (cbdata->refresh_actions_tag); cbdata->refresh_actions_tag = 0; } c = GTK_WIDGET (cbdata->wind); gtk_container_remove (GTK_CONTAINER (c), gtk_bin_get_child (GTK_BIN (c))); r = gtk_alignment_new (0.5, 0.5, 0.01, 0.01); gtk_container_add (GTK_CONTAINER (c), r); p = gtk_grid_new (); gtk_grid_set_column_spacing (GTK_GRID (p), GUI_PAD_BIG); gtk_container_add (GTK_CONTAINER (r), p); w = gtk_image_new_from_stock (GTK_STOCK_NETWORK, GTK_ICON_SIZE_DIALOG); gtk_grid_attach (GTK_GRID (p), w, 0, 0, 1, 2); w = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (w), _("Closing Connections")); gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5); gtk_grid_attach (GTK_GRID (p), w, 1, 0, 1, 1); w = gtk_label_new (_("Sending upload/download totals to tracker…")); gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5); gtk_grid_attach (GTK_GRID (p), w, 1, 1, 1, 1); b = gtk_alignment_new (0.0, 1.0, 0.01, 0.01); w = gtk_button_new_with_mnemonic (_("_Quit Now")); g_signal_connect (w, "clicked", G_CALLBACK (exit_now_cb), NULL); gtk_container_add (GTK_CONTAINER (b), w); gtk_grid_attach (GTK_GRID (p), b, 1, 2, 1, 1); gtk_widget_show_all (r); gtk_widget_grab_focus (w); /* clear the UI */ gtr_core_clear (cbdata->core); /* ensure the window is in its previous position & size. * this seems to be necessary because changing the main window's * child seems to unset the size */ gtk_window_resize (cbdata->wind, gtr_pref_int_get (TR_KEY_main_window_width), gtr_pref_int_get (TR_KEY_main_window_height)); gtk_window_move (cbdata->wind, gtr_pref_int_get (TR_KEY_main_window_x), gtr_pref_int_get (TR_KEY_main_window_y)); /* shut down libT */ session_close_data = g_new (struct session_close_struct, 1); session_close_data->cbdata = cbdata; session_close_data->session = gtr_core_close (cbdata->core); g_thread_new ("shutdown-thread", session_close_threadfunc, session_close_data); } static void show_torrent_errors (GtkWindow * window, const char * primary, GSList ** files) { GSList * l; GtkWidget * w; GString * s = g_string_new (NULL); const char * leader = g_slist_length (*files) > 1 ? gtr_get_unicode_string (GTR_UNICODE_BULLET) : ""; for (l=*files; l!=NULL; l=l->next) g_string_append_printf (s, "%s %s\n", leader, (const char*)l->data); w = gtk_message_dialog_new (window, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", primary); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), "%s", s->str); g_signal_connect_swapped (w, "response", G_CALLBACK (gtk_widget_destroy), w); gtk_widget_show (w); g_string_free (s, TRUE); g_slist_foreach (*files, (GFunc)g_free, NULL); g_slist_free (*files); *files = NULL; } static void flush_torrent_errors (struct cbdata * cbdata) { if (cbdata->error_list) show_torrent_errors (cbdata->wind, ngettext ("Couldn't add corrupt torrent", "Couldn't add corrupt torrents", g_slist_length (cbdata->error_list)), &cbdata->error_list); if (cbdata->duplicates_list) show_torrent_errors (cbdata->wind, ngettext ("Couldn't add duplicate torrent", "Couldn't add duplicate torrents", g_slist_length (cbdata->duplicates_list)), &cbdata->duplicates_list); } static void on_core_error (TrCore * core UNUSED, guint code, const char * msg, struct cbdata * c) { switch (code) { case TR_PARSE_ERR: c->error_list = g_slist_append (c->error_list, g_path_get_basename (msg)); break; case TR_PARSE_DUPLICATE: c->duplicates_list = g_slist_append (c->duplicates_list, g_strdup (msg)); break; case TR_CORE_ERR_NO_MORE_TORRENTS: flush_torrent_errors (c); break; default: g_assert_not_reached (); break; } } static gboolean on_main_window_focus_in (GtkWidget * widget UNUSED, GdkEventFocus * event UNUSED, gpointer gdata) { struct cbdata * cbdata = gdata; if (cbdata->wind) gtk_window_set_urgency_hint (cbdata->wind, FALSE); return FALSE; } static void on_add_torrent (TrCore * core, tr_ctor * ctor, gpointer gdata) { struct cbdata * cbdata = gdata; GtkWidget * w = gtr_torrent_options_dialog_new (cbdata->wind, core, ctor); g_signal_connect (w, "focus-in-event", G_CALLBACK (on_main_window_focus_in), cbdata); if (cbdata->wind) gtk_window_set_urgency_hint (cbdata->wind, TRUE); gtk_widget_show (w); } static void on_prefs_changed (TrCore * core UNUSED, const tr_quark key, gpointer data) { struct cbdata * cbdata = data; tr_session * tr = gtr_core_session (cbdata->core); switch (key) { case TR_KEY_encryption: tr_sessionSetEncryption (tr, gtr_pref_int_get (key)); break; case TR_KEY_download_dir: tr_sessionSetDownloadDir (tr, gtr_pref_string_get (key)); break; case TR_KEY_message_level: tr_logSetLevel (gtr_pref_int_get (key)); break; case TR_KEY_peer_port: tr_sessionSetPeerPort (tr, gtr_pref_int_get (key)); break; case TR_KEY_blocklist_enabled: tr_blocklistSetEnabled (tr, gtr_pref_flag_get (key)); break; case TR_KEY_blocklist_url: tr_blocklistSetURL (tr, gtr_pref_string_get (key)); break; case TR_KEY_show_notification_area_icon: { const bool show = gtr_pref_flag_get (key); if (show && !cbdata->icon) cbdata->icon = gtr_icon_new (cbdata->core); else if (!show && cbdata->icon) g_clear_object (&cbdata->icon); break; } case TR_KEY_speed_limit_down_enabled: tr_sessionLimitSpeed (tr, TR_DOWN, gtr_pref_flag_get (key)); break; case TR_KEY_speed_limit_down: tr_sessionSetSpeedLimit_KBps (tr, TR_DOWN, gtr_pref_int_get (key)); break; case TR_KEY_speed_limit_up_enabled: tr_sessionLimitSpeed (tr, TR_UP, gtr_pref_flag_get (key)); break; case TR_KEY_speed_limit_up: tr_sessionSetSpeedLimit_KBps (tr, TR_UP, gtr_pref_int_get (key)); break; case TR_KEY_ratio_limit_enabled: tr_sessionSetRatioLimited (tr, gtr_pref_flag_get (key)); break; case TR_KEY_ratio_limit: tr_sessionSetRatioLimit (tr, gtr_pref_double_get (key)); break; case TR_KEY_idle_seeding_limit: tr_sessionSetIdleLimit (tr, gtr_pref_int_get (key)); break; case TR_KEY_idle_seeding_limit_enabled: tr_sessionSetIdleLimited (tr, gtr_pref_flag_get (key)); break; case TR_KEY_port_forwarding_enabled: tr_sessionSetPortForwardingEnabled (tr, gtr_pref_flag_get (key)); break; case TR_KEY_pex_enabled: tr_sessionSetPexEnabled (tr, gtr_pref_flag_get (key)); break; case TR_KEY_rename_partial_files: tr_sessionSetIncompleteFileNamingEnabled (tr, gtr_pref_flag_get (key)); break; case TR_KEY_download_queue_size: tr_sessionSetQueueSize (tr, TR_DOWN, gtr_pref_int_get (key)); break; case TR_KEY_queue_stalled_minutes: tr_sessionSetQueueStalledMinutes (tr, gtr_pref_int_get (key)); break; case TR_KEY_dht_enabled: tr_sessionSetDHTEnabled (tr, gtr_pref_flag_get (key)); break; case TR_KEY_utp_enabled: tr_sessionSetUTPEnabled (tr, gtr_pref_flag_get (key)); break; case TR_KEY_lpd_enabled: tr_sessionSetLPDEnabled (tr, gtr_pref_flag_get (key)); break; case TR_KEY_rpc_port: tr_sessionSetRPCPort (tr, gtr_pref_int_get (key)); break; case TR_KEY_rpc_enabled: tr_sessionSetRPCEnabled (tr, gtr_pref_flag_get (key)); break; case TR_KEY_rpc_whitelist: tr_sessionSetRPCWhitelist (tr, gtr_pref_string_get (key)); break; case TR_KEY_rpc_whitelist_enabled: tr_sessionSetRPCWhitelistEnabled (tr, gtr_pref_flag_get (key)); break; case TR_KEY_rpc_username: tr_sessionSetRPCUsername (tr, gtr_pref_string_get (key)); break; case TR_KEY_rpc_password: tr_sessionSetRPCPassword (tr, gtr_pref_string_get (key)); break; case TR_KEY_rpc_authentication_required: tr_sessionSetRPCPasswordEnabled (tr, gtr_pref_flag_get (key)); break; case TR_KEY_alt_speed_up: tr_sessionSetAltSpeed_KBps (tr, TR_UP, gtr_pref_int_get (key)); break; case TR_KEY_alt_speed_down: tr_sessionSetAltSpeed_KBps (tr, TR_DOWN, gtr_pref_int_get (key)); break; case TR_KEY_alt_speed_enabled: { const bool b = gtr_pref_flag_get (key); tr_sessionUseAltSpeed (tr, b); gtr_action_set_toggled (tr_quark_get_string(key,NULL), b); break; } case TR_KEY_alt_speed_time_begin: tr_sessionSetAltSpeedBegin (tr, gtr_pref_int_get (key)); break; case TR_KEY_alt_speed_time_end: tr_sessionSetAltSpeedEnd (tr, gtr_pref_int_get (key)); break; case TR_KEY_alt_speed_time_enabled: tr_sessionUseAltSpeedTime (tr, gtr_pref_flag_get (key)); break; case TR_KEY_alt_speed_time_day: tr_sessionSetAltSpeedDay (tr, gtr_pref_int_get (key)); break; case TR_KEY_peer_port_random_on_start: tr_sessionSetPeerPortRandomOnStart (tr, gtr_pref_flag_get (key)); break; case TR_KEY_incomplete_dir: tr_sessionSetIncompleteDir (tr, gtr_pref_string_get (key)); break; case TR_KEY_incomplete_dir_enabled: tr_sessionSetIncompleteDirEnabled (tr, gtr_pref_flag_get (key)); break; case TR_KEY_script_torrent_done_enabled: tr_sessionSetTorrentDoneScriptEnabled (tr, gtr_pref_flag_get (key)); break; case TR_KEY_script_torrent_done_filename: tr_sessionSetTorrentDoneScript (tr, gtr_pref_string_get (key)); break; case TR_KEY_start_added_torrents: tr_sessionSetPaused (tr, !gtr_pref_flag_get (key)); break; case TR_KEY_trash_original_torrent_files: tr_sessionSetDeleteSource (tr, gtr_pref_flag_get (key)); break; default: break; } } static gboolean update_model_once (gpointer gdata) { struct cbdata *data = gdata; /* update the torrent data in the model */ gtr_core_update (data->core); /* refresh the main window's statusbar and toolbar buttons */ if (data->wind != NULL) gtr_window_refresh (data->wind); /* update the actions */ refresh_actions (data); /* update the status tray icon */ if (data->icon != NULL) gtr_icon_refresh (data->icon); data->update_model_soon_tag = 0; return G_SOURCE_REMOVE; } static void update_model_soon (gpointer gdata) { struct cbdata *data = gdata; if (data->update_model_soon_tag == 0) data->update_model_soon_tag = gdk_threads_add_idle (update_model_once, data); } static gboolean update_model_loop (gpointer gdata) { const gboolean done = global_sigcount; if (!done) update_model_once (gdata); return !done; } static void show_about_dialog (GtkWindow * parent) { const char * uri = "http://www.transmissionbt.com/"; const char * authors[] = { "Jordan Lee (Backend; GTK+)", "Mitchell Livingston (Backend; OS X)", NULL }; gtk_show_about_dialog (parent, "authors", authors, "comments", _("A fast and easy BitTorrent client"), "copyright", _("Copyright (c) The Transmission Project"), "logo-icon-name", MY_CONFIG_NAME, "name", g_get_application_name (), /* Translators: translate "translator-credits" as your name to have it appear in the credits in the "About" dialog */ "translator-credits", _("translator-credits"), "version", LONG_VERSION_STRING, "website", uri, "website-label", uri, #ifdef SHOW_LICENSE "license", LICENSE, "wrap-license", TRUE, #endif NULL); } static void append_id_to_benc_list (GtkTreeModel * m, GtkTreePath * path UNUSED, GtkTreeIter * iter, gpointer list) { tr_torrent * tor = NULL; gtk_tree_model_get (m, iter, MC_TORRENT, &tor, -1); tr_variantListAddInt (list, tr_torrentId (tor)); } static gboolean call_rpc_for_selected_torrents (struct cbdata * data, const char * method) { tr_variant top, *args, *ids; gboolean invoked = FALSE; GtkTreeSelection * s = data->sel; tr_session * session = gtr_core_session (data->core); tr_variantInitDict (&top, 2); tr_variantDictAddStr (&top, TR_KEY_method, method); args = tr_variantDictAddDict (&top, TR_KEY_arguments, 1); ids = tr_variantDictAddList (args, TR_KEY_ids, 0); gtk_tree_selection_selected_foreach (s, append_id_to_benc_list, ids); if (tr_variantListSize (ids) != 0) { tr_rpc_request_exec_json (session, &top, NULL, NULL); invoked = TRUE; } tr_variantFree (&top); return invoked; } static void open_folder_foreach (GtkTreeModel * model, GtkTreePath * path UNUSED, GtkTreeIter * iter, gpointer core) { int id; gtk_tree_model_get (model, iter, MC_TORRENT_ID, &id, -1); gtr_core_open_folder (core, id); } static gboolean on_message_window_closed (void) { gtr_action_set_toggled ("toggle-message-log", FALSE); return FALSE; } static void accumulate_selected_torrents (GtkTreeModel * model, GtkTreePath * path UNUSED, GtkTreeIter * iter, gpointer gdata) { int id; GSList ** data = gdata; gtk_tree_model_get (model, iter, MC_TORRENT_ID, &id, -1); *data = g_slist_append (*data, GINT_TO_POINTER (id)); } static void remove_selected (struct cbdata * data, gboolean delete_files) { GSList * l = NULL; gtk_tree_selection_selected_foreach (data->sel, accumulate_selected_torrents, &l); if (l != NULL) gtr_confirm_remove (data->wind, data->core, l, delete_files); } static void start_all_torrents (struct cbdata * data) { tr_session * session = gtr_core_session (data->core); tr_variant request; tr_variantInitDict (&request, 1); tr_variantDictAddStr (&request, TR_KEY_method, "torrent-start"); tr_rpc_request_exec_json (session, &request, NULL, NULL); tr_variantFree (&request); } static void pause_all_torrents (struct cbdata * data) { tr_session * session = gtr_core_session (data->core); tr_variant request; tr_variantInitDict (&request, 1); tr_variantDictAddStr (&request, TR_KEY_method, "torrent-stop"); tr_rpc_request_exec_json (session, &request, NULL, NULL); tr_variantFree (&request); } static tr_torrent* get_first_selected_torrent (struct cbdata * data) { tr_torrent * tor = NULL; GtkTreeModel * m; GList * l = gtk_tree_selection_get_selected_rows (data->sel, &m); if (l != NULL) { GtkTreePath * p = l->data; GtkTreeIter i; if (gtk_tree_model_get_iter (m, &i, p)) gtk_tree_model_get (m, &i, MC_TORRENT, &tor, -1); } g_list_foreach (l, (GFunc)gtk_tree_path_free, NULL); g_list_free (l); return tor; } static void copy_magnet_link_to_clipboard (GtkWidget * w, tr_torrent * tor) { char * magnet = tr_torrentGetMagnetLink (tor); GdkDisplay * display = gtk_widget_get_display (w); GdkAtom selection; GtkClipboard * clipboard; /* this is The Right Thing for copy/paste... */ selection = GDK_SELECTION_CLIPBOARD; clipboard = gtk_clipboard_get_for_display (display, selection); gtk_clipboard_set_text (clipboard, magnet, -1); /* ...but people using plain ol' X need this instead */ selection = GDK_SELECTION_PRIMARY; clipboard = gtk_clipboard_get_for_display (display, selection); gtk_clipboard_set_text (clipboard, magnet, -1); /* cleanup */ tr_free (magnet); } void gtr_actions_handler (const char * action_name, gpointer user_data) { gboolean changed = FALSE; struct cbdata * data = user_data; if (!g_strcmp0 (action_name, "open-torrent-from-url")) { GtkWidget * w = gtr_torrent_open_from_url_dialog_new (data->wind, data->core); gtk_widget_show (w); } else if (!g_strcmp0 (action_name, "open-torrent-menu") || !g_strcmp0 (action_name, "open-torrent-toolbar")) { GtkWidget * w = gtr_torrent_open_from_file_dialog_new (data->wind, data->core); gtk_widget_show (w); } else if (!g_strcmp0 (action_name, "show-stats")) { GtkWidget * dialog = gtr_stats_dialog_new (data->wind, data->core); gtk_widget_show (dialog); } else if (!g_strcmp0 (action_name, "donate")) { gtr_open_uri ("http://www.transmissionbt.com/donate.php"); } else if (!g_strcmp0 (action_name, "pause-all-torrents")) { pause_all_torrents (data); } else if (!g_strcmp0 (action_name, "start-all-torrents")) { start_all_torrents (data); } else if (!g_strcmp0 (action_name, "copy-magnet-link-to-clipboard")) { tr_torrent * tor = get_first_selected_torrent (data); if (tor != NULL) { copy_magnet_link_to_clipboard (GTK_WIDGET (data->wind), tor); } } else if (!g_strcmp0 (action_name, "relocate-torrent")) { GSList * ids = get_selected_torrent_ids (data); if (ids != NULL) { GtkWindow * parent = data->wind; GtkWidget * w = gtr_relocate_dialog_new (parent, data->core, ids); gtk_widget_show (w); } } else if (!g_strcmp0 (action_name, "torrent-start") || !g_strcmp0 (action_name, "torrent-start-now") || !g_strcmp0 (action_name, "torrent-stop") || !g_strcmp0 (action_name, "torrent-reannounce") || !g_strcmp0 (action_name, "torrent-verify") || !g_strcmp0 (action_name, "queue-move-top") || !g_strcmp0 (action_name, "queue-move-up") || !g_strcmp0 (action_name, "queue-move-down") || !g_strcmp0 (action_name, "queue-move-bottom")) { changed |= call_rpc_for_selected_torrents (data, action_name); } else if (!g_strcmp0 (action_name, "open-torrent-folder")) { gtk_tree_selection_selected_foreach (data->sel, open_folder_foreach, data->core); } else if (!g_strcmp0 (action_name, "show-torrent-properties")) { show_details_dialog_for_selected_torrents (data); } else if (!g_strcmp0 (action_name, "new-torrent")) { GtkWidget * w = gtr_torrent_creation_dialog_new (data->wind, data->core); gtk_widget_show (w); } else if (!g_strcmp0 (action_name, "remove-torrent")) { remove_selected (data, FALSE); } else if (!g_strcmp0 (action_name, "delete-torrent")) { remove_selected (data, TRUE); } else if (!g_strcmp0 (action_name, "quit")) { on_app_exit (data); } else if (!g_strcmp0 (action_name, "select-all")) { gtk_tree_selection_select_all (data->sel); } else if (!g_strcmp0 (action_name, "deselect-all")) { gtk_tree_selection_unselect_all (data->sel); } else if (!g_strcmp0 (action_name, "edit-preferences")) { if (NULL == data->prefs) { data->prefs = gtr_prefs_dialog_new (data->wind, G_OBJECT (data->core)); g_signal_connect (data->prefs, "destroy", G_CALLBACK (gtk_widget_destroyed), &data->prefs); } gtr_window_present (GTK_WINDOW (data->prefs)); } else if (!g_strcmp0 (action_name, "toggle-message-log")) { if (!data->msgwin) { GtkWidget * win = gtr_message_log_window_new (data->wind, data->core); g_signal_connect (win, "destroy", G_CALLBACK (on_message_window_closed), NULL); data->msgwin = win; } else { gtr_action_set_toggled ("toggle-message-log", FALSE); gtk_widget_destroy (data->msgwin); data->msgwin = NULL; } } else if (!g_strcmp0 (action_name, "show-about-dialog")) { show_about_dialog (data->wind); } else if (!g_strcmp0 (action_name, "help")) { gtr_open_uri (gtr_get_help_uri ()); } else if (!g_strcmp0 (action_name, "toggle-main-window")) { toggleMainWindow (data); } else if (!g_strcmp0 (action_name, "present-main-window")) { presentMainWindow (data); } else { g_error ("Unhandled action: %s", action_name); } if (changed) update_model_soon (data); } transmission-2.92/gtk/PaxHeaders.4960/msgwin.h0000644000000000000000000000007412617356116016135 xustar0030 atime=1456201459.059219672 30 ctime=1457295920.948824039 transmission-2.92/gtk/msgwin.h0000644000175000017500000000056412617356116017562 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: msgwin.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef GTR_MSGWIN_H #define GTR_MSGWIN_H #include "tr-core.h" GtkWidget * gtr_message_log_window_new (GtkWindow * parent, TrCore * core); #endif transmission-2.92/gtk/PaxHeaders.4960/hig.h0000644000000000000000000000007412617356116015400 xustar0030 atime=1456201459.057219638 30 ctime=1457295920.930823733 transmission-2.92/gtk/hig.h0000644000175000017500000000544412617356116017027 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: hig.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef GTR_HIG_H #define GTR_HIG_H #include /** *** utility code for making dialog layout that follows the Gnome HIG. *** see section 8.2.2, Visual Design > Window Layout > Dialogs. **/ GtkWidget* hig_workarea_create (void); void hig_workarea_add_section_divider (GtkWidget * table, guint * row); void hig_workarea_add_section_title_widget (GtkWidget * t, guint * row, GtkWidget * w); void hig_workarea_add_section_title (GtkWidget * table, guint * row, const char * section_title); void hig_workarea_add_wide_tall_control (GtkWidget * table, guint * row, GtkWidget * w); void hig_workarea_add_wide_control (GtkWidget * table, guint * row, GtkWidget * w); GtkWidget* hig_workarea_add_wide_checkbutton (GtkWidget * table, guint * row, const char * mnemonic_string, gboolean is_active); void hig_workarea_add_label_w (GtkWidget * table, guint row, GtkWidget * label_widget); GtkWidget* hig_workarea_add_tall_row (GtkWidget * table, guint * row, const char * mnemonic_string, GtkWidget * control, GtkWidget * mnemonic_or_null_for_control); GtkWidget* hig_workarea_add_row (GtkWidget * table, guint * row, const char * mnemonic_string, GtkWidget * control, GtkWidget * mnemonic_or_null_for_control); void hig_workarea_add_row_w (GtkWidget * table, guint * row, GtkWidget * label, GtkWidget * control, GtkWidget * mnemonic_or_null_for_control); enum { GUI_PAD_SMALL = 3, GUI_PAD = 6, GUI_PAD_BIG = 12, GUI_PAD_LARGE = 12 }; #endif /* GTR_HIG_H */ transmission-2.92/gtk/PaxHeaders.4960/transmission-resources.c0000644000000000000000000000013112667111060021347 xustar0029 mtime=1457295920.80482159 30 atime=1457295920.799821505 30 ctime=1457295921.125827049 transmission-2.92/gtk/transmission-resources.c0000644000175000017500000024236012667111060023004 0ustar00mikedldmikedld00000000000000#include #if defined (__ELF__) && ( __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6)) # define SECTION __attribute__ ((section (".gresource.transmission"), aligned (8))) #else # define SECTION #endif static const SECTION union { const guint8 data[12389]; const double alignment; void * const ptr;} transmission_resource_data = { { 0x47, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x8c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x6c, 0x45, 0xa4, 0xc4, 0x0b, 0x00, 0x00, 0x00, 0x8c, 0x01, 0x00, 0x00, 0x0b, 0x00, 0x76, 0x00, 0x98, 0x01, 0x00, 0x00, 0x72, 0x06, 0x00, 0x00, 0xd4, 0xb5, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0x72, 0x06, 0x00, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x74, 0x06, 0x00, 0x00, 0x78, 0x06, 0x00, 0x00, 0x11, 0xb3, 0x2b, 0x4d, 0x0b, 0x00, 0x00, 0x00, 0x78, 0x06, 0x00, 0x00, 0x08, 0x00, 0x76, 0x00, 0x80, 0x06, 0x00, 0x00, 0x8f, 0x08, 0x00, 0x00, 0xbe, 0xf4, 0x8e, 0x4c, 0x06, 0x00, 0x00, 0x00, 0x8f, 0x08, 0x00, 0x00, 0x13, 0x00, 0x76, 0x00, 0xa8, 0x08, 0x00, 0x00, 0xf2, 0x19, 0x00, 0x00, 0xe4, 0x42, 0xce, 0xe2, 0x0b, 0x00, 0x00, 0x00, 0xf2, 0x19, 0x00, 0x00, 0x0d, 0x00, 0x76, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x88, 0x1d, 0x00, 0x00, 0x51, 0x6a, 0x50, 0x1b, 0x0a, 0x00, 0x00, 0x00, 0x88, 0x1d, 0x00, 0x00, 0x0f, 0x00, 0x4c, 0x00, 0x98, 0x1d, 0x00, 0x00, 0x9c, 0x1d, 0x00, 0x00, 0x6a, 0xe2, 0xc8, 0xef, 0x05, 0x00, 0x00, 0x00, 0x9c, 0x1d, 0x00, 0x00, 0x0d, 0x00, 0x4c, 0x00, 0xac, 0x1d, 0x00, 0x00, 0xb4, 0x1d, 0x00, 0x00, 0xac, 0xdb, 0xf7, 0xcb, 0x0b, 0x00, 0x00, 0x00, 0xb4, 0x1d, 0x00, 0x00, 0x0f, 0x00, 0x76, 0x00, 0xc8, 0x1d, 0x00, 0x00, 0x41, 0x1f, 0x00, 0x00, 0x07, 0xe0, 0x5a, 0xde, 0x0b, 0x00, 0x00, 0x00, 0x41, 0x1f, 0x00, 0x00, 0x09, 0x00, 0x76, 0x00, 0x50, 0x1f, 0x00, 0x00, 0xbf, 0x22, 0x00, 0x00, 0xb2, 0xf8, 0x96, 0xc9, 0x0b, 0x00, 0x00, 0x00, 0xbf, 0x22, 0x00, 0x00, 0x0b, 0x00, 0x76, 0x00, 0xd0, 0x22, 0x00, 0x00, 0xb6, 0x2e, 0x00, 0x00, 0xc2, 0xaf, 0x89, 0x0b, 0x01, 0x00, 0x00, 0x00, 0xb6, 0x2e, 0x00, 0x00, 0x04, 0x00, 0x4c, 0x00, 0xbc, 0x2e, 0x00, 0x00, 0xc0, 0x2e, 0x00, 0x00, 0xd5, 0x6e, 0x33, 0x6b, 0x06, 0x00, 0x00, 0x00, 0xc0, 0x2e, 0x00, 0x00, 0x06, 0x00, 0x4c, 0x00, 0xc8, 0x2e, 0x00, 0x00, 0xe4, 0x2e, 0x00, 0x00, 0xbd, 0xe6, 0xb9, 0x84, 0x0b, 0x00, 0x00, 0x00, 0xe4, 0x2e, 0x00, 0x00, 0x0f, 0x00, 0x76, 0x00, 0xf8, 0x2e, 0x00, 0x00, 0x65, 0x30, 0x00, 0x00, 0x6c, 0x6f, 0x67, 0x6f, 0x2d, 0x32, 0x34, 0x2e, 0x70, 0x6e, 0x67, 0x00, 0xca, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x04, 0x91, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xa5, 0x95, 0x4b, 0x6c, 0x4c, 0x51, 0x18, 0xc7, 0xff, 0x73, 0xef, 0x9d, 0x3b, 0xd3, 0x79, 0xf5, 0xce, 0x4b, 0x45, 0xab, 0x98, 0xe9, 0x4b, 0xdb, 0xa9, 0xd1, 0x06, 0xa1, 0x14, 0x52, 0x88, 0x8d, 0xad, 0x25, 0x62, 0x41, 0x22, 0xb1, 0xc3, 0x42, 0x44, 0x48, 0x24, 0x84, 0x05, 0x00, 0x16, 0x58, 0x40, 0x45, 0x02, 0x05, 0x25, 0x80, 0x10, 0x12, 0x00, 0x48, 0x5f, 0xf4, 0x91, 0x29, 0x0b, 0x35, 0x3a, 0xd5, 0x99, 0x31, 0x33, 0xf7, 0x1e, 0xdf, 0x3d, 0x4c, 0x33, 0x3a, 0x84, 0x70, 0x92, 0x5f, 0xce, 0x77, 0xcf, 0xe3, 0xfb, 0x9f, 0xef, 0x3b, 0xdf, 0xc9, 0xc5, 0xdc, 0xb9, 0x73, 0x7f, 0xc9, 0x0e, 0xc0, 0x74, 0x08, 0x30, 0xff, 0x0d, 0xfa, 0xda, 0xdf, 0xf9, 0xc9, 0x1a, 0xd8, 0x09, 0xcc, 0xda, 0x0b, 0x74, 0xef, 0x02, 0x52, 0x69, 0xb6, 0x10, 0x27, 0x0e, 0x1f, 0x60, 0xa7, 0x4e, 0x37, 0x70, 0x74, 0x7b, 0x0d, 0xa0, 0x66, 0xae, 0xd9, 0x03, 0xbc, 0xa5, 0x7e, 0xf2, 0x1f, 0x05, 0xf6, 0x01, 0xef, 0x5e, 0x94, 0x97, 0xb3, 0xc8, 0x8a, 0x15, 0x83, 0x74, 0x2e, 0x5d, 0xca, 0x8e, 0x1c, 0x3d, 0xc4, 0x12, 0x89, 0x04, 0x8b, 0xc7, 0xe3, 0xdc, 0xbe, 0xbb, 0x70, 0xe1, 0x4f, 0x6b, 0x1e, 0xf9, 0xfd, 0x6c, 0x3f, 0xf0, 0xec, 0x8f, 0x02, 0x74, 0x8a, 0x8e, 0x06, 0x80, 0x35, 0x66, 0x70, 0x8c, 0xd8, 0x7b, 0x70, 0x0f, 0xd3, 0x34, 0x8d, 0xa9, 0xaa, 0xca, 0xed, 0x1d, 0x43, 0xd6, 0x1c, 0x27, 0x76, 0xff, 0xa5, 0xc0, 0x6c, 0x4a, 0x53, 0x0f, 0x91, 0x4a, 0xb3, 0x99, 0xd8, 0xb6, 0x7d, 0x2b, 0x7b, 0xff, 0xa1, 0x87, 0xb5, 0xbf, 0x6d, 0x65, 0xba, 0xbd, 0x1a, 0x50, 0x33, 0xd7, 0xd0, 0xbe, 0x4e, 0x12, 0x98, 0xfa, 0x47, 0x81, 0x34, 0xab, 0x4a, 0x4b, 0xed, 0xeb, 0x83, 0x41, 0x25, 0xcd, 0x86, 0x4d, 0x1b, 0xd9, 0xc3, 0xc7, 0x0f, 0xd8, 0xa5, 0x2b, 0x8d, 0x4c, 0xb7, 0xf9, 0x78, 0x9a, 0x8a, 0x0a, 0xdb, 0xef, 0xfc, 0x08, 0x18, 0xd2, 0xec, 0x8a, 0x7d, 0x81, 0x43, 0xb1, 0xb5, 0xbd, 0x0b, 0x56, 0x46, 0x5e, 0x95, 0xfa, 0xc3, 0x69, 0xa2, 0xd1, 0x28, 0xfa, 0xfb, 0xbf, 0xe0, 0x53, 0x6f, 0x18, 0xba, 0xcd, 0xc7, 0xd3, 0x54, 0x96, 0xf5, 0xd1, 0x9e, 0xa7, 0x36, 0x97, 0xad, 0x0a, 0x43, 0x9a, 0x94, 0xf9, 0x21, 0x08, 0x82, 0xc3, 0x40, 0x29, 0x2f, 0x2b, 0x29, 0xb7, 0x98, 0xcc, 0x32, 0xd4, 0x94, 0x8a, 0x94, 0x9a, 0x44, 0x3c, 0xfe, 0x15, 0x03, 0xd1, 0x18, 0x34, 0x55, 0x43, 0x2a, 0x95, 0xe2, 0x76, 0x49, 0x51, 0x09, 0xcc, 0x96, 0x1c, 0x08, 0x06, 0x03, 0x34, 0xa6, 0x09, 0xe1, 0x70, 0x78, 0x5c, 0x67, 0x67, 0xc7, 0x49, 0x00, 0x65, 0xbf, 0x15, 0xf8, 0xf2, 0xa5, 0x6f, 0xf6, 0xf0, 0x11, 0xc3, 0x2c, 0x85, 0x85, 0x23, 0x71, 0xa2, 0xa1, 0x01, 0x1d, 0x1d, 0x1d, 0x7c, 0x5c, 0x94, 0x8c, 0x98, 0x36, 0xa3, 0x0e, 0x8c, 0x31, 0x1d, 0x1e, 0x41, 0xd3, 0xa5, 0xcb, 0x50, 0x93, 0x49, 0xc8, 0xb2, 0x11, 0x81, 0x40, 0x05, 0xa6, 0xd4, 0xd6, 0x22, 0x14, 0x0a, 0x95, 0x86, 0x42, 0x6d, 0xfe, 0xfc, 0xfc, 0xfc, 0xf6, 0x5f, 0x0a, 0x98, 0x73, 0x72, 0x6a, 0x9c, 0x4e, 0x27, 0xa5, 0x22, 0x02, 0x25, 0xd7, 0x81, 0x86, 0x13, 0x0d, 0x14, 0x95, 0x01, 0x57, 0xaf, 0xdf, 0xc4, 0xd3, 0xe7, 0x4f, 0xa1, 0xd0, 0x5c, 0x32, 0x95, 0x24, 0x81, 0x18, 0x16, 0x2f, 0x5a, 0x82, 0xfa, 0x59, 0x33, 0xf1, 0xe1, 0xc3, 0x7b, 0xec, 0xde, 0xb3, 0x1b, 0xb1, 0x58, 0x0c, 0x0e, 0x9b, 0x03, 0x2e, 0x4f, 0xee, 0x54, 0x00, 0xbf, 0x16, 0x30, 0xca, 0xc6, 0x4a, 0xaf, 0x77, 0x18, 0xa2, 0xb4, 0x78, 0x72, 0xed, 0x14, 0xf8, 0x7c, 0x3e, 0x9e, 0x92, 0xae, 0xee, 0x2e, 0x84, 0xc3, 0x9f, 0x39, 0xf1, 0x78, 0x82, 0xf7, 0x1d, 0x9d, 0x5d, 0x50, 0x14, 0x85, 0x53, 0x5d, 0x3d, 0x9e, 0x0e, 0xd5, 0x4f, 0xce, 0x5d, 0xc8, 0xe9, 0xb6, 0x4c, 0x00, 0xc3, 0x91, 0xc1, 0xb4, 0xa7, 0x8d, 0xa6, 0xa6, 0x26, 0xb3, 0x24, 0x49, 0x25, 0x5e, 0xaf, 0x17, 0x92, 0x24, 0xa2, 0x3a, 0x58, 0x0d, 0xab, 0xd5, 0xca, 0x79, 0xf1, 0xec, 0x05, 0xc2, 0x9f, 0x23, 0xb8, 0x73, 0xef, 0x3e, 0x1e, 0x3d, 0x79, 0xc6, 0xed, 0x57, 0xaf, 0x5e, 0x22, 0xdd, 0x02, 0x95, 0x01, 0x88, 0x82, 0x08, 0x8a, 0x5e, 0xdf, 0x5b, 0x45, 0xbe, 0x84, 0x2c, 0x01, 0x72, 0xa4, 0x08, 0x82, 0x34, 0xc6, 0xe3, 0xf6, 0xc0, 0x64, 0x92, 0x51, 0x50, 0x90, 0x0f, 0x51, 0x14, 0xc9, 0x36, 0xa1, 0xb5, 0xb5, 0x05, 0x79, 0x79, 0x79, 0x78, 0xf3, 0xa6, 0x19, 0xcd, 0x2d, 0x6d, 0xdc, 0x6e, 0x6d, 0x69, 0x81, 0xd9, 0x6c, 0x06, 0x1d, 0x8a, 0xd6, 0x8e, 0x84, 0x23, 0xd7, 0x0e, 0x67, 0xae, 0x13, 0x82, 0x64, 0x2c, 0x05, 0x60, 0xcb, 0x12, 0x28, 0x2a, 0x2a, 0xaa, 0x92, 0x4d, 0xb2, 0x9c, 0xa4, 0x8b, 0x4b, 0x24, 0x13, 0xe8, 0xeb, 0x8b, 0x60, 0xfa, 0x8c, 0x19, 0xb0, 0xda, 0x6c, 0xf8, 0x1a, 0x8f, 0xf3, 0x0b, 0x6f, 0x26, 0xa7, 0x84, 0x6e, 0x53, 0x41, 0xf4, 0x53, 0x0a, 0xfd, 0x58, 0xbc, 0x64, 0x09, 0xa5, 0xd6, 0x04, 0x7a, 0xe5, 0x70, 0x7b, 0x3d, 0x90, 0x8c, 0xd2, 0xb0, 0xe2, 0xe2, 0x62, 0x5f, 0x96, 0x80, 0x6c, 0x36, 0x57, 0xdb, 0x6c, 0x76, 0x84, 0xfb, 0xc2, 0x90, 0x65, 0x99, 0x04, 0xfd, 0x38, 0x77, 0xf6, 0x34, 0x96, 0x2f, 0x5b, 0x86, 0x24, 0x09, 0x26, 0x48, 0xc4, 0xe3, 0x76, 0x73, 0xe2, 0xb1, 0x28, 0xdf, 0xb8, 0x66, 0xcd, 0x6a, 0x9c, 0x6f, 0x6c, 0xc4, 0xd8, 0xb2, 0x32, 0x58, 0x2d, 0x56, 0x30, 0x12, 0xc9, 0xb5, 0xe7, 0xc2, 0xa1, 0x38, 0x26, 0x67, 0x5d, 0x32, 0x29, 0x07, 0xbc, 0x1e, 0x0f, 0x34, 0x55, 0x85, 0xcb, 0xe5, 0xe2, 0xe5, 0x68, 0xa0, 0x1a, 0x5f, 0xb7, 0x6e, 0x2d, 0xea, 0xeb, 0x67, 0x61, 0x11, 0x55, 0x4d, 0xe4, 0x73, 0x18, 0xa0, 0xb1, 0x04, 0x09, 0x9c, 0x3d, 0x7b, 0x06, 0x75, 0x75, 0x75, 0x10, 0x04, 0x91, 0xaf, 0xa5, 0x34, 0xf1, 0x4a, 0xca, 0x1b, 0x3e, 0x1c, 0xcd, 0xcd, 0xad, 0x35, 0x99, 0x11, 0xf0, 0x0b, 0x16, 0x44, 0xa9, 0x24, 0xbf, 0x60, 0x04, 0xed, 0x67, 0xb0, 0xe4, 0x58, 0x11, 0x25, 0x27, 0x54, 0xef, 0x9c, 0x60, 0x70, 0x1c, 0x6e, 0xde, 0xbc, 0x86, 0xd2, 0xe2, 0x22, 0xf8, 0x47, 0x17, 0xe2, 0xd6, 0xed, 0x1b, 0x28, 0x2f, 0x1f, 0x8b, 0xde, 0xde, 0x5e, 0xe2, 0x23, 0xe8, 0x91, 0xc1, 0x62, 0xb1, 0x20, 0xa5, 0xa6, 0xe0, 0x1b, 0xe3, 0x83, 0x20, 0x89, 0x15, 0xe4, 0x53, 0xce, 0x8c, 0xc0, 0x4e, 0xaf, 0xb8, 0xc8, 0xef, 0xf7, 0x23, 0x1e, 0x1d, 0x40, 0x27, 0x95, 0x65, 0xfb, 0xd1, 0x36, 0x1e, 0x41, 0x66, 0x9b, 0x37, 0x7f, 0x36, 0x3f, 0x6d, 0xe3, 0xf9, 0x73, 0x7c, 0x2e, 0x63, 0x9e, 0xa7, 0xb5, 0x7a, 0x7c, 0x0d, 0x8c, 0x46, 0x19, 0x82, 0x41, 0x28, 0x03, 0xe0, 0x20, 0x3e, 0x0e, 0x0a, 0xa8, 0x9a, 0xa6, 0x38, 0x15, 0x17, 0xdc, 0x3e, 0x9f, 0x56, 0x19, 0xa8, 0x12, 0x92, 0x09, 0x7e, 0xd9, 0xf8, 0xde, 0x27, 0xa9, 0x4f, 0xe8, 0x9b, 0x09, 0x09, 0xb2, 0xde, 0xcb, 0x46, 0xfd, 0x9b, 0x6c, 0x23, 0xa4, 0xc1, 0xde, 0xa8, 0xf5, 0xf4, 0xf4, 0x08, 0x2a, 0x63, 0xca, 0x50, 0x01, 0x59, 0x55, 0x35, 0x5c, 0xbc, 0x78, 0x81, 0x52, 0xd2, 0x2f, 0xe8, 0xa7, 0xa4, 0x88, 0x7e, 0x20, 0xf2, 0x3e, 0x13, 0x51, 0xfc, 0x79, 0x6e, 0x60, 0x60, 0x80, 0x3f, 0x34, 0xaa, 0x40, 0xc1, 0x92, 0x63, 0x01, 0xf9, 0xe2, 0x3e, 0x7f, 0xaa, 0xa2, 0x44, 0x22, 0xd9, 0xf5, 0xba, 0xb9, 0x0d, 0x76, 0xbb, 0x03, 0xfa, 0x5b, 0xf0, 0x78, 0xbc, 0x1c, 0xaf, 0x0e, 0xb7, 0x87, 0xfd, 0xc0, 0xcb, 0xe7, 0xdd, 0x3a, 0x2e, 0x37, 0x5c, 0x4e, 0x17, 0x15, 0x05, 0x5f, 0x0f, 0x3d, 0x03, 0xed, 0xef, 0xba, 0xf5, 0x88, 0x43, 0x48, 0x37, 0xfe, 0x53, 0x00, 0x0a, 0x47, 0x14, 0x8c, 0x5a, 0x11, 0xa8, 0xa9, 0x79, 0x13, 0x9c, 0x38, 0x49, 0x23, 0xd8, 0x3f, 0xa2, 0xe9, 0x3e, 0x0a, 0x0a, 0x47, 0xaf, 0xd4, 0x7d, 0xa6, 0x7f, 0x38, 0xe9, 0x48, 0xc6, 0x12, 0xb5, 0xf4, 0x32, 0xeb, 0x25, 0x93, 0x69, 0xce, 0x3f, 0x41, 0x7b, 0x75, 0x1f, 0x3f, 0x7c, 0x09, 0x59, 0x7f, 0x34, 0x6a, 0x06, 0x42, 0xf8, 0x4f, 0x0c, 0x99, 0x3e, 0xbf, 0x01, 0x07, 0xc5, 0x80, 0x7c, 0xef, 0x78, 0x43, 0x59, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00, 0x00, 0x28, 0x75, 0x75, 0x61, 0x79, 0x29, 0x2f, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x70, 0x6e, 0x67, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0xf3, 0xff, 0x61, 0x00, 0x00, 0x00, 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, 0x88, 0x00, 0x00, 0x01, 0xb6, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xc5, 0x93, 0xc1, 0x6a, 0x13, 0x51, 0x18, 0x85, 0xbf, 0xc9, 0xcc, 0xa4, 0x11, 0xa9, 0x71, 0x37, 0x26, 0xa0, 0xdc, 0x11, 0x77, 0x59, 0x76, 0x57, 0x5c, 0x64, 0x27, 0xb4, 0xab, 0xa1, 0x03, 0x92, 0x07, 0x10, 0x64, 0x76, 0xfa, 0x00, 0x3e, 0x82, 0x3e, 0x41, 0xeb, 0xd2, 0x85, 0xb8, 0xec, 0xc2, 0x42, 0x07, 0x17, 0xd2, 0x59, 0xb4, 0xcb, 0x06, 0x41, 0x24, 0x5c, 0xda, 0x9a, 0x34, 0x0b, 0xdb, 0x64, 0x62, 0x9a, 0x64, 0x32, 0x33, 0xd7, 0xcd, 0x44, 0xcc, 0x38, 0x92, 0xa5, 0x07, 0x2e, 0x07, 0x0e, 0x87, 0xc3, 0xf9, 0xff, 0x7b, 0x2f, 0xfc, 0x6f, 0x68, 0x45, 0xa2, 0x65, 0x59, 0x4d, 0x21, 0x44, 0xab, 0x5e, 0xaf, 0x3f, 0x01, 0xe8, 0x76, 0xbb, 0x1f, 0xa5, 0x94, 0xef, 0xfa, 0xfd, 0xfe, 0xa7, 0x95, 0x89, 0x96, 0x65, 0x35, 0x3d, 0xcf, 0x3b, 0xf1, 0x7d, 0x5f, 0x2d, 0xe0, 0xfb, 0xbe, 0xf2, 0x3c, 0xef, 0xc4, 0xb2, 0xac, 0x66, 0xde, 0x5f, 0xca, 0x0b, 0x42, 0x88, 0x96, 0xeb, 0xba, 0x1b, 0x41, 0x10, 0x1c, 0xda, 0xb6, 0xbd, 0x67, 0xdb, 0xf6, 0x5e, 0x10, 0x04, 0x87, 0xae, 0xeb, 0x6e, 0x08, 0x21, 0x5a, 0x2b, 0x1b, 0x38, 0x8e, 0x23, 0xa5, 0x94, 0x4a, 0x08, 0xb1, 0x0b, 0xec, 0x00, 0x3b, 0x42, 0x88, 0x5d, 0x29, 0xa5, 0x72, 0x1c, 0x47, 0xe6, 0xfd, 0xc6, 0x8a, 0xbc, 0x0f, 0x19, 0x6f, 0xfd, 0xcb, 0xf0, 0xe7, 0x12, 0xb5, 0x07, 0x77, 0xf5, 0xcd, 0xd7, 0xdb, 0xd5, 0xcf, 0xf7, 0xab, 0x7a, 0xa1, 0xf9, 0x7c, 0x98, 0xf0, 0x72, 0x7f, 0xf8, 0xf8, 0x6c, 0x90, 0x1c, 0x01, 0x2a, 0x1f, 0x50, 0x7e, 0xb3, 0x5d, 0x9d, 0x3d, 0x7b, 0x7b, 0x4c, 0xd4, 0x3d, 0x22, 0x9d, 0x5e, 0x91, 0xcc, 0xae, 0x49, 0xa6, 0x83, 0xec, 0x8c, 0x30, 0x1e, 0x3d, 0xe5, 0xfd, 0xab, 0xe7, 0xbc, 0xd8, 0x1f, 0xae, 0x01, 0x51, 0x7e, 0x84, 0x4a, 0xbb, 0x37, 0x27, 0xec, 0x5f, 0x12, 0x7d, 0xfd, 0x46, 0x32, 0xbe, 0x22, 0x9e, 0x5c, 0x13, 0xdf, 0x0c, 0x48, 0xc6, 0x43, 0xe2, 0xe9, 0x18, 0x4d, 0xeb, 0xd0, 0xee, 0xcd, 0x01, 0x2a, 0x45, 0x01, 0x7a, 0xa3, 0x66, 0x92, 0xce, 0x2e, 0x50, 0xe5, 0x5e, 0x6c, 0xea, 0xa1, 0x51, 0xaa, 0x84, 0x18, 0xb7, 0x47, 0xa4, 0x77, 0xc6, 0xcc, 0x67, 0xe3, 0x38, 0x31, 0xbe, 0x1b, 0x8d, 0x9a, 0x09, 0xf0, 0x7b, 0xc6, 0xa5, 0x25, 0xb6, 0x7b, 0x73, 0x36, 0x4f, 0x4f, 0x59, 0x3b, 0xeb, 0x40, 0x14, 0x92, 0x46, 0x3f, 0x49, 0xa2, 0x1b, 0x54, 0x14, 0x11, 0xa7, 0x30, 0xfc, 0x71, 0xbc, 0x68, 0x40, 0x61, 0x40, 0xa3, 0x66, 0xa2, 0x6b, 0x1d, 0x2a, 0xf7, 0x42, 0x4a, 0xe9, 0x04, 0x95, 0xcc, 0x01, 0x13, 0x94, 0x49, 0x9c, 0x28, 0x52, 0xad, 0x4c, 0xd6, 0xa0, 0x38, 0x00, 0x40, 0x1e, 0x1c, 0x50, 0x5b, 0xd7, 0x31, 0x72, 0x4f, 0x2c, 0x4e, 0xe1, 0x72, 0xf4, 0x25, 0x6f, 0x5f, 0xba, 0x85, 0x75, 0xe0, 0x61, 0xc6, 0x8a, 0xbf, 0xff, 0xc9, 0x42, 0x1b, 0x01, 0x9d, 0x8c, 0x97, 0x4c, 0x06, 0x70, 0xab, 0xa8, 0x55, 0x0e, 0x31, 0x30, 0xc9, 0x98, 0x5f, 0x1c, 0xd1, 0xc0, 0x96, 0x6f, 0x30, 0x2f, 0x29, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00, 0x00, 0x28, 0x75, 0x75, 0x61, 0x79, 0x29, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2d, 0x75, 0x69, 0x2e, 0x78, 0x6d, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x75, 0x69, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x62, 0x61, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x6d, 0x61, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x27, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x27, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x66, 0x72, 0x6f, 0x6d, 0x2d, 0x75, 0x72, 0x6c, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x6e, 0x65, 0x77, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x61, 0x6c, 0x6c, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x70, 0x61, 0x75, 0x73, 0x65, 0x2d, 0x61, 0x6c, 0x6c, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x71, 0x75, 0x69, 0x74, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x65, 0x64, 0x69, 0x74, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x27, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x2d, 0x61, 0x6c, 0x6c, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x64, 0x65, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x2d, 0x61, 0x6c, 0x6c, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x65, 0x64, 0x69, 0x74, 0x2d, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x27, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x68, 0x6f, 0x77, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x6e, 0x6f, 0x77, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x72, 0x65, 0x61, 0x6e, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x71, 0x75, 0x65, 0x75, 0x65, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x27, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x71, 0x75, 0x65, 0x75, 0x65, 0x2d, 0x6d, 0x6f, 0x76, 0x65, 0x2d, 0x74, 0x6f, 0x70, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x71, 0x75, 0x65, 0x75, 0x65, 0x2d, 0x6d, 0x6f, 0x76, 0x65, 0x2d, 0x75, 0x70, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x71, 0x75, 0x65, 0x75, 0x65, 0x2d, 0x6d, 0x6f, 0x76, 0x65, 0x2d, 0x64, 0x6f, 0x77, 0x6e, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x71, 0x75, 0x65, 0x75, 0x65, 0x2d, 0x6d, 0x6f, 0x76, 0x65, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x73, 0x74, 0x6f, 0x70, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x72, 0x65, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x63, 0x6f, 0x70, 0x79, 0x2d, 0x6d, 0x61, 0x67, 0x6e, 0x65, 0x74, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x2d, 0x74, 0x6f, 0x2d, 0x63, 0x6c, 0x69, 0x70, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x76, 0x69, 0x65, 0x77, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x27, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x2d, 0x76, 0x69, 0x65, 0x77, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x68, 0x6f, 0x77, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x62, 0x61, 0x72, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x68, 0x6f, 0x77, 0x2d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x62, 0x61, 0x72, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x68, 0x6f, 0x77, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x62, 0x61, 0x72, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x61, 0x67, 0x65, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x71, 0x75, 0x65, 0x75, 0x65, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x64, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x68, 0x65, 0x6c, 0x70, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x27, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x67, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x68, 0x6f, 0x77, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x64, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x68, 0x65, 0x6c, 0x70, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x68, 0x6f, 0x77, 0x2d, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x2d, 0x64, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x6d, 0x65, 0x6e, 0x75, 0x62, 0x61, 0x72, 0x3e, 0x20, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x74, 0x6f, 0x6f, 0x6c, 0x62, 0x61, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x6d, 0x61, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x62, 0x61, 0x72, 0x27, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x6f, 0x6f, 0x6c, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x62, 0x61, 0x72, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x6f, 0x6f, 0x6c, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x6f, 0x6f, 0x6c, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x73, 0x74, 0x6f, 0x70, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x6f, 0x6f, 0x6c, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x6f, 0x6f, 0x6c, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x68, 0x6f, 0x77, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x6f, 0x6f, 0x6c, 0x62, 0x61, 0x72, 0x3e, 0x20, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x70, 0x6f, 0x70, 0x75, 0x70, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x6d, 0x61, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2d, 0x70, 0x6f, 0x70, 0x75, 0x70, 0x27, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x68, 0x6f, 0x77, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x27, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x61, 0x67, 0x65, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x6f, 0x72, 0x74, 0x2d, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x64, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x6e, 0x6f, 0x77, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x72, 0x65, 0x61, 0x6e, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x71, 0x75, 0x65, 0x75, 0x65, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x27, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x71, 0x75, 0x65, 0x75, 0x65, 0x2d, 0x6d, 0x6f, 0x76, 0x65, 0x2d, 0x74, 0x6f, 0x70, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x71, 0x75, 0x65, 0x75, 0x65, 0x2d, 0x6d, 0x6f, 0x76, 0x65, 0x2d, 0x75, 0x70, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x71, 0x75, 0x65, 0x75, 0x65, 0x2d, 0x6d, 0x6f, 0x76, 0x65, 0x2d, 0x64, 0x6f, 0x77, 0x6e, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x71, 0x75, 0x65, 0x75, 0x65, 0x2d, 0x6d, 0x6f, 0x76, 0x65, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6d, 0x65, 0x6e, 0x75, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x73, 0x74, 0x6f, 0x70, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x72, 0x65, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x63, 0x6f, 0x70, 0x79, 0x2d, 0x6d, 0x61, 0x67, 0x6e, 0x65, 0x74, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x2d, 0x74, 0x6f, 0x2d, 0x63, 0x6c, 0x69, 0x70, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x70, 0x6f, 0x70, 0x75, 0x70, 0x3e, 0x20, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x70, 0x6f, 0x70, 0x75, 0x70, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x69, 0x63, 0x6f, 0x6e, 0x2d, 0x70, 0x6f, 0x70, 0x75, 0x70, 0x27, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2d, 0x6d, 0x61, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x66, 0x72, 0x6f, 0x6d, 0x2d, 0x75, 0x72, 0x6c, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x70, 0x61, 0x75, 0x73, 0x65, 0x2d, 0x61, 0x6c, 0x6c, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x61, 0x6c, 0x6c, 0x2d, 0x74, 0x6f, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x61, 0x6c, 0x74, 0x2d, 0x73, 0x70, 0x65, 0x65, 0x64, 0x2d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x6e, 0x75, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x71, 0x75, 0x69, 0x74, 0x27, 0x2f, 0x3e, 0x20, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x70, 0x6f, 0x70, 0x75, 0x70, 0x3e, 0x20, 0x0a, 0x3c, 0x2f, 0x75, 0x69, 0x3e, 0x20, 0x0a, 0x00, 0x00, 0x28, 0x75, 0x75, 0x61, 0x79, 0x29, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x70, 0x6e, 0x67, 0x00, 0x78, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0xf3, 0xff, 0x61, 0x00, 0x00, 0x00, 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, 0x88, 0x00, 0x00, 0x03, 0x2f, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0x6d, 0x93, 0x5d, 0x68, 0x9b, 0x75, 0x14, 0xc6, 0x9f, 0xf3, 0xe6, 0xff, 0x7f, 0xdf, 0x37, 0x89, 0x5b, 0x8a, 0x8d, 0x4d, 0xa4, 0xb3, 0x1d, 0xac, 0xa9, 0x6d, 0xa2, 0x1d, 0x0d, 0xb2, 0xd6, 0xc6, 0x64, 0x6d, 0xaa, 0xc3, 0x74, 0x1f, 0xec, 0xa2, 0x50, 0x18, 0x53, 0x06, 0x65, 0x38, 0xed, 0x54, 0x14, 0x41, 0x8a, 0xda, 0x76, 0xa1, 0xa8, 0xe0, 0x85, 0x7a, 0xb5, 0x21, 0xb2, 0xd5, 0x3a, 0x95, 0xb5, 0x1b, 0xda, 0x6e, 0x32, 0xb1, 0xdd, 0x9c, 0xfd, 0xb8, 0xd8, 0x64, 0xd5, 0x26, 0xb5, 0x1b, 0x45, 0xdd, 0x6c, 0xeb, 0x85, 0xa3, 0xd9, 0x48, 0xc5, 0xbc, 0x6f, 0xfa, 0x7e, 0xfc, 0xbd, 0x4a, 0xa5, 0x23, 0x07, 0x0e, 0x3c, 0x17, 0xcf, 0x81, 0xdf, 0xe1, 0x39, 0x87, 0x84, 0x10, 0x28, 0x56, 0xfd, 0xef, 0x25, 0x1b, 0x38, 0xe7, 0xdf, 0x00, 0x02, 0x86, 0x61, 0xee, 0x7f, 0xbb, 0xbb, 0xe7, 0x6a, 0x31, 0x9f, 0x74, 0xdf, 0x50, 0x55, 0x41, 0x13, 0x51, 0xfc, 0x89, 0x70, 0xd8, 0x5f, 0xf7, 0x78, 0x9d, 0x8f, 0x88, 0xe2, 0xc5, 0x3c, 0x00, 0x40, 0x05, 0x82, 0xf7, 0x3f, 0x78, 0xf7, 0x9a, 0x22, 0xcb, 0xa1, 0xfc, 0xda, 0xda, 0x17, 0xa6, 0x69, 0xf6, 0x31, 0xc6, 0xce, 0x37, 0x3d, 0xd9, 0x18, 0x36, 0xd6, 0x0c, 0xfc, 0x74, 0xfd, 0xfa, 0x8c, 0x69, 0x9a, 0x7b, 0x39, 0xe7, 0x7d, 0x04, 0x1c, 0x10, 0xc0, 0xfc, 0x9b, 0x6f, 0x74, 0xef, 0x58, 0x27, 0x38, 0xd6, 0xdf, 0x1b, 0x90, 0x65, 0x39, 0x14, 0x8f, 0xb7, 0xba, 0x2a, 0x2b, 0x1e, 0x39, 0xc8, 0x39, 0x4f, 0x7b, 0xbd, 0xde, 0x1a, 0x49, 0x92, 0x20, 0x2b, 0x32, 0xfc, 0x7e, 0x5f, 0x8d, 0xa2, 0x28, 0xe9, 0x47, 0xab, 0xab, 0x9f, 0x4b, 0x24, 0x12, 0x6e, 0x21, 0x44, 0xf0, 0x58, 0x7f, 0x6f, 0x60, 0x03, 0xc1, 0x3b, 0x7d, 0x6f, 0x0d, 0x84, 0x82, 0xc1, 0x8e, 0x60, 0x6d, 0xad, 0x7a, 0x67, 0xe5, 0x0e, 0x00, 0x40, 0x51, 0x54, 0x70, 0xce, 0xc1, 0x39, 0x07, 0x73, 0x30, 0x30, 0x07, 0xc3, 0x8d, 0x9b, 0x37, 0xb5, 0x54, 0x3a, 0x35, 0x94, 0xec, 0xed, 0x3f, 0x04, 0x00, 0xac, 0xb0, 0xcb, 0x6a, 0x76, 0xb5, 0x67, 0x6e, 0x6e, 0x6e, 0x8f, 0xf7, 0xa1, 0x52, 0xd5, 0xa9, 0x3a, 0xf1, 0xe7, 0xe2, 0x92, 0x31, 0xff, 0xeb, 0x8d, 0x1c, 0x11, 0x44, 0x7d, 0x7d, 0xbd, 0xfb, 0xb1, 0x50, 0x88, 0xeb, 0xf9, 0x3c, 0x52, 0xa9, 0x54, 0x2e, 0x9b, 0xcd, 0xf6, 0x14, 0xe6, 0xd8, 0xe1, 0x23, 0x9d, 0x0d, 0x92, 0x24, 0xc5, 0x19, 0x73, 0x74, 0x94, 0xf9, 0xca, 0x5c, 0x1e, 0x8f, 0x07, 0x4b, 0x8b, 0xcb, 0xe6, 0xd4, 0xd4, 0xd4, 0x77, 0x86, 0x61, 0xbc, 0x08, 0x00, 0xe3, 0x97, 0xc6, 0x8f, 0x0b, 0x61, 0x27, 0x2a, 0x2b, 0x2b, 0x58, 0xa9, 0xf7, 0x41, 0xd7, 0x4a, 0x66, 0x65, 0xf4, 0x85, 0x97, 0x0e, 0x9f, 0xb1, 0x6d, 0xfb, 0x32, 0x23, 0xd0, 0x48, 0x5b, 0xa2, 0xad, 0xcc, 0xed, 0x72, 0xd2, 0xe6, 0x92, 0x12, 0x78, 0x36, 0x79, 0x70, 0xee, 0xea, 0xd7, 0xff, 0xae, 0x66, 0x57, 0x8f, 0x9e, 0x1e, 0xfc, 0xf2, 0x2f, 0x00, 0x38, 0xf8, 0xfc, 0x81, 0xa3, 0xd3, 0xd3, 0xd3, 0xb3, 0x5b, 0x2b, 0xb7, 0x96, 0x04, 0x6b, 0x6b, 0x9c, 0x55, 0xdb, 0xb6, 0x6d, 0xd7, 0x35, 0xbd, 0xee, 0xdb, 0x8b, 0x17, 0xff, 0x96, 0x74, 0x4d, 0x87, 0x44, 0x80, 0x44, 0x12, 0x14, 0x59, 0x81, 0xaa, 0x3a, 0x01, 0x10, 0xb4, 0x9c, 0xc6, 0x0b, 0x98, 0x5a, 0x4e, 0xe3, 0x86, 0x61, 0x92, 0x83, 0x39, 0x00, 0x22, 0x08, 0x5b, 0xc0, 0xb2, 0x6c, 0xe8, 0x39, 0x1d, 0xf4, 0x6c, 0xdb, 0xae, 0x06, 0xc6, 0x58, 0x9c, 0x73, 0xde, 0xd1, 0xd2, 0xd2, 0x52, 0x9d, 0x48, 0x24, 0x9c, 0xcb, 0x4b, 0xcb, 0xf6, 0x47, 0x1f, 0x7f, 0x38, 0x91, 0xcf, 0xaf, 0x1d, 0x01, 0x00, 0x59, 0xe6, 0x27, 0x3a, 0x3b, 0x3b, 0x63, 0x3e, 0x9f, 0x4f, 0xba, 0x70, 0xe1, 0xbc, 0x96, 0x4e, 0xcf, 0x2d, 0x98, 0xa6, 0x75, 0xc6, 0xb2, 0xac, 0xcb, 0xeb, 0x29, 0x34, 0xb7, 0xc4, 0x2a, 0xfc, 0x7e, 0xdf, 0xcc, 0xcb, 0xaf, 0x74, 0x95, 0x6e, 0x29, 0xaf, 0xc0, 0xed, 0x5b, 0xb7, 0xc5, 0xc8, 0xe8, 0xc8, 0x3f, 0xb6, 0x2d, 0xb0, 0x7b, 0xcf, 0xee, 0x4d, 0x81, 0xaa, 0x2a, 0x9a, 0x4d, 0xff, 0x8c, 0xc1, 0x81, 0xd3, 0x99, 0x4c, 0xe6, 0x6e, 0xf8, 0xca, 0x0f, 0x13, 0x8b, 0x1b, 0x52, 0x50, 0x14, 0x25, 0xd9, 0xd8, 0xd8, 0xe8, 0xe6, 0x0e, 0x19, 0xbf, 0xa4, 0x66, 0x50, 0xfe, 0xf0, 0x16, 0xea, 0xea, 0xea, 0xda, 0x4c, 0x44, 0xb8, 0x77, 0xef, 0x2e, 0x66, 0xd3, 0x33, 0xf0, 0xfb, 0xca, 0x11, 0x0e, 0xd7, 0xbb, 0xae, 0xfc, 0x38, 0x91, 0x04, 0x70, 0x68, 0xfd, 0x90, 0xa2, 0xb1, 0x48, 0x40, 0x92, 0xa4, 0xf6, 0x48, 0xa4, 0x49, 0x1d, 0x1b, 0x1f, 0xd3, 0x4e, 0x9d, 0x1c, 0xcc, 0x0c, 0x9f, 0x1d, 0xd6, 0xfe, 0xb8, 0xf5, 0x3b, 0x16, 0x7e, 0x5b, 0xc0, 0xd0, 0xf0, 0x90, 0x76, 0xea, 0xe4, 0xe7, 0x99, 0xa9, 0xc9, 0x49, 0xbd, 0xf5, 0xe9, 0x56, 0x27, 0x81, 0xda, 0xa3, 0xb1, 0xc8, 0xc6, 0x43, 0x7a, 0x66, 0x57, 0xeb, 0x35, 0x22, 0x0a, 0x0a, 0x88, 0xb3, 0xba, 0xa6, 0xf7, 0x28, 0x8a, 0x32, 0xfa, 0xda, 0xeb, 0xaf, 0x6e, 0xd7, 0x35, 0x0d, 0xc7, 0x4f, 0x7c, 0x32, 0x9b, 0xd7, 0xf3, 0xfb, 0x54, 0xa7, 0x9a, 0x24, 0x50, 0xbb, 0x10, 0x62, 0x7e, 0xec, 0xfb, 0x4b, 0x3b, 0x00, 0x00, 0x42, 0x88, 0xf5, 0x7e, 0x2a, 0xda, 0x14, 0x28, 0xe8, 0x9d, 0xcd, 0xd1, 0xee, 0xa1, 0xe1, 0xaf, 0xc4, 0xc0, 0x67, 0x9f, 0xda, 0x3b, 0x9b, 0xa3, 0xdd, 0xc5, 0x3c, 0x42, 0x88, 0xff, 0x09, 0xee, 0xaf, 0x68, 0x2c, 0xd2, 0xe0, 0x7e, 0xc0, 0x3d, 0x62, 0x59, 0x96, 0xd0, 0x35, 0x7d, 0xff, 0xe4, 0xc4, 0x74, 0xd1, 0x77, 0xfe, 0x0f, 0xf4, 0xf1, 0x65, 0xb6, 0x07, 0xad, 0x27, 0xde, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00, 0x00, 0x28, 0x75, 0x75, 0x61, 0x79, 0x29, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x62, 0x74, 0x2f, 0x00, 0x06, 0x00, 0x00, 0x00, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x74, 0x75, 0x72, 0x74, 0x6c, 0x65, 0x2d, 0x67, 0x72, 0x65, 0x79, 0x2e, 0x70, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0e, 0x08, 0x06, 0x00, 0x00, 0x00, 0x2f, 0xc4, 0x3c, 0xf0, 0x00, 0x00, 0x00, 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, 0x88, 0x00, 0x00, 0x01, 0x20, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xdd, 0x93, 0x3f, 0x4b, 0x86, 0x50, 0x14, 0xc6, 0x8f, 0xf7, 0xfa, 0xdf, 0xab, 0xf7, 0x0e, 0x8a, 0x4e, 0xee, 0x6e, 0x7e, 0x84, 0xa6, 0xb0, 0x5d, 0x1c, 0x82, 0x97, 0xde, 0xa9, 0xc1, 0xa9, 0x2d, 0x70, 0xf0, 0xab, 0x48, 0x9f, 0x21, 0x90, 0x1c, 0x82, 0x96, 0x46, 0x69, 0x77, 0x6a, 0xeb, 0x3b, 0x28, 0x7a, 0x1a, 0x0a, 0x51, 0xb3, 0x21, 0x7a, 0x21, 0xe8, 0x81, 0xb3, 0x9c, 0x7b, 0x78, 0xf8, 0xf1, 0x3c, 0x5c, 0x09, 0x11, 0xe1, 0x94, 0x22, 0x27, 0x75, 0xfb, 0x13, 0x43, 0x59, 0x96, 0xcf, 0x54, 0x55, 0xbd, 0xa1, 0x94, 0xc6, 0x7b, 0xef, 0x92, 0x24, 0xad, 0x17, 0x88, 0xb8, 0x3b, 0x94, 0xd2, 0xd8, 0xb2, 0xac, 0x17, 0xce, 0x39, 0x72, 0xce, 0xd1, 0x71, 0x1c, 0x34, 0x0c, 0xa3, 0xda, 0xde, 0x6d, 0x3d, 0x76, 0x09, 0x15, 0x45, 0x89, 0x85, 0x10, 0x4f, 0x8c, 0xb1, 0x98, 0x31, 0x06, 0xb6, 0x6d, 0x03, 0x63, 0x0c, 0x18, 0x63, 0x47, 0xdb, 0xb6, 0x2b, 0x00, 0x00, 0x5d, 0xd7, 0x8f, 0x42, 0x08, 0x34, 0x4d, 0xb3, 0x5a, 0x11, 0x6f, 0x5b, 0xa6, 0x94, 0x0a, 0xcf, 0xf3, 0x5e, 0x35, 0x4d, 0xe3, 0x8a, 0xa2, 0x00, 0x21, 0x64, 0xa6, 0x18, 0xc7, 0x11, 0xfa, 0xbe, 0x87, 0x61, 0x18, 0x80, 0x10, 0x02, 0x94, 0x52, 0xf0, 0x7d, 0xff, 0xa1, 0x6d, 0xdb, 0x8b, 0x39, 0xa2, 0x2d, 0x9d, 0xeb, 0xba, 0x77, 0x96, 0x65, 0x71, 0x4d, 0xd3, 0x66, 0xb3, 0x65, 0x3c, 0x61, 0x18, 0x76, 0x59, 0x96, 0xdd, 0xe7, 0x79, 0xde, 0x7d, 0xae, 0xbb, 0xe5, 0xcd, 0x17, 0x42, 0x00, 0x38, 0x2f, 0x8a, 0xe2, 0xb2, 0xae, 0xeb, 0xab, 0x6d, 0xe0, 0xd3, 0x34, 0x41, 0x10, 0x04, 0x8f, 0x4d, 0xd3, 0x1c, 0x00, 0xe0, 0x0d, 0xe0, 0xa3, 0x94, 0x95, 0xc7, 0x5e, 0x21, 0x49, 0x92, 0xdc, 0xa6, 0x69, 0xfa, 0x8c, 0x88, 0xd7, 0xcb, 0x29, 0xcb, 0xb2, 0x8a, 0xa2, 0x08, 0x7d, 0xdf, 0xaf, 0xbe, 0x2b, 0x65, 0x8f, 0xf0, 0x57, 0xfa, 0x07, 0x3f, 0xe5, 0xa7, 0x7a, 0x07, 0x84, 0x79, 0x9b, 0xe7, 0x71, 0x1d, 0x09, 0x83, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00, 0x00, 0x28, 0x75, 0x75, 0x61, 0x79, 0x29, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x2e, 0x70, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0xf3, 0xff, 0x61, 0x00, 0x00, 0x00, 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, 0x88, 0x00, 0x00, 0x03, 0x16, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0x5d, 0x53, 0x4d, 0x6f, 0x54, 0x65, 0x18, 0x3d, 0xef, 0xc7, 0xbd, 0x77, 0xbe, 0xda, 0xf9, 0xac, 0x33, 0x2d, 0x29, 0x20, 0x24, 0x84, 0x02, 0x41, 0x4a, 0x6b, 0x67, 0xe7, 0xc7, 0xaa, 0x8b, 0x6a, 0x8c, 0x8b, 0xce, 0x02, 0xfe, 0x80, 0xba, 0x32, 0xfe, 0x0e, 0x8c, 0x1f, 0x1b, 0x4c, 0xba, 0xb3, 0x04, 0x42, 0x5d, 0x90, 0x8a, 0x52, 0x13, 0x4d, 0x4a, 0x4c, 0x0c, 0x89, 0x56, 0x12, 0xed, 0x70, 0x59, 0x48, 0x17, 0x96, 0xb4, 0xcc, 0xb4, 0x9d, 0x92, 0x4e, 0x3b, 0xf7, 0xbe, 0xef, 0x7b, 0xdf, 0x0f, 0x17, 0xb4, 0x13, 0xf0, 0x24, 0x4f, 0xf2, 0x2c, 0x9e, 0x73, 0x9e, 0xe7, 0x39, 0xc9, 0x21, 0xf8, 0x1f, 0x96, 0x7e, 0x59, 0xba, 0xc8, 0x29, 0xf9, 0x88, 0x50, 0x32, 0x63, 0x8d, 0xae, 0x01, 0x00, 0x65, 0xbc, 0x65, 0x9d, 0xbd, 0xeb, 0x94, 0xf9, 0x66, 0x7a, 0xfa, 0xbd, 0xe6, 0xcb, 0xf3, 0xe4, 0xa8, 0x59, 0x58, 0x58, 0xf0, 0x33, 0x83, 0xc1, 0x75, 0x46, 0xc8, 0x95, 0x62, 0xa1, 0x12, 0x70, 0xcf, 0x23, 0x94, 0x50, 0x04, 0x41, 0x80, 0x5c, 0x36, 0x87, 0xc4, 0x48, 0xbb, 0xb6, 0xf6, 0x8f, 0xd4, 0xda, 0xdc, 0xec, 0xed, 0xcb, 0x4f, 0x1a, 0x8d, 0x86, 0xea, 0x0b, 0x2c, 0x2f, 0x2f, 0xf3, 0xe7, 0xfb, 0x3b, 0xbf, 0x96, 0x8b, 0xa5, 0x89, 0x4a, 0xb9, 0xea, 0x6f, 0x6f, 0x6f, 0x63, 0xb7, 0xd3, 0x81, 0x10, 0x02, 0x00, 0x10, 0xa4, 0x02, 0xd4, 0xa7, 0xea, 0x28, 0x14, 0x8b, 0x08, 0x1f, 0xaf, 0x8a, 0x8d, 0x8d, 0x8d, 0x87, 0x89, 0x74, 0x6f, 0x35, 0x1a, 0x0d, 0x43, 0x01, 0xa0, 0xdd, 0xd9, 0xbc, 0x96, 0xcf, 0x15, 0x26, 0x2a, 0xa5, 0xaa, 0xdf, 0x6c, 0x36, 0xb1, 0xbe, 0xfe, 0x2f, 0xa4, 0x92, 0xf0, 0x03, 0x1f, 0xdc, 0xe3, 0x10, 0x42, 0x60, 0xe5, 0xcf, 0x15, 0x48, 0x29, 0x71, 0x7e, 0xec, 0x62, 0xaa, 0x56, 0x1b, 0x1e, 0xb7, 0x44, 0x5d, 0x03, 0x00, 0x32, 0xf7, 0xed, 0xdc, 0xeb, 0x69, 0x3f, 0xf5, 0xd7, 0xc4, 0xa5, 0xc9, 0x81, 0x95, 0x95, 0xdf, 0x11, 0xc7, 0x31, 0x38, 0xe7, 0x60, 0x8c, 0x81, 0x52, 0x0a, 0x00, 0x30, 0xc6, 0x00, 0x00, 0x66, 0x66, 0x66, 0x60, 0x9d, 0x45, 0x3a, 0x9d, 0xc1, 0xbd, 0x1f, 0x7f, 0xd8, 0x3b, 0xd0, 0xf1, 0x1b, 0xd4, 0x69, 0xfd, 0xd9, 0x89, 0x63, 0xa3, 0xb9, 0xa7, 0x4f, 0xd7, 0xd1, 0xe9, 0x74, 0x20, 0xa5, 0x84, 0x10, 0x02, 0x71, 0x1c, 0x23, 0x8a, 0x22, 0x44, 0x51, 0x04, 0x21, 0x04, 0x52, 0x41, 0x00, 0xeb, 0x1c, 0xb4, 0xd6, 0x48, 0x94, 0xc2, 0xf9, 0x0b, 0x17, 0x06, 0x9c, 0xd0, 0x9f, 0x72, 0x2d, 0xf5, 0x07, 0x83, 0xf9, 0x22, 0x79, 0x14, 0xfe, 0x06, 0x21, 0x04, 0x18, 0x63, 0x20, 0x84, 0x80, 0x52, 0x0a, 0x42, 0x5e, 0x78, 0xec, 0x9c, 0xc3, 0x54, 0x7d, 0x0a, 0xd6, 0x1a, 0x58, 0x67, 0x11, 0xcb, 0x08, 0xd5, 0x6a, 0x8d, 0x2a, 0xa5, 0x3e, 0xe4, 0xbd, 0xb8, 0x57, 0xf5, 0x3d, 0x0f, 0xed, 0x76, 0x1b, 0xd6, 0x5a, 0x50, 0x4a, 0x5f, 0x21, 0x0f, 0x55, 0x86, 0x70, 0x79, 0x62, 0x1c, 0xc3, 0xc3, 0x23, 0x30, 0x56, 0xc3, 0x1a, 0x03, 0x63, 0x0d, 0x06, 0xb2, 0x79, 0xc4, 0x22, 0xae, 0xf1, 0x44, 0x29, 0x17, 0x45, 0x11, 0xe2, 0x38, 0x86, 0xb5, 0xb6, 0xbf, 0x7d, 0x6c, 0xec, 0x2c, 0xa6, 0xea, 0x75, 0xe4, 0xf3, 0x79, 0x38, 0x67, 0x61, 0x4c, 0x02, 0x63, 0x0d, 0xcc, 0xa1, 0x80, 0xb1, 0x06, 0x4a, 0x4a, 0x50, 0x6d, 0x4d, 0xbb, 0xb3, 0xdb, 0x81, 0xe7, 0xf9, 0xfd, 0x9f, 0x47, 0x8e, 0x8d, 0xe0, 0xed, 0x77, 0xdf, 0x41, 0x26, 0x9b, 0x41, 0xa2, 0x93, 0xc3, 0xd2, 0xd0, 0x5a, 0x43, 0x1b, 0x0d, 0x42, 0x09, 0xba, 0xdd, 0x3d, 0x68, 0x6d, 0x5b, 0x54, 0x44, 0x62, 0xb1, 0xdd, 0x6e, 0xb9, 0x52, 0xa9, 0x88, 0xa3, 0x4b, 0xc6, 0xc7, 0x2f, 0x41, 0xeb, 0x04, 0x49, 0xa2, 0x90, 0x24, 0xea, 0x05, 0x51, 0x27, 0xd0, 0x5a, 0xc3, 0x18, 0x0d, 0xce, 0x3c, 0xac, 0x3d, 0x79, 0x62, 0xa5, 0x8c, 0xef, 0x50, 0x19, 0x1f, 0x7c, 0x1e, 0x86, 0xcd, 0xfd, 0x42, 0xa1, 0x00, 0xce, 0x39, 0x7a, 0xbd, 0x1e, 0x06, 0xf3, 0x03, 0x87, 0xc4, 0xa4, 0x2f, 0xa4, 0x75, 0x02, 0x6d, 0x12, 0x00, 0x00, 0xa5, 0x14, 0xcb, 0xf7, 0xef, 0x77, 0x0f, 0xba, 0xe2, 0x0b, 0xf6, 0xe0, 0xc1, 0x1f, 0x7b, 0x6f, 0x4e, 0x4e, 0xd6, 0xac, 0x73, 0x97, 0x87, 0x86, 0x5e, 0x63, 0x5b, 0x5b, 0x5b, 0x38, 0x75, 0xfa, 0x14, 0xb2, 0xb9, 0x0c, 0xac, 0xb3, 0xb0, 0xd6, 0xc2, 0x1c, 0xba, 0x4f, 0x29, 0x43, 0x36, 0x93, 0xc3, 0x4f, 0xf7, 0x96, 0xa2, 0xcd, 0xcd, 0x8d, 0xb9, 0xaf, 0xbe, 0xfc, 0xfa, 0x3b, 0x06, 0x00, 0xa3, 0xa3, 0xc7, 0x7f, 0x36, 0x46, 0x4e, 0x33, 0xc6, 0xaa, 0xe5, 0x72, 0x85, 0x3d, 0xdf, 0xdd, 0xc5, 0x99, 0xb3, 0x67, 0xfa, 0x81, 0x61, 0x8c, 0x21, 0xf0, 0x53, 0xa0, 0x84, 0xe1, 0xee, 0xe2, 0x62, 0x1c, 0x86, 0x8f, 0x1e, 0xb6, 0x9e, 0xed, 0x5c, 0x0d, 0xc3, 0xd0, 0x31, 0x00, 0x08, 0xc3, 0xd0, 0x9d, 0x3c, 0x79, 0xfa, 0x86, 0xd4, 0x62, 0x74, 0x7f, 0xaf, 0x7b, 0xce, 0xf3, 0x7d, 0xb6, 0xb3, 0xd3, 0x21, 0xe5, 0x52, 0x19, 0xe9, 0x4c, 0x1a, 0xdd, 0xee, 0x01, 0x56, 0xff, 0x5e, 0x35, 0xb7, 0x6e, 0xdc, 0x14, 0xcf, 0xb6, 0x5a, 0xb7, 0x60, 0x79, 0x63, 0x7e, 0x7e, 0x5e, 0xbf, 0x92, 0xc6, 0x23, 0xcc, 0xce, 0xce, 0x9e, 0xf3, 0x02, 0xfa, 0x31, 0xa3, 0xfc, 0x7d, 0xa5, 0x64, 0x8d, 0x10, 0x02, 0x8f, 0x7b, 0x2d, 0x0d, 0xf3, 0xbd, 0x55, 0xea, 0xfa, 0xed, 0xdb, 0x77, 0x1e, 0xbf, 0x3c, 0xff, 0x1f, 0xb9, 0x48, 0xb8, 0x93, 0x71, 0xcd, 0xce, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00, 0x00, 0x28, 0x75, 0x75, 0x61, 0x79, 0x29, 0x6c, 0x6f, 0x67, 0x6f, 0x2d, 0x34, 0x38, 0x2e, 0x70, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x0b, 0x9d, 0x49, 0x44, 0x41, 0x54, 0x78, 0x5e, 0xed, 0x58, 0x69, 0x6c, 0x1c, 0xe5, 0x19, 0x7e, 0x66, 0x76, 0xd6, 0xbb, 0xeb, 0x5d, 0xdb, 0xf1, 0x7d, 0xc6, 0x49, 0x4c, 0x7c, 0x24, 0xd8, 0x49, 0x9d, 0x9b, 0xd2, 0x00, 0x21, 0x09, 0x6d, 0x51, 0x42, 0x11, 0x21, 0xa2, 0x45, 0x42, 0x2a, 0x2a, 0xad, 0xfa, 0x33, 0x3d, 0xa8, 0x0a, 0x6a, 0xf9, 0x53, 0x15, 0x48, 0x68, 0x4a, 0x68, 0x0e, 0x82, 0x90, 0x5a, 0xa9, 0xb4, 0x42, 0xb4, 0x80, 0xfa, 0xa3, 0xfd, 0x41, 0xb8, 0xd2, 0x24, 0x6a, 0x69, 0x13, 0x3b, 0x38, 0x17, 0xc1, 0x21, 0x76, 0xe2, 0x38, 0x3e, 0xf7, 0xf0, 0xfa, 0x5a, 0x7b, 0x77, 0x67, 0xbe, 0x3e, 0x7a, 0xb5, 0x1a, 0xed, 0xae, 0x77, 0x6d, 0xa7, 0x0d, 0x8a, 0x90, 0xfa, 0x6a, 0x1f, 0x7d, 0xdf, 0x7c, 0xf3, 0xcd, 0x37, 0xef, 0x79, 0xcc, 0xe2, 0xff, 0x94, 0x86, 0x5f, 0xfd, 0xfa, 0xf9, 0x7d, 0xbb, 0x5f, 0x78, 0x36, 0xf6, 0xfc, 0x9e, 0x5f, 0xaa, 0x64, 0x70, 0x6d, 0xea, 0x85, 0xbd, 0xcf, 0x3d, 0x45, 0xe0, 0x66, 0x62, 0xde, 0x1b, 0x0f, 0x00, 0x5b, 0x0f, 0x02, 0xfb, 0x0e, 0x03, 0x1f, 0x71, 0x1c, 0xd9, 0x0f, 0xa8, 0x74, 0x3c, 0xe7, 0x76, 0xab, 0xdd, 0xcf, 0xff, 0x42, 0x7d, 0x78, 0xe2, 0x88, 0xfa, 0x57, 0xfb, 0x71, 0xe2, 0x84, 0xe0, 0xa3, 0xb6, 0xe3, 0xea, 0xdd, 0xa3, 0x7f, 0x93, 0x7b, 0x4f, 0xcb, 0xde, 0x99, 0x38, 0x04, 0xf8, 0x79, 0xf6, 0xf1, 0x83, 0x64, 0x89, 0xd7, 0x77, 0x12, 0x98, 0x1b, 0xf3, 0xdc, 0x74, 0x88, 0xbf, 0x57, 0x75, 0x7d, 0xfc, 0xbd, 0xa5, 0x4b, 0xd5, 0x99, 0x47, 0x1e, 0x51, 0x9d, 0x8f, 0x3e, 0xaa, 0xba, 0x1f, 0x7b, 0x6c, 0x06, 0xfe, 0xc9, 0xf5, 0xdf, 0xbc, 0xb4, 0x57, 0x8d, 0x8e, 0x85, 0x55, 0x20, 0x18, 0x20, 0xfc, 0x82, 0x60, 0x28, 0xc0, 0xb5, 0x51, 0xb1, 0xc4, 0x3b, 0xdb, 0xb7, 0x67, 0x7c, 0x96, 0x67, 0xca, 0xd9, 0xef, 0x54, 0x57, 0x5b, 0x87, 0x35, 0x6d, 0x82, 0x02, 0xfd, 0x8c, 0xc0, 0x5c, 0xd0, 0x1d, 0x00, 0x66, 0x43, 0x00, 0x30, 0x94, 0xa6, 0x3d, 0x71, 0xff, 0x92, 0x25, 0xde, 0xd5, 0xab, 0x56, 0xa1, 0x6e, 0xc3, 0x06, 0x54, 0x71, 0x2c, 0x6d, 0x69, 0x99, 0x81, 0xc2, 0x86, 0x06, 0x18, 0x86, 0x01, 0x28, 0xfe, 0x2c, 0x93, 0xb0, 0x04, 0x96, 0x69, 0x42, 0x83, 0x10, 0x0a, 0xeb, 0xeb, 0x33, 0x3e, 0x5b, 0xb5, 0x7a, 0xb5, 0x9c, 0xbd, 0xa6, 0xa5, 0x45, 0xfb, 0xea, 0xa2, 0x45, 0xb9, 0x00, 0x7e, 0x8c, 0xb9, 0x69, 0x6e, 0x09, 0x7f, 0x07, 0xb8, 0x0f, 0x39, 0x9d, 0xf1, 0x2b, 0xad, 0xad, 0xea, 0x53, 0x40, 0x75, 0x1a, 0x46, 0x56, 0x1c, 0x2b, 0x2c, 0x54, 0x2f, 0xef, 0x7f, 0x51, 0x45, 0xa3, 0x51, 0x35, 0x39, 0x39, 0x99, 0x02, 0xae, 0x89, 0x05, 0xfe, 0xea, 0x70, 0xcc, 0x76, 0x86, 0xbc, 0xa3, 0x6b, 0xed, 0x5a, 0x75, 0x10, 0x88, 0x10, 0x98, 0x0b, 0xba, 0x02, 0x30, 0x1b, 0xae, 0x02, 0x71, 0x65, 0x9a, 0x56, 0x2f, 0x35, 0x3b, 0xd4, 0xd8, 0x88, 0x1e, 0x9f, 0x0f, 0x57, 0x1c, 0x0e, 0x74, 0x51, 0xab, 0x5d, 0xf1, 0x78, 0x0a, 0x7a, 0x09, 0x4d, 0xd7, 0xc5, 0x0a, 0x6e, 0xb7, 0x3b, 0x05, 0x4e, 0xa7, 0x13, 0x24, 0xf4, 0xce, 0x7c, 0x4e, 0xce, 0xba, 0xc2, 0x67, 0xae, 0xe5, 0xe5, 0x61, 0x78, 0xf9, 0x72, 0x5c, 0xe3, 0x9a, 0x02, 0xa6, 0x08, 0xcc, 0x05, 0x43, 0x61, 0x76, 0x2a, 0x01, 0x05, 0xb0, 0xac, 0xc3, 0x67, 0x4f, 0x9f, 0xfe, 0x4e, 0x79, 0x7d, 0xbd, 0xc7, 0xdd, 0xd0, 0xa0, 0xb9, 0xbc, 0x5e, 0x61, 0x0a, 0x9a, 0x86, 0x64, 0x9a, 0xe4, 0xf5, 0xb8, 0x43, 0x47, 0x34, 0x16, 0xc5, 0xf4, 0xf4, 0x34, 0x92, 0xc9, 0xe3, 0xf6, 0x40, 0xc6, 0x8d, 0x1b, 0x91, 0x4b, 0x46, 0x53, 0x48, 0x29, 0x44, 0x23, 0x11, 0x4c, 0x4f, 0x4e, 0x62, 0x64, 0x64, 0xc4, 0x1a, 0xbc, 0x78, 0x71, 0x4a, 0x03, 0x76, 0x63, 0x3e, 0x74, 0x70, 0x9e, 0x78, 0x09, 0xd8, 0xc4, 0xf1, 0x05, 0xe2, 0xd8, 0x01, 0x60, 0x68, 0x3f, 0x10, 0x4b, 0xc7, 0x73, 0x79, 0x79, 0xb1, 0x97, 0x0f, 0xee, 0x53, 0x23, 0xe1, 0x90, 0xba, 0xda, 0xd3, 0x9d, 0x82, 0xb1, 0x71, 0x09, 0x62, 0xf5, 0x14, 0x10, 0xcf, 0xf4, 0x2c, 0xcf, 0xed, 0xe7, 0xb9, 0x1f, 0x10, 0xcf, 0x12, 0xeb, 0x09, 0xcc, 0x03, 0x9c, 0xdc, 0x44, 0xec, 0xd9, 0xb3, 0xa7, 0xe2, 0xd0, 0xe1, 0xfd, 0x91, 0xbe, 0xfe, 0x5e, 0xd5, 0x71, 0xb6, 0x3d, 0x05, 0x83, 0x43, 0x03, 0x22, 0x00, 0x81, 0x9b, 0x09, 0x7d, 0x9c, 0x93, 0x9b, 0x05, 0x12, 0x2c, 0xd3, 0x02, 0x53, 0x26, 0x42, 0x23, 0xa1, 0x14, 0x8c, 0x8d, 0x8f, 0xe1, 0xf3, 0x20, 0x1d, 0x37, 0x99, 0x4c, 0xcb, 0x54, 0xe1, 0xf0, 0x08, 0xc2, 0x23, 0xa9, 0x18, 0xe5, 0xda, 0x17, 0x43, 0x00, 0xd3, 0x44, 0x28, 0x18, 0x02, 0x83, 0x31, 0x05, 0xc1, 0x60, 0xf0, 0x8b, 0x21, 0x80, 0x65, 0x29, 0xf8, 0x83, 0x01, 0x8c, 0x84, 0xc3, 0x29, 0xf0, 0x07, 0xfc, 0x5f, 0x14, 0x01, 0x4c, 0x71, 0x99, 0xc8, 0x64, 0x24, 0x05, 0xa1, 0x50, 0x08, 0x9f, 0x07, 0x19, 0x98, 0x07, 0x9d, 0x6a, 0x3b, 0xfd, 0x4d, 0x4d, 0x61, 0x07, 0x34, 0x6c, 0x04, 0x54, 0x39, 0x32, 0x93, 0x14, 0xab, 0x96, 0x96, 0x66, 0x4c, 0x4d, 0x4d, 0x21, 0x9d, 0x22, 0x91, 0x88, 0x8c, 0x6d, 0x6d, 0xed, 0x0a, 0xd9, 0x29, 0x06, 0x4d, 0x9d, 0xd2, 0x94, 0x7e, 0x5c, 0x59, 0xda, 0x6e, 0x00, 0x73, 0xfa, 0x9d, 0xb6, 0x73, 0xe7, 0xce, 0xd9, 0x37, 0x68, 0xd6, 0xb7, 0x5c, 0x1e, 0xf7, 0x1f, 0x17, 0x56, 0xd7, 0x6a, 0x9e, 0x5c, 0x0f, 0xaf, 0x35, 0x8c, 0x8d, 0x8e, 0x81, 0xad, 0x01, 0x4c, 0xcb, 0x82, 0x52, 0x16, 0xb5, 0x2e, 0x80, 0xae, 0xe9, 0xa8, 0xa9, 0xad, 0x92, 0x3d, 0xd9, 0x68, 0x60, 0x60, 0x10, 0x0e, 0xcd, 0x01, 0x56, 0x6c, 0x42, 0xf6, 0xc1, 0xc1, 0xca, 0x9e, 0xc7, 0xe2, 0xa6, 0x29, 0x85, 0x08, 0x85, 0x0f, 0xd0, 0xdd, 0x86, 0xfd, 0xfe, 0x63, 0xb0, 0xf4, 0xad, 0x00, 0xa2, 0xff, 0xb5, 0x05, 0x86, 0x87, 0x87, 0x8d, 0xb2, 0x8a, 0x92, 0x57, 0xd7, 0xaf, 0xbb, 0x43, 0x0b, 0xf8, 0xfd, 0x18, 0xe4, 0xcb, 0xcf, 0x9f, 0x3f, 0x2f, 0x01, 0xc9, 0x97, 0x22, 0x8d, 0xa4, 0x3a, 0x57, 0xd5, 0x54, 0xc8, 0xbd, 0x6c, 0x74, 0xec, 0xe8, 0xf1, 0x34, 0x05, 0x49, 0xdc, 0xc0, 0xe5, 0xca, 0x41, 0xcd, 0xc2, 0x1a, 0x2c, 0x5a, 0xbc, 0x18, 0x55, 0xd5, 0x35, 0x88, 0xc7, 0xcd, 0xbb, 0x82, 0x23, 0x23, 0x4f, 0x48, 0x4b, 0x36, 0x0b, 0x19, 0x4a, 0xcf, 0x6e, 0xd1, 0xd2, 0xd2, 0xd2, 0x65, 0x1e, 0x8f, 0xdb, 0x5b, 0x52, 0x5c, 0x0c, 0xff, 0xf0, 0x10, 0xae, 0xf7, 0x5d, 0x47, 0x23, 0xfb, 0xa1, 0x7b, 0xee, 0xd9, 0x24, 0xee, 0xa2, 0x54, 0xea, 0xb3, 0xd4, 0x1a, 0x82, 0xa1, 0x21, 0xcc, 0x46, 0x4f, 0x3e, 0xf9, 0x13, 0x79, 0x36, 0x89, 0xe4, 0x9c, 0xbe, 0xbe, 0x3e, 0xbc, 0xf5, 0xf6, 0x9b, 0xc8, 0xcf, 0xcf, 0x47, 0x2e, 0x15, 0x51, 0x52, 0x5a, 0x02, 0xd6, 0x8f, 0x3b, 0xe7, 0x14, 0x40, 0x43, 0x76, 0x01, 0x94, 0x6e, 0xae, 0x29, 0x29, 0x2e, 0x41, 0x4e, 0x4e, 0x0e, 0x0c, 0xc3, 0x89, 0xb1, 0xb1, 0x31, 0xfc, 0xf0, 0x07, 0x3f, 0x82, 0xcf, 0xe7, 0x13, 0x97, 0x49, 0x06, 0x09, 0x7d, 0x03, 0x03, 0x76, 0x2c, 0x64, 0xa2, 0x58, 0x2c, 0x06, 0x87, 0x61, 0xa0, 0xba, 0xba, 0x1a, 0xe9, 0x54, 0x53, 0x53, 0x83, 0xe9, 0xe8, 0x34, 0x4e, 0x9f, 0x6e, 0x83, 0x82, 0x42, 0x69, 0x49, 0x29, 0x2e, 0x5d, 0xba, 0xb4, 0xe1, 0xcf, 0x6f, 0xbc, 0xa5, 0x01, 0xd9, 0x99, 0xd4, 0xb9, 0x01, 0x59, 0xa0, 0x33, 0x90, 0xd6, 0x56, 0xd3, 0x9c, 0xba, 0x7c, 0x35, 0x28, 0xbe, 0xb8, 0x4a, 0x2c, 0x50, 0x59, 0x59, 0x89, 0xaa, 0xaa, 0x2a, 0x7b, 0x24, 0x50, 0x51, 0x51, 0x81, 0x70, 0x78, 0x54, 0xfc, 0x9a, 0x02, 0x66, 0x04, 0x09, 0x13, 0xcc, 0x48, 0x25, 0x25, 0x25, 0x19, 0xd1, 0x7c, 0x7b, 0xb3, 0xc4, 0x0f, 0xf8, 0x2b, 0x2c, 0x2a, 0x04, 0x5d, 0xb1, 0x6e, 0xeb, 0x03, 0x5b, 0x2b, 0xc1, 0x95, 0x1b, 0x4d, 0xa3, 0x1a, 0xe1, 0x04, 0xac, 0xb5, 0x75, 0x4b, 0x96, 0xb0, 0xb3, 0x9c, 0x92, 0x0e, 0xb3, 0xa1, 0xbe, 0x41, 0xac, 0x41, 0x88, 0x96, 0x13, 0xa3, 0x8d, 0x2b, 0x3d, 0x3d, 0x12, 0xc8, 0x3e, 0x5f, 0x5e, 0x46, 0x90, 0x70, 0xad, 0xb7, 0x17, 0xd9, 0xa8, 0xb6, 0xb6, 0x56, 0x46, 0xfa, 0xbf, 0xb8, 0x55, 0x41, 0x41, 0x01, 0x5c, 0x9a, 0xb1, 0x51, 0xf8, 0xbc, 0x41, 0x01, 0x74, 0xfa, 0xa2, 0xd7, 0xe1, 0x30, 0x9a, 0xeb, 0xeb, 0x1b, 0x31, 0x3e, 0x31, 0x0e, 0xd3, 0xb4, 0xd0, 0xd8, 0xd4, 0x24, 0x8c, 0x66, 0x43, 0xcf, 0x35, 0x61, 0x0e, 0x79, 0x3e, 0x5f, 0x46, 0x90, 0x70, 0xb9, 0xbb, 0x0b, 0xd9, 0xc8, 0xe5, 0x72, 0x89, 0x55, 0x63, 0xd1, 0x18, 0xa6, 0xa7, 0xa6, 0x18, 0x83, 0x65, 0x70, 0x68, 0xc6, 0x9d, 0x89, 0x64, 0xa3, 0xcd, 0x57, 0x00, 0x8d, 0x70, 0xac, 0x58, 0xb1, 0x7c, 0x45, 0x6e, 0x6e, 0xae, 0x9b, 0x41, 0x8c, 0x38, 0x7d, 0x57, 0xd7, 0x81, 0xba, 0xba, 0xba, 0xac, 0xcc, 0x4b, 0x05, 0xf6, 0x0f, 0x43, 0xd3, 0x66, 0x77, 0xa1, 0xae, 0xcf, 0xba, 0x30, 0x0b, 0xc9, 0x3b, 0xe8, 0x86, 0x54, 0xda, 0x04, 0x85, 0xa9, 0xe2, 0x7b, 0xf5, 0xf5, 0x37, 0x2a, 0x80, 0xac, 0x7b, 0x7c, 0x79, 0xab, 0x2a, 0xca, 0xcb, 0x59, 0x94, 0xa6, 0xa1, 0x00, 0x61, 0x6c, 0x61, 0x4d, 0x6d, 0x56, 0x01, 0xae, 0xf6, 0x5c, 0x85, 0x2b, 0xc7, 0x89, 0x51, 0xd6, 0x88, 0xd1, 0xb1, 0xf1, 0x14, 0x84, 0xb9, 0x26, 0x08, 0x8f, 0x4a, 0x26, 0x23, 0xcd, 0xe2, 0x46, 0x8b, 0x90, 0x4b, 0xa5, 0x8d, 0x84, 0x47, 0x18, 0x73, 0x95, 0x30, 0x9c, 0x46, 0x0b, 0x6b, 0x84, 0xe7, 0x86, 0x2d, 0x90, 0xe3, 0x74, 0xb6, 0xd6, 0xd5, 0x2d, 0xc5, 0x38, 0xdb, 0x60, 0xd3, 0x8a, 0x8b, 0x06, 0x17, 0x2c, 0x28, 0x90, 0x56, 0x41, 0xd3, 0xa4, 0xf8, 0xa4, 0x08, 0xd0, 0xd5, 0xd5, 0x0d, 0xa7, 0x61, 0x60, 0x68, 0x38, 0x80, 0x9e, 0x9e, 0xeb, 0x36, 0xae, 0x5e, 0xed, 0xb5, 0xe7, 0xbc, 0x07, 0xc3, 0xa1, 0x33, 0xd5, 0x86, 0x12, 0x99, 0xcd, 0xa0, 0x86, 0x53, 0x59, 0x28, 0x2f, 0x2b, 0x87, 0xd7, 0xeb, 0xc3, 0x74, 0x64, 0x0a, 0x50, 0x52, 0x5b, 0x3c, 0xad, 0xad, 0x2d, 0x2b, 0x84, 0xd7, 0x0c, 0x42, 0x18, 0x59, 0x04, 0x30, 0x9c, 0x39, 0xce, 0xe6, 0x86, 0x86, 0x46, 0x04, 0x82, 0x01, 0xba, 0x50, 0x9c, 0x59, 0xa1, 0x08, 0x96, 0x54, 0x5e, 0xb1, 0x86, 0x0d, 0x32, 0x20, 0xc2, 0x5c, 0xb8, 0x70, 0x9e, 0xc1, 0x17, 0xc5, 0xe0, 0xb0, 0x1f, 0x39, 0x97, 0x2e, 0xa5, 0x57, 0x63, 0xde, 0x8b, 0x63, 0xc8, 0x1f, 0x00, 0x0b, 0x16, 0x85, 0xe9, 0xa1, 0x35, 0x6b, 0xe4, 0xbc, 0x34, 0x30, 0x70, 0x17, 0x08, 0x07, 0x4a, 0x29, 0xb1, 0x5a, 0x71, 0x71, 0x11, 0xfc, 0x43, 0xfe, 0x0d, 0x00, 0xfe, 0x41, 0xc4, 0xe7, 0x65, 0x01, 0xaf, 0xd7, 0xeb, 0xa6, 0x36, 0x9b, 0x96, 0xde, 0xb6, 0x94, 0xa5, 0xbf, 0x5f, 0xb4, 0x4e, 0xcd, 0x24, 0x5e, 0x62, 0x0a, 0x4c, 0x33, 0x15, 0x6d, 0xed, 0xed, 0xb4, 0x80, 0x03, 0x66, 0xdc, 0xc2, 0xb9, 0xf3, 0x17, 0x70, 0xf6, 0xec, 0xf9, 0x14, 0x7c, 0x72, 0xf1, 0x53, 0x58, 0xdc, 0xe7, 0xa0, 0x60, 0xdd, 0xdd, 0xdd, 0x59, 0x5d, 0x91, 0x96, 0x49, 0x64, 0x2d, 0x1f, 0xc6, 0x59, 0x77, 0x4a, 0x4b, 0xca, 0x60, 0xb8, 0x9c, 0x6b, 0x01, 0x38, 0xe6, 0x63, 0x01, 0x71, 0x9f, 0xe6, 0xe6, 0xe6, 0xe5, 0x1e, 0x46, 0x2f, 0xdf, 0x25, 0xbd, 0xbc, 0x02, 0x24, 0x4f, 0x93, 0xd1, 0x64, 0xcd, 0xcb, 0x76, 0x42, 0xac, 0x72, 0xee, 0xdc, 0x39, 0xac, 0x5c, 0xd9, 0x8c, 0xdb, 0xea, 0x16, 0x66, 0xeb, 0x85, 0xe4, 0x43, 0x7f, 0xb0, 0xff, 0x3a, 0x3e, 0xb9, 0x70, 0x41, 0x32, 0x0e, 0xb5, 0x2c, 0x4a, 0xe1, 0xb9, 0x62, 0x21, 0xce, 0x05, 0x15, 0xe5, 0x95, 0xd2, 0x6f, 0xc5, 0x68, 0xd1, 0xaa, 0xaa, 0x6a, 0x50, 0x99, 0xad, 0xd9, 0x02, 0x59, 0xcf, 0x9c, 0x42, 0x7d, 0xad, 0xc5, 0x25, 0xc5, 0x18, 0x18, 0x1c, 0xb0, 0xb5, 0x5d, 0x54, 0x58, 0x24, 0x73, 0x42, 0xba, 0x4d, 0xba, 0x8d, 0x14, 0x38, 0x4d, 0xd3, 0x11, 0x89, 0x4c, 0xd1, 0xcc, 0xc3, 0x30, 0xa8, 0xc1, 0x81, 0xfe, 0x41, 0xf4, 0xf7, 0x65, 0x46, 0xc0, 0x1f, 0xa2, 0x86, 0x5d, 0xb4, 0xc6, 0x45, 0xd1, 0x36, 0xfd, 0x1b, 0x54, 0x94, 0x08, 0x43, 0x85, 0xd8, 0x56, 0x28, 0x67, 0xf2, 0xc8, 0xa1, 0xab, 0x41, 0x81, 0xf3, 0x32, 0xd0, 0x2a, 0xb5, 0x4d, 0x4d, 0x4d, 0xe5, 0x99, 0xe2, 0x40, 0xcf, 0x64, 0x01, 0x97, 0xdb, 0xf5, 0xa5, 0xf2, 0xd2, 0x72, 0x71, 0x9f, 0xb8, 0x69, 0x51, 0x80, 0x38, 0x03, 0x78, 0x81, 0xed, 0x2e, 0xba, 0xae, 0xe1, 0xc0, 0x81, 0x03, 0x28, 0x62, 0x5c, 0x90, 0x11, 0x36, 0x61, 0x0b, 0x51, 0x54, 0x5c, 0xc8, 0x00, 0x35, 0xe0, 0xf1, 0xe6, 0x12, 0x9e, 0x8c, 0xc8, 0x25, 0xf2, 0xf3, 0x0a, 0xc4, 0x02, 0x2c, 0x52, 0xc2, 0x78, 0x4b, 0x4b, 0x0b, 0x8e, 0x1c, 0x39, 0x62, 0xff, 0x77, 0x44, 0xb0, 0xaa, 0x57, 0xc2, 0xa4, 0x45, 0x3c, 0xb9, 0xb9, 0x62, 0x25, 0xd6, 0x10, 0xad, 0xb2, 0xa6, 0x72, 0x83, 0xcd, 0xef, 0x1c, 0x02, 0xd0, 0x62, 0x46, 0x0b, 0xfb, 0x15, 0x0c, 0x33, 0xaf, 0x5b, 0x56, 0x5c, 0x0e, 0xa7, 0x16, 0x6c, 0x93, 0x73, 0xc4, 0xe3, 0x8f, 0x7f, 0x1b, 0x27, 0x4f, 0xfe, 0x1b, 0x9b, 0x37, 0x6f, 0x26, 0xe3, 0x0e, 0x94, 0x33, 0x67, 0x87, 0x98, 0x26, 0xfd, 0xc3, 0x81, 0xec, 0xf0, 0x07, 0x31, 0x19, 0x89, 0xa0, 0x88, 0xd6, 0xe5, 0x99, 0xd8, 0xbb, 0x77, 0x2f, 0x3a, 0x3a, 0x3a, 0xb0, 0x6d, 0xdb, 0xb6, 0x94, 0x18, 0x28, 0x2b, 0x2d, 0x93, 0x5a, 0xe0, 0xa2, 0xb5, 0x94, 0xb2, 0xc0, 0xa6, 0x12, 0x1e, 0xb7, 0x6b, 0x5d, 0xa6, 0x38, 0xd0, 0xd3, 0x98, 0xd7, 0x59, 0xbc, 0xdc, 0xcc, 0x40, 0x8d, 0xf4, 0x3d, 0x44, 0xd9, 0x5c, 0x19, 0x86, 0x83, 0x9a, 0x2e, 0x46, 0x12, 0xd9, 0x82, 0x94, 0x95, 0x95, 0xe2, 0xcd, 0x37, 0xff, 0x84, 0x7d, 0xfb, 0x5e, 0x44, 0xf7, 0xe5, 0xcb, 0xe8, 0x64, 0xa0, 0x0e, 0x07, 0x43, 0x08, 0x52, 0x90, 0x74, 0x04, 0x46, 0xc2, 0x12, 0xc8, 0xed, 0xa7, 0x4e, 0xe1, 0xee, 0x8d, 0x77, 0xa1, 0xb3, 0xb3, 0x13, 0xbb, 0x76, 0xed, 0xb2, 0x95, 0x93, 0x80, 0x2d, 0x08, 0x85, 0x00, 0x3d, 0x54, 0xdc, 0xb4, 0xa6, 0x66, 0x21, 0xd7, 0x72, 0x56, 0x03, 0x70, 0xce, 0xe5, 0x42, 0x7a, 0x53, 0x73, 0xd3, 0x32, 0x0f, 0x29, 0xc7, 0xc5, 0xbd, 0x1a, 0xa4, 0x7b, 0x64, 0x41, 0x43, 0x16, 0x12, 0x61, 0xb6, 0x6f, 0xdf, 0x86, 0xf6, 0xb6, 0x93, 0xd8, 0xb0, 0x6e, 0x1d, 0x2e, 0x9c, 0x39, 0x83, 0xa1, 0xc1, 0x21, 0x76, 0x96, 0x31, 0x1b, 0xc3, 0x4c, 0xad, 0x9f, 0xf2, 0x3b, 0xa2, 0x84, 0x2e, 0x77, 0xf4, 0xe8, 0x87, 0x78, 0xe5, 0x95, 0xc3, 0x54, 0x4a, 0xa1, 0x1d, 0x53, 0x84, 0x04, 0x3e, 0x2d, 0x6f, 0x0b, 0x50, 0x5d, 0xbd, 0x50, 0x7a, 0x22, 0xc6, 0x06, 0xea, 0x96, 0xd4, 0x71, 0xcd, 0x68, 0x06, 0xe0, 0x9a, 0x4b, 0x00, 0x47, 0x61, 0x41, 0x7e, 0x6b, 0x41, 0x7e, 0x01, 0xa2, 0xcc, 0x18, 0x12, 0x5c, 0xd0, 0xc4, 0x02, 0x73, 0x11, 0x7d, 0x9a, 0x8c, 0xbd, 0x8c, 0x3f, 0xbc, 0xf6, 0x7b, 0x8c, 0x33, 0x73, 0xf5, 0x5e, 0xe9, 0x42, 0x98, 0xe3, 0x35, 0xf6, 0x3e, 0xe3, 0xa1, 0x20, 0x0e, 0x1e, 0xd8, 0x8f, 0xf7, 0xdf, 0x7b, 0x17, 0xcb, 0x96, 0x2d, 0x4b, 0x4a, 0xbf, 0x56, 0x12, 0x64, 0x4d, 0x14, 0x42, 0xa6, 0xa5, 0xbd, 0x8e, 0x44, 0x26, 0x85, 0x87, 0x7c, 0x9e, 0x4d, 0x9d, 0xfa, 0xd6, 0xaf, 0x5f, 0x7f, 0xbb, 0xed, 0x46, 0x59, 0x5c, 0xc8, 0x70, 0xb9, 0xdc, 0x2b, 0xcb, 0xca, 0x4b, 0x99, 0xc2, 0x62, 0x62, 0x5e, 0x4b, 0x41, 0x4c, 0x3b, 0x5f, 0xda, 0xb8, 0xf1, 0x2b, 0x68, 0x6f, 0x3f, 0x89, 0x87, 0x1e, 0x7c, 0x10, 0xfd, 0x6c, 0x2f, 0xbe, 0xff, 0xbd, 0xef, 0xe2, 0xe3, 0x8f, 0xdb, 0x71, 0xff, 0xfd, 0x5f, 0x4f, 0x68, 0xdb, 0x4a, 0x82, 0x99, 0x0d, 0x52, 0xd5, 0x2d, 0x0a, 0xe6, 0x76, 0xb9, 0xc5, 0x8d, 0x8b, 0x0b, 0x8b, 0x51, 0x50, 0xe8, 0xdb, 0x20, 0x02, 0x64, 0xa9, 0x03, 0x3a, 0x41, 0x57, 0x73, 0x36, 0x57, 0x53, 0x7a, 0x06, 0x11, 0x05, 0x70, 0xc1, 0xcb, 0xac, 0x72, 0xe6, 0x6c, 0x07, 0x16, 0x88, 0x16, 0x24, 0x2b, 0xa4, 0xb8, 0x8f, 0x8c, 0x90, 0x11, 0x89, 0x41, 0xdc, 0xe1, 0x99, 0x67, 0x7e, 0x8e, 0xa7, 0x9e, 0xfe, 0xa9, 0x64, 0x26, 0x6a, 0x16, 0x13, 0x13, 0x13, 0x49, 0xf5, 0x41, 0xe3, 0x3c, 0x75, 0x94, 0x9f, 0x5c, 0x6b, 0x22, 0x5c, 0xc7, 0x99, 0x0e, 0xb1, 0x3c, 0x95, 0x28, 0xf7, 0x6b, 0x17, 0xd5, 0xe2, 0x72, 0xd7, 0x67, 0x6b, 0x92, 0xea, 0x81, 0x12, 0x01, 0x92, 0x03, 0xd8, 0x43, 0x72, 0x1a, 0xce, 0xc6, 0x45, 0xdc, 0x4c, 0x2d, 0xc8, 0xc3, 0x0c, 0x54, 0xa6, 0xd3, 0x01, 0xbc, 0xfe, 0xc6, 0xeb, 0xc2, 0xf0, 0xcd, 0x22, 0x32, 0x9a, 0x32, 0x12, 0x36, 0x5f, 0x5c, 0x93, 0x54, 0xba, 0x7c, 0xd9, 0xed, 0xe4, 0xc1, 0x03, 0x93, 0xbc, 0x34, 0x36, 0x36, 0xe1, 0xc4, 0x89, 0xe3, 0x2b, 0x12, 0x81, 0xac, 0x13, 0xd6, 0x0c, 0x0b, 0x14, 0xb3, 0xf1, 0x60, 0x20, 0xe5, 0xd2, 0xef, 0x30, 0x39, 0x29, 0x1a, 0x83, 0xd7, 0xe7, 0xc5, 0xe2, 0x25, 0x8b, 0x59, 0x45, 0xa3, 0x0c, 0xaa, 0x98, 0xb8, 0x56, 0x3c, 0x6a, 0xca, 0xe7, 0xa1, 0x5c, 0xc7, 0xe2, 0x52, 0x45, 0x65, 0x9d, 0x73, 0x09, 0x42, 0xc3, 0x09, 0x76, 0x91, 0x89, 0x31, 0xfd, 0x5a, 0x46, 0xd9, 0x67, 0xc8, 0x98, 0xbc, 0xcf, 0x48, 0x8c, 0xb2, 0x2e, 0xf7, 0xe5, 0x3d, 0x66, 0x3c, 0xd1, 0x23, 0x69, 0xf9, 0x00, 0x5c, 0x49, 0x05, 0x4d, 0x69, 0x49, 0xee, 0xe3, 0x61, 0xbb, 0xb0, 0x6c, 0xcb, 0x7d, 0xf7, 0x9e, 0x7c, 0x78, 0xc7, 0xc3, 0xaa, 0x60, 0x41, 0x9e, 0xa9, 0xa0, 0x8c, 0xf4, 0x86, 0x8c, 0x07, 0x0a, 0x84, 0x71, 0x19, 0x09, 0x7b, 0x5d, 0x84, 0x10, 0x4b, 0xcd, 0xc9, 0xdc, 0xdc, 0x42, 0xd8, 0xc2, 0x86, 0xc3, 0xe1, 0x89, 0x63, 0xc7, 0x8f, 0x79, 0x3f, 0xf8, 0xe0, 0xfd, 0xc0, 0xdb, 0x6f, 0xfd, 0x65, 0x3d, 0x80, 0x3e, 0x62, 0x8a, 0x50, 0xc9, 0x2e, 0x64, 0xd0, 0xf7, 0x24, 0x5a, 0x3f, 0x3c, 0xfa, 0x77, 0x6d, 0xcb, 0xe6, 0xcd, 0x46, 0x55, 0x75, 0x55, 0x94, 0x6d, 0xb5, 0x26, 0x6d, 0xaf, 0xee, 0xd0, 0xd8, 0x3e, 0x80, 0x01, 0x25, 0xde, 0xaa, 0x94, 0x08, 0x2f, 0xe6, 0xb5, 0xe2, 0x71, 0x15, 0x8b, 0x4b, 0x3f, 0xa3, 0xe2, 0xa2, 0xb1, 0xb8, 0x8a, 0x72, 0x54, 0xca, 0x52, 0xca, 0x84, 0xb2, 0xc0, 0xd1, 0x52, 0xe0, 0x8c, 0x73, 0x28, 0xf0, 0x52, 0x71, 0x8c, 0x9b, 0x26, 0x28, 0xbc, 0x8a, 0x4c, 0x72, 0x9b, 0x65, 0x29, 0xe9, 0x87, 0x4c, 0x53, 0x71, 0x4d, 0xb1, 0xfa, 0xf3, 0x3c, 0x53, 0x4d, 0x8c, 0x8f, 0x19, 0xbd, 0x7d, 0x7d, 0xf9, 0x53, 0x6c, 0x57, 0x94, 0x26, 0x8a, 0x76, 0xdb, 0x99, 0x28, 0x4d, 0x00, 0x67, 0x34, 0x1a, 0x75, 0xf1, 0x68, 0xf9, 0x06, 0xee, 0x60, 0xe0, 0xb6, 0xb5, 0x9f, 0xcc, 0xa1, 0x2b, 0xd9, 0xcd, 0x1b, 0xc7, 0x0c, 0x98, 0xb9, 0x4e, 0x4a, 0xbb, 0x4e, 0xbe, 0x8f, 0x4c, 0xfb, 0x6d, 0x0b, 0x92, 0x07, 0x69, 0xfa, 0x38, 0x4a, 0xf0, 0xb3, 0x33, 0x96, 0x8f, 0x2a, 0x87, 0x6e, 0x40, 0x4b, 0x78, 0x8a, 0x5d, 0xd0, 0xec, 0x88, 0x16, 0xc0, 0xc1, 0x26, 0x4d, 0x45, 0xa3, 0xb1, 0x80, 0xdb, 0xe5, 0x2a, 0x66, 0x5e, 0x67, 0x1e, 0x0f, 0xd9, 0x1d, 0x68, 0xe2, 0x9f, 0x37, 0x60, 0x86, 0x00, 0x96, 0x8c, 0xff, 0x23, 0xec, 0xea, 0x4e, 0xc8, 0x3c, 0x01, 0x71, 0x33, 0x9f, 0x37, 0x0f, 0x21, 0xd6, 0x14, 0xc6, 0xe1, 0x90, 0x30, 0x6f, 0x5b, 0x20, 0x35, 0x88, 0x2d, 0x9a, 0x70, 0xea, 0xb3, 0xce, 0x4b, 0xaf, 0x31, 0x75, 0xee, 0x0a, 0x05, 0x02, 0x28, 0x63, 0x05, 0x2e, 0x2b, 0x2b, 0x13, 0x2d, 0x8b, 0x94, 0xba, 0xad, 0x71, 0x70, 0x9a, 0x10, 0xc6, 0x21, 0x73, 0xae, 0xa5, 0x0a, 0x07, 0x7b, 0xcd, 0x4e, 0x8f, 0x90, 0x5f, 0xe6, 0xf4, 0x49, 0xb7, 0xb3, 0x63, 0x88, 0xa3, 0x24, 0x05, 0xd6, 0x01, 0x89, 0xaf, 0x81, 0xfe, 0x01, 0x0c, 0x0d, 0x0d, 0x9a, 0x67, 0xcf, 0x9e, 0xfb, 0x2d, 0x80, 0x28, 0x61, 0x21, 0x8d, 0x1c, 0x44, 0x1e, 0x51, 0x4f, 0x6c, 0x59, 0xb5, 0x66, 0xd5, 0x81, 0xfb, 0xbe, 0xb6, 0xe5, 0xe4, 0x43, 0x0f, 0x7f, 0x63, 0x7c, 0xe7, 0x23, 0x3b, 0xd4, 0xad, 0xc4, 0x83, 0x3b, 0x1e, 0x08, 0x6e, 0xd9, 0x7a, 0xef, 0x09, 0x7e, 0xa2, 0x3c, 0x0b, 0x60, 0x13, 0x51, 0x47, 0x78, 0x09, 0x7d, 0x46, 0x17, 0x4a, 0x2c, 0x20, 0x16, 0x13, 0x2b, 0x89, 0x2f, 0x13, 0x77, 0x13, 0xf7, 0xde, 0x42, 0x6c, 0x4a, 0xf0, 0x70, 0x07, 0xb1, 0x82, 0xa8, 0x25, 0x0a, 0x92, 0x63, 0x20, 0xbd, 0x8a, 0x38, 0x12, 0x37, 0x73, 0x64, 0xb4, 0x63, 0xe4, 0x96, 0x92, 0x22, 0xe2, 0x44, 0x54, 0x20, 0x73, 0x98, 0xb2, 0x9e, 0x81, 0xb9, 0xe4, 0xba, 0xa0, 0xd9, 0xb8, 0xe5, 0x02, 0xd8, 0xb0, 0x92, 0xd6, 0x84, 0xfe, 0x03, 0xae, 0xf9, 0xd3, 0xfc, 0x7c, 0xfe, 0xfe, 0xd5, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00, 0x00, 0x28, 0x75, 0x75, 0x61, 0x79, 0x29, 0x63, 0x6f, 0x6d, 0x2f, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x69, 0x63, 0x6f, 0x6e, 0x73, 0x2f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x74, 0x75, 0x72, 0x74, 0x6c, 0x65, 0x2d, 0x62, 0x6c, 0x75, 0x65, 0x2e, 0x70, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0e, 0x08, 0x06, 0x00, 0x00, 0x00, 0x2f, 0xc4, 0x3c, 0xf0, 0x00, 0x00, 0x00, 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, 0x88, 0x00, 0x00, 0x01, 0x14, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xcd, 0x93, 0xb1, 0x6a, 0xc2, 0x50, 0x14, 0x86, 0xbf, 0xe3, 0x8d, 0x41, 0x41, 0x48, 0xd4, 0xc1, 0xd7, 0xc8, 0x64, 0xa8, 0x53, 0x17, 0x0b, 0x5d, 0xba, 0xb9, 0x14, 0x4a, 0xf5, 0x05, 0x5c, 0xfb, 0x0c, 0xee, 0x3a, 0x38, 0x19, 0xc1, 0x37, 0xe8, 0x52, 0xc1, 0x82, 0x88, 0x59, 0x9c, 0x3a, 0x67, 0xea, 0xd6, 0xdd, 0x4d, 0x0c, 0xf7, 0x76, 0x88, 0x62, 0xac, 0x2d, 0xb5, 0x25, 0x85, 0xfe, 0xe3, 0x39, 0xe7, 0x7e, 0x97, 0xf3, 0x5d, 0xae, 0x18, 0x63, 0xc8, 0x32, 0xb9, 0x4c, 0x69, 0x7f, 0x01, 0xb4, 0xbe, 0x1b, 0xf0, 0x7d, 0x2e, 0x45, 0xf0, 0xb4, 0x66, 0xbe, 0x5a, 0xf1, 0xf2, 0xb1, 0x2f, 0x22, 0xa4, 0xb5, 0xc9, 0x57, 0x0e, 0x7d, 0x1f, 0xcf, 0xb6, 0x19, 0x29, 0x85, 0x07, 0x60, 0x0c, 0xc4, 0x31, 0x41, 0x18, 0xd2, 0xf9, 0x31, 0xd0, 0xf7, 0xf1, 0x4a, 0x25, 0xe6, 0x96, 0x85, 0xa3, 0x14, 0x88, 0x80, 0xd6, 0x10, 0xc7, 0xb0, 0xd9, 0x10, 0x2c, 0x16, 0x74, 0x1a, 0x0d, 0xda, 0xb6, 0xcd, 0x28, 0x8e, 0x09, 0x96, 0xcb, 0xc3, 0x25, 0x27, 0xc0, 0x7a, 0x1d, 0xb7, 0x5c, 0xe6, 0x35, 0x9f, 0xc7, 0xb1, 0x2c, 0xc8, 0xed, 0x2c, 0x1b, 0x93, 0x40, 0xb7, 0xdb, 0x04, 0x2c, 0x02, 0x4a, 0x41, 0xa5, 0xc2, 0xd3, 0x64, 0xc2, 0xf5, 0xfe, 0xfc, 0x89, 0x43, 0xd7, 0x65, 0x5c, 0x28, 0xe0, 0xd8, 0xf6, 0x01, 0xb6, 0x8f, 0x31, 0x50, 0xab, 0x11, 0x35, 0x9b, 0x3c, 0xb6, 0x5a, 0x44, 0xbb, 0x72, 0x94, 0x9e, 0xf9, 0x6c, 0xe5, 0xab, 0xc1, 0x80, 0xdb, 0x30, 0xe4, 0x5e, 0xe4, 0xb8, 0xa1, 0x35, 0x54, 0xab, 0x3c, 0xf7, 0xfb, 0xdc, 0x01, 0x6f, 0x67, 0x3b, 0xec, 0x76, 0x79, 0x28, 0x16, 0xb9, 0xe9, 0xf5, 0x18, 0xa7, 0xeb, 0xc3, 0x21, 0x17, 0xb3, 0x19, 0xed, 0xf5, 0x9a, 0x60, 0x3a, 0x4d, 0xbc, 0x9d, 0xfd, 0xca, 0xbf, 0xcd, 0xff, 0xff, 0x29, 0x99, 0x03, 0xdf, 0x01, 0xdc, 0x59, 0x66, 0x96, 0x7c, 0xbf, 0x51, 0xad, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00, 0x00, 0x28, 0x75, 0x75, 0x61, 0x79, 0x29 } }; static GStaticResource static_resource = { transmission_resource_data.data, sizeof (transmission_resource_data.data), NULL, NULL, NULL }; extern GResource *transmission_get_resource (void); GResource *transmission_get_resource (void) { return g_static_resource_get_resource (&static_resource); } /* If G_HAS_CONSTRUCTORS is true then the compiler support *both* constructors and destructors, in a sane way, including e.g. on library unload. If not you're on your own. Some compilers need #pragma to handle this, which does not work with macros, so the way you need to use this is (for constructors): #ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA #pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(my_constructor) #endif G_DEFINE_CONSTRUCTOR(my_constructor) static void my_constructor(void) { ... } */ #ifndef __GTK_DOC_IGNORE__ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) #define G_HAS_CONSTRUCTORS 1 #define G_DEFINE_CONSTRUCTOR(_func) static void __attribute__((constructor)) _func (void); #define G_DEFINE_DESTRUCTOR(_func) static void __attribute__((destructor)) _func (void); #elif defined (_MSC_VER) && (_MSC_VER >= 1500) /* Visual studio 2008 and later has _Pragma */ #define G_HAS_CONSTRUCTORS 1 #define G_DEFINE_CONSTRUCTOR(_func) \ static void _func(void); \ static int _func ## _wrapper(void) { _func(); return 0; } \ __pragma(section(".CRT$XCU",read)) \ __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _wrapper; #define G_DEFINE_DESTRUCTOR(_func) \ static void _func(void); \ static int _func ## _constructor(void) { atexit (_func); return 0; } \ __pragma(section(".CRT$XCU",read)) \ __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor; #elif defined (_MSC_VER) #define G_HAS_CONSTRUCTORS 1 /* Pre Visual studio 2008 must use #pragma section */ #define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 #define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 #define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ section(".CRT$XCU",read) #define G_DEFINE_CONSTRUCTOR(_func) \ static void _func(void); \ static int _func ## _wrapper(void) { _func(); return 0; } \ __declspec(allocate(".CRT$XCU")) static int (*p)(void) = _func ## _wrapper; #define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ section(".CRT$XCU",read) #define G_DEFINE_DESTRUCTOR(_func) \ static void _func(void); \ static int _func ## _constructor(void) { atexit (_func); return 0; } \ __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor; #elif defined(__SUNPRO_C) /* This is not tested, but i believe it should work, based on: * http://opensource.apple.com/source/OpenSSL098/OpenSSL098-35/src/fips/fips_premain.c */ #define G_HAS_CONSTRUCTORS 1 #define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 #define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 #define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ init(_func) #define G_DEFINE_CONSTRUCTOR(_func) \ static void _func(void); #define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ fini(_func) #define G_DEFINE_DESTRUCTOR(_func) \ static void _func(void); #else /* constructors not supported for this compiler */ #endif #endif /* __GTK_DOC_IGNORE__ */ #ifdef G_HAS_CONSTRUCTORS #ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA #pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(resource_constructor) #endif G_DEFINE_CONSTRUCTOR(resource_constructor) #ifdef G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA #pragma G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(resource_destructor) #endif G_DEFINE_DESTRUCTOR(resource_destructor) #else #warning "Constructor not supported on this compiler, linking in resources will not work" #endif static void resource_constructor (void) { g_static_resource_init (&static_resource); } static void resource_destructor (void) { g_static_resource_fini (&static_resource); } transmission-2.92/gtk/PaxHeaders.4960/transmission-ui.xml0000644000000000000000000000007412617356116020346 xustar0030 atime=1456201459.067219808 30 ctime=1457295921.173827865 transmission-2.92/gtk/transmission-ui.xml0000644000175000017500000001047212617356116021772 0ustar00mikedldmikedld00000000000000 transmission-2.92/gtk/PaxHeaders.4960/transmission-resources.h0000644000000000000000000000013212667111060021355 xustar0030 mtime=1457295920.783821233 30 atime=1457295920.783821233 30 ctime=1457295920.983824634 transmission-2.92/gtk/transmission-resources.h0000644000175000017500000000023212667111060022777 0ustar00mikedldmikedld00000000000000#ifndef __RESOURCE_transmission_H__ #define __RESOURCE_transmission_H__ #include extern GResource *transmission_get_resource (void); #endif transmission-2.92/gtk/PaxHeaders.4960/filter.c0000644000000000000000000000007412633056462016110 xustar0030 atime=1456201459.056219621 30 ctime=1457295921.062825977 transmission-2.92/gtk/filter.c0000644000175000017500000007420712633056462017542 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: filter.c 14613 2015-12-06 22:13:10Z jordan $ */ #include /* qsort () */ #include #include #include #include #include "favicon.h" /* gtr_get_favicon () */ #include "filter.h" #include "hig.h" /* GUI_PAD */ #include "tr-core.h" /* MC_TORRENT */ #include "util.h" /* gtr_get_host_from_url () */ static GQuark DIRTY_KEY = 0; static GQuark SESSION_KEY = 0; static GQuark TEXT_KEY = 0; static GQuark TORRENT_MODEL_KEY = 0; /*** **** **** TRACKERS **** ***/ enum { TRACKER_FILTER_TYPE_ALL, TRACKER_FILTER_TYPE_HOST, TRACKER_FILTER_TYPE_SEPARATOR, }; enum { TRACKER_FILTER_COL_NAME, /* human-readable name; ie, Legaltorrents */ TRACKER_FILTER_COL_COUNT, /* how many matches there are */ TRACKER_FILTER_COL_TYPE, TRACKER_FILTER_COL_HOST, /* pattern-matching text; ie, legaltorrents.com */ TRACKER_FILTER_COL_PIXBUF, TRACKER_FILTER_N_COLS }; static int pstrcmp (const void * a, const void * b) { return g_strcmp0 (* (const char* const *)a, * (const char* const *)b); } /* human-readable name; ie, Legaltorrents */ static char* get_name_from_host (const char * host) { char * name; const char * dot = strrchr (host, '.'); if (tr_addressIsIP (host)) name = g_strdup (host); else if (dot) name = g_strndup (host, dot - host); else name = g_strdup (host); *name = g_ascii_toupper (*name); return name; } static void tracker_model_update_count (GtkTreeStore * store, GtkTreeIter * iter, int n) { int count; GtkTreeModel * model = GTK_TREE_MODEL (store); gtk_tree_model_get (model, iter, TRACKER_FILTER_COL_COUNT, &count, -1); if (n != count) gtk_tree_store_set (store, iter, TRACKER_FILTER_COL_COUNT, n, -1); } static void favicon_ready_cb (gpointer pixbuf, gpointer vreference) { GtkTreeIter iter; GtkTreeRowReference * reference = vreference; if (pixbuf != NULL) { GtkTreePath * path = gtk_tree_row_reference_get_path (reference); GtkTreeModel * model = gtk_tree_row_reference_get_model (reference); if (gtk_tree_model_get_iter (model, &iter, path)) gtk_tree_store_set (GTK_TREE_STORE (model), &iter, TRACKER_FILTER_COL_PIXBUF, pixbuf, -1); gtk_tree_path_free (path); g_object_unref (pixbuf); } gtk_tree_row_reference_free (reference); } static gboolean tracker_filter_model_update (gpointer gstore) { int i, n; int all = 0; int store_pos; GtkTreeIter iter; GObject * o = G_OBJECT (gstore); GtkTreeStore * store = GTK_TREE_STORE (gstore); GtkTreeModel * model = GTK_TREE_MODEL (gstore); GPtrArray * hosts = g_ptr_array_new (); GStringChunk * strings = g_string_chunk_new (4096); GHashTable * hosts_hash = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free); GtkTreeModel * tmodel = GTK_TREE_MODEL (g_object_get_qdata (o, TORRENT_MODEL_KEY)); const int first_tracker_pos = 2; /* offset past the "All" and the separator */ g_object_steal_qdata (o, DIRTY_KEY); /* Walk through all the torrents, tallying how many matches there are * for the various categories. Also make a sorted list of all tracker * hosts s.t. we can merge it with the existing list */ if (gtk_tree_model_iter_nth_child (tmodel, &iter, NULL, 0)) do { tr_torrent * tor; const tr_info * inf; int keyCount; char ** keys; gtk_tree_model_get (tmodel, &iter, MC_TORRENT, &tor, -1); inf = tr_torrentInfo (tor); keyCount = 0; keys = g_new (char*, inf->trackerCount); for (i=0, n=inf->trackerCount; itrackers[i].announce); key = g_string_chunk_insert_const (strings, buf); count = g_hash_table_lookup (hosts_hash, key); if (count == NULL) { count = tr_new0 (int, 1); g_hash_table_insert (hosts_hash, key, count); g_ptr_array_add (hosts, key); } for (k=0; kpdata, hosts->len, sizeof (char*), pstrcmp); /* update the "all" count */ if (gtk_tree_model_iter_children (model, &iter, NULL)) tracker_model_update_count (store, &iter, all); store_pos = first_tracker_pos; for (i=0, n=hosts->len ; ;) { const gboolean new_hosts_done = i >= n; const gboolean old_hosts_done = !gtk_tree_model_iter_nth_child (model, &iter, NULL, store_pos); gboolean remove_row = FALSE; gboolean insert_row = FALSE; /* are we done yet? */ if (new_hosts_done && old_hosts_done) break; /* decide what to do */ if (new_hosts_done) { remove_row = TRUE; } else if (old_hosts_done) { insert_row = TRUE; } else { int cmp; char * host; gtk_tree_model_get (model, &iter, TRACKER_FILTER_COL_HOST, &host, -1); cmp = g_strcmp0 (host, hosts->pdata[i]); if (cmp < 0) remove_row = TRUE; else if (cmp > 0) insert_row = TRUE; g_free (host); } /* do something */ if (remove_row) { /* g_message ("removing row and incrementing i"); */ gtk_tree_store_remove (store, &iter); } else if (insert_row) { GtkTreeIter add; GtkTreePath * path; GtkTreeRowReference * reference; tr_session * session = g_object_get_qdata (G_OBJECT (store), SESSION_KEY); const char * host = hosts->pdata[i]; char * name = get_name_from_host (host); const int count = * (int*)g_hash_table_lookup (hosts_hash, host); gtk_tree_store_insert_with_values (store, &add, NULL, store_pos, TRACKER_FILTER_COL_HOST, host, TRACKER_FILTER_COL_NAME, name, TRACKER_FILTER_COL_COUNT, count, TRACKER_FILTER_COL_TYPE, TRACKER_FILTER_TYPE_HOST, -1); path = gtk_tree_model_get_path (model, &add); reference = gtk_tree_row_reference_new (model, path); gtr_get_favicon (session, host, favicon_ready_cb, reference); gtk_tree_path_free (path); g_free (name); ++store_pos; ++i; } else /* update row */ { const char * host = hosts->pdata[i]; const int count = * (int*)g_hash_table_lookup (hosts_hash, host); tracker_model_update_count (store, &iter, count); ++store_pos; ++i; } } /* cleanup */ g_ptr_array_free (hosts, TRUE); g_hash_table_unref (hosts_hash); g_string_chunk_free (strings); return G_SOURCE_REMOVE; } static GtkTreeModel * tracker_filter_model_new (GtkTreeModel * tmodel) { GtkTreeStore * store = gtk_tree_store_new (TRACKER_FILTER_N_COLS, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING, GDK_TYPE_PIXBUF); gtk_tree_store_insert_with_values (store, NULL, NULL, -1, TRACKER_FILTER_COL_NAME, _("All"), TRACKER_FILTER_COL_TYPE, TRACKER_FILTER_TYPE_ALL, -1); gtk_tree_store_insert_with_values (store, NULL, NULL, -1, TRACKER_FILTER_COL_TYPE, TRACKER_FILTER_TYPE_SEPARATOR, -1); g_object_set_qdata (G_OBJECT (store), TORRENT_MODEL_KEY, tmodel); tracker_filter_model_update (store); return GTK_TREE_MODEL (store); } static gboolean is_it_a_separator (GtkTreeModel * m, GtkTreeIter * iter, gpointer data UNUSED) { int type; gtk_tree_model_get (m, iter, TRACKER_FILTER_COL_TYPE, &type, -1); return type == TRACKER_FILTER_TYPE_SEPARATOR; } static void tracker_model_update_idle (gpointer tracker_model) { GObject * o = G_OBJECT (tracker_model); const gboolean pending = g_object_get_qdata (o, DIRTY_KEY) != NULL; if (!pending) { GSourceFunc func = tracker_filter_model_update; g_object_set_qdata (o, DIRTY_KEY, GINT_TO_POINTER (1)); gdk_threads_add_idle (func, tracker_model); } } static void torrent_model_row_changed (GtkTreeModel * tmodel UNUSED, GtkTreePath * path UNUSED, GtkTreeIter * iter UNUSED, gpointer tracker_model) { tracker_model_update_idle (tracker_model); } static void torrent_model_row_deleted_cb (GtkTreeModel * tmodel UNUSED, GtkTreePath * path UNUSED, gpointer tracker_model) { tracker_model_update_idle (tracker_model); } static void render_pixbuf_func (GtkCellLayout * cell_layout UNUSED, GtkCellRenderer * cell_renderer, GtkTreeModel * tree_model, GtkTreeIter * iter, gpointer data UNUSED) { int type; int width; gtk_tree_model_get (tree_model, iter, TRACKER_FILTER_COL_TYPE, &type, -1); width = (type == TRACKER_FILTER_TYPE_HOST) ? 20 : 0; g_object_set (cell_renderer, "width", width, NULL); } static void render_number_func (GtkCellLayout * cell_layout UNUSED, GtkCellRenderer * cell_renderer, GtkTreeModel * tree_model, GtkTreeIter * iter, gpointer data UNUSED) { int count; char buf[32]; gtk_tree_model_get (tree_model, iter, TRACKER_FILTER_COL_COUNT, &count, -1); if (count >= 0) g_snprintf (buf, sizeof (buf), "%'d", count); else *buf = '\0'; g_object_set (cell_renderer, "text", buf, NULL); } static GtkCellRenderer * number_renderer_new (void) { GtkCellRenderer * r = gtk_cell_renderer_text_new (); g_object_set (G_OBJECT (r), "alignment", PANGO_ALIGN_RIGHT, "weight", PANGO_WEIGHT_ULTRALIGHT, "xalign", 1.0, "xpad", GUI_PAD, NULL); return r; } static void disconnect_cat_model_callbacks (gpointer tmodel, GObject * cat_model) { g_signal_handlers_disconnect_by_func (tmodel, torrent_model_row_changed, cat_model); g_signal_handlers_disconnect_by_func (tmodel, torrent_model_row_deleted_cb, cat_model); } static GtkWidget * tracker_combo_box_new (GtkTreeModel * tmodel) { GtkWidget * c; GtkCellRenderer * r; GtkTreeModel * cat_model; GtkCellLayout * c_cell_layout; GtkComboBox * c_combo_box; /* create the tracker combobox */ cat_model = tracker_filter_model_new (tmodel); c = gtk_combo_box_new_with_model (cat_model); c_combo_box = GTK_COMBO_BOX (c); c_cell_layout = GTK_CELL_LAYOUT (c); gtk_combo_box_set_row_separator_func (c_combo_box, is_it_a_separator, NULL, NULL); gtk_combo_box_set_active (c_combo_box, 0); r = gtk_cell_renderer_pixbuf_new (); gtk_cell_layout_pack_start (c_cell_layout, r, FALSE); gtk_cell_layout_set_cell_data_func (c_cell_layout, r, render_pixbuf_func, NULL, NULL); gtk_cell_layout_set_attributes (c_cell_layout, r, "pixbuf", TRACKER_FILTER_COL_PIXBUF, NULL); r = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (c_cell_layout, r, FALSE); gtk_cell_layout_set_attributes (c_cell_layout, r, "text", TRACKER_FILTER_COL_NAME, NULL); r = number_renderer_new (); gtk_cell_layout_pack_end (c_cell_layout, r, TRUE); gtk_cell_layout_set_cell_data_func (c_cell_layout, r, render_number_func, NULL, NULL); g_object_weak_ref (G_OBJECT (cat_model), disconnect_cat_model_callbacks, tmodel); g_signal_connect (tmodel, "row-changed", G_CALLBACK (torrent_model_row_changed), cat_model); g_signal_connect (tmodel, "row-inserted", G_CALLBACK (torrent_model_row_changed), cat_model); g_signal_connect (tmodel, "row-deleted", G_CALLBACK (torrent_model_row_deleted_cb), cat_model); return c; } static gboolean test_tracker (tr_torrent * tor, int active_tracker_type, const char * host) { gboolean matches = TRUE; if (active_tracker_type == TRACKER_FILTER_TYPE_HOST) { unsigned int i; char tmp[1024]; const tr_info * const inf = tr_torrentInfo (tor); for (i=0; itrackerCount; ++i) { gtr_get_host_from_url (tmp, sizeof (tmp), inf->trackers[i].announce); if (!g_strcmp0 (tmp, host)) break; } matches = i < inf->trackerCount; } return matches; } /*** **** **** ACTIVITY **** ***/ enum { ACTIVITY_FILTER_ALL, ACTIVITY_FILTER_DOWNLOADING, ACTIVITY_FILTER_SEEDING, ACTIVITY_FILTER_ACTIVE, ACTIVITY_FILTER_PAUSED, ACTIVITY_FILTER_FINISHED, ACTIVITY_FILTER_VERIFYING, ACTIVITY_FILTER_ERROR, ACTIVITY_FILTER_SEPARATOR }; enum { ACTIVITY_FILTER_COL_NAME, ACTIVITY_FILTER_COL_COUNT, ACTIVITY_FILTER_COL_TYPE, ACTIVITY_FILTER_COL_STOCK_ID, ACTIVITY_FILTER_N_COLS }; static gboolean activity_is_it_a_separator (GtkTreeModel * m, GtkTreeIter * i, gpointer d UNUSED) { int type; gtk_tree_model_get (m, i, ACTIVITY_FILTER_COL_TYPE, &type, -1); return type == ACTIVITY_FILTER_SEPARATOR; } static gboolean test_torrent_activity (tr_torrent * tor, int type) { const tr_stat * st = tr_torrentStatCached (tor); switch (type) { case ACTIVITY_FILTER_DOWNLOADING: return (st->activity == TR_STATUS_DOWNLOAD) || (st->activity == TR_STATUS_DOWNLOAD_WAIT); case ACTIVITY_FILTER_SEEDING: return (st->activity == TR_STATUS_SEED) || (st->activity == TR_STATUS_SEED_WAIT); case ACTIVITY_FILTER_ACTIVE: return (st->peersSendingToUs > 0) || (st->peersGettingFromUs > 0) || (st->webseedsSendingToUs > 0) || (st->activity == TR_STATUS_CHECK); case ACTIVITY_FILTER_PAUSED: return st->activity == TR_STATUS_STOPPED; case ACTIVITY_FILTER_FINISHED: return st->finished == TRUE; case ACTIVITY_FILTER_VERIFYING: return (st->activity == TR_STATUS_CHECK) || (st->activity == TR_STATUS_CHECK_WAIT); case ACTIVITY_FILTER_ERROR: return st->error != 0; default: /* ACTIVITY_FILTER_ALL */ return TRUE; } } static void status_model_update_count (GtkListStore * store, GtkTreeIter * iter, int n) { int count; GtkTreeModel * model = GTK_TREE_MODEL (store); gtk_tree_model_get (model, iter, ACTIVITY_FILTER_COL_COUNT, &count, -1); if (n != count) gtk_list_store_set (store, iter, ACTIVITY_FILTER_COL_COUNT, n, -1); } static gboolean activity_filter_model_update (gpointer gstore) { GtkTreeIter iter; GObject * o = G_OBJECT (gstore); GtkListStore * store = GTK_LIST_STORE (gstore); GtkTreeModel * model = GTK_TREE_MODEL (store); GtkTreeModel * tmodel = GTK_TREE_MODEL (g_object_get_qdata (o, TORRENT_MODEL_KEY)); g_object_steal_qdata (o, DIRTY_KEY); if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) do { int hits; int type; GtkTreeIter torrent_iter; gtk_tree_model_get (model, &iter, ACTIVITY_FILTER_COL_TYPE, &type, -1); hits = 0; if (gtk_tree_model_iter_nth_child (tmodel, &torrent_iter, NULL, 0)) do { tr_torrent * tor; gtk_tree_model_get (tmodel, &torrent_iter, MC_TORRENT, &tor, -1); if (test_torrent_activity (tor, type)) ++hits; } while (gtk_tree_model_iter_next (tmodel, &torrent_iter)); status_model_update_count (store, &iter, hits); } while (gtk_tree_model_iter_next (model, &iter)); return G_SOURCE_REMOVE; } static GtkTreeModel * activity_filter_model_new (GtkTreeModel * tmodel) { int i, n; struct { int type; const char * context; const char * name; const char * stock_id; } types[] = { { ACTIVITY_FILTER_ALL, NULL, N_("All"), NULL }, { ACTIVITY_FILTER_SEPARATOR, NULL, NULL, NULL }, { ACTIVITY_FILTER_ACTIVE, NULL, N_("Active"), GTK_STOCK_EXECUTE }, { ACTIVITY_FILTER_DOWNLOADING, "Verb", NC_("Verb", "Downloading"), GTK_STOCK_GO_DOWN }, { ACTIVITY_FILTER_SEEDING, "Verb", NC_("Verb", "Seeding"), GTK_STOCK_GO_UP }, { ACTIVITY_FILTER_PAUSED, NULL, N_("Paused"), GTK_STOCK_MEDIA_PAUSE }, { ACTIVITY_FILTER_FINISHED, NULL, N_("Finished"), NULL }, { ACTIVITY_FILTER_VERIFYING, "Verb", NC_("Verb", "Verifying"), GTK_STOCK_REFRESH }, { ACTIVITY_FILTER_ERROR, NULL, N_("Error"), GTK_STOCK_DIALOG_ERROR } }; GtkListStore * store = gtk_list_store_new (ACTIVITY_FILTER_N_COLS, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING); for (i=0, n=G_N_ELEMENTS (types); ifileCount && !ret; ++i) { char * pch = g_utf8_casefold (inf->files[i].name, -1); ret = !key || strstr (pch, key) != NULL; g_free (pch); } } return ret; } static void entry_clear (GtkEntry * e) { gtk_entry_set_text (e, ""); } static void filter_entry_changed (GtkEditable * e, gpointer filter_model) { char * pch; char * folded; pch = gtk_editable_get_chars (e, 0, -1); folded = g_utf8_casefold (pch, -1); g_strstrip (folded); g_object_set_qdata_full (filter_model, TEXT_KEY, folded, g_free); g_free (pch); gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filter_model)); } /***** ****** ****** ****** *****/ struct filter_data { GtkWidget * activity; GtkWidget * tracker; GtkWidget * entry; GtkWidget * show_lb; GtkTreeModel * filter_model; int active_activity_type; int active_tracker_type; char * active_tracker_host; }; static gboolean is_row_visible (GtkTreeModel * model, GtkTreeIter * iter, gpointer vdata) { const char * text; tr_torrent * tor; struct filter_data * data = vdata; GObject * o = G_OBJECT (data->filter_model); gtk_tree_model_get (model, iter, MC_TORRENT, &tor, -1); text = (const char*) g_object_get_qdata (o, TEXT_KEY); return (tor != NULL) && test_tracker (tor, data->active_tracker_type, data->active_tracker_host) && test_torrent_activity (tor, data->active_activity_type) && testText (tor, text); } static void selection_changed_cb (GtkComboBox * combo, gpointer vdata) { int type; char * host; GtkTreeIter iter; GtkTreeModel * model; struct filter_data * data = vdata; /* set data->active_activity_type from the activity combobox */ combo = GTK_COMBO_BOX (data->activity); model = gtk_combo_box_get_model (combo); if (gtk_combo_box_get_active_iter (combo, &iter)) gtk_tree_model_get (model, &iter, ACTIVITY_FILTER_COL_TYPE, &type, -1); else type = ACTIVITY_FILTER_ALL; data->active_activity_type = type; /* set the active tracker type & host from the tracker combobox */ combo = GTK_COMBO_BOX (data->tracker); model = gtk_combo_box_get_model (combo); if (gtk_combo_box_get_active_iter (combo, &iter)) { gtk_tree_model_get (model, &iter, TRACKER_FILTER_COL_TYPE, &type, TRACKER_FILTER_COL_HOST, &host, -1); } else { type = TRACKER_FILTER_TYPE_ALL; host = NULL; } g_free (data->active_tracker_host); data->active_tracker_host = host; data->active_tracker_type = type; /* refilter */ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (data->filter_model)); } /*** **** ***/ static gboolean update_count_label (gpointer gdata) { char buf[512]; int visibleCount; int trackerCount; int activityCount; GtkTreeModel * model; GtkComboBox * combo; GtkTreeIter iter; struct filter_data * data = gdata; /* get the visible count */ visibleCount = gtk_tree_model_iter_n_children (data->filter_model, NULL); /* get the tracker count */ combo = GTK_COMBO_BOX (data->tracker); model = gtk_combo_box_get_model (combo); if (gtk_combo_box_get_active_iter (combo, &iter)) gtk_tree_model_get (model, &iter, TRACKER_FILTER_COL_COUNT, &trackerCount, -1); else trackerCount = 0; /* get the activity count */ combo = GTK_COMBO_BOX (data->activity); model = gtk_combo_box_get_model (combo); if (gtk_combo_box_get_active_iter (combo, &iter)) gtk_tree_model_get (model, &iter, ACTIVITY_FILTER_COL_COUNT, &activityCount, -1); else activityCount = 0; /* set the text */ if (visibleCount == MIN (activityCount, trackerCount)) g_snprintf (buf, sizeof(buf), _("_Show:")); else g_snprintf (buf, sizeof(buf), _("_Show %'d of:"), visibleCount); gtk_label_set_markup_with_mnemonic (GTK_LABEL (data->show_lb), buf); g_object_steal_qdata (G_OBJECT(data->show_lb), DIRTY_KEY); return G_SOURCE_REMOVE; } static void update_count_label_idle (struct filter_data * data) { GObject * o = G_OBJECT (data->show_lb); const gboolean pending = g_object_get_qdata (o, DIRTY_KEY) != NULL; if (!pending) { g_object_set_qdata (o, DIRTY_KEY, GINT_TO_POINTER (1)); gdk_threads_add_idle (update_count_label, data); } } static void on_filter_model_row_inserted (GtkTreeModel * tree_model UNUSED, GtkTreePath * path UNUSED, GtkTreeIter * iter UNUSED, gpointer data) { update_count_label_idle (data); } static void on_filter_model_row_deleted (GtkTreeModel * tree_model UNUSED, GtkTreePath * path UNUSED, gpointer data) { update_count_label_idle (data); } /*** **** ***/ GtkWidget * gtr_filter_bar_new (tr_session * session, GtkTreeModel * tmodel, GtkTreeModel ** filter_model) { GtkWidget * l; GtkWidget * w; GtkWidget * h; GtkWidget * s; GtkWidget * activity; GtkWidget * tracker; GtkBox * h_box; struct filter_data * data; g_assert (DIRTY_KEY == 0); TEXT_KEY = g_quark_from_static_string ("tr-filter-text-key"); DIRTY_KEY = g_quark_from_static_string ("tr-filter-dirty-key"); SESSION_KEY = g_quark_from_static_string ("tr-session-key"); TORRENT_MODEL_KEY = g_quark_from_static_string ("tr-filter-torrent-model-key"); data = g_new0 (struct filter_data, 1); data->show_lb = gtk_label_new (NULL); data->activity = activity = activity_combo_box_new (tmodel); data->tracker = tracker = tracker_combo_box_new (tmodel); data->filter_model = gtk_tree_model_filter_new (tmodel, NULL); g_signal_connect (data->filter_model, "row-deleted", G_CALLBACK(on_filter_model_row_deleted), data); g_signal_connect (data->filter_model, "row-inserted", G_CALLBACK(on_filter_model_row_inserted), data); g_object_set (G_OBJECT (data->tracker), "width-request", 170, NULL); g_object_set_qdata (G_OBJECT (gtk_combo_box_get_model (GTK_COMBO_BOX (data->tracker))), SESSION_KEY, session); gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (data->filter_model), is_row_visible, data, g_free); g_signal_connect (data->tracker, "changed", G_CALLBACK (selection_changed_cb), data); g_signal_connect (data->activity, "changed", G_CALLBACK (selection_changed_cb), data); h = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, GUI_PAD_SMALL); h_box = GTK_BOX (h); /* add the activity combobox */ w = activity; l = data->show_lb; gtk_label_set_mnemonic_widget (GTK_LABEL (l), w); gtk_box_pack_start (h_box, l, FALSE, FALSE, 0); gtk_box_pack_start (h_box, w, TRUE, TRUE, 0); /* add a spacer */ w = gtk_alignment_new (0.0f, 0.0f, 0.0f, 0.0f); gtk_widget_set_size_request (w, 0u, GUI_PAD_BIG); gtk_box_pack_start (h_box, w, FALSE, FALSE, 0); /* add the tracker combobox */ w = tracker; gtk_box_pack_start (h_box, w, TRUE, TRUE, 0); /* add a spacer */ w = gtk_alignment_new (0.0f, 0.0f, 0.0f, 0.0f); gtk_widget_set_size_request (w, 0u, GUI_PAD_BIG); gtk_box_pack_start (h_box, w, FALSE, FALSE, 0); /* add the entry field */ s = gtk_entry_new (); gtk_entry_set_icon_from_stock (GTK_ENTRY (s), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_CLEAR); g_signal_connect (s, "icon-release", G_CALLBACK (entry_clear), NULL); gtk_box_pack_start (h_box, s, TRUE, TRUE, 0); g_signal_connect (s, "changed", G_CALLBACK (filter_entry_changed), data->filter_model); selection_changed_cb (NULL, data); *filter_model = data->filter_model; update_count_label (data); return h; } transmission-2.92/gtk/PaxHeaders.4960/dialogs.c0000644000000000000000000000007312617356116016245 xustar0029 atime=1456201459.05321957 30 ctime=1457295921.046825705 transmission-2.92/gtk/dialogs.c0000644000175000017500000001464512617356116017700 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: dialogs.c 13625 2012-12-05 17:29:46Z jordan $ * * Copyright (c) Transmission authors and contributors * * 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. *****************************************************************************/ #include #include #include #include "dialogs.h" #include "tr-core.h" /*** **** ***/ struct delete_data { gboolean delete_files; GSList * torrent_ids; TrCore * core; }; static void on_remove_dialog_response (GtkDialog * dialog, gint response, gpointer gdd) { GSList * l; struct delete_data * dd = gdd; if (response == GTK_RESPONSE_ACCEPT) for (l=dd->torrent_ids; l!=NULL; l=l->next) gtr_core_remove_torrent (dd->core, GPOINTER_TO_INT (l->data), dd->delete_files); gtk_widget_destroy (GTK_WIDGET (dialog)); g_slist_free (dd->torrent_ids); g_free (dd); } void gtr_confirm_remove (GtkWindow * parent, TrCore * core, GSList * torrent_ids, gboolean delete_files) { GSList * l; GtkWidget * d; GString * primary_text; GString * secondary_text; struct delete_data * dd; int connected = 0; int incomplete = 0; const int count = g_slist_length (torrent_ids); if (!count) return; dd = g_new0 (struct delete_data, 1); dd->core = core; dd->torrent_ids = torrent_ids; dd->delete_files = delete_files; for (l=torrent_ids; l!=NULL; l=l->next) { const int id = GPOINTER_TO_INT (l->data); tr_torrent * tor = gtr_core_find_torrent (core, id); const tr_stat * stat = tr_torrentStat (tor); if (stat->leftUntilDone) ++incomplete; if (stat->peersConnected) ++connected; } primary_text = g_string_new (NULL); if (!delete_files) { g_string_printf (primary_text, ngettext ("Remove torrent?", "Remove %d torrents?", count), count); } else { g_string_printf (primary_text, ngettext ("Delete this torrent's downloaded files?", "Delete these %d torrents' downloaded files?", count), count); } secondary_text = g_string_new (NULL); if (!incomplete && !connected) { g_string_assign (secondary_text, ngettext ( "Once removed, continuing the transfer will require the torrent file or magnet link.", "Once removed, continuing the transfers will require the torrent files or magnet links.", count)); } else if (count == incomplete) { g_string_assign (secondary_text, ngettext ("This torrent has not finished downloading.", "These torrents have not finished downloading.", count)); } else if (count == connected) { g_string_assign (secondary_text, ngettext ("This torrent is connected to peers.", "These torrents are connected to peers.", count)); } else { if (connected) g_string_append (secondary_text, ngettext ("One of these torrents is connected to peers.", "Some of these torrents are connected to peers.", connected)); if (connected && incomplete) g_string_append (secondary_text, "\n"); if (incomplete) g_string_assign (secondary_text, ngettext ("One of these torrents has not finished downloading.", "Some of these torrents have not finished downloading.", incomplete)); } d = gtk_message_dialog_new_with_markup (parent, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, "%s", primary_text->str); if (secondary_text->len) gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (d), "%s", secondary_text->str); gtk_dialog_add_buttons (GTK_DIALOG (d), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, (delete_files ? GTK_STOCK_DELETE : GTK_STOCK_REMOVE), GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_CANCEL); gtk_dialog_set_alternative_button_order (GTK_DIALOG (d), GTK_RESPONSE_ACCEPT, GTK_RESPONSE_CANCEL, -1); g_signal_connect (d, "response", G_CALLBACK (on_remove_dialog_response), dd); gtk_widget_show_all (d); g_string_free (primary_text, TRUE); g_string_free (secondary_text, TRUE); } transmission-2.92/gtk/PaxHeaders.4960/favicon.c0000644000000000000000000000007412640050120016227 xustar0030 atime=1456201459.054219587 30 ctime=1457295921.050825773 transmission-2.92/gtk/favicon.c0000644000175000017500000001112112640050120017643 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2012-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: favicon.c 14241 2014-01-21 03:10:30Z jordan $ */ #include /* g_remove () */ #include #include #include /* tr_webRun () */ #include "favicon.h" #include "util.h" /* gtr_get_host_from_url () */ #define IMAGE_TYPES 4 static const char * image_types[IMAGE_TYPES] = { "ico", "png", "gif", "jpg" }; struct favicon_data { tr_session * session; GFunc func; gpointer data; char * host; char * contents; size_t len; int type; }; static char* get_url (const char * host, int image_type) { return g_strdup_printf ("http://%s/favicon.%s", host, image_types[image_type]); } static char* favicon_get_cache_dir (void) { static char * dir = NULL; if (dir == NULL) { dir = g_build_filename (g_get_user_cache_dir (), "transmission", "favicons", NULL); g_mkdir_with_parents (dir, 0777); } return dir; } static char* favicon_get_cache_filename (const char * host) { return g_build_filename (favicon_get_cache_dir (), host, NULL); } static void favicon_save_to_cache (const char * host, const void * data, size_t len) { char * filename = favicon_get_cache_filename (host); g_file_set_contents (filename, data, len, NULL); g_free (filename); } static GdkPixbuf* favicon_load_from_cache (const char * host) { char * filename = favicon_get_cache_filename (host); GdkPixbuf * pixbuf = gdk_pixbuf_new_from_file_at_size (filename, 16, 16, NULL); if (pixbuf == NULL) /* bad file */ g_remove (filename); g_free (filename); return pixbuf; } static void favicon_web_done_cb (tr_session*, bool, bool, long, const void*, size_t, void*); static gboolean favicon_web_done_idle_cb (gpointer vfav) { GdkPixbuf * pixbuf = NULL; gboolean finished = FALSE; struct favicon_data * fav = vfav; if (fav->len > 0) /* we got something... try to make a pixbuf from it */ { favicon_save_to_cache (fav->host, fav->contents, fav->len); pixbuf = favicon_load_from_cache (fav->host); finished = pixbuf != NULL; } if (!finished) /* no pixbuf yet... */ { if (++fav->type == IMAGE_TYPES) /* failure */ { finished = TRUE; } else /* keep trying */ { char * url = get_url (fav->host, fav->type); g_free (fav->contents); fav->contents = NULL; fav->len = 0; tr_webRun (fav->session, url, favicon_web_done_cb, fav); g_free (url); } } if (finished) { fav->func (pixbuf, fav->data); g_free (fav->host); g_free (fav->contents); g_free (fav); } return G_SOURCE_REMOVE; } static void favicon_web_done_cb (tr_session * session UNUSED, bool did_connect UNUSED, bool did_timeout UNUSED, long code UNUSED, const void * data, size_t len, void * vfav) { struct favicon_data * fav = vfav; fav->contents = g_memdup (data, len); fav->len = len; gdk_threads_add_idle (favicon_web_done_idle_cb, fav); } void gtr_get_favicon (tr_session * session, const char * host, GFunc pixbuf_ready_func, gpointer pixbuf_ready_func_data) { GdkPixbuf * pixbuf = favicon_load_from_cache (host); if (pixbuf != NULL) { pixbuf_ready_func (pixbuf, pixbuf_ready_func_data); } else { struct favicon_data * data; char * url = get_url (host, 0); data = g_new (struct favicon_data, 1); data->session = session; data->func = pixbuf_ready_func; data->data = pixbuf_ready_func_data; data->host = g_strdup (host); data->type = 0; tr_webRun (session, url, favicon_web_done_cb, data); g_free (url); } } void gtr_get_favicon_from_url (tr_session * session, const char * url, GFunc pixbuf_ready_func, gpointer pixbuf_ready_func_data) { char host[1024]; gtr_get_host_from_url (host, sizeof (host), url); gtr_get_favicon (session, host, pixbuf_ready_func, pixbuf_ready_func_data); } transmission-2.92/gtk/PaxHeaders.4960/conf.h0000644000000000000000000000007312617356116015555 xustar0030 atime=1456201459.052219553 29 ctime=1457295920.89482312 transmission-2.92/gtk/conf.h0000644000175000017500000000444012617356116017200 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: conf.h 13683 2012-12-22 20:35:19Z jordan $ * * Copyright (c) Transmission authors and contributors * * 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. *****************************************************************************/ #ifndef GTR_CONFIG_H #define GTR_CONFIG_H #include #include /* tr_variant, tr_session */ #include void gtr_pref_init (const char * config_dir); int64_t gtr_pref_int_get (const tr_quark key); void gtr_pref_int_set (const tr_quark key, int64_t value); double gtr_pref_double_get (const tr_quark key); void gtr_pref_double_set (const tr_quark key, double value); gboolean gtr_pref_flag_get (const tr_quark key); void gtr_pref_flag_set (const tr_quark key, gboolean value); const char* gtr_pref_string_get (const tr_quark key); void gtr_pref_string_set (const tr_quark key, const char * value); void gtr_pref_save (tr_session *); struct tr_variant* gtr_pref_get_all (void); #endif /* GTR_CONFIG_H */ transmission-2.92/gtk/PaxHeaders.4960/icons.c0000644000000000000000000000007412633056462015736 xustar0030 atime=1456201459.057219638 30 ctime=1457295921.073826165 transmission-2.92/gtk/icons.c0000644000175000017500000001427712633056462017371 0ustar00mikedldmikedld00000000000000/* * icons.[ch] written by Paolo Bacchilega, who writes: * "There is no problem for me, you can license my code * under whatever licence you wish :)" * * $Id: icons.c 14613 2015-12-06 22:13:10Z jordan $ */ #include #include #include #include "icons.h" #define VOID_PIXBUF_KEY "void-pixbuf" static const char * get_static_string (const char *s) { static GStringChunk * static_strings = NULL; if (s == NULL) return NULL; if (static_strings == NULL) static_strings = g_string_chunk_new (1024); return g_string_chunk_insert_const (static_strings, s); } typedef struct { GtkIconTheme * icon_theme; int icon_size; GHashTable * cache; } IconCache; static IconCache *icon_cache[7] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static GdkPixbuf* create_void_pixbuf (int width, int height) { GdkPixbuf *p; p = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, width, height); gdk_pixbuf_fill (p, 0xFFFFFF00); return p; } static int get_size_in_pixels (GtkWidget * widget, GtkIconSize icon_size) { int width, height; gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (widget), icon_size, &width, &height); return MAX (width, height); } static IconCache * icon_cache_new (GtkWidget * for_widget, int icon_size) { IconCache * icon_cache; g_return_val_if_fail (for_widget != NULL, NULL); icon_cache = g_new0 (IconCache, 1); icon_cache->icon_theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (for_widget)); icon_cache->icon_size = get_size_in_pixels (for_widget, icon_size); icon_cache->cache = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref); g_hash_table_insert (icon_cache->cache, (void*)VOID_PIXBUF_KEY, create_void_pixbuf (icon_cache->icon_size, icon_cache->icon_size)); return icon_cache; } static const char * _icon_cache_get_icon_key (GIcon * icon) { const char * key = NULL; if (G_IS_THEMED_ICON (icon)) { char ** icon_names; char * name; g_object_get (icon, "names", &icon_names, NULL); name = g_strjoinv (",", icon_names); key = get_static_string (name); g_free (name); g_strfreev (icon_names); } else if (G_IS_FILE_ICON (icon)) { GFile * file; char * filename; file = g_file_icon_get_file (G_FILE_ICON (icon)); filename = g_file_get_path (file); key = get_static_string (filename); g_free (filename); g_object_unref (file); } return key; } static GdkPixbuf * get_themed_icon_pixbuf (GThemedIcon * icon, int size, GtkIconTheme * icon_theme) { char ** icon_names = NULL; GtkIconInfo * icon_info; GdkPixbuf * pixbuf; GError * error = NULL; g_object_get (icon, "names", &icon_names, NULL); icon_info = gtk_icon_theme_choose_icon (icon_theme, (const char **)icon_names, size, 0); if (icon_info == NULL) icon_info = gtk_icon_theme_lookup_icon (icon_theme, "text-x-generic", size, GTK_ICON_LOOKUP_USE_BUILTIN); pixbuf = gtk_icon_info_load_icon (icon_info, &error); if (pixbuf == NULL) { if (error && error->message) g_warning ("could not load icon pixbuf: %s\n", error->message); g_clear_error (&error); } #if GTK_CHECK_VERSION(3,8,0) g_object_unref (icon_info); #else gtk_icon_info_free (icon_info); #endif g_strfreev (icon_names); return pixbuf; } static GdkPixbuf * get_file_icon_pixbuf (GFileIcon * icon, int size) { GFile * file; char * filename; GdkPixbuf * pixbuf; file = g_file_icon_get_file (icon); filename = g_file_get_path (file); pixbuf = gdk_pixbuf_new_from_file_at_size (filename, size, -1, NULL); g_free (filename); g_object_unref (file); return pixbuf; } static GdkPixbuf * _get_icon_pixbuf (GIcon * icon, int size, GtkIconTheme * theme) { if (icon == NULL) return NULL; if (G_IS_THEMED_ICON (icon)) return get_themed_icon_pixbuf (G_THEMED_ICON (icon), size, theme); if (G_IS_FILE_ICON (icon)) return get_file_icon_pixbuf (G_FILE_ICON (icon), size); return NULL; } static GdkPixbuf * icon_cache_get_mime_type_icon (IconCache * icon_cache, const char * mime_type) { GIcon * icon; const char * key = NULL; GdkPixbuf * pixbuf; icon = g_content_type_get_icon (mime_type); key = _icon_cache_get_icon_key (icon); if (key == NULL) key = VOID_PIXBUF_KEY; pixbuf = g_hash_table_lookup (icon_cache->cache, key); if (pixbuf != NULL) { g_object_ref (pixbuf); g_object_unref (G_OBJECT (icon)); return pixbuf; } pixbuf = _get_icon_pixbuf (icon, icon_cache->icon_size, icon_cache->icon_theme); if (pixbuf != NULL) g_hash_table_insert (icon_cache->cache, (gpointer) key, g_object_ref (pixbuf)); g_object_unref (G_OBJECT (icon)); return pixbuf; } GdkPixbuf * gtr_get_mime_type_icon (const char * mime_type, GtkIconSize icon_size, GtkWidget * for_widget) { int n; switch (icon_size) { case GTK_ICON_SIZE_MENU: n = 1; break; case GTK_ICON_SIZE_SMALL_TOOLBAR: n = 2; break; case GTK_ICON_SIZE_LARGE_TOOLBAR: n = 3; break; case GTK_ICON_SIZE_BUTTON: n = 4; break; case GTK_ICON_SIZE_DND: n = 5; break; case GTK_ICON_SIZE_DIALOG: n = 6; break; default /*GTK_ICON_SIZE_INVALID*/: n = 0; break; } if (icon_cache[n] == NULL) icon_cache[n] = icon_cache_new (for_widget, icon_size); return icon_cache_get_mime_type_icon (icon_cache[n], mime_type); } const char * gtr_get_mime_type_from_filename (const char * file) { char * tmp = g_content_type_guess (file, NULL, 0, NULL); const char * ret = get_static_string (tmp); g_free (tmp); return ret; } transmission-2.92/gtk/PaxHeaders.4960/tr-window.h0000644000000000000000000000007412617356116016563 xustar0030 atime=1456201459.066219791 30 ctime=1457295921.005825008 transmission-2.92/gtk/tr-window.h0000644000175000017500000000331312617356116020203 0ustar00mikedldmikedld00000000000000/****************************************************************************** * $Id: tr-window.h 13625 2012-12-05 17:29:46Z jordan $ * * Copyright (c) Transmission authors and contributors * * 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. *****************************************************************************/ #ifndef GTR_WINDOW_H #define GTR_WINDOW_H #include #include "tr-core.h" GtkWidget * gtr_window_new (GtkApplication * app, GtkUIManager * uim, TrCore * core); GtkTreeSelection * gtr_window_get_selection (GtkWindow *); void gtr_window_set_busy (GtkWindow *, gboolean isBusy); void gtr_window_refresh (GtkWindow *); #endif /* GTR_WINDOW_H */ transmission-2.92/gtk/PaxHeaders.4960/Makefile.am0000644000000000000000000000007412662754574016526 xustar0030 atime=1456201459.050219519 30 ctime=1457295920.881822899 transmission-2.92/gtk/Makefile.am0000644000175000017500000000633412662754574020154 0ustar00mikedldmikedld00000000000000BUILT_SOURCES = CLEANFILES = SUBDIRS = icons if TR_UNSTABLE #FIXME: migrate from GtkUIManager to GtkBuilder in 2.90 #GTK_EXTRA_CPPFLAGS=-DG_DISABLE_DEPRECATED -DGDK_PIXBUF_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DPANGO_DISABLE_DEPRECATED GTK_EXTRA_CPPFLAGS=-DG_DISABLE_DEPRECATED -DGDK_PIXBUF_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DPANGO_DISABLE_DEPRECATED endif # these should go in GTK_EXTRA_CPPFLAGS at some point, but not yet because it breaks libnotify's headers # -DG_DISABLE_SINGLE_INCLUDES -DGTK_DISABLE_SINGLE_INCLUDES AM_CPPFLAGS = \ -I$(top_srcdir) \ -DTRANSMISSIONLOCALEDIR=\""$(transmissionlocaledir)"\" \ $(GTK_EXTRA_CPPFLAGS) AM_CFLAGS = \ @LIBAPPINDICATOR_CFLAGS@ \ @LIBEVENT_CFLAGS@ \ @GTK_CFLAGS@ \ @LIBCURL_CFLAGS@ \ @ZLIB_CFLAGS@ \ @PTHREAD_CFLAGS@ noinst_HEADERS = \ actions.h \ conf.h \ details.h \ dialogs.h \ favicon.h \ file-list.h \ filter.h \ hig.h \ icons.h \ makemeta-ui.h \ msgwin.h \ notify.h \ open-dialog.h \ relocate.h \ stats.h \ torrent-cell-renderer.h \ transmission-resources.h \ tr-core.h \ tr-icon.h \ tr-prefs.h \ tr-window.h \ util.h bin_PROGRAMS = transmission-gtk transmission_gtk_SOURCES = \ actions.c \ conf.c \ details.c \ dialogs.c \ favicon.c \ file-list.c \ filter.c \ hig.c \ icons.c \ main.c \ makemeta-ui.c \ msgwin.c \ notify.c \ open-dialog.c \ relocate.c \ stats.c \ torrent-cell-renderer.c \ transmission-resources.c \ tr-core.c \ tr-icon.c \ tr-prefs.c \ tr-window.c \ util.c dist_man_MANS = transmission-gtk.1 transmission_gtk_LDADD = \ $(top_builddir)/libtransmission/libtransmission.a \ @LIBUPNP_LIBS@ \ @LIBNATPMP_LIBS@ \ @DHT_LIBS@ \ @LIBB64_LIBS@ \ @LIBUTP_LIBS@ \ @GTK_LIBS@ \ @LIBAPPINDICATOR_LIBS@ \ @LIBEVENT_LIBS@ \ @LIBCURL_LIBS@ \ @CRYPTO_LIBS@ \ @ZLIB_LIBS@ \ @PTHREAD_LIBS@ \ ${LIBM} DESKTOP_IN_FILES=transmission-gtk.desktop.in DESKTOP_FILES=$(DESKTOP_IN_FILES:.desktop.in=.desktop) @INTLTOOL_DESKTOP_RULE@ Productivitydir = $(datadir)/applications Productivity_DATA = $(DESKTOP_FILES) icon_DATA = transmission.png icondir = $(datadir)/pixmaps UI_FILES = transmission-ui.xml transmission-resources.c: transmission.gresource.xml $(UI_FILES) $(AM_V_GEN)glib-compile-resources --target=$@ --sourcedir=$(srcdir) \ --generate-source --c-name transmission $< transmission-resources.h: transmission.gresource.xml $(UI_FILES) $(AM_V_GEN)glib-compile-resources --target=$@ --sourcedir=$(srcdir) \ --generate-header --c-name transmission $< CLEANFILES += \ transmission-resources.c \ transmission-resources.h BUILT_SOURCES += \ transmission-resources.c \ transmission-resources.h EXTRA_DIST = \ $(DESKTOP_IN_FILES) \ $(UI_FILES) \ transmission.gresource.xml \ transmission.png DISTCLEANFILES = \ transmission-gtk.desktop if WIN32 transmission.res: transmission.rc $(WINDRES) -J rc -i transmission.rc -O coff -o transmission.res BUILT_SOURCES += transmission.res CLEANFILES += transmission.res transmission_gtk_LDADD += transmission.res transmission_gtk_LDFLAGS = -mwindows endif transmission-2.92/gtk/PaxHeaders.4960/util.h0000644000000000000000000000007412617356116015606 xustar0030 atime=1456201459.069219842 30 ctime=1457295921.014825161 transmission-2.92/gtk/util.h0000644000175000017500000001201512617356116017225 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: util.h 14587 2015-10-23 04:09:40Z mikedld $ */ #ifndef GTR_UTIL_H #define GTR_UTIL_H #include #include #include #include extern const int mem_K; extern const char * mem_K_str; extern const char * mem_M_str; extern const char * mem_G_str; extern const char * mem_T_str; extern const int disk_K; extern const char * disk_K_str; extern const char * disk_M_str; extern const char * disk_G_str; extern const char * disk_T_str; extern const int speed_K; extern const char * speed_K_str; extern const char * speed_M_str; extern const char * speed_G_str; extern const char * speed_T_str; #if GLIB_CHECK_VERSION(2,33,12) #define TR_DEFINE_QUARK G_DEFINE_QUARK #else #define TR_DEFINE_QUARK(QN, q_n) \ GQuark \ q_n##_quark (void) \ { \ static GQuark q; \ \ if G_UNLIKELY (q == 0) \ q = g_quark_from_static_string (#QN); \ \ return q; \ } #endif /* macro to shut up "unused parameter" warnings */ #ifndef UNUSED #define UNUSED G_GNUC_UNUSED #endif enum { GTR_UNICODE_UP, GTR_UNICODE_DOWN, GTR_UNICODE_INF, GTR_UNICODE_BULLET }; const char * gtr_get_unicode_string (int); /* return a percent formatted string of either x.xx, xx.x or xxx */ char* tr_strlpercent (char * buf, double x, size_t buflen); /* return a human-readable string for the size given in bytes. */ char* tr_strlsize (char * buf, guint64 size, size_t buflen); /* return a human-readable string for the given ratio. */ char* tr_strlratio (char * buf, double ratio, size_t buflen); /* return a human-readable string for the time given in seconds. */ char* tr_strltime (char * buf, int secs, size_t buflen); /*** **** ***/ /* http://www.legaltorrents.com/some/announce/url --> legaltorrents.com */ void gtr_get_host_from_url (char * buf, size_t buflen, const char * url); gboolean gtr_is_magnet_link (const char * str); gboolean gtr_is_hex_hashcode (const char * str); /*** **** ***/ void gtr_open_uri (const char * uri); void gtr_open_file (const char * path); const char* gtr_get_help_uri (void); /*** **** ***/ /* backwards-compatible wrapper around gtk_widget_set_visible () */ void gtr_widget_set_visible (GtkWidget *, gboolean); void gtr_dialog_set_content (GtkDialog * dialog, GtkWidget * content); /*** **** ***/ GtkWidget * gtr_priority_combo_new (void); #define gtr_priority_combo_get_value(w) gtr_combo_box_get_active_enum (w) #define gtr_priority_combo_set_value(w,val) gtr_combo_box_set_active_enum (w,val) GtkWidget * gtr_combo_box_new_enum (const char * text_1, ...); int gtr_combo_box_get_active_enum (GtkComboBox *); void gtr_combo_box_set_active_enum (GtkComboBox *, int value); /*** **** ***/ struct _TrCore; GtkWidget * gtr_freespace_label_new (struct _TrCore * core, const char * dir); void gtr_freespace_label_set_dir (GtkWidget * label, const char * dir); /*** **** ***/ void gtr_unrecognized_url_dialog (GtkWidget * parent, const char * url); void gtr_http_failure_dialog (GtkWidget * parent, const char * url, long response_code); void gtr_add_torrent_error_dialog (GtkWidget * window_or_child, int err, tr_torrent * duplicate_torrent, const char * filename); /* pop up the context menu if a user right-clicks. if the row they right-click on isn't selected, select it. */ gboolean on_tree_view_button_pressed (GtkWidget * view, GdkEventButton * event, gpointer unused); /* if the click didn't specify a row, clear the selection */ gboolean on_tree_view_button_released (GtkWidget * view, GdkEventButton * event, gpointer unused); /* move a file to the trashcan if GIO is available; otherwise, delete it */ bool gtr_file_trash_or_remove (const char * filename, struct tr_error ** error); void gtr_paste_clipboard_url_into_entry (GtkWidget * entry); /* Only call gtk_label_set_text () if the new text differs from the old. * This prevents the label from having to recalculate its size * and prevents selected text in the label from being deselected */ void gtr_label_set_text (GtkLabel * lb, const char * text); #endif /* GTR_UTIL_H */ transmission-2.92/gtk/PaxHeaders.4960/notify.h0000644000000000000000000000007412617356116016141 xustar0030 atime=1456201459.060219689 30 ctime=1457295920.954824141 transmission-2.92/gtk/notify.h0000644000175000017500000000067612617356116017572 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2008-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: notify.h 14241 2014-01-21 03:10:30Z jordan $ */ #ifndef GTR_NOTIFY_H #define GTR_NOTIFY_H #include "tr-core.h" void gtr_notify_init (void); void gtr_notify_torrent_added (const char * name); void gtr_notify_torrent_completed (TrCore * core, int torrent_id); #endif transmission-2.92/gtk/PaxHeaders.4960/torrent-cell-renderer.c0000644000000000000000000000007312617356116021041 xustar0029 atime=1456201459.06321974 30 ctime=1457295921.119826947 transmission-2.92/gtk/torrent-cell-renderer.c0000644000175000017500000010453112617356116022466 0ustar00mikedldmikedld00000000000000/* * This file Copyright (C) 2007-2014 Mnemosyne LLC * * It may be used under the GNU GPL versions 2 or 3 * or any future license endorsed by Mnemosyne LLC. * * $Id: torrent-cell-renderer.c 14241 2014-01-21 03:10:30Z jordan $ */ #include /* INT_MAX */ #include #include #include #include /* tr_truncd () */ #include "hig.h" #include "icons.h" #include "torrent-cell-renderer.h" #include "util.h" /* #define TEST_RTL */ enum { P_TORRENT = 1, P_UPLOAD_SPEED, P_DOWNLOAD_SPEED, P_BAR_HEIGHT, P_COMPACT }; #define DEFAULT_BAR_HEIGHT 12 #define SMALL_SCALE 0.9 #define COMPACT_ICON_SIZE GTK_ICON_SIZE_MENU #define FULL_ICON_SIZE GTK_ICON_SIZE_DND /*** **** ***/ static void getProgressString (GString * gstr, const tr_torrent * tor, const tr_info * info, const tr_stat * st) { const int isDone = st->leftUntilDone == 0; const uint64_t haveTotal = st->haveUnchecked + st->haveValid; const int isSeed = st->haveValid >= info->totalSize; char buf1[32], buf2[32], buf3[32], buf4[32], buf5[32], buf6[32]; double seedRatio; const gboolean hasSeedRatio = tr_torrentGetSeedRatio (tor, &seedRatio); if (!isDone) /* downloading */ { g_string_append_printf (gstr, /* %1$s is how much we've got, %2$s is how much we'll have when done, %3$s%% is a percentage of the two */ _("%1$s of %2$s (%3$s%%)"), tr_strlsize (buf1, haveTotal, sizeof (buf1)), tr_strlsize (buf2, st->sizeWhenDone, sizeof (buf2)), tr_strlpercent (buf3, st->percentDone * 100.0, sizeof (buf3))); } else if (!isSeed) /* partial seeds */ { if (hasSeedRatio) { g_string_append_printf (gstr, /* %1$s is how much we've got, %2$s is the torrent's total size, %3$s%% is a percentage of the two, %4$s is how much we've uploaded, %5$s is our upload-to-download ratio, %6$s is the ratio we want to reach before we stop uploading */ _("%1$s of %2$s (%3$s%%), uploaded %4$s (Ratio: %5$s Goal: %6$s)"), tr_strlsize (buf1, haveTotal, sizeof (buf1)), tr_strlsize (buf2, info->totalSize, sizeof (buf2)), tr_strlpercent (buf3, st->percentComplete * 100.0, sizeof (buf3)), tr_strlsize (buf4, st->uploadedEver, sizeof (buf4)), tr_strlratio (buf5, st->ratio, sizeof (buf5)), tr_strlratio (buf6, seedRatio, sizeof (buf6))); } else { g_string_append_printf (gstr, /* %1$s is how much we've got, %2$s is the torrent's total size, %3$s%% is a percentage of the two, %4$s is how much we've uploaded, %5$s is our upload-to-download ratio */ _("%1$s of %2$s (%3$s%%), uploaded %4$s (Ratio: %5$s)"), tr_strlsize (buf1, haveTotal, sizeof (buf1)), tr_strlsize (buf2, info->totalSize, sizeof (buf2)), tr_strlpercent (buf3, st->percentComplete * 100.0, sizeof (buf3)), tr_strlsize (buf4, st->uploadedEver, sizeof (buf4)), tr_strlratio (buf5, st->ratio, sizeof (buf5))); } } else /* seeding */ { if (hasSeedRatio) { g_string_append_printf (gstr, /* %1$s is the torrent's total size, %2$s is how much we've uploaded, %3$s is our upload-to-download ratio, %4$s is the ratio we want to reach before we stop uploading */ _("%1$s, uploaded %2$s (Ratio: %3$s Goal: %4$s)"), tr_strlsize (buf1, info->totalSize, sizeof (buf1)), tr_strlsize (buf2, st->uploadedEver, sizeof (buf2)), tr_strlratio (buf3, st->ratio, sizeof (buf3)), tr_strlratio (buf4, seedRatio, sizeof (buf4))); } else /* seeding w/o a ratio */ { g_string_append_printf (gstr, /* %1$s is the torrent's total size, %2$s is how much we've uploaded, %3$s is our upload-to-download ratio */ _("%1$s, uploaded %2$s (Ratio: %3$s)"), tr_strlsize (buf1, info->totalSize, sizeof (buf1)), tr_strlsize (buf2, st->uploadedEver, sizeof (buf2)), tr_strlratio (buf3, st->ratio, sizeof (buf3))); } } /* add time when downloading */ if ((st->activity == TR_STATUS_DOWNLOAD) || (hasSeedRatio && (st->activity == TR_STATUS_SEED))) { const int eta = st->eta; g_string_append (gstr, " - "); if (eta < 0) g_string_append (gstr, _("Remaining time unknown")); else { char timestr[128]; tr_strltime (timestr, eta, sizeof (timestr)); /* time remaining */ g_string_append_printf (gstr, _("%s remaining"), timestr); } } } static char* getShortTransferString (const tr_torrent * tor, const tr_stat * st, double uploadSpeed_KBps, double downloadSpeed_KBps, char * buf, size_t buflen) { const int haveMeta = tr_torrentHasMetadata (tor); const int haveUp = haveMeta && st->peersGettingFromUs > 0; const int haveDown = haveMeta && ((st->peersSendingToUs > 0) || (st->webseedsSendingToUs > 0)); if (haveDown) { char dnStr[32], upStr[32]; tr_formatter_speed_KBps (dnStr, downloadSpeed_KBps, sizeof (dnStr)); tr_formatter_speed_KBps (upStr, uploadSpeed_KBps, sizeof (upStr)); /* down speed, down symbol, up speed, up symbol */ g_snprintf (buf, buflen, _("%1$s %2$s %3$s %4$s"), dnStr, gtr_get_unicode_string (GTR_UNICODE_DOWN), upStr, gtr_get_unicode_string (GTR_UNICODE_UP)); } else if (haveUp) { char upStr[32]; tr_formatter_speed_KBps (upStr, uploadSpeed_KBps, sizeof (upStr)); /* up speed, up symbol */ g_snprintf (buf, buflen, _("%1$s %2$s"), upStr, gtr_get_unicode_string (GTR_UNICODE_UP)); } else if (st->isStalled) { g_strlcpy (buf, _("Stalled"), buflen); } else { *buf = '\0'; } return buf; } static void getShortStatusString (GString * gstr, const tr_torrent * tor, const tr_stat * st, double uploadSpeed_KBps, double downloadSpeed_KBps) { switch (st->activity) { case TR_STATUS_STOPPED: g_string_append (gstr, st->finished ? _("Finished") : _("Paused")); break; case TR_STATUS_CHECK_WAIT: g_string_append (gstr, _("Queued for verification")); break; case TR_STATUS_DOWNLOAD_WAIT: g_string_append (gstr, _("Queued for download")); break; case TR_STATUS_SEED_WAIT: g_string_append (gstr, _("Queued for seeding")); break; case TR_STATUS_CHECK: g_string_append_printf (gstr, _("Verifying local data (%.1f%% tested)"), tr_truncd (st->recheckProgress * 100.0, 1)); break; case TR_STATUS_DOWNLOAD: case TR_STATUS_SEED: { char speedStr[64]; char ratioStr[64]; tr_strlratio (ratioStr, st->ratio, sizeof (ratioStr)); getShortTransferString (tor, st, uploadSpeed_KBps, downloadSpeed_KBps, speedStr, sizeof (speedStr)); /* download/upload speed, ratio */ g_string_append_printf (gstr, "%1$s Ratio: %2$s", speedStr, ratioStr); break; } default: break; } } static void getStatusString (GString * gstr, const tr_torrent * tor, const tr_stat * st, const double uploadSpeed_KBps, const double downloadSpeed_KBps) { if (st->error) { const char * fmt[] = { NULL, N_("Tracker gave a warning: \"%s\""), N_("Tracker gave an error: \"%s\""), N_("Error: %s") }; g_string_append_printf (gstr, _ (fmt[st->error]), st->errorString); } else switch (st->activity) { case TR_STATUS_STOPPED: case TR_STATUS_CHECK_WAIT: case TR_STATUS_CHECK: case TR_STATUS_DOWNLOAD_WAIT: case TR_STATUS_SEED_WAIT: { getShortStatusString (gstr, tor, st, uploadSpeed_KBps, downloadSpeed_KBps); break; } case TR_STATUS_DOWNLOAD: { if (!tr_torrentHasMetadata (tor)) { /* Downloading metadata from 2 peer (s)(50% done) */ g_string_append_printf (gstr, _("Downloading metadata from %1$'d %2$s (%3$d%% done)"), st->peersConnected, ngettext ("peer","peers",st->peersConnected), (int)(100.0*st->metadataPercentComplete)); } else if (st->peersSendingToUs && st->webseedsSendingToUs) { /* Downloading from 2 of 3 peer (s) and 2 webseed (s) */ g_string_append_printf (gstr, _("Downloading from %1$'d of %2$'d %3$s and %4$'d %5$s"), st->peersSendingToUs, st->peersConnected, ngettext ("peer","peers",st->peersConnected), st->webseedsSendingToUs, ngettext ("web seed","web seeds",st->webseedsSendingToUs)); } else if (st->webseedsSendingToUs) { /* Downloading from 3 web seed (s) */ g_string_append_printf (gstr, _("Downloading from %1$'d %2$s"), st->webseedsSendingToUs, ngettext ("web seed","web seeds",st->webseedsSendingToUs)); } else { /* Downloading from 2 of 3 peer (s) */ g_string_append_printf (gstr, _("Downloading from %1$'d of %2$'d %3$s"), st->peersSendingToUs, st->peersConnected, ngettext ("peer","peers",st->peersConnected)); } break; } case TR_STATUS_SEED: g_string_append_printf (gstr, ngettext ("Seeding to %1$'d of %2$'d connected peer", "Seeding to %1$'d of %2$'d connected peers", st->peersConnected), st->peersGettingFromUs, st->peersConnected); break; } if ((st->activity != TR_STATUS_CHECK_WAIT) && (st->activity != TR_STATUS_CHECK) && (st->activity != TR_STATUS_DOWNLOAD_WAIT) && (st->activity != TR_STATUS_SEED_WAIT) && (st->activity != TR_STATUS_STOPPED)) { char buf[256]; getShortTransferString (tor, st, uploadSpeed_KBps, downloadSpeed_KBps, buf, sizeof (buf)); if (*buf) g_string_append_printf (gstr, " - %s", buf); } } /*** **** ***/ struct TorrentCellRendererPrivate { tr_torrent * tor; GtkCellRenderer * text_renderer; GtkCellRenderer * progress_renderer; GtkCellRenderer * icon_renderer; GString * gstr1; GString * gstr2; int bar_height; /* Use this instead of tr_stat.pieceUploadSpeed so that the model can control when the speed displays get updated. This is done to keep the individual torrents' speeds and the status bar's overall speed in sync even if they refresh at slightly different times */ double upload_speed_KBps; /* @see upload_speed_Bps */ double download_speed_KBps; gboolean compact; }; /*** **** ***/ static GdkPixbuf* get_icon (const tr_torrent * tor, GtkIconSize icon_size, GtkWidget * for_widget) { const char * mime_type; const tr_info * info = tr_torrentInfo (tor); if (info->fileCount == 0) mime_type = UNKNOWN_MIME_TYPE; else if (info->fileCount > 1) mime_type = DIRECTORY_MIME_TYPE; else if (strchr (info->files[0].name, '/') != NULL) mime_type = DIRECTORY_MIME_TYPE; else mime_type = gtr_get_mime_type_from_filename (info->files[0].name); return gtr_get_mime_type_icon (mime_type, icon_size, for_widget); } /*** **** ***/ static void gtr_cell_renderer_get_preferred_size (GtkCellRenderer * renderer, GtkWidget * widget, GtkRequisition * minimum_size, GtkRequisition * natural_size) { gtk_cell_renderer_get_preferred_size (renderer, widget, minimum_size, natural_size); } static void get_size_compact (TorrentCellRenderer * cell, GtkWidget * widget, gint * width, gint * height) { int xpad, ypad; GtkRequisition icon_size; GtkRequisition name_size; GtkRequisition stat_size; const char * name; GdkPixbuf * icon; struct TorrentCellRendererPrivate * p = cell->priv; const tr_torrent * tor = p->tor; const tr_stat * st = tr_torrentStatCached ((tr_torrent*)tor); GString * gstr_stat = p->gstr1; icon = get_icon (tor, COMPACT_ICON_SIZE, widget); name = tr_torrentName (tor); g_string_truncate (gstr_stat, 0); getShortStatusString (gstr_stat, tor, st, p->upload_speed_KBps, p->download_speed_KBps); gtk_cell_renderer_get_padding (GTK_CELL_RENDERER (cell), &xpad, &ypad); /* get the idealized cell dimensions */ g_object_set (p->icon_renderer, "pixbuf", icon, NULL); gtr_cell_renderer_get_preferred_size (p->icon_renderer, widget, NULL, &icon_size); g_object_set (p->text_renderer, "text", name, "ellipsize", PANGO_ELLIPSIZE_NONE, "scale", 1.0, NULL); gtr_cell_renderer_get_preferred_size (p->text_renderer, widget, NULL, &name_size); g_object_set (p->text_renderer, "text", gstr_stat->str, "scale", SMALL_SCALE, NULL); gtr_cell_renderer_get_preferred_size (p->text_renderer, widget, NULL, &stat_size); /** *** LAYOUT **/ #define BAR_WIDTH 50 if (width != NULL) *width = xpad * 2 + icon_size.width + GUI_PAD + name_size.width + GUI_PAD + BAR_WIDTH + GUI_PAD + stat_size.width; if (height != NULL) *height = ypad * 2 + MAX (name_size.height, p->bar_height); /* cleanup */ g_object_unref (icon); } #define MAX3(a,b,c) MAX(a,MAX(b,c)) static void get_size_full (TorrentCellRenderer * cell, GtkWidget * widget, gint * width, gint * height) { int xpad, ypad; GtkRequisition icon_size; GtkRequisition name_size; GtkRequisition stat_size; GtkRequisition prog_size; const char * name; GdkPixbuf * icon; struct TorrentCellRendererPrivate * p = cell->priv; const tr_torrent * tor = p->tor; const tr_stat * st = tr_torrentStatCached ((tr_torrent*)tor); const tr_info * inf = tr_torrentInfo (tor); GString * gstr_prog = p->gstr1; GString * gstr_stat = p->gstr2; icon = get_icon (tor, FULL_ICON_SIZE, widget); name = tr_torrentName (tor); g_string_truncate (gstr_stat, 0); getStatusString (gstr_stat, tor, st, p->upload_speed_KBps, p->download_speed_KBps); g_string_truncate (gstr_prog, 0); getProgressString (gstr_prog, tor, inf, st); gtk_cell_renderer_get_padding (GTK_CELL_RENDERER (cell), &xpad, &ypad); /* get the idealized cell dimensions */ g_object_set (p->icon_renderer, "pixbuf", icon, NULL); gtr_cell_renderer_get_preferred_size (p->icon_renderer, widget, NULL, &icon_size); g_object_set (p->text_renderer, "text", name, "weight", PANGO_WEIGHT_BOLD, "scale", 1.0, "ellipsize", PANGO_ELLIPSIZE_NONE, NULL); gtr_cell_renderer_get_preferred_size (p->text_renderer, widget, NULL, &name_size); g_object_set (p->text_renderer, "text", gstr_prog->str, "weight", PANGO_WEIGHT_NORMAL, "scale", SMALL_SCALE, NULL); gtr_cell_renderer_get_preferred_size (p->text_renderer, widget, NULL, &prog_size); g_object_set (p->text_renderer, "text", gstr_stat->str, NULL); gtr_cell_renderer_get_preferred_size (p->text_renderer, widget, NULL, &stat_size); /** *** LAYOUT **/ if (width != NULL) *width = xpad * 2 + icon_size.width + GUI_PAD + MAX3 (name_size.width, prog_size.width, stat_size.width); if (height != NULL) *height = ypad * 2 + name_size.height + prog_size.height + GUI_PAD_SMALL + p->bar_height + GUI_PAD_SMALL + stat_size.height; /* cleanup */ g_object_unref (icon); } static void torrent_cell_renderer_get_size (GtkCellRenderer * cell, GtkWidget * widget, const GdkRectangle * cell_area, gint * x_offset, gint * y_offset, gint * width, gint * height) { TorrentCellRenderer * self = TORRENT_CELL_RENDERER (cell); if (self && self->priv->tor) { int w, h; struct TorrentCellRendererPrivate * p = self->priv; if (p->compact) get_size_compact (TORRENT_CELL_RENDERER (cell), widget, &w, &h); else get_size_full (TORRENT_CELL_RENDERER (cell), widget, &w, &h); if (width) *width = w; if (height) *height = h; if (x_offset) *x_offset = cell_area ? cell_area->x : 0; if (y_offset) { int xpad, ypad; gtk_cell_renderer_get_padding (cell, &xpad, &ypad); *y_offset = cell_area ? (int)((cell_area->height - (ypad*2 +h)) / 2.0) : 0; } } } typedef GdkRGBA GtrColor; #define FOREGROUND_COLOR_KEY "foreground-rgba" static void get_text_color (GtkWidget * w, const tr_stat * st, GtrColor * setme) { static const GdkRGBA red = { 1.0, 0, 0, 0 }; if (st->error) *setme = red; else if (st->activity == TR_STATUS_STOPPED) gtk_style_context_get_color (gtk_widget_get_style_context (w), GTK_STATE_FLAG_INSENSITIVE, setme); else gtk_style_context_get_color (gtk_widget_get_style_context (w), GTK_STATE_FLAG_NORMAL, setme); } static double get_percent_done (const tr_torrent * tor, const tr_stat * st, bool * seed) { double d; if ((st->activity == TR_STATUS_SEED) && tr_torrentGetSeedRatio (tor, &d)) { *seed = true; d = MAX (0.0, st->seedRatioPercentDone); } else { *seed = false; d = MAX (0.0, st->percentDone); } return d; } typedef cairo_t GtrDrawable; static void gtr_cell_renderer_render (GtkCellRenderer * renderer, GtrDrawable * drawable, GtkWidget * widget, const GdkRectangle * area, GtkCellRendererState flags) { gtk_cell_renderer_render (renderer, drawable, widget, area, area, flags); } static void render_compact (TorrentCellRenderer * cell, GtrDrawable * window, GtkWidget * widget, const GdkRectangle * background_area, const GdkRectangle * cell_area UNUSED, GtkCellRendererState flags) { int xpad, ypad; GtkRequisition size; GdkRectangle icon_area; GdkRectangle name_area; GdkRectangle stat_area; GdkRectangle prog_area; GdkRectangle fill_area; const char * name; GdkPixbuf * icon; GtrColor text_color; bool seed; struct TorrentCellRendererPrivate * p = cell->priv; const tr_torrent * tor = p->tor; const tr_stat * st = tr_torrentStatCached ((tr_torrent*)tor); const gboolean active = (st->activity != TR_STATUS_STOPPED) && (st->activity != TR_STATUS_DOWNLOAD_WAIT) && (st->activity != TR_STATUS_SEED_WAIT); const double percentDone = get_percent_done (tor, st, &seed); const gboolean sensitive = active || st->error; GString * gstr_stat = p->gstr1; icon = get_icon (tor, COMPACT_ICON_SIZE, widget); name = tr_torrentName (tor); g_string_truncate (gstr_stat, 0); getShortStatusString (gstr_stat, tor, st, p->upload_speed_KBps, p->download_speed_KBps); gtk_cell_renderer_get_padding (GTK_CELL_RENDERER (cell), &xpad, &ypad); get_text_color (widget, st, &text_color); fill_area = *background_area; fill_area.x += xpad; fill_area.y += ypad; fill_area.width -= xpad * 2; fill_area.height -= ypad * 2; icon_area = name_area = stat_area = prog_area = fill_area; g_object_set (p->icon_renderer, "pixbuf", icon, NULL); gtr_cell_renderer_get_preferred_size (p->icon_renderer, widget, NULL, &size); icon_area.width = size.width; g_object_set (p->text_renderer, "text", name, "ellipsize", PANGO_ELLIPSIZE_NONE, "scale", 1.0, NULL); gtr_cell_renderer_get_preferred_size (p->text_renderer, widget, NULL, &size); name_area.width = size.width; g_object_set (p->text_renderer, "text", gstr_stat->str, "scale", SMALL_SCALE, NULL); gtr_cell_renderer_get_preferred_size (p->text_renderer, widget, NULL, &size); stat_area.width = size.width; icon_area.x = fill_area.x; prog_area.x = fill_area.x + fill_area.width - BAR_WIDTH; prog_area.width = BAR_WIDTH; stat_area.x = prog_area.x - GUI_PAD - stat_area.width; name_area.x = icon_area.x + icon_area.width + GUI_PAD; name_area.y = fill_area.y; name_area.width = stat_area.x - GUI_PAD - name_area.x; /** *** RENDER **/ g_object_set (p->icon_renderer, "pixbuf", icon, "sensitive", sensitive, NULL); gtr_cell_renderer_render (p->icon_renderer, window, widget, &icon_area, flags); g_object_set (p->progress_renderer, "value", (int)(percentDone*100.0), "text", NULL, "sensitive", sensitive, NULL); gtr_cell_renderer_render (p->progress_renderer, window, widget, &prog_area, flags); g_object_set (p->text_renderer, "text", gstr_stat->str, "scale", SMALL_SCALE, "ellipsize", PANGO_ELLIPSIZE_END, FOREGROUND_COLOR_KEY, &text_color, NULL); gtr_cell_renderer_render (p->text_renderer, window, widget, &stat_area, flags); g_object_set (p->text_renderer, "text", name, "scale", 1.0, FOREGROUND_COLOR_KEY, &text_color, NULL); gtr_cell_renderer_render (p->text_renderer, window, widget, &name_area, flags); /* cleanup */ g_object_unref (icon); } static void render_full (TorrentCellRenderer * cell, GtrDrawable * window, GtkWidget * widget, const GdkRectangle * background_area, const GdkRectangle * cell_area UNUSED, GtkCellRendererState flags) { int xpad, ypad; GtkRequisition size; GdkRectangle fill_area; GdkRectangle icon_area; GdkRectangle name_area; GdkRectangle stat_area; GdkRectangle prog_area; GdkRectangle prct_area; const char * name; GdkPixbuf * icon; GtrColor text_color; bool seed; struct TorrentCellRendererPrivate * p = cell->priv; const tr_torrent * tor = p->tor; const tr_stat * st = tr_torrentStatCached ((tr_torrent*)tor); const tr_info * inf = tr_torrentInfo (tor); const gboolean active = (st->activity != TR_STATUS_STOPPED) && (st->activity != TR_STATUS_DOWNLOAD_WAIT) && (st->activity != TR_STATUS_SEED_WAIT); const double percentDone = get_percent_done (tor, st, &seed); const gboolean sensitive = active || st->error; GString * gstr_prog = p->gstr1; GString * gstr_stat = p->gstr2; icon = get_icon (tor, FULL_ICON_SIZE, widget); name = tr_torrentName (tor); g_string_truncate (gstr_prog, 0); getProgressString (gstr_prog, tor, inf, st); g_string_truncate (gstr_stat, 0); getStatusString (gstr_stat, tor, st, p->upload_speed_KBps, p->download_speed_KBps); gtk_cell_renderer_get_padding (GTK_CELL_RENDERER (cell), &xpad, &ypad); get_text_color (widget, st, &text_color); /* get the idealized cell dimensions */ g_object_set (p->icon_renderer, "pixbuf", icon, NULL); gtr_cell_renderer_get_preferred_size (p->icon_renderer, widget, NULL, &size); icon_area.width = size.width; icon_area.height = size.height; g_object_set (p->text_renderer, "text", name, "weight", PANGO_WEIGHT_BOLD, "ellipsize", PANGO_ELLIPSIZE_NONE, "scale", 1.0, NULL); gtr_cell_renderer_get_preferred_size (p->text_renderer, widget, NULL, &size); name_area.width = size.width; name_area.height = size.height; g_object_set (p->text_renderer, "text", gstr_prog->str, "weight", PANGO_WEIGHT_NORMAL, "scale", SMALL_SCALE, NULL); gtr_cell_renderer_get_preferred_size (p->text_renderer, widget, NULL, &size); prog_area.width = size.width; prog_area.height = size.height; g_object_set (p->text_renderer, "text", gstr_stat->str, NULL); gtr_cell_renderer_get_preferred_size (p->text_renderer, widget, NULL, &size); stat_area.width = size.width; stat_area.height = size.height; /** *** LAYOUT **/ fill_area = *background_area; fill_area.x += xpad; fill_area.y += ypad; fill_area.width -= xpad * 2; fill_area.height -= ypad * 2; /* icon */ icon_area.x = fill_area.x; icon_area.y = fill_area.y + (fill_area.height - icon_area.height) / 2; /* name */ name_area.x = icon_area.x + icon_area.width + GUI_PAD; name_area.y = fill_area.y; name_area.width = fill_area.width - GUI_PAD - icon_area.width - GUI_PAD_SMALL; /* prog */ prog_area.x = name_area.x; prog_area.y = name_area.y + name_area.height; prog_area.width = name_area.width; /* progressbar */ prct_area.x = prog_area.x; prct_area.y = prog_area.y + prog_area.height + GUI_PAD_SMALL; prct_area.width = prog_area.width; prct_area.height = p->bar_height; /* status */ stat_area.x = prct_area.x; stat_area.y = prct_area.y + prct_area.height + GUI_PAD_SMALL; stat_area.width = prct_area.width; /** *** RENDER **/ g_object_set (p->icon_renderer, "pixbuf", icon, "sensitive", sensitive, NULL); gtr_cell_renderer_render (p->icon_renderer, window, widget, &icon_area, flags); g_object_set (p->text_renderer, "text", name, "scale", 1.0, FOREGROUND_COLOR_KEY, &text_color, "ellipsize", PANGO_ELLIPSIZE_END, "weight", PANGO_WEIGHT_BOLD, NULL); gtr_cell_renderer_render (p->text_renderer, window, widget, &name_area, flags); g_object_set (p->text_renderer, "text", gstr_prog->str, "scale", SMALL_SCALE, "weight", PANGO_WEIGHT_NORMAL, NULL); gtr_cell_renderer_render (p->text_renderer, window, widget, &prog_area, flags); g_object_set (p->progress_renderer, "value", (int)(percentDone*100.0), "text", "", "sensitive", sensitive, NULL); gtr_cell_renderer_render (p->progress_renderer, window, widget, &prct_area, flags); g_object_set (p->text_renderer, "text", gstr_stat->str, FOREGROUND_COLOR_KEY, &text_color, NULL); gtr_cell_renderer_render (p->text_renderer, window, widget, &stat_area, flags); /* cleanup */ g_object_unref (icon); } static void torrent_cell_renderer_render (GtkCellRenderer * cell, GtrDrawable * window, GtkWidget * widget, const GdkRectangle * background_area, const GdkRectangle * cell_area, GtkCellRendererState flags) { TorrentCellRenderer * self = TORRENT_CELL_RENDERER (cell); #ifdef TEST_RTL GtkTextDirection real_dir = gtk_widget_get_direction (widget); gtk_widget_set_direction (widget, GTK_TEXT_DIR_RTL); #endif if (self && self->priv->tor) { struct TorrentCellRendererPrivate * p = self->priv; if (p->compact) render_compact (self, window, widget, background_area, cell_area, flags); else render_full (self, window, widget, background_area, cell_area, flags); } #ifdef TEST_RTL gtk_widget_set_direction (widget, real_dir); #endif } static void torrent_cell_renderer_set_property (GObject * object, guint property_id, const GValue * v, GParamSpec * pspec) { TorrentCellRenderer * self = TORRENT_CELL_RENDERER (object); struct TorrentCellRendererPrivate * p = self->priv; switch (property_id) { case P_TORRENT: p->tor = g_value_get_pointer (v); break; case P_UPLOAD_SPEED: p->upload_speed_KBps = g_value_get_double (v); break; case P_DOWNLOAD_SPEED: p->download_speed_KBps = g_value_get_double (v); break; case P_BAR_HEIGHT: p->bar_height = g_value_get_int (v); break; case P_COMPACT: p->compact = g_value_get_boolean (v); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void torrent_cell_renderer_get_property (GObject * object, guint property_id, GValue * v, GParamSpec * pspec) { const TorrentCellRenderer * self = TORRENT_CELL_RENDERER (object); struct TorrentCellRendererPrivate * p = self->priv; switch (property_id) { case P_TORRENT: g_value_set_pointer (v, p->tor); break; case P_UPLOAD_SPEED: g_value_set_double (v, p->upload_speed_KBps); break; case P_DOWNLOAD_SPEED: g_value_set_double (v, p->download_speed_KBps); break; case P_BAR_HEIGHT: g_value_set_int (v, p->bar_height); break; case P_COMPACT: g_value_set_boolean (v, p->compact); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } G_DEFINE_TYPE (TorrentCellRenderer, torrent_cell_renderer, GTK_TYPE_CELL_RENDERER) static void torrent_cell_renderer_dispose (GObject * o) { TorrentCellRenderer * r = TORRENT_CELL_RENDERER (o); if (r && r->priv) { g_string_free (r->priv->gstr1, TRUE); g_string_free (r->priv->gstr2, TRUE); g_object_unref (G_OBJECT (r->priv->text_renderer)); g_object_unref (G_OBJECT (r->priv->progress_renderer)); g_object_unref (G_OBJECT (r->priv->icon_renderer)); r->priv = NULL; } G_OBJECT_CLASS (torrent_cell_renderer_parent_class)->dispose (o); } static void torrent_cell_renderer_class_init (TorrentCellRendererClass * klass) { GObjectClass * gobject_class = G_OBJECT_CLASS (klass); GtkCellRendererClass * cell_class = GTK_CELL_RENDERER_CLASS (klass); g_type_class_add_private (klass, sizeof (struct TorrentCellRendererPrivate)); cell_class->render = torrent_cell_renderer_render; cell_class->get_size = torrent_cell_renderer_get_size; gobject_class->set_property = torrent_cell_renderer_set_property; gobject_class->get_property = torrent_cell_renderer_get_property; gobject_class->dispose = torrent_cell_renderer_dispose; g_object_class_install_property (gobject_class, P_TORRENT, g_param_spec_pointer ("torrent", NULL, "tr_torrent*", G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, P_UPLOAD_SPEED, g_param_spec_double ("piece-upload-speed", NULL, "tr_stat.pieceUploadSpeed_KBps", 0, INT_MAX, 0, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, P_DOWNLOAD_SPEED, g_param_spec_double ("piece-download-speed", NULL, "tr_stat.pieceDownloadSpeed_KBps", 0, INT_MAX, 0, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, P_BAR_HEIGHT, g_param_spec_int ("bar-height", NULL, "Bar Height", 1, INT_MAX, DEFAULT_BAR_HEIGHT, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, P_COMPACT, g_param_spec_boolean ("compact", NULL, "Compact Mode", FALSE, G_PARAM_READWRITE)); } static void torrent_cell_renderer_init (TorrentCellRenderer * self) { struct TorrentCellRendererPrivate * p; p = self->priv = G_TYPE_INSTANCE_GET_PRIVATE ( self, TORRENT_CELL_RENDERER_TYPE, struct TorrentCellRendererPrivate); p->tor = NULL; p->gstr1 = g_string_new (NULL); p->gstr2 = g_string_new (NULL); p->text_renderer = gtk_cell_renderer_text_new (); g_object_set (p->text_renderer, "xpad", 0, "ypad", 0, NULL); p->progress_renderer = gtk_cell_renderer_progress_new (); p->icon_renderer = gtk_cell_renderer_pixbuf_new (); g_object_ref_sink (p->text_renderer); g_object_ref_sink (p->progress_renderer); g_object_ref_sink (p->icon_renderer); p->bar_height = DEFAULT_BAR_HEIGHT; } GtkCellRenderer * torrent_cell_renderer_new (void) { return (GtkCellRenderer *) g_object_new (TORRENT_CELL_RENDERER_TYPE, NULL); } transmission-2.92/PaxHeaders.4960/m40000644000000000000000000000013212667111055014125 xustar0030 mtime=1457295917.100758603 30 atime=1457295917.037757532 30 ctime=1457295917.100758603 transmission-2.92/m4/0000755000175000017500000000000012667111055015627 5ustar00mikedldmikedld00000000000000transmission-2.92/m4/PaxHeaders.4960/libtool.m40000644000000000000000000000013212667110757016120 xustar0030 mtime=1457295855.455710446 30 atime=1457295855.454710429 30 ctime=1457295917.069758076 transmission-2.92/m4/libtool.m40000644000175000017500000112570012667110757017553 0ustar00mikedldmikedld00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 2014 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . ]) # serial 58 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_PREPARE_CC_BASENAME # ----------------------- m4_defun([_LT_PREPARE_CC_BASENAME], [ # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in @S|@*""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } ])# _LT_PREPARE_CC_BASENAME # _LT_CC_BASENAME(CC) # ------------------- # It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, # but that macro is also expanded into generated libtool script, which # arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], [m4_require([_LT_PREPARE_CC_BASENAME])dnl AC_REQUIRE([_LT_DECL_SED])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl func_cc_basename $1 cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the 'libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to 'config.status' so that its # declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags='_LT_TAGS'dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into 'config.status', and then the shell code to quote escape them in # for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test 0 != $[#] do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try '$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 _LT_COPYING _LT_LIBTOOL_TAGS # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE _LT_PREPARE_MUNGE_PATH_LIST _LT_PREPARE_CC_BASENAME # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[[012]][[,.]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test yes = "$lt_cv_ld_force_load"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], [ if test yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script that will find a shell with a builtin # printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], [Search for dependent libraries within DIR (or the compiler's sysroot if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ]) if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen=shl_load], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen=dlopen], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) ]) ]) ]) ]) ]) ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links=nottested if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test no = "$hard_links"; then AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_PREPARE_MUNGE_PATH_LIST # --------------------------- # Make sure func_munge_path_list() is defined correctly. m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], [[# func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x@S|@2 in x) ;; *:) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" ;; x:*) eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; *::*) eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" ;; *) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; esac } ]])# _LT_PREPARE_PATH_LIST # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown AC_ARG_VAR([LT_SYS_LIBRARY_PATH], [User-defined run-time library search path.]) case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a[(]lib.so.V[)]' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi # Handle Gentoo/FreeBSD as it was Linux case $host_vendor in gentoo) version_type=linux ;; *) version_type=freebsd-$objformat ;; esac case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; linux) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' need_lib_prefix=no need_version=no ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], [Detected run-time system search path for libraries]) _LT_DECL([], [configure_time_lt_sys_library_path], [2], [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$1"; then lt_cv_path_MAGIC_CMD=$ac_dir/"$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac]) MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], [if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi]) rm -f conftest.i conftest2.i conftest.out]) ])# _LT_PATH_DD # _LT_CMD_TRUNCATE # ---------------- # find command to truncate a binary pipe m4_defun([_LT_CMD_TRUNCATE], [m4_require([_LT_PATH_DD]) AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], [printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) _LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], [Command to truncate a binary pipe]) ])# _LT_CMD_TRUNCATE # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_MAGIC_METHOD], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[[4-9]]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[[45]]*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # _LT_DLL_DEF_P([FILE]) # --------------------- # True iff FILE is a Windows DLL '.def' file. # Keep in sync with func_dll_def_p in the libtool script AC_DEFUN([_LT_DLL_DEF_P], [dnl test DEF = "`$SED -n dnl -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl -e q dnl Only consider the first "real" line $1`" dnl ])# _LT_DLL_DEF_P # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([nm_interface], [lt_cv_nm_interface], [1], [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS=$save_LDFLAGS]) if test yes = "$lt_cv_irix_exported_symbol"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; osf3*) if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test yes = "$GCC"; then wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC=$lt_save_CC ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(GCC, $1)=$GXX _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case @S|@2 in .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)=$prev$p else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$G77 _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f "$lt_ac_sed" && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test 10 -lt "$lt_ac_count" && break lt_ac_count=`expr $lt_ac_count + 1` if test "$lt_ac_count" -gt "$lt_ac_max"; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS transmission-2.92/m4/PaxHeaders.4960/acx-pthread.m40000644000000000000000000000013212442116573016645 xustar0030 mtime=1418239355.952102976 30 atime=1418239355.952102976 30 ctime=1457295917.056757855 transmission-2.92/m4/acx-pthread.m40000644000175000017500000001722512442116573020301 0ustar00mikedldmikedld00000000000000# URL: http://autoconf-archive.cryp.to/acx_pthread.html # Author: Steven G. Johnson # Revised: 2007-07-29 # # Copyright © 2007 Steven G. Johnson # # 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. AC_DEFUN([ACX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_SAVE AC_LANG_C acx_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) AC_MSG_RESULT($acx_pthread_ok) if test x"$acx_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${host_os}" in *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" ;; esac if test x"$acx_pthread_ok" = xno; then for flag in $acx_pthread_flags; do case $flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $flag]) PTHREAD_CFLAGS="$flag" ;; pthread-config) AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) if test x"$acx_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$flag]) PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_TRY_LINK([#include ], [pthread_t th; pthread_join(th, 0); pthread_attr_init(0); pthread_cleanup_push(0, 0); pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], [acx_pthread_ok=yes]) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" AC_MSG_RESULT($acx_pthread_ok) if test "x$acx_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$acx_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_MSG_CHECKING([for joinable pthread attribute]) attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_TRY_LINK([#include ], [int attr=$attr; return attr;], [attr_name=$attr; break]) done AC_MSG_RESULT($attr_name) if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, [Define to necessary symbol if this constant uses a non-standard name on your system.]) fi AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac AC_MSG_RESULT(${flag}) if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with xlc_r or cc_r if test x"$GCC" != xyes; then AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) else PTHREAD_CC=$CC fi else PTHREAD_CC="$CC" fi AC_SUBST(PTHREAD_LIBS) AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_CC) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_pthread_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) : else acx_pthread_ok=no $2 fi AC_LANG_RESTORE ])dnl ACX_PTHREAD transmission-2.92/m4/PaxHeaders.4960/ltversion.m40000644000000000000000000000013212667110760016473 xustar0030 mtime=1457295856.183722823 30 atime=1457295856.181722789 30 ctime=1457295917.088758399 transmission-2.92/m4/ltversion.m40000644000175000017500000000127312667110760020123 0ustar00mikedldmikedld00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 4179 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.6]) m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.6' macro_revision='2.4.6' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) transmission-2.92/m4/PaxHeaders.4960/ltsugar.m40000644000000000000000000000013212667110757016135 xustar0030 mtime=1457295855.934718589 30 atime=1457295855.934718589 30 ctime=1457295917.082758297 transmission-2.92/m4/ltsugar.m40000644000175000017500000001044012667110757017561 0ustar00mikedldmikedld00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59, which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) transmission-2.92/m4/PaxHeaders.4960/pkg.m40000644000000000000000000000013212442116573015226 xustar0030 mtime=1418239355.953102993 30 atime=1418239355.953102993 30 ctime=1457295917.100758603 transmission-2.92/m4/pkg.m40000644000175000017500000001216012442116573016653 0ustar00mikedldmikedld00000000000000# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # # Copyright © 2004 Scott James Remnant . # # 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # # Similar to PKG_CHECK_MODULES, make sure that the first instance of # this or PKG_CHECK_MODULES is called, or make sure to call # PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_ifval([$2], [$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$PKG_CONFIG"; then if test -n "$$1"; then pkg_cv_[]$1="$$1" else PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) fi else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` else $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ifelse([$4], , [AC_MSG_ERROR(dnl [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT ])], [AC_MSG_RESULT([no]) $4]) elif test $pkg_failed = untried; then ifelse([$4], , [AC_MSG_FAILURE(dnl [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])], [$4]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) ifelse([$3], , :, [$3]) fi[]dnl ])# PKG_CHECK_MODULES transmission-2.92/m4/PaxHeaders.4960/glib-gettext.m40000644000000000000000000000013212442116573017044 xustar0030 mtime=1418239355.953102993 30 atime=1418239355.953102993 30 ctime=1457295917.063757974 transmission-2.92/m4/glib-gettext.m40000644000175000017500000003037512442116573020501 0ustar00mikedldmikedld00000000000000# Copyright (C) 1995-2002 Free Software Foundation, Inc. # Copyright (C) 2001-2003,2004 Red Hat, Inc. # # This file is free software, distributed under the terms of the GNU # General Public License. As a special exception to the GNU General # Public License, this file may be distributed as part of a program # that contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # # Macro to add for using GNU gettext. # Ulrich Drepper , 1995, 1996 # # Modified to never use included libintl. # Owen Taylor , 12/15/1998 # # Major rework to remove unused code # Owen Taylor , 12/11/2002 # # Added better handling of ALL_LINGUAS from GNU gettext version # written by Bruno Haible, Owen Taylor 5/30/3002 # # Modified to require ngettext # Matthias Clasen 08/06/2004 # # We need this here as well, since someone might use autoconf-2.5x # to configure GLib then an older version to configure a package # using AM_GLIB_GNU_GETTEXT AC_PREREQ(2.53) dnl dnl We go to great lengths to make sure that aclocal won't dnl try to pull in the installed version of these macros dnl when running aclocal in the glib directory. dnl m4_copy([AC_DEFUN],[glib_DEFUN]) m4_copy([AC_REQUIRE],[glib_REQUIRE]) dnl dnl At the end, if we're not within glib, we'll define the public dnl definitions in terms of our private definitions. dnl # GLIB_LC_MESSAGES #-------------------- glib_DEFUN([GLIB_LC_MESSAGES], [AC_CHECK_HEADERS([locale.h]) if test $ac_cv_header_locale_h = yes; then AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi fi]) # GLIB_PATH_PROG_WITH_TEST #---------------------------- dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) # GLIB_WITH_NLS #----------------- glib_DEFUN([GLIB_WITH_NLS], dnl NLS is obligatory [USE_NLS=yes AC_SUBST(USE_NLS) gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= AC_CHECK_HEADER(libintl.h, [gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc, [AC_TRY_LINK([ #include ], [return !ngettext ("","", 1)], gt_cv_func_ngettext_libc=yes, gt_cv_func_ngettext_libc=no) ]) if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, [AC_TRY_LINK([ #include ], [return !dgettext ("","")], gt_cv_func_dgettext_libc=yes, gt_cv_func_dgettext_libc=no) ]) fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CHECK_FUNCS(bind_textdomain_codeset) fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then AC_CHECK_LIB(intl, bindtextdomain, [AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dgettext, gt_cv_func_dgettext_libintl=yes)])]) if test "$gt_cv_func_dgettext_libintl" != "yes" ; then AC_MSG_CHECKING([if -liconv is needed to use gettext]) AC_MSG_RESULT([]) AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dcgettext, [gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv], :,-liconv)], :,-liconv) fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset AC_CHECK_FUNCS(bind_textdomain_codeset) LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then AC_DEFINE(HAVE_GETTEXT,1, [Define if the GNU gettext() function is already present or preinstalled.]) GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" AC_CHECK_FUNCS(dcgettext) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr], [CATOBJEXT=.gmo DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share and dnl and CATOBJEXT=.gmo in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [CATOBJEXT=.gmo DATADIRNAME=share], [CATOBJEXT=.mo DATADIRNAME=lib]) ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac]) LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi ]) if test "$gt_cv_have_gettext" = "yes" ; then AC_DEFINE(ENABLE_NLS, 1, [always defined to indicate that i18n is enabled]) fi dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is not GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po AC_OUTPUT_COMMANDS( [case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac]) dnl These rules are solely for the distribution goal. While doing this dnl we only have to keep exactly one list of the available catalogs dnl in configure.in. for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done dnl Make all variables we use known to autoconf. AC_SUBST(CATALOGS) AC_SUBST(CATOBJEXT) AC_SUBST(DATADIRNAME) AC_SUBST(GMOFILES) AC_SUBST(INSTOBJEXT) AC_SUBST(INTLLIBS) AC_SUBST(PO_IN_DATADIR_TRUE) AC_SUBST(PO_IN_DATADIR_FALSE) AC_SUBST(POFILES) AC_SUBST(POSUB) ]) # AM_GLIB_GNU_GETTEXT # ------------------- # Do checks necessary for use of gettext. If a suitable implementation # of gettext is found in either in libintl or in the C library, # it will set INTLLIBS to the libraries needed for use of gettext # and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable # gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() # on various variables needed by the Makefile.in.in installed by # glib-gettextize. dnl glib_DEFUN([GLIB_GNU_GETTEXT], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_HEADER_STDC])dnl GLIB_LC_MESSAGES GLIB_WITH_NLS if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else AC_MSG_CHECKING(for catalogs to be installed) NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS AC_MSG_RESULT($LINGUAS) fi dnl Construct list of names of catalog files to be constructed. if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but ($top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) dnl Generate list of files to be processed by xgettext which will dnl be included in po/Makefile. test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES ]) # AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) # ------------------------------- # Define VARIABLE to the location where catalog files will # be installed by po/Makefile. glib_DEFUN([GLIB_DEFINE_LOCALEDIR], [glib_REQUIRE([GLIB_GNU_GETTEXT])dnl glib_save_prefix="$prefix" glib_save_exec_prefix="$exec_prefix" test "x$prefix" = xNONE && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix=$prefix if test "x$CATOBJEXT" = "x.mo" ; then localedir=`eval echo "${libdir}/locale"` else localedir=`eval echo "${datadir}/locale"` fi prefix="$glib_save_prefix" exec_prefix="$glib_save_exec_prefix" AC_DEFINE_UNQUOTED($1, "$localedir", [Define the location where the catalogs will be installed]) ]) dnl dnl Now the definitions that aclocal will find dnl ifdef(glib_configure_in,[],[ AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) ])dnl transmission-2.92/m4/PaxHeaders.4960/ltoptions.m40000644000000000000000000000013212667110757016507 xustar0030 mtime=1457295855.695714526 30 atime=1457295855.695714526 30 ctime=1457295917.076758195 transmission-2.92/m4/ltoptions.m40000644000175000017500000003426212667110757020143 0ustar00mikedldmikedld00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 8 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option '$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the 'shared' and # 'disable-shared' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the 'static' and # 'disable-static' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the 'fast-install' # and 'disable-fast-install' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_AIX_SONAME([DEFAULT]) # ---------------------------------- # implement the --with-aix-soname flag, and support the `aix-soname=aix' # and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT # is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) AC_ARG_WITH([aix-soname], [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], [case $withval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]) ;; esac lt_cv_with_aix_soname=$with_aix_soname], [AC_CACHE_VAL([lt_cv_with_aix_soname], [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) with_aix_soname=$lt_cv_with_aix_soname]) AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac _LT_DECL([], [shared_archive_member_spec], [0], [Shared archive member basename, for filename based shared library versioning on AIX])dnl ])# _LT_WITH_AIX_SONAME LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. # MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac], [pic_mode=m4_default([$1], [default])]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) transmission-2.92/m4/PaxHeaders.4960/lt~obsolete.m40000644000000000000000000000013212667110760017020 xustar0030 mtime=1457295856.437727141 30 atime=1457295856.437727141 30 ctime=1457295917.094758501 transmission-2.92/m4/lt~obsolete.m40000644000175000017500000001377412667110760020461 0ustar00mikedldmikedld00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software # Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) transmission-2.92/PaxHeaders.4960/cmake0000644000000000000000000000013212666747213014677 xustar0030 mtime=1457245835.428000573 30 atime=1427460260.142238158 30 ctime=1457295917.323762395 transmission-2.92/cmake/0000755000175000017500000000000012666747213016401 5ustar00mikedldmikedld00000000000000transmission-2.92/cmake/PaxHeaders.4960/Transmission.rc.in0000644000000000000000000000013212666747213020400 xustar0030 mtime=1457245835.428000573 30 atime=1457245835.428000573 30 ctime=1457295917.323762395 transmission-2.92/cmake/Transmission.rc.in0000644000175000017500000000257312666747213022034 0ustar00mikedldmikedld00000000000000#include "winresrc.h" #include LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #ifdef TR_STABLE_RELEASE #define TR_FF_PRERELEASE 0x0L #else #define TR_FF_PRERELEASE VS_FF_PRERELEASE #endif VS_VERSION_INFO VERSIONINFO FILEVERSION MAJOR_VERSION, MINOR_VERSION, 0, 0 PRODUCTVERSION MAJOR_VERSION, MINOR_VERSION, 0, 0 FILEFLAGSMASK VS_FF_DEBUG | TR_FF_PRERELEASE #ifdef _DEBUG FILEFLAGS VS_FF_DEBUG | TR_FF_PRERELEASE #else FILEFLAGS 0x0L #endif FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Transmission Project" VALUE "FileDescription", "${TR_FILE_DESCRIPTION}" VALUE "FileVersion", LONG_VERSION_STRING VALUE "InternalName", "${TR_INTERNAL_NAME}" VALUE "LegalCopyright", "2005-2016 Transmission Project" VALUE "OriginalFilename", "${TR_ORIGINAL_FILENAME}" VALUE "ProductName", "Transmission" VALUE "ProductVersion", LONG_VERSION_STRING END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x0409, 0x04b0 END END #cmakedefine TR_MAIN_ICON "${TR_MAIN_ICON}" #ifdef TR_MAIN_ICON MAINICON ICON TR_MAIN_ICON #endif transmission-2.92/cmake/PaxHeaders.4960/FindNATPMP.cmake0000644000000000000000000000013012505250244017535 xustar0029 mtime=1427460260.19723914 29 atime=1427460260.19723914 30 ctime=1457295917.322762378 transmission-2.92/cmake/FindNATPMP.cmake0000644000175000017500000000175612505250244021175 0ustar00mikedldmikedld00000000000000if(NATPMP_PREFER_STATIC_LIB) set(NATPMP_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) if(WIN32) set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) else() set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) endif() endif() if(UNIX) find_package(PkgConfig QUIET) pkg_check_modules(_NATPMP QUIET libnatpmp) endif() find_path(NATPMP_INCLUDE_DIR NAMES natpmp.h HINTS ${_NATPMP_INCLUDEDIR}) find_library(NATPMP_LIBRARY NAMES natpmp HINTS ${_NATPMP_LIBDIR}) set(NATPMP_INCLUDE_DIRS ${NATPMP_INCLUDE_DIR}) set(NATPMP_LIBRARIES ${NATPMP_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(NATPMP REQUIRED_VARS NATPMP_LIBRARY NATPMP_INCLUDE_DIR ) mark_as_advanced(NATPMP_INCLUDE_DIR NATPMP_LIBRARY) if(NATPMP_PREFER_STATIC_LIB) set(CMAKE_FIND_LIBRARY_SUFFIXES ${NATPMP_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) unset(NATPMP_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) endif() transmission-2.92/cmake/PaxHeaders.4960/FindB64.cmake0000644000000000000000000000013212505250244017073 xustar0030 mtime=1427460260.194239086 30 atime=1427460260.194239086 30 ctime=1457295917.322762378 transmission-2.92/cmake/FindB64.cmake0000644000175000017500000000170612505250244020524 0ustar00mikedldmikedld00000000000000if(B64_PREFER_STATIC_LIB) set(B64_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) if(WIN32) set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) else() set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) endif() endif() if(UNIX) find_package(PkgConfig QUIET) pkg_check_modules(_B64 QUIET libb64) endif() find_path(B64_INCLUDE_DIR NAMES b64/cdecode.h b64/cencode.h HINTS ${_B64_INCLUDEDIR}) find_library(B64_LIBRARY NAMES b64 HINTS ${_B64_LIBDIR}) set(B64_INCLUDE_DIRS ${B64_INCLUDE_DIR}) set(B64_LIBRARIES ${B64_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(B64 REQUIRED_VARS B64_LIBRARY B64_INCLUDE_DIR ) mark_as_advanced(B64_INCLUDE_DIR B64_LIBRARY) if(B64_PREFER_STATIC_LIB) set(CMAKE_FIND_LIBRARY_SUFFIXES ${B64_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) unset(B64_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) endif() transmission-2.92/cmake/PaxHeaders.4960/FindDHT.cmake0000644000000000000000000000013212505250244017157 xustar0030 mtime=1427460260.196239122 30 atime=1427460260.196239122 30 ctime=1457295917.322762378 transmission-2.92/cmake/FindDHT.cmake0000644000175000017500000000166012505250244020607 0ustar00mikedldmikedld00000000000000if(DHT_PREFER_STATIC_LIB) set(DHT_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) if(WIN32) set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) else() set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) endif() endif() if(UNIX) find_package(PkgConfig QUIET) pkg_check_modules(_DHT QUIET libdht) endif() find_path(DHT_INCLUDE_DIR NAMES dht/dht.h HINTS ${_DHT_INCLUDEDIR}) find_library(DHT_LIBRARY NAMES dht HINTS ${_DHT_LIBDIR}) set(DHT_INCLUDE_DIRS ${DHT_INCLUDE_DIR}) set(DHT_LIBRARIES ${DHT_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(DHT REQUIRED_VARS DHT_LIBRARY DHT_INCLUDE_DIR ) mark_as_advanced(DHT_INCLUDE_DIR DHT_LIBRARY) if(DHT_PREFER_STATIC_LIB) set(CMAKE_FIND_LIBRARY_SUFFIXES ${DHT_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) unset(DHT_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) endif() transmission-2.92/cmake/PaxHeaders.4960/FindICONV.cmake0000644000000000000000000000013212663770140017425 xustar0030 mtime=1456468064.398722203 30 atime=1456468064.398722203 30 ctime=1457295917.323762395 transmission-2.92/cmake/FindICONV.cmake0000644000175000017500000000241712663770140021056 0ustar00mikedldmikedld00000000000000# Grabbed from http://public.kitware.com/Bug/view.php?id=13517 and slightly modified. find_path(ICONV_INCLUDE_DIR iconv.h) find_library(ICONV_LIBRARY NAMES iconv libiconv libiconv-2 c) set(ICONV_INCLUDE_DIRS ${ICONV_INCLUDE_DIR}) set(ICONV_LIBRARIES ${ICONV_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(ICONV REQUIRED_VARS ICONV_LIBRARY ICONV_INCLUDE_DIR VERSION_VAR ICONV_VERSION ) if(ICONV_FOUND AND NOT DEFINED ICONV_SECOND_ARGUMENT_IS_CONST) include(CheckCSourceCompiles) set(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIRS}) set(CMAKE_REQUIRED_LIBRARIES ${ICONV_LIBRARIES}) check_c_source_compiles(" #include int main () { iconv_t conv = 0; const char * in = 0; size_t ilen = 0; char * out = 0; size_t olen = 0; iconv (conv, &in, &ilen, &out, &olen); return 0; }" ICONV_SECOND_ARGUMENT_IS_CONST FAIL_REGEX "incompatible pointer type" FAIL_REGEX "discards qualifiers in nested pointer types") set(CMAKE_REQUIRED_INCLUDES) set(CMAKE_REQUIRED_LIBRARIES) endif() mark_as_advanced(ICONV_INCLUDE_DIR ICONV_LIBRARY ICONV_SECOND_ARGUMENT_IS_CONST) transmission-2.92/cmake/PaxHeaders.4960/FindEVENT2.cmake0000644000000000000000000000013012505250244017501 xustar0029 mtime=1427460260.19223905 29 atime=1427460260.19223905 30 ctime=1457295917.322762378 transmission-2.92/cmake/FindEVENT2.cmake0000644000175000017500000000263412505250244021135 0ustar00mikedldmikedld00000000000000if(EVENT2_PREFER_STATIC_LIB) set(EVENT2_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) if(WIN32) set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) else() set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) endif() endif() if(UNIX) find_package(PkgConfig QUIET) pkg_check_modules(_EVENT2 QUIET libevent) endif() find_path(EVENT2_INCLUDE_DIR NAMES event2/event.h HINTS ${_EVENT2_INCLUDEDIR}) find_library(EVENT2_LIBRARY NAMES event HINTS ${_EVENT2_LIBDIR}) if(EVENT2_INCLUDE_DIR) if(_EVENT2_VERSION) set(EVENT2_VERSION ${_EVENT2_VERSION}) else() file(STRINGS "${EVENT2_INCLUDE_DIR}/event2/event-config.h" EVENT2_VERSION_STR REGEX "^#define[\t ]+_EVENT_VERSION[\t ]+\"[^\"]+\"") if(EVENT2_VERSION_STR MATCHES "\"([^\"]+)\"") set(EVENT2_VERSION "${CMAKE_MATCH_1}") endif() endif() endif() set(EVENT2_INCLUDE_DIRS ${EVENT2_INCLUDE_DIR}) set(EVENT2_LIBRARIES ${EVENT2_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(EVENT2 REQUIRED_VARS EVENT2_LIBRARY EVENT2_INCLUDE_DIR VERSION_VAR EVENT2_VERSION ) mark_as_advanced(EVENT2_INCLUDE_DIR EVENT2_LIBRARY) if(EVENT2_PREFER_STATIC_LIB) set(CMAKE_FIND_LIBRARY_SUFFIXES ${EVENT2_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) unset(EVENT2_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) endif() transmission-2.92/cmake/PaxHeaders.4960/FindUTP.cmake0000644000000000000000000000013212505250244017210 xustar0030 mtime=1427460260.194239086 30 atime=1427460260.193239068 30 ctime=1457295917.322762378 transmission-2.92/cmake/FindUTP.cmake0000644000175000017500000000166312505250244020643 0ustar00mikedldmikedld00000000000000if(UTP_PREFER_STATIC_LIB) set(UTP_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) if(WIN32) set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) else() set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) endif() endif() if(UNIX) find_package(PkgConfig QUIET) pkg_check_modules(_UTP QUIET libutp) endif() find_path(UTP_INCLUDE_DIR NAMES libutp/utp.h HINTS ${_UTP_INCLUDEDIR}) find_library(UTP_LIBRARY NAMES utp HINTS ${_UTP_LIBDIR}) set(UTP_INCLUDE_DIRS ${UTP_INCLUDE_DIR}) set(UTP_LIBRARIES ${UTP_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(UTP REQUIRED_VARS UTP_LIBRARY UTP_INCLUDE_DIR ) mark_as_advanced(UTP_INCLUDE_DIR UTP_LIBRARY) if(UTP_PREFER_STATIC_LIB) set(CMAKE_FIND_LIBRARY_SUFFIXES ${UTP_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) unset(UTP_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) endif() transmission-2.92/cmake/PaxHeaders.4960/FindPolarSSL.cmake0000644000000000000000000000013112505250244020176 xustar0030 mtime=1427460260.198239157 29 atime=1427460260.19723914 30 ctime=1457295917.323762395 transmission-2.92/cmake/FindPolarSSL.cmake0000644000175000017500000000274112505250244021630 0ustar00mikedldmikedld00000000000000if(POLARSSL_PREFER_STATIC_LIB) set(POLARSSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) if(WIN32) set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) else() set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) endif() endif() if(UNIX) find_package(PkgConfig QUIET) pkg_check_modules(_POLARSSL QUIET polarssl) endif() find_path(POLARSSL_INCLUDE_DIR NAMES polarssl/version.h HINTS ${_POLARSSL_INCLUDEDIR}) find_library(POLARSSL_LIBRARY NAMES polarssl HINTS ${_POLARSSL_LIBDIR}) if(POLARSSL_INCLUDE_DIR) if(_POLARSSL_VERSION) set(POLARSSL_VERSION ${_POLARSSL_VERSION}) else() file(STRINGS "${POLARSSL_INCLUDE_DIR}/polarssl/version.h" POLARSSL_VERSION_STR REGEX "^#define[\t ]+POLARSSL_VERSION_STRING[\t ]+\"[^\"]+\"") if(POLARSSL_VERSION_STR MATCHES "\"([^\"]+)\"") set(POLARSSL_VERSION "${CMAKE_MATCH_1}") endif() endif() endif() set(POLARSSL_INCLUDE_DIRS ${POLARSSL_INCLUDE_DIR}) set(POLARSSL_LIBRARIES ${POLARSSL_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(PolarSSL REQUIRED_VARS POLARSSL_LIBRARY POLARSSL_INCLUDE_DIR VERSION_VAR POLARSSL_VERSION ) mark_as_advanced(POLARSSL_INCLUDE_DIR POLARSSL_LIBRARY) if(POLARSSL_PREFER_STATIC_LIB) set(CMAKE_FIND_LIBRARY_SUFFIXES ${POLARSSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) unset(POLARSSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) endif() transmission-2.92/cmake/PaxHeaders.4960/TrMacros.cmake0000644000000000000000000000013212631124544017474 xustar0030 mtime=1449437540.202757209 30 atime=1449437540.202757209 30 ctime=1457295917.323762395 transmission-2.92/cmake/TrMacros.cmake0000644000175000017500000001211412631124544021120 0ustar00mikedldmikedld00000000000000macro(tr_auto_option_changed NAME ACC VAL FIL STK) if(NOT ("${VAL}" STREQUAL "AUTO" OR "${VAL}" STREQUAL "ON" OR "${VAL}" STREQUAL "OFF")) if("${VAL}" STREQUAL "0" OR "${VAL}" STREQUAL "NO" OR "${VAL}" STREQUAL "FALSE" OR "${VAL}" STREQUAL "N") set_property(CACHE ${NAME} PROPERTY VALUE OFF) elseif("${VAL}" MATCHES "^[-+]?[0-9]+$" OR "${VAL}" STREQUAL "YES" OR "${VAL}" STREQUAL "TRUE" OR "${VAL}" STREQUAL "Y") set_property(CACHE ${NAME} PROPERTY VALUE ON) else() message(FATAL_ERROR "Option '${NAME}' set to unrecognized value '${VAL}'. Should be boolean or 'AUTO'.") endif() endif() endmacro() macro(tr_auto_option NAME DESC VAL) set(${NAME} "${VAL}" CACHE STRING "${DESC}") set_property(CACHE ${NAME} PROPERTY STRINGS "AUTO;ON;OFF") variable_watch(${NAME} tr_auto_option_changed) endmacro() macro(tr_fixup_auto_option NAME ISFOUND ISREQ) if(${ISFOUND}) set_property(CACHE ${NAME} PROPERTY VALUE ON) elseif(NOT (${ISREQ})) set_property(CACHE ${NAME} PROPERTY VALUE OFF) endif() endmacro() function(tr_list_option_changed NAME ACC VAL FIL STK) get_property(VAR_STRINGS CACHE ${NAME} PROPERTY STRINGS) string(TOUPPER "${VAL}" VAL_UPCASE) foreach(X ${VAR_STRINGS}) string(TOUPPER "${X}" X_UPCASE) if("${VAL_UPCASE}" STREQUAL "${X_UPCASE}") if(NOT "${VAL}" STREQUAL "${X}") set_property(CACHE ${NAME} PROPERTY VALUE "${X}") message(STATUS ">>> (list) ${NAME} -> ${X}") endif() return() endif() endforeach() string(REPLACE ";" "', '" VAR_STRINGS "${VAR_STRINGS}") message(FATAL_ERROR "Option '${NAME}' set to unrecognized value '${VAL}'. Should be one of '${VAR_STRINGS}'.") endfunction() macro(tr_list_option NAME DESC VAL) set(${NAME} "${VAL}" CACHE STRING "${DESC}") set_property(CACHE ${NAME} PROPERTY STRINGS "${VAL};${ARGN}") variable_watch(${NAME} tr_list_option_changed) endmacro() macro(tr_fixup_list_option NAME FVAL ISFOUND RVAL ISREQ) if(${ISFOUND}) set_property(CACHE ${NAME} PROPERTY VALUE "${FVAL}") elseif(NOT (${ISREQ})) set_property(CACHE ${NAME} PROPERTY VALUE "${RVAL}") endif() endmacro() macro(tr_get_required_flag IVAR OVAR) set(${OVAR}) if (${IVAR} AND NOT ${IVAR} STREQUAL "AUTO") set(${OVAR} REQUIRED) endif() endmacro() function(tr_make_id INPUT OVAR) string(TOUPPER "${INPUT}" ID) string(REGEX REPLACE "[^A-Z0-9]+" "_" ID "${ID}") # string(REGEX REPLACE "^_+|_+$" "" ID "${ID}") set(${OVAR} "${ID}" PARENT_SCOPE) endfunction() macro(tr_github_upstream ID REPOID RELID RELMD5) set(${ID}_RELEASE "${RELID}") set(${ID}_UPSTREAM URL "https://github.com/${REPOID}/archive/${RELID}.tar.gz") if(NOT SKIP_UPSTREAM_CHECKSUM) list(APPEND ${ID}_UPSTREAM URL_MD5 "${RELMD5}") endif() endmacro() macro(tr_add_external_auto_library ID LIBNAME) if(USE_SYSTEM_${ID}) tr_get_required_flag(USE_SYSTEM_${ID} SYSTEM_${ID}_IS_REQUIRED) find_package(${ID} ${${ID}_MINIMUM} ${SYSTEM_${ID}_IS_REQUIRED}) tr_fixup_auto_option(USE_SYSTEM_${ID} ${ID}_FOUND SYSTEM_${ID}_IS_REQUIRED) endif() if(USE_SYSTEM_${ID}) unset(${ID}_UPSTREAM_TARGET) else() set(${ID}_UPSTREAM_TARGET ${LIBNAME}-${${ID}_RELEASE}) set(${ID}_PREFIX "${CMAKE_BINARY_DIR}/third-party/${${ID}_UPSTREAM_TARGET}") ExternalProject_Add( ${${ID}_UPSTREAM_TARGET} ${${ID}_UPSTREAM} ${ARGN} PREFIX "${${ID}_PREFIX}" CMAKE_ARGS -Wno-dev # We don't want to be warned over unused variables "-DCMAKE_TOOLCHAIN_FILE:PATH=${CMAKE_TOOLCHAIN_FILE}" "-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}" "-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}" "-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}" "-DCMAKE_INSTALL_PREFIX:PATH=" ) set_property(TARGET ${${ID}_UPSTREAM_TARGET} PROPERTY FOLDER "ThirdParty") set(${ID}_INCLUDE_DIR "${${ID}_PREFIX}/include" CACHE INTERNAL "") set(${ID}_LIBRARY "${${ID}_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${LIBNAME}${CMAKE_STATIC_LIBRARY_SUFFIX}" CACHE INTERNAL "") set(${ID}_INCLUDE_DIRS ${${ID}_INCLUDE_DIR}) set(${ID}_LIBRARIES ${${ID}_LIBRARY}) endif() endmacro() function(tr_append_target_property TGT PROP VAL) get_target_property(OVAL ${TGT} ${PROP}) if(OVAL) set(VAL "${OVAL} ${VAL}") endif() set_target_properties(${TGT} PROPERTIES ${PROP} "${VAL}") endfunction() function(tr_win32_app_info OVAR DESCR INTNAME ORIGFNAME) if(NOT WIN32) return() endif() set(TR_FILE_DESCRIPTION "${DESCR}") set(TR_INTERNAL_NAME "${INTNAME}") set(TR_ORIGINAL_FILENAME "${ORIGFNAME}") if(ARGN) set(TR_MAIN_ICON "${ARGN}") endif() configure_file("${CMAKE_SOURCE_DIR}/cmake/Transmission.rc.in" "${INTNAME}-app-info.rc") set(${OVAR} "${CMAKE_CURRENT_BINARY_DIR}/${INTNAME}-app-info.rc" PARENT_SCOPE) endfunction() transmission-2.92/cmake/PaxHeaders.4960/FindMINIUPNPC.cmake0000644000000000000000000000013212505250244020102 xustar0030 mtime=1427460260.198239157 30 atime=1427460260.198239157 30 ctime=1457295917.323762395 transmission-2.92/cmake/FindMINIUPNPC.cmake0000644000175000017500000001252712505250244021536 0ustar00mikedldmikedld00000000000000if(MINIUPNPC_PREFER_STATIC_LIB) set(MINIUPNPC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) if(WIN32) set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) else() set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) endif() endif() if(UNIX) find_package(PkgConfig QUIET) pkg_check_modules(_MINIUPNPC QUIET libminiupnpc) endif() find_path(MINIUPNPC_INCLUDE_DIR NAMES miniupnpc/miniupnpc.h HINTS ${_MINIUPNPC_INCLUDEDIR}) find_library(MINIUPNPC_LIBRARY NAMES miniupnpc libminiupnpc HINTS ${_MINIUPNPC_LIBDIR}) if(MINIUPNPC_INCLUDE_DIR) if(_MINIUPNPC_VERSION) set(MINIUPNPC_VERSION ${_MINIUPNPC_VERSION}) else() file(STRINGS "${MINIUPNPC_INCLUDE_DIR}/miniupnpc/miniupnpc.h" MINIUPNPC_VERSION_STR REGEX "^#define[\t ]+MINIUPNPC_VERSION[\t ]+\"[^\"]+\"") if(MINIUPNPC_VERSION_STR MATCHES "\"([^\"]+)\"") set(MINIUPNPC_VERSION "${CMAKE_MATCH_1}") endif() # Let's hope it's 1.7 or higher, since it provides # MINIUPNPC_API_VERSION and we won't have to figure # it out on our own file(STRINGS "${MINIUPNPC_INCLUDE_DIR}/miniupnpc/miniupnpc.h" MINIUPNPC_API_VERSION_STR REGEX "^#define[\t ]+MINIUPNPC_API_VERSION[\t ]+[0-9]+") if(MINIUPNPC_API_VERSION_STR MATCHES "^#define[\t ]+MINIUPNPC_API_VERSION[\t ]+([0-9]+)") set(MINIUPNPC_API_VERSION "${CMAKE_MATCH_1}") endif() endif() if(MINIUPNPC_LIBRARY) # Or maybe it's miniupnp 1.6 if(NOT DEFINED MINIUPNPC_API_VERSION) file(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckMiniUPnPC_1.6.c " #include #include #include #include int main() { struct UPNPDev * devlist; struct UPNPUrls urls; struct IGDdatas data; char lanaddr[16]; char portStr[8]; char intPort[8]; char intClient[16]; upnpDiscover( 2000, NULL, NULL, 0, 0, &errno ); UPNP_GetValidIGD( devlist, &urls, &data, lanaddr, sizeof( lanaddr ) ); UPNP_GetSpecificPortMappingEntry( urls.controlURL, data.first.servicetype, portStr, \"TCP\", intClient, intPort, NULL, NULL, NULL ); return 0; } ") try_compile(_MINIUPNPC_HAVE_VERSION_1_6 ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckMiniUPnPC_1.6.c COMPILE_DEFINITIONS -DINCLUDE_DIRECTORIES=${MINIUPNPC_INCLUDE_DIR} LINK_LIBRARIES ${MINIUPNPC_LIBRARY} OUTPUT_VARIABLE OUTPUT) if(_MINIUPNPC_HAVE_VERSION_1_6) if(NOT DEFINED MINIUPNPC_VERSION) set(MINIUPNPC_VERSION 1.6) endif() set(MINIUPNPC_API_VERSION 8) endif() endif() # Or maybe it's miniupnp 1.5 if(NOT DEFINED MINIUPNPC_API_VERSION) file(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckMiniUPnPC_1.5.c " #include #include #include int main() { struct UPNPDev * devlist; struct UPNPUrls urls; struct IGDdatas data; char lanaddr[16]; char portStr[8]; char intPort[8]; char intClient[16]; upnpDiscover( 2000, NULL, NULL, 0 ); UPNP_GetValidIGD( devlist, &urls, &data, lanaddr, sizeof( lanaddr ) ); UPNP_GetSpecificPortMappingEntry( urls.controlURL, data.first.servicetype, portStr, \"TCP\", intClient, intPort ); return 0; } ") try_compile(_MINIUPNPC_HAVE_VERSION_1_5 ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckMiniUPnPC_1.5.c COMPILE_DEFINITIONS -DINCLUDE_DIRECTORIES=${MlINIUPNPC_INCLUDE_DIR} LINK_LIBRARIES ${MINIUPNPC_LIBRARY} OUTPUT_VARIABLE OUTPUT) if(_MINIUPNPC_HAVE_VERSION_1_5) if(NOT DEFINED MINIUPNPC_VERSION) set(MINIUPNPC_VERSION 1.5) endif() set(MINIUPNPC_API_VERSION 5) endif() endif() endif() endif() set(MINIUPNPC_INCLUDE_DIRS ${MINIUPNPC_INCLUDE_DIR}) set(MINIUPNPC_LIBRARIES ${MINIUPNPC_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(MINIUPNPC REQUIRED_VARS MINIUPNPC_LIBRARY MINIUPNPC_INCLUDE_DIR MINIUPNPC_API_VERSION VERSION_VAR MINIUPNPC_VERSION ) mark_as_advanced(MINIUPNPC_INCLUDE_DIR MINIUPNPC_LIBRARY) if(MINIUPNPC_PREFER_STATIC_LIB) set(CMAKE_FIND_LIBRARY_SUFFIXES ${MINIUPNPC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) unset(MINIUPNPC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) endif() transmission-2.92/cmake/PaxHeaders.4960/FindCyaSSL.cmake0000644000000000000000000000013212505250244017636 xustar0030 mtime=1427460260.195239104 30 atime=1427460260.195239104 30 ctime=1457295917.322762378 transmission-2.92/cmake/FindCyaSSL.cmake0000644000175000017500000000412512505250244021265 0ustar00mikedldmikedld00000000000000if(CYASSL_PREFER_STATIC_LIB) set(CYASSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) if(WIN32) set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) else() set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) endif() endif() if(UNIX) find_package(PkgConfig QUIET) pkg_check_modules(_WOLFSSL QUIET wolfssl) endif() find_path(WOLFSSL_INCLUDE_DIR NAMES wolfssl/version.h HINTS ${_WOLFSSL_INCLUDEDIR}) find_library(WOLFSSL_LIBRARY NAMES wolfssl HINTS ${_WOLFSSL_LIBDIR}) if(WOLFSSL_INCLUDE_DIR AND WOLFSSL_LIBRARY) set(CYASSL_INCLUDE_DIR ${WOLFSSL_INCLUDE_DIR}) set(CYASSL_LIBRARY ${WOLFSSL_LIBRARY}) set(CYASSL_VERSION ${_WOLFSSL_VERSION}) set(CYASSL_IS_WOLFSSL ON) else() if(UNIX) pkg_check_modules(_CYASSL QUIET cyassl) endif() find_path(CYASSL_INCLUDE_DIR NAMES cyassl/version.h HINTS ${_CYASSL_INCLUDEDIR}) find_library(CYASSL_LIBRARY NAMES cyassl HINTS ${_CYASSL_LIBDIR}) set(CYASSL_VERSION ${_CYASSL_VERSION}) set(CYASSL_IS_WOLFSSL OFF) endif() if(NOT CYASSL_VERSION AND CYASSL_INCLUDE_DIR) if(CYASSL_IS_WOLFSSL) file(STRINGS "${CYASSL_INCLUDE_DIR}/wolfssl/version.h" CYASSL_VERSION_STR REGEX "^#define[\t ]+LIBWOLFSSL_VERSION_STRING[\t ]+\"[^\"]+\"") else() file(STRINGS "${CYASSL_INCLUDE_DIR}/cyassl/version.h" CYASSL_VERSION_STR REGEX "^#define[\t ]+LIBCYASSL_VERSION_STRING[\t ]+\"[^\"]+\"") endif() if(CYASSL_VERSION_STR MATCHES "\"([^\"]+)\"") set(CYASSL_VERSION "${CMAKE_MATCH_1}") endif() endif() set(CYASSL_INCLUDE_DIRS ${CYASSL_INCLUDE_DIR}) set(CYASSL_LIBRARIES ${CYASSL_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(CyaSSL REQUIRED_VARS CYASSL_LIBRARY CYASSL_INCLUDE_DIR VERSION_VAR CYASSL_VERSION ) mark_as_advanced(WOLFSSL_INCLUDE_DIR WOLFSSL_LIBRARY CYASSL_INCLUDE_DIR CYASSL_LIBRARY) if(CYASSL_PREFER_STATIC_LIB) set(CMAKE_FIND_LIBRARY_SUFFIXES ${CYASSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) unset(CYASSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) endif() transmission-2.92/cmake/PaxHeaders.4960/LargeFileSupport.cmake0000644000000000000000000000013212505250244021166 xustar0030 mtime=1427460260.193239068 30 atime=1427460260.193239068 30 ctime=1457295917.322762378 transmission-2.92/cmake/LargeFileSupport.cmake0000644000175000017500000000257512505250244022624 0ustar00mikedldmikedld00000000000000# Based on AC_SYS_LARGEFILE if(NOT DEFINED NO_LFS_MACROS_REQUIRED) include(CheckCSourceCompiles) # Check that off_t can represent 2**63 - 1 correctly. # We can't simply define LARGE_OFF_T to be 9223372036854775807, # since some C++ compilers masquerading as C compilers # incorrectly reject 9223372036854775807. set(LFS_TEST_PROGRAM " #include #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main() { return 0; } ") check_c_source_compiles("${LFS_TEST_PROGRAM}" NO_LFS_MACROS_REQUIRED) if(NOT NO_LFS_MACROS_REQUIRED) if(NOT DEFINED FILE_OFFSET_BITS_LFS_MACRO_REQUIRED) check_c_source_compiles("#define _FILE_OFFSET_BITS 64 ${LFS_TEST_PROGRAM}" FILE_OFFSET_BITS_LFS_MACRO_REQUIRED) if(FILE_OFFSET_BITS_LFS_MACRO_REQUIRED) add_definitions(-D_FILE_OFFSET_BITS=64) elseif(NOT DEFINED LARGE_FILES_LFS_MACRO_REQUIRED) check_c_source_compiles("#define _LARGE_FILES 1 ${LFS_TEST_PROGRAM}" LARGE_FILES_LFS_MACRO_REQUIRED) if(LARGE_FILES_LFS_MACRO_REQUIRED) add_definitions(-D_LARGE_FILES=1) endif() endif() endif() endif() unset(LFS_TEST_PROGRAM) endif()